@stableflow/wallet-evm 3.0.0 → 3.0.1-rc-d44cd0c127-20260527
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 +13 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +13 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -391,13 +391,25 @@ var EVMWallet = class {
|
|
|
391
391
|
[Object.values(composeMsgSendParam)]
|
|
392
392
|
);
|
|
393
393
|
}
|
|
394
|
+
if (isOriginLegacy || isDestinationLegacy) {
|
|
395
|
+
result.fees.legacyMeshFeeUsd = core.numberRemoveEndZero(Big__default.default(amountWei || 0).div(10 ** params.fromToken.decimals).times(bridges.USDT0_LEGACY_MESH_TRANSFTER_FEE).toFixed(params.fromToken.decimals));
|
|
396
|
+
result.outputAmount = core.numberRemoveEndZero(Big__default.default(Big__default.default(amountWei || 0).div(10 ** params.fromToken.decimals)).minus(result.fees.legacyMeshFeeUsd || 0).toFixed(params.fromToken.decimals, 0));
|
|
397
|
+
}
|
|
394
398
|
if (!dry) {
|
|
395
399
|
execTime.breakpoint();
|
|
396
400
|
const oftData = await oftContractRead.quoteOFT.staticCall(sendParam);
|
|
397
401
|
const [, , oftReceipt] = oftData;
|
|
398
|
-
sendParam.minAmountLD =
|
|
402
|
+
sendParam.minAmountLD = Big__default.default(amountWei).times(Big__default.default(1).minus(Big__default.default(slippageTolerance || 0).div(100))).toFixed(0);
|
|
403
|
+
result.outputAmount = core.numberRemoveEndZero(core.numberRemoveEndZero(Big__default.default(oftReceipt[1].toString()).div(10 ** params.toToken.decimals).toFixed(params.toToken.decimals, 0)));
|
|
399
404
|
execTime.log("quoteOFT.staticCall");
|
|
400
405
|
}
|
|
406
|
+
this.csl("EVMWallet quoteOFT", "red-600", "result.outputAmount: %o", result.outputAmount);
|
|
407
|
+
this.csl("EVMWallet quoteOFT", "red-600", "slippageTolerance: %o", slippageTolerance + "%");
|
|
408
|
+
this.csl("EVMWallet quoteOFT", "red-600", "Minimum received amount: %o", Big__default.default(amountWei).div(10 ** fromToken.decimals).times(Big__default.default(1).minus(Big__default.default(slippageTolerance || 0).div(100))).toFixed(6, 0));
|
|
409
|
+
if (Big__default.default(result.outputAmount).lt(Big__default.default(amountWei).div(10 ** fromToken.decimals).times(Big__default.default(1).minus(Big__default.default(slippageTolerance || 0).div(100))))) {
|
|
410
|
+
result.errMsg = "Slippage limit exceeded";
|
|
411
|
+
return result;
|
|
412
|
+
}
|
|
401
413
|
execTime.breakpoint();
|
|
402
414
|
const mergedCall = [
|
|
403
415
|
oftContractRead.quoteSend.staticCall(sendParam, payInLzToken)
|
|
@@ -427,10 +439,6 @@ var EVMWallet = class {
|
|
|
427
439
|
result.fees.nativeFee = core.numberRemoveEndZero(Big__default.default(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).toFixed(fromToken.nativeToken.decimals));
|
|
428
440
|
result.fees.nativeFeeUsd = core.numberRemoveEndZero(Big__default.default(nativeFeeUsd).toFixed(20));
|
|
429
441
|
result.fees.lzTokenFeeUsd = core.numberRemoveEndZero(Big__default.default(lzMsgFee?.toString() || 0).div(10 ** fromToken.decimals).toFixed(20));
|
|
430
|
-
if (isOriginLegacy || isDestinationLegacy) {
|
|
431
|
-
result.fees.legacyMeshFeeUsd = core.numberRemoveEndZero(Big__default.default(amountWei || 0).div(10 ** params.fromToken.decimals).times(bridges.USDT0_LEGACY_MESH_TRANSFTER_FEE).toFixed(params.fromToken.decimals));
|
|
432
|
-
result.outputAmount = core.numberRemoveEndZero(Big__default.default(Big__default.default(amountWei || 0).div(10 ** params.fromToken.decimals)).minus(result.fees.legacyMeshFeeUsd || 0).toFixed(params.fromToken.decimals, 0));
|
|
433
|
-
}
|
|
434
442
|
const finalSendParam = [
|
|
435
443
|
sendParam,
|
|
436
444
|
{
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/evm.ts"],"names":["Csl","OpenAPI","tx","ethers","erc20Abi","evmRpcFallbackProvider","balance","Big","numberRemoveEndZero","getPrice","ExecTime","getDestinationAssociatedTokenAddress","LZ_RECEIVE_VALUE","addressToBytes32","getHopMsgFee","NATIVE_MSG_FEE_BUFFER","USDT0_LEGACY_MESH_TRANSFTER_FEE","Service","SendType","userNonce","quoteSignature","FRAXZERO_MIDDLE_TOKEN_USDC","FRAXZERO_MIDDLE_TOKEN_FRXUSD","usdtTokens","USDT0_CONFIG","buildEndpointV2LzComposePayload","OFT_ABI"],"mappings":";;;;;;;;;;;;;;;;AA+BA,IAAM,iBAAA,GAAoB,OAAA;AAC1B,IAAM,wBAAA,GAA2B,QAAA;AAEjC,IAAqB,YAArB,MAA+B;AAAA,EAK7B,WAAA,CAAY,WAAgB,OAAA,EAAe;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,SAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,IAAA,MAAM,EAAA,GAAK,IAAIA,QAAA,CAAIC,YAAA,CAAQ,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,MAAM,EAAA,CAAG,GAAA;AAAA,EAChB;AAAA,EAEA,MAAM,SAAS,IAAA,EAIZ;AACD,IAAA,MAAM,EAAE,WAAA,EAAa,cAAA,EAAgB,MAAA,EAAO,GAAI,IAAA;AAEhD,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,MAAMC,GAAAA,GAAK,MAAM,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgB;AAAA,QAC3C,EAAA,EAAI,cAAA;AAAA,QACJ,KAAA,EAAOC,aAAA,CAAO,UAAA,CAAW,MAAM;AAAA,OAChC,CAAA;AACD,MAAA,MAAMD,IAAG,IAAA,EAAK;AACd,MAAA,OAAOA,GAAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAW,IAAIC,aAAA,CAAO,SAAS,WAAA,EAAaC,aAAA,EAAU,KAAK,MAAM,CAAA;AAEvE,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,QAAA,CAAS,gBAAgB,MAAM,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,IAAA,EAAK;AAE7B,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,UAAA,CAAW,KAAA,EAAY,OAAA,EAAiB,OAAA,EAAuC;AACnF,IAAA,MAAM,EAAE,YAAA,GAAe,KAAA,EAAM,GAAI,WAAW,EAAC;AAE7C,IAAA,IAAI;AACF,MAAA,IAAI,WAAW,IAAA,CAAK,QAAA;AACpB,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,QAAA,GAAWC,gCAAuB,KAAK,CAAA;AAAA,MACzC;AAEA,MAAA,IAAI,KAAA,CAAM,WAAW,KAAA,IAAS,KAAA,CAAM,WAAW,KAAA,IAAS,KAAA,CAAM,WAAW,QAAA,EAAU;AACjF,QAAA,MAAMC,QAAAA,GAAU,MAAM,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA;AACjD,QAAA,OAAOA,SAAQ,QAAA,EAAS;AAAA,MAC1B;AAGA,MAAA,MAAM,WAAW,IAAIH,aAAA,CAAO,SAAS,KAAA,CAAM,eAAA,EAAiBC,eAAU,QAAQ,CAAA;AAE9E,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,SAAA,CAAU,OAAO,CAAA;AAChD,MAAA,IAAA,CAAK,IAAI,gBAAA,EAAkB,WAAA,EAAa,sCAAA,EAAwC,KAAA,CAAM,iBAAiB,OAAO,CAAA;AAE9G,MAAA,OAAO,QAAQ,QAAA,EAAS;AAAA,IAC1B,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,SAAA,EAAW,wBAAA,EAA0B,GAAG,CAAA;AACnE,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAY,OAAA,EAAiB,OAAA,EAAuC;AAClF,IAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBAAoB,IAAA,EASvB;AACD,IAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAgB,MAAA,EAAQ,SAAQ,GAAI,IAAA;AACvD,IAAA,MAAM,cAAc,SAAA,CAAU,eAAA;AAC9B,IAAA,MAAM,QAAA,GAAWC,gCAAuB,SAAS,CAAA;AAEjD,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,gBAAgB,KAAA,EAAO;AAEzB,MAAA,MAAM,EAAA,GAAK;AAAA,QACT,IAAA,EAAM,OAAA;AAAA,QACN,EAAA,EAAI,cAAA;AAAA,QACJ,KAAA,EAAOF,aAAA,CAAO,UAAA,CAAW,MAAM;AAAA,OACjC;AACA,MAAA,QAAA,GAAW,MAAM,QAAA,CAAS,WAAA,CAAY,EAAE,CAAA;AAAA,IAC1C,CAAA,MAAO;AAEL,MAAA,MAAM,WAAW,IAAIA,aAAA,CAAO,QAAA,CAAS,WAAA,EAAaC,eAAU,QAAQ,CAAA;AACpE,MAAA,QAAA,GAAW,MAAM,QAAA,CAAS,QAAA,CAAS,WAAA,CAAY,gBAAgB,MAAM,CAAA;AAAA,IACvE;AAGA,IAAA,QAAA,GAAY,WAAW,IAAA,GAAQ,IAAA;AAG/B,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,EAAW;AAC1C,IAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AAGrC,IAAA,MAAM,cAAc,QAAA,GAAW,QAAA;AAE/B,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,YAAY,MAAA,EAAa;AACvB,IAAA,MAAM;AAAA,MACJ,eAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,OAAO,IAAID,aAAA,CAAO,QAAA,CAAS,eAAA,EAAiB,GAAA,EAAK,KAAK,MAAM,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAM,UAAU,MAAA,EAAa;AAC3B,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,eAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,GAAS;AAAA,KACX,GAAI,MAAA;AAEJ,IAAA,MAAM,MAAA,GAAS,YAAY,IAAA,CAAK,QAAA;AAChC,IAAA,MAAM,WAAW,IAAIA,aAAA,CAAO,QAAA,CAAS,eAAA,EAAiBC,eAAU,MAAM,CAAA;AAItE,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO;AAAA,QACL,QAAA;AAAA,QACA,SAAA,EAAW,GAAA;AAAA,QACX,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,GAAY,GAAA;AAChB,IAAA,IAAI;AACF,MAAA,SAAA,GAAY,QAAA,GACR,MAAM,QAAA,CAAS,SAAA,CAAU,SAAS,OAAA,EAAS,EAAE,QAAA,EAAU,CAAA,GACvD,MAAM,QAAA,CAAS,SAAA,CAAU,SAAS,OAAO,CAAA;AAC7C,MAAA,SAAA,GAAY,UAAU,QAAA,EAAS;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,SAAA,EAAW,6BAAA,EAA+B,KAAK,CAAA;AACzE,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAaG,oBAAA,CAAI,SAAA,IAAa,CAAC,CAAA,CAAE,EAAA,CAAG,aAAa,CAAC;AAAA,KACpD;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,MAAA,EAAa;AACzB,IAAA,MAAM;AAAA,MACJ,eAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA,GAAe,KAAA;AAAA,MACf,SAAA,GAAY,KAAA;AAAA,MACZ,eAAA,GAAkB;AAAA,KACpB,GAAI,MAAA;AAEJ,IAAA,MAAM,WAAW,IAAIJ,aAAA,CAAO,SAAS,eAAA,EAAiBC,aAAA,EAAU,KAAK,MAAM,CAAA;AAE3E,IAAA,IAAI,UAAA,GAAa,SAAA;AACjB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,UAAA,GAAaD,aAAA,CAAO,UAAA;AAAA,IACtB;AAEA,IAAA,MAAM,YAAA,GAAoB;AAAA,MACxB,OAAA,EAAS,KAAA;AAAA,MACT,MAAM,EAAC;AAAA,MACP,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,OAAA,CAAQ,SAAS,UAAU,CAAA;AACrD,MAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,IAAA,EAAK;AAChC,MAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,aAAA,GAAgB,OAAO,SAAA,CAAU,aAAA,KAAkB,aACrD,MAAM,SAAA,CAAU,aAAA,EAAc,GAC9B,SAAA,CAAU,aAAA;AACd,UAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,UAAA,YAAA,CAAa,IAAA,GAAO;AAAA,YAClB,QAAQ,SAAA,CAAU,IAAA;AAAA,YAClB,aAAa,SAAA,CAAU,WAAA;AAAA,YACvB;AAAA,WACF;AACA,UAAA,OAAO,YAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,YAAA,CAAa,OAAA,GAAU,eAAA;AACvB,QAAA,OAAO,YAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAY;AACnB,MAAA,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,SAAA,EAAW,mBAAA,EAAqB,KAAK,CAAA;AAC7D,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,YAAA,CAAa,UAAU,KAAA,CAAM,OAAA;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,YAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,MAAA,EAAa;AAChC,IAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,UAAS,GAAI,MAAA;AAE7D,IAAA,IAAI,aAAA,GAAgB,QAAA;AACpB,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,EAAW;AAC1C,MAAA,aAAA,GAAgB,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,QAAA,IAAY,OAAO,aAAa,CAAA;AAAA,IAClF;AAEA,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAQ,CAAA,GAAI,OAAO,aAAa,CAAA;AAC3D,IAAA,MAAM,iBAAA,GAAoBI,qBAAI,WAAA,CAAY,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,WAAA,CAAY,QAAQ,CAAA;AACpF,IAAA,MAAM,iBAAiBA,oBAAA,CAAI,iBAAiB,CAAA,CAAE,KAAA,CAAM,SAAS,CAAC,CAAA;AAE9D,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,aAAA;AAAA,MACV,KAAKC,wBAAA,CAAoBD,oBAAA,CAAI,cAAc,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,MACxD,GAAA,EAAK,WAAA;AAAA,MACL,MAAA,EAAQC,yBAAoBD,oBAAA,CAAI,iBAAiB,EAAE,OAAA,CAAQ,WAAA,CAAY,QAAQ,CAAC;AAAA,KAClF;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,MAAA,EAAa;AACrC,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA,GAAkB,iBAAA;AAAA,MAClB,QAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,EAAA,GAAK,IAAIP,QAAA,CAAIC,YAAA,CAAQ,KAAK,CAAA;AAChC,IAAA,MAAM,MAAM,EAAA,CAAG,GAAA;AAEf,IAAA,MAAM,QAAA,GAAWI,gCAAuB,SAAS,CAAA;AACjD,IAAA,MAAM,gBAAA,GAAmBI,aAAA,CAAS,MAAA,EAAQ,SAAA,CAAU,YAAY,MAAM,CAAA;AAEtE,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,sBAAA,EAAwB,MAAM,wBAAA,GAA2B,iBAAA;AAAA,MACzD,iBAAA,EAAmB,EAAA;AAAA,MACnB,oBAAA,EAAsB;AAAA,KACxB;AAEA,IAAA,MAAM,qBAAqB,YAAY;AACrC,MAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,MAAM,KAAK,cAAA,CAAe;AAAA,QAC7C,QAAA,EAAU,iBAAA;AAAA,QACV,KAAA,EAAO,gBAAA;AAAA,QACP,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,QAAA;AAAA,QACA,UAAU,GAAA,GAAM,UAAA,CAAW,SAAA,CAAU,OAAO,EAAE,QAAA,GAAW;AAAA,OAC1D,CAAA;AACD,MAAA,MAAA,CAAO,iBAAA,GAAoB,GAAA;AAC3B,MAAA,MAAA,CAAO,oBAAA,GAAuB,GAAA;AAAA,IAChC,CAAA;AAEA,IAAA,IAAI,aAAA,GAAgB,eAAA;AAEpB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,WAAA,CAAY;AAAA,UAC1C,IAAI,SAAA,CAAU,MAAA;AAAA,UACd,MAAM,SAAA,CAAU,QAAA;AAAA,UAChB,IAAA,EAAM,QAAA,IAAY,IAAA,CAAK,MAAA,EAAQ;AAAA,SAChC,CAAA;AACD,QAAA,aAAA,GAAgB,WAAW,IAAA,GAAO,IAAA;AAClC,QAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,MAAM,KAAK,cAAA,CAAe;AAAA,UAC7C,QAAA,EAAU,aAAA;AAAA,UACV,KAAA,EAAO,gBAAA;AAAA,UACP,aAAa,SAAA,CAAU,WAAA;AAAA,UACvB;AAAA,SACD,CAAA;AACD,QAAA,MAAA,CAAO,sBAAA,GAAyB,aAAA;AAChC,QAAA,MAAA,CAAO,iBAAA,GAAoB,GAAA;AAC3B,QAAA,MAAA,CAAO,oBAAA,GAAuB,GAAA;AAAA,MAChC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,yBAAA,EAA2B,SAAA,EAAW,2BAAA,EAA6B,MAAA,EAAQ,KAAK,CAAA;AACpF,QAAA,MAAM,kBAAA,EAAmB;AACzB,QAAA,MAAA,CAAO,yBAAyB,wBAAA,GAA2B,EAAA;AAAA,MAC7D;AAEA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,QAAA,CAAS,MAAM,CAAA,CAAE,WAAA,CAAY,GAAG,KAAK,CAAA;AAC5D,MAAA,aAAA,GAAgB,WAAW,IAAA,GAAO,IAAA;AAClC,MAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,MAAM,KAAK,cAAA,CAAe;AAAA,QAC7C,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,gBAAA;AAAA,QACP,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB;AAAA,OACD,CAAA;AACD,MAAA,MAAA,CAAO,sBAAA,GAAyB,aAAA;AAChC,MAAA,MAAA,CAAO,iBAAA,GAAoB,GAAA;AAC3B,MAAA,MAAA,CAAO,oBAAA,GAAuB,GAAA;AAAA,IAChC,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,yBAAA,EAA2B,SAAA,EAAW,2BAAA,EAA6B,MAAA,EAAQ,KAAK,CAAA;AACpF,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,MAAA,CAAO,yBAAyB,wBAAA,GAA2B,EAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,MAAA,EAAa;AAC1B,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,OAAO,gCAAgC,CAAA;AACjE,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,sBAAA;AAAA,MACA,2BAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,kBAAA;AAAA,MACA,cAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,sBAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY;AAAA,QACV,GAAG,MAAA;AAAA,QACH,sBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,MAAM,EAAC;AAAA,MACP,YAAA,EAAc,GAAA;AAAA,MACd,iBAAA,EAAmB,EAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,GAAA;AAAA,MACtB,YAAA,EAAc,CAAA;AAAA;AAAA,MACd,cAAcD,wBAAA,CAAoBD,oBAAA,CAAI,SAAA,IAAa,CAAC,EAAE,GAAA,CAAI,EAAA,IAAM,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,SAAA,CAAU,QAAA,EAAU,CAAC,CAAC;AAAA,KAClI;AAEA,IAAA,MAAM,WAAW,IAAIG,aAAA,CAAS,EAAE,IAAA,EAAM,aAAa,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAST,YAAA,CAAQ,OAAO,CAAA;AAE/I,IAAA,MAAM,QAAA,GAAWI,gCAAuB,SAAS,CAAA;AAEjD,IAAA,MAAM,cAAc,IAAIF,aAAA,CAAO,SAAS,sBAAA,EAAwB,GAAA,EAAK,KAAK,MAAM,CAAA;AAChF,IAAA,MAAM,kBAAkB,IAAIA,aAAA,CAAO,QAAA,CAAS,sBAAA,EAAwB,KAAK,QAAQ,CAAA;AAGjF,IAAA,QAAA,CAAS,UAAA,EAAW;AAGpB,IAAA,MAAM,gBAAA,GAAmB,cAAA,GAAiB,eAAA,CAAgB,yBAAA,GAA4B,eAAA,CAAgB,mBAAA;AACtG,IAAA,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,UAAA,EAAY,sBAAA,EAAwB,gBAAgB,CAAA;AAC7E,IAAA,QAAA,CAAS,IAAI,kBAAkB,CAAA;AAE/B,IAAA,MAAM,kBAAA,GAAqB,mBAAA,GAAsB,oBAAA,CAAqB,wBAAA,GAA4B,qBAAqB,kBAAA,IAAsB,GAAA;AAC7I,IAAA,IAAI,oBAAA,GAAuB,CAAA;AAE3B,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,OAAA,GAAU,MAAMQ,gDAAA,CAAqC;AAAA,MACzD,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,QAAA,CAAS,IAAI,sCAAsC,CAAA;AACnD,IAAA,IAAI,QAAQ,sBAAA,EAAwB;AAClC,MAAA,oBAAA,GAAuBC,wBAAA,CAAiB,OAAA,CAAQ,SAAS,CAAA,IAAK,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,sBAAA,GAAyB,OAAA,CAAQ,UAAA,EAAW,CAAE,KAAA,EAAM;AACxD,IAAA,IAAI,CAAC,sBAAsB,oBAAA,EAAsB;AAC/C,MAAA,sBAAA,GAAyB,QAAQ,UAAA,EAAW,CAAE,2BAA2B,kBAAA,EAAoB,oBAAoB,EAAE,KAAA,EAAM;AAAA,IAC3H;AAGA,IAAA,MAAM,SAAA,GAAiB;AAAA,MACrB,MAAA;AAAA,MACA,EAAA,EAAIC,wBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAA;AAAA,MACjD,QAAA,EAAU,SAAA;AAAA,MACV,WAAA,EAAa,EAAA;AAAA,MACb,YAAA,EAAc,sBAAA;AAAA,MACd,UAAA,EAAY,IAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAGA,IAAA,IAAI,kBAAA,EAAoB;AAEtB,MAAA,SAAA,CAAU,SAAS,gBAAA,CAAiB,GAAA;AACpC,MAAA,SAAA,CAAU,EAAA,GAAKA,wBAAA,CAAiB,KAAA,EAAO,gBAAA,CAAiB,mBAAmB,CAAA;AAE3E,MAAA,IAAI,oBAAA,GAAuB,OAAA,CAAQ,UAAA,EAAW,CAAE,KAAA,EAAM;AACtD,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,GAAuB,QAAQ,UAAA,EAAW,CAAE,2BAA2B,kBAAA,EAAoB,oBAAoB,EAAE,KAAA,EAAM;AAAA,MACzH;AAEA,MAAA,MAAM,mBAAA,GAAsB;AAAA,QAC1B,MAAA;AAAA,QACA,EAAA,EAAIA,wBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAA;AAAA,QACjD,UAAU,SAAA,CAAU,QAAA;AAAA,QACpB,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,YAAA,EAAc,oBAAA;AAAA,QACd,UAAA,EAAY,IAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACV;AACA,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,MAAM,SAAA,GAAY,MAAMC,oBAAA,CAAa;AAAA,QACnC,SAAA,EAAW,mBAAA;AAAA,QACX;AAAA,OACD,CAAA;AACD,MAAA,QAAA,CAAS,IAAI,cAAc,CAAA;AAE3B,MAAA,SAAA,CAAU,YAAA,GAAe,OAAA,CAAQ,UAAA,EAAW,CACzC,wBAAA,CAAyB,CAAA,EAAG,eAAA,CAAgB,gBAAA,IAAoB,GAAA,EAAQ,SAAS,CAAA,CACjF,KAAA,EAAM;AACT,MAAA,MAAM,QAAA,GAAWX,aAAA,CAAO,QAAA,CAAS,eAAA,EAAgB;AACjD,MAAA,SAAA,CAAU,aAAa,QAAA,CAAS,MAAA;AAAA,QAC9B,CAAC,6HAA6H,CAAA;AAAA,QAC9H,CAAC,MAAA,CAAO,MAAA,CAAO,mBAAmB,CAAC;AAAA,OACrC;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,QAAA,CAAS,WAAW,SAAS,CAAA;AACnE,MAAA,MAAM,KAAK,UAAU,CAAA,GAAI,OAAA;AACzB,MAAA,SAAA,CAAU,WAAA,GAAc,WAAW,CAAC,CAAA,IAAK,WAAW,MAAA,CAAO,iBAAA,GAAoB,GAAK,CAAA,CAAA,GAAK,QAAA;AAEzF,MAAA,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAAA,IACpC;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,eAAA,CAAgB,SAAA,CAAU,UAAA,CAAW,SAAA,EAAW,YAAY;AAAA,KAC9D;AACA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,UAAA,CAAW,IAAA;AAAA,QACT,KAAK,SAAA,CAAU;AAAA,UACb,GAAA;AAAA,UACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,UAC3B,OAAA,EAAS,sBAAA;AAAA,UACT,OAAA,EAAS,QAAA;AAAA,UACT,SAAA;AAAA,UACA;AAAA,SACD;AAAA,OACH;AAAA,IACF;AACA,IAAA,MAAM,CAAC,MAAA,EAAQ,eAAe,IAAI,MAAM,OAAA,CAAQ,IAAI,UAAU,CAAA;AAE9D,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAA,CAAO,cAAc,eAAA,EAAiB,WAAA;AAAA,IACxC;AACA,IAAA,QAAA,CAAS,IAAI,oCAAoC,CAAA;AAGjD,IAAA,IAAI,YAAA,GAAe,OAAO,CAAC,CAAA;AAC3B,IAAA,MAAM,QAAA,GAAW,OAAO,CAAC,CAAA;AACzB,IAAA,MAAA,CAAO,sBAAA,GAAyB,YAAA;AAGhC,IAAA,YAAA,GAAe,eAAeY,8BAAA,GAAwB,IAAA;AAMtD,IAAA,MAAM,eAAeR,oBAAA,CAAI,YAAA,EAAc,UAAS,IAAK,CAAC,EAAE,GAAA,CAAI,EAAA,IAAM,UAAU,WAAA,CAAY,QAAQ,EAAE,KAAA,CAAME,aAAA,CAAS,QAAQ,SAAA,CAAU,WAAA,CAAY,MAAM,CAAC,CAAA;AACtJ,IAAA,MAAA,CAAO,KAAK,SAAA,GAAYD,wBAAA,CAAoBD,qBAAI,YAAA,EAAc,QAAA,MAAc,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,SAAA,CAAU,YAAY,QAAQ,CAAA,CAAE,QAAQ,SAAA,CAAU,WAAA,CAAY,QAAQ,CAAC,CAAA;AAChK,IAAA,MAAA,CAAO,IAAA,CAAK,eAAeC,wBAAA,CAAoBD,oBAAA,CAAI,YAAY,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAC5E,IAAA,MAAA,CAAO,KAAK,aAAA,GAAgBC,wBAAA,CAAoBD,oBAAA,CAAI,QAAA,EAAU,UAAS,IAAK,CAAC,CAAA,CAAE,GAAA,CAAI,MAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAGxH,IAAA,IAAI,kBAAkB,mBAAA,EAAqB;AACzC,MAAA,MAAA,CAAO,IAAA,CAAK,mBAAmBC,wBAAA,CAAoBD,oBAAA,CAAI,aAAa,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,MAAA,CAAO,UAAU,QAAQ,CAAA,CAAE,MAAMS,uCAA+B,CAAA,CAAE,QAAQ,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAC,CAAA;AACrL,MAAA,MAAA,CAAO,YAAA,GAAeR,wBAAA,CAAoBD,oBAAA,CAAIA,oBAAA,CAAI,SAAA,IAAa,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,gBAAA,IAAoB,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IACxL;AAEA,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,SAAA;AAAA,MACA;AAAA,QACE,SAAA,EAAW,YAAA;AAAA,QACX,UAAA,EAAY;AAAA,OACd;AAAA,MACA,QAAA;AAAA,MACA,EAAE,OAAO,YAAA;AAAa,KACxB;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,WAAA;AAAA,MACV,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,cAAA;AAAA,MACP,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,0BAA0B,GAAA,CAAI,iBAAA;AACrC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,cAAA,CAAe,CAAC,CAAA,CAAE,QAAA,GAAW,GAAA,CAAI,sBAAA;AACjC,IAAA,QAAA,CAAS,IAAI,kBAAkB,CAAA;AAE/B,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,QAAA,EAAU,WAAA;AAAA,MACV,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAGA,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,IAAA,EAAM;AAChC,MAAA,IAAI,WAAA,CAAY,SAAS,MAAM,CAAA,IAAK,CAAC,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACxD,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,YAAA,GAAeA,oBAAA,CAAI,MAAA,CAAO,YAAA,IAAgB,CAAC,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,IAAK,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,MAAA,CAAO,YAAA,GAAeC,yBAAoBD,oBAAA,CAAI,MAAA,CAAO,YAAY,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAE9E,IAAA,QAAA,CAAS,SAAS,UAAU,CAAA;AAE5B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,MAAA,EAAa;AACjC,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAKJ,IAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,GAAS,CAAA;AACtC,IAAA,MAAM,SAAA,GAAY,MAAM,cAAc,CAAA,IAAK,OAAO,KAAA,CAAM,cAAc,CAAA,KAAM,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,KAAA,CAAM,cAAc,CAAC,CAAA,GACxH,EAAE,GAAG,KAAA,CAAM,cAAc,CAAA,EAAE,GAC3B,EAAC;AAEL,IAAA,IAAI,CAAC,UAAU,YAAA,EAAc;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,EAAW;AAC/C,QAAA,IAAI,QAAQ,YAAA,EAAc;AAExB,UAAA,SAAA,CAAU,YAAA,GAAgB,OAAA,CAAQ,YAAA,GAAe,IAAA,GAAQ,IAAA;AAAA,QAC3D;AACA,QAAA,IAAI,OAAA,CAAQ,oBAAA,IAAwB,CAAC,SAAA,CAAU,oBAAA,EAAsB;AACnE,UAAA,SAAA,CAAU,uBAAuB,OAAA,CAAQ,oBAAA;AAAA,QAC3C;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,GAAA,CAAI,qBAAA,EAAuB,SAAA,EAAW,2CAAA,EAA6C,KAAK,CAAA;AAAA,MAC/F;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,KAAK,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,cAAc,CAAA,IAAK,OAAO,MAAM,cAAc,CAAA,KAAM,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,cAAc,CAAC,CAAA,EAAG;AAC/G,MAAA,UAAA,CAAW,cAAc,CAAA,GAAI,SAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAC3B;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,MAAM,QAAA,CAAS,MAAM,CAAA,CAAE,GAAG,UAAU,CAAA;AAE/C,MAAA,OAAO,EAAA,CAAG,IAAA;AAAA,IACZ,SAAS,KAAA,EAAY;AACnB,MAAA,IAAA,CAAK,IAAI,qBAAA,EAAuB,SAAA,EAAW,4CAAA,EAA8C,KAAA,EAAO,MAAM,OAAO,CAAA;AAC7G,MAAA,IAAI,kBAAA,GAAqB,CAAA,oBAAA,EAAuB,KAAA,CAAM,OAAO,CAAA,CAAA;AAC7D,MAAA,IAAI,KAAA,EAAO,OAAA,EAAS,QAAA,CAAS,sBAAsB,CAAA,EAAG;AACpD,QAAA,kBAAA,GAAqB,KAAA,CAAM,OAAA;AAAA,MAC7B;AACA,MAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,IACpC;AAAA,EAcF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,CAAM,IAAA,EAAe,MAAA,EAAa;AACtC,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAKU,YAAA,CAAQ,IAAA;AACX,QAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,MACpC,KAAKA,YAAA,CAAQ,KAAA;AACX,QAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,MACnC,KAAKA,YAAA,CAAQ,QAAA;AACX,QAAA,OAAO,MAAM,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA;AAAA,MAC7C,KAAKA,YAAA,CAAQ,MAAA;AACX,QAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAAA,MACtC,KAAKA,YAAA,CAAQ,QAAA;AACX,QAAA,OAAO,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAAA,MACxC;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAE,CAAA;AAAA;AACrD,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAA,CAAK,IAAA,EAAgB,MAAA,EAAa;AACtC,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAKC,aAAA,CAAS,IAAA;AACZ,QAAA,OAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAAA,MAC1C,KAAKA,aAAA,CAAS,QAAA;AACZ,QAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,MACnC;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAE,CAAA;AAAA;AACpD,EACF;AAAA,EAEA,MAAM,UAAU,MAAA,EAAa;AAC3B,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,YAAA;AAAA,MACA,GAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA;AAAA,MAEA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,YAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY;AAAA,QACV,YAAA;AAAA,QACA,iBAAA;AAAA,QACA,YAAA;AAAA,QACA,GAAG;AAAA,OACL;AAAA,MACA,MAAM,EAAC;AAAA,MACP,YAAA,EAAc,MAAA;AAAA,MACd,iBAAA,EAAmB,MAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,MAAA;AAAA,MACtB,cAAc,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,CAAC,CAAA,GAAI,CAAA;AAAA,MAC9C,YAAA,EAAcV,wBAAA,CAAoBD,oBAAA,CAAI,SAAA,IAAa,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,CAAC,CAAC;AAAA,KACpH;AAEA,IAAA,MAAM,QAAA,GAAWF,gCAAuB,SAAS,CAAA;AAEjD,IAAA,MAAM,WAAW,IAAIK,aAAA,CAAS,EAAE,IAAA,EAAM,YAAY,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAST,YAAA,CAAQ,OAAO,CAAA;AAE9I,IAAA,MAAM,gBAAgB,IAAIE,aAAA,CAAO,SAAS,YAAA,EAAc,GAAA,EAAK,KAAK,MAAM,CAAA;AACxE,IAA0B,IAAIA,aAAA,CAAO,QAAA,CAAS,YAAA,EAAc,KAAK,QAAQ;AAEzE,IAAA,IAAI,aAAA,GAAgB,SAAA;AACpB,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,cAAc,YAAY;AAC9B,MAAA,IAAIgB,UAAAA,GAAY,EAAA;AAChB,MAAA,IAAI;AACF,QAAAA,UAAAA,GAAY,MAAM,aAAA,CAAc,UAAA,CAAW,QAAQ,CAAA;AAAA,MACrD,SAAS,KAAA,EAAO;AAAA,MAChB;AACA,MAAA,OAAOA,UAAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,WAAA,GAAc;AAAA,MAClBR,gDAAA,CAAqC;AAAA,QACnC,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,MACD,WAAA,EAAY;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,GAAA;AAAA,QACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,QAC3B,OAAA,EAAS,QAAA;AAAA,QACT,OAAA,EAAS,YAAA;AAAA,QACT,SAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AACA,IAAA,MAAM,CAAC,SAAS,SAAA,EAAW,SAAS,IAAS,MAAM,OAAA,CAAQ,IAAI,WAAW,CAAA;AAC1E,IAAA,QAAA,CAAS,GAAA,CAAI,iDAAA,EAAmD,2CAAA,EAA6C,OAAA,EAAS,WAAW,SAAS,CAAA;AAC1I,IAAA,MAAA,CAAO,yBAAyB,OAAA,CAAQ,sBAAA;AACxC,IAAA,IAAI,QAAQ,sBAAA,EAAwB;AAClC,MAAA,aAAA,GAAgB,OAAA,CAAQ,sBAAA;AAAA,IAC1B;AACA,IAAA,MAAA,CAAO,cAAc,SAAA,CAAU,WAAA;AAE/B,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,YAAA,GAAe,MAAMS,sBAAA,CAAe;AAAA,MACxC,OAAA,EAAS,QAAA;AAAA,MACT,MAAA,EAAQZ,wBAAA,CAAoBD,oBAAA,CAAI,SAAA,IAAa,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,MAC5G,qBAAA,EAAuB,iBAAA;AAAA,MACvB,eAAA,EAAiB,aAAA;AAAA,MACjB,gBAAA,EAAkB,YAAA;AAAA,MAClB,UAAA,EAAY,OAAO,SAAS;AAAA,KAC7B,CAAA;AACD,IAAA,MAAM;AAAA,MACJ,UAAA;AAAA,MACA,kBAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF,GAAI,YAAA;AACJ,IAAA,QAAA,CAAS,IAAI,gBAAgB,CAAA;AAE7B,IAAA,MAAA,CAAO,IAAA,CAAK,kBAAA,GAAqBC,wBAAA,CAAoBD,oBAAA,CAAI,YAAY,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,UAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAC,CAAA;AACjI,IAAA,MAAA,CAAO,IAAA,CAAK,YAAA,GAAeC,wBAAA,CAAoBD,oBAAA,CAAI,cAAc,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,UAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAC,CAAA;AAC7H,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,SAAS,CAAA,GAAI,OAAO,QAAQ,CAAA;AACzD,IAAA,MAAA,CAAO,YAAA,GAAeC,wBAAA,CAAoBD,oBAAA,CAAI,cAAA,IAAkB,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,CAAC,CAAC,CAAA;AAE/H,IAAA,MAAM,YAAA,GAAe;AAAA;AAAA,MAEnB,SAAA;AAAA;AAAA,MAEA,aAAA;AAAA;AAAA,MAEA,iBAAA;AAAA;AAAA,MAEAM,wBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,aAAa,CAAA;AAAA;AAAA,MAEjD,SAAA,CAAU,eAAA;AAAA;AAAA,MAEV,kBAAA,GAAqBA,wBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,kBAAkB,CAAA,GAAI,oEAAA;AAAA;AAAA,MAE/E,OAAA;AAAA;AAAA,MAEA,kBAAA;AAAA;AAAA,MAEA;AAAA,KACF;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,aAAA;AAAA,MACV,MAAA,EAAQ,gBAAA;AAAA,MACR,KAAA,EAAO,YAAA;AAAA,MACP,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,YAAA,CAAa,IAAA,CAAK,EAAE,QAAA,EAAU,GAAA,CAAI,wBAAwB,CAAA;AAC1D,IAAA,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAElC,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,MAAA,EAAQ,gBAAA;AAAA,MACR,QAAA,EAAU,aAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAGA,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,IAAA,EAAM;AAChC,MAAA,IAAI,WAAA,CAAY,SAAS,MAAM,CAAA,IAAK,CAAC,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACxD,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,YAAA,GAAeN,oBAAA,CAAI,MAAA,CAAO,YAAA,IAAgB,CAAC,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,IAAK,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,MAAA,CAAO,YAAA,GAAeC,yBAAoBD,oBAAA,CAAI,MAAA,CAAO,YAAY,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAE9E,IAAA,QAAA,CAAS,SAAS,WAAW,CAAA;AAE7B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,MAAA,EAAa;AACpC,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,YAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,QAAA,GAAW,IAAIG,aAAA,CAAS,EAAE,MAAM,CAAA,aAAA,EAAgB,SAAA,CAAU,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,WAAA,EAAa,OAAA,EAAST,YAAA,CAAQ,OAAO,CAAA;AAE5H,IAAA,MAAM,MAAA,GAAc,EAAE,IAAA,EAAM,EAAC,EAAE;AAE/B,IAAA,MAAM,QAAA,GAAWI,gCAAuB,SAAS,CAAA;AAEjD,IAAA,MAAM,gBAAgB,IAAIF,aAAA,CAAO,SAAS,YAAA,EAAc,GAAA,EAAK,KAAK,MAAM,CAAA;AACxE,IAAA,MAAM,UAAA,GAAkB;AAAA;AAAA,MAEtB,SAAA,CAAU,eAAA;AAAA;AAAA,MAEV,cAAA;AAAA;AAAA,MAEA;AAAA,KACF;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,KAAK,SAAA,CAAU;AAAA,QACb,GAAA;AAAA,QACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,QAC3B,OAAA,EAAS,QAAA;AAAA,QACT,OAAA,EAAS,YAAA;AAAA,QACT,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,MACD,KAAK,mBAAA,CAAoB;AAAA,QACvB,GAAA;AAAA,QACA,QAAA,EAAU,aAAA;AAAA,QACV,MAAA,EAAQ,eAAA;AAAA,QACR,KAAA,EAAO,UAAA;AAAA,QACP,SAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AACA,IAAA,MAAM,CAAC,SAAA,EAAW,GAAG,IAAS,MAAM,OAAA,CAAQ,IAAI,WAAW,CAAA;AAC3D,IAAA,MAAA,CAAO,cAAc,SAAA,CAAU,WAAA;AAC/B,IAAA,MAAA,CAAO,cAAA,GAAiB,YAAA;AACxB,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,UAAA,CAAW,IAAA,CAAK,EAAE,QAAA,EAAU,GAAA,CAAI,wBAAwB,CAAA;AACxD,IAAA,QAAA,CAAS,IAAI,iCAAiC,CAAA;AAE9C,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,MAAA,EAAQ,eAAA;AAAA,MACR,QAAA,EAAU,aAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,QAAA,CAAS,SAAS,oBAAoB,CAAA;AAEtC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,MAAA,EAAa;AAC7B,IAAA,MAAM;AAAA,MACJ,aAAA;AAAA,MACA,mBAAA;AAAA,MACA,GAAG;AAAA,KACL,GAAI,MAAA;AACJ,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF,GAAI,UAAA;AAEJ,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,GAAG,aAAA;AAAA,MACH,MAAM,EAAC;AAAA,MACP,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,mBAAA;AAAA,MAChB,UAAA,EAAY;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MACA,SAAA,EAAW;AAAA,QACT,WAAW,aAAA,CAAc;AAAA,OAC3B;AAAA,MACA,YAAA,EAAc,MAAA;AAAA,MACd,iBAAA,EAAmB,MAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,MAAA;AAAA,MACtB,cAAc,aAAA,CAAc,QAAA,KAAa,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,GAAA;AAAA,MACzH,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,MAAM,WAAW,IAAIO,aAAA,CAAS,EAAE,IAAA,EAAM,cAAc,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAST,YAAA,CAAQ,OAAO,CAAA;AAEhJ,IAAiBI,gCAAuB,SAAS;AAEjD,IAAA,MAAM,oBAAoB,YAAY;AACpC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,UACzC,GAAA;AAAA,UACA,SAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,MAAA,CAAO,YAAA,GAAe,cAAc,gBAAA,GAAmB,EAAA;AACvD,QAAA,MAAA,CAAO,IAAA,GAAO;AAAA,UACZ,gBAAgB,GAAA,CAAI,oBAAA;AAAA,UACpB,cAAc,aAAA,CAAc,YAAA;AAAA,UAC5B,yBAAyB,aAAA,CAAc;AAAA,SACzC;AACA,QAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,QAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,QAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,QAAA,MAAA,CAAO,YAAA,GAAeG,yBAAoBD,oBAAA,CAAI,aAAA,CAAc,WAAW,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,MACtF,CAAA,MACK;AACH,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,UACzC,GAAA;AAAA,UACA,SAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA;AAAA,UACA,WAAW,aAAA,CAAc,SAAA;AAAA,UACzB;AAAA,SACD,CAAA;AAED,QAAA,MAAA,CAAO,eAAeA,oBAAA,CAAI,aAAA,CAAc,SAAA,IAAa,CAAC,EAAE,GAAA,CAAI,EAAA,KAAO,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,QAAA,IAAY,GAAG,CAAC,CAAA;AAC3H,QAAA,MAAA,CAAO,IAAA,GAAO;AAAA,UACZ,gBAAgB,GAAA,CAAI,oBAAA;AAAA;AAAA,UAEpB,YAAA,EAAcC,yBAAoBD,oBAAA,CAAI,SAAA,IAAa,CAAC,CAAA,CAAE,GAAA,CAAI,OAAO,SAAA,CAAU,QAAA,IAAY,EAAE,CAAA,CAAE,KAAA,CAAM,cAAc,SAAA,CAAU,OAAA,IAAW,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAA,EAAI,CAAC,CAAC,CAAA;AAAA;AAAA,UAErJ,uBAAA,EAAyB;AAAA,SAC3B;AACA,QAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,QAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,QAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,QAAA,MAAA,CAAO,YAAA,GAAeC,yBAAoBD,oBAAA,CAAI,aAAA,CAAc,sBAAsB,CAAC,CAAA,CAAE,MAAM,aAAA,CAAc,SAAS,EAAE,GAAA,CAAI,EAAA,KAAO,UAAU,QAAA,IAAY,CAAA,CAAE,EAAE,OAAA,CAAQ,EAAA,EAAI,CAAC,CAAC,CAAA;AACvK,QAAA,MAAA,CAAO,SAAA,CAAU,WAAW,GAAA,CAAI,sBAAA;AAAA,MAClC;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,KAAK,SAAA,CAAU;AAAA,QACb,GAAA;AAAA,QACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,QAC3B,OAAA,EAAS,mBAAA;AAAA,QACT,OAAA,EAAS,QAAA;AAAA,QACT;AAAA,OACD,CAAA;AAAA,MACD,iBAAA;AAAkB,KACpB;AACA,IAAA,MAAM,CAAC,eAAe,CAAA,GAAS,MAAM,OAAA,CAAQ,IAAI,WAAW,CAAA;AAC5D,IAAA,MAAA,CAAO,cAAc,eAAA,CAAgB,WAAA;AACrC,IAAA,QAAA,CAAS,IAAI,+BAA+B,CAAA;AAE5C,IAAA,QAAA,CAAS,SAAS,aAAa,CAAA;AAE/B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,MAAA,EAAa;AAC/B,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM;AAAA,MACJ,GAAA,EAAK,MAAA;AAAA,MACL,SAAA;AAAA,MACA;AAAA,KACF,GAAI,eAAA;AACJ,IAAA,MAAM;AAAA,MACJ,GAAA,EAAK;AAAA,KACP,GAAI,oBAAA;AAEJ,IAAA,MAAM,cAAA,GAAiB,UAAU,OAAA,KAAY,CAAA;AAE7C,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,SAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MACA,MAAM,EAAC;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,iBAAA,EAAmB,EAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,CAAA;AAAA,MACtB,YAAA,EAAc,CAAA;AAAA,MACd,cAAcC,wBAAA,CAAoBD,oBAAA,CAAI,SAAA,IAAa,CAAC,EAAE,GAAA,CAAI,EAAA,IAAM,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,SAAA,CAAU,QAAA,EAAU,CAAC,CAAC;AAAA,KAClI;AAEA,IAAA,MAAM,QAAA,GAAWF,gCAAuB,SAAS,CAAA;AAEjD,IAAA,MAAM,WAAW,IAAIK,aAAA,CAAS,EAAE,IAAA,EAAM,gBAAgB,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAST,YAAA,CAAQ,OAAO,CAAA;AAElJ,IAAA,MAAM,oBAAoB,IAAIE,aAAA,CAAO,SAAS,SAAA,EAAW,GAAA,EAAK,KAAK,MAAM,CAAA;AACzE,IAAA,MAAM,wBAAwB,IAAIA,aAAA,CAAO,QAAA,CAAS,SAAA,EAAW,KAAK,QAAQ,CAAA;AAI1E,IAAA,MAAM,UAAA,GAAa;AAAA;AAAA,MAEjB,cAAA,GAAiB,UAAU,SAAA,CAAU,eAAA;AAAA;AAAA,MAErC,MAAA;AAAA;AAAA,MAEAU,wBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAA;AAAA;AAAA,MAE7C;AAAA,KACF;AACA,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,KAAK,SAAA,CAAU;AAAA,QACb,GAAA;AAAA,QACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,QAC3B,OAAA,EAAS,SAAA;AAAA,QACT,OAAA,EAAS,QAAA;AAAA,QACT,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,MACD,qBAAA,CAAsB,KAAA,CAAM,UAAA,CAAW,GAAG,UAAU;AAAA,KACtD;AACA,IAAA,MAAM,CAAC,eAAA,EAAiB,MAAM,IAAS,MAAM,OAAA,CAAQ,IAAI,WAAW,CAAA;AACpE,IAAA,QAAA,CAAS,IAAI,8BAA8B,CAAA;AAE3C,IAAA,MAAA,CAAO,cAAc,eAAA,CAAgB,WAAA;AAErC,IAAA,IAAI,YAAA,GAAe,OAAO,CAAC,CAAA;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,UAAA,EAAY,kBAAA,EAAoB,YAAY,CAAA;AAG1E,IAAA,YAAA,GAAe,eAAeE,8BAAA,GAAwB,IAAA;AACtD,IAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,UAAA,EAAY,+BAAA,EAAiC,YAAY,CAAA;AACvF,IAAA,MAAA,CAAO,sBAAA,GAAyB,YAAA;AAEhC,IAAA,MAAM,eAAeR,oBAAA,CAAI,YAAA,EAAc,UAAS,IAAK,CAAC,EAAE,GAAA,CAAI,EAAA,IAAM,UAAU,WAAA,CAAY,QAAQ,EAAE,KAAA,CAAME,aAAA,CAAS,QAAQ,SAAA,CAAU,WAAA,CAAY,MAAM,CAAC,CAAA;AACtJ,IAAA,MAAA,CAAO,KAAK,SAAA,GAAYD,wBAAA,CAAoBD,qBAAI,YAAA,EAAc,QAAA,MAAc,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,SAAA,CAAU,YAAY,QAAQ,CAAA,CAAE,QAAQ,SAAA,CAAU,WAAA,CAAY,QAAQ,CAAC,CAAA;AAChK,IAAA,MAAA,CAAO,IAAA,CAAK,eAAeC,wBAAA,CAAoBD,oBAAA,CAAI,YAAY,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAC5E,IAAA,MAAA,CAAO,KAAK,aAAA,GAAgBC,wBAAA,CAAoBD,qBAAI,MAAA,CAAO,CAAC,GAAG,QAAA,EAAS,IAAK,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAEzH,IAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAE9D,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,iBAAiB,CAAC,GAAG,YAAY,EAAE,KAAA,EAAO,cAAc,CAAA;AAC9D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,iBAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,cAAA;AAAA,MACP,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,0BAA0B,GAAA,CAAI,iBAAA;AACrC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,CAAA,CAAE,WAAW,GAAA,CAAI,sBAAA;AACzD,IAAA,QAAA,CAAS,IAAI,6BAA6B,CAAA;AAG1C,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,QAAA,EAAU,iBAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAGA,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,IAAA,EAAM;AAChC,MAAA,IAAI,WAAA,CAAY,SAAS,MAAM,CAAA,IAAK,CAAC,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACxD,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,YAAA,GAAeA,oBAAA,CAAI,MAAA,CAAO,YAAA,IAAgB,CAAC,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,IAAK,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,MAAA,CAAO,YAAA,GAAeC,yBAAoBD,oBAAA,CAAI,MAAA,CAAO,YAAY,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAE9E,IAAA,QAAA,CAAS,SAAS,eAAe,CAAA;AAEjC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,oBAAoB,MAAA,EAAa;AACrC,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAA;AAAA,MACA,oBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAIJ,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,EAAA;AAAA,QACT,MAAA,EAAQ,EAAA;AAAA,QACR,eAAA,EAAiB,EAAA;AAAA;AAAA,QAEjB,gBAAgB,MAAA,CAAOA,oBAAA,CAAI,aAAa,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAMc,kCAAA,CAA2B,QAAQ,EAAE,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,QACvI,uBAAA,EAAyB;AAAA,OAC3B;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAIX,aAAA,CAAS,EAAE,MAAM,CAAA,iCAAA,EAAoC,SAAA,CAAU,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,WAAA,EAAa,OAAA,EAAST,YAAA,CAAQ,OAAO,CAAA;AAEhJ,IAAA,MAAM,QAAA,GAAWI,gCAAuB,SAAS,CAAA;AAGjD,IAAA,MAAM,gBAAgB,IAAIF,aAAA,CAAO,QAAA,CAAS,oBAAA,EAAsB,KAAK,QAAQ,CAAA;AAC7E,IAAA,MAAM,eAAe,IAAIA,aAAA,CAAO,QAAA,CAAS,mBAAA,EAAqB,KAAK,QAAQ,CAAA;AAC3E,IAAA,MAAM,aAAa,IAAIA,aAAA,CAAO,QAAA,CAAS,iBAAA,EAAmB,KAAK,QAAQ,CAAA;AAEvE,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,CAAC,QAAA,EAAU,cAAc,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACnD,aAAA,CAAc,cAAc,UAAA,EAAW;AAAA,MACvC,UAAA,CAAW,wBAAwB,UAAA;AAAW,KAC/C,CAAA;AACD,IAAA,QAAA,CAAS,IAAI,4BAA4B,CAAA;AAGzC,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,IAAA,MAAM,qBAAA,GAAwB,eAAe,CAAC,CAAA;AAG9C,IAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,UAAA,CAAW,gBAAA,CAAiB,WAAW,qBAAqB,CAAA;AAEnF,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,SAAA,IAAa,CAAC,CAAA;AAE7C,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,0DAAA,EAA4D,OAAO,CAAA;AACnH,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,uDAAA,EAAyD,MAAM,CAAA;AAC/G,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,eAAA,EAAiB,eAAe,CAAA;AAEhF,IAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,IAAA,IAAI,uBAAA,GAA0B,KAAA;AAE9B,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAE9B,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc,aAAA,CAAc,WAAW,eAAe,CAAA;AAC9E,MAAA,QAAA,CAAS,IAAI,yCAAyC,CAAA;AACtD,MAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,kEAAA,EAAoE,iBAAiB,SAAS,CAAA;AAC9I,MAAA,cAAA,GAAiB,SAAA;AACjB,MAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,oCAAA,EAAsC,cAAc,CAAA;AAAA,IACtG,CAAA,MAAO;AAEL,MAAA,IAAI,UAAU,EAAA,EAAI;AAChB,QAAA,QAAA,CAAS,UAAA,EAAW;AACpB,QAAA,MAAM,aAAA,GAAgB,MAAM,aAAA,CAAc,aAAA,CAAc,WAAW,OAAO,CAAA;AAC1E,QAAA,QAAA,CAAS,IAAI,qCAAqC,CAAA;AAClD,QAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,wEAAA,EAA0E,SAAS,aAAa,CAAA;AAChJ,QAAA,cAAA,IAAkB,aAAA;AAClB,QAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,0CAAA,EAA4C,cAAc,CAAA;AAAA,MAC5G;AACA,MAAA,MAAM,YAAY,eAAA,GAAkB,OAAA;AACpC,MAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,kCAAA,EAAoC,SAAS,CAAA;AAC7F,MAAA,IAAI,YAAY,EAAA,EAAI;AAClB,QAAA,QAAA,CAAS,UAAA,EAAW;AACpB,QAAA,MAAM,uBAAA,GAA0B,MAAM,YAAA,CAAa,aAAA,CAAc,WAAW,SAAS,CAAA;AACrF,QAAA,QAAA,CAAS,IAAI,oCAAoC,CAAA;AACjD,QAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,yFAAA,EAA2F,WAAW,uBAAuB,CAAA;AAC7K,QAAA,QAAA,CAAS,UAAA,EAAW;AACpB,QAAA,MAAM,CAAC,YAAY,CAAA,GAAI,MAAM,UAAA,CAAW,gBAAA,CAAiB,WAAW,uBAAuB,CAAA;AAC3F,QAAA,QAAA,CAAS,IAAI,qCAAqC,CAAA;AAClD,QAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,uEAAA,EAAyE,WAAW,YAAY,CAAA;AAChJ,QAAA,cAAA,IAAkB,YAAA;AAClB,QAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,uCAAA,EAAyC,cAAc,CAAA;AAEvG,QAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,UAAA,uBAAA,GAA0B,IAAA;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,0BAAA,EAA4B,cAAc,CAAA;AAC1F,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,kCAAA,EAAoC,uBAAuB,CAAA;AAE3G,IAAA,QAAA,CAAS,SAAS,qBAAqB,CAAA;AAEvC,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,MAAA,EAAa;AACnC,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,IAAA,CAAK,GAAA,CAAI,uBAAA,EAAyB,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAElE,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,EAAA;AAAA,QACT,eAAA,EAAiB,EAAA;AAAA,QACjB,QAAA,EAAU,EAAA;AAAA;AAAA,QAEV,gBAAgB,MAAA,CAAOI,oBAAA,CAAI,aAAa,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAMe,oCAAA,CAA6B,QAAQ,EAAE,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAC;AAAA,OAC3I;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAIZ,aAAA,CAAS,EAAE,MAAM,CAAA,+BAAA,EAAkC,SAAA,CAAU,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,WAAA,EAAa,OAAA,EAAST,YAAA,CAAQ,OAAO,CAAA;AAE9I,IAAA,MAAM,QAAA,GAAWI,gCAAuB,SAAS,CAAA;AAGjD,IAAA,MAAM,gBAAgB,IAAIF,aAAA,CAAO,QAAA,CAAS,oBAAA,EAAsB,KAAK,QAAQ,CAAA;AAE7E,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,aAAA,CAAc,UAAA,EAAW;AAC9D,IAAA,QAAA,CAAS,IAAI,6BAA6B,CAAA;AAE1C,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAE1B,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,SAAA,IAAa,CAAC,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,OAAA;AAEjB,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,cAAA,GAAiB,MAAM,aAAA,CAAc,cAAA,CAAe,WAAW,eAAe,CAAA;AACpF,IAAA,QAAA,CAAS,IAAI,8BAA8B,CAAA;AAE3C,IAAA,QAAA,CAAS,SAAS,mBAAmB,CAAA;AAErC,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,MAAA,EAAa;AAC9B,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA;AAAA,MACA,oBAAA;AAAA,MACA,mBAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAG7D,IAAA,MAAM,kBAAA,GAAqB,EAAA;AAC3B,IAAA,MAAM,YAAA,GAAgB,qBAAqB,CAAA,GAAK,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,CAAA;AAEjF,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,4BAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MACA,MAAM,EAAC;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,iBAAA,EAAmB,EAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,CAAA;AAAA,MACtB,YAAA;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,MAAM,QAAA,GAAWE,gCAAuB,SAAS,CAAA;AAEjD,IAAA,MAAM,WAAW,IAAIK,aAAA,CAAS,EAAE,IAAA,EAAM,6BAA6B,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAST,YAAA,CAAQ,OAAO,CAAA;AAE/J,IAA2B,IAAIE,aAAA,CAAO,QAAA,CAAS,4BAAA,EAA8B,KAAK,QAAQ;AAC1F,IAAA,MAAM,iBAAiB,IAAIA,aAAA,CAAO,SAAS,4BAAA,EAA8B,GAAA,EAAK,KAAK,MAAM,CAAA;AAEzF,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,IAAI,wBAAA,GAA2B,mBAAA;AAC/B,IAAA,IAAI,CAAC,wBAAA,EAA0B;AAC7B,MAAA,wBAAA,GAA2B,MAAM,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA;AAAA,IAClE;AACA,IAAA,MAAM;AAAA,MACJ,uBAAA;AAAA,MACA;AAAA,KACF,GAAI,wBAAA;AACJ,IAAA,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAElC,IAAA,IAAI,uBAAA,EAAyB;AAC3B,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAGA,IAAA,MAAA,CAAO,YAAA,GAAeK,wBAAA;AAAA,MACpBD,oBAAA,CAAI,cAAA,CAAe,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAC;AAAA,KACxF;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,SAAA,CAAU;AAAA,MAC3C,GAAA;AAAA,MACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,MAC3B,OAAA,EAAS,4BAAA;AAAA,MACT,OAAA,EAAS,QAAA;AAAA,MACT,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,cAAc,eAAA,CAAgB,WAAA;AACrC,IAAA,QAAA,CAAS,IAAI,WAAW,CAAA;AAExB,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,QAAA,EAAU,cAAA;AAAA,MACV,MAAA,EAAQ,yBAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL,SAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,cAAA;AAAA,MACV,MAAA,EAAQ,OAAO,SAAA,CAAU,MAAA;AAAA,MACzB,KAAA,EAAO,CAAC,GAAG,MAAA,CAAO,UAAU,KAAA,EAAO,EAAE,QAAA,EAAU,wBAAA,EAA0B,CAAA;AAAA,MACzE,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,MAAA,CAAO,eAAe,GAAA,CAAI,oBAAA;AAC1B,IAAA,MAAA,CAAO,UAAU,KAAA,CAAM,CAAC,IAAI,EAAE,QAAA,EAAU,IAAI,sBAAA,EAAuB;AACnE,IAAA,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAElC,IAAA,QAAA,CAAS,SAAS,cAAc,CAAA;AAEhC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,MAAA,EAAa;AAC5B,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAG3D,IAAA,MAAM,kBAAA,GAAqB,EAAA;AAC3B,IAAA,MAAM,YAAA,GAAgB,qBAAqB,CAAA,GAAK,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,CAAA;AAEjF,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,oBAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MACA,MAAM,EAAC;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,iBAAA,EAAmB,EAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,CAAA;AAAA,MACtB,YAAA;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,MAAM,WAAW,IAAIG,aAAA,CAAS,EAAE,IAAA,EAAM,2BAA2B,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAST,YAAA,CAAQ,OAAO,CAAA;AAE7J,IAAA,MAAM,QAAA,GAAWI,gCAAuB,SAAS,CAAA;AAEjD,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,SAAA,CAAU;AAAA,MAC3C,GAAA;AAAA,MACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,MAC3B,OAAA,EAAS,oBAAA;AAAA,MACT,OAAA,EAAS,QAAA;AAAA,MACT,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,cAAc,eAAA,CAAgB,WAAA;AACrC,IAAA,QAAA,CAAS,IAAI,WAAW,CAAA;AAExB,IAAsB,IAAIF,aAAA,CAAO,QAAA,CAAS,oBAAA,EAAsB,KAAK,QAAQ;AAC7E,IAAA,MAAM,0BAA0B,IAAIA,aAAA,CAAO,SAAS,oBAAA,EAAsB,GAAA,EAAK,KAAK,MAAM,CAAA;AAE1F,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,IAAI,sBAAA,GAAyB,iBAAA;AAC7B,IAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,MAAA,sBAAA,GAAyB,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAAA,IAC9D;AACA,IAAA,MAAM;AAAA,MACJ,OAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,GAAI,sBAAA;AACJ,IAAA,QAAA,CAAS,IAAI,mBAAmB,CAAA;AAEhC,IAAA,MAAA,CAAO,YAAA,GAAeK,wBAAA;AAAA,MACpBD,oBAAA,CAAI,cAAA,CAAe,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAC;AAAA,KACxF;AAEA,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,QAAA,EAAU,uBAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL,eAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,uBAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,CAAC,GAAG,MAAA,CAAO,UAAU,KAAA,EAAO,EAAE,QAAA,EAAU,wBAAA,EAA0B,CAAA;AAAA,MACzE,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,MAAA,CAAO,eAAe,GAAA,CAAI,oBAAA;AAC1B,IAAA,MAAA,CAAO,UAAU,KAAA,CAAM,CAAC,IAAI,EAAE,QAAA,EAAU,IAAI,sBAAA,EAAuB;AACnE,IAAA,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAElC,IAAA,QAAA,CAAS,SAAS,YAAY,CAAA;AAE9B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,MAAA,EAAa;AACnC,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA;AAAA,MACA,oBAAA;AAAA,MACA,4BAAA;AAAA,MACA,eAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,IAAA,CAAK,GAAA,CAAI,uBAAA,EAAyB,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAElE,IAAA,MAAM;AAAA,MACJ,GAAA,EAAK;AAAA,KACP,GAAI,oBAAA;AAGJ,IAAA,MAAM,kBAAA,GAAqB,EAAA;AAC3B,IAAA,MAAM,YAAA,GAAgB,qBAAqB,CAAA,GAAK,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,CAAA;AAEjF,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,4BAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MACA,MAAM,EAAC;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,iBAAA,EAAmB,EAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,CAAA;AAAA,MACtB,YAAA;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,MAAM,WAAW,IAAIG,aAAA,CAAS,EAAE,IAAA,EAAM,kCAAkC,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAST,YAAA,CAAQ,OAAO,CAAA;AAEpK,IAAA,MAAM,QAAA,GAAWI,gCAAuB,SAAS,CAAA;AAEjD,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,SAAA,CAAU;AAAA,MAC3C,GAAA;AAAA,MACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,MAC3B,OAAA,EAAS,4BAAA;AAAA,MACT,OAAA,EAAS,QAAA;AAAA,MACT,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,cAAc,eAAA,CAAgB,WAAA;AACrC,IAAA,QAAA,CAAS,IAAI,WAAW,CAAA;AAExB,IAAA,MAAM,kCAAkC,IAAIF,aAAA,CAAO,SAAS,4BAAA,EAA8B,GAAA,EAAK,KAAK,MAAM,CAAA;AAE1G,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,IAAI,sBAAA,GAAyB,iBAAA;AAC7B,IAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,MAAA,sBAAA,GAAyB,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAAA,IAC9D;AACA,IAAA,MAAM;AAAA,MACJ;AAAA,KACF,GAAI,sBAAA;AACJ,IAAA,QAAA,CAAS,IAAI,mBAAmB,CAAA;AAChC,IAAA,IAAA,CAAK,GAAA,CAAI,uBAAA,EAAyB,UAAA,EAAY,sCAAA,EAAwC,cAAc,CAAA;AAEpG,IAAA,MAAA,CAAO,YAAA,GAAeK,wBAAA;AAAA,MACpBD,oBAAA,CAAI,cAAA,CAAe,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,EAAE,CAAA,CAAE,OAAA,CAAQ,EAAA,EAAI,CAAC;AAAA,KAC5D;AAGA,IAAA,MAAM,gBAAA,GAAmB;AAAA;AAAA,MAEvB,SAAA;AAAA;AAAA,MAEA,MAAA;AAAA;AAAA,MAEAM,wBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,SAAS;AAAA,KAC/C;AAEA,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,QAAA,EAAU,+BAAA;AAAA,MACV,MAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,+BAAA;AAAA,MACV,MAAA,EAAQ,aAAA;AAAA,MACR,OAAO,CAAC,GAAG,kBAAkB,EAAE,QAAA,EAAU,0BAA0B,CAAA;AAAA,MACnE,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,MAAA,CAAO,eAAe,GAAA,CAAI,oBAAA;AAC1B,IAAA,MAAA,CAAO,UAAU,KAAA,CAAM,IAAA,CAAK,EAAE,QAAA,EAAU,GAAA,CAAI,wBAAwB,CAAA;AACpE,IAAA,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAElC,IAAA,QAAA,CAAS,SAAS,mBAAmB,CAAA;AAErC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,yBAAyB,MAAA,EAAa;AAC1C,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,OAAO,gCAAgC,CAAA;AACjE,IAAA,MAAM;AAAA,MACJ,aAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,mBAAA,GAAsB,4CAAA;AAC5B,IAAA,MAAM,sBAAA,GAAyB;AAAA,MAC7B;AAAA,QACE,QAAA,EAAU;AAAA,UACR;AAAA,YACE,cAAA,EAAgB,SAAA;AAAA,YAChB,MAAA,EAAQ,OAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,cAAA,EAAgB,SAAA;AAAA,YAChB,MAAA,EAAQ,KAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,cAAA,EAAgB,SAAA;AAAA,YAChB,MAAA,EAAQ,OAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,cAAA,EAAgB,QAAA;AAAA,YAChB,MAAA,EAAQ,QAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,cAAA,EAAgB,OAAA;AAAA,YAChB,MAAA,EAAQ,UAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,cAAA,EAAgB,OAAA;AAAA,YAChB,MAAA,EAAQ,YAAA;AAAA,YACR,MAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,MAAA,EAAQ,WAAA;AAAA,QACR,WAAW,EAAC;AAAA,QACZ,iBAAA,EAAmB,SAAA;AAAA,QACnB,MAAA,EAAQ;AAAA;AACV,KACF;AAEA,IAAA,MAAM,8BAA8B,IAAIV,aAAA,CAAO,SAAS,mBAAA,EAAqB,sBAAA,EAAwB,KAAK,MAAM,CAAA;AAEhH,IAAA,MAAM,OAAA,GAAeoB,eAAA,CAAW,OAAA,CAAQ,iBAAA,CAAkB,UAAqC,CAAA;AAC/F,IAAA,MAAM,SAAA,GAAYhB,oBAAA,CAAI,OAAA,CAAQ,eAAe,CAAA,CAAE,KAAA,CAAM,EAAA,KAAO,OAAA,CAAQ,QAAA,IAAY,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAE7F,IAAA,MAAM,eAAA,GAAkBiB,qBAAa,UAAU,CAAA;AAC/C,IAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,WAAA,CAAY,SAAA,CAAU,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,KAAM,eAAA,CAAgB,SAAA,EAAW,WAAA,EAAY;AACrI,IAA2B,cAAA,GAAiB,eAAA,CAAgB,wBAAA,GAA2B,eAAA,CAAgB;AAGvG,IAAA,MAAM,OAAA,GAAU,MAAMb,gDAAA,CAAqC;AAAA,MACzD,WAAW,OAAA,CAAQ,eAAA;AAAA,MACnB;AAAA,KACD,CAAA;AACD,IAAA,IAAI,QAAQ,sBAAA,EAAwB;AAClC,MAAuBC,wBAAA,CAAiB,OAAA,CAAQ,SAAS,CAAA,IAAK,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,WAAA,GAAc,aAAA,CAAc,MAAA,CAAO,EAAA,CAAG,IAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,MAAA,CAAO,EAAA,CAAG,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAAE,CAAC,CAAA;AAC1F,IAAA,MAAM,WAAWa,wCAAA,CAAgC;AAAA,MAC/C,KAAA,EAAO,cAAc,OAAA,CAAQ,KAAA;AAAA,MAC7B,MAAA,EAAQ,cAAc,OAAA,CAAQ,MAAA;AAAA,MAC9B,QAAA,EAAU,SAAA;AAAA,MACV,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,aAAA,CAAc,WAAA,CAAY,SAAA,CAAU,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA;AAAA,MAChD,aAAA,CAAc,WAAA,CAAY,SAAA,CAAU,QAAA,CAAS,CAAC,CAAA,CAAE,EAAA;AAAA,MAChD,aAAA,CAAc,IAAA;AAAA,MACd,aAAA,CAAc,WAAA,CAAY,SAAA,CAAU,QAAA,CAAS,CAAC,CAAA,CAAE,KAAA;AAAA,MAChD,QAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,MAAA,GAAS,cAAA,GAAiB,eAAA,CAAgB,GAAA,GAAM,eAAA,CAAgB,SAAA;AACtE,IAAA,MAAM,SAAA,GAAiB;AAAA,MACrB,MAAA,EAAQD,oBAAA,CAAa,OAAA,CAAQ,iBAAA,CAAkB,SAAS,CAAA,CAAE,GAAA;AAAA,MAC1D,EAAA,EAAIX,wBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,QAAQ,eAAe,CAAA;AAAA,MAC/D,QAAA,EAAU,SAAA;AAAA,MACV,WAAA,EAAa,EAAA;AAAA,MACb,YAAA,EAAc,OAAA,CAAQ,UAAA,EAAW,CAE9B,KAAA,EAAM;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,MAAM,iBAAiB,IAAIV,aAAA,CAAO,SAAS,MAAA,EAASuB,eAAA,EAAS,KAAK,QAAQ,CAAA;AAC1E,IAAA,MAAM,SAAS,MAAM,cAAA,CAAe,SAAA,CAAU,UAAA,CAAW,WAAW,KAAK,CAAA;AACzE,IAAA,IAAI,SAAA,GAAY,OAAO,CAAC,CAAA;AACxB,IAAA,SAAA,GAAY,YAAYX,8BAAA,GAAwB,IAAA;AAEhD,IAAA,MAAM,EAAA,GAAK,MAAM,2BAAA,CAA4B,SAAA;AAAA,MAC3C,GAAG,cAAA;AAAA,MACH;AAAA,QACE,QAAA,EAAU,gBAAgB,gBAAA,IAAoB,GAAA;AAAA,QAC9C,KAAA,EAAO;AAAA;AACT,KACF;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,IAAA,EAAK;AAEhC,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAO,SAAA,CAAU,IAAA;AAAA,IACnB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,MAAA,EAAa;AAC/B,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,OAAA,EAAQ,GAAI,MAAA;AAE1C,IAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAE9D,IAAA,MAAM,QAAA,GAAWV,gCAAuB,SAAS,CAAA;AAEjD,IAAA,MAAM,KAAA,GAAQ,SAAA;AACd,IAAA,MAAM,eAAe,SAAA,CAAU,eAAA;AAC/B,IAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAE1B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA;AACjE,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA;AAE5B,IAAA,MAAM,QAAQ,IAAIF,aAAA,CAAO,QAAA,CAAS,YAAA,EAAcC,eAAU,QAAQ,CAAA;AAClE,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA,EAAK;AAE9B,IAAA,IAAI,QAAA,GAAW,GAAA;AACf,IAAA,IAAI,SAAA,CAAU,WAAW,MAAA,EAAQ;AAC/B,MAAA,QAAA,GAAW,GAAA;AAAA,IACb;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,IAAA;AAAA,MACA,OAAA,EAAS,QAAA;AAAA,MACT,OAAA,EAAS,OAAO,OAAO,CAAA;AAAA,MACvB,iBAAA,EAAmB;AAAA,KACrB;AAEA,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,MAAA,EAAQ;AAAA,QACN,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,QACjC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,QACnC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,QACjC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,QACjC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA;AAAU;AACtC,KACF;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,KAAA,EAAO,OAAA;AAAA,MACP,OAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA,EAAO,MAAM,QAAA,EAAS;AAAA,MACtB;AAAA,KACF;AAEA,IAAA,MAAM,YAAY,MAAM,IAAA,CAAK,QAAQ,aAAA,CAAc,MAAA,EAAQ,OAAO,MAAM,CAAA;AAExE,IAAA,MAAM,EAAE,GAAG,CAAA,EAAG,CAAA,KAAMD,aAAA,CAAO,SAAA,CAAU,KAAK,SAAS,CAAA;AAGnD,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe;AAAA,QACnB,OAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,CAAA;AAAA,QACA,CAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,iBAAiB,MAAM,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,GAAG,YAAY,CAAA;AACpE,MAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,WAAA,EAAa,qBAAA,EAAuB,cAAc,CAAA;AAAA,IAClF,SAAS,KAAA,EAAY;AACnB,MAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,SAAA,EAAW,mCAAA,EAAqC,KAAK,CAAA;AACnF,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAA;AAAA,MACP,KAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,MACnB,CAAA;AAAA,MACA,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF","file":"index.js","sourcesContent":["import {\n getPrice,\n numberRemoveEndZero,\n SendType,\n Service,\n OpenAPI,\n Csl,\n ExecTime,\n usdtTokens,\n erc20Abi,\n} from \"@stableflow/core\";\nimport {\n addressToBytes32,\n quoteSignature,\n getHopMsgFee,\n LZ_RECEIVE_VALUE,\n USDT0_CONFIG,\n USDT0_LEGACY_MESH_TRANSFTER_FEE,\n OFT_ABI,\n FRAXZERO_MIDDLE_TOKEN_FRXUSD,\n FRAXZERO_MIDDLE_TOKEN_USDC,\n} from \"@stableflow/bridges\";\nimport {\n evmRpcFallbackProvider,\n buildEndpointV2LzComposePayload,\n NATIVE_MSG_FEE_BUFFER,\n} from \"@stableflow/utils-evm\";\nimport { getDestinationAssociatedTokenAddress } from \"@stableflow/utils-solana\";\nimport Big from \"big.js\";\nimport { ethers } from \"ethers\";\n\nconst DEFAULT_GAS_LIMIT = 100000n;\nconst DEFAULT_GAS_LIMIT_FAILED = 4000000n;\n\nexport default class EVMWallet {\n provider: any;\n signer: any;\n private csl;\n\n constructor(_provider: any, _signer?: any) {\n this.provider = _provider;\n this.signer = _signer;\n const cs = new Csl(OpenAPI.DEBUG);\n this.csl = cs.log;\n }\n\n async transfer(data: {\n originAsset: string;\n depositAddress: string;\n amount: string;\n }) {\n const { originAsset, depositAddress, amount } = data;\n\n if (originAsset === \"eth\") {\n const tx = await this.signer.sendTransaction({\n to: depositAddress,\n value: ethers.parseEther(amount)\n });\n await tx.wait();\n return tx;\n }\n\n const contract = new ethers.Contract(originAsset, erc20Abi, this.signer);\n\n const tx = await contract.transfer(depositAddress, amount);\n const result = await tx.wait();\n\n return result.hash;\n }\n\n async getBalance(token: any, account: string, options?: { isCatchError?: boolean; }) {\n const { isCatchError = false } = options || {};\n\n try {\n let provider = this.provider;\n if (token.rpcUrls) {\n provider = evmRpcFallbackProvider(token);\n }\n\n if (token.symbol === \"eth\" || token.symbol === \"ETH\" || token.symbol === \"native\") {\n const balance = await provider.getBalance(account);\n return balance.toString();\n }\n\n // Use provider instead of _signer for read-only operations\n const contract = new ethers.Contract(token.contractAddress, erc20Abi, provider);\n\n const balance = await contract.balanceOf(account);\n this.csl(\"EVM getBalance\", \"green-500\", \"Success getting %s token balance: %o\", token.contractAddress, balance);\n\n return balance.toString();\n } catch (err) {\n this.csl(\"EVM getBalance\", \"red-500\", \"Get balance failed: %o\", err);\n if (isCatchError) {\n throw err;\n }\n return \"0\";\n }\n }\n\n async balanceOf(token: any, account: string, options?: { isCatchError?: boolean; }) {\n return await this.getBalance(token, account, options);\n }\n\n /**\n * Estimate gas limit for transfer transaction\n * @param data Transfer data\n * @returns Gas limit estimate, gas price, and estimated gas cost\n */\n async estimateTransferGas(data: {\n fromToken: any;\n depositAddress: string;\n amount: string;\n account: string;\n }): Promise<{\n gasLimit: bigint;\n gasPrice: bigint;\n estimateGas: bigint;\n }> {\n const { fromToken, depositAddress, amount, account } = data;\n const originAsset = fromToken.contractAddress;\n const provider = evmRpcFallbackProvider(fromToken);\n\n let gasLimit: bigint;\n\n if (originAsset === \"eth\") {\n // Estimate gas for ETH transfer\n const tx = {\n from: account,\n to: depositAddress,\n value: ethers.parseEther(amount)\n };\n gasLimit = await provider.estimateGas(tx);\n } else {\n // Estimate gas for ERC20 token transfer\n const contract = new ethers.Contract(originAsset, erc20Abi, provider);\n gasLimit = await contract.transfer.estimateGas(depositAddress, amount);\n }\n\n // Increase gas limit by 20% to provide buffer\n gasLimit = (gasLimit * 120n) / 100n;\n\n // Get gas price\n const feeData = await provider.getFeeData();\n const gasPrice = feeData.gasPrice || 0n;\n\n // Calculate estimated gas cost: gasLimit * gasPrice\n const estimateGas = gasLimit * gasPrice;\n\n return {\n gasLimit,\n gasPrice,\n estimateGas\n };\n }\n\n getContract(params: any) {\n const {\n contractAddress,\n abi,\n } = params;\n\n return new ethers.Contract(contractAddress, abi, this.signer);\n }\n\n async allowance(params: any) {\n const {\n dry,\n contractAddress,\n spender,\n address,\n amountWei,\n provider,\n blockTag,\n strict = false,\n } = params;\n\n const runner = provider || this.provider;\n const contract = new ethers.Contract(contractAddress, erc20Abi, runner);\n\n // If querying for a quote\n // Directly return the default value\n if (dry) {\n return {\n contract,\n allowance: \"0\",\n needApprove: false,\n };\n }\n\n // get allowance\n let allowance = \"0\";\n try {\n allowance = blockTag\n ? await contract.allowance(address, spender, { blockTag })\n : await contract.allowance(address, spender);\n allowance = allowance.toString();\n } catch (error) {\n this.csl(\"EVM allowance\", \"red-500\", \"Error getting allowance: %o\", error);\n if (strict) {\n throw error;\n }\n }\n\n return {\n contract,\n allowance,\n needApprove: Big(amountWei || 0).gt(allowance || 0),\n };\n }\n\n async approve(params: any) {\n const {\n contractAddress,\n spender,\n amountWei,\n isApproveMax = false,\n isDetails = false,\n isWaitTxReceipt = true,\n } = params;\n\n const contract = new ethers.Contract(contractAddress, erc20Abi, this.signer);\n\n let _amountWei = amountWei;\n if (isApproveMax) {\n _amountWei = ethers.MaxUint256;\n }\n\n const detailResult: any = {\n success: false,\n data: {},\n message: null,\n };\n\n try {\n const tx = await contract.approve(spender, _amountWei);\n const txReceipt = await tx.wait();\n if (txReceipt.status === 1) {\n if (isDetails) {\n const confirmations = typeof txReceipt.confirmations === \"function\"\n ? await txReceipt.confirmations()\n : txReceipt.confirmations;\n detailResult.success = true;\n detailResult.data = {\n txHash: txReceipt.hash,\n blockNumber: txReceipt.blockNumber,\n confirmations,\n };\n return detailResult;\n }\n return true;\n }\n if (isDetails) {\n detailResult.message = \"Arrove failed\";\n return detailResult;\n }\n return false;\n } catch (error: any) {\n this.csl(\"EVM approve\", \"red-500\", \"Error approve: %o\", error);\n if (isDetails) {\n detailResult.message = error.message;\n }\n }\n\n if (isDetails) {\n return detailResult;\n }\n\n return false;\n }\n\n async getEstimateGas(params: any) {\n const { gasLimit, price, nativeToken, provider, gasPrice } = params;\n\n let finalGasPrice = gasPrice;\n if (!finalGasPrice) {\n const feeData = await provider.getFeeData();\n finalGasPrice = feeData.maxFeePerGas || feeData.gasPrice || BigInt(\"20000000000\"); // Default 20 gwei\n }\n\n const estimateGas = BigInt(gasLimit) * BigInt(finalGasPrice);\n const estimateGasAmount = Big(estimateGas.toString()).div(10 ** nativeToken.decimals);\n const estimateGasUsd = Big(estimateGasAmount).times(price || 1);\n\n return {\n gasPrice: finalGasPrice,\n usd: numberRemoveEndZero(Big(estimateGasUsd).toFixed(20)),\n wei: estimateGas,\n amount: numberRemoveEndZero(Big(estimateGasAmount).toFixed(nativeToken.decimals)),\n };\n }\n\n async estimateTransaction(params: any) {\n const {\n dry,\n contract,\n method,\n param,\n fromToken,\n prices,\n evmGasFees,\n defaultGasLimit = DEFAULT_GAS_LIMIT,\n refundTo,\n txRequest,\n } = params;\n\n const cs = new Csl(OpenAPI.DEBUG);\n const csl = cs.log;\n\n const provider = evmRpcFallbackProvider(fromToken);\n const nativeTokenPrice = getPrice(prices, fromToken.nativeToken.symbol);\n\n const result = {\n estimateSourceGasLimit: dry ? DEFAULT_GAS_LIMIT_FAILED : DEFAULT_GAS_LIMIT,\n estimateSourceGas: 0n,\n estimateSourceGasUsd: \"0\",\n };\n\n const setDefaultGasLimit = async () => {\n const { usd, wei } = await this.getEstimateGas({\n gasLimit: DEFAULT_GAS_LIMIT,\n price: nativeTokenPrice,\n nativeToken: fromToken.nativeToken,\n provider,\n gasPrice: dry ? evmGasFees[fromToken.chainId].gasPrice : void 0,\n });\n result.estimateSourceGas = wei;\n result.estimateSourceGasUsd = usd;\n };\n\n let finalGasLimit = defaultGasLimit;\n\n if (dry) {\n await setDefaultGasLimit();\n return result;\n }\n\n if (txRequest) {\n try {\n const gasLimit = await provider.estimateGas({\n to: txRequest.target,\n data: txRequest.calldata,\n from: refundTo || this.signer?.address,\n });\n finalGasLimit = gasLimit * 120n / 100n;\n const { usd, wei } = await this.getEstimateGas({\n gasLimit: finalGasLimit,\n price: nativeTokenPrice,\n nativeToken: fromToken.nativeToken,\n provider,\n });\n result.estimateSourceGasLimit = finalGasLimit;\n result.estimateSourceGas = wei;\n result.estimateSourceGasUsd = usd;\n } catch (error) {\n csl(\"EVM estimateTransaction\", \"red-500\", \"%s estimateGas failed: %o\", method, error);\n await setDefaultGasLimit();\n result.estimateSourceGasLimit = DEFAULT_GAS_LIMIT_FAILED / 2n;\n }\n\n return result;\n }\n\n try {\n const gasLimit = await contract[method].estimateGas(...param);\n finalGasLimit = gasLimit * 120n / 100n;\n const { usd, wei } = await this.getEstimateGas({\n gasLimit: finalGasLimit,\n price: nativeTokenPrice,\n nativeToken: fromToken.nativeToken,\n provider,\n });\n result.estimateSourceGasLimit = finalGasLimit;\n result.estimateSourceGas = wei;\n result.estimateSourceGasUsd = usd;\n } catch (error) {\n csl(\"EVM estimateTransaction\", \"red-500\", \"%s estimateGas failed: %o\", method, error);\n await setDefaultGasLimit();\n result.estimateSourceGasLimit = DEFAULT_GAS_LIMIT_FAILED / 2n;\n }\n\n return result;\n }\n\n async quoteOFT(params: any) {\n const { Options } = await import(\"@layerzerolabs/lz-v2-utilities\");\n const {\n dry,\n abi,\n dstEid,\n recipient,\n amountWei,\n slippageTolerance,\n payInLzToken,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n originLayerzeroAddress,\n destinationLayerzeroAddress,\n excludeFees,\n refundTo,\n multiHopComposer,\n isMultiHopComposer,\n isOriginLegacy,\n isDestinationLegacy,\n originLayerzero,\n destinationLayerzero,\n } = params;\n\n const result: any = {\n needApprove: false,\n approveSpender: originLayerzeroAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n originLayerzeroAddress: originLayerzeroAddress,\n destinationLayerzeroAddress: destinationLayerzeroAddress,\n },\n fees: {},\n totalFeesUsd: \"0\",\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: \"0\",\n estimateTime: 0, // seconds - dynamically calculated using LayerZero formula\n outputAmount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).toFixed(params.fromToken.decimals, 0)),\n };\n\n const execTime = new ExecTime({ type: `Usdt0 EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-100\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const oftContract = new ethers.Contract(originLayerzeroAddress, abi, this.signer);\n const oftContractRead = new ethers.Contract(originLayerzeroAddress, abi, provider);\n\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"params: %o\", params);\n execTime.breakpoint();\n\n // 1. check if need approve\n const approvalRequired = isOriginLegacy ? originLayerzero.oftLegacyApprovalRequired : originLayerzero.oftApprovalRequired;\n this.csl(\"EVM quoteOFT\", \"blue-900\", \"approvalRequired: %o\", approvalRequired);\n execTime.log(\"approvalRequired\");\n\n const lzReceiveOptionGas = isDestinationLegacy ? destinationLayerzero.lzReceiveOptionGasLegacy : (destinationLayerzero.lzReceiveOptionGas || 200000);\n let lzReceiveOptionValue = 0;\n\n execTime.breakpoint();\n const destATA = await getDestinationAssociatedTokenAddress({\n recipient,\n toToken,\n });\n execTime.log(\"getDestinationAssociatedTokenAddress\");\n if (destATA.needCreateTokenAccount) {\n lzReceiveOptionValue = LZ_RECEIVE_VALUE[toToken.chainName] || 0;\n }\n\n let unMultiHopExtraOptions = Options.newOptions().toHex();\n if (!isMultiHopComposer && lzReceiveOptionValue) {\n unMultiHopExtraOptions = Options.newOptions().addExecutorLzReceiveOption(lzReceiveOptionGas, lzReceiveOptionValue).toHex();\n }\n\n // 2. quote send\n const sendParam: any = {\n dstEid: dstEid,\n to: addressToBytes32(toToken.chainType, recipient),\n amountLD: amountWei,\n minAmountLD: 0n,\n extraOptions: unMultiHopExtraOptions,\n composeMsg: \"0x\",\n oftCmd: \"0x\"\n };\n\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"isMultiHopComposer: %o\", isMultiHopComposer);\n if (isMultiHopComposer) {\n // multiHopComposer: Arbitrum legacy mesh MultiHopComposer, eid = 30110\n sendParam.dstEid = multiHopComposer.eid;\n sendParam.to = addressToBytes32(\"evm\", multiHopComposer.oftMultiHopComposer);\n\n let multiHopExtraOptions = Options.newOptions().toHex();\n if (lzReceiveOptionValue) {\n multiHopExtraOptions = Options.newOptions().addExecutorLzReceiveOption(lzReceiveOptionGas, lzReceiveOptionValue).toHex();\n }\n\n const composeMsgSendParam = {\n dstEid,\n to: addressToBytes32(toToken.chainType, recipient),\n amountLD: sendParam.amountLD,\n minAmountLD: sendParam.minAmountLD,\n extraOptions: multiHopExtraOptions,\n composeMsg: \"0x\",\n oftCmd: \"0x\",\n };\n execTime.breakpoint();\n const hopMsgFee = await getHopMsgFee({\n sendParam: composeMsgSendParam,\n toToken,\n });\n execTime.log(\"getHopMsgFee\");\n\n sendParam.extraOptions = Options.newOptions()\n .addExecutorComposeOption(0, originLayerzero.composeOptionGas || 800000, hopMsgFee)\n .toHex();\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\n sendParam.composeMsg = abiCoder.encode(\n [\"tuple(uint32 dstEid, bytes32 to, uint256 amountLD, uint256 minAmountLD, bytes extraOptions, bytes composeMsg, bytes oftCmd)\"],\n [Object.values(composeMsgSendParam)]\n );\n }\n\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"sendParam: %o\", sendParam);\n if (!dry) {\n execTime.breakpoint();\n const oftData = await oftContractRead.quoteOFT.staticCall(sendParam);\n const [, , oftReceipt] = oftData;\n sendParam.minAmountLD = oftReceipt[1] * (1000000n - BigInt(slippageTolerance * 10000)) / 1000000n;\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"oftData: %o\", oftData);\n execTime.log(\"quoteOFT.staticCall\");\n }\n\n execTime.breakpoint();\n const mergedCall = [\n oftContractRead.quoteSend.staticCall(sendParam, payInLzToken),\n ];\n if (approvalRequired) {\n mergedCall.push(\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: originLayerzeroAddress,\n address: refundTo,\n amountWei,\n provider,\n })\n );\n }\n const [msgFee, allowanceResult] = await Promise.all(mergedCall);\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"quoteSend: %o\", msgFee);\n if (approvalRequired) {\n result.needApprove = allowanceResult?.needApprove;\n }\n execTime.log(\"quoteSend.staticCall and allowance\");\n\n // const msgFee = await oftContractRead.quoteSend.staticCall(sendParam, payInLzToken);\n let nativeMsgFee = msgFee[0];\n const lzMsgFee = msgFee[1];\n result.totalEstimateSourceGas = nativeMsgFee;\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"msgFee: %o, nativeMsgFee: %o\", msgFee, nativeMsgFee);\n // add 5% buffer\n nativeMsgFee = nativeMsgFee * NATIVE_MSG_FEE_BUFFER / 100n;\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"msgFee after buffer: %o\", nativeMsgFee);\n\n // csl(\"EVM quoteOFT\", \"blue-900\", \"Params: %o\", result.sendParam);\n\n // 3. estimate gas\n const nativeFeeUsd = Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).times(getPrice(prices, fromToken.nativeToken.symbol));\n result.fees.nativeFee = numberRemoveEndZero(Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).toFixed(fromToken.nativeToken.decimals));\n result.fees.nativeFeeUsd = numberRemoveEndZero(Big(nativeFeeUsd).toFixed(20));\n result.fees.lzTokenFeeUsd = numberRemoveEndZero(Big(lzMsgFee?.toString() || 0).div(10 ** fromToken.decimals).toFixed(20));\n\n // 0.03% fee for Legacy Mesh transfers only (native USDT0 transfers are free)\n if (isOriginLegacy || isDestinationLegacy) {\n result.fees.legacyMeshFeeUsd = numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).times(USDT0_LEGACY_MESH_TRANSFTER_FEE).toFixed(params.fromToken.decimals));\n result.outputAmount = numberRemoveEndZero(Big(Big(amountWei || 0).div(10 ** params.fromToken.decimals)).minus(result.fees.legacyMeshFeeUsd || 0).toFixed(params.fromToken.decimals, 0));\n }\n\n const finalSendParam = [\n sendParam,\n {\n nativeFee: nativeMsgFee,\n lzTokenFee: lzMsgFee,\n },\n refundTo,\n { value: nativeMsgFee }\n ];\n\n execTime.breakpoint();\n const ett = await this.estimateTransaction({\n dry,\n contract: oftContract,\n method: \"send\",\n param: finalSendParam,\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas += ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n finalSendParam[3].gasLimit = ett.estimateSourceGasLimit;\n execTime.log(\"send.estimateGas\");\n\n result.sendParam = {\n contract: oftContract,\n method: \"send\",\n param: finalSendParam,\n };\n\n // calculate total fees\n for (const feeKey in result.fees) {\n if (excludeFees.includes(feeKey) || !/Usd$/.test(feeKey)) {\n continue;\n }\n result.totalFeesUsd = Big(result.totalFeesUsd || 0).plus(result.fees[feeKey] || 0);\n }\n result.totalFeesUsd = numberRemoveEndZero(Big(result.totalFeesUsd).toFixed(20));\n\n execTime.logTotal(\"quoteOFT\");\n\n return result;\n }\n\n async sendTransaction(params: any) {\n const {\n method,\n contract,\n param,\n } = params;\n\n // Add gas fee buffer to prevent \"max fee per gas less than block base fee\" error.\n // Between quote and send, the baseFee may increase, causing the estimated\n // maxFeePerGas to be lower than the current baseFee.\n const overridesIndex = param.length - 1;\n const overrides = param[overridesIndex] && typeof param[overridesIndex] === \"object\" && !Array.isArray(param[overridesIndex])\n ? { ...param[overridesIndex] }\n : {};\n\n if (!overrides.maxFeePerGas) {\n try {\n const feeData = await this.provider.getFeeData();\n if (feeData.maxFeePerGas) {\n // Add 20% buffer to maxFeePerGas to account for baseFee fluctuations\n overrides.maxFeePerGas = (feeData.maxFeePerGas * 120n) / 100n;\n }\n if (feeData.maxPriorityFeePerGas && !overrides.maxPriorityFeePerGas) {\n overrides.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n }\n } catch (error) {\n this.csl(\"EVM sendTransaction\", \"red-500\", \"Failed to get fee data for gas buffer: %o\", error);\n }\n }\n\n const finalParam = [...param];\n if (param[overridesIndex] && typeof param[overridesIndex] === \"object\" && !Array.isArray(param[overridesIndex])) {\n finalParam[overridesIndex] = overrides;\n } else {\n finalParam.push(overrides);\n }\n\n try {\n const tx = await contract[method](...finalParam);\n\n return tx.hash;\n } catch (error: any) {\n this.csl(\"EVM sendTransaction\", \"red-500\", \"Error sending transaction: %o, message: %o\", error, error.message);\n let _finalErrorMessage = `Transaction failed: ${error.message}`;\n if (error?.message?.includes(\"user rejected action\")) {\n _finalErrorMessage = error.message;\n }\n throw new Error(_finalErrorMessage);\n }\n\n // const DefaultErrorMsg = \"Transaction failed\";\n // try {\n // const txReceipt = await tx.wait();\n\n // if (txReceipt.status !== 1) {\n // throw new Error(DefaultErrorMsg);\n // }\n\n // return txReceipt.hash;\n // } catch (error: any) {\n // return tx.hash;\n // }\n }\n\n /**\n * Unified quote method that routes to specific quote methods based on type\n * @param type Service type from Service\n * @param params Parameters for the quote\n */\n async quote(type: Service, params: any) {\n switch (type) {\n case Service.CCTP:\n return await this.quoteCCTP(params);\n case Service.Usdt0:\n return await this.quoteOFT(params);\n case Service.OneClick:\n return await this.quoteOneClickProxy(params);\n case Service.Native:\n return await this.quoteNative(params);\n case Service.FraxZero:\n return await this.quoteFraxZero(params);\n default:\n throw new Error(`Unsupported quote type: ${type}`);\n }\n }\n\n /**\n * Unified send method that routes to specific send methods based on type\n * @param type Send type from SendType enum\n * @param params Parameters for the send transaction\n */\n async send(type: SendType, params: any) {\n switch (type) {\n case SendType.SEND:\n return await this.sendTransaction(params);\n case SendType.TRANSFER:\n return await this.transfer(params);\n default:\n throw new Error(`Unsupported send type: ${type}`);\n }\n }\n\n async quoteCCTP(params: any) {\n const {\n dry,\n proxyAddress,\n abi,\n refundTo,\n recipient,\n amountWei,\n // slippageTolerance,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n excludeFees,\n destinationDomain,\n sourceDomain,\n } = params;\n\n const result: any = {\n needApprove: false,\n approveSpender: proxyAddress,\n sendParam: void 0,\n quoteParam: {\n sourceDomain,\n destinationDomain,\n proxyAddress,\n ...params,\n },\n fees: {},\n totalFeesUsd: void 0,\n estimateSourceGas: void 0,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: void 0,\n estimateTime: Math.floor(Math.random() * 8) + 3,\n outputAmount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals, 0)),\n };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const execTime = new ExecTime({ type: `CCTP EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-200\", isDebug: OpenAPI.DEBUG });\n\n const proxyContract = new ethers.Contract(proxyAddress, abi, this.signer);\n const proxyContractRead = new ethers.Contract(proxyAddress, abi, provider);\n\n let realRecipient = recipient;\n execTime.breakpoint();\n // 1. get user nonce\n const getUsrNonce = async () => {\n let userNonce = 0n;\n try {\n userNonce = await proxyContract.userNonces(refundTo);\n } catch (error) {\n }\n return userNonce;\n };\n const mergedCalls = [\n getDestinationAssociatedTokenAddress({\n recipient,\n toToken,\n }),\n getUsrNonce(),\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n address: refundTo,\n spender: proxyAddress,\n amountWei,\n provider,\n })\n ];\n const [destATA, userNonce, allowance]: any = await Promise.all(mergedCalls);\n execTime.log(\"getDestinationATA & getUsrNonce & get allowance\", \"destATA: %o, userNonce: %o, allowance: %o\", destATA, userNonce, allowance);\n result.needCreateTokenAccount = destATA.needCreateTokenAccount;\n if (destATA.associatedTokenAddress) {\n realRecipient = destATA.associatedTokenAddress;\n }\n result.needApprove = allowance.needApprove;\n\n execTime.breakpoint();\n // 2. quote signature\n const signatureRes = await quoteSignature({\n address: refundTo,\n amount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals, 0)),\n destination_domain_id: destinationDomain,\n receipt_address: realRecipient,\n source_domain_id: sourceDomain,\n user_nonce: Number(userNonce),\n });\n const {\n bridge_fee,\n finality_threshold,\n max_fee,\n mint_fee,\n receipt_amount,\n signature,\n destination_caller,\n } = signatureRes;\n execTime.log(\"quoteSignature\");\n\n result.fees.estimateMintGasUsd = numberRemoveEndZero(Big(mint_fee || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals));\n result.fees.bridgeFeeUsd = numberRemoveEndZero(Big(bridge_fee || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals));\n const chargedAmount = BigInt(amountWei) - BigInt(mint_fee);\n result.outputAmount = numberRemoveEndZero(Big(receipt_amount || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals, 0));\n\n const depositParam = [\n // originalAmount\n amountWei,\n // chargedAmount = originalAmount - gas fee\n chargedAmount,\n // destinationDomain\n destinationDomain,\n // mintRecipient\n addressToBytes32(toToken.chainType, realRecipient),\n // burnToken\n fromToken.contractAddress,\n // destinationCaller\n destination_caller ? addressToBytes32(toToken.chainType, destination_caller) : \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n // maxFee\n max_fee,\n // minFinalityThreshold\n finality_threshold,\n // signature\n signature,\n ];\n\n execTime.breakpoint();\n // 3. estimate deposit gas\n const ett = await this.estimateTransaction({\n dry,\n contract: proxyContract,\n method: \"depositWithFee\",\n param: depositParam,\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n depositParam.push({ gasLimit: ett.estimateSourceGasLimit });\n execTime.log(\"estimateTransaction\");\n\n result.sendParam = {\n method: \"depositWithFee\",\n contract: proxyContract,\n param: depositParam,\n };\n\n // 5. calculate total fees\n for (const feeKey in result.fees) {\n if (excludeFees.includes(feeKey) || !/Usd$/.test(feeKey)) {\n continue;\n }\n result.totalFeesUsd = Big(result.totalFeesUsd || 0).plus(result.fees[feeKey] || 0);\n }\n result.totalFeesUsd = numberRemoveEndZero(Big(result.totalFeesUsd).toFixed(20));\n\n execTime.logTotal(\"quoteCCTP\");\n\n return result;\n }\n\n async quoteOneClickProxy(params: any) {\n const {\n dry,\n proxyAddress,\n abi,\n fromToken,\n refundTo,\n depositAddress,\n amountWei,\n prices,\n evmGasFees,\n } = params;\n\n const execTime = new ExecTime({ type: `OneClick EVM ${fromToken.chainName}`, logStyle: \"stone-300\", isDebug: OpenAPI.DEBUG });\n\n const result: any = { fees: {} };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const proxyContract = new ethers.Contract(proxyAddress, abi, this.signer);\n const proxyParam: any = [\n // tokenAddress\n fromToken.contractAddress,\n // recipient\n depositAddress,\n // amount\n amountWei,\n ];\n\n execTime.breakpoint();\n const mergedCalls = [\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n address: refundTo,\n spender: proxyAddress,\n amountWei: amountWei,\n provider,\n }),\n this.estimateTransaction({\n dry,\n contract: proxyContract,\n method: \"proxyTransfer\",\n param: proxyParam,\n fromToken,\n prices,\n evmGasFees,\n })\n ];\n const [allowance, ett]: any = await Promise.all(mergedCalls);\n result.needApprove = allowance.needApprove;\n result.approveSpender = proxyAddress;\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n proxyParam.push({ gasLimit: ett.estimateSourceGasLimit });\n execTime.log(\"allowance & estimateTransaction\");\n\n result.sendParam = {\n method: \"proxyTransfer\",\n contract: proxyContract,\n param: proxyParam,\n };\n\n execTime.logTotal(\"quoteOneClickPorxy\");\n\n return result;\n }\n\n async quoteNative(params: any) {\n const {\n quoteResponse,\n bridgeRouterAddress,\n ...restParams\n } = params;\n const {\n dry,\n amountWei,\n refundTo,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n } = restParams;\n\n const result: any = {\n ...quoteResponse,\n fees: {},\n needApprove: false,\n approveSpender: bridgeRouterAddress,\n quoteParam: {\n ...restParams,\n },\n sendParam: {\n txRequest: quoteResponse.txRequest,\n },\n totalFeesUsd: void 0,\n estimateSourceGas: void 0,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: void 0,\n estimateTime: quoteResponse.priority === \"fast\" ? Math.floor(Math.random() * 10) + 50 : Math.floor(Math.random() * 60) + 300,\n outputAmount: 0,\n };\n\n const execTime = new ExecTime({ type: `Native EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-400\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const estimateNativeGas = async () => {\n if (dry) {\n const ett = await this.estimateTransaction({\n dry,\n fromToken,\n prices,\n evmGasFees,\n });\n\n result.outputAmount = quoteResponse.buyerTokenAmount + \"\";\n result.fees = {\n estimateGasUsd: ett.estimateSourceGasUsd,\n widgetFeeUsd: quoteResponse.widgetFeeUsd,\n liquidityProviderFeeUsd: quoteResponse.liquidityProviderFeeUsd,\n };\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = numberRemoveEndZero(Big(quoteResponse.totalFeeUsd).toFixed(20));\n }\n else {\n const ett = await this.estimateTransaction({\n dry,\n fromToken,\n prices,\n evmGasFees,\n txRequest: quoteResponse.txRequest,\n refundTo,\n });\n\n result.outputAmount = Big(quoteResponse.amountOut || 0).div(10 ** (toToken.decimals || 6)).toFixed(toToken.decimals || 6, 0);\n result.fees = {\n estimateGasUsd: ett.estimateSourceGasUsd,\n // maybe 100 = 1%\n widgetFeeUsd: numberRemoveEndZero(Big(amountWei || 0).div(10 ** (fromToken.decimals || 6)).times(quoteResponse.widgetFee.feeRate || 0).toFixed(20, 0)),\n // not return by api\n liquidityProviderFeeUsd: \"0\",\n };\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = numberRemoveEndZero(Big(quoteResponse.amountOutBeforeFee || 0).minus(quoteResponse.amountOut).div(10 ** (fromToken.decimals || 6)).toFixed(20, 0));\n result.txRequest.gasLimit = ett.estimateSourceGasLimit;\n }\n };\n\n execTime.breakpoint();\n const mergedCalls = [\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: bridgeRouterAddress,\n address: refundTo,\n amountWei,\n }),\n estimateNativeGas()\n ];\n const [allowanceResult]: any = await Promise.all(mergedCalls);\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance & estimateNativeGas\");\n\n execTime.logTotal(\"quoteNative\");\n\n return result;\n }\n\n async quoteFraxZero(params: any) {\n const {\n dry,\n abi,\n recipient,\n amountWei,\n slippageTolerance,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n excludeFees,\n refundTo,\n originLayerzero,\n destinationLayerzero,\n } = params;\n\n const {\n eid: srcEid,\n remoteHop,\n lockbox,\n } = originLayerzero;\n const {\n eid: dstEid,\n } = destinationLayerzero;\n\n const isFromEthereum = fromToken.chainId === 1;\n\n const result: any = {\n needApprove: false,\n approveSpender: remoteHop,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime: 0,\n outputAmount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).toFixed(params.fromToken.decimals, 0)),\n };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const execTime = new ExecTime({ type: `FraxZero EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-500\", isDebug: OpenAPI.DEBUG });\n\n const remoteHopContract = new ethers.Contract(remoteHop, abi, this.signer);\n const remoteHopContractRead = new ethers.Contract(remoteHop, abi, provider);\n\n // 1. check if need approve\n // 2. get message fee\n const sendParams = [\n // _oft\n isFromEthereum ? lockbox : fromToken.contractAddress,\n // _dstEid\n dstEid,\n // _to\n addressToBytes32(toToken.chainType, recipient),\n // _amountLD\n amountWei\n ];\n execTime.breakpoint();\n const mergedCalls = [\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: remoteHop,\n address: refundTo,\n amountWei,\n provider,\n }),\n remoteHopContractRead.quote.staticCall(...sendParams)\n ];\n const [allowanceResult, msgFee]: any = await Promise.all(mergedCalls);\n execTime.log(\"allowance & quote.staticCall\");\n\n result.needApprove = allowanceResult.needApprove;\n\n let nativeMsgFee = msgFee[0];\n this.csl(\"EVM quoteFraxZero\", \"blue-700\", \"nativeMsgFee: %o\", nativeMsgFee);\n\n // add 5% buffer\n nativeMsgFee = nativeMsgFee * NATIVE_MSG_FEE_BUFFER / 100n;\n this.csl(\"EVM quoteFraxZero\", \"blue-700\", \"nativeMsgFee after buffer: %o\", nativeMsgFee);\n result.totalEstimateSourceGas = nativeMsgFee;\n\n const nativeFeeUsd = Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).times(getPrice(prices, fromToken.nativeToken.symbol));\n result.fees.nativeFee = numberRemoveEndZero(Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).toFixed(fromToken.nativeToken.decimals));\n result.fees.nativeFeeUsd = numberRemoveEndZero(Big(nativeFeeUsd).toFixed(20));\n result.fees.lzTokenFeeUsd = numberRemoveEndZero(Big(msgFee[1]?.toString() || 0).div(10 ** fromToken.decimals).toFixed(20));\n\n this.csl(\"EVM quoteFraxZero\", \"blue-700\", \"msgFee: %o\", msgFee);\n\n execTime.breakpoint();\n // 3. estimate send gas\n const finalSendParam = [...sendParams, { value: nativeMsgFee }];\n const ett = await this.estimateTransaction({\n dry,\n contract: remoteHopContract,\n method: \"sendOFT\",\n param: finalSendParam,\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas += ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n finalSendParam[finalSendParam.length - 1].gasLimit = ett.estimateSourceGasLimit;\n execTime.log(\"sendOFT.estimateTransaction\");\n\n // 4. generate transaction\n result.sendParam = {\n contract: remoteHopContract,\n method: \"sendOFT\",\n param: finalSendParam,\n };\n\n // 5. calculate total fees\n for (const feeKey in result.fees) {\n if (excludeFees.includes(feeKey) || !/Usd$/.test(feeKey)) {\n continue;\n }\n result.totalFeesUsd = Big(result.totalFeesUsd || 0).plus(result.fees[feeKey] || 0);\n }\n result.totalFeesUsd = numberRemoveEndZero(Big(result.totalFeesUsd).toFixed(20));\n\n execTime.logTotal(\"quoteFraxZero\");\n\n return result;\n }\n\n async preivewRedeemFrxUSD(params: any) {\n const {\n dry,\n amountWei,\n fromToken,\n abi,\n usdcCustodianAddress,\n rwaCustodianAddress,\n redemptionAddress,\n } = params;\n\n // csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n if (dry) {\n return {\n maxUsdc: 0n,\n maxRwa: 0n,\n amountWeiBigInt: 0n,\n // The token obtained from redeem is Ethereum USDC\n totalAssetsOut: BigInt(Big(amountWei || 0).div(10 ** fromToken.decimals).times(10 ** FRAXZERO_MIDDLE_TOKEN_USDC.decimals).toFixed(0, 0)),\n isInsufficientLiquidity: false,\n };\n }\n\n const execTime = new ExecTime({ type: `FraxZero EVM preivewRedeemFrxUSD ${fromToken.chainName}`, logStyle: \"stone-600\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n // Get maxSharesRedeemable (index 3) from mdwrComboView for both custodians\n const usdcCustodian = new ethers.Contract(usdcCustodianAddress, abi, provider);\n const rwaCustodian = new ethers.Contract(rwaCustodianAddress, abi, provider);\n const redemption = new ethers.Contract(redemptionAddress, abi, provider);\n\n execTime.breakpoint();\n const [usdcView, redemptionView] = await Promise.all([\n usdcCustodian.mdwrComboView.staticCall(),\n redemption.maxUstbRedemptionAmount.staticCall(),\n ]);\n execTime.log(\"usdcCustodian & redemption\");\n\n // This value is the frxUSD wei amount\n const maxUsdc = usdcView[3]; // maxSharesRedeemable\n const superstateTokenAmount = redemptionView[0]; // superstateTokenAmount\n\n // This value represents the wei amount of USDC\n const [maxRwa] = await redemption.calculateUsdcOut.staticCall(superstateTokenAmount);\n\n const amountWeiBigInt = BigInt(amountWei || 0);\n\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"usdcCustodian maxSharesRedeemable(frxUSD wei amount): %o\", maxUsdc);\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"rwaCustodian maxSharesRedeemable(USDC wei amount): %o\", maxRwa);\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"amountWei: %o\", amountWeiBigInt);\n\n let totalAssetsOut = 0n;\n let isInsufficientLiquidity = false;\n\n if (amountWeiBigInt <= maxUsdc) {\n // USDC path only\n execTime.breakpoint();\n const assetsOut = await usdcCustodian.previewRedeem.staticCall(amountWeiBigInt);\n execTime.log(\"usdcCustodian.previewRedeem (USDC only)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC path only, usdcCustodian previewRedeem input: %o, value: %o\", amountWeiBigInt, assetsOut);\n totalAssetsOut = assetsOut;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC path only, totalAssetsOut: %o\", totalAssetsOut);\n } else {\n // USDC first (maxUsdc), then RWA for remainder\n if (maxUsdc > 0n) {\n execTime.breakpoint();\n const usdcAssetsOut = await usdcCustodian.previewRedeem.staticCall(maxUsdc);\n execTime.log(\"usdcCustodian.previewRedeem (mixed)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), usdcCustodian previewRedeem input: %o, value: %o\", maxUsdc, usdcAssetsOut);\n totalAssetsOut += usdcAssetsOut;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), totalAssetsOut: %o\", totalAssetsOut);\n }\n const rwaAmount = amountWeiBigInt - maxUsdc;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"RWA for remainder, rwaAmount: %o\", rwaAmount);\n if (rwaAmount > 0n) {\n execTime.breakpoint();\n const superstateTokenInAmount = await rwaCustodian.previewRedeem.staticCall(rwaAmount);\n execTime.log(\"rwaCustodian.previewRedeem (mixed)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), rwaCustodian previewRedeem input: %o, superstateTokenInAmount: %o\", rwaAmount, superstateTokenInAmount);\n execTime.breakpoint();\n const [rwaAssetsOut] = await redemption.calculateUsdcOut.staticCall(superstateTokenInAmount);\n execTime.log(\"redemption.calculateUsdcOut (mixed)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), rwaCustodian previewRedeem input: %o, value: %o\", rwaAmount, rwaAssetsOut);\n totalAssetsOut += rwaAssetsOut;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"RWA for remainder, totalAssetsOut: %o\", totalAssetsOut);\n\n if (rwaAssetsOut > maxRwa) {\n isInsufficientLiquidity = true;\n }\n }\n }\n\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"final totalAssetsOut: %o\", totalAssetsOut);\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"final insufficient liquidity: %o\", isInsufficientLiquidity);\n\n execTime.logTotal(\"preivewRedeemFrxUSD\");\n\n return {\n maxUsdc,\n maxRwa,\n amountWeiBigInt,\n totalAssetsOut,\n isInsufficientLiquidity,\n };\n }\n\n async previewMintFrxUSD(params: any) {\n const {\n dry,\n amountWei,\n fromToken,\n abi,\n usdcCustodianAddress,\n } = params;\n\n this.csl(\"EVM previewMintFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n if (dry) {\n return {\n maxUsdc: 0n,\n amountWeiBigInt: 0n,\n totalMax: 0n,\n // Minting means converting Ethereum USDC into Ethereum frxUSD\n totalAssetsOut: BigInt(Big(amountWei || 0).div(10 ** fromToken.decimals).times(10 ** FRAXZERO_MIDDLE_TOKEN_FRXUSD.decimals).toFixed(0, 0)),\n };\n }\n\n const execTime = new ExecTime({ type: `FraxZero EVM previewMintFrxUSD ${fromToken.chainName}`, logStyle: \"stone-700\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n // Get maxAssetsDepositable (index 0) from mdwrComboView for both custodians\n const usdcCustodian = new ethers.Contract(usdcCustodianAddress, abi, provider);\n\n execTime.breakpoint();\n const usdcView = await usdcCustodian.mdwrComboView.staticCall();\n execTime.log(\"usdcCustodian.mdwrComboView\");\n\n const maxUsdc = usdcView[0]; // maxAssetsDepositable\n\n const amountWeiBigInt = BigInt(amountWei || 0);\n const totalMax = maxUsdc;\n\n execTime.breakpoint();\n const totalAssetsOut = await usdcCustodian.previewDeposit.staticCall(amountWeiBigInt);\n execTime.log(\"usdcCustodian.previewDeposit\");\n\n execTime.logTotal(\"previewMintFrxUSD\");\n\n return {\n maxUsdc,\n amountWeiBigInt,\n totalMax,\n totalAssetsOut,\n };\n }\n\n /**\n * Redeem frxUSD to USDC via USDC and/or RWA custodian contracts.\n * Uses mdwrComboView to get max redeemable liquidity and splits redemption across USDC/RWA paths.\n * Uses previewRedeem to get accurate output amount (USDC).\n */\n async redeemFrxUSD(params: any) {\n const {\n dry,\n recipient,\n amountWei,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n refundTo,\n abi,\n usdcCustodianAddress,\n rwaCustodianAddress,\n redeemAndMintContractAddress,\n preivewRedeemResult,\n } = params;\n\n this.csl(\"EVM redeemFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n // Ethereum average block time ~12s, random ±5 seconds\n const ETH_AVG_BLOCK_TIME = 12;\n const estimateTime = (ETH_AVG_BLOCK_TIME * 2) + Math.floor(Math.random() * 11) - 5;\n\n const result: any = {\n needApprove: false,\n approveSpender: redeemAndMintContractAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime,\n outputAmount: \"0\",\n };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const execTime = new ExecTime({ type: `FraxZero EVM redeemFrxUSD ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-800\", isDebug: OpenAPI.DEBUG });\n\n const redeemContractRead = new ethers.Contract(redeemAndMintContractAddress, abi, provider);\n const redeemContract = new ethers.Contract(redeemAndMintContractAddress, abi, this.signer);\n\n execTime.breakpoint();\n let finalPreivewRedeemResult = preivewRedeemResult;\n if (!finalPreivewRedeemResult) {\n finalPreivewRedeemResult = await this.preivewRedeemFrxUSD(params);\n }\n const {\n isInsufficientLiquidity,\n totalAssetsOut,\n } = finalPreivewRedeemResult;\n execTime.log(\"preivewRedeemFrxUSD\");\n\n if (isInsufficientLiquidity) {\n throw new Error(\"Insufficient liquidity\");\n }\n\n // outputAmount = USDC amount (6 decimals), human-readable\n result.outputAmount = numberRemoveEndZero(\n Big(totalAssetsOut.toString()).div(10 ** toToken.decimals).toFixed(toToken.decimals, 0)\n );\n\n execTime.breakpoint();\n // check allowance of fromToken for redeemAndMintContractAddress\n const allowanceResult = await this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: redeemAndMintContractAddress,\n address: refundTo,\n amountWei,\n provider,\n });\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance\");\n\n result.sendParam = {\n contract: redeemContract,\n method: \"redeemToUsdcAndTransfer\",\n param: [\n amountWei,\n recipient,\n ],\n };\n\n execTime.breakpoint();\n // Estimate gas for multicall aggregate and compute fees\n const ett = await this.estimateTransaction({\n dry,\n contract: redeemContract,\n method: result.sendParam.method,\n param: [...result.sendParam.param, { gasLimit: DEFAULT_GAS_LIMIT_FAILED }],\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = ett.estimateSourceGasUsd;\n result.sendParam.param[2] = { gasLimit: ett.estimateSourceGasLimit };\n execTime.log(\"estimateTransaction\");\n\n execTime.logTotal(\"redeemFrxUSD\");\n\n return result;\n }\n\n /**\n * Mint frxUSD by depositing USDC into the custodian contract.\n * Calls deposit(assetsIn, receiver) on usdcCustodianAddress.\n * assetsIn = USDC amount (6 decimals), sharesOut = frxUSD amount (18 decimals).\n */\n async mintFrxUSD(params: any) {\n const {\n dry,\n recipient,\n amountWei,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n refundTo,\n abi,\n usdcCustodianAddress,\n previewMintResult,\n } = params;\n\n this.csl(\"EVM mintFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n // Ethereum average block time ~12s, estimateTime = 12*2 + random(-5, 5) seconds\n const ETH_AVG_BLOCK_TIME = 12;\n const estimateTime = (ETH_AVG_BLOCK_TIME * 2) + Math.floor(Math.random() * 11) - 5;\n\n const result: any = {\n needApprove: false,\n approveSpender: usdcCustodianAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime,\n outputAmount: \"0\",\n };\n\n const execTime = new ExecTime({ type: `FraxZero EVM mintFrxUSD ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-900\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n execTime.breakpoint();\n // Check allowance of fromToken for usdcCustodianAddress (USDC must be approved to custodian)\n const allowanceResult = await this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: usdcCustodianAddress,\n address: refundTo,\n amountWei,\n provider,\n });\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance\");\n\n const usdcCustodian = new ethers.Contract(usdcCustodianAddress, abi, provider);\n const usdcCustodianWithSigner = new ethers.Contract(usdcCustodianAddress, abi, this.signer);\n\n execTime.breakpoint();\n let finalPreviewMintResult = previewMintResult;\n if (!finalPreviewMintResult) {\n finalPreviewMintResult = await this.previewMintFrxUSD(params);\n }\n const {\n maxUsdc,\n amountWeiBigInt,\n totalMax,\n totalAssetsOut,\n } = finalPreviewMintResult;\n execTime.log(\"previewMintFrxUSD\");\n\n result.outputAmount = numberRemoveEndZero(\n Big(totalAssetsOut.toString()).div(10 ** toToken.decimals).toFixed(toToken.decimals, 0)\n );\n\n result.sendParam = {\n contract: usdcCustodianWithSigner,\n method: \"deposit\",\n param: [\n amountWeiBigInt,\n recipient,\n ],\n };\n\n execTime.breakpoint();\n // Estimate gas fees\n const ett = await this.estimateTransaction({\n dry,\n contract: usdcCustodianWithSigner,\n method: \"deposit\",\n param: [...result.sendParam.param, { gasLimit: DEFAULT_GAS_LIMIT_FAILED }],\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = ett.estimateSourceGasUsd;\n result.sendParam.param[2] = { gasLimit: ett.estimateSourceGasLimit };\n execTime.log(\"estimateTransaction\");\n\n execTime.logTotal(\"mintFrxUSD\");\n\n return result;\n }\n\n async mintAndSendFrxUSD(params: any) {\n const {\n dry,\n recipient,\n amountWei,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n refundTo,\n abi,\n usdcCustodianAddress,\n redeemAndMintContractAddress,\n originLayerzero,\n destinationLayerzero,\n previewMintResult,\n } = params;\n\n this.csl(\"EVM mintAndSendFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n const {\n eid: dstEid,\n } = destinationLayerzero;\n\n // Ethereum average block time ~12s, estimateTime = 12*2 + random(-5, 5) seconds\n const ETH_AVG_BLOCK_TIME = 12;\n const estimateTime = (ETH_AVG_BLOCK_TIME * 2) + Math.floor(Math.random() * 11) - 5;\n\n const result: any = {\n needApprove: false,\n approveSpender: redeemAndMintContractAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime,\n outputAmount: \"0\",\n };\n\n const execTime = new ExecTime({ type: `FraxZero EVM mintAndSendFrxUSD ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-950\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n execTime.breakpoint();\n // Check allowance of fromToken for usdcCustodianAddress (USDC must be approved to custodian)\n const allowanceResult = await this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: redeemAndMintContractAddress,\n address: refundTo,\n amountWei,\n provider,\n });\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance\");\n\n const redeemAndMintContractWithSigner = new ethers.Contract(redeemAndMintContractAddress, abi, this.signer);\n\n execTime.breakpoint();\n let finalPreviewMintResult = previewMintResult;\n if (!finalPreviewMintResult) {\n finalPreviewMintResult = await this.previewMintFrxUSD(params);\n }\n const {\n totalAssetsOut,\n } = finalPreviewMintResult;\n execTime.log(\"previewMintFrxUSD\");\n this.csl(\"EVM mintAndSendFrxUSD\", \"gray-600\", \"previewMintFrxUSD totalAssetsOut: %o\", totalAssetsOut);\n\n result.outputAmount = numberRemoveEndZero(\n Big(totalAssetsOut.toString()).div(10 ** 18).toFixed(18, 0)\n );\n\n // Build sendParam for deposit(assetsIn, receiver)\n const mintAndSendParam = [\n // assetsIn\n amountWei,\n // dstEid\n dstEid,\n // receiver\n addressToBytes32(toToken.chainType, recipient)\n ];\n\n result.sendParam = {\n contract: redeemAndMintContractWithSigner,\n method: \"mintAndSend\",\n param: mintAndSendParam,\n };\n\n execTime.breakpoint();\n // Estimate gas fees\n const ett = await this.estimateTransaction({\n dry,\n contract: redeemAndMintContractWithSigner,\n method: \"mintAndSend\",\n param: [...mintAndSendParam, { gasLimit: DEFAULT_GAS_LIMIT_FAILED }],\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = ett.estimateSourceGasUsd;\n result.sendParam.param.push({ gasLimit: ett.estimateSourceGasLimit });\n execTime.log(\"estimateTransaction\");\n\n execTime.logTotal(\"mintAndSendFrxUSD\");\n\n return result;\n }\n\n async retryLayerzeroLzComponse(params: any) {\n const { Options } = await import(\"@layerzerolabs/lz-v2-utilities\");\n const {\n layerzeroData,\n history,\n } = params;\n\n const LayerZeroEndpointV2 = \"0x1a44076050125825900e736c501f859c50fe728c\";\n const LayerZeroEndpointV2ABI = [\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"_to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"_guid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint16\",\n \"name\": \"_index\",\n \"type\": \"uint16\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"_message\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"_extraData\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"lzCompose\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n }\n ];\n // lzCompose(address _from,address _to,bytes32 _guid,uint16 _index,bytes _message,bytes _extraData)\n const LayerZeroEndpointV2Contract = new ethers.Contract(LayerZeroEndpointV2, LayerZeroEndpointV2ABI, this.signer);\n\n const toToken: any = usdtTokens[history.destination_chain.blockchain as keyof typeof usdtTokens];\n const amountWei = Big(history.token_in_amount).times(10 ** (toToken.decimals || 6)).toFixed(0);\n\n const originLayerzero = USDT0_CONFIG[\"Arbitrum\"];\n const isOriginLegacy = layerzeroData.destination.lzCompose.failedTx[0].from.toLowerCase() === originLayerzero.oftLegacy?.toLowerCase();\n const lzReceiveOptionGas = isOriginLegacy ? originLayerzero.lzReceiveOptionGasLegacy : originLayerzero.lzReceiveOptionGas;\n let lzReceiveOptionValue = 0;\n\n const destATA = await getDestinationAssociatedTokenAddress({\n recipient: history.receive_address,\n toToken,\n });\n if (destATA.needCreateTokenAccount) {\n lzReceiveOptionValue = LZ_RECEIVE_VALUE[toToken.chainName] || 0;\n }\n\n const composeFrom = layerzeroData.source.tx.from;\n const composeMsg = layerzeroData.source.tx.payload.split(composeFrom.replace(/^0x/, \"\"))[1];\n const _message = buildEndpointV2LzComposePayload({\n nonce: layerzeroData.pathway.nonce,\n srcEid: layerzeroData.pathway.srcEid,\n amountLD: amountWei,\n composeFrom: composeFrom,\n composeMsg: composeMsg,\n });\n\n const contractParams = [\n layerzeroData.destination.lzCompose.failedTx[0].from,\n layerzeroData.destination.lzCompose.failedTx[0].to,\n layerzeroData.guid,\n layerzeroData.destination.lzCompose.failedTx[0].index,\n _message,\n \"0x\",\n ];\n\n const dstOFT = isOriginLegacy ? originLayerzero.oft : originLayerzero.oftLegacy;\n const sendParam: any = {\n dstEid: USDT0_CONFIG[history.destination_chain.chainName].eid,\n to: addressToBytes32(toToken.chainType, history.receive_address),\n amountLD: amountWei,\n minAmountLD: 0n,\n extraOptions: Options.newOptions()\n // .addExecutorLzReceiveOption(lzReceiveOptionGas, lzReceiveOptionValue)\n .toHex(),\n composeMsg: \"0x\",\n oftCmd: \"0x\"\n };\n\n const dstOFTContract = new ethers.Contract(dstOFT!, OFT_ABI, this.provider);\n const msgFee = await dstOFTContract.quoteSend.staticCall(sendParam, false);\n let nativeFee = msgFee[0];\n nativeFee = nativeFee * NATIVE_MSG_FEE_BUFFER / 100n;\n\n const tx = await LayerZeroEndpointV2Contract.lzCompose(\n ...contractParams,\n {\n gasLimit: originLayerzero.composeOptionGas || 800000,\n value: nativeFee,\n }\n );\n\n const txReceipt = await tx.wait();\n\n if (txReceipt.status === 1) {\n return txReceipt.hash;\n }\n\n return null;\n }\n\n async signTypedData(params: any) {\n const { fromToken, amountWei, spender } = params;\n\n this.csl(\"EVM signTypedData\", \"blue-900\", \"params: %o\", params);\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const value = amountWei;\n const tokenAddress = fromToken.contractAddress;\n const chainId = fromToken.chainId;\n // 3 days\n const deadline = Math.floor(Date.now() / 1000) + (60 * 60 * 24 * 3);\n const account = this.signer.address;\n\n const erc20 = new ethers.Contract(tokenAddress, erc20Abi, provider);\n const nonce = await erc20.nonces(account);\n const name = await erc20.name();\n\n let _version = \"1\";\n if (fromToken.symbol === \"USDC\") {\n _version = \"2\";\n }\n\n const domain = {\n name,\n version: _version,\n chainId: Number(chainId),\n verifyingContract: tokenAddress\n };\n\n const types = {\n Permit: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" }\n ]\n };\n\n const values = {\n owner: account,\n spender,\n value,\n nonce: nonce.toString(),\n deadline\n };\n\n const signature = await this.signer?.signTypedData(domain, types, values);\n\n const { v, r, s } = ethers.Signature.from(signature);\n\n // Check if signature is available\n try {\n const permitParams = [\n account,\n spender,\n value,\n deadline,\n v,\n r,\n s,\n ];\n const permitResponse = await erc20.permit.staticCall(...permitParams);\n this.csl(\"EVM signTypedData\", \"green-500\", \"permit response: %o\", permitResponse);\n } catch (error: any) {\n this.csl(\"EVM signTypedData\", \"red-500\", \"check permit signature failed: %o\", error);\n throw new Error(\"Permit signature verification failed\");\n }\n\n return {\n owner: account,\n value,\n deadline,\n nonce: Number(nonce),\n v,\n r,\n s,\n };\n }\n}\n\nexport { EVMWallet };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/evm.ts"],"names":["Csl","OpenAPI","tx","ethers","erc20Abi","evmRpcFallbackProvider","balance","Big","numberRemoveEndZero","getPrice","ExecTime","getDestinationAssociatedTokenAddress","LZ_RECEIVE_VALUE","addressToBytes32","getHopMsgFee","USDT0_LEGACY_MESH_TRANSFTER_FEE","NATIVE_MSG_FEE_BUFFER","Service","SendType","userNonce","quoteSignature","FRAXZERO_MIDDLE_TOKEN_USDC","FRAXZERO_MIDDLE_TOKEN_FRXUSD","usdtTokens","USDT0_CONFIG","buildEndpointV2LzComposePayload","OFT_ABI"],"mappings":"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","file":"index.js","sourcesContent":["import {\n getPrice,\n numberRemoveEndZero,\n SendType,\n Service,\n OpenAPI,\n Csl,\n ExecTime,\n usdtTokens,\n erc20Abi,\n} from \"@stableflow/core\";\nimport {\n addressToBytes32,\n quoteSignature,\n getHopMsgFee,\n LZ_RECEIVE_VALUE,\n USDT0_CONFIG,\n USDT0_LEGACY_MESH_TRANSFTER_FEE,\n OFT_ABI,\n FRAXZERO_MIDDLE_TOKEN_FRXUSD,\n FRAXZERO_MIDDLE_TOKEN_USDC,\n} from \"@stableflow/bridges\";\nimport {\n evmRpcFallbackProvider,\n buildEndpointV2LzComposePayload,\n NATIVE_MSG_FEE_BUFFER,\n} from \"@stableflow/utils-evm\";\nimport { getDestinationAssociatedTokenAddress } from \"@stableflow/utils-solana\";\nimport Big from \"big.js\";\nimport { ethers } from \"ethers\";\n\nconst DEFAULT_GAS_LIMIT = 100000n;\nconst DEFAULT_GAS_LIMIT_FAILED = 4000000n;\n\nexport default class EVMWallet {\n provider: any;\n signer: any;\n private csl;\n\n constructor(_provider: any, _signer?: any) {\n this.provider = _provider;\n this.signer = _signer;\n const cs = new Csl(OpenAPI.DEBUG);\n this.csl = cs.log;\n }\n\n async transfer(data: {\n originAsset: string;\n depositAddress: string;\n amount: string;\n }) {\n const { originAsset, depositAddress, amount } = data;\n\n if (originAsset === \"eth\") {\n const tx = await this.signer.sendTransaction({\n to: depositAddress,\n value: ethers.parseEther(amount)\n });\n await tx.wait();\n return tx;\n }\n\n const contract = new ethers.Contract(originAsset, erc20Abi, this.signer);\n\n const tx = await contract.transfer(depositAddress, amount);\n const result = await tx.wait();\n\n return result.hash;\n }\n\n async getBalance(token: any, account: string, options?: { isCatchError?: boolean; }) {\n const { isCatchError = false } = options || {};\n\n try {\n let provider = this.provider;\n if (token.rpcUrls) {\n provider = evmRpcFallbackProvider(token);\n }\n\n if (token.symbol === \"eth\" || token.symbol === \"ETH\" || token.symbol === \"native\") {\n const balance = await provider.getBalance(account);\n return balance.toString();\n }\n\n // Use provider instead of _signer for read-only operations\n const contract = new ethers.Contract(token.contractAddress, erc20Abi, provider);\n\n const balance = await contract.balanceOf(account);\n this.csl(\"EVM getBalance\", \"green-500\", \"Success getting %s token balance: %o\", token.contractAddress, balance);\n\n return balance.toString();\n } catch (err) {\n this.csl(\"EVM getBalance\", \"red-500\", \"Get balance failed: %o\", err);\n if (isCatchError) {\n throw err;\n }\n return \"0\";\n }\n }\n\n async balanceOf(token: any, account: string, options?: { isCatchError?: boolean; }) {\n return await this.getBalance(token, account, options);\n }\n\n /**\n * Estimate gas limit for transfer transaction\n * @param data Transfer data\n * @returns Gas limit estimate, gas price, and estimated gas cost\n */\n async estimateTransferGas(data: {\n fromToken: any;\n depositAddress: string;\n amount: string;\n account: string;\n }): Promise<{\n gasLimit: bigint;\n gasPrice: bigint;\n estimateGas: bigint;\n }> {\n const { fromToken, depositAddress, amount, account } = data;\n const originAsset = fromToken.contractAddress;\n const provider = evmRpcFallbackProvider(fromToken);\n\n let gasLimit: bigint;\n\n if (originAsset === \"eth\") {\n // Estimate gas for ETH transfer\n const tx = {\n from: account,\n to: depositAddress,\n value: ethers.parseEther(amount)\n };\n gasLimit = await provider.estimateGas(tx);\n } else {\n // Estimate gas for ERC20 token transfer\n const contract = new ethers.Contract(originAsset, erc20Abi, provider);\n gasLimit = await contract.transfer.estimateGas(depositAddress, amount);\n }\n\n // Increase gas limit by 20% to provide buffer\n gasLimit = (gasLimit * 120n) / 100n;\n\n // Get gas price\n const feeData = await provider.getFeeData();\n const gasPrice = feeData.gasPrice || 0n;\n\n // Calculate estimated gas cost: gasLimit * gasPrice\n const estimateGas = gasLimit * gasPrice;\n\n return {\n gasLimit,\n gasPrice,\n estimateGas\n };\n }\n\n getContract(params: any) {\n const {\n contractAddress,\n abi,\n } = params;\n\n return new ethers.Contract(contractAddress, abi, this.signer);\n }\n\n async allowance(params: any) {\n const {\n dry,\n contractAddress,\n spender,\n address,\n amountWei,\n provider,\n blockTag,\n strict = false,\n } = params;\n\n const runner = provider || this.provider;\n const contract = new ethers.Contract(contractAddress, erc20Abi, runner);\n\n // If querying for a quote\n // Directly return the default value\n if (dry) {\n return {\n contract,\n allowance: \"0\",\n needApprove: false,\n };\n }\n\n // get allowance\n let allowance = \"0\";\n try {\n allowance = blockTag\n ? await contract.allowance(address, spender, { blockTag })\n : await contract.allowance(address, spender);\n allowance = allowance.toString();\n } catch (error) {\n this.csl(\"EVM allowance\", \"red-500\", \"Error getting allowance: %o\", error);\n if (strict) {\n throw error;\n }\n }\n\n return {\n contract,\n allowance,\n needApprove: Big(amountWei || 0).gt(allowance || 0),\n };\n }\n\n async approve(params: any) {\n const {\n contractAddress,\n spender,\n amountWei,\n isApproveMax = false,\n isDetails = false,\n isWaitTxReceipt = true,\n } = params;\n\n const contract = new ethers.Contract(contractAddress, erc20Abi, this.signer);\n\n let _amountWei = amountWei;\n if (isApproveMax) {\n _amountWei = ethers.MaxUint256;\n }\n\n const detailResult: any = {\n success: false,\n data: {},\n message: null,\n };\n\n try {\n const tx = await contract.approve(spender, _amountWei);\n const txReceipt = await tx.wait();\n if (txReceipt.status === 1) {\n if (isDetails) {\n const confirmations = typeof txReceipt.confirmations === \"function\"\n ? await txReceipt.confirmations()\n : txReceipt.confirmations;\n detailResult.success = true;\n detailResult.data = {\n txHash: txReceipt.hash,\n blockNumber: txReceipt.blockNumber,\n confirmations,\n };\n return detailResult;\n }\n return true;\n }\n if (isDetails) {\n detailResult.message = \"Arrove failed\";\n return detailResult;\n }\n return false;\n } catch (error: any) {\n this.csl(\"EVM approve\", \"red-500\", \"Error approve: %o\", error);\n if (isDetails) {\n detailResult.message = error.message;\n }\n }\n\n if (isDetails) {\n return detailResult;\n }\n\n return false;\n }\n\n async getEstimateGas(params: any) {\n const { gasLimit, price, nativeToken, provider, gasPrice } = params;\n\n let finalGasPrice = gasPrice;\n if (!finalGasPrice) {\n const feeData = await provider.getFeeData();\n finalGasPrice = feeData.maxFeePerGas || feeData.gasPrice || BigInt(\"20000000000\"); // Default 20 gwei\n }\n\n const estimateGas = BigInt(gasLimit) * BigInt(finalGasPrice);\n const estimateGasAmount = Big(estimateGas.toString()).div(10 ** nativeToken.decimals);\n const estimateGasUsd = Big(estimateGasAmount).times(price || 1);\n\n return {\n gasPrice: finalGasPrice,\n usd: numberRemoveEndZero(Big(estimateGasUsd).toFixed(20)),\n wei: estimateGas,\n amount: numberRemoveEndZero(Big(estimateGasAmount).toFixed(nativeToken.decimals)),\n };\n }\n\n async estimateTransaction(params: any) {\n const {\n dry,\n contract,\n method,\n param,\n fromToken,\n prices,\n evmGasFees,\n defaultGasLimit = DEFAULT_GAS_LIMIT,\n refundTo,\n txRequest,\n } = params;\n\n const cs = new Csl(OpenAPI.DEBUG);\n const csl = cs.log;\n\n const provider = evmRpcFallbackProvider(fromToken);\n const nativeTokenPrice = getPrice(prices, fromToken.nativeToken.symbol);\n\n const result = {\n estimateSourceGasLimit: dry ? DEFAULT_GAS_LIMIT_FAILED : DEFAULT_GAS_LIMIT,\n estimateSourceGas: 0n,\n estimateSourceGasUsd: \"0\",\n };\n\n const setDefaultGasLimit = async () => {\n const { usd, wei } = await this.getEstimateGas({\n gasLimit: DEFAULT_GAS_LIMIT,\n price: nativeTokenPrice,\n nativeToken: fromToken.nativeToken,\n provider,\n gasPrice: dry ? evmGasFees[fromToken.chainId].gasPrice : void 0,\n });\n result.estimateSourceGas = wei;\n result.estimateSourceGasUsd = usd;\n };\n\n let finalGasLimit = defaultGasLimit;\n\n if (dry) {\n await setDefaultGasLimit();\n return result;\n }\n\n if (txRequest) {\n try {\n const gasLimit = await provider.estimateGas({\n to: txRequest.target,\n data: txRequest.calldata,\n from: refundTo || this.signer?.address,\n });\n finalGasLimit = gasLimit * 120n / 100n;\n const { usd, wei } = await this.getEstimateGas({\n gasLimit: finalGasLimit,\n price: nativeTokenPrice,\n nativeToken: fromToken.nativeToken,\n provider,\n });\n result.estimateSourceGasLimit = finalGasLimit;\n result.estimateSourceGas = wei;\n result.estimateSourceGasUsd = usd;\n } catch (error) {\n csl(\"EVM estimateTransaction\", \"red-500\", \"%s estimateGas failed: %o\", method, error);\n await setDefaultGasLimit();\n result.estimateSourceGasLimit = DEFAULT_GAS_LIMIT_FAILED / 2n;\n }\n\n return result;\n }\n\n try {\n const gasLimit = await contract[method].estimateGas(...param);\n finalGasLimit = gasLimit * 120n / 100n;\n const { usd, wei } = await this.getEstimateGas({\n gasLimit: finalGasLimit,\n price: nativeTokenPrice,\n nativeToken: fromToken.nativeToken,\n provider,\n });\n result.estimateSourceGasLimit = finalGasLimit;\n result.estimateSourceGas = wei;\n result.estimateSourceGasUsd = usd;\n } catch (error) {\n csl(\"EVM estimateTransaction\", \"red-500\", \"%s estimateGas failed: %o\", method, error);\n await setDefaultGasLimit();\n result.estimateSourceGasLimit = DEFAULT_GAS_LIMIT_FAILED / 2n;\n }\n\n return result;\n }\n\n async quoteOFT(params: any) {\n const { Options } = await import(\"@layerzerolabs/lz-v2-utilities\");\n const {\n dry,\n abi,\n dstEid,\n recipient,\n amountWei,\n slippageTolerance,\n payInLzToken,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n originLayerzeroAddress,\n destinationLayerzeroAddress,\n excludeFees,\n refundTo,\n multiHopComposer,\n isMultiHopComposer,\n isOriginLegacy,\n isDestinationLegacy,\n originLayerzero,\n destinationLayerzero,\n } = params;\n\n const result: any = {\n needApprove: false,\n approveSpender: originLayerzeroAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n originLayerzeroAddress: originLayerzeroAddress,\n destinationLayerzeroAddress: destinationLayerzeroAddress,\n },\n fees: {},\n totalFeesUsd: \"0\",\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: \"0\",\n estimateTime: 0, // seconds - dynamically calculated using LayerZero formula\n outputAmount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).toFixed(params.fromToken.decimals, 0)),\n };\n\n const execTime = new ExecTime({ type: `Usdt0 EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-100\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const oftContract = new ethers.Contract(originLayerzeroAddress, abi, this.signer);\n const oftContractRead = new ethers.Contract(originLayerzeroAddress, abi, provider);\n\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"params: %o\", params);\n execTime.breakpoint();\n\n // 1. check if need approve\n const approvalRequired = isOriginLegacy ? originLayerzero.oftLegacyApprovalRequired : originLayerzero.oftApprovalRequired;\n this.csl(\"EVM quoteOFT\", \"blue-900\", \"approvalRequired: %o\", approvalRequired);\n execTime.log(\"approvalRequired\");\n\n const lzReceiveOptionGas = isDestinationLegacy ? destinationLayerzero.lzReceiveOptionGasLegacy : (destinationLayerzero.lzReceiveOptionGas || 200000);\n let lzReceiveOptionValue = 0;\n\n execTime.breakpoint();\n const destATA = await getDestinationAssociatedTokenAddress({\n recipient,\n toToken,\n });\n execTime.log(\"getDestinationAssociatedTokenAddress\");\n if (destATA.needCreateTokenAccount) {\n lzReceiveOptionValue = LZ_RECEIVE_VALUE[toToken.chainName] || 0;\n }\n\n let unMultiHopExtraOptions = Options.newOptions().toHex();\n if (!isMultiHopComposer && lzReceiveOptionValue) {\n unMultiHopExtraOptions = Options.newOptions().addExecutorLzReceiveOption(lzReceiveOptionGas, lzReceiveOptionValue).toHex();\n }\n\n // 2. quote send\n const sendParam: any = {\n dstEid: dstEid,\n to: addressToBytes32(toToken.chainType, recipient),\n amountLD: amountWei,\n minAmountLD: 0n,\n extraOptions: unMultiHopExtraOptions,\n composeMsg: \"0x\",\n oftCmd: \"0x\"\n };\n\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"isMultiHopComposer: %o\", isMultiHopComposer);\n if (isMultiHopComposer) {\n // multiHopComposer: Arbitrum legacy mesh MultiHopComposer, eid = 30110\n sendParam.dstEid = multiHopComposer.eid;\n sendParam.to = addressToBytes32(\"evm\", multiHopComposer.oftMultiHopComposer);\n\n let multiHopExtraOptions = Options.newOptions().toHex();\n if (lzReceiveOptionValue) {\n multiHopExtraOptions = Options.newOptions().addExecutorLzReceiveOption(lzReceiveOptionGas, lzReceiveOptionValue).toHex();\n }\n\n const composeMsgSendParam = {\n dstEid,\n to: addressToBytes32(toToken.chainType, recipient),\n amountLD: sendParam.amountLD,\n minAmountLD: sendParam.minAmountLD,\n extraOptions: multiHopExtraOptions,\n composeMsg: \"0x\",\n oftCmd: \"0x\",\n };\n execTime.breakpoint();\n const hopMsgFee = await getHopMsgFee({\n sendParam: composeMsgSendParam,\n toToken,\n });\n execTime.log(\"getHopMsgFee\");\n\n sendParam.extraOptions = Options.newOptions()\n .addExecutorComposeOption(0, originLayerzero.composeOptionGas || 800000, hopMsgFee)\n .toHex();\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\n sendParam.composeMsg = abiCoder.encode(\n [\"tuple(uint32 dstEid, bytes32 to, uint256 amountLD, uint256 minAmountLD, bytes extraOptions, bytes composeMsg, bytes oftCmd)\"],\n [Object.values(composeMsgSendParam)]\n );\n }\n\n // 0.03% fee for Legacy Mesh transfers only (native USDT0 transfers are free)\n if (isOriginLegacy || isDestinationLegacy) {\n result.fees.legacyMeshFeeUsd = numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).times(USDT0_LEGACY_MESH_TRANSFTER_FEE).toFixed(params.fromToken.decimals));\n result.outputAmount = numberRemoveEndZero(Big(Big(amountWei || 0).div(10 ** params.fromToken.decimals)).minus(result.fees.legacyMeshFeeUsd || 0).toFixed(params.fromToken.decimals, 0));\n }\n\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"sendParam: %o\", sendParam);\n if (!dry) {\n execTime.breakpoint();\n const oftData = await oftContractRead.quoteOFT.staticCall(sendParam);\n const [, , oftReceipt] = oftData;\n // The slippage is calculated based on the user-defined value and the user-input amount\n sendParam.minAmountLD = Big(amountWei).times(Big(1).minus(Big(slippageTolerance || 0).div(100))).toFixed(0);\n // The actual received amount is based on the contract return value\n result.outputAmount = numberRemoveEndZero(numberRemoveEndZero(Big(oftReceipt[1].toString()).div(10 ** params.toToken.decimals).toFixed(params.toToken.decimals, 0)));\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"oftData: %o\", oftData);\n execTime.log(\"quoteOFT.staticCall\");\n }\n\n // Check if the output amount exceeds the slippage tolerance\n // If it exceeds, return an error message\n this.csl(\"EVMWallet quoteOFT\", \"red-600\", \"result.outputAmount: %o\", result.outputAmount);\n this.csl(\"EVMWallet quoteOFT\", \"red-600\", \"slippageTolerance: %o\", slippageTolerance + \"%\");\n this.csl(\"EVMWallet quoteOFT\", \"red-600\", \"Minimum received amount: %o\", Big(amountWei).div(10 ** fromToken.decimals).times(Big(1).minus(Big(slippageTolerance || 0).div(100))).toFixed(6, 0));\n if (Big(result.outputAmount).lt(Big(amountWei).div(10 ** fromToken.decimals).times(Big(1).minus(Big(slippageTolerance || 0).div(100))))) {\n result.errMsg = \"Slippage limit exceeded\";\n return result;\n }\n\n execTime.breakpoint();\n const mergedCall = [\n oftContractRead.quoteSend.staticCall(sendParam, payInLzToken),\n ];\n if (approvalRequired) {\n mergedCall.push(\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: originLayerzeroAddress,\n address: refundTo,\n amountWei,\n provider,\n })\n );\n }\n const [msgFee, allowanceResult] = await Promise.all(mergedCall);\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"quoteSend: %o\", msgFee);\n if (approvalRequired) {\n result.needApprove = allowanceResult?.needApprove;\n }\n execTime.log(\"quoteSend.staticCall and allowance\");\n\n // const msgFee = await oftContractRead.quoteSend.staticCall(sendParam, payInLzToken);\n let nativeMsgFee = msgFee[0];\n const lzMsgFee = msgFee[1];\n result.totalEstimateSourceGas = nativeMsgFee;\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"msgFee: %o, nativeMsgFee: %o\", msgFee, nativeMsgFee);\n // add 5% buffer\n nativeMsgFee = nativeMsgFee * NATIVE_MSG_FEE_BUFFER / 100n;\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"msgFee after buffer: %o\", nativeMsgFee);\n\n // csl(\"EVM quoteOFT\", \"blue-900\", \"Params: %o\", result.sendParam);\n\n // 3. estimate gas\n const nativeFeeUsd = Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).times(getPrice(prices, fromToken.nativeToken.symbol));\n result.fees.nativeFee = numberRemoveEndZero(Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).toFixed(fromToken.nativeToken.decimals));\n result.fees.nativeFeeUsd = numberRemoveEndZero(Big(nativeFeeUsd).toFixed(20));\n result.fees.lzTokenFeeUsd = numberRemoveEndZero(Big(lzMsgFee?.toString() || 0).div(10 ** fromToken.decimals).toFixed(20));\n\n const finalSendParam = [\n sendParam,\n {\n nativeFee: nativeMsgFee,\n lzTokenFee: lzMsgFee,\n },\n refundTo,\n { value: nativeMsgFee }\n ];\n\n execTime.breakpoint();\n const ett = await this.estimateTransaction({\n dry,\n contract: oftContract,\n method: \"send\",\n param: finalSendParam,\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas += ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n finalSendParam[3].gasLimit = ett.estimateSourceGasLimit;\n execTime.log(\"send.estimateGas\");\n\n result.sendParam = {\n contract: oftContract,\n method: \"send\",\n param: finalSendParam,\n };\n\n // calculate total fees\n for (const feeKey in result.fees) {\n if (excludeFees.includes(feeKey) || !/Usd$/.test(feeKey)) {\n continue;\n }\n result.totalFeesUsd = Big(result.totalFeesUsd || 0).plus(result.fees[feeKey] || 0);\n }\n result.totalFeesUsd = numberRemoveEndZero(Big(result.totalFeesUsd).toFixed(20));\n\n execTime.logTotal(\"quoteOFT\");\n\n return result;\n }\n\n async sendTransaction(params: any) {\n const {\n method,\n contract,\n param,\n } = params;\n\n // Add gas fee buffer to prevent \"max fee per gas less than block base fee\" error.\n // Between quote and send, the baseFee may increase, causing the estimated\n // maxFeePerGas to be lower than the current baseFee.\n const overridesIndex = param.length - 1;\n const overrides = param[overridesIndex] && typeof param[overridesIndex] === \"object\" && !Array.isArray(param[overridesIndex])\n ? { ...param[overridesIndex] }\n : {};\n\n if (!overrides.maxFeePerGas) {\n try {\n const feeData = await this.provider.getFeeData();\n if (feeData.maxFeePerGas) {\n // Add 20% buffer to maxFeePerGas to account for baseFee fluctuations\n overrides.maxFeePerGas = (feeData.maxFeePerGas * 120n) / 100n;\n }\n if (feeData.maxPriorityFeePerGas && !overrides.maxPriorityFeePerGas) {\n overrides.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n }\n } catch (error) {\n this.csl(\"EVM sendTransaction\", \"red-500\", \"Failed to get fee data for gas buffer: %o\", error);\n }\n }\n\n const finalParam = [...param];\n if (param[overridesIndex] && typeof param[overridesIndex] === \"object\" && !Array.isArray(param[overridesIndex])) {\n finalParam[overridesIndex] = overrides;\n } else {\n finalParam.push(overrides);\n }\n\n try {\n const tx = await contract[method](...finalParam);\n\n return tx.hash;\n } catch (error: any) {\n this.csl(\"EVM sendTransaction\", \"red-500\", \"Error sending transaction: %o, message: %o\", error, error.message);\n let _finalErrorMessage = `Transaction failed: ${error.message}`;\n if (error?.message?.includes(\"user rejected action\")) {\n _finalErrorMessage = error.message;\n }\n throw new Error(_finalErrorMessage);\n }\n\n // const DefaultErrorMsg = \"Transaction failed\";\n // try {\n // const txReceipt = await tx.wait();\n\n // if (txReceipt.status !== 1) {\n // throw new Error(DefaultErrorMsg);\n // }\n\n // return txReceipt.hash;\n // } catch (error: any) {\n // return tx.hash;\n // }\n }\n\n /**\n * Unified quote method that routes to specific quote methods based on type\n * @param type Service type from Service\n * @param params Parameters for the quote\n */\n async quote(type: Service, params: any) {\n switch (type) {\n case Service.CCTP:\n return await this.quoteCCTP(params);\n case Service.Usdt0:\n return await this.quoteOFT(params);\n case Service.OneClick:\n return await this.quoteOneClickProxy(params);\n case Service.Native:\n return await this.quoteNative(params);\n case Service.FraxZero:\n return await this.quoteFraxZero(params);\n default:\n throw new Error(`Unsupported quote type: ${type}`);\n }\n }\n\n /**\n * Unified send method that routes to specific send methods based on type\n * @param type Send type from SendType enum\n * @param params Parameters for the send transaction\n */\n async send(type: SendType, params: any) {\n switch (type) {\n case SendType.SEND:\n return await this.sendTransaction(params);\n case SendType.TRANSFER:\n return await this.transfer(params);\n default:\n throw new Error(`Unsupported send type: ${type}`);\n }\n }\n\n async quoteCCTP(params: any) {\n const {\n dry,\n proxyAddress,\n abi,\n refundTo,\n recipient,\n amountWei,\n // slippageTolerance,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n excludeFees,\n destinationDomain,\n sourceDomain,\n } = params;\n\n const result: any = {\n needApprove: false,\n approveSpender: proxyAddress,\n sendParam: void 0,\n quoteParam: {\n sourceDomain,\n destinationDomain,\n proxyAddress,\n ...params,\n },\n fees: {},\n totalFeesUsd: void 0,\n estimateSourceGas: void 0,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: void 0,\n estimateTime: Math.floor(Math.random() * 8) + 3,\n outputAmount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals, 0)),\n };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const execTime = new ExecTime({ type: `CCTP EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-200\", isDebug: OpenAPI.DEBUG });\n\n const proxyContract = new ethers.Contract(proxyAddress, abi, this.signer);\n const proxyContractRead = new ethers.Contract(proxyAddress, abi, provider);\n\n let realRecipient = recipient;\n execTime.breakpoint();\n // 1. get user nonce\n const getUsrNonce = async () => {\n let userNonce = 0n;\n try {\n userNonce = await proxyContract.userNonces(refundTo);\n } catch (error) {\n }\n return userNonce;\n };\n const mergedCalls = [\n getDestinationAssociatedTokenAddress({\n recipient,\n toToken,\n }),\n getUsrNonce(),\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n address: refundTo,\n spender: proxyAddress,\n amountWei,\n provider,\n })\n ];\n const [destATA, userNonce, allowance]: any = await Promise.all(mergedCalls);\n execTime.log(\"getDestinationATA & getUsrNonce & get allowance\", \"destATA: %o, userNonce: %o, allowance: %o\", destATA, userNonce, allowance);\n result.needCreateTokenAccount = destATA.needCreateTokenAccount;\n if (destATA.associatedTokenAddress) {\n realRecipient = destATA.associatedTokenAddress;\n }\n result.needApprove = allowance.needApprove;\n\n execTime.breakpoint();\n // 2. quote signature\n const signatureRes = await quoteSignature({\n address: refundTo,\n amount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals, 0)),\n destination_domain_id: destinationDomain,\n receipt_address: realRecipient,\n source_domain_id: sourceDomain,\n user_nonce: Number(userNonce),\n });\n const {\n bridge_fee,\n finality_threshold,\n max_fee,\n mint_fee,\n receipt_amount,\n signature,\n destination_caller,\n } = signatureRes;\n execTime.log(\"quoteSignature\");\n\n result.fees.estimateMintGasUsd = numberRemoveEndZero(Big(mint_fee || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals));\n result.fees.bridgeFeeUsd = numberRemoveEndZero(Big(bridge_fee || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals));\n const chargedAmount = BigInt(amountWei) - BigInt(mint_fee);\n result.outputAmount = numberRemoveEndZero(Big(receipt_amount || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals, 0));\n\n const depositParam = [\n // originalAmount\n amountWei,\n // chargedAmount = originalAmount - gas fee\n chargedAmount,\n // destinationDomain\n destinationDomain,\n // mintRecipient\n addressToBytes32(toToken.chainType, realRecipient),\n // burnToken\n fromToken.contractAddress,\n // destinationCaller\n destination_caller ? addressToBytes32(toToken.chainType, destination_caller) : \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n // maxFee\n max_fee,\n // minFinalityThreshold\n finality_threshold,\n // signature\n signature,\n ];\n\n execTime.breakpoint();\n // 3. estimate deposit gas\n const ett = await this.estimateTransaction({\n dry,\n contract: proxyContract,\n method: \"depositWithFee\",\n param: depositParam,\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n depositParam.push({ gasLimit: ett.estimateSourceGasLimit });\n execTime.log(\"estimateTransaction\");\n\n result.sendParam = {\n method: \"depositWithFee\",\n contract: proxyContract,\n param: depositParam,\n };\n\n // 5. calculate total fees\n for (const feeKey in result.fees) {\n if (excludeFees.includes(feeKey) || !/Usd$/.test(feeKey)) {\n continue;\n }\n result.totalFeesUsd = Big(result.totalFeesUsd || 0).plus(result.fees[feeKey] || 0);\n }\n result.totalFeesUsd = numberRemoveEndZero(Big(result.totalFeesUsd).toFixed(20));\n\n execTime.logTotal(\"quoteCCTP\");\n\n return result;\n }\n\n async quoteOneClickProxy(params: any) {\n const {\n dry,\n proxyAddress,\n abi,\n fromToken,\n refundTo,\n depositAddress,\n amountWei,\n prices,\n evmGasFees,\n } = params;\n\n const execTime = new ExecTime({ type: `OneClick EVM ${fromToken.chainName}`, logStyle: \"stone-300\", isDebug: OpenAPI.DEBUG });\n\n const result: any = { fees: {} };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const proxyContract = new ethers.Contract(proxyAddress, abi, this.signer);\n const proxyParam: any = [\n // tokenAddress\n fromToken.contractAddress,\n // recipient\n depositAddress,\n // amount\n amountWei,\n ];\n\n execTime.breakpoint();\n const mergedCalls = [\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n address: refundTo,\n spender: proxyAddress,\n amountWei: amountWei,\n provider,\n }),\n this.estimateTransaction({\n dry,\n contract: proxyContract,\n method: \"proxyTransfer\",\n param: proxyParam,\n fromToken,\n prices,\n evmGasFees,\n })\n ];\n const [allowance, ett]: any = await Promise.all(mergedCalls);\n result.needApprove = allowance.needApprove;\n result.approveSpender = proxyAddress;\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n proxyParam.push({ gasLimit: ett.estimateSourceGasLimit });\n execTime.log(\"allowance & estimateTransaction\");\n\n result.sendParam = {\n method: \"proxyTransfer\",\n contract: proxyContract,\n param: proxyParam,\n };\n\n execTime.logTotal(\"quoteOneClickPorxy\");\n\n return result;\n }\n\n async quoteNative(params: any) {\n const {\n quoteResponse,\n bridgeRouterAddress,\n ...restParams\n } = params;\n const {\n dry,\n amountWei,\n refundTo,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n } = restParams;\n\n const result: any = {\n ...quoteResponse,\n fees: {},\n needApprove: false,\n approveSpender: bridgeRouterAddress,\n quoteParam: {\n ...restParams,\n },\n sendParam: {\n txRequest: quoteResponse.txRequest,\n },\n totalFeesUsd: void 0,\n estimateSourceGas: void 0,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: void 0,\n estimateTime: quoteResponse.priority === \"fast\" ? Math.floor(Math.random() * 10) + 50 : Math.floor(Math.random() * 60) + 300,\n outputAmount: 0,\n };\n\n const execTime = new ExecTime({ type: `Native EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-400\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const estimateNativeGas = async () => {\n if (dry) {\n const ett = await this.estimateTransaction({\n dry,\n fromToken,\n prices,\n evmGasFees,\n });\n\n result.outputAmount = quoteResponse.buyerTokenAmount + \"\";\n result.fees = {\n estimateGasUsd: ett.estimateSourceGasUsd,\n widgetFeeUsd: quoteResponse.widgetFeeUsd,\n liquidityProviderFeeUsd: quoteResponse.liquidityProviderFeeUsd,\n };\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = numberRemoveEndZero(Big(quoteResponse.totalFeeUsd).toFixed(20));\n }\n else {\n const ett = await this.estimateTransaction({\n dry,\n fromToken,\n prices,\n evmGasFees,\n txRequest: quoteResponse.txRequest,\n refundTo,\n });\n\n result.outputAmount = Big(quoteResponse.amountOut || 0).div(10 ** (toToken.decimals || 6)).toFixed(toToken.decimals || 6, 0);\n result.fees = {\n estimateGasUsd: ett.estimateSourceGasUsd,\n // maybe 100 = 1%\n widgetFeeUsd: numberRemoveEndZero(Big(amountWei || 0).div(10 ** (fromToken.decimals || 6)).times(quoteResponse.widgetFee.feeRate || 0).toFixed(20, 0)),\n // not return by api\n liquidityProviderFeeUsd: \"0\",\n };\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = numberRemoveEndZero(Big(quoteResponse.amountOutBeforeFee || 0).minus(quoteResponse.amountOut).div(10 ** (fromToken.decimals || 6)).toFixed(20, 0));\n result.txRequest.gasLimit = ett.estimateSourceGasLimit;\n }\n };\n\n execTime.breakpoint();\n const mergedCalls = [\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: bridgeRouterAddress,\n address: refundTo,\n amountWei,\n }),\n estimateNativeGas()\n ];\n const [allowanceResult]: any = await Promise.all(mergedCalls);\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance & estimateNativeGas\");\n\n execTime.logTotal(\"quoteNative\");\n\n return result;\n }\n\n async quoteFraxZero(params: any) {\n const {\n dry,\n abi,\n recipient,\n amountWei,\n slippageTolerance,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n excludeFees,\n refundTo,\n originLayerzero,\n destinationLayerzero,\n } = params;\n\n const {\n eid: srcEid,\n remoteHop,\n lockbox,\n } = originLayerzero;\n const {\n eid: dstEid,\n } = destinationLayerzero;\n\n const isFromEthereum = fromToken.chainId === 1;\n\n const result: any = {\n needApprove: false,\n approveSpender: remoteHop,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime: 0,\n outputAmount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).toFixed(params.fromToken.decimals, 0)),\n };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const execTime = new ExecTime({ type: `FraxZero EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-500\", isDebug: OpenAPI.DEBUG });\n\n const remoteHopContract = new ethers.Contract(remoteHop, abi, this.signer);\n const remoteHopContractRead = new ethers.Contract(remoteHop, abi, provider);\n\n // 1. check if need approve\n // 2. get message fee\n const sendParams = [\n // _oft\n isFromEthereum ? lockbox : fromToken.contractAddress,\n // _dstEid\n dstEid,\n // _to\n addressToBytes32(toToken.chainType, recipient),\n // _amountLD\n amountWei\n ];\n execTime.breakpoint();\n const mergedCalls = [\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: remoteHop,\n address: refundTo,\n amountWei,\n provider,\n }),\n remoteHopContractRead.quote.staticCall(...sendParams)\n ];\n const [allowanceResult, msgFee]: any = await Promise.all(mergedCalls);\n execTime.log(\"allowance & quote.staticCall\");\n\n result.needApprove = allowanceResult.needApprove;\n\n let nativeMsgFee = msgFee[0];\n this.csl(\"EVM quoteFraxZero\", \"blue-700\", \"nativeMsgFee: %o\", nativeMsgFee);\n\n // add 5% buffer\n nativeMsgFee = nativeMsgFee * NATIVE_MSG_FEE_BUFFER / 100n;\n this.csl(\"EVM quoteFraxZero\", \"blue-700\", \"nativeMsgFee after buffer: %o\", nativeMsgFee);\n result.totalEstimateSourceGas = nativeMsgFee;\n\n const nativeFeeUsd = Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).times(getPrice(prices, fromToken.nativeToken.symbol));\n result.fees.nativeFee = numberRemoveEndZero(Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).toFixed(fromToken.nativeToken.decimals));\n result.fees.nativeFeeUsd = numberRemoveEndZero(Big(nativeFeeUsd).toFixed(20));\n result.fees.lzTokenFeeUsd = numberRemoveEndZero(Big(msgFee[1]?.toString() || 0).div(10 ** fromToken.decimals).toFixed(20));\n\n this.csl(\"EVM quoteFraxZero\", \"blue-700\", \"msgFee: %o\", msgFee);\n\n execTime.breakpoint();\n // 3. estimate send gas\n const finalSendParam = [...sendParams, { value: nativeMsgFee }];\n const ett = await this.estimateTransaction({\n dry,\n contract: remoteHopContract,\n method: \"sendOFT\",\n param: finalSendParam,\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas += ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n finalSendParam[finalSendParam.length - 1].gasLimit = ett.estimateSourceGasLimit;\n execTime.log(\"sendOFT.estimateTransaction\");\n\n // 4. generate transaction\n result.sendParam = {\n contract: remoteHopContract,\n method: \"sendOFT\",\n param: finalSendParam,\n };\n\n // 5. calculate total fees\n for (const feeKey in result.fees) {\n if (excludeFees.includes(feeKey) || !/Usd$/.test(feeKey)) {\n continue;\n }\n result.totalFeesUsd = Big(result.totalFeesUsd || 0).plus(result.fees[feeKey] || 0);\n }\n result.totalFeesUsd = numberRemoveEndZero(Big(result.totalFeesUsd).toFixed(20));\n\n execTime.logTotal(\"quoteFraxZero\");\n\n return result;\n }\n\n async preivewRedeemFrxUSD(params: any) {\n const {\n dry,\n amountWei,\n fromToken,\n abi,\n usdcCustodianAddress,\n rwaCustodianAddress,\n redemptionAddress,\n } = params;\n\n // csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n if (dry) {\n return {\n maxUsdc: 0n,\n maxRwa: 0n,\n amountWeiBigInt: 0n,\n // The token obtained from redeem is Ethereum USDC\n totalAssetsOut: BigInt(Big(amountWei || 0).div(10 ** fromToken.decimals).times(10 ** FRAXZERO_MIDDLE_TOKEN_USDC.decimals).toFixed(0, 0)),\n isInsufficientLiquidity: false,\n };\n }\n\n const execTime = new ExecTime({ type: `FraxZero EVM preivewRedeemFrxUSD ${fromToken.chainName}`, logStyle: \"stone-600\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n // Get maxSharesRedeemable (index 3) from mdwrComboView for both custodians\n const usdcCustodian = new ethers.Contract(usdcCustodianAddress, abi, provider);\n const rwaCustodian = new ethers.Contract(rwaCustodianAddress, abi, provider);\n const redemption = new ethers.Contract(redemptionAddress, abi, provider);\n\n execTime.breakpoint();\n const [usdcView, redemptionView] = await Promise.all([\n usdcCustodian.mdwrComboView.staticCall(),\n redemption.maxUstbRedemptionAmount.staticCall(),\n ]);\n execTime.log(\"usdcCustodian & redemption\");\n\n // This value is the frxUSD wei amount\n const maxUsdc = usdcView[3]; // maxSharesRedeemable\n const superstateTokenAmount = redemptionView[0]; // superstateTokenAmount\n\n // This value represents the wei amount of USDC\n const [maxRwa] = await redemption.calculateUsdcOut.staticCall(superstateTokenAmount);\n\n const amountWeiBigInt = BigInt(amountWei || 0);\n\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"usdcCustodian maxSharesRedeemable(frxUSD wei amount): %o\", maxUsdc);\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"rwaCustodian maxSharesRedeemable(USDC wei amount): %o\", maxRwa);\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"amountWei: %o\", amountWeiBigInt);\n\n let totalAssetsOut = 0n;\n let isInsufficientLiquidity = false;\n\n if (amountWeiBigInt <= maxUsdc) {\n // USDC path only\n execTime.breakpoint();\n const assetsOut = await usdcCustodian.previewRedeem.staticCall(amountWeiBigInt);\n execTime.log(\"usdcCustodian.previewRedeem (USDC only)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC path only, usdcCustodian previewRedeem input: %o, value: %o\", amountWeiBigInt, assetsOut);\n totalAssetsOut = assetsOut;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC path only, totalAssetsOut: %o\", totalAssetsOut);\n } else {\n // USDC first (maxUsdc), then RWA for remainder\n if (maxUsdc > 0n) {\n execTime.breakpoint();\n const usdcAssetsOut = await usdcCustodian.previewRedeem.staticCall(maxUsdc);\n execTime.log(\"usdcCustodian.previewRedeem (mixed)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), usdcCustodian previewRedeem input: %o, value: %o\", maxUsdc, usdcAssetsOut);\n totalAssetsOut += usdcAssetsOut;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), totalAssetsOut: %o\", totalAssetsOut);\n }\n const rwaAmount = amountWeiBigInt - maxUsdc;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"RWA for remainder, rwaAmount: %o\", rwaAmount);\n if (rwaAmount > 0n) {\n execTime.breakpoint();\n const superstateTokenInAmount = await rwaCustodian.previewRedeem.staticCall(rwaAmount);\n execTime.log(\"rwaCustodian.previewRedeem (mixed)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), rwaCustodian previewRedeem input: %o, superstateTokenInAmount: %o\", rwaAmount, superstateTokenInAmount);\n execTime.breakpoint();\n const [rwaAssetsOut] = await redemption.calculateUsdcOut.staticCall(superstateTokenInAmount);\n execTime.log(\"redemption.calculateUsdcOut (mixed)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), rwaCustodian previewRedeem input: %o, value: %o\", rwaAmount, rwaAssetsOut);\n totalAssetsOut += rwaAssetsOut;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"RWA for remainder, totalAssetsOut: %o\", totalAssetsOut);\n\n if (rwaAssetsOut > maxRwa) {\n isInsufficientLiquidity = true;\n }\n }\n }\n\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"final totalAssetsOut: %o\", totalAssetsOut);\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"final insufficient liquidity: %o\", isInsufficientLiquidity);\n\n execTime.logTotal(\"preivewRedeemFrxUSD\");\n\n return {\n maxUsdc,\n maxRwa,\n amountWeiBigInt,\n totalAssetsOut,\n isInsufficientLiquidity,\n };\n }\n\n async previewMintFrxUSD(params: any) {\n const {\n dry,\n amountWei,\n fromToken,\n abi,\n usdcCustodianAddress,\n } = params;\n\n this.csl(\"EVM previewMintFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n if (dry) {\n return {\n maxUsdc: 0n,\n amountWeiBigInt: 0n,\n totalMax: 0n,\n // Minting means converting Ethereum USDC into Ethereum frxUSD\n totalAssetsOut: BigInt(Big(amountWei || 0).div(10 ** fromToken.decimals).times(10 ** FRAXZERO_MIDDLE_TOKEN_FRXUSD.decimals).toFixed(0, 0)),\n };\n }\n\n const execTime = new ExecTime({ type: `FraxZero EVM previewMintFrxUSD ${fromToken.chainName}`, logStyle: \"stone-700\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n // Get maxAssetsDepositable (index 0) from mdwrComboView for both custodians\n const usdcCustodian = new ethers.Contract(usdcCustodianAddress, abi, provider);\n\n execTime.breakpoint();\n const usdcView = await usdcCustodian.mdwrComboView.staticCall();\n execTime.log(\"usdcCustodian.mdwrComboView\");\n\n const maxUsdc = usdcView[0]; // maxAssetsDepositable\n\n const amountWeiBigInt = BigInt(amountWei || 0);\n const totalMax = maxUsdc;\n\n execTime.breakpoint();\n const totalAssetsOut = await usdcCustodian.previewDeposit.staticCall(amountWeiBigInt);\n execTime.log(\"usdcCustodian.previewDeposit\");\n\n execTime.logTotal(\"previewMintFrxUSD\");\n\n return {\n maxUsdc,\n amountWeiBigInt,\n totalMax,\n totalAssetsOut,\n };\n }\n\n /**\n * Redeem frxUSD to USDC via USDC and/or RWA custodian contracts.\n * Uses mdwrComboView to get max redeemable liquidity and splits redemption across USDC/RWA paths.\n * Uses previewRedeem to get accurate output amount (USDC).\n */\n async redeemFrxUSD(params: any) {\n const {\n dry,\n recipient,\n amountWei,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n refundTo,\n abi,\n usdcCustodianAddress,\n rwaCustodianAddress,\n redeemAndMintContractAddress,\n preivewRedeemResult,\n } = params;\n\n this.csl(\"EVM redeemFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n // Ethereum average block time ~12s, random ±5 seconds\n const ETH_AVG_BLOCK_TIME = 12;\n const estimateTime = (ETH_AVG_BLOCK_TIME * 2) + Math.floor(Math.random() * 11) - 5;\n\n const result: any = {\n needApprove: false,\n approveSpender: redeemAndMintContractAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime,\n outputAmount: \"0\",\n };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const execTime = new ExecTime({ type: `FraxZero EVM redeemFrxUSD ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-800\", isDebug: OpenAPI.DEBUG });\n\n const redeemContractRead = new ethers.Contract(redeemAndMintContractAddress, abi, provider);\n const redeemContract = new ethers.Contract(redeemAndMintContractAddress, abi, this.signer);\n\n execTime.breakpoint();\n let finalPreivewRedeemResult = preivewRedeemResult;\n if (!finalPreivewRedeemResult) {\n finalPreivewRedeemResult = await this.preivewRedeemFrxUSD(params);\n }\n const {\n isInsufficientLiquidity,\n totalAssetsOut,\n } = finalPreivewRedeemResult;\n execTime.log(\"preivewRedeemFrxUSD\");\n\n if (isInsufficientLiquidity) {\n throw new Error(\"Insufficient liquidity\");\n }\n\n // outputAmount = USDC amount (6 decimals), human-readable\n result.outputAmount = numberRemoveEndZero(\n Big(totalAssetsOut.toString()).div(10 ** toToken.decimals).toFixed(toToken.decimals, 0)\n );\n\n execTime.breakpoint();\n // check allowance of fromToken for redeemAndMintContractAddress\n const allowanceResult = await this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: redeemAndMintContractAddress,\n address: refundTo,\n amountWei,\n provider,\n });\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance\");\n\n result.sendParam = {\n contract: redeemContract,\n method: \"redeemToUsdcAndTransfer\",\n param: [\n amountWei,\n recipient,\n ],\n };\n\n execTime.breakpoint();\n // Estimate gas for multicall aggregate and compute fees\n const ett = await this.estimateTransaction({\n dry,\n contract: redeemContract,\n method: result.sendParam.method,\n param: [...result.sendParam.param, { gasLimit: DEFAULT_GAS_LIMIT_FAILED }],\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = ett.estimateSourceGasUsd;\n result.sendParam.param[2] = { gasLimit: ett.estimateSourceGasLimit };\n execTime.log(\"estimateTransaction\");\n\n execTime.logTotal(\"redeemFrxUSD\");\n\n return result;\n }\n\n /**\n * Mint frxUSD by depositing USDC into the custodian contract.\n * Calls deposit(assetsIn, receiver) on usdcCustodianAddress.\n * assetsIn = USDC amount (6 decimals), sharesOut = frxUSD amount (18 decimals).\n */\n async mintFrxUSD(params: any) {\n const {\n dry,\n recipient,\n amountWei,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n refundTo,\n abi,\n usdcCustodianAddress,\n previewMintResult,\n } = params;\n\n this.csl(\"EVM mintFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n // Ethereum average block time ~12s, estimateTime = 12*2 + random(-5, 5) seconds\n const ETH_AVG_BLOCK_TIME = 12;\n const estimateTime = (ETH_AVG_BLOCK_TIME * 2) + Math.floor(Math.random() * 11) - 5;\n\n const result: any = {\n needApprove: false,\n approveSpender: usdcCustodianAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime,\n outputAmount: \"0\",\n };\n\n const execTime = new ExecTime({ type: `FraxZero EVM mintFrxUSD ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-900\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n execTime.breakpoint();\n // Check allowance of fromToken for usdcCustodianAddress (USDC must be approved to custodian)\n const allowanceResult = await this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: usdcCustodianAddress,\n address: refundTo,\n amountWei,\n provider,\n });\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance\");\n\n const usdcCustodian = new ethers.Contract(usdcCustodianAddress, abi, provider);\n const usdcCustodianWithSigner = new ethers.Contract(usdcCustodianAddress, abi, this.signer);\n\n execTime.breakpoint();\n let finalPreviewMintResult = previewMintResult;\n if (!finalPreviewMintResult) {\n finalPreviewMintResult = await this.previewMintFrxUSD(params);\n }\n const {\n maxUsdc,\n amountWeiBigInt,\n totalMax,\n totalAssetsOut,\n } = finalPreviewMintResult;\n execTime.log(\"previewMintFrxUSD\");\n\n result.outputAmount = numberRemoveEndZero(\n Big(totalAssetsOut.toString()).div(10 ** toToken.decimals).toFixed(toToken.decimals, 0)\n );\n\n result.sendParam = {\n contract: usdcCustodianWithSigner,\n method: \"deposit\",\n param: [\n amountWeiBigInt,\n recipient,\n ],\n };\n\n execTime.breakpoint();\n // Estimate gas fees\n const ett = await this.estimateTransaction({\n dry,\n contract: usdcCustodianWithSigner,\n method: \"deposit\",\n param: [...result.sendParam.param, { gasLimit: DEFAULT_GAS_LIMIT_FAILED }],\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = ett.estimateSourceGasUsd;\n result.sendParam.param[2] = { gasLimit: ett.estimateSourceGasLimit };\n execTime.log(\"estimateTransaction\");\n\n execTime.logTotal(\"mintFrxUSD\");\n\n return result;\n }\n\n async mintAndSendFrxUSD(params: any) {\n const {\n dry,\n recipient,\n amountWei,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n refundTo,\n abi,\n usdcCustodianAddress,\n redeemAndMintContractAddress,\n originLayerzero,\n destinationLayerzero,\n previewMintResult,\n } = params;\n\n this.csl(\"EVM mintAndSendFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n const {\n eid: dstEid,\n } = destinationLayerzero;\n\n // Ethereum average block time ~12s, estimateTime = 12*2 + random(-5, 5) seconds\n const ETH_AVG_BLOCK_TIME = 12;\n const estimateTime = (ETH_AVG_BLOCK_TIME * 2) + Math.floor(Math.random() * 11) - 5;\n\n const result: any = {\n needApprove: false,\n approveSpender: redeemAndMintContractAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime,\n outputAmount: \"0\",\n };\n\n const execTime = new ExecTime({ type: `FraxZero EVM mintAndSendFrxUSD ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-950\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n execTime.breakpoint();\n // Check allowance of fromToken for usdcCustodianAddress (USDC must be approved to custodian)\n const allowanceResult = await this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: redeemAndMintContractAddress,\n address: refundTo,\n amountWei,\n provider,\n });\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance\");\n\n const redeemAndMintContractWithSigner = new ethers.Contract(redeemAndMintContractAddress, abi, this.signer);\n\n execTime.breakpoint();\n let finalPreviewMintResult = previewMintResult;\n if (!finalPreviewMintResult) {\n finalPreviewMintResult = await this.previewMintFrxUSD(params);\n }\n const {\n totalAssetsOut,\n } = finalPreviewMintResult;\n execTime.log(\"previewMintFrxUSD\");\n this.csl(\"EVM mintAndSendFrxUSD\", \"gray-600\", \"previewMintFrxUSD totalAssetsOut: %o\", totalAssetsOut);\n\n result.outputAmount = numberRemoveEndZero(\n Big(totalAssetsOut.toString()).div(10 ** 18).toFixed(18, 0)\n );\n\n // Build sendParam for deposit(assetsIn, receiver)\n const mintAndSendParam = [\n // assetsIn\n amountWei,\n // dstEid\n dstEid,\n // receiver\n addressToBytes32(toToken.chainType, recipient)\n ];\n\n result.sendParam = {\n contract: redeemAndMintContractWithSigner,\n method: \"mintAndSend\",\n param: mintAndSendParam,\n };\n\n execTime.breakpoint();\n // Estimate gas fees\n const ett = await this.estimateTransaction({\n dry,\n contract: redeemAndMintContractWithSigner,\n method: \"mintAndSend\",\n param: [...mintAndSendParam, { gasLimit: DEFAULT_GAS_LIMIT_FAILED }],\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = ett.estimateSourceGasUsd;\n result.sendParam.param.push({ gasLimit: ett.estimateSourceGasLimit });\n execTime.log(\"estimateTransaction\");\n\n execTime.logTotal(\"mintAndSendFrxUSD\");\n\n return result;\n }\n\n async retryLayerzeroLzComponse(params: any) {\n const { Options } = await import(\"@layerzerolabs/lz-v2-utilities\");\n const {\n layerzeroData,\n history,\n } = params;\n\n const LayerZeroEndpointV2 = \"0x1a44076050125825900e736c501f859c50fe728c\";\n const LayerZeroEndpointV2ABI = [\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"_to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"_guid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint16\",\n \"name\": \"_index\",\n \"type\": \"uint16\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"_message\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"_extraData\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"lzCompose\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n }\n ];\n // lzCompose(address _from,address _to,bytes32 _guid,uint16 _index,bytes _message,bytes _extraData)\n const LayerZeroEndpointV2Contract = new ethers.Contract(LayerZeroEndpointV2, LayerZeroEndpointV2ABI, this.signer);\n\n const toToken: any = usdtTokens[history.destination_chain.blockchain as keyof typeof usdtTokens];\n const amountWei = Big(history.token_in_amount).times(10 ** (toToken.decimals || 6)).toFixed(0);\n\n const originLayerzero = USDT0_CONFIG[\"Arbitrum\"];\n const isOriginLegacy = layerzeroData.destination.lzCompose.failedTx[0].from.toLowerCase() === originLayerzero.oftLegacy?.toLowerCase();\n const lzReceiveOptionGas = isOriginLegacy ? originLayerzero.lzReceiveOptionGasLegacy : originLayerzero.lzReceiveOptionGas;\n let lzReceiveOptionValue = 0;\n\n const destATA = await getDestinationAssociatedTokenAddress({\n recipient: history.receive_address,\n toToken,\n });\n if (destATA.needCreateTokenAccount) {\n lzReceiveOptionValue = LZ_RECEIVE_VALUE[toToken.chainName] || 0;\n }\n\n const composeFrom = layerzeroData.source.tx.from;\n const composeMsg = layerzeroData.source.tx.payload.split(composeFrom.replace(/^0x/, \"\"))[1];\n const _message = buildEndpointV2LzComposePayload({\n nonce: layerzeroData.pathway.nonce,\n srcEid: layerzeroData.pathway.srcEid,\n amountLD: amountWei,\n composeFrom: composeFrom,\n composeMsg: composeMsg,\n });\n\n const contractParams = [\n layerzeroData.destination.lzCompose.failedTx[0].from,\n layerzeroData.destination.lzCompose.failedTx[0].to,\n layerzeroData.guid,\n layerzeroData.destination.lzCompose.failedTx[0].index,\n _message,\n \"0x\",\n ];\n\n const dstOFT = isOriginLegacy ? originLayerzero.oft : originLayerzero.oftLegacy;\n const sendParam: any = {\n dstEid: USDT0_CONFIG[history.destination_chain.chainName].eid,\n to: addressToBytes32(toToken.chainType, history.receive_address),\n amountLD: amountWei,\n minAmountLD: 0n,\n extraOptions: Options.newOptions()\n // .addExecutorLzReceiveOption(lzReceiveOptionGas, lzReceiveOptionValue)\n .toHex(),\n composeMsg: \"0x\",\n oftCmd: \"0x\"\n };\n\n const dstOFTContract = new ethers.Contract(dstOFT!, OFT_ABI, this.provider);\n const msgFee = await dstOFTContract.quoteSend.staticCall(sendParam, false);\n let nativeFee = msgFee[0];\n nativeFee = nativeFee * NATIVE_MSG_FEE_BUFFER / 100n;\n\n const tx = await LayerZeroEndpointV2Contract.lzCompose(\n ...contractParams,\n {\n gasLimit: originLayerzero.composeOptionGas || 800000,\n value: nativeFee,\n }\n );\n\n const txReceipt = await tx.wait();\n\n if (txReceipt.status === 1) {\n return txReceipt.hash;\n }\n\n return null;\n }\n\n async signTypedData(params: any) {\n const { fromToken, amountWei, spender } = params;\n\n this.csl(\"EVM signTypedData\", \"blue-900\", \"params: %o\", params);\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const value = amountWei;\n const tokenAddress = fromToken.contractAddress;\n const chainId = fromToken.chainId;\n // 3 days\n const deadline = Math.floor(Date.now() / 1000) + (60 * 60 * 24 * 3);\n const account = this.signer.address;\n\n const erc20 = new ethers.Contract(tokenAddress, erc20Abi, provider);\n const nonce = await erc20.nonces(account);\n const name = await erc20.name();\n\n let _version = \"1\";\n if (fromToken.symbol === \"USDC\") {\n _version = \"2\";\n }\n\n const domain = {\n name,\n version: _version,\n chainId: Number(chainId),\n verifyingContract: tokenAddress\n };\n\n const types = {\n Permit: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" }\n ]\n };\n\n const values = {\n owner: account,\n spender,\n value,\n nonce: nonce.toString(),\n deadline\n };\n\n const signature = await this.signer?.signTypedData(domain, types, values);\n\n const { v, r, s } = ethers.Signature.from(signature);\n\n // Check if signature is available\n try {\n const permitParams = [\n account,\n spender,\n value,\n deadline,\n v,\n r,\n s,\n ];\n const permitResponse = await erc20.permit.staticCall(...permitParams);\n this.csl(\"EVM signTypedData\", \"green-500\", \"permit response: %o\", permitResponse);\n } catch (error: any) {\n this.csl(\"EVM signTypedData\", \"red-500\", \"check permit signature failed: %o\", error);\n throw new Error(\"Permit signature verification failed\");\n }\n\n return {\n owner: account,\n value,\n deadline,\n nonce: Number(nonce),\n v,\n r,\n s,\n };\n }\n}\n\nexport { EVMWallet };\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -383,13 +383,25 @@ var EVMWallet = class {
|
|
|
383
383
|
[Object.values(composeMsgSendParam)]
|
|
384
384
|
);
|
|
385
385
|
}
|
|
386
|
+
if (isOriginLegacy || isDestinationLegacy) {
|
|
387
|
+
result.fees.legacyMeshFeeUsd = numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).times(USDT0_LEGACY_MESH_TRANSFTER_FEE).toFixed(params.fromToken.decimals));
|
|
388
|
+
result.outputAmount = numberRemoveEndZero(Big(Big(amountWei || 0).div(10 ** params.fromToken.decimals)).minus(result.fees.legacyMeshFeeUsd || 0).toFixed(params.fromToken.decimals, 0));
|
|
389
|
+
}
|
|
386
390
|
if (!dry) {
|
|
387
391
|
execTime.breakpoint();
|
|
388
392
|
const oftData = await oftContractRead.quoteOFT.staticCall(sendParam);
|
|
389
393
|
const [, , oftReceipt] = oftData;
|
|
390
|
-
sendParam.minAmountLD =
|
|
394
|
+
sendParam.minAmountLD = Big(amountWei).times(Big(1).minus(Big(slippageTolerance || 0).div(100))).toFixed(0);
|
|
395
|
+
result.outputAmount = numberRemoveEndZero(numberRemoveEndZero(Big(oftReceipt[1].toString()).div(10 ** params.toToken.decimals).toFixed(params.toToken.decimals, 0)));
|
|
391
396
|
execTime.log("quoteOFT.staticCall");
|
|
392
397
|
}
|
|
398
|
+
this.csl("EVMWallet quoteOFT", "red-600", "result.outputAmount: %o", result.outputAmount);
|
|
399
|
+
this.csl("EVMWallet quoteOFT", "red-600", "slippageTolerance: %o", slippageTolerance + "%");
|
|
400
|
+
this.csl("EVMWallet quoteOFT", "red-600", "Minimum received amount: %o", Big(amountWei).div(10 ** fromToken.decimals).times(Big(1).minus(Big(slippageTolerance || 0).div(100))).toFixed(6, 0));
|
|
401
|
+
if (Big(result.outputAmount).lt(Big(amountWei).div(10 ** fromToken.decimals).times(Big(1).minus(Big(slippageTolerance || 0).div(100))))) {
|
|
402
|
+
result.errMsg = "Slippage limit exceeded";
|
|
403
|
+
return result;
|
|
404
|
+
}
|
|
393
405
|
execTime.breakpoint();
|
|
394
406
|
const mergedCall = [
|
|
395
407
|
oftContractRead.quoteSend.staticCall(sendParam, payInLzToken)
|
|
@@ -419,10 +431,6 @@ var EVMWallet = class {
|
|
|
419
431
|
result.fees.nativeFee = numberRemoveEndZero(Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).toFixed(fromToken.nativeToken.decimals));
|
|
420
432
|
result.fees.nativeFeeUsd = numberRemoveEndZero(Big(nativeFeeUsd).toFixed(20));
|
|
421
433
|
result.fees.lzTokenFeeUsd = numberRemoveEndZero(Big(lzMsgFee?.toString() || 0).div(10 ** fromToken.decimals).toFixed(20));
|
|
422
|
-
if (isOriginLegacy || isDestinationLegacy) {
|
|
423
|
-
result.fees.legacyMeshFeeUsd = numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).times(USDT0_LEGACY_MESH_TRANSFTER_FEE).toFixed(params.fromToken.decimals));
|
|
424
|
-
result.outputAmount = numberRemoveEndZero(Big(Big(amountWei || 0).div(10 ** params.fromToken.decimals)).minus(result.fees.legacyMeshFeeUsd || 0).toFixed(params.fromToken.decimals, 0));
|
|
425
|
-
}
|
|
426
434
|
const finalSendParam = [
|
|
427
435
|
sendParam,
|
|
428
436
|
{
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/evm.ts"],"names":["tx","balance","userNonce"],"mappings":";;;;;;;;AA+BA,IAAM,iBAAA,GAAoB,OAAA;AAC1B,IAAM,wBAAA,GAA2B,QAAA;AAEjC,IAAqB,YAArB,MAA+B;AAAA,EAK7B,WAAA,CAAY,WAAgB,OAAA,EAAe;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,SAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,IAAA,MAAM,EAAA,GAAK,IAAI,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,MAAM,EAAA,CAAG,GAAA;AAAA,EAChB;AAAA,EAEA,MAAM,SAAS,IAAA,EAIZ;AACD,IAAA,MAAM,EAAE,WAAA,EAAa,cAAA,EAAgB,MAAA,EAAO,GAAI,IAAA;AAEhD,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,MAAMA,GAAAA,GAAK,MAAM,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgB;AAAA,QAC3C,EAAA,EAAI,cAAA;AAAA,QACJ,KAAA,EAAO,MAAA,CAAO,UAAA,CAAW,MAAM;AAAA,OAChC,CAAA;AACD,MAAA,MAAMA,IAAG,IAAA,EAAK;AACd,MAAA,OAAOA,GAAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAW,IAAI,MAAA,CAAO,SAAS,WAAA,EAAa,QAAA,EAAU,KAAK,MAAM,CAAA;AAEvE,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,QAAA,CAAS,gBAAgB,MAAM,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,IAAA,EAAK;AAE7B,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,UAAA,CAAW,KAAA,EAAY,OAAA,EAAiB,OAAA,EAAuC;AACnF,IAAA,MAAM,EAAE,YAAA,GAAe,KAAA,EAAM,GAAI,WAAW,EAAC;AAE7C,IAAA,IAAI;AACF,MAAA,IAAI,WAAW,IAAA,CAAK,QAAA;AACpB,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,QAAA,GAAW,uBAAuB,KAAK,CAAA;AAAA,MACzC;AAEA,MAAA,IAAI,KAAA,CAAM,WAAW,KAAA,IAAS,KAAA,CAAM,WAAW,KAAA,IAAS,KAAA,CAAM,WAAW,QAAA,EAAU;AACjF,QAAA,MAAMC,QAAAA,GAAU,MAAM,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA;AACjD,QAAA,OAAOA,SAAQ,QAAA,EAAS;AAAA,MAC1B;AAGA,MAAA,MAAM,WAAW,IAAI,MAAA,CAAO,SAAS,KAAA,CAAM,eAAA,EAAiB,UAAU,QAAQ,CAAA;AAE9E,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,SAAA,CAAU,OAAO,CAAA;AAChD,MAAA,IAAA,CAAK,IAAI,gBAAA,EAAkB,WAAA,EAAa,sCAAA,EAAwC,KAAA,CAAM,iBAAiB,OAAO,CAAA;AAE9G,MAAA,OAAO,QAAQ,QAAA,EAAS;AAAA,IAC1B,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,SAAA,EAAW,wBAAA,EAA0B,GAAG,CAAA;AACnE,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAY,OAAA,EAAiB,OAAA,EAAuC;AAClF,IAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBAAoB,IAAA,EASvB;AACD,IAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAgB,MAAA,EAAQ,SAAQ,GAAI,IAAA;AACvD,IAAA,MAAM,cAAc,SAAA,CAAU,eAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,uBAAuB,SAAS,CAAA;AAEjD,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,gBAAgB,KAAA,EAAO;AAEzB,MAAA,MAAM,EAAA,GAAK;AAAA,QACT,IAAA,EAAM,OAAA;AAAA,QACN,EAAA,EAAI,cAAA;AAAA,QACJ,KAAA,EAAO,MAAA,CAAO,UAAA,CAAW,MAAM;AAAA,OACjC;AACA,MAAA,QAAA,GAAW,MAAM,QAAA,CAAS,WAAA,CAAY,EAAE,CAAA;AAAA,IAC1C,CAAA,MAAO;AAEL,MAAA,MAAM,WAAW,IAAI,MAAA,CAAO,QAAA,CAAS,WAAA,EAAa,UAAU,QAAQ,CAAA;AACpE,MAAA,QAAA,GAAW,MAAM,QAAA,CAAS,QAAA,CAAS,WAAA,CAAY,gBAAgB,MAAM,CAAA;AAAA,IACvE;AAGA,IAAA,QAAA,GAAY,WAAW,IAAA,GAAQ,IAAA;AAG/B,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,EAAW;AAC1C,IAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AAGrC,IAAA,MAAM,cAAc,QAAA,GAAW,QAAA;AAE/B,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,YAAY,MAAA,EAAa;AACvB,IAAA,MAAM;AAAA,MACJ,eAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,eAAA,EAAiB,GAAA,EAAK,KAAK,MAAM,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAM,UAAU,MAAA,EAAa;AAC3B,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,eAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,GAAS;AAAA,KACX,GAAI,MAAA;AAEJ,IAAA,MAAM,MAAA,GAAS,YAAY,IAAA,CAAK,QAAA;AAChC,IAAA,MAAM,WAAW,IAAI,MAAA,CAAO,QAAA,CAAS,eAAA,EAAiB,UAAU,MAAM,CAAA;AAItE,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO;AAAA,QACL,QAAA;AAAA,QACA,SAAA,EAAW,GAAA;AAAA,QACX,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,GAAY,GAAA;AAChB,IAAA,IAAI;AACF,MAAA,SAAA,GAAY,QAAA,GACR,MAAM,QAAA,CAAS,SAAA,CAAU,SAAS,OAAA,EAAS,EAAE,QAAA,EAAU,CAAA,GACvD,MAAM,QAAA,CAAS,SAAA,CAAU,SAAS,OAAO,CAAA;AAC7C,MAAA,SAAA,GAAY,UAAU,QAAA,EAAS;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,SAAA,EAAW,6BAAA,EAA+B,KAAK,CAAA;AACzE,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAa,GAAA,CAAI,SAAA,IAAa,CAAC,CAAA,CAAE,EAAA,CAAG,aAAa,CAAC;AAAA,KACpD;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,MAAA,EAAa;AACzB,IAAA,MAAM;AAAA,MACJ,eAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA,GAAe,KAAA;AAAA,MACf,SAAA,GAAY,KAAA;AAAA,MACZ,eAAA,GAAkB;AAAA,KACpB,GAAI,MAAA;AAEJ,IAAA,MAAM,WAAW,IAAI,MAAA,CAAO,SAAS,eAAA,EAAiB,QAAA,EAAU,KAAK,MAAM,CAAA;AAE3E,IAAA,IAAI,UAAA,GAAa,SAAA;AACjB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,UAAA,GAAa,MAAA,CAAO,UAAA;AAAA,IACtB;AAEA,IAAA,MAAM,YAAA,GAAoB;AAAA,MACxB,OAAA,EAAS,KAAA;AAAA,MACT,MAAM,EAAC;AAAA,MACP,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,OAAA,CAAQ,SAAS,UAAU,CAAA;AACrD,MAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,IAAA,EAAK;AAChC,MAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,aAAA,GAAgB,OAAO,SAAA,CAAU,aAAA,KAAkB,aACrD,MAAM,SAAA,CAAU,aAAA,EAAc,GAC9B,SAAA,CAAU,aAAA;AACd,UAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,UAAA,YAAA,CAAa,IAAA,GAAO;AAAA,YAClB,QAAQ,SAAA,CAAU,IAAA;AAAA,YAClB,aAAa,SAAA,CAAU,WAAA;AAAA,YACvB;AAAA,WACF;AACA,UAAA,OAAO,YAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,YAAA,CAAa,OAAA,GAAU,eAAA;AACvB,QAAA,OAAO,YAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAY;AACnB,MAAA,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,SAAA,EAAW,mBAAA,EAAqB,KAAK,CAAA;AAC7D,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,YAAA,CAAa,UAAU,KAAA,CAAM,OAAA;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,YAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,MAAA,EAAa;AAChC,IAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,UAAS,GAAI,MAAA;AAE7D,IAAA,IAAI,aAAA,GAAgB,QAAA;AACpB,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,EAAW;AAC1C,MAAA,aAAA,GAAgB,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,QAAA,IAAY,OAAO,aAAa,CAAA;AAAA,IAClF;AAEA,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAQ,CAAA,GAAI,OAAO,aAAa,CAAA;AAC3D,IAAA,MAAM,iBAAA,GAAoB,IAAI,WAAA,CAAY,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,WAAA,CAAY,QAAQ,CAAA;AACpF,IAAA,MAAM,iBAAiB,GAAA,CAAI,iBAAiB,CAAA,CAAE,KAAA,CAAM,SAAS,CAAC,CAAA;AAE9D,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,aAAA;AAAA,MACV,KAAK,mBAAA,CAAoB,GAAA,CAAI,cAAc,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,MACxD,GAAA,EAAK,WAAA;AAAA,MACL,MAAA,EAAQ,oBAAoB,GAAA,CAAI,iBAAiB,EAAE,OAAA,CAAQ,WAAA,CAAY,QAAQ,CAAC;AAAA,KAClF;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,MAAA,EAAa;AACrC,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA,GAAkB,iBAAA;AAAA,MAClB,QAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,EAAA,GAAK,IAAI,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AAChC,IAAA,MAAM,MAAM,EAAA,CAAG,GAAA;AAEf,IAAA,MAAM,QAAA,GAAW,uBAAuB,SAAS,CAAA;AACjD,IAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,MAAA,EAAQ,SAAA,CAAU,YAAY,MAAM,CAAA;AAEtE,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,sBAAA,EAAwB,MAAM,wBAAA,GAA2B,iBAAA;AAAA,MACzD,iBAAA,EAAmB,EAAA;AAAA,MACnB,oBAAA,EAAsB;AAAA,KACxB;AAEA,IAAA,MAAM,qBAAqB,YAAY;AACrC,MAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,MAAM,KAAK,cAAA,CAAe;AAAA,QAC7C,QAAA,EAAU,iBAAA;AAAA,QACV,KAAA,EAAO,gBAAA;AAAA,QACP,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,QAAA;AAAA,QACA,UAAU,GAAA,GAAM,UAAA,CAAW,SAAA,CAAU,OAAO,EAAE,QAAA,GAAW;AAAA,OAC1D,CAAA;AACD,MAAA,MAAA,CAAO,iBAAA,GAAoB,GAAA;AAC3B,MAAA,MAAA,CAAO,oBAAA,GAAuB,GAAA;AAAA,IAChC,CAAA;AAEA,IAAA,IAAI,aAAA,GAAgB,eAAA;AAEpB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,WAAA,CAAY;AAAA,UAC1C,IAAI,SAAA,CAAU,MAAA;AAAA,UACd,MAAM,SAAA,CAAU,QAAA;AAAA,UAChB,IAAA,EAAM,QAAA,IAAY,IAAA,CAAK,MAAA,EAAQ;AAAA,SAChC,CAAA;AACD,QAAA,aAAA,GAAgB,WAAW,IAAA,GAAO,IAAA;AAClC,QAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,MAAM,KAAK,cAAA,CAAe;AAAA,UAC7C,QAAA,EAAU,aAAA;AAAA,UACV,KAAA,EAAO,gBAAA;AAAA,UACP,aAAa,SAAA,CAAU,WAAA;AAAA,UACvB;AAAA,SACD,CAAA;AACD,QAAA,MAAA,CAAO,sBAAA,GAAyB,aAAA;AAChC,QAAA,MAAA,CAAO,iBAAA,GAAoB,GAAA;AAC3B,QAAA,MAAA,CAAO,oBAAA,GAAuB,GAAA;AAAA,MAChC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,yBAAA,EAA2B,SAAA,EAAW,2BAAA,EAA6B,MAAA,EAAQ,KAAK,CAAA;AACpF,QAAA,MAAM,kBAAA,EAAmB;AACzB,QAAA,MAAA,CAAO,yBAAyB,wBAAA,GAA2B,EAAA;AAAA,MAC7D;AAEA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,QAAA,CAAS,MAAM,CAAA,CAAE,WAAA,CAAY,GAAG,KAAK,CAAA;AAC5D,MAAA,aAAA,GAAgB,WAAW,IAAA,GAAO,IAAA;AAClC,MAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,MAAM,KAAK,cAAA,CAAe;AAAA,QAC7C,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,gBAAA;AAAA,QACP,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB;AAAA,OACD,CAAA;AACD,MAAA,MAAA,CAAO,sBAAA,GAAyB,aAAA;AAChC,MAAA,MAAA,CAAO,iBAAA,GAAoB,GAAA;AAC3B,MAAA,MAAA,CAAO,oBAAA,GAAuB,GAAA;AAAA,IAChC,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,yBAAA,EAA2B,SAAA,EAAW,2BAAA,EAA6B,MAAA,EAAQ,KAAK,CAAA;AACpF,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,MAAA,CAAO,yBAAyB,wBAAA,GAA2B,EAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,MAAA,EAAa;AAC1B,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,OAAO,gCAAgC,CAAA;AACjE,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,sBAAA;AAAA,MACA,2BAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,kBAAA;AAAA,MACA,cAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,sBAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY;AAAA,QACV,GAAG,MAAA;AAAA,QACH,sBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,MAAM,EAAC;AAAA,MACP,YAAA,EAAc,GAAA;AAAA,MACd,iBAAA,EAAmB,EAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,GAAA;AAAA,MACtB,YAAA,EAAc,CAAA;AAAA;AAAA,MACd,cAAc,mBAAA,CAAoB,GAAA,CAAI,SAAA,IAAa,CAAC,EAAE,GAAA,CAAI,EAAA,IAAM,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,SAAA,CAAU,QAAA,EAAU,CAAC,CAAC;AAAA,KAClI;AAEA,IAAA,MAAM,WAAW,IAAI,QAAA,CAAS,EAAE,IAAA,EAAM,aAAa,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAE/I,IAAA,MAAM,QAAA,GAAW,uBAAuB,SAAS,CAAA;AAEjD,IAAA,MAAM,cAAc,IAAI,MAAA,CAAO,SAAS,sBAAA,EAAwB,GAAA,EAAK,KAAK,MAAM,CAAA;AAChF,IAAA,MAAM,kBAAkB,IAAI,MAAA,CAAO,QAAA,CAAS,sBAAA,EAAwB,KAAK,QAAQ,CAAA;AAGjF,IAAA,QAAA,CAAS,UAAA,EAAW;AAGpB,IAAA,MAAM,gBAAA,GAAmB,cAAA,GAAiB,eAAA,CAAgB,yBAAA,GAA4B,eAAA,CAAgB,mBAAA;AACtG,IAAA,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,UAAA,EAAY,sBAAA,EAAwB,gBAAgB,CAAA;AAC7E,IAAA,QAAA,CAAS,IAAI,kBAAkB,CAAA;AAE/B,IAAA,MAAM,kBAAA,GAAqB,mBAAA,GAAsB,oBAAA,CAAqB,wBAAA,GAA4B,qBAAqB,kBAAA,IAAsB,GAAA;AAC7I,IAAA,IAAI,oBAAA,GAAuB,CAAA;AAE3B,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,OAAA,GAAU,MAAM,oCAAA,CAAqC;AAAA,MACzD,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,QAAA,CAAS,IAAI,sCAAsC,CAAA;AACnD,IAAA,IAAI,QAAQ,sBAAA,EAAwB;AAClC,MAAA,oBAAA,GAAuB,gBAAA,CAAiB,OAAA,CAAQ,SAAS,CAAA,IAAK,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,sBAAA,GAAyB,OAAA,CAAQ,UAAA,EAAW,CAAE,KAAA,EAAM;AACxD,IAAA,IAAI,CAAC,sBAAsB,oBAAA,EAAsB;AAC/C,MAAA,sBAAA,GAAyB,QAAQ,UAAA,EAAW,CAAE,2BAA2B,kBAAA,EAAoB,oBAAoB,EAAE,KAAA,EAAM;AAAA,IAC3H;AAGA,IAAA,MAAM,SAAA,GAAiB;AAAA,MACrB,MAAA;AAAA,MACA,EAAA,EAAI,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAA;AAAA,MACjD,QAAA,EAAU,SAAA;AAAA,MACV,WAAA,EAAa,EAAA;AAAA,MACb,YAAA,EAAc,sBAAA;AAAA,MACd,UAAA,EAAY,IAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAGA,IAAA,IAAI,kBAAA,EAAoB;AAEtB,MAAA,SAAA,CAAU,SAAS,gBAAA,CAAiB,GAAA;AACpC,MAAA,SAAA,CAAU,EAAA,GAAK,gBAAA,CAAiB,KAAA,EAAO,gBAAA,CAAiB,mBAAmB,CAAA;AAE3E,MAAA,IAAI,oBAAA,GAAuB,OAAA,CAAQ,UAAA,EAAW,CAAE,KAAA,EAAM;AACtD,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,GAAuB,QAAQ,UAAA,EAAW,CAAE,2BAA2B,kBAAA,EAAoB,oBAAoB,EAAE,KAAA,EAAM;AAAA,MACzH;AAEA,MAAA,MAAM,mBAAA,GAAsB;AAAA,QAC1B,MAAA;AAAA,QACA,EAAA,EAAI,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAA;AAAA,QACjD,UAAU,SAAA,CAAU,QAAA;AAAA,QACpB,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,YAAA,EAAc,oBAAA;AAAA,QACd,UAAA,EAAY,IAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACV;AACA,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa;AAAA,QACnC,SAAA,EAAW,mBAAA;AAAA,QACX;AAAA,OACD,CAAA;AACD,MAAA,QAAA,CAAS,IAAI,cAAc,CAAA;AAE3B,MAAA,SAAA,CAAU,YAAA,GAAe,OAAA,CAAQ,UAAA,EAAW,CACzC,wBAAA,CAAyB,CAAA,EAAG,eAAA,CAAgB,gBAAA,IAAoB,GAAA,EAAQ,SAAS,CAAA,CACjF,KAAA,EAAM;AACT,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,eAAA,EAAgB;AACjD,MAAA,SAAA,CAAU,aAAa,QAAA,CAAS,MAAA;AAAA,QAC9B,CAAC,6HAA6H,CAAA;AAAA,QAC9H,CAAC,MAAA,CAAO,MAAA,CAAO,mBAAmB,CAAC;AAAA,OACrC;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,QAAA,CAAS,WAAW,SAAS,CAAA;AACnE,MAAA,MAAM,KAAK,UAAU,CAAA,GAAI,OAAA;AACzB,MAAA,SAAA,CAAU,WAAA,GAAc,WAAW,CAAC,CAAA,IAAK,WAAW,MAAA,CAAO,iBAAA,GAAoB,GAAK,CAAA,CAAA,GAAK,QAAA;AAEzF,MAAA,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAAA,IACpC;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,eAAA,CAAgB,SAAA,CAAU,UAAA,CAAW,SAAA,EAAW,YAAY;AAAA,KAC9D;AACA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,UAAA,CAAW,IAAA;AAAA,QACT,KAAK,SAAA,CAAU;AAAA,UACb,GAAA;AAAA,UACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,UAC3B,OAAA,EAAS,sBAAA;AAAA,UACT,OAAA,EAAS,QAAA;AAAA,UACT,SAAA;AAAA,UACA;AAAA,SACD;AAAA,OACH;AAAA,IACF;AACA,IAAA,MAAM,CAAC,MAAA,EAAQ,eAAe,IAAI,MAAM,OAAA,CAAQ,IAAI,UAAU,CAAA;AAE9D,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAA,CAAO,cAAc,eAAA,EAAiB,WAAA;AAAA,IACxC;AACA,IAAA,QAAA,CAAS,IAAI,oCAAoC,CAAA;AAGjD,IAAA,IAAI,YAAA,GAAe,OAAO,CAAC,CAAA;AAC3B,IAAA,MAAM,QAAA,GAAW,OAAO,CAAC,CAAA;AACzB,IAAA,MAAA,CAAO,sBAAA,GAAyB,YAAA;AAGhC,IAAA,YAAA,GAAe,eAAe,qBAAA,GAAwB,IAAA;AAMtD,IAAA,MAAM,eAAe,GAAA,CAAI,YAAA,EAAc,UAAS,IAAK,CAAC,EAAE,GAAA,CAAI,EAAA,IAAM,UAAU,WAAA,CAAY,QAAQ,EAAE,KAAA,CAAM,QAAA,CAAS,QAAQ,SAAA,CAAU,WAAA,CAAY,MAAM,CAAC,CAAA;AACtJ,IAAA,MAAA,CAAO,KAAK,SAAA,GAAY,mBAAA,CAAoB,IAAI,YAAA,EAAc,QAAA,MAAc,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,SAAA,CAAU,YAAY,QAAQ,CAAA,CAAE,QAAQ,SAAA,CAAU,WAAA,CAAY,QAAQ,CAAC,CAAA;AAChK,IAAA,MAAA,CAAO,IAAA,CAAK,eAAe,mBAAA,CAAoB,GAAA,CAAI,YAAY,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAC5E,IAAA,MAAA,CAAO,KAAK,aAAA,GAAgB,mBAAA,CAAoB,GAAA,CAAI,QAAA,EAAU,UAAS,IAAK,CAAC,CAAA,CAAE,GAAA,CAAI,MAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAGxH,IAAA,IAAI,kBAAkB,mBAAA,EAAqB;AACzC,MAAA,MAAA,CAAO,IAAA,CAAK,mBAAmB,mBAAA,CAAoB,GAAA,CAAI,aAAa,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,MAAA,CAAO,UAAU,QAAQ,CAAA,CAAE,MAAM,+BAA+B,CAAA,CAAE,QAAQ,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAC,CAAA;AACrL,MAAA,MAAA,CAAO,YAAA,GAAe,mBAAA,CAAoB,GAAA,CAAI,GAAA,CAAI,SAAA,IAAa,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,gBAAA,IAAoB,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IACxL;AAEA,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,SAAA;AAAA,MACA;AAAA,QACE,SAAA,EAAW,YAAA;AAAA,QACX,UAAA,EAAY;AAAA,OACd;AAAA,MACA,QAAA;AAAA,MACA,EAAE,OAAO,YAAA;AAAa,KACxB;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,WAAA;AAAA,MACV,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,cAAA;AAAA,MACP,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,0BAA0B,GAAA,CAAI,iBAAA;AACrC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,cAAA,CAAe,CAAC,CAAA,CAAE,QAAA,GAAW,GAAA,CAAI,sBAAA;AACjC,IAAA,QAAA,CAAS,IAAI,kBAAkB,CAAA;AAE/B,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,QAAA,EAAU,WAAA;AAAA,MACV,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAGA,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,IAAA,EAAM;AAChC,MAAA,IAAI,WAAA,CAAY,SAAS,MAAM,CAAA,IAAK,CAAC,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACxD,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,YAAA,GAAe,GAAA,CAAI,MAAA,CAAO,YAAA,IAAgB,CAAC,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,IAAK,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,MAAA,CAAO,YAAA,GAAe,oBAAoB,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAE9E,IAAA,QAAA,CAAS,SAAS,UAAU,CAAA;AAE5B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,MAAA,EAAa;AACjC,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAKJ,IAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,GAAS,CAAA;AACtC,IAAA,MAAM,SAAA,GAAY,MAAM,cAAc,CAAA,IAAK,OAAO,KAAA,CAAM,cAAc,CAAA,KAAM,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,KAAA,CAAM,cAAc,CAAC,CAAA,GACxH,EAAE,GAAG,KAAA,CAAM,cAAc,CAAA,EAAE,GAC3B,EAAC;AAEL,IAAA,IAAI,CAAC,UAAU,YAAA,EAAc;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,EAAW;AAC/C,QAAA,IAAI,QAAQ,YAAA,EAAc;AAExB,UAAA,SAAA,CAAU,YAAA,GAAgB,OAAA,CAAQ,YAAA,GAAe,IAAA,GAAQ,IAAA;AAAA,QAC3D;AACA,QAAA,IAAI,OAAA,CAAQ,oBAAA,IAAwB,CAAC,SAAA,CAAU,oBAAA,EAAsB;AACnE,UAAA,SAAA,CAAU,uBAAuB,OAAA,CAAQ,oBAAA;AAAA,QAC3C;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,GAAA,CAAI,qBAAA,EAAuB,SAAA,EAAW,2CAAA,EAA6C,KAAK,CAAA;AAAA,MAC/F;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,KAAK,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,cAAc,CAAA,IAAK,OAAO,MAAM,cAAc,CAAA,KAAM,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,cAAc,CAAC,CAAA,EAAG;AAC/G,MAAA,UAAA,CAAW,cAAc,CAAA,GAAI,SAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAC3B;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,MAAM,QAAA,CAAS,MAAM,CAAA,CAAE,GAAG,UAAU,CAAA;AAE/C,MAAA,OAAO,EAAA,CAAG,IAAA;AAAA,IACZ,SAAS,KAAA,EAAY;AACnB,MAAA,IAAA,CAAK,IAAI,qBAAA,EAAuB,SAAA,EAAW,4CAAA,EAA8C,KAAA,EAAO,MAAM,OAAO,CAAA;AAC7G,MAAA,IAAI,kBAAA,GAAqB,CAAA,oBAAA,EAAuB,KAAA,CAAM,OAAO,CAAA,CAAA;AAC7D,MAAA,IAAI,KAAA,EAAO,OAAA,EAAS,QAAA,CAAS,sBAAsB,CAAA,EAAG;AACpD,QAAA,kBAAA,GAAqB,KAAA,CAAM,OAAA;AAAA,MAC7B;AACA,MAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,IACpC;AAAA,EAcF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,CAAM,IAAA,EAAe,MAAA,EAAa;AACtC,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,OAAA,CAAQ,IAAA;AACX,QAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,MACpC,KAAK,OAAA,CAAQ,KAAA;AACX,QAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,MACnC,KAAK,OAAA,CAAQ,QAAA;AACX,QAAA,OAAO,MAAM,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA;AAAA,MAC7C,KAAK,OAAA,CAAQ,MAAA;AACX,QAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAAA,MACtC,KAAK,OAAA,CAAQ,QAAA;AACX,QAAA,OAAO,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAAA,MACxC;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAE,CAAA;AAAA;AACrD,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAA,CAAK,IAAA,EAAgB,MAAA,EAAa;AACtC,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,QAAA,CAAS,IAAA;AACZ,QAAA,OAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAAA,MAC1C,KAAK,QAAA,CAAS,QAAA;AACZ,QAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,MACnC;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAE,CAAA;AAAA;AACpD,EACF;AAAA,EAEA,MAAM,UAAU,MAAA,EAAa;AAC3B,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,YAAA;AAAA,MACA,GAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA;AAAA,MAEA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,YAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY;AAAA,QACV,YAAA;AAAA,QACA,iBAAA;AAAA,QACA,YAAA;AAAA,QACA,GAAG;AAAA,OACL;AAAA,MACA,MAAM,EAAC;AAAA,MACP,YAAA,EAAc,MAAA;AAAA,MACd,iBAAA,EAAmB,MAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,MAAA;AAAA,MACtB,cAAc,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,CAAC,CAAA,GAAI,CAAA;AAAA,MAC9C,YAAA,EAAc,mBAAA,CAAoB,GAAA,CAAI,SAAA,IAAa,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,CAAC,CAAC;AAAA,KACpH;AAEA,IAAA,MAAM,QAAA,GAAW,uBAAuB,SAAS,CAAA;AAEjD,IAAA,MAAM,WAAW,IAAI,QAAA,CAAS,EAAE,IAAA,EAAM,YAAY,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAE9I,IAAA,MAAM,gBAAgB,IAAI,MAAA,CAAO,SAAS,YAAA,EAAc,GAAA,EAAK,KAAK,MAAM,CAAA;AACxE,IAA0B,IAAI,MAAA,CAAO,QAAA,CAAS,YAAA,EAAc,KAAK,QAAQ;AAEzE,IAAA,IAAI,aAAA,GAAgB,SAAA;AACpB,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,cAAc,YAAY;AAC9B,MAAA,IAAIC,UAAAA,GAAY,EAAA;AAChB,MAAA,IAAI;AACF,QAAAA,UAAAA,GAAY,MAAM,aAAA,CAAc,UAAA,CAAW,QAAQ,CAAA;AAAA,MACrD,SAAS,KAAA,EAAO;AAAA,MAChB;AACA,MAAA,OAAOA,UAAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,oCAAA,CAAqC;AAAA,QACnC,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,MACD,WAAA,EAAY;AAAA,MACZ,KAAK,SAAA,CAAU;AAAA,QACb,GAAA;AAAA,QACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,QAC3B,OAAA,EAAS,QAAA;AAAA,QACT,OAAA,EAAS,YAAA;AAAA,QACT,SAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AACA,IAAA,MAAM,CAAC,SAAS,SAAA,EAAW,SAAS,IAAS,MAAM,OAAA,CAAQ,IAAI,WAAW,CAAA;AAC1E,IAAA,QAAA,CAAS,GAAA,CAAI,iDAAA,EAAmD,2CAAA,EAA6C,OAAA,EAAS,WAAW,SAAS,CAAA;AAC1I,IAAA,MAAA,CAAO,yBAAyB,OAAA,CAAQ,sBAAA;AACxC,IAAA,IAAI,QAAQ,sBAAA,EAAwB;AAClC,MAAA,aAAA,GAAgB,OAAA,CAAQ,sBAAA;AAAA,IAC1B;AACA,IAAA,MAAA,CAAO,cAAc,SAAA,CAAU,WAAA;AAE/B,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,YAAA,GAAe,MAAM,cAAA,CAAe;AAAA,MACxC,OAAA,EAAS,QAAA;AAAA,MACT,MAAA,EAAQ,mBAAA,CAAoB,GAAA,CAAI,SAAA,IAAa,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,MAC5G,qBAAA,EAAuB,iBAAA;AAAA,MACvB,eAAA,EAAiB,aAAA;AAAA,MACjB,gBAAA,EAAkB,YAAA;AAAA,MAClB,UAAA,EAAY,OAAO,SAAS;AAAA,KAC7B,CAAA;AACD,IAAA,MAAM;AAAA,MACJ,UAAA;AAAA,MACA,kBAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF,GAAI,YAAA;AACJ,IAAA,QAAA,CAAS,IAAI,gBAAgB,CAAA;AAE7B,IAAA,MAAA,CAAO,IAAA,CAAK,kBAAA,GAAqB,mBAAA,CAAoB,GAAA,CAAI,YAAY,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,UAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAC,CAAA;AACjI,IAAA,MAAA,CAAO,IAAA,CAAK,YAAA,GAAe,mBAAA,CAAoB,GAAA,CAAI,cAAc,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,UAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAC,CAAA;AAC7H,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,SAAS,CAAA,GAAI,OAAO,QAAQ,CAAA;AACzD,IAAA,MAAA,CAAO,YAAA,GAAe,mBAAA,CAAoB,GAAA,CAAI,cAAA,IAAkB,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,CAAC,CAAC,CAAA;AAE/H,IAAA,MAAM,YAAA,GAAe;AAAA;AAAA,MAEnB,SAAA;AAAA;AAAA,MAEA,aAAA;AAAA;AAAA,MAEA,iBAAA;AAAA;AAAA,MAEA,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,aAAa,CAAA;AAAA;AAAA,MAEjD,SAAA,CAAU,eAAA;AAAA;AAAA,MAEV,kBAAA,GAAqB,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,kBAAkB,CAAA,GAAI,oEAAA;AAAA;AAAA,MAE/E,OAAA;AAAA;AAAA,MAEA,kBAAA;AAAA;AAAA,MAEA;AAAA,KACF;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,aAAA;AAAA,MACV,MAAA,EAAQ,gBAAA;AAAA,MACR,KAAA,EAAO,YAAA;AAAA,MACP,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,YAAA,CAAa,IAAA,CAAK,EAAE,QAAA,EAAU,GAAA,CAAI,wBAAwB,CAAA;AAC1D,IAAA,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAElC,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,MAAA,EAAQ,gBAAA;AAAA,MACR,QAAA,EAAU,aAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAGA,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,IAAA,EAAM;AAChC,MAAA,IAAI,WAAA,CAAY,SAAS,MAAM,CAAA,IAAK,CAAC,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACxD,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,YAAA,GAAe,GAAA,CAAI,MAAA,CAAO,YAAA,IAAgB,CAAC,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,IAAK,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,MAAA,CAAO,YAAA,GAAe,oBAAoB,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAE9E,IAAA,QAAA,CAAS,SAAS,WAAW,CAAA;AAE7B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,MAAA,EAAa;AACpC,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,YAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,CAAS,EAAE,MAAM,CAAA,aAAA,EAAgB,SAAA,CAAU,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,WAAA,EAAa,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAE5H,IAAA,MAAM,MAAA,GAAc,EAAE,IAAA,EAAM,EAAC,EAAE;AAE/B,IAAA,MAAM,QAAA,GAAW,uBAAuB,SAAS,CAAA;AAEjD,IAAA,MAAM,gBAAgB,IAAI,MAAA,CAAO,SAAS,YAAA,EAAc,GAAA,EAAK,KAAK,MAAM,CAAA;AACxE,IAAA,MAAM,UAAA,GAAkB;AAAA;AAAA,MAEtB,SAAA,CAAU,eAAA;AAAA;AAAA,MAEV,cAAA;AAAA;AAAA,MAEA;AAAA,KACF;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,KAAK,SAAA,CAAU;AAAA,QACb,GAAA;AAAA,QACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,QAC3B,OAAA,EAAS,QAAA;AAAA,QACT,OAAA,EAAS,YAAA;AAAA,QACT,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,MACD,KAAK,mBAAA,CAAoB;AAAA,QACvB,GAAA;AAAA,QACA,QAAA,EAAU,aAAA;AAAA,QACV,MAAA,EAAQ,eAAA;AAAA,QACR,KAAA,EAAO,UAAA;AAAA,QACP,SAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AACA,IAAA,MAAM,CAAC,SAAA,EAAW,GAAG,IAAS,MAAM,OAAA,CAAQ,IAAI,WAAW,CAAA;AAC3D,IAAA,MAAA,CAAO,cAAc,SAAA,CAAU,WAAA;AAC/B,IAAA,MAAA,CAAO,cAAA,GAAiB,YAAA;AACxB,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,UAAA,CAAW,IAAA,CAAK,EAAE,QAAA,EAAU,GAAA,CAAI,wBAAwB,CAAA;AACxD,IAAA,QAAA,CAAS,IAAI,iCAAiC,CAAA;AAE9C,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,MAAA,EAAQ,eAAA;AAAA,MACR,QAAA,EAAU,aAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,QAAA,CAAS,SAAS,oBAAoB,CAAA;AAEtC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,MAAA,EAAa;AAC7B,IAAA,MAAM;AAAA,MACJ,aAAA;AAAA,MACA,mBAAA;AAAA,MACA,GAAG;AAAA,KACL,GAAI,MAAA;AACJ,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF,GAAI,UAAA;AAEJ,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,GAAG,aAAA;AAAA,MACH,MAAM,EAAC;AAAA,MACP,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,mBAAA;AAAA,MAChB,UAAA,EAAY;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MACA,SAAA,EAAW;AAAA,QACT,WAAW,aAAA,CAAc;AAAA,OAC3B;AAAA,MACA,YAAA,EAAc,MAAA;AAAA,MACd,iBAAA,EAAmB,MAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,MAAA;AAAA,MACtB,cAAc,aAAA,CAAc,QAAA,KAAa,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,GAAA;AAAA,MACzH,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,MAAM,WAAW,IAAI,QAAA,CAAS,EAAE,IAAA,EAAM,cAAc,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAEhJ,IAAiB,uBAAuB,SAAS;AAEjD,IAAA,MAAM,oBAAoB,YAAY;AACpC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,UACzC,GAAA;AAAA,UACA,SAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,MAAA,CAAO,YAAA,GAAe,cAAc,gBAAA,GAAmB,EAAA;AACvD,QAAA,MAAA,CAAO,IAAA,GAAO;AAAA,UACZ,gBAAgB,GAAA,CAAI,oBAAA;AAAA,UACpB,cAAc,aAAA,CAAc,YAAA;AAAA,UAC5B,yBAAyB,aAAA,CAAc;AAAA,SACzC;AACA,QAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,QAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,QAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,QAAA,MAAA,CAAO,YAAA,GAAe,oBAAoB,GAAA,CAAI,aAAA,CAAc,WAAW,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,MACtF,CAAA,MACK;AACH,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,UACzC,GAAA;AAAA,UACA,SAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA;AAAA,UACA,WAAW,aAAA,CAAc,SAAA;AAAA,UACzB;AAAA,SACD,CAAA;AAED,QAAA,MAAA,CAAO,eAAe,GAAA,CAAI,aAAA,CAAc,SAAA,IAAa,CAAC,EAAE,GAAA,CAAI,EAAA,KAAO,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,QAAA,IAAY,GAAG,CAAC,CAAA;AAC3H,QAAA,MAAA,CAAO,IAAA,GAAO;AAAA,UACZ,gBAAgB,GAAA,CAAI,oBAAA;AAAA;AAAA,UAEpB,YAAA,EAAc,oBAAoB,GAAA,CAAI,SAAA,IAAa,CAAC,CAAA,CAAE,GAAA,CAAI,OAAO,SAAA,CAAU,QAAA,IAAY,EAAE,CAAA,CAAE,KAAA,CAAM,cAAc,SAAA,CAAU,OAAA,IAAW,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAA,EAAI,CAAC,CAAC,CAAA;AAAA;AAAA,UAErJ,uBAAA,EAAyB;AAAA,SAC3B;AACA,QAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,QAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,QAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,QAAA,MAAA,CAAO,YAAA,GAAe,oBAAoB,GAAA,CAAI,aAAA,CAAc,sBAAsB,CAAC,CAAA,CAAE,MAAM,aAAA,CAAc,SAAS,EAAE,GAAA,CAAI,EAAA,KAAO,UAAU,QAAA,IAAY,CAAA,CAAE,EAAE,OAAA,CAAQ,EAAA,EAAI,CAAC,CAAC,CAAA;AACvK,QAAA,MAAA,CAAO,SAAA,CAAU,WAAW,GAAA,CAAI,sBAAA;AAAA,MAClC;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,KAAK,SAAA,CAAU;AAAA,QACb,GAAA;AAAA,QACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,QAC3B,OAAA,EAAS,mBAAA;AAAA,QACT,OAAA,EAAS,QAAA;AAAA,QACT;AAAA,OACD,CAAA;AAAA,MACD,iBAAA;AAAkB,KACpB;AACA,IAAA,MAAM,CAAC,eAAe,CAAA,GAAS,MAAM,OAAA,CAAQ,IAAI,WAAW,CAAA;AAC5D,IAAA,MAAA,CAAO,cAAc,eAAA,CAAgB,WAAA;AACrC,IAAA,QAAA,CAAS,IAAI,+BAA+B,CAAA;AAE5C,IAAA,QAAA,CAAS,SAAS,aAAa,CAAA;AAE/B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,MAAA,EAAa;AAC/B,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM;AAAA,MACJ,GAAA,EAAK,MAAA;AAAA,MACL,SAAA;AAAA,MACA;AAAA,KACF,GAAI,eAAA;AACJ,IAAA,MAAM;AAAA,MACJ,GAAA,EAAK;AAAA,KACP,GAAI,oBAAA;AAEJ,IAAA,MAAM,cAAA,GAAiB,UAAU,OAAA,KAAY,CAAA;AAE7C,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,SAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MACA,MAAM,EAAC;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,iBAAA,EAAmB,EAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,CAAA;AAAA,MACtB,YAAA,EAAc,CAAA;AAAA,MACd,cAAc,mBAAA,CAAoB,GAAA,CAAI,SAAA,IAAa,CAAC,EAAE,GAAA,CAAI,EAAA,IAAM,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,SAAA,CAAU,QAAA,EAAU,CAAC,CAAC;AAAA,KAClI;AAEA,IAAA,MAAM,QAAA,GAAW,uBAAuB,SAAS,CAAA;AAEjD,IAAA,MAAM,WAAW,IAAI,QAAA,CAAS,EAAE,IAAA,EAAM,gBAAgB,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAElJ,IAAA,MAAM,oBAAoB,IAAI,MAAA,CAAO,SAAS,SAAA,EAAW,GAAA,EAAK,KAAK,MAAM,CAAA;AACzE,IAAA,MAAM,wBAAwB,IAAI,MAAA,CAAO,QAAA,CAAS,SAAA,EAAW,KAAK,QAAQ,CAAA;AAI1E,IAAA,MAAM,UAAA,GAAa;AAAA;AAAA,MAEjB,cAAA,GAAiB,UAAU,SAAA,CAAU,eAAA;AAAA;AAAA,MAErC,MAAA;AAAA;AAAA,MAEA,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAA;AAAA;AAAA,MAE7C;AAAA,KACF;AACA,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,KAAK,SAAA,CAAU;AAAA,QACb,GAAA;AAAA,QACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,QAC3B,OAAA,EAAS,SAAA;AAAA,QACT,OAAA,EAAS,QAAA;AAAA,QACT,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,MACD,qBAAA,CAAsB,KAAA,CAAM,UAAA,CAAW,GAAG,UAAU;AAAA,KACtD;AACA,IAAA,MAAM,CAAC,eAAA,EAAiB,MAAM,IAAS,MAAM,OAAA,CAAQ,IAAI,WAAW,CAAA;AACpE,IAAA,QAAA,CAAS,IAAI,8BAA8B,CAAA;AAE3C,IAAA,MAAA,CAAO,cAAc,eAAA,CAAgB,WAAA;AAErC,IAAA,IAAI,YAAA,GAAe,OAAO,CAAC,CAAA;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,UAAA,EAAY,kBAAA,EAAoB,YAAY,CAAA;AAG1E,IAAA,YAAA,GAAe,eAAe,qBAAA,GAAwB,IAAA;AACtD,IAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,UAAA,EAAY,+BAAA,EAAiC,YAAY,CAAA;AACvF,IAAA,MAAA,CAAO,sBAAA,GAAyB,YAAA;AAEhC,IAAA,MAAM,eAAe,GAAA,CAAI,YAAA,EAAc,UAAS,IAAK,CAAC,EAAE,GAAA,CAAI,EAAA,IAAM,UAAU,WAAA,CAAY,QAAQ,EAAE,KAAA,CAAM,QAAA,CAAS,QAAQ,SAAA,CAAU,WAAA,CAAY,MAAM,CAAC,CAAA;AACtJ,IAAA,MAAA,CAAO,KAAK,SAAA,GAAY,mBAAA,CAAoB,IAAI,YAAA,EAAc,QAAA,MAAc,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,SAAA,CAAU,YAAY,QAAQ,CAAA,CAAE,QAAQ,SAAA,CAAU,WAAA,CAAY,QAAQ,CAAC,CAAA;AAChK,IAAA,MAAA,CAAO,IAAA,CAAK,eAAe,mBAAA,CAAoB,GAAA,CAAI,YAAY,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAC5E,IAAA,MAAA,CAAO,KAAK,aAAA,GAAgB,mBAAA,CAAoB,IAAI,MAAA,CAAO,CAAC,GAAG,QAAA,EAAS,IAAK,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAEzH,IAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAE9D,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,iBAAiB,CAAC,GAAG,YAAY,EAAE,KAAA,EAAO,cAAc,CAAA;AAC9D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,iBAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,cAAA;AAAA,MACP,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,0BAA0B,GAAA,CAAI,iBAAA;AACrC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,CAAA,CAAE,WAAW,GAAA,CAAI,sBAAA;AACzD,IAAA,QAAA,CAAS,IAAI,6BAA6B,CAAA;AAG1C,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,QAAA,EAAU,iBAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAGA,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,IAAA,EAAM;AAChC,MAAA,IAAI,WAAA,CAAY,SAAS,MAAM,CAAA,IAAK,CAAC,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACxD,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,YAAA,GAAe,GAAA,CAAI,MAAA,CAAO,YAAA,IAAgB,CAAC,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,IAAK,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,MAAA,CAAO,YAAA,GAAe,oBAAoB,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAC,CAAA;AAE9E,IAAA,QAAA,CAAS,SAAS,eAAe,CAAA;AAEjC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,oBAAoB,MAAA,EAAa;AACrC,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAA;AAAA,MACA,oBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAIJ,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,EAAA;AAAA,QACT,MAAA,EAAQ,EAAA;AAAA,QACR,eAAA,EAAiB,EAAA;AAAA;AAAA,QAEjB,gBAAgB,MAAA,CAAO,GAAA,CAAI,aAAa,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM,0BAAA,CAA2B,QAAQ,EAAE,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,QACvI,uBAAA,EAAyB;AAAA,OAC3B;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,CAAS,EAAE,MAAM,CAAA,iCAAA,EAAoC,SAAA,CAAU,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,WAAA,EAAa,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAEhJ,IAAA,MAAM,QAAA,GAAW,uBAAuB,SAAS,CAAA;AAGjD,IAAA,MAAM,gBAAgB,IAAI,MAAA,CAAO,QAAA,CAAS,oBAAA,EAAsB,KAAK,QAAQ,CAAA;AAC7E,IAAA,MAAM,eAAe,IAAI,MAAA,CAAO,QAAA,CAAS,mBAAA,EAAqB,KAAK,QAAQ,CAAA;AAC3E,IAAA,MAAM,aAAa,IAAI,MAAA,CAAO,QAAA,CAAS,iBAAA,EAAmB,KAAK,QAAQ,CAAA;AAEvE,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,CAAC,QAAA,EAAU,cAAc,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACnD,aAAA,CAAc,cAAc,UAAA,EAAW;AAAA,MACvC,UAAA,CAAW,wBAAwB,UAAA;AAAW,KAC/C,CAAA;AACD,IAAA,QAAA,CAAS,IAAI,4BAA4B,CAAA;AAGzC,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,IAAA,MAAM,qBAAA,GAAwB,eAAe,CAAC,CAAA;AAG9C,IAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,UAAA,CAAW,gBAAA,CAAiB,WAAW,qBAAqB,CAAA;AAEnF,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,SAAA,IAAa,CAAC,CAAA;AAE7C,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,0DAAA,EAA4D,OAAO,CAAA;AACnH,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,uDAAA,EAAyD,MAAM,CAAA;AAC/G,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,eAAA,EAAiB,eAAe,CAAA;AAEhF,IAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,IAAA,IAAI,uBAAA,GAA0B,KAAA;AAE9B,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAE9B,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc,aAAA,CAAc,WAAW,eAAe,CAAA;AAC9E,MAAA,QAAA,CAAS,IAAI,yCAAyC,CAAA;AACtD,MAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,kEAAA,EAAoE,iBAAiB,SAAS,CAAA;AAC9I,MAAA,cAAA,GAAiB,SAAA;AACjB,MAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,oCAAA,EAAsC,cAAc,CAAA;AAAA,IACtG,CAAA,MAAO;AAEL,MAAA,IAAI,UAAU,EAAA,EAAI;AAChB,QAAA,QAAA,CAAS,UAAA,EAAW;AACpB,QAAA,MAAM,aAAA,GAAgB,MAAM,aAAA,CAAc,aAAA,CAAc,WAAW,OAAO,CAAA;AAC1E,QAAA,QAAA,CAAS,IAAI,qCAAqC,CAAA;AAClD,QAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,wEAAA,EAA0E,SAAS,aAAa,CAAA;AAChJ,QAAA,cAAA,IAAkB,aAAA;AAClB,QAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,0CAAA,EAA4C,cAAc,CAAA;AAAA,MAC5G;AACA,MAAA,MAAM,YAAY,eAAA,GAAkB,OAAA;AACpC,MAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,kCAAA,EAAoC,SAAS,CAAA;AAC7F,MAAA,IAAI,YAAY,EAAA,EAAI;AAClB,QAAA,QAAA,CAAS,UAAA,EAAW;AACpB,QAAA,MAAM,uBAAA,GAA0B,MAAM,YAAA,CAAa,aAAA,CAAc,WAAW,SAAS,CAAA;AACrF,QAAA,QAAA,CAAS,IAAI,oCAAoC,CAAA;AACjD,QAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,yFAAA,EAA2F,WAAW,uBAAuB,CAAA;AAC7K,QAAA,QAAA,CAAS,UAAA,EAAW;AACpB,QAAA,MAAM,CAAC,YAAY,CAAA,GAAI,MAAM,UAAA,CAAW,gBAAA,CAAiB,WAAW,uBAAuB,CAAA;AAC3F,QAAA,QAAA,CAAS,IAAI,qCAAqC,CAAA;AAClD,QAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,uEAAA,EAAyE,WAAW,YAAY,CAAA;AAChJ,QAAA,cAAA,IAAkB,YAAA;AAClB,QAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,uCAAA,EAAyC,cAAc,CAAA;AAEvG,QAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,UAAA,uBAAA,GAA0B,IAAA;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,0BAAA,EAA4B,cAAc,CAAA;AAC1F,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,UAAA,EAAY,kCAAA,EAAoC,uBAAuB,CAAA;AAE3G,IAAA,QAAA,CAAS,SAAS,qBAAqB,CAAA;AAEvC,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,MAAA,EAAa;AACnC,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,IAAA,CAAK,GAAA,CAAI,uBAAA,EAAyB,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAElE,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,EAAA;AAAA,QACT,eAAA,EAAiB,EAAA;AAAA,QACjB,QAAA,EAAU,EAAA;AAAA;AAAA,QAEV,gBAAgB,MAAA,CAAO,GAAA,CAAI,aAAa,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,SAAA,CAAU,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM,4BAAA,CAA6B,QAAQ,EAAE,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAC;AAAA,OAC3I;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,CAAS,EAAE,MAAM,CAAA,+BAAA,EAAkC,SAAA,CAAU,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,WAAA,EAAa,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAE9I,IAAA,MAAM,QAAA,GAAW,uBAAuB,SAAS,CAAA;AAGjD,IAAA,MAAM,gBAAgB,IAAI,MAAA,CAAO,QAAA,CAAS,oBAAA,EAAsB,KAAK,QAAQ,CAAA;AAE7E,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,aAAA,CAAc,UAAA,EAAW;AAC9D,IAAA,QAAA,CAAS,IAAI,6BAA6B,CAAA;AAE1C,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAE1B,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,SAAA,IAAa,CAAC,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,OAAA;AAEjB,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,MAAM,cAAA,GAAiB,MAAM,aAAA,CAAc,cAAA,CAAe,WAAW,eAAe,CAAA;AACpF,IAAA,QAAA,CAAS,IAAI,8BAA8B,CAAA;AAE3C,IAAA,QAAA,CAAS,SAAS,mBAAmB,CAAA;AAErC,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,MAAA,EAAa;AAC9B,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA;AAAA,MACA,oBAAA;AAAA,MACA,mBAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAG7D,IAAA,MAAM,kBAAA,GAAqB,EAAA;AAC3B,IAAA,MAAM,YAAA,GAAgB,qBAAqB,CAAA,GAAK,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,CAAA;AAEjF,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,4BAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MACA,MAAM,EAAC;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,iBAAA,EAAmB,EAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,CAAA;AAAA,MACtB,YAAA;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,MAAM,QAAA,GAAW,uBAAuB,SAAS,CAAA;AAEjD,IAAA,MAAM,WAAW,IAAI,QAAA,CAAS,EAAE,IAAA,EAAM,6BAA6B,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAE/J,IAA2B,IAAI,MAAA,CAAO,QAAA,CAAS,4BAAA,EAA8B,KAAK,QAAQ;AAC1F,IAAA,MAAM,iBAAiB,IAAI,MAAA,CAAO,SAAS,4BAAA,EAA8B,GAAA,EAAK,KAAK,MAAM,CAAA;AAEzF,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,IAAI,wBAAA,GAA2B,mBAAA;AAC/B,IAAA,IAAI,CAAC,wBAAA,EAA0B;AAC7B,MAAA,wBAAA,GAA2B,MAAM,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA;AAAA,IAClE;AACA,IAAA,MAAM;AAAA,MACJ,uBAAA;AAAA,MACA;AAAA,KACF,GAAI,wBAAA;AACJ,IAAA,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAElC,IAAA,IAAI,uBAAA,EAAyB;AAC3B,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAGA,IAAA,MAAA,CAAO,YAAA,GAAe,mBAAA;AAAA,MACpB,GAAA,CAAI,cAAA,CAAe,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAC;AAAA,KACxF;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,SAAA,CAAU;AAAA,MAC3C,GAAA;AAAA,MACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,MAC3B,OAAA,EAAS,4BAAA;AAAA,MACT,OAAA,EAAS,QAAA;AAAA,MACT,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,cAAc,eAAA,CAAgB,WAAA;AACrC,IAAA,QAAA,CAAS,IAAI,WAAW,CAAA;AAExB,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,QAAA,EAAU,cAAA;AAAA,MACV,MAAA,EAAQ,yBAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL,SAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,cAAA;AAAA,MACV,MAAA,EAAQ,OAAO,SAAA,CAAU,MAAA;AAAA,MACzB,KAAA,EAAO,CAAC,GAAG,MAAA,CAAO,UAAU,KAAA,EAAO,EAAE,QAAA,EAAU,wBAAA,EAA0B,CAAA;AAAA,MACzE,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,MAAA,CAAO,eAAe,GAAA,CAAI,oBAAA;AAC1B,IAAA,MAAA,CAAO,UAAU,KAAA,CAAM,CAAC,IAAI,EAAE,QAAA,EAAU,IAAI,sBAAA,EAAuB;AACnE,IAAA,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAElC,IAAA,QAAA,CAAS,SAAS,cAAc,CAAA;AAEhC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,MAAA,EAAa;AAC5B,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAG3D,IAAA,MAAM,kBAAA,GAAqB,EAAA;AAC3B,IAAA,MAAM,YAAA,GAAgB,qBAAqB,CAAA,GAAK,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,CAAA;AAEjF,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,oBAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MACA,MAAM,EAAC;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,iBAAA,EAAmB,EAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,CAAA;AAAA,MACtB,YAAA;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,MAAM,WAAW,IAAI,QAAA,CAAS,EAAE,IAAA,EAAM,2BAA2B,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAE7J,IAAA,MAAM,QAAA,GAAW,uBAAuB,SAAS,CAAA;AAEjD,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,SAAA,CAAU;AAAA,MAC3C,GAAA;AAAA,MACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,MAC3B,OAAA,EAAS,oBAAA;AAAA,MACT,OAAA,EAAS,QAAA;AAAA,MACT,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,cAAc,eAAA,CAAgB,WAAA;AACrC,IAAA,QAAA,CAAS,IAAI,WAAW,CAAA;AAExB,IAAsB,IAAI,MAAA,CAAO,QAAA,CAAS,oBAAA,EAAsB,KAAK,QAAQ;AAC7E,IAAA,MAAM,0BAA0B,IAAI,MAAA,CAAO,SAAS,oBAAA,EAAsB,GAAA,EAAK,KAAK,MAAM,CAAA;AAE1F,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,IAAI,sBAAA,GAAyB,iBAAA;AAC7B,IAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,MAAA,sBAAA,GAAyB,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAAA,IAC9D;AACA,IAAA,MAAM;AAAA,MACJ,OAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,GAAI,sBAAA;AACJ,IAAA,QAAA,CAAS,IAAI,mBAAmB,CAAA;AAEhC,IAAA,MAAA,CAAO,YAAA,GAAe,mBAAA;AAAA,MACpB,GAAA,CAAI,cAAA,CAAe,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAC;AAAA,KACxF;AAEA,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,QAAA,EAAU,uBAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL,eAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,uBAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,CAAC,GAAG,MAAA,CAAO,UAAU,KAAA,EAAO,EAAE,QAAA,EAAU,wBAAA,EAA0B,CAAA;AAAA,MACzE,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,MAAA,CAAO,eAAe,GAAA,CAAI,oBAAA;AAC1B,IAAA,MAAA,CAAO,UAAU,KAAA,CAAM,CAAC,IAAI,EAAE,QAAA,EAAU,IAAI,sBAAA,EAAuB;AACnE,IAAA,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAElC,IAAA,QAAA,CAAS,SAAS,YAAY,CAAA;AAE9B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,MAAA,EAAa;AACnC,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA;AAAA,MACA,oBAAA;AAAA,MACA,4BAAA;AAAA,MACA,eAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,IAAA,CAAK,GAAA,CAAI,uBAAA,EAAyB,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAElE,IAAA,MAAM;AAAA,MACJ,GAAA,EAAK;AAAA,KACP,GAAI,oBAAA;AAGJ,IAAA,MAAM,kBAAA,GAAqB,EAAA;AAC3B,IAAA,MAAM,YAAA,GAAgB,qBAAqB,CAAA,GAAK,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,CAAA;AAEjF,IAAA,MAAM,MAAA,GAAc;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,cAAA,EAAgB,4BAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MACA,MAAM,EAAC;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,iBAAA,EAAmB,EAAA;AAAA,MACnB,sBAAA,EAAwB,EAAA;AAAA,MACxB,oBAAA,EAAsB,CAAA;AAAA,MACtB,YAAA;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,MAAM,WAAW,IAAI,QAAA,CAAS,EAAE,IAAA,EAAM,kCAAkC,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAA,EAAU,aAAa,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAEpK,IAAA,MAAM,QAAA,GAAW,uBAAuB,SAAS,CAAA;AAEjD,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,SAAA,CAAU;AAAA,MAC3C,GAAA;AAAA,MACA,iBAAiB,SAAA,CAAU,eAAA;AAAA,MAC3B,OAAA,EAAS,4BAAA;AAAA,MACT,OAAA,EAAS,QAAA;AAAA,MACT,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,cAAc,eAAA,CAAgB,WAAA;AACrC,IAAA,QAAA,CAAS,IAAI,WAAW,CAAA;AAExB,IAAA,MAAM,kCAAkC,IAAI,MAAA,CAAO,SAAS,4BAAA,EAA8B,GAAA,EAAK,KAAK,MAAM,CAAA;AAE1G,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,IAAI,sBAAA,GAAyB,iBAAA;AAC7B,IAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,MAAA,sBAAA,GAAyB,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAAA,IAC9D;AACA,IAAA,MAAM;AAAA,MACJ;AAAA,KACF,GAAI,sBAAA;AACJ,IAAA,QAAA,CAAS,IAAI,mBAAmB,CAAA;AAChC,IAAA,IAAA,CAAK,GAAA,CAAI,uBAAA,EAAyB,UAAA,EAAY,sCAAA,EAAwC,cAAc,CAAA;AAEpG,IAAA,MAAA,CAAO,YAAA,GAAe,mBAAA;AAAA,MACpB,GAAA,CAAI,cAAA,CAAe,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,EAAA,IAAM,EAAE,CAAA,CAAE,OAAA,CAAQ,EAAA,EAAI,CAAC;AAAA,KAC5D;AAGA,IAAA,MAAM,gBAAA,GAAmB;AAAA;AAAA,MAEvB,SAAA;AAAA;AAAA,MAEA,MAAA;AAAA;AAAA,MAEA,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,SAAS;AAAA,KAC/C;AAEA,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,QAAA,EAAU,+BAAA;AAAA,MACV,MAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,+BAAA;AAAA,MACV,MAAA,EAAQ,aAAA;AAAA,MACR,OAAO,CAAC,GAAG,kBAAkB,EAAE,QAAA,EAAU,0BAA0B,CAAA;AAAA,MACnE,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,GAAA,CAAI,oBAAA;AACjC,IAAA,MAAA,CAAO,oBAAoB,GAAA,CAAI,iBAAA;AAC/B,IAAA,MAAA,CAAO,yBAAyB,GAAA,CAAI,iBAAA;AACpC,IAAA,MAAA,CAAO,uBAAuB,GAAA,CAAI,oBAAA;AAClC,IAAA,MAAA,CAAO,eAAe,GAAA,CAAI,oBAAA;AAC1B,IAAA,MAAA,CAAO,UAAU,KAAA,CAAM,IAAA,CAAK,EAAE,QAAA,EAAU,GAAA,CAAI,wBAAwB,CAAA;AACpE,IAAA,QAAA,CAAS,IAAI,qBAAqB,CAAA;AAElC,IAAA,QAAA,CAAS,SAAS,mBAAmB,CAAA;AAErC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,yBAAyB,MAAA,EAAa;AAC1C,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,OAAO,gCAAgC,CAAA;AACjE,IAAA,MAAM;AAAA,MACJ,aAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,mBAAA,GAAsB,4CAAA;AAC5B,IAAA,MAAM,sBAAA,GAAyB;AAAA,MAC7B;AAAA,QACE,QAAA,EAAU;AAAA,UACR;AAAA,YACE,cAAA,EAAgB,SAAA;AAAA,YAChB,MAAA,EAAQ,OAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,cAAA,EAAgB,SAAA;AAAA,YAChB,MAAA,EAAQ,KAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,cAAA,EAAgB,SAAA;AAAA,YAChB,MAAA,EAAQ,OAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,cAAA,EAAgB,QAAA;AAAA,YAChB,MAAA,EAAQ,QAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,cAAA,EAAgB,OAAA;AAAA,YAChB,MAAA,EAAQ,UAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,cAAA,EAAgB,OAAA;AAAA,YAChB,MAAA,EAAQ,YAAA;AAAA,YACR,MAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,MAAA,EAAQ,WAAA;AAAA,QACR,WAAW,EAAC;AAAA,QACZ,iBAAA,EAAmB,SAAA;AAAA,QACnB,MAAA,EAAQ;AAAA;AACV,KACF;AAEA,IAAA,MAAM,8BAA8B,IAAI,MAAA,CAAO,SAAS,mBAAA,EAAqB,sBAAA,EAAwB,KAAK,MAAM,CAAA;AAEhH,IAAA,MAAM,OAAA,GAAe,UAAA,CAAW,OAAA,CAAQ,iBAAA,CAAkB,UAAqC,CAAA;AAC/F,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,eAAe,CAAA,CAAE,KAAA,CAAM,EAAA,KAAO,OAAA,CAAQ,QAAA,IAAY,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAE7F,IAAA,MAAM,eAAA,GAAkB,aAAa,UAAU,CAAA;AAC/C,IAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,WAAA,CAAY,SAAA,CAAU,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,KAAM,eAAA,CAAgB,SAAA,EAAW,WAAA,EAAY;AACrI,IAA2B,cAAA,GAAiB,eAAA,CAAgB,wBAAA,GAA2B,eAAA,CAAgB;AAGvG,IAAA,MAAM,OAAA,GAAU,MAAM,oCAAA,CAAqC;AAAA,MACzD,WAAW,OAAA,CAAQ,eAAA;AAAA,MACnB;AAAA,KACD,CAAA;AACD,IAAA,IAAI,QAAQ,sBAAA,EAAwB;AAClC,MAAuB,gBAAA,CAAiB,OAAA,CAAQ,SAAS,CAAA,IAAK,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,WAAA,GAAc,aAAA,CAAc,MAAA,CAAO,EAAA,CAAG,IAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,MAAA,CAAO,EAAA,CAAG,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAAE,CAAC,CAAA;AAC1F,IAAA,MAAM,WAAW,+BAAA,CAAgC;AAAA,MAC/C,KAAA,EAAO,cAAc,OAAA,CAAQ,KAAA;AAAA,MAC7B,MAAA,EAAQ,cAAc,OAAA,CAAQ,MAAA;AAAA,MAC9B,QAAA,EAAU,SAAA;AAAA,MACV,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,aAAA,CAAc,WAAA,CAAY,SAAA,CAAU,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA;AAAA,MAChD,aAAA,CAAc,WAAA,CAAY,SAAA,CAAU,QAAA,CAAS,CAAC,CAAA,CAAE,EAAA;AAAA,MAChD,aAAA,CAAc,IAAA;AAAA,MACd,aAAA,CAAc,WAAA,CAAY,SAAA,CAAU,QAAA,CAAS,CAAC,CAAA,CAAE,KAAA;AAAA,MAChD,QAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,MAAA,GAAS,cAAA,GAAiB,eAAA,CAAgB,GAAA,GAAM,eAAA,CAAgB,SAAA;AACtE,IAAA,MAAM,SAAA,GAAiB;AAAA,MACrB,MAAA,EAAQ,YAAA,CAAa,OAAA,CAAQ,iBAAA,CAAkB,SAAS,CAAA,CAAE,GAAA;AAAA,MAC1D,EAAA,EAAI,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,QAAQ,eAAe,CAAA;AAAA,MAC/D,QAAA,EAAU,SAAA;AAAA,MACV,WAAA,EAAa,EAAA;AAAA,MACb,YAAA,EAAc,OAAA,CAAQ,UAAA,EAAW,CAE9B,KAAA,EAAM;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,MAAM,iBAAiB,IAAI,MAAA,CAAO,SAAS,MAAA,EAAS,OAAA,EAAS,KAAK,QAAQ,CAAA;AAC1E,IAAA,MAAM,SAAS,MAAM,cAAA,CAAe,SAAA,CAAU,UAAA,CAAW,WAAW,KAAK,CAAA;AACzE,IAAA,IAAI,SAAA,GAAY,OAAO,CAAC,CAAA;AACxB,IAAA,SAAA,GAAY,YAAY,qBAAA,GAAwB,IAAA;AAEhD,IAAA,MAAM,EAAA,GAAK,MAAM,2BAAA,CAA4B,SAAA;AAAA,MAC3C,GAAG,cAAA;AAAA,MACH;AAAA,QACE,QAAA,EAAU,gBAAgB,gBAAA,IAAoB,GAAA;AAAA,QAC9C,KAAA,EAAO;AAAA;AACT,KACF;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,IAAA,EAAK;AAEhC,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAO,SAAA,CAAU,IAAA;AAAA,IACnB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,MAAA,EAAa;AAC/B,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,OAAA,EAAQ,GAAI,MAAA;AAE1C,IAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAE9D,IAAA,MAAM,QAAA,GAAW,uBAAuB,SAAS,CAAA;AAEjD,IAAA,MAAM,KAAA,GAAQ,SAAA;AACd,IAAA,MAAM,eAAe,SAAA,CAAU,eAAA;AAC/B,IAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAE1B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA;AACjE,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA;AAE5B,IAAA,MAAM,QAAQ,IAAI,MAAA,CAAO,QAAA,CAAS,YAAA,EAAc,UAAU,QAAQ,CAAA;AAClE,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA,EAAK;AAE9B,IAAA,IAAI,QAAA,GAAW,GAAA;AACf,IAAA,IAAI,SAAA,CAAU,WAAW,MAAA,EAAQ;AAC/B,MAAA,QAAA,GAAW,GAAA;AAAA,IACb;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,IAAA;AAAA,MACA,OAAA,EAAS,QAAA;AAAA,MACT,OAAA,EAAS,OAAO,OAAO,CAAA;AAAA,MACvB,iBAAA,EAAmB;AAAA,KACrB;AAEA,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,MAAA,EAAQ;AAAA,QACN,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,QACjC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,QACnC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,QACjC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,QACjC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA;AAAU;AACtC,KACF;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,KAAA,EAAO,OAAA;AAAA,MACP,OAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA,EAAO,MAAM,QAAA,EAAS;AAAA,MACtB;AAAA,KACF;AAEA,IAAA,MAAM,YAAY,MAAM,IAAA,CAAK,QAAQ,aAAA,CAAc,MAAA,EAAQ,OAAO,MAAM,CAAA;AAExE,IAAA,MAAM,EAAE,GAAG,CAAA,EAAG,CAAA,KAAM,MAAA,CAAO,SAAA,CAAU,KAAK,SAAS,CAAA;AAGnD,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe;AAAA,QACnB,OAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,CAAA;AAAA,QACA,CAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,iBAAiB,MAAM,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,GAAG,YAAY,CAAA;AACpE,MAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,WAAA,EAAa,qBAAA,EAAuB,cAAc,CAAA;AAAA,IAClF,SAAS,KAAA,EAAY;AACnB,MAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,SAAA,EAAW,mCAAA,EAAqC,KAAK,CAAA;AACnF,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAA;AAAA,MACP,KAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,MACnB,CAAA;AAAA,MACA,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF","file":"index.mjs","sourcesContent":["import {\n getPrice,\n numberRemoveEndZero,\n SendType,\n Service,\n OpenAPI,\n Csl,\n ExecTime,\n usdtTokens,\n erc20Abi,\n} from \"@stableflow/core\";\nimport {\n addressToBytes32,\n quoteSignature,\n getHopMsgFee,\n LZ_RECEIVE_VALUE,\n USDT0_CONFIG,\n USDT0_LEGACY_MESH_TRANSFTER_FEE,\n OFT_ABI,\n FRAXZERO_MIDDLE_TOKEN_FRXUSD,\n FRAXZERO_MIDDLE_TOKEN_USDC,\n} from \"@stableflow/bridges\";\nimport {\n evmRpcFallbackProvider,\n buildEndpointV2LzComposePayload,\n NATIVE_MSG_FEE_BUFFER,\n} from \"@stableflow/utils-evm\";\nimport { getDestinationAssociatedTokenAddress } from \"@stableflow/utils-solana\";\nimport Big from \"big.js\";\nimport { ethers } from \"ethers\";\n\nconst DEFAULT_GAS_LIMIT = 100000n;\nconst DEFAULT_GAS_LIMIT_FAILED = 4000000n;\n\nexport default class EVMWallet {\n provider: any;\n signer: any;\n private csl;\n\n constructor(_provider: any, _signer?: any) {\n this.provider = _provider;\n this.signer = _signer;\n const cs = new Csl(OpenAPI.DEBUG);\n this.csl = cs.log;\n }\n\n async transfer(data: {\n originAsset: string;\n depositAddress: string;\n amount: string;\n }) {\n const { originAsset, depositAddress, amount } = data;\n\n if (originAsset === \"eth\") {\n const tx = await this.signer.sendTransaction({\n to: depositAddress,\n value: ethers.parseEther(amount)\n });\n await tx.wait();\n return tx;\n }\n\n const contract = new ethers.Contract(originAsset, erc20Abi, this.signer);\n\n const tx = await contract.transfer(depositAddress, amount);\n const result = await tx.wait();\n\n return result.hash;\n }\n\n async getBalance(token: any, account: string, options?: { isCatchError?: boolean; }) {\n const { isCatchError = false } = options || {};\n\n try {\n let provider = this.provider;\n if (token.rpcUrls) {\n provider = evmRpcFallbackProvider(token);\n }\n\n if (token.symbol === \"eth\" || token.symbol === \"ETH\" || token.symbol === \"native\") {\n const balance = await provider.getBalance(account);\n return balance.toString();\n }\n\n // Use provider instead of _signer for read-only operations\n const contract = new ethers.Contract(token.contractAddress, erc20Abi, provider);\n\n const balance = await contract.balanceOf(account);\n this.csl(\"EVM getBalance\", \"green-500\", \"Success getting %s token balance: %o\", token.contractAddress, balance);\n\n return balance.toString();\n } catch (err) {\n this.csl(\"EVM getBalance\", \"red-500\", \"Get balance failed: %o\", err);\n if (isCatchError) {\n throw err;\n }\n return \"0\";\n }\n }\n\n async balanceOf(token: any, account: string, options?: { isCatchError?: boolean; }) {\n return await this.getBalance(token, account, options);\n }\n\n /**\n * Estimate gas limit for transfer transaction\n * @param data Transfer data\n * @returns Gas limit estimate, gas price, and estimated gas cost\n */\n async estimateTransferGas(data: {\n fromToken: any;\n depositAddress: string;\n amount: string;\n account: string;\n }): Promise<{\n gasLimit: bigint;\n gasPrice: bigint;\n estimateGas: bigint;\n }> {\n const { fromToken, depositAddress, amount, account } = data;\n const originAsset = fromToken.contractAddress;\n const provider = evmRpcFallbackProvider(fromToken);\n\n let gasLimit: bigint;\n\n if (originAsset === \"eth\") {\n // Estimate gas for ETH transfer\n const tx = {\n from: account,\n to: depositAddress,\n value: ethers.parseEther(amount)\n };\n gasLimit = await provider.estimateGas(tx);\n } else {\n // Estimate gas for ERC20 token transfer\n const contract = new ethers.Contract(originAsset, erc20Abi, provider);\n gasLimit = await contract.transfer.estimateGas(depositAddress, amount);\n }\n\n // Increase gas limit by 20% to provide buffer\n gasLimit = (gasLimit * 120n) / 100n;\n\n // Get gas price\n const feeData = await provider.getFeeData();\n const gasPrice = feeData.gasPrice || 0n;\n\n // Calculate estimated gas cost: gasLimit * gasPrice\n const estimateGas = gasLimit * gasPrice;\n\n return {\n gasLimit,\n gasPrice,\n estimateGas\n };\n }\n\n getContract(params: any) {\n const {\n contractAddress,\n abi,\n } = params;\n\n return new ethers.Contract(contractAddress, abi, this.signer);\n }\n\n async allowance(params: any) {\n const {\n dry,\n contractAddress,\n spender,\n address,\n amountWei,\n provider,\n blockTag,\n strict = false,\n } = params;\n\n const runner = provider || this.provider;\n const contract = new ethers.Contract(contractAddress, erc20Abi, runner);\n\n // If querying for a quote\n // Directly return the default value\n if (dry) {\n return {\n contract,\n allowance: \"0\",\n needApprove: false,\n };\n }\n\n // get allowance\n let allowance = \"0\";\n try {\n allowance = blockTag\n ? await contract.allowance(address, spender, { blockTag })\n : await contract.allowance(address, spender);\n allowance = allowance.toString();\n } catch (error) {\n this.csl(\"EVM allowance\", \"red-500\", \"Error getting allowance: %o\", error);\n if (strict) {\n throw error;\n }\n }\n\n return {\n contract,\n allowance,\n needApprove: Big(amountWei || 0).gt(allowance || 0),\n };\n }\n\n async approve(params: any) {\n const {\n contractAddress,\n spender,\n amountWei,\n isApproveMax = false,\n isDetails = false,\n isWaitTxReceipt = true,\n } = params;\n\n const contract = new ethers.Contract(contractAddress, erc20Abi, this.signer);\n\n let _amountWei = amountWei;\n if (isApproveMax) {\n _amountWei = ethers.MaxUint256;\n }\n\n const detailResult: any = {\n success: false,\n data: {},\n message: null,\n };\n\n try {\n const tx = await contract.approve(spender, _amountWei);\n const txReceipt = await tx.wait();\n if (txReceipt.status === 1) {\n if (isDetails) {\n const confirmations = typeof txReceipt.confirmations === \"function\"\n ? await txReceipt.confirmations()\n : txReceipt.confirmations;\n detailResult.success = true;\n detailResult.data = {\n txHash: txReceipt.hash,\n blockNumber: txReceipt.blockNumber,\n confirmations,\n };\n return detailResult;\n }\n return true;\n }\n if (isDetails) {\n detailResult.message = \"Arrove failed\";\n return detailResult;\n }\n return false;\n } catch (error: any) {\n this.csl(\"EVM approve\", \"red-500\", \"Error approve: %o\", error);\n if (isDetails) {\n detailResult.message = error.message;\n }\n }\n\n if (isDetails) {\n return detailResult;\n }\n\n return false;\n }\n\n async getEstimateGas(params: any) {\n const { gasLimit, price, nativeToken, provider, gasPrice } = params;\n\n let finalGasPrice = gasPrice;\n if (!finalGasPrice) {\n const feeData = await provider.getFeeData();\n finalGasPrice = feeData.maxFeePerGas || feeData.gasPrice || BigInt(\"20000000000\"); // Default 20 gwei\n }\n\n const estimateGas = BigInt(gasLimit) * BigInt(finalGasPrice);\n const estimateGasAmount = Big(estimateGas.toString()).div(10 ** nativeToken.decimals);\n const estimateGasUsd = Big(estimateGasAmount).times(price || 1);\n\n return {\n gasPrice: finalGasPrice,\n usd: numberRemoveEndZero(Big(estimateGasUsd).toFixed(20)),\n wei: estimateGas,\n amount: numberRemoveEndZero(Big(estimateGasAmount).toFixed(nativeToken.decimals)),\n };\n }\n\n async estimateTransaction(params: any) {\n const {\n dry,\n contract,\n method,\n param,\n fromToken,\n prices,\n evmGasFees,\n defaultGasLimit = DEFAULT_GAS_LIMIT,\n refundTo,\n txRequest,\n } = params;\n\n const cs = new Csl(OpenAPI.DEBUG);\n const csl = cs.log;\n\n const provider = evmRpcFallbackProvider(fromToken);\n const nativeTokenPrice = getPrice(prices, fromToken.nativeToken.symbol);\n\n const result = {\n estimateSourceGasLimit: dry ? DEFAULT_GAS_LIMIT_FAILED : DEFAULT_GAS_LIMIT,\n estimateSourceGas: 0n,\n estimateSourceGasUsd: \"0\",\n };\n\n const setDefaultGasLimit = async () => {\n const { usd, wei } = await this.getEstimateGas({\n gasLimit: DEFAULT_GAS_LIMIT,\n price: nativeTokenPrice,\n nativeToken: fromToken.nativeToken,\n provider,\n gasPrice: dry ? evmGasFees[fromToken.chainId].gasPrice : void 0,\n });\n result.estimateSourceGas = wei;\n result.estimateSourceGasUsd = usd;\n };\n\n let finalGasLimit = defaultGasLimit;\n\n if (dry) {\n await setDefaultGasLimit();\n return result;\n }\n\n if (txRequest) {\n try {\n const gasLimit = await provider.estimateGas({\n to: txRequest.target,\n data: txRequest.calldata,\n from: refundTo || this.signer?.address,\n });\n finalGasLimit = gasLimit * 120n / 100n;\n const { usd, wei } = await this.getEstimateGas({\n gasLimit: finalGasLimit,\n price: nativeTokenPrice,\n nativeToken: fromToken.nativeToken,\n provider,\n });\n result.estimateSourceGasLimit = finalGasLimit;\n result.estimateSourceGas = wei;\n result.estimateSourceGasUsd = usd;\n } catch (error) {\n csl(\"EVM estimateTransaction\", \"red-500\", \"%s estimateGas failed: %o\", method, error);\n await setDefaultGasLimit();\n result.estimateSourceGasLimit = DEFAULT_GAS_LIMIT_FAILED / 2n;\n }\n\n return result;\n }\n\n try {\n const gasLimit = await contract[method].estimateGas(...param);\n finalGasLimit = gasLimit * 120n / 100n;\n const { usd, wei } = await this.getEstimateGas({\n gasLimit: finalGasLimit,\n price: nativeTokenPrice,\n nativeToken: fromToken.nativeToken,\n provider,\n });\n result.estimateSourceGasLimit = finalGasLimit;\n result.estimateSourceGas = wei;\n result.estimateSourceGasUsd = usd;\n } catch (error) {\n csl(\"EVM estimateTransaction\", \"red-500\", \"%s estimateGas failed: %o\", method, error);\n await setDefaultGasLimit();\n result.estimateSourceGasLimit = DEFAULT_GAS_LIMIT_FAILED / 2n;\n }\n\n return result;\n }\n\n async quoteOFT(params: any) {\n const { Options } = await import(\"@layerzerolabs/lz-v2-utilities\");\n const {\n dry,\n abi,\n dstEid,\n recipient,\n amountWei,\n slippageTolerance,\n payInLzToken,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n originLayerzeroAddress,\n destinationLayerzeroAddress,\n excludeFees,\n refundTo,\n multiHopComposer,\n isMultiHopComposer,\n isOriginLegacy,\n isDestinationLegacy,\n originLayerzero,\n destinationLayerzero,\n } = params;\n\n const result: any = {\n needApprove: false,\n approveSpender: originLayerzeroAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n originLayerzeroAddress: originLayerzeroAddress,\n destinationLayerzeroAddress: destinationLayerzeroAddress,\n },\n fees: {},\n totalFeesUsd: \"0\",\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: \"0\",\n estimateTime: 0, // seconds - dynamically calculated using LayerZero formula\n outputAmount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).toFixed(params.fromToken.decimals, 0)),\n };\n\n const execTime = new ExecTime({ type: `Usdt0 EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-100\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const oftContract = new ethers.Contract(originLayerzeroAddress, abi, this.signer);\n const oftContractRead = new ethers.Contract(originLayerzeroAddress, abi, provider);\n\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"params: %o\", params);\n execTime.breakpoint();\n\n // 1. check if need approve\n const approvalRequired = isOriginLegacy ? originLayerzero.oftLegacyApprovalRequired : originLayerzero.oftApprovalRequired;\n this.csl(\"EVM quoteOFT\", \"blue-900\", \"approvalRequired: %o\", approvalRequired);\n execTime.log(\"approvalRequired\");\n\n const lzReceiveOptionGas = isDestinationLegacy ? destinationLayerzero.lzReceiveOptionGasLegacy : (destinationLayerzero.lzReceiveOptionGas || 200000);\n let lzReceiveOptionValue = 0;\n\n execTime.breakpoint();\n const destATA = await getDestinationAssociatedTokenAddress({\n recipient,\n toToken,\n });\n execTime.log(\"getDestinationAssociatedTokenAddress\");\n if (destATA.needCreateTokenAccount) {\n lzReceiveOptionValue = LZ_RECEIVE_VALUE[toToken.chainName] || 0;\n }\n\n let unMultiHopExtraOptions = Options.newOptions().toHex();\n if (!isMultiHopComposer && lzReceiveOptionValue) {\n unMultiHopExtraOptions = Options.newOptions().addExecutorLzReceiveOption(lzReceiveOptionGas, lzReceiveOptionValue).toHex();\n }\n\n // 2. quote send\n const sendParam: any = {\n dstEid: dstEid,\n to: addressToBytes32(toToken.chainType, recipient),\n amountLD: amountWei,\n minAmountLD: 0n,\n extraOptions: unMultiHopExtraOptions,\n composeMsg: \"0x\",\n oftCmd: \"0x\"\n };\n\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"isMultiHopComposer: %o\", isMultiHopComposer);\n if (isMultiHopComposer) {\n // multiHopComposer: Arbitrum legacy mesh MultiHopComposer, eid = 30110\n sendParam.dstEid = multiHopComposer.eid;\n sendParam.to = addressToBytes32(\"evm\", multiHopComposer.oftMultiHopComposer);\n\n let multiHopExtraOptions = Options.newOptions().toHex();\n if (lzReceiveOptionValue) {\n multiHopExtraOptions = Options.newOptions().addExecutorLzReceiveOption(lzReceiveOptionGas, lzReceiveOptionValue).toHex();\n }\n\n const composeMsgSendParam = {\n dstEid,\n to: addressToBytes32(toToken.chainType, recipient),\n amountLD: sendParam.amountLD,\n minAmountLD: sendParam.minAmountLD,\n extraOptions: multiHopExtraOptions,\n composeMsg: \"0x\",\n oftCmd: \"0x\",\n };\n execTime.breakpoint();\n const hopMsgFee = await getHopMsgFee({\n sendParam: composeMsgSendParam,\n toToken,\n });\n execTime.log(\"getHopMsgFee\");\n\n sendParam.extraOptions = Options.newOptions()\n .addExecutorComposeOption(0, originLayerzero.composeOptionGas || 800000, hopMsgFee)\n .toHex();\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\n sendParam.composeMsg = abiCoder.encode(\n [\"tuple(uint32 dstEid, bytes32 to, uint256 amountLD, uint256 minAmountLD, bytes extraOptions, bytes composeMsg, bytes oftCmd)\"],\n [Object.values(composeMsgSendParam)]\n );\n }\n\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"sendParam: %o\", sendParam);\n if (!dry) {\n execTime.breakpoint();\n const oftData = await oftContractRead.quoteOFT.staticCall(sendParam);\n const [, , oftReceipt] = oftData;\n sendParam.minAmountLD = oftReceipt[1] * (1000000n - BigInt(slippageTolerance * 10000)) / 1000000n;\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"oftData: %o\", oftData);\n execTime.log(\"quoteOFT.staticCall\");\n }\n\n execTime.breakpoint();\n const mergedCall = [\n oftContractRead.quoteSend.staticCall(sendParam, payInLzToken),\n ];\n if (approvalRequired) {\n mergedCall.push(\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: originLayerzeroAddress,\n address: refundTo,\n amountWei,\n provider,\n })\n );\n }\n const [msgFee, allowanceResult] = await Promise.all(mergedCall);\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"quoteSend: %o\", msgFee);\n if (approvalRequired) {\n result.needApprove = allowanceResult?.needApprove;\n }\n execTime.log(\"quoteSend.staticCall and allowance\");\n\n // const msgFee = await oftContractRead.quoteSend.staticCall(sendParam, payInLzToken);\n let nativeMsgFee = msgFee[0];\n const lzMsgFee = msgFee[1];\n result.totalEstimateSourceGas = nativeMsgFee;\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"msgFee: %o, nativeMsgFee: %o\", msgFee, nativeMsgFee);\n // add 5% buffer\n nativeMsgFee = nativeMsgFee * NATIVE_MSG_FEE_BUFFER / 100n;\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"msgFee after buffer: %o\", nativeMsgFee);\n\n // csl(\"EVM quoteOFT\", \"blue-900\", \"Params: %o\", result.sendParam);\n\n // 3. estimate gas\n const nativeFeeUsd = Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).times(getPrice(prices, fromToken.nativeToken.symbol));\n result.fees.nativeFee = numberRemoveEndZero(Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).toFixed(fromToken.nativeToken.decimals));\n result.fees.nativeFeeUsd = numberRemoveEndZero(Big(nativeFeeUsd).toFixed(20));\n result.fees.lzTokenFeeUsd = numberRemoveEndZero(Big(lzMsgFee?.toString() || 0).div(10 ** fromToken.decimals).toFixed(20));\n\n // 0.03% fee for Legacy Mesh transfers only (native USDT0 transfers are free)\n if (isOriginLegacy || isDestinationLegacy) {\n result.fees.legacyMeshFeeUsd = numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).times(USDT0_LEGACY_MESH_TRANSFTER_FEE).toFixed(params.fromToken.decimals));\n result.outputAmount = numberRemoveEndZero(Big(Big(amountWei || 0).div(10 ** params.fromToken.decimals)).minus(result.fees.legacyMeshFeeUsd || 0).toFixed(params.fromToken.decimals, 0));\n }\n\n const finalSendParam = [\n sendParam,\n {\n nativeFee: nativeMsgFee,\n lzTokenFee: lzMsgFee,\n },\n refundTo,\n { value: nativeMsgFee }\n ];\n\n execTime.breakpoint();\n const ett = await this.estimateTransaction({\n dry,\n contract: oftContract,\n method: \"send\",\n param: finalSendParam,\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas += ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n finalSendParam[3].gasLimit = ett.estimateSourceGasLimit;\n execTime.log(\"send.estimateGas\");\n\n result.sendParam = {\n contract: oftContract,\n method: \"send\",\n param: finalSendParam,\n };\n\n // calculate total fees\n for (const feeKey in result.fees) {\n if (excludeFees.includes(feeKey) || !/Usd$/.test(feeKey)) {\n continue;\n }\n result.totalFeesUsd = Big(result.totalFeesUsd || 0).plus(result.fees[feeKey] || 0);\n }\n result.totalFeesUsd = numberRemoveEndZero(Big(result.totalFeesUsd).toFixed(20));\n\n execTime.logTotal(\"quoteOFT\");\n\n return result;\n }\n\n async sendTransaction(params: any) {\n const {\n method,\n contract,\n param,\n } = params;\n\n // Add gas fee buffer to prevent \"max fee per gas less than block base fee\" error.\n // Between quote and send, the baseFee may increase, causing the estimated\n // maxFeePerGas to be lower than the current baseFee.\n const overridesIndex = param.length - 1;\n const overrides = param[overridesIndex] && typeof param[overridesIndex] === \"object\" && !Array.isArray(param[overridesIndex])\n ? { ...param[overridesIndex] }\n : {};\n\n if (!overrides.maxFeePerGas) {\n try {\n const feeData = await this.provider.getFeeData();\n if (feeData.maxFeePerGas) {\n // Add 20% buffer to maxFeePerGas to account for baseFee fluctuations\n overrides.maxFeePerGas = (feeData.maxFeePerGas * 120n) / 100n;\n }\n if (feeData.maxPriorityFeePerGas && !overrides.maxPriorityFeePerGas) {\n overrides.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n }\n } catch (error) {\n this.csl(\"EVM sendTransaction\", \"red-500\", \"Failed to get fee data for gas buffer: %o\", error);\n }\n }\n\n const finalParam = [...param];\n if (param[overridesIndex] && typeof param[overridesIndex] === \"object\" && !Array.isArray(param[overridesIndex])) {\n finalParam[overridesIndex] = overrides;\n } else {\n finalParam.push(overrides);\n }\n\n try {\n const tx = await contract[method](...finalParam);\n\n return tx.hash;\n } catch (error: any) {\n this.csl(\"EVM sendTransaction\", \"red-500\", \"Error sending transaction: %o, message: %o\", error, error.message);\n let _finalErrorMessage = `Transaction failed: ${error.message}`;\n if (error?.message?.includes(\"user rejected action\")) {\n _finalErrorMessage = error.message;\n }\n throw new Error(_finalErrorMessage);\n }\n\n // const DefaultErrorMsg = \"Transaction failed\";\n // try {\n // const txReceipt = await tx.wait();\n\n // if (txReceipt.status !== 1) {\n // throw new Error(DefaultErrorMsg);\n // }\n\n // return txReceipt.hash;\n // } catch (error: any) {\n // return tx.hash;\n // }\n }\n\n /**\n * Unified quote method that routes to specific quote methods based on type\n * @param type Service type from Service\n * @param params Parameters for the quote\n */\n async quote(type: Service, params: any) {\n switch (type) {\n case Service.CCTP:\n return await this.quoteCCTP(params);\n case Service.Usdt0:\n return await this.quoteOFT(params);\n case Service.OneClick:\n return await this.quoteOneClickProxy(params);\n case Service.Native:\n return await this.quoteNative(params);\n case Service.FraxZero:\n return await this.quoteFraxZero(params);\n default:\n throw new Error(`Unsupported quote type: ${type}`);\n }\n }\n\n /**\n * Unified send method that routes to specific send methods based on type\n * @param type Send type from SendType enum\n * @param params Parameters for the send transaction\n */\n async send(type: SendType, params: any) {\n switch (type) {\n case SendType.SEND:\n return await this.sendTransaction(params);\n case SendType.TRANSFER:\n return await this.transfer(params);\n default:\n throw new Error(`Unsupported send type: ${type}`);\n }\n }\n\n async quoteCCTP(params: any) {\n const {\n dry,\n proxyAddress,\n abi,\n refundTo,\n recipient,\n amountWei,\n // slippageTolerance,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n excludeFees,\n destinationDomain,\n sourceDomain,\n } = params;\n\n const result: any = {\n needApprove: false,\n approveSpender: proxyAddress,\n sendParam: void 0,\n quoteParam: {\n sourceDomain,\n destinationDomain,\n proxyAddress,\n ...params,\n },\n fees: {},\n totalFeesUsd: void 0,\n estimateSourceGas: void 0,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: void 0,\n estimateTime: Math.floor(Math.random() * 8) + 3,\n outputAmount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals, 0)),\n };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const execTime = new ExecTime({ type: `CCTP EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-200\", isDebug: OpenAPI.DEBUG });\n\n const proxyContract = new ethers.Contract(proxyAddress, abi, this.signer);\n const proxyContractRead = new ethers.Contract(proxyAddress, abi, provider);\n\n let realRecipient = recipient;\n execTime.breakpoint();\n // 1. get user nonce\n const getUsrNonce = async () => {\n let userNonce = 0n;\n try {\n userNonce = await proxyContract.userNonces(refundTo);\n } catch (error) {\n }\n return userNonce;\n };\n const mergedCalls = [\n getDestinationAssociatedTokenAddress({\n recipient,\n toToken,\n }),\n getUsrNonce(),\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n address: refundTo,\n spender: proxyAddress,\n amountWei,\n provider,\n })\n ];\n const [destATA, userNonce, allowance]: any = await Promise.all(mergedCalls);\n execTime.log(\"getDestinationATA & getUsrNonce & get allowance\", \"destATA: %o, userNonce: %o, allowance: %o\", destATA, userNonce, allowance);\n result.needCreateTokenAccount = destATA.needCreateTokenAccount;\n if (destATA.associatedTokenAddress) {\n realRecipient = destATA.associatedTokenAddress;\n }\n result.needApprove = allowance.needApprove;\n\n execTime.breakpoint();\n // 2. quote signature\n const signatureRes = await quoteSignature({\n address: refundTo,\n amount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals, 0)),\n destination_domain_id: destinationDomain,\n receipt_address: realRecipient,\n source_domain_id: sourceDomain,\n user_nonce: Number(userNonce),\n });\n const {\n bridge_fee,\n finality_threshold,\n max_fee,\n mint_fee,\n receipt_amount,\n signature,\n destination_caller,\n } = signatureRes;\n execTime.log(\"quoteSignature\");\n\n result.fees.estimateMintGasUsd = numberRemoveEndZero(Big(mint_fee || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals));\n result.fees.bridgeFeeUsd = numberRemoveEndZero(Big(bridge_fee || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals));\n const chargedAmount = BigInt(amountWei) - BigInt(mint_fee);\n result.outputAmount = numberRemoveEndZero(Big(receipt_amount || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals, 0));\n\n const depositParam = [\n // originalAmount\n amountWei,\n // chargedAmount = originalAmount - gas fee\n chargedAmount,\n // destinationDomain\n destinationDomain,\n // mintRecipient\n addressToBytes32(toToken.chainType, realRecipient),\n // burnToken\n fromToken.contractAddress,\n // destinationCaller\n destination_caller ? addressToBytes32(toToken.chainType, destination_caller) : \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n // maxFee\n max_fee,\n // minFinalityThreshold\n finality_threshold,\n // signature\n signature,\n ];\n\n execTime.breakpoint();\n // 3. estimate deposit gas\n const ett = await this.estimateTransaction({\n dry,\n contract: proxyContract,\n method: \"depositWithFee\",\n param: depositParam,\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n depositParam.push({ gasLimit: ett.estimateSourceGasLimit });\n execTime.log(\"estimateTransaction\");\n\n result.sendParam = {\n method: \"depositWithFee\",\n contract: proxyContract,\n param: depositParam,\n };\n\n // 5. calculate total fees\n for (const feeKey in result.fees) {\n if (excludeFees.includes(feeKey) || !/Usd$/.test(feeKey)) {\n continue;\n }\n result.totalFeesUsd = Big(result.totalFeesUsd || 0).plus(result.fees[feeKey] || 0);\n }\n result.totalFeesUsd = numberRemoveEndZero(Big(result.totalFeesUsd).toFixed(20));\n\n execTime.logTotal(\"quoteCCTP\");\n\n return result;\n }\n\n async quoteOneClickProxy(params: any) {\n const {\n dry,\n proxyAddress,\n abi,\n fromToken,\n refundTo,\n depositAddress,\n amountWei,\n prices,\n evmGasFees,\n } = params;\n\n const execTime = new ExecTime({ type: `OneClick EVM ${fromToken.chainName}`, logStyle: \"stone-300\", isDebug: OpenAPI.DEBUG });\n\n const result: any = { fees: {} };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const proxyContract = new ethers.Contract(proxyAddress, abi, this.signer);\n const proxyParam: any = [\n // tokenAddress\n fromToken.contractAddress,\n // recipient\n depositAddress,\n // amount\n amountWei,\n ];\n\n execTime.breakpoint();\n const mergedCalls = [\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n address: refundTo,\n spender: proxyAddress,\n amountWei: amountWei,\n provider,\n }),\n this.estimateTransaction({\n dry,\n contract: proxyContract,\n method: \"proxyTransfer\",\n param: proxyParam,\n fromToken,\n prices,\n evmGasFees,\n })\n ];\n const [allowance, ett]: any = await Promise.all(mergedCalls);\n result.needApprove = allowance.needApprove;\n result.approveSpender = proxyAddress;\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n proxyParam.push({ gasLimit: ett.estimateSourceGasLimit });\n execTime.log(\"allowance & estimateTransaction\");\n\n result.sendParam = {\n method: \"proxyTransfer\",\n contract: proxyContract,\n param: proxyParam,\n };\n\n execTime.logTotal(\"quoteOneClickPorxy\");\n\n return result;\n }\n\n async quoteNative(params: any) {\n const {\n quoteResponse,\n bridgeRouterAddress,\n ...restParams\n } = params;\n const {\n dry,\n amountWei,\n refundTo,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n } = restParams;\n\n const result: any = {\n ...quoteResponse,\n fees: {},\n needApprove: false,\n approveSpender: bridgeRouterAddress,\n quoteParam: {\n ...restParams,\n },\n sendParam: {\n txRequest: quoteResponse.txRequest,\n },\n totalFeesUsd: void 0,\n estimateSourceGas: void 0,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: void 0,\n estimateTime: quoteResponse.priority === \"fast\" ? Math.floor(Math.random() * 10) + 50 : Math.floor(Math.random() * 60) + 300,\n outputAmount: 0,\n };\n\n const execTime = new ExecTime({ type: `Native EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-400\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const estimateNativeGas = async () => {\n if (dry) {\n const ett = await this.estimateTransaction({\n dry,\n fromToken,\n prices,\n evmGasFees,\n });\n\n result.outputAmount = quoteResponse.buyerTokenAmount + \"\";\n result.fees = {\n estimateGasUsd: ett.estimateSourceGasUsd,\n widgetFeeUsd: quoteResponse.widgetFeeUsd,\n liquidityProviderFeeUsd: quoteResponse.liquidityProviderFeeUsd,\n };\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = numberRemoveEndZero(Big(quoteResponse.totalFeeUsd).toFixed(20));\n }\n else {\n const ett = await this.estimateTransaction({\n dry,\n fromToken,\n prices,\n evmGasFees,\n txRequest: quoteResponse.txRequest,\n refundTo,\n });\n\n result.outputAmount = Big(quoteResponse.amountOut || 0).div(10 ** (toToken.decimals || 6)).toFixed(toToken.decimals || 6, 0);\n result.fees = {\n estimateGasUsd: ett.estimateSourceGasUsd,\n // maybe 100 = 1%\n widgetFeeUsd: numberRemoveEndZero(Big(amountWei || 0).div(10 ** (fromToken.decimals || 6)).times(quoteResponse.widgetFee.feeRate || 0).toFixed(20, 0)),\n // not return by api\n liquidityProviderFeeUsd: \"0\",\n };\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = numberRemoveEndZero(Big(quoteResponse.amountOutBeforeFee || 0).minus(quoteResponse.amountOut).div(10 ** (fromToken.decimals || 6)).toFixed(20, 0));\n result.txRequest.gasLimit = ett.estimateSourceGasLimit;\n }\n };\n\n execTime.breakpoint();\n const mergedCalls = [\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: bridgeRouterAddress,\n address: refundTo,\n amountWei,\n }),\n estimateNativeGas()\n ];\n const [allowanceResult]: any = await Promise.all(mergedCalls);\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance & estimateNativeGas\");\n\n execTime.logTotal(\"quoteNative\");\n\n return result;\n }\n\n async quoteFraxZero(params: any) {\n const {\n dry,\n abi,\n recipient,\n amountWei,\n slippageTolerance,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n excludeFees,\n refundTo,\n originLayerzero,\n destinationLayerzero,\n } = params;\n\n const {\n eid: srcEid,\n remoteHop,\n lockbox,\n } = originLayerzero;\n const {\n eid: dstEid,\n } = destinationLayerzero;\n\n const isFromEthereum = fromToken.chainId === 1;\n\n const result: any = {\n needApprove: false,\n approveSpender: remoteHop,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime: 0,\n outputAmount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).toFixed(params.fromToken.decimals, 0)),\n };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const execTime = new ExecTime({ type: `FraxZero EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-500\", isDebug: OpenAPI.DEBUG });\n\n const remoteHopContract = new ethers.Contract(remoteHop, abi, this.signer);\n const remoteHopContractRead = new ethers.Contract(remoteHop, abi, provider);\n\n // 1. check if need approve\n // 2. get message fee\n const sendParams = [\n // _oft\n isFromEthereum ? lockbox : fromToken.contractAddress,\n // _dstEid\n dstEid,\n // _to\n addressToBytes32(toToken.chainType, recipient),\n // _amountLD\n amountWei\n ];\n execTime.breakpoint();\n const mergedCalls = [\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: remoteHop,\n address: refundTo,\n amountWei,\n provider,\n }),\n remoteHopContractRead.quote.staticCall(...sendParams)\n ];\n const [allowanceResult, msgFee]: any = await Promise.all(mergedCalls);\n execTime.log(\"allowance & quote.staticCall\");\n\n result.needApprove = allowanceResult.needApprove;\n\n let nativeMsgFee = msgFee[0];\n this.csl(\"EVM quoteFraxZero\", \"blue-700\", \"nativeMsgFee: %o\", nativeMsgFee);\n\n // add 5% buffer\n nativeMsgFee = nativeMsgFee * NATIVE_MSG_FEE_BUFFER / 100n;\n this.csl(\"EVM quoteFraxZero\", \"blue-700\", \"nativeMsgFee after buffer: %o\", nativeMsgFee);\n result.totalEstimateSourceGas = nativeMsgFee;\n\n const nativeFeeUsd = Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).times(getPrice(prices, fromToken.nativeToken.symbol));\n result.fees.nativeFee = numberRemoveEndZero(Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).toFixed(fromToken.nativeToken.decimals));\n result.fees.nativeFeeUsd = numberRemoveEndZero(Big(nativeFeeUsd).toFixed(20));\n result.fees.lzTokenFeeUsd = numberRemoveEndZero(Big(msgFee[1]?.toString() || 0).div(10 ** fromToken.decimals).toFixed(20));\n\n this.csl(\"EVM quoteFraxZero\", \"blue-700\", \"msgFee: %o\", msgFee);\n\n execTime.breakpoint();\n // 3. estimate send gas\n const finalSendParam = [...sendParams, { value: nativeMsgFee }];\n const ett = await this.estimateTransaction({\n dry,\n contract: remoteHopContract,\n method: \"sendOFT\",\n param: finalSendParam,\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas += ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n finalSendParam[finalSendParam.length - 1].gasLimit = ett.estimateSourceGasLimit;\n execTime.log(\"sendOFT.estimateTransaction\");\n\n // 4. generate transaction\n result.sendParam = {\n contract: remoteHopContract,\n method: \"sendOFT\",\n param: finalSendParam,\n };\n\n // 5. calculate total fees\n for (const feeKey in result.fees) {\n if (excludeFees.includes(feeKey) || !/Usd$/.test(feeKey)) {\n continue;\n }\n result.totalFeesUsd = Big(result.totalFeesUsd || 0).plus(result.fees[feeKey] || 0);\n }\n result.totalFeesUsd = numberRemoveEndZero(Big(result.totalFeesUsd).toFixed(20));\n\n execTime.logTotal(\"quoteFraxZero\");\n\n return result;\n }\n\n async preivewRedeemFrxUSD(params: any) {\n const {\n dry,\n amountWei,\n fromToken,\n abi,\n usdcCustodianAddress,\n rwaCustodianAddress,\n redemptionAddress,\n } = params;\n\n // csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n if (dry) {\n return {\n maxUsdc: 0n,\n maxRwa: 0n,\n amountWeiBigInt: 0n,\n // The token obtained from redeem is Ethereum USDC\n totalAssetsOut: BigInt(Big(amountWei || 0).div(10 ** fromToken.decimals).times(10 ** FRAXZERO_MIDDLE_TOKEN_USDC.decimals).toFixed(0, 0)),\n isInsufficientLiquidity: false,\n };\n }\n\n const execTime = new ExecTime({ type: `FraxZero EVM preivewRedeemFrxUSD ${fromToken.chainName}`, logStyle: \"stone-600\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n // Get maxSharesRedeemable (index 3) from mdwrComboView for both custodians\n const usdcCustodian = new ethers.Contract(usdcCustodianAddress, abi, provider);\n const rwaCustodian = new ethers.Contract(rwaCustodianAddress, abi, provider);\n const redemption = new ethers.Contract(redemptionAddress, abi, provider);\n\n execTime.breakpoint();\n const [usdcView, redemptionView] = await Promise.all([\n usdcCustodian.mdwrComboView.staticCall(),\n redemption.maxUstbRedemptionAmount.staticCall(),\n ]);\n execTime.log(\"usdcCustodian & redemption\");\n\n // This value is the frxUSD wei amount\n const maxUsdc = usdcView[3]; // maxSharesRedeemable\n const superstateTokenAmount = redemptionView[0]; // superstateTokenAmount\n\n // This value represents the wei amount of USDC\n const [maxRwa] = await redemption.calculateUsdcOut.staticCall(superstateTokenAmount);\n\n const amountWeiBigInt = BigInt(amountWei || 0);\n\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"usdcCustodian maxSharesRedeemable(frxUSD wei amount): %o\", maxUsdc);\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"rwaCustodian maxSharesRedeemable(USDC wei amount): %o\", maxRwa);\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"amountWei: %o\", amountWeiBigInt);\n\n let totalAssetsOut = 0n;\n let isInsufficientLiquidity = false;\n\n if (amountWeiBigInt <= maxUsdc) {\n // USDC path only\n execTime.breakpoint();\n const assetsOut = await usdcCustodian.previewRedeem.staticCall(amountWeiBigInt);\n execTime.log(\"usdcCustodian.previewRedeem (USDC only)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC path only, usdcCustodian previewRedeem input: %o, value: %o\", amountWeiBigInt, assetsOut);\n totalAssetsOut = assetsOut;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC path only, totalAssetsOut: %o\", totalAssetsOut);\n } else {\n // USDC first (maxUsdc), then RWA for remainder\n if (maxUsdc > 0n) {\n execTime.breakpoint();\n const usdcAssetsOut = await usdcCustodian.previewRedeem.staticCall(maxUsdc);\n execTime.log(\"usdcCustodian.previewRedeem (mixed)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), usdcCustodian previewRedeem input: %o, value: %o\", maxUsdc, usdcAssetsOut);\n totalAssetsOut += usdcAssetsOut;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), totalAssetsOut: %o\", totalAssetsOut);\n }\n const rwaAmount = amountWeiBigInt - maxUsdc;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"RWA for remainder, rwaAmount: %o\", rwaAmount);\n if (rwaAmount > 0n) {\n execTime.breakpoint();\n const superstateTokenInAmount = await rwaCustodian.previewRedeem.staticCall(rwaAmount);\n execTime.log(\"rwaCustodian.previewRedeem (mixed)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), rwaCustodian previewRedeem input: %o, superstateTokenInAmount: %o\", rwaAmount, superstateTokenInAmount);\n execTime.breakpoint();\n const [rwaAssetsOut] = await redemption.calculateUsdcOut.staticCall(superstateTokenInAmount);\n execTime.log(\"redemption.calculateUsdcOut (mixed)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), rwaCustodian previewRedeem input: %o, value: %o\", rwaAmount, rwaAssetsOut);\n totalAssetsOut += rwaAssetsOut;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"RWA for remainder, totalAssetsOut: %o\", totalAssetsOut);\n\n if (rwaAssetsOut > maxRwa) {\n isInsufficientLiquidity = true;\n }\n }\n }\n\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"final totalAssetsOut: %o\", totalAssetsOut);\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"final insufficient liquidity: %o\", isInsufficientLiquidity);\n\n execTime.logTotal(\"preivewRedeemFrxUSD\");\n\n return {\n maxUsdc,\n maxRwa,\n amountWeiBigInt,\n totalAssetsOut,\n isInsufficientLiquidity,\n };\n }\n\n async previewMintFrxUSD(params: any) {\n const {\n dry,\n amountWei,\n fromToken,\n abi,\n usdcCustodianAddress,\n } = params;\n\n this.csl(\"EVM previewMintFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n if (dry) {\n return {\n maxUsdc: 0n,\n amountWeiBigInt: 0n,\n totalMax: 0n,\n // Minting means converting Ethereum USDC into Ethereum frxUSD\n totalAssetsOut: BigInt(Big(amountWei || 0).div(10 ** fromToken.decimals).times(10 ** FRAXZERO_MIDDLE_TOKEN_FRXUSD.decimals).toFixed(0, 0)),\n };\n }\n\n const execTime = new ExecTime({ type: `FraxZero EVM previewMintFrxUSD ${fromToken.chainName}`, logStyle: \"stone-700\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n // Get maxAssetsDepositable (index 0) from mdwrComboView for both custodians\n const usdcCustodian = new ethers.Contract(usdcCustodianAddress, abi, provider);\n\n execTime.breakpoint();\n const usdcView = await usdcCustodian.mdwrComboView.staticCall();\n execTime.log(\"usdcCustodian.mdwrComboView\");\n\n const maxUsdc = usdcView[0]; // maxAssetsDepositable\n\n const amountWeiBigInt = BigInt(amountWei || 0);\n const totalMax = maxUsdc;\n\n execTime.breakpoint();\n const totalAssetsOut = await usdcCustodian.previewDeposit.staticCall(amountWeiBigInt);\n execTime.log(\"usdcCustodian.previewDeposit\");\n\n execTime.logTotal(\"previewMintFrxUSD\");\n\n return {\n maxUsdc,\n amountWeiBigInt,\n totalMax,\n totalAssetsOut,\n };\n }\n\n /**\n * Redeem frxUSD to USDC via USDC and/or RWA custodian contracts.\n * Uses mdwrComboView to get max redeemable liquidity and splits redemption across USDC/RWA paths.\n * Uses previewRedeem to get accurate output amount (USDC).\n */\n async redeemFrxUSD(params: any) {\n const {\n dry,\n recipient,\n amountWei,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n refundTo,\n abi,\n usdcCustodianAddress,\n rwaCustodianAddress,\n redeemAndMintContractAddress,\n preivewRedeemResult,\n } = params;\n\n this.csl(\"EVM redeemFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n // Ethereum average block time ~12s, random ±5 seconds\n const ETH_AVG_BLOCK_TIME = 12;\n const estimateTime = (ETH_AVG_BLOCK_TIME * 2) + Math.floor(Math.random() * 11) - 5;\n\n const result: any = {\n needApprove: false,\n approveSpender: redeemAndMintContractAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime,\n outputAmount: \"0\",\n };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const execTime = new ExecTime({ type: `FraxZero EVM redeemFrxUSD ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-800\", isDebug: OpenAPI.DEBUG });\n\n const redeemContractRead = new ethers.Contract(redeemAndMintContractAddress, abi, provider);\n const redeemContract = new ethers.Contract(redeemAndMintContractAddress, abi, this.signer);\n\n execTime.breakpoint();\n let finalPreivewRedeemResult = preivewRedeemResult;\n if (!finalPreivewRedeemResult) {\n finalPreivewRedeemResult = await this.preivewRedeemFrxUSD(params);\n }\n const {\n isInsufficientLiquidity,\n totalAssetsOut,\n } = finalPreivewRedeemResult;\n execTime.log(\"preivewRedeemFrxUSD\");\n\n if (isInsufficientLiquidity) {\n throw new Error(\"Insufficient liquidity\");\n }\n\n // outputAmount = USDC amount (6 decimals), human-readable\n result.outputAmount = numberRemoveEndZero(\n Big(totalAssetsOut.toString()).div(10 ** toToken.decimals).toFixed(toToken.decimals, 0)\n );\n\n execTime.breakpoint();\n // check allowance of fromToken for redeemAndMintContractAddress\n const allowanceResult = await this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: redeemAndMintContractAddress,\n address: refundTo,\n amountWei,\n provider,\n });\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance\");\n\n result.sendParam = {\n contract: redeemContract,\n method: \"redeemToUsdcAndTransfer\",\n param: [\n amountWei,\n recipient,\n ],\n };\n\n execTime.breakpoint();\n // Estimate gas for multicall aggregate and compute fees\n const ett = await this.estimateTransaction({\n dry,\n contract: redeemContract,\n method: result.sendParam.method,\n param: [...result.sendParam.param, { gasLimit: DEFAULT_GAS_LIMIT_FAILED }],\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = ett.estimateSourceGasUsd;\n result.sendParam.param[2] = { gasLimit: ett.estimateSourceGasLimit };\n execTime.log(\"estimateTransaction\");\n\n execTime.logTotal(\"redeemFrxUSD\");\n\n return result;\n }\n\n /**\n * Mint frxUSD by depositing USDC into the custodian contract.\n * Calls deposit(assetsIn, receiver) on usdcCustodianAddress.\n * assetsIn = USDC amount (6 decimals), sharesOut = frxUSD amount (18 decimals).\n */\n async mintFrxUSD(params: any) {\n const {\n dry,\n recipient,\n amountWei,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n refundTo,\n abi,\n usdcCustodianAddress,\n previewMintResult,\n } = params;\n\n this.csl(\"EVM mintFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n // Ethereum average block time ~12s, estimateTime = 12*2 + random(-5, 5) seconds\n const ETH_AVG_BLOCK_TIME = 12;\n const estimateTime = (ETH_AVG_BLOCK_TIME * 2) + Math.floor(Math.random() * 11) - 5;\n\n const result: any = {\n needApprove: false,\n approveSpender: usdcCustodianAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime,\n outputAmount: \"0\",\n };\n\n const execTime = new ExecTime({ type: `FraxZero EVM mintFrxUSD ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-900\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n execTime.breakpoint();\n // Check allowance of fromToken for usdcCustodianAddress (USDC must be approved to custodian)\n const allowanceResult = await this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: usdcCustodianAddress,\n address: refundTo,\n amountWei,\n provider,\n });\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance\");\n\n const usdcCustodian = new ethers.Contract(usdcCustodianAddress, abi, provider);\n const usdcCustodianWithSigner = new ethers.Contract(usdcCustodianAddress, abi, this.signer);\n\n execTime.breakpoint();\n let finalPreviewMintResult = previewMintResult;\n if (!finalPreviewMintResult) {\n finalPreviewMintResult = await this.previewMintFrxUSD(params);\n }\n const {\n maxUsdc,\n amountWeiBigInt,\n totalMax,\n totalAssetsOut,\n } = finalPreviewMintResult;\n execTime.log(\"previewMintFrxUSD\");\n\n result.outputAmount = numberRemoveEndZero(\n Big(totalAssetsOut.toString()).div(10 ** toToken.decimals).toFixed(toToken.decimals, 0)\n );\n\n result.sendParam = {\n contract: usdcCustodianWithSigner,\n method: \"deposit\",\n param: [\n amountWeiBigInt,\n recipient,\n ],\n };\n\n execTime.breakpoint();\n // Estimate gas fees\n const ett = await this.estimateTransaction({\n dry,\n contract: usdcCustodianWithSigner,\n method: \"deposit\",\n param: [...result.sendParam.param, { gasLimit: DEFAULT_GAS_LIMIT_FAILED }],\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = ett.estimateSourceGasUsd;\n result.sendParam.param[2] = { gasLimit: ett.estimateSourceGasLimit };\n execTime.log(\"estimateTransaction\");\n\n execTime.logTotal(\"mintFrxUSD\");\n\n return result;\n }\n\n async mintAndSendFrxUSD(params: any) {\n const {\n dry,\n recipient,\n amountWei,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n refundTo,\n abi,\n usdcCustodianAddress,\n redeemAndMintContractAddress,\n originLayerzero,\n destinationLayerzero,\n previewMintResult,\n } = params;\n\n this.csl(\"EVM mintAndSendFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n const {\n eid: dstEid,\n } = destinationLayerzero;\n\n // Ethereum average block time ~12s, estimateTime = 12*2 + random(-5, 5) seconds\n const ETH_AVG_BLOCK_TIME = 12;\n const estimateTime = (ETH_AVG_BLOCK_TIME * 2) + Math.floor(Math.random() * 11) - 5;\n\n const result: any = {\n needApprove: false,\n approveSpender: redeemAndMintContractAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime,\n outputAmount: \"0\",\n };\n\n const execTime = new ExecTime({ type: `FraxZero EVM mintAndSendFrxUSD ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-950\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n execTime.breakpoint();\n // Check allowance of fromToken for usdcCustodianAddress (USDC must be approved to custodian)\n const allowanceResult = await this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: redeemAndMintContractAddress,\n address: refundTo,\n amountWei,\n provider,\n });\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance\");\n\n const redeemAndMintContractWithSigner = new ethers.Contract(redeemAndMintContractAddress, abi, this.signer);\n\n execTime.breakpoint();\n let finalPreviewMintResult = previewMintResult;\n if (!finalPreviewMintResult) {\n finalPreviewMintResult = await this.previewMintFrxUSD(params);\n }\n const {\n totalAssetsOut,\n } = finalPreviewMintResult;\n execTime.log(\"previewMintFrxUSD\");\n this.csl(\"EVM mintAndSendFrxUSD\", \"gray-600\", \"previewMintFrxUSD totalAssetsOut: %o\", totalAssetsOut);\n\n result.outputAmount = numberRemoveEndZero(\n Big(totalAssetsOut.toString()).div(10 ** 18).toFixed(18, 0)\n );\n\n // Build sendParam for deposit(assetsIn, receiver)\n const mintAndSendParam = [\n // assetsIn\n amountWei,\n // dstEid\n dstEid,\n // receiver\n addressToBytes32(toToken.chainType, recipient)\n ];\n\n result.sendParam = {\n contract: redeemAndMintContractWithSigner,\n method: \"mintAndSend\",\n param: mintAndSendParam,\n };\n\n execTime.breakpoint();\n // Estimate gas fees\n const ett = await this.estimateTransaction({\n dry,\n contract: redeemAndMintContractWithSigner,\n method: \"mintAndSend\",\n param: [...mintAndSendParam, { gasLimit: DEFAULT_GAS_LIMIT_FAILED }],\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = ett.estimateSourceGasUsd;\n result.sendParam.param.push({ gasLimit: ett.estimateSourceGasLimit });\n execTime.log(\"estimateTransaction\");\n\n execTime.logTotal(\"mintAndSendFrxUSD\");\n\n return result;\n }\n\n async retryLayerzeroLzComponse(params: any) {\n const { Options } = await import(\"@layerzerolabs/lz-v2-utilities\");\n const {\n layerzeroData,\n history,\n } = params;\n\n const LayerZeroEndpointV2 = \"0x1a44076050125825900e736c501f859c50fe728c\";\n const LayerZeroEndpointV2ABI = [\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"_to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"_guid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint16\",\n \"name\": \"_index\",\n \"type\": \"uint16\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"_message\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"_extraData\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"lzCompose\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n }\n ];\n // lzCompose(address _from,address _to,bytes32 _guid,uint16 _index,bytes _message,bytes _extraData)\n const LayerZeroEndpointV2Contract = new ethers.Contract(LayerZeroEndpointV2, LayerZeroEndpointV2ABI, this.signer);\n\n const toToken: any = usdtTokens[history.destination_chain.blockchain as keyof typeof usdtTokens];\n const amountWei = Big(history.token_in_amount).times(10 ** (toToken.decimals || 6)).toFixed(0);\n\n const originLayerzero = USDT0_CONFIG[\"Arbitrum\"];\n const isOriginLegacy = layerzeroData.destination.lzCompose.failedTx[0].from.toLowerCase() === originLayerzero.oftLegacy?.toLowerCase();\n const lzReceiveOptionGas = isOriginLegacy ? originLayerzero.lzReceiveOptionGasLegacy : originLayerzero.lzReceiveOptionGas;\n let lzReceiveOptionValue = 0;\n\n const destATA = await getDestinationAssociatedTokenAddress({\n recipient: history.receive_address,\n toToken,\n });\n if (destATA.needCreateTokenAccount) {\n lzReceiveOptionValue = LZ_RECEIVE_VALUE[toToken.chainName] || 0;\n }\n\n const composeFrom = layerzeroData.source.tx.from;\n const composeMsg = layerzeroData.source.tx.payload.split(composeFrom.replace(/^0x/, \"\"))[1];\n const _message = buildEndpointV2LzComposePayload({\n nonce: layerzeroData.pathway.nonce,\n srcEid: layerzeroData.pathway.srcEid,\n amountLD: amountWei,\n composeFrom: composeFrom,\n composeMsg: composeMsg,\n });\n\n const contractParams = [\n layerzeroData.destination.lzCompose.failedTx[0].from,\n layerzeroData.destination.lzCompose.failedTx[0].to,\n layerzeroData.guid,\n layerzeroData.destination.lzCompose.failedTx[0].index,\n _message,\n \"0x\",\n ];\n\n const dstOFT = isOriginLegacy ? originLayerzero.oft : originLayerzero.oftLegacy;\n const sendParam: any = {\n dstEid: USDT0_CONFIG[history.destination_chain.chainName].eid,\n to: addressToBytes32(toToken.chainType, history.receive_address),\n amountLD: amountWei,\n minAmountLD: 0n,\n extraOptions: Options.newOptions()\n // .addExecutorLzReceiveOption(lzReceiveOptionGas, lzReceiveOptionValue)\n .toHex(),\n composeMsg: \"0x\",\n oftCmd: \"0x\"\n };\n\n const dstOFTContract = new ethers.Contract(dstOFT!, OFT_ABI, this.provider);\n const msgFee = await dstOFTContract.quoteSend.staticCall(sendParam, false);\n let nativeFee = msgFee[0];\n nativeFee = nativeFee * NATIVE_MSG_FEE_BUFFER / 100n;\n\n const tx = await LayerZeroEndpointV2Contract.lzCompose(\n ...contractParams,\n {\n gasLimit: originLayerzero.composeOptionGas || 800000,\n value: nativeFee,\n }\n );\n\n const txReceipt = await tx.wait();\n\n if (txReceipt.status === 1) {\n return txReceipt.hash;\n }\n\n return null;\n }\n\n async signTypedData(params: any) {\n const { fromToken, amountWei, spender } = params;\n\n this.csl(\"EVM signTypedData\", \"blue-900\", \"params: %o\", params);\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const value = amountWei;\n const tokenAddress = fromToken.contractAddress;\n const chainId = fromToken.chainId;\n // 3 days\n const deadline = Math.floor(Date.now() / 1000) + (60 * 60 * 24 * 3);\n const account = this.signer.address;\n\n const erc20 = new ethers.Contract(tokenAddress, erc20Abi, provider);\n const nonce = await erc20.nonces(account);\n const name = await erc20.name();\n\n let _version = \"1\";\n if (fromToken.symbol === \"USDC\") {\n _version = \"2\";\n }\n\n const domain = {\n name,\n version: _version,\n chainId: Number(chainId),\n verifyingContract: tokenAddress\n };\n\n const types = {\n Permit: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" }\n ]\n };\n\n const values = {\n owner: account,\n spender,\n value,\n nonce: nonce.toString(),\n deadline\n };\n\n const signature = await this.signer?.signTypedData(domain, types, values);\n\n const { v, r, s } = ethers.Signature.from(signature);\n\n // Check if signature is available\n try {\n const permitParams = [\n account,\n spender,\n value,\n deadline,\n v,\n r,\n s,\n ];\n const permitResponse = await erc20.permit.staticCall(...permitParams);\n this.csl(\"EVM signTypedData\", \"green-500\", \"permit response: %o\", permitResponse);\n } catch (error: any) {\n this.csl(\"EVM signTypedData\", \"red-500\", \"check permit signature failed: %o\", error);\n throw new Error(\"Permit signature verification failed\");\n }\n\n return {\n owner: account,\n value,\n deadline,\n nonce: Number(nonce),\n v,\n r,\n s,\n };\n }\n}\n\nexport { EVMWallet };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/evm.ts"],"names":["tx","balance","userNonce"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n getPrice,\n numberRemoveEndZero,\n SendType,\n Service,\n OpenAPI,\n Csl,\n ExecTime,\n usdtTokens,\n erc20Abi,\n} from \"@stableflow/core\";\nimport {\n addressToBytes32,\n quoteSignature,\n getHopMsgFee,\n LZ_RECEIVE_VALUE,\n USDT0_CONFIG,\n USDT0_LEGACY_MESH_TRANSFTER_FEE,\n OFT_ABI,\n FRAXZERO_MIDDLE_TOKEN_FRXUSD,\n FRAXZERO_MIDDLE_TOKEN_USDC,\n} from \"@stableflow/bridges\";\nimport {\n evmRpcFallbackProvider,\n buildEndpointV2LzComposePayload,\n NATIVE_MSG_FEE_BUFFER,\n} from \"@stableflow/utils-evm\";\nimport { getDestinationAssociatedTokenAddress } from \"@stableflow/utils-solana\";\nimport Big from \"big.js\";\nimport { ethers } from \"ethers\";\n\nconst DEFAULT_GAS_LIMIT = 100000n;\nconst DEFAULT_GAS_LIMIT_FAILED = 4000000n;\n\nexport default class EVMWallet {\n provider: any;\n signer: any;\n private csl;\n\n constructor(_provider: any, _signer?: any) {\n this.provider = _provider;\n this.signer = _signer;\n const cs = new Csl(OpenAPI.DEBUG);\n this.csl = cs.log;\n }\n\n async transfer(data: {\n originAsset: string;\n depositAddress: string;\n amount: string;\n }) {\n const { originAsset, depositAddress, amount } = data;\n\n if (originAsset === \"eth\") {\n const tx = await this.signer.sendTransaction({\n to: depositAddress,\n value: ethers.parseEther(amount)\n });\n await tx.wait();\n return tx;\n }\n\n const contract = new ethers.Contract(originAsset, erc20Abi, this.signer);\n\n const tx = await contract.transfer(depositAddress, amount);\n const result = await tx.wait();\n\n return result.hash;\n }\n\n async getBalance(token: any, account: string, options?: { isCatchError?: boolean; }) {\n const { isCatchError = false } = options || {};\n\n try {\n let provider = this.provider;\n if (token.rpcUrls) {\n provider = evmRpcFallbackProvider(token);\n }\n\n if (token.symbol === \"eth\" || token.symbol === \"ETH\" || token.symbol === \"native\") {\n const balance = await provider.getBalance(account);\n return balance.toString();\n }\n\n // Use provider instead of _signer for read-only operations\n const contract = new ethers.Contract(token.contractAddress, erc20Abi, provider);\n\n const balance = await contract.balanceOf(account);\n this.csl(\"EVM getBalance\", \"green-500\", \"Success getting %s token balance: %o\", token.contractAddress, balance);\n\n return balance.toString();\n } catch (err) {\n this.csl(\"EVM getBalance\", \"red-500\", \"Get balance failed: %o\", err);\n if (isCatchError) {\n throw err;\n }\n return \"0\";\n }\n }\n\n async balanceOf(token: any, account: string, options?: { isCatchError?: boolean; }) {\n return await this.getBalance(token, account, options);\n }\n\n /**\n * Estimate gas limit for transfer transaction\n * @param data Transfer data\n * @returns Gas limit estimate, gas price, and estimated gas cost\n */\n async estimateTransferGas(data: {\n fromToken: any;\n depositAddress: string;\n amount: string;\n account: string;\n }): Promise<{\n gasLimit: bigint;\n gasPrice: bigint;\n estimateGas: bigint;\n }> {\n const { fromToken, depositAddress, amount, account } = data;\n const originAsset = fromToken.contractAddress;\n const provider = evmRpcFallbackProvider(fromToken);\n\n let gasLimit: bigint;\n\n if (originAsset === \"eth\") {\n // Estimate gas for ETH transfer\n const tx = {\n from: account,\n to: depositAddress,\n value: ethers.parseEther(amount)\n };\n gasLimit = await provider.estimateGas(tx);\n } else {\n // Estimate gas for ERC20 token transfer\n const contract = new ethers.Contract(originAsset, erc20Abi, provider);\n gasLimit = await contract.transfer.estimateGas(depositAddress, amount);\n }\n\n // Increase gas limit by 20% to provide buffer\n gasLimit = (gasLimit * 120n) / 100n;\n\n // Get gas price\n const feeData = await provider.getFeeData();\n const gasPrice = feeData.gasPrice || 0n;\n\n // Calculate estimated gas cost: gasLimit * gasPrice\n const estimateGas = gasLimit * gasPrice;\n\n return {\n gasLimit,\n gasPrice,\n estimateGas\n };\n }\n\n getContract(params: any) {\n const {\n contractAddress,\n abi,\n } = params;\n\n return new ethers.Contract(contractAddress, abi, this.signer);\n }\n\n async allowance(params: any) {\n const {\n dry,\n contractAddress,\n spender,\n address,\n amountWei,\n provider,\n blockTag,\n strict = false,\n } = params;\n\n const runner = provider || this.provider;\n const contract = new ethers.Contract(contractAddress, erc20Abi, runner);\n\n // If querying for a quote\n // Directly return the default value\n if (dry) {\n return {\n contract,\n allowance: \"0\",\n needApprove: false,\n };\n }\n\n // get allowance\n let allowance = \"0\";\n try {\n allowance = blockTag\n ? await contract.allowance(address, spender, { blockTag })\n : await contract.allowance(address, spender);\n allowance = allowance.toString();\n } catch (error) {\n this.csl(\"EVM allowance\", \"red-500\", \"Error getting allowance: %o\", error);\n if (strict) {\n throw error;\n }\n }\n\n return {\n contract,\n allowance,\n needApprove: Big(amountWei || 0).gt(allowance || 0),\n };\n }\n\n async approve(params: any) {\n const {\n contractAddress,\n spender,\n amountWei,\n isApproveMax = false,\n isDetails = false,\n isWaitTxReceipt = true,\n } = params;\n\n const contract = new ethers.Contract(contractAddress, erc20Abi, this.signer);\n\n let _amountWei = amountWei;\n if (isApproveMax) {\n _amountWei = ethers.MaxUint256;\n }\n\n const detailResult: any = {\n success: false,\n data: {},\n message: null,\n };\n\n try {\n const tx = await contract.approve(spender, _amountWei);\n const txReceipt = await tx.wait();\n if (txReceipt.status === 1) {\n if (isDetails) {\n const confirmations = typeof txReceipt.confirmations === \"function\"\n ? await txReceipt.confirmations()\n : txReceipt.confirmations;\n detailResult.success = true;\n detailResult.data = {\n txHash: txReceipt.hash,\n blockNumber: txReceipt.blockNumber,\n confirmations,\n };\n return detailResult;\n }\n return true;\n }\n if (isDetails) {\n detailResult.message = \"Arrove failed\";\n return detailResult;\n }\n return false;\n } catch (error: any) {\n this.csl(\"EVM approve\", \"red-500\", \"Error approve: %o\", error);\n if (isDetails) {\n detailResult.message = error.message;\n }\n }\n\n if (isDetails) {\n return detailResult;\n }\n\n return false;\n }\n\n async getEstimateGas(params: any) {\n const { gasLimit, price, nativeToken, provider, gasPrice } = params;\n\n let finalGasPrice = gasPrice;\n if (!finalGasPrice) {\n const feeData = await provider.getFeeData();\n finalGasPrice = feeData.maxFeePerGas || feeData.gasPrice || BigInt(\"20000000000\"); // Default 20 gwei\n }\n\n const estimateGas = BigInt(gasLimit) * BigInt(finalGasPrice);\n const estimateGasAmount = Big(estimateGas.toString()).div(10 ** nativeToken.decimals);\n const estimateGasUsd = Big(estimateGasAmount).times(price || 1);\n\n return {\n gasPrice: finalGasPrice,\n usd: numberRemoveEndZero(Big(estimateGasUsd).toFixed(20)),\n wei: estimateGas,\n amount: numberRemoveEndZero(Big(estimateGasAmount).toFixed(nativeToken.decimals)),\n };\n }\n\n async estimateTransaction(params: any) {\n const {\n dry,\n contract,\n method,\n param,\n fromToken,\n prices,\n evmGasFees,\n defaultGasLimit = DEFAULT_GAS_LIMIT,\n refundTo,\n txRequest,\n } = params;\n\n const cs = new Csl(OpenAPI.DEBUG);\n const csl = cs.log;\n\n const provider = evmRpcFallbackProvider(fromToken);\n const nativeTokenPrice = getPrice(prices, fromToken.nativeToken.symbol);\n\n const result = {\n estimateSourceGasLimit: dry ? DEFAULT_GAS_LIMIT_FAILED : DEFAULT_GAS_LIMIT,\n estimateSourceGas: 0n,\n estimateSourceGasUsd: \"0\",\n };\n\n const setDefaultGasLimit = async () => {\n const { usd, wei } = await this.getEstimateGas({\n gasLimit: DEFAULT_GAS_LIMIT,\n price: nativeTokenPrice,\n nativeToken: fromToken.nativeToken,\n provider,\n gasPrice: dry ? evmGasFees[fromToken.chainId].gasPrice : void 0,\n });\n result.estimateSourceGas = wei;\n result.estimateSourceGasUsd = usd;\n };\n\n let finalGasLimit = defaultGasLimit;\n\n if (dry) {\n await setDefaultGasLimit();\n return result;\n }\n\n if (txRequest) {\n try {\n const gasLimit = await provider.estimateGas({\n to: txRequest.target,\n data: txRequest.calldata,\n from: refundTo || this.signer?.address,\n });\n finalGasLimit = gasLimit * 120n / 100n;\n const { usd, wei } = await this.getEstimateGas({\n gasLimit: finalGasLimit,\n price: nativeTokenPrice,\n nativeToken: fromToken.nativeToken,\n provider,\n });\n result.estimateSourceGasLimit = finalGasLimit;\n result.estimateSourceGas = wei;\n result.estimateSourceGasUsd = usd;\n } catch (error) {\n csl(\"EVM estimateTransaction\", \"red-500\", \"%s estimateGas failed: %o\", method, error);\n await setDefaultGasLimit();\n result.estimateSourceGasLimit = DEFAULT_GAS_LIMIT_FAILED / 2n;\n }\n\n return result;\n }\n\n try {\n const gasLimit = await contract[method].estimateGas(...param);\n finalGasLimit = gasLimit * 120n / 100n;\n const { usd, wei } = await this.getEstimateGas({\n gasLimit: finalGasLimit,\n price: nativeTokenPrice,\n nativeToken: fromToken.nativeToken,\n provider,\n });\n result.estimateSourceGasLimit = finalGasLimit;\n result.estimateSourceGas = wei;\n result.estimateSourceGasUsd = usd;\n } catch (error) {\n csl(\"EVM estimateTransaction\", \"red-500\", \"%s estimateGas failed: %o\", method, error);\n await setDefaultGasLimit();\n result.estimateSourceGasLimit = DEFAULT_GAS_LIMIT_FAILED / 2n;\n }\n\n return result;\n }\n\n async quoteOFT(params: any) {\n const { Options } = await import(\"@layerzerolabs/lz-v2-utilities\");\n const {\n dry,\n abi,\n dstEid,\n recipient,\n amountWei,\n slippageTolerance,\n payInLzToken,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n originLayerzeroAddress,\n destinationLayerzeroAddress,\n excludeFees,\n refundTo,\n multiHopComposer,\n isMultiHopComposer,\n isOriginLegacy,\n isDestinationLegacy,\n originLayerzero,\n destinationLayerzero,\n } = params;\n\n const result: any = {\n needApprove: false,\n approveSpender: originLayerzeroAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n originLayerzeroAddress: originLayerzeroAddress,\n destinationLayerzeroAddress: destinationLayerzeroAddress,\n },\n fees: {},\n totalFeesUsd: \"0\",\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: \"0\",\n estimateTime: 0, // seconds - dynamically calculated using LayerZero formula\n outputAmount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).toFixed(params.fromToken.decimals, 0)),\n };\n\n const execTime = new ExecTime({ type: `Usdt0 EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-100\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const oftContract = new ethers.Contract(originLayerzeroAddress, abi, this.signer);\n const oftContractRead = new ethers.Contract(originLayerzeroAddress, abi, provider);\n\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"params: %o\", params);\n execTime.breakpoint();\n\n // 1. check if need approve\n const approvalRequired = isOriginLegacy ? originLayerzero.oftLegacyApprovalRequired : originLayerzero.oftApprovalRequired;\n this.csl(\"EVM quoteOFT\", \"blue-900\", \"approvalRequired: %o\", approvalRequired);\n execTime.log(\"approvalRequired\");\n\n const lzReceiveOptionGas = isDestinationLegacy ? destinationLayerzero.lzReceiveOptionGasLegacy : (destinationLayerzero.lzReceiveOptionGas || 200000);\n let lzReceiveOptionValue = 0;\n\n execTime.breakpoint();\n const destATA = await getDestinationAssociatedTokenAddress({\n recipient,\n toToken,\n });\n execTime.log(\"getDestinationAssociatedTokenAddress\");\n if (destATA.needCreateTokenAccount) {\n lzReceiveOptionValue = LZ_RECEIVE_VALUE[toToken.chainName] || 0;\n }\n\n let unMultiHopExtraOptions = Options.newOptions().toHex();\n if (!isMultiHopComposer && lzReceiveOptionValue) {\n unMultiHopExtraOptions = Options.newOptions().addExecutorLzReceiveOption(lzReceiveOptionGas, lzReceiveOptionValue).toHex();\n }\n\n // 2. quote send\n const sendParam: any = {\n dstEid: dstEid,\n to: addressToBytes32(toToken.chainType, recipient),\n amountLD: amountWei,\n minAmountLD: 0n,\n extraOptions: unMultiHopExtraOptions,\n composeMsg: \"0x\",\n oftCmd: \"0x\"\n };\n\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"isMultiHopComposer: %o\", isMultiHopComposer);\n if (isMultiHopComposer) {\n // multiHopComposer: Arbitrum legacy mesh MultiHopComposer, eid = 30110\n sendParam.dstEid = multiHopComposer.eid;\n sendParam.to = addressToBytes32(\"evm\", multiHopComposer.oftMultiHopComposer);\n\n let multiHopExtraOptions = Options.newOptions().toHex();\n if (lzReceiveOptionValue) {\n multiHopExtraOptions = Options.newOptions().addExecutorLzReceiveOption(lzReceiveOptionGas, lzReceiveOptionValue).toHex();\n }\n\n const composeMsgSendParam = {\n dstEid,\n to: addressToBytes32(toToken.chainType, recipient),\n amountLD: sendParam.amountLD,\n minAmountLD: sendParam.minAmountLD,\n extraOptions: multiHopExtraOptions,\n composeMsg: \"0x\",\n oftCmd: \"0x\",\n };\n execTime.breakpoint();\n const hopMsgFee = await getHopMsgFee({\n sendParam: composeMsgSendParam,\n toToken,\n });\n execTime.log(\"getHopMsgFee\");\n\n sendParam.extraOptions = Options.newOptions()\n .addExecutorComposeOption(0, originLayerzero.composeOptionGas || 800000, hopMsgFee)\n .toHex();\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\n sendParam.composeMsg = abiCoder.encode(\n [\"tuple(uint32 dstEid, bytes32 to, uint256 amountLD, uint256 minAmountLD, bytes extraOptions, bytes composeMsg, bytes oftCmd)\"],\n [Object.values(composeMsgSendParam)]\n );\n }\n\n // 0.03% fee for Legacy Mesh transfers only (native USDT0 transfers are free)\n if (isOriginLegacy || isDestinationLegacy) {\n result.fees.legacyMeshFeeUsd = numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).times(USDT0_LEGACY_MESH_TRANSFTER_FEE).toFixed(params.fromToken.decimals));\n result.outputAmount = numberRemoveEndZero(Big(Big(amountWei || 0).div(10 ** params.fromToken.decimals)).minus(result.fees.legacyMeshFeeUsd || 0).toFixed(params.fromToken.decimals, 0));\n }\n\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"sendParam: %o\", sendParam);\n if (!dry) {\n execTime.breakpoint();\n const oftData = await oftContractRead.quoteOFT.staticCall(sendParam);\n const [, , oftReceipt] = oftData;\n // The slippage is calculated based on the user-defined value and the user-input amount\n sendParam.minAmountLD = Big(amountWei).times(Big(1).minus(Big(slippageTolerance || 0).div(100))).toFixed(0);\n // The actual received amount is based on the contract return value\n result.outputAmount = numberRemoveEndZero(numberRemoveEndZero(Big(oftReceipt[1].toString()).div(10 ** params.toToken.decimals).toFixed(params.toToken.decimals, 0)));\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"oftData: %o\", oftData);\n execTime.log(\"quoteOFT.staticCall\");\n }\n\n // Check if the output amount exceeds the slippage tolerance\n // If it exceeds, return an error message\n this.csl(\"EVMWallet quoteOFT\", \"red-600\", \"result.outputAmount: %o\", result.outputAmount);\n this.csl(\"EVMWallet quoteOFT\", \"red-600\", \"slippageTolerance: %o\", slippageTolerance + \"%\");\n this.csl(\"EVMWallet quoteOFT\", \"red-600\", \"Minimum received amount: %o\", Big(amountWei).div(10 ** fromToken.decimals).times(Big(1).minus(Big(slippageTolerance || 0).div(100))).toFixed(6, 0));\n if (Big(result.outputAmount).lt(Big(amountWei).div(10 ** fromToken.decimals).times(Big(1).minus(Big(slippageTolerance || 0).div(100))))) {\n result.errMsg = \"Slippage limit exceeded\";\n return result;\n }\n\n execTime.breakpoint();\n const mergedCall = [\n oftContractRead.quoteSend.staticCall(sendParam, payInLzToken),\n ];\n if (approvalRequired) {\n mergedCall.push(\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: originLayerzeroAddress,\n address: refundTo,\n amountWei,\n provider,\n })\n );\n }\n const [msgFee, allowanceResult] = await Promise.all(mergedCall);\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"quoteSend: %o\", msgFee);\n if (approvalRequired) {\n result.needApprove = allowanceResult?.needApprove;\n }\n execTime.log(\"quoteSend.staticCall and allowance\");\n\n // const msgFee = await oftContractRead.quoteSend.staticCall(sendParam, payInLzToken);\n let nativeMsgFee = msgFee[0];\n const lzMsgFee = msgFee[1];\n result.totalEstimateSourceGas = nativeMsgFee;\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"msgFee: %o, nativeMsgFee: %o\", msgFee, nativeMsgFee);\n // add 5% buffer\n nativeMsgFee = nativeMsgFee * NATIVE_MSG_FEE_BUFFER / 100n;\n // this.csl(\"EVM quoteOFT\", \"blue-900\", \"msgFee after buffer: %o\", nativeMsgFee);\n\n // csl(\"EVM quoteOFT\", \"blue-900\", \"Params: %o\", result.sendParam);\n\n // 3. estimate gas\n const nativeFeeUsd = Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).times(getPrice(prices, fromToken.nativeToken.symbol));\n result.fees.nativeFee = numberRemoveEndZero(Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).toFixed(fromToken.nativeToken.decimals));\n result.fees.nativeFeeUsd = numberRemoveEndZero(Big(nativeFeeUsd).toFixed(20));\n result.fees.lzTokenFeeUsd = numberRemoveEndZero(Big(lzMsgFee?.toString() || 0).div(10 ** fromToken.decimals).toFixed(20));\n\n const finalSendParam = [\n sendParam,\n {\n nativeFee: nativeMsgFee,\n lzTokenFee: lzMsgFee,\n },\n refundTo,\n { value: nativeMsgFee }\n ];\n\n execTime.breakpoint();\n const ett = await this.estimateTransaction({\n dry,\n contract: oftContract,\n method: \"send\",\n param: finalSendParam,\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas += ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n finalSendParam[3].gasLimit = ett.estimateSourceGasLimit;\n execTime.log(\"send.estimateGas\");\n\n result.sendParam = {\n contract: oftContract,\n method: \"send\",\n param: finalSendParam,\n };\n\n // calculate total fees\n for (const feeKey in result.fees) {\n if (excludeFees.includes(feeKey) || !/Usd$/.test(feeKey)) {\n continue;\n }\n result.totalFeesUsd = Big(result.totalFeesUsd || 0).plus(result.fees[feeKey] || 0);\n }\n result.totalFeesUsd = numberRemoveEndZero(Big(result.totalFeesUsd).toFixed(20));\n\n execTime.logTotal(\"quoteOFT\");\n\n return result;\n }\n\n async sendTransaction(params: any) {\n const {\n method,\n contract,\n param,\n } = params;\n\n // Add gas fee buffer to prevent \"max fee per gas less than block base fee\" error.\n // Between quote and send, the baseFee may increase, causing the estimated\n // maxFeePerGas to be lower than the current baseFee.\n const overridesIndex = param.length - 1;\n const overrides = param[overridesIndex] && typeof param[overridesIndex] === \"object\" && !Array.isArray(param[overridesIndex])\n ? { ...param[overridesIndex] }\n : {};\n\n if (!overrides.maxFeePerGas) {\n try {\n const feeData = await this.provider.getFeeData();\n if (feeData.maxFeePerGas) {\n // Add 20% buffer to maxFeePerGas to account for baseFee fluctuations\n overrides.maxFeePerGas = (feeData.maxFeePerGas * 120n) / 100n;\n }\n if (feeData.maxPriorityFeePerGas && !overrides.maxPriorityFeePerGas) {\n overrides.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n }\n } catch (error) {\n this.csl(\"EVM sendTransaction\", \"red-500\", \"Failed to get fee data for gas buffer: %o\", error);\n }\n }\n\n const finalParam = [...param];\n if (param[overridesIndex] && typeof param[overridesIndex] === \"object\" && !Array.isArray(param[overridesIndex])) {\n finalParam[overridesIndex] = overrides;\n } else {\n finalParam.push(overrides);\n }\n\n try {\n const tx = await contract[method](...finalParam);\n\n return tx.hash;\n } catch (error: any) {\n this.csl(\"EVM sendTransaction\", \"red-500\", \"Error sending transaction: %o, message: %o\", error, error.message);\n let _finalErrorMessage = `Transaction failed: ${error.message}`;\n if (error?.message?.includes(\"user rejected action\")) {\n _finalErrorMessage = error.message;\n }\n throw new Error(_finalErrorMessage);\n }\n\n // const DefaultErrorMsg = \"Transaction failed\";\n // try {\n // const txReceipt = await tx.wait();\n\n // if (txReceipt.status !== 1) {\n // throw new Error(DefaultErrorMsg);\n // }\n\n // return txReceipt.hash;\n // } catch (error: any) {\n // return tx.hash;\n // }\n }\n\n /**\n * Unified quote method that routes to specific quote methods based on type\n * @param type Service type from Service\n * @param params Parameters for the quote\n */\n async quote(type: Service, params: any) {\n switch (type) {\n case Service.CCTP:\n return await this.quoteCCTP(params);\n case Service.Usdt0:\n return await this.quoteOFT(params);\n case Service.OneClick:\n return await this.quoteOneClickProxy(params);\n case Service.Native:\n return await this.quoteNative(params);\n case Service.FraxZero:\n return await this.quoteFraxZero(params);\n default:\n throw new Error(`Unsupported quote type: ${type}`);\n }\n }\n\n /**\n * Unified send method that routes to specific send methods based on type\n * @param type Send type from SendType enum\n * @param params Parameters for the send transaction\n */\n async send(type: SendType, params: any) {\n switch (type) {\n case SendType.SEND:\n return await this.sendTransaction(params);\n case SendType.TRANSFER:\n return await this.transfer(params);\n default:\n throw new Error(`Unsupported send type: ${type}`);\n }\n }\n\n async quoteCCTP(params: any) {\n const {\n dry,\n proxyAddress,\n abi,\n refundTo,\n recipient,\n amountWei,\n // slippageTolerance,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n excludeFees,\n destinationDomain,\n sourceDomain,\n } = params;\n\n const result: any = {\n needApprove: false,\n approveSpender: proxyAddress,\n sendParam: void 0,\n quoteParam: {\n sourceDomain,\n destinationDomain,\n proxyAddress,\n ...params,\n },\n fees: {},\n totalFeesUsd: void 0,\n estimateSourceGas: void 0,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: void 0,\n estimateTime: Math.floor(Math.random() * 8) + 3,\n outputAmount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals, 0)),\n };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const execTime = new ExecTime({ type: `CCTP EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-200\", isDebug: OpenAPI.DEBUG });\n\n const proxyContract = new ethers.Contract(proxyAddress, abi, this.signer);\n const proxyContractRead = new ethers.Contract(proxyAddress, abi, provider);\n\n let realRecipient = recipient;\n execTime.breakpoint();\n // 1. get user nonce\n const getUsrNonce = async () => {\n let userNonce = 0n;\n try {\n userNonce = await proxyContract.userNonces(refundTo);\n } catch (error) {\n }\n return userNonce;\n };\n const mergedCalls = [\n getDestinationAssociatedTokenAddress({\n recipient,\n toToken,\n }),\n getUsrNonce(),\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n address: refundTo,\n spender: proxyAddress,\n amountWei,\n provider,\n })\n ];\n const [destATA, userNonce, allowance]: any = await Promise.all(mergedCalls);\n execTime.log(\"getDestinationATA & getUsrNonce & get allowance\", \"destATA: %o, userNonce: %o, allowance: %o\", destATA, userNonce, allowance);\n result.needCreateTokenAccount = destATA.needCreateTokenAccount;\n if (destATA.associatedTokenAddress) {\n realRecipient = destATA.associatedTokenAddress;\n }\n result.needApprove = allowance.needApprove;\n\n execTime.breakpoint();\n // 2. quote signature\n const signatureRes = await quoteSignature({\n address: refundTo,\n amount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals, 0)),\n destination_domain_id: destinationDomain,\n receipt_address: realRecipient,\n source_domain_id: sourceDomain,\n user_nonce: Number(userNonce),\n });\n const {\n bridge_fee,\n finality_threshold,\n max_fee,\n mint_fee,\n receipt_amount,\n signature,\n destination_caller,\n } = signatureRes;\n execTime.log(\"quoteSignature\");\n\n result.fees.estimateMintGasUsd = numberRemoveEndZero(Big(mint_fee || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals));\n result.fees.bridgeFeeUsd = numberRemoveEndZero(Big(bridge_fee || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals));\n const chargedAmount = BigInt(amountWei) - BigInt(mint_fee);\n result.outputAmount = numberRemoveEndZero(Big(receipt_amount || 0).div(10 ** fromToken.decimals).toFixed(fromToken.decimals, 0));\n\n const depositParam = [\n // originalAmount\n amountWei,\n // chargedAmount = originalAmount - gas fee\n chargedAmount,\n // destinationDomain\n destinationDomain,\n // mintRecipient\n addressToBytes32(toToken.chainType, realRecipient),\n // burnToken\n fromToken.contractAddress,\n // destinationCaller\n destination_caller ? addressToBytes32(toToken.chainType, destination_caller) : \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n // maxFee\n max_fee,\n // minFinalityThreshold\n finality_threshold,\n // signature\n signature,\n ];\n\n execTime.breakpoint();\n // 3. estimate deposit gas\n const ett = await this.estimateTransaction({\n dry,\n contract: proxyContract,\n method: \"depositWithFee\",\n param: depositParam,\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n depositParam.push({ gasLimit: ett.estimateSourceGasLimit });\n execTime.log(\"estimateTransaction\");\n\n result.sendParam = {\n method: \"depositWithFee\",\n contract: proxyContract,\n param: depositParam,\n };\n\n // 5. calculate total fees\n for (const feeKey in result.fees) {\n if (excludeFees.includes(feeKey) || !/Usd$/.test(feeKey)) {\n continue;\n }\n result.totalFeesUsd = Big(result.totalFeesUsd || 0).plus(result.fees[feeKey] || 0);\n }\n result.totalFeesUsd = numberRemoveEndZero(Big(result.totalFeesUsd).toFixed(20));\n\n execTime.logTotal(\"quoteCCTP\");\n\n return result;\n }\n\n async quoteOneClickProxy(params: any) {\n const {\n dry,\n proxyAddress,\n abi,\n fromToken,\n refundTo,\n depositAddress,\n amountWei,\n prices,\n evmGasFees,\n } = params;\n\n const execTime = new ExecTime({ type: `OneClick EVM ${fromToken.chainName}`, logStyle: \"stone-300\", isDebug: OpenAPI.DEBUG });\n\n const result: any = { fees: {} };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const proxyContract = new ethers.Contract(proxyAddress, abi, this.signer);\n const proxyParam: any = [\n // tokenAddress\n fromToken.contractAddress,\n // recipient\n depositAddress,\n // amount\n amountWei,\n ];\n\n execTime.breakpoint();\n const mergedCalls = [\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n address: refundTo,\n spender: proxyAddress,\n amountWei: amountWei,\n provider,\n }),\n this.estimateTransaction({\n dry,\n contract: proxyContract,\n method: \"proxyTransfer\",\n param: proxyParam,\n fromToken,\n prices,\n evmGasFees,\n })\n ];\n const [allowance, ett]: any = await Promise.all(mergedCalls);\n result.needApprove = allowance.needApprove;\n result.approveSpender = proxyAddress;\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n proxyParam.push({ gasLimit: ett.estimateSourceGasLimit });\n execTime.log(\"allowance & estimateTransaction\");\n\n result.sendParam = {\n method: \"proxyTransfer\",\n contract: proxyContract,\n param: proxyParam,\n };\n\n execTime.logTotal(\"quoteOneClickPorxy\");\n\n return result;\n }\n\n async quoteNative(params: any) {\n const {\n quoteResponse,\n bridgeRouterAddress,\n ...restParams\n } = params;\n const {\n dry,\n amountWei,\n refundTo,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n } = restParams;\n\n const result: any = {\n ...quoteResponse,\n fees: {},\n needApprove: false,\n approveSpender: bridgeRouterAddress,\n quoteParam: {\n ...restParams,\n },\n sendParam: {\n txRequest: quoteResponse.txRequest,\n },\n totalFeesUsd: void 0,\n estimateSourceGas: void 0,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: void 0,\n estimateTime: quoteResponse.priority === \"fast\" ? Math.floor(Math.random() * 10) + 50 : Math.floor(Math.random() * 60) + 300,\n outputAmount: 0,\n };\n\n const execTime = new ExecTime({ type: `Native EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-400\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const estimateNativeGas = async () => {\n if (dry) {\n const ett = await this.estimateTransaction({\n dry,\n fromToken,\n prices,\n evmGasFees,\n });\n\n result.outputAmount = quoteResponse.buyerTokenAmount + \"\";\n result.fees = {\n estimateGasUsd: ett.estimateSourceGasUsd,\n widgetFeeUsd: quoteResponse.widgetFeeUsd,\n liquidityProviderFeeUsd: quoteResponse.liquidityProviderFeeUsd,\n };\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = numberRemoveEndZero(Big(quoteResponse.totalFeeUsd).toFixed(20));\n }\n else {\n const ett = await this.estimateTransaction({\n dry,\n fromToken,\n prices,\n evmGasFees,\n txRequest: quoteResponse.txRequest,\n refundTo,\n });\n\n result.outputAmount = Big(quoteResponse.amountOut || 0).div(10 ** (toToken.decimals || 6)).toFixed(toToken.decimals || 6, 0);\n result.fees = {\n estimateGasUsd: ett.estimateSourceGasUsd,\n // maybe 100 = 1%\n widgetFeeUsd: numberRemoveEndZero(Big(amountWei || 0).div(10 ** (fromToken.decimals || 6)).times(quoteResponse.widgetFee.feeRate || 0).toFixed(20, 0)),\n // not return by api\n liquidityProviderFeeUsd: \"0\",\n };\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = numberRemoveEndZero(Big(quoteResponse.amountOutBeforeFee || 0).minus(quoteResponse.amountOut).div(10 ** (fromToken.decimals || 6)).toFixed(20, 0));\n result.txRequest.gasLimit = ett.estimateSourceGasLimit;\n }\n };\n\n execTime.breakpoint();\n const mergedCalls = [\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: bridgeRouterAddress,\n address: refundTo,\n amountWei,\n }),\n estimateNativeGas()\n ];\n const [allowanceResult]: any = await Promise.all(mergedCalls);\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance & estimateNativeGas\");\n\n execTime.logTotal(\"quoteNative\");\n\n return result;\n }\n\n async quoteFraxZero(params: any) {\n const {\n dry,\n abi,\n recipient,\n amountWei,\n slippageTolerance,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n excludeFees,\n refundTo,\n originLayerzero,\n destinationLayerzero,\n } = params;\n\n const {\n eid: srcEid,\n remoteHop,\n lockbox,\n } = originLayerzero;\n const {\n eid: dstEid,\n } = destinationLayerzero;\n\n const isFromEthereum = fromToken.chainId === 1;\n\n const result: any = {\n needApprove: false,\n approveSpender: remoteHop,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime: 0,\n outputAmount: numberRemoveEndZero(Big(amountWei || 0).div(10 ** params.fromToken.decimals).toFixed(params.fromToken.decimals, 0)),\n };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const execTime = new ExecTime({ type: `FraxZero EVM ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-500\", isDebug: OpenAPI.DEBUG });\n\n const remoteHopContract = new ethers.Contract(remoteHop, abi, this.signer);\n const remoteHopContractRead = new ethers.Contract(remoteHop, abi, provider);\n\n // 1. check if need approve\n // 2. get message fee\n const sendParams = [\n // _oft\n isFromEthereum ? lockbox : fromToken.contractAddress,\n // _dstEid\n dstEid,\n // _to\n addressToBytes32(toToken.chainType, recipient),\n // _amountLD\n amountWei\n ];\n execTime.breakpoint();\n const mergedCalls = [\n this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: remoteHop,\n address: refundTo,\n amountWei,\n provider,\n }),\n remoteHopContractRead.quote.staticCall(...sendParams)\n ];\n const [allowanceResult, msgFee]: any = await Promise.all(mergedCalls);\n execTime.log(\"allowance & quote.staticCall\");\n\n result.needApprove = allowanceResult.needApprove;\n\n let nativeMsgFee = msgFee[0];\n this.csl(\"EVM quoteFraxZero\", \"blue-700\", \"nativeMsgFee: %o\", nativeMsgFee);\n\n // add 5% buffer\n nativeMsgFee = nativeMsgFee * NATIVE_MSG_FEE_BUFFER / 100n;\n this.csl(\"EVM quoteFraxZero\", \"blue-700\", \"nativeMsgFee after buffer: %o\", nativeMsgFee);\n result.totalEstimateSourceGas = nativeMsgFee;\n\n const nativeFeeUsd = Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).times(getPrice(prices, fromToken.nativeToken.symbol));\n result.fees.nativeFee = numberRemoveEndZero(Big(nativeMsgFee?.toString() || 0).div(10 ** fromToken.nativeToken.decimals).toFixed(fromToken.nativeToken.decimals));\n result.fees.nativeFeeUsd = numberRemoveEndZero(Big(nativeFeeUsd).toFixed(20));\n result.fees.lzTokenFeeUsd = numberRemoveEndZero(Big(msgFee[1]?.toString() || 0).div(10 ** fromToken.decimals).toFixed(20));\n\n this.csl(\"EVM quoteFraxZero\", \"blue-700\", \"msgFee: %o\", msgFee);\n\n execTime.breakpoint();\n // 3. estimate send gas\n const finalSendParam = [...sendParams, { value: nativeMsgFee }];\n const ett = await this.estimateTransaction({\n dry,\n contract: remoteHopContract,\n method: \"sendOFT\",\n param: finalSendParam,\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas += ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n finalSendParam[finalSendParam.length - 1].gasLimit = ett.estimateSourceGasLimit;\n execTime.log(\"sendOFT.estimateTransaction\");\n\n // 4. generate transaction\n result.sendParam = {\n contract: remoteHopContract,\n method: \"sendOFT\",\n param: finalSendParam,\n };\n\n // 5. calculate total fees\n for (const feeKey in result.fees) {\n if (excludeFees.includes(feeKey) || !/Usd$/.test(feeKey)) {\n continue;\n }\n result.totalFeesUsd = Big(result.totalFeesUsd || 0).plus(result.fees[feeKey] || 0);\n }\n result.totalFeesUsd = numberRemoveEndZero(Big(result.totalFeesUsd).toFixed(20));\n\n execTime.logTotal(\"quoteFraxZero\");\n\n return result;\n }\n\n async preivewRedeemFrxUSD(params: any) {\n const {\n dry,\n amountWei,\n fromToken,\n abi,\n usdcCustodianAddress,\n rwaCustodianAddress,\n redemptionAddress,\n } = params;\n\n // csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n if (dry) {\n return {\n maxUsdc: 0n,\n maxRwa: 0n,\n amountWeiBigInt: 0n,\n // The token obtained from redeem is Ethereum USDC\n totalAssetsOut: BigInt(Big(amountWei || 0).div(10 ** fromToken.decimals).times(10 ** FRAXZERO_MIDDLE_TOKEN_USDC.decimals).toFixed(0, 0)),\n isInsufficientLiquidity: false,\n };\n }\n\n const execTime = new ExecTime({ type: `FraxZero EVM preivewRedeemFrxUSD ${fromToken.chainName}`, logStyle: \"stone-600\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n // Get maxSharesRedeemable (index 3) from mdwrComboView for both custodians\n const usdcCustodian = new ethers.Contract(usdcCustodianAddress, abi, provider);\n const rwaCustodian = new ethers.Contract(rwaCustodianAddress, abi, provider);\n const redemption = new ethers.Contract(redemptionAddress, abi, provider);\n\n execTime.breakpoint();\n const [usdcView, redemptionView] = await Promise.all([\n usdcCustodian.mdwrComboView.staticCall(),\n redemption.maxUstbRedemptionAmount.staticCall(),\n ]);\n execTime.log(\"usdcCustodian & redemption\");\n\n // This value is the frxUSD wei amount\n const maxUsdc = usdcView[3]; // maxSharesRedeemable\n const superstateTokenAmount = redemptionView[0]; // superstateTokenAmount\n\n // This value represents the wei amount of USDC\n const [maxRwa] = await redemption.calculateUsdcOut.staticCall(superstateTokenAmount);\n\n const amountWeiBigInt = BigInt(amountWei || 0);\n\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"usdcCustodian maxSharesRedeemable(frxUSD wei amount): %o\", maxUsdc);\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"rwaCustodian maxSharesRedeemable(USDC wei amount): %o\", maxRwa);\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"amountWei: %o\", amountWeiBigInt);\n\n let totalAssetsOut = 0n;\n let isInsufficientLiquidity = false;\n\n if (amountWeiBigInt <= maxUsdc) {\n // USDC path only\n execTime.breakpoint();\n const assetsOut = await usdcCustodian.previewRedeem.staticCall(amountWeiBigInt);\n execTime.log(\"usdcCustodian.previewRedeem (USDC only)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC path only, usdcCustodian previewRedeem input: %o, value: %o\", amountWeiBigInt, assetsOut);\n totalAssetsOut = assetsOut;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC path only, totalAssetsOut: %o\", totalAssetsOut);\n } else {\n // USDC first (maxUsdc), then RWA for remainder\n if (maxUsdc > 0n) {\n execTime.breakpoint();\n const usdcAssetsOut = await usdcCustodian.previewRedeem.staticCall(maxUsdc);\n execTime.log(\"usdcCustodian.previewRedeem (mixed)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), usdcCustodian previewRedeem input: %o, value: %o\", maxUsdc, usdcAssetsOut);\n totalAssetsOut += usdcAssetsOut;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), totalAssetsOut: %o\", totalAssetsOut);\n }\n const rwaAmount = amountWeiBigInt - maxUsdc;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"RWA for remainder, rwaAmount: %o\", rwaAmount);\n if (rwaAmount > 0n) {\n execTime.breakpoint();\n const superstateTokenInAmount = await rwaCustodian.previewRedeem.staticCall(rwaAmount);\n execTime.log(\"rwaCustodian.previewRedeem (mixed)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), rwaCustodian previewRedeem input: %o, superstateTokenInAmount: %o\", rwaAmount, superstateTokenInAmount);\n execTime.breakpoint();\n const [rwaAssetsOut] = await redemption.calculateUsdcOut.staticCall(superstateTokenInAmount);\n execTime.log(\"redemption.calculateUsdcOut (mixed)\");\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"USDC first (maxUsdc), rwaCustodian previewRedeem input: %o, value: %o\", rwaAmount, rwaAssetsOut);\n totalAssetsOut += rwaAssetsOut;\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"RWA for remainder, totalAssetsOut: %o\", totalAssetsOut);\n\n if (rwaAssetsOut > maxRwa) {\n isInsufficientLiquidity = true;\n }\n }\n }\n\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"final totalAssetsOut: %o\", totalAssetsOut);\n this.csl(\"EVM preivewRedeemFrxUSD\", \"blue-700\", \"final insufficient liquidity: %o\", isInsufficientLiquidity);\n\n execTime.logTotal(\"preivewRedeemFrxUSD\");\n\n return {\n maxUsdc,\n maxRwa,\n amountWeiBigInt,\n totalAssetsOut,\n isInsufficientLiquidity,\n };\n }\n\n async previewMintFrxUSD(params: any) {\n const {\n dry,\n amountWei,\n fromToken,\n abi,\n usdcCustodianAddress,\n } = params;\n\n this.csl(\"EVM previewMintFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n if (dry) {\n return {\n maxUsdc: 0n,\n amountWeiBigInt: 0n,\n totalMax: 0n,\n // Minting means converting Ethereum USDC into Ethereum frxUSD\n totalAssetsOut: BigInt(Big(amountWei || 0).div(10 ** fromToken.decimals).times(10 ** FRAXZERO_MIDDLE_TOKEN_FRXUSD.decimals).toFixed(0, 0)),\n };\n }\n\n const execTime = new ExecTime({ type: `FraxZero EVM previewMintFrxUSD ${fromToken.chainName}`, logStyle: \"stone-700\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n // Get maxAssetsDepositable (index 0) from mdwrComboView for both custodians\n const usdcCustodian = new ethers.Contract(usdcCustodianAddress, abi, provider);\n\n execTime.breakpoint();\n const usdcView = await usdcCustodian.mdwrComboView.staticCall();\n execTime.log(\"usdcCustodian.mdwrComboView\");\n\n const maxUsdc = usdcView[0]; // maxAssetsDepositable\n\n const amountWeiBigInt = BigInt(amountWei || 0);\n const totalMax = maxUsdc;\n\n execTime.breakpoint();\n const totalAssetsOut = await usdcCustodian.previewDeposit.staticCall(amountWeiBigInt);\n execTime.log(\"usdcCustodian.previewDeposit\");\n\n execTime.logTotal(\"previewMintFrxUSD\");\n\n return {\n maxUsdc,\n amountWeiBigInt,\n totalMax,\n totalAssetsOut,\n };\n }\n\n /**\n * Redeem frxUSD to USDC via USDC and/or RWA custodian contracts.\n * Uses mdwrComboView to get max redeemable liquidity and splits redemption across USDC/RWA paths.\n * Uses previewRedeem to get accurate output amount (USDC).\n */\n async redeemFrxUSD(params: any) {\n const {\n dry,\n recipient,\n amountWei,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n refundTo,\n abi,\n usdcCustodianAddress,\n rwaCustodianAddress,\n redeemAndMintContractAddress,\n preivewRedeemResult,\n } = params;\n\n this.csl(\"EVM redeemFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n // Ethereum average block time ~12s, random ±5 seconds\n const ETH_AVG_BLOCK_TIME = 12;\n const estimateTime = (ETH_AVG_BLOCK_TIME * 2) + Math.floor(Math.random() * 11) - 5;\n\n const result: any = {\n needApprove: false,\n approveSpender: redeemAndMintContractAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime,\n outputAmount: \"0\",\n };\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const execTime = new ExecTime({ type: `FraxZero EVM redeemFrxUSD ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-800\", isDebug: OpenAPI.DEBUG });\n\n const redeemContractRead = new ethers.Contract(redeemAndMintContractAddress, abi, provider);\n const redeemContract = new ethers.Contract(redeemAndMintContractAddress, abi, this.signer);\n\n execTime.breakpoint();\n let finalPreivewRedeemResult = preivewRedeemResult;\n if (!finalPreivewRedeemResult) {\n finalPreivewRedeemResult = await this.preivewRedeemFrxUSD(params);\n }\n const {\n isInsufficientLiquidity,\n totalAssetsOut,\n } = finalPreivewRedeemResult;\n execTime.log(\"preivewRedeemFrxUSD\");\n\n if (isInsufficientLiquidity) {\n throw new Error(\"Insufficient liquidity\");\n }\n\n // outputAmount = USDC amount (6 decimals), human-readable\n result.outputAmount = numberRemoveEndZero(\n Big(totalAssetsOut.toString()).div(10 ** toToken.decimals).toFixed(toToken.decimals, 0)\n );\n\n execTime.breakpoint();\n // check allowance of fromToken for redeemAndMintContractAddress\n const allowanceResult = await this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: redeemAndMintContractAddress,\n address: refundTo,\n amountWei,\n provider,\n });\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance\");\n\n result.sendParam = {\n contract: redeemContract,\n method: \"redeemToUsdcAndTransfer\",\n param: [\n amountWei,\n recipient,\n ],\n };\n\n execTime.breakpoint();\n // Estimate gas for multicall aggregate and compute fees\n const ett = await this.estimateTransaction({\n dry,\n contract: redeemContract,\n method: result.sendParam.method,\n param: [...result.sendParam.param, { gasLimit: DEFAULT_GAS_LIMIT_FAILED }],\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = ett.estimateSourceGasUsd;\n result.sendParam.param[2] = { gasLimit: ett.estimateSourceGasLimit };\n execTime.log(\"estimateTransaction\");\n\n execTime.logTotal(\"redeemFrxUSD\");\n\n return result;\n }\n\n /**\n * Mint frxUSD by depositing USDC into the custodian contract.\n * Calls deposit(assetsIn, receiver) on usdcCustodianAddress.\n * assetsIn = USDC amount (6 decimals), sharesOut = frxUSD amount (18 decimals).\n */\n async mintFrxUSD(params: any) {\n const {\n dry,\n recipient,\n amountWei,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n refundTo,\n abi,\n usdcCustodianAddress,\n previewMintResult,\n } = params;\n\n this.csl(\"EVM mintFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n // Ethereum average block time ~12s, estimateTime = 12*2 + random(-5, 5) seconds\n const ETH_AVG_BLOCK_TIME = 12;\n const estimateTime = (ETH_AVG_BLOCK_TIME * 2) + Math.floor(Math.random() * 11) - 5;\n\n const result: any = {\n needApprove: false,\n approveSpender: usdcCustodianAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime,\n outputAmount: \"0\",\n };\n\n const execTime = new ExecTime({ type: `FraxZero EVM mintFrxUSD ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-900\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n execTime.breakpoint();\n // Check allowance of fromToken for usdcCustodianAddress (USDC must be approved to custodian)\n const allowanceResult = await this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: usdcCustodianAddress,\n address: refundTo,\n amountWei,\n provider,\n });\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance\");\n\n const usdcCustodian = new ethers.Contract(usdcCustodianAddress, abi, provider);\n const usdcCustodianWithSigner = new ethers.Contract(usdcCustodianAddress, abi, this.signer);\n\n execTime.breakpoint();\n let finalPreviewMintResult = previewMintResult;\n if (!finalPreviewMintResult) {\n finalPreviewMintResult = await this.previewMintFrxUSD(params);\n }\n const {\n maxUsdc,\n amountWeiBigInt,\n totalMax,\n totalAssetsOut,\n } = finalPreviewMintResult;\n execTime.log(\"previewMintFrxUSD\");\n\n result.outputAmount = numberRemoveEndZero(\n Big(totalAssetsOut.toString()).div(10 ** toToken.decimals).toFixed(toToken.decimals, 0)\n );\n\n result.sendParam = {\n contract: usdcCustodianWithSigner,\n method: \"deposit\",\n param: [\n amountWeiBigInt,\n recipient,\n ],\n };\n\n execTime.breakpoint();\n // Estimate gas fees\n const ett = await this.estimateTransaction({\n dry,\n contract: usdcCustodianWithSigner,\n method: \"deposit\",\n param: [...result.sendParam.param, { gasLimit: DEFAULT_GAS_LIMIT_FAILED }],\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = ett.estimateSourceGasUsd;\n result.sendParam.param[2] = { gasLimit: ett.estimateSourceGasLimit };\n execTime.log(\"estimateTransaction\");\n\n execTime.logTotal(\"mintFrxUSD\");\n\n return result;\n }\n\n async mintAndSendFrxUSD(params: any) {\n const {\n dry,\n recipient,\n amountWei,\n fromToken,\n toToken,\n prices,\n evmGasFees,\n refundTo,\n abi,\n usdcCustodianAddress,\n redeemAndMintContractAddress,\n originLayerzero,\n destinationLayerzero,\n previewMintResult,\n } = params;\n\n this.csl(\"EVM mintAndSendFrxUSD\", \"blue-700\", \"params: %o\", params);\n\n const {\n eid: dstEid,\n } = destinationLayerzero;\n\n // Ethereum average block time ~12s, estimateTime = 12*2 + random(-5, 5) seconds\n const ETH_AVG_BLOCK_TIME = 12;\n const estimateTime = (ETH_AVG_BLOCK_TIME * 2) + Math.floor(Math.random() * 11) - 5;\n\n const result: any = {\n needApprove: false,\n approveSpender: redeemAndMintContractAddress,\n sendParam: void 0,\n quoteParam: {\n ...params,\n },\n fees: {},\n totalFeesUsd: 0,\n estimateSourceGas: 0n,\n totalEstimateSourceGas: 0n,\n estimateSourceGasUsd: 0,\n estimateTime,\n outputAmount: \"0\",\n };\n\n const execTime = new ExecTime({ type: `FraxZero EVM mintAndSendFrxUSD ${fromToken.chainName}->${toToken.chainName}`, logStyle: \"stone-950\", isDebug: OpenAPI.DEBUG });\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n execTime.breakpoint();\n // Check allowance of fromToken for usdcCustodianAddress (USDC must be approved to custodian)\n const allowanceResult = await this.allowance({\n dry,\n contractAddress: fromToken.contractAddress,\n spender: redeemAndMintContractAddress,\n address: refundTo,\n amountWei,\n provider,\n });\n result.needApprove = allowanceResult.needApprove;\n execTime.log(\"allowance\");\n\n const redeemAndMintContractWithSigner = new ethers.Contract(redeemAndMintContractAddress, abi, this.signer);\n\n execTime.breakpoint();\n let finalPreviewMintResult = previewMintResult;\n if (!finalPreviewMintResult) {\n finalPreviewMintResult = await this.previewMintFrxUSD(params);\n }\n const {\n totalAssetsOut,\n } = finalPreviewMintResult;\n execTime.log(\"previewMintFrxUSD\");\n this.csl(\"EVM mintAndSendFrxUSD\", \"gray-600\", \"previewMintFrxUSD totalAssetsOut: %o\", totalAssetsOut);\n\n result.outputAmount = numberRemoveEndZero(\n Big(totalAssetsOut.toString()).div(10 ** 18).toFixed(18, 0)\n );\n\n // Build sendParam for deposit(assetsIn, receiver)\n const mintAndSendParam = [\n // assetsIn\n amountWei,\n // dstEid\n dstEid,\n // receiver\n addressToBytes32(toToken.chainType, recipient)\n ];\n\n result.sendParam = {\n contract: redeemAndMintContractWithSigner,\n method: \"mintAndSend\",\n param: mintAndSendParam,\n };\n\n execTime.breakpoint();\n // Estimate gas fees\n const ett = await this.estimateTransaction({\n dry,\n contract: redeemAndMintContractWithSigner,\n method: \"mintAndSend\",\n param: [...mintAndSendParam, { gasLimit: DEFAULT_GAS_LIMIT_FAILED }],\n fromToken,\n prices,\n evmGasFees,\n });\n result.fees.estimateGasUsd = ett.estimateSourceGasUsd;\n result.estimateSourceGas = ett.estimateSourceGas;\n result.totalEstimateSourceGas = ett.estimateSourceGas;\n result.estimateSourceGasUsd = ett.estimateSourceGasUsd;\n result.totalFeesUsd = ett.estimateSourceGasUsd;\n result.sendParam.param.push({ gasLimit: ett.estimateSourceGasLimit });\n execTime.log(\"estimateTransaction\");\n\n execTime.logTotal(\"mintAndSendFrxUSD\");\n\n return result;\n }\n\n async retryLayerzeroLzComponse(params: any) {\n const { Options } = await import(\"@layerzerolabs/lz-v2-utilities\");\n const {\n layerzeroData,\n history,\n } = params;\n\n const LayerZeroEndpointV2 = \"0x1a44076050125825900e736c501f859c50fe728c\";\n const LayerZeroEndpointV2ABI = [\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"_to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"_guid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint16\",\n \"name\": \"_index\",\n \"type\": \"uint16\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"_message\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"_extraData\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"lzCompose\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n }\n ];\n // lzCompose(address _from,address _to,bytes32 _guid,uint16 _index,bytes _message,bytes _extraData)\n const LayerZeroEndpointV2Contract = new ethers.Contract(LayerZeroEndpointV2, LayerZeroEndpointV2ABI, this.signer);\n\n const toToken: any = usdtTokens[history.destination_chain.blockchain as keyof typeof usdtTokens];\n const amountWei = Big(history.token_in_amount).times(10 ** (toToken.decimals || 6)).toFixed(0);\n\n const originLayerzero = USDT0_CONFIG[\"Arbitrum\"];\n const isOriginLegacy = layerzeroData.destination.lzCompose.failedTx[0].from.toLowerCase() === originLayerzero.oftLegacy?.toLowerCase();\n const lzReceiveOptionGas = isOriginLegacy ? originLayerzero.lzReceiveOptionGasLegacy : originLayerzero.lzReceiveOptionGas;\n let lzReceiveOptionValue = 0;\n\n const destATA = await getDestinationAssociatedTokenAddress({\n recipient: history.receive_address,\n toToken,\n });\n if (destATA.needCreateTokenAccount) {\n lzReceiveOptionValue = LZ_RECEIVE_VALUE[toToken.chainName] || 0;\n }\n\n const composeFrom = layerzeroData.source.tx.from;\n const composeMsg = layerzeroData.source.tx.payload.split(composeFrom.replace(/^0x/, \"\"))[1];\n const _message = buildEndpointV2LzComposePayload({\n nonce: layerzeroData.pathway.nonce,\n srcEid: layerzeroData.pathway.srcEid,\n amountLD: amountWei,\n composeFrom: composeFrom,\n composeMsg: composeMsg,\n });\n\n const contractParams = [\n layerzeroData.destination.lzCompose.failedTx[0].from,\n layerzeroData.destination.lzCompose.failedTx[0].to,\n layerzeroData.guid,\n layerzeroData.destination.lzCompose.failedTx[0].index,\n _message,\n \"0x\",\n ];\n\n const dstOFT = isOriginLegacy ? originLayerzero.oft : originLayerzero.oftLegacy;\n const sendParam: any = {\n dstEid: USDT0_CONFIG[history.destination_chain.chainName].eid,\n to: addressToBytes32(toToken.chainType, history.receive_address),\n amountLD: amountWei,\n minAmountLD: 0n,\n extraOptions: Options.newOptions()\n // .addExecutorLzReceiveOption(lzReceiveOptionGas, lzReceiveOptionValue)\n .toHex(),\n composeMsg: \"0x\",\n oftCmd: \"0x\"\n };\n\n const dstOFTContract = new ethers.Contract(dstOFT!, OFT_ABI, this.provider);\n const msgFee = await dstOFTContract.quoteSend.staticCall(sendParam, false);\n let nativeFee = msgFee[0];\n nativeFee = nativeFee * NATIVE_MSG_FEE_BUFFER / 100n;\n\n const tx = await LayerZeroEndpointV2Contract.lzCompose(\n ...contractParams,\n {\n gasLimit: originLayerzero.composeOptionGas || 800000,\n value: nativeFee,\n }\n );\n\n const txReceipt = await tx.wait();\n\n if (txReceipt.status === 1) {\n return txReceipt.hash;\n }\n\n return null;\n }\n\n async signTypedData(params: any) {\n const { fromToken, amountWei, spender } = params;\n\n this.csl(\"EVM signTypedData\", \"blue-900\", \"params: %o\", params);\n\n const provider = evmRpcFallbackProvider(fromToken);\n\n const value = amountWei;\n const tokenAddress = fromToken.contractAddress;\n const chainId = fromToken.chainId;\n // 3 days\n const deadline = Math.floor(Date.now() / 1000) + (60 * 60 * 24 * 3);\n const account = this.signer.address;\n\n const erc20 = new ethers.Contract(tokenAddress, erc20Abi, provider);\n const nonce = await erc20.nonces(account);\n const name = await erc20.name();\n\n let _version = \"1\";\n if (fromToken.symbol === \"USDC\") {\n _version = \"2\";\n }\n\n const domain = {\n name,\n version: _version,\n chainId: Number(chainId),\n verifyingContract: tokenAddress\n };\n\n const types = {\n Permit: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" }\n ]\n };\n\n const values = {\n owner: account,\n spender,\n value,\n nonce: nonce.toString(),\n deadline\n };\n\n const signature = await this.signer?.signTypedData(domain, types, values);\n\n const { v, r, s } = ethers.Signature.from(signature);\n\n // Check if signature is available\n try {\n const permitParams = [\n account,\n spender,\n value,\n deadline,\n v,\n r,\n s,\n ];\n const permitResponse = await erc20.permit.staticCall(...permitParams);\n this.csl(\"EVM signTypedData\", \"green-500\", \"permit response: %o\", permitResponse);\n } catch (error: any) {\n this.csl(\"EVM signTypedData\", \"red-500\", \"check permit signature failed: %o\", error);\n throw new Error(\"Permit signature verification failed\");\n }\n\n return {\n owner: account,\n value,\n deadline,\n nonce: Number(nonce),\n v,\n r,\n s,\n };\n }\n}\n\nexport { EVMWallet };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stableflow/wallet-evm",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.1-rc-d44cd0c127-20260527",
|
|
4
4
|
"description": "EVM wallet adapter for StableFlow SDK",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"big.js": "^7.0.1",
|
|
26
26
|
"ethers": "^6.16.0",
|
|
27
|
-
"@stableflow/bridges": "3.0.
|
|
28
|
-
"@stableflow/core": "3.0.
|
|
29
|
-
"@stableflow/utils-evm": "3.0.
|
|
30
|
-
"@stableflow/utils-solana": "3.0.
|
|
27
|
+
"@stableflow/bridges": "3.0.1-rc-d44cd0c127-20260527",
|
|
28
|
+
"@stableflow/core": "3.0.1-rc-d44cd0c127-20260527",
|
|
29
|
+
"@stableflow/utils-evm": "3.0.1-rc-d44cd0c127-20260527",
|
|
30
|
+
"@stableflow/utils-solana": "3.0.1-rc-d44cd0c127-20260527"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"@layerzerolabs/lz-v2-utilities": "^3.0.151"
|