@chipi-stack/backend 14.2.1 → 14.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +29 -0
- package/dist/index.mjs.map +1 -1
- package/dist/skuPurchases.js +12 -0
- package/dist/skuPurchases.js.map +1 -1
- package/dist/skuPurchases.mjs +12 -0
- package/dist/skuPurchases.mjs.map +1 -1
- package/dist/transactions.d.mts +7 -1
- package/dist/transactions.d.ts +7 -1
- package/dist/transactions.js +12 -0
- package/dist/transactions.js.map +1 -1
- package/dist/transactions.mjs +12 -0
- package/dist/transactions.mjs.map +1 -1
- package/dist/wallets.d.mts +12 -0
- package/dist/wallets.d.ts +12 -0
- package/dist/wallets.js +17 -0
- package/dist/wallets.js.map +1 -1
- package/dist/wallets.mjs +17 -0
- package/dist/wallets.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/lib/encryption.ts","../src/wallets.ts","../src/paymaster-adapter.ts","../src/execute-paymaster-transaction.ts","../src/transactions.ts","../src/exchanges.ts","../src/sku-purchases.ts","../src/skus.ts","../src/sessions.ts","../src/x402/facilitator.ts","../src/sign-typed-data.ts","../src/chipi-sdk.ts","../src/chipi-server-sdk.ts","../src/chipi-browser-sdk.ts","../src/x402/middleware.ts"],"names":["isValidApiKey","ChipiAuthError","STARKNET_NETWORKS","API_VERSIONING","validateErrorResponse","ChipiApiError","handleApiError","CryptoES","WALLET_RPC_ENDPOINTS","RpcProvider","ec","WALLET_CLASS_HASHES","hash","Account","API_ENDPOINTS","typedData","num","ChipiTransactionError","CairoCustomEnum","CairoOption","CairoOptionVariant","CallData","getWalletTypeFromClassHash","apiMessage","ChipiSessionError","SESSION_ERRORS","STARKNET_CONTRACTS","formatAmount","Chain","SKU_CONTRACTS","cairo","CARRIER_IDS","SERVICE_TYPES","SESSION_DEFAULTS","SESSION_ENTRYPOINTS","CONTRACT_ADDRESSES","buildX402TypedData","starknetTypedData","uint256","TOKEN_DECIMALS","requirement"],"mappings":";;;;;;;;;;;;;AAaO,IAAM,cAAN,MAAkB;AAAA,EAOvB,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAI,CAACA,oBAAA,CAAc,MAAA,CAAO,YAAY,CAAA,EAAG;AACvC,MAAA,MAAM,IAAIC,sBAAe,wBAAwB,CAAA;AAAA,IACnD;AAEA,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAC3B,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,QAAA;AAC7B,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,UAAA,EAAW;AAC/B,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAWC,wBAAA,CAAkB,OAAA;AACnD,IAAA,IAAA,CAAK,UAAA,GAAa,QAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEQ,UAAA,GAAqB;AAC3B,IAAA,MAAM,OAAA,GAAU,CAAA,CAAA,EAAIC,qBAAA,CAAe,OAAO,CAAA,CAAA;AAE1C,IAAA,IAAI,KAAK,cAAA,EAAgB;AAEvB,MAAA,MAAM,QAAA,GAAW,KAAK,cAAA,CAAe,OAAA,CAAQ,cAAc,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChF,MAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAO,4BAA4B,OAAO,CAAA,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiB,GAAA,EAAgB;AACvC,IAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,qBAAA,EAAuBA,qBAAA,CAAe,YAAY,CAAA;AAAA,EAC5E;AAAA,EAEQ,WAAW,WAAA,EAA8C;AAC/D,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,aAAa,IAAA,CAAK;AAAA,KACpB;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,GAAA,CAAO;AAAA,IACX,QAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,EAIe;AACb,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AAGhD,MAAA,IAAA,CAAK,iBAAiB,GAAG,CAAA;AAEzB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC/C,UAAA,IAAI,KAAA,KAAU,KAAA,CAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,YAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAC5C;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG;AAAA,QAC3C,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,WAAW;AAAA,OACrC,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAYC,6BAAsB,IAAI,CAAA;AAC5C,QAAA,MAAM,IAAIC,oBAAA;AAAA,UACR,SAAA,CAAU,OAAA;AAAA,UACV,SAAA,CAAU,IAAA,IAAQ,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,UACzC,QAAA,CAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAMC,sBAAe,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CAAQ;AAAA,IACZ,QAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF,EAIe;AACb,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AAGhD,MAAA,IAAA,CAAK,iBAAiB,GAAG,CAAA;AAEzB,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG;AAAA,QAC3C,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA;AAAA,QACpC,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA;AAAA,OACrC,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAYF,6BAAsB,IAAI,CAAA;AAC5C,QAAA,MAAM,IAAIC,oBAAA;AAAA,UACR,SAAA,CAAU,OAAA;AAAA,UACV,SAAA,CAAU,IAAA,IAAQ,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,UACzC,QAAA,CAAS;AAAA,SACX;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAMC,sBAAe,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAO;AAAA,IACX,QAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF,EAIe;AACb,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AAGhD,MAAA,IAAA,CAAK,iBAAiB,GAAG,CAAA;AAEzB,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG;AAAA,QAC3C,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA;AAAA,QACpC,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA;AAAA,OACrC,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAYF,6BAAsB,IAAI,CAAA;AAC5C,QAAA,MAAM,IAAIC,oBAAA;AAAA,UACR,SAAA,CAAU,OAAA;AAAA,UACV,SAAA,CAAU,IAAA,IAAQ,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,UACzC,QAAA,CAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAMC,sBAAe,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CAAS;AAAA,IACb,QAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF,EAIe;AACb,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AAGhD,MAAA,IAAA,CAAK,iBAAiB,GAAG,CAAA;AAEzB,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG;AAAA,QAC3C,MAAA,EAAQ,OAAA;AAAA,QACR,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA;AAAA,QACpC,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA;AAAA,OACrC,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAYF,6BAAsB,IAAI,CAAA;AAC5C,QAAA,MAAM,IAAIC,oBAAA;AAAA,UACR,SAAA,CAAU,OAAA;AAAA,UACV,SAAA,CAAU,IAAA,IAAQ,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,UACzC,QAAA,CAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAMC,sBAAe,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,CAAU;AAAA,IACd,QAAA;AAAA,IACA;AAAA,GACF,EAGe;AACb,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AAGhD,MAAA,IAAA,CAAK,iBAAiB,GAAG,CAAA;AAEzB,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG;AAAA,QAC3C,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,WAAW;AAAA,OACrC,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAYF,6BAAsB,IAAI,CAAA;AAC5C,QAAA,MAAM,IAAIC,oBAAA;AAAA,UACR,SAAA,CAAU,OAAA;AAAA,UACV,SAAA,CAAU,IAAA,IAAQ,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,UACzC,QAAA,CAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAMC,sBAAe,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AACF;ACtQO,IAAM,iBAAA,GAAoB,CAAC,UAAA,EAAoB,QAAA,KAA6B;AACjF,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,EACzD;AAEA,EAAA,OAAOC,0BAAS,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,QAAQ,EAAE,QAAA,EAAS;AAC7D;AAEO,IAAM,iBAAA,GAAoB,CAAC,mBAAA,EAA6B,QAAA,KAA6B;AAC1F,EAAA,IAAI,CAAC,mBAAA,IAAuB,CAAC,QAAA,EAAU;AACrC,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQA,yBAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,qBAAqB,QAAQ,CAAA;AAChE,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,QAAA,CAASA,yBAAA,CAAS,IAAI,IAAI,CAAA;AAClD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,SAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAE,CAAA;AAAA,EAC/C;AACF;;;ACcO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,MAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AA4MpB,IAAA,IAAA,CAAA,eAAA,GAAkB,MAAM;AAGtB,MAAA,MAAM,eAAA,GAAkBA,yBAAAA,CAAS,GAAA,CAAI,SAAA,CAAU,OAAO,EAAE,CAAA;AAExD,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,QAAA,CAASA,yBAAAA,CAAS,IAAI,GAAG,CAAA;AAG5D,MAAA,MAAM,cAAA,GAAiB,KAAK,UAAU,CAAA,CAAA;AAItC,MAAA,MAAM,gBAAA,GAAmB,MAAA;AAAA,QACvB;AAAA,OACF;AACA,MAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,cAAc,CAAA,GAAI,gBAAA;AAGlD,MAAA,OAAO,CAAA,EAAA,EAAK,gBAAA,CAAiB,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAAA,IAC3C,CAAA;AAAA,EA/N0C;AAAA,EAE1C,MAAM,aACJ,MAAA,EAC+B;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM;AAAA,QACJ,UAAA;AAAA,QACA,cAAA;AAAA,QACA,WAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA,GAAa,OAAA;AAAA;AAAA,QACb,SAAA,EAAW,eAAA;AAAA,QACX,UAAA;AAAA,QACA;AAAA,OACF,GAAI,MAAA;AAEJ,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,MAC9D;AAGA,MAAA,MAAM,MAAA,GACJ,UAAA,KAAe,OAAA,GAAUC,2BAAA,CAAqB,QAAQA,2BAAA,CAAqB,KAAA;AAE7E,MAAA,MAAM,WAAW,IAAIC,oBAAA,CAAY,EAAE,OAAA,EAAS,QAAQ,CAAA;AAGpD,MAAA,MAAM,YAAA,GAAe,KAAK,eAAA,EAAgB;AAC1C,MAAA,MAAM,aAAA,GAAgBC,WAAA,CAAG,UAAA,CAAW,WAAA,CAAY,YAAY,CAAA;AAG5D,MAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,wBAAA,CAAyB,UAAA,EAAY,aAAa,CAAA;AAGnF,MAAA,MAAM,mBACJ,eAAA,KACC,UAAA,KAAe,OAAA,GAAUC,0BAAA,CAAoB,QAAQA,0BAAA,CAAoB,KAAA,CAAA;AAG5E,MAAA,MAAM,YAAYC,aAAA,CAAK,gCAAA;AAAA,QACrB,aAAA;AAAA,QACA,gBAAA;AAAA,QACA,mBAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,OAAA,GAAU,IAAIC,gBAAA,CAAQ,EAAE,UAAU,OAAA,EAAS,SAAA,EAAW,MAAA,EAAQ,YAAA,EAAc,CAAA;AAElF,MAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAoC;AAAA,QAC9E,QAAA,EAAU,CAAA,EAAGC,oBAAA,CAAc,aAAa,CAAA,iBAAA,CAAA;AAAA,QACxC,WAAA;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,KAAA;AAAA,UACA,SAAA;AAAA,UACA,UAAA;AAAA,UACA,aAAA;AAAA,UACA,GAAI,eAAA,IAAmB,EAAE,SAAA,EAAW,eAAA;AAAgB;AACtD,OACD,CAAA;AAED,MAAA,MAAM,EAAE,SAAA,EAAAC,UAAAA,EAAW,gBAAA,EAAkB,0BAAyB,GAAI,iBAAA;AAElE,MAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,WAAA,CAAYA,UAAS,CAAA;AAEzD,MAAA,MAAM,cAAA,GAAiC;AAAA,QACrC,UAAA,EAAY,wBAAA;AAAA,QACZ,IAAA,EAAM,aAAA;AAAA,QACN,MAAA,EAAQ,CAAA,EAAGC,YAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,QACvB,QAAA,EAAU,oBAAoB,GAAA,CAAI,CAAC,UAAUA,YAAA,CAAI,KAAA,CAAM,KAAK,CAAC;AAAA,OAC/D;AAEA,MAAA,MAAM,mBAAA,GAAsB,iBAAA,CAAkB,YAAA,EAAc,UAAU,CAAA;AAGtE,MAAA,MAAM,0BAAA,GAA6B,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAA2B;AAAA,QAC9E,QAAA,EAAU,CAAA,EAAGF,oBAAA,CAAc,aAAa,CAAA,CAAA;AAAA,QACxC,WAAA;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,cAAA;AAAA,UACA,MAAA;AAAA,UACA,SAAA;AAAA,UACA,UAAA;AAAA,UACA,KAAA;AAAA,UACA,aAAA,EAAe;AAAA,YACb,CAAA,EAAI,aAAA,CAAsB,CAAA,CAAE,QAAA,EAAS;AAAA,YACrC,CAAA,EAAI,aAAA,CAAsB,CAAA,CAAE,QAAA,EAAS;AAAA,YACrC,UAAW,aAAA,CAAsB;AAAA,WACnC;AAAA,UACA,SAAA,EAAAC,UAAAA;AAAA,UACA,mBAAA;AAAA,UACA,cAAA,EAAgB;AAAA,YACd,GAAG,cAAA;AAAA,YACH,IAAA,EAAM,CAAA,EAAG,cAAA,CAAe,IAAI,CAAA,CAAA;AAAA,YAC5B,QAAA,EAAU,eAAe,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAG,IAAI,CAAA,CAAE;AAAA;AAC3D;AACF,OACD,CAAA;AAED,MAAA,OAAO,0BAAA;AAAA,IACT,SAAS,KAAA,EAAgB;AACvB,MAAA,OAAA,CAAQ,KAAA,CAAM,mBAAmB,KAAK,CAAA;AAEtC,MAAA,IAAI,iBAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3D,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,IAAIE,4BAAA;AAAA,QACR,CAAA,yBAAA,EAA4B,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA,CAAA;AAAA,QACpF;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,wBAAA,CAAyB,YAAwB,aAAA,EAAiC;AACxF,IAAA,IAAI,eAAe,OAAA,EAAS;AAE1B,MAAA,MAAM,QAAA,GAAW,IAAIC,wBAAA,CAAgB;AAAA,QACnC,QAAA,EAAU,EAAE,MAAA,EAAQ,aAAA;AAAc,OACnC,CAAA;AACD,MAAA,MAAM,UAAA,GAAa,IAAIC,oBAAA,CAAqBC,2BAAA,CAAmB,IAAI,CAAA;AAEnE,MAAA,OAAOC,kBAAS,OAAA,CAAQ;AAAA,QACtB,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAGA,IAAA,OAAOA,kBAAS,OAAA,CAAQ;AAAA,MACtB,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CAAsB;AAAA,IAC1B,MAAA;AAAA,IACA;AAAA,GACF,EAGwB;AACtB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAiB;AAAA,MAClD,QAAA,EAAU,CAAA,EAAGP,oBAAA,CAAc,aAAa,CAAA,UAAA,CAAA;AAAA,MACxC,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAA,CAAU,MAAA,EAAyB,WAAA,EAAwD;AAC/F,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,gBAAe,GAAI,MAAA;AAC3B,MAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAuB;AAAA,QACjE,QAAA,EAAU,CAAA,EAAGA,oBAAA,CAAc,aAAa,CAAA,QAAA,CAAA;AAAA,QACxC,MAAA,EAAQ,EAAE,cAAA,EAAe;AAAA,QACzB;AAAA,OACD,CAAA;AAED,MAAA,OAAO,iBAAA;AAAA,IACT,SAAS,GAAA,EAAK;AAEZ,MAAA,IAAI,GAAA,YAAeT,oBAAAA,IAAiB,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACtD,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,sBAAA,CACJ,MAAA,EACA,WAAA,EACyC;AACzC,IAAA,MAAM,IAAA,GAA+B;AAAA,MACnC,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,wBAAwB,MAAA,CAAO;AAAA,KACjC;AAEA,IAAA,IAAI,MAAA,CAAO,aAAa,IAAA,EAAM;AAC5B,MAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,IAAA,CAAK,OAAO,KAAA,CAAsC;AAAA,MACvD,QAAA,EAAU,CAAA,EAAGS,oBAAA,CAAc,aAAa,CAAA,0BAAA,CAAA;AAAA,MACxC,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAuBA,MAAM,eAAA,CAAgB;AAAA,IACpB,MAAA;AAAA,IACA;AAAA,GACF,EAGqC;AACnC,IAAA,MAAM,kBAAA,GAAqB,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAA6B;AAAA,MACxE,QAAA,EAAU,CAAA,EAAGA,oBAAA,CAAc,aAAa,CAAA,cAAA,CAAA;AAAA,MACxC,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,kBAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAA,CACJ,MAAA,EACA,WAAA,EACuC;AACvC,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAmC;AAAA,MACpD,QAAA,EAAU,CAAA,EAAGA,oBAAA,CAAc,aAAa,CAAA,gBAAA,CAAA;AAAA,MACxC,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CACJ,MAAA,EACA,WAAA,EACuC;AACvC,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAmC;AAAA,MACpD,QAAA,EAAU,CAAA,EAAGA,oBAAA,CAAc,aAAa,CAAA,QAAA,CAAA;AAAA,MACxC,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACF;ACzSA,SAAS,sBAAsB,QAAA,EAG7B;AACA,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,MAAM,IAAA,GAAO,QAAA;AACb,IAAA,IACE,CAAC,IAAA,CAAK,SAAA,IACN,OAAO,KAAK,SAAA,KAAc,QAAA,IAC1B,EAAE,OAAA,IAAW,IAAA,CAAK,SAAA,CAAA,IAClB,EAAE,SAAA,IAAa,KAAK,SAAA,CAAA,EACpB;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,UAAA,EAAY,KAAK,UAAA,EAAW;AAAA,EAClE;AAGA,EAAA,IAAI,OAAA,IAAW,QAAA,IAAY,SAAA,IAAa,QAAA,EAAU;AAChD,IAAA,OAAO,EAAE,WAAW,QAAA,EAAsB;AAAA,EAC5C;AAGA,EAAA,MAAM,aACJ,OAAQ,QAAA,CAAiB,OAAA,KAAY,QAAA,GAAY,SAAiB,OAAA,GAAU,MAAA;AAE9E,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,UAAA,IAAc;AAAA,GAChB;AACF;AAMO,SAAS,mBAAmB,SAAA,EAA8C;AAE/E,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5B,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mDAAA,EAAsD,SAAA,CAAU,MAAM,CAAA,CAAE,CAAA;AAAA,IAC1F;AACA,IAAA,MAAM,CAAA,GAAI,UAAU,CAAC,CAAA;AACrB,IAAA,MAAM,CAAA,GAAI,UAAU,CAAC,CAAA;AACrB,IAAA,IAAI,CAAA,IAAK,IAAA,IAAQ,CAAA,IAAK,IAAA,EAAM;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qDAAA,EAAwD,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IACrF;AACA,IAAA,OAAO,EAAE,GAAG,MAAA,CAAO,CAAC,GAAG,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,EAAE;AAAA,EACtC;AAGA,EAAA,IAAI,aAAa,OAAO,SAAA,KAAc,YAAY,GAAA,IAAO,SAAA,IAAa,OAAO,SAAA,EAAW;AACtF,IAAA,MAAM,GAAA,GAAM,SAAA;AACZ,IAAA,IAAI,GAAA,CAAI,CAAA,IAAK,IAAA,IAAQ,GAAA,CAAI,KAAK,IAAA,EAAM;AAClC,MAAA,MAAM,IAAI,MAAM,CAAA,kDAAA,EAAqD,GAAA,CAAI,CAAC,CAAA,IAAA,EAAO,GAAA,CAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC1F;AACA,IAAA,OAAO;AAAA,MACL,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AAAA,MACf,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,CAAC;AAAA,KACjB;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAC5E;AAYO,IAAM,wBAAN,MAAwD;AAAA,EAI7D,WAAA,CAAY,QAAqB,WAAA,EAAqB;AACpD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA,EAEA,MAAM,OAAA,CAAQ,EAAE,OAAA,EAAS,OAAM,EAAkE;AAE/F,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,cAAA,CAAe,QAAQ,OAAO,CAAA;AAC9D,IAAA,MAAM,UAAA,GAAaQ,kCAA2B,SAAS,CAAA;AAKvD,IAAA,MAAM,gBAAA,GAAmB,UAAA,GAAaX,0BAAAA,CAAoB,UAAU,CAAA,GAAI,SAAA;AAGxE,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAA+B;AAAA,MACvE,QAAA,EAAU,kCAAA;AAAA,MACV,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,IAAA,EAAM;AAAA,QACJ,WAAW,OAAA,CAAQ,OAAA;AAAA,QACnB,KAAA;AAAA,QACA;AAAA;AACF,KACD,CAAA;AAGD,IAAA,MAAM,EAAE,SAAA,EAAAI,UAAAA,EAAW,YAAY,kBAAA,EAAmB,GAAI,sBAAsB,eAAe,CAAA;AAG3F,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,WAAA,CAAYA,UAAS,CAAA;AAGrD,IAAA,MAAM,aAAA,GAAgB,mBAAmB,SAAS,CAAA;AAGlD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAA0C;AAAA,MACzE,QAAA,EAAU,6CAAA;AAAA,MACV,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,IAAA,EAAM;AAAA,QACJ,WAAW,OAAA,CAAQ,OAAA;AAAA,QACnB,SAAA,EAAAA,UAAAA;AAAA,QACA,aAAA,EAAe,aAAA;AAAA,QACf,YAAY,kBAAA,IAAsB,UAAA;AAAA,QAClC,cAAA,EAAgB;AAAA;AAClB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,aACJ,OAAQ,MAAA,CAAe,OAAA,KAAY,QAAA,GAAY,OAAe,OAAA,GAAU,MAAA;AAE1E,IAAA,IAAI,CAAC,OAAO,eAAA,EAAiB;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,UAAA,IAAc,4CAA4C,CAAA;AAAA,IAC5E;AAEA,IAAA,OAAO,MAAA,CAAO,eAAA;AAAA,EAChB;AACF;;;ACnIO,IAAM,8BAA8B,OAAO;AAAA,EAChD,MAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAIuB;AACrB,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,cAAA,EAAgB,YAAW,GAAI,MAAA;AAGlE,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,aACI,4GAAA,GACA;AAAA,OACN;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,OAAA;AAKxC,IAAA,MAAM,WAAA,GACJ,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAKP,2BAAAA,EAAsB,UAAU,CAAA,IACrE,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAKG,4BAAqB,UAAU,CAAA;AAEtE,IAAA,MAAM,SAAS,WAAA,GAAcH,2BAAAA,CAAqB,UAAU,CAAA,GAAIA,4BAAqB,OAAO,CAAA;AAC5F,IAAA,MAAM,mBAAmB,WAAA,GACrBG,0BAAAA,CAAoB,UAAU,CAAA,GAC9BA,2BAAoB,OAAO,CAAA;AAG/B,IAAA,IAAI,mBAAA;AACJ,IAAA,IAAI;AACF,MAAA,mBAAA,GAAsB,iBAAA,CAAkB,MAAA,CAAO,mBAAA,EAAqB,UAAU,CAAA;AAAA,IAChF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,IACpF;AAEA,IAAA,MAAM,WAAW,IAAIF,oBAAAA,CAAY,EAAE,OAAA,EAAS,QAAQ,CAAA;AAEpD,IAAA,MAAM,OAAA,GAAU,IAAII,gBAAAA,CAAQ;AAAA,MAC1B,QAAA;AAAA,MACA,SAAS,MAAA,CAAO,SAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACT,CAAA;AAGD,IAAA,MAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,IAAA,CAA+B;AAAA,MAClE,QAAA,EAAU,kCAAA;AAAA,MACV,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,KAAA;AAAA,QACA;AAAA;AACF,KACD,CAAA;AAGD,IAAA,IAAI,CAAC,eAAA,IAAmB,OAAO,eAAA,KAAoB,QAAA,EAAU;AAC3D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAKA,IAAA,IAAIE,UAAAA;AACJ,IAAA,IAAI,kBAAA;AAEJ,IAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,MAAA,MAAM,IAAA,GAAO,eAAA;AACb,MAAAA,aAAY,IAAA,CAAK,SAAA;AAEjB,MAAA,IACE,IAAA,CAAK,cACL,MAAA,CAAO,SAAA,CAAU,eAAe,IAAA,CAAKJ,0BAAAA,EAAqB,IAAA,CAAK,UAAU,CAAA,EACzE;AACA,QAAA,kBAAA,GAAqB,IAAA,CAAK,UAAA;AAAA,MAC5B;AAAA,IACF,CAAA,MAAA,IAAW,eAAA,IAAmB,OAAA,IAAW,eAAA,IAAmB,aAAa,eAAA,EAAiB;AAExF,MAAAI,UAAAA,GAAY,eAAA;AAAA,IACd,CAAA,MAAO;AAEL,MAAA,MAAMQ,cACJ,eAAA,IAAmB,OAAQ,gBAAwB,OAAA,KAAY,QAAA,GAC1D,gBAAwB,OAAA,GACzB,KAAA,CAAA;AAEN,MAAA,MAAM,IAAI,KAAA;AAAA,QACRA,WAAAA,IACE;AAAA,OAGJ;AAAA,IACF;AAGA,IAAA,IACE,CAACR,UAAAA,IACD,OAAOA,UAAAA,KAAc,QAAA,IACrB,EAAE,OAAA,IAAWA,UAAAA,CAAAA,IACb,EAAE,SAAA,IAAaA,UAAAA,CAAAA,EACf;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,WAAA,CAAYA,UAAS,CAAA;AAGzD,IAAA,MAAM,aAAA,GAAgB,mBAAmB,aAAa,CAAA;AAGtD,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAA0C;AAAA,MACpE,QAAA,EAAU,6CAAA;AAAA,MACV,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,SAAA,EAAAA,UAAAA;AAAA,QACA,aAAA,EAAe,aAAA;AAAA,QACf,cAAA;AAAA,QACA,YAAY,kBAAA,IAAsB;AAAA;AACpC,KACD,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,aACJ,OAAQ,MAAA,CAAe,OAAA,KAAY,QAAA,GAAY,OAAe,OAAA,GAAU,KAAA,CAAA;AAE1E,IAAA,IAAI,OAAO,OAAO,eAAA,KAAoB,QAAA,IAAY,OAAO,eAAA,CAAgB,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC5F,MAAA,MAAM,IAAI,KAAA,CAAM,UAAA,IAAc,4CAA4C,CAAA;AAAA,IAC5E;AAEA,IAAA,OAAO,MAAA,CAAO,eAAA;AAAA,EAChB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,KAAK,CAAA;AAC/D,IAAA,MAAM,KAAA;AAAA,EACR;AACF,CAAA;AAwBO,IAAM,yCAAyC,OAAO;AAAA,EAC3D,MAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAIuB;AACrB,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,gBAAe,GAAI,MAAA;AAG/D,EAAA,IAAI,MAAA,CAAO,eAAe,OAAA,EAAS;AACjC,IAAA,OAAA,CAAQ,MAAM,sEAAA,EAAwE;AAAA,MACpF,UAAU,MAAA,CAAO,UAAA;AAAA,MACjB,QAAA,EAAU,OAAA;AAAA,MACV,mBAAmBJ,0BAAAA,CAAoB,KAAA;AAAA,MACvC,eAAe,MAAA,CAAO,SAAA,EAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,MAChD,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,MAAM,IAAIa,wBAAA;AAAA,MACR,CAAA,oDAAA,EAAuD,MAAA,CAAO,UAAA,IAAc,WAAW,CAAA,CAAA,CAAA;AAAA,MACvFC,qBAAA,CAAe;AAAA,KACjB;AAAA,EACF;AAGA,EAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,aAAa,UAAA,EAAY;AACnC,IAAA,OAAA,CAAQ,MAAM,gDAAA,EAAkD;AAAA,MAC9D,eAAe,IAAI,IAAA,CAAK,QAAQ,UAAA,GAAa,GAAI,EAAE,WAAA,EAAY;AAAA,MAC/D,aAAa,IAAI,IAAA,CAAK,UAAA,GAAa,GAAI,EAAE,WAAA,EAAY;AAAA,MACrD,UAAA,EAAY,CAAA,EAAG,UAAA,GAAa,OAAA,CAAQ,UAAU,CAAA,QAAA;AAAA,KAC/C,CAAA;AACD,IAAA,MAAM,IAAID,wBAAA;AAAA,MACR,CAAA,mBAAA,EAAsB,IAAI,IAAA,CAAK,OAAA,CAAQ,aAAa,GAAI,CAAA,CAAE,aAAa,CAAA,2BAAA,CAAA;AAAA,MAEvEC,qBAAA,CAAe;AAAA,KACjB;AAAA,EACF;AAEA,EAAA,IAAI;AASF,IAAA,IAAI,iBAAA;AACJ,IAAA,IAAI;AACF,MAAA,iBAAA,GAAoB,iBAAA,CAAkB,OAAA,CAAQ,mBAAA,EAAqB,UAAU,CAAA;AAAA,IAC/E,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,MAAM,kEAAA,EAAoE;AAAA,QAChF,eAAe,OAAA,CAAQ,SAAA,EAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QACjD,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA,MAAM,IAAID,wBAAA;AAAA,QACR,0EAAA;AAAA,QACAC,qBAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgBf,WAAAA,CAAG,UAAA,CAAW,WAAA,CAAY,iBAAiB,CAAA;AACjE,IAAA,IAAI,cAAc,WAAA,EAAY,KAAM,OAAA,CAAQ,SAAA,CAAU,aAAY,EAAG;AACnE,MAAA,OAAA,CAAQ,MAAM,iDAAA,EAAmD;AAAA,QAC/D,UAAU,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC3C,OAAA,EAAS,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QACtC,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA,MAAM,IAAIc,wBAAA;AAAA,QACR,2EAAA;AAAA,QACAC,qBAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,MAAM,mBAAmBd,0BAAAA,CAAoB,KAAA;AAG7C,IAAA,MAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,IAAA,CAA+B;AAAA,MAClE,QAAA,EAAU,kCAAA;AAAA,MACV,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,KAAA;AAAA,QACA,gBAAA;AAAA,QACA,UAAA,EAAY;AAAA;AACd,KACD,CAAA;AAGD,IAAA,IAAI,CAAC,eAAA,IAAmB,OAAO,eAAA,KAAoB,QAAA,EAAU;AAC3D,MAAA,MAAM,IAAIa,wBAAA;AAAA,QACR,mFAAA;AAAA,QACAC,qBAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI,gBAAA;AACJ,IAAA,IAAI,WAAA,IAAe,eAAA,IAAoB,eAAA,CAA6C,SAAA,EAAW;AAC7F,MAAA,MAAM,YAAa,eAAA,CAA6C,SAAA;AAChE,MAAA,IACE,CAAC,SAAA,IACD,OAAO,SAAA,KAAc,QAAA,IACrB,EAAE,OAAA,IAAW,SAAA,CAAA,IACb,EAAE,SAAA,IAAa,SAAA,CAAA,EACf;AACA,QAAA,MAAM,IAAID,wBAAA;AAAA,UACR,wFAAA;AAAA,UACAC,qBAAA,CAAe;AAAA,SACjB;AAAA,MACF;AACA,MAAA,gBAAA,GAAmB,SAAA;AAAA,IACrB,CAAA,MAAA,IAAW,OAAA,IAAW,eAAA,IAAmB,SAAA,IAAa,eAAA,EAAiB;AACrE,MAAA,gBAAA,GAAmB,eAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,MAAM,IAAID,wBAAA;AAAA,QACR,8EAAA;AAAA,QACAC,qBAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAUV,kBAAA,CAAU,cAAA,CAAe,gBAAA,EAAkB,OAAO,SAAS,CAAA;AAG3E,IAAA,MAAM,EAAE,GAAG,CAAA,EAAE,GAAIL,YAAG,UAAA,CAAW,IAAA,CAAK,SAAS,iBAAiB,CAAA;AAG9D,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,OAAA,CAAQ,SAAA;AAAA,MACRM,YAAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACXA,YAAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACXA,YAAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,UAAU;AAAA,KAC9B;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAA0C;AAAA,MACpE,QAAA,EAAU,6CAAA;AAAA,MACV,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,SAAA,EAAW,gBAAA;AAAA;AAAA,QAEX,aAAA,EAAe,gBAAA;AAAA,QACf,cAAA;AAAA,QACA,UAAA,EAAY,OAAA;AAAA,QACZ,kBAAA,EAAoB;AAAA;AAAA;AACtB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,MAAA,MAAM,IAAIQ,wBAAA;AAAA,QACR,8FAAA;AAAA,QACAC,qBAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,OAAO,eAAA,KAAoB,QAAA,IAAY,OAAO,eAAA,CAAgB,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC5F,MAAA,MAAM,aACJ,OAAQ,MAAA,CAAe,OAAA,KAAY,QAAA,GAAY,OAAe,OAAA,GAAU,KAAA,CAAA;AAC1E,MAAA,OAAA,CAAQ,MAAM,4DAAA,EAA8D;AAAA,QAC1E;AAAA,OACD,CAAA;AACD,MAAA,MAAM,IAAID,wBAAA;AAAA,QACR,UAAA,IAAc,4CAAA;AAAA,QACdC,qBAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA,CAAO,eAAA;AAAA,EAChB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAGpE,IAAA,IAAI,iBAAiBD,wBAAA,EAAmB;AACtC,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,OAAA,CAAQ,MAAM,6CAAA,EAA+C;AAAA,MAC3D,OAAO,GAAA,CAAI,OAAA;AAAA,MACX,eAAe,MAAA,CAAO,SAAA,EAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,MAChD,eAAe,OAAA,CAAQ,SAAA,EAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,KAClD,CAAA;AACD,IAAA,MAAM,KAAA;AAAA,EACR;AACF,CAAA;;;AC5XO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAAoB,MAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1C,MAAM,kBAAA,CAAmB;AAAA,IACvB,MAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA,GAAiB;AAAA;AAAA,GACnB,EAIoB;AAClB,IAAA,OAAO,2BAAA,CAA4B;AAAA,MACjC,MAAA,EAAQ;AAAA,QACN,GAAG,MAAA;AAAA,QACH;AAAA,OACF;AAAA,MACA,WAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS;AAAA,IACb,MAAA;AAAA,IACA;AAAA,GACF,EAGoB;AAClB,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,OAAO,UAAA,EAAY,SAAA,EAAW,QAAO,GAAI,MAAA;AACrE,IAAA,MAAM,QAAA,GAAWE,yBAAmB,KAAK,CAAA;AACzC,IAAA,IAAI,kBAAkB,QAAA,CAAS,eAAA;AAC/B,IAAA,IAAI,WAAW,QAAA,CAAS,QAAA;AACxB,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,MAC/D;AACA,MAAA,eAAA,GAAkB,UAAA,CAAW,eAAA;AAC7B,MAAA,QAAA,GAAW,UAAA,CAAW,QAAA;AAAA,IACxB;AACA,IAAA,MAAM,eAAA,GAAkBC,mBAAA,CAAa,MAAA,EAAQ,QAAQ,CAAA;AACrD,IAAA,OAAO,KAAK,kBAAA,CAAmB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,UAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL;AAAA,YACE,eAAA;AAAA,YACA,UAAA,EAAY,UAAA;AAAA,YACZ,QAAA,EAAU,CAAC,SAAA,EAAW,eAAA,EAAiB,KAAK;AAAA;AAC9C;AACF,OACF;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,MAAA,EAQM;AAClB,IAAA,MAAM,eAAA,GAAkBA,mBAAA,CAAa,MAAA,CAAO,MAAA,EAAQ,OAAO,QAAQ,CAAA;AAEnE,IAAA,OAAO,KAAK,kBAAA,CAAmB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,KAAA,EAAO;AAAA,UACL;AAAA,YACE,iBAAiB,MAAA,CAAO,eAAA;AAAA,YACxB,UAAA,EAAY,SAAA;AAAA,YACZ,QAAA,EAAU,CAAC,MAAA,CAAO,OAAA,EAAS,iBAAiB,KAAK;AAAA;AACnD;AACF,OACF;AAAA,MACA,aAAa,MAAA,CAAO;AAAA,KACrB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,eAAA,CAAgB;AAAA,IACpB,MAAA;AAAA,IACA;AAAA,GACF,EAGoB;AAClB,IAAA,OAAO,KAAK,kBAAA,CAAmB;AAAA,MAC7B,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CAAsB;AAAA,IAC1B,MAAA;AAAA,IACA;AAAA,GACF,EAGyB;AACvB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAkB;AAAA,MACnD,QAAA,EAAU,CAAA,EAAGb,oBAAAA,CAAc,YAAY,CAAA,YAAA,CAAA;AAAA,MACvC,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,KAAA,EACA,WAAA,EACyC;AACzC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAoC;AAAA,MACrE,QAAA,EAAU,CAAA,EAAGA,oBAAAA,CAAc,YAAY,CAAA,iBAAA,CAAA;AAAA,MACvC,MAAA,EAAQ,KAAA;AAAA,MACR;AAAA,KACD,CAAA;AACD,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,QAAA,EAAkB,WAAA,EAA2C;AAChF,IAAA,OAAO,IAAA,CAAK,OAAO,GAAA,CAAiB;AAAA,MAClC,QAAA,EAAU,CAAA,EAAGA,oBAAAA,CAAc,YAAY,IAAI,QAAQ,CAAA,CAAA;AAAA,MACnD;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CAAqBF,KAAAA,EAAc,WAAA,EAAyD;AAChG,IAAA,OAAO,IAAA,CAAK,OAAO,GAAA,CAA+B;AAAA,MAChD,QAAA,EAAU,CAAA,EAAGE,oBAAAA,CAAc,YAAY,IAAIF,KAAI,CAAA,OAAA,CAAA;AAAA,MAC/C;AAAA,KACD,CAAA;AAAA,EACH;AACF;ACvLO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAAoB,MAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAsB;AAAA,EAE1C,MAAM,YAAA,CACJ,cAAA,EACA,QAAA,EACA,WAAA,EACiB;AACjB,IAAA,OAAO,IAAA,CAAK,OAAO,GAAA,CAAY;AAAA,MAC7B,QAAA,EAAU,CAAA,EAAGE,oBAAAA,CAAc,SAAS,CAAA,WAAA,CAAA;AAAA,MACpC,WAAA;AAAA,MACA,MAAA,EAAQ,EAAE,cAAA,EAAgB,QAAA;AAAS,KACpC,CAAA;AAAA,EACH;AACF,CAAA;;;ACMO,IAAM,oBAAN,MAAwB;AAAA,EAI7B,YAAoB,MAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAClB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,iBAAA,CAAkB,MAAM,CAAA;AAChD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,cAAA,CAAe,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAA,CAAY,MAAA,EAAiC,WAAA,EAA2C;AAC5F,IAAA,MAAM,EAAE,OAAO,YAAA,EAAc,cAAA,EAAgB,UAAU,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,MAAA,EAAO,GACtF,MAAA;AAEF,IAAA,IAAI,KAAA,KAAUc,YAAM,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAE,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,WAAA,GAAcF,yBAAmB,KAAK,CAAA;AAC5C,IAAA,IAAI,CAAC,aAAa,eAAA,EAAiB;AACjC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8CAAA,EAAiD,KAAK,CAAA,CAAE,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,YAAY,MAAM,IAAA,CAAK,UAAU,YAAA,CAAa,cAAA,EAAgB,UAAU,WAAW,CAAA;AACzF,IAAA,MAAM,eAAe,WAAA,CAAY,eAAA;AAEjC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,IAAK,aAAa,CAAA,EAAG;AACjD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,SAAS,CAAA,0BAAA,CAA4B,CAAA;AAAA,IAC9E;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,IAAQ,CAAA;AACjD,IAAA,MAAM,eAAeC,mBAAAA,CAAa,YAAA,CAAa,QAAA,EAAS,EAAG,YAAY,QAAQ,CAAA;AAE/E,IAAA,MAAM,KAAA,GAAgB;AAAA,MACpB;AAAA,QACE,eAAA,EAAiB,YAAA;AAAA,QACjB,UAAA,EAAY,SAAA;AAAA,QACZ,QAAA,EAAUN,kBAAS,OAAA,CAAQ;AAAA,UACzB,SAASQ,oBAAA,CAAc,2BAAA;AAAA,UACvB,MAAA,EAAQC,cAAA,CAAM,OAAA,CAAQ,YAAY;AAAA,SACnC;AAAA,OACH;AAAA,MACA;AAAA,QACE,iBAAiBD,oBAAA,CAAc,2BAAA;AAAA,QAC/B,UAAA,EAAY,kBAAA;AAAA,QACZ,QAAA,EAAUR,kBAAS,OAAA,CAAQ;AAAA,UACzB,KAAA,EAAO,YAAA;AAAA,UACP,MAAA,EAAQS,cAAA,CAAM,OAAA,CAAQ,YAAY,CAAA;AAAA,UAClC,aAAavB,yBAAAA,CAAS,MAAA;AAAA,YACpBA,yBAAAA,CAAS,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,EAAE;AAAA;AAAA,WAClC,CACG,QAAA,EAAS,CACT,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,UACd,YAAA,EAAc,KAAA;AAAA,UACd,eAAewB,kBAAA,CAAY;AAAA,SAC5B;AAAA,OACH;AAAA,MACA;AAAA,QACE,iBAAiBF,oBAAA,CAAc,kBAAA;AAAA,QAC/B,UAAA,EAAY,WAAA;AAAA,QACZ,QAAA,EAAUR,kBAAS,OAAA,CAAQ;AAAA,UACzB,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,QAAA,EAAU;AAAA,YACR,cAAcW,oBAAA,CAAc,WAAA;AAAA,YAC5B,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,YACpB,eAAepB,aAAAA,CAAK,cAAA,CAAe,OAAO,SAAA,IAAa,KAAK,EAAE,QAAA,EAAS;AAAA,YACvE,GAAA,EAAK,IAAA;AAAA,YACL,MAAA,EAAQkB,cAAA,CAAM,OAAA,CAAQ,YAAY;AAAA;AACpC,SACD;AAAA;AACH,KACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,kBAAA,CAAmB;AAAA,MACxD,MAAA,EAAQ;AAAA,QACN,UAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,WAAA;AAAA,MACA,cAAA,EAAgB;AAAA,KACjB,CAAA;AAED,IAAA,MAAM,IAAA,GAA8B;AAAA,MAClC,eAAA,EAAiB,MAAA;AAAA,MACjB,eAAe,MAAA,CAAO,SAAA;AAAA,MACtB,KAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAkB;AAAA,MACnD,QAAA,EAAU,CAAA,EAAGhB,oBAAAA,CAAc,aAAa,CAAA,CAAA;AAAA,MACxC,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,CAAe,EAAA,EAAY,WAAA,EAA2C;AAC1E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAiB;AAAA,MAClD,QAAA,EAAU,CAAA,EAAGA,oBAAAA,CAAc,aAAa,IAAI,EAAE,CAAA,CAAA;AAAA,MAC9C;AAAA,KACD,CAAA;AACD,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AC1IO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAAoB,MAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1C,MAAM,UAAA,CAAW,MAAA,EAAyB,WAAA,EAAsD;AAC9F,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAA4B;AAAA,MAC7D,QAAA,EAAU,CAAA,EAAGA,oBAAAA,CAAc,IAAI,CAAA,CAAA;AAAA,MAC/B,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAA,CAAO,EAAA,EAAY,WAAA,EAAmC;AAC1D,IAAA,OAAO,IAAA,CAAK,OAAO,GAAA,CAAS;AAAA,MAC1B,QAAA,EAAU,CAAA,EAAGA,oBAAAA,CAAc,IAAI,IAAI,EAAE,CAAA,CAAA;AAAA,MACrC;AAAA,KACD,CAAA;AAAA,EACH;AACF;ACCO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,MAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlC,mBAAA,CACN,UAAA,EACA,SAAA,EACA,eAAA,EACM;AACN,IAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kBAAA,EAAqB,SAAS,CAAA,qBAAA,CAAA,EAAyB;AAAA,QACnE,QAAA,EAAU,UAAA;AAAA,QACV,QAAA,EAAU,OAAA;AAAA,QACV,iBAAA,EAAmBH,2BAAoB,OAAO,CAAA;AAAA,QAC9C,eAAe,eAAA,GAAkB,eAAA,CAAgB,MAAM,CAAA,EAAG,EAAE,IAAI,KAAA,GAAQ,gBAAA;AAAA,QACxE,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA,MAAM,IAAIa,wBAAAA;AAAA,QACR,iDAAiD,UAAA,IAAc,WAAW,CAAA,qEAAA,EACHb,0BAAAA,CAAoB,OAAO,CAAC,CAAA,CAAA;AAAA,QACnGc,qBAAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAM,KAAA,EAA2B;AACvC,IAAA,OACE,OACA,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CACb,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CAAA;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,iBAAiB,MAAA,EAAgD;AAC/D,IAAA,MAAM,EAAE,UAAA,EAAY,eAAA,GAAkBQ,uBAAA,CAAiB,kBAAiB,GAAI,MAAA;AAE5E,IAAA,IACE,OAAO,eAAA,KAAoB,QAAA,IAC3B,CAAC,OAAO,QAAA,CAAS,eAAe,CAAA,IAChC,CAAC,MAAA,CAAO,SAAA,CAAU,eAAe,CAAA,IACjC,mBAAmB,CAAA,EACnB;AACA,MAAA,MAAM,IAAIT,wBAAAA;AAAA,QACR,6BAA6B,eAAe,CAAA,6BAAA,CAAA;AAAA,QAC5CC,qBAAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,aAAA,GAAgBf,WAAAA,CAAG,UAAA,CAAW,KAAA,CAAM,gBAAA,EAAiB;AAC3D,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAG9C,MAAA,MAAM,SAAA,GAAYA,WAAAA,CAAG,UAAA,CAAW,WAAA,CAAY,aAAa,CAAA;AAGzD,MAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAA,GAAI,eAAA;AAGnD,MAAA,MAAM,mBAAA,GAAsB,iBAAA,CAAkB,aAAA,EAAe,UAAU,CAAA;AAQvE,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,mBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,OAAA,CAAQ,MAAM,0DAAA,EAA4D;AAAA,QACxE,OAAO,GAAA,CAAI,OAAA;AAAA,QACX,iBAAA,EAAmB;AAAA,OACpB,CAAA;AACD,MAAA,MAAM,IAAIc,wBAAAA;AAAA,QACR,CAAA,8BAAA,EAAiC,IAAI,OAAO,CAAA,CAAA;AAAA,QAC5CC,qBAAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BA,MAAM,uBAAA,CAAwB,MAAA,EAA6B,WAAA,EAAsC;AAC/F,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,aAAA,EAAc,GAAI,MAAA;AAG9C,IAAA,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,UAAA,EAAY,eAAA,EAAiB,OAAO,SAAS,CAAA;AAE7E,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAI,+DAAA,EAAiE;AAAA,QAC3E,eAAe,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC/C,eAAe,aAAA,CAAc,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC7D,YAAY,IAAI,IAAA,CAAK,cAAc,UAAA,GAAa,GAAI,EAAE,WAAA,EAAY;AAAA,QAClE,UAAU,aAAA,CAAc,QAAA;AAAA,QACxB,kBAAA,EAAoB,cAAc,kBAAA,CAAmB;AAAA,OACtD,CAAA;AAID,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,aAAA,CAAc,gBAAA;AAAA,QACdT,YAAAA,CAAI,KAAA,CAAM,aAAA,CAAc,UAAU,CAAA;AAAA,QAClCA,YAAAA,CAAI,KAAA,CAAM,aAAA,CAAc,QAAQ,CAAA;AAAA;AAAA,QAEhCA,YAAAA,CAAI,KAAA,CAAM,aAAA,CAAc,kBAAA,CAAmB,MAAM,CAAA;AAAA,QACjD,GAAG,aAAA,CAAc;AAAA,OACnB;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,2BAAA,CAA4B;AAAA,QAC/C,MAAA,EAAQ;AAAA,UACN,UAAA;AAAA,UACA,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,YAAY,OAAA,EAAQ;AAAA,UACzC,KAAA,EAAO;AAAA,YACL;AAAA,cACE,iBAAiB,MAAA,CAAO,SAAA;AAAA,cACxB,YAAYkB,0BAAA,CAAoB,aAAA;AAAA,cAChC;AAAA;AACF,WACF;AAAA,UACA,cAAA,EAAgB;AAAA;AAAA,SAClB;AAAA,QACA,WAAA;AAAA,QACA,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAED,MAAA,OAAA,CAAQ,IAAI,kEAAA,EAAoE;AAAA,QAC9E,MAAA;AAAA,QACA,eAAe,aAAA,CAAc,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAC9D,CAAA;AAED,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,OAAA,CAAQ,MAAM,sDAAA,EAAwD;AAAA,QACpE,OAAO,GAAA,CAAI,OAAA;AAAA,QACX,eAAe,MAAA,CAAO,SAAA,EAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAChD,eAAe,aAAA,CAAc,gBAAA,EAAkB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC9D,YAAY,IAAI,IAAA,CAAK,cAAc,UAAA,GAAa,GAAI,EAAE,WAAA,EAAY;AAAA,QAClE,UAAU,aAAA,CAAc;AAAA,OACzB,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,gBAAA,CAAiB,MAAA,EAAgC,WAAA,EAAsC;AAC3F,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,gBAAA,EAAiB,GAAI,MAAA;AAGjD,IAAA,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,UAAA,EAAY,QAAA,EAAU,OAAO,SAAS,CAAA;AAEtE,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAI,0DAAA,EAA4D;AAAA,QACtE,eAAe,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC/C,eAAA,EAAiB,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAClD,CAAA;AAGD,MAAA,MAAM,MAAA,GAAS,MAAM,2BAAA,CAA4B;AAAA,QAC/C,MAAA,EAAQ;AAAA,UACN,UAAA;AAAA,UACA,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,YAAY,OAAA,EAAQ;AAAA,UACzC,KAAA,EAAO;AAAA,YACL;AAAA,cACE,iBAAiB,MAAA,CAAO,SAAA;AAAA,cACxB,YAAYA,0BAAA,CAAoB,MAAA;AAAA,cAChC,QAAA,EAAU,CAAC,gBAAgB;AAAA;AAC7B,WACF;AAAA,UACA,cAAA,EAAgB;AAAA;AAAA,SAClB;AAAA,QACA,WAAA;AAAA,QACA,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAED,MAAA,OAAA,CAAQ,IAAI,wDAAA,EAA0D;AAAA,QACpE,MAAA;AAAA,QACA,cAAA,EAAgB,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OACjD,CAAA;AAED,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,OAAA,CAAQ,MAAM,6CAAA,EAA+C;AAAA,QAC3D,OAAO,GAAA,CAAI,OAAA;AAAA,QACX,eAAe,MAAA,CAAO,SAAA,EAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAChD,eAAA,EAAiB,gBAAA,EAAkB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OACnD,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,MAAM,eAAe,MAAA,EAA4D;AAC/E,IAAA,MAAM,EAAE,aAAA,EAAe,gBAAA,EAAiB,GAAI,MAAA;AAE5C,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAIzB,oBAAAA,CAAY;AAAA,QAC/B,OAAA,EAASD,4BAAqB,OAAO;AAAA,OACtC,CAAA;AAED,MAAA,OAAA,CAAQ,IAAI,kDAAA,EAAoD;AAAA,QAC9D,aAAA,EAAe,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC5C,aAAA,EAAe,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAChD,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,YAAA,CAAa;AAAA,QACzC,eAAA,EAAiB,aAAA;AAAA,QACjB,YAAY0B,0BAAA,CAAoB,QAAA;AAAA,QAChC,QAAA,EAAU,CAAC,gBAAgB;AAAA,OAC5B,CAAA;AAID,MAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,MAAM,IACpC,MAAA,GACC,MAAA,CAAiC,UAAU,EAAC;AAEjD,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,OAAA,CAAQ,KAAK,uDAAA,EAAyD;AAAA,UACpE,cAAc,WAAA,CAAY,MAAA;AAAA,UAC1B,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,KAAA;AAAA,UACV,UAAA,EAAY,CAAA;AAAA,UACZ,cAAA,EAAgB,CAAA;AAAA,UAChB,oBAAoB;AAAC,SACvB;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,CAAA,KAAM,KAAA;AACpC,MAAA,MAAM,aAAa,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,CAAC,CAAC,CAAC,CAAA;AAChD,MAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,CAAC,CAAC,CAAC,CAAA;AACpD,MAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,CAAC,CAAC,CAAC,CAAA;AACpD,MAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,IAAI,cAAc,CAAA;AAElE,MAAA,MAAM,WAAA,GAAmC;AAAA,QACvC,QAAA;AAAA,QACA,UAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAA,CAAQ,IAAI,mDAAA,EAAqD;AAAA,QAC/D,QAAA;AAAA,QACA,YAAY,IAAI,IAAA,CAAK,UAAA,GAAa,GAAI,EAAE,WAAA,EAAY;AAAA,QACpD,cAAA;AAAA,QACA,yBAAyB,kBAAA,CAAmB;AAAA,OAC7C,CAAA;AAED,MAAA,OAAO,WAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAGpE,MAAA,MAAM,uBAAA,GAA0B;AAAA,QAC9B,yBAAA;AAAA,QACA,qCAAA;AAAA,QACA,2BAAA;AAAA,QACA,qBAAA;AAAA,QACA,kBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,iBAAA,GAAoB,wBAAwB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA;AAEjF,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,OAAA,CAAQ,IAAI,0DAAA,EAA4D;AAAA,UACtE,aAAA,EAAe,aAAA,EAAe,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,UAC7C,aAAA,EAAe,gBAAA,EAAkB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,SACjD,CAAA;AACD,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,KAAA;AAAA,UACV,UAAA,EAAY,CAAA;AAAA,UACZ,cAAA,EAAgB,CAAA;AAAA,UAChB,oBAAoB;AAAC,SACvB;AAAA,MACF;AAGA,MAAA,OAAA,CAAQ,MAAM,8CAAA,EAAgD;AAAA,QAC5D,OAAO,GAAA,CAAI,OAAA;AAAA,QACX,aAAA,EAAe,aAAA,EAAe,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC7C,aAAA,EAAe,gBAAA,EAAkB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OACjD,CAAA;AACD,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0CA,MAAM,6BAAA,CACJ,MAAA,EACA,WAAA,EACiB;AACjB,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,OAAA,EAAS,OAAM,GAAI,MAAA;AAG/C,IAAA,IAAI,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,KAAe,OAAA,EAAS;AACtD,MAAA,MAAM,IAAIV,wBAAAA;AAAA,QACR,CAAA,oDAAA,EAAuD,OAAO,UAAU,CAAA,CAAA;AAAA,QACxEC,qBAAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO,sCAAA,CAAuC;AAAA,MAC5C,MAAA,EAAQ;AAAA,QACN,UAAA;AAAA,QACA,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,YAAY,OAAA,EAAQ;AAAA,QACzC,OAAA;AAAA,QACA,KAAA;AAAA,QACA,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,WAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,UAAU,KAAA,EAAiC;AACjD,IAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,IAAA,IAAQ,EAAA;AAC5B,IAAA,OAAO,CAACT,YAAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,IAAI,GAAGA,YAAAA,CAAI,KAAA,CAAM,KAAA,IAAS,IAAI,CAAC,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,CAAS,KAAa,IAAA,EAAsB;AAClD,IAAA,OAAO,MAAA,CAAO,GAAG,CAAA,IAAK,MAAA,CAAO,IAAI,CAAA,IAAK,IAAA,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BA,MAAM,iBAAA,CAAkB,MAAA,EAAiC,WAAA,EAAsC;AAC7F,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,oBAAA,EAAqB,GAAI,MAAA;AACrD,IAAA,MAAM,EAAE,gBAAA,EAAkB,KAAA,EAAO,UAAA,EAAY,YAAA,EAAc,eAAc,GACvE,oBAAA;AAGF,IAAA,IAAI,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,KAAe,OAAA,EAAS;AACtD,MAAA,MAAM,IAAIQ,wBAAAA;AAAA,QACR,CAAA,mDAAA,EAAsD,OAAO,UAAU,CAAA,CAAA;AAAA,QACvEC,qBAAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAA,CAAY,MAAM,IAAA,IAAQ,EAAA;AAChC,IAAA,MAAM,OAAA,GAAA,CAAW,MAAM,GAAA,IAAO,EAAA;AAE9B,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,MAAA,MAAM,IAAID,wBAAAA;AAAA,QACR,+CAA+C,KAAK,CAAA,CAAA,CAAA;AAAA,QACpDC,qBAAAA,CAAe;AAAA,OACjB;AAAA,IACF;AACA,IAAA,IACE,OAAO,aAAA,KAAkB,QAAA,IACzB,CAAC,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,IAC9B,CAAC,MAAA,CAAO,SAAA,CAAU,aAAa,CAAA,IAC/B,aAAA,IAAiB,KACjB,MAAA,CAAO,aAAa,IAAI,OAAA,EACxB;AACA,MAAA,MAAM,IAAID,wBAAAA;AAAA,QACR,4BAA4B,aAAa,CAAA,8CAAA,CAAA;AAAA,QACzCC,qBAAAA,CAAe;AAAA,OACjB;AAAA,IACF;AACA,IAAA,IAAI,UAAA,GAAa,EAAA,IAAM,UAAA,GAAa,QAAA,EAAU;AAC5C,MAAA,MAAM,IAAID,wBAAAA;AAAA,QACR,CAAA,iDAAA,CAAA;AAAA,QACAC,qBAAAA,CAAe;AAAA,OACjB;AAAA,IACF;AACA,IAAA,IAAI,YAAA,GAAe,EAAA,IAAM,YAAA,GAAe,QAAA,EAAU;AAChD,MAAA,MAAM,IAAID,wBAAAA;AAAA,QACR,CAAA,mDAAA,CAAA;AAAA,QACAC,qBAAAA,CAAe;AAAA,OACjB;AAAA,IACF;AACA,IAAA,IAAI,YAAA,GAAe,EAAA,IAAM,UAAA,GAAa,YAAA,EAAc;AAClD,MAAA,MAAM,IAAID,wBAAAA;AAAA,QACR,CAAA,qCAAA,EAAwC,UAAU,CAAA,8BAAA,EAAiC,YAAY,CAAA,CAAA,CAAA;AAAA,QAC/FC,qBAAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAI,8DAAA,EAAgE;AAAA,QAC1E,eAAe,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC/C,aAAA,EAAe,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC/C,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC5B,UAAA,EAAY,WAAW,QAAA,EAAS;AAAA,QAChC,YAAA,EAAc,aAAa,QAAA,EAAS;AAAA,QACpC;AAAA,OACD,CAAA;AAKD,MAAA,MAAM,CAAC,aAAA,EAAe,cAAc,CAAA,GAAI,IAAA,CAAK,UAAU,UAAU,CAAA;AACjE,MAAA,MAAM,CAAC,eAAA,EAAiB,gBAAgB,CAAA,GAAI,IAAA,CAAK,UAAU,YAAY,CAAA;AAEvE,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,gBAAA;AAAA,QACA,KAAA;AAAA,QACA,aAAA;AAAA,QACA,cAAA;AAAA,QACA,eAAA;AAAA,QACA,gBAAA;AAAA,QACAT,YAAAA,CAAI,MAAM,aAAa;AAAA,OACzB;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,2BAAA,CAA4B;AAAA,QAC/C,MAAA,EAAQ;AAAA,UACN,UAAA;AAAA,UACA,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,YAAY,OAAA,EAAQ;AAAA,UACzC,KAAA,EAAO;AAAA,YACL;AAAA,cACE,iBAAiB,MAAA,CAAO,SAAA;AAAA,cACxB,YAAYkB,0BAAA,CAAoB,mBAAA;AAAA,cAChC;AAAA;AACF,WACF;AAAA,UACA,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,WAAA;AAAA,QACA,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAED,MAAA,OAAA,CAAQ,IAAI,uEAAA,EAAyE;AAAA,QACnF,MAAA;AAAA,QACA,aAAA,EAAe,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC/C,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAC7B,CAAA;AAED,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,OAAA,CAAQ,MAAM,oEAAA,EAAsE;AAAA,QAClF,OAAO,GAAA,CAAI,OAAA;AAAA,QACX,eAAe,MAAA,CAAO,SAAA,EAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAChD,aAAA,EAAe,gBAAA,EAAkB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAChD,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAC9B,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,kBAAkB,MAAA,EAA8D;AACpF,IAAA,MAAM,EAAE,aAAA,EAAe,gBAAA,EAAkB,KAAA,EAAM,GAAI,MAAA;AAEnD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAIzB,oBAAAA,CAAY;AAAA,QAC/B,OAAA,EAASD,4BAAqB,OAAO;AAAA,OACtC,CAAA;AAED,MAAA,OAAA,CAAQ,IAAI,+DAAA,EAAiE;AAAA,QAC3E,aAAA,EAAe,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC5C,aAAA,EAAe,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC/C,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAC7B,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,YAAA,CAAa;AAAA,QACzC,eAAA,EAAiB,aAAA;AAAA,QACjB,YAAY0B,0BAAA,CAAoB,mBAAA;AAAA,QAChC,QAAA,EAAU,CAAC,gBAAA,EAAkB,KAAK;AAAA,OACnC,CAAA;AAID,MAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,MAAM,IACpC,MAAA,GACC,MAAA,CAAiC,UAAU,EAAC;AAEjD,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,OAAA,CAAQ,KAAK,iEAAA,EAAmE;AAAA,UAC9E,cAAc,WAAA,CAAY,MAAA;AAAA,UAC1B,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,OAAO;AAAA,UACL,UAAA,EAAY,EAAA;AAAA,UACZ,YAAA,EAAc,EAAA;AAAA,UACd,aAAA,EAAe,CAAA;AAAA,UACf,aAAA,EAAe,EAAA;AAAA,UACf,WAAA,EAAa;AAAA,SACf;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAiC;AAAA,QACrC,UAAA,EAAY,KAAK,QAAA,CAAS,WAAA,CAAY,CAAC,CAAA,EAAG,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,QACxD,YAAA,EAAc,KAAK,QAAA,CAAS,WAAA,CAAY,CAAC,CAAA,EAAG,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,QAC1D,eAAe,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,CAAC,CAAC,CAAC,CAAA;AAAA,QAC5C,aAAA,EAAe,KAAK,QAAA,CAAS,WAAA,CAAY,CAAC,CAAA,EAAG,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,QAC3D,aAAa,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,CAAC,CAAC,CAAC;AAAA,OAC5C;AAEA,MAAA,OAAA,CAAQ,IAAI,gEAAA,EAAkE;AAAA,QAC5E,UAAA,EAAY,UAAA,CAAW,UAAA,CAAW,QAAA,EAAS;AAAA,QAC3C,YAAA,EAAc,UAAA,CAAW,YAAA,CAAa,QAAA,EAAS;AAAA,QAC/C,eAAe,UAAA,CAAW,aAAA;AAAA,QAC1B,aAAA,EAAe,UAAA,CAAW,aAAA,CAAc,QAAA,EAAS;AAAA,QACjD,aAAa,UAAA,CAAW;AAAA,OACzB,CAAA;AAED,MAAA,OAAO,UAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAGpE,MAAA,MAAM,gBAAA,GAAmB;AAAA,QACvB,yBAAA;AAAA,QACA,qCAAA;AAAA,QACA,2BAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,UAAA,GAAa,iBAAiB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA;AAEnE,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,uFAAA;AAAA,UACA;AAAA,YACE,aAAA,EAAe,aAAA,EAAe,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,YAC7C,aAAA,EAAe,gBAAA,EAAkB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,YAChD,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA;AAC/B,SACF;AACA,QAAA,OAAO;AAAA,UACL,UAAA,EAAY,EAAA;AAAA,UACZ,YAAA,EAAc,EAAA;AAAA,UACd,aAAA,EAAe,CAAA;AAAA,UACf,aAAA,EAAe,EAAA;AAAA,UACf,WAAA,EAAa;AAAA,SACf;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,MAAM,wDAAA,EAA0D;AAAA,QACtE,OAAO,GAAA,CAAI,OAAA;AAAA,QACX,aAAA,EAAe,aAAA,EAAe,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC7C,aAAA,EAAe,gBAAA,EAAkB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAChD,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAC9B,CAAA;AACD,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,oBAAA,CACJ,MAAA,EACA,WAAA,EACiB;AACjB,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,gBAAA,EAAkB,OAAM,GAAI,MAAA;AAGxD,IAAA,IAAI,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,KAAe,OAAA,EAAS;AACtD,MAAA,MAAM,IAAIV,wBAAAA;AAAA,QACR,CAAA,mDAAA,EAAsD,OAAO,UAAU,CAAA,CAAA;AAAA,QACvEC,qBAAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,MAAA,MAAM,IAAID,wBAAAA;AAAA,QACR,uDAAuD,KAAK,CAAA,CAAA,CAAA;AAAA,QAC5DC,qBAAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAI,kEAAA,EAAoE;AAAA,QAC9E,eAAe,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC/C,aAAA,EAAe,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC/C,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAC7B,CAAA;AAID,MAAA,MAAM,QAAA,GAAW,CAAC,gBAAA,EAAkB,KAAK,CAAA;AAGzC,MAAA,MAAM,MAAA,GAAS,MAAM,2BAAA,CAA4B;AAAA,QAC/C,MAAA,EAAQ;AAAA,UACN,UAAA;AAAA,UACA,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,YAAY,OAAA,EAAQ;AAAA,UACzC,KAAA,EAAO;AAAA,YACL;AAAA,cACE,iBAAiB,MAAA,CAAO,SAAA;AAAA,cACxB,YAAYS,0BAAA,CAAoB,sBAAA;AAAA,cAChC;AAAA;AACF,WACF;AAAA,UACA,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,WAAA;AAAA,QACA,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAED,MAAA,OAAA,CAAQ,IAAI,8EAAA,EAAgF;AAAA,QAC1F,MAAA;AAAA,QACA,aAAA,EAAe,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAC/C,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAC7B,CAAA;AAED,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,OAAA,CAAQ,MAAM,0EAAA,EAA4E;AAAA,QACxF,OAAO,GAAA,CAAI,OAAA;AAAA,QACX,eAAe,MAAA,CAAO,SAAA,EAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAChD,aAAA,EAAe,gBAAA,EAAkB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,QAChD,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAC9B,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;ACx1BA,IAAM,qBAAN,MAA+C;AAAA,EAA/C,WAAA,GAAA;AACE,IAAA,IAAA,CAAiB,IAAA,uBAAW,GAAA,EAAY;AAAA,EAAA;AAAA,EAExC,IAAI,KAAA,EAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAAA,EAC5B;AAAA,EAEA,QAAQ,KAAA,EAAwB;AAC9B,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,GAAG,OAAO,KAAA;AACjC,IAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAK,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAwBO,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EAM3B,WAAA,CAAY,MAAA,EAAqB,WAAA,EAAqB,MAAA,EAAgC;AACpF,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA,EAAQ,UAAA,IAAc,IAAI,kBAAA,EAAmB;AAC/D,IAAA,IAAA,CAAK,WAAW,MAAA,EAAQ,QAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,OAAO,OAAA,EAAwD;AACpE,IAAA,MAAM,SAAS,IAAI,WAAA,CAAY,EAAE,YAAA,EAAc,OAAA,CAAQ,QAAQ,CAAA;AAC/D,IAAA,OAAO,IAAI,gBAAA,CAAgB,MAAA,EAAQ,OAAA,CAAQ,WAAA,EAAa;AAAA,MACtD,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,OAAO,OAAA,EAAkD;AAC7D,IAAA,MAAM,EAAE,SAAQ,GAAI,OAAA;AAGpB,IAAA,IAAI,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC7B,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,eAAe,CAAA,0BAAA,EAA6B,OAAA,CAAQ,WAAW,CAAA,CAAA,EAAG;AAAA,IAC7F;AAGA,IAAA,IAAI,OAAA,CAAQ,YAAY,kBAAA,EAAoB;AAC1C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,eAAe,CAAA,qBAAA,EAAwB,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAG;AAAA,IACpF;AAGA,IAAA,IAAI,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC5C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,aAAA,EAAe,6BAAA,EAA8B;AAAA,IACxE;AAGA,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,IAAI,OAAA,CAAQ,cAAc,GAAA,EAAK;AAC7B,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,aAAA,EAAe,8CAAA,EAA+C;AAAA,IACzF;AAGA,IAAA,MAAM,kBAAkB,OAAA,CAAQ,KAAA,CAAM,aAAY,CAAE,OAAA,CAAQ,SAAS,IAAI,CAAA;AACzE,IAAA,MAAM,iBAAiBC,yBAAA,CAAmB,YAAA,CAAa,aAAY,CAAE,OAAA,CAAQ,SAAS,IAAI,CAAA;AAC1F,IAAA,IAAI,oBAAoB,cAAA,EAAgB;AACtC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,aAAA,EAAe,CAAA,mBAAA,EAAsB,OAAA,CAAQ,KAAK,CAAA,wBAAA;AAAA,OACpD;AAAA,IACF;AAGA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,aAAA,EAAe,+BAAA,EAAgC;AAAA,IAC1E;AACA,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,aAAA,EAAe,iCAAA,EAAkC;AAAA,IAC5E;AAGA,IAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,IAAe,CAAC,QAAQ,SAAA,EAAW;AAC9C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,aAAA,EAAe,kCAAA,EAAmC;AAAA,IAC7E;AAGA,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AACpD,IAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AACpB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,aAAA,EAAe,UAAU,MAAA,EAAO;AAAA,IAC3D;AAEA,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,gBACZ,OAAA,EAC8C;AAC9C,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAElB,MAAA,IAAI,CAAC,QAAQ,OAAA,EAAS,SAAA,EAAW,KAAK,CAAC,OAAA,CAAQ,OAAA,EAAS,SAAA,EAAW,CAAA,EAAG;AACpE,QAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,mBAAA,EAAoB;AAAA,MACrD;AACA,MAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,IACvB;AAEA,IAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AAExB,IAAA,IAAI,CAAC,OAAA,EAAS,SAAA,EAAW,KAAK,CAAC,OAAA,EAAS,WAAW,CAAA,EAAG;AACpD,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,mBAAA,EAAoB;AAAA,IACrD;AAGA,IAAA,MAAM,mBAAmBC,uBAAA,CAAmB;AAAA,MAC1C,cAAc,OAAA,CAAQ,WAAA;AAAA,MACtB,YAAY,OAAA,CAAQ,SAAA;AAAA,MACpB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,WAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAAA,MACtC,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AAGD,IAAA,MAAM,OAAA,GAAUC,kBAAA,CAAkB,cAAA,CAAe,gBAAA,EAAkB,QAAQ,WAAW,CAAA;AAItF,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,YAAA,CAAa;AAAA,QAC9C,iBAAiB,OAAA,CAAQ,WAAA;AAAA,QACzB,UAAA,EAAY,oBAAA;AAAA,QACZ,QAAA,EAAU,CAAC,OAAA,EAAS,GAAA,EAAK,QAAQ,SAAA,CAAU,CAAA,EAAG,OAAA,CAAQ,SAAA,CAAU,CAAC;AAAA,OAClE,CAAA;AAGD,MAAA,MAAM,KAAA,GAAQ,cAAA;AACd,MAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,KAAA,IAAS,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,KAAK,CAAA,CAAE,QAAA,EAAS,EAAG;AACjE,QAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,MACvB;AACA,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,2BAAA,EAA4B;AAAA,IAC7D,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAA,+BAAA,EAAkC,OAAO,CAAA,CAAA,EAAG;AAAA,IAC7E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO,OAAA,EAAkD;AAC7D,IAAA,MAAM,EAAE,SAAQ,GAAI,OAAA;AAGpB,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAC9C,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,aAAa,aAAA,EAAc;AAAA,IACnE;AAGA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAC5D,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,4CAAA,EAA6C;AAAA,IACrF;AAEA,IAAA,IAAI;AAGF,MAAA,MAAM,aAAaC,gBAAA,CAAQ,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7D,MAAA,MAAM,YAAA,GAAe;AAAA,QACnB,iBAAiB,OAAA,CAAQ,KAAA;AAAA,QACzB,UAAA,EAAY,UAAA;AAAA,QACZ,QAAA,EAAU,CAAC,OAAA,CAAQ,SAAA,EAAW,UAAA,CAAW,GAAA,CAAI,QAAA,EAAS,EAAG,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU;AAAA,OACrF;AAGA,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAA+B;AAAA,QACvE,QAAA,EAAU,kCAAA;AAAA,QACV,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,IAAA,EAAM;AAAA,UACJ,WAAW,OAAA,CAAQ,WAAA;AAAA,UACnB,KAAA,EAAO,CAAC,YAAY;AAAA;AACtB,OACD,CAAA;AAGD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAA0C;AAAA,QACzE,QAAA,EAAU,6CAAA;AAAA,QACV,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,IAAA,EAAM;AAAA,UACJ,WAAW,OAAA,CAAQ,WAAA;AAAA,UACnB,WAAW,eAAA,CAAgB,SAAA;AAAA,UAC3B,eAAe,OAAA,CAAQ,SAAA;AAAA,UACvB,YAAY,eAAA,CAAgB,UAAA;AAAA,UAC5B,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAED,MAAA,IAAI,OAAO,QAAQ,eAAA,KAAoB,QAAA,IAAY,CAAC,MAAA,CAAO,eAAA,CAAgB,MAAK,EAAG;AACjF,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,WAAA,EAAc,QAAgB,OAAA,IAAW;AAAA,SAC3C;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,iBAAiB,MAAA,CAAO,eAAA;AAAA,QACxB,SAAA,EAAW;AAAA,OACb;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,WAAA,EAAa,sBAAsB,OAAO,CAAA;AAAA,OAC5C;AAAA,IACF;AAAA,EACF;AACF;AC5QO,IAAM,gBAAgB,OAAO;AAAA,EAClC;AACF,CAAA,KAEoC;AAClC,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,SAAA,EAAAvB,YAAU,GAAI,MAAA;AAE1C,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACjE;AAEA,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAO,mBAAA,IAAuB,CAAC,OAAO,SAAA,EAAW;AAC/D,MAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,IAC7E;AAEA,IAAA,IAAI,CAACA,UAAAA,EAAW;AACd,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,OAAA;AAExC,IAAA,IACE,CAAC,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,KAAKP,2BAAAA,EAAsB,UAAU,CAAA,IACtE,CAAC,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAKG,0BAAAA,EAAqB,UAAU,CAAA,EACrE;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,MAAA,GAASH,4BAAqB,UAAU,CAAA;AAG9C,IAAA,IAAI,mBAAA;AACJ,IAAA,IAAI;AACF,MAAA,mBAAA,GAAsB,iBAAA,CAAkB,MAAA,CAAO,mBAAA,EAAqB,UAAU,CAAA;AAAA,IAChF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,IACpF;AAEA,IAAA,MAAM,WAAW,IAAIC,oBAAAA,CAAY,EAAE,OAAA,EAAS,QAAQ,CAAA;AAEpD,IAAA,MAAM,OAAA,GAAU,IAAII,gBAAAA,CAAQ;AAAA,MAC1B,QAAA;AAAA,MACA,SAAS,MAAA,CAAO,SAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACT,CAAA;AAGD,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,WAAA,CAAYE,UAAS,CAAA;AAGrD,IAAA,MAAM,aAAA,GAAgB,mBAAmB,SAAS,CAAA;AAElD,IAAA,OAAO,aAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,MAAM,KAAA;AAAA,EACR;AACF;;;AChCO,IAAM,WAAN,MAAe;AAAA,EAYpB,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,WAAA,CAAY,MAAM,CAAA;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAWb,wBAAAA,CAAkB,OAAA;AACnD,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAG3B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AAC3C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,iBAAA,CAAkB,IAAA,CAAK,MAAM,CAAA;AACrD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,iBAAA,CAAkB,IAAA,CAAK,MAAM,CAAA;AACrD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AACrC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AAG/C,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAC3D,IAAA,IAAA,CAAK,6BAAA,GAAgC,IAAA,CAAK,6BAAA,CAA8B,IAAA,CAAK,IAAI,CAAA;AACjF,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAGrC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACrD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AACjE,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAC7C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACjD,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA;AACnE,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,WAAA,EAA8B;AACvD,IAAA,MAAM,KAAA,GAAQ,eAAe,IAAA,CAAK,YAAA;AAElC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,uBAAuB,WAAA,EAA6C;AAClE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAA;AACjD,IAAA,OAAO,IAAI,qBAAA,CAAsB,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,qBAAA,CACE,aACA,MAAA,EACiB;AACjB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAA;AACjD,IAAA,OAAO,IAAI,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,OAAO,MAAM,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB;AAAA,IACvB,MAAA;AAAA,IACA;AAAA,GACF,EAGoB;AAClB,IAAA,OAAO,IAAA,CAAK,aAAa,kBAAA,CAAmB;AAAA,MAC1C,MAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,kBAAA,CAAmB,WAAW;AAAA,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCA,MAAM,6BAAA,CAA8B;AAAA,IAClC,MAAA;AAAA,IACA;AAAA,GACF,EAGoB;AAClB,IAAA,OAAO,KAAK,QAAA,CAAS,6BAAA;AAAA,MACnB,MAAA;AAAA,MACA,IAAA,CAAK,mBAAmB,WAAW;AAAA,KACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,aAAA,CAAc;AAAA,IAClB;AAAA,GACF,EAEiC;AAC/B,IAAA,OAAO,aAAA,CAAc,EAAE,MAAA,EAAQ,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS;AAAA,IACb,MAAA;AAAA,IACA;AAAA,GACF,EAGoB;AAClB,IAAA,OAAO,IAAA,CAAK,aAAa,QAAA,CAAS;AAAA,MAChC,MAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,kBAAA,CAAmB,WAAW;AAAA,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ;AAAA,IACZ,MAAA;AAAA,IACA;AAAA,GACF,EAGoB;AAClB,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,iBAAiB,OAAA,EAAS,MAAA,EAAQ,UAAS,GAAI,MAAA;AAC3E,IAAA,OAAO,KAAK,kBAAA,CAAmB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,UAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL;AAAA,YACE,eAAA;AAAA,YACA,UAAA,EAAY,SAAA;AAAA,YACZ,UAAU,CAAC,OAAA,EAASyB,oBAAa,MAAA,EAAQ,QAAQ,GAAG,KAAK;AAAA;AAC3D;AACF,OACF;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,kBAAA,CAAmB,WAAW;AAAA,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CAAgB;AAAA,IACpB,MAAA;AAAA,IACA;AAAA,GACF,EAGoB;AAClB,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAM,GAAI,MAAA;AACtC,IAAA,OAAO,KAAK,kBAAA,CAAmB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,UAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,kBAAA,CAAmB,WAAW;AAAA,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa;AAAA,IACjB,MAAA;AAAA,IACA;AAAA,GACF,EAGkC;AAChC,IAAA,OAAO,IAAA,CAAK,QAAQ,YAAA,CAAa;AAAA,MAC/B,GAAG,MAAA;AAAA,MACH,WAAA,EAAa,IAAA,CAAK,kBAAA,CAAmB,WAAW;AAAA,KACjD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,qBAAA,CAAsB;AAAA,IAC1B,MAAA;AAAA,IACA;AAAA,GACF,EAGyB;AACvB,IAAA,OAAO,IAAA,CAAK,aAAa,qBAAA,CAAsB;AAAA,MAC7C,MAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,kBAAA,CAAmB,WAAW;AAAA,KACjD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,kBAAA,CACJ,KAAA,EACA,WAAA,EACyC;AACzC,IAAA,OAAO,KAAK,YAAA,CAAa,kBAAA,CAAmB,OAAO,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,SAAA,CAAU,MAAA,EAAyB,WAAA,EAAsB;AAC7D,IAAA,OAAO,KAAK,OAAA,CAAQ,SAAA,CAAU,QAAQ,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAM,eAAA,CACJ,MAAA,EACA,WAAA,EACkC;AAClC,IAAA,OAAO,IAAA,CAAK,QAAQ,eAAA,CAAgB;AAAA,MAClC,MAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,kBAAA,CAAmB,WAAW;AAAA,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY;AAAA,IAChB,MAAA;AAAA,IACA;AAAA,GACF,EAGyB;AACvB,IAAA,OAAO,KAAK,YAAA,CAAa,WAAA,CAAY,QAAQ,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,EAAA,EAAY,WAAA,EAA4C;AAC3E,IAAA,OAAO,KAAK,YAAA,CAAa,cAAA,CAAe,IAAI,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAAA,EAClF;AAAA;AAAA,EAGA,MAAM,UAAA,CAAW,MAAA,EAAyB,WAAA,EAAuD;AAC/F,IAAA,OAAO,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,MAAA,CAAO,EAAA,EAAY,WAAA,EAAoC;AAC3D,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAO,IAAI,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,QAAA,EAAkB,WAAA,EAA4C;AACjF,IAAA,OAAO,KAAK,YAAA,CAAa,cAAA,CAAe,UAAU,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CAAqBf,KAAAA,EAAc,WAAA,EAA0D;AACjG,IAAA,OAAO,KAAK,YAAA,CAAa,oBAAA,CAAqBA,OAAM,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBAAA,CACJ,MAAA,EACA,WAAA,EACuC;AACvC,IAAA,OAAO,KAAK,OAAA,CAAQ,oBAAA,CAAqB,QAAQ,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAA,CACJ,MAAA,EACA,WAAA,EACuC;AACvC,IAAA,OAAO,KAAK,OAAA,CAAQ,oBAAA,CAAqB,QAAQ,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAAA,EACvF;AAAA,EAEA,MAAM,YAAA,CACJ,cAAA,EACA,QAAA,EACA,WAAA,EACiB;AACjB,IAAA,OAAO,KAAK,SAAA,CAAU,YAAA;AAAA,MACpB,cAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,CAAK,mBAAmB,WAAW;AAAA,KACrC;AAAA,EACF;AACF;;;ACvYO,IAAM,cAAA,GAAN,cAA6B,QAAA,CAAS;AAAA,EAC3C,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAI,CAAC,OAAO,YAAA,EAAc;AACxB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAAA;AAAA;AAIF;;;ACRO,IAAM,eAAA,GAAN,cAA8B,QAAA,CAAS;AAAA,EAC5C,YAAY,MAAA,EAA+B;AACzC,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAAA;AAAA;AAIF;ACZA,SAAS,iBAAA,CAAkB,QAAgB,QAAA,EAA0B;AACnE,EAAA,MAAM,CAAC,KAAA,EAAO,IAAA,GAAO,EAAE,CAAA,GAAI,MAAA,CAAO,MAAM,GAAG,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAA,CAAc,OAAO,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,EAAG,KAAA,CAAM,GAAG,QAAQ,CAAA;AAClE,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,KAAA,GAAQ,UAAU,CAAC,CAAA;AAC1C;AAKA,SAAS,uBAAA,CAAwB,QAA2B,QAAA,EAAsC;AAChG,EAAA,MAAM,eAAA,GAAkB,iBAAA,CAAkB,MAAA,CAAO,MAAA,EAAQ2B,sBAAe,IAAI,CAAA;AAE5E,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAS,kBAAA;AAAA,IACT,iBAAA,EAAmB,eAAA;AAAA,IACnB,QAAA;AAAA,IACA,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,iBAAA,EAAmB,GAAA;AAAA,IACnB,OAAOJ,yBAAAA,CAAmB;AAAA,GAC5B;AACF;AAEA,SAAS,aACP,MAAA,EACoC;AACpC,EAAA,OAAO,QAAA,IAAY,UAAU,WAAA,IAAe,MAAA;AAC9C;AAEA,SAAS,cACP,MAAA,EACsB;AACtB,EAAA,IAAI,YAAA,CAAa,MAAM,CAAA,EAAG;AACxB,IAAA,OAAO;AAAA,MACL,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,aAAA,EAAe;AAAA,QACb,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,OAAO,MAAA,CAAO,SAAA;AAAA,QACd,aAAa,MAAA,CAAO;AAAA,OACtB;AAAA,MACA,YAAY,MAAA,CAAO;AAAA,KACrB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAyBO,SAAS,eAAe,MAAA,EAAyD;AACtF,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,EAAA,OAAO,OAAO,GAAA,EAAU,GAAA,EAAU,IAAA,KAAc;AAE9C,IAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,MAAM,gBAAgB,GAAA,CAAI,OAAA,GAAU,WAAW,CAAA,IAAK,GAAA,CAAI,UAAU,WAAW,CAAA;AAE7E,IAAA,IAAI,CAAC,aAAA,EAAe;AAElB,MAAA,MAAM,WACJ,GAAA,CAAI,QAAA,IAAY,IAAI,GAAA,GAChB,CAAA,EAAG,IAAI,QAAQ,CAAA,GAAA,EAAM,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,CAAA,EAAG,IAAI,WAAW,CAAA,CAAA,GACrD,IAAI,GAAA,IAAO,EAAA;AAClB,MAAA,MAAMK,YAAAA,GAAc,uBAAA,CAAwB,QAAA,CAAS,aAAA,EAAe,QAAQ,CAAA;AAE5E,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,GAAA,CAAI,kBAAA,EAAoB,IAAA,CAAK,SAAA,CAAUA,YAAW,CAAC,CAAA,CAAE,IAAA,CAAK;AAAA,QAC/E,KAAA,EAAO,kBAAA;AAAA,QACP,kBAAA,EAAoBA;AAAA,OACrB,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,OAAO,aAAA,KAAkB,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA,GAAI,aAAA;AAAA,IAC5E,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,4CAA4C,CAAA;AAAA,IACnF;AAGA,IAAA,MAAM,UAAU,OAAA,EAAS,OAAA;AACzB,IAAA,MAAM,YAAY,OAAO,OAAA,EAAS,SAAA,KAAc,QAAA,GAAW,QAAQ,SAAA,GAAY,IAAA;AAC/E,IAAA,MAAM,SAAS,OAAO,OAAA,EAAS,MAAA,KAAW,QAAA,GAAW,QAAQ,MAAA,GAAS,IAAA;AACtE,IAAA,MAAM,QAAQ,OAAO,OAAA,EAAS,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,GAAQ,IAAA;AAEnE,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,IAAU,CAAC,KAAA,EAAO;AACnC,MAAA,OAAO,GAAA,CACJ,OAAO,GAAG,CAAA,CACV,KAAK,EAAE,KAAA,EAAO,wDAAwD,CAAA;AAAA,IAC3E;AAGA,IAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,QAAA,CAAS,aAAA,EAAe,EAAE,CAAA;AACtE,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAc,CAAA,CAAE,aAAY,CAAE,OAAA,CAAQ,SAAS,IAAI,CAAA;AAE1E,IAAA,IAAI,cAAc,SAAS,CAAA,KAAM,cAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,EAAG;AAC5E,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,QAC1B,KAAA,EAAO,4BAAA;AAAA,QACP,QAAQ,CAAA,SAAA,EAAY,QAAA,CAAS,aAAA,CAAc,KAAK,SAAS,SAAS,CAAA;AAAA,OACnE,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI;AACF,MAAA,UAAA,GAAa,OAAO,MAAM,CAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,GAAA,CACJ,MAAA,CAAO,GAAG,CAAA,CACV,IAAA,CAAK,EAAE,KAAA,EAAO,6BAAA,EAA+B,MAAA,EAAQ,kCAAA,EAAoC,CAAA;AAAA,IAC9F;AAEA,IAAA,IAAI,UAAA,GAAa,MAAA,CAAO,WAAA,CAAY,iBAAiB,CAAA,EAAG;AACtD,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,QAC1B,KAAA,EAAO,6BAAA;AAAA,QACP,MAAA,EAAQ,CAAA,SAAA,EAAY,WAAA,CAAY,iBAAiB,oBAAoB,MAAM,CAAA;AAAA,OAC5E,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,cAAc,KAAK,CAAA,KAAM,aAAA,CAAc,WAAA,CAAY,KAAK,CAAA,EAAG;AAC7D,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,QAC1B,KAAA,EAAO,wBAAA;AAAA,QACP,MAAA,EAAQ,sBAAsB,KAAK,CAAA;AAAA,OACpC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,WAAA,CAAY,OAAO,OAAO,CAAA;AAC1D,MAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,QAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,UAC1B,KAAA,EAAO,6BAAA;AAAA,UACP,QAAQ,QAAA,CAAS;AAAA,SAClB,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,CAAC,SAAS,UAAA,EAAY;AACxB,QAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,WAAA,CAAY,OAAO,OAAO,CAAA;AACzD,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,YAC1B,KAAA,EAAO,2BAAA;AAAA,YACP,QAAQ,OAAA,CAAQ;AAAA,WACjB,CAAA;AAAA,QACH;AAGA,QAAA,GAAA,CAAI,IAAA,GAAO;AAAA,UACT,QAAQ,OAAA,CAAQ,eAAA;AAAA,UAChB,OAAA;AAAA,UACA,WAAW,OAAA,CAAQ;AAAA,SACrB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,IAAA,GAAO,EAAE,OAAA,EAAQ;AAAA,MACvB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,QAC1B,KAAA,EAAO,0BAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AACF","file":"index.js","sourcesContent":["import type { ChipiSDKConfig } from \"@chipi-stack/types\";\nimport {\n isValidApiKey,\n handleApiError,\n validateErrorResponse,\n STARKNET_NETWORKS,\n API_VERSIONING,\n} from \"@chipi-stack/shared\";\nimport { ChipiAuthError, ChipiApiError } from \"@chipi-stack/shared\";\n\n/**\n * HTTP client for Chipi API interactions\n */\nexport class ChipiClient {\n private apiPublicKey: string;\n baseUrl: string;\n nodeUrl: string;\n private customAlphaUrl?: string;\n private sdkVersion: string;\n\n constructor(config: ChipiSDKConfig) {\n if (!isValidApiKey(config.apiPublicKey)) {\n throw new ChipiAuthError(\"Invalid API key format\");\n }\n\n this.apiPublicKey = config.apiPublicKey;\n this.customAlphaUrl = config.alphaUrl;\n this.baseUrl = this.getBaseUrl();\n this.nodeUrl = config.nodeUrl || STARKNET_NETWORKS.MAINNET;\n this.sdkVersion = \"14.0.0\";\n }\n\n /**\n * Get the API public key (for internal SDK use)\n */\n getApiPublicKey(): string {\n return this.apiPublicKey;\n }\n\n private getBaseUrl(): string {\n const version = `v${API_VERSIONING.VERSION}`;\n\n if (this.customAlphaUrl) {\n // Remove any existing version suffix and add the current one\n const cleanUrl = this.customAlphaUrl.replace(/\\/v\\d+\\/?$/, \"\").replace(/\\/$/, \"\");\n return `${cleanUrl}/${version}`;\n }\n\n return `https://api.chipipay.com/${version}`;\n }\n\n /**\n * Add API version query parameters to track the API version being used\n * This helps the backend handle versioning and track which SDK versions are in use\n */\n private addVersionParams(url: URL): void {\n url.searchParams.append(\"__chipi_api_version\", API_VERSIONING.VERSION_DATE);\n }\n\n private getHeaders(bearerToken?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiPublicKey,\n };\n\n if (bearerToken) {\n headers[\"Authorization\"] = `Bearer ${bearerToken}`;\n }\n\n return headers;\n }\n\n async get<T>({\n endpoint,\n params,\n bearerToken,\n }: {\n endpoint: string;\n params?: Record<string, any>;\n bearerToken?: string;\n }): Promise<T> {\n try {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n\n // Add version tracking parameters\n this.addVersionParams(url);\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value));\n }\n });\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: this.getHeaders(bearerToken),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const errorData = validateErrorResponse(data);\n throw new ChipiApiError(\n errorData.message,\n errorData.code || `HTTP_${response.status}`,\n response.status\n );\n }\n\n return data as T;\n } catch (error) {\n throw handleApiError(error);\n }\n }\n\n async post<T>({\n endpoint,\n bearerToken,\n body,\n }: {\n endpoint: string;\n bearerToken: string;\n body?: Record<string, any>;\n }): Promise<T> {\n try {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n\n // Add version tracking parameters\n this.addVersionParams(url);\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: this.getHeaders(bearerToken),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const errorData = validateErrorResponse(data);\n throw new ChipiApiError(\n errorData.message,\n errorData.code || `HTTP_${response.status}`,\n response.status\n );\n }\n return data as T;\n } catch (error) {\n throw handleApiError(error);\n }\n }\n\n async put<T>({\n endpoint,\n bearerToken,\n body,\n }: {\n endpoint: string;\n bearerToken: string;\n body?: Record<string, any>;\n }): Promise<T> {\n try {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n\n // Add version tracking parameters\n this.addVersionParams(url);\n\n const response = await fetch(url.toString(), {\n method: \"PUT\",\n headers: this.getHeaders(bearerToken),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const errorData = validateErrorResponse(data);\n throw new ChipiApiError(\n errorData.message,\n errorData.code || `HTTP_${response.status}`,\n response.status\n );\n }\n\n return data as T;\n } catch (error) {\n throw handleApiError(error);\n }\n }\n\n async patch<T>({\n endpoint,\n bearerToken,\n body,\n }: {\n endpoint: string;\n bearerToken: string;\n body?: Record<string, any>;\n }): Promise<T> {\n try {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n\n // Add version tracking parameters\n this.addVersionParams(url);\n\n const response = await fetch(url.toString(), {\n method: \"PATCH\",\n headers: this.getHeaders(bearerToken),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const errorData = validateErrorResponse(data);\n throw new ChipiApiError(\n errorData.message,\n errorData.code || `HTTP_${response.status}`,\n response.status\n );\n }\n\n return data as T;\n } catch (error) {\n throw handleApiError(error);\n }\n }\n\n async delete<T>({\n endpoint,\n bearerToken,\n }: {\n endpoint: string;\n bearerToken: string;\n }): Promise<T> {\n try {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n\n // Add version tracking parameters\n this.addVersionParams(url);\n\n const response = await fetch(url.toString(), {\n method: \"DELETE\",\n headers: this.getHeaders(bearerToken),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const errorData = validateErrorResponse(data);\n throw new ChipiApiError(\n errorData.message,\n errorData.code || `HTTP_${response.status}`,\n response.status\n );\n }\n\n return data as T;\n } catch (error) {\n throw handleApiError(error);\n }\n }\n}\n","import CryptoES from \"crypto-es\";\n\nexport const encryptPrivateKey = (privateKey: string, password: string): string => {\n if (!privateKey || !password) {\n throw new Error(\"Private key and password are required\");\n }\n\n return CryptoES.AES.encrypt(privateKey, password).toString();\n};\n\nexport const decryptPrivateKey = (encryptedPrivateKey: string, password: string): string => {\n if (!encryptedPrivateKey || !password) {\n throw new Error(\"Encrypted private key and password are required\");\n }\n\n try {\n const bytes = CryptoES.AES.decrypt(encryptedPrivateKey, password);\n const decrypted = bytes.toString(CryptoES.enc.Utf8);\n if (!decrypted) {\n throw new Error(\"Decryption resulted in empty string\");\n }\n return decrypted;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Decryption failed: ${error}`);\n }\n};\n","import type {\n CreateWalletParams,\n CreateWalletResponse,\n PrepareWalletCreationResponse,\n CreateCustodialWalletParams,\n GetWalletParams,\n WalletData,\n GetWalletResponse,\n GetTokenBalanceParams,\n GetTokenBalanceResponse,\n WalletType,\n DeploymentData,\n UpdateWalletEncryptionParams,\n UpdateWalletEncryptionResponse,\n PrepareWalletUpgradeParams,\n PrepareWalletUpgradeResponse,\n ExecuteWalletUpgradeParams,\n ExecuteWalletUpgradeResponse,\n} from \"@chipi-stack/types\";\nimport { API_ENDPOINTS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\nimport CryptoES from \"crypto-es\";\n\nimport { ChipiTransactionError, ChipiApiError } from \"@chipi-stack/shared\";\nimport {\n Account,\n CairoCustomEnum,\n CairoOption,\n CairoOptionVariant,\n CallData,\n ec,\n hash,\n num,\n RpcProvider,\n stark,\n} from \"starknet\";\nimport { encryptPrivateKey } from \"./encryption\";\n\n// Local DeploymentData type (replacing @avnu/gasless-sdk dependency)\n/**\n * Wallet management utilities\n */\nexport class ChipiWallets {\n constructor(private client: ChipiClient) {}\n\n async createWallet(\n params: CreateWalletParams & { bearerToken: string }\n ): Promise<CreateWalletResponse> {\n try {\n const {\n encryptKey,\n externalUserId,\n bearerToken,\n userId,\n walletType = \"CHIPI\", // Default to CHIPI wallet\n classHash: customClassHash,\n usePasskey,\n chain,\n } = params;\n\n if (!encryptKey) {\n if (usePasskey) {\n throw new Error(\n \"encryptKey is required when using passkey. The passkey authentication should have provided the encryptKey.\"\n );\n }\n throw new Error(\"encryptKey is required for wallet creation\");\n }\n\n // Select RPC endpoint based on wallet type\n const rpcUrl =\n walletType === \"READY\" ? WALLET_RPC_ENDPOINTS.READY : WALLET_RPC_ENDPOINTS.CHIPI;\n\n const provider = new RpcProvider({ nodeUrl: rpcUrl });\n\n // Generating the private key with Stark Curve\n const privateKeyAX = this.getPrivateKeyAX();\n const starkKeyPubAX = ec.starkCurve.getStarkKey(privateKeyAX);\n\n // Build constructor calldata based on wallet type\n const constructorCallData = this.buildConstructorCallData(walletType, starkKeyPubAX);\n\n // Select class hash: custom > wallet type lookup > CHIPI default\n const accountClassHash =\n customClassHash ??\n (walletType === \"READY\" ? WALLET_CLASS_HASHES.READY : WALLET_CLASS_HASHES.CHIPI);\n\n // Calculate future address of the account\n const publicKey = hash.calculateContractAddressFromHash(\n starkKeyPubAX,\n accountClassHash,\n constructorCallData,\n 0\n );\n\n // Initiating Account\n const account = new Account({ provider, address: publicKey, signer: privateKeyAX });\n\n const typedDataResponse = await this.client.post<PrepareWalletCreationResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-creation`,\n bearerToken,\n body: {\n chain,\n publicKey,\n walletType,\n starkKeyPubAX,\n ...(customClassHash && { classHash: customClassHash }),\n },\n });\n\n const { typedData, accountClassHash: accountClassHashResponse } = typedDataResponse;\n\n const userSignature = await account.signMessage(typedData);\n\n const deploymentData: DeploymentData = {\n class_hash: accountClassHashResponse,\n salt: starkKeyPubAX,\n unique: `${num.toHex(0)}`,\n calldata: constructorCallData.map((value) => num.toHex(value)),\n };\n\n const encryptedPrivateKey = encryptPrivateKey(privateKeyAX, encryptKey);\n\n // Call the API to save the wallet in dashboard\n const executeTransactionResponse = await this.client.post<CreateWalletResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}`,\n bearerToken,\n body: {\n externalUserId,\n userId,\n publicKey,\n walletType,\n chain,\n userSignature: {\n r: (userSignature as any).r.toString(),\n s: (userSignature as any).s.toString(),\n recovery: (userSignature as any).recovery,\n },\n typedData,\n encryptedPrivateKey,\n deploymentData: {\n ...deploymentData,\n salt: `${deploymentData.salt}`,\n calldata: deploymentData.calldata.map((data) => `${data}`),\n },\n },\n });\n\n return executeTransactionResponse;\n } catch (error: unknown) {\n console.error(\"Detailed error:\", error);\n\n if (error instanceof Error && error.message.includes(\"SSL\")) {\n throw new Error(\n \"SSL connection error. Try using NODE_TLS_REJECT_UNAUTHORIZED=0 or verify the RPC URL\"\n );\n }\n throw new ChipiTransactionError(\n `Failed to create wallet: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"WALLET_CREATION_FAILED\"\n );\n }\n }\n\n /**\n * Build constructor calldata based on wallet type\n * - CHIPI: Simple OpenZeppelin account with just public_key\n * - ARGENT: Argent X Account with owner/guardian structure\n */\n private buildConstructorCallData(walletType: WalletType, starkKeyPubAX: string): string[] {\n if (walletType === \"READY\") {\n // Argent X Account: owner (CairoCustomEnum) + guardian (CairoOption None)\n const axSigner = new CairoCustomEnum({\n Starknet: { pubkey: starkKeyPubAX },\n });\n const axGuardian = new CairoOption<unknown>(CairoOptionVariant.None);\n\n return CallData.compile({\n owner: axSigner,\n guardian: axGuardian,\n });\n }\n\n // ChipiWallet (default): Simple OpenZeppelin account with just public_key\n return CallData.compile({\n public_key: starkKeyPubAX,\n });\n }\n\n /**\n * Create a custodial merchant wallet\n */\n async createCustodialWallet({\n params,\n bearerToken,\n }: {\n params: Omit<CreateCustodialWalletParams, \"orgId\">;\n bearerToken: string;\n }): Promise<WalletData> {\n const response = await this.client.post<WalletData>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/custodial`,\n bearerToken,\n body: params,\n });\n\n return response!;\n }\n\n async getWallet(params: GetWalletParams, bearerToken: string): Promise<GetWalletResponse | null> {\n try {\n const { externalUserId } = params;\n const getWalletResponse = await this.client.get<GetWalletResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/by-user`,\n params: { externalUserId },\n bearerToken,\n });\n\n return getWalletResponse;\n } catch (err) {\n // Check if it's a 404 error (wallet not found)\n if (err instanceof ChipiApiError && err.status === 404) {\n return null;\n }\n throw err;\n }\n }\n\n async updateWalletEncryption(\n params: UpdateWalletEncryptionParams,\n bearerToken: string\n ): Promise<UpdateWalletEncryptionResponse> {\n const body: Record<string, string> = {\n externalUserId: params.externalUserId,\n newEncryptedPrivateKey: params.newEncryptedPrivateKey,\n };\n\n if (params.publicKey != null) {\n body.publicKey = params.publicKey;\n }\n\n return this.client.patch<UpdateWalletEncryptionResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/update-encryption-details`,\n bearerToken,\n body,\n });\n }\n\n getPrivateKeyAX = () => {\n // Generate 32 random bytes (256 bits)\n // const privateKeyBytes = Crypto.getRandomBytes(32); old implementation\n const privateKeyBytes = CryptoES.lib.WordArray.random(32);\n // Convert to hex string and ensure it's 64 characters (32 bytes)\n const privateKey = privateKeyBytes.toString(CryptoES.enc.Hex);\n\n // Add '0x' prefix\n const fullPrivateKey = `0x${privateKey}`;\n\n // Ensure the private key is within Starknet's valid range (0 to 2^251 - 1)\n // Convert to BigInt and take modulo 2^251\n const maxStarknetValue = BigInt(\n \"0x800000000000000000000000000000000000000000000000000000000000000\"\n );\n const privateKeyBigInt = BigInt(fullPrivateKey) % maxStarknetValue;\n\n // Convert back to hex string with '0x' prefix\n return `0x${privateKeyBigInt.toString(16)}`;\n };\n\n async getTokenBalance({\n params,\n bearerToken,\n }: {\n params: GetTokenBalanceParams;\n bearerToken: string;\n }): Promise<GetTokenBalanceResponse> {\n const getBalanceResponse = await this.client.get<GetTokenBalanceResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/token-balance`,\n params,\n bearerToken,\n });\n\n return getBalanceResponse;\n }\n\n /**\n * Prepare a wallet upgrade (e.g., READY → CHIPI or CHIPI v29 → v33).\n * Returns typed data that must be signed by the wallet owner.\n */\n async prepareWalletUpgrade(\n params: PrepareWalletUpgradeParams,\n bearerToken: string\n ): Promise<PrepareWalletUpgradeResponse> {\n return this.client.post<PrepareWalletUpgradeResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-upgrade`,\n bearerToken,\n body: params,\n });\n }\n\n /**\n * Execute a wallet upgrade after the owner has signed the typed data.\n */\n async executeWalletUpgrade(\n params: ExecuteWalletUpgradeParams,\n bearerToken: string\n ): Promise<ExecuteWalletUpgradeResponse> {\n return this.client.post<ExecuteWalletUpgradeResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/upgrade`,\n bearerToken,\n body: params,\n });\n }\n}\n","import type {\n PaymasterAdapter,\n PaymasterAccount,\n PrepareTypedDataResponse,\n ExecuteSponsoredTransactionResponse,\n WalletType,\n} from \"@chipi-stack/types\";\nimport type { Call, TypedData } from \"starknet\";\nimport { WALLET_CLASS_HASHES, getWalletTypeFromClassHash } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\n\n/**\n * Unwrap the /prepare-typed-data response.\n * Supports both current shape ({ typedData, walletType }) and legacy (raw TypedData).\n */\nfunction unwrapPrepareResponse(response: unknown): {\n typedData: TypedData;\n walletType?: WalletType;\n} {\n if (!response || typeof response !== \"object\") {\n throw new Error(\n \"Invalid response from /transactions/prepare-typed-data: response is not an object\"\n );\n }\n\n // Current shape: { typedData: TypedData, walletType: WalletType }\n if (\"typedData\" in response) {\n const resp = response as PrepareTypedDataResponse;\n if (\n !resp.typedData ||\n typeof resp.typedData !== \"object\" ||\n !(\"types\" in resp.typedData) ||\n !(\"message\" in resp.typedData)\n ) {\n throw new Error(\n \"Invalid response from /transactions/prepare-typed-data: typedData structure is invalid\"\n );\n }\n return { typedData: resp.typedData, walletType: resp.walletType };\n }\n\n // Legacy shape: the response itself is the TypedData\n if (\"types\" in response && \"message\" in response) {\n return { typedData: response as TypedData };\n }\n\n // Possibly an API error shape\n const apiMessage =\n typeof (response as any).message === \"string\" ? (response as any).message : undefined;\n\n throw new Error(\n apiMessage ?? \"Invalid response from /transactions/prepare-typed-data: typedData is missing\"\n );\n}\n\n/**\n * Normalize signature to { r: string, s: string } format.\n * Handles WeierstrassSignatureType ({r, s} as bigint) and ArraySignatureType ([r, s]).\n */\nexport function normalizeSignature(signature: unknown): { r: string; s: string } {\n // ArraySignatureType: string[]\n if (Array.isArray(signature)) {\n if (signature.length < 2) {\n throw new Error(`Array signature must have at least 2 elements, got ${signature.length}`);\n }\n const r = signature[0];\n const s = signature[1];\n if (r == null || s == null) {\n throw new Error(`Signature elements must not be null/undefined. Got r=${r}, s=${s}`);\n }\n return { r: String(r), s: String(s) };\n }\n\n // WeierstrassSignatureType: { r: bigint, s: bigint }\n if (signature && typeof signature === \"object\" && \"r\" in signature && \"s\" in signature) {\n const sig = signature as { r: unknown; s: unknown; recovery?: unknown };\n if (sig.r == null || sig.s == null) {\n throw new Error(`Object signature has null/undefined fields. Got r=${sig.r}, s=${sig.s}`);\n }\n return {\n r: String(sig.r),\n s: String(sig.s),\n };\n }\n\n throw new Error(\"Unrecognized signature format from account.signMessage()\");\n}\n\n/**\n * PaymasterAdapter implementation that uses Chipi's backend API for gasless transactions.\n *\n * Flow:\n * 1. Detect wallet type from on-chain class hash\n * 2. Call /transactions/prepare-typed-data to get TypedData\n * 3. Call account.signMessage(typedData) — triggers wallet popup for external wallets\n * 4. Call /transactions/execute-sponsored-transaction with signature\n * 5. Return transaction hash\n */\nexport class ChipiPaymasterAdapter implements PaymasterAdapter {\n private readonly client: ChipiClient;\n private readonly bearerToken: string;\n\n constructor(client: ChipiClient, bearerToken: string) {\n this.client = client;\n this.bearerToken = bearerToken;\n }\n\n async execute({ account, calls }: { account: PaymasterAccount; calls: Call[] }): Promise<string> {\n // 1. Detect wallet type from on-chain class hash\n const classHash = await account.getClassHashAt(account.address);\n const walletType = getWalletTypeFromClassHash(classHash);\n\n // Use mapped class hash for known types, on-chain hash for custom accounts.\n // The Rust paymaster auto-detects the interface version (V1/V2) from the class,\n // so custom SNIP-9 accounts work without an allowlist.\n const accountClassHash = walletType ? WALLET_CLASS_HASHES[walletType] : classHash;\n\n // 2. Prepare typed data via Chipi's backend\n const prepareResponse = await this.client.post<PrepareTypedDataResponse>({\n endpoint: \"/transactions/prepare-typed-data\",\n bearerToken: this.bearerToken,\n body: {\n publicKey: account.address,\n calls,\n accountClassHash,\n },\n });\n\n // 3. Unwrap response\n const { typedData, walletType: resolvedWalletType } = unwrapPrepareResponse(prepareResponse);\n\n // 4. Sign — triggers wallet popup for Argent X / Braavos\n const signature = await account.signMessage(typedData);\n\n // 5. Normalize signature format\n const normalizedSig = normalizeSignature(signature);\n\n // 6. Execute sponsored transaction\n const result = await this.client.post<ExecuteSponsoredTransactionResponse>({\n endpoint: \"/transactions/execute-sponsored-transaction\",\n bearerToken: this.bearerToken,\n body: {\n publicKey: account.address,\n typedData,\n userSignature: normalizedSig,\n walletType: resolvedWalletType ?? walletType,\n saveToDatabase: true,\n },\n });\n\n if (!result || typeof result !== \"object\") {\n throw new Error(\n \"Invalid response from /transactions/execute-sponsored-transaction: response is not an object\"\n );\n }\n\n const apiMessage =\n typeof (result as any).message === \"string\" ? (result as any).message : undefined;\n\n if (!result.transactionHash) {\n throw new Error(apiMessage ?? \"Response does not contain transaction hash\");\n }\n\n return result.transactionHash;\n }\n}\n","import type {\n ExecuteSponsoredTransactionResponse,\n WalletData,\n WalletType,\n SessionKeyData,\n PrepareTypedDataResponse,\n} from \"@chipi-stack/types\";\nimport type { Call } from \"starknet\";\nimport { Account, RpcProvider, TypedData, ec, typedData, num } from \"starknet\";\nimport { decryptPrivateKey } from \"./encryption\";\nimport {\n WALLET_CLASS_HASHES,\n WALLET_RPC_ENDPOINTS,\n SESSION_ERRORS,\n ChipiSessionError,\n} from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\nimport { normalizeSignature } from \"./paymaster-adapter\";\n\n// Extended WalletData with optional wallet type for transactions\n\n// Internal type - not exported to users\ninterface ExecutePaymasterTransactionParams {\n encryptKey?: string;\n wallet: WalletData;\n calls: Call[];\n saveToDatabase: boolean; // Internal only - always set by SDK, users cannot control this\n usePasskey?: boolean;\n}\n\n/**\n * Execute a paymaster transaction (gasless) via Chipi's paymaster\n * Supports both CHIPI and ARGENT wallet types\n */\nexport const executePaymasterTransaction = async ({\n params,\n bearerToken,\n client,\n}: {\n params: ExecutePaymasterTransactionParams;\n bearerToken: string;\n client: ChipiClient;\n}): Promise<string> => {\n try {\n const { encryptKey, wallet, calls, saveToDatabase, usePasskey } = params;\n\n // Validate encryptKey is provided\n if (!encryptKey) {\n throw new Error(\n usePasskey\n ? \"encryptKey is required when using passkey. The passkey authentication should have provided the encryptKey.\"\n : \"encryptKey is required for transaction execution\"\n );\n }\n\n const walletType = wallet.walletType ?? \"READY\";\n\n // For known types, use mapped RPC and class hash.\n // For custom types, fall back to default CHIPI RPC (all StarkNet accounts use the same RPC)\n // and use the wallet's classHash if available.\n const isKnownType =\n Object.prototype.hasOwnProperty.call(WALLET_RPC_ENDPOINTS, walletType) &&\n Object.prototype.hasOwnProperty.call(WALLET_CLASS_HASHES, walletType);\n\n const rpcUrl = isKnownType ? WALLET_RPC_ENDPOINTS[walletType] : WALLET_RPC_ENDPOINTS[\"CHIPI\"];\n const accountClassHash = isKnownType\n ? WALLET_CLASS_HASHES[walletType]\n : WALLET_CLASS_HASHES[\"CHIPI\"];\n\n // Decrypt the private key\n let privateKeyDecrypted: string;\n try {\n privateKeyDecrypted = decryptPrivateKey(wallet.encryptedPrivateKey, encryptKey);\n } catch {\n throw new Error(\"Failed to decrypt private key. Verify the encryptKey is correct.\");\n }\n\n const provider = new RpcProvider({ nodeUrl: rpcUrl });\n\n const account = new Account({\n provider,\n address: wallet.publicKey,\n signer: privateKeyDecrypted,\n });\n\n // Build the type data via Chipi's backend\n const prepareResponse = await client.post<PrepareTypedDataResponse>({\n endpoint: \"/transactions/prepare-typed-data\",\n bearerToken,\n body: {\n publicKey: wallet.publicKey,\n calls: calls,\n accountClassHash,\n },\n });\n\n // Validate response structure\n if (!prepareResponse || typeof prepareResponse !== \"object\") {\n throw new Error(\n \"Invalid response from /transactions/prepare-typed-data: response is not an object\"\n );\n }\n\n // Support both current and legacy API response shapes:\n // - Current: { typedData: TypedData, walletType: WalletType }\n // - Legacy: TypedData directly (domain/types/primaryType/message)\n let typedData: TypedData | undefined;\n let resolvedWalletType: WalletType | undefined;\n\n if (\"typedData\" in prepareResponse) {\n const resp = prepareResponse as PrepareTypedDataResponse;\n typedData = resp.typedData;\n // Only accept known wallet types from the backend\n if (\n resp.walletType &&\n Object.prototype.hasOwnProperty.call(WALLET_CLASS_HASHES, resp.walletType)\n ) {\n resolvedWalletType = resp.walletType;\n }\n } else if (prepareResponse && \"types\" in prepareResponse && \"message\" in prepareResponse) {\n // Legacy shape: the response itself is the TypedData\n typedData = prepareResponse as TypedData;\n } else {\n // Likely an API error shape like { message: string }\n const apiMessage =\n prepareResponse && typeof (prepareResponse as any).message === \"string\"\n ? (prepareResponse as any).message\n : undefined;\n\n throw new Error(\n apiMessage ??\n \"Invalid response from /transactions/prepare-typed-data: typedData is missing. \" +\n \"This may occur for older STARKNET wallets that don't support paymaster transactions. \" +\n \"Please ensure the wallet is a CHIPI wallet type.\"\n );\n }\n\n // Validate typedData structure before signing\n if (\n !typedData ||\n typeof typedData !== \"object\" ||\n !(\"types\" in typedData) ||\n !(\"message\" in typedData)\n ) {\n throw new Error(\n \"Invalid typedData received from backend: missing 'types' or 'message' field. \" +\n \"This may occur for older STARKNET wallets that don't support paymaster transactions.\"\n );\n }\n\n // Sign the message\n const userSignature = await account.signMessage(typedData);\n\n // Normalize signature format (handles both Weierstrass and Array types)\n const normalizedSig = normalizeSignature(userSignature);\n\n // Execute the sponsored transaction via Chipi's paymaster\n const result = await client.post<ExecuteSponsoredTransactionResponse>({\n endpoint: \"/transactions/execute-sponsored-transaction\",\n bearerToken,\n body: {\n publicKey: wallet.publicKey,\n typedData,\n userSignature: normalizedSig,\n saveToDatabase,\n walletType: resolvedWalletType ?? walletType,\n },\n });\n\n if (!result || typeof result !== \"object\") {\n throw new Error(\n \"Invalid response from /transactions/execute-sponsored-transaction: response is not an object\"\n );\n }\n\n const apiMessage =\n typeof (result as any).message === \"string\" ? (result as any).message : undefined;\n\n if (typeof result.transactionHash !== \"string\" || result.transactionHash.trim().length === 0) {\n throw new Error(apiMessage ?? \"Response does not contain transaction hash\");\n }\n\n return result.transactionHash;\n } catch (error) {\n console.error(\"Error sending transaction with paymaster\", error);\n throw error;\n }\n};\n\n// Internal type for session-based paymaster transactions\ninterface ExecutePaymasterTransactionWithSessionParams {\n encryptKey: string;\n wallet: WalletData;\n session: SessionKeyData;\n calls: Call[];\n saveToDatabase: boolean;\n}\n\n/**\n * Execute a paymaster transaction (gasless) using a session key.\n *\n * This function uses the 4-element session signature format:\n * [sessionPubKey, r, s, validUntil]\n *\n * The session key must be registered on the contract before use via\n * `addSessionKeyToContract()`.\n *\n * CHIPI wallets only - will throw if wallet type is not CHIPI.\n *\n * @internal\n */\nexport const executePaymasterTransactionWithSession = async ({\n params,\n bearerToken,\n client,\n}: {\n params: ExecutePaymasterTransactionWithSessionParams;\n bearerToken: string;\n client: ChipiClient;\n}): Promise<string> => {\n const { encryptKey, wallet, session, calls, saveToDatabase } = params;\n\n // Validate CHIPI wallet - session keys only work with CHIPI wallets\n if (wallet.walletType !== \"CHIPI\") {\n console.error(\"[ChipiSDK:Session:Execute] Invalid wallet type for session execution\", {\n provided: wallet.walletType,\n required: \"CHIPI\",\n expectedClassHash: WALLET_CLASS_HASHES.CHIPI,\n walletAddress: wallet.publicKey?.slice(0, 15) + \"...\",\n hint: \"Session keys only work with CHIPI wallets (SNIP-9 compatible)\",\n });\n throw new ChipiSessionError(\n `Session execution requires CHIPI wallet type. Got: \"${wallet.walletType || \"undefined\"}\"`,\n SESSION_ERRORS.INVALID_WALLET_TYPE_FOR_SESSION\n );\n }\n\n // Check if session has expired\n const nowSeconds = Math.floor(Date.now() / 1000);\n if (session.validUntil < nowSeconds) {\n console.error(\"[ChipiSDK:Session:Execute] Session has expired\", {\n sessionExpiry: new Date(session.validUntil * 1000).toISOString(),\n currentTime: new Date(nowSeconds * 1000).toISOString(),\n expiredAgo: `${nowSeconds - session.validUntil} seconds`,\n });\n throw new ChipiSessionError(\n `Session expired at ${new Date(session.validUntil * 1000).toISOString()}. ` +\n `Create a new session key.`,\n SESSION_ERRORS.SESSION_EXPIRED\n );\n }\n\n try {\n // console.log(\"[ChipiSDK:Session:Execute] Starting session transaction\", {\n // walletAddress: wallet.publicKey.slice(0, 15) + \"...\",\n // sessionPubKey: session.publicKey.slice(0, 15) + \"...\",\n // sessionExpiry: new Date(session.validUntil * 1000).toISOString(),\n // callCount: calls.length,\n // });\n\n // Decrypt the session private key\n let sessionPrivateKey: string;\n try {\n sessionPrivateKey = decryptPrivateKey(session.encryptedPrivateKey, encryptKey);\n } catch {\n console.error(\"[ChipiSDK:Session:Execute] Failed to decrypt session private key\", {\n sessionPubKey: session.publicKey?.slice(0, 15) + \"...\",\n hint: \"Ensure the encryptKey matches the one used when creating the session\",\n });\n throw new ChipiSessionError(\n \"Failed to decrypt session private key. Verify the encryptKey is correct.\",\n SESSION_ERRORS.SESSION_DECRYPTION_FAILED\n );\n }\n\n // Verify the session private key matches the public key\n const derivedPubKey = ec.starkCurve.getStarkKey(sessionPrivateKey);\n if (derivedPubKey.toLowerCase() !== session.publicKey.toLowerCase()) {\n console.error(\"[ChipiSDK:Session:Execute] Session key mismatch\", {\n expected: session.publicKey.slice(0, 15) + \"...\",\n derived: derivedPubKey.slice(0, 15) + \"...\",\n hint: \"The encrypted private key does not match the stored public key\",\n });\n throw new ChipiSessionError(\n \"Session key mismatch: decrypted private key does not match the public key\",\n SESSION_ERRORS.SESSION_DECRYPTION_FAILED\n );\n }\n\n const accountClassHash = WALLET_CLASS_HASHES.CHIPI;\n\n // Build the type data via Chipi's backend\n const prepareResponse = await client.post<PrepareTypedDataResponse>({\n endpoint: \"/transactions/prepare-typed-data\",\n bearerToken,\n body: {\n publicKey: wallet.publicKey,\n calls: calls,\n accountClassHash,\n walletType: \"CHIPI\",\n },\n });\n\n // Unwrap the response — backend returns { typedData, walletType } for CHIPI wallets\n if (!prepareResponse || typeof prepareResponse !== \"object\") {\n throw new ChipiSessionError(\n \"Invalid response from /transactions/prepare-typed-data: response is not an object\",\n SESSION_ERRORS.SESSION_INVALID_RESPONSE\n );\n }\n\n let sessionTypedData: TypedData;\n if (\"typedData\" in prepareResponse && (prepareResponse as PrepareTypedDataResponse).typedData) {\n const candidate = (prepareResponse as PrepareTypedDataResponse).typedData;\n if (\n !candidate ||\n typeof candidate !== \"object\" ||\n !(\"types\" in candidate) ||\n !(\"message\" in candidate)\n ) {\n throw new ChipiSessionError(\n \"Invalid response from /transactions/prepare-typed-data: typedData structure is invalid\",\n SESSION_ERRORS.SESSION_INVALID_RESPONSE\n );\n }\n sessionTypedData = candidate;\n } else if (\"types\" in prepareResponse && \"message\" in prepareResponse) {\n sessionTypedData = prepareResponse as unknown as TypedData;\n } else {\n throw new ChipiSessionError(\n \"Invalid response from /transactions/prepare-typed-data: typedData is missing\",\n SESSION_ERRORS.SESSION_INVALID_RESPONSE\n );\n }\n\n // Compute the message hash from typed data\n const msgHash = typedData.getMessageHash(sessionTypedData, wallet.publicKey);\n\n // Sign with session private key using ECDSA\n const { r, s } = ec.starkCurve.sign(msgHash, sessionPrivateKey);\n\n // Build 4-element session signature: [sessionPubKey, r, s, validUntil]\n const sessionSignature = [\n session.publicKey,\n num.toHex(r),\n num.toHex(s),\n num.toHex(session.validUntil),\n ];\n\n // Execute the sponsored transaction via Chipi's paymaster\n const result = await client.post<ExecuteSponsoredTransactionResponse>({\n endpoint: \"/transactions/execute-sponsored-transaction\",\n bearerToken,\n body: {\n publicKey: wallet.publicKey,\n typedData: sessionTypedData,\n // Session signature format - array of 4 hex strings\n userSignature: sessionSignature,\n saveToDatabase: saveToDatabase,\n walletType: \"CHIPI\",\n isSessionSignature: true, // Flag to indicate session signature format\n },\n });\n\n if (!result || typeof result !== \"object\") {\n throw new ChipiSessionError(\n \"Invalid response from /transactions/execute-sponsored-transaction: response is not an object\",\n SESSION_ERRORS.SESSION_INVALID_RESPONSE\n );\n }\n\n if (typeof result.transactionHash !== \"string\" || result.transactionHash.trim().length === 0) {\n const apiMessage =\n typeof (result as any).message === \"string\" ? (result as any).message : undefined;\n console.error(\"[ChipiSDK:Session:Execute] No transaction hash in response\", {\n result,\n });\n throw new ChipiSessionError(\n apiMessage ?? \"Response does not contain transaction hash\",\n SESSION_ERRORS.SESSION_INVALID_RESPONSE\n );\n }\n\n return result.transactionHash;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Re-throw ChipiSessionError as-is\n if (error instanceof ChipiSessionError) {\n throw error;\n }\n\n console.error(\"[ChipiSDK:Session:Execute] Unexpected error\", {\n error: err.message,\n walletAddress: wallet.publicKey?.slice(0, 15) + \"...\",\n sessionPubKey: session.publicKey?.slice(0, 15) + \"...\",\n });\n throw error;\n }\n};\n","import {\n CallAnyContractParams,\n STARKNET_CONTRACTS,\n WalletData,\n type ExecuteTransactionParams,\n type RecordSendTransactionParams,\n type Transaction,\n type TransferParams,\n type GetTransactionListQuery,\n type PaginatedResponse,\n type TransactionStatusResponse,\n} from \"@chipi-stack/types\";\nimport { API_ENDPOINTS, formatAmount } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\nimport { executePaymasterTransaction } from \"./execute-paymaster-transaction\";\n\n/**\n * Transaction management utilities\n */\nexport class ChipiTransactions {\n constructor(private client: ChipiClient) {}\n /**\n * Execute a gasless transaction using paymaster\n * @internal saveToDatabase - Internal only, not exposed to clients\n */\n async executeTransaction({\n params,\n bearerToken,\n saveToDatabase = true, // Internal only - defaults to true, can be overridden internally\n }: {\n params: ExecuteTransactionParams;\n bearerToken: string;\n saveToDatabase?: boolean; // Internal only - not part of public API\n }): Promise<string> {\n return executePaymasterTransaction({\n params: {\n ...params,\n saveToDatabase,\n },\n bearerToken,\n client: this.client,\n });\n }\n\n /**\n * Transfer tokens\n */\n async transfer({\n params,\n bearerToken,\n }: {\n params: TransferParams;\n bearerToken: string;\n }): Promise<string> {\n const { encryptKey, wallet, token, otherToken, recipient, amount } = params;\n const contract = STARKNET_CONTRACTS[token];\n let contractAddress = contract.contractAddress;\n let decimals = contract.decimals;\n if (token === \"OTHER\") {\n if (!otherToken) {\n throw new Error(\"Other token is required when token is OTHER\");\n }\n contractAddress = otherToken.contractAddress;\n decimals = otherToken.decimals;\n }\n const formattedAmount = formatAmount(amount, decimals);\n return this.executeTransaction({\n params: {\n encryptKey,\n wallet,\n calls: [\n {\n contractAddress,\n entrypoint: \"transfer\",\n calldata: [recipient, formattedAmount, \"0x0\"],\n },\n ],\n },\n bearerToken,\n });\n }\n\n /**\n * Approve token spending\n */\n async approve(params: {\n encryptKey: string;\n wallet: WalletData;\n contractAddress: string;\n spender: string;\n amount: string;\n decimals?: number;\n bearerToken: string;\n }): Promise<string> {\n const formattedAmount = formatAmount(params.amount, params.decimals);\n\n return this.executeTransaction({\n params: {\n encryptKey: params.encryptKey,\n wallet: params.wallet,\n calls: [\n {\n contractAddress: params.contractAddress,\n entrypoint: \"approve\",\n calldata: [params.spender, formattedAmount, \"0x0\"],\n },\n ],\n },\n bearerToken: params.bearerToken,\n });\n }\n\n /**\n * Call any contract method\n */\n // {\n // encryptKey: string;\n // wallet: any;\n // calls: any[];\n // bearerToken: string;\n // }\n\n async callAnyContract({\n params,\n bearerToken,\n }: {\n params: CallAnyContractParams;\n bearerToken: string;\n }): Promise<string> {\n return this.executeTransaction({\n params,\n bearerToken,\n });\n }\n\n /**\n * Record a send transaction\n */\n async recordSendTransaction({\n params,\n bearerToken,\n }: {\n params: RecordSendTransactionParams;\n bearerToken: string;\n }): Promise<Transaction> {\n const response = await this.client.post<Transaction>({\n endpoint: `${API_ENDPOINTS.TRANSACTIONS}/record-send`,\n bearerToken,\n body: params,\n });\n return response;\n }\n\n /**\n * Get paginated transaction history\n */\n async getTransactionList(\n query: GetTransactionListQuery,\n bearerToken: string\n ): Promise<PaginatedResponse<Transaction>> {\n const response = await this.client.get<PaginatedResponse<Transaction>>({\n endpoint: `${API_ENDPOINTS.TRANSACTIONS}/transaction-list`,\n params: query,\n bearerToken,\n });\n return response;\n }\n\n /**\n * Get a single transaction by hash or internal ID\n */\n async getTransaction(hashOrId: string, bearerToken: string): Promise<Transaction> {\n return this.client.get<Transaction>({\n endpoint: `${API_ENDPOINTS.TRANSACTIONS}/${hashOrId}`,\n bearerToken,\n });\n }\n\n /**\n * Get on-chain transaction status\n */\n async getTransactionStatus(hash: string, bearerToken: string): Promise<TransactionStatusResponse> {\n return this.client.get<TransactionStatusResponse>({\n endpoint: `${API_ENDPOINTS.TRANSACTIONS}/${hash}/status`,\n bearerToken,\n });\n }\n}\n","import { Currency } from \"@chipi-stack/types\";\nimport { ChipiClient } from \"./client\";\nimport { API_ENDPOINTS } from \"@chipi-stack/shared\";\n\nexport class ChipiExchanges {\n constructor(private client: ChipiClient) {}\n\n async getUsdAmount(\n currencyAmount: number,\n currency: Currency,\n bearerToken: string\n ): Promise<number> {\n return this.client.get<number>({\n endpoint: `${API_ENDPOINTS.EXCHANGES}/usd-amount`,\n bearerToken,\n params: { currencyAmount, currency },\n });\n }\n}\n","import {\n CreateSkuPurchaseParams,\n Transaction,\n STARKNET_CONTRACTS,\n Chain,\n ChainToken,\n CreateSkuPurchaseBody,\n} from \"@chipi-stack/types\";\nimport { ChipiClient } from \"./client\";\nimport { ChipiTransactions } from \"./transactions\";\n\nimport {\n CARRIER_IDS,\n CHAIN_TOKEN_TYPES,\n CHAIN_TYPES,\n SERVICE_TYPES,\n SKU_CONTRACTS,\n formatAmount,\n} from \"@chipi-stack/shared\";\nimport { Call, CallData, cairo, hash } from \"starknet\";\nimport { API_ENDPOINTS } from \"@chipi-stack/shared\";\nimport CryptoES from \"crypto-es\";\nimport { ChipiExchanges } from \"./exchanges\";\n\nexport class ChipiSkuPurchases {\n private transactions: ChipiTransactions;\n private exchanges: ChipiExchanges;\n\n constructor(private client: ChipiClient) {\n this.transactions = new ChipiTransactions(client);\n this.exchanges = new ChipiExchanges(client);\n }\n\n /**\n * Purchase a SKU with gasless execution\n * @param params - Purchase parameters including transaction hash, SKU ID, wallet, etc.\n * @param bearerToken - Authentication token for API calls\n * @returns Promise<SkuPurchaseResponse> - The purchase response with transaction details\n */\n async purchaseSku(params: CreateSkuPurchaseParams, bearerToken: string): Promise<Transaction> {\n const { skuId, skuReference, currencyAmount, currency, chain, token, encryptKey, wallet } =\n params;\n\n if (chain !== Chain.STARKNET) {\n throw new Error(`Unsupported chain for SKU purchases: ${chain}`);\n }\n\n const tokenConfig = STARKNET_CONTRACTS[token];\n if (!tokenConfig?.contractAddress) {\n throw new Error(`Unsupported token for Starknet SKU purchases: ${token}`);\n }\n\n const usdAmount = await this.exchanges.getUsdAmount(currencyAmount, currency, bearerToken);\n const tokenAddress = tokenConfig.contractAddress as `0x${string}`;\n\n if (!Number.isFinite(usdAmount) || usdAmount <= 0) {\n throw new Error(`Invalid USD amount: ${usdAmount}. Amount must be positive.`);\n }\n\n const minUsdAmount = Math.max(usdAmount, 0.000001);\n const parsedAmount = formatAmount(minUsdAmount.toString(), tokenConfig.decimals);\n\n const calls: Call[] = [\n {\n contractAddress: tokenAddress,\n entrypoint: \"approve\",\n calldata: CallData.compile({\n spender: SKU_CONTRACTS.RECHARGER_WITH_STRK_MAINNET,\n amount: cairo.uint256(parsedAmount),\n }),\n },\n {\n contractAddress: SKU_CONTRACTS.RECHARGER_WITH_STRK_MAINNET,\n entrypoint: \"process_recharge\",\n calldata: CallData.compile({\n token: tokenAddress,\n amount: cairo.uint256(parsedAmount),\n recharge_id: CryptoES.SHA256(\n CryptoES.lib.WordArray.random(32) // 32 bytes = 256 bits entropy\n )\n .toString()\n .slice(0, 20),\n product_code: skuId,\n merchant_slug: CARRIER_IDS.CHIPI_PAY,\n }),\n },\n {\n contractAddress: SKU_CONTRACTS.CHIPI_BILL_SERVICE,\n entrypoint: \"mint_item\",\n calldata: CallData.compile({\n recipient: wallet.publicKey,\n metadata: {\n service_type: SERVICE_TYPES.BUY_SERVICE,\n timestamp: Date.now(),\n chipi_user_id: hash.starknetKeccak(wallet.publicKey || \"0x0\").toString(),\n kyc: true,\n amount: cairo.uint256(parsedAmount),\n },\n }),\n },\n ];\n\n const txHash = await this.transactions.executeTransaction({\n params: {\n encryptKey: encryptKey,\n wallet: wallet,\n calls: calls,\n },\n bearerToken: bearerToken,\n saveToDatabase: false,\n });\n\n const body: CreateSkuPurchaseBody = {\n transactionHash: txHash,\n walletAddress: wallet.publicKey,\n skuId: skuId,\n skuReference: skuReference,\n chain: chain,\n token: token,\n currencyAmount: currencyAmount,\n };\n\n // Record the SKU purchase and fetch the purchase result\n const response = await this.client.post<Transaction>({\n endpoint: `${API_ENDPOINTS.SKU_PURCHASES}`,\n bearerToken,\n body,\n });\n\n return response;\n }\n\n /**\n * Get a SKU purchase by id\n * @param id - The SKU purchase id\n * @param bearerToken - Authentication token for API calls\n * @returns Promise<SkuPurchaseResponse> - Single SKU purchase\n */\n async getSkuPurchase(id: string, bearerToken: string): Promise<Transaction> {\n const response = await this.client.get<Transaction>({\n endpoint: `${API_ENDPOINTS.SKU_PURCHASES}/${id}`,\n bearerToken,\n });\n return response;\n }\n}\n","import type { PaginatedResponse, Sku, GetSkuListQuery } from \"@chipi-stack/types\";\nimport { API_ENDPOINTS } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\n\n/**\n * SKU (Stock Keeping Unit) management utilities\n */\nexport class ChipiSkus {\n constructor(private client: ChipiClient) {}\n /**\n * Get available SKUs for purchase with pagination\n * @param bearerToken - Authentication token for API calls\n * @param query - Pagination query parameters\n * @returns Promise<PaginatedResponse<Sku>> - Paginated list of available SKUs\n */\n async getSkuList(params: GetSkuListQuery, bearerToken: string): Promise<PaginatedResponse<Sku>> {\n const response = await this.client.get<PaginatedResponse<Sku>>({\n endpoint: `${API_ENDPOINTS.SKUS}`,\n params,\n bearerToken,\n });\n\n return response;\n }\n\n /**\n * Get a single SKU by ID\n * @param bearerToken - Authentication token for API calls\n * @param id - SKU ID\n * @returns Promise<Sku> - Single SKU\n */\n async getSku(id: string, bearerToken: string): Promise<Sku> {\n return this.client.get<Sku>({\n endpoint: `${API_ENDPOINTS.SKUS}/${id}`,\n bearerToken,\n });\n }\n}\n","import type {\n SessionKeyData,\n CreateSessionKeyParams,\n AddSessionKeyParams,\n RevokeSessionKeyParams,\n GetSessionDataParams,\n SessionDataResponse,\n WalletType,\n ExecuteWithSessionParams,\n SetSpendingPolicyParams,\n GetSpendingPolicyParams,\n RemoveSpendingPolicyParams,\n SpendingPolicyData,\n} from \"@chipi-stack/types\";\nimport { ec, RpcProvider, num } from \"starknet\";\nimport { encryptPrivateKey } from \"./encryption\";\nimport { ChipiClient } from \"./client\";\nimport {\n WALLET_CLASS_HASHES,\n WALLET_RPC_ENDPOINTS,\n SESSION_DEFAULTS,\n SESSION_ERRORS,\n SESSION_ENTRYPOINTS,\n ChipiSessionError,\n} from \"@chipi-stack/shared\";\nimport {\n executePaymasterTransaction,\n executePaymasterTransactionWithSession,\n} from \"./execute-paymaster-transaction\";\n\n/**\n * Session key management for CHIPI wallets (SNIP-9 compatible).\n *\n * Session keys enable temporary, delegated access to execute transactions\n * without requiring the owner's private key for each operation.\n *\n * @see https://github.com/chipi-pay/sessions-smart-contract\n */\nexport class ChipiSessions {\n constructor(private client: ChipiClient) {}\n\n /**\n * Validate that the wallet is a CHIPI wallet (required for session operations).\n * Throws ChipiSessionError if wallet type is not CHIPI.\n */\n private validateChipiWallet(\n walletType: WalletType | undefined,\n operation: string,\n walletPublicKey?: string\n ): void {\n if (walletType !== \"CHIPI\") {\n console.error(`[ChipiSDK:Session:${operation}] Invalid wallet type`, {\n provided: walletType,\n required: \"CHIPI\",\n expectedClassHash: WALLET_CLASS_HASHES[\"CHIPI\"],\n walletAddress: walletPublicKey ? walletPublicKey.slice(0, 15) + \"...\" : \"(not provided)\",\n hint: \"Session keys only work with CHIPI wallets (SNIP-9 compatible)\",\n });\n throw new ChipiSessionError(\n `Session keys require CHIPI wallet type. Got: \"${walletType || \"undefined\"}\". ` +\n `Session keys are only supported for CHIPI wallets with class hash ${WALLET_CLASS_HASHES[\"CHIPI\"]}`,\n SESSION_ERRORS.INVALID_WALLET_TYPE_FOR_SESSION\n );\n }\n }\n\n /**\n * Convert a Uint8Array to hex string with 0x prefix.\n */\n private toHex(uint8: Uint8Array): string {\n return (\n \"0x\" +\n Array.from(uint8)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")\n );\n }\n\n /**\n * Generate a new session keypair locally.\n *\n * This method generates the session keys but does NOT register them on-chain.\n * The returned SessionKeyData should be stored by the developer externally\n * (e.g., in Clerk metadata, database, etc.) - the SDK does NOT persist this.\n *\n * After generating, call `addSessionKeyToContract()` to register the session on-chain.\n *\n * @param params - Session creation parameters\n * @returns SessionKeyData for external storage\n *\n * @example\n * ```typescript\n * const session = sdk.sessions.createSessionKey({\n * encryptKey: userEncryptKey,\n * durationSeconds: 21600 // 6 hours\n * });\n * // Store session externally (e.g., in Clerk metadata)\n * await saveToClerk(session);\n * ```\n */\n createSessionKey(params: CreateSessionKeyParams): SessionKeyData {\n const { encryptKey, durationSeconds = SESSION_DEFAULTS.DURATION_SECONDS } = params;\n\n if (\n typeof durationSeconds !== \"number\" ||\n !Number.isFinite(durationSeconds) ||\n !Number.isInteger(durationSeconds) ||\n durationSeconds <= 0\n ) {\n throw new ChipiSessionError(\n `Invalid session duration: ${durationSeconds}. Must be a positive integer.`,\n SESSION_ERRORS.SESSION_CREATION_FAILED\n );\n }\n\n try {\n // Generate Stark curve private key\n const rawPrivateKey = ec.starkCurve.utils.randomPrivateKey();\n const privateKeyHex = this.toHex(rawPrivateKey);\n\n // Derive public key\n const publicKey = ec.starkCurve.getStarkKey(privateKeyHex);\n\n // Calculate expiration timestamp\n const validUntil = Math.floor(Date.now() / 1000) + durationSeconds;\n\n // Encrypt the private key for storage\n const encryptedPrivateKey = encryptPrivateKey(privateKeyHex, encryptKey);\n\n // console.log(\"[ChipiSDK:Session:Create] Session key generated\", {\n // publicKey: publicKey.slice(0, 15) + \"...\",\n // validUntil: new Date(validUntil * 1000).toISOString(),\n // durationSeconds,\n // });\n\n return {\n publicKey,\n encryptedPrivateKey,\n validUntil,\n };\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error(\"[ChipiSDK:Session:Create] Failed to generate session key\", {\n error: err.message,\n durationRequested: durationSeconds,\n });\n throw new ChipiSessionError(\n `Failed to create session key: ${err.message}`,\n SESSION_ERRORS.SESSION_CREATION_FAILED\n );\n }\n }\n\n /**\n * Register a session key on the smart contract.\n *\n * This executes a sponsored transaction (using owner signature) to call\n * `add_or_update_session_key` on the CHIPI wallet contract.\n *\n * The session must be registered before it can be used for transactions.\n *\n * @param params - Session registration parameters\n * @param bearerToken - Authentication token\n * @returns Transaction hash\n *\n * @example\n * ```typescript\n * const txHash = await sdk.sessions.addSessionKeyToContract({\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * sessionConfig: {\n * sessionPublicKey: session.publicKey,\n * validUntil: session.validUntil,\n * maxCalls: 1000,\n * allowedEntrypoints: [] // empty = all allowed\n * }\n * }, bearerToken);\n * ```\n */\n async addSessionKeyToContract(params: AddSessionKeyParams, bearerToken: string): Promise<string> {\n const { encryptKey, wallet, sessionConfig } = params;\n\n // Validate CHIPI wallet\n this.validateChipiWallet(wallet.walletType, \"AddToContract\", wallet.publicKey);\n\n try {\n console.log(\"[ChipiSDK:Session:AddToContract] Registering session on-chain\", {\n walletAddress: wallet.publicKey.slice(0, 15) + \"...\",\n sessionPubKey: sessionConfig.sessionPublicKey.slice(0, 15) + \"...\",\n validUntil: new Date(sessionConfig.validUntil * 1000).toISOString(),\n maxCalls: sessionConfig.maxCalls,\n allowedEntrypoints: sessionConfig.allowedEntrypoints.length,\n });\n\n // Build calldata for add_or_update_session_key\n // Cairo signature: add_or_update_session_key(session_key, valid_until, max_calls, allowed_entrypoints)\n const calldata = [\n sessionConfig.sessionPublicKey,\n num.toHex(sessionConfig.validUntil),\n num.toHex(sessionConfig.maxCalls),\n // Array: first element is length, then elements\n num.toHex(sessionConfig.allowedEntrypoints.length),\n ...sessionConfig.allowedEntrypoints,\n ];\n\n // Execute via paymaster (owner signature)\n const txHash = await executePaymasterTransaction({\n params: {\n encryptKey,\n wallet: { ...wallet, walletType: \"CHIPI\" },\n calls: [\n {\n contractAddress: wallet.publicKey,\n entrypoint: SESSION_ENTRYPOINTS.ADD_OR_UPDATE,\n calldata,\n },\n ],\n saveToDatabase: false, // Don't record session management txs\n },\n bearerToken,\n client: this.client,\n });\n\n console.log(\"[ChipiSDK:Session:AddToContract] Session registered successfully\", {\n txHash,\n sessionPubKey: sessionConfig.sessionPublicKey.slice(0, 15) + \"...\",\n });\n\n return txHash;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error(\"[ChipiSDK:Session:AddToContract] Registration failed\", {\n error: err.message,\n walletAddress: wallet.publicKey?.slice(0, 15) + \"...\",\n sessionPubKey: sessionConfig.sessionPublicKey?.slice(0, 15) + \"...\",\n validUntil: new Date(sessionConfig.validUntil * 1000).toISOString(),\n maxCalls: sessionConfig.maxCalls,\n });\n throw error;\n }\n }\n\n /**\n * Revoke a session key from the smart contract.\n *\n * This executes a sponsored transaction (using owner signature) to call\n * `revoke_session_key` on the CHIPI wallet contract.\n *\n * After revocation, the session key can no longer be used for transactions.\n *\n * @param params - Session revocation parameters\n * @param bearerToken - Authentication token\n * @returns Transaction hash\n *\n * @example\n * ```typescript\n * const txHash = await sdk.sessions.revokeSessionKey({\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * sessionPublicKey: session.publicKey\n * }, bearerToken);\n * ```\n */\n async revokeSessionKey(params: RevokeSessionKeyParams, bearerToken: string): Promise<string> {\n const { encryptKey, wallet, sessionPublicKey } = params;\n\n // Validate CHIPI wallet\n this.validateChipiWallet(wallet.walletType, \"Revoke\", wallet.publicKey);\n\n try {\n console.log(\"[ChipiSDK:Session:Revoke] Revoking session from contract\", {\n walletAddress: wallet.publicKey.slice(0, 15) + \"...\",\n sessionToRevoke: sessionPublicKey.slice(0, 15) + \"...\",\n });\n\n // Execute via paymaster (owner signature)\n const txHash = await executePaymasterTransaction({\n params: {\n encryptKey,\n wallet: { ...wallet, walletType: \"CHIPI\" },\n calls: [\n {\n contractAddress: wallet.publicKey,\n entrypoint: SESSION_ENTRYPOINTS.REVOKE,\n calldata: [sessionPublicKey],\n },\n ],\n saveToDatabase: false, // Don't record session management txs\n },\n bearerToken,\n client: this.client,\n });\n\n console.log(\"[ChipiSDK:Session:Revoke] Session revoked successfully\", {\n txHash,\n sessionRevoked: sessionPublicKey.slice(0, 15) + \"...\",\n });\n\n return txHash;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error(\"[ChipiSDK:Session:Revoke] Revocation failed\", {\n error: err.message,\n walletAddress: wallet.publicKey?.slice(0, 15) + \"...\",\n sessionToRevoke: sessionPublicKey?.slice(0, 15) + \"...\",\n });\n throw error;\n }\n }\n\n /**\n * Query session data from the smart contract.\n *\n * This is a read-only call that does not require signing or gas.\n *\n * @param params - Query parameters\n * @returns Session data including status, remaining calls, and allowed entrypoints\n *\n * @example\n * ```typescript\n * const sessionData = await sdk.sessions.getSessionData({\n * walletAddress: userWallet.publicKey,\n * sessionPublicKey: session.publicKey\n * });\n * if (sessionData.isActive) {\n * console.log(`Session has ${sessionData.remainingCalls} calls remaining`);\n * }\n * ```\n *\n * NOTE: This method intentionally does NOT validate walletType because:\n * 1. It's a read-only query - no state change or risk\n * 2. Non-CHIPI wallets will simply return isActive=false (graceful failure)\n * 3. It doesn't require walletType parameter at all - only walletAddress\n * Adding validation would require changing the interface for no functional benefit.\n */\n async getSessionData(params: GetSessionDataParams): Promise<SessionDataResponse> {\n const { walletAddress, sessionPublicKey } = params;\n\n try {\n const provider = new RpcProvider({\n nodeUrl: WALLET_RPC_ENDPOINTS[\"CHIPI\"],\n });\n\n console.log(\"[ChipiSDK:Session:GetData] Querying session data\", {\n walletAddress: walletAddress.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey.slice(0, 15) + \"...\",\n });\n\n const result = await provider.callContract({\n contractAddress: walletAddress,\n entrypoint: SESSION_ENTRYPOINTS.GET_DATA,\n calldata: [sessionPublicKey],\n });\n\n // Parse the response\n // Expected format: [is_active, valid_until, remaining_calls, allowed_entrypoints_len, ...allowed_entrypoints]\n const resultArray = Array.isArray(result)\n ? result\n : (result as { result?: string[] }).result || [];\n\n if (resultArray.length < 4) {\n console.warn(\"[ChipiSDK:Session:GetData] Unexpected response format\", {\n resultLength: resultArray.length,\n result: resultArray,\n });\n return {\n isActive: false,\n validUntil: 0,\n remainingCalls: 0,\n allowedEntrypoints: [],\n };\n }\n\n const isActive = resultArray[0] === \"0x1\";\n const validUntil = Number(BigInt(resultArray[1]));\n const remainingCalls = Number(BigInt(resultArray[2]));\n const entrypointsLen = Number(BigInt(resultArray[3]));\n const allowedEntrypoints = resultArray.slice(4, 4 + entrypointsLen);\n\n const sessionData: SessionDataResponse = {\n isActive,\n validUntil,\n remainingCalls,\n allowedEntrypoints,\n };\n\n console.log(\"[ChipiSDK:Session:GetData] Session data retrieved\", {\n isActive,\n validUntil: new Date(validUntil * 1000).toISOString(),\n remainingCalls,\n allowedEntrypointsCount: allowedEntrypoints.length,\n });\n\n return sessionData;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Contract revert or empty result = session doesn't exist (expected)\n const sessionNotFoundPatterns = [\n /entry point.*not found/i,\n /requested entrypoint was not found/i,\n /invalid message selector/i,\n /contract not found/i,\n /is not deployed/i,\n /revert.*get_session_data/i,\n ];\n const isSessionNotFound = sessionNotFoundPatterns.some((p) => p.test(err.message));\n\n if (isSessionNotFound) {\n console.log(\"[ChipiSDK:Session:GetData] Session not found on contract\", {\n walletAddress: walletAddress?.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey?.slice(0, 15) + \"...\",\n });\n return {\n isActive: false,\n validUntil: 0,\n remainingCalls: 0,\n allowedEntrypoints: [],\n };\n }\n\n // Infrastructure errors should propagate\n console.error(\"[ChipiSDK:Session:GetData] RPC/network error\", {\n error: err.message,\n walletAddress: walletAddress?.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey?.slice(0, 15) + \"...\",\n });\n throw err;\n }\n }\n\n /**\n * Execute a gasless transaction using a session key.\n *\n * This uses the 4-element session signature format instead of owner signature.\n * The session must be:\n * 1. Generated via `createSessionKey()`\n * 2. Registered on-chain via `addSessionKeyToContract()`\n *\n * CHIPI wallets only - will throw if wallet type is not CHIPI.\n *\n * @param params - Session execution parameters\n * @param bearerToken - Authentication token\n * @returns Transaction hash\n *\n * @example\n * ```typescript\n * // 1. Create session key (store externally)\n * const session = sdk.sessions.createSessionKey({ encryptKey });\n *\n * // 2. Register on contract (one-time)\n * await sdk.sessions.addSessionKeyToContract({\n * encryptKey,\n * wallet,\n * sessionConfig: {\n * sessionPublicKey: session.publicKey,\n * validUntil: session.validUntil,\n * maxCalls: 1000,\n * allowedEntrypoints: []\n * }\n * }, bearerToken);\n *\n * // 3. Execute transactions with session (no owner key needed)\n * const txHash = await sdk.sessions.executeTransactionWithSession({\n * encryptKey,\n * wallet,\n * session,\n * calls\n * }, bearerToken);\n * ```\n */\n async executeTransactionWithSession(\n params: ExecuteWithSessionParams,\n bearerToken: string\n ): Promise<string> {\n const { encryptKey, wallet, session, calls } = params;\n\n // Validate wallet type if provided - session keys only work with CHIPI wallets\n if (wallet.walletType && wallet.walletType !== \"CHIPI\") {\n throw new ChipiSessionError(\n `Session execution only supports CHIPI wallets. Got: ${wallet.walletType}`,\n SESSION_ERRORS.INVALID_WALLET_TYPE_FOR_SESSION\n );\n }\n\n return executePaymasterTransactionWithSession({\n params: {\n encryptKey,\n wallet: { ...wallet, walletType: \"CHIPI\" },\n session,\n calls,\n saveToDatabase: true,\n },\n bearerToken,\n client: this.client,\n });\n }\n\n // --- Spending Policy Methods ---\n // Wraps ISessionSpendingPolicy contract interface.\n // Spending policies enforce per-token limits on ERC-20 operations\n // (transfer, approve, increase_allowance) executed by session keys.\n\n /**\n * Split a bigint into Cairo u256 representation (low u128, high u128).\n */\n private splitU256(value: bigint): [string, string] {\n const mask = (1n << 128n) - 1n;\n return [num.toHex(value & mask), num.toHex(value >> 128n)];\n }\n\n /**\n * Reconstruct a bigint from Cairo u256 (low, high) hex strings.\n */\n private joinU256(low: string, high: string): bigint {\n return BigInt(low) + (BigInt(high) << 128n);\n }\n\n /**\n * Set a spending policy for a session key + token pair.\n *\n * This executes a sponsored transaction (using owner signature) to call\n * `set_spending_policy` on the CHIPI wallet contract.\n *\n * The contract enforces these limits automatically during `__execute__()` on\n * ERC-20 operations (transfer, approve, increase_allowance) made by the session.\n *\n * @param params - Spending policy parameters\n * @param bearerToken - Authentication token\n * @returns Transaction hash\n *\n * @example\n * ```typescript\n * // Set a spending limit: max 1 USDC per call, 50 USDC per day\n * const txHash = await sdk.sessions.setSpendingPolicy({\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * spendingPolicyConfig: {\n * sessionPublicKey: session.publicKey,\n * token: USDC_ADDRESS,\n * maxPerCall: 1_000_000n, // 1 USDC (6 decimals)\n * maxPerWindow: 50_000_000n, // 50 USDC\n * windowSeconds: 86400, // 24 hours\n * }\n * }, bearerToken);\n * ```\n */\n async setSpendingPolicy(params: SetSpendingPolicyParams, bearerToken: string): Promise<string> {\n const { encryptKey, wallet, spendingPolicyConfig } = params;\n const { sessionPublicKey, token, maxPerCall, maxPerWindow, windowSeconds } =\n spendingPolicyConfig;\n\n // Validate wallet type if provided (backward compat: omitted = assume CHIPI)\n if (wallet.walletType && wallet.walletType !== \"CHIPI\") {\n throw new ChipiSessionError(\n `Spending policies only support CHIPI wallets. Got: ${wallet.walletType}`,\n SESSION_ERRORS.INVALID_WALLET_TYPE_FOR_SESSION\n );\n }\n\n // Validate spending policy config\n const U256_MAX = (1n << 256n) - 1n;\n const U64_MAX = (1n << 64n) - 1n;\n\n if (!token || token.trim().length === 0) {\n throw new ChipiSessionError(\n `Invalid token address for spending policy: \"${token}\"`,\n SESSION_ERRORS.INVALID_SPENDING_POLICY\n );\n }\n if (\n typeof windowSeconds !== \"number\" ||\n !Number.isFinite(windowSeconds) ||\n !Number.isInteger(windowSeconds) ||\n windowSeconds <= 0 ||\n BigInt(windowSeconds) > U64_MAX\n ) {\n throw new ChipiSessionError(\n `Invalid window duration: ${windowSeconds}. Must be a positive integer within u64 range.`,\n SESSION_ERRORS.INVALID_SPENDING_POLICY\n );\n }\n if (maxPerCall < 0n || maxPerCall > U256_MAX) {\n throw new ChipiSessionError(\n `Invalid maxPerCall: must be >= 0 and <= 2^256 - 1`,\n SESSION_ERRORS.INVALID_SPENDING_POLICY\n );\n }\n if (maxPerWindow < 0n || maxPerWindow > U256_MAX) {\n throw new ChipiSessionError(\n `Invalid maxPerWindow: must be >= 0 and <= 2^256 - 1`,\n SESSION_ERRORS.INVALID_SPENDING_POLICY\n );\n }\n if (maxPerWindow > 0n && maxPerCall > maxPerWindow) {\n throw new ChipiSessionError(\n `Invalid spending policy: maxPerCall (${maxPerCall}) cannot exceed maxPerWindow (${maxPerWindow})`,\n SESSION_ERRORS.INVALID_SPENDING_POLICY\n );\n }\n\n try {\n console.log(\"[ChipiSDK:Session:SetSpendingPolicy] Setting spending policy\", {\n walletAddress: wallet.publicKey.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey.slice(0, 15) + \"...\",\n token: token.slice(0, 15) + \"...\",\n maxPerCall: maxPerCall.toString(),\n maxPerWindow: maxPerWindow.toString(),\n windowSeconds,\n });\n\n // Build calldata for set_spending_policy\n // Cairo: set_spending_policy(session_key, token, max_per_call: u256, max_per_window: u256, window_seconds: u64)\n // u256 is encoded as [low: u128, high: u128]\n const [maxPerCallLow, maxPerCallHigh] = this.splitU256(maxPerCall);\n const [maxPerWindowLow, maxPerWindowHigh] = this.splitU256(maxPerWindow);\n\n const calldata = [\n sessionPublicKey,\n token,\n maxPerCallLow,\n maxPerCallHigh,\n maxPerWindowLow,\n maxPerWindowHigh,\n num.toHex(windowSeconds),\n ];\n\n // Execute via paymaster (owner signature)\n const txHash = await executePaymasterTransaction({\n params: {\n encryptKey,\n wallet: { ...wallet, walletType: \"CHIPI\" },\n calls: [\n {\n contractAddress: wallet.publicKey,\n entrypoint: SESSION_ENTRYPOINTS.SET_SPENDING_POLICY,\n calldata,\n },\n ],\n saveToDatabase: false,\n },\n bearerToken,\n client: this.client,\n });\n\n console.log(\"[ChipiSDK:Session:SetSpendingPolicy] Spending policy set successfully\", {\n txHash,\n sessionPubKey: sessionPublicKey.slice(0, 15) + \"...\",\n token: token.slice(0, 15) + \"...\",\n });\n\n return txHash;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error(\"[ChipiSDK:Session:SetSpendingPolicy] Failed to set spending policy\", {\n error: err.message,\n walletAddress: wallet.publicKey?.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey?.slice(0, 15) + \"...\",\n token: token?.slice(0, 15) + \"...\",\n });\n throw error;\n }\n }\n\n /**\n * Query a spending policy from the smart contract.\n *\n * This is a read-only call that does not require signing or gas.\n * Returns zeroed data if no policy is set (meaning no enforcement).\n *\n * @param params - Query parameters\n * @returns Spending policy data including limits and current window state\n *\n * @example\n * ```typescript\n * const policy = await sdk.sessions.getSpendingPolicy({\n * walletAddress: userWallet.publicKey,\n * sessionPublicKey: session.publicKey,\n * token: USDC_ADDRESS,\n * });\n * if (policy.maxPerWindow > 0n) {\n * console.log(`Spent ${policy.spentInWindow} of ${policy.maxPerWindow} this window`);\n * }\n * ```\n */\n async getSpendingPolicy(params: GetSpendingPolicyParams): Promise<SpendingPolicyData> {\n const { walletAddress, sessionPublicKey, token } = params;\n\n try {\n const provider = new RpcProvider({\n nodeUrl: WALLET_RPC_ENDPOINTS[\"CHIPI\"],\n });\n\n console.log(\"[ChipiSDK:Session:GetSpendingPolicy] Querying spending policy\", {\n walletAddress: walletAddress.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey.slice(0, 15) + \"...\",\n token: token.slice(0, 15) + \"...\",\n });\n\n const result = await provider.callContract({\n contractAddress: walletAddress,\n entrypoint: SESSION_ENTRYPOINTS.GET_SPENDING_POLICY,\n calldata: [sessionPublicKey, token],\n });\n\n // Parse response: [max_per_call_low, max_per_call_high, max_per_window_low, max_per_window_high,\n // window_seconds, spent_in_window_low, spent_in_window_high, window_start]\n const resultArray = Array.isArray(result)\n ? result\n : (result as { result?: string[] }).result || [];\n\n if (resultArray.length < 8) {\n console.warn(\"[ChipiSDK:Session:GetSpendingPolicy] Unexpected response format\", {\n resultLength: resultArray.length,\n result: resultArray,\n });\n return {\n maxPerCall: 0n,\n maxPerWindow: 0n,\n windowSeconds: 0,\n spentInWindow: 0n,\n windowStart: 0,\n };\n }\n\n const policyData: SpendingPolicyData = {\n maxPerCall: this.joinU256(resultArray[0], resultArray[1]),\n maxPerWindow: this.joinU256(resultArray[2], resultArray[3]),\n windowSeconds: Number(BigInt(resultArray[4])),\n spentInWindow: this.joinU256(resultArray[5], resultArray[6]),\n windowStart: Number(BigInt(resultArray[7])),\n };\n\n console.log(\"[ChipiSDK:Session:GetSpendingPolicy] Spending policy retrieved\", {\n maxPerCall: policyData.maxPerCall.toString(),\n maxPerWindow: policyData.maxPerWindow.toString(),\n windowSeconds: policyData.windowSeconds,\n spentInWindow: policyData.spentInWindow.toString(),\n windowStart: policyData.windowStart,\n });\n\n return policyData;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Contract revert or entry not found = no policy set (expected)\n const notFoundPatterns = [\n /entry point.*not found/i,\n /requested entrypoint was not found/i,\n /invalid message selector/i,\n /contract not found/i,\n /is not deployed/i,\n ];\n const isNotFound = notFoundPatterns.some((p) => p.test(err.message));\n\n if (isNotFound) {\n console.log(\n \"[ChipiSDK:Session:GetSpendingPolicy] No policy found (contract or entrypoint missing)\",\n {\n walletAddress: walletAddress?.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey?.slice(0, 15) + \"...\",\n token: token?.slice(0, 15) + \"...\",\n }\n );\n return {\n maxPerCall: 0n,\n maxPerWindow: 0n,\n windowSeconds: 0,\n spentInWindow: 0n,\n windowStart: 0,\n };\n }\n\n console.error(\"[ChipiSDK:Session:GetSpendingPolicy] RPC/network error\", {\n error: err.message,\n walletAddress: walletAddress?.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey?.slice(0, 15) + \"...\",\n token: token?.slice(0, 15) + \"...\",\n });\n throw err;\n }\n }\n\n /**\n * Remove a spending policy for a session key + token pair.\n *\n * This executes a sponsored transaction (using owner signature) to call\n * `remove_spending_policy` on the CHIPI wallet contract.\n *\n * After removal, the session key has no spending limits for this token.\n *\n * @param params - Policy removal parameters\n * @param bearerToken - Authentication token\n * @returns Transaction hash\n *\n * @example\n * ```typescript\n * const txHash = await sdk.sessions.removeSpendingPolicy({\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * sessionPublicKey: session.publicKey,\n * token: USDC_ADDRESS,\n * }, bearerToken);\n * ```\n */\n async removeSpendingPolicy(\n params: RemoveSpendingPolicyParams,\n bearerToken: string\n ): Promise<string> {\n const { encryptKey, wallet, sessionPublicKey, token } = params;\n\n // Validate wallet type if provided (backward compat: omitted = assume CHIPI)\n if (wallet.walletType && wallet.walletType !== \"CHIPI\") {\n throw new ChipiSessionError(\n `Spending policies only support CHIPI wallets. Got: ${wallet.walletType}`,\n SESSION_ERRORS.INVALID_WALLET_TYPE_FOR_SESSION\n );\n }\n\n if (!token || token.trim().length === 0) {\n throw new ChipiSessionError(\n `Invalid token address for spending policy removal: \"${token}\"`,\n SESSION_ERRORS.INVALID_SPENDING_POLICY\n );\n }\n\n try {\n console.log(\"[ChipiSDK:Session:RemoveSpendingPolicy] Removing spending policy\", {\n walletAddress: wallet.publicKey.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey.slice(0, 15) + \"...\",\n token: token.slice(0, 15) + \"...\",\n });\n\n // Build calldata for remove_spending_policy\n // Cairo: remove_spending_policy(session_key, token)\n const calldata = [sessionPublicKey, token];\n\n // Execute via paymaster (owner signature)\n const txHash = await executePaymasterTransaction({\n params: {\n encryptKey,\n wallet: { ...wallet, walletType: \"CHIPI\" },\n calls: [\n {\n contractAddress: wallet.publicKey,\n entrypoint: SESSION_ENTRYPOINTS.REMOVE_SPENDING_POLICY,\n calldata,\n },\n ],\n saveToDatabase: false,\n },\n bearerToken,\n client: this.client,\n });\n\n console.log(\"[ChipiSDK:Session:RemoveSpendingPolicy] Spending policy removed successfully\", {\n txHash,\n sessionPubKey: sessionPublicKey.slice(0, 15) + \"...\",\n token: token.slice(0, 15) + \"...\",\n });\n\n return txHash;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error(\"[ChipiSDK:Session:RemoveSpendingPolicy] Failed to remove spending policy\", {\n error: err.message,\n walletAddress: wallet.publicKey?.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey?.slice(0, 15) + \"...\",\n token: token?.slice(0, 15) + \"...\",\n });\n throw error;\n }\n }\n}\n","import type {\n PaymentPayload,\n VerifyResponse,\n SettleResponse,\n NonceStore,\n X402FacilitatorConfig,\n} from \"@chipi-stack/types\";\nimport { CONTRACT_ADDRESSES } from \"@chipi-stack/shared\";\nimport { buildX402TypedData } from \"@chipi-stack/core\";\nimport { uint256, typedData as starknetTypedData } from \"starknet\";\nimport { ChipiClient } from \"../client\";\nimport type {\n ExecuteSponsoredTransactionResponse,\n PrepareTypedDataResponse,\n} from \"@chipi-stack/types\";\n\n/** Default in-memory nonce store. Resets on server restart. */\nclass InMemoryNonceStore implements NonceStore {\n private readonly used = new Set<string>();\n\n has(nonce: string): boolean {\n return this.used.has(nonce);\n }\n\n consume(nonce: string): boolean {\n if (this.used.has(nonce)) return false;\n this.used.add(nonce);\n return true;\n }\n}\n\n/** Options for the static X402Facilitator.create() factory */\nexport interface X402FacilitatorCreateOptions {\n /** API public key for ChipiClient */\n apiKey: string;\n /** Bearer token for paymaster API calls */\n bearerToken: string;\n /** Custom nonce store (default: in-memory) */\n nonceStore?: NonceStore;\n /** RPC provider for on-chain signature verification */\n provider?: X402FacilitatorConfig[\"provider\"];\n}\n\n/**\n * x402 Payment Facilitator for Starknet.\n *\n * Implements the \"facilitator\" role in the x402 protocol:\n * - verify(): Validate payment signature, amount, asset, nonce replay\n * - settle(): Execute the USDC transfer via Chipi's paymaster\n *\n * Settlement reuses Chipi's existing gasless infrastructure\n * (prepare-typed-data → sign → execute-sponsored-transaction).\n */\nexport class X402Facilitator {\n private readonly client: ChipiClient;\n private readonly bearerToken: string;\n private readonly nonceStore: NonceStore;\n private readonly provider: X402FacilitatorConfig[\"provider\"];\n\n constructor(client: ChipiClient, bearerToken: string, config?: X402FacilitatorConfig) {\n this.client = client;\n this.bearerToken = bearerToken;\n this.nonceStore = config?.nonceStore ?? new InMemoryNonceStore();\n this.provider = config?.provider;\n }\n\n /**\n * Factory method for simpler instantiation.\n *\n * @example\n * ```typescript\n * const facilitator = X402Facilitator.create({\n * apiKey: process.env.CHIPI_API_KEY!,\n * bearerToken: process.env.CHIPI_BEARER_TOKEN!,\n * });\n * ```\n */\n static create(options: X402FacilitatorCreateOptions): X402Facilitator {\n const client = new ChipiClient({ apiPublicKey: options.apiKey });\n return new X402Facilitator(client, options.bearerToken, {\n nonceStore: options.nonceStore,\n provider: options.provider,\n });\n }\n\n /**\n * Verify a payment signature is valid (doesn't execute the transfer).\n *\n * Checks:\n * 1. Nonce has not been used (replay protection)\n * 2. Payment has not expired (validUntil > now)\n * 3. Asset is USDC mainnet\n * 4. Amount is positive\n * 5. Addresses are non-empty\n */\n async verify(payment: PaymentPayload): Promise<VerifyResponse> {\n const { payload } = payment;\n\n // 1. Check x402 version\n if (payment.x402Version !== 1) {\n return { isValid: false, invalidReason: `Unsupported x402 version: ${payment.x402Version}` };\n }\n\n // 2. Check network\n if (payment.network !== \"starknet-mainnet\") {\n return { isValid: false, invalidReason: `Unsupported network: ${payment.network}` };\n }\n\n // 3. Check nonce replay\n if (await this.nonceStore.has(payload.nonce)) {\n return { isValid: false, invalidReason: \"Nonce already used (replay)\" };\n }\n\n // 4. Check expiry\n const now = Math.floor(Date.now() / 1000);\n if (payload.validUntil <= now) {\n return { isValid: false, invalidReason: \"Payment has expired (validUntil in the past)\" };\n }\n\n // 5. Validate asset is USDC\n const normalizedAsset = payload.asset.toLowerCase().replace(/^0x0+/, \"0x\");\n const normalizedUsdc = CONTRACT_ADDRESSES.USDC_MAINNET.toLowerCase().replace(/^0x0+/, \"0x\");\n if (normalizedAsset !== normalizedUsdc) {\n return {\n isValid: false,\n invalidReason: `Unsupported asset: ${payload.asset}. Only USDC is accepted.`,\n };\n }\n\n // 6. Validate amount is positive\n let amount: bigint;\n try {\n amount = BigInt(payload.amount);\n } catch {\n return { isValid: false, invalidReason: \"Invalid payment amount format\" };\n }\n if (amount <= 0n) {\n return { isValid: false, invalidReason: \"Payment amount must be positive\" };\n }\n\n // 7. Validate addresses are non-empty\n if (!payload.fromAddress || !payload.toAddress) {\n return { isValid: false, invalidReason: \"Missing fromAddress or toAddress\" };\n }\n\n // 8. Verify SNIP-12 signature (cryptographic if provider available, presence-only otherwise)\n const sigResult = await this.verifySignature(payment);\n if (!sigResult.valid) {\n return { isValid: false, invalidReason: sigResult.reason };\n }\n\n return { isValid: true };\n }\n\n /**\n * Verify the SNIP-12 signature on a payment payload.\n *\n * If an RPC provider is configured, reconstructs the typed data, computes the\n * message hash, and calls `is_valid_signature()` on the sender's account contract.\n * Otherwise falls back to a presence-only check (backwards compatible).\n */\n private async verifySignature(\n payment: PaymentPayload\n ): Promise<{ valid: boolean; reason?: string }> {\n if (!this.provider) {\n // No provider configured — fall back to presence-only check\n if (!payment.payload?.signature?.r || !payment.payload?.signature?.s) {\n return { valid: false, reason: \"Missing signature\" };\n }\n return { valid: true };\n }\n\n const payload = payment.payload;\n\n if (!payload?.signature?.r || !payload?.signature?.s) {\n return { valid: false, reason: \"Missing signature\" };\n }\n\n // Reconstruct the SNIP-12 typed data (must match client's signPayment())\n const paymentTypedData = buildX402TypedData({\n from_address: payload.fromAddress,\n to_address: payload.toAddress,\n amount: payload.amount,\n asset: payload.asset,\n valid_until: String(payload.validUntil),\n nonce: payload.nonce,\n });\n\n // Compute the message hash\n const msgHash = starknetTypedData.getMessageHash(paymentTypedData, payload.fromAddress);\n\n // Call is_valid_signature on the account contract\n // Calldata: [hash, signature_length, r, s]\n try {\n const result = await this.provider.callContract({\n contractAddress: payload.fromAddress,\n entrypoint: \"is_valid_signature\",\n calldata: [msgHash, \"2\", payload.signature.r, payload.signature.s],\n });\n\n // ERC-1271 / SRC-6: returns 'VALID' (0x56414c4944) if signature is valid\n const VALID = \"0x56414c4944\";\n if (result[0] === VALID || result[0] === BigInt(VALID).toString()) {\n return { valid: true };\n }\n return { valid: false, reason: \"Invalid SNIP-12 signature\" };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { valid: false, reason: `Signature verification failed: ${message}` };\n }\n }\n\n /**\n * Settle a verified payment by executing the USDC transfer via paymaster.\n *\n * IMPORTANT: Mark nonce as consumed BEFORE executing to prevent concurrent replays.\n * If the transfer fails after nonce consumption, the nonce is still burned\n * (caller should implement idempotency at a higher level if needed).\n */\n async settle(payment: PaymentPayload): Promise<SettleResponse> {\n const { payload } = payment;\n\n // 1. Verify before settling\n const verification = await this.verify(payment);\n if (!verification.isValid) {\n return { success: false, errorReason: verification.invalidReason };\n }\n\n // 2. Atomically consume nonce (prevents concurrent replays)\n const consumed = await this.nonceStore.consume(payload.nonce);\n if (!consumed) {\n return { success: false, errorReason: \"Nonce already consumed (concurrent replay)\" };\n }\n\n try {\n // 3. Build ERC20 transfer call: fromAddress → toAddress\n // ERC20 transfer expects u256 (low, high) for the amount\n const amountU256 = uint256.bnToUint256(BigInt(payload.amount));\n const transferCall = {\n contractAddress: payload.asset,\n entrypoint: \"transfer\",\n calldata: [payload.toAddress, amountU256.low.toString(), amountU256.high.toString()],\n };\n\n // 4. Prepare typed data for sponsored execution\n const prepareResponse = await this.client.post<PrepareTypedDataResponse>({\n endpoint: \"/transactions/prepare-typed-data\",\n bearerToken: this.bearerToken,\n body: {\n publicKey: payload.fromAddress,\n calls: [transferCall],\n },\n });\n\n // 5. Execute sponsored transaction using the payment signature\n const result = await this.client.post<ExecuteSponsoredTransactionResponse>({\n endpoint: \"/transactions/execute-sponsored-transaction\",\n bearerToken: this.bearerToken,\n body: {\n publicKey: payload.fromAddress,\n typedData: prepareResponse.typedData,\n userSignature: payload.signature,\n walletType: prepareResponse.walletType,\n saveToDatabase: true,\n },\n });\n\n if (typeof result?.transactionHash !== \"string\" || !result.transactionHash.trim()) {\n return {\n success: false,\n errorReason: (result as any)?.message ?? \"No transaction hash returned from paymaster\",\n };\n }\n\n return {\n success: true,\n transactionHash: result.transactionHash,\n networkId: \"starknet-mainnet\",\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n errorReason: `Settlement failed: ${message}`,\n };\n }\n }\n}\n","import type { SignTypedDataParams, SignTypedDataResult } from \"@chipi-stack/types\";\nimport { Account, RpcProvider } from \"starknet\";\nimport { decryptPrivateKey } from \"./encryption\";\nimport { WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS } from \"@chipi-stack/shared\";\nimport { normalizeSignature } from \"./paymaster-adapter\";\n\n/**\n * Sign SNIP-12 typed data without executing a transaction.\n *\n * This is a purely local operation:\n * 1. Decrypt the private key using the encryption key (PIN)\n * 2. Create a starknet Account\n * 3. Sign the typed data with account.signMessage()\n * 4. Normalize and return { r, s }\n *\n * No API calls are made. Useful for x402 payment signatures and other\n * off-chain signing flows where you need a SNIP-12 signature but don't\n * want to execute a transaction.\n */\nexport const signTypedData = async ({\n params,\n}: {\n params: SignTypedDataParams;\n}): Promise<SignTypedDataResult> => {\n try {\n const { encryptKey, wallet, typedData } = params;\n\n if (!encryptKey) {\n throw new Error(\"encryptKey is required for signing typed data\");\n }\n\n if (!wallet || !wallet.encryptedPrivateKey || !wallet.publicKey) {\n throw new Error(\"wallet with publicKey and encryptedPrivateKey is required\");\n }\n\n if (!typedData) {\n throw new Error(\"typedData is required for signing\");\n }\n\n const walletType = wallet.walletType ?? \"READY\";\n\n if (\n !Object.prototype.hasOwnProperty.call(WALLET_RPC_ENDPOINTS, walletType) ||\n !Object.prototype.hasOwnProperty.call(WALLET_CLASS_HASHES, walletType)\n ) {\n throw new Error(`Unsupported wallet type: \"${String(walletType)}\"`);\n }\n\n const rpcUrl = WALLET_RPC_ENDPOINTS[walletType];\n\n // Decrypt the private key\n let privateKeyDecrypted: string;\n try {\n privateKeyDecrypted = decryptPrivateKey(wallet.encryptedPrivateKey, encryptKey);\n } catch {\n throw new Error(\"Failed to decrypt private key. Verify the encryptKey is correct.\");\n }\n\n const provider = new RpcProvider({ nodeUrl: rpcUrl });\n\n const account = new Account({\n provider,\n address: wallet.publicKey,\n signer: privateKeyDecrypted,\n });\n\n // Sign the typed data\n const signature = await account.signMessage(typedData);\n\n // Normalize signature format (handles both Weierstrass and Array types)\n const normalizedSig = normalizeSignature(signature);\n\n return normalizedSig;\n } catch (error) {\n console.error(\"Error signing typed data\", error);\n throw error;\n }\n};\n","import type {\n ChipiSDKConfig,\n CreateWalletParams,\n CreateWalletResponse,\n GetWalletParams,\n TransferParams,\n ApproveParams,\n CallAnyContractParams,\n ExecuteTransactionParams,\n RecordSendTransactionParams,\n Transaction,\n CreateSkuPurchaseParams,\n GetTokenBalanceParams,\n GetTokenBalanceResponse,\n PaginatedResponse,\n Sku,\n GetSkuListQuery,\n GetTransactionListQuery,\n ExecuteWithSessionParams,\n Currency,\n X402FacilitatorConfig,\n SignTypedDataParams,\n SignTypedDataResult,\n TransactionStatusResponse,\n PrepareWalletUpgradeParams,\n PrepareWalletUpgradeResponse,\n ExecuteWalletUpgradeParams,\n ExecuteWalletUpgradeResponse,\n} from \"@chipi-stack/types\";\nimport { STARKNET_NETWORKS, CONTRACT_ADDRESSES, formatAmount } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\nimport { ChipiWallets } from \"./wallets\";\nimport { ChipiTransactions } from \"./transactions\";\nimport { ChipiSkuPurchases } from \"./sku-purchases\";\nimport { ChipiSkus } from \"./skus\";\n\nimport { ChipiSessions } from \"./sessions\";\nimport { ChipiExchanges } from \"./exchanges\";\nimport { ChipiPaymasterAdapter } from \"./paymaster-adapter\";\nimport { X402Facilitator } from \"./x402/facilitator\";\nimport { signTypedData } from \"./sign-typed-data\";\n\n/**\n * Main Chipi SDK class\n */\nexport class ChipiSDK {\n private client: ChipiClient;\n private nodeUrl: string;\n private apiSecretKey?: string;\n\n public readonly wallets: ChipiWallets;\n public readonly transactions: ChipiTransactions;\n public readonly skuPurchases: ChipiSkuPurchases;\n public readonly skus: ChipiSkus;\n public readonly sessions: ChipiSessions;\n public readonly exchanges: ChipiExchanges;\n\n constructor(config: ChipiSDKConfig) {\n this.client = new ChipiClient(config);\n this.nodeUrl = config.nodeUrl || STARKNET_NETWORKS.MAINNET;\n this.apiSecretKey = config.apiSecretKey;\n\n // Initialize service classes\n this.wallets = new ChipiWallets(this.client);\n this.transactions = new ChipiTransactions(this.client);\n this.skuPurchases = new ChipiSkuPurchases(this.client);\n this.skus = new ChipiSkus(this.client);\n this.sessions = new ChipiSessions(this.client);\n this.exchanges = new ChipiExchanges(this.client);\n\n // Bind methods to preserve context\n this.executeTransaction = this.executeTransaction.bind(this);\n this.executeTransactionWithSession = this.executeTransactionWithSession.bind(this);\n this.transfer = this.transfer.bind(this);\n this.approve = this.approve.bind(this);\n // this.stakeVesuUsdc = this.stakeVesuUsdc.bind(this);\n // this.withdrawVesuUsdc = this.withdrawVesuUsdc.bind(this);\n this.callAnyContract = this.callAnyContract.bind(this);\n this.createWallet = this.createWallet.bind(this);\n this.recordSendTransaction = this.recordSendTransaction.bind(this);\n this.purchaseSku = this.purchaseSku.bind(this);\n this.getUsdAmount = this.getUsdAmount.bind(this);\n this.signTypedData = this.signTypedData.bind(this);\n this.createPaymasterAdapter = this.createPaymasterAdapter.bind(this);\n this.createX402Facilitator = this.createX402Facilitator.bind(this);\n }\n\n /**\n * Resolve bearer token - uses provided token or falls back to apiSecretKey\n */\n private resolveBearerToken(bearerToken?: string): string {\n const token = bearerToken ?? this.apiSecretKey;\n\n if (!token) {\n throw new Error(\n \"Authentication required: either pass a bearerToken or configure the SDK with an apiSecretKey\"\n );\n }\n\n return token;\n }\n\n /**\n * Create a PaymasterAdapter for use with TxBuilder.sendSponsored().\n *\n * @example\n * ```typescript\n * const sdk = new ChipiServerSDK({ apiPublicKey: \"pk_...\", apiSecretKey: \"sk_...\" });\n * const paymaster = sdk.createPaymasterAdapter();\n *\n * const txHash = await new TxBuilder(account, { paymaster })\n * .transfer(USDC, [{ to, amount }])\n * .sendSponsored(); // gasless!\n * ```\n */\n createPaymasterAdapter(bearerToken?: string): ChipiPaymasterAdapter {\n const token = this.resolveBearerToken(bearerToken);\n return new ChipiPaymasterAdapter(this.client, token);\n }\n\n /**\n * Create an X402Facilitator for verifying and settling x402 payments.\n *\n * @example\n * ```typescript\n * const facilitator = sdk.createX402Facilitator();\n *\n * // With custom nonce store (Redis)\n * const facilitator = sdk.createX402Facilitator(bearerToken, {\n * nonceStore: {\n * has: async (nonce) => (await redis.sismember(\"x402:nonces\", nonce)) === 1,\n * consume: async (nonce) => (await redis.sadd(\"x402:nonces\", nonce)) === 1,\n * },\n * });\n * ```\n */\n createX402Facilitator(\n bearerToken?: string,\n config?: X402FacilitatorConfig\n ): X402Facilitator {\n const token = this.resolveBearerToken(bearerToken);\n return new X402Facilitator(this.client, token, config);\n }\n\n /**\n * Execute a gasless transaction\n */\n async executeTransaction({\n params,\n bearerToken,\n }: {\n params: ExecuteTransactionParams;\n bearerToken?: string;\n }): Promise<string> {\n return this.transactions.executeTransaction({\n params,\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n /**\n * Execute a gasless transaction using a session key.\n *\n * This uses the 4-element session signature format instead of owner signature.\n * The session must be:\n * 1. Generated via `sessions.createSessionKey()`\n * 2. Registered on-chain via `sessions.addSessionKeyToContract()`\n *\n * CHIPI wallets only - will throw if wallet type is not CHIPI.\n *\n * @example\n * ```typescript\n * // 1. Create session key (store externally)\n * const session = sdk.sessions.createSessionKey({ encryptKey });\n *\n * // 2. Register on contract (one-time)\n * await sdk.sessions.addSessionKeyToContract({\n * encryptKey,\n * wallet,\n * sessionConfig: {\n * sessionPublicKey: session.publicKey,\n * validUntil: session.validUntil,\n * maxCalls: 1000,\n * allowedEntrypoints: []\n * }\n * }, bearerToken);\n *\n * // 3. Execute transactions with session (no owner key needed)\n * const txHash = await sdk.executeTransactionWithSession({\n * params: { encryptKey, wallet, session, calls },\n * bearerToken\n * });\n * ```\n */\n async executeTransactionWithSession({\n params,\n bearerToken,\n }: {\n params: ExecuteWithSessionParams;\n bearerToken?: string;\n }): Promise<string> {\n return this.sessions.executeTransactionWithSession(\n params,\n this.resolveBearerToken(bearerToken)\n );\n }\n\n /**\n * Sign SNIP-12 typed data without executing a transaction.\n *\n * Purely local operation: decrypt private key → sign → return { r, s }.\n * No API calls are made. Useful for x402 payment signatures and other\n * off-chain signing flows.\n *\n * @example\n * ```typescript\n * const { r, s } = await sdk.signTypedData({\n * params: {\n * encryptKey: pin,\n * wallet,\n * typedData: snip12TypedData,\n * },\n * });\n * ```\n */\n async signTypedData({\n params,\n }: {\n params: SignTypedDataParams;\n }): Promise<SignTypedDataResult> {\n return signTypedData({ params });\n }\n\n /**\n * Transfer tokens\n */\n async transfer({\n params,\n bearerToken,\n }: {\n params: TransferParams;\n bearerToken?: string;\n }): Promise<string> {\n return this.transactions.transfer({\n params,\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n /**\n * Approve token spending\n */\n async approve({\n params,\n bearerToken,\n }: {\n params: ApproveParams;\n bearerToken?: string;\n }): Promise<string> {\n const { encryptKey, wallet, contractAddress, spender, amount, decimals } = params;\n return this.executeTransaction({\n params: {\n encryptKey,\n wallet,\n calls: [\n {\n contractAddress,\n entrypoint: \"approve\",\n calldata: [spender, formatAmount(amount, decimals), \"0x0\"],\n },\n ],\n },\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n /**\n * Call any contract method\n */\n async callAnyContract({\n params,\n bearerToken,\n }: {\n params: CallAnyContractParams;\n bearerToken?: string;\n }): Promise<string> {\n const { encryptKey, wallet, calls } = params;\n return this.executeTransaction({\n params: {\n encryptKey,\n wallet,\n calls,\n },\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n /**\n * Create a new wallet\n */\n async createWallet({\n params,\n bearerToken,\n }: {\n params: CreateWalletParams;\n bearerToken?: string;\n }): Promise<CreateWalletResponse> {\n return this.wallets.createWallet({\n ...params,\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n async recordSendTransaction({\n params,\n bearerToken,\n }: {\n params: RecordSendTransactionParams;\n bearerToken?: string;\n }): Promise<Transaction> {\n return this.transactions.recordSendTransaction({\n params,\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n async getTransactionList(\n query: GetTransactionListQuery,\n bearerToken?: string\n ): Promise<PaginatedResponse<Transaction>> {\n return this.transactions.getTransactionList(query, this.resolveBearerToken(bearerToken));\n }\n\n async getWallet(params: GetWalletParams, bearerToken?: string) {\n return this.wallets.getWallet(params, this.resolveBearerToken(bearerToken));\n }\n\n async getTokenBalance(\n params: GetTokenBalanceParams,\n bearerToken?: string\n ): Promise<GetTokenBalanceResponse> {\n return this.wallets.getTokenBalance({\n params,\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n /**\n * Purchase a SKU\n */\n async purchaseSku({\n params,\n bearerToken,\n }: {\n params: CreateSkuPurchaseParams;\n bearerToken?: string;\n }): Promise<Transaction> {\n return this.skuPurchases.purchaseSku(params, this.resolveBearerToken(bearerToken));\n }\n\n /**\n * Get a SKU purchase by id\n */\n async getSkuPurchase(id: string, bearerToken?: string): Promise<Transaction> {\n return this.skuPurchases.getSkuPurchase(id, this.resolveBearerToken(bearerToken));\n }\n\n /// SKUS\n async getSkuList(params: GetSkuListQuery, bearerToken?: string): Promise<PaginatedResponse<Sku>> {\n return this.skus.getSkuList(params, this.resolveBearerToken(bearerToken));\n }\n\n async getSku(id: string, bearerToken?: string): Promise<Sku> {\n return this.skus.getSku(id, this.resolveBearerToken(bearerToken));\n }\n\n /**\n * Get a single transaction by hash or internal ID\n */\n async getTransaction(hashOrId: string, bearerToken?: string): Promise<Transaction> {\n return this.transactions.getTransaction(hashOrId, this.resolveBearerToken(bearerToken));\n }\n\n /**\n * Get on-chain transaction status (supports polling for confirmation)\n */\n async getTransactionStatus(hash: string, bearerToken?: string): Promise<TransactionStatusResponse> {\n return this.transactions.getTransactionStatus(hash, this.resolveBearerToken(bearerToken));\n }\n\n /**\n * Prepare a wallet upgrade (e.g., READY → CHIPI or CHIPI v29 → v33).\n * Returns typed data that must be signed by the wallet owner.\n * Server-only: requires API secret key.\n */\n async prepareWalletUpgrade(\n params: PrepareWalletUpgradeParams,\n bearerToken?: string\n ): Promise<PrepareWalletUpgradeResponse> {\n return this.wallets.prepareWalletUpgrade(params, this.resolveBearerToken(bearerToken));\n }\n\n /**\n * Execute a wallet upgrade after signing.\n * Server-only: requires API secret key.\n */\n async executeWalletUpgrade(\n params: ExecuteWalletUpgradeParams,\n bearerToken?: string\n ): Promise<ExecuteWalletUpgradeResponse> {\n return this.wallets.executeWalletUpgrade(params, this.resolveBearerToken(bearerToken));\n }\n\n async getUsdAmount(\n currencyAmount: number,\n currency: Currency,\n bearerToken?: string\n ): Promise<number> {\n return this.exchanges.getUsdAmount(\n currencyAmount,\n currency,\n this.resolveBearerToken(bearerToken)\n );\n }\n}\n","import type { ChipiServerSDKConfig } from \"@chipi-stack/types\";\nimport { ChipiSDK } from \"./chipi-sdk\";\n\n/**\n * Server-side Chipi SDK with built-in API Secret Key authentication\n *\n * This class is designed for server-side environments where you can safely store\n * the API Secret Key. All methods automatically use the secret key for authentication,\n * so you don't need to pass a bearer token with each call.\n *\n * The apiSecretKey is stored internally and used automatically for all authenticated requests.\n * All methods from ChipiSDK are inherited and work without requiring a bearerToken parameter.\n *\n * @example\n * ```typescript\n * const chipiServer = new ChipiServerSDK({\n * apiPublicKey: \"pk_...\",\n * apiSecretKey: \"sk_...\",\n * environment: \"production\"\n * });\n *\n * // No bearer token needed - automatically uses apiSecretKey!\n * const wallet = await chipiServer.createWallet({\n * params: {\n * encryptKey: \"user-encryption-key\",\n * externalUserId: \"user-123\"\n * }\n * });\n *\n * const userWallet = await chipiServer.getWallet({ externalUserId: \"user-123\" });\n * const txHash = await chipiServer.transfer({ params: { ... } });\n * ```\n */\nexport class ChipiServerSDK extends ChipiSDK {\n constructor(config: ChipiServerSDKConfig) {\n if (!config.apiSecretKey) {\n throw new Error(\n \"apiSecretKey is required for ChipiServerSDK. Use ChipiBrowserSDK for client-side applications.\"\n );\n }\n\n super(config);\n }\n\n // All methods are inherited from ChipiSDK\n // The apiSecretKey from config is automatically used via resolveBearerToken()\n}\n","import type { ChipiBrowserSDKConfig } from \"@chipi-stack/types\";\nimport { ChipiSDK } from \"./chipi-sdk\";\n\n/**\n * Browser-side Chipi SDK for client-side applications\n *\n * This class is designed for browser environments (Vue, Svelte, Angular, vanilla JS, etc.)\n * where you need to pass a bearer token (JWT) with each authenticated request.\n *\n * All methods require a bearerToken parameter since browser environments should not\n * store API Secret Keys.\n *\n * ⚠️ SECURITY WARNING: DO NOT use your API Secret Key in browser environments!\n * The secret key should only be used server-side with ChipiServerSDK.\n *\n * @example\n * ```typescript\n * const chipiBrowser = new ChipiBrowserSDK({\n * apiPublicKey: \"pk_...\",\n * environment: \"production\"\n * });\n *\n * // Get user's JWT token from your auth system\n * const userToken = await getUserJWT();\n *\n * // Pass bearer token with each call\n * const wallet = await chipiBrowser.createWallet({\n * params: {\n * encryptKey: \"user-encryption-key\",\n * externalUserId: \"user-123\"\n * },\n * bearerToken: userToken\n * });\n *\n * const userWallet = await chipiBrowser.getWallet({ externalUserId: \"user-123\" }, userToken);\n * const txHash = await chipiBrowser.transfer({ params: {...}, bearerToken: userToken });\n * ```\n */\nexport class ChipiBrowserSDK extends ChipiSDK {\n constructor(config: ChipiBrowserSDKConfig) {\n super(config);\n }\n\n // All methods are inherited from ChipiSDK\n // bearerToken parameter is required for each authenticated request\n}\n","import type { PaymentRequirement, X402PaymentConfig } from \"@chipi-stack/types\";\nimport { CONTRACT_ADDRESSES, TOKEN_DECIMALS } from \"@chipi-stack/shared\";\nimport type { X402Facilitator } from \"./facilitator\";\n\nexport interface X402MiddlewareConfig {\n /** x402 facilitator instance for verify + settle */\n facilitator: X402Facilitator;\n /** Payment configuration for this endpoint */\n paymentConfig: X402PaymentConfig;\n /** Verify-only mode: verify payment but don't settle (default: false) */\n verifyOnly?: boolean;\n}\n\n/**\n * Flat convenience config — detected when `amount` + `recipient` are present.\n * Avoids nesting paymentConfig.\n */\nexport interface X402MiddlewareFlatConfig {\n /** x402 facilitator instance */\n facilitator: X402Facilitator;\n /** Amount in human-readable USDC (e.g. \"0.01\") */\n amount: string;\n /** Recipient (merchant) address */\n recipient: string;\n /** Human-readable description */\n description?: string;\n /** Verify-only mode (default: false) */\n verifyOnly?: boolean;\n}\n\n/**\n * Convert human-readable USDC amount to base units using string arithmetic (no float).\n */\nfunction amountToBaseUnits(amount: string, decimals: number): string {\n const [whole, frac = \"\"] = amount.split(\".\");\n const fracPadded = (frac + \"0\".repeat(decimals)).slice(0, decimals);\n return String(BigInt(whole + fracPadded));\n}\n\n/**\n * Build a PaymentRequirement from middleware config + request URL.\n */\nfunction buildPaymentRequirement(config: X402PaymentConfig, resource: string): PaymentRequirement {\n const amountBaseUnits = amountToBaseUnits(config.amount, TOKEN_DECIMALS.USDC);\n\n return {\n scheme: \"exact\",\n network: \"starknet-mainnet\",\n maxAmountRequired: amountBaseUnits,\n resource,\n description: config.description,\n payTo: config.payTo,\n maxTimeoutSeconds: 300,\n asset: CONTRACT_ADDRESSES.USDC_MAINNET,\n };\n}\n\nfunction isFlatConfig(\n config: X402MiddlewareConfig | X402MiddlewareFlatConfig\n): config is X402MiddlewareFlatConfig {\n return \"amount\" in config && \"recipient\" in config;\n}\n\nfunction resolveConfig(\n config: X402MiddlewareConfig | X402MiddlewareFlatConfig\n): X402MiddlewareConfig {\n if (isFlatConfig(config)) {\n return {\n facilitator: config.facilitator,\n paymentConfig: {\n amount: config.amount,\n payTo: config.recipient,\n description: config.description,\n },\n verifyOnly: config.verifyOnly,\n };\n }\n return config;\n}\n\n/**\n * Express-compatible middleware for monetizing API endpoints with x402.\n *\n * When no X-PAYMENT header is present, returns 402 with payment requirement.\n * When a valid payment is present, verifies and settles it, then calls next().\n * The settled transaction info is attached to `req.x402`.\n *\n * @example\n * ```typescript\n * // Nested config (original)\n * x402Middleware({\n * facilitator,\n * paymentConfig: { amount: \"0.01\", payTo: \"0xYOUR_ADDRESS\" },\n * })\n *\n * // Flat config (convenience)\n * x402Middleware({\n * facilitator,\n * amount: \"0.01\",\n * recipient: \"0xYOUR_ADDRESS\",\n * })\n * ```\n */\nexport function x402Middleware(config: X402MiddlewareConfig | X402MiddlewareFlatConfig) {\n const resolved = resolveConfig(config);\n return async (req: any, res: any, next: any) => {\n // Skip CORS preflight\n if (req.method === \"OPTIONS\") {\n return next();\n }\n\n const paymentHeader = req.headers?.[\"x-payment\"] ?? req.headers?.[\"X-PAYMENT\"];\n\n if (!paymentHeader) {\n // Return 402 with payment requirement\n const resource =\n req.protocol && req.get\n ? `${req.protocol}://${req.get(\"host\")}${req.originalUrl}`\n : (req.url ?? \"\");\n const requirement = buildPaymentRequirement(resolved.paymentConfig, resource);\n\n return res.status(402).set(\"Payment-Required\", JSON.stringify(requirement)).json({\n error: \"Payment Required\",\n paymentRequirement: requirement,\n });\n }\n\n // Parse payment\n let payment;\n try {\n payment = typeof paymentHeader === \"string\" ? JSON.parse(paymentHeader) : paymentHeader;\n } catch {\n return res.status(400).json({ error: \"Malformed X-PAYMENT header: invalid JSON\" });\n }\n\n // Validate payload shape before accessing fields\n const payload = payment?.payload;\n const toAddress = typeof payload?.toAddress === \"string\" ? payload.toAddress : null;\n const amount = typeof payload?.amount === \"string\" ? payload.amount : null;\n const asset = typeof payload?.asset === \"string\" ? payload.asset : null;\n\n if (!toAddress || !amount || !asset) {\n return res\n .status(400)\n .json({ error: \"Malformed X-PAYMENT payload: missing required fields\" });\n }\n\n // Enforce payment matches endpoint config (amount, recipient, asset)\n const requirement = buildPaymentRequirement(resolved.paymentConfig, \"\");\n const normalizeAddr = (a: string) => a.toLowerCase().replace(/^0x0+/, \"0x\");\n\n if (normalizeAddr(toAddress) !== normalizeAddr(resolved.paymentConfig.payTo)) {\n return res.status(402).json({\n error: \"Payment recipient mismatch\",\n reason: `Expected ${resolved.paymentConfig.payTo}, got ${toAddress}`,\n });\n }\n\n let paidAmount: bigint;\n try {\n paidAmount = BigInt(amount);\n } catch {\n return res\n .status(400)\n .json({ error: \"Malformed X-PAYMENT payload\", reason: \"amount must be an integer string\" });\n }\n\n if (paidAmount < BigInt(requirement.maxAmountRequired)) {\n return res.status(402).json({\n error: \"Payment amount insufficient\",\n reason: `Required ${requirement.maxAmountRequired} base units, got ${amount}`,\n });\n }\n\n if (normalizeAddr(asset) !== normalizeAddr(requirement.asset)) {\n return res.status(402).json({\n error: \"Payment asset mismatch\",\n reason: `Expected USDC, got ${asset}`,\n });\n }\n\n // Verify + Settle with error boundary\n try {\n const verified = await resolved.facilitator.verify(payment);\n if (!verified.isValid) {\n return res.status(402).json({\n error: \"Payment verification failed\",\n reason: verified.invalidReason,\n });\n }\n\n // Settle (unless verify-only mode)\n if (!resolved.verifyOnly) {\n const settled = await resolved.facilitator.settle(payment);\n if (!settled.success) {\n return res.status(402).json({\n error: \"Payment settlement failed\",\n reason: settled.errorReason,\n });\n }\n\n // Attach payment info to request\n req.x402 = {\n txHash: settled.transactionHash,\n payment,\n networkId: settled.networkId,\n };\n } else {\n req.x402 = { payment };\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return res.status(500).json({\n error: \"Payment processing error\",\n reason: message,\n });\n }\n\n next();\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/lib/encryption.ts","../src/wallets.ts","../src/paymaster-adapter.ts","../src/execute-paymaster-transaction.ts","../src/transactions.ts","../src/exchanges.ts","../src/sku-purchases.ts","../src/skus.ts","../src/sessions.ts","../src/x402/facilitator.ts","../src/sign-typed-data.ts","../src/chipi-sdk.ts","../src/chipi-server-sdk.ts","../src/chipi-browser-sdk.ts","../src/x402/middleware.ts"],"names":["isValidApiKey","ChipiAuthError","STARKNET_NETWORKS","API_VERSIONING","validateErrorResponse","ChipiApiError","handleApiError","CryptoES","WALLET_RPC_ENDPOINTS","RpcProvider","ec","WALLET_CLASS_HASHES","hash","Account","API_ENDPOINTS","typedData","num","ChipiTransactionError","CairoCustomEnum","CairoOption","CairoOptionVariant","CallData","getWalletTypeFromClassHash","apiMessage","ChipiSessionError","SESSION_ERRORS","STARKNET_CONTRACTS","formatAmount","Chain","SKU_CONTRACTS","cairo","CARRIER_IDS","SERVICE_TYPES","SESSION_DEFAULTS","SESSION_ENTRYPOINTS","CONTRACT_ADDRESSES","buildX402TypedData","starknetTypedData","uint256","TOKEN_DECIMALS","requirement"],"mappings":"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","file":"index.js","sourcesContent":["import type { ChipiSDKConfig } from \"@chipi-stack/types\";\nimport {\n isValidApiKey,\n handleApiError,\n validateErrorResponse,\n STARKNET_NETWORKS,\n API_VERSIONING,\n} from \"@chipi-stack/shared\";\nimport { ChipiAuthError, ChipiApiError } from \"@chipi-stack/shared\";\n\n/**\n * HTTP client for Chipi API interactions\n */\nexport class ChipiClient {\n private apiPublicKey: string;\n baseUrl: string;\n nodeUrl: string;\n private customAlphaUrl?: string;\n private sdkVersion: string;\n\n constructor(config: ChipiSDKConfig) {\n if (!isValidApiKey(config.apiPublicKey)) {\n throw new ChipiAuthError(\"Invalid API key format\");\n }\n\n this.apiPublicKey = config.apiPublicKey;\n this.customAlphaUrl = config.alphaUrl;\n this.baseUrl = this.getBaseUrl();\n this.nodeUrl = config.nodeUrl || STARKNET_NETWORKS.MAINNET;\n this.sdkVersion = \"14.0.0\";\n }\n\n /**\n * Get the API public key (for internal SDK use)\n */\n getApiPublicKey(): string {\n return this.apiPublicKey;\n }\n\n private getBaseUrl(): string {\n const version = `v${API_VERSIONING.VERSION}`;\n\n if (this.customAlphaUrl) {\n // Remove any existing version suffix and add the current one\n const cleanUrl = this.customAlphaUrl.replace(/\\/v\\d+\\/?$/, \"\").replace(/\\/$/, \"\");\n return `${cleanUrl}/${version}`;\n }\n\n return `https://api.chipipay.com/${version}`;\n }\n\n /**\n * Add API version query parameters to track the API version being used\n * This helps the backend handle versioning and track which SDK versions are in use\n */\n private addVersionParams(url: URL): void {\n url.searchParams.append(\"__chipi_api_version\", API_VERSIONING.VERSION_DATE);\n }\n\n private getHeaders(bearerToken?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiPublicKey,\n };\n\n if (bearerToken) {\n headers[\"Authorization\"] = `Bearer ${bearerToken}`;\n }\n\n return headers;\n }\n\n async get<T>({\n endpoint,\n params,\n bearerToken,\n }: {\n endpoint: string;\n params?: Record<string, any>;\n bearerToken?: string;\n }): Promise<T> {\n try {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n\n // Add version tracking parameters\n this.addVersionParams(url);\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value));\n }\n });\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: this.getHeaders(bearerToken),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const errorData = validateErrorResponse(data);\n throw new ChipiApiError(\n errorData.message,\n errorData.code || `HTTP_${response.status}`,\n response.status\n );\n }\n\n return data as T;\n } catch (error) {\n throw handleApiError(error);\n }\n }\n\n async post<T>({\n endpoint,\n bearerToken,\n body,\n }: {\n endpoint: string;\n bearerToken: string;\n body?: Record<string, any>;\n }): Promise<T> {\n try {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n\n // Add version tracking parameters\n this.addVersionParams(url);\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: this.getHeaders(bearerToken),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const errorData = validateErrorResponse(data);\n throw new ChipiApiError(\n errorData.message,\n errorData.code || `HTTP_${response.status}`,\n response.status\n );\n }\n return data as T;\n } catch (error) {\n throw handleApiError(error);\n }\n }\n\n async put<T>({\n endpoint,\n bearerToken,\n body,\n }: {\n endpoint: string;\n bearerToken: string;\n body?: Record<string, any>;\n }): Promise<T> {\n try {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n\n // Add version tracking parameters\n this.addVersionParams(url);\n\n const response = await fetch(url.toString(), {\n method: \"PUT\",\n headers: this.getHeaders(bearerToken),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const errorData = validateErrorResponse(data);\n throw new ChipiApiError(\n errorData.message,\n errorData.code || `HTTP_${response.status}`,\n response.status\n );\n }\n\n return data as T;\n } catch (error) {\n throw handleApiError(error);\n }\n }\n\n async patch<T>({\n endpoint,\n bearerToken,\n body,\n }: {\n endpoint: string;\n bearerToken: string;\n body?: Record<string, any>;\n }): Promise<T> {\n try {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n\n // Add version tracking parameters\n this.addVersionParams(url);\n\n const response = await fetch(url.toString(), {\n method: \"PATCH\",\n headers: this.getHeaders(bearerToken),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const errorData = validateErrorResponse(data);\n throw new ChipiApiError(\n errorData.message,\n errorData.code || `HTTP_${response.status}`,\n response.status\n );\n }\n\n return data as T;\n } catch (error) {\n throw handleApiError(error);\n }\n }\n\n async delete<T>({\n endpoint,\n bearerToken,\n }: {\n endpoint: string;\n bearerToken: string;\n }): Promise<T> {\n try {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n\n // Add version tracking parameters\n this.addVersionParams(url);\n\n const response = await fetch(url.toString(), {\n method: \"DELETE\",\n headers: this.getHeaders(bearerToken),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const errorData = validateErrorResponse(data);\n throw new ChipiApiError(\n errorData.message,\n errorData.code || `HTTP_${response.status}`,\n response.status\n );\n }\n\n return data as T;\n } catch (error) {\n throw handleApiError(error);\n }\n }\n}\n","import CryptoES from \"crypto-es\";\n\nexport const encryptPrivateKey = (privateKey: string, password: string): string => {\n if (!privateKey || !password) {\n throw new Error(\"Private key and password are required\");\n }\n\n return CryptoES.AES.encrypt(privateKey, password).toString();\n};\n\nexport const decryptPrivateKey = (encryptedPrivateKey: string, password: string): string => {\n if (!encryptedPrivateKey || !password) {\n throw new Error(\"Encrypted private key and password are required\");\n }\n\n try {\n const bytes = CryptoES.AES.decrypt(encryptedPrivateKey, password);\n const decrypted = bytes.toString(CryptoES.enc.Utf8);\n if (!decrypted) {\n throw new Error(\"Decryption resulted in empty string\");\n }\n return decrypted;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Decryption failed: ${error}`);\n }\n};\n","import type {\n CreateWalletParams,\n CreateWalletResponse,\n PrepareWalletCreationResponse,\n CreateCustodialWalletParams,\n GetWalletParams,\n WalletData,\n GetWalletResponse,\n GetTokenBalanceParams,\n GetTokenBalanceResponse,\n WalletType,\n DeploymentData,\n UpdateWalletEncryptionParams,\n UpdateWalletEncryptionResponse,\n PrepareWalletUpgradeParams,\n PrepareWalletUpgradeResponse,\n ExecuteWalletUpgradeParams,\n ExecuteWalletUpgradeResponse,\n} from \"@chipi-stack/types\";\nimport { API_ENDPOINTS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\nimport CryptoES from \"crypto-es\";\n\nimport { ChipiTransactionError, ChipiApiError } from \"@chipi-stack/shared\";\nimport {\n Account,\n CairoCustomEnum,\n CairoOption,\n CairoOptionVariant,\n CallData,\n ec,\n hash,\n num,\n RpcProvider,\n stark,\n} from \"starknet\";\nimport { encryptPrivateKey } from \"./encryption\";\n\n// Local DeploymentData type (replacing @avnu/gasless-sdk dependency)\n/**\n * Wallet management utilities\n */\nexport class ChipiWallets {\n constructor(private client: ChipiClient) {}\n\n async createWallet(\n params: CreateWalletParams & { bearerToken: string }\n ): Promise<CreateWalletResponse> {\n try {\n const {\n encryptKey,\n externalUserId,\n bearerToken,\n userId,\n walletType = \"CHIPI\", // Default to CHIPI wallet\n classHash: customClassHash,\n usePasskey,\n chain,\n } = params;\n\n if (!encryptKey) {\n if (usePasskey) {\n throw new Error(\n \"encryptKey is required when using passkey. The passkey authentication should have provided the encryptKey.\"\n );\n }\n throw new Error(\"encryptKey is required for wallet creation\");\n }\n\n // Select RPC endpoint based on wallet type\n const rpcUrl =\n walletType === \"READY\" ? WALLET_RPC_ENDPOINTS.READY : WALLET_RPC_ENDPOINTS.CHIPI;\n\n const provider = new RpcProvider({ nodeUrl: rpcUrl });\n\n // Generating the private key with Stark Curve\n const privateKeyAX = this.getPrivateKeyAX();\n const starkKeyPubAX = ec.starkCurve.getStarkKey(privateKeyAX);\n\n // Build constructor calldata based on wallet type\n const constructorCallData = this.buildConstructorCallData(walletType, starkKeyPubAX);\n\n // Select class hash: custom > wallet type lookup > CHIPI default\n const accountClassHash =\n customClassHash ??\n (walletType === \"READY\" ? WALLET_CLASS_HASHES.READY : WALLET_CLASS_HASHES.CHIPI);\n\n // Calculate future address of the account\n const publicKey = hash.calculateContractAddressFromHash(\n starkKeyPubAX,\n accountClassHash,\n constructorCallData,\n 0\n );\n\n // Initiating Account\n const account = new Account({ provider, address: publicKey, signer: privateKeyAX });\n\n const typedDataResponse = await this.client.post<PrepareWalletCreationResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-creation`,\n bearerToken,\n body: {\n chain,\n publicKey,\n walletType,\n starkKeyPubAX,\n ...(customClassHash && { classHash: customClassHash }),\n },\n });\n\n const { typedData, accountClassHash: accountClassHashResponse } = typedDataResponse;\n\n const userSignature = await account.signMessage(typedData);\n\n const deploymentData: DeploymentData = {\n class_hash: accountClassHashResponse,\n salt: starkKeyPubAX,\n unique: `${num.toHex(0)}`,\n calldata: constructorCallData.map((value) => num.toHex(value)),\n };\n\n const encryptedPrivateKey = encryptPrivateKey(privateKeyAX, encryptKey);\n\n // Dual-key wrapping: if encryptKeyBackup provided (PIN), encrypt a second copy\n const encryptedPrivateKeyBackup = params.encryptKeyBackup\n ? encryptPrivateKey(privateKeyAX, params.encryptKeyBackup)\n : undefined;\n\n // Call the API to save the wallet in dashboard\n const executeTransactionResponse = await this.client.post<CreateWalletResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}`,\n bearerToken,\n body: {\n externalUserId,\n userId,\n publicKey,\n walletType,\n chain,\n userSignature: {\n r: (userSignature as any).r.toString(),\n s: (userSignature as any).s.toString(),\n recovery: (userSignature as any).recovery,\n },\n typedData,\n encryptedPrivateKey,\n ...(encryptedPrivateKeyBackup && { encryptedPrivateKeyBackup }),\n ...(params.authMethod && { authMethod: params.authMethod }),\n ...(params.credentialId && { credentialId: params.credentialId }),\n ...(params.prfSupported != null && { prfSupported: params.prfSupported }),\n ...(params.deviceType && { deviceType: params.deviceType }),\n deploymentData: {\n ...deploymentData,\n salt: `${deploymentData.salt}`,\n calldata: deploymentData.calldata.map((data) => `${data}`),\n },\n },\n });\n\n return executeTransactionResponse;\n } catch (error: unknown) {\n console.error(\"Detailed error:\", error);\n\n if (error instanceof Error && error.message.includes(\"SSL\")) {\n throw new Error(\n \"SSL connection error. Try using NODE_TLS_REJECT_UNAUTHORIZED=0 or verify the RPC URL\"\n );\n }\n throw new ChipiTransactionError(\n `Failed to create wallet: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"WALLET_CREATION_FAILED\"\n );\n }\n }\n\n /**\n * Build constructor calldata based on wallet type\n * - CHIPI: Simple OpenZeppelin account with just public_key\n * - ARGENT: Argent X Account with owner/guardian structure\n */\n private buildConstructorCallData(walletType: WalletType, starkKeyPubAX: string): string[] {\n if (walletType === \"READY\") {\n // Argent X Account: owner (CairoCustomEnum) + guardian (CairoOption None)\n const axSigner = new CairoCustomEnum({\n Starknet: { pubkey: starkKeyPubAX },\n });\n const axGuardian = new CairoOption<unknown>(CairoOptionVariant.None);\n\n return CallData.compile({\n owner: axSigner,\n guardian: axGuardian,\n });\n }\n\n // ChipiWallet (default): Simple OpenZeppelin account with just public_key\n return CallData.compile({\n public_key: starkKeyPubAX,\n });\n }\n\n /**\n * Create a custodial merchant wallet\n */\n async createCustodialWallet({\n params,\n bearerToken,\n }: {\n params: Omit<CreateCustodialWalletParams, \"orgId\">;\n bearerToken: string;\n }): Promise<WalletData> {\n const response = await this.client.post<WalletData>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/custodial`,\n bearerToken,\n body: params,\n });\n\n return response!;\n }\n\n async getWallet(params: GetWalletParams, bearerToken: string): Promise<GetWalletResponse | null> {\n try {\n const { externalUserId } = params;\n const getWalletResponse = await this.client.get<GetWalletResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/by-user`,\n params: { externalUserId },\n bearerToken,\n });\n\n return getWalletResponse;\n } catch (err) {\n // Check if it's a 404 error (wallet not found)\n if (err instanceof ChipiApiError && err.status === 404) {\n return null;\n }\n throw err;\n }\n }\n\n /**\n * Recover passkey credential metadata for a wallet.\n * Used when localStorage is cleared — SDK recovers credentialId from backend.\n */\n async getCredentialRecovery(\n params: { externalUserId: string },\n bearerToken: string\n ): Promise<{\n credentialId: string | null;\n authMethod: string | null;\n prfSupported: boolean | null;\n deviceType: string | null;\n }> {\n return this.client.get({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/credential-recovery`,\n params: { externalUserId: params.externalUserId },\n bearerToken,\n });\n }\n\n async updateWalletEncryption(\n params: UpdateWalletEncryptionParams,\n bearerToken: string\n ): Promise<UpdateWalletEncryptionResponse> {\n const body: Record<string, string> = {\n externalUserId: params.externalUserId,\n newEncryptedPrivateKey: params.newEncryptedPrivateKey,\n };\n\n if (params.publicKey != null) {\n body.publicKey = params.publicKey;\n }\n\n return this.client.patch<UpdateWalletEncryptionResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/update-encryption-details`,\n bearerToken,\n body,\n });\n }\n\n getPrivateKeyAX = () => {\n // Generate 32 random bytes (256 bits)\n // const privateKeyBytes = Crypto.getRandomBytes(32); old implementation\n const privateKeyBytes = CryptoES.lib.WordArray.random(32);\n // Convert to hex string and ensure it's 64 characters (32 bytes)\n const privateKey = privateKeyBytes.toString(CryptoES.enc.Hex);\n\n // Add '0x' prefix\n const fullPrivateKey = `0x${privateKey}`;\n\n // Ensure the private key is within Starknet's valid range (0 to 2^251 - 1)\n // Convert to BigInt and take modulo 2^251\n const maxStarknetValue = BigInt(\n \"0x800000000000000000000000000000000000000000000000000000000000000\"\n );\n const privateKeyBigInt = BigInt(fullPrivateKey) % maxStarknetValue;\n\n // Convert back to hex string with '0x' prefix\n return `0x${privateKeyBigInt.toString(16)}`;\n };\n\n async getTokenBalance({\n params,\n bearerToken,\n }: {\n params: GetTokenBalanceParams;\n bearerToken: string;\n }): Promise<GetTokenBalanceResponse> {\n const getBalanceResponse = await this.client.get<GetTokenBalanceResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/token-balance`,\n params,\n bearerToken,\n });\n\n return getBalanceResponse;\n }\n\n /**\n * Prepare a wallet upgrade (e.g., READY → CHIPI or CHIPI v29 → v33).\n * Returns typed data that must be signed by the wallet owner.\n */\n async prepareWalletUpgrade(\n params: PrepareWalletUpgradeParams,\n bearerToken: string\n ): Promise<PrepareWalletUpgradeResponse> {\n return this.client.post<PrepareWalletUpgradeResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-upgrade`,\n bearerToken,\n body: params,\n });\n }\n\n /**\n * Execute a wallet upgrade after the owner has signed the typed data.\n */\n async executeWalletUpgrade(\n params: ExecuteWalletUpgradeParams,\n bearerToken: string\n ): Promise<ExecuteWalletUpgradeResponse> {\n return this.client.post<ExecuteWalletUpgradeResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/upgrade`,\n bearerToken,\n body: params,\n });\n }\n}\n","import type {\n PaymasterAdapter,\n PaymasterAccount,\n PrepareTypedDataResponse,\n ExecuteSponsoredTransactionResponse,\n WalletType,\n} from \"@chipi-stack/types\";\nimport type { Call, TypedData } from \"starknet\";\nimport { WALLET_CLASS_HASHES, getWalletTypeFromClassHash } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\n\n/**\n * Unwrap the /prepare-typed-data response.\n * Supports both current shape ({ typedData, walletType }) and legacy (raw TypedData).\n */\nfunction unwrapPrepareResponse(response: unknown): {\n typedData: TypedData;\n walletType?: WalletType;\n} {\n if (!response || typeof response !== \"object\") {\n throw new Error(\n \"Invalid response from /transactions/prepare-typed-data: response is not an object\"\n );\n }\n\n // Current shape: { typedData: TypedData, walletType: WalletType }\n if (\"typedData\" in response) {\n const resp = response as PrepareTypedDataResponse;\n if (\n !resp.typedData ||\n typeof resp.typedData !== \"object\" ||\n !(\"types\" in resp.typedData) ||\n !(\"message\" in resp.typedData)\n ) {\n throw new Error(\n \"Invalid response from /transactions/prepare-typed-data: typedData structure is invalid\"\n );\n }\n return { typedData: resp.typedData, walletType: resp.walletType };\n }\n\n // Legacy shape: the response itself is the TypedData\n if (\"types\" in response && \"message\" in response) {\n return { typedData: response as TypedData };\n }\n\n // Possibly an API error shape\n const apiMessage =\n typeof (response as any).message === \"string\" ? (response as any).message : undefined;\n\n throw new Error(\n apiMessage ?? \"Invalid response from /transactions/prepare-typed-data: typedData is missing\"\n );\n}\n\n/**\n * Normalize signature to { r: string, s: string } format.\n * Handles WeierstrassSignatureType ({r, s} as bigint) and ArraySignatureType ([r, s]).\n */\nexport function normalizeSignature(signature: unknown): { r: string; s: string } {\n // ArraySignatureType: string[]\n if (Array.isArray(signature)) {\n if (signature.length < 2) {\n throw new Error(`Array signature must have at least 2 elements, got ${signature.length}`);\n }\n const r = signature[0];\n const s = signature[1];\n if (r == null || s == null) {\n throw new Error(`Signature elements must not be null/undefined. Got r=${r}, s=${s}`);\n }\n return { r: String(r), s: String(s) };\n }\n\n // WeierstrassSignatureType: { r: bigint, s: bigint }\n if (signature && typeof signature === \"object\" && \"r\" in signature && \"s\" in signature) {\n const sig = signature as { r: unknown; s: unknown; recovery?: unknown };\n if (sig.r == null || sig.s == null) {\n throw new Error(`Object signature has null/undefined fields. Got r=${sig.r}, s=${sig.s}`);\n }\n return {\n r: String(sig.r),\n s: String(sig.s),\n };\n }\n\n throw new Error(\"Unrecognized signature format from account.signMessage()\");\n}\n\n/**\n * PaymasterAdapter implementation that uses Chipi's backend API for gasless transactions.\n *\n * Flow:\n * 1. Detect wallet type from on-chain class hash\n * 2. Call /transactions/prepare-typed-data to get TypedData\n * 3. Call account.signMessage(typedData) — triggers wallet popup for external wallets\n * 4. Call /transactions/execute-sponsored-transaction with signature\n * 5. Return transaction hash\n */\nexport class ChipiPaymasterAdapter implements PaymasterAdapter {\n private readonly client: ChipiClient;\n private readonly bearerToken: string;\n\n constructor(client: ChipiClient, bearerToken: string) {\n this.client = client;\n this.bearerToken = bearerToken;\n }\n\n async execute({ account, calls }: { account: PaymasterAccount; calls: Call[] }): Promise<string> {\n // 1. Detect wallet type from on-chain class hash\n const classHash = await account.getClassHashAt(account.address);\n const walletType = getWalletTypeFromClassHash(classHash);\n\n // Use mapped class hash for known types, on-chain hash for custom accounts.\n // The Rust paymaster auto-detects the interface version (V1/V2) from the class,\n // so custom SNIP-9 accounts work without an allowlist.\n const accountClassHash = walletType ? WALLET_CLASS_HASHES[walletType] : classHash;\n\n // 2. Prepare typed data via Chipi's backend\n const prepareResponse = await this.client.post<PrepareTypedDataResponse>({\n endpoint: \"/transactions/prepare-typed-data\",\n bearerToken: this.bearerToken,\n body: {\n publicKey: account.address,\n calls,\n accountClassHash,\n },\n });\n\n // 3. Unwrap response\n const { typedData, walletType: resolvedWalletType } = unwrapPrepareResponse(prepareResponse);\n\n // 4. Sign — triggers wallet popup for Argent X / Braavos\n const signature = await account.signMessage(typedData);\n\n // 5. Normalize signature format\n const normalizedSig = normalizeSignature(signature);\n\n // 6. Execute sponsored transaction\n const result = await this.client.post<ExecuteSponsoredTransactionResponse>({\n endpoint: \"/transactions/execute-sponsored-transaction\",\n bearerToken: this.bearerToken,\n body: {\n publicKey: account.address,\n typedData,\n userSignature: normalizedSig,\n walletType: resolvedWalletType ?? walletType,\n saveToDatabase: true,\n },\n });\n\n if (!result || typeof result !== \"object\") {\n throw new Error(\n \"Invalid response from /transactions/execute-sponsored-transaction: response is not an object\"\n );\n }\n\n const apiMessage =\n typeof (result as any).message === \"string\" ? (result as any).message : undefined;\n\n if (!result.transactionHash) {\n throw new Error(apiMessage ?? \"Response does not contain transaction hash\");\n }\n\n return result.transactionHash;\n }\n}\n","import type {\n ExecuteSponsoredTransactionResponse,\n WalletData,\n WalletType,\n SessionKeyData,\n PrepareTypedDataResponse,\n} from \"@chipi-stack/types\";\nimport type { Call } from \"starknet\";\nimport { Account, RpcProvider, TypedData, ec, typedData, num } from \"starknet\";\nimport { decryptPrivateKey } from \"./encryption\";\nimport {\n WALLET_CLASS_HASHES,\n WALLET_RPC_ENDPOINTS,\n SESSION_ERRORS,\n ChipiSessionError,\n} from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\nimport { normalizeSignature } from \"./paymaster-adapter\";\n\n// Extended WalletData with optional wallet type for transactions\n\n// Internal type - not exported to users\ninterface ExecutePaymasterTransactionParams {\n encryptKey?: string;\n wallet: WalletData;\n calls: Call[];\n saveToDatabase: boolean; // Internal only - always set by SDK, users cannot control this\n usePasskey?: boolean;\n}\n\n/**\n * Execute a paymaster transaction (gasless) via Chipi's paymaster\n * Supports both CHIPI and ARGENT wallet types\n */\nexport const executePaymasterTransaction = async ({\n params,\n bearerToken,\n client,\n}: {\n params: ExecutePaymasterTransactionParams;\n bearerToken: string;\n client: ChipiClient;\n}): Promise<string> => {\n try {\n const { encryptKey, wallet, calls, saveToDatabase, usePasskey } = params;\n\n // Validate encryptKey is provided\n if (!encryptKey) {\n throw new Error(\n usePasskey\n ? \"encryptKey is required when using passkey. The passkey authentication should have provided the encryptKey.\"\n : \"encryptKey is required for transaction execution\"\n );\n }\n\n const walletType = wallet.walletType ?? \"READY\";\n\n // For known types, use mapped RPC and class hash.\n // For custom types, fall back to default CHIPI RPC (all StarkNet accounts use the same RPC)\n // and use the wallet's classHash if available.\n const isKnownType =\n Object.prototype.hasOwnProperty.call(WALLET_RPC_ENDPOINTS, walletType) &&\n Object.prototype.hasOwnProperty.call(WALLET_CLASS_HASHES, walletType);\n\n const rpcUrl = isKnownType ? WALLET_RPC_ENDPOINTS[walletType] : WALLET_RPC_ENDPOINTS[\"CHIPI\"];\n const accountClassHash = isKnownType\n ? WALLET_CLASS_HASHES[walletType]\n : WALLET_CLASS_HASHES[\"CHIPI\"];\n\n // Decrypt the private key\n let privateKeyDecrypted: string;\n try {\n privateKeyDecrypted = decryptPrivateKey(wallet.encryptedPrivateKey, encryptKey);\n } catch {\n throw new Error(\"Failed to decrypt private key. Verify the encryptKey is correct.\");\n }\n\n const provider = new RpcProvider({ nodeUrl: rpcUrl });\n\n const account = new Account({\n provider,\n address: wallet.publicKey,\n signer: privateKeyDecrypted,\n });\n\n // Build the type data via Chipi's backend\n const prepareResponse = await client.post<PrepareTypedDataResponse>({\n endpoint: \"/transactions/prepare-typed-data\",\n bearerToken,\n body: {\n publicKey: wallet.publicKey,\n calls: calls,\n accountClassHash,\n },\n });\n\n // Validate response structure\n if (!prepareResponse || typeof prepareResponse !== \"object\") {\n throw new Error(\n \"Invalid response from /transactions/prepare-typed-data: response is not an object\"\n );\n }\n\n // Support both current and legacy API response shapes:\n // - Current: { typedData: TypedData, walletType: WalletType }\n // - Legacy: TypedData directly (domain/types/primaryType/message)\n let typedData: TypedData | undefined;\n let resolvedWalletType: WalletType | undefined;\n\n if (\"typedData\" in prepareResponse) {\n const resp = prepareResponse as PrepareTypedDataResponse;\n typedData = resp.typedData;\n // Only accept known wallet types from the backend\n if (\n resp.walletType &&\n Object.prototype.hasOwnProperty.call(WALLET_CLASS_HASHES, resp.walletType)\n ) {\n resolvedWalletType = resp.walletType;\n }\n } else if (prepareResponse && \"types\" in prepareResponse && \"message\" in prepareResponse) {\n // Legacy shape: the response itself is the TypedData\n typedData = prepareResponse as TypedData;\n } else {\n // Likely an API error shape like { message: string }\n const apiMessage =\n prepareResponse && typeof (prepareResponse as any).message === \"string\"\n ? (prepareResponse as any).message\n : undefined;\n\n throw new Error(\n apiMessage ??\n \"Invalid response from /transactions/prepare-typed-data: typedData is missing. \" +\n \"This may occur for older STARKNET wallets that don't support paymaster transactions. \" +\n \"Please ensure the wallet is a CHIPI wallet type.\"\n );\n }\n\n // Validate typedData structure before signing\n if (\n !typedData ||\n typeof typedData !== \"object\" ||\n !(\"types\" in typedData) ||\n !(\"message\" in typedData)\n ) {\n throw new Error(\n \"Invalid typedData received from backend: missing 'types' or 'message' field. \" +\n \"This may occur for older STARKNET wallets that don't support paymaster transactions.\"\n );\n }\n\n // Sign the message\n const userSignature = await account.signMessage(typedData);\n\n // Normalize signature format (handles both Weierstrass and Array types)\n const normalizedSig = normalizeSignature(userSignature);\n\n // Execute the sponsored transaction via Chipi's paymaster\n const result = await client.post<ExecuteSponsoredTransactionResponse>({\n endpoint: \"/transactions/execute-sponsored-transaction\",\n bearerToken,\n body: {\n publicKey: wallet.publicKey,\n typedData,\n userSignature: normalizedSig,\n saveToDatabase,\n walletType: resolvedWalletType ?? walletType,\n },\n });\n\n if (!result || typeof result !== \"object\") {\n throw new Error(\n \"Invalid response from /transactions/execute-sponsored-transaction: response is not an object\"\n );\n }\n\n const apiMessage =\n typeof (result as any).message === \"string\" ? (result as any).message : undefined;\n\n if (typeof result.transactionHash !== \"string\" || result.transactionHash.trim().length === 0) {\n throw new Error(apiMessage ?? \"Response does not contain transaction hash\");\n }\n\n return result.transactionHash;\n } catch (error) {\n console.error(\"Error sending transaction with paymaster\", error);\n throw error;\n }\n};\n\n// Internal type for session-based paymaster transactions\ninterface ExecutePaymasterTransactionWithSessionParams {\n encryptKey: string;\n wallet: WalletData;\n session: SessionKeyData;\n calls: Call[];\n saveToDatabase: boolean;\n}\n\n/**\n * Execute a paymaster transaction (gasless) using a session key.\n *\n * This function uses the 4-element session signature format:\n * [sessionPubKey, r, s, validUntil]\n *\n * The session key must be registered on the contract before use via\n * `addSessionKeyToContract()`.\n *\n * CHIPI wallets only - will throw if wallet type is not CHIPI.\n *\n * @internal\n */\nexport const executePaymasterTransactionWithSession = async ({\n params,\n bearerToken,\n client,\n}: {\n params: ExecutePaymasterTransactionWithSessionParams;\n bearerToken: string;\n client: ChipiClient;\n}): Promise<string> => {\n const { encryptKey, wallet, session, calls, saveToDatabase } = params;\n\n // Validate CHIPI wallet - session keys only work with CHIPI wallets\n if (wallet.walletType !== \"CHIPI\") {\n console.error(\"[ChipiSDK:Session:Execute] Invalid wallet type for session execution\", {\n provided: wallet.walletType,\n required: \"CHIPI\",\n expectedClassHash: WALLET_CLASS_HASHES.CHIPI,\n walletAddress: wallet.publicKey?.slice(0, 15) + \"...\",\n hint: \"Session keys only work with CHIPI wallets (SNIP-9 compatible)\",\n });\n throw new ChipiSessionError(\n `Session execution requires CHIPI wallet type. Got: \"${wallet.walletType || \"undefined\"}\"`,\n SESSION_ERRORS.INVALID_WALLET_TYPE_FOR_SESSION\n );\n }\n\n // Check if session has expired\n const nowSeconds = Math.floor(Date.now() / 1000);\n if (session.validUntil < nowSeconds) {\n console.error(\"[ChipiSDK:Session:Execute] Session has expired\", {\n sessionExpiry: new Date(session.validUntil * 1000).toISOString(),\n currentTime: new Date(nowSeconds * 1000).toISOString(),\n expiredAgo: `${nowSeconds - session.validUntil} seconds`,\n });\n throw new ChipiSessionError(\n `Session expired at ${new Date(session.validUntil * 1000).toISOString()}. ` +\n `Create a new session key.`,\n SESSION_ERRORS.SESSION_EXPIRED\n );\n }\n\n try {\n // console.log(\"[ChipiSDK:Session:Execute] Starting session transaction\", {\n // walletAddress: wallet.publicKey.slice(0, 15) + \"...\",\n // sessionPubKey: session.publicKey.slice(0, 15) + \"...\",\n // sessionExpiry: new Date(session.validUntil * 1000).toISOString(),\n // callCount: calls.length,\n // });\n\n // Decrypt the session private key\n let sessionPrivateKey: string;\n try {\n sessionPrivateKey = decryptPrivateKey(session.encryptedPrivateKey, encryptKey);\n } catch {\n console.error(\"[ChipiSDK:Session:Execute] Failed to decrypt session private key\", {\n sessionPubKey: session.publicKey?.slice(0, 15) + \"...\",\n hint: \"Ensure the encryptKey matches the one used when creating the session\",\n });\n throw new ChipiSessionError(\n \"Failed to decrypt session private key. Verify the encryptKey is correct.\",\n SESSION_ERRORS.SESSION_DECRYPTION_FAILED\n );\n }\n\n // Verify the session private key matches the public key\n const derivedPubKey = ec.starkCurve.getStarkKey(sessionPrivateKey);\n if (derivedPubKey.toLowerCase() !== session.publicKey.toLowerCase()) {\n console.error(\"[ChipiSDK:Session:Execute] Session key mismatch\", {\n expected: session.publicKey.slice(0, 15) + \"...\",\n derived: derivedPubKey.slice(0, 15) + \"...\",\n hint: \"The encrypted private key does not match the stored public key\",\n });\n throw new ChipiSessionError(\n \"Session key mismatch: decrypted private key does not match the public key\",\n SESSION_ERRORS.SESSION_DECRYPTION_FAILED\n );\n }\n\n const accountClassHash = WALLET_CLASS_HASHES.CHIPI;\n\n // Build the type data via Chipi's backend\n const prepareResponse = await client.post<PrepareTypedDataResponse>({\n endpoint: \"/transactions/prepare-typed-data\",\n bearerToken,\n body: {\n publicKey: wallet.publicKey,\n calls: calls,\n accountClassHash,\n walletType: \"CHIPI\",\n },\n });\n\n // Unwrap the response — backend returns { typedData, walletType } for CHIPI wallets\n if (!prepareResponse || typeof prepareResponse !== \"object\") {\n throw new ChipiSessionError(\n \"Invalid response from /transactions/prepare-typed-data: response is not an object\",\n SESSION_ERRORS.SESSION_INVALID_RESPONSE\n );\n }\n\n let sessionTypedData: TypedData;\n if (\"typedData\" in prepareResponse && (prepareResponse as PrepareTypedDataResponse).typedData) {\n const candidate = (prepareResponse as PrepareTypedDataResponse).typedData;\n if (\n !candidate ||\n typeof candidate !== \"object\" ||\n !(\"types\" in candidate) ||\n !(\"message\" in candidate)\n ) {\n throw new ChipiSessionError(\n \"Invalid response from /transactions/prepare-typed-data: typedData structure is invalid\",\n SESSION_ERRORS.SESSION_INVALID_RESPONSE\n );\n }\n sessionTypedData = candidate;\n } else if (\"types\" in prepareResponse && \"message\" in prepareResponse) {\n sessionTypedData = prepareResponse as unknown as TypedData;\n } else {\n throw new ChipiSessionError(\n \"Invalid response from /transactions/prepare-typed-data: typedData is missing\",\n SESSION_ERRORS.SESSION_INVALID_RESPONSE\n );\n }\n\n // Compute the message hash from typed data\n const msgHash = typedData.getMessageHash(sessionTypedData, wallet.publicKey);\n\n // Sign with session private key using ECDSA\n const { r, s } = ec.starkCurve.sign(msgHash, sessionPrivateKey);\n\n // Build 4-element session signature: [sessionPubKey, r, s, validUntil]\n const sessionSignature = [\n session.publicKey,\n num.toHex(r),\n num.toHex(s),\n num.toHex(session.validUntil),\n ];\n\n // Execute the sponsored transaction via Chipi's paymaster\n const result = await client.post<ExecuteSponsoredTransactionResponse>({\n endpoint: \"/transactions/execute-sponsored-transaction\",\n bearerToken,\n body: {\n publicKey: wallet.publicKey,\n typedData: sessionTypedData,\n // Session signature format - array of 4 hex strings\n userSignature: sessionSignature,\n saveToDatabase: saveToDatabase,\n walletType: \"CHIPI\",\n isSessionSignature: true, // Flag to indicate session signature format\n },\n });\n\n if (!result || typeof result !== \"object\") {\n throw new ChipiSessionError(\n \"Invalid response from /transactions/execute-sponsored-transaction: response is not an object\",\n SESSION_ERRORS.SESSION_INVALID_RESPONSE\n );\n }\n\n if (typeof result.transactionHash !== \"string\" || result.transactionHash.trim().length === 0) {\n const apiMessage =\n typeof (result as any).message === \"string\" ? (result as any).message : undefined;\n console.error(\"[ChipiSDK:Session:Execute] No transaction hash in response\", {\n result,\n });\n throw new ChipiSessionError(\n apiMessage ?? \"Response does not contain transaction hash\",\n SESSION_ERRORS.SESSION_INVALID_RESPONSE\n );\n }\n\n return result.transactionHash;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Re-throw ChipiSessionError as-is\n if (error instanceof ChipiSessionError) {\n throw error;\n }\n\n console.error(\"[ChipiSDK:Session:Execute] Unexpected error\", {\n error: err.message,\n walletAddress: wallet.publicKey?.slice(0, 15) + \"...\",\n sessionPubKey: session.publicKey?.slice(0, 15) + \"...\",\n });\n throw error;\n }\n};\n","import {\n CallAnyContractParams,\n STARKNET_CONTRACTS,\n WalletData,\n type ExecuteTransactionParams,\n type RecordSendTransactionParams,\n type Transaction,\n type TransferParams,\n type GetTransactionListQuery,\n type PaginatedResponse,\n type TransactionStatusResponse,\n type SyncOnChainTransfersParams,\n type SyncOnChainTransfersResponse,\n} from \"@chipi-stack/types\";\nimport { API_ENDPOINTS, formatAmount } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\nimport { executePaymasterTransaction } from \"./execute-paymaster-transaction\";\n\n/**\n * Transaction management utilities\n */\nexport class ChipiTransactions {\n constructor(private client: ChipiClient) {}\n /**\n * Execute a gasless transaction using paymaster\n * @internal saveToDatabase - Internal only, not exposed to clients\n */\n async executeTransaction({\n params,\n bearerToken,\n saveToDatabase = true, // Internal only - defaults to true, can be overridden internally\n }: {\n params: ExecuteTransactionParams;\n bearerToken: string;\n saveToDatabase?: boolean; // Internal only - not part of public API\n }): Promise<string> {\n return executePaymasterTransaction({\n params: {\n ...params,\n saveToDatabase,\n },\n bearerToken,\n client: this.client,\n });\n }\n\n /**\n * Transfer tokens\n */\n async transfer({\n params,\n bearerToken,\n }: {\n params: TransferParams;\n bearerToken: string;\n }): Promise<string> {\n const { encryptKey, wallet, token, otherToken, recipient, amount } = params;\n const contract = STARKNET_CONTRACTS[token];\n let contractAddress = contract.contractAddress;\n let decimals = contract.decimals;\n if (token === \"OTHER\") {\n if (!otherToken) {\n throw new Error(\"Other token is required when token is OTHER\");\n }\n contractAddress = otherToken.contractAddress;\n decimals = otherToken.decimals;\n }\n const formattedAmount = formatAmount(amount, decimals);\n return this.executeTransaction({\n params: {\n encryptKey,\n wallet,\n calls: [\n {\n contractAddress,\n entrypoint: \"transfer\",\n calldata: [recipient, formattedAmount, \"0x0\"],\n },\n ],\n },\n bearerToken,\n });\n }\n\n /**\n * Approve token spending\n */\n async approve(params: {\n encryptKey: string;\n wallet: WalletData;\n contractAddress: string;\n spender: string;\n amount: string;\n decimals?: number;\n bearerToken: string;\n }): Promise<string> {\n const formattedAmount = formatAmount(params.amount, params.decimals);\n\n return this.executeTransaction({\n params: {\n encryptKey: params.encryptKey,\n wallet: params.wallet,\n calls: [\n {\n contractAddress: params.contractAddress,\n entrypoint: \"approve\",\n calldata: [params.spender, formattedAmount, \"0x0\"],\n },\n ],\n },\n bearerToken: params.bearerToken,\n });\n }\n\n /**\n * Call any contract method\n */\n // {\n // encryptKey: string;\n // wallet: any;\n // calls: any[];\n // bearerToken: string;\n // }\n\n async callAnyContract({\n params,\n bearerToken,\n }: {\n params: CallAnyContractParams;\n bearerToken: string;\n }): Promise<string> {\n return this.executeTransaction({\n params,\n bearerToken,\n });\n }\n\n /**\n * Record a send transaction\n */\n async recordSendTransaction({\n params,\n bearerToken,\n }: {\n params: RecordSendTransactionParams;\n bearerToken: string;\n }): Promise<Transaction> {\n const response = await this.client.post<Transaction>({\n endpoint: `${API_ENDPOINTS.TRANSACTIONS}/record-send`,\n bearerToken,\n body: params,\n });\n return response;\n }\n\n /**\n * Get paginated transaction history\n */\n async getTransactionList(\n query: GetTransactionListQuery,\n bearerToken: string\n ): Promise<PaginatedResponse<Transaction>> {\n const response = await this.client.get<PaginatedResponse<Transaction>>({\n endpoint: `${API_ENDPOINTS.TRANSACTIONS}/transaction-list`,\n params: query,\n bearerToken,\n });\n return response;\n }\n\n /**\n * Get a single transaction by hash or internal ID\n */\n async getTransaction(hashOrId: string, bearerToken: string): Promise<Transaction> {\n return this.client.get<Transaction>({\n endpoint: `${API_ENDPOINTS.TRANSACTIONS}/${hashOrId}`,\n bearerToken,\n });\n }\n\n /**\n * Get on-chain transaction status\n */\n async getTransactionStatus(hash: string, bearerToken: string): Promise<TransactionStatusResponse> {\n return this.client.get<TransactionStatusResponse>({\n endpoint: `${API_ENDPOINTS.TRANSACTIONS}/${hash}/status`,\n bearerToken,\n });\n }\n\n /**\n * Sync on-chain transfers from Voyager into the DB (read-through cache).\n * Discovers transactions not made through the SDK (e.g., external USDC receives).\n * After sync, getTransactionList returns the newly discovered transactions.\n */\n async syncOnChainTransfers(\n params: SyncOnChainTransfersParams,\n bearerToken: string,\n ): Promise<SyncOnChainTransfersResponse> {\n return this.client.post<SyncOnChainTransfersResponse>({\n endpoint: `${API_ENDPOINTS.TRANSACTIONS}/sync-on-chain`,\n bearerToken,\n body: params,\n });\n }\n}\n","import { Currency } from \"@chipi-stack/types\";\nimport { ChipiClient } from \"./client\";\nimport { API_ENDPOINTS } from \"@chipi-stack/shared\";\n\nexport class ChipiExchanges {\n constructor(private client: ChipiClient) {}\n\n async getUsdAmount(\n currencyAmount: number,\n currency: Currency,\n bearerToken: string\n ): Promise<number> {\n return this.client.get<number>({\n endpoint: `${API_ENDPOINTS.EXCHANGES}/usd-amount`,\n bearerToken,\n params: { currencyAmount, currency },\n });\n }\n}\n","import {\n CreateSkuPurchaseParams,\n Transaction,\n STARKNET_CONTRACTS,\n Chain,\n ChainToken,\n CreateSkuPurchaseBody,\n} from \"@chipi-stack/types\";\nimport { ChipiClient } from \"./client\";\nimport { ChipiTransactions } from \"./transactions\";\n\nimport {\n CARRIER_IDS,\n CHAIN_TOKEN_TYPES,\n CHAIN_TYPES,\n SERVICE_TYPES,\n SKU_CONTRACTS,\n formatAmount,\n} from \"@chipi-stack/shared\";\nimport { Call, CallData, cairo, hash } from \"starknet\";\nimport { API_ENDPOINTS } from \"@chipi-stack/shared\";\nimport CryptoES from \"crypto-es\";\nimport { ChipiExchanges } from \"./exchanges\";\n\nexport class ChipiSkuPurchases {\n private transactions: ChipiTransactions;\n private exchanges: ChipiExchanges;\n\n constructor(private client: ChipiClient) {\n this.transactions = new ChipiTransactions(client);\n this.exchanges = new ChipiExchanges(client);\n }\n\n /**\n * Purchase a SKU with gasless execution\n * @param params - Purchase parameters including transaction hash, SKU ID, wallet, etc.\n * @param bearerToken - Authentication token for API calls\n * @returns Promise<SkuPurchaseResponse> - The purchase response with transaction details\n */\n async purchaseSku(params: CreateSkuPurchaseParams, bearerToken: string): Promise<Transaction> {\n const { skuId, skuReference, currencyAmount, currency, chain, token, encryptKey, wallet } =\n params;\n\n if (chain !== Chain.STARKNET) {\n throw new Error(`Unsupported chain for SKU purchases: ${chain}`);\n }\n\n const tokenConfig = STARKNET_CONTRACTS[token];\n if (!tokenConfig?.contractAddress) {\n throw new Error(`Unsupported token for Starknet SKU purchases: ${token}`);\n }\n\n const usdAmount = await this.exchanges.getUsdAmount(currencyAmount, currency, bearerToken);\n const tokenAddress = tokenConfig.contractAddress as `0x${string}`;\n\n if (!Number.isFinite(usdAmount) || usdAmount <= 0) {\n throw new Error(`Invalid USD amount: ${usdAmount}. Amount must be positive.`);\n }\n\n const minUsdAmount = Math.max(usdAmount, 0.000001);\n const parsedAmount = formatAmount(minUsdAmount.toString(), tokenConfig.decimals);\n\n const calls: Call[] = [\n {\n contractAddress: tokenAddress,\n entrypoint: \"approve\",\n calldata: CallData.compile({\n spender: SKU_CONTRACTS.RECHARGER_WITH_STRK_MAINNET,\n amount: cairo.uint256(parsedAmount),\n }),\n },\n {\n contractAddress: SKU_CONTRACTS.RECHARGER_WITH_STRK_MAINNET,\n entrypoint: \"process_recharge\",\n calldata: CallData.compile({\n token: tokenAddress,\n amount: cairo.uint256(parsedAmount),\n recharge_id: CryptoES.SHA256(\n CryptoES.lib.WordArray.random(32) // 32 bytes = 256 bits entropy\n )\n .toString()\n .slice(0, 20),\n product_code: skuId,\n merchant_slug: CARRIER_IDS.CHIPI_PAY,\n }),\n },\n {\n contractAddress: SKU_CONTRACTS.CHIPI_BILL_SERVICE,\n entrypoint: \"mint_item\",\n calldata: CallData.compile({\n recipient: wallet.publicKey,\n metadata: {\n service_type: SERVICE_TYPES.BUY_SERVICE,\n timestamp: Date.now(),\n chipi_user_id: hash.starknetKeccak(wallet.publicKey || \"0x0\").toString(),\n kyc: true,\n amount: cairo.uint256(parsedAmount),\n },\n }),\n },\n ];\n\n const txHash = await this.transactions.executeTransaction({\n params: {\n encryptKey: encryptKey,\n wallet: wallet,\n calls: calls,\n },\n bearerToken: bearerToken,\n saveToDatabase: false,\n });\n\n const body: CreateSkuPurchaseBody = {\n transactionHash: txHash,\n walletAddress: wallet.publicKey,\n skuId: skuId,\n skuReference: skuReference,\n chain: chain,\n token: token,\n currencyAmount: currencyAmount,\n };\n\n // Record the SKU purchase and fetch the purchase result\n const response = await this.client.post<Transaction>({\n endpoint: `${API_ENDPOINTS.SKU_PURCHASES}`,\n bearerToken,\n body,\n });\n\n return response;\n }\n\n /**\n * Get a SKU purchase by id\n * @param id - The SKU purchase id\n * @param bearerToken - Authentication token for API calls\n * @returns Promise<SkuPurchaseResponse> - Single SKU purchase\n */\n async getSkuPurchase(id: string, bearerToken: string): Promise<Transaction> {\n const response = await this.client.get<Transaction>({\n endpoint: `${API_ENDPOINTS.SKU_PURCHASES}/${id}`,\n bearerToken,\n });\n return response;\n }\n}\n","import type { PaginatedResponse, Sku, GetSkuListQuery } from \"@chipi-stack/types\";\nimport { API_ENDPOINTS } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\n\n/**\n * SKU (Stock Keeping Unit) management utilities\n */\nexport class ChipiSkus {\n constructor(private client: ChipiClient) {}\n /**\n * Get available SKUs for purchase with pagination\n * @param bearerToken - Authentication token for API calls\n * @param query - Pagination query parameters\n * @returns Promise<PaginatedResponse<Sku>> - Paginated list of available SKUs\n */\n async getSkuList(params: GetSkuListQuery, bearerToken: string): Promise<PaginatedResponse<Sku>> {\n const response = await this.client.get<PaginatedResponse<Sku>>({\n endpoint: `${API_ENDPOINTS.SKUS}`,\n params,\n bearerToken,\n });\n\n return response;\n }\n\n /**\n * Get a single SKU by ID\n * @param bearerToken - Authentication token for API calls\n * @param id - SKU ID\n * @returns Promise<Sku> - Single SKU\n */\n async getSku(id: string, bearerToken: string): Promise<Sku> {\n return this.client.get<Sku>({\n endpoint: `${API_ENDPOINTS.SKUS}/${id}`,\n bearerToken,\n });\n }\n}\n","import type {\n SessionKeyData,\n CreateSessionKeyParams,\n AddSessionKeyParams,\n RevokeSessionKeyParams,\n GetSessionDataParams,\n SessionDataResponse,\n WalletType,\n ExecuteWithSessionParams,\n SetSpendingPolicyParams,\n GetSpendingPolicyParams,\n RemoveSpendingPolicyParams,\n SpendingPolicyData,\n} from \"@chipi-stack/types\";\nimport { ec, RpcProvider, num } from \"starknet\";\nimport { encryptPrivateKey } from \"./encryption\";\nimport { ChipiClient } from \"./client\";\nimport {\n WALLET_CLASS_HASHES,\n WALLET_RPC_ENDPOINTS,\n SESSION_DEFAULTS,\n SESSION_ERRORS,\n SESSION_ENTRYPOINTS,\n ChipiSessionError,\n} from \"@chipi-stack/shared\";\nimport {\n executePaymasterTransaction,\n executePaymasterTransactionWithSession,\n} from \"./execute-paymaster-transaction\";\n\n/**\n * Session key management for CHIPI wallets (SNIP-9 compatible).\n *\n * Session keys enable temporary, delegated access to execute transactions\n * without requiring the owner's private key for each operation.\n *\n * @see https://github.com/chipi-pay/sessions-smart-contract\n */\nexport class ChipiSessions {\n constructor(private client: ChipiClient) {}\n\n /**\n * Validate that the wallet is a CHIPI wallet (required for session operations).\n * Throws ChipiSessionError if wallet type is not CHIPI.\n */\n private validateChipiWallet(\n walletType: WalletType | undefined,\n operation: string,\n walletPublicKey?: string\n ): void {\n if (walletType !== \"CHIPI\") {\n console.error(`[ChipiSDK:Session:${operation}] Invalid wallet type`, {\n provided: walletType,\n required: \"CHIPI\",\n expectedClassHash: WALLET_CLASS_HASHES[\"CHIPI\"],\n walletAddress: walletPublicKey ? walletPublicKey.slice(0, 15) + \"...\" : \"(not provided)\",\n hint: \"Session keys only work with CHIPI wallets (SNIP-9 compatible)\",\n });\n throw new ChipiSessionError(\n `Session keys require CHIPI wallet type. Got: \"${walletType || \"undefined\"}\". ` +\n `Session keys are only supported for CHIPI wallets with class hash ${WALLET_CLASS_HASHES[\"CHIPI\"]}`,\n SESSION_ERRORS.INVALID_WALLET_TYPE_FOR_SESSION\n );\n }\n }\n\n /**\n * Convert a Uint8Array to hex string with 0x prefix.\n */\n private toHex(uint8: Uint8Array): string {\n return (\n \"0x\" +\n Array.from(uint8)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")\n );\n }\n\n /**\n * Generate a new session keypair locally.\n *\n * This method generates the session keys but does NOT register them on-chain.\n * The returned SessionKeyData should be stored by the developer externally\n * (e.g., in Clerk metadata, database, etc.) - the SDK does NOT persist this.\n *\n * After generating, call `addSessionKeyToContract()` to register the session on-chain.\n *\n * @param params - Session creation parameters\n * @returns SessionKeyData for external storage\n *\n * @example\n * ```typescript\n * const session = sdk.sessions.createSessionKey({\n * encryptKey: userEncryptKey,\n * durationSeconds: 21600 // 6 hours\n * });\n * // Store session externally (e.g., in Clerk metadata)\n * await saveToClerk(session);\n * ```\n */\n createSessionKey(params: CreateSessionKeyParams): SessionKeyData {\n const { encryptKey, durationSeconds = SESSION_DEFAULTS.DURATION_SECONDS } = params;\n\n if (\n typeof durationSeconds !== \"number\" ||\n !Number.isFinite(durationSeconds) ||\n !Number.isInteger(durationSeconds) ||\n durationSeconds <= 0\n ) {\n throw new ChipiSessionError(\n `Invalid session duration: ${durationSeconds}. Must be a positive integer.`,\n SESSION_ERRORS.SESSION_CREATION_FAILED\n );\n }\n\n try {\n // Generate Stark curve private key\n const rawPrivateKey = ec.starkCurve.utils.randomPrivateKey();\n const privateKeyHex = this.toHex(rawPrivateKey);\n\n // Derive public key\n const publicKey = ec.starkCurve.getStarkKey(privateKeyHex);\n\n // Calculate expiration timestamp\n const validUntil = Math.floor(Date.now() / 1000) + durationSeconds;\n\n // Encrypt the private key for storage\n const encryptedPrivateKey = encryptPrivateKey(privateKeyHex, encryptKey);\n\n // console.log(\"[ChipiSDK:Session:Create] Session key generated\", {\n // publicKey: publicKey.slice(0, 15) + \"...\",\n // validUntil: new Date(validUntil * 1000).toISOString(),\n // durationSeconds,\n // });\n\n return {\n publicKey,\n encryptedPrivateKey,\n validUntil,\n };\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error(\"[ChipiSDK:Session:Create] Failed to generate session key\", {\n error: err.message,\n durationRequested: durationSeconds,\n });\n throw new ChipiSessionError(\n `Failed to create session key: ${err.message}`,\n SESSION_ERRORS.SESSION_CREATION_FAILED\n );\n }\n }\n\n /**\n * Register a session key on the smart contract.\n *\n * This executes a sponsored transaction (using owner signature) to call\n * `add_or_update_session_key` on the CHIPI wallet contract.\n *\n * The session must be registered before it can be used for transactions.\n *\n * @param params - Session registration parameters\n * @param bearerToken - Authentication token\n * @returns Transaction hash\n *\n * @example\n * ```typescript\n * const txHash = await sdk.sessions.addSessionKeyToContract({\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * sessionConfig: {\n * sessionPublicKey: session.publicKey,\n * validUntil: session.validUntil,\n * maxCalls: 1000,\n * allowedEntrypoints: [] // empty = all allowed\n * }\n * }, bearerToken);\n * ```\n */\n async addSessionKeyToContract(params: AddSessionKeyParams, bearerToken: string): Promise<string> {\n const { encryptKey, wallet, sessionConfig } = params;\n\n // Validate CHIPI wallet\n this.validateChipiWallet(wallet.walletType, \"AddToContract\", wallet.publicKey);\n\n try {\n console.log(\"[ChipiSDK:Session:AddToContract] Registering session on-chain\", {\n walletAddress: wallet.publicKey.slice(0, 15) + \"...\",\n sessionPubKey: sessionConfig.sessionPublicKey.slice(0, 15) + \"...\",\n validUntil: new Date(sessionConfig.validUntil * 1000).toISOString(),\n maxCalls: sessionConfig.maxCalls,\n allowedEntrypoints: sessionConfig.allowedEntrypoints.length,\n });\n\n // Build calldata for add_or_update_session_key\n // Cairo signature: add_or_update_session_key(session_key, valid_until, max_calls, allowed_entrypoints)\n const calldata = [\n sessionConfig.sessionPublicKey,\n num.toHex(sessionConfig.validUntil),\n num.toHex(sessionConfig.maxCalls),\n // Array: first element is length, then elements\n num.toHex(sessionConfig.allowedEntrypoints.length),\n ...sessionConfig.allowedEntrypoints,\n ];\n\n // Execute via paymaster (owner signature)\n const txHash = await executePaymasterTransaction({\n params: {\n encryptKey,\n wallet: { ...wallet, walletType: \"CHIPI\" },\n calls: [\n {\n contractAddress: wallet.publicKey,\n entrypoint: SESSION_ENTRYPOINTS.ADD_OR_UPDATE,\n calldata,\n },\n ],\n saveToDatabase: false, // Don't record session management txs\n },\n bearerToken,\n client: this.client,\n });\n\n console.log(\"[ChipiSDK:Session:AddToContract] Session registered successfully\", {\n txHash,\n sessionPubKey: sessionConfig.sessionPublicKey.slice(0, 15) + \"...\",\n });\n\n return txHash;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error(\"[ChipiSDK:Session:AddToContract] Registration failed\", {\n error: err.message,\n walletAddress: wallet.publicKey?.slice(0, 15) + \"...\",\n sessionPubKey: sessionConfig.sessionPublicKey?.slice(0, 15) + \"...\",\n validUntil: new Date(sessionConfig.validUntil * 1000).toISOString(),\n maxCalls: sessionConfig.maxCalls,\n });\n throw error;\n }\n }\n\n /**\n * Revoke a session key from the smart contract.\n *\n * This executes a sponsored transaction (using owner signature) to call\n * `revoke_session_key` on the CHIPI wallet contract.\n *\n * After revocation, the session key can no longer be used for transactions.\n *\n * @param params - Session revocation parameters\n * @param bearerToken - Authentication token\n * @returns Transaction hash\n *\n * @example\n * ```typescript\n * const txHash = await sdk.sessions.revokeSessionKey({\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * sessionPublicKey: session.publicKey\n * }, bearerToken);\n * ```\n */\n async revokeSessionKey(params: RevokeSessionKeyParams, bearerToken: string): Promise<string> {\n const { encryptKey, wallet, sessionPublicKey } = params;\n\n // Validate CHIPI wallet\n this.validateChipiWallet(wallet.walletType, \"Revoke\", wallet.publicKey);\n\n try {\n console.log(\"[ChipiSDK:Session:Revoke] Revoking session from contract\", {\n walletAddress: wallet.publicKey.slice(0, 15) + \"...\",\n sessionToRevoke: sessionPublicKey.slice(0, 15) + \"...\",\n });\n\n // Execute via paymaster (owner signature)\n const txHash = await executePaymasterTransaction({\n params: {\n encryptKey,\n wallet: { ...wallet, walletType: \"CHIPI\" },\n calls: [\n {\n contractAddress: wallet.publicKey,\n entrypoint: SESSION_ENTRYPOINTS.REVOKE,\n calldata: [sessionPublicKey],\n },\n ],\n saveToDatabase: false, // Don't record session management txs\n },\n bearerToken,\n client: this.client,\n });\n\n console.log(\"[ChipiSDK:Session:Revoke] Session revoked successfully\", {\n txHash,\n sessionRevoked: sessionPublicKey.slice(0, 15) + \"...\",\n });\n\n return txHash;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error(\"[ChipiSDK:Session:Revoke] Revocation failed\", {\n error: err.message,\n walletAddress: wallet.publicKey?.slice(0, 15) + \"...\",\n sessionToRevoke: sessionPublicKey?.slice(0, 15) + \"...\",\n });\n throw error;\n }\n }\n\n /**\n * Query session data from the smart contract.\n *\n * This is a read-only call that does not require signing or gas.\n *\n * @param params - Query parameters\n * @returns Session data including status, remaining calls, and allowed entrypoints\n *\n * @example\n * ```typescript\n * const sessionData = await sdk.sessions.getSessionData({\n * walletAddress: userWallet.publicKey,\n * sessionPublicKey: session.publicKey\n * });\n * if (sessionData.isActive) {\n * console.log(`Session has ${sessionData.remainingCalls} calls remaining`);\n * }\n * ```\n *\n * NOTE: This method intentionally does NOT validate walletType because:\n * 1. It's a read-only query - no state change or risk\n * 2. Non-CHIPI wallets will simply return isActive=false (graceful failure)\n * 3. It doesn't require walletType parameter at all - only walletAddress\n * Adding validation would require changing the interface for no functional benefit.\n */\n async getSessionData(params: GetSessionDataParams): Promise<SessionDataResponse> {\n const { walletAddress, sessionPublicKey } = params;\n\n try {\n const provider = new RpcProvider({\n nodeUrl: WALLET_RPC_ENDPOINTS[\"CHIPI\"],\n });\n\n console.log(\"[ChipiSDK:Session:GetData] Querying session data\", {\n walletAddress: walletAddress.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey.slice(0, 15) + \"...\",\n });\n\n const result = await provider.callContract({\n contractAddress: walletAddress,\n entrypoint: SESSION_ENTRYPOINTS.GET_DATA,\n calldata: [sessionPublicKey],\n });\n\n // Parse the response\n // Expected format: [is_active, valid_until, remaining_calls, allowed_entrypoints_len, ...allowed_entrypoints]\n const resultArray = Array.isArray(result)\n ? result\n : (result as { result?: string[] }).result || [];\n\n if (resultArray.length < 4) {\n console.warn(\"[ChipiSDK:Session:GetData] Unexpected response format\", {\n resultLength: resultArray.length,\n result: resultArray,\n });\n return {\n isActive: false,\n validUntil: 0,\n remainingCalls: 0,\n allowedEntrypoints: [],\n };\n }\n\n const isActive = resultArray[0] === \"0x1\";\n const validUntil = Number(BigInt(resultArray[1]));\n const remainingCalls = Number(BigInt(resultArray[2]));\n const entrypointsLen = Number(BigInt(resultArray[3]));\n const allowedEntrypoints = resultArray.slice(4, 4 + entrypointsLen);\n\n const sessionData: SessionDataResponse = {\n isActive,\n validUntil,\n remainingCalls,\n allowedEntrypoints,\n };\n\n console.log(\"[ChipiSDK:Session:GetData] Session data retrieved\", {\n isActive,\n validUntil: new Date(validUntil * 1000).toISOString(),\n remainingCalls,\n allowedEntrypointsCount: allowedEntrypoints.length,\n });\n\n return sessionData;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Contract revert or empty result = session doesn't exist (expected)\n const sessionNotFoundPatterns = [\n /entry point.*not found/i,\n /requested entrypoint was not found/i,\n /invalid message selector/i,\n /contract not found/i,\n /is not deployed/i,\n /revert.*get_session_data/i,\n ];\n const isSessionNotFound = sessionNotFoundPatterns.some((p) => p.test(err.message));\n\n if (isSessionNotFound) {\n console.log(\"[ChipiSDK:Session:GetData] Session not found on contract\", {\n walletAddress: walletAddress?.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey?.slice(0, 15) + \"...\",\n });\n return {\n isActive: false,\n validUntil: 0,\n remainingCalls: 0,\n allowedEntrypoints: [],\n };\n }\n\n // Infrastructure errors should propagate\n console.error(\"[ChipiSDK:Session:GetData] RPC/network error\", {\n error: err.message,\n walletAddress: walletAddress?.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey?.slice(0, 15) + \"...\",\n });\n throw err;\n }\n }\n\n /**\n * Execute a gasless transaction using a session key.\n *\n * This uses the 4-element session signature format instead of owner signature.\n * The session must be:\n * 1. Generated via `createSessionKey()`\n * 2. Registered on-chain via `addSessionKeyToContract()`\n *\n * CHIPI wallets only - will throw if wallet type is not CHIPI.\n *\n * @param params - Session execution parameters\n * @param bearerToken - Authentication token\n * @returns Transaction hash\n *\n * @example\n * ```typescript\n * // 1. Create session key (store externally)\n * const session = sdk.sessions.createSessionKey({ encryptKey });\n *\n * // 2. Register on contract (one-time)\n * await sdk.sessions.addSessionKeyToContract({\n * encryptKey,\n * wallet,\n * sessionConfig: {\n * sessionPublicKey: session.publicKey,\n * validUntil: session.validUntil,\n * maxCalls: 1000,\n * allowedEntrypoints: []\n * }\n * }, bearerToken);\n *\n * // 3. Execute transactions with session (no owner key needed)\n * const txHash = await sdk.sessions.executeTransactionWithSession({\n * encryptKey,\n * wallet,\n * session,\n * calls\n * }, bearerToken);\n * ```\n */\n async executeTransactionWithSession(\n params: ExecuteWithSessionParams,\n bearerToken: string\n ): Promise<string> {\n const { encryptKey, wallet, session, calls } = params;\n\n // Validate wallet type if provided - session keys only work with CHIPI wallets\n if (wallet.walletType && wallet.walletType !== \"CHIPI\") {\n throw new ChipiSessionError(\n `Session execution only supports CHIPI wallets. Got: ${wallet.walletType}`,\n SESSION_ERRORS.INVALID_WALLET_TYPE_FOR_SESSION\n );\n }\n\n return executePaymasterTransactionWithSession({\n params: {\n encryptKey,\n wallet: { ...wallet, walletType: \"CHIPI\" },\n session,\n calls,\n saveToDatabase: true,\n },\n bearerToken,\n client: this.client,\n });\n }\n\n // --- Spending Policy Methods ---\n // Wraps ISessionSpendingPolicy contract interface.\n // Spending policies enforce per-token limits on ERC-20 operations\n // (transfer, approve, increase_allowance) executed by session keys.\n\n /**\n * Split a bigint into Cairo u256 representation (low u128, high u128).\n */\n private splitU256(value: bigint): [string, string] {\n const mask = (1n << 128n) - 1n;\n return [num.toHex(value & mask), num.toHex(value >> 128n)];\n }\n\n /**\n * Reconstruct a bigint from Cairo u256 (low, high) hex strings.\n */\n private joinU256(low: string, high: string): bigint {\n return BigInt(low) + (BigInt(high) << 128n);\n }\n\n /**\n * Set a spending policy for a session key + token pair.\n *\n * This executes a sponsored transaction (using owner signature) to call\n * `set_spending_policy` on the CHIPI wallet contract.\n *\n * The contract enforces these limits automatically during `__execute__()` on\n * ERC-20 operations (transfer, approve, increase_allowance) made by the session.\n *\n * @param params - Spending policy parameters\n * @param bearerToken - Authentication token\n * @returns Transaction hash\n *\n * @example\n * ```typescript\n * // Set a spending limit: max 1 USDC per call, 50 USDC per day\n * const txHash = await sdk.sessions.setSpendingPolicy({\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * spendingPolicyConfig: {\n * sessionPublicKey: session.publicKey,\n * token: USDC_ADDRESS,\n * maxPerCall: 1_000_000n, // 1 USDC (6 decimals)\n * maxPerWindow: 50_000_000n, // 50 USDC\n * windowSeconds: 86400, // 24 hours\n * }\n * }, bearerToken);\n * ```\n */\n async setSpendingPolicy(params: SetSpendingPolicyParams, bearerToken: string): Promise<string> {\n const { encryptKey, wallet, spendingPolicyConfig } = params;\n const { sessionPublicKey, token, maxPerCall, maxPerWindow, windowSeconds } =\n spendingPolicyConfig;\n\n // Validate wallet type if provided (backward compat: omitted = assume CHIPI)\n if (wallet.walletType && wallet.walletType !== \"CHIPI\") {\n throw new ChipiSessionError(\n `Spending policies only support CHIPI wallets. Got: ${wallet.walletType}`,\n SESSION_ERRORS.INVALID_WALLET_TYPE_FOR_SESSION\n );\n }\n\n // Validate spending policy config\n const U256_MAX = (1n << 256n) - 1n;\n const U64_MAX = (1n << 64n) - 1n;\n\n if (!token || token.trim().length === 0) {\n throw new ChipiSessionError(\n `Invalid token address for spending policy: \"${token}\"`,\n SESSION_ERRORS.INVALID_SPENDING_POLICY\n );\n }\n if (\n typeof windowSeconds !== \"number\" ||\n !Number.isFinite(windowSeconds) ||\n !Number.isInteger(windowSeconds) ||\n windowSeconds <= 0 ||\n BigInt(windowSeconds) > U64_MAX\n ) {\n throw new ChipiSessionError(\n `Invalid window duration: ${windowSeconds}. Must be a positive integer within u64 range.`,\n SESSION_ERRORS.INVALID_SPENDING_POLICY\n );\n }\n if (maxPerCall < 0n || maxPerCall > U256_MAX) {\n throw new ChipiSessionError(\n `Invalid maxPerCall: must be >= 0 and <= 2^256 - 1`,\n SESSION_ERRORS.INVALID_SPENDING_POLICY\n );\n }\n if (maxPerWindow < 0n || maxPerWindow > U256_MAX) {\n throw new ChipiSessionError(\n `Invalid maxPerWindow: must be >= 0 and <= 2^256 - 1`,\n SESSION_ERRORS.INVALID_SPENDING_POLICY\n );\n }\n if (maxPerWindow > 0n && maxPerCall > maxPerWindow) {\n throw new ChipiSessionError(\n `Invalid spending policy: maxPerCall (${maxPerCall}) cannot exceed maxPerWindow (${maxPerWindow})`,\n SESSION_ERRORS.INVALID_SPENDING_POLICY\n );\n }\n\n try {\n console.log(\"[ChipiSDK:Session:SetSpendingPolicy] Setting spending policy\", {\n walletAddress: wallet.publicKey.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey.slice(0, 15) + \"...\",\n token: token.slice(0, 15) + \"...\",\n maxPerCall: maxPerCall.toString(),\n maxPerWindow: maxPerWindow.toString(),\n windowSeconds,\n });\n\n // Build calldata for set_spending_policy\n // Cairo: set_spending_policy(session_key, token, max_per_call: u256, max_per_window: u256, window_seconds: u64)\n // u256 is encoded as [low: u128, high: u128]\n const [maxPerCallLow, maxPerCallHigh] = this.splitU256(maxPerCall);\n const [maxPerWindowLow, maxPerWindowHigh] = this.splitU256(maxPerWindow);\n\n const calldata = [\n sessionPublicKey,\n token,\n maxPerCallLow,\n maxPerCallHigh,\n maxPerWindowLow,\n maxPerWindowHigh,\n num.toHex(windowSeconds),\n ];\n\n // Execute via paymaster (owner signature)\n const txHash = await executePaymasterTransaction({\n params: {\n encryptKey,\n wallet: { ...wallet, walletType: \"CHIPI\" },\n calls: [\n {\n contractAddress: wallet.publicKey,\n entrypoint: SESSION_ENTRYPOINTS.SET_SPENDING_POLICY,\n calldata,\n },\n ],\n saveToDatabase: false,\n },\n bearerToken,\n client: this.client,\n });\n\n console.log(\"[ChipiSDK:Session:SetSpendingPolicy] Spending policy set successfully\", {\n txHash,\n sessionPubKey: sessionPublicKey.slice(0, 15) + \"...\",\n token: token.slice(0, 15) + \"...\",\n });\n\n return txHash;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error(\"[ChipiSDK:Session:SetSpendingPolicy] Failed to set spending policy\", {\n error: err.message,\n walletAddress: wallet.publicKey?.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey?.slice(0, 15) + \"...\",\n token: token?.slice(0, 15) + \"...\",\n });\n throw error;\n }\n }\n\n /**\n * Query a spending policy from the smart contract.\n *\n * This is a read-only call that does not require signing or gas.\n * Returns zeroed data if no policy is set (meaning no enforcement).\n *\n * @param params - Query parameters\n * @returns Spending policy data including limits and current window state\n *\n * @example\n * ```typescript\n * const policy = await sdk.sessions.getSpendingPolicy({\n * walletAddress: userWallet.publicKey,\n * sessionPublicKey: session.publicKey,\n * token: USDC_ADDRESS,\n * });\n * if (policy.maxPerWindow > 0n) {\n * console.log(`Spent ${policy.spentInWindow} of ${policy.maxPerWindow} this window`);\n * }\n * ```\n */\n async getSpendingPolicy(params: GetSpendingPolicyParams): Promise<SpendingPolicyData> {\n const { walletAddress, sessionPublicKey, token } = params;\n\n try {\n const provider = new RpcProvider({\n nodeUrl: WALLET_RPC_ENDPOINTS[\"CHIPI\"],\n });\n\n console.log(\"[ChipiSDK:Session:GetSpendingPolicy] Querying spending policy\", {\n walletAddress: walletAddress.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey.slice(0, 15) + \"...\",\n token: token.slice(0, 15) + \"...\",\n });\n\n const result = await provider.callContract({\n contractAddress: walletAddress,\n entrypoint: SESSION_ENTRYPOINTS.GET_SPENDING_POLICY,\n calldata: [sessionPublicKey, token],\n });\n\n // Parse response: [max_per_call_low, max_per_call_high, max_per_window_low, max_per_window_high,\n // window_seconds, spent_in_window_low, spent_in_window_high, window_start]\n const resultArray = Array.isArray(result)\n ? result\n : (result as { result?: string[] }).result || [];\n\n if (resultArray.length < 8) {\n console.warn(\"[ChipiSDK:Session:GetSpendingPolicy] Unexpected response format\", {\n resultLength: resultArray.length,\n result: resultArray,\n });\n return {\n maxPerCall: 0n,\n maxPerWindow: 0n,\n windowSeconds: 0,\n spentInWindow: 0n,\n windowStart: 0,\n };\n }\n\n const policyData: SpendingPolicyData = {\n maxPerCall: this.joinU256(resultArray[0], resultArray[1]),\n maxPerWindow: this.joinU256(resultArray[2], resultArray[3]),\n windowSeconds: Number(BigInt(resultArray[4])),\n spentInWindow: this.joinU256(resultArray[5], resultArray[6]),\n windowStart: Number(BigInt(resultArray[7])),\n };\n\n console.log(\"[ChipiSDK:Session:GetSpendingPolicy] Spending policy retrieved\", {\n maxPerCall: policyData.maxPerCall.toString(),\n maxPerWindow: policyData.maxPerWindow.toString(),\n windowSeconds: policyData.windowSeconds,\n spentInWindow: policyData.spentInWindow.toString(),\n windowStart: policyData.windowStart,\n });\n\n return policyData;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Contract revert or entry not found = no policy set (expected)\n const notFoundPatterns = [\n /entry point.*not found/i,\n /requested entrypoint was not found/i,\n /invalid message selector/i,\n /contract not found/i,\n /is not deployed/i,\n ];\n const isNotFound = notFoundPatterns.some((p) => p.test(err.message));\n\n if (isNotFound) {\n console.log(\n \"[ChipiSDK:Session:GetSpendingPolicy] No policy found (contract or entrypoint missing)\",\n {\n walletAddress: walletAddress?.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey?.slice(0, 15) + \"...\",\n token: token?.slice(0, 15) + \"...\",\n }\n );\n return {\n maxPerCall: 0n,\n maxPerWindow: 0n,\n windowSeconds: 0,\n spentInWindow: 0n,\n windowStart: 0,\n };\n }\n\n console.error(\"[ChipiSDK:Session:GetSpendingPolicy] RPC/network error\", {\n error: err.message,\n walletAddress: walletAddress?.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey?.slice(0, 15) + \"...\",\n token: token?.slice(0, 15) + \"...\",\n });\n throw err;\n }\n }\n\n /**\n * Remove a spending policy for a session key + token pair.\n *\n * This executes a sponsored transaction (using owner signature) to call\n * `remove_spending_policy` on the CHIPI wallet contract.\n *\n * After removal, the session key has no spending limits for this token.\n *\n * @param params - Policy removal parameters\n * @param bearerToken - Authentication token\n * @returns Transaction hash\n *\n * @example\n * ```typescript\n * const txHash = await sdk.sessions.removeSpendingPolicy({\n * encryptKey: userEncryptKey,\n * wallet: userWallet,\n * sessionPublicKey: session.publicKey,\n * token: USDC_ADDRESS,\n * }, bearerToken);\n * ```\n */\n async removeSpendingPolicy(\n params: RemoveSpendingPolicyParams,\n bearerToken: string\n ): Promise<string> {\n const { encryptKey, wallet, sessionPublicKey, token } = params;\n\n // Validate wallet type if provided (backward compat: omitted = assume CHIPI)\n if (wallet.walletType && wallet.walletType !== \"CHIPI\") {\n throw new ChipiSessionError(\n `Spending policies only support CHIPI wallets. Got: ${wallet.walletType}`,\n SESSION_ERRORS.INVALID_WALLET_TYPE_FOR_SESSION\n );\n }\n\n if (!token || token.trim().length === 0) {\n throw new ChipiSessionError(\n `Invalid token address for spending policy removal: \"${token}\"`,\n SESSION_ERRORS.INVALID_SPENDING_POLICY\n );\n }\n\n try {\n console.log(\"[ChipiSDK:Session:RemoveSpendingPolicy] Removing spending policy\", {\n walletAddress: wallet.publicKey.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey.slice(0, 15) + \"...\",\n token: token.slice(0, 15) + \"...\",\n });\n\n // Build calldata for remove_spending_policy\n // Cairo: remove_spending_policy(session_key, token)\n const calldata = [sessionPublicKey, token];\n\n // Execute via paymaster (owner signature)\n const txHash = await executePaymasterTransaction({\n params: {\n encryptKey,\n wallet: { ...wallet, walletType: \"CHIPI\" },\n calls: [\n {\n contractAddress: wallet.publicKey,\n entrypoint: SESSION_ENTRYPOINTS.REMOVE_SPENDING_POLICY,\n calldata,\n },\n ],\n saveToDatabase: false,\n },\n bearerToken,\n client: this.client,\n });\n\n console.log(\"[ChipiSDK:Session:RemoveSpendingPolicy] Spending policy removed successfully\", {\n txHash,\n sessionPubKey: sessionPublicKey.slice(0, 15) + \"...\",\n token: token.slice(0, 15) + \"...\",\n });\n\n return txHash;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error(\"[ChipiSDK:Session:RemoveSpendingPolicy] Failed to remove spending policy\", {\n error: err.message,\n walletAddress: wallet.publicKey?.slice(0, 15) + \"...\",\n sessionPubKey: sessionPublicKey?.slice(0, 15) + \"...\",\n token: token?.slice(0, 15) + \"...\",\n });\n throw error;\n }\n }\n}\n","import type {\n PaymentPayload,\n VerifyResponse,\n SettleResponse,\n NonceStore,\n X402FacilitatorConfig,\n} from \"@chipi-stack/types\";\nimport { CONTRACT_ADDRESSES } from \"@chipi-stack/shared\";\nimport { buildX402TypedData } from \"@chipi-stack/core\";\nimport { uint256, typedData as starknetTypedData } from \"starknet\";\nimport { ChipiClient } from \"../client\";\nimport type {\n ExecuteSponsoredTransactionResponse,\n PrepareTypedDataResponse,\n} from \"@chipi-stack/types\";\n\n/** Default in-memory nonce store. Resets on server restart. */\nclass InMemoryNonceStore implements NonceStore {\n private readonly used = new Set<string>();\n\n has(nonce: string): boolean {\n return this.used.has(nonce);\n }\n\n consume(nonce: string): boolean {\n if (this.used.has(nonce)) return false;\n this.used.add(nonce);\n return true;\n }\n}\n\n/** Options for the static X402Facilitator.create() factory */\nexport interface X402FacilitatorCreateOptions {\n /** API public key for ChipiClient */\n apiKey: string;\n /** Bearer token for paymaster API calls */\n bearerToken: string;\n /** Custom nonce store (default: in-memory) */\n nonceStore?: NonceStore;\n /** RPC provider for on-chain signature verification */\n provider?: X402FacilitatorConfig[\"provider\"];\n}\n\n/**\n * x402 Payment Facilitator for Starknet.\n *\n * Implements the \"facilitator\" role in the x402 protocol:\n * - verify(): Validate payment signature, amount, asset, nonce replay\n * - settle(): Execute the USDC transfer via Chipi's paymaster\n *\n * Settlement reuses Chipi's existing gasless infrastructure\n * (prepare-typed-data → sign → execute-sponsored-transaction).\n */\nexport class X402Facilitator {\n private readonly client: ChipiClient;\n private readonly bearerToken: string;\n private readonly nonceStore: NonceStore;\n private readonly provider: X402FacilitatorConfig[\"provider\"];\n\n constructor(client: ChipiClient, bearerToken: string, config?: X402FacilitatorConfig) {\n this.client = client;\n this.bearerToken = bearerToken;\n this.nonceStore = config?.nonceStore ?? new InMemoryNonceStore();\n this.provider = config?.provider;\n }\n\n /**\n * Factory method for simpler instantiation.\n *\n * @example\n * ```typescript\n * const facilitator = X402Facilitator.create({\n * apiKey: process.env.CHIPI_API_KEY!,\n * bearerToken: process.env.CHIPI_BEARER_TOKEN!,\n * });\n * ```\n */\n static create(options: X402FacilitatorCreateOptions): X402Facilitator {\n const client = new ChipiClient({ apiPublicKey: options.apiKey });\n return new X402Facilitator(client, options.bearerToken, {\n nonceStore: options.nonceStore,\n provider: options.provider,\n });\n }\n\n /**\n * Verify a payment signature is valid (doesn't execute the transfer).\n *\n * Checks:\n * 1. Nonce has not been used (replay protection)\n * 2. Payment has not expired (validUntil > now)\n * 3. Asset is USDC mainnet\n * 4. Amount is positive\n * 5. Addresses are non-empty\n */\n async verify(payment: PaymentPayload): Promise<VerifyResponse> {\n const { payload } = payment;\n\n // 1. Check x402 version\n if (payment.x402Version !== 1) {\n return { isValid: false, invalidReason: `Unsupported x402 version: ${payment.x402Version}` };\n }\n\n // 2. Check network\n if (payment.network !== \"starknet-mainnet\") {\n return { isValid: false, invalidReason: `Unsupported network: ${payment.network}` };\n }\n\n // 3. Check nonce replay\n if (await this.nonceStore.has(payload.nonce)) {\n return { isValid: false, invalidReason: \"Nonce already used (replay)\" };\n }\n\n // 4. Check expiry\n const now = Math.floor(Date.now() / 1000);\n if (payload.validUntil <= now) {\n return { isValid: false, invalidReason: \"Payment has expired (validUntil in the past)\" };\n }\n\n // 5. Validate asset is USDC\n const normalizedAsset = payload.asset.toLowerCase().replace(/^0x0+/, \"0x\");\n const normalizedUsdc = CONTRACT_ADDRESSES.USDC_MAINNET.toLowerCase().replace(/^0x0+/, \"0x\");\n if (normalizedAsset !== normalizedUsdc) {\n return {\n isValid: false,\n invalidReason: `Unsupported asset: ${payload.asset}. Only USDC is accepted.`,\n };\n }\n\n // 6. Validate amount is positive\n let amount: bigint;\n try {\n amount = BigInt(payload.amount);\n } catch {\n return { isValid: false, invalidReason: \"Invalid payment amount format\" };\n }\n if (amount <= 0n) {\n return { isValid: false, invalidReason: \"Payment amount must be positive\" };\n }\n\n // 7. Validate addresses are non-empty\n if (!payload.fromAddress || !payload.toAddress) {\n return { isValid: false, invalidReason: \"Missing fromAddress or toAddress\" };\n }\n\n // 8. Verify SNIP-12 signature (cryptographic if provider available, presence-only otherwise)\n const sigResult = await this.verifySignature(payment);\n if (!sigResult.valid) {\n return { isValid: false, invalidReason: sigResult.reason };\n }\n\n return { isValid: true };\n }\n\n /**\n * Verify the SNIP-12 signature on a payment payload.\n *\n * If an RPC provider is configured, reconstructs the typed data, computes the\n * message hash, and calls `is_valid_signature()` on the sender's account contract.\n * Otherwise falls back to a presence-only check (backwards compatible).\n */\n private async verifySignature(\n payment: PaymentPayload\n ): Promise<{ valid: boolean; reason?: string }> {\n if (!this.provider) {\n // No provider configured — fall back to presence-only check\n if (!payment.payload?.signature?.r || !payment.payload?.signature?.s) {\n return { valid: false, reason: \"Missing signature\" };\n }\n return { valid: true };\n }\n\n const payload = payment.payload;\n\n if (!payload?.signature?.r || !payload?.signature?.s) {\n return { valid: false, reason: \"Missing signature\" };\n }\n\n // Reconstruct the SNIP-12 typed data (must match client's signPayment())\n const paymentTypedData = buildX402TypedData({\n from_address: payload.fromAddress,\n to_address: payload.toAddress,\n amount: payload.amount,\n asset: payload.asset,\n valid_until: String(payload.validUntil),\n nonce: payload.nonce,\n });\n\n // Compute the message hash\n const msgHash = starknetTypedData.getMessageHash(paymentTypedData, payload.fromAddress);\n\n // Call is_valid_signature on the account contract\n // Calldata: [hash, signature_length, r, s]\n try {\n const result = await this.provider.callContract({\n contractAddress: payload.fromAddress,\n entrypoint: \"is_valid_signature\",\n calldata: [msgHash, \"2\", payload.signature.r, payload.signature.s],\n });\n\n // ERC-1271 / SRC-6: returns 'VALID' (0x56414c4944) if signature is valid\n const VALID = \"0x56414c4944\";\n if (result[0] === VALID || result[0] === BigInt(VALID).toString()) {\n return { valid: true };\n }\n return { valid: false, reason: \"Invalid SNIP-12 signature\" };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { valid: false, reason: `Signature verification failed: ${message}` };\n }\n }\n\n /**\n * Settle a verified payment by executing the USDC transfer via paymaster.\n *\n * IMPORTANT: Mark nonce as consumed BEFORE executing to prevent concurrent replays.\n * If the transfer fails after nonce consumption, the nonce is still burned\n * (caller should implement idempotency at a higher level if needed).\n */\n async settle(payment: PaymentPayload): Promise<SettleResponse> {\n const { payload } = payment;\n\n // 1. Verify before settling\n const verification = await this.verify(payment);\n if (!verification.isValid) {\n return { success: false, errorReason: verification.invalidReason };\n }\n\n // 2. Atomically consume nonce (prevents concurrent replays)\n const consumed = await this.nonceStore.consume(payload.nonce);\n if (!consumed) {\n return { success: false, errorReason: \"Nonce already consumed (concurrent replay)\" };\n }\n\n try {\n // 3. Build ERC20 transfer call: fromAddress → toAddress\n // ERC20 transfer expects u256 (low, high) for the amount\n const amountU256 = uint256.bnToUint256(BigInt(payload.amount));\n const transferCall = {\n contractAddress: payload.asset,\n entrypoint: \"transfer\",\n calldata: [payload.toAddress, amountU256.low.toString(), amountU256.high.toString()],\n };\n\n // 4. Prepare typed data for sponsored execution\n const prepareResponse = await this.client.post<PrepareTypedDataResponse>({\n endpoint: \"/transactions/prepare-typed-data\",\n bearerToken: this.bearerToken,\n body: {\n publicKey: payload.fromAddress,\n calls: [transferCall],\n },\n });\n\n // 5. Execute sponsored transaction using the payment signature\n const result = await this.client.post<ExecuteSponsoredTransactionResponse>({\n endpoint: \"/transactions/execute-sponsored-transaction\",\n bearerToken: this.bearerToken,\n body: {\n publicKey: payload.fromAddress,\n typedData: prepareResponse.typedData,\n userSignature: payload.signature,\n walletType: prepareResponse.walletType,\n saveToDatabase: true,\n },\n });\n\n if (typeof result?.transactionHash !== \"string\" || !result.transactionHash.trim()) {\n return {\n success: false,\n errorReason: (result as any)?.message ?? \"No transaction hash returned from paymaster\",\n };\n }\n\n return {\n success: true,\n transactionHash: result.transactionHash,\n networkId: \"starknet-mainnet\",\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n errorReason: `Settlement failed: ${message}`,\n };\n }\n }\n}\n","import type { SignTypedDataParams, SignTypedDataResult } from \"@chipi-stack/types\";\nimport { Account, RpcProvider } from \"starknet\";\nimport { decryptPrivateKey } from \"./encryption\";\nimport { WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS } from \"@chipi-stack/shared\";\nimport { normalizeSignature } from \"./paymaster-adapter\";\n\n/**\n * Sign SNIP-12 typed data without executing a transaction.\n *\n * This is a purely local operation:\n * 1. Decrypt the private key using the encryption key (PIN)\n * 2. Create a starknet Account\n * 3. Sign the typed data with account.signMessage()\n * 4. Normalize and return { r, s }\n *\n * No API calls are made. Useful for x402 payment signatures and other\n * off-chain signing flows where you need a SNIP-12 signature but don't\n * want to execute a transaction.\n */\nexport const signTypedData = async ({\n params,\n}: {\n params: SignTypedDataParams;\n}): Promise<SignTypedDataResult> => {\n try {\n const { encryptKey, wallet, typedData } = params;\n\n if (!encryptKey) {\n throw new Error(\"encryptKey is required for signing typed data\");\n }\n\n if (!wallet || !wallet.encryptedPrivateKey || !wallet.publicKey) {\n throw new Error(\"wallet with publicKey and encryptedPrivateKey is required\");\n }\n\n if (!typedData) {\n throw new Error(\"typedData is required for signing\");\n }\n\n const walletType = wallet.walletType ?? \"READY\";\n\n if (\n !Object.prototype.hasOwnProperty.call(WALLET_RPC_ENDPOINTS, walletType) ||\n !Object.prototype.hasOwnProperty.call(WALLET_CLASS_HASHES, walletType)\n ) {\n throw new Error(`Unsupported wallet type: \"${String(walletType)}\"`);\n }\n\n const rpcUrl = WALLET_RPC_ENDPOINTS[walletType];\n\n // Decrypt the private key\n let privateKeyDecrypted: string;\n try {\n privateKeyDecrypted = decryptPrivateKey(wallet.encryptedPrivateKey, encryptKey);\n } catch {\n throw new Error(\"Failed to decrypt private key. Verify the encryptKey is correct.\");\n }\n\n const provider = new RpcProvider({ nodeUrl: rpcUrl });\n\n const account = new Account({\n provider,\n address: wallet.publicKey,\n signer: privateKeyDecrypted,\n });\n\n // Sign the typed data\n const signature = await account.signMessage(typedData);\n\n // Normalize signature format (handles both Weierstrass and Array types)\n const normalizedSig = normalizeSignature(signature);\n\n return normalizedSig;\n } catch (error) {\n console.error(\"Error signing typed data\", error);\n throw error;\n }\n};\n","import type {\n ChipiSDKConfig,\n CreateWalletParams,\n CreateWalletResponse,\n GetWalletParams,\n TransferParams,\n ApproveParams,\n CallAnyContractParams,\n ExecuteTransactionParams,\n RecordSendTransactionParams,\n Transaction,\n CreateSkuPurchaseParams,\n GetTokenBalanceParams,\n GetTokenBalanceResponse,\n PaginatedResponse,\n Sku,\n GetSkuListQuery,\n GetTransactionListQuery,\n ExecuteWithSessionParams,\n Currency,\n X402FacilitatorConfig,\n SignTypedDataParams,\n SignTypedDataResult,\n TransactionStatusResponse,\n PrepareWalletUpgradeParams,\n PrepareWalletUpgradeResponse,\n ExecuteWalletUpgradeParams,\n ExecuteWalletUpgradeResponse,\n} from \"@chipi-stack/types\";\nimport { STARKNET_NETWORKS, CONTRACT_ADDRESSES, formatAmount } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\nimport { ChipiWallets } from \"./wallets\";\nimport { ChipiTransactions } from \"./transactions\";\nimport { ChipiSkuPurchases } from \"./sku-purchases\";\nimport { ChipiSkus } from \"./skus\";\n\nimport { ChipiSessions } from \"./sessions\";\nimport { ChipiExchanges } from \"./exchanges\";\nimport { ChipiPaymasterAdapter } from \"./paymaster-adapter\";\nimport { X402Facilitator } from \"./x402/facilitator\";\nimport { signTypedData } from \"./sign-typed-data\";\n\n/**\n * Main Chipi SDK class\n */\nexport class ChipiSDK {\n private client: ChipiClient;\n private nodeUrl: string;\n private apiSecretKey?: string;\n\n public readonly wallets: ChipiWallets;\n public readonly transactions: ChipiTransactions;\n public readonly skuPurchases: ChipiSkuPurchases;\n public readonly skus: ChipiSkus;\n public readonly sessions: ChipiSessions;\n public readonly exchanges: ChipiExchanges;\n\n constructor(config: ChipiSDKConfig) {\n this.client = new ChipiClient(config);\n this.nodeUrl = config.nodeUrl || STARKNET_NETWORKS.MAINNET;\n this.apiSecretKey = config.apiSecretKey;\n\n // Initialize service classes\n this.wallets = new ChipiWallets(this.client);\n this.transactions = new ChipiTransactions(this.client);\n this.skuPurchases = new ChipiSkuPurchases(this.client);\n this.skus = new ChipiSkus(this.client);\n this.sessions = new ChipiSessions(this.client);\n this.exchanges = new ChipiExchanges(this.client);\n\n // Bind methods to preserve context\n this.executeTransaction = this.executeTransaction.bind(this);\n this.executeTransactionWithSession = this.executeTransactionWithSession.bind(this);\n this.transfer = this.transfer.bind(this);\n this.approve = this.approve.bind(this);\n // this.stakeVesuUsdc = this.stakeVesuUsdc.bind(this);\n // this.withdrawVesuUsdc = this.withdrawVesuUsdc.bind(this);\n this.callAnyContract = this.callAnyContract.bind(this);\n this.createWallet = this.createWallet.bind(this);\n this.recordSendTransaction = this.recordSendTransaction.bind(this);\n this.purchaseSku = this.purchaseSku.bind(this);\n this.getUsdAmount = this.getUsdAmount.bind(this);\n this.signTypedData = this.signTypedData.bind(this);\n this.createPaymasterAdapter = this.createPaymasterAdapter.bind(this);\n this.createX402Facilitator = this.createX402Facilitator.bind(this);\n }\n\n /**\n * Resolve bearer token - uses provided token or falls back to apiSecretKey\n */\n private resolveBearerToken(bearerToken?: string): string {\n const token = bearerToken ?? this.apiSecretKey;\n\n if (!token) {\n throw new Error(\n \"Authentication required: either pass a bearerToken or configure the SDK with an apiSecretKey\"\n );\n }\n\n return token;\n }\n\n /**\n * Create a PaymasterAdapter for use with TxBuilder.sendSponsored().\n *\n * @example\n * ```typescript\n * const sdk = new ChipiServerSDK({ apiPublicKey: \"pk_...\", apiSecretKey: \"sk_...\" });\n * const paymaster = sdk.createPaymasterAdapter();\n *\n * const txHash = await new TxBuilder(account, { paymaster })\n * .transfer(USDC, [{ to, amount }])\n * .sendSponsored(); // gasless!\n * ```\n */\n createPaymasterAdapter(bearerToken?: string): ChipiPaymasterAdapter {\n const token = this.resolveBearerToken(bearerToken);\n return new ChipiPaymasterAdapter(this.client, token);\n }\n\n /**\n * Create an X402Facilitator for verifying and settling x402 payments.\n *\n * @example\n * ```typescript\n * const facilitator = sdk.createX402Facilitator();\n *\n * // With custom nonce store (Redis)\n * const facilitator = sdk.createX402Facilitator(bearerToken, {\n * nonceStore: {\n * has: async (nonce) => (await redis.sismember(\"x402:nonces\", nonce)) === 1,\n * consume: async (nonce) => (await redis.sadd(\"x402:nonces\", nonce)) === 1,\n * },\n * });\n * ```\n */\n createX402Facilitator(\n bearerToken?: string,\n config?: X402FacilitatorConfig\n ): X402Facilitator {\n const token = this.resolveBearerToken(bearerToken);\n return new X402Facilitator(this.client, token, config);\n }\n\n /**\n * Execute a gasless transaction\n */\n async executeTransaction({\n params,\n bearerToken,\n }: {\n params: ExecuteTransactionParams;\n bearerToken?: string;\n }): Promise<string> {\n return this.transactions.executeTransaction({\n params,\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n /**\n * Execute a gasless transaction using a session key.\n *\n * This uses the 4-element session signature format instead of owner signature.\n * The session must be:\n * 1. Generated via `sessions.createSessionKey()`\n * 2. Registered on-chain via `sessions.addSessionKeyToContract()`\n *\n * CHIPI wallets only - will throw if wallet type is not CHIPI.\n *\n * @example\n * ```typescript\n * // 1. Create session key (store externally)\n * const session = sdk.sessions.createSessionKey({ encryptKey });\n *\n * // 2. Register on contract (one-time)\n * await sdk.sessions.addSessionKeyToContract({\n * encryptKey,\n * wallet,\n * sessionConfig: {\n * sessionPublicKey: session.publicKey,\n * validUntil: session.validUntil,\n * maxCalls: 1000,\n * allowedEntrypoints: []\n * }\n * }, bearerToken);\n *\n * // 3. Execute transactions with session (no owner key needed)\n * const txHash = await sdk.executeTransactionWithSession({\n * params: { encryptKey, wallet, session, calls },\n * bearerToken\n * });\n * ```\n */\n async executeTransactionWithSession({\n params,\n bearerToken,\n }: {\n params: ExecuteWithSessionParams;\n bearerToken?: string;\n }): Promise<string> {\n return this.sessions.executeTransactionWithSession(\n params,\n this.resolveBearerToken(bearerToken)\n );\n }\n\n /**\n * Sign SNIP-12 typed data without executing a transaction.\n *\n * Purely local operation: decrypt private key → sign → return { r, s }.\n * No API calls are made. Useful for x402 payment signatures and other\n * off-chain signing flows.\n *\n * @example\n * ```typescript\n * const { r, s } = await sdk.signTypedData({\n * params: {\n * encryptKey: pin,\n * wallet,\n * typedData: snip12TypedData,\n * },\n * });\n * ```\n */\n async signTypedData({\n params,\n }: {\n params: SignTypedDataParams;\n }): Promise<SignTypedDataResult> {\n return signTypedData({ params });\n }\n\n /**\n * Transfer tokens\n */\n async transfer({\n params,\n bearerToken,\n }: {\n params: TransferParams;\n bearerToken?: string;\n }): Promise<string> {\n return this.transactions.transfer({\n params,\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n /**\n * Approve token spending\n */\n async approve({\n params,\n bearerToken,\n }: {\n params: ApproveParams;\n bearerToken?: string;\n }): Promise<string> {\n const { encryptKey, wallet, contractAddress, spender, amount, decimals } = params;\n return this.executeTransaction({\n params: {\n encryptKey,\n wallet,\n calls: [\n {\n contractAddress,\n entrypoint: \"approve\",\n calldata: [spender, formatAmount(amount, decimals), \"0x0\"],\n },\n ],\n },\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n /**\n * Call any contract method\n */\n async callAnyContract({\n params,\n bearerToken,\n }: {\n params: CallAnyContractParams;\n bearerToken?: string;\n }): Promise<string> {\n const { encryptKey, wallet, calls } = params;\n return this.executeTransaction({\n params: {\n encryptKey,\n wallet,\n calls,\n },\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n /**\n * Create a new wallet\n */\n async createWallet({\n params,\n bearerToken,\n }: {\n params: CreateWalletParams;\n bearerToken?: string;\n }): Promise<CreateWalletResponse> {\n return this.wallets.createWallet({\n ...params,\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n async recordSendTransaction({\n params,\n bearerToken,\n }: {\n params: RecordSendTransactionParams;\n bearerToken?: string;\n }): Promise<Transaction> {\n return this.transactions.recordSendTransaction({\n params,\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n async getTransactionList(\n query: GetTransactionListQuery,\n bearerToken?: string\n ): Promise<PaginatedResponse<Transaction>> {\n return this.transactions.getTransactionList(query, this.resolveBearerToken(bearerToken));\n }\n\n async getWallet(params: GetWalletParams, bearerToken?: string) {\n return this.wallets.getWallet(params, this.resolveBearerToken(bearerToken));\n }\n\n async getTokenBalance(\n params: GetTokenBalanceParams,\n bearerToken?: string\n ): Promise<GetTokenBalanceResponse> {\n return this.wallets.getTokenBalance({\n params,\n bearerToken: this.resolveBearerToken(bearerToken),\n });\n }\n\n /**\n * Purchase a SKU\n */\n async purchaseSku({\n params,\n bearerToken,\n }: {\n params: CreateSkuPurchaseParams;\n bearerToken?: string;\n }): Promise<Transaction> {\n return this.skuPurchases.purchaseSku(params, this.resolveBearerToken(bearerToken));\n }\n\n /**\n * Get a SKU purchase by id\n */\n async getSkuPurchase(id: string, bearerToken?: string): Promise<Transaction> {\n return this.skuPurchases.getSkuPurchase(id, this.resolveBearerToken(bearerToken));\n }\n\n /// SKUS\n async getSkuList(params: GetSkuListQuery, bearerToken?: string): Promise<PaginatedResponse<Sku>> {\n return this.skus.getSkuList(params, this.resolveBearerToken(bearerToken));\n }\n\n async getSku(id: string, bearerToken?: string): Promise<Sku> {\n return this.skus.getSku(id, this.resolveBearerToken(bearerToken));\n }\n\n /**\n * Get a single transaction by hash or internal ID\n */\n async getTransaction(hashOrId: string, bearerToken?: string): Promise<Transaction> {\n return this.transactions.getTransaction(hashOrId, this.resolveBearerToken(bearerToken));\n }\n\n /**\n * Get on-chain transaction status (supports polling for confirmation)\n */\n async getTransactionStatus(hash: string, bearerToken?: string): Promise<TransactionStatusResponse> {\n return this.transactions.getTransactionStatus(hash, this.resolveBearerToken(bearerToken));\n }\n\n /**\n * Prepare a wallet upgrade (e.g., READY → CHIPI or CHIPI v29 → v33).\n * Returns typed data that must be signed by the wallet owner.\n * Server-only: requires API secret key.\n */\n async prepareWalletUpgrade(\n params: PrepareWalletUpgradeParams,\n bearerToken?: string\n ): Promise<PrepareWalletUpgradeResponse> {\n return this.wallets.prepareWalletUpgrade(params, this.resolveBearerToken(bearerToken));\n }\n\n /**\n * Execute a wallet upgrade after signing.\n * Server-only: requires API secret key.\n */\n async executeWalletUpgrade(\n params: ExecuteWalletUpgradeParams,\n bearerToken?: string\n ): Promise<ExecuteWalletUpgradeResponse> {\n return this.wallets.executeWalletUpgrade(params, this.resolveBearerToken(bearerToken));\n }\n\n async getUsdAmount(\n currencyAmount: number,\n currency: Currency,\n bearerToken?: string\n ): Promise<number> {\n return this.exchanges.getUsdAmount(\n currencyAmount,\n currency,\n this.resolveBearerToken(bearerToken)\n );\n }\n}\n","import type { ChipiServerSDKConfig } from \"@chipi-stack/types\";\nimport { ChipiSDK } from \"./chipi-sdk\";\n\n/**\n * Server-side Chipi SDK with built-in API Secret Key authentication\n *\n * This class is designed for server-side environments where you can safely store\n * the API Secret Key. All methods automatically use the secret key for authentication,\n * so you don't need to pass a bearer token with each call.\n *\n * The apiSecretKey is stored internally and used automatically for all authenticated requests.\n * All methods from ChipiSDK are inherited and work without requiring a bearerToken parameter.\n *\n * @example\n * ```typescript\n * const chipiServer = new ChipiServerSDK({\n * apiPublicKey: \"pk_...\",\n * apiSecretKey: \"sk_...\",\n * environment: \"production\"\n * });\n *\n * // No bearer token needed - automatically uses apiSecretKey!\n * const wallet = await chipiServer.createWallet({\n * params: {\n * encryptKey: \"user-encryption-key\",\n * externalUserId: \"user-123\"\n * }\n * });\n *\n * const userWallet = await chipiServer.getWallet({ externalUserId: \"user-123\" });\n * const txHash = await chipiServer.transfer({ params: { ... } });\n * ```\n */\nexport class ChipiServerSDK extends ChipiSDK {\n constructor(config: ChipiServerSDKConfig) {\n if (!config.apiSecretKey) {\n throw new Error(\n \"apiSecretKey is required for ChipiServerSDK. Use ChipiBrowserSDK for client-side applications.\"\n );\n }\n\n super(config);\n }\n\n // All methods are inherited from ChipiSDK\n // The apiSecretKey from config is automatically used via resolveBearerToken()\n}\n","import type { ChipiBrowserSDKConfig } from \"@chipi-stack/types\";\nimport { ChipiSDK } from \"./chipi-sdk\";\n\n/**\n * Browser-side Chipi SDK for client-side applications\n *\n * This class is designed for browser environments (Vue, Svelte, Angular, vanilla JS, etc.)\n * where you need to pass a bearer token (JWT) with each authenticated request.\n *\n * All methods require a bearerToken parameter since browser environments should not\n * store API Secret Keys.\n *\n * ⚠️ SECURITY WARNING: DO NOT use your API Secret Key in browser environments!\n * The secret key should only be used server-side with ChipiServerSDK.\n *\n * @example\n * ```typescript\n * const chipiBrowser = new ChipiBrowserSDK({\n * apiPublicKey: \"pk_...\",\n * environment: \"production\"\n * });\n *\n * // Get user's JWT token from your auth system\n * const userToken = await getUserJWT();\n *\n * // Pass bearer token with each call\n * const wallet = await chipiBrowser.createWallet({\n * params: {\n * encryptKey: \"user-encryption-key\",\n * externalUserId: \"user-123\"\n * },\n * bearerToken: userToken\n * });\n *\n * const userWallet = await chipiBrowser.getWallet({ externalUserId: \"user-123\" }, userToken);\n * const txHash = await chipiBrowser.transfer({ params: {...}, bearerToken: userToken });\n * ```\n */\nexport class ChipiBrowserSDK extends ChipiSDK {\n constructor(config: ChipiBrowserSDKConfig) {\n super(config);\n }\n\n // All methods are inherited from ChipiSDK\n // bearerToken parameter is required for each authenticated request\n}\n","import type { PaymentRequirement, X402PaymentConfig } from \"@chipi-stack/types\";\nimport { CONTRACT_ADDRESSES, TOKEN_DECIMALS } from \"@chipi-stack/shared\";\nimport type { X402Facilitator } from \"./facilitator\";\n\nexport interface X402MiddlewareConfig {\n /** x402 facilitator instance for verify + settle */\n facilitator: X402Facilitator;\n /** Payment configuration for this endpoint */\n paymentConfig: X402PaymentConfig;\n /** Verify-only mode: verify payment but don't settle (default: false) */\n verifyOnly?: boolean;\n}\n\n/**\n * Flat convenience config — detected when `amount` + `recipient` are present.\n * Avoids nesting paymentConfig.\n */\nexport interface X402MiddlewareFlatConfig {\n /** x402 facilitator instance */\n facilitator: X402Facilitator;\n /** Amount in human-readable USDC (e.g. \"0.01\") */\n amount: string;\n /** Recipient (merchant) address */\n recipient: string;\n /** Human-readable description */\n description?: string;\n /** Verify-only mode (default: false) */\n verifyOnly?: boolean;\n}\n\n/**\n * Convert human-readable USDC amount to base units using string arithmetic (no float).\n */\nfunction amountToBaseUnits(amount: string, decimals: number): string {\n const [whole, frac = \"\"] = amount.split(\".\");\n const fracPadded = (frac + \"0\".repeat(decimals)).slice(0, decimals);\n return String(BigInt(whole + fracPadded));\n}\n\n/**\n * Build a PaymentRequirement from middleware config + request URL.\n */\nfunction buildPaymentRequirement(config: X402PaymentConfig, resource: string): PaymentRequirement {\n const amountBaseUnits = amountToBaseUnits(config.amount, TOKEN_DECIMALS.USDC);\n\n return {\n scheme: \"exact\",\n network: \"starknet-mainnet\",\n maxAmountRequired: amountBaseUnits,\n resource,\n description: config.description,\n payTo: config.payTo,\n maxTimeoutSeconds: 300,\n asset: CONTRACT_ADDRESSES.USDC_MAINNET,\n };\n}\n\nfunction isFlatConfig(\n config: X402MiddlewareConfig | X402MiddlewareFlatConfig\n): config is X402MiddlewareFlatConfig {\n return \"amount\" in config && \"recipient\" in config;\n}\n\nfunction resolveConfig(\n config: X402MiddlewareConfig | X402MiddlewareFlatConfig\n): X402MiddlewareConfig {\n if (isFlatConfig(config)) {\n return {\n facilitator: config.facilitator,\n paymentConfig: {\n amount: config.amount,\n payTo: config.recipient,\n description: config.description,\n },\n verifyOnly: config.verifyOnly,\n };\n }\n return config;\n}\n\n/**\n * Express-compatible middleware for monetizing API endpoints with x402.\n *\n * When no X-PAYMENT header is present, returns 402 with payment requirement.\n * When a valid payment is present, verifies and settles it, then calls next().\n * The settled transaction info is attached to `req.x402`.\n *\n * @example\n * ```typescript\n * // Nested config (original)\n * x402Middleware({\n * facilitator,\n * paymentConfig: { amount: \"0.01\", payTo: \"0xYOUR_ADDRESS\" },\n * })\n *\n * // Flat config (convenience)\n * x402Middleware({\n * facilitator,\n * amount: \"0.01\",\n * recipient: \"0xYOUR_ADDRESS\",\n * })\n * ```\n */\nexport function x402Middleware(config: X402MiddlewareConfig | X402MiddlewareFlatConfig) {\n const resolved = resolveConfig(config);\n return async (req: any, res: any, next: any) => {\n // Skip CORS preflight\n if (req.method === \"OPTIONS\") {\n return next();\n }\n\n const paymentHeader = req.headers?.[\"x-payment\"] ?? req.headers?.[\"X-PAYMENT\"];\n\n if (!paymentHeader) {\n // Return 402 with payment requirement\n const resource =\n req.protocol && req.get\n ? `${req.protocol}://${req.get(\"host\")}${req.originalUrl}`\n : (req.url ?? \"\");\n const requirement = buildPaymentRequirement(resolved.paymentConfig, resource);\n\n return res.status(402).set(\"Payment-Required\", JSON.stringify(requirement)).json({\n error: \"Payment Required\",\n paymentRequirement: requirement,\n });\n }\n\n // Parse payment\n let payment;\n try {\n payment = typeof paymentHeader === \"string\" ? JSON.parse(paymentHeader) : paymentHeader;\n } catch {\n return res.status(400).json({ error: \"Malformed X-PAYMENT header: invalid JSON\" });\n }\n\n // Validate payload shape before accessing fields\n const payload = payment?.payload;\n const toAddress = typeof payload?.toAddress === \"string\" ? payload.toAddress : null;\n const amount = typeof payload?.amount === \"string\" ? payload.amount : null;\n const asset = typeof payload?.asset === \"string\" ? payload.asset : null;\n\n if (!toAddress || !amount || !asset) {\n return res\n .status(400)\n .json({ error: \"Malformed X-PAYMENT payload: missing required fields\" });\n }\n\n // Enforce payment matches endpoint config (amount, recipient, asset)\n const requirement = buildPaymentRequirement(resolved.paymentConfig, \"\");\n const normalizeAddr = (a: string) => a.toLowerCase().replace(/^0x0+/, \"0x\");\n\n if (normalizeAddr(toAddress) !== normalizeAddr(resolved.paymentConfig.payTo)) {\n return res.status(402).json({\n error: \"Payment recipient mismatch\",\n reason: `Expected ${resolved.paymentConfig.payTo}, got ${toAddress}`,\n });\n }\n\n let paidAmount: bigint;\n try {\n paidAmount = BigInt(amount);\n } catch {\n return res\n .status(400)\n .json({ error: \"Malformed X-PAYMENT payload\", reason: \"amount must be an integer string\" });\n }\n\n if (paidAmount < BigInt(requirement.maxAmountRequired)) {\n return res.status(402).json({\n error: \"Payment amount insufficient\",\n reason: `Required ${requirement.maxAmountRequired} base units, got ${amount}`,\n });\n }\n\n if (normalizeAddr(asset) !== normalizeAddr(requirement.asset)) {\n return res.status(402).json({\n error: \"Payment asset mismatch\",\n reason: `Expected USDC, got ${asset}`,\n });\n }\n\n // Verify + Settle with error boundary\n try {\n const verified = await resolved.facilitator.verify(payment);\n if (!verified.isValid) {\n return res.status(402).json({\n error: \"Payment verification failed\",\n reason: verified.invalidReason,\n });\n }\n\n // Settle (unless verify-only mode)\n if (!resolved.verifyOnly) {\n const settled = await resolved.facilitator.settle(payment);\n if (!settled.success) {\n return res.status(402).json({\n error: \"Payment settlement failed\",\n reason: settled.errorReason,\n });\n }\n\n // Attach payment info to request\n req.x402 = {\n txHash: settled.transactionHash,\n payment,\n networkId: settled.networkId,\n };\n } else {\n req.x402 = { payment };\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return res.status(500).json({\n error: \"Payment processing error\",\n reason: message,\n });\n }\n\n next();\n };\n}\n"]}
|