@partylayer/core 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
- package/LICENSE +0 -21
package/dist/index.d.mts
CHANGED
|
@@ -71,7 +71,7 @@ type ProviderMatcher = {
|
|
|
71
71
|
/** Hostname or registrable domain. Subdomains are accepted. */
|
|
72
72
|
value: string;
|
|
73
73
|
} | {
|
|
74
|
-
field: 'kernel.id' | 'kernel.url' | 'kernel.userUrl' | 'kernel.clientType';
|
|
74
|
+
field: 'kernel.id' | 'kernel.url' | 'kernel.userUrl' | 'kernel.clientType' | 'provider.id';
|
|
75
75
|
match: 'exact';
|
|
76
76
|
/** One or more exact values; ANY match returns true. */
|
|
77
77
|
values: string[];
|
package/dist/index.d.ts
CHANGED
|
@@ -71,7 +71,7 @@ type ProviderMatcher = {
|
|
|
71
71
|
/** Hostname or registrable domain. Subdomains are accepted. */
|
|
72
72
|
value: string;
|
|
73
73
|
} | {
|
|
74
|
-
field: 'kernel.id' | 'kernel.url' | 'kernel.userUrl' | 'kernel.clientType';
|
|
74
|
+
field: 'kernel.id' | 'kernel.url' | 'kernel.userUrl' | 'kernel.clientType' | 'provider.id';
|
|
75
75
|
match: 'exact';
|
|
76
76
|
/** One or more exact values; ANY match returns true. */
|
|
77
77
|
values: string[];
|
package/dist/index.js
CHANGED
|
@@ -300,12 +300,15 @@ function matchesSingle(status, matcher) {
|
|
|
300
300
|
}
|
|
301
301
|
}
|
|
302
302
|
function readField(status, field) {
|
|
303
|
+
if (!status || typeof status !== "object") return void 0;
|
|
303
304
|
const dot = field.indexOf(".");
|
|
304
305
|
if (dot < 0) return void 0;
|
|
305
306
|
const root = field.slice(0, dot);
|
|
306
307
|
const key = field.slice(dot + 1);
|
|
307
|
-
|
|
308
|
-
return
|
|
308
|
+
const subject = status[root];
|
|
309
|
+
if (!subject || typeof subject !== "object") return void 0;
|
|
310
|
+
const value = subject[key];
|
|
311
|
+
return typeof value === "string" ? value : void 0;
|
|
309
312
|
}
|
|
310
313
|
function matchesDomain(url, domain) {
|
|
311
314
|
try {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/adapters.ts","../src/session.ts","../src/detection.ts","../src/metrics.ts","../src/metrics-payload.ts","../src/cip0103-types.ts","../src/transport/deeplink.ts","../src/transport/popup.ts","../src/transport/postmessage.ts","../src/transport/mock.ts"],"names":[],"mappings":";;;AAwLO,SAAS,gBAAgB,KAAA,EAA8C;AAC5E,EAAA,OAAO,KAAA,EAAO,SAAS,MAAA,KAAW,IAAA;AACpC;AA0GO,SAAS,WAAW,EAAA,EAAsB;AAC/C,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,UAAU,EAAA,EAAqB;AAC7C,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,YAAY,EAAA,EAAuB;AACjD,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,kBAAkB,IAAA,EAA+B;AAC/D,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,YAAY,GAAA,EAAwB;AAClD,EAAA,OAAO,GAAA;AACT;;;ACpRO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwB,KAAA,CAAM;AAAA,EACzB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EAEhB,WAAA,CACE,OAAA,EACA,IAAA,EACA,OAAA,EAKA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAS,KAAA;AACtB,IAAA,IAAA,CAAK,UAAU,OAAA,EAAS,OAAA;AACxB,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAS,aAAA,IAAiB,IAAA;AAG/C,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,gBAAe,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAA,EAAO,IAAA,CAAK,KAAA,YAAiB,KAAA,GACzB;AAAA,QACE,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA;AAAA,QACjB,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,QACpB,KAAA,EAAO,KAAK,KAAA,CAAM;AAAA,UAEpB,IAAA,CAAK;AAAA,KACX;AAAA,EACF;AACF;AAKO,IAAM,mBAAA,GAAN,cAAkC,eAAA,CAAgB;AAAA,EACvD,YAAY,QAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM,CAAA,QAAA,EAAW,QAAQ,CAAA,WAAA,CAAA,EAAe,kBAAA,EAAoB;AAAA,MAC1D,OAAA,EAAS,EAAE,QAAA;AAAS,KACrB,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAKO,IAAM,uBAAA,GAAN,cAAsC,eAAA,CAAgB;AAAA,EAC3D,WAAA,CAAY,UAAkB,MAAA,EAAiB;AAC7C,IAAA,KAAA;AAAA,MACE,WAAW,QAAQ,CAAA,kBAAA,EAAqB,SAAS,CAAA,EAAA,EAAK,MAAM,KAAK,EAAE,CAAA,CAAA;AAAA,MACnE,sBAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS,EAAE,QAAA,EAAU,MAAA;AAAO;AAC9B,KACF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AAAA,EACd;AACF;AAKO,IAAM,iBAAA,GAAN,cAAgC,eAAA,CAAgB;AAAA,EACrD,WAAA,CAAY,WAAmB,OAAA,EAAmC;AAChE,IAAA,KAAA,CAAM,CAAA,cAAA,EAAiB,SAAS,CAAA,CAAA,EAAI,eAAA,EAAiB;AAAA,MACnD,OAAA,EAAS,EAAE,SAAA,EAAW,GAAG,OAAA;AAAQ,KAClC,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAKO,IAAM,qBAAA,GAAN,cAAoC,eAAA,CAAgB;AAAA,EACzD,WAAA,CAAY,QAAgB,cAAA,EAA2B;AACrD,IAAA,KAAA;AAAA,MACE,WAAW,MAAM,CAAA,gBAAA,CAAA;AAAA,MACjB,oBAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS,EAAE,MAAA,EAAQ,cAAA;AAAe;AACpC,KACF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF;AAKO,IAAM,mBAAA,GAAN,cAAkC,eAAA,CAAgB;AAAA,EACvD,YAAY,SAAA,EAAmB;AAC7B,IAAA,KAAA,CAAM,CAAA,SAAA,EAAY,SAAS,CAAA,aAAA,CAAA,EAAiB,iBAAA,EAAmB;AAAA,MAC7D,OAAA,EAAS,EAAE,SAAA;AAAU,KACtB,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAKO,IAAM,2BAAA,GAAN,cAA0C,eAAA,CAAgB;AAAA,EAC/D,WAAA,CAAY,UAAkB,UAAA,EAAoB;AAChD,IAAA,KAAA;AAAA,MACE,CAAA,QAAA,EAAW,QAAQ,CAAA,+BAAA,EAAkC,UAAU,CAAA,CAAA,CAAA;AAAA,MAC/D,0BAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS,EAAE,QAAA,EAAU,UAAA;AAAW;AAClC,KACF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,6BAAA;AAAA,EACd;AACF;AAKO,IAAM,cAAA,GAAN,cAA6B,eAAA,CAAgB;AAAA,EAClD,WAAA,CAAY,OAAA,EAAiB,KAAA,EAAiB,OAAA,EAAmC;AAC/E,IAAA,KAAA,CAAM,SAAS,iBAAA,EAAmB;AAAA,MAChC,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAKO,IAAM,wBAAA,GAAN,cAAuC,eAAA,CAAgB;AAAA,EAC5D,WAAA,CAAY,KAAa,KAAA,EAAiB;AACxC,IAAA,KAAA,CAAM,CAAA,+BAAA,EAAkC,GAAG,CAAA,CAAA,CAAA,EAAK,uBAAA,EAAyB;AAAA,MACvE,KAAA;AAAA,MACA,OAAA,EAAS,EAAE,GAAA;AAAI,KAChB,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AAAA,EACd;AACF;AAKO,IAAM,+BAAA,GAAN,cAA8C,eAAA,CAAgB;AAAA,EACnE,WAAA,CAAY,QAAgB,OAAA,EAAmC;AAC7D,IAAA,KAAA,CAAM,CAAA,8BAAA,EAAiC,MAAM,CAAA,CAAA,EAAI,8BAAA,EAAgC;AAAA,MAC/E,OAAA,EAAS,EAAE,MAAA,EAAQ,GAAG,OAAA;AAAQ,KAC/B,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,iCAAA;AAAA,EACd;AACF;AAKO,IAAM,0BAAA,GAAN,cAAyC,eAAA,CAAgB;AAAA,EAC9D,WAAA,CAAY,QAAgB,OAAA,EAAmC;AAC7D,IAAA,KAAA,CAAM,CAAA,yBAAA,EAA4B,MAAM,CAAA,CAAA,EAAI,yBAAA,EAA2B;AAAA,MACrE,OAAA,EAAS,EAAE,MAAA,EAAQ,GAAG,OAAA;AAAQ,KAC/B,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,4BAAA;AAAA,EACd;AACF;AAKO,IAAM,aAAA,GAAN,cAA4B,eAAA,CAAgB;AAAA,EACjD,WAAA,CAAY,OAAA,EAAiB,KAAA,EAAiB,OAAA,EAAmC;AAC/E,IAAA,KAAA,CAAM,SAAS,gBAAA,EAAkB;AAAA,MAC/B,KAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA,EAAe;AAAA,KAChB,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAKO,IAAM,YAAA,GAAN,cAA2B,eAAA,CAAgB;AAAA,EAChD,WAAA,CAAY,WAAmB,SAAA,EAAmB;AAChD,IAAA,KAAA;AAAA,MACE,CAAA,WAAA,EAAc,SAAS,CAAA,kBAAA,EAAqB,SAAS,CAAA,EAAA,CAAA;AAAA,MACrD,SAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS,EAAE,SAAA,EAAW,SAAA;AAAU;AAClC,KACF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AASO,SAAS,gCAAA,CACd,KACA,OAAA,EACiB;AAEjB,EAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,IAAA,OAAO,GAAA;AAAA,EACT;AAGA,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAY;AAGxC,IAAA,IACE,QAAQ,QAAA,CAAS,UAAU,KAC3B,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,IACzB,OAAA,CAAQ,QAAA,CAAS,WAAW,KAC5B,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,IAC3B,GAAA,CAAI,SAAS,mBAAA,EACb;AACA,MAAA,OAAO,IAAI,iBAAA,CAAkB,OAAA,CAAQ,KAAA,EAAO;AAAA,QAC1C,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,iBAAiB,GAAA,CAAI;AAAA,OACtB,CAAA;AAAA,IACH;AAGA,IAAA,IACE,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAC1B,OAAA,CAAQ,SAAS,WAAW,CAAA,IAC5B,GAAA,CAAI,IAAA,KAAS,cAAA,EACb;AAEA,MAAA,IAAI,SAAA,GAAY,QAAQ,SAAA,IAAa,CAAA;AACrC,MAAA,IAAI,cAAc,CAAA,EAAG;AAEnB,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAC/C,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,yBAAyB,CAAA;AAC5D,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,QACrC,WAAW,QAAA,EAAU;AACnB,UAAA,SAAA,GAAY,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,QAC1C;AAAA,MACF;AACA,MAAA,OAAO,IAAI,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,SAAS,CAAA;AAAA,IAClD;AAGA,IAAA,IACE,QAAQ,QAAA,CAAS,SAAS,CAAA,IAC1B,OAAA,CAAQ,SAAS,OAAO,CAAA,IACxB,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,IAC7B,GAAA,CAAI,SAAS,cAAA,IACb,GAAA,CAAI,SAAS,WAAA,EACb;AACA,MAAA,OAAO,IAAI,cAAA,CAAe,GAAA,CAAI,OAAA,EAAS,GAAA,EAAK;AAAA,QAC1C,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,WAAW,OAAA,CAAQ;AAAA,OACpB,CAAA;AAAA,IACH;AAGA,IAAA,OAAO,IAAI,cAAA,CAAe,GAAA,CAAI,OAAA,EAAS,GAAA,EAAK;AAAA,MAC1C,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,eAAe,GAAA,CAAI;AAAA,KACpB,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,OAAO,IAAI,cAAA,CAAe,GAAA,EAAK,MAAA,EAAW;AAAA,MACxC,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAAA,EACH;AAGA,EAAA,OAAO,IAAI,aAAA;AAAA,IACT,CAAA,iBAAA,EAAoB,QAAQ,KAAK,CAAA,CAAA;AAAA,IACjC,GAAA;AAAA,IACA;AAAA,MACE,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAW,OAAO;AAAA;AACpB,GACF;AACF;;;ACvBO,SAAS,eAAA,CACd,SACA,oBAAA,EACM;AACN,EAAA,MAAM,SAAA,GAAY,QAAQ,eAAA,EAAgB;AAC1C,EAAA,MAAM,OAAA,GAAU,qBAAqB,MAAA,CAAO,CAAC,QAAQ,CAAC,SAAA,CAAU,QAAA,CAAS,GAAG,CAAC,CAAA;AAE7E,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,2BAAA;AAAA,MACR,OAAA,CAAQ,QAAA;AAAA,MACR,OAAA,CAAQ,KAAK,IAAI;AAAA,KACnB;AAAA,EACF;AACF;AAMA,eAAsB,aACpB,OAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,eAAA,EAAgB;AAC7C,EAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,IAAA,MAAM,IAAI,uBAAA,CAAwB,OAAA,CAAQ,QAAA,EAAU,OAAO,MAAM,CAAA;AAAA,EACnE;AACF;;;AC/VO,SAAS,iBAAA,GAA+B;AAC7C,EAAA,OAAO,YAAY,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,CAAA;AAC3F;AAKO,SAAS,gBAAgB,OAAA,EAAsC;AACpE,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAA,GAAI,OAAA;AAEV,EAAA,OACE,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,IACvB,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,IACtB,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,IACrB,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,IACrB,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,IACvB,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,IACpB,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,oBAAoB,CAAA;AAExC;AAKO,SAAS,iBAAiB,OAAA,EAA2B;AAC1D,EAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,IAAK,OAAA,CAAQ,SAAA;AAC/B;AAKO,SAAS,aAAA,CACd,UACA,OAAA,EACA,OAAA,EACA,QACA,YAAA,GAAyB,IACzB,WAAA,EACS;AACT,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,OAAO;AAAA,IACL,WAAW,iBAAA,EAAkB;AAAA,IAC7B,QAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA,EAAW,GAAA;AAAA,IACX,SAAA,EAAW,WAAA,GAAc,GAAA,GAAM,WAAA,GAAc,MAAA;AAAA,IAC7C,MAAA;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AACF;;;AC/BO,SAAS,wBAAA,CACd,QACA,SAAA,EACS;AACT,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,IAAa,CAAC,UAAU,QAAA,IAAY,SAAA,CAAU,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACnF,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAA,CAAU,SAAS,IAAA,CAAK,CAAC,MAAM,aAAA,CAAc,MAAA,EAAQ,CAAC,CAAC,CAAA;AAChE;AAEA,SAAS,aAAA,CAAc,QAAmC,OAAA,EAAmC;AAC3F,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,MAAA,EAAQ,OAAA,CAAQ,KAAK,CAAA;AAClD,EAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,KAAA;AAEtE,EAAA,QAAQ,QAAQ,KAAA;AAAO,IACrB,KAAK,OAAA;AACH,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA;AAAA,IAC3C,KAAK,QAAA;AACH,MAAA,OAAO,UAAA,CAAW,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC5C,KAAK,QAAA;AACH,MAAA,OAAO,aAAA,CAAc,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAA;AAAA,IAChD;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAEA,SAAS,SAAA,CACP,QACA,KAAA,EACS;AAET,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC7B,EAAA,IAAI,GAAA,GAAM,GAAG,OAAO,MAAA;AACpB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAC/B,EAAA,IAAI,IAAA,KAAS,QAAA,IAAY,CAAC,MAAA,CAAO,QAAQ,OAAO,MAAA;AAChD,EAAA,OAAQ,MAAA,CAAO,OAAmC,GAAG,CAAA;AACvD;AAYA,SAAS,aAAA,CAAc,KAAa,MAAA,EAAyB;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,SAAS,WAAA,EAAY;AACnD,IAAA,MAAM,MAAA,GAAS,OAAO,WAAA,EAAY;AAClC,IAAA,OAAO,QAAA,KAAa,MAAA,IAAU,QAAA,CAAS,QAAA,CAAS,MAAM,MAAM,CAAA;AAAA,EAC9D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAWO,SAAS,kBAAA,CAEd,QAAsD,QAAA,EAAuC;AAC7F,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,IAAI,wBAAA,CAAyB,MAAA,EAAQ,KAAA,CAAM,iBAAiB,CAAA,EAAG;AAC7D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,sBAAA,CACd,QACA,OAAA,EACwB;AACxB,EAAA,OAAO,kBAAA,CAAmB,QAAQ,OAAO,CAAA;AAC3C;AAQO,SAAS,wBAAwB,MAAA,EAA8D;AACpG,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAA,EAAQ,OAAA;AAChC,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,SAAS,CAAA,EAAG;AACrD,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,GAAA,CAAI,OAAO,EAAE,QAAA,CAAS,OAAA,CAAQ,UAAU,EAAE,CAAA;AAAA,IACvD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,MAAM,EAAA,GAAK,QAAQ,MAAA,EAAQ,EAAA;AAC3B,EAAA,IAAI,OAAO,EAAA,KAAO,QAAA,IAAY,EAAA,CAAG,SAAS,CAAA,EAAG;AAC3C,IAAA,OAAO,CAAA,iBAAA,EAAoB,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,OAAA,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,iBAAA;AACT;;;ACtIO,IAAM,kBAAA,GAAqB;AAAA;AAAA,EAEhC,uBAAA,EAAyB,yBAAA;AAAA;AAAA,EAGzB,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAGxB,gBAAA,EAAkB,kBAAA;AAAA;AAAA,EAGlB,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAGnB,gBAAA,EAAkB;AACpB;AAOO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,YAAA,EAAc;AAChB;AAOO,IAAM,gBAAA,GAAmB;AAAA;AAAA,EAE9B,cAAA,EAAgB,gBAAA;AAAA;AAAA,EAGhB,kBAAA,EAAoB,oBAAA;AAAA;AAAA,EAGpB,cAAA,EAAgB;AAClB;AAKO,IAAM,OAAA,GAAU;AAAA,EACrB,GAAG,kBAAA;AAAA,EACH,GAAG,aAAA;AAAA,EACH,GAAG;AACL;AAaO,SAAS,gBAAgB,SAAA,EAA2B;AACzD,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,YAAY,CAAA,EAAG,SAAS,CAAA,CAAA;AAC5C;;;ACpCA,IAAM,gBAAA,GAAmB;AAAA,EACvB,eAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA;AASO,SAAS,gBAAgB,OAAA,EAA6C;AAC3E,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA;AAGZ,EAAA,KAAA,MAAW,SAAS,gBAAA,EAAkB;AACpC,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,KAAK,CAAA,CAAE,CAAA;AAAA,IACzE;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,EAAU;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,EAAU;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,GAAA,CAAI,SAAA,KAAc,QAAA,IAAY,GAAA,CAAI,aAAa,CAAA,EAAG;AAC3D,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,GAAA,CAAI,OAAA,IAAW,OAAO,GAAA,CAAI,YAAY,QAAA,EAAU;AACnD,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAkC,CAAA,EAAG;AACjF,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AACxD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,IAAI,SAAA,KAAc,MAAA,IAAa,OAAO,GAAA,CAAI,cAAc,QAAA,EAAU;AACpE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAI,UAAA,KAAe,MAAA,IAAa,OAAO,GAAA,CAAI,eAAe,QAAA,EAAU;AACtE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAQA,eAAsB,eAAe,KAAA,EAAgC;AACnE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AAEnD,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAC/B,MAAA,IAAA,GAAA,CAAS,IAAA,IAAQ,KAAK,IAAA,GAAQ,IAAA;AAC9B,MAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,IAChB;AACA,IAAA,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AACjC,EAAA,MAAM,aAAa,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,IAAI,CAAA;AAC7D,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,IAAI,UAAA,CAAW,UAAU,CAAC,CAAA;AACvD,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AACpE;AAUO,SAAS,qBAAqB,IAAA,EAMlB;AACjB,EAAA,MAAM,OAAA,GAA0B;AAAA,IAC9B,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,OAAA,EAAS,EAAE,GAAG,IAAA,CAAK,OAAA;AAAQ,GAC7B;AAEA,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,OAAA,CAAQ,YAAY,IAAA,CAAK,SAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,aAAa,IAAA,CAAK,UAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,CAAC,eAAA,CAAgB,OAAO,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,OAAA;AACT;;;ACpBO,IAAM,eAAA,GAAkB;AAAA,EAC7B,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAY,YAAA;AAAA,EACZ,YAAA,EAAc,aAAA;AAAA,EACd,MAAA,EAAQ,QAAA;AAAA,EACR,kBAAA,EAAoB,kBAAA;AAAA,EACpB,aAAA,EAAe,cAAA;AAAA,EACf,mBAAA,EAAqB,mBAAA;AAAA,EACrB,YAAA,EAAc,aAAA;AAAA,EACd,eAAA,EAAiB,gBAAA;AAAA,EACjB,UAAA,EAAY;AACd;AAKO,IAAM,yBAAA,GAAsD,MAAA,CAAO,MAAA,CAAO,eAAe;AAIzF,IAAM,cAAA,GAAiB;AAAA,EAC5B,cAAA,EAAgB,eAAA;AAAA,EAChB,gBAAA,EAAkB,iBAAA;AAAA,EAClB,UAAA,EAAY,WAAA;AAAA;AAAA,EAEZ,SAAA,EAAW;AACb;;;ACpKO,IAAM,oBAAN,MAA6C;AAAA;AAAA;AAAA;AAAA,EAI1C,aAAA,GAAwB;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,IAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CACN,SACA,OAAA,EACQ;AACR,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAO,CAAA;AAC3B,IAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,UAAA,GAAA,CAAI,aAAa,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,QACjD,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AACpC,UAAA,GAAA,CAAI,aAAa,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,QACjD,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,QACA,OAAA,EACM;AACN,IAAA,IAAI,OAAA,CAAQ,cAAA,IAAkB,OAAA,CAAQ,cAAA,CAAe,SAAS,CAAA,EAAG;AAC/D,MAAA,IAAI,CAAC,OAAA,CAAQ,cAAA,CAAe,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,CACZ,KAAA,EACA,OAAA,EACA,SAAA,EACY;AACZ,IAAA,OAAO,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAA,KAAW;AACzC,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,OAAA,EAAQ;AACR,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAAA,MACvC,GAAG,SAAS,CAAA;AAEZ,MAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAwB;AAE9C,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,QAC3C,SAAS,GAAA,EAAK;AACZ,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,QAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,KAAA,KAAU,KAAA,EAAO;AAChC,UAAA,OAAA,EAAQ;AACR,UAAA,OAAA,CAAQ,IAAS,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAEA,MAAA,MAAM,kBAAkB,MAAM;AAE5B,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,UAAU,CAAC,CAAA;AAC7C,UAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,IAAI,CAAA;AACvC,UAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACxC,UAAA,IAAI,kBAAkB,KAAA,EAAO;AAC3B,YAAA,MAAM,OAAU,EAAC;AACjB,YAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC7B,cAAC,IAAA,CAAiC,GAAG,CAAA,GAAI,KAAA;AAAA,YAC3C,CAAC,CAAA;AACD,YAAA,OAAA,EAAQ;AACR,YAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,UACd;AAAA,QACF;AAAA,MACF,CAAA;AAEA,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,UAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,cAAc,CAAA;AACpD,UAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,eAAe,CAAA;AAAA,QAC1D;AAAA,MACF,CAAA;AAEA,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,cAAc,CAAA;AACjD,QAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,eAAe,CAAA;AAErD,QAAA,eAAA,EAAgB;AAAA,MAClB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,GAAA,EACA,OAAA,EACA,OAAA,EAC0B;AAE1B,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,KAAA,GAAQ,KAAK,aAAA,EAAc;AAAA,IACrC;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAA;AAGtD,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEjC,MAAA,MAAA,CAAO,SAAS,IAAA,GAAO,WAAA;AAIvB,MAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AACxD,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,MAC5C;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,QAAQ,SAAA,IAAa,GAAA;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA;AAAA,MAC1B,OAAA,CAAQ,KAAA;AAAA,MACR,OAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAI,QAAA,CAAS,KAAA,KAAU,OAAA,CAAQ,KAAA,EAAO;AACpC,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,GAAA,EACA,OAAA,EACA,OAAA,EACuB;AAEvB,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,KAAA,GAAQ,KAAK,aAAA,EAAc;AAAA,IACrC;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAA;AAGtD,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,SAAS,IAAA,GAAO,WAAA;AAAA,IACzB;AAGA,IAAA,MAAM,OAAA,GAAU,QAAQ,SAAA,IAAa,GAAA;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA;AAAA,MAC1B,OAAA,CAAQ,KAAA;AAAA,MACR,OAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAI,QAAA,CAAS,KAAA,KAAU,OAAA,CAAQ,KAAA,EAAO;AACpC,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;AChMO,IAAM,iBAAN,MAA0C;AAAA;AAAA;AAAA;AAAA,EAIvC,aAAA,GAAwB;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,IAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,CACN,SACA,OAAA,EACQ;AACR,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAO,CAAA;AAC3B,IAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,UAAA,GAAA,CAAI,aAAa,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,QACjD,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AACpC,UAAA,GAAA,CAAI,aAAa,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,QACjD,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,QACA,OAAA,EACM;AACN,IAAA,IAAI,OAAA,CAAQ,cAAA,IAAkB,OAAA,CAAQ,cAAA,CAAe,SAAS,CAAA,EAAG;AAC/D,MAAA,IAAI,CAAC,OAAA,CAAQ,cAAA,CAAe,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CAAU,KAAa,QAAA,EAA2C;AACxE,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,GAAA;AACd,IAAA,MAAM,MAAA,GAAS,GAAA;AACf,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,GAAA,CAAW,MAAA,CAAO,aAAa,KAAA,IAAS,CAAA;AAC5D,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,GAAA,CAAW,MAAA,CAAO,cAAc,MAAA,IAAU,CAAA;AAE7D,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MACZ,GAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAS,KAAK,CAAA,QAAA,EAAW,MAAM,CAAA,MAAA,EAAS,IAAI,QAAQ,GAAG,CAAA,6BAAA;AAAA,KACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,CACZ,KAAA,EACA,KAAA,EACA,SACA,SAAA,EACY;AACZ,IAAA,OAAO,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAA,KAAW;AACzC,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,OAAA,EAAQ;AACR,QAAA,KAAA,CAAM,KAAA,EAAM;AACZ,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAAA,MACvC,GAAG,SAAS,CAAA;AAEZ,MAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,QAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,UAAA,OAAA,EAAQ;AACR,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAAA,QAC1C;AAAA,MACF,GAAG,GAAG,CAAA;AAEN,MAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAwB;AAE9C,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,QAC3C,SAAS,GAAA,EAAK;AACZ,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,QAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,KAAA,KAAU,KAAA,EAAO;AAChC,UAAA,OAAA,EAAQ;AACR,UAAA,KAAA,CAAM,KAAA,EAAM;AACZ,UAAA,OAAA,CAAQ,IAAS,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAEA,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,aAAA,CAAc,WAAW,CAAA;AACzB,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,UAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,cAAc,CAAA;AAAA,QACtD;AAAA,MACF,CAAA;AAEA,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,cAAc,CAAA;AAAA,MACnD;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,GAAA,EACA,OAAA,EACA,OAAA,EAC0B;AAE1B,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,KAAA,GAAQ,KAAK,aAAA,EAAc;AAAA,IACrC;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,OAAO,CAAA;AAG1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAGA,IAAA,MAAM,OAAA,GAAU,QAAQ,SAAA,IAAa,GAAA;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA;AAAA,MAC1B,KAAA;AAAA,MACA,OAAA,CAAQ,KAAA;AAAA,MACR,OAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAI,QAAA,CAAS,KAAA,KAAU,OAAA,CAAQ,KAAA,EAAO;AACpC,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,GAAA,EACA,OAAA,EACA,OAAA,EACuB;AAEvB,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,KAAA,GAAQ,KAAK,aAAA,EAAc;AAAA,IACrC;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,OAAO,CAAA;AAG1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAGA,IAAA,MAAM,OAAA,GAAU,QAAQ,SAAA,IAAa,GAAA;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA;AAAA,MAC1B,KAAA;AAAA,MACA,OAAA,CAAQ,KAAA;AAAA,MACR,OAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAI,QAAA,CAAS,KAAA,KAAU,OAAA,CAAQ,KAAA,EAAO;AACpC,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;ACtMO,IAAM,uBAAN,MAAgD;AAAA;AAAA;AAAA;AAAA,EAI7C,aAAA,GAAwB;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,IAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,QACA,OAAA,EACM;AACN,IAAA,IAAI,OAAA,CAAQ,cAAA,IAAkB,OAAA,CAAQ,cAAA,CAAe,SAAS,CAAA,EAAG;AAC/D,MAAA,IAAI,CAAC,OAAA,CAAQ,cAAA,CAAe,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CACZ,MAAA,EACA,YAAA,EACA,OAAA,EACA,SACA,SAAA,EACY;AACZ,IAAA,OAAO,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAA,KAAW;AACzC,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,OAAA,EAAQ;AACR,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAAA,MACvC,GAAG,SAAS,CAAA;AAEZ,MAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAwB;AAE9C,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,QAC3C,SAAS,GAAA,EAAK;AACZ,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,QAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,KAAA,KAAU,OAAA,CAAQ,KAAA,EAAO;AACxC,UAAA,OAAA,EAAQ;AACR,UAAA,OAAA,CAAQ,IAAS,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAEA,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,UAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,cAAc,CAAA;AAAA,QACtD;AAAA,MACF,CAAA;AAEA,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,cAAc,CAAA;AACjD,QAAA,MAAA,CAAO,WAAA,CAAY,SAAS,YAAY,CAAA;AAAA,MAC1C;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,GAAA,EACA,OAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,IACtE;AAGA,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,KAAA,GAAQ,KAAK,aAAA,EAAc;AAAA,IACrC;AAGA,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,MAAM,eAAe,SAAA,CAAU,MAAA;AAI/B,IAAA,MAAM,MAAA,GAAU,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA;AAExC,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,KAAW,MAAA,EAAQ;AAChC,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAGA,IAAA,MAAM,OAAA,GAAU,QAAQ,SAAA,IAAa,GAAA;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA;AAAA,MAC1B,MAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAI,QAAA,CAAS,KAAA,KAAU,OAAA,CAAQ,KAAA,EAAO;AACpC,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,GAAA,EACA,OAAA,EACA,OAAA,EACuB;AACvB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,IACtE;AAGA,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,KAAA,GAAQ,KAAK,aAAA,EAAc;AAAA,IACrC;AAGA,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,MAAM,eAAe,SAAA,CAAU,MAAA;AAG/B,IAAA,MAAM,MAAA,GAAU,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA;AAExC,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,KAAW,MAAA,EAAQ;AAChC,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAGA,IAAA,MAAM,OAAA,GAAU,QAAQ,SAAA,IAAa,GAAA;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA;AAAA,MAC1B,MAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAI,QAAA,CAAS,KAAA,KAAU,OAAA,CAAQ,KAAA,EAAO;AACpC,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;ACpKO,IAAM,gBAAN,MAAyC;AAAA,EACtC,aAAA,uBAAiE,GAAA,EAAI;AAAA,EACrE,QAAA,uBAAuC,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,EAKnD,eAAA,CAAgB,OAAe,QAAA,EAAgD;AAC7E,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,OAAe,MAAA,EAAyB;AACjD,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,IAAA,EACA,OAAA,EACA,QAAA,EAC0B;AAE1B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,KAAK,CAAA;AACzD,IAAA,IAAI,YAAA,IAAgB,aAAa,YAAA,EAAc;AAC7C,MAAA,OAAO,YAAA;AAAA,IACT;AAGA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,OAAA,CAAQ;AAAA,UACN,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,OAAA,EAAS,SAAA,CAAU,aAAA,GAAgB,IAAA,CAAK,KAAK,CAAA;AAAA,UAC7C,YAAA,EAAc,YAAA;AAAA,UACd,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA;AAAA;AAAA,UACxB,YAAA,EAAc,OAAA,CAAQ,qBAAA,IAAyB,CAAC,WAAW,aAAa;AAAA,SACzE,CAAA;AAAA,MACH,GAAG,GAAG,CAAA;AAAA,IACR,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,IAAA,EACA,OAAA,EACA,QAAA,EACuB;AAEvB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,KAAK,CAAA;AACzD,IAAA,IAAI,YAAA,KAAiB,WAAA,IAAe,YAAA,IAAgB,OAAA,IAAW,YAAA,CAAA,EAAe;AAC5E,MAAA,OAAO,YAAA;AAAA,IACT;AAGA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,OAAA,CAAQ;AAAA,UACN,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,SAAA,EAAW,iBAAA,GAAoB,IAAA,CAAK,GAAA,EAAI;AAAA,UACxC,eAAA,EAAiB,OAAA,CAAQ,WAAA,GAAc,cAAA,GAAiB;AAAA,SACzD,CAAA;AAAA,MACH,GAAG,GAAG,CAAA;AAAA,IACR,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CACE,KAAA,EACA,UAAA,EACA,QAAA,EACoB;AAEpB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACvC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAAA,IAChC;AAGA,IAAA,OAAO,QAAQ,OAAA,CAAQ;AAAA,MACrB,KAAA;AAAA,MACA,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,SAAA,EAAW,gBAAA;AAAA,QACX,eAAA,EAAiB;AAAA;AACnB,KACD,CAAA;AAAA,EACH;AACF","file":"index.js","sourcesContent":["/**\n * Core types for PartyLayer SDK\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\n/**\n * Branded string types for type safety\n */\nexport type WalletId = string & { readonly __brand: 'WalletId' };\nexport type PartyId = string & { readonly __brand: 'PartyId' };\nexport type SessionId = string & { readonly __brand: 'SessionId' };\nexport type TransactionHash = string & { readonly __brand: 'TransactionHash' };\nexport type Signature = string & { readonly __brand: 'Signature' };\n\n/**\n * Network identifier\n * Standard networks: \"devnet\" | \"testnet\" | \"mainnet\"\n * Custom networks allowed as string\n */\nexport type NetworkId = 'devnet' | 'testnet' | 'mainnet' | (string & Record<never, never>);\n\n/**\n * Capability keys that wallets can support\n * Based on OpenRPC dApp API capabilities\n */\nexport type CapabilityKey =\n | 'connect'\n | 'disconnect'\n | 'restore'\n | 'signMessage'\n | 'signTransaction'\n | 'submitTransaction'\n | 'ledgerApi'\n | 'events'\n | 'deeplink'\n | 'popup'\n | 'injected'\n | 'remoteSigner';\n\n/**\n * Wallet installation hints for detection\n */\nexport interface InstallHints {\n /** Window property name (e.g., \"consoleWallet\") */\n injectedKey?: string;\n /** Browser extension ID */\n extensionId?: string;\n /** Deep link scheme (e.g., \"loop://\") */\n deepLinkScheme?: string;\n /** Script tag identifier */\n scriptTag?: string;\n}\n\n/**\n * Wallet adapter metadata\n */\nexport interface AdapterMetadata {\n /** NPM package name */\n packageName: string;\n /** Version range (semver) */\n versionRange: string;\n}\n\n/**\n * Provider matcher: a single rule used by `ProviderDetection.matchers`.\n *\n * Three match modes are defined; OR-combined inside a `ProviderDetection`.\n * Exact and prefix work on string fields directly; domain interprets the\n * field as a URL and tests its hostname against the registrable domain\n * (with subdomain support).\n */\nexport type ProviderMatcher =\n | {\n field: 'kernel.url' | 'kernel.userUrl';\n match: 'domain';\n /** Hostname or registrable domain. Subdomains are accepted. */\n value: string;\n }\n | {\n field: 'kernel.id' | 'kernel.url' | 'kernel.userUrl' | 'kernel.clientType';\n match: 'exact';\n /** One or more exact values; ANY match returns true. */\n values: string[];\n }\n | {\n field: 'kernel.id' | 'kernel.url' | 'kernel.userUrl';\n match: 'prefix';\n value: string;\n };\n\n/**\n * Standards-first runtime detection of a CIP-0103 wallet.\n *\n * The registry stores these rules so that any current or future wallet\n * implementing `window.canton` can be identified without code changes —\n * a registry JSON update is enough.\n */\nexport interface ProviderDetection {\n /** Transport mechanism. Currently only 'window.canton' is supported. */\n transport: 'window.canton';\n /** OR-list of matchers. Provider matches if ANY matcher returns true. */\n matchers: ProviderMatcher[];\n}\n\n/**\n * Canonical CIP-0103 support marker.\n *\n * When `native: true`, the wallet is treated as a first-class CIP-0103\n * provider in the picker — it always appears in the \"CIP-0103 NATIVE\"\n * section regardless of install state, with a per-wallet readiness\n * indicator that reflects whether the wallet's `providerDetection` rules\n * matched the currently-injected `window.canton` provider.\n *\n * The field is optional; wallets that don't claim CIP-0103 support omit\n * it and continue to appear in the \"AVAILABLE\" section as before.\n */\nexport interface Cip0103Support {\n /** True if this wallet has confirmed CIP-0103 dApp API support. */\n native: boolean;\n /** Public evidence link (npm package, blog post, official statement). */\n evidence?: string;\n /** ISO date when CIP-0103 support was confirmed (informational). */\n since?: string;\n}\n\n/**\n * Wallet information from registry\n */\nexport interface WalletInfo {\n /** Wallet identifier */\n walletId: WalletId;\n /** Display name */\n name: string;\n /** Website URL */\n website: string;\n /** Icon URLs (different sizes) */\n icons: {\n sm?: string;\n md?: string;\n lg?: string;\n };\n /** Category (e.g., \"browser\", \"mobile\", \"hardware\") */\n category?: string;\n /** Supported capabilities */\n capabilities: CapabilityKey[];\n /** Installation detection hints */\n installHints?: InstallHints;\n /** Adapter package information */\n adapter: AdapterMetadata;\n /** Documentation URLs */\n docs: string[];\n /** Minimum SDK version required */\n minSdkVersion?: string;\n /** Supported networks */\n networks: NetworkId[];\n /** Registry channel */\n channel: 'stable' | 'beta';\n /** Additional metadata (e.g., originAllowlist) */\n metadata?: Record<string, string>;\n /**\n * Optional CIP-0103 runtime detection rules. When present, the picker can\n * decide whether this wallet is the currently-injected `window.canton`\n * provider and route it into the \"CIP-0103 Native\" section without any\n * hardcoded wallet IDs. Wallets that aren't CIP-0103-injected (e.g. Bron,\n * Cantor8 deeplink) leave this unset.\n */\n providerDetection?: ProviderDetection;\n /**\n * Canonical CIP-0103 support marker. When set with `native: true`, the\n * picker always lists the wallet in the \"CIP-0103 NATIVE\" section\n * regardless of install state.\n */\n cip0103?: Cip0103Support;\n}\n\n/**\n * Returns true if the wallet has been canonically marked as CIP-0103\n * native via its registry entry. The check is structural so it works on\n * both raw `RegistryWalletEntry` shapes and converted `WalletInfo`.\n */\nexport function isCip0103Native(entry: { cip0103?: Cip0103Support }): boolean {\n return entry?.cip0103?.native === true;\n}\n\n/**\n * Session information\n * Sessions are origin-bound and encrypted in storage\n */\nexport interface Session {\n /** Unique session ID */\n sessionId: SessionId;\n /** Wallet identifier */\n walletId: WalletId;\n /** Connected party ID */\n partyId: PartyId;\n /** Current network */\n network: NetworkId;\n /** Session creation timestamp */\n createdAt: number;\n /** Session expiration timestamp (if applicable) */\n expiresAt?: number;\n /** Origin of the dApp that created the session */\n origin: string;\n /** Capabilities available in this session */\n capabilitiesSnapshot: CapabilityKey[];\n /** Additional metadata (encrypted in storage) */\n metadata?: Record<string, string>;\n}\n\n/**\n * Persisted session (for restoration)\n */\nexport interface PersistedSession extends Session {\n /** Encrypted session data */\n encrypted: string;\n}\n\n/**\n * Signed message result\n */\nexport interface SignedMessage {\n /** Signature */\n signature: Signature;\n /** Party ID that signed */\n partyId: PartyId;\n /** Original message */\n message: string;\n /** Nonce used (if provided) */\n nonce?: string;\n /** Domain used (if provided) */\n domain?: string;\n}\n\n/**\n * Signed transaction result\n */\nexport interface SignedTransaction {\n /** Signed transaction data */\n signedTx: unknown;\n /** Transaction hash */\n transactionHash: TransactionHash;\n /** Party ID that signed */\n partyId: PartyId;\n}\n\n/**\n * Transaction receipt\n */\nexport interface TxReceipt {\n /** Transaction hash */\n transactionHash: TransactionHash;\n /** Submission timestamp */\n submittedAt: number;\n /** Command ID (if available) */\n commandId?: string;\n /** Update ID (if available) */\n updateId?: string;\n}\n\n/**\n * Transaction status\n */\nexport type TransactionStatus =\n | 'pending'\n | 'submitted'\n | 'committed'\n | 'rejected'\n | 'failed';\n\n/**\n * Transaction status update\n */\nexport interface TxStatusUpdate {\n /** Session ID */\n sessionId: SessionId;\n /** Transaction ID */\n txId: TransactionHash;\n /** Current status */\n status: TransactionStatus;\n /** Raw transaction data (if available) */\n raw?: unknown;\n /** Timestamp */\n timestamp: number;\n}\n\n/**\n * Helper to create branded WalletId\n */\nexport function toWalletId(id: string): WalletId {\n return id as WalletId;\n}\n\n/**\n * Helper to create branded PartyId\n */\nexport function toPartyId(id: string): PartyId {\n return id as PartyId;\n}\n\n/**\n * Helper to create branded SessionId\n */\nexport function toSessionId(id: string): SessionId {\n return id as SessionId;\n}\n\n/**\n * Helper to create branded TransactionHash\n */\nexport function toTransactionHash(hash: string): TransactionHash {\n return hash as TransactionHash;\n}\n\n/**\n * Helper to create branded Signature\n */\nexport function toSignature(sig: string): Signature {\n return sig as Signature;\n}\n","/**\n * Error taxonomy for PartyLayer SDK\n * \n * All errors extend PartyLayerError with stable error codes.\n * Error codes are string literals for telemetry and UI message mapping.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\n/**\n * Error code union - stable string literals for telemetry and UI\n */\nexport type ErrorCode =\n | 'WALLET_NOT_FOUND'\n | 'WALLET_NOT_INSTALLED'\n | 'USER_REJECTED'\n | 'ORIGIN_NOT_ALLOWED'\n | 'SESSION_EXPIRED'\n | 'CAPABILITY_NOT_SUPPORTED'\n | 'TRANSPORT_ERROR'\n | 'REGISTRY_FETCH_FAILED'\n | 'REGISTRY_VERIFICATION_FAILED'\n | 'REGISTRY_SCHEMA_INVALID'\n | 'INTERNAL_ERROR'\n | 'TIMEOUT';\n\n/**\n * Error mapping context\n */\nexport interface ErrorMappingContext {\n /** Wallet ID (if applicable) */\n walletId?: string;\n /** Operation phase */\n phase: 'connect' | 'restore' | 'signMessage' | 'signTransaction' | 'submitTransaction' | 'ledgerApi';\n /** Transport type */\n transport?: 'injected' | 'popup' | 'deeplink' | 'remote';\n /** Timeout in milliseconds (for timeout errors) */\n timeoutMs?: number;\n /** Additional context */\n details?: Record<string, unknown>;\n}\n\n/**\n * Base error class for all PartyLayer errors\n */\nexport class PartyLayerError extends Error {\n public readonly code: ErrorCode;\n public readonly cause?: unknown;\n public readonly details?: Record<string, unknown>;\n public readonly isOperational: boolean;\n\n constructor(\n message: string,\n code: ErrorCode,\n options?: {\n cause?: unknown;\n details?: Record<string, unknown>;\n isOperational?: boolean;\n }\n ) {\n super(message);\n this.name = 'PartyLayerError';\n this.code = code;\n this.cause = options?.cause;\n this.details = options?.details;\n this.isOperational = options?.isOperational ?? true;\n\n // Maintains proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PartyLayerError);\n }\n }\n\n /**\n * Serialize error to JSON for telemetry/logging\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n isOperational: this.isOperational,\n details: this.details,\n cause: this.cause instanceof Error\n ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack,\n }\n : this.cause,\n };\n }\n}\n\n/**\n * Wallet not found error\n */\nexport class WalletNotFoundError extends PartyLayerError {\n constructor(walletId: string) {\n super(`Wallet \"${walletId}\" not found`, 'WALLET_NOT_FOUND', {\n details: { walletId },\n });\n this.name = 'WalletNotFoundError';\n }\n}\n\n/**\n * Wallet not installed error\n */\nexport class WalletNotInstalledError extends PartyLayerError {\n constructor(walletId: string, reason?: string) {\n super(\n `Wallet \"${walletId}\" is not installed${reason ? `: ${reason}` : ''}`,\n 'WALLET_NOT_INSTALLED',\n {\n details: { walletId, reason },\n }\n );\n this.name = 'WalletNotInstalledError';\n }\n}\n\n/**\n * User rejected error\n */\nexport class UserRejectedError extends PartyLayerError {\n constructor(operation: string, details?: Record<string, unknown>) {\n super(`User rejected ${operation}`, 'USER_REJECTED', {\n details: { operation, ...details },\n });\n this.name = 'UserRejectedError';\n }\n}\n\n/**\n * Origin not allowed error\n */\nexport class OriginNotAllowedError extends PartyLayerError {\n constructor(origin: string, allowedOrigins?: string[]) {\n super(\n `Origin \"${origin}\" is not allowed`,\n 'ORIGIN_NOT_ALLOWED',\n {\n details: { origin, allowedOrigins },\n }\n );\n this.name = 'OriginNotAllowedError';\n }\n}\n\n/**\n * Session expired error\n */\nexport class SessionExpiredError extends PartyLayerError {\n constructor(sessionId: string) {\n super(`Session \"${sessionId}\" has expired`, 'SESSION_EXPIRED', {\n details: { sessionId },\n });\n this.name = 'SessionExpiredError';\n }\n}\n\n/**\n * Capability not supported error\n */\nexport class CapabilityNotSupportedError extends PartyLayerError {\n constructor(walletId: string, capability: string) {\n super(\n `Wallet \"${walletId}\" does not support capability \"${capability}\"`,\n 'CAPABILITY_NOT_SUPPORTED',\n {\n details: { walletId, capability },\n }\n );\n this.name = 'CapabilityNotSupportedError';\n }\n}\n\n/**\n * Transport error\n */\nexport class TransportError extends PartyLayerError {\n constructor(message: string, cause?: unknown, details?: Record<string, unknown>) {\n super(message, 'TRANSPORT_ERROR', {\n cause,\n details,\n });\n this.name = 'TransportError';\n }\n}\n\n/**\n * Registry fetch failed error\n */\nexport class RegistryFetchFailedError extends PartyLayerError {\n constructor(url: string, cause?: unknown) {\n super(`Failed to fetch registry from \"${url}\"`, 'REGISTRY_FETCH_FAILED', {\n cause,\n details: { url },\n });\n this.name = 'RegistryFetchFailedError';\n }\n}\n\n/**\n * Registry verification failed error\n */\nexport class RegistryVerificationFailedError extends PartyLayerError {\n constructor(reason: string, details?: Record<string, unknown>) {\n super(`Registry verification failed: ${reason}`, 'REGISTRY_VERIFICATION_FAILED', {\n details: { reason, ...details },\n });\n this.name = 'RegistryVerificationFailedError';\n }\n}\n\n/**\n * Registry schema invalid error\n */\nexport class RegistrySchemaInvalidError extends PartyLayerError {\n constructor(reason: string, details?: Record<string, unknown>) {\n super(`Registry schema invalid: ${reason}`, 'REGISTRY_SCHEMA_INVALID', {\n details: { reason, ...details },\n });\n this.name = 'RegistrySchemaInvalidError';\n }\n}\n\n/**\n * Internal error (non-operational)\n */\nexport class InternalError extends PartyLayerError {\n constructor(message: string, cause?: unknown, details?: Record<string, unknown>) {\n super(message, 'INTERNAL_ERROR', {\n cause,\n details,\n isOperational: false,\n });\n this.name = 'InternalError';\n }\n}\n\n/**\n * Timeout error\n */\nexport class TimeoutError extends PartyLayerError {\n constructor(operation: string, timeoutMs: number) {\n super(\n `Operation \"${operation}\" timed out after ${timeoutMs}ms`,\n 'TIMEOUT',\n {\n details: { operation, timeoutMs },\n }\n );\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Map unknown errors to PartyLayerError\n * \n * This is the single error mapping strategy used by all adapters.\n * It normalizes errors from various sources (wallet SDKs, network, etc.)\n * into typed PartyLayerError instances.\n */\nexport function mapUnknownErrorToPartyLayerError(\n err: unknown,\n context: ErrorMappingContext\n): PartyLayerError {\n // Already a PartyLayerError\n if (err instanceof PartyLayerError) {\n return err;\n }\n\n // Standard Error\n if (err instanceof Error) {\n const message = err.message.toLowerCase();\n\n // User rejection patterns\n if (\n message.includes('rejected') ||\n message.includes('denied') ||\n message.includes('cancelled') ||\n message.includes('canceled') ||\n err.name === 'UserRejectedError'\n ) {\n return new UserRejectedError(context.phase, {\n walletId: context.walletId,\n transport: context.transport,\n originalMessage: err.message,\n });\n }\n\n // Timeout patterns\n if (\n message.includes('timeout') ||\n message.includes('timed out') ||\n err.name === 'TimeoutError'\n ) {\n // Try to get timeout from context, or extract from error message, or default to 0\n let timeoutMs = context.timeoutMs ?? 0;\n if (timeoutMs === 0) {\n // Try to extract from message like \"timed out after 30000ms\" or \"timeout after 30s\"\n const msMatch = err.message.match(/(\\d+)\\s*ms/i);\n const secMatch = err.message.match(/(\\d+)\\s*(?:sec|second)/i);\n if (msMatch) {\n timeoutMs = parseInt(msMatch[1], 10);\n } else if (secMatch) {\n timeoutMs = parseInt(secMatch[1], 10) * 1000;\n }\n }\n return new TimeoutError(context.phase, timeoutMs);\n }\n\n // Network/transport errors\n if (\n message.includes('network') ||\n message.includes('fetch') ||\n message.includes('connection') ||\n err.name === 'NetworkError' ||\n err.name === 'TypeError'\n ) {\n return new TransportError(err.message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n });\n }\n\n // Generic transport error\n return new TransportError(err.message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n originalError: err.name,\n });\n }\n\n // String errors\n if (typeof err === 'string') {\n return new TransportError(err, undefined, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n });\n }\n\n // Unknown error type\n return new InternalError(\n `Unknown error in ${context.phase}`,\n err,\n {\n walletId: context.walletId,\n transport: context.transport,\n errorType: typeof err,\n }\n );\n}\n","/**\n * Wallet adapter interface contract\n * \n * All wallet adapters must implement this interface.\n * Adapters are responsible for:\n * - Detecting wallet installation\n * - Establishing connections\n * - Signing messages/transactions\n * - Emitting events\n * \n * References:\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\nimport type {\n WalletId,\n PartyId,\n NetworkId,\n CapabilityKey,\n Session,\n PersistedSession,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n} from './types';\nimport {\n CapabilityNotSupportedError,\n WalletNotInstalledError,\n} from './errors';\n\n/**\n * Adapter detection result\n */\nexport interface AdapterDetectResult {\n /** Whether wallet is installed */\n installed: boolean;\n /** Reason if not installed */\n reason?: string;\n}\n\n/**\n * Adapter connection result\n */\nexport interface AdapterConnectResult {\n /** Connected party ID */\n partyId: PartyId;\n /** Partial session data (SDK will complete it) */\n session: Partial<Session>;\n /** Capabilities available in this session */\n capabilities: CapabilityKey[];\n}\n\n/**\n * Sign message parameters\n */\nexport interface SignMessageParams {\n /** Message to sign */\n message: string;\n /** Optional nonce */\n nonce?: string;\n /** Optional domain */\n domain?: string;\n}\n\n/**\n * Sign transaction parameters\n */\nexport interface SignTransactionParams {\n /** Transaction to sign (type kept as unknown for wallet-specific formats) */\n tx: unknown;\n}\n\n/**\n * Submit transaction parameters\n */\nexport interface SubmitTransactionParams {\n /** Signed transaction */\n signedTx: unknown;\n}\n\n/**\n * Ledger API proxy parameters (CIP-0103 ledgerApi method)\n */\nexport interface LedgerApiParams {\n /** HTTP method for the JSON Ledger API */\n requestMethod: 'GET' | 'POST' | 'PUT' | 'DELETE';\n /** Resource path (e.g., \"/v2/state/acs\") */\n resource: string;\n /** Optional JSON body */\n body?: string;\n}\n\n/**\n * Ledger API proxy result\n */\nexport interface LedgerApiResult {\n /** JSON response from the Ledger API */\n response: string;\n}\n\n/**\n * Logger interface\n */\nexport interface LoggerAdapter {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, error?: unknown, ...args: unknown[]): void;\n}\n\n/**\n * Telemetry interface\n * \n * Extended in 0.3.0 with optional metrics methods.\n * All new methods are optional to maintain backward compatibility.\n */\nexport interface TelemetryAdapter {\n /** Track a named event with optional properties */\n track(event: string, properties?: Record<string, unknown>): void;\n \n /** Track an error occurrence */\n error(error: Error, properties?: Record<string, unknown>): void;\n \n /**\n * Increment a metric counter\n * @param metric - Metric name (e.g., 'wallet_connect_attempts')\n * @param value - Value to increment by (default: 1)\n * @since 0.3.0\n */\n increment?(metric: string, value?: number): void;\n \n /**\n * Set a gauge metric value\n * @param metric - Metric name\n * @param value - Current value\n * @since 0.3.0\n */\n gauge?(metric: string, value: number): void;\n \n /**\n * Flush buffered metrics to backend\n * @since 0.3.0\n */\n flush?(): Promise<void>;\n \n /**\n * Check if telemetry is enabled\n * @returns true if telemetry should be collected\n * @since 0.3.0\n */\n isEnabled?(): boolean;\n}\n\n/**\n * Crypto interface\n */\nexport interface CryptoAdapter {\n encrypt(data: string, key: string): Promise<string>;\n decrypt(encrypted: string, key: string): Promise<string>;\n generateKey(): Promise<string>;\n}\n\n/**\n * Storage interface\n */\nexport interface StorageAdapter {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n remove(key: string): Promise<void>;\n clear(): Promise<void>;\n}\n\n/**\n * Registry client interface (for adapters to query wallet info)\n */\nexport interface RegistryClientAdapter {\n getWallet(walletId: WalletId): Promise<unknown>;\n}\n\n/**\n * Adapter context provided to all adapter methods\n */\nexport interface AdapterContext {\n /** Application name */\n appName: string;\n /** Origin (for origin binding) */\n origin: string;\n /** Network */\n network: NetworkId;\n /** Logger */\n logger: LoggerAdapter;\n /** Telemetry (optional) */\n telemetry?: TelemetryAdapter;\n /** Registry client */\n registry: RegistryClientAdapter;\n /** Crypto adapter */\n crypto: CryptoAdapter;\n /** Storage adapter */\n storage: StorageAdapter;\n /** Timeout helper */\n timeout: (ms: number) => Promise<never>;\n /** Abort signal (for cancellation) */\n abortSignal?: AbortSignal;\n}\n\n/**\n * Adapter event names\n */\nexport type AdapterEventName =\n | 'connect'\n | 'disconnect'\n | 'sessionExpired'\n | 'txStatus'\n | 'error';\n\n/**\n * Wallet adapter interface\n * \n * All wallet adapters must implement this interface.\n * Optional methods (marked with ?) should only be implemented\n * if the wallet supports that capability.\n */\nexport interface WalletAdapter {\n /** Wallet identifier */\n readonly walletId: WalletId;\n /** Wallet display name */\n readonly name: string;\n\n /**\n * Get supported capabilities\n */\n getCapabilities(): CapabilityKey[];\n\n /**\n * Detect if wallet is installed\n */\n detectInstalled(): Promise<AdapterDetectResult>;\n\n /**\n * Connect to wallet\n * @param ctx Adapter context\n * @param opts Connection options (optional)\n */\n connect(\n ctx: AdapterContext,\n opts?: {\n timeoutMs?: number;\n partyId?: PartyId;\n /** When false, prefer remote/mobile transport over installed extension */\n preferInstalled?: boolean;\n }\n ): Promise<AdapterConnectResult>;\n\n /**\n * Disconnect from wallet\n * @param ctx Adapter context\n * @param session Session to disconnect\n */\n disconnect(ctx: AdapterContext, session: Session): Promise<void>;\n\n /**\n * Restore session (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param persisted Persisted session data\n */\n restore?(\n ctx: AdapterContext,\n persisted: PersistedSession\n ): Promise<Session | null>;\n\n /**\n * Sign message (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Sign message parameters\n */\n signMessage?(\n ctx: AdapterContext,\n session: Session,\n params: SignMessageParams\n ): Promise<SignedMessage>;\n\n /**\n * Sign transaction (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Sign transaction parameters\n */\n signTransaction?(\n ctx: AdapterContext,\n session: Session,\n params: SignTransactionParams\n ): Promise<SignedTransaction>;\n\n /**\n * Submit transaction (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Submit transaction parameters\n */\n submitTransaction?(\n ctx: AdapterContext,\n session: Session,\n params: SubmitTransactionParams\n ): Promise<TxReceipt>;\n\n /**\n * Proxy a JSON Ledger API request (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Ledger API request parameters\n */\n ledgerApi?(\n ctx: AdapterContext,\n session: Session,\n params: LedgerApiParams\n ): Promise<LedgerApiResult>;\n\n /**\n * Subscribe to adapter events (optional)\n * @param event Event name\n * @param handler Event handler\n * @returns Unsubscribe function\n */\n on?(\n event: AdapterEventName,\n handler: (payload: unknown) => void\n ): () => void;\n}\n\n/**\n * Check if adapter supports required capabilities\n * Throws CapabilityNotSupportedError if not supported\n */\nexport function capabilityGuard(\n adapter: WalletAdapter,\n requiredCapabilities: CapabilityKey[]\n): void {\n const supported = adapter.getCapabilities();\n const missing = requiredCapabilities.filter((cap) => !supported.includes(cap));\n\n if (missing.length > 0) {\n throw new CapabilityNotSupportedError(\n adapter.walletId,\n missing.join(', ')\n );\n }\n}\n\n/**\n * Check if wallet is installed\n * Throws WalletNotInstalledError if not installed\n */\nexport async function installGuard(\n adapter: WalletAdapter\n): Promise<void> {\n const detect = await adapter.detectInstalled();\n if (!detect.installed) {\n throw new WalletNotInstalledError(adapter.walletId, detect.reason);\n }\n}\n","/**\n * Session management utilities\n */\n\nimport type { Session, SessionId } from './types';\nimport { toSessionId } from './types';\n\n/**\n * Generate a unique session ID\n */\nexport function generateSessionId(): SessionId {\n return toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`);\n}\n\n/**\n * Validate session structure\n */\nexport function validateSession(session: unknown): session is Session {\n if (typeof session !== 'object' || session === null) {\n return false;\n }\n\n const s = session as Record<string, unknown>;\n\n return (\n typeof s.sessionId === 'string' &&\n typeof s.walletId === 'string' &&\n typeof s.partyId === 'string' &&\n typeof s.network === 'string' &&\n typeof s.createdAt === 'number' &&\n typeof s.origin === 'string' &&\n Array.isArray(s.capabilitiesSnapshot)\n );\n}\n\n/**\n * Check if session is expired\n */\nexport function isSessionExpired(session: Session): boolean {\n if (!session.expiresAt) {\n return false; // No expiration\n }\n\n return Date.now() >= session.expiresAt;\n}\n\n/**\n * Create a session with default values\n */\nexport function createSession(\n walletId: string,\n partyId: string,\n network: string,\n origin: string,\n capabilities: string[] = [],\n expiresInMs?: number\n): Session {\n const now = Date.now();\n return {\n sessionId: generateSessionId(),\n walletId: walletId as import('./types').WalletId,\n partyId: partyId as import('./types').PartyId,\n network,\n createdAt: now,\n expiresAt: expiresInMs ? now + expiresInMs : undefined,\n origin,\n capabilitiesSnapshot: capabilities as import('./types').CapabilityKey[],\n };\n}\n","/**\n * Standards-first CIP-0103 wallet detection.\n *\n * The registry stores `providerDetection` rules per wallet entry. At\n * runtime the picker calls `window.canton.request({method:'status'})`,\n * receives the wallet's self-reported identity (kernel.id / kernel.url /\n * kernel.userUrl / kernel.clientType), and asks `findMatchingWallet`\n * which registry entry — if any — claims this provider.\n *\n * The architecture deliberately avoids hardcoding wallet IDs anywhere\n * outside the registry. Adding a new CIP-0103 wallet to the ecosystem\n * is a registry JSON update; no SDK release is required.\n */\n\nimport type {\n ProviderDetection,\n ProviderMatcher,\n WalletInfo,\n} from './types';\n\n/**\n * The shape of a CIP-0103 status response that detection cares about.\n *\n * Mirrors what `window.canton.request({ method: 'status' })` returns —\n * declared structurally so adapter packages can reuse this without\n * reaching into the wallet-specific types.\n */\nexport interface Cip0103StatusForDetection {\n kernel?: {\n id?: string;\n url?: string;\n userUrl?: string;\n clientType?: string;\n };\n}\n\n/** Returns true if the runtime status matches any of the detection's matchers. */\nexport function matchesProviderDetection(\n status: Cip0103StatusForDetection | null | undefined,\n detection: ProviderDetection | undefined,\n): boolean {\n if (!status || !detection || !detection.matchers || detection.matchers.length === 0) {\n return false;\n }\n return detection.matchers.some((m) => matchesSingle(status, m));\n}\n\nfunction matchesSingle(status: Cip0103StatusForDetection, matcher: ProviderMatcher): boolean {\n const fieldValue = readField(status, matcher.field);\n if (typeof fieldValue !== 'string' || fieldValue.length === 0) return false;\n\n switch (matcher.match) {\n case 'exact':\n return matcher.values.includes(fieldValue);\n case 'prefix':\n return fieldValue.startsWith(matcher.value);\n case 'domain':\n return matchesDomain(fieldValue, matcher.value);\n default:\n return false;\n }\n}\n\nfunction readField(\n status: Cip0103StatusForDetection,\n field: ProviderMatcher['field'],\n): unknown {\n // Only one nesting level today: `kernel.<key>`.\n const dot = field.indexOf('.');\n if (dot < 0) return undefined;\n const root = field.slice(0, dot);\n const key = field.slice(dot + 1);\n if (root !== 'kernel' || !status.kernel) return undefined;\n return (status.kernel as Record<string, unknown>)[key];\n}\n\n/**\n * Matches a URL string against a registrable domain. Subdomain matches\n * are accepted; foreign domains are rejected; un-parseable URLs return\n * false (no exception).\n *\n * Examples:\n * matchesDomain('https://api-mainnet.cantonwallet.com/x', 'cantonwallet.com') === true\n * matchesDomain('https://cantonwallet.com', 'cantonwallet.com') === true\n * matchesDomain('https://other.com', 'cantonwallet.com') === false\n */\nfunction matchesDomain(url: string, domain: string): boolean {\n try {\n const hostname = new URL(url).hostname.toLowerCase();\n const target = domain.toLowerCase();\n return hostname === target || hostname.endsWith('.' + target);\n } catch {\n return false;\n }\n}\n\n/**\n * Find the first registry entry whose `providerDetection` matches the\n * runtime status. Entries without `providerDetection` are skipped.\n *\n * Accepts either the raw `RegistryWalletEntry[]` shape (registry-client's\n * native input) or the converted `WalletInfo[]` shape that flows through\n * the SDK / React layer — the only field read is `providerDetection`,\n * which both shapes carry post-conversion.\n */\nexport function findMatchingWallet<\n T extends { providerDetection?: ProviderDetection },\n>(status: Cip0103StatusForDetection | null | undefined, registry: readonly T[]): T | undefined {\n if (!status) return undefined;\n for (const entry of registry) {\n if (matchesProviderDetection(status, entry.providerDetection)) {\n return entry;\n }\n }\n return undefined;\n}\n\n/**\n * Type-guard convenience for the WalletInfo shape, since the SDK exposes\n * `WalletInfo[]` to React consumers.\n */\nexport function findMatchingWalletInfo(\n status: Cip0103StatusForDetection | null | undefined,\n wallets: readonly WalletInfo[],\n): WalletInfo | undefined {\n return findMatchingWallet(status, wallets);\n}\n\n/**\n * Best-effort display name for an unrecognised CIP-0103 provider. Reads\n * the wallet's self-declared `kernel.userUrl` (the human-facing URL\n * surfaced by Sigilry-style wallets) and falls back to `kernel.id` or\n * a generic label.\n */\nexport function deriveGenericWalletName(status: Cip0103StatusForDetection | null | undefined): string {\n const userUrl = status?.kernel?.userUrl;\n if (typeof userUrl === 'string' && userUrl.length > 0) {\n try {\n return new URL(userUrl).hostname.replace(/^www\\./, '');\n } catch {\n /* fall through */\n }\n }\n const id = status?.kernel?.id;\n if (typeof id === 'string' && id.length > 0) {\n return `CIP-0103 wallet (${id.slice(0, 8)}…)`;\n }\n return 'CIP-0103 wallet';\n}\n","/**\n * Canonical Metrics Constants\n * \n * These metric names are the official set for PartyLayer telemetry.\n * Changing these names would break metrics aggregation and downstream reporting.\n * \n * @since 0.3.0\n */\n\n/**\n * Enablement Metrics\n * \n * These metrics measure how PartyLayer enables wallet interactions.\n */\nexport const ENABLEMENT_METRICS = {\n /** Total wallet connect() calls made */\n WALLET_CONNECT_ATTEMPTS: 'wallet_connect_attempts',\n \n /** Successful wallet connections (session:connected events) */\n WALLET_CONNECT_SUCCESS: 'wallet_connect_success',\n \n /** New sessions created (not restored) */\n SESSIONS_CREATED: 'sessions_created',\n \n /** Sessions successfully restored from storage */\n SESSIONS_RESTORED: 'sessions_restored',\n \n /** Total session restore attempts */\n RESTORE_ATTEMPTS: 'restore_attempts',\n} as const;\n\n/**\n * Error Metrics\n * \n * These metrics track error occurrences by code.\n */\nexport const ERROR_METRICS = {\n /** Prefix for error metrics (e.g., error_USER_REJECTED) */\n ERROR_PREFIX: 'error_',\n} as const;\n\n/**\n * Registry Metrics\n * \n * These metrics track registry client behavior.\n */\nexport const REGISTRY_METRICS = {\n /** Registry fetched from network */\n REGISTRY_FETCH: 'registry_fetch',\n \n /** Registry served from cache */\n REGISTRY_CACHE_HIT: 'registry_cache_hit',\n \n /** Stale registry was used */\n REGISTRY_STALE: 'registry_stale',\n} as const;\n\n/**\n * All metrics combined\n */\nexport const METRICS = {\n ...ENABLEMENT_METRICS,\n ...ERROR_METRICS,\n ...REGISTRY_METRICS,\n} as const;\n\n/**\n * Type for all metric names\n */\nexport type MetricName = typeof METRICS[keyof typeof METRICS];\n\n/**\n * Build an error metric name from an error code\n * \n * @param errorCode - The error code (e.g., 'USER_REJECTED')\n * @returns The metric name (e.g., 'error_USER_REJECTED')\n */\nexport function errorMetricName(errorCode: string): string {\n return `${METRICS.ERROR_PREFIX}${errorCode}`;\n}\n","/**\n * Metrics Payload Types and Privacy Validation\n * \n * This module defines the privacy-safe payload format for metrics collection.\n * \n * Privacy Guarantees:\n * - NO wallet addresses\n * - NO raw party IDs\n * - NO transaction payloads\n * - NO signed message content\n * - NO user identifiers\n * \n * @since 0.3.0\n */\n\n/**\n * Privacy-safe metrics payload\n * \n * This is the only payload format accepted by the metrics backend.\n */\nexport interface MetricsPayload {\n /** SDK version (e.g., '0.3.0') */\n sdkVersion: string;\n \n /** Network identifier (e.g., 'devnet', 'mainnet') */\n network: string;\n \n /** Unix timestamp in milliseconds */\n timestamp: number;\n \n /** Metric name → value map */\n metrics: Record<string, number>;\n \n /** Hashed app identifier (opt-in, SHA-256) */\n appIdHash?: string;\n \n /** Hashed origin (opt-in, SHA-256) */\n originHash?: string;\n}\n\n/**\n * Fields that are NEVER allowed in metrics payloads\n */\nconst FORBIDDEN_FIELDS = [\n 'walletAddress',\n 'address',\n 'partyId',\n 'rawPartyId',\n 'publicKey',\n 'privateKey',\n 'seed',\n 'mnemonic',\n 'txPayload',\n 'transaction',\n 'signedMessage',\n 'message',\n 'signature',\n 'userId',\n 'email',\n 'name',\n 'ip',\n 'userAgent',\n] as const;\n\n/**\n * Validate that a payload is privacy-safe\n * \n * @param payload - Unknown payload to validate\n * @returns true if payload is valid MetricsPayload with no PII\n * @throws Error if forbidden fields are detected\n */\nexport function validatePayload(payload: unknown): payload is MetricsPayload {\n if (!payload || typeof payload !== 'object') {\n return false;\n }\n \n const obj = payload as Record<string, unknown>;\n \n // Check for forbidden fields\n for (const field of FORBIDDEN_FIELDS) {\n if (field in obj) {\n throw new Error(`Forbidden field detected in metrics payload: ${field}`);\n }\n }\n \n // Validate required fields\n if (typeof obj.sdkVersion !== 'string') {\n return false;\n }\n \n if (typeof obj.network !== 'string') {\n return false;\n }\n \n if (typeof obj.timestamp !== 'number' || obj.timestamp <= 0) {\n return false;\n }\n \n if (!obj.metrics || typeof obj.metrics !== 'object') {\n return false;\n }\n \n // Validate metrics are all numbers\n for (const [key, value] of Object.entries(obj.metrics as Record<string, unknown>)) {\n if (typeof key !== 'string' || typeof value !== 'number') {\n return false;\n }\n }\n \n // Validate optional hashed fields\n if (obj.appIdHash !== undefined && typeof obj.appIdHash !== 'string') {\n return false;\n }\n \n if (obj.originHash !== undefined && typeof obj.originHash !== 'string') {\n return false;\n }\n \n return true;\n}\n\n/**\n * Hash a string using SHA-256 (browser-compatible)\n * \n * @param value - String to hash\n * @returns Hex-encoded SHA-256 hash\n */\nexport async function hashForPrivacy(value: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n // Fallback: simple hash for non-browser environments\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n const char = value.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n \n const encoder = new TextEncoder();\n const data = encoder.encode(value);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Create a sanitized metrics payload\n * \n * This function ensures the payload is privacy-safe before sending.\n * \n * @param data - Raw metrics data\n * @returns Sanitized MetricsPayload\n */\nexport function createMetricsPayload(data: {\n sdkVersion: string;\n network: string;\n metrics: Record<string, number>;\n appIdHash?: string;\n originHash?: string;\n}): MetricsPayload {\n const payload: MetricsPayload = {\n sdkVersion: data.sdkVersion,\n network: data.network,\n timestamp: Date.now(),\n metrics: { ...data.metrics },\n };\n \n if (data.appIdHash) {\n payload.appIdHash = data.appIdHash;\n }\n \n if (data.originHash) {\n payload.originHash = data.originHash;\n }\n \n // Final validation\n if (!validatePayload(payload)) {\n throw new Error('Failed to create valid metrics payload');\n }\n \n return payload;\n}\n","/**\n * CIP-0103 dApp Standard — Canonical Type Definitions\n *\n * These types are the verbatim representation of the CIP-0103 specification.\n * They live in @partylayer/core so both @partylayer/provider and @partylayer/sdk\n * can reference them without circular dependencies.\n *\n * Reference: https://github.com/canton-foundation/cips/blob/main/cip-0103/cip-0103.md\n *\n * IMPORTANT: Do not add PartyLayer-specific fields or aliases.\n * These types represent the standard exactly.\n */\n\n// ─── Provider Primitives ─────────────────────────────────────────────────────\n\nexport type CIP0103EventListener<T = unknown> = (...args: T[]) => void;\n\nexport type CIP0103RequestParams = unknown[] | Record<string, unknown>;\n\nexport interface CIP0103RequestPayload {\n method: string;\n params?: CIP0103RequestParams;\n}\n\n// ─── Provider Interface ──────────────────────────────────────────────────────\n\nexport interface CIP0103Provider {\n request<T = unknown>(args: CIP0103RequestPayload): Promise<T>;\n on<T = unknown>(event: string, listener: CIP0103EventListener<T>): CIP0103Provider;\n emit<T = unknown>(event: string, ...args: T[]): boolean;\n removeListener<T = unknown>(\n event: string,\n listenerToRemove: CIP0103EventListener<T>,\n ): CIP0103Provider;\n}\n\n// ─── Connection ──────────────────────────────────────────────────────────────\n\nexport interface CIP0103ConnectResult {\n isConnected: boolean;\n reason?: string;\n isNetworkConnected?: boolean;\n networkReason?: string;\n /** Async wallet extension: URL for user to complete connection */\n userUrl?: string;\n}\n\n// ─── Network (CAIP-2) ────────────────────────────────────────────────────────\n\nexport interface CIP0103Network {\n /** CAIP-2 network identifier, e.g. \"canton:da-mainnet\" */\n networkId: string;\n /** JSON Ledger API endpoint (if available) */\n ledgerApi?: string;\n /** Access token for Ledger API (if available) */\n accessToken?: string;\n}\n\n// ─── Accounts ────────────────────────────────────────────────────────────────\n\nexport type CIP0103AccountStatus = 'initializing' | 'allocated';\n\nexport interface CIP0103Account {\n primary: boolean;\n partyId: string;\n status: CIP0103AccountStatus;\n hint: string;\n publicKey: string;\n namespace: string;\n /** CAIP-2 network identifier */\n networkId: string;\n signingProviderId: string;\n}\n\n// ─── Status ──────────────────────────────────────────────────────────────────\n\nexport type CIP0103ProviderType = 'browser' | 'desktop' | 'mobile' | 'remote';\n\nexport interface CIP0103ProviderInfo {\n id: string;\n /** dApp API version */\n version: string;\n providerType: CIP0103ProviderType;\n}\n\nexport interface CIP0103StatusEvent {\n connection: CIP0103ConnectResult;\n provider: CIP0103ProviderInfo;\n network?: CIP0103Network;\n session?: {\n accessToken: string;\n userId: string;\n };\n}\n\n// ─── Transaction Lifecycle ───────────────────────────────────────────────────\n\nexport type CIP0103TxStatus = 'pending' | 'signed' | 'executed' | 'failed';\n\nexport interface CIP0103TxPendingPayload {\n status: 'pending';\n commandId: string;\n}\n\nexport interface CIP0103TxSignedPayload {\n status: 'signed';\n commandId: string;\n payload: {\n signature: string;\n signedBy: string;\n party: string;\n };\n}\n\nexport interface CIP0103TxExecutedPayload {\n status: 'executed';\n commandId: string;\n payload: {\n updateId: string;\n completionOffset: number;\n };\n}\n\nexport interface CIP0103TxFailedPayload {\n status: 'failed';\n commandId: string;\n}\n\nexport type CIP0103TxChangedEvent =\n | CIP0103TxPendingPayload\n | CIP0103TxSignedPayload\n | CIP0103TxExecutedPayload\n | CIP0103TxFailedPayload;\n\n// ─── Ledger API ──────────────────────────────────────────────────────────────\n\nexport interface CIP0103LedgerApiRequest {\n requestMethod: 'GET' | 'POST' | 'PUT' | 'DELETE';\n resource: string;\n body?: string;\n}\n\nexport interface CIP0103LedgerApiResponse {\n response: string;\n}\n\n// ─── Sign Message ────────────────────────────────────────────────────────────\n\nexport interface CIP0103SignMessageRequest {\n message: string;\n}\n\n// ─── Error Model ─────────────────────────────────────────────────────────────\n\nexport interface CIP0103ProviderRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// ─── Canonical Method Names ──────────────────────────────────────────────────\n\nexport const CIP0103_METHODS = {\n CONNECT: 'connect',\n DISCONNECT: 'disconnect',\n IS_CONNECTED: 'isConnected',\n STATUS: 'status',\n GET_ACTIVE_NETWORK: 'getActiveNetwork',\n LIST_ACCOUNTS: 'listAccounts',\n GET_PRIMARY_ACCOUNT: 'getPrimaryAccount',\n SIGN_MESSAGE: 'signMessage',\n PREPARE_EXECUTE: 'prepareExecute',\n LEDGER_API: 'ledgerApi',\n} as const;\n\nexport type CIP0103Method = (typeof CIP0103_METHODS)[keyof typeof CIP0103_METHODS];\n\n/** All mandatory method names as an array (useful for conformance testing) */\nexport const CIP0103_MANDATORY_METHODS: readonly CIP0103Method[] = Object.values(CIP0103_METHODS);\n\n// ─── Canonical Event Names ───────────────────────────────────────────────────\n\nexport const CIP0103_EVENTS = {\n STATUS_CHANGED: 'statusChanged',\n ACCOUNTS_CHANGED: 'accountsChanged',\n TX_CHANGED: 'txChanged',\n /** Emitted when async connect completes */\n CONNECTED: 'connected',\n} as const;\n\nexport type CIP0103Event = (typeof CIP0103_EVENTS)[keyof typeof CIP0103_EVENTS];\n","/**\n * Deep Link Transport\n * \n * Opens a deep link URL (mobile) and awaits callback via redirect or postMessage.\n * \n * Security:\n * - State parameter (nonce) for CSRF protection\n * - Origin validation\n * - Timeout enforcement\n * - Callback origin allowlist\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * Deep link transport implementation\n */\nexport class DeepLinkTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Build deep link URL with query parameters\n */\n private buildDeepLinkUrl(\n baseUrl: string,\n request: ConnectRequest | SignRequest\n ): string {\n const url = new URL(baseUrl);\n Object.entries(request).forEach(([key, value]) => {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n url.searchParams.set(key, JSON.stringify(value));\n } else if (typeof value === 'object') {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n return url.toString();\n }\n\n /**\n * Validate callback origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Wait for callback via postMessage or redirect\n */\n private async waitForCallback<T extends { state: string }>(\n state: string,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === state) {\n cleanup();\n resolve(data as T);\n }\n };\n\n const redirectHandler = () => {\n // Check URL hash/fragment for callback data\n if (typeof window !== 'undefined') {\n const hash = window.location.hash.substring(1);\n const params = new URLSearchParams(hash);\n const callbackState = params.get('state');\n if (callbackState === state) {\n const data: T = {} as T;\n params.forEach((value, key) => {\n (data as Record<string, unknown>)[key] = value;\n });\n cleanup();\n resolve(data);\n }\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n window.removeEventListener('hashchange', redirectHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n window.addEventListener('hashchange', redirectHandler);\n // Also check current hash immediately\n redirectHandler();\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build deep link URL\n const deepLinkUrl = this.buildDeepLinkUrl(url, request);\n\n // Open deep link (mobile) or window (desktop fallback)\n if (typeof window !== 'undefined') {\n // Try to open deep link\n window.location.href = deepLinkUrl;\n\n // Fallback: open in new window if deep link fails\n // (This is a simulation - real mobile apps would handle the deep link)\n const fallbackWindow = window.open(deepLinkUrl, '_blank');\n if (!fallbackWindow) {\n throw new Error('Failed to open deep link');\n }\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000; // Default 60s\n const response = await this.waitForCallback<ConnectResponse>(\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build deep link URL\n const deepLinkUrl = this.buildDeepLinkUrl(url, request);\n\n // Open deep link\n if (typeof window !== 'undefined') {\n window.location.href = deepLinkUrl;\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<SignResponse>(\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * Popup Transport\n * \n * Opens a centered popup window and establishes a postMessage channel.\n * \n * Security:\n * - Origin validation\n * - State parameter validation\n * - Popup window management\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * Popup transport implementation\n */\nexport class PopupTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(\n baseUrl: string,\n request: ConnectRequest | SignRequest\n ): string {\n const url = new URL(baseUrl);\n Object.entries(request).forEach(([key, value]) => {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n url.searchParams.set(key, JSON.stringify(value));\n } else if (typeof value === 'object') {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n return url.toString();\n }\n\n /**\n * Validate message origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Open popup window\n */\n private openPopup(url: string, _options: TransportOptions): Window | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n return window.open(\n url,\n 'PartyLayer',\n `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`\n );\n }\n\n /**\n * Wait for postMessage callback\n */\n private async waitForCallback<T extends { state: string }>(\n popup: Window,\n state: string,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n popup.close();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n cleanup();\n reject(new Error('Popup closed by user'));\n }\n }, 500);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === state) {\n cleanup();\n popup.close();\n resolve(data as T);\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n clearInterval(checkClosed);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build URL\n const fullUrl = this.buildUrl(url, request);\n\n // Open popup\n const popup = this.openPopup(fullUrl, options);\n if (!popup) {\n throw new Error('Failed to open popup window');\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<ConnectResponse>(\n popup,\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build URL\n const fullUrl = this.buildUrl(url, request);\n\n // Open popup\n const popup = this.openPopup(fullUrl, options);\n if (!popup) {\n throw new Error('Failed to open popup window');\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<SignResponse>(\n popup,\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * PostMessage Transport\n * \n * Establishes a postMessage channel with an existing window/iframe.\n * \n * Security:\n * - Origin validation\n * - State parameter validation\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * PostMessage transport implementation\n */\nexport class PostMessageTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Validate message origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Send message and wait for response\n */\n private async sendAndWait<T extends { state: string }>(\n target: Window,\n targetOrigin: string,\n message: ConnectRequest | SignRequest,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === message.state) {\n cleanup();\n resolve(data as T);\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n target.postMessage(message, targetOrigin);\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n if (typeof window === 'undefined') {\n throw new Error('PostMessage transport requires browser environment');\n }\n\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Parse target origin from URL\n const targetUrl = new URL(url);\n const targetOrigin = targetUrl.origin;\n\n // Get target window (could be parent, opener, or specific iframe)\n // For now, assume we're communicating with parent/opener\n const target = (window.opener ?? window.parent) as Window | null;\n\n if (!target || target === window) {\n throw new Error('No target window available for postMessage');\n }\n\n // Send message and wait for response\n const timeout = options.timeoutMs || 60000;\n const response = await this.sendAndWait<ConnectResponse>(\n target,\n targetOrigin,\n request,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n if (typeof window === 'undefined') {\n throw new Error('PostMessage transport requires browser environment');\n }\n\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Parse target origin from URL\n const targetUrl = new URL(url);\n const targetOrigin = targetUrl.origin;\n\n // Get target window\n const target = (window.opener ?? window.parent) as Window | null;\n\n if (!target || target === window) {\n throw new Error('No target window available for postMessage');\n }\n\n // Send message and wait for response\n const timeout = options.timeoutMs || 60000;\n const response = await this.sendAndWait<SignResponse>(\n target,\n targetOrigin,\n request,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * Mock Transport\n * \n * For testing and development. Simulates transport behavior without real network calls.\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n JobStatus,\n} from './types';\nimport { toPartyId } from '../types';\n\n/**\n * Mock transport implementation\n */\nexport class MockTransport implements Transport {\n private mockResponses: Map<string, ConnectResponse | SignResponse> = new Map();\n private mockJobs: Map<string, JobStatus> = new Map();\n\n /**\n * Set mock response for a state\n */\n setMockResponse(state: string, response: ConnectResponse | SignResponse): void {\n this.mockResponses.set(state, response);\n }\n\n /**\n * Set mock job status\n */\n setMockJob(jobId: string, status: JobStatus): void {\n this.mockJobs.set(jobId, status);\n }\n\n /**\n * Clear all mocks\n */\n clearMocks(): void {\n this.mockResponses.clear();\n this.mockJobs.clear();\n }\n\n /**\n * Open a connection request (mock)\n */\n async openConnectRequest(\n _url: string,\n request: ConnectRequest,\n _options: TransportOptions\n ): Promise<ConnectResponse> {\n // Check for mock response\n const mockResponse = this.mockResponses.get(request.state);\n if (mockResponse && 'partyId' in mockResponse) {\n return mockResponse;\n }\n\n // Default mock response\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n state: request.state,\n partyId: toPartyId('mock-party-' + Date.now()),\n sessionToken: 'mock-token',\n expiresAt: Date.now() + 3600000, // 1 hour\n capabilities: request.requestedCapabilities || ['connect', 'signMessage'],\n });\n }, 100); // Simulate async delay\n });\n }\n\n /**\n * Open a sign request (mock)\n */\n async openSignRequest(\n _url: string,\n request: SignRequest,\n _options: TransportOptions\n ): Promise<SignResponse> {\n // Check for mock response\n const mockResponse = this.mockResponses.get(request.state);\n if (mockResponse && ('signature' in mockResponse || 'jobId' in mockResponse)) {\n return mockResponse;\n }\n\n // Default mock response\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n state: request.state,\n signature: 'mock-signature-' + Date.now(),\n transactionHash: request.transaction ? 'mock-tx-hash' : undefined,\n });\n }, 100);\n });\n }\n\n /**\n * Poll job status (mock)\n */\n pollJobStatus(\n jobId: string,\n _statusUrl: string,\n _options: TransportOptions\n ): Promise<JobStatus> {\n // Check for mock job\n const mockJob = this.mockJobs.get(jobId);\n if (mockJob) {\n return Promise.resolve(mockJob);\n }\n\n // Default mock: approved immediately\n return Promise.resolve({\n jobId,\n status: 'approved',\n result: {\n signature: 'mock-signature',\n transactionHash: 'mock-tx-hash',\n },\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/adapters.ts","../src/session.ts","../src/detection.ts","../src/metrics.ts","../src/metrics-payload.ts","../src/cip0103-types.ts","../src/transport/deeplink.ts","../src/transport/popup.ts","../src/transport/postmessage.ts","../src/transport/mock.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core types for PartyLayer SDK\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\n/**\n * Branded string types for type safety\n */\nexport type WalletId = string & { readonly __brand: 'WalletId' };\nexport type PartyId = string & { readonly __brand: 'PartyId' };\nexport type SessionId = string & { readonly __brand: 'SessionId' };\nexport type TransactionHash = string & { readonly __brand: 'TransactionHash' };\nexport type Signature = string & { readonly __brand: 'Signature' };\n\n/**\n * Network identifier\n * Standard networks: \"devnet\" | \"testnet\" | \"mainnet\"\n * Custom networks allowed as string\n */\nexport type NetworkId = 'devnet' | 'testnet' | 'mainnet' | (string & Record<never, never>);\n\n/**\n * Capability keys that wallets can support\n * Based on OpenRPC dApp API capabilities\n */\nexport type CapabilityKey =\n | 'connect'\n | 'disconnect'\n | 'restore'\n | 'signMessage'\n | 'signTransaction'\n | 'submitTransaction'\n | 'ledgerApi'\n | 'events'\n | 'deeplink'\n | 'popup'\n | 'injected'\n | 'remoteSigner';\n\n/**\n * Wallet installation hints for detection\n */\nexport interface InstallHints {\n /** Window property name (e.g., \"consoleWallet\") */\n injectedKey?: string;\n /** Browser extension ID */\n extensionId?: string;\n /** Deep link scheme (e.g., \"loop://\") */\n deepLinkScheme?: string;\n /** Script tag identifier */\n scriptTag?: string;\n}\n\n/**\n * Wallet adapter metadata\n */\nexport interface AdapterMetadata {\n /** NPM package name */\n packageName: string;\n /** Version range (semver) */\n versionRange: string;\n}\n\n/**\n * Provider matcher: a single rule used by `ProviderDetection.matchers`.\n *\n * Three match modes are defined; OR-combined inside a `ProviderDetection`.\n * Exact and prefix work on string fields directly; domain interprets the\n * field as a URL and tests its hostname against the registrable domain\n * (with subdomain support).\n */\nexport type ProviderMatcher =\n | {\n field: 'kernel.url' | 'kernel.userUrl';\n match: 'domain';\n /** Hostname or registrable domain. Subdomains are accepted. */\n value: string;\n }\n | {\n field:\n | 'kernel.id'\n | 'kernel.url'\n | 'kernel.userUrl'\n | 'kernel.clientType'\n | 'provider.id';\n match: 'exact';\n /** One or more exact values; ANY match returns true. */\n values: string[];\n }\n | {\n field: 'kernel.id' | 'kernel.url' | 'kernel.userUrl';\n match: 'prefix';\n value: string;\n };\n\n/**\n * Standards-first runtime detection of a CIP-0103 wallet.\n *\n * The registry stores these rules so that any current or future wallet\n * implementing `window.canton` can be identified without code changes —\n * a registry JSON update is enough.\n */\nexport interface ProviderDetection {\n /** Transport mechanism. Currently only 'window.canton' is supported. */\n transport: 'window.canton';\n /** OR-list of matchers. Provider matches if ANY matcher returns true. */\n matchers: ProviderMatcher[];\n}\n\n/**\n * Canonical CIP-0103 support marker.\n *\n * When `native: true`, the wallet is treated as a first-class CIP-0103\n * provider in the picker — it always appears in the \"CIP-0103 NATIVE\"\n * section regardless of install state, with a per-wallet readiness\n * indicator that reflects whether the wallet's `providerDetection` rules\n * matched the currently-injected `window.canton` provider.\n *\n * The field is optional; wallets that don't claim CIP-0103 support omit\n * it and continue to appear in the \"AVAILABLE\" section as before.\n */\nexport interface Cip0103Support {\n /** True if this wallet has confirmed CIP-0103 dApp API support. */\n native: boolean;\n /** Public evidence link (npm package, blog post, official statement). */\n evidence?: string;\n /** ISO date when CIP-0103 support was confirmed (informational). */\n since?: string;\n}\n\n/**\n * Wallet information from registry\n */\nexport interface WalletInfo {\n /** Wallet identifier */\n walletId: WalletId;\n /** Display name */\n name: string;\n /** Website URL */\n website: string;\n /** Icon URLs (different sizes) */\n icons: {\n sm?: string;\n md?: string;\n lg?: string;\n };\n /** Category (e.g., \"browser\", \"mobile\", \"hardware\") */\n category?: string;\n /** Supported capabilities */\n capabilities: CapabilityKey[];\n /** Installation detection hints */\n installHints?: InstallHints;\n /** Adapter package information */\n adapter: AdapterMetadata;\n /** Documentation URLs */\n docs: string[];\n /** Minimum SDK version required */\n minSdkVersion?: string;\n /** Supported networks */\n networks: NetworkId[];\n /** Registry channel */\n channel: 'stable' | 'beta';\n /** Additional metadata (e.g., originAllowlist) */\n metadata?: Record<string, string>;\n /**\n * Optional CIP-0103 runtime detection rules. When present, the picker can\n * decide whether this wallet is the currently-injected `window.canton`\n * provider and route it into the \"CIP-0103 Native\" section without any\n * hardcoded wallet IDs. Wallets that aren't CIP-0103-injected (e.g. Bron,\n * Cantor8 deeplink) leave this unset.\n */\n providerDetection?: ProviderDetection;\n /**\n * Canonical CIP-0103 support marker. When set with `native: true`, the\n * picker always lists the wallet in the \"CIP-0103 NATIVE\" section\n * regardless of install state.\n */\n cip0103?: Cip0103Support;\n}\n\n/**\n * Returns true if the wallet has been canonically marked as CIP-0103\n * native via its registry entry. The check is structural so it works on\n * both raw `RegistryWalletEntry` shapes and converted `WalletInfo`.\n */\nexport function isCip0103Native(entry: { cip0103?: Cip0103Support }): boolean {\n return entry?.cip0103?.native === true;\n}\n\n/**\n * Session information\n * Sessions are origin-bound and encrypted in storage\n */\nexport interface Session {\n /** Unique session ID */\n sessionId: SessionId;\n /** Wallet identifier */\n walletId: WalletId;\n /** Connected party ID */\n partyId: PartyId;\n /** Current network */\n network: NetworkId;\n /** Session creation timestamp */\n createdAt: number;\n /** Session expiration timestamp (if applicable) */\n expiresAt?: number;\n /** Origin of the dApp that created the session */\n origin: string;\n /** Capabilities available in this session */\n capabilitiesSnapshot: CapabilityKey[];\n /** Additional metadata (encrypted in storage) */\n metadata?: Record<string, string>;\n}\n\n/**\n * Persisted session (for restoration)\n */\nexport interface PersistedSession extends Session {\n /** Encrypted session data */\n encrypted: string;\n}\n\n/**\n * Signed message result\n */\nexport interface SignedMessage {\n /** Signature */\n signature: Signature;\n /** Party ID that signed */\n partyId: PartyId;\n /** Original message */\n message: string;\n /** Nonce used (if provided) */\n nonce?: string;\n /** Domain used (if provided) */\n domain?: string;\n}\n\n/**\n * Signed transaction result\n */\nexport interface SignedTransaction {\n /** Signed transaction data */\n signedTx: unknown;\n /** Transaction hash */\n transactionHash: TransactionHash;\n /** Party ID that signed */\n partyId: PartyId;\n}\n\n/**\n * Transaction receipt\n */\nexport interface TxReceipt {\n /** Transaction hash */\n transactionHash: TransactionHash;\n /** Submission timestamp */\n submittedAt: number;\n /** Command ID (if available) */\n commandId?: string;\n /** Update ID (if available) */\n updateId?: string;\n}\n\n/**\n * Transaction status\n */\nexport type TransactionStatus =\n | 'pending'\n | 'submitted'\n | 'committed'\n | 'rejected'\n | 'failed';\n\n/**\n * Transaction status update\n */\nexport interface TxStatusUpdate {\n /** Session ID */\n sessionId: SessionId;\n /** Transaction ID */\n txId: TransactionHash;\n /** Current status */\n status: TransactionStatus;\n /** Raw transaction data (if available) */\n raw?: unknown;\n /** Timestamp */\n timestamp: number;\n}\n\n/**\n * Helper to create branded WalletId\n */\nexport function toWalletId(id: string): WalletId {\n return id as WalletId;\n}\n\n/**\n * Helper to create branded PartyId\n */\nexport function toPartyId(id: string): PartyId {\n return id as PartyId;\n}\n\n/**\n * Helper to create branded SessionId\n */\nexport function toSessionId(id: string): SessionId {\n return id as SessionId;\n}\n\n/**\n * Helper to create branded TransactionHash\n */\nexport function toTransactionHash(hash: string): TransactionHash {\n return hash as TransactionHash;\n}\n\n/**\n * Helper to create branded Signature\n */\nexport function toSignature(sig: string): Signature {\n return sig as Signature;\n}\n","/**\n * Error taxonomy for PartyLayer SDK\n * \n * All errors extend PartyLayerError with stable error codes.\n * Error codes are string literals for telemetry and UI message mapping.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\n/**\n * Error code union - stable string literals for telemetry and UI\n */\nexport type ErrorCode =\n | 'WALLET_NOT_FOUND'\n | 'WALLET_NOT_INSTALLED'\n | 'USER_REJECTED'\n | 'ORIGIN_NOT_ALLOWED'\n | 'SESSION_EXPIRED'\n | 'CAPABILITY_NOT_SUPPORTED'\n | 'TRANSPORT_ERROR'\n | 'REGISTRY_FETCH_FAILED'\n | 'REGISTRY_VERIFICATION_FAILED'\n | 'REGISTRY_SCHEMA_INVALID'\n | 'INTERNAL_ERROR'\n | 'TIMEOUT';\n\n/**\n * Error mapping context\n */\nexport interface ErrorMappingContext {\n /** Wallet ID (if applicable) */\n walletId?: string;\n /** Operation phase */\n phase: 'connect' | 'restore' | 'signMessage' | 'signTransaction' | 'submitTransaction' | 'ledgerApi';\n /** Transport type */\n transport?: 'injected' | 'popup' | 'deeplink' | 'remote';\n /** Timeout in milliseconds (for timeout errors) */\n timeoutMs?: number;\n /** Additional context */\n details?: Record<string, unknown>;\n}\n\n/**\n * Base error class for all PartyLayer errors\n */\nexport class PartyLayerError extends Error {\n public readonly code: ErrorCode;\n public readonly cause?: unknown;\n public readonly details?: Record<string, unknown>;\n public readonly isOperational: boolean;\n\n constructor(\n message: string,\n code: ErrorCode,\n options?: {\n cause?: unknown;\n details?: Record<string, unknown>;\n isOperational?: boolean;\n }\n ) {\n super(message);\n this.name = 'PartyLayerError';\n this.code = code;\n this.cause = options?.cause;\n this.details = options?.details;\n this.isOperational = options?.isOperational ?? true;\n\n // Maintains proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PartyLayerError);\n }\n }\n\n /**\n * Serialize error to JSON for telemetry/logging\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n isOperational: this.isOperational,\n details: this.details,\n cause: this.cause instanceof Error\n ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack,\n }\n : this.cause,\n };\n }\n}\n\n/**\n * Wallet not found error\n */\nexport class WalletNotFoundError extends PartyLayerError {\n constructor(walletId: string) {\n super(`Wallet \"${walletId}\" not found`, 'WALLET_NOT_FOUND', {\n details: { walletId },\n });\n this.name = 'WalletNotFoundError';\n }\n}\n\n/**\n * Wallet not installed error\n */\nexport class WalletNotInstalledError extends PartyLayerError {\n constructor(walletId: string, reason?: string) {\n super(\n `Wallet \"${walletId}\" is not installed${reason ? `: ${reason}` : ''}`,\n 'WALLET_NOT_INSTALLED',\n {\n details: { walletId, reason },\n }\n );\n this.name = 'WalletNotInstalledError';\n }\n}\n\n/**\n * User rejected error\n */\nexport class UserRejectedError extends PartyLayerError {\n constructor(operation: string, details?: Record<string, unknown>) {\n super(`User rejected ${operation}`, 'USER_REJECTED', {\n details: { operation, ...details },\n });\n this.name = 'UserRejectedError';\n }\n}\n\n/**\n * Origin not allowed error\n */\nexport class OriginNotAllowedError extends PartyLayerError {\n constructor(origin: string, allowedOrigins?: string[]) {\n super(\n `Origin \"${origin}\" is not allowed`,\n 'ORIGIN_NOT_ALLOWED',\n {\n details: { origin, allowedOrigins },\n }\n );\n this.name = 'OriginNotAllowedError';\n }\n}\n\n/**\n * Session expired error\n */\nexport class SessionExpiredError extends PartyLayerError {\n constructor(sessionId: string) {\n super(`Session \"${sessionId}\" has expired`, 'SESSION_EXPIRED', {\n details: { sessionId },\n });\n this.name = 'SessionExpiredError';\n }\n}\n\n/**\n * Capability not supported error\n */\nexport class CapabilityNotSupportedError extends PartyLayerError {\n constructor(walletId: string, capability: string) {\n super(\n `Wallet \"${walletId}\" does not support capability \"${capability}\"`,\n 'CAPABILITY_NOT_SUPPORTED',\n {\n details: { walletId, capability },\n }\n );\n this.name = 'CapabilityNotSupportedError';\n }\n}\n\n/**\n * Transport error\n */\nexport class TransportError extends PartyLayerError {\n constructor(message: string, cause?: unknown, details?: Record<string, unknown>) {\n super(message, 'TRANSPORT_ERROR', {\n cause,\n details,\n });\n this.name = 'TransportError';\n }\n}\n\n/**\n * Registry fetch failed error\n */\nexport class RegistryFetchFailedError extends PartyLayerError {\n constructor(url: string, cause?: unknown) {\n super(`Failed to fetch registry from \"${url}\"`, 'REGISTRY_FETCH_FAILED', {\n cause,\n details: { url },\n });\n this.name = 'RegistryFetchFailedError';\n }\n}\n\n/**\n * Registry verification failed error\n */\nexport class RegistryVerificationFailedError extends PartyLayerError {\n constructor(reason: string, details?: Record<string, unknown>) {\n super(`Registry verification failed: ${reason}`, 'REGISTRY_VERIFICATION_FAILED', {\n details: { reason, ...details },\n });\n this.name = 'RegistryVerificationFailedError';\n }\n}\n\n/**\n * Registry schema invalid error\n */\nexport class RegistrySchemaInvalidError extends PartyLayerError {\n constructor(reason: string, details?: Record<string, unknown>) {\n super(`Registry schema invalid: ${reason}`, 'REGISTRY_SCHEMA_INVALID', {\n details: { reason, ...details },\n });\n this.name = 'RegistrySchemaInvalidError';\n }\n}\n\n/**\n * Internal error (non-operational)\n */\nexport class InternalError extends PartyLayerError {\n constructor(message: string, cause?: unknown, details?: Record<string, unknown>) {\n super(message, 'INTERNAL_ERROR', {\n cause,\n details,\n isOperational: false,\n });\n this.name = 'InternalError';\n }\n}\n\n/**\n * Timeout error\n */\nexport class TimeoutError extends PartyLayerError {\n constructor(operation: string, timeoutMs: number) {\n super(\n `Operation \"${operation}\" timed out after ${timeoutMs}ms`,\n 'TIMEOUT',\n {\n details: { operation, timeoutMs },\n }\n );\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Map unknown errors to PartyLayerError\n * \n * This is the single error mapping strategy used by all adapters.\n * It normalizes errors from various sources (wallet SDKs, network, etc.)\n * into typed PartyLayerError instances.\n */\nexport function mapUnknownErrorToPartyLayerError(\n err: unknown,\n context: ErrorMappingContext\n): PartyLayerError {\n // Already a PartyLayerError\n if (err instanceof PartyLayerError) {\n return err;\n }\n\n // Standard Error\n if (err instanceof Error) {\n const message = err.message.toLowerCase();\n\n // User rejection patterns\n if (\n message.includes('rejected') ||\n message.includes('denied') ||\n message.includes('cancelled') ||\n message.includes('canceled') ||\n err.name === 'UserRejectedError'\n ) {\n return new UserRejectedError(context.phase, {\n walletId: context.walletId,\n transport: context.transport,\n originalMessage: err.message,\n });\n }\n\n // Timeout patterns\n if (\n message.includes('timeout') ||\n message.includes('timed out') ||\n err.name === 'TimeoutError'\n ) {\n // Try to get timeout from context, or extract from error message, or default to 0\n let timeoutMs = context.timeoutMs ?? 0;\n if (timeoutMs === 0) {\n // Try to extract from message like \"timed out after 30000ms\" or \"timeout after 30s\"\n const msMatch = err.message.match(/(\\d+)\\s*ms/i);\n const secMatch = err.message.match(/(\\d+)\\s*(?:sec|second)/i);\n if (msMatch) {\n timeoutMs = parseInt(msMatch[1], 10);\n } else if (secMatch) {\n timeoutMs = parseInt(secMatch[1], 10) * 1000;\n }\n }\n return new TimeoutError(context.phase, timeoutMs);\n }\n\n // Network/transport errors\n if (\n message.includes('network') ||\n message.includes('fetch') ||\n message.includes('connection') ||\n err.name === 'NetworkError' ||\n err.name === 'TypeError'\n ) {\n return new TransportError(err.message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n });\n }\n\n // Generic transport error\n return new TransportError(err.message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n originalError: err.name,\n });\n }\n\n // String errors\n if (typeof err === 'string') {\n return new TransportError(err, undefined, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n });\n }\n\n // Unknown error type\n return new InternalError(\n `Unknown error in ${context.phase}`,\n err,\n {\n walletId: context.walletId,\n transport: context.transport,\n errorType: typeof err,\n }\n );\n}\n","/**\n * Wallet adapter interface contract\n * \n * All wallet adapters must implement this interface.\n * Adapters are responsible for:\n * - Detecting wallet installation\n * - Establishing connections\n * - Signing messages/transactions\n * - Emitting events\n * \n * References:\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\nimport type {\n WalletId,\n PartyId,\n NetworkId,\n CapabilityKey,\n Session,\n PersistedSession,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n} from './types';\nimport {\n CapabilityNotSupportedError,\n WalletNotInstalledError,\n} from './errors';\n\n/**\n * Adapter detection result\n */\nexport interface AdapterDetectResult {\n /** Whether wallet is installed */\n installed: boolean;\n /** Reason if not installed */\n reason?: string;\n}\n\n/**\n * Adapter connection result\n */\nexport interface AdapterConnectResult {\n /** Connected party ID */\n partyId: PartyId;\n /** Partial session data (SDK will complete it) */\n session: Partial<Session>;\n /** Capabilities available in this session */\n capabilities: CapabilityKey[];\n}\n\n/**\n * Sign message parameters\n */\nexport interface SignMessageParams {\n /** Message to sign */\n message: string;\n /** Optional nonce */\n nonce?: string;\n /** Optional domain */\n domain?: string;\n}\n\n/**\n * Sign transaction parameters\n */\nexport interface SignTransactionParams {\n /** Transaction to sign (type kept as unknown for wallet-specific formats) */\n tx: unknown;\n}\n\n/**\n * Submit transaction parameters\n */\nexport interface SubmitTransactionParams {\n /** Signed transaction */\n signedTx: unknown;\n}\n\n/**\n * Ledger API proxy parameters (CIP-0103 ledgerApi method)\n */\nexport interface LedgerApiParams {\n /** HTTP method for the JSON Ledger API */\n requestMethod: 'GET' | 'POST' | 'PUT' | 'DELETE';\n /** Resource path (e.g., \"/v2/state/acs\") */\n resource: string;\n /** Optional JSON body */\n body?: string;\n}\n\n/**\n * Ledger API proxy result\n */\nexport interface LedgerApiResult {\n /** JSON response from the Ledger API */\n response: string;\n}\n\n/**\n * Logger interface\n */\nexport interface LoggerAdapter {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, error?: unknown, ...args: unknown[]): void;\n}\n\n/**\n * Telemetry interface\n * \n * Extended in 0.3.0 with optional metrics methods.\n * All new methods are optional to maintain backward compatibility.\n */\nexport interface TelemetryAdapter {\n /** Track a named event with optional properties */\n track(event: string, properties?: Record<string, unknown>): void;\n \n /** Track an error occurrence */\n error(error: Error, properties?: Record<string, unknown>): void;\n \n /**\n * Increment a metric counter\n * @param metric - Metric name (e.g., 'wallet_connect_attempts')\n * @param value - Value to increment by (default: 1)\n * @since 0.3.0\n */\n increment?(metric: string, value?: number): void;\n \n /**\n * Set a gauge metric value\n * @param metric - Metric name\n * @param value - Current value\n * @since 0.3.0\n */\n gauge?(metric: string, value: number): void;\n \n /**\n * Flush buffered metrics to backend\n * @since 0.3.0\n */\n flush?(): Promise<void>;\n \n /**\n * Check if telemetry is enabled\n * @returns true if telemetry should be collected\n * @since 0.3.0\n */\n isEnabled?(): boolean;\n}\n\n/**\n * Crypto interface\n */\nexport interface CryptoAdapter {\n encrypt(data: string, key: string): Promise<string>;\n decrypt(encrypted: string, key: string): Promise<string>;\n generateKey(): Promise<string>;\n}\n\n/**\n * Storage interface\n */\nexport interface StorageAdapter {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n remove(key: string): Promise<void>;\n clear(): Promise<void>;\n}\n\n/**\n * Registry client interface (for adapters to query wallet info)\n */\nexport interface RegistryClientAdapter {\n getWallet(walletId: WalletId): Promise<unknown>;\n}\n\n/**\n * Adapter context provided to all adapter methods\n */\nexport interface AdapterContext {\n /** Application name */\n appName: string;\n /** Origin (for origin binding) */\n origin: string;\n /** Network */\n network: NetworkId;\n /** Logger */\n logger: LoggerAdapter;\n /** Telemetry (optional) */\n telemetry?: TelemetryAdapter;\n /** Registry client */\n registry: RegistryClientAdapter;\n /** Crypto adapter */\n crypto: CryptoAdapter;\n /** Storage adapter */\n storage: StorageAdapter;\n /** Timeout helper */\n timeout: (ms: number) => Promise<never>;\n /** Abort signal (for cancellation) */\n abortSignal?: AbortSignal;\n}\n\n/**\n * Adapter event names\n */\nexport type AdapterEventName =\n | 'connect'\n | 'disconnect'\n | 'sessionExpired'\n | 'txStatus'\n | 'error';\n\n/**\n * Wallet adapter interface\n * \n * All wallet adapters must implement this interface.\n * Optional methods (marked with ?) should only be implemented\n * if the wallet supports that capability.\n */\nexport interface WalletAdapter {\n /** Wallet identifier */\n readonly walletId: WalletId;\n /** Wallet display name */\n readonly name: string;\n\n /**\n * Get supported capabilities\n */\n getCapabilities(): CapabilityKey[];\n\n /**\n * Detect if wallet is installed\n */\n detectInstalled(): Promise<AdapterDetectResult>;\n\n /**\n * Connect to wallet\n * @param ctx Adapter context\n * @param opts Connection options (optional)\n */\n connect(\n ctx: AdapterContext,\n opts?: {\n timeoutMs?: number;\n partyId?: PartyId;\n /** When false, prefer remote/mobile transport over installed extension */\n preferInstalled?: boolean;\n }\n ): Promise<AdapterConnectResult>;\n\n /**\n * Disconnect from wallet\n * @param ctx Adapter context\n * @param session Session to disconnect\n */\n disconnect(ctx: AdapterContext, session: Session): Promise<void>;\n\n /**\n * Restore session (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param persisted Persisted session data\n */\n restore?(\n ctx: AdapterContext,\n persisted: PersistedSession\n ): Promise<Session | null>;\n\n /**\n * Sign message (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Sign message parameters\n */\n signMessage?(\n ctx: AdapterContext,\n session: Session,\n params: SignMessageParams\n ): Promise<SignedMessage>;\n\n /**\n * Sign transaction (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Sign transaction parameters\n */\n signTransaction?(\n ctx: AdapterContext,\n session: Session,\n params: SignTransactionParams\n ): Promise<SignedTransaction>;\n\n /**\n * Submit transaction (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Submit transaction parameters\n */\n submitTransaction?(\n ctx: AdapterContext,\n session: Session,\n params: SubmitTransactionParams\n ): Promise<TxReceipt>;\n\n /**\n * Proxy a JSON Ledger API request (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Ledger API request parameters\n */\n ledgerApi?(\n ctx: AdapterContext,\n session: Session,\n params: LedgerApiParams\n ): Promise<LedgerApiResult>;\n\n /**\n * Subscribe to adapter events (optional)\n * @param event Event name\n * @param handler Event handler\n * @returns Unsubscribe function\n */\n on?(\n event: AdapterEventName,\n handler: (payload: unknown) => void\n ): () => void;\n}\n\n/**\n * Check if adapter supports required capabilities\n * Throws CapabilityNotSupportedError if not supported\n */\nexport function capabilityGuard(\n adapter: WalletAdapter,\n requiredCapabilities: CapabilityKey[]\n): void {\n const supported = adapter.getCapabilities();\n const missing = requiredCapabilities.filter((cap) => !supported.includes(cap));\n\n if (missing.length > 0) {\n throw new CapabilityNotSupportedError(\n adapter.walletId,\n missing.join(', ')\n );\n }\n}\n\n/**\n * Check if wallet is installed\n * Throws WalletNotInstalledError if not installed\n */\nexport async function installGuard(\n adapter: WalletAdapter\n): Promise<void> {\n const detect = await adapter.detectInstalled();\n if (!detect.installed) {\n throw new WalletNotInstalledError(adapter.walletId, detect.reason);\n }\n}\n","/**\n * Session management utilities\n */\n\nimport type { Session, SessionId } from './types';\nimport { toSessionId } from './types';\n\n/**\n * Generate a unique session ID\n */\nexport function generateSessionId(): SessionId {\n return toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`);\n}\n\n/**\n * Validate session structure\n */\nexport function validateSession(session: unknown): session is Session {\n if (typeof session !== 'object' || session === null) {\n return false;\n }\n\n const s = session as Record<string, unknown>;\n\n return (\n typeof s.sessionId === 'string' &&\n typeof s.walletId === 'string' &&\n typeof s.partyId === 'string' &&\n typeof s.network === 'string' &&\n typeof s.createdAt === 'number' &&\n typeof s.origin === 'string' &&\n Array.isArray(s.capabilitiesSnapshot)\n );\n}\n\n/**\n * Check if session is expired\n */\nexport function isSessionExpired(session: Session): boolean {\n if (!session.expiresAt) {\n return false; // No expiration\n }\n\n return Date.now() >= session.expiresAt;\n}\n\n/**\n * Create a session with default values\n */\nexport function createSession(\n walletId: string,\n partyId: string,\n network: string,\n origin: string,\n capabilities: string[] = [],\n expiresInMs?: number\n): Session {\n const now = Date.now();\n return {\n sessionId: generateSessionId(),\n walletId: walletId as import('./types').WalletId,\n partyId: partyId as import('./types').PartyId,\n network,\n createdAt: now,\n expiresAt: expiresInMs ? now + expiresInMs : undefined,\n origin,\n capabilitiesSnapshot: capabilities as import('./types').CapabilityKey[],\n };\n}\n","/**\n * Standards-first CIP-0103 wallet detection.\n *\n * The registry stores `providerDetection` rules per wallet entry. At\n * runtime the picker calls `window.canton.request({method:'status'})`,\n * receives the wallet's self-reported identity (kernel.id / kernel.url /\n * kernel.userUrl / kernel.clientType), and asks `findMatchingWallet`\n * which registry entry — if any — claims this provider.\n *\n * The architecture deliberately avoids hardcoding wallet IDs anywhere\n * outside the registry. Adding a new CIP-0103 wallet to the ecosystem\n * is a registry JSON update; no SDK release is required.\n */\n\nimport type {\n ProviderDetection,\n ProviderMatcher,\n WalletInfo,\n} from './types';\n\n/**\n * The shape of a CIP-0103 status response that detection cares about.\n *\n * Mirrors what `window.canton.request({ method: 'status' })` returns —\n * declared structurally so adapter packages can reuse this without\n * reaching into the wallet-specific types.\n */\nexport interface Cip0103StatusForDetection {\n kernel?: {\n id?: string;\n url?: string;\n userUrl?: string;\n clientType?: string;\n };\n}\n\n/** Returns true if the runtime status matches any of the detection's matchers. */\nexport function matchesProviderDetection(\n status: Cip0103StatusForDetection | null | undefined,\n detection: ProviderDetection | undefined,\n): boolean {\n if (!status || !detection || !detection.matchers || detection.matchers.length === 0) {\n return false;\n }\n return detection.matchers.some((m) => matchesSingle(status, m));\n}\n\nfunction matchesSingle(status: Cip0103StatusForDetection, matcher: ProviderMatcher): boolean {\n const fieldValue = readField(status, matcher.field);\n if (typeof fieldValue !== 'string' || fieldValue.length === 0) return false;\n\n switch (matcher.match) {\n case 'exact':\n return matcher.values.includes(fieldValue);\n case 'prefix':\n return fieldValue.startsWith(matcher.value);\n case 'domain':\n return matchesDomain(fieldValue, matcher.value);\n default:\n return false;\n }\n}\n\n/**\n * Read a dot-separated field path from the wallet status object.\n *\n * Historically this only supported `kernel.*` paths because that's what\n * CIP-103's status response shape was assumed to contain. Real-world\n * wallets (notably Send) inject their CIP-103 provider with status\n * payloads that nest provider info under different top-level keys\n * (e.g., `provider.*`). This generalized form reads ANY top-level\n * object on `status`.\n *\n * Behavior is identical to the previous `kernel.*`-only implementation\n * for every `kernel.*` input: same return values, same undefined cases.\n * The change is purely additive — it permits new top-level keys without\n * altering existing path resolution.\n *\n * Supports two-segment paths only (`root.key`). Deeper nesting is\n * intentionally not supported; if a wallet uses deeper paths, the\n * matcher schema would need extension first (separate change).\n */\nfunction readField(\n status: Cip0103StatusForDetection,\n field: ProviderMatcher['field'],\n): string | undefined {\n if (!status || typeof status !== 'object') return undefined;\n const dot = field.indexOf('.');\n if (dot < 0) return undefined;\n const root = field.slice(0, dot);\n const key = field.slice(dot + 1);\n const subject = (status as unknown as Record<string, unknown>)[root];\n if (!subject || typeof subject !== 'object') return undefined;\n const value = (subject as Record<string, unknown>)[key];\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Matches a URL string against a registrable domain. Subdomain matches\n * are accepted; foreign domains are rejected; un-parseable URLs return\n * false (no exception).\n *\n * Examples:\n * matchesDomain('https://api-mainnet.cantonwallet.com/x', 'cantonwallet.com') === true\n * matchesDomain('https://cantonwallet.com', 'cantonwallet.com') === true\n * matchesDomain('https://other.com', 'cantonwallet.com') === false\n */\nfunction matchesDomain(url: string, domain: string): boolean {\n try {\n const hostname = new URL(url).hostname.toLowerCase();\n const target = domain.toLowerCase();\n return hostname === target || hostname.endsWith('.' + target);\n } catch {\n return false;\n }\n}\n\n/**\n * Find the first registry entry whose `providerDetection` matches the\n * runtime status. Entries without `providerDetection` are skipped.\n *\n * Accepts either the raw `RegistryWalletEntry[]` shape (registry-client's\n * native input) or the converted `WalletInfo[]` shape that flows through\n * the SDK / React layer — the only field read is `providerDetection`,\n * which both shapes carry post-conversion.\n */\nexport function findMatchingWallet<\n T extends { providerDetection?: ProviderDetection },\n>(status: Cip0103StatusForDetection | null | undefined, registry: readonly T[]): T | undefined {\n if (!status) return undefined;\n for (const entry of registry) {\n if (matchesProviderDetection(status, entry.providerDetection)) {\n return entry;\n }\n }\n return undefined;\n}\n\n/**\n * Type-guard convenience for the WalletInfo shape, since the SDK exposes\n * `WalletInfo[]` to React consumers.\n */\nexport function findMatchingWalletInfo(\n status: Cip0103StatusForDetection | null | undefined,\n wallets: readonly WalletInfo[],\n): WalletInfo | undefined {\n return findMatchingWallet(status, wallets);\n}\n\n/**\n * Best-effort display name for an unrecognised CIP-0103 provider. Reads\n * the wallet's self-declared `kernel.userUrl` (the human-facing URL\n * surfaced by Sigilry-style wallets) and falls back to `kernel.id` or\n * a generic label.\n */\nexport function deriveGenericWalletName(status: Cip0103StatusForDetection | null | undefined): string {\n const userUrl = status?.kernel?.userUrl;\n if (typeof userUrl === 'string' && userUrl.length > 0) {\n try {\n return new URL(userUrl).hostname.replace(/^www\\./, '');\n } catch {\n /* fall through */\n }\n }\n const id = status?.kernel?.id;\n if (typeof id === 'string' && id.length > 0) {\n return `CIP-0103 wallet (${id.slice(0, 8)}…)`;\n }\n return 'CIP-0103 wallet';\n}\n","/**\n * Canonical Metrics Constants\n * \n * These metric names are the official set for PartyLayer telemetry.\n * Changing these names would break metrics aggregation and downstream reporting.\n * \n * @since 0.3.0\n */\n\n/**\n * Enablement Metrics\n * \n * These metrics measure how PartyLayer enables wallet interactions.\n */\nexport const ENABLEMENT_METRICS = {\n /** Total wallet connect() calls made */\n WALLET_CONNECT_ATTEMPTS: 'wallet_connect_attempts',\n \n /** Successful wallet connections (session:connected events) */\n WALLET_CONNECT_SUCCESS: 'wallet_connect_success',\n \n /** New sessions created (not restored) */\n SESSIONS_CREATED: 'sessions_created',\n \n /** Sessions successfully restored from storage */\n SESSIONS_RESTORED: 'sessions_restored',\n \n /** Total session restore attempts */\n RESTORE_ATTEMPTS: 'restore_attempts',\n} as const;\n\n/**\n * Error Metrics\n * \n * These metrics track error occurrences by code.\n */\nexport const ERROR_METRICS = {\n /** Prefix for error metrics (e.g., error_USER_REJECTED) */\n ERROR_PREFIX: 'error_',\n} as const;\n\n/**\n * Registry Metrics\n * \n * These metrics track registry client behavior.\n */\nexport const REGISTRY_METRICS = {\n /** Registry fetched from network */\n REGISTRY_FETCH: 'registry_fetch',\n \n /** Registry served from cache */\n REGISTRY_CACHE_HIT: 'registry_cache_hit',\n \n /** Stale registry was used */\n REGISTRY_STALE: 'registry_stale',\n} as const;\n\n/**\n * All metrics combined\n */\nexport const METRICS = {\n ...ENABLEMENT_METRICS,\n ...ERROR_METRICS,\n ...REGISTRY_METRICS,\n} as const;\n\n/**\n * Type for all metric names\n */\nexport type MetricName = typeof METRICS[keyof typeof METRICS];\n\n/**\n * Build an error metric name from an error code\n * \n * @param errorCode - The error code (e.g., 'USER_REJECTED')\n * @returns The metric name (e.g., 'error_USER_REJECTED')\n */\nexport function errorMetricName(errorCode: string): string {\n return `${METRICS.ERROR_PREFIX}${errorCode}`;\n}\n","/**\n * Metrics Payload Types and Privacy Validation\n * \n * This module defines the privacy-safe payload format for metrics collection.\n * \n * Privacy Guarantees:\n * - NO wallet addresses\n * - NO raw party IDs\n * - NO transaction payloads\n * - NO signed message content\n * - NO user identifiers\n * \n * @since 0.3.0\n */\n\n/**\n * Privacy-safe metrics payload\n * \n * This is the only payload format accepted by the metrics backend.\n */\nexport interface MetricsPayload {\n /** SDK version (e.g., '0.3.0') */\n sdkVersion: string;\n \n /** Network identifier (e.g., 'devnet', 'mainnet') */\n network: string;\n \n /** Unix timestamp in milliseconds */\n timestamp: number;\n \n /** Metric name → value map */\n metrics: Record<string, number>;\n \n /** Hashed app identifier (opt-in, SHA-256) */\n appIdHash?: string;\n \n /** Hashed origin (opt-in, SHA-256) */\n originHash?: string;\n}\n\n/**\n * Fields that are NEVER allowed in metrics payloads\n */\nconst FORBIDDEN_FIELDS = [\n 'walletAddress',\n 'address',\n 'partyId',\n 'rawPartyId',\n 'publicKey',\n 'privateKey',\n 'seed',\n 'mnemonic',\n 'txPayload',\n 'transaction',\n 'signedMessage',\n 'message',\n 'signature',\n 'userId',\n 'email',\n 'name',\n 'ip',\n 'userAgent',\n] as const;\n\n/**\n * Validate that a payload is privacy-safe\n * \n * @param payload - Unknown payload to validate\n * @returns true if payload is valid MetricsPayload with no PII\n * @throws Error if forbidden fields are detected\n */\nexport function validatePayload(payload: unknown): payload is MetricsPayload {\n if (!payload || typeof payload !== 'object') {\n return false;\n }\n \n const obj = payload as Record<string, unknown>;\n \n // Check for forbidden fields\n for (const field of FORBIDDEN_FIELDS) {\n if (field in obj) {\n throw new Error(`Forbidden field detected in metrics payload: ${field}`);\n }\n }\n \n // Validate required fields\n if (typeof obj.sdkVersion !== 'string') {\n return false;\n }\n \n if (typeof obj.network !== 'string') {\n return false;\n }\n \n if (typeof obj.timestamp !== 'number' || obj.timestamp <= 0) {\n return false;\n }\n \n if (!obj.metrics || typeof obj.metrics !== 'object') {\n return false;\n }\n \n // Validate metrics are all numbers\n for (const [key, value] of Object.entries(obj.metrics as Record<string, unknown>)) {\n if (typeof key !== 'string' || typeof value !== 'number') {\n return false;\n }\n }\n \n // Validate optional hashed fields\n if (obj.appIdHash !== undefined && typeof obj.appIdHash !== 'string') {\n return false;\n }\n \n if (obj.originHash !== undefined && typeof obj.originHash !== 'string') {\n return false;\n }\n \n return true;\n}\n\n/**\n * Hash a string using SHA-256 (browser-compatible)\n * \n * @param value - String to hash\n * @returns Hex-encoded SHA-256 hash\n */\nexport async function hashForPrivacy(value: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n // Fallback: simple hash for non-browser environments\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n const char = value.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n \n const encoder = new TextEncoder();\n const data = encoder.encode(value);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Create a sanitized metrics payload\n * \n * This function ensures the payload is privacy-safe before sending.\n * \n * @param data - Raw metrics data\n * @returns Sanitized MetricsPayload\n */\nexport function createMetricsPayload(data: {\n sdkVersion: string;\n network: string;\n metrics: Record<string, number>;\n appIdHash?: string;\n originHash?: string;\n}): MetricsPayload {\n const payload: MetricsPayload = {\n sdkVersion: data.sdkVersion,\n network: data.network,\n timestamp: Date.now(),\n metrics: { ...data.metrics },\n };\n \n if (data.appIdHash) {\n payload.appIdHash = data.appIdHash;\n }\n \n if (data.originHash) {\n payload.originHash = data.originHash;\n }\n \n // Final validation\n if (!validatePayload(payload)) {\n throw new Error('Failed to create valid metrics payload');\n }\n \n return payload;\n}\n","/**\n * CIP-0103 dApp Standard — Canonical Type Definitions\n *\n * These types are the verbatim representation of the CIP-0103 specification.\n * They live in @partylayer/core so both @partylayer/provider and @partylayer/sdk\n * can reference them without circular dependencies.\n *\n * Reference: https://github.com/canton-foundation/cips/blob/main/cip-0103/cip-0103.md\n *\n * IMPORTANT: Do not add PartyLayer-specific fields or aliases.\n * These types represent the standard exactly.\n */\n\n// ─── Provider Primitives ─────────────────────────────────────────────────────\n\nexport type CIP0103EventListener<T = unknown> = (...args: T[]) => void;\n\nexport type CIP0103RequestParams = unknown[] | Record<string, unknown>;\n\nexport interface CIP0103RequestPayload {\n method: string;\n params?: CIP0103RequestParams;\n}\n\n// ─── Provider Interface ──────────────────────────────────────────────────────\n\nexport interface CIP0103Provider {\n request<T = unknown>(args: CIP0103RequestPayload): Promise<T>;\n on<T = unknown>(event: string, listener: CIP0103EventListener<T>): CIP0103Provider;\n emit<T = unknown>(event: string, ...args: T[]): boolean;\n removeListener<T = unknown>(\n event: string,\n listenerToRemove: CIP0103EventListener<T>,\n ): CIP0103Provider;\n}\n\n// ─── Connection ──────────────────────────────────────────────────────────────\n\nexport interface CIP0103ConnectResult {\n isConnected: boolean;\n reason?: string;\n isNetworkConnected?: boolean;\n networkReason?: string;\n /** Async wallet extension: URL for user to complete connection */\n userUrl?: string;\n}\n\n// ─── Network (CAIP-2) ────────────────────────────────────────────────────────\n\nexport interface CIP0103Network {\n /** CAIP-2 network identifier, e.g. \"canton:da-mainnet\" */\n networkId: string;\n /** JSON Ledger API endpoint (if available) */\n ledgerApi?: string;\n /** Access token for Ledger API (if available) */\n accessToken?: string;\n}\n\n// ─── Accounts ────────────────────────────────────────────────────────────────\n\nexport type CIP0103AccountStatus = 'initializing' | 'allocated';\n\nexport interface CIP0103Account {\n primary: boolean;\n partyId: string;\n status: CIP0103AccountStatus;\n hint: string;\n publicKey: string;\n namespace: string;\n /** CAIP-2 network identifier */\n networkId: string;\n signingProviderId: string;\n}\n\n// ─── Status ──────────────────────────────────────────────────────────────────\n\nexport type CIP0103ProviderType = 'browser' | 'desktop' | 'mobile' | 'remote';\n\nexport interface CIP0103ProviderInfo {\n id: string;\n /** dApp API version */\n version: string;\n providerType: CIP0103ProviderType;\n}\n\nexport interface CIP0103StatusEvent {\n connection: CIP0103ConnectResult;\n provider: CIP0103ProviderInfo;\n network?: CIP0103Network;\n session?: {\n accessToken: string;\n userId: string;\n };\n}\n\n// ─── Transaction Lifecycle ───────────────────────────────────────────────────\n\nexport type CIP0103TxStatus = 'pending' | 'signed' | 'executed' | 'failed';\n\nexport interface CIP0103TxPendingPayload {\n status: 'pending';\n commandId: string;\n}\n\nexport interface CIP0103TxSignedPayload {\n status: 'signed';\n commandId: string;\n payload: {\n signature: string;\n signedBy: string;\n party: string;\n };\n}\n\nexport interface CIP0103TxExecutedPayload {\n status: 'executed';\n commandId: string;\n payload: {\n updateId: string;\n completionOffset: number;\n };\n}\n\nexport interface CIP0103TxFailedPayload {\n status: 'failed';\n commandId: string;\n}\n\nexport type CIP0103TxChangedEvent =\n | CIP0103TxPendingPayload\n | CIP0103TxSignedPayload\n | CIP0103TxExecutedPayload\n | CIP0103TxFailedPayload;\n\n// ─── Ledger API ──────────────────────────────────────────────────────────────\n\nexport interface CIP0103LedgerApiRequest {\n requestMethod: 'GET' | 'POST' | 'PUT' | 'DELETE';\n resource: string;\n body?: string;\n}\n\nexport interface CIP0103LedgerApiResponse {\n response: string;\n}\n\n// ─── Sign Message ────────────────────────────────────────────────────────────\n\nexport interface CIP0103SignMessageRequest {\n message: string;\n}\n\n// ─── Error Model ─────────────────────────────────────────────────────────────\n\nexport interface CIP0103ProviderRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// ─── Canonical Method Names ──────────────────────────────────────────────────\n\nexport const CIP0103_METHODS = {\n CONNECT: 'connect',\n DISCONNECT: 'disconnect',\n IS_CONNECTED: 'isConnected',\n STATUS: 'status',\n GET_ACTIVE_NETWORK: 'getActiveNetwork',\n LIST_ACCOUNTS: 'listAccounts',\n GET_PRIMARY_ACCOUNT: 'getPrimaryAccount',\n SIGN_MESSAGE: 'signMessage',\n PREPARE_EXECUTE: 'prepareExecute',\n LEDGER_API: 'ledgerApi',\n} as const;\n\nexport type CIP0103Method = (typeof CIP0103_METHODS)[keyof typeof CIP0103_METHODS];\n\n/** All mandatory method names as an array (useful for conformance testing) */\nexport const CIP0103_MANDATORY_METHODS: readonly CIP0103Method[] = Object.values(CIP0103_METHODS);\n\n// ─── Canonical Event Names ───────────────────────────────────────────────────\n\nexport const CIP0103_EVENTS = {\n STATUS_CHANGED: 'statusChanged',\n ACCOUNTS_CHANGED: 'accountsChanged',\n TX_CHANGED: 'txChanged',\n /** Emitted when async connect completes */\n CONNECTED: 'connected',\n} as const;\n\nexport type CIP0103Event = (typeof CIP0103_EVENTS)[keyof typeof CIP0103_EVENTS];\n","/**\n * Deep Link Transport\n * \n * Opens a deep link URL (mobile) and awaits callback via redirect or postMessage.\n * \n * Security:\n * - State parameter (nonce) for CSRF protection\n * - Origin validation\n * - Timeout enforcement\n * - Callback origin allowlist\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * Deep link transport implementation\n */\nexport class DeepLinkTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Build deep link URL with query parameters\n */\n private buildDeepLinkUrl(\n baseUrl: string,\n request: ConnectRequest | SignRequest\n ): string {\n const url = new URL(baseUrl);\n Object.entries(request).forEach(([key, value]) => {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n url.searchParams.set(key, JSON.stringify(value));\n } else if (typeof value === 'object') {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n return url.toString();\n }\n\n /**\n * Validate callback origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Wait for callback via postMessage or redirect\n */\n private async waitForCallback<T extends { state: string }>(\n state: string,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === state) {\n cleanup();\n resolve(data as T);\n }\n };\n\n const redirectHandler = () => {\n // Check URL hash/fragment for callback data\n if (typeof window !== 'undefined') {\n const hash = window.location.hash.substring(1);\n const params = new URLSearchParams(hash);\n const callbackState = params.get('state');\n if (callbackState === state) {\n const data: T = {} as T;\n params.forEach((value, key) => {\n (data as Record<string, unknown>)[key] = value;\n });\n cleanup();\n resolve(data);\n }\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n window.removeEventListener('hashchange', redirectHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n window.addEventListener('hashchange', redirectHandler);\n // Also check current hash immediately\n redirectHandler();\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build deep link URL\n const deepLinkUrl = this.buildDeepLinkUrl(url, request);\n\n // Open deep link (mobile) or window (desktop fallback)\n if (typeof window !== 'undefined') {\n // Try to open deep link\n window.location.href = deepLinkUrl;\n\n // Fallback: open in new window if deep link fails\n // (This is a simulation - real mobile apps would handle the deep link)\n const fallbackWindow = window.open(deepLinkUrl, '_blank');\n if (!fallbackWindow) {\n throw new Error('Failed to open deep link');\n }\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000; // Default 60s\n const response = await this.waitForCallback<ConnectResponse>(\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build deep link URL\n const deepLinkUrl = this.buildDeepLinkUrl(url, request);\n\n // Open deep link\n if (typeof window !== 'undefined') {\n window.location.href = deepLinkUrl;\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<SignResponse>(\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * Popup Transport\n * \n * Opens a centered popup window and establishes a postMessage channel.\n * \n * Security:\n * - Origin validation\n * - State parameter validation\n * - Popup window management\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * Popup transport implementation\n */\nexport class PopupTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(\n baseUrl: string,\n request: ConnectRequest | SignRequest\n ): string {\n const url = new URL(baseUrl);\n Object.entries(request).forEach(([key, value]) => {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n url.searchParams.set(key, JSON.stringify(value));\n } else if (typeof value === 'object') {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n return url.toString();\n }\n\n /**\n * Validate message origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Open popup window\n */\n private openPopup(url: string, _options: TransportOptions): Window | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n return window.open(\n url,\n 'PartyLayer',\n `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`\n );\n }\n\n /**\n * Wait for postMessage callback\n */\n private async waitForCallback<T extends { state: string }>(\n popup: Window,\n state: string,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n popup.close();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n cleanup();\n reject(new Error('Popup closed by user'));\n }\n }, 500);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === state) {\n cleanup();\n popup.close();\n resolve(data as T);\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n clearInterval(checkClosed);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build URL\n const fullUrl = this.buildUrl(url, request);\n\n // Open popup\n const popup = this.openPopup(fullUrl, options);\n if (!popup) {\n throw new Error('Failed to open popup window');\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<ConnectResponse>(\n popup,\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build URL\n const fullUrl = this.buildUrl(url, request);\n\n // Open popup\n const popup = this.openPopup(fullUrl, options);\n if (!popup) {\n throw new Error('Failed to open popup window');\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<SignResponse>(\n popup,\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * PostMessage Transport\n * \n * Establishes a postMessage channel with an existing window/iframe.\n * \n * Security:\n * - Origin validation\n * - State parameter validation\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * PostMessage transport implementation\n */\nexport class PostMessageTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Validate message origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Send message and wait for response\n */\n private async sendAndWait<T extends { state: string }>(\n target: Window,\n targetOrigin: string,\n message: ConnectRequest | SignRequest,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === message.state) {\n cleanup();\n resolve(data as T);\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n target.postMessage(message, targetOrigin);\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n if (typeof window === 'undefined') {\n throw new Error('PostMessage transport requires browser environment');\n }\n\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Parse target origin from URL\n const targetUrl = new URL(url);\n const targetOrigin = targetUrl.origin;\n\n // Get target window (could be parent, opener, or specific iframe)\n // For now, assume we're communicating with parent/opener\n const target = (window.opener ?? window.parent) as Window | null;\n\n if (!target || target === window) {\n throw new Error('No target window available for postMessage');\n }\n\n // Send message and wait for response\n const timeout = options.timeoutMs || 60000;\n const response = await this.sendAndWait<ConnectResponse>(\n target,\n targetOrigin,\n request,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n if (typeof window === 'undefined') {\n throw new Error('PostMessage transport requires browser environment');\n }\n\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Parse target origin from URL\n const targetUrl = new URL(url);\n const targetOrigin = targetUrl.origin;\n\n // Get target window\n const target = (window.opener ?? window.parent) as Window | null;\n\n if (!target || target === window) {\n throw new Error('No target window available for postMessage');\n }\n\n // Send message and wait for response\n const timeout = options.timeoutMs || 60000;\n const response = await this.sendAndWait<SignResponse>(\n target,\n targetOrigin,\n request,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * Mock Transport\n * \n * For testing and development. Simulates transport behavior without real network calls.\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n JobStatus,\n} from './types';\nimport { toPartyId } from '../types';\n\n/**\n * Mock transport implementation\n */\nexport class MockTransport implements Transport {\n private mockResponses: Map<string, ConnectResponse | SignResponse> = new Map();\n private mockJobs: Map<string, JobStatus> = new Map();\n\n /**\n * Set mock response for a state\n */\n setMockResponse(state: string, response: ConnectResponse | SignResponse): void {\n this.mockResponses.set(state, response);\n }\n\n /**\n * Set mock job status\n */\n setMockJob(jobId: string, status: JobStatus): void {\n this.mockJobs.set(jobId, status);\n }\n\n /**\n * Clear all mocks\n */\n clearMocks(): void {\n this.mockResponses.clear();\n this.mockJobs.clear();\n }\n\n /**\n * Open a connection request (mock)\n */\n async openConnectRequest(\n _url: string,\n request: ConnectRequest,\n _options: TransportOptions\n ): Promise<ConnectResponse> {\n // Check for mock response\n const mockResponse = this.mockResponses.get(request.state);\n if (mockResponse && 'partyId' in mockResponse) {\n return mockResponse;\n }\n\n // Default mock response\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n state: request.state,\n partyId: toPartyId('mock-party-' + Date.now()),\n sessionToken: 'mock-token',\n expiresAt: Date.now() + 3600000, // 1 hour\n capabilities: request.requestedCapabilities || ['connect', 'signMessage'],\n });\n }, 100); // Simulate async delay\n });\n }\n\n /**\n * Open a sign request (mock)\n */\n async openSignRequest(\n _url: string,\n request: SignRequest,\n _options: TransportOptions\n ): Promise<SignResponse> {\n // Check for mock response\n const mockResponse = this.mockResponses.get(request.state);\n if (mockResponse && ('signature' in mockResponse || 'jobId' in mockResponse)) {\n return mockResponse;\n }\n\n // Default mock response\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n state: request.state,\n signature: 'mock-signature-' + Date.now(),\n transactionHash: request.transaction ? 'mock-tx-hash' : undefined,\n });\n }, 100);\n });\n }\n\n /**\n * Poll job status (mock)\n */\n pollJobStatus(\n jobId: string,\n _statusUrl: string,\n _options: TransportOptions\n ): Promise<JobStatus> {\n // Check for mock job\n const mockJob = this.mockJobs.get(jobId);\n if (mockJob) {\n return Promise.resolve(mockJob);\n }\n\n // Default mock: approved immediately\n return Promise.resolve({\n jobId,\n status: 'approved',\n result: {\n signature: 'mock-signature',\n transactionHash: 'mock-tx-hash',\n },\n });\n }\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -298,12 +298,15 @@ function matchesSingle(status, matcher) {
|
|
|
298
298
|
}
|
|
299
299
|
}
|
|
300
300
|
function readField(status, field) {
|
|
301
|
+
if (!status || typeof status !== "object") return void 0;
|
|
301
302
|
const dot = field.indexOf(".");
|
|
302
303
|
if (dot < 0) return void 0;
|
|
303
304
|
const root = field.slice(0, dot);
|
|
304
305
|
const key = field.slice(dot + 1);
|
|
305
|
-
|
|
306
|
-
return
|
|
306
|
+
const subject = status[root];
|
|
307
|
+
if (!subject || typeof subject !== "object") return void 0;
|
|
308
|
+
const value = subject[key];
|
|
309
|
+
return typeof value === "string" ? value : void 0;
|
|
307
310
|
}
|
|
308
311
|
function matchesDomain(url, domain) {
|
|
309
312
|
try {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/adapters.ts","../src/session.ts","../src/detection.ts","../src/metrics.ts","../src/metrics-payload.ts","../src/cip0103-types.ts","../src/transport/deeplink.ts","../src/transport/popup.ts","../src/transport/postmessage.ts","../src/transport/mock.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core types for PartyLayer SDK\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\n/**\n * Branded string types for type safety\n */\nexport type WalletId = string & { readonly __brand: 'WalletId' };\nexport type PartyId = string & { readonly __brand: 'PartyId' };\nexport type SessionId = string & { readonly __brand: 'SessionId' };\nexport type TransactionHash = string & { readonly __brand: 'TransactionHash' };\nexport type Signature = string & { readonly __brand: 'Signature' };\n\n/**\n * Network identifier\n * Standard networks: \"devnet\" | \"testnet\" | \"mainnet\"\n * Custom networks allowed as string\n */\nexport type NetworkId = 'devnet' | 'testnet' | 'mainnet' | (string & Record<never, never>);\n\n/**\n * Capability keys that wallets can support\n * Based on OpenRPC dApp API capabilities\n */\nexport type CapabilityKey =\n | 'connect'\n | 'disconnect'\n | 'restore'\n | 'signMessage'\n | 'signTransaction'\n | 'submitTransaction'\n | 'ledgerApi'\n | 'events'\n | 'deeplink'\n | 'popup'\n | 'injected'\n | 'remoteSigner';\n\n/**\n * Wallet installation hints for detection\n */\nexport interface InstallHints {\n /** Window property name (e.g., \"consoleWallet\") */\n injectedKey?: string;\n /** Browser extension ID */\n extensionId?: string;\n /** Deep link scheme (e.g., \"loop://\") */\n deepLinkScheme?: string;\n /** Script tag identifier */\n scriptTag?: string;\n}\n\n/**\n * Wallet adapter metadata\n */\nexport interface AdapterMetadata {\n /** NPM package name */\n packageName: string;\n /** Version range (semver) */\n versionRange: string;\n}\n\n/**\n * Provider matcher: a single rule used by `ProviderDetection.matchers`.\n *\n * Three match modes are defined; OR-combined inside a `ProviderDetection`.\n * Exact and prefix work on string fields directly; domain interprets the\n * field as a URL and tests its hostname against the registrable domain\n * (with subdomain support).\n */\nexport type ProviderMatcher =\n | {\n field: 'kernel.url' | 'kernel.userUrl';\n match: 'domain';\n /** Hostname or registrable domain. Subdomains are accepted. */\n value: string;\n }\n | {\n field: 'kernel.id' | 'kernel.url' | 'kernel.userUrl' | 'kernel.clientType';\n match: 'exact';\n /** One or more exact values; ANY match returns true. */\n values: string[];\n }\n | {\n field: 'kernel.id' | 'kernel.url' | 'kernel.userUrl';\n match: 'prefix';\n value: string;\n };\n\n/**\n * Standards-first runtime detection of a CIP-0103 wallet.\n *\n * The registry stores these rules so that any current or future wallet\n * implementing `window.canton` can be identified without code changes —\n * a registry JSON update is enough.\n */\nexport interface ProviderDetection {\n /** Transport mechanism. Currently only 'window.canton' is supported. */\n transport: 'window.canton';\n /** OR-list of matchers. Provider matches if ANY matcher returns true. */\n matchers: ProviderMatcher[];\n}\n\n/**\n * Canonical CIP-0103 support marker.\n *\n * When `native: true`, the wallet is treated as a first-class CIP-0103\n * provider in the picker — it always appears in the \"CIP-0103 NATIVE\"\n * section regardless of install state, with a per-wallet readiness\n * indicator that reflects whether the wallet's `providerDetection` rules\n * matched the currently-injected `window.canton` provider.\n *\n * The field is optional; wallets that don't claim CIP-0103 support omit\n * it and continue to appear in the \"AVAILABLE\" section as before.\n */\nexport interface Cip0103Support {\n /** True if this wallet has confirmed CIP-0103 dApp API support. */\n native: boolean;\n /** Public evidence link (npm package, blog post, official statement). */\n evidence?: string;\n /** ISO date when CIP-0103 support was confirmed (informational). */\n since?: string;\n}\n\n/**\n * Wallet information from registry\n */\nexport interface WalletInfo {\n /** Wallet identifier */\n walletId: WalletId;\n /** Display name */\n name: string;\n /** Website URL */\n website: string;\n /** Icon URLs (different sizes) */\n icons: {\n sm?: string;\n md?: string;\n lg?: string;\n };\n /** Category (e.g., \"browser\", \"mobile\", \"hardware\") */\n category?: string;\n /** Supported capabilities */\n capabilities: CapabilityKey[];\n /** Installation detection hints */\n installHints?: InstallHints;\n /** Adapter package information */\n adapter: AdapterMetadata;\n /** Documentation URLs */\n docs: string[];\n /** Minimum SDK version required */\n minSdkVersion?: string;\n /** Supported networks */\n networks: NetworkId[];\n /** Registry channel */\n channel: 'stable' | 'beta';\n /** Additional metadata (e.g., originAllowlist) */\n metadata?: Record<string, string>;\n /**\n * Optional CIP-0103 runtime detection rules. When present, the picker can\n * decide whether this wallet is the currently-injected `window.canton`\n * provider and route it into the \"CIP-0103 Native\" section without any\n * hardcoded wallet IDs. Wallets that aren't CIP-0103-injected (e.g. Bron,\n * Cantor8 deeplink) leave this unset.\n */\n providerDetection?: ProviderDetection;\n /**\n * Canonical CIP-0103 support marker. When set with `native: true`, the\n * picker always lists the wallet in the \"CIP-0103 NATIVE\" section\n * regardless of install state.\n */\n cip0103?: Cip0103Support;\n}\n\n/**\n * Returns true if the wallet has been canonically marked as CIP-0103\n * native via its registry entry. The check is structural so it works on\n * both raw `RegistryWalletEntry` shapes and converted `WalletInfo`.\n */\nexport function isCip0103Native(entry: { cip0103?: Cip0103Support }): boolean {\n return entry?.cip0103?.native === true;\n}\n\n/**\n * Session information\n * Sessions are origin-bound and encrypted in storage\n */\nexport interface Session {\n /** Unique session ID */\n sessionId: SessionId;\n /** Wallet identifier */\n walletId: WalletId;\n /** Connected party ID */\n partyId: PartyId;\n /** Current network */\n network: NetworkId;\n /** Session creation timestamp */\n createdAt: number;\n /** Session expiration timestamp (if applicable) */\n expiresAt?: number;\n /** Origin of the dApp that created the session */\n origin: string;\n /** Capabilities available in this session */\n capabilitiesSnapshot: CapabilityKey[];\n /** Additional metadata (encrypted in storage) */\n metadata?: Record<string, string>;\n}\n\n/**\n * Persisted session (for restoration)\n */\nexport interface PersistedSession extends Session {\n /** Encrypted session data */\n encrypted: string;\n}\n\n/**\n * Signed message result\n */\nexport interface SignedMessage {\n /** Signature */\n signature: Signature;\n /** Party ID that signed */\n partyId: PartyId;\n /** Original message */\n message: string;\n /** Nonce used (if provided) */\n nonce?: string;\n /** Domain used (if provided) */\n domain?: string;\n}\n\n/**\n * Signed transaction result\n */\nexport interface SignedTransaction {\n /** Signed transaction data */\n signedTx: unknown;\n /** Transaction hash */\n transactionHash: TransactionHash;\n /** Party ID that signed */\n partyId: PartyId;\n}\n\n/**\n * Transaction receipt\n */\nexport interface TxReceipt {\n /** Transaction hash */\n transactionHash: TransactionHash;\n /** Submission timestamp */\n submittedAt: number;\n /** Command ID (if available) */\n commandId?: string;\n /** Update ID (if available) */\n updateId?: string;\n}\n\n/**\n * Transaction status\n */\nexport type TransactionStatus =\n | 'pending'\n | 'submitted'\n | 'committed'\n | 'rejected'\n | 'failed';\n\n/**\n * Transaction status update\n */\nexport interface TxStatusUpdate {\n /** Session ID */\n sessionId: SessionId;\n /** Transaction ID */\n txId: TransactionHash;\n /** Current status */\n status: TransactionStatus;\n /** Raw transaction data (if available) */\n raw?: unknown;\n /** Timestamp */\n timestamp: number;\n}\n\n/**\n * Helper to create branded WalletId\n */\nexport function toWalletId(id: string): WalletId {\n return id as WalletId;\n}\n\n/**\n * Helper to create branded PartyId\n */\nexport function toPartyId(id: string): PartyId {\n return id as PartyId;\n}\n\n/**\n * Helper to create branded SessionId\n */\nexport function toSessionId(id: string): SessionId {\n return id as SessionId;\n}\n\n/**\n * Helper to create branded TransactionHash\n */\nexport function toTransactionHash(hash: string): TransactionHash {\n return hash as TransactionHash;\n}\n\n/**\n * Helper to create branded Signature\n */\nexport function toSignature(sig: string): Signature {\n return sig as Signature;\n}\n","/**\n * Error taxonomy for PartyLayer SDK\n * \n * All errors extend PartyLayerError with stable error codes.\n * Error codes are string literals for telemetry and UI message mapping.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\n/**\n * Error code union - stable string literals for telemetry and UI\n */\nexport type ErrorCode =\n | 'WALLET_NOT_FOUND'\n | 'WALLET_NOT_INSTALLED'\n | 'USER_REJECTED'\n | 'ORIGIN_NOT_ALLOWED'\n | 'SESSION_EXPIRED'\n | 'CAPABILITY_NOT_SUPPORTED'\n | 'TRANSPORT_ERROR'\n | 'REGISTRY_FETCH_FAILED'\n | 'REGISTRY_VERIFICATION_FAILED'\n | 'REGISTRY_SCHEMA_INVALID'\n | 'INTERNAL_ERROR'\n | 'TIMEOUT';\n\n/**\n * Error mapping context\n */\nexport interface ErrorMappingContext {\n /** Wallet ID (if applicable) */\n walletId?: string;\n /** Operation phase */\n phase: 'connect' | 'restore' | 'signMessage' | 'signTransaction' | 'submitTransaction' | 'ledgerApi';\n /** Transport type */\n transport?: 'injected' | 'popup' | 'deeplink' | 'remote';\n /** Timeout in milliseconds (for timeout errors) */\n timeoutMs?: number;\n /** Additional context */\n details?: Record<string, unknown>;\n}\n\n/**\n * Base error class for all PartyLayer errors\n */\nexport class PartyLayerError extends Error {\n public readonly code: ErrorCode;\n public readonly cause?: unknown;\n public readonly details?: Record<string, unknown>;\n public readonly isOperational: boolean;\n\n constructor(\n message: string,\n code: ErrorCode,\n options?: {\n cause?: unknown;\n details?: Record<string, unknown>;\n isOperational?: boolean;\n }\n ) {\n super(message);\n this.name = 'PartyLayerError';\n this.code = code;\n this.cause = options?.cause;\n this.details = options?.details;\n this.isOperational = options?.isOperational ?? true;\n\n // Maintains proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PartyLayerError);\n }\n }\n\n /**\n * Serialize error to JSON for telemetry/logging\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n isOperational: this.isOperational,\n details: this.details,\n cause: this.cause instanceof Error\n ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack,\n }\n : this.cause,\n };\n }\n}\n\n/**\n * Wallet not found error\n */\nexport class WalletNotFoundError extends PartyLayerError {\n constructor(walletId: string) {\n super(`Wallet \"${walletId}\" not found`, 'WALLET_NOT_FOUND', {\n details: { walletId },\n });\n this.name = 'WalletNotFoundError';\n }\n}\n\n/**\n * Wallet not installed error\n */\nexport class WalletNotInstalledError extends PartyLayerError {\n constructor(walletId: string, reason?: string) {\n super(\n `Wallet \"${walletId}\" is not installed${reason ? `: ${reason}` : ''}`,\n 'WALLET_NOT_INSTALLED',\n {\n details: { walletId, reason },\n }\n );\n this.name = 'WalletNotInstalledError';\n }\n}\n\n/**\n * User rejected error\n */\nexport class UserRejectedError extends PartyLayerError {\n constructor(operation: string, details?: Record<string, unknown>) {\n super(`User rejected ${operation}`, 'USER_REJECTED', {\n details: { operation, ...details },\n });\n this.name = 'UserRejectedError';\n }\n}\n\n/**\n * Origin not allowed error\n */\nexport class OriginNotAllowedError extends PartyLayerError {\n constructor(origin: string, allowedOrigins?: string[]) {\n super(\n `Origin \"${origin}\" is not allowed`,\n 'ORIGIN_NOT_ALLOWED',\n {\n details: { origin, allowedOrigins },\n }\n );\n this.name = 'OriginNotAllowedError';\n }\n}\n\n/**\n * Session expired error\n */\nexport class SessionExpiredError extends PartyLayerError {\n constructor(sessionId: string) {\n super(`Session \"${sessionId}\" has expired`, 'SESSION_EXPIRED', {\n details: { sessionId },\n });\n this.name = 'SessionExpiredError';\n }\n}\n\n/**\n * Capability not supported error\n */\nexport class CapabilityNotSupportedError extends PartyLayerError {\n constructor(walletId: string, capability: string) {\n super(\n `Wallet \"${walletId}\" does not support capability \"${capability}\"`,\n 'CAPABILITY_NOT_SUPPORTED',\n {\n details: { walletId, capability },\n }\n );\n this.name = 'CapabilityNotSupportedError';\n }\n}\n\n/**\n * Transport error\n */\nexport class TransportError extends PartyLayerError {\n constructor(message: string, cause?: unknown, details?: Record<string, unknown>) {\n super(message, 'TRANSPORT_ERROR', {\n cause,\n details,\n });\n this.name = 'TransportError';\n }\n}\n\n/**\n * Registry fetch failed error\n */\nexport class RegistryFetchFailedError extends PartyLayerError {\n constructor(url: string, cause?: unknown) {\n super(`Failed to fetch registry from \"${url}\"`, 'REGISTRY_FETCH_FAILED', {\n cause,\n details: { url },\n });\n this.name = 'RegistryFetchFailedError';\n }\n}\n\n/**\n * Registry verification failed error\n */\nexport class RegistryVerificationFailedError extends PartyLayerError {\n constructor(reason: string, details?: Record<string, unknown>) {\n super(`Registry verification failed: ${reason}`, 'REGISTRY_VERIFICATION_FAILED', {\n details: { reason, ...details },\n });\n this.name = 'RegistryVerificationFailedError';\n }\n}\n\n/**\n * Registry schema invalid error\n */\nexport class RegistrySchemaInvalidError extends PartyLayerError {\n constructor(reason: string, details?: Record<string, unknown>) {\n super(`Registry schema invalid: ${reason}`, 'REGISTRY_SCHEMA_INVALID', {\n details: { reason, ...details },\n });\n this.name = 'RegistrySchemaInvalidError';\n }\n}\n\n/**\n * Internal error (non-operational)\n */\nexport class InternalError extends PartyLayerError {\n constructor(message: string, cause?: unknown, details?: Record<string, unknown>) {\n super(message, 'INTERNAL_ERROR', {\n cause,\n details,\n isOperational: false,\n });\n this.name = 'InternalError';\n }\n}\n\n/**\n * Timeout error\n */\nexport class TimeoutError extends PartyLayerError {\n constructor(operation: string, timeoutMs: number) {\n super(\n `Operation \"${operation}\" timed out after ${timeoutMs}ms`,\n 'TIMEOUT',\n {\n details: { operation, timeoutMs },\n }\n );\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Map unknown errors to PartyLayerError\n * \n * This is the single error mapping strategy used by all adapters.\n * It normalizes errors from various sources (wallet SDKs, network, etc.)\n * into typed PartyLayerError instances.\n */\nexport function mapUnknownErrorToPartyLayerError(\n err: unknown,\n context: ErrorMappingContext\n): PartyLayerError {\n // Already a PartyLayerError\n if (err instanceof PartyLayerError) {\n return err;\n }\n\n // Standard Error\n if (err instanceof Error) {\n const message = err.message.toLowerCase();\n\n // User rejection patterns\n if (\n message.includes('rejected') ||\n message.includes('denied') ||\n message.includes('cancelled') ||\n message.includes('canceled') ||\n err.name === 'UserRejectedError'\n ) {\n return new UserRejectedError(context.phase, {\n walletId: context.walletId,\n transport: context.transport,\n originalMessage: err.message,\n });\n }\n\n // Timeout patterns\n if (\n message.includes('timeout') ||\n message.includes('timed out') ||\n err.name === 'TimeoutError'\n ) {\n // Try to get timeout from context, or extract from error message, or default to 0\n let timeoutMs = context.timeoutMs ?? 0;\n if (timeoutMs === 0) {\n // Try to extract from message like \"timed out after 30000ms\" or \"timeout after 30s\"\n const msMatch = err.message.match(/(\\d+)\\s*ms/i);\n const secMatch = err.message.match(/(\\d+)\\s*(?:sec|second)/i);\n if (msMatch) {\n timeoutMs = parseInt(msMatch[1], 10);\n } else if (secMatch) {\n timeoutMs = parseInt(secMatch[1], 10) * 1000;\n }\n }\n return new TimeoutError(context.phase, timeoutMs);\n }\n\n // Network/transport errors\n if (\n message.includes('network') ||\n message.includes('fetch') ||\n message.includes('connection') ||\n err.name === 'NetworkError' ||\n err.name === 'TypeError'\n ) {\n return new TransportError(err.message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n });\n }\n\n // Generic transport error\n return new TransportError(err.message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n originalError: err.name,\n });\n }\n\n // String errors\n if (typeof err === 'string') {\n return new TransportError(err, undefined, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n });\n }\n\n // Unknown error type\n return new InternalError(\n `Unknown error in ${context.phase}`,\n err,\n {\n walletId: context.walletId,\n transport: context.transport,\n errorType: typeof err,\n }\n );\n}\n","/**\n * Wallet adapter interface contract\n * \n * All wallet adapters must implement this interface.\n * Adapters are responsible for:\n * - Detecting wallet installation\n * - Establishing connections\n * - Signing messages/transactions\n * - Emitting events\n * \n * References:\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\nimport type {\n WalletId,\n PartyId,\n NetworkId,\n CapabilityKey,\n Session,\n PersistedSession,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n} from './types';\nimport {\n CapabilityNotSupportedError,\n WalletNotInstalledError,\n} from './errors';\n\n/**\n * Adapter detection result\n */\nexport interface AdapterDetectResult {\n /** Whether wallet is installed */\n installed: boolean;\n /** Reason if not installed */\n reason?: string;\n}\n\n/**\n * Adapter connection result\n */\nexport interface AdapterConnectResult {\n /** Connected party ID */\n partyId: PartyId;\n /** Partial session data (SDK will complete it) */\n session: Partial<Session>;\n /** Capabilities available in this session */\n capabilities: CapabilityKey[];\n}\n\n/**\n * Sign message parameters\n */\nexport interface SignMessageParams {\n /** Message to sign */\n message: string;\n /** Optional nonce */\n nonce?: string;\n /** Optional domain */\n domain?: string;\n}\n\n/**\n * Sign transaction parameters\n */\nexport interface SignTransactionParams {\n /** Transaction to sign (type kept as unknown for wallet-specific formats) */\n tx: unknown;\n}\n\n/**\n * Submit transaction parameters\n */\nexport interface SubmitTransactionParams {\n /** Signed transaction */\n signedTx: unknown;\n}\n\n/**\n * Ledger API proxy parameters (CIP-0103 ledgerApi method)\n */\nexport interface LedgerApiParams {\n /** HTTP method for the JSON Ledger API */\n requestMethod: 'GET' | 'POST' | 'PUT' | 'DELETE';\n /** Resource path (e.g., \"/v2/state/acs\") */\n resource: string;\n /** Optional JSON body */\n body?: string;\n}\n\n/**\n * Ledger API proxy result\n */\nexport interface LedgerApiResult {\n /** JSON response from the Ledger API */\n response: string;\n}\n\n/**\n * Logger interface\n */\nexport interface LoggerAdapter {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, error?: unknown, ...args: unknown[]): void;\n}\n\n/**\n * Telemetry interface\n * \n * Extended in 0.3.0 with optional metrics methods.\n * All new methods are optional to maintain backward compatibility.\n */\nexport interface TelemetryAdapter {\n /** Track a named event with optional properties */\n track(event: string, properties?: Record<string, unknown>): void;\n \n /** Track an error occurrence */\n error(error: Error, properties?: Record<string, unknown>): void;\n \n /**\n * Increment a metric counter\n * @param metric - Metric name (e.g., 'wallet_connect_attempts')\n * @param value - Value to increment by (default: 1)\n * @since 0.3.0\n */\n increment?(metric: string, value?: number): void;\n \n /**\n * Set a gauge metric value\n * @param metric - Metric name\n * @param value - Current value\n * @since 0.3.0\n */\n gauge?(metric: string, value: number): void;\n \n /**\n * Flush buffered metrics to backend\n * @since 0.3.0\n */\n flush?(): Promise<void>;\n \n /**\n * Check if telemetry is enabled\n * @returns true if telemetry should be collected\n * @since 0.3.0\n */\n isEnabled?(): boolean;\n}\n\n/**\n * Crypto interface\n */\nexport interface CryptoAdapter {\n encrypt(data: string, key: string): Promise<string>;\n decrypt(encrypted: string, key: string): Promise<string>;\n generateKey(): Promise<string>;\n}\n\n/**\n * Storage interface\n */\nexport interface StorageAdapter {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n remove(key: string): Promise<void>;\n clear(): Promise<void>;\n}\n\n/**\n * Registry client interface (for adapters to query wallet info)\n */\nexport interface RegistryClientAdapter {\n getWallet(walletId: WalletId): Promise<unknown>;\n}\n\n/**\n * Adapter context provided to all adapter methods\n */\nexport interface AdapterContext {\n /** Application name */\n appName: string;\n /** Origin (for origin binding) */\n origin: string;\n /** Network */\n network: NetworkId;\n /** Logger */\n logger: LoggerAdapter;\n /** Telemetry (optional) */\n telemetry?: TelemetryAdapter;\n /** Registry client */\n registry: RegistryClientAdapter;\n /** Crypto adapter */\n crypto: CryptoAdapter;\n /** Storage adapter */\n storage: StorageAdapter;\n /** Timeout helper */\n timeout: (ms: number) => Promise<never>;\n /** Abort signal (for cancellation) */\n abortSignal?: AbortSignal;\n}\n\n/**\n * Adapter event names\n */\nexport type AdapterEventName =\n | 'connect'\n | 'disconnect'\n | 'sessionExpired'\n | 'txStatus'\n | 'error';\n\n/**\n * Wallet adapter interface\n * \n * All wallet adapters must implement this interface.\n * Optional methods (marked with ?) should only be implemented\n * if the wallet supports that capability.\n */\nexport interface WalletAdapter {\n /** Wallet identifier */\n readonly walletId: WalletId;\n /** Wallet display name */\n readonly name: string;\n\n /**\n * Get supported capabilities\n */\n getCapabilities(): CapabilityKey[];\n\n /**\n * Detect if wallet is installed\n */\n detectInstalled(): Promise<AdapterDetectResult>;\n\n /**\n * Connect to wallet\n * @param ctx Adapter context\n * @param opts Connection options (optional)\n */\n connect(\n ctx: AdapterContext,\n opts?: {\n timeoutMs?: number;\n partyId?: PartyId;\n /** When false, prefer remote/mobile transport over installed extension */\n preferInstalled?: boolean;\n }\n ): Promise<AdapterConnectResult>;\n\n /**\n * Disconnect from wallet\n * @param ctx Adapter context\n * @param session Session to disconnect\n */\n disconnect(ctx: AdapterContext, session: Session): Promise<void>;\n\n /**\n * Restore session (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param persisted Persisted session data\n */\n restore?(\n ctx: AdapterContext,\n persisted: PersistedSession\n ): Promise<Session | null>;\n\n /**\n * Sign message (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Sign message parameters\n */\n signMessage?(\n ctx: AdapterContext,\n session: Session,\n params: SignMessageParams\n ): Promise<SignedMessage>;\n\n /**\n * Sign transaction (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Sign transaction parameters\n */\n signTransaction?(\n ctx: AdapterContext,\n session: Session,\n params: SignTransactionParams\n ): Promise<SignedTransaction>;\n\n /**\n * Submit transaction (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Submit transaction parameters\n */\n submitTransaction?(\n ctx: AdapterContext,\n session: Session,\n params: SubmitTransactionParams\n ): Promise<TxReceipt>;\n\n /**\n * Proxy a JSON Ledger API request (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Ledger API request parameters\n */\n ledgerApi?(\n ctx: AdapterContext,\n session: Session,\n params: LedgerApiParams\n ): Promise<LedgerApiResult>;\n\n /**\n * Subscribe to adapter events (optional)\n * @param event Event name\n * @param handler Event handler\n * @returns Unsubscribe function\n */\n on?(\n event: AdapterEventName,\n handler: (payload: unknown) => void\n ): () => void;\n}\n\n/**\n * Check if adapter supports required capabilities\n * Throws CapabilityNotSupportedError if not supported\n */\nexport function capabilityGuard(\n adapter: WalletAdapter,\n requiredCapabilities: CapabilityKey[]\n): void {\n const supported = adapter.getCapabilities();\n const missing = requiredCapabilities.filter((cap) => !supported.includes(cap));\n\n if (missing.length > 0) {\n throw new CapabilityNotSupportedError(\n adapter.walletId,\n missing.join(', ')\n );\n }\n}\n\n/**\n * Check if wallet is installed\n * Throws WalletNotInstalledError if not installed\n */\nexport async function installGuard(\n adapter: WalletAdapter\n): Promise<void> {\n const detect = await adapter.detectInstalled();\n if (!detect.installed) {\n throw new WalletNotInstalledError(adapter.walletId, detect.reason);\n }\n}\n","/**\n * Session management utilities\n */\n\nimport type { Session, SessionId } from './types';\nimport { toSessionId } from './types';\n\n/**\n * Generate a unique session ID\n */\nexport function generateSessionId(): SessionId {\n return toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`);\n}\n\n/**\n * Validate session structure\n */\nexport function validateSession(session: unknown): session is Session {\n if (typeof session !== 'object' || session === null) {\n return false;\n }\n\n const s = session as Record<string, unknown>;\n\n return (\n typeof s.sessionId === 'string' &&\n typeof s.walletId === 'string' &&\n typeof s.partyId === 'string' &&\n typeof s.network === 'string' &&\n typeof s.createdAt === 'number' &&\n typeof s.origin === 'string' &&\n Array.isArray(s.capabilitiesSnapshot)\n );\n}\n\n/**\n * Check if session is expired\n */\nexport function isSessionExpired(session: Session): boolean {\n if (!session.expiresAt) {\n return false; // No expiration\n }\n\n return Date.now() >= session.expiresAt;\n}\n\n/**\n * Create a session with default values\n */\nexport function createSession(\n walletId: string,\n partyId: string,\n network: string,\n origin: string,\n capabilities: string[] = [],\n expiresInMs?: number\n): Session {\n const now = Date.now();\n return {\n sessionId: generateSessionId(),\n walletId: walletId as import('./types').WalletId,\n partyId: partyId as import('./types').PartyId,\n network,\n createdAt: now,\n expiresAt: expiresInMs ? now + expiresInMs : undefined,\n origin,\n capabilitiesSnapshot: capabilities as import('./types').CapabilityKey[],\n };\n}\n","/**\n * Standards-first CIP-0103 wallet detection.\n *\n * The registry stores `providerDetection` rules per wallet entry. At\n * runtime the picker calls `window.canton.request({method:'status'})`,\n * receives the wallet's self-reported identity (kernel.id / kernel.url /\n * kernel.userUrl / kernel.clientType), and asks `findMatchingWallet`\n * which registry entry — if any — claims this provider.\n *\n * The architecture deliberately avoids hardcoding wallet IDs anywhere\n * outside the registry. Adding a new CIP-0103 wallet to the ecosystem\n * is a registry JSON update; no SDK release is required.\n */\n\nimport type {\n ProviderDetection,\n ProviderMatcher,\n WalletInfo,\n} from './types';\n\n/**\n * The shape of a CIP-0103 status response that detection cares about.\n *\n * Mirrors what `window.canton.request({ method: 'status' })` returns —\n * declared structurally so adapter packages can reuse this without\n * reaching into the wallet-specific types.\n */\nexport interface Cip0103StatusForDetection {\n kernel?: {\n id?: string;\n url?: string;\n userUrl?: string;\n clientType?: string;\n };\n}\n\n/** Returns true if the runtime status matches any of the detection's matchers. */\nexport function matchesProviderDetection(\n status: Cip0103StatusForDetection | null | undefined,\n detection: ProviderDetection | undefined,\n): boolean {\n if (!status || !detection || !detection.matchers || detection.matchers.length === 0) {\n return false;\n }\n return detection.matchers.some((m) => matchesSingle(status, m));\n}\n\nfunction matchesSingle(status: Cip0103StatusForDetection, matcher: ProviderMatcher): boolean {\n const fieldValue = readField(status, matcher.field);\n if (typeof fieldValue !== 'string' || fieldValue.length === 0) return false;\n\n switch (matcher.match) {\n case 'exact':\n return matcher.values.includes(fieldValue);\n case 'prefix':\n return fieldValue.startsWith(matcher.value);\n case 'domain':\n return matchesDomain(fieldValue, matcher.value);\n default:\n return false;\n }\n}\n\nfunction readField(\n status: Cip0103StatusForDetection,\n field: ProviderMatcher['field'],\n): unknown {\n // Only one nesting level today: `kernel.<key>`.\n const dot = field.indexOf('.');\n if (dot < 0) return undefined;\n const root = field.slice(0, dot);\n const key = field.slice(dot + 1);\n if (root !== 'kernel' || !status.kernel) return undefined;\n return (status.kernel as Record<string, unknown>)[key];\n}\n\n/**\n * Matches a URL string against a registrable domain. Subdomain matches\n * are accepted; foreign domains are rejected; un-parseable URLs return\n * false (no exception).\n *\n * Examples:\n * matchesDomain('https://api-mainnet.cantonwallet.com/x', 'cantonwallet.com') === true\n * matchesDomain('https://cantonwallet.com', 'cantonwallet.com') === true\n * matchesDomain('https://other.com', 'cantonwallet.com') === false\n */\nfunction matchesDomain(url: string, domain: string): boolean {\n try {\n const hostname = new URL(url).hostname.toLowerCase();\n const target = domain.toLowerCase();\n return hostname === target || hostname.endsWith('.' + target);\n } catch {\n return false;\n }\n}\n\n/**\n * Find the first registry entry whose `providerDetection` matches the\n * runtime status. Entries without `providerDetection` are skipped.\n *\n * Accepts either the raw `RegistryWalletEntry[]` shape (registry-client's\n * native input) or the converted `WalletInfo[]` shape that flows through\n * the SDK / React layer — the only field read is `providerDetection`,\n * which both shapes carry post-conversion.\n */\nexport function findMatchingWallet<\n T extends { providerDetection?: ProviderDetection },\n>(status: Cip0103StatusForDetection | null | undefined, registry: readonly T[]): T | undefined {\n if (!status) return undefined;\n for (const entry of registry) {\n if (matchesProviderDetection(status, entry.providerDetection)) {\n return entry;\n }\n }\n return undefined;\n}\n\n/**\n * Type-guard convenience for the WalletInfo shape, since the SDK exposes\n * `WalletInfo[]` to React consumers.\n */\nexport function findMatchingWalletInfo(\n status: Cip0103StatusForDetection | null | undefined,\n wallets: readonly WalletInfo[],\n): WalletInfo | undefined {\n return findMatchingWallet(status, wallets);\n}\n\n/**\n * Best-effort display name for an unrecognised CIP-0103 provider. Reads\n * the wallet's self-declared `kernel.userUrl` (the human-facing URL\n * surfaced by Sigilry-style wallets) and falls back to `kernel.id` or\n * a generic label.\n */\nexport function deriveGenericWalletName(status: Cip0103StatusForDetection | null | undefined): string {\n const userUrl = status?.kernel?.userUrl;\n if (typeof userUrl === 'string' && userUrl.length > 0) {\n try {\n return new URL(userUrl).hostname.replace(/^www\\./, '');\n } catch {\n /* fall through */\n }\n }\n const id = status?.kernel?.id;\n if (typeof id === 'string' && id.length > 0) {\n return `CIP-0103 wallet (${id.slice(0, 8)}…)`;\n }\n return 'CIP-0103 wallet';\n}\n","/**\n * Canonical Metrics Constants\n * \n * These metric names are the official set for PartyLayer telemetry.\n * Changing these names would break metrics aggregation and downstream reporting.\n * \n * @since 0.3.0\n */\n\n/**\n * Enablement Metrics\n * \n * These metrics measure how PartyLayer enables wallet interactions.\n */\nexport const ENABLEMENT_METRICS = {\n /** Total wallet connect() calls made */\n WALLET_CONNECT_ATTEMPTS: 'wallet_connect_attempts',\n \n /** Successful wallet connections (session:connected events) */\n WALLET_CONNECT_SUCCESS: 'wallet_connect_success',\n \n /** New sessions created (not restored) */\n SESSIONS_CREATED: 'sessions_created',\n \n /** Sessions successfully restored from storage */\n SESSIONS_RESTORED: 'sessions_restored',\n \n /** Total session restore attempts */\n RESTORE_ATTEMPTS: 'restore_attempts',\n} as const;\n\n/**\n * Error Metrics\n * \n * These metrics track error occurrences by code.\n */\nexport const ERROR_METRICS = {\n /** Prefix for error metrics (e.g., error_USER_REJECTED) */\n ERROR_PREFIX: 'error_',\n} as const;\n\n/**\n * Registry Metrics\n * \n * These metrics track registry client behavior.\n */\nexport const REGISTRY_METRICS = {\n /** Registry fetched from network */\n REGISTRY_FETCH: 'registry_fetch',\n \n /** Registry served from cache */\n REGISTRY_CACHE_HIT: 'registry_cache_hit',\n \n /** Stale registry was used */\n REGISTRY_STALE: 'registry_stale',\n} as const;\n\n/**\n * All metrics combined\n */\nexport const METRICS = {\n ...ENABLEMENT_METRICS,\n ...ERROR_METRICS,\n ...REGISTRY_METRICS,\n} as const;\n\n/**\n * Type for all metric names\n */\nexport type MetricName = typeof METRICS[keyof typeof METRICS];\n\n/**\n * Build an error metric name from an error code\n * \n * @param errorCode - The error code (e.g., 'USER_REJECTED')\n * @returns The metric name (e.g., 'error_USER_REJECTED')\n */\nexport function errorMetricName(errorCode: string): string {\n return `${METRICS.ERROR_PREFIX}${errorCode}`;\n}\n","/**\n * Metrics Payload Types and Privacy Validation\n * \n * This module defines the privacy-safe payload format for metrics collection.\n * \n * Privacy Guarantees:\n * - NO wallet addresses\n * - NO raw party IDs\n * - NO transaction payloads\n * - NO signed message content\n * - NO user identifiers\n * \n * @since 0.3.0\n */\n\n/**\n * Privacy-safe metrics payload\n * \n * This is the only payload format accepted by the metrics backend.\n */\nexport interface MetricsPayload {\n /** SDK version (e.g., '0.3.0') */\n sdkVersion: string;\n \n /** Network identifier (e.g., 'devnet', 'mainnet') */\n network: string;\n \n /** Unix timestamp in milliseconds */\n timestamp: number;\n \n /** Metric name → value map */\n metrics: Record<string, number>;\n \n /** Hashed app identifier (opt-in, SHA-256) */\n appIdHash?: string;\n \n /** Hashed origin (opt-in, SHA-256) */\n originHash?: string;\n}\n\n/**\n * Fields that are NEVER allowed in metrics payloads\n */\nconst FORBIDDEN_FIELDS = [\n 'walletAddress',\n 'address',\n 'partyId',\n 'rawPartyId',\n 'publicKey',\n 'privateKey',\n 'seed',\n 'mnemonic',\n 'txPayload',\n 'transaction',\n 'signedMessage',\n 'message',\n 'signature',\n 'userId',\n 'email',\n 'name',\n 'ip',\n 'userAgent',\n] as const;\n\n/**\n * Validate that a payload is privacy-safe\n * \n * @param payload - Unknown payload to validate\n * @returns true if payload is valid MetricsPayload with no PII\n * @throws Error if forbidden fields are detected\n */\nexport function validatePayload(payload: unknown): payload is MetricsPayload {\n if (!payload || typeof payload !== 'object') {\n return false;\n }\n \n const obj = payload as Record<string, unknown>;\n \n // Check for forbidden fields\n for (const field of FORBIDDEN_FIELDS) {\n if (field in obj) {\n throw new Error(`Forbidden field detected in metrics payload: ${field}`);\n }\n }\n \n // Validate required fields\n if (typeof obj.sdkVersion !== 'string') {\n return false;\n }\n \n if (typeof obj.network !== 'string') {\n return false;\n }\n \n if (typeof obj.timestamp !== 'number' || obj.timestamp <= 0) {\n return false;\n }\n \n if (!obj.metrics || typeof obj.metrics !== 'object') {\n return false;\n }\n \n // Validate metrics are all numbers\n for (const [key, value] of Object.entries(obj.metrics as Record<string, unknown>)) {\n if (typeof key !== 'string' || typeof value !== 'number') {\n return false;\n }\n }\n \n // Validate optional hashed fields\n if (obj.appIdHash !== undefined && typeof obj.appIdHash !== 'string') {\n return false;\n }\n \n if (obj.originHash !== undefined && typeof obj.originHash !== 'string') {\n return false;\n }\n \n return true;\n}\n\n/**\n * Hash a string using SHA-256 (browser-compatible)\n * \n * @param value - String to hash\n * @returns Hex-encoded SHA-256 hash\n */\nexport async function hashForPrivacy(value: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n // Fallback: simple hash for non-browser environments\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n const char = value.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n \n const encoder = new TextEncoder();\n const data = encoder.encode(value);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Create a sanitized metrics payload\n * \n * This function ensures the payload is privacy-safe before sending.\n * \n * @param data - Raw metrics data\n * @returns Sanitized MetricsPayload\n */\nexport function createMetricsPayload(data: {\n sdkVersion: string;\n network: string;\n metrics: Record<string, number>;\n appIdHash?: string;\n originHash?: string;\n}): MetricsPayload {\n const payload: MetricsPayload = {\n sdkVersion: data.sdkVersion,\n network: data.network,\n timestamp: Date.now(),\n metrics: { ...data.metrics },\n };\n \n if (data.appIdHash) {\n payload.appIdHash = data.appIdHash;\n }\n \n if (data.originHash) {\n payload.originHash = data.originHash;\n }\n \n // Final validation\n if (!validatePayload(payload)) {\n throw new Error('Failed to create valid metrics payload');\n }\n \n return payload;\n}\n","/**\n * CIP-0103 dApp Standard — Canonical Type Definitions\n *\n * These types are the verbatim representation of the CIP-0103 specification.\n * They live in @partylayer/core so both @partylayer/provider and @partylayer/sdk\n * can reference them without circular dependencies.\n *\n * Reference: https://github.com/canton-foundation/cips/blob/main/cip-0103/cip-0103.md\n *\n * IMPORTANT: Do not add PartyLayer-specific fields or aliases.\n * These types represent the standard exactly.\n */\n\n// ─── Provider Primitives ─────────────────────────────────────────────────────\n\nexport type CIP0103EventListener<T = unknown> = (...args: T[]) => void;\n\nexport type CIP0103RequestParams = unknown[] | Record<string, unknown>;\n\nexport interface CIP0103RequestPayload {\n method: string;\n params?: CIP0103RequestParams;\n}\n\n// ─── Provider Interface ──────────────────────────────────────────────────────\n\nexport interface CIP0103Provider {\n request<T = unknown>(args: CIP0103RequestPayload): Promise<T>;\n on<T = unknown>(event: string, listener: CIP0103EventListener<T>): CIP0103Provider;\n emit<T = unknown>(event: string, ...args: T[]): boolean;\n removeListener<T = unknown>(\n event: string,\n listenerToRemove: CIP0103EventListener<T>,\n ): CIP0103Provider;\n}\n\n// ─── Connection ──────────────────────────────────────────────────────────────\n\nexport interface CIP0103ConnectResult {\n isConnected: boolean;\n reason?: string;\n isNetworkConnected?: boolean;\n networkReason?: string;\n /** Async wallet extension: URL for user to complete connection */\n userUrl?: string;\n}\n\n// ─── Network (CAIP-2) ────────────────────────────────────────────────────────\n\nexport interface CIP0103Network {\n /** CAIP-2 network identifier, e.g. \"canton:da-mainnet\" */\n networkId: string;\n /** JSON Ledger API endpoint (if available) */\n ledgerApi?: string;\n /** Access token for Ledger API (if available) */\n accessToken?: string;\n}\n\n// ─── Accounts ────────────────────────────────────────────────────────────────\n\nexport type CIP0103AccountStatus = 'initializing' | 'allocated';\n\nexport interface CIP0103Account {\n primary: boolean;\n partyId: string;\n status: CIP0103AccountStatus;\n hint: string;\n publicKey: string;\n namespace: string;\n /** CAIP-2 network identifier */\n networkId: string;\n signingProviderId: string;\n}\n\n// ─── Status ──────────────────────────────────────────────────────────────────\n\nexport type CIP0103ProviderType = 'browser' | 'desktop' | 'mobile' | 'remote';\n\nexport interface CIP0103ProviderInfo {\n id: string;\n /** dApp API version */\n version: string;\n providerType: CIP0103ProviderType;\n}\n\nexport interface CIP0103StatusEvent {\n connection: CIP0103ConnectResult;\n provider: CIP0103ProviderInfo;\n network?: CIP0103Network;\n session?: {\n accessToken: string;\n userId: string;\n };\n}\n\n// ─── Transaction Lifecycle ───────────────────────────────────────────────────\n\nexport type CIP0103TxStatus = 'pending' | 'signed' | 'executed' | 'failed';\n\nexport interface CIP0103TxPendingPayload {\n status: 'pending';\n commandId: string;\n}\n\nexport interface CIP0103TxSignedPayload {\n status: 'signed';\n commandId: string;\n payload: {\n signature: string;\n signedBy: string;\n party: string;\n };\n}\n\nexport interface CIP0103TxExecutedPayload {\n status: 'executed';\n commandId: string;\n payload: {\n updateId: string;\n completionOffset: number;\n };\n}\n\nexport interface CIP0103TxFailedPayload {\n status: 'failed';\n commandId: string;\n}\n\nexport type CIP0103TxChangedEvent =\n | CIP0103TxPendingPayload\n | CIP0103TxSignedPayload\n | CIP0103TxExecutedPayload\n | CIP0103TxFailedPayload;\n\n// ─── Ledger API ──────────────────────────────────────────────────────────────\n\nexport interface CIP0103LedgerApiRequest {\n requestMethod: 'GET' | 'POST' | 'PUT' | 'DELETE';\n resource: string;\n body?: string;\n}\n\nexport interface CIP0103LedgerApiResponse {\n response: string;\n}\n\n// ─── Sign Message ────────────────────────────────────────────────────────────\n\nexport interface CIP0103SignMessageRequest {\n message: string;\n}\n\n// ─── Error Model ─────────────────────────────────────────────────────────────\n\nexport interface CIP0103ProviderRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// ─── Canonical Method Names ──────────────────────────────────────────────────\n\nexport const CIP0103_METHODS = {\n CONNECT: 'connect',\n DISCONNECT: 'disconnect',\n IS_CONNECTED: 'isConnected',\n STATUS: 'status',\n GET_ACTIVE_NETWORK: 'getActiveNetwork',\n LIST_ACCOUNTS: 'listAccounts',\n GET_PRIMARY_ACCOUNT: 'getPrimaryAccount',\n SIGN_MESSAGE: 'signMessage',\n PREPARE_EXECUTE: 'prepareExecute',\n LEDGER_API: 'ledgerApi',\n} as const;\n\nexport type CIP0103Method = (typeof CIP0103_METHODS)[keyof typeof CIP0103_METHODS];\n\n/** All mandatory method names as an array (useful for conformance testing) */\nexport const CIP0103_MANDATORY_METHODS: readonly CIP0103Method[] = Object.values(CIP0103_METHODS);\n\n// ─── Canonical Event Names ───────────────────────────────────────────────────\n\nexport const CIP0103_EVENTS = {\n STATUS_CHANGED: 'statusChanged',\n ACCOUNTS_CHANGED: 'accountsChanged',\n TX_CHANGED: 'txChanged',\n /** Emitted when async connect completes */\n CONNECTED: 'connected',\n} as const;\n\nexport type CIP0103Event = (typeof CIP0103_EVENTS)[keyof typeof CIP0103_EVENTS];\n","/**\n * Deep Link Transport\n * \n * Opens a deep link URL (mobile) and awaits callback via redirect or postMessage.\n * \n * Security:\n * - State parameter (nonce) for CSRF protection\n * - Origin validation\n * - Timeout enforcement\n * - Callback origin allowlist\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * Deep link transport implementation\n */\nexport class DeepLinkTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Build deep link URL with query parameters\n */\n private buildDeepLinkUrl(\n baseUrl: string,\n request: ConnectRequest | SignRequest\n ): string {\n const url = new URL(baseUrl);\n Object.entries(request).forEach(([key, value]) => {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n url.searchParams.set(key, JSON.stringify(value));\n } else if (typeof value === 'object') {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n return url.toString();\n }\n\n /**\n * Validate callback origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Wait for callback via postMessage or redirect\n */\n private async waitForCallback<T extends { state: string }>(\n state: string,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === state) {\n cleanup();\n resolve(data as T);\n }\n };\n\n const redirectHandler = () => {\n // Check URL hash/fragment for callback data\n if (typeof window !== 'undefined') {\n const hash = window.location.hash.substring(1);\n const params = new URLSearchParams(hash);\n const callbackState = params.get('state');\n if (callbackState === state) {\n const data: T = {} as T;\n params.forEach((value, key) => {\n (data as Record<string, unknown>)[key] = value;\n });\n cleanup();\n resolve(data);\n }\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n window.removeEventListener('hashchange', redirectHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n window.addEventListener('hashchange', redirectHandler);\n // Also check current hash immediately\n redirectHandler();\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build deep link URL\n const deepLinkUrl = this.buildDeepLinkUrl(url, request);\n\n // Open deep link (mobile) or window (desktop fallback)\n if (typeof window !== 'undefined') {\n // Try to open deep link\n window.location.href = deepLinkUrl;\n\n // Fallback: open in new window if deep link fails\n // (This is a simulation - real mobile apps would handle the deep link)\n const fallbackWindow = window.open(deepLinkUrl, '_blank');\n if (!fallbackWindow) {\n throw new Error('Failed to open deep link');\n }\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000; // Default 60s\n const response = await this.waitForCallback<ConnectResponse>(\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build deep link URL\n const deepLinkUrl = this.buildDeepLinkUrl(url, request);\n\n // Open deep link\n if (typeof window !== 'undefined') {\n window.location.href = deepLinkUrl;\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<SignResponse>(\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * Popup Transport\n * \n * Opens a centered popup window and establishes a postMessage channel.\n * \n * Security:\n * - Origin validation\n * - State parameter validation\n * - Popup window management\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * Popup transport implementation\n */\nexport class PopupTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(\n baseUrl: string,\n request: ConnectRequest | SignRequest\n ): string {\n const url = new URL(baseUrl);\n Object.entries(request).forEach(([key, value]) => {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n url.searchParams.set(key, JSON.stringify(value));\n } else if (typeof value === 'object') {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n return url.toString();\n }\n\n /**\n * Validate message origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Open popup window\n */\n private openPopup(url: string, _options: TransportOptions): Window | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n return window.open(\n url,\n 'PartyLayer',\n `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`\n );\n }\n\n /**\n * Wait for postMessage callback\n */\n private async waitForCallback<T extends { state: string }>(\n popup: Window,\n state: string,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n popup.close();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n cleanup();\n reject(new Error('Popup closed by user'));\n }\n }, 500);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === state) {\n cleanup();\n popup.close();\n resolve(data as T);\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n clearInterval(checkClosed);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build URL\n const fullUrl = this.buildUrl(url, request);\n\n // Open popup\n const popup = this.openPopup(fullUrl, options);\n if (!popup) {\n throw new Error('Failed to open popup window');\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<ConnectResponse>(\n popup,\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build URL\n const fullUrl = this.buildUrl(url, request);\n\n // Open popup\n const popup = this.openPopup(fullUrl, options);\n if (!popup) {\n throw new Error('Failed to open popup window');\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<SignResponse>(\n popup,\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * PostMessage Transport\n * \n * Establishes a postMessage channel with an existing window/iframe.\n * \n * Security:\n * - Origin validation\n * - State parameter validation\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * PostMessage transport implementation\n */\nexport class PostMessageTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Validate message origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Send message and wait for response\n */\n private async sendAndWait<T extends { state: string }>(\n target: Window,\n targetOrigin: string,\n message: ConnectRequest | SignRequest,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === message.state) {\n cleanup();\n resolve(data as T);\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n target.postMessage(message, targetOrigin);\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n if (typeof window === 'undefined') {\n throw new Error('PostMessage transport requires browser environment');\n }\n\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Parse target origin from URL\n const targetUrl = new URL(url);\n const targetOrigin = targetUrl.origin;\n\n // Get target window (could be parent, opener, or specific iframe)\n // For now, assume we're communicating with parent/opener\n const target = (window.opener ?? window.parent) as Window | null;\n\n if (!target || target === window) {\n throw new Error('No target window available for postMessage');\n }\n\n // Send message and wait for response\n const timeout = options.timeoutMs || 60000;\n const response = await this.sendAndWait<ConnectResponse>(\n target,\n targetOrigin,\n request,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n if (typeof window === 'undefined') {\n throw new Error('PostMessage transport requires browser environment');\n }\n\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Parse target origin from URL\n const targetUrl = new URL(url);\n const targetOrigin = targetUrl.origin;\n\n // Get target window\n const target = (window.opener ?? window.parent) as Window | null;\n\n if (!target || target === window) {\n throw new Error('No target window available for postMessage');\n }\n\n // Send message and wait for response\n const timeout = options.timeoutMs || 60000;\n const response = await this.sendAndWait<SignResponse>(\n target,\n targetOrigin,\n request,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * Mock Transport\n * \n * For testing and development. Simulates transport behavior without real network calls.\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n JobStatus,\n} from './types';\nimport { toPartyId } from '../types';\n\n/**\n * Mock transport implementation\n */\nexport class MockTransport implements Transport {\n private mockResponses: Map<string, ConnectResponse | SignResponse> = new Map();\n private mockJobs: Map<string, JobStatus> = new Map();\n\n /**\n * Set mock response for a state\n */\n setMockResponse(state: string, response: ConnectResponse | SignResponse): void {\n this.mockResponses.set(state, response);\n }\n\n /**\n * Set mock job status\n */\n setMockJob(jobId: string, status: JobStatus): void {\n this.mockJobs.set(jobId, status);\n }\n\n /**\n * Clear all mocks\n */\n clearMocks(): void {\n this.mockResponses.clear();\n this.mockJobs.clear();\n }\n\n /**\n * Open a connection request (mock)\n */\n async openConnectRequest(\n _url: string,\n request: ConnectRequest,\n _options: TransportOptions\n ): Promise<ConnectResponse> {\n // Check for mock response\n const mockResponse = this.mockResponses.get(request.state);\n if (mockResponse && 'partyId' in mockResponse) {\n return mockResponse;\n }\n\n // Default mock response\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n state: request.state,\n partyId: toPartyId('mock-party-' + Date.now()),\n sessionToken: 'mock-token',\n expiresAt: Date.now() + 3600000, // 1 hour\n capabilities: request.requestedCapabilities || ['connect', 'signMessage'],\n });\n }, 100); // Simulate async delay\n });\n }\n\n /**\n * Open a sign request (mock)\n */\n async openSignRequest(\n _url: string,\n request: SignRequest,\n _options: TransportOptions\n ): Promise<SignResponse> {\n // Check for mock response\n const mockResponse = this.mockResponses.get(request.state);\n if (mockResponse && ('signature' in mockResponse || 'jobId' in mockResponse)) {\n return mockResponse;\n }\n\n // Default mock response\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n state: request.state,\n signature: 'mock-signature-' + Date.now(),\n transactionHash: request.transaction ? 'mock-tx-hash' : undefined,\n });\n }, 100);\n });\n }\n\n /**\n * Poll job status (mock)\n */\n pollJobStatus(\n jobId: string,\n _statusUrl: string,\n _options: TransportOptions\n ): Promise<JobStatus> {\n // Check for mock job\n const mockJob = this.mockJobs.get(jobId);\n if (mockJob) {\n return Promise.resolve(mockJob);\n }\n\n // Default mock: approved immediately\n return Promise.resolve({\n jobId,\n status: 'approved',\n result: {\n signature: 'mock-signature',\n transactionHash: 'mock-tx-hash',\n },\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/adapters.ts","../src/session.ts","../src/detection.ts","../src/metrics.ts","../src/metrics-payload.ts","../src/cip0103-types.ts","../src/transport/deeplink.ts","../src/transport/popup.ts","../src/transport/postmessage.ts","../src/transport/mock.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core types for PartyLayer SDK\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\n/**\n * Branded string types for type safety\n */\nexport type WalletId = string & { readonly __brand: 'WalletId' };\nexport type PartyId = string & { readonly __brand: 'PartyId' };\nexport type SessionId = string & { readonly __brand: 'SessionId' };\nexport type TransactionHash = string & { readonly __brand: 'TransactionHash' };\nexport type Signature = string & { readonly __brand: 'Signature' };\n\n/**\n * Network identifier\n * Standard networks: \"devnet\" | \"testnet\" | \"mainnet\"\n * Custom networks allowed as string\n */\nexport type NetworkId = 'devnet' | 'testnet' | 'mainnet' | (string & Record<never, never>);\n\n/**\n * Capability keys that wallets can support\n * Based on OpenRPC dApp API capabilities\n */\nexport type CapabilityKey =\n | 'connect'\n | 'disconnect'\n | 'restore'\n | 'signMessage'\n | 'signTransaction'\n | 'submitTransaction'\n | 'ledgerApi'\n | 'events'\n | 'deeplink'\n | 'popup'\n | 'injected'\n | 'remoteSigner';\n\n/**\n * Wallet installation hints for detection\n */\nexport interface InstallHints {\n /** Window property name (e.g., \"consoleWallet\") */\n injectedKey?: string;\n /** Browser extension ID */\n extensionId?: string;\n /** Deep link scheme (e.g., \"loop://\") */\n deepLinkScheme?: string;\n /** Script tag identifier */\n scriptTag?: string;\n}\n\n/**\n * Wallet adapter metadata\n */\nexport interface AdapterMetadata {\n /** NPM package name */\n packageName: string;\n /** Version range (semver) */\n versionRange: string;\n}\n\n/**\n * Provider matcher: a single rule used by `ProviderDetection.matchers`.\n *\n * Three match modes are defined; OR-combined inside a `ProviderDetection`.\n * Exact and prefix work on string fields directly; domain interprets the\n * field as a URL and tests its hostname against the registrable domain\n * (with subdomain support).\n */\nexport type ProviderMatcher =\n | {\n field: 'kernel.url' | 'kernel.userUrl';\n match: 'domain';\n /** Hostname or registrable domain. Subdomains are accepted. */\n value: string;\n }\n | {\n field:\n | 'kernel.id'\n | 'kernel.url'\n | 'kernel.userUrl'\n | 'kernel.clientType'\n | 'provider.id';\n match: 'exact';\n /** One or more exact values; ANY match returns true. */\n values: string[];\n }\n | {\n field: 'kernel.id' | 'kernel.url' | 'kernel.userUrl';\n match: 'prefix';\n value: string;\n };\n\n/**\n * Standards-first runtime detection of a CIP-0103 wallet.\n *\n * The registry stores these rules so that any current or future wallet\n * implementing `window.canton` can be identified without code changes —\n * a registry JSON update is enough.\n */\nexport interface ProviderDetection {\n /** Transport mechanism. Currently only 'window.canton' is supported. */\n transport: 'window.canton';\n /** OR-list of matchers. Provider matches if ANY matcher returns true. */\n matchers: ProviderMatcher[];\n}\n\n/**\n * Canonical CIP-0103 support marker.\n *\n * When `native: true`, the wallet is treated as a first-class CIP-0103\n * provider in the picker — it always appears in the \"CIP-0103 NATIVE\"\n * section regardless of install state, with a per-wallet readiness\n * indicator that reflects whether the wallet's `providerDetection` rules\n * matched the currently-injected `window.canton` provider.\n *\n * The field is optional; wallets that don't claim CIP-0103 support omit\n * it and continue to appear in the \"AVAILABLE\" section as before.\n */\nexport interface Cip0103Support {\n /** True if this wallet has confirmed CIP-0103 dApp API support. */\n native: boolean;\n /** Public evidence link (npm package, blog post, official statement). */\n evidence?: string;\n /** ISO date when CIP-0103 support was confirmed (informational). */\n since?: string;\n}\n\n/**\n * Wallet information from registry\n */\nexport interface WalletInfo {\n /** Wallet identifier */\n walletId: WalletId;\n /** Display name */\n name: string;\n /** Website URL */\n website: string;\n /** Icon URLs (different sizes) */\n icons: {\n sm?: string;\n md?: string;\n lg?: string;\n };\n /** Category (e.g., \"browser\", \"mobile\", \"hardware\") */\n category?: string;\n /** Supported capabilities */\n capabilities: CapabilityKey[];\n /** Installation detection hints */\n installHints?: InstallHints;\n /** Adapter package information */\n adapter: AdapterMetadata;\n /** Documentation URLs */\n docs: string[];\n /** Minimum SDK version required */\n minSdkVersion?: string;\n /** Supported networks */\n networks: NetworkId[];\n /** Registry channel */\n channel: 'stable' | 'beta';\n /** Additional metadata (e.g., originAllowlist) */\n metadata?: Record<string, string>;\n /**\n * Optional CIP-0103 runtime detection rules. When present, the picker can\n * decide whether this wallet is the currently-injected `window.canton`\n * provider and route it into the \"CIP-0103 Native\" section without any\n * hardcoded wallet IDs. Wallets that aren't CIP-0103-injected (e.g. Bron,\n * Cantor8 deeplink) leave this unset.\n */\n providerDetection?: ProviderDetection;\n /**\n * Canonical CIP-0103 support marker. When set with `native: true`, the\n * picker always lists the wallet in the \"CIP-0103 NATIVE\" section\n * regardless of install state.\n */\n cip0103?: Cip0103Support;\n}\n\n/**\n * Returns true if the wallet has been canonically marked as CIP-0103\n * native via its registry entry. The check is structural so it works on\n * both raw `RegistryWalletEntry` shapes and converted `WalletInfo`.\n */\nexport function isCip0103Native(entry: { cip0103?: Cip0103Support }): boolean {\n return entry?.cip0103?.native === true;\n}\n\n/**\n * Session information\n * Sessions are origin-bound and encrypted in storage\n */\nexport interface Session {\n /** Unique session ID */\n sessionId: SessionId;\n /** Wallet identifier */\n walletId: WalletId;\n /** Connected party ID */\n partyId: PartyId;\n /** Current network */\n network: NetworkId;\n /** Session creation timestamp */\n createdAt: number;\n /** Session expiration timestamp (if applicable) */\n expiresAt?: number;\n /** Origin of the dApp that created the session */\n origin: string;\n /** Capabilities available in this session */\n capabilitiesSnapshot: CapabilityKey[];\n /** Additional metadata (encrypted in storage) */\n metadata?: Record<string, string>;\n}\n\n/**\n * Persisted session (for restoration)\n */\nexport interface PersistedSession extends Session {\n /** Encrypted session data */\n encrypted: string;\n}\n\n/**\n * Signed message result\n */\nexport interface SignedMessage {\n /** Signature */\n signature: Signature;\n /** Party ID that signed */\n partyId: PartyId;\n /** Original message */\n message: string;\n /** Nonce used (if provided) */\n nonce?: string;\n /** Domain used (if provided) */\n domain?: string;\n}\n\n/**\n * Signed transaction result\n */\nexport interface SignedTransaction {\n /** Signed transaction data */\n signedTx: unknown;\n /** Transaction hash */\n transactionHash: TransactionHash;\n /** Party ID that signed */\n partyId: PartyId;\n}\n\n/**\n * Transaction receipt\n */\nexport interface TxReceipt {\n /** Transaction hash */\n transactionHash: TransactionHash;\n /** Submission timestamp */\n submittedAt: number;\n /** Command ID (if available) */\n commandId?: string;\n /** Update ID (if available) */\n updateId?: string;\n}\n\n/**\n * Transaction status\n */\nexport type TransactionStatus =\n | 'pending'\n | 'submitted'\n | 'committed'\n | 'rejected'\n | 'failed';\n\n/**\n * Transaction status update\n */\nexport interface TxStatusUpdate {\n /** Session ID */\n sessionId: SessionId;\n /** Transaction ID */\n txId: TransactionHash;\n /** Current status */\n status: TransactionStatus;\n /** Raw transaction data (if available) */\n raw?: unknown;\n /** Timestamp */\n timestamp: number;\n}\n\n/**\n * Helper to create branded WalletId\n */\nexport function toWalletId(id: string): WalletId {\n return id as WalletId;\n}\n\n/**\n * Helper to create branded PartyId\n */\nexport function toPartyId(id: string): PartyId {\n return id as PartyId;\n}\n\n/**\n * Helper to create branded SessionId\n */\nexport function toSessionId(id: string): SessionId {\n return id as SessionId;\n}\n\n/**\n * Helper to create branded TransactionHash\n */\nexport function toTransactionHash(hash: string): TransactionHash {\n return hash as TransactionHash;\n}\n\n/**\n * Helper to create branded Signature\n */\nexport function toSignature(sig: string): Signature {\n return sig as Signature;\n}\n","/**\n * Error taxonomy for PartyLayer SDK\n * \n * All errors extend PartyLayerError with stable error codes.\n * Error codes are string literals for telemetry and UI message mapping.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\n/**\n * Error code union - stable string literals for telemetry and UI\n */\nexport type ErrorCode =\n | 'WALLET_NOT_FOUND'\n | 'WALLET_NOT_INSTALLED'\n | 'USER_REJECTED'\n | 'ORIGIN_NOT_ALLOWED'\n | 'SESSION_EXPIRED'\n | 'CAPABILITY_NOT_SUPPORTED'\n | 'TRANSPORT_ERROR'\n | 'REGISTRY_FETCH_FAILED'\n | 'REGISTRY_VERIFICATION_FAILED'\n | 'REGISTRY_SCHEMA_INVALID'\n | 'INTERNAL_ERROR'\n | 'TIMEOUT';\n\n/**\n * Error mapping context\n */\nexport interface ErrorMappingContext {\n /** Wallet ID (if applicable) */\n walletId?: string;\n /** Operation phase */\n phase: 'connect' | 'restore' | 'signMessage' | 'signTransaction' | 'submitTransaction' | 'ledgerApi';\n /** Transport type */\n transport?: 'injected' | 'popup' | 'deeplink' | 'remote';\n /** Timeout in milliseconds (for timeout errors) */\n timeoutMs?: number;\n /** Additional context */\n details?: Record<string, unknown>;\n}\n\n/**\n * Base error class for all PartyLayer errors\n */\nexport class PartyLayerError extends Error {\n public readonly code: ErrorCode;\n public readonly cause?: unknown;\n public readonly details?: Record<string, unknown>;\n public readonly isOperational: boolean;\n\n constructor(\n message: string,\n code: ErrorCode,\n options?: {\n cause?: unknown;\n details?: Record<string, unknown>;\n isOperational?: boolean;\n }\n ) {\n super(message);\n this.name = 'PartyLayerError';\n this.code = code;\n this.cause = options?.cause;\n this.details = options?.details;\n this.isOperational = options?.isOperational ?? true;\n\n // Maintains proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PartyLayerError);\n }\n }\n\n /**\n * Serialize error to JSON for telemetry/logging\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n isOperational: this.isOperational,\n details: this.details,\n cause: this.cause instanceof Error\n ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack,\n }\n : this.cause,\n };\n }\n}\n\n/**\n * Wallet not found error\n */\nexport class WalletNotFoundError extends PartyLayerError {\n constructor(walletId: string) {\n super(`Wallet \"${walletId}\" not found`, 'WALLET_NOT_FOUND', {\n details: { walletId },\n });\n this.name = 'WalletNotFoundError';\n }\n}\n\n/**\n * Wallet not installed error\n */\nexport class WalletNotInstalledError extends PartyLayerError {\n constructor(walletId: string, reason?: string) {\n super(\n `Wallet \"${walletId}\" is not installed${reason ? `: ${reason}` : ''}`,\n 'WALLET_NOT_INSTALLED',\n {\n details: { walletId, reason },\n }\n );\n this.name = 'WalletNotInstalledError';\n }\n}\n\n/**\n * User rejected error\n */\nexport class UserRejectedError extends PartyLayerError {\n constructor(operation: string, details?: Record<string, unknown>) {\n super(`User rejected ${operation}`, 'USER_REJECTED', {\n details: { operation, ...details },\n });\n this.name = 'UserRejectedError';\n }\n}\n\n/**\n * Origin not allowed error\n */\nexport class OriginNotAllowedError extends PartyLayerError {\n constructor(origin: string, allowedOrigins?: string[]) {\n super(\n `Origin \"${origin}\" is not allowed`,\n 'ORIGIN_NOT_ALLOWED',\n {\n details: { origin, allowedOrigins },\n }\n );\n this.name = 'OriginNotAllowedError';\n }\n}\n\n/**\n * Session expired error\n */\nexport class SessionExpiredError extends PartyLayerError {\n constructor(sessionId: string) {\n super(`Session \"${sessionId}\" has expired`, 'SESSION_EXPIRED', {\n details: { sessionId },\n });\n this.name = 'SessionExpiredError';\n }\n}\n\n/**\n * Capability not supported error\n */\nexport class CapabilityNotSupportedError extends PartyLayerError {\n constructor(walletId: string, capability: string) {\n super(\n `Wallet \"${walletId}\" does not support capability \"${capability}\"`,\n 'CAPABILITY_NOT_SUPPORTED',\n {\n details: { walletId, capability },\n }\n );\n this.name = 'CapabilityNotSupportedError';\n }\n}\n\n/**\n * Transport error\n */\nexport class TransportError extends PartyLayerError {\n constructor(message: string, cause?: unknown, details?: Record<string, unknown>) {\n super(message, 'TRANSPORT_ERROR', {\n cause,\n details,\n });\n this.name = 'TransportError';\n }\n}\n\n/**\n * Registry fetch failed error\n */\nexport class RegistryFetchFailedError extends PartyLayerError {\n constructor(url: string, cause?: unknown) {\n super(`Failed to fetch registry from \"${url}\"`, 'REGISTRY_FETCH_FAILED', {\n cause,\n details: { url },\n });\n this.name = 'RegistryFetchFailedError';\n }\n}\n\n/**\n * Registry verification failed error\n */\nexport class RegistryVerificationFailedError extends PartyLayerError {\n constructor(reason: string, details?: Record<string, unknown>) {\n super(`Registry verification failed: ${reason}`, 'REGISTRY_VERIFICATION_FAILED', {\n details: { reason, ...details },\n });\n this.name = 'RegistryVerificationFailedError';\n }\n}\n\n/**\n * Registry schema invalid error\n */\nexport class RegistrySchemaInvalidError extends PartyLayerError {\n constructor(reason: string, details?: Record<string, unknown>) {\n super(`Registry schema invalid: ${reason}`, 'REGISTRY_SCHEMA_INVALID', {\n details: { reason, ...details },\n });\n this.name = 'RegistrySchemaInvalidError';\n }\n}\n\n/**\n * Internal error (non-operational)\n */\nexport class InternalError extends PartyLayerError {\n constructor(message: string, cause?: unknown, details?: Record<string, unknown>) {\n super(message, 'INTERNAL_ERROR', {\n cause,\n details,\n isOperational: false,\n });\n this.name = 'InternalError';\n }\n}\n\n/**\n * Timeout error\n */\nexport class TimeoutError extends PartyLayerError {\n constructor(operation: string, timeoutMs: number) {\n super(\n `Operation \"${operation}\" timed out after ${timeoutMs}ms`,\n 'TIMEOUT',\n {\n details: { operation, timeoutMs },\n }\n );\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Map unknown errors to PartyLayerError\n * \n * This is the single error mapping strategy used by all adapters.\n * It normalizes errors from various sources (wallet SDKs, network, etc.)\n * into typed PartyLayerError instances.\n */\nexport function mapUnknownErrorToPartyLayerError(\n err: unknown,\n context: ErrorMappingContext\n): PartyLayerError {\n // Already a PartyLayerError\n if (err instanceof PartyLayerError) {\n return err;\n }\n\n // Standard Error\n if (err instanceof Error) {\n const message = err.message.toLowerCase();\n\n // User rejection patterns\n if (\n message.includes('rejected') ||\n message.includes('denied') ||\n message.includes('cancelled') ||\n message.includes('canceled') ||\n err.name === 'UserRejectedError'\n ) {\n return new UserRejectedError(context.phase, {\n walletId: context.walletId,\n transport: context.transport,\n originalMessage: err.message,\n });\n }\n\n // Timeout patterns\n if (\n message.includes('timeout') ||\n message.includes('timed out') ||\n err.name === 'TimeoutError'\n ) {\n // Try to get timeout from context, or extract from error message, or default to 0\n let timeoutMs = context.timeoutMs ?? 0;\n if (timeoutMs === 0) {\n // Try to extract from message like \"timed out after 30000ms\" or \"timeout after 30s\"\n const msMatch = err.message.match(/(\\d+)\\s*ms/i);\n const secMatch = err.message.match(/(\\d+)\\s*(?:sec|second)/i);\n if (msMatch) {\n timeoutMs = parseInt(msMatch[1], 10);\n } else if (secMatch) {\n timeoutMs = parseInt(secMatch[1], 10) * 1000;\n }\n }\n return new TimeoutError(context.phase, timeoutMs);\n }\n\n // Network/transport errors\n if (\n message.includes('network') ||\n message.includes('fetch') ||\n message.includes('connection') ||\n err.name === 'NetworkError' ||\n err.name === 'TypeError'\n ) {\n return new TransportError(err.message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n });\n }\n\n // Generic transport error\n return new TransportError(err.message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n originalError: err.name,\n });\n }\n\n // String errors\n if (typeof err === 'string') {\n return new TransportError(err, undefined, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n });\n }\n\n // Unknown error type\n return new InternalError(\n `Unknown error in ${context.phase}`,\n err,\n {\n walletId: context.walletId,\n transport: context.transport,\n errorType: typeof err,\n }\n );\n}\n","/**\n * Wallet adapter interface contract\n * \n * All wallet adapters must implement this interface.\n * Adapters are responsible for:\n * - Detecting wallet installation\n * - Establishing connections\n * - Signing messages/transactions\n * - Emitting events\n * \n * References:\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n */\n\nimport type {\n WalletId,\n PartyId,\n NetworkId,\n CapabilityKey,\n Session,\n PersistedSession,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n} from './types';\nimport {\n CapabilityNotSupportedError,\n WalletNotInstalledError,\n} from './errors';\n\n/**\n * Adapter detection result\n */\nexport interface AdapterDetectResult {\n /** Whether wallet is installed */\n installed: boolean;\n /** Reason if not installed */\n reason?: string;\n}\n\n/**\n * Adapter connection result\n */\nexport interface AdapterConnectResult {\n /** Connected party ID */\n partyId: PartyId;\n /** Partial session data (SDK will complete it) */\n session: Partial<Session>;\n /** Capabilities available in this session */\n capabilities: CapabilityKey[];\n}\n\n/**\n * Sign message parameters\n */\nexport interface SignMessageParams {\n /** Message to sign */\n message: string;\n /** Optional nonce */\n nonce?: string;\n /** Optional domain */\n domain?: string;\n}\n\n/**\n * Sign transaction parameters\n */\nexport interface SignTransactionParams {\n /** Transaction to sign (type kept as unknown for wallet-specific formats) */\n tx: unknown;\n}\n\n/**\n * Submit transaction parameters\n */\nexport interface SubmitTransactionParams {\n /** Signed transaction */\n signedTx: unknown;\n}\n\n/**\n * Ledger API proxy parameters (CIP-0103 ledgerApi method)\n */\nexport interface LedgerApiParams {\n /** HTTP method for the JSON Ledger API */\n requestMethod: 'GET' | 'POST' | 'PUT' | 'DELETE';\n /** Resource path (e.g., \"/v2/state/acs\") */\n resource: string;\n /** Optional JSON body */\n body?: string;\n}\n\n/**\n * Ledger API proxy result\n */\nexport interface LedgerApiResult {\n /** JSON response from the Ledger API */\n response: string;\n}\n\n/**\n * Logger interface\n */\nexport interface LoggerAdapter {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, error?: unknown, ...args: unknown[]): void;\n}\n\n/**\n * Telemetry interface\n * \n * Extended in 0.3.0 with optional metrics methods.\n * All new methods are optional to maintain backward compatibility.\n */\nexport interface TelemetryAdapter {\n /** Track a named event with optional properties */\n track(event: string, properties?: Record<string, unknown>): void;\n \n /** Track an error occurrence */\n error(error: Error, properties?: Record<string, unknown>): void;\n \n /**\n * Increment a metric counter\n * @param metric - Metric name (e.g., 'wallet_connect_attempts')\n * @param value - Value to increment by (default: 1)\n * @since 0.3.0\n */\n increment?(metric: string, value?: number): void;\n \n /**\n * Set a gauge metric value\n * @param metric - Metric name\n * @param value - Current value\n * @since 0.3.0\n */\n gauge?(metric: string, value: number): void;\n \n /**\n * Flush buffered metrics to backend\n * @since 0.3.0\n */\n flush?(): Promise<void>;\n \n /**\n * Check if telemetry is enabled\n * @returns true if telemetry should be collected\n * @since 0.3.0\n */\n isEnabled?(): boolean;\n}\n\n/**\n * Crypto interface\n */\nexport interface CryptoAdapter {\n encrypt(data: string, key: string): Promise<string>;\n decrypt(encrypted: string, key: string): Promise<string>;\n generateKey(): Promise<string>;\n}\n\n/**\n * Storage interface\n */\nexport interface StorageAdapter {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n remove(key: string): Promise<void>;\n clear(): Promise<void>;\n}\n\n/**\n * Registry client interface (for adapters to query wallet info)\n */\nexport interface RegistryClientAdapter {\n getWallet(walletId: WalletId): Promise<unknown>;\n}\n\n/**\n * Adapter context provided to all adapter methods\n */\nexport interface AdapterContext {\n /** Application name */\n appName: string;\n /** Origin (for origin binding) */\n origin: string;\n /** Network */\n network: NetworkId;\n /** Logger */\n logger: LoggerAdapter;\n /** Telemetry (optional) */\n telemetry?: TelemetryAdapter;\n /** Registry client */\n registry: RegistryClientAdapter;\n /** Crypto adapter */\n crypto: CryptoAdapter;\n /** Storage adapter */\n storage: StorageAdapter;\n /** Timeout helper */\n timeout: (ms: number) => Promise<never>;\n /** Abort signal (for cancellation) */\n abortSignal?: AbortSignal;\n}\n\n/**\n * Adapter event names\n */\nexport type AdapterEventName =\n | 'connect'\n | 'disconnect'\n | 'sessionExpired'\n | 'txStatus'\n | 'error';\n\n/**\n * Wallet adapter interface\n * \n * All wallet adapters must implement this interface.\n * Optional methods (marked with ?) should only be implemented\n * if the wallet supports that capability.\n */\nexport interface WalletAdapter {\n /** Wallet identifier */\n readonly walletId: WalletId;\n /** Wallet display name */\n readonly name: string;\n\n /**\n * Get supported capabilities\n */\n getCapabilities(): CapabilityKey[];\n\n /**\n * Detect if wallet is installed\n */\n detectInstalled(): Promise<AdapterDetectResult>;\n\n /**\n * Connect to wallet\n * @param ctx Adapter context\n * @param opts Connection options (optional)\n */\n connect(\n ctx: AdapterContext,\n opts?: {\n timeoutMs?: number;\n partyId?: PartyId;\n /** When false, prefer remote/mobile transport over installed extension */\n preferInstalled?: boolean;\n }\n ): Promise<AdapterConnectResult>;\n\n /**\n * Disconnect from wallet\n * @param ctx Adapter context\n * @param session Session to disconnect\n */\n disconnect(ctx: AdapterContext, session: Session): Promise<void>;\n\n /**\n * Restore session (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param persisted Persisted session data\n */\n restore?(\n ctx: AdapterContext,\n persisted: PersistedSession\n ): Promise<Session | null>;\n\n /**\n * Sign message (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Sign message parameters\n */\n signMessage?(\n ctx: AdapterContext,\n session: Session,\n params: SignMessageParams\n ): Promise<SignedMessage>;\n\n /**\n * Sign transaction (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Sign transaction parameters\n */\n signTransaction?(\n ctx: AdapterContext,\n session: Session,\n params: SignTransactionParams\n ): Promise<SignedTransaction>;\n\n /**\n * Submit transaction (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Submit transaction parameters\n */\n submitTransaction?(\n ctx: AdapterContext,\n session: Session,\n params: SubmitTransactionParams\n ): Promise<TxReceipt>;\n\n /**\n * Proxy a JSON Ledger API request (optional - only if wallet supports it)\n * @param ctx Adapter context\n * @param session Active session\n * @param params Ledger API request parameters\n */\n ledgerApi?(\n ctx: AdapterContext,\n session: Session,\n params: LedgerApiParams\n ): Promise<LedgerApiResult>;\n\n /**\n * Subscribe to adapter events (optional)\n * @param event Event name\n * @param handler Event handler\n * @returns Unsubscribe function\n */\n on?(\n event: AdapterEventName,\n handler: (payload: unknown) => void\n ): () => void;\n}\n\n/**\n * Check if adapter supports required capabilities\n * Throws CapabilityNotSupportedError if not supported\n */\nexport function capabilityGuard(\n adapter: WalletAdapter,\n requiredCapabilities: CapabilityKey[]\n): void {\n const supported = adapter.getCapabilities();\n const missing = requiredCapabilities.filter((cap) => !supported.includes(cap));\n\n if (missing.length > 0) {\n throw new CapabilityNotSupportedError(\n adapter.walletId,\n missing.join(', ')\n );\n }\n}\n\n/**\n * Check if wallet is installed\n * Throws WalletNotInstalledError if not installed\n */\nexport async function installGuard(\n adapter: WalletAdapter\n): Promise<void> {\n const detect = await adapter.detectInstalled();\n if (!detect.installed) {\n throw new WalletNotInstalledError(adapter.walletId, detect.reason);\n }\n}\n","/**\n * Session management utilities\n */\n\nimport type { Session, SessionId } from './types';\nimport { toSessionId } from './types';\n\n/**\n * Generate a unique session ID\n */\nexport function generateSessionId(): SessionId {\n return toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`);\n}\n\n/**\n * Validate session structure\n */\nexport function validateSession(session: unknown): session is Session {\n if (typeof session !== 'object' || session === null) {\n return false;\n }\n\n const s = session as Record<string, unknown>;\n\n return (\n typeof s.sessionId === 'string' &&\n typeof s.walletId === 'string' &&\n typeof s.partyId === 'string' &&\n typeof s.network === 'string' &&\n typeof s.createdAt === 'number' &&\n typeof s.origin === 'string' &&\n Array.isArray(s.capabilitiesSnapshot)\n );\n}\n\n/**\n * Check if session is expired\n */\nexport function isSessionExpired(session: Session): boolean {\n if (!session.expiresAt) {\n return false; // No expiration\n }\n\n return Date.now() >= session.expiresAt;\n}\n\n/**\n * Create a session with default values\n */\nexport function createSession(\n walletId: string,\n partyId: string,\n network: string,\n origin: string,\n capabilities: string[] = [],\n expiresInMs?: number\n): Session {\n const now = Date.now();\n return {\n sessionId: generateSessionId(),\n walletId: walletId as import('./types').WalletId,\n partyId: partyId as import('./types').PartyId,\n network,\n createdAt: now,\n expiresAt: expiresInMs ? now + expiresInMs : undefined,\n origin,\n capabilitiesSnapshot: capabilities as import('./types').CapabilityKey[],\n };\n}\n","/**\n * Standards-first CIP-0103 wallet detection.\n *\n * The registry stores `providerDetection` rules per wallet entry. At\n * runtime the picker calls `window.canton.request({method:'status'})`,\n * receives the wallet's self-reported identity (kernel.id / kernel.url /\n * kernel.userUrl / kernel.clientType), and asks `findMatchingWallet`\n * which registry entry — if any — claims this provider.\n *\n * The architecture deliberately avoids hardcoding wallet IDs anywhere\n * outside the registry. Adding a new CIP-0103 wallet to the ecosystem\n * is a registry JSON update; no SDK release is required.\n */\n\nimport type {\n ProviderDetection,\n ProviderMatcher,\n WalletInfo,\n} from './types';\n\n/**\n * The shape of a CIP-0103 status response that detection cares about.\n *\n * Mirrors what `window.canton.request({ method: 'status' })` returns —\n * declared structurally so adapter packages can reuse this without\n * reaching into the wallet-specific types.\n */\nexport interface Cip0103StatusForDetection {\n kernel?: {\n id?: string;\n url?: string;\n userUrl?: string;\n clientType?: string;\n };\n}\n\n/** Returns true if the runtime status matches any of the detection's matchers. */\nexport function matchesProviderDetection(\n status: Cip0103StatusForDetection | null | undefined,\n detection: ProviderDetection | undefined,\n): boolean {\n if (!status || !detection || !detection.matchers || detection.matchers.length === 0) {\n return false;\n }\n return detection.matchers.some((m) => matchesSingle(status, m));\n}\n\nfunction matchesSingle(status: Cip0103StatusForDetection, matcher: ProviderMatcher): boolean {\n const fieldValue = readField(status, matcher.field);\n if (typeof fieldValue !== 'string' || fieldValue.length === 0) return false;\n\n switch (matcher.match) {\n case 'exact':\n return matcher.values.includes(fieldValue);\n case 'prefix':\n return fieldValue.startsWith(matcher.value);\n case 'domain':\n return matchesDomain(fieldValue, matcher.value);\n default:\n return false;\n }\n}\n\n/**\n * Read a dot-separated field path from the wallet status object.\n *\n * Historically this only supported `kernel.*` paths because that's what\n * CIP-103's status response shape was assumed to contain. Real-world\n * wallets (notably Send) inject their CIP-103 provider with status\n * payloads that nest provider info under different top-level keys\n * (e.g., `provider.*`). This generalized form reads ANY top-level\n * object on `status`.\n *\n * Behavior is identical to the previous `kernel.*`-only implementation\n * for every `kernel.*` input: same return values, same undefined cases.\n * The change is purely additive — it permits new top-level keys without\n * altering existing path resolution.\n *\n * Supports two-segment paths only (`root.key`). Deeper nesting is\n * intentionally not supported; if a wallet uses deeper paths, the\n * matcher schema would need extension first (separate change).\n */\nfunction readField(\n status: Cip0103StatusForDetection,\n field: ProviderMatcher['field'],\n): string | undefined {\n if (!status || typeof status !== 'object') return undefined;\n const dot = field.indexOf('.');\n if (dot < 0) return undefined;\n const root = field.slice(0, dot);\n const key = field.slice(dot + 1);\n const subject = (status as unknown as Record<string, unknown>)[root];\n if (!subject || typeof subject !== 'object') return undefined;\n const value = (subject as Record<string, unknown>)[key];\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Matches a URL string against a registrable domain. Subdomain matches\n * are accepted; foreign domains are rejected; un-parseable URLs return\n * false (no exception).\n *\n * Examples:\n * matchesDomain('https://api-mainnet.cantonwallet.com/x', 'cantonwallet.com') === true\n * matchesDomain('https://cantonwallet.com', 'cantonwallet.com') === true\n * matchesDomain('https://other.com', 'cantonwallet.com') === false\n */\nfunction matchesDomain(url: string, domain: string): boolean {\n try {\n const hostname = new URL(url).hostname.toLowerCase();\n const target = domain.toLowerCase();\n return hostname === target || hostname.endsWith('.' + target);\n } catch {\n return false;\n }\n}\n\n/**\n * Find the first registry entry whose `providerDetection` matches the\n * runtime status. Entries without `providerDetection` are skipped.\n *\n * Accepts either the raw `RegistryWalletEntry[]` shape (registry-client's\n * native input) or the converted `WalletInfo[]` shape that flows through\n * the SDK / React layer — the only field read is `providerDetection`,\n * which both shapes carry post-conversion.\n */\nexport function findMatchingWallet<\n T extends { providerDetection?: ProviderDetection },\n>(status: Cip0103StatusForDetection | null | undefined, registry: readonly T[]): T | undefined {\n if (!status) return undefined;\n for (const entry of registry) {\n if (matchesProviderDetection(status, entry.providerDetection)) {\n return entry;\n }\n }\n return undefined;\n}\n\n/**\n * Type-guard convenience for the WalletInfo shape, since the SDK exposes\n * `WalletInfo[]` to React consumers.\n */\nexport function findMatchingWalletInfo(\n status: Cip0103StatusForDetection | null | undefined,\n wallets: readonly WalletInfo[],\n): WalletInfo | undefined {\n return findMatchingWallet(status, wallets);\n}\n\n/**\n * Best-effort display name for an unrecognised CIP-0103 provider. Reads\n * the wallet's self-declared `kernel.userUrl` (the human-facing URL\n * surfaced by Sigilry-style wallets) and falls back to `kernel.id` or\n * a generic label.\n */\nexport function deriveGenericWalletName(status: Cip0103StatusForDetection | null | undefined): string {\n const userUrl = status?.kernel?.userUrl;\n if (typeof userUrl === 'string' && userUrl.length > 0) {\n try {\n return new URL(userUrl).hostname.replace(/^www\\./, '');\n } catch {\n /* fall through */\n }\n }\n const id = status?.kernel?.id;\n if (typeof id === 'string' && id.length > 0) {\n return `CIP-0103 wallet (${id.slice(0, 8)}…)`;\n }\n return 'CIP-0103 wallet';\n}\n","/**\n * Canonical Metrics Constants\n * \n * These metric names are the official set for PartyLayer telemetry.\n * Changing these names would break metrics aggregation and downstream reporting.\n * \n * @since 0.3.0\n */\n\n/**\n * Enablement Metrics\n * \n * These metrics measure how PartyLayer enables wallet interactions.\n */\nexport const ENABLEMENT_METRICS = {\n /** Total wallet connect() calls made */\n WALLET_CONNECT_ATTEMPTS: 'wallet_connect_attempts',\n \n /** Successful wallet connections (session:connected events) */\n WALLET_CONNECT_SUCCESS: 'wallet_connect_success',\n \n /** New sessions created (not restored) */\n SESSIONS_CREATED: 'sessions_created',\n \n /** Sessions successfully restored from storage */\n SESSIONS_RESTORED: 'sessions_restored',\n \n /** Total session restore attempts */\n RESTORE_ATTEMPTS: 'restore_attempts',\n} as const;\n\n/**\n * Error Metrics\n * \n * These metrics track error occurrences by code.\n */\nexport const ERROR_METRICS = {\n /** Prefix for error metrics (e.g., error_USER_REJECTED) */\n ERROR_PREFIX: 'error_',\n} as const;\n\n/**\n * Registry Metrics\n * \n * These metrics track registry client behavior.\n */\nexport const REGISTRY_METRICS = {\n /** Registry fetched from network */\n REGISTRY_FETCH: 'registry_fetch',\n \n /** Registry served from cache */\n REGISTRY_CACHE_HIT: 'registry_cache_hit',\n \n /** Stale registry was used */\n REGISTRY_STALE: 'registry_stale',\n} as const;\n\n/**\n * All metrics combined\n */\nexport const METRICS = {\n ...ENABLEMENT_METRICS,\n ...ERROR_METRICS,\n ...REGISTRY_METRICS,\n} as const;\n\n/**\n * Type for all metric names\n */\nexport type MetricName = typeof METRICS[keyof typeof METRICS];\n\n/**\n * Build an error metric name from an error code\n * \n * @param errorCode - The error code (e.g., 'USER_REJECTED')\n * @returns The metric name (e.g., 'error_USER_REJECTED')\n */\nexport function errorMetricName(errorCode: string): string {\n return `${METRICS.ERROR_PREFIX}${errorCode}`;\n}\n","/**\n * Metrics Payload Types and Privacy Validation\n * \n * This module defines the privacy-safe payload format for metrics collection.\n * \n * Privacy Guarantees:\n * - NO wallet addresses\n * - NO raw party IDs\n * - NO transaction payloads\n * - NO signed message content\n * - NO user identifiers\n * \n * @since 0.3.0\n */\n\n/**\n * Privacy-safe metrics payload\n * \n * This is the only payload format accepted by the metrics backend.\n */\nexport interface MetricsPayload {\n /** SDK version (e.g., '0.3.0') */\n sdkVersion: string;\n \n /** Network identifier (e.g., 'devnet', 'mainnet') */\n network: string;\n \n /** Unix timestamp in milliseconds */\n timestamp: number;\n \n /** Metric name → value map */\n metrics: Record<string, number>;\n \n /** Hashed app identifier (opt-in, SHA-256) */\n appIdHash?: string;\n \n /** Hashed origin (opt-in, SHA-256) */\n originHash?: string;\n}\n\n/**\n * Fields that are NEVER allowed in metrics payloads\n */\nconst FORBIDDEN_FIELDS = [\n 'walletAddress',\n 'address',\n 'partyId',\n 'rawPartyId',\n 'publicKey',\n 'privateKey',\n 'seed',\n 'mnemonic',\n 'txPayload',\n 'transaction',\n 'signedMessage',\n 'message',\n 'signature',\n 'userId',\n 'email',\n 'name',\n 'ip',\n 'userAgent',\n] as const;\n\n/**\n * Validate that a payload is privacy-safe\n * \n * @param payload - Unknown payload to validate\n * @returns true if payload is valid MetricsPayload with no PII\n * @throws Error if forbidden fields are detected\n */\nexport function validatePayload(payload: unknown): payload is MetricsPayload {\n if (!payload || typeof payload !== 'object') {\n return false;\n }\n \n const obj = payload as Record<string, unknown>;\n \n // Check for forbidden fields\n for (const field of FORBIDDEN_FIELDS) {\n if (field in obj) {\n throw new Error(`Forbidden field detected in metrics payload: ${field}`);\n }\n }\n \n // Validate required fields\n if (typeof obj.sdkVersion !== 'string') {\n return false;\n }\n \n if (typeof obj.network !== 'string') {\n return false;\n }\n \n if (typeof obj.timestamp !== 'number' || obj.timestamp <= 0) {\n return false;\n }\n \n if (!obj.metrics || typeof obj.metrics !== 'object') {\n return false;\n }\n \n // Validate metrics are all numbers\n for (const [key, value] of Object.entries(obj.metrics as Record<string, unknown>)) {\n if (typeof key !== 'string' || typeof value !== 'number') {\n return false;\n }\n }\n \n // Validate optional hashed fields\n if (obj.appIdHash !== undefined && typeof obj.appIdHash !== 'string') {\n return false;\n }\n \n if (obj.originHash !== undefined && typeof obj.originHash !== 'string') {\n return false;\n }\n \n return true;\n}\n\n/**\n * Hash a string using SHA-256 (browser-compatible)\n * \n * @param value - String to hash\n * @returns Hex-encoded SHA-256 hash\n */\nexport async function hashForPrivacy(value: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n // Fallback: simple hash for non-browser environments\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n const char = value.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n \n const encoder = new TextEncoder();\n const data = encoder.encode(value);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Create a sanitized metrics payload\n * \n * This function ensures the payload is privacy-safe before sending.\n * \n * @param data - Raw metrics data\n * @returns Sanitized MetricsPayload\n */\nexport function createMetricsPayload(data: {\n sdkVersion: string;\n network: string;\n metrics: Record<string, number>;\n appIdHash?: string;\n originHash?: string;\n}): MetricsPayload {\n const payload: MetricsPayload = {\n sdkVersion: data.sdkVersion,\n network: data.network,\n timestamp: Date.now(),\n metrics: { ...data.metrics },\n };\n \n if (data.appIdHash) {\n payload.appIdHash = data.appIdHash;\n }\n \n if (data.originHash) {\n payload.originHash = data.originHash;\n }\n \n // Final validation\n if (!validatePayload(payload)) {\n throw new Error('Failed to create valid metrics payload');\n }\n \n return payload;\n}\n","/**\n * CIP-0103 dApp Standard — Canonical Type Definitions\n *\n * These types are the verbatim representation of the CIP-0103 specification.\n * They live in @partylayer/core so both @partylayer/provider and @partylayer/sdk\n * can reference them without circular dependencies.\n *\n * Reference: https://github.com/canton-foundation/cips/blob/main/cip-0103/cip-0103.md\n *\n * IMPORTANT: Do not add PartyLayer-specific fields or aliases.\n * These types represent the standard exactly.\n */\n\n// ─── Provider Primitives ─────────────────────────────────────────────────────\n\nexport type CIP0103EventListener<T = unknown> = (...args: T[]) => void;\n\nexport type CIP0103RequestParams = unknown[] | Record<string, unknown>;\n\nexport interface CIP0103RequestPayload {\n method: string;\n params?: CIP0103RequestParams;\n}\n\n// ─── Provider Interface ──────────────────────────────────────────────────────\n\nexport interface CIP0103Provider {\n request<T = unknown>(args: CIP0103RequestPayload): Promise<T>;\n on<T = unknown>(event: string, listener: CIP0103EventListener<T>): CIP0103Provider;\n emit<T = unknown>(event: string, ...args: T[]): boolean;\n removeListener<T = unknown>(\n event: string,\n listenerToRemove: CIP0103EventListener<T>,\n ): CIP0103Provider;\n}\n\n// ─── Connection ──────────────────────────────────────────────────────────────\n\nexport interface CIP0103ConnectResult {\n isConnected: boolean;\n reason?: string;\n isNetworkConnected?: boolean;\n networkReason?: string;\n /** Async wallet extension: URL for user to complete connection */\n userUrl?: string;\n}\n\n// ─── Network (CAIP-2) ────────────────────────────────────────────────────────\n\nexport interface CIP0103Network {\n /** CAIP-2 network identifier, e.g. \"canton:da-mainnet\" */\n networkId: string;\n /** JSON Ledger API endpoint (if available) */\n ledgerApi?: string;\n /** Access token for Ledger API (if available) */\n accessToken?: string;\n}\n\n// ─── Accounts ────────────────────────────────────────────────────────────────\n\nexport type CIP0103AccountStatus = 'initializing' | 'allocated';\n\nexport interface CIP0103Account {\n primary: boolean;\n partyId: string;\n status: CIP0103AccountStatus;\n hint: string;\n publicKey: string;\n namespace: string;\n /** CAIP-2 network identifier */\n networkId: string;\n signingProviderId: string;\n}\n\n// ─── Status ──────────────────────────────────────────────────────────────────\n\nexport type CIP0103ProviderType = 'browser' | 'desktop' | 'mobile' | 'remote';\n\nexport interface CIP0103ProviderInfo {\n id: string;\n /** dApp API version */\n version: string;\n providerType: CIP0103ProviderType;\n}\n\nexport interface CIP0103StatusEvent {\n connection: CIP0103ConnectResult;\n provider: CIP0103ProviderInfo;\n network?: CIP0103Network;\n session?: {\n accessToken: string;\n userId: string;\n };\n}\n\n// ─── Transaction Lifecycle ───────────────────────────────────────────────────\n\nexport type CIP0103TxStatus = 'pending' | 'signed' | 'executed' | 'failed';\n\nexport interface CIP0103TxPendingPayload {\n status: 'pending';\n commandId: string;\n}\n\nexport interface CIP0103TxSignedPayload {\n status: 'signed';\n commandId: string;\n payload: {\n signature: string;\n signedBy: string;\n party: string;\n };\n}\n\nexport interface CIP0103TxExecutedPayload {\n status: 'executed';\n commandId: string;\n payload: {\n updateId: string;\n completionOffset: number;\n };\n}\n\nexport interface CIP0103TxFailedPayload {\n status: 'failed';\n commandId: string;\n}\n\nexport type CIP0103TxChangedEvent =\n | CIP0103TxPendingPayload\n | CIP0103TxSignedPayload\n | CIP0103TxExecutedPayload\n | CIP0103TxFailedPayload;\n\n// ─── Ledger API ──────────────────────────────────────────────────────────────\n\nexport interface CIP0103LedgerApiRequest {\n requestMethod: 'GET' | 'POST' | 'PUT' | 'DELETE';\n resource: string;\n body?: string;\n}\n\nexport interface CIP0103LedgerApiResponse {\n response: string;\n}\n\n// ─── Sign Message ────────────────────────────────────────────────────────────\n\nexport interface CIP0103SignMessageRequest {\n message: string;\n}\n\n// ─── Error Model ─────────────────────────────────────────────────────────────\n\nexport interface CIP0103ProviderRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// ─── Canonical Method Names ──────────────────────────────────────────────────\n\nexport const CIP0103_METHODS = {\n CONNECT: 'connect',\n DISCONNECT: 'disconnect',\n IS_CONNECTED: 'isConnected',\n STATUS: 'status',\n GET_ACTIVE_NETWORK: 'getActiveNetwork',\n LIST_ACCOUNTS: 'listAccounts',\n GET_PRIMARY_ACCOUNT: 'getPrimaryAccount',\n SIGN_MESSAGE: 'signMessage',\n PREPARE_EXECUTE: 'prepareExecute',\n LEDGER_API: 'ledgerApi',\n} as const;\n\nexport type CIP0103Method = (typeof CIP0103_METHODS)[keyof typeof CIP0103_METHODS];\n\n/** All mandatory method names as an array (useful for conformance testing) */\nexport const CIP0103_MANDATORY_METHODS: readonly CIP0103Method[] = Object.values(CIP0103_METHODS);\n\n// ─── Canonical Event Names ───────────────────────────────────────────────────\n\nexport const CIP0103_EVENTS = {\n STATUS_CHANGED: 'statusChanged',\n ACCOUNTS_CHANGED: 'accountsChanged',\n TX_CHANGED: 'txChanged',\n /** Emitted when async connect completes */\n CONNECTED: 'connected',\n} as const;\n\nexport type CIP0103Event = (typeof CIP0103_EVENTS)[keyof typeof CIP0103_EVENTS];\n","/**\n * Deep Link Transport\n * \n * Opens a deep link URL (mobile) and awaits callback via redirect or postMessage.\n * \n * Security:\n * - State parameter (nonce) for CSRF protection\n * - Origin validation\n * - Timeout enforcement\n * - Callback origin allowlist\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * Deep link transport implementation\n */\nexport class DeepLinkTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Build deep link URL with query parameters\n */\n private buildDeepLinkUrl(\n baseUrl: string,\n request: ConnectRequest | SignRequest\n ): string {\n const url = new URL(baseUrl);\n Object.entries(request).forEach(([key, value]) => {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n url.searchParams.set(key, JSON.stringify(value));\n } else if (typeof value === 'object') {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n return url.toString();\n }\n\n /**\n * Validate callback origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Wait for callback via postMessage or redirect\n */\n private async waitForCallback<T extends { state: string }>(\n state: string,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === state) {\n cleanup();\n resolve(data as T);\n }\n };\n\n const redirectHandler = () => {\n // Check URL hash/fragment for callback data\n if (typeof window !== 'undefined') {\n const hash = window.location.hash.substring(1);\n const params = new URLSearchParams(hash);\n const callbackState = params.get('state');\n if (callbackState === state) {\n const data: T = {} as T;\n params.forEach((value, key) => {\n (data as Record<string, unknown>)[key] = value;\n });\n cleanup();\n resolve(data);\n }\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n window.removeEventListener('hashchange', redirectHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n window.addEventListener('hashchange', redirectHandler);\n // Also check current hash immediately\n redirectHandler();\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build deep link URL\n const deepLinkUrl = this.buildDeepLinkUrl(url, request);\n\n // Open deep link (mobile) or window (desktop fallback)\n if (typeof window !== 'undefined') {\n // Try to open deep link\n window.location.href = deepLinkUrl;\n\n // Fallback: open in new window if deep link fails\n // (This is a simulation - real mobile apps would handle the deep link)\n const fallbackWindow = window.open(deepLinkUrl, '_blank');\n if (!fallbackWindow) {\n throw new Error('Failed to open deep link');\n }\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000; // Default 60s\n const response = await this.waitForCallback<ConnectResponse>(\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build deep link URL\n const deepLinkUrl = this.buildDeepLinkUrl(url, request);\n\n // Open deep link\n if (typeof window !== 'undefined') {\n window.location.href = deepLinkUrl;\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<SignResponse>(\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * Popup Transport\n * \n * Opens a centered popup window and establishes a postMessage channel.\n * \n * Security:\n * - Origin validation\n * - State parameter validation\n * - Popup window management\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * Popup transport implementation\n */\nexport class PopupTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(\n baseUrl: string,\n request: ConnectRequest | SignRequest\n ): string {\n const url = new URL(baseUrl);\n Object.entries(request).forEach(([key, value]) => {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n url.searchParams.set(key, JSON.stringify(value));\n } else if (typeof value === 'object') {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n return url.toString();\n }\n\n /**\n * Validate message origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Open popup window\n */\n private openPopup(url: string, _options: TransportOptions): Window | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n return window.open(\n url,\n 'PartyLayer',\n `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`\n );\n }\n\n /**\n * Wait for postMessage callback\n */\n private async waitForCallback<T extends { state: string }>(\n popup: Window,\n state: string,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n popup.close();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n cleanup();\n reject(new Error('Popup closed by user'));\n }\n }, 500);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === state) {\n cleanup();\n popup.close();\n resolve(data as T);\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n clearInterval(checkClosed);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build URL\n const fullUrl = this.buildUrl(url, request);\n\n // Open popup\n const popup = this.openPopup(fullUrl, options);\n if (!popup) {\n throw new Error('Failed to open popup window');\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<ConnectResponse>(\n popup,\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Build URL\n const fullUrl = this.buildUrl(url, request);\n\n // Open popup\n const popup = this.openPopup(fullUrl, options);\n if (!popup) {\n throw new Error('Failed to open popup window');\n }\n\n // Wait for callback\n const timeout = options.timeoutMs || 60000;\n const response = await this.waitForCallback<SignResponse>(\n popup,\n request.state,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * PostMessage Transport\n * \n * Establishes a postMessage channel with an existing window/iframe.\n * \n * Security:\n * - Origin validation\n * - State parameter validation\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n} from './types';\n\n/**\n * PostMessage transport implementation\n */\nexport class PostMessageTransport implements Transport {\n /**\n * Generate a random state nonce\n */\n private generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Validate message origin\n */\n private validateOrigin(\n origin: string,\n options: TransportOptions\n ): void {\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\n if (!options.allowedOrigins.includes(origin)) {\n throw new Error(`Origin ${origin} not allowed`);\n }\n }\n }\n\n /**\n * Send message and wait for response\n */\n private async sendAndWait<T extends { state: string }>(\n target: Window,\n targetOrigin: string,\n message: ConnectRequest | SignRequest,\n options: TransportOptions,\n timeoutMs: number\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Transport timeout'));\n }, timeoutMs);\n\n const messageHandler = (event: MessageEvent) => {\n // Validate origin\n try {\n this.validateOrigin(event.origin, options);\n } catch (err) {\n return; // Ignore messages from disallowed origins\n }\n\n // Check if message matches our request\n const data = event.data as T & { type?: string };\n if (data && data.state === message.state) {\n cleanup();\n resolve(data as T);\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', messageHandler);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('message', messageHandler);\n target.postMessage(message, targetOrigin);\n }\n });\n }\n\n /**\n * Open a connection request\n */\n async openConnectRequest(\n url: string,\n request: ConnectRequest,\n options: TransportOptions\n ): Promise<ConnectResponse> {\n if (typeof window === 'undefined') {\n throw new Error('PostMessage transport requires browser environment');\n }\n\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Parse target origin from URL\n const targetUrl = new URL(url);\n const targetOrigin = targetUrl.origin;\n\n // Get target window (could be parent, opener, or specific iframe)\n // For now, assume we're communicating with parent/opener\n const target = (window.opener ?? window.parent) as Window | null;\n\n if (!target || target === window) {\n throw new Error('No target window available for postMessage');\n }\n\n // Send message and wait for response\n const timeout = options.timeoutMs || 60000;\n const response = await this.sendAndWait<ConnectResponse>(\n target,\n targetOrigin,\n request,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n\n /**\n * Open a sign request\n */\n async openSignRequest(\n url: string,\n request: SignRequest,\n options: TransportOptions\n ): Promise<SignResponse> {\n if (typeof window === 'undefined') {\n throw new Error('PostMessage transport requires browser environment');\n }\n\n // Ensure state is set\n if (!request.state) {\n request.state = this.generateState();\n }\n\n // Parse target origin from URL\n const targetUrl = new URL(url);\n const targetOrigin = targetUrl.origin;\n\n // Get target window\n const target = (window.opener ?? window.parent) as Window | null;\n\n if (!target || target === window) {\n throw new Error('No target window available for postMessage');\n }\n\n // Send message and wait for response\n const timeout = options.timeoutMs || 60000;\n const response = await this.sendAndWait<SignResponse>(\n target,\n targetOrigin,\n request,\n options,\n timeout\n );\n\n // Validate state matches\n if (response.state !== request.state) {\n throw new Error('State mismatch in callback');\n }\n\n return response;\n }\n}\n","/**\n * Mock Transport\n * \n * For testing and development. Simulates transport behavior without real network calls.\n */\n\nimport type {\n Transport,\n TransportOptions,\n ConnectRequest,\n ConnectResponse,\n SignRequest,\n SignResponse,\n JobStatus,\n} from './types';\nimport { toPartyId } from '../types';\n\n/**\n * Mock transport implementation\n */\nexport class MockTransport implements Transport {\n private mockResponses: Map<string, ConnectResponse | SignResponse> = new Map();\n private mockJobs: Map<string, JobStatus> = new Map();\n\n /**\n * Set mock response for a state\n */\n setMockResponse(state: string, response: ConnectResponse | SignResponse): void {\n this.mockResponses.set(state, response);\n }\n\n /**\n * Set mock job status\n */\n setMockJob(jobId: string, status: JobStatus): void {\n this.mockJobs.set(jobId, status);\n }\n\n /**\n * Clear all mocks\n */\n clearMocks(): void {\n this.mockResponses.clear();\n this.mockJobs.clear();\n }\n\n /**\n * Open a connection request (mock)\n */\n async openConnectRequest(\n _url: string,\n request: ConnectRequest,\n _options: TransportOptions\n ): Promise<ConnectResponse> {\n // Check for mock response\n const mockResponse = this.mockResponses.get(request.state);\n if (mockResponse && 'partyId' in mockResponse) {\n return mockResponse;\n }\n\n // Default mock response\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n state: request.state,\n partyId: toPartyId('mock-party-' + Date.now()),\n sessionToken: 'mock-token',\n expiresAt: Date.now() + 3600000, // 1 hour\n capabilities: request.requestedCapabilities || ['connect', 'signMessage'],\n });\n }, 100); // Simulate async delay\n });\n }\n\n /**\n * Open a sign request (mock)\n */\n async openSignRequest(\n _url: string,\n request: SignRequest,\n _options: TransportOptions\n ): Promise<SignResponse> {\n // Check for mock response\n const mockResponse = this.mockResponses.get(request.state);\n if (mockResponse && ('signature' in mockResponse || 'jobId' in mockResponse)) {\n return mockResponse;\n }\n\n // Default mock response\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n state: request.state,\n signature: 'mock-signature-' + Date.now(),\n transactionHash: request.transaction ? 'mock-tx-hash' : undefined,\n });\n }, 100);\n });\n }\n\n /**\n * Poll job status (mock)\n */\n pollJobStatus(\n jobId: string,\n _statusUrl: string,\n _options: TransportOptions\n ): Promise<JobStatus> {\n // Check for mock job\n const mockJob = this.mockJobs.get(jobId);\n if (mockJob) {\n return Promise.resolve(mockJob);\n }\n\n // Default mock: approved immediately\n return Promise.resolve({\n jobId,\n status: 'approved',\n result: {\n signature: 'mock-signature',\n transactionHash: 'mock-tx-hash',\n },\n });\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@partylayer/core",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Core types, errors, and abstractions for PartyLayer",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -15,6 +15,13 @@
|
|
|
15
15
|
"files": [
|
|
16
16
|
"dist"
|
|
17
17
|
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"clean": "rm -rf dist",
|
|
21
|
+
"lint": "eslint src --ext .ts",
|
|
22
|
+
"typecheck": "tsc --noEmit",
|
|
23
|
+
"test": "vitest"
|
|
24
|
+
},
|
|
18
25
|
"keywords": [
|
|
19
26
|
"canton",
|
|
20
27
|
"wallet",
|
|
@@ -35,12 +42,5 @@
|
|
|
35
42
|
"typescript": "^5.3.3",
|
|
36
43
|
"vitest": "^1.2.0",
|
|
37
44
|
"@vitest/ui": "^1.2.0"
|
|
38
|
-
},
|
|
39
|
-
"scripts": {
|
|
40
|
-
"build": "tsup",
|
|
41
|
-
"clean": "rm -rf dist",
|
|
42
|
-
"lint": "eslint src --ext .ts",
|
|
43
|
-
"typecheck": "tsc --noEmit",
|
|
44
|
-
"test": "vitest"
|
|
45
45
|
}
|
|
46
|
-
}
|
|
46
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 PartyLayer
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|