opacity-issuer-core 0.2.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/LICENSE +21 -0
- package/README.md +44 -0
- package/dist/chunk-2STMWRIV.js +164 -0
- package/dist/chunk-2STMWRIV.js.map +1 -0
- package/dist/chunk-3L7NNVUV.cjs +184 -0
- package/dist/chunk-3L7NNVUV.cjs.map +1 -0
- package/dist/chunk-54Q3MU62.js +29 -0
- package/dist/chunk-54Q3MU62.js.map +1 -0
- package/dist/chunk-7ODYBEZH.js +889 -0
- package/dist/chunk-7ODYBEZH.js.map +1 -0
- package/dist/chunk-GMPQFX25.cjs +923 -0
- package/dist/chunk-GMPQFX25.cjs.map +1 -0
- package/dist/chunk-HJQZWNZJ.cjs +33 -0
- package/dist/chunk-HJQZWNZJ.cjs.map +1 -0
- package/dist/documents/index.cjs +170 -0
- package/dist/documents/index.cjs.map +1 -0
- package/dist/documents/index.d.cts +1370 -0
- package/dist/documents/index.d.ts +1370 -0
- package/dist/documents/index.js +5 -0
- package/dist/documents/index.js.map +1 -0
- package/dist/documents/validate.cjs +53 -0
- package/dist/documents/validate.cjs.map +1 -0
- package/dist/documents/validate.d.cts +70 -0
- package/dist/documents/validate.d.ts +70 -0
- package/dist/documents/validate.js +4 -0
- package/dist/documents/validate.js.map +1 -0
- package/dist/index.cjs +8917 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +11088 -0
- package/dist/index.d.ts +11088 -0
- package/dist/index.js +8647 -0
- package/dist/index.js.map +1 -0
- package/dist/subgraph.cjs +891 -0
- package/dist/subgraph.cjs.map +1 -0
- package/dist/subgraph.d.cts +456 -0
- package/dist/subgraph.d.ts +456 -0
- package/dist/subgraph.js +882 -0
- package/dist/subgraph.js.map +1 -0
- package/dist/transport-0_X4HTI6.d.ts +39 -0
- package/dist/transport-uaC5Yl3p.d.cts +39 -0
- package/dist/types-B4Yi7WA4.d.cts +108 -0
- package/dist/types-B4Yi7WA4.d.ts +108 -0
- package/package.json +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/indexer/errors.ts","../src/indexer/executor.ts","../src/indexer/arguments.ts","../src/indexer/index.ts","../src/indexer/wire.ts","../src/indexer/client.ts"],"names":["options","invalid","uint","address","bytes32","object","blockNumber","page","vault","meta","record"],"mappings":";;;AAgBO,IAAM,mBAAA,GAAN,cAAkC,kBAAA,CAAmB;AAAA,EAC1D,WAAA,CACW,IAAA,EACT,OAAA,EACAA,QAAAA,EACA;AACA,IAAA,KAAA,CAAM,SAASA,QAAO,CAAA;AAJb,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAKT,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AAAA,EANW,IAAA;AAOb;;;ACXO,SAAS,oBAAoB,GAAA,EAAmB;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,IAAI,CAAC,CAAC,OAAA,EAAS,QAAQ,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,IAAK,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA;AAC9E,MAAA,MAAM,IAAI,MAAM,aAAa,CAAA;AAAA,EACjC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,kBAAA;AAAA,MACA,6DAAA;AAAA,MACA,EAAE,KAAA;AAAM,KACV;AAAA,EACF;AACF;AAGO,SAAS,sBAAsB,MAAA,EAA+B;AACnE,EAAA,MAAM,YAAY,MAAA,CAAO,KAAA,IAAS,UAAA,CAAW,KAAA,EAAO,KAAK,UAAU,CAAA;AACnE,EAAA,IAAI,MAAA,CAAO,GAAA,EAAK,mBAAA,CAAoB,MAAA,CAAO,GAAG,CAAA;AAE9C,EAAA,OAAO,OACL,KAAA,EACA,SAAA,GAAqC,EAAC,EACtCA,QAAAA,GAAiC,EAAC,KACG;AACrC,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA;AACV,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,gBAAA;AAAA,QACA;AAAA,OACF;AACF,IAAA,IAAI,CAAC,SAAA;AACH,MAAA,MAAM,IAAI,mBAAA,CAAoB,gBAAA,EAAkB,qCAAqC,CAAA;AACvF,IAAA,MAAM,SAAA,GAAYA,QAAAA,CAAQ,SAAA,IAAa,MAAA,CAAO,SAAA,IAAa,GAAA;AAC3D,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA,IAAK,SAAA,IAAa,KAAK,SAAA,GAAY,UAAA;AAChE,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,kBAAA;AAAA,QACA;AAAA,OACF;AACF,IAAA,IAAIA,SAAQ,MAAA,EAAQ,OAAA;AAClB,MAAA,MAAM,IAAI,mBAAA,CAAoB,SAAA,EAAW,+CAA+C,CAAA;AAE1F,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,KAAA,EAAM;AACvC,IAAAA,QAAAA,CAAQ,QAAQ,gBAAA,CAAiB,OAAA,EAAS,SAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AACjE,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,GAAG,SAAS,CAAA;AACZ,IAAA,IAAI,YAAA;AACJ,IAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KACzB,IAAI,mBAAA;AAAA,MACF,WAAW,SAAA,GAAY,SAAA;AAAA,MACvB,WAAW,6BAAA,GAAgC,6BAAA;AAAA,MAC3C,EAAE,KAAA;AAAM,KACV;AACF,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AAChD,MAAA,YAAA,GAAe,MAAM,MAAA,CAAO,iBAAA,EAAmB,CAAA;AAC/C,MAAA,UAAA,CAAW,OAAO,gBAAA,CAAiB,OAAA,EAAS,cAAc,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IAC1E,CAAC,CAAA;AACD,IAAA,IAAI;AAEF,MAAA,OAAO,MAAM,QAAQ,IAAA,CAAK;AAAA,QAAA,CACvB,YAAY;AACX,UAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,MAAA,CAAO,GAAA,EAAM;AAAA,YAC5C,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS;AAAA,cACP,MAAA,EAAQ,kBAAA;AAAA,cACR,cAAA,EAAgB,kBAAA;AAAA,cAChB,GAAG,MAAA,CAAO;AAAA,aACZ;AAAA,YACA,WAAA,EAAa,MAAA;AAAA,YACb,QAAQ,UAAA,CAAW,MAAA;AAAA,YACnB,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,WAAW;AAAA,WAC1C,CAAA;AACD,UAAA,IAAI,CAAC,QAAA,CAAS,EAAA;AACZ,YAAA,MAAM,IAAI,mBAAA,CAAoB,MAAA,EAAQ,CAAA,uBAAA,EAA0B,QAAA,CAAS,MAAM,CAAA,CAAA,CAAG,CAAA;AACpF,UAAA,MAAM,OAAA,GAAmB,MAAM,QAAA,CAAS,IAAA,EAAK;AAC7C,UAAA,IAAI,CAAC,OAAA,IAAW,OAAO,YAAY,QAAA,IAAY,KAAA,CAAM,QAAQ,OAAO,CAAA;AAClE,YAAA,MAAM,IAAI,mBAAA,CAAoB,kBAAA,EAAoB,8BAA8B,CAAA;AAClF,UAAA,MAAM,QAAA,GAAW,OAAA;AACjB,UAAA,IAAI,QAAA,CAAS,QAAQ,CAAA,KAAM,KAAA,CAAA,EAAW;AACpC,YAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAC,CAAA;AACnC,cAAA,MAAM,IAAI,mBAAA,CAAoB,kBAAA,EAAoB,4BAA4B,CAAA;AAChF,YAAA,IAAI,QAAA,CAAS,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAA;AAC9B,cAAA,MAAM,IAAI,mBAAA;AAAA,gBACR,SAAA;AAAA,gBACA,+DAAA;AAAA,gBACA,EAAE,KAAA,EAAO,QAAA,CAAS,QAAQ,CAAA;AAAE,eAC9B;AAAA,UACJ;AACA,UAAA,IACE,CAAC,QAAA,CAAS,MAAM,CAAA,IAChB,OAAO,QAAA,CAAS,MAAM,CAAA,KAAM,QAAA,IAC5B,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAC,CAAA;AAE9B,YAAA,MAAM,IAAI,mBAAA,CAAoB,kBAAA,EAAoB,mCAAmC,CAAA;AACvF,UAAA,OAAO,SAAS,MAAM,CAAA;AAAA,QACxB,CAAA,GAAG;AAAA,QACH;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,qBAAqB,MAAM,KAAA;AAChD,MAAA,IAAI,UAAA,CAAW,MAAA,CAAO,OAAA,EAAS,MAAM,kBAAkB,KAAK,CAAA;AAC5D,MAAA,MAAM,IAAI,mBAAA,CAAoB,WAAA,EAAa,+CAAA,EAAiD;AAAA,QAC1F;AAAA,OACD,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAAA,QAAAA,CAAQ,MAAA,EAAQ,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAGpD,MAAA,IAAI,YAAA,EAAc,UAAA,CAAW,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAC7E,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB;AAAA,EACF,CAAA;AACF;;;AC3HA,SAAS,QAAQ,IAAA,EAAqB;AACpC,EAAA,MAAM,IAAI,mBAAA,CAAoB,kBAAA,EAAoB,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAA,CAAG,CAAA;AAC1F;AACA,IAAM,QAAA,GACJ,CAAC,IAAA,KACD,CAAC,OAAO,IAAA,KAAS;AACf,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AAC3C,CAAA;AACF,IAAM,MAAA,GACJ,CAAC,OAAA,EAAiB,GAAA,GAAM,GAAG,GAAA,GAAM,QAAA,KACjC,CAAC,KAAA,EAAO,IAAA,KAAS;AACf,EAAA,IACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,CAAM,MAAA,GAAS,GAAA,IACf,KAAA,CAAM,MAAA,GAAS,GAAA,IACf,CAAC,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAEnB,IAAA,OAAA,CAAQ,IAAI,CAAA;AAChB,CAAA;AACF,IAAM,OAAA,GAAU,OAAO,qBAAqB,CAAA;AAC5C,IAAM,OAAA,GAAU,OAAO,qBAAqB,CAAA;AAC5C,IAAM,IAAA,GACJ,CAAC,GAAA,KACD,CAAC,OAAO,IAAA,KAAS;AACf,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,GAAQ,MAAM,KAAA,GAAQ,GAAA,UAAa,IAAI,CAAA;AAC1E,CAAA;AACF,IAAM,OAAA,GAAU,IAAA,CAAA,CAAM,EAAA,IAAM,IAAA,IAAQ,EAAE,CAAA;AACtC,IAAM,WAAA,GAAc,KAAK,WAAW,CAAA;AACpC,IAAM,UACJ,CAAC,GAAA,EAAa,GAAA,KACd,CAAC,OAAO,IAAA,KAAS;AACf,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,UAAU,KAAK,CAAA,IAAK,KAAA,GAAQ,GAAA,IAAO,KAAA,GAAQ,GAAA;AAClF,IAAA,OAAA,CAAQ,IAAI,CAAA;AAChB,CAAA;AACF,IAAM,OAAA,GAAgB,CAAC,KAAA,EAAO,IAAA,KAAS;AACrC,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAA,CAAQ,IAAI,CAAA;AAC9C,CAAA;AACA,IAAM,SACJ,CAAC,MAAA,EAA8B,MAAA,KAC/B,CAAC,OAAO,IAAA,KAAS;AACf,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA;AAC7E,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AAC7C,EAAA,IAAI,cAAc,MAAA,CAAO,SAAA,IAAa,SAAA,KAAc,IAAA,UAAc,IAAI,CAAA;AACtE,EAAA,MAAM,KAAA,GAAQ,KAAA;AACd,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,GAAG,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAAA,EAC3D;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,MAAA,CAAO,QAAQ,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AACnF,EAAA,MAAA,GAAS,OAAO,IAAI,CAAA;AACtB,CAAA;AACF,IAAM,QAAA,GAAW;AAAA,EACf,WAAA,EAAa,SAAS,WAAW,CAAA;AAAA,EACjC,SAAA,EAAW,SAAS,OAAO,CAAA;AAAA,EAC3B,SAAA,EAAW,QAAA,CAAS,OAAA,CAAQ,CAAA,EAAG,UAAU,CAAC,CAAA;AAAA;AAAA,EAE1C,MAAA,EAAQ,QAAA,CAAS,CAAC,KAAA,EAAO,IAAA,KAAS;AAChC,IAAA,IAAI,OAAO,WAAA,KAAgB,WAAA,IAAe,EAAE,KAAA,YAAiB,WAAA,CAAA,UAAsB,IAAI,CAAA;AAAA,EACzF,CAAC;AACH,CAAA;AACA,IAAM,IAAA,GAAO;AAAA,EACX,GAAG,QAAA;AAAA,EACH,QAAA,EAAU,QAAA,CAAS,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EAClC,MAAA,EAAQ,QAAA;AAAA,IACN,MAAA,CAAO;AAAA,MACL,KAAA,EAAO,MAAA,CAAO,yBAAA,EAA2B,CAAA,EAAG,IAAI,CAAA;AAAA,MAChD,WAAA;AAAA,MACA,SAAA,EAAW,CAAC,KAAA,EAAO,IAAA,KAAS;AAC1B,QAAA,IAAI,KAAA,KAAU,IAAA,EAAM,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAAA,MACzC,CAAA;AAAA,MACA,UAAA,EAAY,MAAA,CAAO,SAAA,EAAW,CAAA,EAAG,GAAG,CAAA;AAAA,MACpC,KAAA,EAAO,MAAA,CAAO,SAAA,EAAW,CAAA,EAAG,IAAI;AAAA,KACjC;AAAA;AAEL,CAAA;AACA,IAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAC,CAAA;AACzC,IAAM,IAAA,GAAO,CAAC,MAAA,EAA8B,QAAA,GAAW,OAAO,MAAA,KAAmC;AAC/F,EAAA,MAAM,MAAA,GAAS,OAAO,EAAE,GAAG,MAAM,GAAG,MAAA,IAAU,MAAM,CAAA;AACpD,EAAA,OAAO,CAAC,QAAA,GAAW,MAAA,GAAS,QAAA,CAAS,MAAM,CAAC,CAAA;AAC9C,CAAA;AACA,IAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,QAAA,CAAS,OAAO,CAAA,EAAG,KAAA,EAAO,QAAA,CAAS,OAAO,CAAA,EAAE;AAGnE,IAAM,kBAAA,GAAqB;AAAA,EACzB,WAAA,EAAa,CAAC,OAAO,CAAA;AAAA,EACrB,WAAA,EAAa,CAAC,OAAO,CAAA;AAAA,EACrB,QAAA,EAAU,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3B,UAAA,EAAY,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,EAC7B,OAAA,EAAS,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,EAC1B,QAAA,EAAU,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3B,UAAA,EAAY,IAAA,CAAK,EAAE,MAAA,EAAQ,QAAA,CAAS,OAAO,CAAA,EAAG,QAAA,EAAU,QAAA,CAAS,OAAO,CAAA,EAAG,CAAA;AAAA,EAC3E,cAAc,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,IAAW,IAAI,CAAA;AAAA,EAC3C,eAAe,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,IAAW,IAAI,CAAA;AAAA,EAC5C,YAAA,EAAc,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,QAAQ,QAAA,CAAS,OAAO,CAAA,EAAE,EAAG,IAAI,CAAA;AAAA,EACtE,kBAAkB,IAAA,CAAK,EAAE,MAAA,EAAQ,OAAA,IAAW,IAAI,CAAA;AAAA,EAChD,kBAAkB,IAAA,CAAK,EAAE,MAAA,EAAQ,OAAA,IAAW,IAAI,CAAA;AAAA,EAChD,eAAA,EAAiB,IAAA,CAAK,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAO,QAAA,CAAS,OAAO,CAAA,EAAE,EAAG,IAAI,CAAA;AAAA,EACzE,YAAA,EAAc,IAAA;AAAA,IACZ;AAAA,MACE,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,MACxB,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,MACxB,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA,MACvB,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,MACzB,YAAA,EAAc,SAAS,OAAO;AAAA,KAChC;AAAA,IACA,KAAA;AAAA,IACA,CAAC,OAAO,IAAA,KAAS;AACf,MAAA,MAAM,KAAA,GAAQ,KAAA;AACd,MAAA,IAAI,MAAM,QAAQ,CAAA,KAAM,MAAA,IAAa,KAAA,CAAM,QAAQ,CAAA,KAAM,MAAA;AACvD,QAAA,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAA,cAAA,CAAgB,CAAA;AAAA,IACnC;AAAA,GACF;AAAA,EACA,eAAe,IAAA,CAAK;AAAA,IAClB,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IACxB,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA,IACvB,OAAA,EAAS,SAAS,OAAO;AAAA,GAC1B,CAAA;AAAA,EACD,0BAA0B,IAAA,CAAK;AAAA,IAC7B,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IACxB,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IACxB,OAAA,EAAS,SAAS,OAAO;AAAA,GAC1B,CAAA;AAAA,EACD,YAAY,IAAA,CAAK,EAAE,OAAO,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,EAC7C,iBAAA,EAAmB,KAAK,EAAE,GAAG,OAAO,MAAA,EAAQ,QAAA,CAAS,OAAO,CAAA,EAAG,CAAA;AAAA,EAC/D,oBAAA,EAAsB,KAAK,EAAE,GAAG,OAAO,MAAA,EAAQ,QAAA,CAAS,OAAO,CAAA,EAAG,CAAA;AAAA,EAClE,wBAAA,EAA0B,IAAA,CAAK,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,QAAA,CAAS,OAAO,CAAA,EAAG,MAAA,EAAQ,QAAA,CAAS,OAAO,GAAG;AAClG,CAAA;AAGO,IAAM,qBAAkD,MAAA,CAAO,MAAA;AAAA,EACpE,MAAA,CAAO,KAAK,kBAAkB;AAChC;AAGO,SAAS,4BAAA,CACd,WACA,IAAA,EACW;AACX,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,kBAAA,EAAoB,SAAS,CAAA,IAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA;AACzF,EAAA,MAAM,KAAA,GAAyB,mBAAmB,SAAS,CAAA;AAC3D,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,MAAA,UAAgB,aAAa,CAAA;AACrD,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA,CAAG,CAAC,CAAA;AAClE,EAAA,OAAO,CAAC,GAAG,IAAI,CAAA;AACjB;;;AClIA,SAASC,SAAQ,IAAA,EAAqB;AACpC,EAAA,MAAM,IAAI,mBAAA,CAAoB,kBAAA,EAAoB,CAAA,8BAAA,EAAiC,IAAI,CAAA,CAAA,CAAG,CAAA;AAC5F;AACA,SAAS,MAAA,CAAO,OAAgB,IAAA,EAAuC;AACrE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAGA,QAAAA,CAAQ,IAAI,CAAA;AACrF,EAAA,OAAO,KAAA;AACT;AACA,IAAM,WAAA,GAA6B;AAAA,EACjC,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,KAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAIA,QAAAA,CAAQ,CAAC;AACzD,CAAA;AACA,IAAM,IAAA,GAAuB;AAAA,EAC3B,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,KAAO,OAAO,CAAA,KAAM,SAAA,GAAY,CAAA,GAAIA,QAAAA,CAAQ,CAAC;AAC1D,CAAA;AACA,IAAMC,KAAAA,GAAsB;AAAA,EAC1B,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,EAAG,MAAA,KACZ,MAAA,GACI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,IAAK,EAAA,GAC5B,CAAA,GACAD,QAAAA,CAAQ,CAAC,CAAA,GACX,OAAO,CAAA,KAAM,QAAA,IAAY,mBAAA,CAAoB,IAAA,CAAK,CAAC,CAAA,GACjD,MAAA,CAAO,CAAC,CAAA,GACRA,QAAAA,CAAQ,CAAC;AACnB,CAAA;AACA,IAAM,QAAA,GAA0B;AAAA,EAC9B,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,EAAG,WACZ,MAAA,GACI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,MAAA,CAAO,OAAO,gBAAgB,CAAA,GACrE,CAAA,GACAA,QAAAA,CAAQ,CAAC,CAAA,GACX,OAAO,CAAA,KAAM,YAAY,MAAA,CAAO,aAAA,CAAc,CAAC,CAAA,IAAK,KAAK,CAAA,GACvD,MAAA,CAAO,CAAC,CAAA,GACRA,SAAQ,CAAC;AACnB,CAAA;AACA,SAAS,IAAI,KAAA,EAA4B;AACvC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,KAAM;AACf,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAC,yBAAA,CAA0B,KAAK,CAAC,CAAA,EAAGA,QAAAA,CAAQ,CAAC,CAAA;AAC1E,MAAA,IAAI,KAAA,KAAU,UAAa,CAAA,CAAE,MAAA,KAAW,IAAI,KAAA,GAAQ,CAAA,EAAGA,QAAAA,CAAQ,CAAC,CAAA;AAChE,MAAA,OAAO,EAAE,WAAA,EAAY;AAAA,IACvB;AAAA,GACF;AACF;AACA,IAAME,QAAAA,GAA0B,IAAI,EAAE,CAAA;AACtC,IAAMC,QAAAA,GAAU,IAAI,EAAE,CAAA;AACtB,SAAS,SAAY,KAAA,EAAkC;AACrD,EAAA,OAAO;AAAA,IACL,GAAI,MAAM,SAAA,KAAc,MAAA,GAAY,EAAC,GAAI,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA,EAAU;AAAA,IACtE,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,EAAG,MAAA,KAAY,CAAA,KAAM,IAAA,GAAO,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,MAAM;AAAA,GACxE;AACF;AACA,SAAS,MAAS,KAAA,EAA6B;AAC7C,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,EAAG,MAAA,KAAW;AACvB,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAGH,SAAQ,CAAC,CAAA;AAChC,MAAA,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,EAAM,MAAM,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA,EAAK,MAAM,CAAC,CAAA;AAAA,IACnE;AAAA,GACF;AACF;AACA,SAAS,YAA+C,MAAA,EAA6B;AACnF,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,KAAO,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAK,CAAA,GAAkBA,SAAQ,CAAC;AAAA,GAC9F;AACF;AACA,SAASI,QACP,MAAA,EAGC;AACD,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAC7B,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAA,EAAG,GAAG,CAAA,EAAG,KAAA,CAAM,SAAA,GAAY,CAAA,GAAA,EAAM,KAAA,CAAM,SAAS,OAAO,EAAE,CAAA,CAAE,CAAA,CACjF,IAAA,CAAK,GAAG,CAAA;AAAA,IACX,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,EAAG,MAAA,KAAW;AACvB,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AACzB,MAAA,OAAO,MAAA,CAAO,WAAA;AAAA,QACZ,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAAA,UAC3C,GAAA;AAAA,UACA,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,MAAM;AAAA,SAC9C;AAAA,OACH;AAAA,IACF;AAAA,GACF;AACF;AAEA,IAAM,UAAA,GAAaA,OAAAA,CAAO,EAAE,EAAA,EAAIF,UAAS,CAAA;AACzC,IAAM,OAAA,GAAUE,OAAAA,CAAO,EAAE,EAAA,EAAID,UAAS,CAAA;AACtC,IAAM,YAAYC,OAAAA,CAAO;AAAA,EACvB,UAAA,EAAY,WAAA;AAAA,EACZ,iBAAA,EAAmB,IAAA;AAAA,EACnB,KAAA,EAAOA,OAAAA,CAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,QAAA,CAASD,QAAO,CAAA,EAAG,SAAA,EAAW,QAAA,CAAS,QAAQ,GAAG;AAC5F,CAAC,CAAA;AACD,IAAM,aAAaC,OAAAA,CAAO;AAAA,EACxB,EAAA,EAAIF,QAAAA;AAAA,EACJ,MAAA,EAAQ,UAAA;AAAA,EACR,WAAA,EAAa,SAASA,QAAO,CAAA;AAAA,EAC7B,iBAAA,EAAmBA,QAAAA;AAAA,EACnB,IAAA,EAAM,SAAS,WAAW,CAAA;AAAA,EAC1B,MAAA,EAAQ,SAAS,WAAW,CAAA;AAAA,EAC5B,MAAA,EAAQ,IAAA;AAAA,EACR,aAAA,EAAe,IAAA;AAAA,EACf,YAAA,EAAc,SAASA,QAAO,CAAA;AAAA,EAC9B,gBAAA,EAAkB,SAASA,QAAO,CAAA;AAAA,EAClC,kBAAA,EAAoB,SAASA,QAAO,CAAA;AAAA,EACpC,WAAA,EAAa,SAASD,KAAI,CAAA;AAAA,EAC1B,iBAAA,EAAmBA,KAAAA;AAAA,EACnB,qBAAA,EAAuB,SAASE,QAAO,CAAA;AAAA,EACvC,sBAAA,EAAwBF,KAAAA;AAAA,EACxB,eAAA,EAAiBA,KAAAA;AAAA,EACjB,mBAAA,EAAqBA,KAAAA;AAAA,EACrB,YAAA,EAAcE,QAAAA;AAAA,EACd,aAAA,EAAe,QAAA,CAASC,OAAAA,CAAO,EAAE,EAAA,EAAID,QAAAA,EAAS,MAAA,EAAQD,QAAAA,EAAS,QAAA,EAAU,IAAA,EAAM,CAAC;AAClF,CAAC,CAAA;AACD,IAAM,cAAcE,OAAAA,CAAO;AAAA,EACzB,IAAI,GAAA,EAAI;AAAA,EACR,KAAA,EAAO,UAAA;AAAA,EACP,OAAA,EAASH,KAAAA;AAAA,EACT,WAAA,EAAaA,KAAAA;AAAA,EACb,SAAA,EAAWA,KAAAA;AAAA,EACX,WAAA,EAAaA;AACf,CAAC,CAAA;AACD,IAAM,aAAa,WAAA,CAAY;AAAA,EAC7B,qBAAA;AAAA,EACA,uBAAA;AAAA,EACA,qBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,mBAAA;AAAA,EACA,uBAAA;AAAA,EACA;AACF,CAAU,CAAA;AACV,IAAM,YAAY,WAAA,CAAY;AAAA,EAC5B,MAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAU,CAAA;AACV,IAAM,cAAcG,OAAAA,CAAO;AAAA,EACzB,IAAI,GAAA,EAAI;AAAA,EACR,KAAA,EAAO,UAAA;AAAA,EACP,gBAAgBA,OAAAA,CAAO;AAAA,IACrB,EAAA,EAAIF,QAAAA;AAAA,IACJ,MAAA,EAAQ,YAAY,CAAC,SAAA,EAAW,WAAW,UAAA,EAAY,SAAA,EAAW,WAAW,CAAU;AAAA,GACxF,CAAA;AAAA,EACD,UAAA;AAAA,EACA,QAAA,EAAUC,QAAAA;AAAA,EACV,MAAA,EAAQ,IAAA;AAAA,EACR,WAAW,GAAA,EAAI;AAAA,EACf,UAAA,EAAYA,QAAAA;AAAA,EACZ,SAAA;AAAA,EACA,kBAAA,EAAoB,IAAA;AAAA,EACpB,aAAA,EAAe,SAAS,IAAI,CAAA;AAAA,EAC5B,gBAAA,EAAkB,SAASF,KAAI,CAAA;AAAA,EAC/B,kBAAA,EAAoB,SAAS,IAAI,CAAA;AAAA,EACjC,aAAA,EAAe,SAASA,KAAI,CAAA;AAAA,EAC5B,uBAAuB,QAAA,CAAS,WAAA,CAAY,CAAC,gBAAA,EAAkB,YAAY,CAAU,CAAC,CAAA;AAAA,EACtF,eAAA,EAAiB,QAAA,CAAS,KAAA,CAAME,QAAO,CAAC,CAAA;AAAA,EACxC,gBAAA,EAAkB,SAAS,IAAI,CAAA;AAAA,EAC/B,eAAA,EAAiBF,KAAAA;AAAA,EACjB,uBAAA,EAAyB,SAASA,KAAI;AACxC,CAAC,CAAA;AACD,IAAM,aAAaG,OAAAA,CAAO;AAAA,EACxB,EAAA,EAAIF,QAAAA;AAAA,EACJ,QAAQ,WAAA,CAAY,CAAC,YAAY,oBAAA,EAAsB,cAAA,EAAgB,UAAU,CAAU,CAAA;AAAA,EAC3F,IAAA,EAAM,SAAS,OAAO,CAAA;AAAA,EACtB,SAAA,EAAW,SAASD,KAAI,CAAA;AAAA,EACxB,OAAA,EAAS,SAASC,QAAO,CAAA;AAAA,EACzB,UAAA,EAAY,SAASA,QAAO,CAAA;AAAA,EAC5B,YAAA,EAAc,SAASA,QAAO,CAAA;AAAA,EAC9B,gBAAA,EAAkBD,KAAAA;AAAA,EAClB,oBAAA,EAAsBA;AACxB,CAAC,CAAA;AACD,IAAM,eAAeG,OAAAA,CAAO;AAAA,EAC1B,EAAA,EAAIF,QAAAA;AAAA,EACJ,kBAAA,EAAoB,IAAA;AAAA,EACpB,cAAA,EAAgB,SAAS,UAAU;AACrC,CAAC,CAAA;AACD,IAAM,mBAAmBE,OAAAA,CAAO;AAAA,EAC9B,IAAI,GAAA,EAAI;AAAA,EACR,IAAA,EAAM,OAAA;AAAA,EACN,OAAA,EAASD,QAAAA;AAAA,EACT,OAAA,EAAS,IAAA;AAAA,EACT,aAAA,EAAeD,QAAAA;AAAA,EACf,gBAAA,EAAkBD,KAAAA;AAAA,EAClB,oBAAA,EAAsBA,KAAAA;AAAA,EACtB,WAAA,EAAaG,QAAO,EAAE,cAAA,EAAgBH,OAAM,aAAA,EAAe,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAM;AAC3F,CAAC,CAAA;AACD,IAAM,kBAAkBG,OAAAA,CAAO;AAAA,EAC7B,IAAI,GAAA,EAAI;AAAA,EACR,KAAA,EAAO,UAAA;AAAA,EACP,IAAA,EAAM,OAAA;AAAA,EACN,OAAA,EAASD,QAAAA;AAAA,EACT,OAAA,EAAS,IAAA;AAAA,EACT,gBAAA,EAAkBF,KAAAA;AAAA,EAClB,oBAAA,EAAsBA;AACxB,CAAC,CAAA;AACD,IAAM,qBAAqBG,OAAAA,CAAO;AAAA,EAChC,IAAI,GAAA,EAAI;AAAA,EACR,KAAA,EAAO,UAAA;AAAA,EACP,OAAA,EAAS,UAAA;AAAA,EACT,OAAA,EAASH,KAAAA;AAAA,EACT,OAAA,EAASA,KAAAA;AAAA,EACT,YAAA,EAAcA;AAChB,CAAC,CAAA;AACD,IAAM,mBAAmBG,OAAAA,CAAO;AAAA,EAC9B,IAAI,GAAA,EAAI;AAAA,EACR,KAAA,EAAO,UAAA;AAAA,EACP,IAAA,EAAM,OAAA;AAAA,EACN,OAAA,EAASH,KAAAA;AAAA,EACT,OAAA,EAASA,KAAAA;AAAA,EACT,cAAA,EAAgB,QAAA,CAAS,GAAA,EAAK;AAChC,CAAC,CAAA;AACD,IAAM,gBAAgBG,OAAAA,CAAO;AAAA,EAC3B,IAAI,GAAA,EAAI;AAAA,EACR,KAAA,EAAO,UAAA;AAAA,EACP,QAAA,EAAUF,QAAAA;AAAA,EACV,IAAA,EAAM,UAAA;AAAA,EACN,EAAA,EAAI,UAAA;AAAA,EACJ,OAAA,EAASD,KAAAA;AAAA,EACT,KAAA,EAAOA,KAAAA;AAAA,EACP,OAAA,EAAS,IAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,WAAA,EAAaA,KAAAA;AAAA,EACb,cAAA,EAAgBA,KAAAA;AAAA,EAChB,eAAA,EAAiBE,QAAAA;AAAA,EACjB,QAAA,EAAUF;AACZ,CAAC,CAAA;AACD,IAAM,mBAAmBG,OAAAA,CAAO;AAAA,EAC9B,EAAA,EAAID,QAAAA;AAAA,EACJ,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAUC,OAAAA,CAAO,EAAE,EAAA,EAAID,UAAS,CAAA;AAAA,EAChC,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,EAAQD,QAAAA;AAAA,EACR,OAAA,EAASC,QAAAA;AAAA,EACT,OAAA,EAASA,QAAAA;AAAA,EACT,KAAA,EAAOA,QAAAA;AAAA,EACP,WAAA,EAAaC,QAAO,EAAE,EAAA,EAAI,KAAI,EAAG,OAAA,EAAS,MAAM,CAAA;AAAA,EAChD,WAAA,EAAaH,KAAAA;AAAA,EACb,cAAA,EAAgBA,KAAAA;AAAA,EAChB,eAAA,EAAiBE,QAAAA;AAAA,EACjB,QAAA,EAAUF;AACZ,CAAC,CAAA;AACD,IAAM,gBAAgBG,OAAAA,CAAO;AAAA,EAC3B,EAAA,EAAI,WAAA;AAAA,EACJ,eAAA,EAAiBF,QAAAA;AAAA,EACjB,MAAA,EAAQ,IAAA;AAAA,EACR,qBAAA,EAAuB,SAASD,KAAI,CAAA;AAAA,EACpC,gBAAA,EAAkB,SAASC,QAAO,CAAA;AAAA,EAClC,yBAAA,EAA2B;AAC7B,CAAC,CAAA;AACD,IAAM,WAAWE,OAAAA,CAAO;AAAA,EACtB,IAAI,GAAA,EAAI;AAAA,EACR,KAAA,EAAO,UAAA;AAAA,EACP,OAAA,EAASH,KAAAA;AAAA,EACT,GAAA,EAAK,WAAA;AAAA,EACL,gBAAA,EAAkBA;AACpB,CAAC,CAAA;AACD,IAAM,aAAaG,OAAAA,CAAO;AAAA,EACxB,EAAA,EAAIF,QAAAA;AAAA,EACJ,KAAA,EAAO,UAAA;AAAA,EACP,OAAA,EAASD,KAAAA;AAAA,EACT,UAAA,EAAYC,QAAAA;AAAA,EACZ,oBAAA,EAAsBD,KAAAA;AAAA,EACtB,wBAAA,EAA0BA,KAAAA;AAAA,EAC1B,mBAAA,EAAqBE,QAAAA;AAAA,EACrB,YAAA,EAAcF,KAAAA;AAAA,EACd,eAAA,EAAiBA,KAAAA;AAAA,EACjB,cAAA,EAAgBA,KAAAA;AAAA,EAChB,cAAA,EAAgBA,KAAAA;AAAA,EAChB,mBAAA,EAAqBA;AACvB,CAAC,CAAA;AACD,IAAM,gBAAA,GAAmB;AAAA,EACvB,IAAI,GAAA,EAAI;AAAA,EACR,KAAA,EAAO,UAAA;AAAA,EACP,KAAA,EAAO,UAAA;AAAA,EACP,WAAA,EAAaA,KAAAA;AAAA,EACb,cAAA,EAAgBA,KAAAA;AAAA,EAChB,eAAA,EAAiBE;AACnB,CAAA;AACA,IAAM,kBAAA,GAAqBC,QAAO,EAAE,GAAG,kBAAkB,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQH,KAAAA,EAAM,CAAA;AACzF,IAAM,kBAAkBG,OAAAA,CAAO;AAAA,EAC7B,GAAG,gBAAA;AAAA,EACH,KAAA,EAAOF,QAAAA;AAAA,EACP,MAAA,EAAQA,QAAAA;AAAA,EACR,QAAA,EAAU,IAAI,CAAC;AACjB,CAAC,CAAA;AAmJD,SAAS,QAAA,CAAY,KAAA,EAAiB,KAAA,EAAgB,IAAA,EAAiB;AACrE,EAAA,IAAI;AACF,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,IAAI,CAAA;AAAA,EAChC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,oBAAoB,kBAAA,EAAoB,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,CAAA,EAAK,EAAE,OAAO,CAAA;AAAA,EACjF;AACF;AACA,SAAS,cAAA,CAAe,OAAgB,IAAA,EAAsB;AAC5D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,GAAQ,EAAA,EAAI;AAC3C,IAAA,MAAM,IAAI,mBAAA,CAAoB,kBAAA,EAAoB,CAAA,EAAG,IAAI,CAAA,8BAAA,CAAgC,CAAA;AAAA,EAC3F;AACA,EAAA,OAAO,MAAM,QAAA,EAAS;AACxB;AACA,SAAS,aAAA,CACP,OACA,IAAA,EAC2C;AAC3C,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,cAAA,CAAe,KAAA,EAAO,aAAa,CAAA;AAE5D,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,GAAQ,WAAA,EAAa;AAC9C,IAAA,MAAM,IAAI,mBAAA,CAAoB,kBAAA,EAAoB,4CAA4C,CAAA;AAAA,EAChG;AACA,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,EAAE,MAAM,QAAA,CAASC,QAAAA,EAAS,IAAA,EAAM,WAAW,CAAA,EAAE;AAC5E,EAAA,OAAO,UAAU,MAAA,GAAY,IAAA,GAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA,EAAE;AAC9D;AAEA,SAAS,gBAAA,CAAiB,IAAA,EAAuBE,YAAAA,EAAsB,SAAA,EAAuB;AAC5F,EAAA,IAAIA,YAAAA,KAAgB,UAAa,IAAA,CAAK,KAAA,CAAM,WAAWA,YAAAA,EAAaL,SAAQ,oBAAoB,CAAA;AAChG,EAAA,IACE,SAAA,KAAc,MAAA,IACd,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,IAAA,IACpB,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,SAAA,CAAU,WAAA,EAAY,EAC1C;AACA,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,IAAA,EAA6B;AACxD,EAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,gBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,MAAA,EAIX;AAC1B,EAAA,MAAM,OAAA,GAAU,sBAAsB,MAAM,CAAA;AAE5C,EAAA,eAAe,OACb,MAAA,EACA,EAAA,EACA,KAAA,EACAD,QAAAA,GAAiC,EAAC,EACP;AAC3B,IAAA,MAAM,OAAO,MAAM,OAAA;AAAA,MACjB,yDAAyD,MAAM,CAAA,sBAAA,EAAyB,MAAM,SAAS,CAAA,sBAAA,EAAyB,UAAU,SAAS,CAAA,EAAA,CAAA;AAAA,MACnJ,EAAE,IAAI,KAAA,EAAO,aAAA,CAAcA,SAAQ,WAAA,EAAaA,QAAAA,CAAQ,SAAS,CAAA,EAAE;AAAA,MACnEA;AAAA,KACF;AACA,IAAA,MAAM,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,CAAM,IAAA,CAAK,MAAM,MAAM,CAAA;AACpD,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,MAAA,CAAO,IAAA,EAAM,MAAM,EAAE,EAAA,KAAO,EAAA,EAAIC,QAAAA,CAAQ,SAAS,CAAA;AACtE,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,OAAO,OAAO,CAAA;AAChD,IAAA,gBAAA,CAAiB,IAAA,EAAMD,QAAAA,CAAQ,WAAA,EAAaA,QAAAA,CAAQ,SAAS,CAAA;AAC7D,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,OAAO,EAAE,MAAM,IAAA,EAAK;AAAA,EACtB;AAEA,EAAA,eAAeO,KAAAA,CACb,MAAA,EACA,UAAA,EACA,KAAA,EACA,SACAP,QAAAA,EACyB;AACzB,IAAA,MAAM,IAAA,GAAOA,SAAQ,QAAA,IAAY,GAAA;AACjC,IAAA,IAAI,CAAC,OAAO,SAAA,CAAU,IAAI,KAAK,IAAA,GAAO,CAAA,IAAK,OAAO,GAAA,EAAK;AACrD,MAAA,MAAM,IAAI,mBAAA,CAAoB,kBAAA,EAAoB,8CAAyC,CAAA;AAAA,IAC7F;AACA,IAAA,MAAM,QAAQ,CAAA,EAAG,MAAM,IAAI,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,CAAA;AAClD,IAAA,MAAM,SAASA,QAAAA,CAAQ,MAAA;AACvB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,GAAA,EAAI,EAAG,MAAA,CAAO,KAAA,EAAO,cAAc,CAAA;AAC5C,MAAA,cAAA,CAAe,MAAA,CAAO,aAAa,oBAAoB,CAAA;AACvD,MAAA,QAAA,CAAS,WAAA,EAAa,MAAA,CAAO,UAAA,EAAY,mBAAmB,CAAA;AAC5D,MAAA,QAAA,CAAS,QAAA,CAASI,QAAO,CAAA,EAAG,MAAA,CAAO,WAAW,kBAAkB,CAAA;AAChE,MAAA,IACE,OAAO,KAAA,KAAU,KAAA,IAChBJ,SAAQ,WAAA,KAAgB,MAAA,IAAaA,SAAQ,WAAA,KAAgB,MAAA,CAAO,WAAA,IACpEA,QAAAA,CAAQ,cAAc,MAAA,IAAaA,QAAAA,CAAQ,UAAU,WAAA,EAAY,KAAM,OAAO,SAAA,EAC/E;AACA,QAAA,MAAM,IAAI,mBAAA;AAAA,UACR,kBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,IAAA;AAC/B,IAAA,MAAMM,YAAAA,GAAc,MAAA,EAAQ,WAAA,IAAeN,QAAAA,CAAQ,WAAA;AACnD,IAAA,MAAM,SAAA,GAAY,MAAA,EAAQ,SAAA,IAAaA,QAAAA,CAAQ,SAAA;AAC/C,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAcM,YAAAA,EAAa,SAAS,CAAA;AAElD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA,GAClC,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,CAAG,GAAA,CAAI,CAAC,MAAA,MAAY,EAAE,GAAG,MAAA,CAAO,MAAA,EAAQ,QAAQ,CAAA,EAAG,KAAA,EAAO,KAAA,EAAM,CAAE,CAAA,EAAE,GAClF,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,KAAA,EAAM;AAC/B,IAAA,MAAM,OAAO,MAAM,OAAA;AAAA,MACjB,CAAA,qCAAA,EAAwC,UAAU,CAAA,6BAAA,EAAgC,MAAM,0EAA0E,KAAA,CAAM,SAAS,CAAA,sBAAA,EAAyB,SAAA,CAAU,SAAS,CAAA,EAAA,CAAA;AAAA,MAC7N,EAAE,KAAA,EAAO,IAAA,GAAO,CAAA,EAAG,OAAO,KAAA,EAAM;AAAA,MAChCN;AAAA,KACF;AACA,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,OAAO,OAAO,CAAA;AAChD,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,UAAA,KAAe,IAAA,CAAK,UAAA,EAAY;AACnD,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,oBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,gBAAA,CAAiB,IAAA,EAAMM,cAAa,SAAS,CAAA;AAC7C,IAAA,MAAM,OAAO,KAAA,CAAM,KAAK,EAAE,KAAA,CAAM,IAAA,CAAK,OAAO,OAAO,CAAA;AACnD,IAAA,IAAI,KAAK,MAAA,GAAS,IAAA,GAAO,CAAA,EAAGL,SAAQ,cAAc,CAAA;AAClD,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,QAAA,EAAUA,SAAQ,gBAAgB,CAAA;AAChD,MAAA,QAAA,GAAW,GAAA,CAAI,EAAA;AAAA,IACjB;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAChC,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA,EACE,IAAA,CAAK,MAAA,GAAS,IAAA,GACV;AAAA,QACE,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAG,EAAA;AAAA,QAChC,WAAA,EAAa,KAAK,KAAA,CAAM,MAAA;AAAA,QACxB,SAAA,EAAW,SAAA,IAAa,IAAA,CAAK,KAAA,CAAM,IAAA;AAAA,QACnC,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB;AAAA,OACF,GACA;AAAA,KACR;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,MAA2B,EAAE,KAAA,EAAO,SAASE,QAAAA,EAAS,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA,EAAE,CAAA;AAC9F,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,MAAwB,EAAE,IAAA,EAAM,SAASC,QAAAA,EAAS,CAAA,CAAE,MAAA,EAAQ,QAAQ,CAAA,EAAE,CAAA;AAC3F,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,MAA6C;AAAA,IACjE,GAAI,CAAA,CAAE,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,YAAA,CAAa,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,CAAA;AAAA,IAChE,GAAI,CAAA,CAAE,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA,EAAO,QAAA,CAASD,QAAAA,EAAS,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA;AAAE,GAChF,CAAA;AACA,EAAA,MAAM,oBAAA,GAAuB,CAAC,CAAA,MAAwC;AAAA,IACpE,GAAG,aAAa,CAAC,CAAA;AAAA,IACjB,GAAI,CAAA,CAAE,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,IAAA,EAAM,QAAA,CAASA,QAAAA,EAAS,CAAA,CAAE,MAAA,EAAQ,QAAQ,CAAA;AAAE,GAClF,CAAA;AAEA,EAAA,MAAM,SAAA,GAAqC;AAAA,IACzC,MAAM,WAAA,CAAYH,QAAAA,GAAU,EAAC,EAAG;AAC9B,MAAA,MAAM,OAAO,MAAM,OAAA;AAAA,QACjB,CAAA,gEAAA,EAAmE,UAAU,SAAS,CAAA,EAAA,CAAA;AAAA,QACtF,EAAE,KAAA,EAAO,aAAA,CAAcA,SAAQ,WAAA,EAAaA,QAAAA,CAAQ,SAAS,CAAA,EAAE;AAAA,QAC/DA;AAAA,OACF;AACA,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,OAAO,OAAO,CAAA;AAChD,MAAA,gBAAA,CAAiB,IAAA,EAAMA,QAAAA,CAAQ,WAAA,EAAaA,QAAAA,CAAQ,SAAS,CAAA;AAC7D,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,aAAa,CAACA,QAAAA,KAAY,OAAO,wBAAA,EAA0B,UAAA,EAAY,eAAeA,QAAO,CAAA;AAAA,IAC7F,QAAA,EAAU,CAACQ,MAAAA,EAAOR,QAAAA,KAChB,MAAA,CAAO,aAAA,EAAe,QAAA,CAASG,QAAAA,EAASK,MAAAA,EAAO,OAAO,CAAA,EAAG,UAAA,EAAYR,QAAO,CAAA;AAAA,IAC9E,UAAA,EAAY,CAAC,CAAA,GAAI,EAAC,KAChBO,KAAAA,CAAK,cAAA,EAAgB,oBAAA,EAAsB,UAAA,EAAY,YAAA,CAAa,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IAC3E,iBAAA,EAAmB,CAAC,CAAA,GAAI,EAAC,KACvBA,KAAAA;AAAA,MACE,oBAAA;AAAA,MACA,0BAAA;AAAA,MACA,kBAAA;AAAA,MACA,qBAAqB,CAAC,CAAA;AAAA,MACtB;AAAA,KACF;AAAA,IACF,oBAAA,EAAsB,CAAC,CAAA,GAAI,EAAC,KAC1BA,KAAAA;AAAA,MACE,uBAAA;AAAA,MACA,6BAAA;AAAA,MACA,kBAAA;AAAA,MACA,qBAAqB,CAAC,CAAA;AAAA,MACtB;AAAA,KACF;AAAA,IACF,wBAAA,EAA0B,CAAC,CAAA,GAAI,EAAC,KAC9BA,KAAAA;AAAA,MACE,0BAAA;AAAA,MACA,gCAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,QACE,GAAG,aAAa,CAAC,CAAA;AAAA,QACjB,GAAI,CAAA,CAAE,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA,EAAO,QAAA,CAASJ,QAAAA,EAAS,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA,EAAE;AAAA,QAC9E,GAAI,CAAA,CAAE,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAQ,QAAA,CAASA,QAAAA,EAAS,CAAA,CAAE,MAAA,EAAQ,QAAQ,CAAA;AAAE,OACpF;AAAA,MACA;AAAA,KACF;AAAA,IACF,UAAA,EAAY,CAAC,CAAA,GAAI,EAAC,KAChBI,KAAAA;AAAA,MACE,QAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,QACE,GAAI,CAAA,CAAE,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAQ,QAAA,CAASJ,QAAAA,EAAS,CAAA,CAAE,MAAA,EAAQ,QAAQ,CAAA,EAAE;AAAA,QAClF,GAAI,CAAA,CAAE,QAAA,KAAa,MAAA,GACf,EAAC,GACD,EAAE,iBAAA,EAAmB,QAAA,CAASA,QAAAA,EAAS,CAAA,CAAE,QAAA,EAAU,UAAU,CAAA;AAAE,OACrE;AAAA,MACA;AAAA,KACF;AAAA,IACF,QAAA,EAAU,CAAC,KAAA,EAAOH,QAAAA,KAChB,MAAA,CAAO,OAAA,EAAS,QAAA,CAASG,QAAAA,EAAS,KAAA,EAAO,OAAO,CAAA,EAAG,UAAA,EAAYH,QAAO,CAAA;AAAA,IACxE,YAAA,EAAc,CAAC,CAAA,KACbO,KAAAA,CAAK,eAAA,EAAiB,sBAAsB,WAAA,EAAa,YAAA,CAAa,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IAC7E,aAAA,EAAe,CAAC,CAAA,KAAMA,KAAAA,CAAK,WAAA,EAAa,mBAAmB,QAAA,EAAU,YAAA,CAAa,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACvF,YAAA,EAAc,CAAC,CAAA,KACbA,KAAAA;AAAA,MACE,kBAAA;AAAA,MACA,uBAAA;AAAA,MACA,WAAA;AAAA,MACA,EAAE,GAAG,YAAA,CAAa,CAAC,CAAA,EAAG,MAAA,EAAQ,QAAA,CAAS,IAAA,EAAM,CAAA,CAAE,MAAA,IAAU,IAAA,EAAM,QAAQ,CAAA,EAAE;AAAA,MACzE;AAAA,KACF;AAAA,IACF,UAAA,EAAY,CAAC,MAAA,EAAQP,QAAAA,KACnB,MAAA,CAAO,SAAA,EAAW,QAAA,CAASG,QAAAA,EAAS,MAAA,EAAQ,QAAQ,CAAA,EAAG,YAAA,EAAcH,QAAO,CAAA;AAAA,IAC9E,OAAA,EAAS,CAAC,MAAA,EAAQA,QAAAA,KAChB,MAAA,CAAO,MAAA,EAAQ,QAAA,CAASI,QAAAA,EAAS,MAAA,EAAQ,QAAQ,CAAA,EAAG,OAAA,EAASJ,QAAO,CAAA;AAAA,IACtE,gBAAA,EAAkB,CAAC,CAAA,KACjBO,KAAAA,CAAK,kBAAA,EAAoB,yBAAyB,UAAA,EAAY,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACjF,gBAAA,EAAkB,CAAC,CAAA,KACjBA,KAAAA,CAAK,cAAA,EAAgB,sBAAsB,gBAAA,EAAkB,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IAChF,eAAA,EAAiB,CAAC,CAAA,KAChBA,KAAAA;AAAA,MACE,aAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA,EAAE,GAAG,WAAA,CAAY,CAAC,CAAA,EAAG,GAAI,CAAA,CAAE,KAAA,KAAU,MAAA,GAAY,KAAK,YAAA,CAAa,EAAE,OAAO,CAAA,CAAE,KAAA,EAAO,CAAA,EAAG;AAAA,MACxF;AAAA,KACF;AAAA,IACF,YAAA,CAAa,CAAA,GAAI,EAAC,EAAG;AACnB,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,IAAa,CAAA,CAAE,WAAW,MAAA,EAAW;AACpD,QAAA,MAAM,IAAI,mBAAA;AAAA,UACR,kBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,GAAI,CAAA,CAAE,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,YAAA,CAAa,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,CAAA;AAAA,QAChE,GAAI,CAAA,CAAE,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,cAAA,CAAe,CAAA,CAAE,OAAA,EAAS,SAAS,CAAA,EAAE;AAAA,QACnF,GAAI,QAAA,CAAS,IAAA,EAAM,CAAA,CAAE,YAAA,IAAgB,IAAA,EAAM,cAAc,CAAA,GAAI,EAAE,UAAA,EAAY,GAAA,EAAI,GAAI;AAAC,OACtF;AACA,MAAA,IAAI,CAAA,CAAE,WAAW,MAAA,EAAW;AAC1B,QAAA,OAAOA,KAAAA;AAAA,UACL,cAAA;AAAA,UACA,oBAAA;AAAA,UACA,gBAAA;AAAA,UACA,EAAE,GAAG,OAAA,EAAS,GAAG,WAAA,CAAY,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAE;AAAA,UACnD;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAOA,KAAAA;AAAA,QACL,eAAA;AAAA,QACA,qBAAA;AAAA,QACA,kBAAA;AAAA,QACA;AAAA,UACE,GAAG,OAAA;AAAA,UACH,GAAI,CAAA,CAAE,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,QAAA,CAASJ,QAAAA,EAAS,CAAA,CAAE,MAAA,EAAQ,QAAQ,CAAA;AAAE,SACrF;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,aAAA,CAAc,CAAA,GAAI,EAAC,EAAG;AACpB,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,GAAI,CAAA,CAAE,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,YAAA,CAAa,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,CAAA;AAAA,QAChE,GAAI,CAAA,CAAE,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,cAAA,CAAe,CAAA,CAAE,OAAA,EAAS,SAAS,CAAA;AAAE,OACrF;AACA,MAAA,MAAM,KAAA,GACJ,CAAA,CAAE,MAAA,KAAW,MAAA,GACT,OAAA,GACA;AAAA,QACE,EAAA,EAAI;AAAA,UACF,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,SAASA,QAAAA,EAAS,CAAA,CAAE,MAAA,EAAQ,QAAQ,CAAA,EAAE;AAAA,UAC1D,EAAE,GAAG,OAAA,EAAS,EAAA,EAAI,SAASA,QAAAA,EAAS,CAAA,CAAE,MAAA,EAAQ,QAAQ,CAAA;AAAE;AAC1D,OACF;AACN,MAAA,OAAOI,KAAAA,CAAK,gBAAA,EAAkB,sBAAA,EAAwB,aAAA,EAAe,OAAO,CAAC,CAAA;AAAA,IAC/E,CAAA;AAAA,IACA,wBAAA,EAA0B,CAAC,CAAA,GAAI,EAAC,KAC9BA,KAAAA;AAAA,MACE,sBAAA;AAAA,MACA,4BAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,QACE,GAAI,CAAA,CAAE,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAQ,QAAA,CAASJ,QAAAA,EAAS,CAAA,CAAE,MAAA,EAAQ,QAAQ,CAAA,EAAE;AAAA,QAClF,GAAI,CAAA,CAAE,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,WAAA,CAAY,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,QAClE,GAAI,CAAA,CAAE,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,QAAA,CAASC,QAAAA,EAAS,CAAA,CAAE,OAAA,EAAS,SAAS,CAAA;AAAE,OACxF;AAAA,MACA;AAAA;AACF,GACJ;AAGA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,kBAAA,CAAmB,GAAA,CAAI,CAAC,SAAA,KAAc;AAAA,MACpC,SAAA;AAAA,MACA,UAAU,IAAA,KAAoB;AAC5B,QAAA,MAAM,SAAA,GAAY,4BAAA,CAA6B,SAAA,EAAW,IAAI,CAAA;AAC9D,QAAA,MAAM,MAAA,GAAS,UAAU,SAAS,CAAA;AAClC,QAAA,OAAO,MAAA,CAAO,GAAG,SAAS,CAAA;AAAA,MAC5B;AAAA,KACD;AAAA,GACH;AACF;AAGO,SAAS,8BAAA,CACd,SAAA,EACA,KAAA,EACA,IAAA,GAA2B,EAAC,EACnB;AACT,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA;AACvB,EAAA,MAAMJ,QAAAA,GACJ,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAK,IAAA,GAA8B,EAAC;AAC7F,EAAA,MAAM,cAAA,GAAiBA,QAAAA,CAAQ,MAAA,EAAQ,WAAA,IAAeA,QAAAA,CAAQ,WAAA;AAC9D,EAAA,MAAM,aAAA,GAAgBA,QAAAA,CAAQ,MAAA,EAAQ,SAAA,IAAaA,QAAAA,CAAQ,SAAA;AAC3D,EAAA,IAAI,cAAc,aAAA,EAAe;AAC/B,IAAA,MAAMS,KAAAA,GAAO,SAAA,CAAU,KAAA,CAAM,KAAA,EAAO,YAAY,IAAI,CAAA;AACpD,IAAA,gBAAA,CAAiBA,KAAAA,EAAM,cAAA,EAAgB,aAAA,IAAiB,MAAS,CAAA;AACjE,IAAA,OAAOA,KAAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA;AACrC,EAAA,MAAM,OAAO,SAAA,CAAU,KAAA,CAAM,OAAO,MAAM,CAAA,EAAG,QAAQ,IAAI,CAAA;AACzD,EAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,EAAA,gBAAA,CAAiB,IAAA,EAAM,cAAA,EAAgB,aAAA,IAAiB,MAAS,CAAA;AACjE,EAAA,IAAIT,QAAAA,CAAQ,MAAA,IAAUA,QAAAA,CAAQ,MAAA,CAAO,eAAe,IAAA,CAAK,UAAA;AACvD,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,oBAAA;AAAA,MACA;AAAA,KACF;AACF,EAAA,MAAM,MAAA,GAAwF;AAAA,IAC5F,WAAA,EAAa,aAAA;AAAA,IACb,QAAA,EAAU,UAAA;AAAA,IACV,UAAA,EAAY,YAAA;AAAA,IACZ,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU,UAAA;AAAA,IACV,UAAA,EAAY,UAAA;AAAA,IACZ,YAAA,EAAc,WAAA;AAAA,IACd,aAAA,EAAe,QAAA;AAAA,IACf,YAAA,EAAc,WAAA;AAAA,IACd,gBAAA,EAAkB,UAAA;AAAA,IAClB,gBAAA,EAAkB,gBAAA;AAAA,IAClB,eAAA,EAAiB,eAAA;AAAA,IACjB,YAAA,EACE,IAAA,CAAK,CAAC,CAAA,IACN,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,IAClB,KAAK,CAAC,CAAA,CAA8B,QAAQ,CAAA,KAAM,SAC/C,gBAAA,GACA,kBAAA;AAAA,IACN,aAAA,EAAe,aAAA;AAAA,IACf,wBAAA,EAA0B,gBAAA;AAAA,IAC1B,UAAA,EAAY,UAAA;AAAA,IACZ,iBAAA,EAAmB,kBAAA;AAAA,IACnB,oBAAA,EAAsB,kBAAA;AAAA,IACtB,wBAAA,EAA0B;AAAA,GAC5B;AACA,EAAA,MAAM,KAAA,GAAQ,OAAO,SAAS,CAAA;AAC9B,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,KAAK,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAA,GAAO,SAAS,KAAK,CAAA,CAAE,MAAM,MAAA,CAAO,MAAM,CAAA,EAAG,MAAA,EAAQ,IAAI,CAAA;AAC/D,IAAA,MAAM,EAAA,GACJ,SAAA,KAAc,aAAA,GACV,UAAA,GACA,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,GACjB,IAAA,CAAK,CAAC,CAAA,CAAE,aAAY,GACpB,MAAA;AACR,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA,CAAE,IAAI,CAAA,KAAM,EAAA,EAAIC,QAAAA,CAAQ,SAAS,CAAA;AACzE,IAAA,OAAO,EAAE,MAAM,IAAA,EAAK;AAAA,EACtB;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA,CAAE,MAAM,MAAA,CAAO,OAAO,CAAA,EAAG,OAAA,EAAS,IAAI,CAAA;AAC/D,EAAA,IAAI,MAAM,MAAA,IAAUD,QAAAA,CAAQ,YAAY,GAAA,CAAA,EAAMC,SAAQ,cAAc,CAAA;AACpE,EAAA,MAAM,cAAcI,OAAAA,CAAO;AAAA,IACzB,OAAO,GAAA,EAAI;AAAA,IACX,WAAA,EAAaH,KAAAA;AAAA,IACb,SAAA,EAAW,SAASE,QAAO,CAAA;AAAA,IAC3B,UAAA,EAAY,WAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACR,CAAA;AACD,EAAA,MAAM,UAAA,GAAa,SAAS,WAAW,CAAA,CAAE,MAAM,MAAA,CAAO,YAAY,CAAA,EAAG,YAAA,EAAc,IAAI,CAAA;AACvF,EAAA,IACE,eACC,UAAA,CAAW,UAAA,KAAe,IAAA,CAAK,UAAA,IAC9B,WAAW,WAAA,KAAgB,IAAA,CAAK,KAAA,CAAM,MAAA,IACrC,KAAK,KAAA,CAAM,IAAA,KAAS,QAAQ,UAAA,CAAW,SAAA,KAAc,KAAK,KAAA,CAAM,IAAA,CAAA;AAEnE,IAAAH,SAAQ,qBAAqB,CAAA;AAC/B,EAAA,IAAI,cAAcD,QAAAA,CAAQ,MAAA,IAAU,UAAA,CAAW,KAAA,KAAUA,SAAQ,MAAA,CAAO,KAAA;AACtE,IAAAC,SAAQ,kBAAkB,CAAA;AAC5B,EAAA,IAAI,QAAA,GAAWD,QAAAA,CAAQ,MAAA,EAAQ,KAAA,IAAS,EAAA;AACxC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,EAAM,MAAM,EAAE,IAAI,CAAA;AACpC,IAAA,IAAI,OAAO,EAAA,KAAO,QAAA,IAAY,MAAM,QAAA,EAAUC,SAAQ,gBAAgB,CAAA;AACtE,IAAA,QAAA,GAAW,EAAA;AAAA,EACb;AACA,EAAA,IAAI,cAAc,UAAA,CAAW,KAAA,KAAU,QAAA,EAAUA,SAAQ,kBAAkB,CAAA;AAC3E,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,UAAA,EAAW;AACnC;;;ACt1BO,SAAS,gBAAgB,KAAA,EAA2B;AACzD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU,OAAO,EAAE,QAAA,EAAU,KAAA,CAAM,UAAS,EAAE;AACnE,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,aAAa,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AACtF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,GAAG,OAAO,KAAA;AAChE,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,IAAI,eAAe,CAAA;AAC1D,EAAA,IACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,OAAO,cAAA,CAAe,KAAK,CAAA,KAAM,MAAA,CAAO,SAAA,EACxC;AACA,IAAA,IAAI,UAAA,IAAc,KAAA;AAChB,MAAA,MAAM,IAAI,mBAAA,CAAoB,kBAAA,EAAoB,uBAAuB,CAAA;AAC3E,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,MACZ,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CACjB,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA,KAAM,IAAA,KAAS,MAAS,EACvC,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,IAAI,CAAA,KAAM,CAAC,GAAA,EAAK,eAAA,CAAgB,IAAI,CAAC,CAAC;AAAA,KACtD;AAAA,EACF;AACA,EAAA,MAAM,IAAI,mBAAA;AAAA,IACR,kBAAA;AAAA,IACA;AAAA,GACF;AACF;AAGO,SAAS,gBAAgB,KAAA,EAAyB;AACvD,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,IAAI,eAAe,CAAA;AAC1D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA,MAAMS,OAAAA,GAAS,KAAA;AACf,IAAA,IAAI,cAAcA,OAAAA,EAAQ;AACxB,MAAA,IACE,OAAO,IAAA,CAAKA,OAAM,CAAA,CAAE,MAAA,KAAW,KAC/B,OAAOA,OAAAA,CAAO,UAAU,CAAA,KAAM,YAC9B,CAAC,kBAAA,CAAmB,KAAKA,OAAAA,CAAO,UAAU,CAAC,CAAA,EAC3C;AACA,QAAA,MAAM,IAAI,mBAAA,CAAoB,kBAAA,EAAoB,uCAAuC,CAAA;AAAA,MAC3F;AACA,MAAA,OAAO,MAAA,CAAOA,OAAAA,CAAO,UAAU,CAAC,CAAA;AAAA,IAClC;AACA,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,MACZ,MAAA,CAAO,OAAA,CAAQA,OAAM,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,IAAI,MAAM,CAAC,GAAA,EAAK,eAAA,CAAgB,IAAI,CAAC,CAAC;AAAA,KAC1E;AAAA,EACF;AACA,EAAA,IACE,KAAA,KAAU,IAAA,IACV,OAAO,KAAA,KAAU,QAAA,IACjB,OAAO,KAAA,KAAU,SAAA,IAChB,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA;AAEnD,IAAA,OAAO,KAAA;AACT,EAAA,MAAM,IAAI,mBAAA,CAAoB,kBAAA,EAAoB,+BAA+B,CAAA;AACnF;;;ACrCO,SAAS,qBAAqB,MAAA,EAA8C;AACjF,EAAA,mBAAA,CAAoB,OAAO,GAAG,CAAA;AAC9B,EAAA,MAAM,OAAA,GAAU,sBAAsB,MAAM,CAAA;AAC5C,EAAA,OAAO;AAAA,IACL,MAAM,KAAA,CACJ,KAAA,EACA,SAAA,EACAV,QAAAA,EACY;AACZ,MAAA,OAAQ,MAAM,OAAA,CAAQ,KAAA,EAAO,SAAA,EAAWA,QAAO,CAAA;AAAA,IACjD;AAAA,GACF;AACF","file":"subgraph.js","sourcesContent":["import { OpacityIssuerError } from '../errors.js';\n\nexport type IndexerErrorCode =\n | 'NOT_CONFIGURED'\n | 'INVALID_ARGUMENT'\n | 'ABORTED'\n | 'TIMEOUT'\n | 'TRANSPORT'\n | 'HTTP'\n | 'GRAPHQL'\n | 'INDEXING_ERROR'\n | 'INVALID_RESPONSE'\n | 'DEPLOYMENT_CHANGED'\n | 'SNAPSHOT_CHANGED';\n\n/** Indexer failures never represent a failed on-chain transaction. */\nexport class OpacityIndexerError extends OpacityIssuerError {\n constructor(\n readonly code: IndexerErrorCode,\n message: string,\n options?: { cause?: unknown },\n ) {\n super(message, options);\n this.name = 'OpacityIndexerError';\n }\n}\n","import type { FetchLike } from '../transport.js';\nimport { OpacityIndexerError } from './errors.js';\n\nexport interface GraphqlRequestOptions {\n signal?: AbortSignal;\n timeoutMs?: number;\n}\nexport interface GraphqlExecutorConfig {\n url?: string | undefined;\n fetch?: FetchLike;\n timeoutMs?: number;\n headers?: Record<string, string>;\n}\n\nexport function validateSubgraphUrl(url: string): void {\n try {\n const parsed = new URL(url);\n if (!['http:', 'https:'].includes(parsed.protocol) || parsed.username || parsed.password)\n throw new Error('Invalid URL');\n } catch (cause) {\n throw new OpacityIndexerError(\n 'INVALID_ARGUMENT',\n 'Subgraph URL must use HTTP(S) without embedded credentials.',\n { cause },\n );\n }\n}\n\n/** The single network boundary for generic GraphQL and typed indexed reads. */\nexport function createGraphqlExecutor(config: GraphqlExecutorConfig) {\n const fetchImpl = config.fetch ?? globalThis.fetch?.bind(globalThis);\n if (config.url) validateSubgraphUrl(config.url);\n\n return async (\n query: string,\n variables: Record<string, unknown> = {},\n options: GraphqlRequestOptions = {},\n ): Promise<Record<string, unknown>> => {\n if (!config.url)\n throw new OpacityIndexerError(\n 'NOT_CONFIGURED',\n 'Configure a subgraph URL to use indexed reads.',\n );\n if (!fetchImpl)\n throw new OpacityIndexerError('NOT_CONFIGURED', 'A fetch implementation is required.');\n const timeoutMs = options.timeoutMs ?? config.timeoutMs ?? 30_000;\n if (!Number.isInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2147483647)\n throw new OpacityIndexerError(\n 'INVALID_ARGUMENT',\n 'timeoutMs must be a positive 32-bit integer.',\n );\n if (options.signal?.aborted)\n throw new OpacityIndexerError('ABORTED', 'Subgraph request cancelled before it started.');\n\n const controller = new AbortController();\n let timedOut = false;\n const onAbort = () => controller.abort();\n options.signal?.addEventListener('abort', onAbort, { once: true });\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeoutMs);\n let cancellation: (() => void) | undefined;\n const cancellationError = (cause?: unknown) =>\n new OpacityIndexerError(\n timedOut ? 'TIMEOUT' : 'ABORTED',\n timedOut ? 'Subgraph request timed out.' : 'Subgraph request cancelled.',\n { cause },\n );\n const aborted = new Promise<never>((_, reject) => {\n cancellation = () => reject(cancellationError());\n controller.signal.addEventListener('abort', cancellation, { once: true });\n });\n try {\n // Covers fetch and body consumption even when an injected implementation ignores abort.\n return await Promise.race([\n (async () => {\n const response = await fetchImpl(config.url!, {\n method: 'POST',\n headers: {\n accept: 'application/json',\n 'content-type': 'application/json',\n ...config.headers,\n },\n credentials: 'omit',\n signal: controller.signal,\n body: JSON.stringify({ query, variables }),\n });\n if (!response.ok)\n throw new OpacityIndexerError('HTTP', `Subgraph returned HTTP ${response.status}.`);\n const payload: unknown = await response.json();\n if (!payload || typeof payload !== 'object' || Array.isArray(payload))\n throw new OpacityIndexerError('INVALID_RESPONSE', 'Malformed subgraph response.');\n const envelope = payload as Record<string, unknown>;\n if (envelope['errors'] !== undefined) {\n if (!Array.isArray(envelope['errors']))\n throw new OpacityIndexerError('INVALID_RESPONSE', 'Malformed subgraph errors.');\n if (envelope['errors'].length > 0)\n throw new OpacityIndexerError(\n 'GRAPHQL',\n 'Subgraph returned GraphQL errors; partial data was discarded.',\n { cause: envelope['errors'] },\n );\n }\n if (\n !envelope['data'] ||\n typeof envelope['data'] !== 'object' ||\n Array.isArray(envelope['data'])\n )\n throw new OpacityIndexerError('INVALID_RESPONSE', 'Subgraph returned no data object.');\n return envelope['data'] as Record<string, unknown>;\n })(),\n aborted,\n ]);\n } catch (cause) {\n if (cause instanceof OpacityIndexerError) throw cause;\n if (controller.signal.aborted) throw cancellationError(cause);\n throw new OpacityIndexerError('TRANSPORT', 'Subgraph request or response decoding failed.', {\n cause,\n });\n } finally {\n clearTimeout(timer);\n options.signal?.removeEventListener('abort', onAbort);\n // Detach the rejection listener first: cleanup is resource disposal, not cancellation\n // of a successfully completed query. Abort also closes any unread error response body.\n if (cancellation) controller.signal.removeEventListener('abort', cancellation);\n controller.abort();\n }\n };\n}\n","import { OpacityIndexerError } from './errors.js';\nimport type { OpacityIndexerNamespace } from './index.js';\n\nexport type IndexerOperation = keyof OpacityIndexerNamespace;\ntype Rule = (value: unknown, path: string) => void;\n\nfunction invalid(path: string): never {\n throw new OpacityIndexerError('INVALID_ARGUMENT', `Invalid indexer argument at ${path}.`);\n}\nconst optional =\n (rule: Rule): Rule =>\n (value, path) => {\n if (value !== undefined) rule(value, path);\n };\nconst string =\n (pattern: RegExp, min = 0, max = Infinity): Rule =>\n (value, path) => {\n if (\n typeof value !== 'string' ||\n value.length < min ||\n value.length > max ||\n !pattern.test(value)\n )\n invalid(path);\n };\nconst address = string(/^0x[0-9a-fA-F]{40}$/);\nconst bytes32 = string(/^0x[0-9a-fA-F]{64}$/);\nconst uint =\n (max: bigint): Rule =>\n (value, path) => {\n if (typeof value !== 'bigint' || value < 0n || value > max) invalid(path);\n };\nconst uint256 = uint((1n << 256n) - 1n);\nconst blockNumber = uint(2147483647n);\nconst integer =\n (min: number, max: number): Rule =>\n (value, path) => {\n if (typeof value !== 'number' || !Number.isInteger(value) || value < min || value > max)\n invalid(path);\n };\nconst boolean: Rule = (value, path) => {\n if (typeof value !== 'boolean') invalid(path);\n};\nconst object =\n (fields: Record<string, Rule>, refine?: Rule): Rule =>\n (value, path) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) invalid(path);\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) invalid(path);\n const input = value as Record<string, unknown>;\n for (const key of Object.keys(input)) {\n if (!Object.hasOwn(fields, key)) invalid(`${path}.${key}`);\n }\n for (const [key, rule] of Object.entries(fields)) rule(input[key], `${path}.${key}`);\n refine?.(input, path);\n };\nconst snapshot = {\n blockNumber: optional(blockNumber),\n blockHash: optional(bytes32),\n timeoutMs: optional(integer(1, 2147483647)),\n // Signals are local request controls. JSON objects cannot impersonate an AbortSignal.\n signal: optional((value, path) => {\n if (typeof AbortSignal === 'undefined' || !(value instanceof AbortSignal)) invalid(path);\n }),\n};\nconst page = {\n ...snapshot,\n pageSize: optional(integer(1, 999)),\n cursor: optional(\n object({\n after: string(/^0x(?:[0-9a-fA-F]{2})*$/, 2, 1024),\n blockNumber,\n blockHash: (value, path) => {\n if (value !== null) bytes32(value, path);\n },\n deployment: string(/[\\s\\S]*/, 1, 512),\n scope: string(/[\\s\\S]*/, 1, 4096),\n }),\n ),\n};\nconst options = optional(object(snapshot));\nconst list = (fields: Record<string, Rule>, required = false, refine?: Rule): readonly Rule[] => {\n const params = object({ ...page, ...fields }, refine);\n return [required ? params : optional(params)];\n};\nconst vault = { token: optional(address), vault: optional(address) };\n\n// Exhaustive against the public namespace: adding an operation requires its argument contract.\nconst operationArguments = {\n getMetadata: [options],\n getRegistry: [options],\n getToken: [address, options],\n getAccount: [address, options],\n getUser: [bytes32, options],\n getVault: [address, options],\n listTokens: list({ issuer: optional(address), registry: optional(address) }),\n listTokenIds: list({ token: address }, true),\n listTokenURIs: list({ token: address }, true),\n listPolicies: list({ token: address, active: optional(boolean) }, true),\n listUserAccounts: list({ userId: bytes32 }, true),\n listGlobalTraits: list({ userId: bytes32 }, true),\n listTokenTraits: list({ userId: bytes32, token: optional(address) }, true),\n listBalances: list(\n {\n wallet: optional(address),\n userId: optional(bytes32),\n token: optional(address),\n tokenId: optional(uint256),\n positiveOnly: optional(boolean),\n },\n false,\n (value, path) => {\n const input = value as Record<string, unknown>;\n if (input['wallet'] !== undefined && input['userId'] !== undefined)\n invalid(`${path}.wallet/userId`);\n },\n ),\n listTransfers: list({\n wallet: optional(address),\n token: optional(address),\n tokenId: optional(uint256),\n }),\n listDocumentAttestations: list({\n wallet: optional(address),\n userId: optional(bytes32),\n traitId: optional(bytes32),\n }),\n listVaults: list({ token: optional(address) }),\n listVaultDeposits: list({ ...vault, wallet: optional(address) }),\n listVaultWithdrawals: list({ ...vault, wallet: optional(address) }),\n listVaultAdminExecutions: list({ ...vault, owner: optional(address), target: optional(address) }),\n} satisfies Record<IndexerOperation, readonly Rule[]>;\n\n/** Named operations only; hosted requests never carry arbitrary GraphQL or upstream URLs. */\nexport const INDEXER_OPERATIONS: readonly IndexerOperation[] = Object.freeze(\n Object.keys(operationArguments) as IndexerOperation[],\n);\n\n/** Validate decoded arguments for both direct clients and API adapters without changing defaults. */\nexport function validateIndexerOperationArgs(\n operation: IndexerOperation,\n args: unknown,\n): unknown[] {\n if (!Object.hasOwn(operationArguments, operation) || !Array.isArray(args)) invalid('args');\n const rules: readonly Rule[] = operationArguments[operation];\n if (args.length > rules.length) invalid('args.length');\n rules.forEach((rule, index) => rule(args[index], `args[${index}]`));\n return [...args];\n}\n","import type { Address, Hex } from 'viem';\n\nimport type { FetchLike } from '../transport.js';\nimport { OpacityIndexerError } from './errors.js';\nimport { createGraphqlExecutor } from './executor.js';\nimport { INDEXER_OPERATIONS, validateIndexerOperationArgs } from './arguments.js';\n\nexport { OpacityIndexerError } from './errors.js';\nexport type { IndexerErrorCode } from './errors.js';\n\n// The same schema selects GraphQL fields and validates/decodes the response. Graph BigInt wire\n// values must be decimal strings; no financial value is ever routed through Number.\ninterface Field<T> {\n selection?: string;\n parse(value: unknown, path: string, domain?: boolean): T;\n}\ntype Parsed<T> = T extends Field<infer V> ? V : never;\n\nfunction invalid(path: string): never {\n throw new OpacityIndexerError('INVALID_RESPONSE', `Malformed indexer response at ${path}.`);\n}\nfunction record(value: unknown, path: string): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) invalid(path);\n return value as Record<string, unknown>;\n}\nconst stringField: Field<string> = {\n parse: (v, p) => (typeof v === 'string' ? v : invalid(p)),\n};\nconst bool: Field<boolean> = {\n parse: (v, p) => (typeof v === 'boolean' ? v : invalid(p)),\n};\nconst uint: Field<bigint> = {\n parse: (v, p, domain) =>\n domain\n ? typeof v === 'bigint' && v >= 0n\n ? v\n : invalid(p)\n : typeof v === 'string' && /^(0|[1-9][0-9]*)$/.test(v)\n ? BigInt(v)\n : invalid(p),\n};\nconst graphInt: Field<bigint> = {\n parse: (v, p, domain) =>\n domain\n ? typeof v === 'bigint' && v >= 0n && v <= BigInt(Number.MAX_SAFE_INTEGER)\n ? v\n : invalid(p)\n : typeof v === 'number' && Number.isSafeInteger(v) && v >= 0\n ? BigInt(v)\n : invalid(p),\n};\nfunction hex(bytes?: number): Field<Hex> {\n return {\n parse: (v, p) => {\n if (typeof v !== 'string' || !/^0x(?:[0-9a-fA-F]{2})*$/.test(v)) invalid(p);\n if (bytes !== undefined && v.length !== 2 + bytes * 2) invalid(p);\n return v.toLowerCase() as Hex;\n },\n };\n}\nconst address: Field<Address> = hex(20);\nconst bytes32 = hex(32);\nfunction nullable<T>(field: Field<T>): Field<T | null> {\n return {\n ...(field.selection === undefined ? {} : { selection: field.selection }),\n parse: (v, p, domain) => (v === null ? null : field.parse(v, p, domain)),\n };\n}\nfunction array<T>(field: Field<T>): Field<T[]> {\n return {\n parse: (v, p, domain) => {\n if (!Array.isArray(v)) invalid(p);\n return v.map((item, i) => field.parse(item, `${p}[${i}]`, domain));\n },\n };\n}\nfunction enumeration<const T extends readonly string[]>(values: T): Field<T[number]> {\n return {\n parse: (v, p) => (typeof v === 'string' && values.includes(v) ? (v as T[number]) : invalid(p)),\n };\n}\nfunction object<T extends Record<string, Field<unknown>>>(\n fields: T,\n): Field<{\n [K in keyof T]: Parsed<T[K]>;\n}> {\n return {\n selection: Object.entries(fields)\n .map(([key, field]) => `${key}${field.selection ? ` { ${field.selection} }` : ''}`)\n .join(' '),\n parse: (v, p, domain) => {\n const input = record(v, p);\n return Object.fromEntries(\n Object.entries(fields).map(([key, field]) => [\n key,\n field.parse(input[key], `${p}.${key}`, domain),\n ]),\n ) as { [K in keyof T]: Parsed<T[K]> };\n },\n };\n}\n\nconst addressRef = object({ id: address });\nconst userRef = object({ id: bytes32 });\nconst metaField = object({\n deployment: stringField,\n hasIndexingErrors: bool,\n block: object({ number: graphInt, hash: nullable(bytes32), timestamp: nullable(graphInt) }),\n});\nconst tokenField = object({\n id: address,\n issuer: addressRef,\n issuerAdmin: nullable(address),\n allowlistRegistry: address,\n name: nullable(stringField),\n symbol: nullable(stringField),\n paused: bool,\n mintingPaused: bool,\n policyEngine: nullable(address),\n transferOperator: nullable(address),\n tokenTraitRegistry: nullable(address),\n maxPolicies: nullable(uint),\n activePolicyCount: uint,\n activeRuleSetSnapshot: nullable(bytes32),\n ruleSetDeploymentCount: uint,\n deployedAtBlock: uint,\n deployedAtTimestamp: uint,\n deployTxHash: bytes32,\n beaconVariant: nullable(object({ id: bytes32, beacon: address, isActive: bool })),\n});\nconst supplyField = object({\n id: hex(),\n token: addressRef,\n tokenId: uint,\n totalSupply: uint,\n maxSupply: uint,\n holderCount: uint,\n});\nconst policyType = enumeration([\n 'TRADING_DISABLED_V1',\n 'ALLOWED_TRANSFEREE_V1',\n 'HOLDER_COUNT_CAP_V1',\n 'CEILING_BALANCE_V1',\n 'FLOOR_BALANCE_V1',\n 'DENYLIST_V1',\n 'INSIDER_FREEZE_V1',\n 'SELF_TRANSFER_ONLY_V1',\n 'UNKNOWN',\n] as const);\nconst guardMode = enumeration([\n 'NONE',\n 'ONLY_IF_FROM_HAS',\n 'ONLY_IF_TO_HAS',\n 'ONLY_IF_EITHER_HAS',\n] as const);\nconst policyField = object({\n id: hex(),\n token: addressRef,\n implementation: object({\n id: address,\n status: enumeration(['UNKNOWN', 'PENDING', 'APPROVED', 'REVOKED', 'CANCELLED'] as const),\n }),\n policyType,\n scopeKey: bytes32,\n active: bool,\n rawConfig: hex(),\n guardTrait: bytes32,\n guardMode,\n guardTraitIsGlobal: bool,\n configEnabled: nullable(bool),\n configMaxHolders: nullable(uint),\n configIsPercentage: nullable(bool),\n configCeiling: nullable(uint),\n configDenominatorMode: nullable(enumeration(['CURRENT_SUPPLY', 'MAX_SUPPLY'] as const)),\n configTraitList: nullable(array(bytes32)),\n configRequireAll: nullable(bool),\n attachedAtBlock: uint,\n lastReconfiguredAtBlock: nullable(uint),\n});\nconst entryField = object({\n id: address,\n status: enumeration(['VERIFIED', 'COMPLIANCE_REMOVAL', 'USER_REMOVAL', 'MIGRATED'] as const),\n user: nullable(userRef),\n expiresAt: nullable(uint),\n addedBy: nullable(address),\n migratedTo: nullable(address),\n migratedFrom: nullable(address),\n lastUpdatedBlock: uint,\n lastUpdatedTimestamp: uint,\n});\nconst accountField = object({\n id: address,\n isAuthorizedIssuer: bool,\n allowlistEntry: nullable(entryField),\n});\nconst globalTraitField = object({\n id: hex(),\n user: userRef,\n traitId: bytes32,\n enabled: bool,\n lastUpdatedBy: address,\n lastUpdatedBlock: uint,\n lastUpdatedTimestamp: uint,\n traitConfig: object({ expiryDuration: uint, teeEnableable: bool, writerEnableable: bool }),\n});\nconst tokenTraitField = object({\n id: hex(),\n token: addressRef,\n user: userRef,\n traitId: bytes32,\n enabled: bool,\n lastUpdatedBlock: uint,\n lastUpdatedTimestamp: uint,\n});\nconst walletBalanceField = object({\n id: hex(),\n token: addressRef,\n account: addressRef,\n tokenId: uint,\n balance: uint,\n frozenAmount: uint,\n});\nconst userBalanceField = object({\n id: hex(),\n token: addressRef,\n user: userRef,\n tokenId: uint,\n balance: uint,\n openIntervalId: nullable(hex()),\n});\nconst transferField = object({\n id: hex(),\n token: addressRef,\n operator: address,\n from: addressRef,\n to: addressRef,\n tokenId: uint,\n value: uint,\n isBatch: bool,\n batchIndex: graphInt,\n blockNumber: uint,\n blockTimestamp: uint,\n transactionHash: bytes32,\n logIndex: uint,\n});\nconst attestationField = object({\n id: bytes32,\n attestor: addressRef,\n document: object({ id: bytes32 }),\n user: userRef,\n wallet: address,\n traitId: bytes32,\n docHash: bytes32,\n nonce: bytes32,\n globalTrait: object({ id: hex(), enabled: bool }),\n blockNumber: uint,\n blockTimestamp: uint,\n transactionHash: bytes32,\n logIndex: uint,\n});\nconst registryField = object({\n id: stringField,\n contractAddress: address,\n paused: bool,\n defaultExpiryDuration: nullable(uint),\n authorizedSigner: nullable(address),\n teeTraitAllowlistEnforced: bool,\n});\nconst uriField = object({\n id: hex(),\n token: addressRef,\n tokenId: uint,\n uri: stringField,\n lastUpdatedBlock: uint,\n});\nconst vaultField = object({\n id: address,\n token: addressRef,\n tokenId: uint,\n stablecoin: address,\n firstObservedAtBlock: uint,\n firstObservedAtTimestamp: uint,\n firstObservedTxHash: bytes32,\n depositCount: uint,\n withdrawalCount: uint,\n totalDeposited: uint,\n totalWithdrawn: uint,\n adminExecutionCount: uint,\n});\nconst vaultEventFields = {\n id: hex(),\n vault: addressRef,\n token: addressRef,\n blockNumber: uint,\n blockTimestamp: uint,\n transactionHash: bytes32,\n};\nconst vaultMovementField = object({ ...vaultEventFields, user: addressRef, amount: uint });\nconst vaultAdminField = object({\n ...vaultEventFields,\n owner: address,\n target: address,\n selector: hex(4),\n});\n\nexport type IndexerMetadata = Parsed<typeof metaField>;\nexport type IndexedToken = Parsed<typeof tokenField>;\nexport type IndexedTokenId = Parsed<typeof supplyField>;\nexport type IndexedPolicy = Parsed<typeof policyField>;\nexport type IndexedAccount = Parsed<typeof accountField>;\nexport type IndexedUser = Parsed<typeof userRef>;\nexport type IndexedAllowlistEntry = Parsed<typeof entryField>;\nexport type IndexedGlobalTrait = Parsed<typeof globalTraitField>;\nexport type IndexedTokenTrait = Parsed<typeof tokenTraitField>;\nexport type IndexedWalletBalance = Parsed<typeof walletBalanceField>;\nexport type IndexedUserBalance = Parsed<typeof userBalanceField>;\nexport type IndexedBalance = IndexedWalletBalance | IndexedUserBalance;\nexport type IndexedTransfer = Parsed<typeof transferField>;\nexport type IndexedDocumentAttestation = Parsed<typeof attestationField>;\nexport type IndexedRegistry = Parsed<typeof registryField>;\nexport type IndexedTokenURI = Parsed<typeof uriField>;\n/** Event totals are historical activity, not current reserves or redemption liquidity. */\nexport type IndexedVault = Parsed<typeof vaultField>;\nexport type IndexedVaultMovement = Parsed<typeof vaultMovementField>;\nexport type IndexedVaultAdminExecution = Parsed<typeof vaultAdminField>;\n\nexport interface IndexerRequestOptions {\n signal?: AbortSignal;\n timeoutMs?: number;\n /** Indexed historical state; Graph Node may prune old blocks. Omit to read its current head. */\n blockNumber?: bigint;\n /** Prefer a block hash from getMetadata() to keep a snapshot stable across chain reorgs. */\n blockHash?: Hex;\n}\n/** Opaque to consumers: reuse unchanged with the same method and filters. */\nexport interface IndexerCursor {\n after: Hex;\n blockNumber: bigint;\n /** Null when Graph Node did not expose the historical block hash. */\n blockHash: Hex | null;\n deployment: string;\n scope: string;\n}\nexport interface IndexerPageOptions extends IndexerRequestOptions {\n /** Default 100; integer 1–999. A further row is fetched to detect continuation. */\n pageSize?: number;\n cursor?: IndexerCursor;\n}\nexport interface IndexedResult<T> {\n item: T | null;\n meta: IndexerMetadata;\n}\nexport interface IndexedPage<T> {\n items: T[];\n meta: IndexerMetadata;\n nextCursor: IndexerCursor | null;\n}\nexport interface ListIndexedTokensParams extends IndexerPageOptions {\n issuer?: Address;\n registry?: Address;\n}\nexport interface TokenIndexPageParams extends IndexerPageOptions {\n token: Address;\n}\nexport interface ListIndexedPoliciesParams extends TokenIndexPageParams {\n /** Defaults to true. Pass false for detached policies. */\n active?: boolean;\n}\nexport interface UserIndexPageParams extends IndexerPageOptions {\n userId: Hex;\n}\nexport interface ListIndexedTokenTraitsParams extends UserIndexPageParams {\n token?: Address;\n}\nexport interface ListIndexedBalancesParams extends IndexerPageOptions {\n /** Mutually exclusive with userId. Without either filter, lists wallet balances. */\n wallet?: Address;\n userId?: Hex;\n token?: Address;\n tokenId?: bigint;\n /** Defaults to true; false also includes zero balances. */\n positiveOnly?: boolean;\n}\nexport interface ListIndexedTransfersParams extends IndexerPageOptions {\n wallet?: Address;\n token?: Address;\n tokenId?: bigint;\n}\nexport interface ListIndexedDocumentAttestationsParams extends IndexerPageOptions {\n wallet?: Address;\n userId?: Hex;\n traitId?: Hex;\n}\nexport interface ListIndexedVaultsParams extends IndexerPageOptions {\n token?: Address;\n}\nexport interface ListIndexedVaultMovementsParams extends ListIndexedVaultsParams {\n vault?: Address;\n wallet?: Address;\n}\nexport interface ListIndexedVaultAdminExecutionsParams extends ListIndexedVaultsParams {\n vault?: Address;\n owner?: Address;\n target?: Address;\n}\n\n/**\n * Event-indexed views, not transaction preflight or live balances. The endpoint defines the\n * indexed chain/registry; Graph metadata identifies a deployment, not a chain id. Verify that\n * deployment and token.allowlistRegistry against your intended contract environment.\n *\n * Arrays are separate paged queries so traits, token IDs and histories cannot truncate silently.\n * getUser supplies the identity row; use listUserAccounts/listGlobalTraits/listTokenTraits to\n * traverse it. A historical attestation does not establish a currently enabled trait.\n */\nexport interface OpacityIndexerNamespace {\n getMetadata(options?: IndexerRequestOptions): Promise<IndexerMetadata>;\n getRegistry(options?: IndexerRequestOptions): Promise<IndexedResult<IndexedRegistry>>;\n listTokens(params?: ListIndexedTokensParams): Promise<IndexedPage<IndexedToken>>;\n getToken(token: Address, options?: IndexerRequestOptions): Promise<IndexedResult<IndexedToken>>;\n listTokenIds(params: TokenIndexPageParams): Promise<IndexedPage<IndexedTokenId>>;\n listTokenURIs(params: TokenIndexPageParams): Promise<IndexedPage<IndexedTokenURI>>;\n listPolicies(params: ListIndexedPoliciesParams): Promise<IndexedPage<IndexedPolicy>>;\n getAccount(\n wallet: Address,\n options?: IndexerRequestOptions,\n ): Promise<IndexedResult<IndexedAccount>>;\n getUser(userId: Hex, options?: IndexerRequestOptions): Promise<IndexedResult<IndexedUser>>;\n listUserAccounts(params: UserIndexPageParams): Promise<IndexedPage<IndexedAllowlistEntry>>;\n listGlobalTraits(params: UserIndexPageParams): Promise<IndexedPage<IndexedGlobalTrait>>;\n listTokenTraits(params: ListIndexedTokenTraitsParams): Promise<IndexedPage<IndexedTokenTrait>>;\n listBalances(params?: ListIndexedBalancesParams): Promise<IndexedPage<IndexedBalance>>;\n listTransfers(params?: ListIndexedTransfersParams): Promise<IndexedPage<IndexedTransfer>>;\n listDocumentAttestations(\n params?: ListIndexedDocumentAttestationsParams,\n ): Promise<IndexedPage<IndexedDocumentAttestation>>;\n /** Requires the sandbox v3 subgraph schema; includes previously assigned vaults. */\n getVault(vault: Address, options?: IndexerRequestOptions): Promise<IndexedResult<IndexedVault>>;\n listVaults(params?: ListIndexedVaultsParams): Promise<IndexedPage<IndexedVault>>;\n listVaultDeposits(\n params?: ListIndexedVaultMovementsParams,\n ): Promise<IndexedPage<IndexedVaultMovement>>;\n listVaultWithdrawals(\n params?: ListIndexedVaultMovementsParams,\n ): Promise<IndexedPage<IndexedVaultMovement>>;\n listVaultAdminExecutions(\n params?: ListIndexedVaultAdminExecutionsParams,\n ): Promise<IndexedPage<IndexedVaultAdminExecution>>;\n}\n\nfunction argument<T>(field: Field<T>, value: unknown, name: string): T {\n try {\n return field.parse(value, name);\n } catch (cause) {\n throw new OpacityIndexerError('INVALID_ARGUMENT', `Invalid ${name}.`, { cause });\n }\n}\nfunction bigintArgument(value: unknown, name: string): string {\n if (typeof value !== 'bigint' || value < 0n) {\n throw new OpacityIndexerError('INVALID_ARGUMENT', `${name} must be a nonnegative bigint.`);\n }\n return value.toString();\n}\nfunction blockVariable(\n value: bigint | undefined,\n hash?: Hex,\n): { number: number } | { hash: Hex } | null {\n if (value !== undefined) bigintArgument(value, 'blockNumber');\n // GraphQL Block_height.number is Int (signed 32 bit), rather than BigInt.\n if (value !== undefined && value > 2147483647n) {\n throw new OpacityIndexerError('INVALID_ARGUMENT', 'blockNumber exceeds the GraphQL Int range.');\n }\n if (hash !== undefined) return { hash: argument(bytes32, hash, 'blockHash') };\n return value === undefined ? null : { number: Number(value) };\n}\n\nfunction validateSnapshot(meta: IndexerMetadata, blockNumber?: bigint, blockHash?: Hex): void {\n if (blockNumber !== undefined && meta.block.number !== blockNumber) invalid('_meta.block.number');\n if (\n blockHash !== undefined &&\n meta.block.hash !== null &&\n meta.block.hash !== blockHash.toLowerCase()\n ) {\n throw new OpacityIndexerError(\n 'SNAPSHOT_CHANGED',\n 'Indexed block hash changed; restart the snapshot.',\n );\n }\n}\n\nfunction requireHealthyIndex(meta: IndexerMetadata): void {\n if (meta.hasIndexingErrors) {\n throw new OpacityIndexerError(\n 'INDEXING_ERROR',\n 'Subgraph reports indexing errors; indexed entity data was discarded.',\n );\n }\n}\n/** Separate unauthenticated transport: mobile-api headers and wallet auth never enter this factory. */\nexport function createIndexerNamespace(config: {\n url?: string | undefined;\n fetch?: FetchLike;\n timeoutMs?: number;\n}): OpacityIndexerNamespace {\n const request = createGraphqlExecutor(config);\n\n async function single<T>(\n entity: string,\n id: string,\n field: Field<T>,\n options: IndexerRequestOptions = {},\n ): Promise<IndexedResult<T>> {\n const data = await request(\n `query IndexedSingle($id:ID!,$block:Block_height){item:${entity}(id:$id,block:$block){${field.selection}} _meta(block:$block){${metaField.selection}}}`,\n { id, block: blockVariable(options.blockNumber, options.blockHash) },\n options,\n );\n const item = nullable(field).parse(data.item, 'item');\n if (item !== null && record(item, 'item').id !== id) invalid('item.id');\n const meta = metaField.parse(data._meta, '_meta');\n validateSnapshot(meta, options.blockNumber, options.blockHash);\n requireHealthyIndex(meta);\n return { item, meta };\n }\n\n async function page<T extends { id: Hex }>(\n entity: string,\n filterType: string,\n field: Field<T>,\n filters: Record<string, unknown>,\n options: IndexerPageOptions,\n ): Promise<IndexedPage<T>> {\n const size = options.pageSize ?? 100;\n if (!Number.isInteger(size) || size < 1 || size > 999) {\n throw new OpacityIndexerError('INVALID_ARGUMENT', 'pageSize must be an integer from 1–999.');\n }\n const scope = `${entity}:${JSON.stringify(filters)}`;\n const cursor = options.cursor;\n if (cursor) {\n argument(hex(), cursor.after, 'cursor.after');\n bigintArgument(cursor.blockNumber, 'cursor.blockNumber');\n argument(stringField, cursor.deployment, 'cursor.deployment');\n argument(nullable(bytes32), cursor.blockHash, 'cursor.blockHash');\n if (\n cursor.scope !== scope ||\n (options.blockNumber !== undefined && options.blockNumber !== cursor.blockNumber) ||\n (options.blockHash !== undefined && options.blockHash.toLowerCase() !== cursor.blockHash)\n ) {\n throw new OpacityIndexerError(\n 'INVALID_ARGUMENT',\n 'Cursor does not match the query filters or block.',\n );\n }\n }\n const after = cursor?.after ?? '0x';\n const blockNumber = cursor?.blockNumber ?? options.blockNumber;\n const blockHash = cursor?.blockHash ?? options.blockHash;\n const block = blockVariable(blockNumber, blockHash);\n // graph-node disallows column filters alongside `or`. Put the cursor inside each branch.\n const where = Array.isArray(filters.or)\n ? { or: filters.or.map((branch) => ({ ...record(branch, 'filter'), id_gt: after })) }\n : { ...filters, id_gt: after };\n const data = await request(\n `query IndexedPage($first:Int!,$where:${filterType}!,$block:Block_height){items:${entity}(first:$first,orderBy:id,orderDirection:asc,where:$where,block:$block){${field.selection}} _meta(block:$block){${metaField.selection}}}`,\n { first: size + 1, where, block },\n options,\n );\n const meta = metaField.parse(data._meta, '_meta');\n requireHealthyIndex(meta);\n if (cursor && cursor.deployment !== meta.deployment) {\n throw new OpacityIndexerError(\n 'DEPLOYMENT_CHANGED',\n 'Subgraph deployment changed; restart pagination.',\n );\n }\n validateSnapshot(meta, blockNumber, blockHash);\n const rows = array(field).parse(data.items, 'items');\n if (rows.length > size + 1) invalid('items.length');\n let previous = after;\n for (const row of rows) {\n if (row.id <= previous) invalid('items.id order');\n previous = row.id;\n }\n const items = rows.slice(0, size);\n return {\n items,\n meta,\n nextCursor:\n rows.length > size\n ? {\n after: items[items.length - 1]!.id,\n blockNumber: meta.block.number,\n blockHash: blockHash ?? meta.block.hash,\n deployment: meta.deployment,\n scope,\n }\n : null,\n };\n }\n\n const tokenFilters = (p: { token: Address }) => ({ token: argument(address, p.token, 'token') });\n const userFilters = (p: { userId: Hex }) => ({ user: argument(bytes32, p.userId, 'userId') });\n const vaultFilters = (p: { token?: Address; vault?: Address }) => ({\n ...(p.token === undefined ? {} : tokenFilters({ token: p.token })),\n ...(p.vault === undefined ? {} : { vault: argument(address, p.vault, 'vault') }),\n });\n const vaultMovementFilters = (p: ListIndexedVaultMovementsParams) => ({\n ...vaultFilters(p),\n ...(p.wallet === undefined ? {} : { user: argument(address, p.wallet, 'wallet') }),\n });\n\n const namespace: OpacityIndexerNamespace = {\n async getMetadata(options = {}) {\n const data = await request(\n `query IndexingMetadata($block:Block_height){_meta(block:$block){${metaField.selection}}}`,\n { block: blockVariable(options.blockNumber, options.blockHash) },\n options,\n );\n const meta = metaField.parse(data._meta, '_meta');\n validateSnapshot(meta, options.blockNumber, options.blockHash);\n return meta;\n },\n getRegistry: (options) => single('allowlistRegistryState', 'registry', registryField, options),\n getVault: (vault, options) =>\n single('issuerVault', argument(address, vault, 'vault'), vaultField, options),\n listVaults: (p = {}) =>\n page('issuerVaults', 'IssuerVault_filter', vaultField, vaultFilters(p), p),\n listVaultDeposits: (p = {}) =>\n page(\n 'vaultDepositEvents',\n 'VaultDepositEvent_filter',\n vaultMovementField,\n vaultMovementFilters(p),\n p,\n ),\n listVaultWithdrawals: (p = {}) =>\n page(\n 'vaultWithdrawalEvents',\n 'VaultWithdrawalEvent_filter',\n vaultMovementField,\n vaultMovementFilters(p),\n p,\n ),\n listVaultAdminExecutions: (p = {}) =>\n page(\n 'vaultAdminExecutedEvents',\n 'VaultAdminExecutedEvent_filter',\n vaultAdminField,\n {\n ...vaultFilters(p),\n ...(p.owner === undefined ? {} : { owner: argument(address, p.owner, 'owner') }),\n ...(p.target === undefined ? {} : { target: argument(address, p.target, 'target') }),\n },\n p,\n ),\n listTokens: (p = {}) =>\n page(\n 'tokens',\n 'Token_filter',\n tokenField,\n {\n ...(p.issuer === undefined ? {} : { issuer: argument(address, p.issuer, 'issuer') }),\n ...(p.registry === undefined\n ? {}\n : { allowlistRegistry: argument(address, p.registry, 'registry') }),\n },\n p,\n ),\n getToken: (token, options) =>\n single('token', argument(address, token, 'token'), tokenField, options),\n listTokenIds: (p) =>\n page('tokenSupplies', 'TokenSupply_filter', supplyField, tokenFilters(p), p),\n listTokenURIs: (p) => page('tokenURIs', 'TokenURI_filter', uriField, tokenFilters(p), p),\n listPolicies: (p) =>\n page(\n 'attachedPolicies',\n 'AttachedPolicy_filter',\n policyField,\n { ...tokenFilters(p), active: argument(bool, p.active ?? true, 'active') },\n p,\n ),\n getAccount: (wallet, options) =>\n single('account', argument(address, wallet, 'wallet'), accountField, options),\n getUser: (userId, options) =>\n single('user', argument(bytes32, userId, 'userId'), userRef, options),\n listUserAccounts: (p) =>\n page('allowlistEntries', 'AllowlistEntry_filter', entryField, userFilters(p), p),\n listGlobalTraits: (p) =>\n page('globalTraits', 'GlobalTrait_filter', globalTraitField, userFilters(p), p),\n listTokenTraits: (p) =>\n page(\n 'tokenTraits',\n 'TokenTrait_filter',\n tokenTraitField,\n { ...userFilters(p), ...(p.token === undefined ? {} : tokenFilters({ token: p.token })) },\n p,\n ),\n listBalances(p = {}) {\n if (p.wallet !== undefined && p.userId !== undefined) {\n throw new OpacityIndexerError(\n 'INVALID_ARGUMENT',\n 'Choose wallet or userId for balances, not both.',\n );\n }\n const filters = {\n ...(p.token === undefined ? {} : tokenFilters({ token: p.token })),\n ...(p.tokenId === undefined ? {} : { tokenId: bigintArgument(p.tokenId, 'tokenId') }),\n ...(argument(bool, p.positiveOnly ?? true, 'positiveOnly') ? { balance_gt: '0' } : {}),\n };\n if (p.userId !== undefined) {\n return page(\n 'userBalances',\n 'UserBalance_filter',\n userBalanceField,\n { ...filters, ...userFilters({ userId: p.userId }) },\n p,\n );\n }\n return page(\n 'tokenBalances',\n 'TokenBalance_filter',\n walletBalanceField,\n {\n ...filters,\n ...(p.wallet === undefined ? {} : { account: argument(address, p.wallet, 'wallet') }),\n },\n p,\n );\n },\n listTransfers(p = {}) {\n const filters = {\n ...(p.token === undefined ? {} : tokenFilters({ token: p.token })),\n ...(p.tokenId === undefined ? {} : { tokenId: bigintArgument(p.tokenId, 'tokenId') }),\n };\n const where =\n p.wallet === undefined\n ? filters\n : {\n or: [\n { ...filters, from: argument(address, p.wallet, 'wallet') },\n { ...filters, to: argument(address, p.wallet, 'wallet') },\n ],\n };\n return page('transferEvents', 'TransferEvent_filter', transferField, where, p);\n },\n listDocumentAttestations: (p = {}) =>\n page(\n 'documentAttestations',\n 'DocumentAttestation_filter',\n attestationField,\n {\n ...(p.wallet === undefined ? {} : { wallet: argument(address, p.wallet, 'wallet') }),\n ...(p.userId === undefined ? {} : userFilters({ userId: p.userId })),\n ...(p.traitId === undefined ? {} : { traitId: argument(bytes32, p.traitId, 'traitId') }),\n },\n p,\n ),\n };\n // Both direct and hosted reads use the same argument contract. Domain checks such as cursor\n // scope still run when constructing the query because they depend on the selected filters.\n return Object.fromEntries(\n INDEXER_OPERATIONS.map((operation) => [\n operation,\n async (...args: unknown[]) => {\n const validated = validateIndexerOperationArgs(operation, args);\n const invoke = namespace[operation] as (...values: unknown[]) => Promise<unknown>;\n return invoke(...validated);\n },\n ]),\n ) as unknown as OpacityIndexerNamespace;\n}\n\n/** Validate API-decoded domain values with the same schemas used for direct GraphQL data. */\nexport function validateIndexerOperationResult(\n operation: keyof OpacityIndexerNamespace,\n value: unknown,\n args: readonly unknown[] = [],\n): unknown {\n const last = args.at(-1);\n const options =\n last && typeof last === 'object' && !Array.isArray(last) ? (last as IndexerPageOptions) : {};\n const requestedBlock = options.cursor?.blockNumber ?? options.blockNumber;\n const requestedHash = options.cursor?.blockHash ?? options.blockHash;\n if (operation === 'getMetadata') {\n const meta = metaField.parse(value, 'metadata', true);\n validateSnapshot(meta, requestedBlock, requestedHash ?? undefined);\n return meta;\n }\n const result = record(value, 'result');\n const meta = metaField.parse(result['meta'], 'meta', true);\n requireHealthyIndex(meta);\n validateSnapshot(meta, requestedBlock, requestedHash ?? undefined);\n if (options.cursor && options.cursor.deployment !== meta.deployment)\n throw new OpacityIndexerError(\n 'DEPLOYMENT_CHANGED',\n 'Subgraph deployment changed; restart pagination.',\n );\n const fields: Record<Exclude<keyof OpacityIndexerNamespace, 'getMetadata'>, Field<unknown>> = {\n getRegistry: registryField,\n getToken: tokenField,\n getAccount: accountField,\n getUser: userRef,\n getVault: vaultField,\n listTokens: tokenField,\n listTokenIds: supplyField,\n listTokenURIs: uriField,\n listPolicies: policyField,\n listUserAccounts: entryField,\n listGlobalTraits: globalTraitField,\n listTokenTraits: tokenTraitField,\n listBalances:\n args[0] &&\n typeof args[0] === 'object' &&\n (args[0] as Record<string, unknown>)['userId'] !== undefined\n ? userBalanceField\n : walletBalanceField,\n listTransfers: transferField,\n listDocumentAttestations: attestationField,\n listVaults: vaultField,\n listVaultDeposits: vaultMovementField,\n listVaultWithdrawals: vaultMovementField,\n listVaultAdminExecutions: vaultAdminField,\n };\n const field = fields[operation];\n if (operation.startsWith('get')) {\n const item = nullable(field).parse(result['item'], 'item', true);\n const id =\n operation === 'getRegistry'\n ? 'registry'\n : typeof args[0] === 'string'\n ? args[0].toLowerCase()\n : undefined;\n if (item !== null && record(item, 'item')['id'] !== id) invalid('item.id');\n return { item, meta };\n }\n const items = array(field).parse(result['items'], 'items', true);\n if (items.length > (options.pageSize ?? 100)) invalid('items.length');\n const cursorField = object({\n after: hex(),\n blockNumber: uint,\n blockHash: nullable(bytes32),\n deployment: stringField,\n scope: stringField,\n });\n const nextCursor = nullable(cursorField).parse(result['nextCursor'], 'nextCursor', true);\n if (\n nextCursor &&\n (nextCursor.deployment !== meta.deployment ||\n nextCursor.blockNumber !== meta.block.number ||\n (meta.block.hash !== null && nextCursor.blockHash !== meta.block.hash))\n )\n invalid('nextCursor.snapshot');\n if (nextCursor && options.cursor && nextCursor.scope !== options.cursor.scope)\n invalid('nextCursor.scope');\n let previous = options.cursor?.after ?? '';\n for (const item of items) {\n const id = record(item, 'item')['id'];\n if (typeof id !== 'string' || id <= previous) invalid('items.id order');\n previous = id;\n }\n if (nextCursor && nextCursor.after !== previous) invalid('nextCursor.after');\n return { items, meta, nextCursor };\n}\n","import { OpacityIndexerError } from './errors.js';\nexport { INDEXER_OPERATIONS } from './arguments.js';\nexport type { IndexerOperation } from './arguments.js';\n\nexport type WireValue =\n null | boolean | number | string | WireValue[] | { [key: string]: WireValue };\n\n/** Lossless JSON encoding. The reserved __bigint marker must contain only a decimal integer. */\nexport function encodeWireValue(value: unknown): WireValue {\n if (typeof value === 'bigint') return { __bigint: value.toString() };\n if (value === null || typeof value === 'boolean' || typeof value === 'string') return value;\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (Array.isArray(value)) return value.map(encodeWireValue);\n if (\n typeof value === 'object' &&\n value !== null &&\n Object.getPrototypeOf(value) === Object.prototype\n ) {\n if ('__bigint' in value)\n throw new OpacityIndexerError('INVALID_ARGUMENT', '__bigint is reserved.');\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, item]) => item !== undefined)\n .map(([key, item]) => [key, encodeWireValue(item)]),\n );\n }\n throw new OpacityIndexerError(\n 'INVALID_ARGUMENT',\n 'Indexer arguments must be JSON values or bigint.',\n );\n}\n\n/** Decode only the reserved marker; ordinary decimal strings remain strings. */\nexport function decodeWireValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(decodeWireValue);\n if (typeof value === 'object' && value !== null) {\n const record = value as Record<string, unknown>;\n if ('__bigint' in record) {\n if (\n Object.keys(record).length !== 1 ||\n typeof record['__bigint'] !== 'string' ||\n !/^-?(0|[1-9]\\d*)$/.test(record['__bigint'])\n ) {\n throw new OpacityIndexerError('INVALID_RESPONSE', 'Malformed bigint in indexer response.');\n }\n return BigInt(record['__bigint']);\n }\n return Object.fromEntries(\n Object.entries(record).map(([key, item]) => [key, decodeWireValue(item)]),\n );\n }\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value))\n )\n return value;\n throw new OpacityIndexerError('INVALID_RESPONSE', 'Malformed indexer wire value.');\n}\n","import type { FetchLike } from '../transport.js';\nimport { createGraphqlExecutor, validateSubgraphUrl } from './executor.js';\n\nexport interface SubgraphRequestOptions {\n signal?: AbortSignal;\n timeoutMs?: number;\n}\nexport interface SubgraphClientConfig {\n url: string;\n fetch?: FetchLike;\n timeoutMs?: number;\n headers?: Record<string, string>;\n}\nexport interface SubgraphClient {\n query<T>(\n query: string,\n variables?: Record<string, unknown>,\n options?: SubgraphRequestOptions,\n ): Promise<T>;\n}\n\n/** Direct GraphQL adapter for trusted applications that own their endpoint configuration. */\nexport function createSubgraphClient(config: SubgraphClientConfig): SubgraphClient {\n validateSubgraphUrl(config.url);\n const request = createGraphqlExecutor(config);\n return {\n async query<T>(\n query: string,\n variables?: Record<string, unknown>,\n options?: SubgraphRequestOptions,\n ): Promise<T> {\n return (await request(query, variables, options)) as T;\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { A as AttestationErrorCode } from './types-B4Yi7WA4.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Base class for every error thrown by this SDK, so consumers can do a single
|
|
5
|
+
* `instanceof OpacityIssuerError` check at their integration boundary.
|
|
6
|
+
*/
|
|
7
|
+
declare class OpacityIssuerError extends Error {
|
|
8
|
+
constructor(message: string, options?: {
|
|
9
|
+
cause?: unknown;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
/** Thrown when `createOpacityIssuerClient` is called with invalid configuration. */
|
|
13
|
+
declare class OpacityConfigError extends OpacityIssuerError {
|
|
14
|
+
constructor(message: string, options?: {
|
|
15
|
+
cause?: unknown;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Thrown by the document-attestation builders when a parameter would produce a transaction the
|
|
20
|
+
* `DocumentAttestor` is guaranteed to reject, or is too malformed to encode.
|
|
21
|
+
*
|
|
22
|
+
* Branch on {@link code}, not on the message: each value names the on-chain error it stands in for,
|
|
23
|
+
* so a pre-flight rejection is legible in the same terms as the revert it saved.
|
|
24
|
+
*/
|
|
25
|
+
declare class OpacityAttestationError extends OpacityIssuerError {
|
|
26
|
+
/** Which check failed. Mirrors a contract error name where one exists. */
|
|
27
|
+
readonly code: AttestationErrorCode;
|
|
28
|
+
/** The offending parameter, when the failure is attributable to a single one. */
|
|
29
|
+
readonly field: string | undefined;
|
|
30
|
+
constructor(code: AttestationErrorCode, message: string, options?: {
|
|
31
|
+
field?: string;
|
|
32
|
+
cause?: unknown;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Minimal fetch interface shared by direct transports. */
|
|
37
|
+
type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;
|
|
38
|
+
|
|
39
|
+
export { type FetchLike as F, OpacityIssuerError as O, OpacityAttestationError as a, OpacityConfigError as b };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { A as AttestationErrorCode } from './types-B4Yi7WA4.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Base class for every error thrown by this SDK, so consumers can do a single
|
|
5
|
+
* `instanceof OpacityIssuerError` check at their integration boundary.
|
|
6
|
+
*/
|
|
7
|
+
declare class OpacityIssuerError extends Error {
|
|
8
|
+
constructor(message: string, options?: {
|
|
9
|
+
cause?: unknown;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
/** Thrown when `createOpacityIssuerClient` is called with invalid configuration. */
|
|
13
|
+
declare class OpacityConfigError extends OpacityIssuerError {
|
|
14
|
+
constructor(message: string, options?: {
|
|
15
|
+
cause?: unknown;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Thrown by the document-attestation builders when a parameter would produce a transaction the
|
|
20
|
+
* `DocumentAttestor` is guaranteed to reject, or is too malformed to encode.
|
|
21
|
+
*
|
|
22
|
+
* Branch on {@link code}, not on the message: each value names the on-chain error it stands in for,
|
|
23
|
+
* so a pre-flight rejection is legible in the same terms as the revert it saved.
|
|
24
|
+
*/
|
|
25
|
+
declare class OpacityAttestationError extends OpacityIssuerError {
|
|
26
|
+
/** Which check failed. Mirrors a contract error name where one exists. */
|
|
27
|
+
readonly code: AttestationErrorCode;
|
|
28
|
+
/** The offending parameter, when the failure is attributable to a single one. */
|
|
29
|
+
readonly field: string | undefined;
|
|
30
|
+
constructor(code: AttestationErrorCode, message: string, options?: {
|
|
31
|
+
field?: string;
|
|
32
|
+
cause?: unknown;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Minimal fetch interface shared by direct transports. */
|
|
37
|
+
type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;
|
|
38
|
+
|
|
39
|
+
export { type FetchLike as F, OpacityIssuerError as O, OpacityAttestationError as a, OpacityConfigError as b };
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Hex, Address } from 'viem';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Which `DocumentAttestor` deployment, on which chain.
|
|
5
|
+
*
|
|
6
|
+
* Passed explicitly on every call: the attestor is non-upgradeable, so iterating on it means
|
|
7
|
+
* redeploying, and pinning addresses inside the SDK would make consumers depend on an SDK release
|
|
8
|
+
* to follow a redeploy. `chainId` is consensus-critical — it is part of the EIP-712 domain, and it
|
|
9
|
+
* is what makes a signature from one chain inert on another.
|
|
10
|
+
*/
|
|
11
|
+
interface DocumentAttestorContext {
|
|
12
|
+
/** Address of the deployed `DocumentAttestor` (the EIP-712 `verifyingContract`). */
|
|
13
|
+
attestorAddress: Address;
|
|
14
|
+
/** Chain the attestor is deployed on. */
|
|
15
|
+
chainId: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The server-issued session an attestation is redeemed against.
|
|
19
|
+
*
|
|
20
|
+
* All four fields come from the document server, which has already signed over them — a relayer
|
|
21
|
+
* (or the SDK) that alters any of them breaks the server's signature.
|
|
22
|
+
*/
|
|
23
|
+
interface AttestationSession {
|
|
24
|
+
/** Single-use session nonce, burned by `attestDocument`. Zero is a legal value on-chain. */
|
|
25
|
+
nonce: Hex;
|
|
26
|
+
/** Hash of the EXECUTED document — the post-signature artifact, not the template. */
|
|
27
|
+
docHash: Hex;
|
|
28
|
+
/** Session issuance time, unix seconds. Anchors the lifetime cap. */
|
|
29
|
+
issuedAt: bigint;
|
|
30
|
+
/** Session expiry, unix seconds. Signed by both parties. */
|
|
31
|
+
deadline: bigint;
|
|
32
|
+
}
|
|
33
|
+
/** Opt-in wall-clock, for the checks that depend on "now". */
|
|
34
|
+
interface ClockOptions {
|
|
35
|
+
/**
|
|
36
|
+
* Unix seconds to evaluate `issuedAt`/`deadline` against.
|
|
37
|
+
*
|
|
38
|
+
* Omitted by default so the builders stay pure and deterministic, and so a skewed client clock
|
|
39
|
+
* cannot reject a session the chain would have accepted. Pass `BigInt(Math.floor(Date.now() /
|
|
40
|
+
* 1000))` to opt in.
|
|
41
|
+
*/
|
|
42
|
+
now?: bigint;
|
|
43
|
+
}
|
|
44
|
+
interface BuildDocumentAcceptanceTypedDataParams extends DocumentAttestorContext, ClockOptions {
|
|
45
|
+
nonce: Hex;
|
|
46
|
+
docHash: Hex;
|
|
47
|
+
deadline: bigint;
|
|
48
|
+
/**
|
|
49
|
+
* Optional. The investor does not sign `issuedAt`, but supplying it lets the builder reject a
|
|
50
|
+
* session that exceeds `MAX_ATTESTATION_LIFETIME` before the wallet prompt is raised, instead of
|
|
51
|
+
* at redemption after the investor has already signed.
|
|
52
|
+
*/
|
|
53
|
+
issuedAt?: bigint;
|
|
54
|
+
}
|
|
55
|
+
interface BuildAttestDocumentTransactionParams extends DocumentAttestorContext, AttestationSession, ClockOptions {
|
|
56
|
+
/** Investor wallet the trait resolves through. Passed explicitly, not recovered. */
|
|
57
|
+
wallet: Address;
|
|
58
|
+
/** Trait to enable, version baked in (e.g. `documentTraitId('doc.offering7.subscription.v1')`). */
|
|
59
|
+
traitId: Hex;
|
|
60
|
+
/** ECDSA signature by the document server over `AttestationAuthorization`. Always 65 bytes. */
|
|
61
|
+
serverSignature: Hex;
|
|
62
|
+
/** Investor signature over `DocumentAcceptance`. ECDSA (65 bytes) or ERC-1271 (any length). */
|
|
63
|
+
userSignature: Hex;
|
|
64
|
+
/**
|
|
65
|
+
* Optional sender to pin on the returned descriptor — the gas sponsor's address.
|
|
66
|
+
*
|
|
67
|
+
* The investor never sends this transaction: their single interaction is the off-chain
|
|
68
|
+
* `DocumentAcceptance` signature, which a backend relays with a sponsor key. So `from` names the
|
|
69
|
+
* relayer account paying for gas, not `wallet`. Pinning it is a hand-off convenience, not a
|
|
70
|
+
* security property: the attestor never reads `msg.sender`, so this changes the transaction's
|
|
71
|
+
* meaning not at all, only which account the relayer's wallet stack will ask to sign it — which
|
|
72
|
+
* matters when that stack holds more than one key.
|
|
73
|
+
*
|
|
74
|
+
* Omit it to let the sending stack pick, or when handing the descriptor to a signer that already
|
|
75
|
+
* knows its own account.
|
|
76
|
+
*/
|
|
77
|
+
from?: Address;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* A chain-agnostic transaction descriptor.
|
|
81
|
+
*
|
|
82
|
+
* `attestDocument` is permissionless, so `from` is optional: omitted, the descriptor names no
|
|
83
|
+
* sender and whichever account the relayer's stack is holding will do. `chainId` is included so
|
|
84
|
+
* the sender can assert it is on the right chain rather than silently broadcasting elsewhere.
|
|
85
|
+
*/
|
|
86
|
+
interface TransactionRequest {
|
|
87
|
+
to: Address;
|
|
88
|
+
data: Hex;
|
|
89
|
+
value: bigint;
|
|
90
|
+
chainId: number;
|
|
91
|
+
/**
|
|
92
|
+
* Expected JSON-RPC sender, when pinned. This is metadata, not wallet enforcement: viem callers
|
|
93
|
+
* must still pass the same address as `account` to `sendTransaction`.
|
|
94
|
+
*/
|
|
95
|
+
from?: Address;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Why a pre-flight check failed.
|
|
99
|
+
*
|
|
100
|
+
* Most values mirror a custom error on `DocumentAttestor` (or, for `InvalidSignatureLength`,
|
|
101
|
+
* OpenZeppelin's `ECDSAInvalidSignatureLength`) so a rejection here reads the same as the revert it
|
|
102
|
+
* prevents. Two have no on-chain counterpart: `MalformedInput` covers input that is not well-formed
|
|
103
|
+
* enough to encode, and `DocHashMismatch` covers a check the chain cannot perform at all — the
|
|
104
|
+
* attestor never sees the document, only its hash.
|
|
105
|
+
*/
|
|
106
|
+
type AttestationErrorCode = 'ZeroAddress' | 'InvalidTraitId' | 'InvalidDocHash' | 'AttestationExpired' | 'AttestationDeadlineTooFar' | 'AttestationIssuedInFuture' | 'InvalidSignatureLength' | 'MalformedInput' | 'DocHashMismatch';
|
|
107
|
+
|
|
108
|
+
export type { AttestationErrorCode as A, BuildAttestDocumentTransactionParams as B, ClockOptions as C, DocumentAttestorContext as D, TransactionRequest as T, AttestationSession as a, BuildDocumentAcceptanceTypedDataParams as b };
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Hex, Address } from 'viem';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Which `DocumentAttestor` deployment, on which chain.
|
|
5
|
+
*
|
|
6
|
+
* Passed explicitly on every call: the attestor is non-upgradeable, so iterating on it means
|
|
7
|
+
* redeploying, and pinning addresses inside the SDK would make consumers depend on an SDK release
|
|
8
|
+
* to follow a redeploy. `chainId` is consensus-critical — it is part of the EIP-712 domain, and it
|
|
9
|
+
* is what makes a signature from one chain inert on another.
|
|
10
|
+
*/
|
|
11
|
+
interface DocumentAttestorContext {
|
|
12
|
+
/** Address of the deployed `DocumentAttestor` (the EIP-712 `verifyingContract`). */
|
|
13
|
+
attestorAddress: Address;
|
|
14
|
+
/** Chain the attestor is deployed on. */
|
|
15
|
+
chainId: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The server-issued session an attestation is redeemed against.
|
|
19
|
+
*
|
|
20
|
+
* All four fields come from the document server, which has already signed over them — a relayer
|
|
21
|
+
* (or the SDK) that alters any of them breaks the server's signature.
|
|
22
|
+
*/
|
|
23
|
+
interface AttestationSession {
|
|
24
|
+
/** Single-use session nonce, burned by `attestDocument`. Zero is a legal value on-chain. */
|
|
25
|
+
nonce: Hex;
|
|
26
|
+
/** Hash of the EXECUTED document — the post-signature artifact, not the template. */
|
|
27
|
+
docHash: Hex;
|
|
28
|
+
/** Session issuance time, unix seconds. Anchors the lifetime cap. */
|
|
29
|
+
issuedAt: bigint;
|
|
30
|
+
/** Session expiry, unix seconds. Signed by both parties. */
|
|
31
|
+
deadline: bigint;
|
|
32
|
+
}
|
|
33
|
+
/** Opt-in wall-clock, for the checks that depend on "now". */
|
|
34
|
+
interface ClockOptions {
|
|
35
|
+
/**
|
|
36
|
+
* Unix seconds to evaluate `issuedAt`/`deadline` against.
|
|
37
|
+
*
|
|
38
|
+
* Omitted by default so the builders stay pure and deterministic, and so a skewed client clock
|
|
39
|
+
* cannot reject a session the chain would have accepted. Pass `BigInt(Math.floor(Date.now() /
|
|
40
|
+
* 1000))` to opt in.
|
|
41
|
+
*/
|
|
42
|
+
now?: bigint;
|
|
43
|
+
}
|
|
44
|
+
interface BuildDocumentAcceptanceTypedDataParams extends DocumentAttestorContext, ClockOptions {
|
|
45
|
+
nonce: Hex;
|
|
46
|
+
docHash: Hex;
|
|
47
|
+
deadline: bigint;
|
|
48
|
+
/**
|
|
49
|
+
* Optional. The investor does not sign `issuedAt`, but supplying it lets the builder reject a
|
|
50
|
+
* session that exceeds `MAX_ATTESTATION_LIFETIME` before the wallet prompt is raised, instead of
|
|
51
|
+
* at redemption after the investor has already signed.
|
|
52
|
+
*/
|
|
53
|
+
issuedAt?: bigint;
|
|
54
|
+
}
|
|
55
|
+
interface BuildAttestDocumentTransactionParams extends DocumentAttestorContext, AttestationSession, ClockOptions {
|
|
56
|
+
/** Investor wallet the trait resolves through. Passed explicitly, not recovered. */
|
|
57
|
+
wallet: Address;
|
|
58
|
+
/** Trait to enable, version baked in (e.g. `documentTraitId('doc.offering7.subscription.v1')`). */
|
|
59
|
+
traitId: Hex;
|
|
60
|
+
/** ECDSA signature by the document server over `AttestationAuthorization`. Always 65 bytes. */
|
|
61
|
+
serverSignature: Hex;
|
|
62
|
+
/** Investor signature over `DocumentAcceptance`. ECDSA (65 bytes) or ERC-1271 (any length). */
|
|
63
|
+
userSignature: Hex;
|
|
64
|
+
/**
|
|
65
|
+
* Optional sender to pin on the returned descriptor — the gas sponsor's address.
|
|
66
|
+
*
|
|
67
|
+
* The investor never sends this transaction: their single interaction is the off-chain
|
|
68
|
+
* `DocumentAcceptance` signature, which a backend relays with a sponsor key. So `from` names the
|
|
69
|
+
* relayer account paying for gas, not `wallet`. Pinning it is a hand-off convenience, not a
|
|
70
|
+
* security property: the attestor never reads `msg.sender`, so this changes the transaction's
|
|
71
|
+
* meaning not at all, only which account the relayer's wallet stack will ask to sign it — which
|
|
72
|
+
* matters when that stack holds more than one key.
|
|
73
|
+
*
|
|
74
|
+
* Omit it to let the sending stack pick, or when handing the descriptor to a signer that already
|
|
75
|
+
* knows its own account.
|
|
76
|
+
*/
|
|
77
|
+
from?: Address;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* A chain-agnostic transaction descriptor.
|
|
81
|
+
*
|
|
82
|
+
* `attestDocument` is permissionless, so `from` is optional: omitted, the descriptor names no
|
|
83
|
+
* sender and whichever account the relayer's stack is holding will do. `chainId` is included so
|
|
84
|
+
* the sender can assert it is on the right chain rather than silently broadcasting elsewhere.
|
|
85
|
+
*/
|
|
86
|
+
interface TransactionRequest {
|
|
87
|
+
to: Address;
|
|
88
|
+
data: Hex;
|
|
89
|
+
value: bigint;
|
|
90
|
+
chainId: number;
|
|
91
|
+
/**
|
|
92
|
+
* Expected JSON-RPC sender, when pinned. This is metadata, not wallet enforcement: viem callers
|
|
93
|
+
* must still pass the same address as `account` to `sendTransaction`.
|
|
94
|
+
*/
|
|
95
|
+
from?: Address;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Why a pre-flight check failed.
|
|
99
|
+
*
|
|
100
|
+
* Most values mirror a custom error on `DocumentAttestor` (or, for `InvalidSignatureLength`,
|
|
101
|
+
* OpenZeppelin's `ECDSAInvalidSignatureLength`) so a rejection here reads the same as the revert it
|
|
102
|
+
* prevents. Two have no on-chain counterpart: `MalformedInput` covers input that is not well-formed
|
|
103
|
+
* enough to encode, and `DocHashMismatch` covers a check the chain cannot perform at all — the
|
|
104
|
+
* attestor never sees the document, only its hash.
|
|
105
|
+
*/
|
|
106
|
+
type AttestationErrorCode = 'ZeroAddress' | 'InvalidTraitId' | 'InvalidDocHash' | 'AttestationExpired' | 'AttestationDeadlineTooFar' | 'AttestationIssuedInFuture' | 'InvalidSignatureLength' | 'MalformedInput' | 'DocHashMismatch';
|
|
107
|
+
|
|
108
|
+
export type { AttestationErrorCode as A, BuildAttestDocumentTransactionParams as B, ClockOptions as C, DocumentAttestorContext as D, TransactionRequest as T, AttestationSession as a, BuildDocumentAcceptanceTypedDataParams as b };
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "opacity-issuer-core",
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Backend-independent Opacity protocol primitives and direct subgraph client",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/OpacityLabs/opacity-issuer-sdk.git",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"sideEffects": false,
|
|
13
|
+
"main": "./dist/index.cjs",
|
|
14
|
+
"module": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"import": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"default": "./dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"require": {
|
|
23
|
+
"types": "./dist/index.d.cts",
|
|
24
|
+
"default": "./dist/index.cjs"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"./package.json": "./package.json",
|
|
28
|
+
"./subgraph": {
|
|
29
|
+
"import": {
|
|
30
|
+
"types": "./dist/subgraph.d.ts",
|
|
31
|
+
"default": "./dist/subgraph.js"
|
|
32
|
+
},
|
|
33
|
+
"require": {
|
|
34
|
+
"types": "./dist/subgraph.d.cts",
|
|
35
|
+
"default": "./dist/subgraph.cjs"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"./documents": {
|
|
39
|
+
"import": {
|
|
40
|
+
"types": "./dist/documents/index.d.ts",
|
|
41
|
+
"default": "./dist/documents/index.js"
|
|
42
|
+
},
|
|
43
|
+
"require": {
|
|
44
|
+
"types": "./dist/documents/index.d.cts",
|
|
45
|
+
"default": "./dist/documents/index.cjs"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"./validation": {
|
|
49
|
+
"import": {
|
|
50
|
+
"types": "./dist/documents/validate.d.ts",
|
|
51
|
+
"default": "./dist/documents/validate.js"
|
|
52
|
+
},
|
|
53
|
+
"require": {
|
|
54
|
+
"types": "./dist/documents/validate.d.cts",
|
|
55
|
+
"default": "./dist/documents/validate.cjs"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"files": [
|
|
60
|
+
"dist",
|
|
61
|
+
"README.md",
|
|
62
|
+
"LICENSE"
|
|
63
|
+
],
|
|
64
|
+
"engines": {
|
|
65
|
+
"node": ">=18"
|
|
66
|
+
},
|
|
67
|
+
"peerDependencies": {
|
|
68
|
+
"viem": "^2.0.0"
|
|
69
|
+
},
|
|
70
|
+
"scripts": {
|
|
71
|
+
"build": "tsup",
|
|
72
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
73
|
+
"test": "vitest run --config ../../vitest.config.ts --root ../.. packages/core"
|
|
74
|
+
}
|
|
75
|
+
}
|