@canton-network/core-splice-client 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/scan-client.ts","../src/scan-proxy-client.ts","../src/validator-internal-client.ts"],"names":["createClient","rounds"],"mappings":";;;;;;;;;;;AAiDO,IAAM,aAAN,MAAiB;AAAA,EAIpB,WAAA,CAAY,OAAA,EAAiB,MAAA,EAAgB,KAAA,EAAgB;AAH7D,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AAGb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,EAAE,OAAA,EAAS,KAAA,IAAS,iCAAiC,CAAA;AACvE,IAAA,IAAA,CAAK,SAASA,6BAAA,CAAoB;AAAA,MAC9B,OAAA;AAAA,MACA,KAAA,EAAO,OAAO,GAAA,EAAkB,OAAA,GAAuB,EAAC,KAAM;AAC1D,QAAA,OAAO,MAAM,GAAA,EAAK;AAAA,UACd,GAAG,OAAA;AAAA,UACH,OAAA,EAAS;AAAA,YACL,GAAI,OAAA,CAAQ,OAAA,IAAW,EAAC;AAAA,YACxB,GAAI,QAAQ,EAAE,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA,KAAO,EAAC;AAAA,YACpD,cAAA,EAAgB;AAAA;AACpB,SACH,CAAA;AAAA,MACL;AAAA,KACH,CAAA;AAAA,EACL;AAAA,EAEA,MAAa,IAAA,CACT,IAAA,EACA,IAAA,EACA,MAAA,EAI2B;AAE3B,IAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAM,MAAA,EAAO;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE,WAAA,EAAa,MAAK,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACvD,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,WAAA,EAAa,IAAA,EAAM,UAAU,IAAA,EAAK,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAa,GAAA,CACT,IAAA,EACA,MAAA,EAI0B;AAE1B,IAAA,MAAM,OAAA,GAAU,EAAE,MAAA,EAAO;AAEzB,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,OAAO,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACR,EAAE,IAAA,EAAY,MAAA,EAAgB,QAAA,EAAU,IAAA,EAAK;AAAA,MAC7C,OAAO,IAAI,CAAA;AAAA,KACf;AACA,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAc,aAAgB,QAAA,EAGf;AACX,IAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAW;AAC7B,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAAA,IACxC,CAAA,MAAO;AACH,MAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,MAAa,uBAAA,GAAuD;AAChE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAExC,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA;AAAA,MACpB,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,YAAA,CAAa,SAAS,OAAO;AAAA,KACxD;AAEA,IAAA,MAAM,sBAAA,GACF,UAAA,EAAY,cAAA,EAAgB,YAAA,EAAc,yBAAA,EACpC,kBAAA;AACV,IAAA,MAAM,YAAA,GAAe,YAAY,cAAA,EAAgB,YAAA;AAEjD,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AACzB,MAAA,IAAI,YAAA,GAAe,MAAA;AACnB,MAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAC9B,QAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAC/C,QAAA,IAAI,MAAA,EAAQ,2BAA2B,kBAAA,EAAoB;AACvD,UAAA,YAAA,GACI,OAAO,yBAAA,CAA0B,kBAAA;AAAA,QACzC;AAAA,MACJ;AACA,MAAA,OAAO,YAAA,IAAgB,sBAAA;AAAA,IAC3B,OAAO,OAAO,sBAAA;AAAA,EAClB;AACJ;AC1FO,IAAM,gBAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EAuBzB,WAAA,CACI,OAAA,EACA,MAAA,EACA,OAAA,EACA,aACA,mBAAA,EACF;AA5BF,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,qBAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,aAAA,CAAA;AA0Bb,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,IAAA;AAC3B,IAAA,IAAA,CAAK,mBAAA,GAAsB,mBAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,OAAA,IAAW,6BAA6B,CAAA;AAC5D,IAAA,IAAA,CAAK,SAASA,6BAAAA,CAAoB;AAAA,MAC9B,SAAS,OAAA,CAAQ,IAAA;AAAA,MACjB,KAAA,EAAO,OAAO,GAAA,EAAkB,OAAA,GAAuB,EAAC,KAAM;AAC1D,QAAA,IAAI,KAAK,mBAAA,EAAqB;AAC1B,UAAA,WAAA,GAAc,OAAA,GACR,MAAM,IAAA,CAAK,mBAAA,CAAoB,qBAAoB,GACnD,MAAM,IAAA,CAAK,mBAAA,CAAoB,kBAAA,EAAmB;AAAA,QAC5D;AACA,QAAA,OAAO,MAAM,GAAA,EAAK;AAAA,UACd,GAAG,OAAA;AAAA,UACH,OAAA,EAAS;AAAA,YACL,GAAI,OAAA,CAAQ,OAAA,IAAW,EAAC;AAAA,YACxB,GAAI,cACE,EAAE,aAAA,EAAe,UAAU,WAAW,CAAA,CAAA,KACtC,EAAC;AAAA,YACP,cAAA,EAAgB;AAAA;AACpB,SACH,CAAA;AAAA,MACL;AAAA,KACH,CAAA;AAAA,EACL;AAAA,EAEA,MAAa,IAAA,CACT,IAAA,EACA,IAAA,EACA,MAAA,EAI2B;AAE3B,IAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAM,MAAA,EAAO;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE,WAAA,EAAa,MAAK,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACvD,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,WAAA,EAAa,IAAA,EAAM,UAAU,IAAA,EAAK,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAa,GAAA,CACT,IAAA,EACA,MAAA,EAI0B;AAE1B,IAAA,MAAM,OAAA,GAAU,EAAE,MAAA,EAAO;AAEzB,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,OAAO,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACR,EAAE,IAAA,EAAY,MAAA,EAAgB,QAAA,EAAU,IAAA,EAAK;AAAA,MAC7C,OAAO,IAAI,CAAA;AAAA,KACf;AACA,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAc,aAAgB,QAAA,EAGf;AACX,IAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAW;AAC7B,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAAA,IACxC,CAAA,MAAO;AACH,MAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,MAAc,oBAAA,GAA4D;AACtE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAAI,6BAA6B,CAAA;AACzD,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAc,QAAA;AACrC,IAAA,IAAI,CAAC,QAAA,EAAU,WAAA,IAAe,CAAC,UAAU,WAAA,EAAa;AAClD,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IACpD;AACA,IAAA,gBAAA,CAAgB,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AAC/D,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAEA,MAAa,cAAA,GAAsD;AAC/D,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAgB,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAA;AAEvD,IAAA,IAAI,MAAA,EAAQ,OAAO,eAAA,CAAgB,MAAM,CAAA;AAEzC,IAAA,IAAI,QAAA,GAAW,gBAAA,CAAgB,mBAAA,CAAoB,GAAA,CAAI,GAAG,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAA,EAAU;AACX,MAAA,QAAA,GAAW,IAAA,CAAK,oBAAA,EAAqB,CAAE,OAAA,CAAQ,MAAM;AACjD,QAAA,gBAAA,CAAgB,mBAAA,CAAoB,OAAO,GAAG,CAAA;AAAA,MAClD,CAAC,CAAA;AACD,MAAA,gBAAA,CAAgB,mBAAA,CAAoB,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,WAAW,MAAM,QAAA;AACvB,IAAA,OAAO,gBAAgB,QAAQ,CAAA;AAAA,EACnC;AAAA,EAEA,OAAc,2BAA2B,OAAA,EAAc;AACnD,IAAA,MAAM,MAAM,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,GAAG,CAAA;AAChC,IAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,GAAG,CAAA;AAAA,EACvC;AAAA,EAEQ,oBAAoB,MAAA,EAA8C;AACtE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,OAAO,MAAA,CAAO,iBAAA;AAElB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,MAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,KAAA,CAAM,WAAW,EAAC;AACtD,MAAA,MAAM,SAAS,OAAA,GAAU,MAAA,CAAO,IAAI,IAAA,CAAK,OAAO,CAAC,CAAA,GAAI,GAAA;AACrD,MAAA,MAAM,UAAU,cAAA,GACV,MAAA,CAAO,IAAI,IAAA,CAAK,cAAc,CAAC,CAAA,GAC/B,GAAA;AAEN,MAAA,IAAI,OAAO,QAAA,CAAS,MAAM,KAAK,MAAA,GAAS,GAAA,IAAO,SAAS,IAAA,EAAM;AAC1D,QAAA,IAAA,GAAO,MAAA;AAAA,MACX;AACA,MAAA,IAAI,OAAO,QAAA,CAAS,OAAO,KAAK,OAAA,GAAU,GAAA,IAAO,UAAU,IAAA,EAAM;AAC7D,QAAA,IAAA,GAAO,OAAA;AAAA,MACX;AAAA,IACJ;AAGA,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA,GAAO,GAAA;AAAA,EAC1C;AAAA,EAEA,MAAc,yBAAA,GAEZ;AACE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA;AAAA,MACpB;AAAA,KACJ;AACA,IAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,kBAAA,IAAsB,EAAC,EAAG,GAAA;AAAA,MAC3C,CAAC,MAAM,CAAA,CAAE;AAAA,KACb;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AACjB,IAAA,gBAAA,CAAgB,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAC3C,IAAA,gBAAA,CAAgB,kBAAA,CAAmB,GAAA;AAAA,MAC/B,GAAA;AAAA,MACA,IAAA,CAAK,oBAAoB,MAAM;AAAA,KACnC;AACA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,MAAc,cACV,GAAA,EACqC;AACrC,IAAA,IAAI,QAAA,GAAW,gBAAA,CAAgB,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AACrD,IAAA,IAAI,CAAC,QAAA,EAAU;AACX,MAAA,QAAA,GAAW,IAAA,CAAK,yBAAA,EAA0B,CAAE,OAAA,CAAQ,MAAM;AACtD,QAAA,gBAAA,CAAgB,cAAA,CAAe,OAAO,GAAG,CAAA;AAAA,MAC7C,CAAC,CAAA;AACD,MAAA,gBAAA,CAAgB,cAAA,CAAe,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAEA,MAAa,mBAAA,GAA6D;AACtE,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AACjB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAgB,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,gBAAA,CAAgB,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA;AAEvD,IAAA,IAAI,MAAA,IAAU,IAAA,KAAS,MAAA,IAAa,GAAA,GAAM,IAAA,EAAM;AAC5C,MAAA,OAAO,gBAAgB,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA;AAC1C,IAAA,OAAO,gBAAgB,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,MAAa,wBAAA,GAEX;AACE,IAAA,MAAM,aAAa,CACfC,OAAAA,EACA,cAEAA,OAAAA,CACK,MAAA,CAAO,CAAC,KAAA,KAAU;AACf,MAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,KAAA,CAAM,OAAA;AAC1C,MAAA,MAAM,SAAS,OAAA,GAAU,MAAA,CAAO,IAAI,IAAA,CAAK,OAAO,CAAC,CAAA,GAAI,GAAA;AACrD,MAAA,MAAM,UAAU,cAAA,GACV,MAAA,CAAO,IAAI,IAAA,CAAK,cAAc,CAAC,CAAA,GAC/B,GAAA;AACN,MAAA,OACI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IACtB,MAAA,CAAO,SAAS,OAAO,CAAA,IACvB,MAAA,IAAU,SAAA,IACV,SAAA,GAAY,OAAA;AAAA,IAEpB,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,OAAA,GAAU,EAAE,OAAA,CAAQ,OAAO,CAAA,CACpD,EAAA,CAAG,EAAE,CAAA,IAAK,IAAA;AAEnB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,mBAAA,EAAoB;AAC9C,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAA;AACrC,IAAA,OAAO,MAAA,GAAS,eAAA,CAAgB,MAAM,CAAA,GAAI,IAAA;AAAA,EAC9C;AAAA,EAEA,OAAc,gCAAgC,OAAA,EAAc;AACxD,IAAA,MAAM,MAAM,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAC3B,IAAA,IAAA,CAAK,cAAA,CAAe,OAAO,GAAG,CAAA;AAC9B,IAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,GAAG,CAAA;AAAA,EACtC;AAAA,EAEA,MAAa,uBAAA,GAAuD;AAchE,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,EAAe;AAC9C,IAAA,MAAM,aAAa,WAAA,CAAY,OAAA;AAE/B,IAAA,MAAM,sBAAA,GACF,UAAA,EAAY,cAAA,EAAgB,YAAA,EAAc,yBAAA,EACpC,kBAAA;AACV,IAAA,MAAM,YAAA,GAAe,YAAY,cAAA,EAAgB,YAAA;AAEjD,IAAA,IAAI,MAAM,OAAA,CAAQ,YAAY,CAAA,IAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AACxD,MAAA,IAAI,YAAA,GAAmC,MAAA;AACvC,MAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAC9B,QAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAC/C,QAAA,IAAI,MAAA,EAAQ,2BAA2B,kBAAA,EAAoB;AACvD,UAAA,YAAA,GACI,OAAO,yBAAA,CAA0B,kBAAA;AAAA,QACzC;AAAA,MACJ;AACA,MAAA,OAAO,YAAA,IAAgB,sBAAA;AAAA,IAC3B,OAAO,OAAO,sBAAA;AAAA,EAClB;AACJ,CAAA;AAAA;AA7QI,aAAA,CANS,gBAAA,EAMM,kBAAA,kBAAmB,IAAI,GAAA,EAGpC,CAAA;AACF,aAAA,CAVS,gBAAA,EAUM,aAAA,kBAAc,IAAI,GAAA,EAA0C,CAAA;AAAA;AAE3E,aAAA,CAZS,gBAAA,EAYM,qBAAA,kBAAsB,IAAI,GAAA,EAGvC,CAAA;AACF,aAAA,CAhBS,gBAAA,EAgBM,gBAAA,kBAAiB,IAAI,GAAA,EAGlC,CAAA;AAAA;AAEF,aAAA,CArBS,gBAAA,EAqBM,oBAAA,kBAAqB,IAAI,GAAA,EAAoB,CAAA;AArBzD,IAAM,eAAA,GAAN;ACFA,IAAM,0BAAN,MAA8B;AAAA,EAKjC,WAAA,CACI,OAAA,EACA,MAAA,EACA,OAAA,EACA,aACA,mBAAA,EACF;AAVF,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAQ,qBAAA,CAAA;AASJ,IAAA,IAAA,CAAK,mBAAA,GAAsB,mBAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,OAAA,IAAW,qCAAqC,CAAA;AACpE,IAAA,IAAA,CAAK,SAASD,6BAAAA,CAAoB;AAAA,MAC9B,SAAS,OAAA,CAAQ,IAAA;AAAA,MACjB,KAAA,EAAO,OAAO,GAAA,EAAkB,OAAA,GAAuB,EAAC,KAAM;AAC1D,QAAA,IAAI,KAAK,mBAAA,EAAqB;AAC1B,UAAA,WAAA,GAAc,OAAA,GACR,MAAM,IAAA,CAAK,mBAAA,CAAoB,qBAAoB,GACnD,MAAM,IAAA,CAAK,mBAAA,CAAoB,kBAAA,EAAmB;AAAA,QAC5D;AACA,QAAA,OAAO,MAAM,GAAA,EAAK;AAAA,UACd,GAAG,OAAA;AAAA,UACH,OAAA,EAAS;AAAA,YACL,GAAI,OAAA,CAAQ,OAAA,IAAW,EAAC;AAAA,YACxB,GAAI,cACE,EAAE,aAAA,EAAe,UAAU,WAAW,CAAA,CAAA,KACtC,EAAC;AAAA,YACP,cAAA,EAAgB;AAAA;AACpB,SACH,CAAA;AAAA,MACL;AAAA,KACH,CAAA;AAAA,EACL;AAAA,EAEA,MAAa,IAAA,CACT,IAAA,EACA,IAAA,EACA,MAAA,EAI2B;AAE3B,IAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAM,MAAA,EAAO;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE,WAAA,EAAa,MAAK,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACvD,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,WAAA,EAAa,IAAA,EAAM,UAAU,IAAA,EAAK,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAa,GAAA,CACT,IAAA,EACA,MAAA,EAI0B;AAE1B,IAAA,MAAM,OAAA,GAAU,EAAE,MAAA,EAAO;AAEzB,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,OAAO,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACR,EAAE,IAAA,EAAY,MAAA,EAAgB,QAAA,EAAU,IAAA,EAAK;AAAA,MAC7C,OAAO,IAAI,CAAA;AAAA,KACf;AACA,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAc,aAAgB,QAAA,EAGf;AACX,IAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAW;AAC7B,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAAA,IACxC,CAAA,MAAO;AACH,MAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,IACxC;AAAA,EACJ;AACJ","file":"index.cjs","sourcesContent":["// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\n\nexport type ScanTypes = components['schemas']\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\ntype PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\ntype GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport class ScanClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n\n constructor(baseUrl: string, logger: Logger, token?: string) {\n this.logger = logger\n this.logger.debug({ baseUrl, token }, 'TokenStandardClient initialized')\n this.client = createClient<paths>({\n baseUrl,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n\n public async getAmuletSynchronizerId(): Promise<string | undefined> {\n const dsoInfo = await this.get('/v0/dso')\n\n const payloadObj = JSON.parse(\n JSON.stringify(dsoInfo.amulet_rules.contract.payload)\n )\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues as []\n\n if (futureValues.length > 0) {\n let updatedValue = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan-proxy'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\nexport type ScanProxyTypes = components['schemas']\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\ntype PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\ntype GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport class ScanProxyClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private readonly accessTokenProvider: AccessTokenProvider | undefined\n private readonly baseUrlHref: string\n // shared caches for all instances of ScanProxyClient\n private static amuletRulesCache = new Map<\n string,\n ScanProxyTypes['Contract']\n >()\n private static roundsCache = new Map<string, ScanProxyTypes['Contract'][]>()\n // one in-flight fetch per baseUrl for rules/rounds\n private static amuletRulesInflight = new Map<\n string,\n Promise<ScanProxyTypes['Contract']>\n >()\n private static roundsInflight = new Map<\n string,\n Promise<ScanProxyTypes['Contract'][]>\n >()\n // time after surpassing which mining rounds should be refreshed\n private static roundsNextChangeAt = new Map<string, number>()\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.baseUrlHref = baseUrl.href\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ScanProxyClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n\n private async fetchAmuletRulesOnce(): Promise<ScanProxyTypes['Contract']> {\n const resp = await this.get('/v0/scan-proxy/amulet-rules')\n const contract = resp?.amulet_rules?.contract\n if (!contract?.contract_id || !contract?.template_id) {\n throw new Error('Malformed AmuletRules response')\n }\n ScanProxyClient.amuletRulesCache.set(this.baseUrlHref, contract)\n return contract\n }\n\n public async getAmuletRules(): Promise<ScanProxyTypes['Contract']> {\n const key = this.baseUrlHref\n\n const cached = ScanProxyClient.amuletRulesCache.get(key)\n // clone to prevent external mutation of cache by object reference\n if (cached) return structuredClone(cached)\n\n let inflight = ScanProxyClient.amuletRulesInflight.get(key)\n if (!inflight) {\n inflight = this.fetchAmuletRulesOnce().finally(() => {\n ScanProxyClient.amuletRulesInflight.delete(key)\n })\n ScanProxyClient.amuletRulesInflight.set(key, inflight)\n }\n\n const contract = await inflight\n return structuredClone(contract)\n }\n\n public static invalidateAmuletRulesCache(baseUrl: URL) {\n const key = baseUrl.href\n this.amuletRulesCache.delete(key)\n this.amuletRulesInflight.delete(key)\n }\n\n private computeNextChangeAt(rounds: ScanProxyTypes['Contract'][]): number {\n const now = Date.now()\n let next = Number.POSITIVE_INFINITY\n\n for (const round of rounds) {\n const { opensAt, targetClosesAt } = round.payload ?? {}\n const openMs = opensAt ? Number(new Date(opensAt)) : NaN\n const closeMs = targetClosesAt\n ? Number(new Date(targetClosesAt))\n : NaN\n\n if (Number.isFinite(openMs) && openMs > now && openMs < next) {\n next = openMs\n }\n if (Number.isFinite(closeMs) && closeMs > now && closeMs < next) {\n next = closeMs\n }\n }\n\n // If we couldn't parse anything sensible, force an immediate refresh.\n return Number.isFinite(next) ? next : now\n }\n\n private async fetchOpenMiningRoundsOnce(): Promise<\n ScanProxyTypes['Contract'][]\n > {\n const resp = await this.get(\n '/v0/scan-proxy/open-and-issuing-mining-rounds'\n )\n const rounds = (resp.open_mining_rounds ?? []).map(\n (x) => x.contract\n ) as ScanProxyTypes['Contract'][]\n\n const key = this.baseUrlHref\n ScanProxyClient.roundsCache.set(key, rounds)\n ScanProxyClient.roundsNextChangeAt.set(\n key,\n this.computeNextChangeAt(rounds)\n )\n return rounds\n }\n\n private async refreshRounds(\n key: string\n ): Promise<ScanProxyTypes['Contract'][]> {\n let inflight = ScanProxyClient.roundsInflight.get(key)\n if (!inflight) {\n inflight = this.fetchOpenMiningRoundsOnce().finally(() => {\n ScanProxyClient.roundsInflight.delete(key)\n })\n ScanProxyClient.roundsInflight.set(key, inflight)\n }\n return inflight\n }\n\n public async getOpenMiningRounds(): Promise<ScanProxyTypes['Contract'][]> {\n const key = this.baseUrlHref\n const now = Date.now()\n const cached = ScanProxyClient.roundsCache.get(key)\n const next = ScanProxyClient.roundsNextChangeAt.get(key)\n\n if (cached && next !== undefined && now < next) {\n return structuredClone(cached)\n }\n const fresh = await this.refreshRounds(key)\n return structuredClone(fresh)\n }\n\n public async getActiveOpenMiningRound(): Promise<\n ScanProxyTypes['Contract'] | null\n > {\n const pickActive = (\n rounds: ScanProxyTypes['Contract'][],\n timestamp: number\n ) =>\n rounds\n .filter((round) => {\n const { opensAt, targetClosesAt } = round.payload\n const openMs = opensAt ? Number(new Date(opensAt)) : NaN\n const closeMs = targetClosesAt\n ? Number(new Date(targetClosesAt))\n : NaN\n return (\n Number.isFinite(openMs) &&\n Number.isFinite(closeMs) &&\n openMs <= timestamp &&\n timestamp < closeMs\n )\n })\n .sort((a, b) => a.payload.opensAt - b.payload.opensAt)\n .at(-1) ?? null\n\n const now = Date.now()\n const rounds = await this.getOpenMiningRounds()\n const active = pickActive(rounds, now)\n return active ? structuredClone(active) : null\n }\n\n public static invalidateOpenMiningRoundsCache(baseUrl: URL) {\n const key = baseUrl.href\n this.roundsCache.delete(key)\n this.roundsInflight.delete(key)\n this.roundsNextChangeAt.delete(key)\n }\n\n public async getAmuletSynchronizerId(): Promise<string | undefined> {\n type FutureValue = {\n decentralizedSynchronizer?: {\n activeSynchronizer?: string\n }\n }\n\n type Payload = {\n configSchedule?: {\n initialValue?: FutureValue\n futureValues?: FutureValue[]\n }\n }\n\n const amuletRules = await this.getAmuletRules()\n const payloadObj = amuletRules.payload as Payload\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues\n\n if (Array.isArray(futureValues) && futureValues.length > 0) {\n let updatedValue: string | undefined = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { paths } from './generated-clients/validator-internal'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\ntype PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\ntype GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport class ValidatorInternalClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private accessTokenProvider: AccessTokenProvider | undefined\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ValidatorInternalClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/scan-client.ts","../src/scan-proxy-client.ts","../src/validator-internal-client.ts"],"names":["createClient","rounds"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\n\nexport type ScanTypes = components['schemas']\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\ntype PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\ntype GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport class ScanClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n\n constructor(baseUrl: string, logger: Logger, token?: string) {\n this.logger = logger\n this.logger.debug({ baseUrl, token }, 'TokenStandardClient initialized')\n this.client = createClient<paths>({\n baseUrl,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n\n public async getAmuletSynchronizerId(): Promise<string | undefined> {\n const dsoInfo = await this.get('/v0/dso')\n\n const payloadObj = JSON.parse(\n JSON.stringify(dsoInfo.amulet_rules.contract.payload)\n )\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues as []\n\n if (futureValues.length > 0) {\n let updatedValue = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan-proxy'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\nexport type ScanProxyTypes = components['schemas']\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\ntype PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\ntype GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport class ScanProxyClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private readonly accessTokenProvider: AccessTokenProvider | undefined\n private readonly baseUrlHref: string\n // shared caches for all instances of ScanProxyClient\n private static amuletRulesCache = new Map<\n string,\n ScanProxyTypes['Contract']\n >()\n private static roundsCache = new Map<string, ScanProxyTypes['Contract'][]>()\n // one in-flight fetch per baseUrl for rules/rounds\n private static amuletRulesInflight = new Map<\n string,\n Promise<ScanProxyTypes['Contract']>\n >()\n private static roundsInflight = new Map<\n string,\n Promise<ScanProxyTypes['Contract'][]>\n >()\n // time after surpassing which mining rounds should be refreshed\n private static roundsNextChangeAt = new Map<string, number>()\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.baseUrlHref = baseUrl.href\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ScanProxyClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n\n private async fetchAmuletRulesOnce(): Promise<ScanProxyTypes['Contract']> {\n const resp = await this.get('/v0/scan-proxy/amulet-rules')\n const contract = resp?.amulet_rules?.contract\n if (!contract?.contract_id || !contract?.template_id) {\n throw new Error('Malformed AmuletRules response')\n }\n ScanProxyClient.amuletRulesCache.set(this.baseUrlHref, contract)\n return contract\n }\n\n public async getAmuletRules(): Promise<ScanProxyTypes['Contract']> {\n const key = this.baseUrlHref\n\n const cached = ScanProxyClient.amuletRulesCache.get(key)\n // clone to prevent external mutation of cache by object reference\n if (cached) return structuredClone(cached)\n\n let inflight = ScanProxyClient.amuletRulesInflight.get(key)\n if (!inflight) {\n inflight = this.fetchAmuletRulesOnce().finally(() => {\n ScanProxyClient.amuletRulesInflight.delete(key)\n })\n ScanProxyClient.amuletRulesInflight.set(key, inflight)\n }\n\n const contract = await inflight\n return structuredClone(contract)\n }\n\n public static invalidateAmuletRulesCache(baseUrl: URL) {\n const key = baseUrl.href\n this.amuletRulesCache.delete(key)\n this.amuletRulesInflight.delete(key)\n }\n\n private computeNextChangeAt(rounds: ScanProxyTypes['Contract'][]): number {\n const now = Date.now()\n let next = Number.POSITIVE_INFINITY\n\n for (const round of rounds) {\n const { opensAt, targetClosesAt } = round.payload ?? {}\n const openMs = opensAt ? Number(new Date(opensAt)) : NaN\n const closeMs = targetClosesAt\n ? Number(new Date(targetClosesAt))\n : NaN\n\n if (Number.isFinite(openMs) && openMs > now && openMs < next) {\n next = openMs\n }\n if (Number.isFinite(closeMs) && closeMs > now && closeMs < next) {\n next = closeMs\n }\n }\n\n // If we couldn't parse anything sensible, force an immediate refresh.\n return Number.isFinite(next) ? next : now\n }\n\n private async fetchOpenMiningRoundsOnce(): Promise<\n ScanProxyTypes['Contract'][]\n > {\n const resp = await this.get(\n '/v0/scan-proxy/open-and-issuing-mining-rounds'\n )\n const rounds = (resp.open_mining_rounds ?? []).map(\n (x) => x.contract\n ) as ScanProxyTypes['Contract'][]\n\n const key = this.baseUrlHref\n ScanProxyClient.roundsCache.set(key, rounds)\n ScanProxyClient.roundsNextChangeAt.set(\n key,\n this.computeNextChangeAt(rounds)\n )\n return rounds\n }\n\n private async refreshRounds(\n key: string\n ): Promise<ScanProxyTypes['Contract'][]> {\n let inflight = ScanProxyClient.roundsInflight.get(key)\n if (!inflight) {\n inflight = this.fetchOpenMiningRoundsOnce().finally(() => {\n ScanProxyClient.roundsInflight.delete(key)\n })\n ScanProxyClient.roundsInflight.set(key, inflight)\n }\n return inflight\n }\n\n public async getOpenMiningRounds(): Promise<ScanProxyTypes['Contract'][]> {\n const key = this.baseUrlHref\n const now = Date.now()\n const cached = ScanProxyClient.roundsCache.get(key)\n const next = ScanProxyClient.roundsNextChangeAt.get(key)\n\n if (cached && next !== undefined && now < next) {\n return structuredClone(cached)\n }\n const fresh = await this.refreshRounds(key)\n return structuredClone(fresh)\n }\n\n public async getActiveOpenMiningRound(): Promise<\n ScanProxyTypes['Contract'] | null\n > {\n const pickActive = (\n rounds: ScanProxyTypes['Contract'][],\n timestamp: number\n ) =>\n rounds\n .filter((round) => {\n const { opensAt, targetClosesAt } = round.payload\n const openMs = opensAt ? Number(new Date(opensAt)) : NaN\n const closeMs = targetClosesAt\n ? Number(new Date(targetClosesAt))\n : NaN\n return (\n Number.isFinite(openMs) &&\n Number.isFinite(closeMs) &&\n openMs <= timestamp &&\n timestamp < closeMs\n )\n })\n .sort((a, b) => a.payload.opensAt - b.payload.opensAt)\n .at(-1) ?? null\n\n const now = Date.now()\n const rounds = await this.getOpenMiningRounds()\n const active = pickActive(rounds, now)\n return active ? structuredClone(active) : null\n }\n\n public static invalidateOpenMiningRoundsCache(baseUrl: URL) {\n const key = baseUrl.href\n this.roundsCache.delete(key)\n this.roundsInflight.delete(key)\n this.roundsNextChangeAt.delete(key)\n }\n\n public async getAmuletSynchronizerId(): Promise<string | undefined> {\n type FutureValue = {\n decentralizedSynchronizer?: {\n activeSynchronizer?: string\n }\n }\n\n type Payload = {\n configSchedule?: {\n initialValue?: FutureValue\n futureValues?: FutureValue[]\n }\n }\n\n const amuletRules = await this.getAmuletRules()\n const payloadObj = amuletRules.payload as Payload\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues\n\n if (Array.isArray(futureValues) && futureValues.length > 0) {\n let updatedValue: string | undefined = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { paths } from './generated-clients/validator-internal'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\ntype PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\ntype GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport class ValidatorInternalClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private accessTokenProvider: AccessTokenProvider | undefined\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ValidatorInternalClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n}\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/scan-client.ts","../src/scan-proxy-client.ts","../src/validator-internal-client.ts"],"names":["createClient","rounds"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\n\nexport type ScanTypes = components['schemas']\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\ntype PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\ntype GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport class ScanClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n\n constructor(baseUrl: string, logger: Logger, token?: string) {\n this.logger = logger\n this.logger.debug({ baseUrl, token }, 'TokenStandardClient initialized')\n this.client = createClient<paths>({\n baseUrl,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n\n public async getAmuletSynchronizerId(): Promise<string | undefined> {\n const dsoInfo = await this.get('/v0/dso')\n\n const payloadObj = JSON.parse(\n JSON.stringify(dsoInfo.amulet_rules.contract.payload)\n )\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues as []\n\n if (futureValues.length > 0) {\n let updatedValue = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan-proxy'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\nexport type ScanProxyTypes = components['schemas']\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\ntype PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\ntype GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport class ScanProxyClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private readonly accessTokenProvider: AccessTokenProvider | undefined\n private readonly baseUrlHref: string\n // shared caches for all instances of ScanProxyClient\n private static amuletRulesCache = new Map<\n string,\n ScanProxyTypes['Contract']\n >()\n private static roundsCache = new Map<string, ScanProxyTypes['Contract'][]>()\n // one in-flight fetch per baseUrl for rules/rounds\n private static amuletRulesInflight = new Map<\n string,\n Promise<ScanProxyTypes['Contract']>\n >()\n private static roundsInflight = new Map<\n string,\n Promise<ScanProxyTypes['Contract'][]>\n >()\n // time after surpassing which mining rounds should be refreshed\n private static roundsNextChangeAt = new Map<string, number>()\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.baseUrlHref = baseUrl.href\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ScanProxyClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n\n private async fetchAmuletRulesOnce(): Promise<ScanProxyTypes['Contract']> {\n const resp = await this.get('/v0/scan-proxy/amulet-rules')\n const contract = resp?.amulet_rules?.contract\n if (!contract?.contract_id || !contract?.template_id) {\n throw new Error('Malformed AmuletRules response')\n }\n ScanProxyClient.amuletRulesCache.set(this.baseUrlHref, contract)\n return contract\n }\n\n public async getAmuletRules(): Promise<ScanProxyTypes['Contract']> {\n const key = this.baseUrlHref\n\n const cached = ScanProxyClient.amuletRulesCache.get(key)\n // clone to prevent external mutation of cache by object reference\n if (cached) return structuredClone(cached)\n\n let inflight = ScanProxyClient.amuletRulesInflight.get(key)\n if (!inflight) {\n inflight = this.fetchAmuletRulesOnce().finally(() => {\n ScanProxyClient.amuletRulesInflight.delete(key)\n })\n ScanProxyClient.amuletRulesInflight.set(key, inflight)\n }\n\n const contract = await inflight\n return structuredClone(contract)\n }\n\n public static invalidateAmuletRulesCache(baseUrl: URL) {\n const key = baseUrl.href\n this.amuletRulesCache.delete(key)\n this.amuletRulesInflight.delete(key)\n }\n\n private computeNextChangeAt(rounds: ScanProxyTypes['Contract'][]): number {\n const now = Date.now()\n let next = Number.POSITIVE_INFINITY\n\n for (const round of rounds) {\n const { opensAt, targetClosesAt } = round.payload ?? {}\n const openMs = opensAt ? Number(new Date(opensAt)) : NaN\n const closeMs = targetClosesAt\n ? Number(new Date(targetClosesAt))\n : NaN\n\n if (Number.isFinite(openMs) && openMs > now && openMs < next) {\n next = openMs\n }\n if (Number.isFinite(closeMs) && closeMs > now && closeMs < next) {\n next = closeMs\n }\n }\n\n // If we couldn't parse anything sensible, force an immediate refresh.\n return Number.isFinite(next) ? next : now\n }\n\n private async fetchOpenMiningRoundsOnce(): Promise<\n ScanProxyTypes['Contract'][]\n > {\n const resp = await this.get(\n '/v0/scan-proxy/open-and-issuing-mining-rounds'\n )\n const rounds = (resp.open_mining_rounds ?? []).map(\n (x) => x.contract\n ) as ScanProxyTypes['Contract'][]\n\n const key = this.baseUrlHref\n ScanProxyClient.roundsCache.set(key, rounds)\n ScanProxyClient.roundsNextChangeAt.set(\n key,\n this.computeNextChangeAt(rounds)\n )\n return rounds\n }\n\n private async refreshRounds(\n key: string\n ): Promise<ScanProxyTypes['Contract'][]> {\n let inflight = ScanProxyClient.roundsInflight.get(key)\n if (!inflight) {\n inflight = this.fetchOpenMiningRoundsOnce().finally(() => {\n ScanProxyClient.roundsInflight.delete(key)\n })\n ScanProxyClient.roundsInflight.set(key, inflight)\n }\n return inflight\n }\n\n public async getOpenMiningRounds(): Promise<ScanProxyTypes['Contract'][]> {\n const key = this.baseUrlHref\n const now = Date.now()\n const cached = ScanProxyClient.roundsCache.get(key)\n const next = ScanProxyClient.roundsNextChangeAt.get(key)\n\n if (cached && next !== undefined && now < next) {\n return structuredClone(cached)\n }\n const fresh = await this.refreshRounds(key)\n return structuredClone(fresh)\n }\n\n public async getActiveOpenMiningRound(): Promise<\n ScanProxyTypes['Contract'] | null\n > {\n const pickActive = (\n rounds: ScanProxyTypes['Contract'][],\n timestamp: number\n ) =>\n rounds\n .filter((round) => {\n const { opensAt, targetClosesAt } = round.payload\n const openMs = opensAt ? Number(new Date(opensAt)) : NaN\n const closeMs = targetClosesAt\n ? Number(new Date(targetClosesAt))\n : NaN\n return (\n Number.isFinite(openMs) &&\n Number.isFinite(closeMs) &&\n openMs <= timestamp &&\n timestamp < closeMs\n )\n })\n .sort((a, b) => a.payload.opensAt - b.payload.opensAt)\n .at(-1) ?? null\n\n const now = Date.now()\n const rounds = await this.getOpenMiningRounds()\n const active = pickActive(rounds, now)\n return active ? structuredClone(active) : null\n }\n\n public static invalidateOpenMiningRoundsCache(baseUrl: URL) {\n const key = baseUrl.href\n this.roundsCache.delete(key)\n this.roundsInflight.delete(key)\n this.roundsNextChangeAt.delete(key)\n }\n\n public async getAmuletSynchronizerId(): Promise<string | undefined> {\n type FutureValue = {\n decentralizedSynchronizer?: {\n activeSynchronizer?: string\n }\n }\n\n type Payload = {\n configSchedule?: {\n initialValue?: FutureValue\n futureValues?: FutureValue[]\n }\n }\n\n const amuletRules = await this.getAmuletRules()\n const payloadObj = amuletRules.payload as Payload\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues\n\n if (Array.isArray(futureValues) && futureValues.length > 0) {\n let updatedValue: string | undefined = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { paths } from './generated-clients/validator-internal'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\ntype PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\ntype GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport class ValidatorInternalClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private accessTokenProvider: AccessTokenProvider | undefined\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ValidatorInternalClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/scan-client.ts","../src/scan-proxy-client.ts","../src/validator-internal-client.ts"],"names":["createClient","rounds"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\n\nexport type ScanTypes = components['schemas']\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\ntype PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\ntype GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport class ScanClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n\n constructor(baseUrl: string, logger: Logger, token?: string) {\n this.logger = logger\n this.logger.debug({ baseUrl, token }, 'TokenStandardClient initialized')\n this.client = createClient<paths>({\n baseUrl,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n\n public async getAmuletSynchronizerId(): Promise<string | undefined> {\n const dsoInfo = await this.get('/v0/dso')\n\n const payloadObj = JSON.parse(\n JSON.stringify(dsoInfo.amulet_rules.contract.payload)\n )\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues as []\n\n if (futureValues.length > 0) {\n let updatedValue = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan-proxy'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\nexport type ScanProxyTypes = components['schemas']\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\ntype PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\ntype GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport class ScanProxyClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private readonly accessTokenProvider: AccessTokenProvider | undefined\n private readonly baseUrlHref: string\n // shared caches for all instances of ScanProxyClient\n private static amuletRulesCache = new Map<\n string,\n ScanProxyTypes['Contract']\n >()\n private static roundsCache = new Map<string, ScanProxyTypes['Contract'][]>()\n // one in-flight fetch per baseUrl for rules/rounds\n private static amuletRulesInflight = new Map<\n string,\n Promise<ScanProxyTypes['Contract']>\n >()\n private static roundsInflight = new Map<\n string,\n Promise<ScanProxyTypes['Contract'][]>\n >()\n // time after surpassing which mining rounds should be refreshed\n private static roundsNextChangeAt = new Map<string, number>()\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.baseUrlHref = baseUrl.href\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ScanProxyClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n\n private async fetchAmuletRulesOnce(): Promise<ScanProxyTypes['Contract']> {\n const resp = await this.get('/v0/scan-proxy/amulet-rules')\n const contract = resp?.amulet_rules?.contract\n if (!contract?.contract_id || !contract?.template_id) {\n throw new Error('Malformed AmuletRules response')\n }\n ScanProxyClient.amuletRulesCache.set(this.baseUrlHref, contract)\n return contract\n }\n\n public async getAmuletRules(): Promise<ScanProxyTypes['Contract']> {\n const key = this.baseUrlHref\n\n const cached = ScanProxyClient.amuletRulesCache.get(key)\n // clone to prevent external mutation of cache by object reference\n if (cached) return structuredClone(cached)\n\n let inflight = ScanProxyClient.amuletRulesInflight.get(key)\n if (!inflight) {\n inflight = this.fetchAmuletRulesOnce().finally(() => {\n ScanProxyClient.amuletRulesInflight.delete(key)\n })\n ScanProxyClient.amuletRulesInflight.set(key, inflight)\n }\n\n const contract = await inflight\n return structuredClone(contract)\n }\n\n public static invalidateAmuletRulesCache(baseUrl: URL) {\n const key = baseUrl.href\n this.amuletRulesCache.delete(key)\n this.amuletRulesInflight.delete(key)\n }\n\n private computeNextChangeAt(rounds: ScanProxyTypes['Contract'][]): number {\n const now = Date.now()\n let next = Number.POSITIVE_INFINITY\n\n for (const round of rounds) {\n const { opensAt, targetClosesAt } = round.payload ?? {}\n const openMs = opensAt ? Number(new Date(opensAt)) : NaN\n const closeMs = targetClosesAt\n ? Number(new Date(targetClosesAt))\n : NaN\n\n if (Number.isFinite(openMs) && openMs > now && openMs < next) {\n next = openMs\n }\n if (Number.isFinite(closeMs) && closeMs > now && closeMs < next) {\n next = closeMs\n }\n }\n\n // If we couldn't parse anything sensible, force an immediate refresh.\n return Number.isFinite(next) ? next : now\n }\n\n private async fetchOpenMiningRoundsOnce(): Promise<\n ScanProxyTypes['Contract'][]\n > {\n const resp = await this.get(\n '/v0/scan-proxy/open-and-issuing-mining-rounds'\n )\n const rounds = (resp.open_mining_rounds ?? []).map(\n (x) => x.contract\n ) as ScanProxyTypes['Contract'][]\n\n const key = this.baseUrlHref\n ScanProxyClient.roundsCache.set(key, rounds)\n ScanProxyClient.roundsNextChangeAt.set(\n key,\n this.computeNextChangeAt(rounds)\n )\n return rounds\n }\n\n private async refreshRounds(\n key: string\n ): Promise<ScanProxyTypes['Contract'][]> {\n let inflight = ScanProxyClient.roundsInflight.get(key)\n if (!inflight) {\n inflight = this.fetchOpenMiningRoundsOnce().finally(() => {\n ScanProxyClient.roundsInflight.delete(key)\n })\n ScanProxyClient.roundsInflight.set(key, inflight)\n }\n return inflight\n }\n\n public async getOpenMiningRounds(): Promise<ScanProxyTypes['Contract'][]> {\n const key = this.baseUrlHref\n const now = Date.now()\n const cached = ScanProxyClient.roundsCache.get(key)\n const next = ScanProxyClient.roundsNextChangeAt.get(key)\n\n if (cached && next !== undefined && now < next) {\n return structuredClone(cached)\n }\n const fresh = await this.refreshRounds(key)\n return structuredClone(fresh)\n }\n\n public async getActiveOpenMiningRound(): Promise<\n ScanProxyTypes['Contract'] | null\n > {\n const pickActive = (\n rounds: ScanProxyTypes['Contract'][],\n timestamp: number\n ) =>\n rounds\n .filter((round) => {\n const { opensAt, targetClosesAt } = round.payload\n const openMs = opensAt ? Number(new Date(opensAt)) : NaN\n const closeMs = targetClosesAt\n ? Number(new Date(targetClosesAt))\n : NaN\n return (\n Number.isFinite(openMs) &&\n Number.isFinite(closeMs) &&\n openMs <= timestamp &&\n timestamp < closeMs\n )\n })\n .sort((a, b) => a.payload.opensAt - b.payload.opensAt)\n .at(-1) ?? null\n\n const now = Date.now()\n const rounds = await this.getOpenMiningRounds()\n const active = pickActive(rounds, now)\n return active ? structuredClone(active) : null\n }\n\n public static invalidateOpenMiningRoundsCache(baseUrl: URL) {\n const key = baseUrl.href\n this.roundsCache.delete(key)\n this.roundsInflight.delete(key)\n this.roundsNextChangeAt.delete(key)\n }\n\n public async getAmuletSynchronizerId(): Promise<string | undefined> {\n type FutureValue = {\n decentralizedSynchronizer?: {\n activeSynchronizer?: string\n }\n }\n\n type Payload = {\n configSchedule?: {\n initialValue?: FutureValue\n futureValues?: FutureValue[]\n }\n }\n\n const amuletRules = await this.getAmuletRules()\n const payloadObj = amuletRules.payload as Payload\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues\n\n if (Array.isArray(futureValues) && futureValues.length > 0) {\n let updatedValue: string | undefined = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { paths } from './generated-clients/validator-internal'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\ntype PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\ntype GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport class ValidatorInternalClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private accessTokenProvider: AccessTokenProvider | undefined\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ValidatorInternalClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@canton-network/core-splice-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Typescript Client for the multiple Canton Network APIs",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -23,11 +23,11 @@
|
|
|
23
23
|
"clean": "tsc -b --clean; rm -rf dist"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@canton-network/core-types": "^0.
|
|
27
|
-
"@canton-network/core-wallet-auth": "^0.
|
|
26
|
+
"@canton-network/core-types": "^0.16.0",
|
|
27
|
+
"@canton-network/core-wallet-auth": "^0.17.0",
|
|
28
28
|
"openapi-fetch": "^0.15.0",
|
|
29
29
|
"uuid": "^11.1.0",
|
|
30
|
-
"zod": "^4.
|
|
30
|
+
"zod": "^4.3.5"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"tsup": "^8.5.1",
|