@continuumdao/ctm-mpc-defi 0.2.6 → 0.2.7
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/agent/catalog.cjs +2 -2
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.js +2 -2
- package/dist/agent/catalog.js.map +1 -1
- package/dist/protocols/evm/gmx/index.cjs +2 -2
- package/dist/protocols/evm/gmx/index.cjs.map +1 -1
- package/dist/protocols/evm/gmx/index.js +2 -2
- package/dist/protocols/evm/gmx/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/protocols/evm/gmx/support.ts","../../../../src/protocols/evm/gmx/api.ts","../../../../src/protocols/evm/gmx/amounts.ts","../../../../src/protocols/evm/gmx/apy.ts","../../../../src/protocols/evm/gmx/markets.ts","../../../../src/protocols/evm/gmx/format.ts","../../../../src/protocols/evm/gmx/marketContext.ts","../../../../src/protocols/evm/gmx/positionDisplay.ts","../../../../src/protocols/evm/gmx/leverage.ts","../../../../src/protocols/evm/gmx/contracts.ts","../../../../src/protocols/evm/gmx/reads.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/gmx/native.ts","../../../../src/protocols/evm/gmx/estimates.ts","../../../../src/protocols/evm/gmx/multisign.ts","../../../../src/protocols/evm/gmx/executionFee.ts","../../../../src/protocols/evm/gmx/gmLiquidityMultisign.ts","../../../../src/protocols/evm/gmx/gmxTokenStakingMultisign.ts","../../../../src/protocols/evm/gmx/gmLiquidityReads.ts","../../../../src/protocols/evm/gmx/prices.ts","../../../../src/protocols/evm/gmx/index.ts"],"names":["require","getAddress","createRequire","fileURLToPath","gasLimitFromEstimateAndChainConfig","getPositionInfo","asBigint","defineChain","createPublicClient","http","parseAbi","GMX_WETH_DEPOSIT_FALLBACK","GMX_ERC20_APPROVE_FALLBACK","wethDepositAbi","erc20AllowanceAbi","erc20ApproveAbi","encodeFunctionData","formatUnits"],"mappings":";;;;;;AAEA,IAAM,UAA4B,EAAC;AAE5B,SAAS,uBAAuB,GAAA,EAA2B;AAChE,EAAA,MAAM,QAAA,GAAW,QAAQ,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,IAAI,EAAE,CAAA;AACzD,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,OAAA,CAAQ,QAAQ,CAAA,GAAI,GAAA;AAAA,EACtB,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EAClB;AACF;;;ACVO,IAAM,uBAAA,GAA0B,CAAC,KAAA,EAAO,KAAK;AAI7C,SAAS,oBAAoB,OAAA,EAAiD;AACnF,EAAA,OAAQ,uBAAA,CAA8C,SAAS,OAAO,CAAA;AACxE;ACHA,IAAMA,QAAAA,GAAU,aAAA,CAAc,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC5D,IAAM,EAAE,SAAA,EAAU,GAAIA,QAAAA,CAAQ,gBAAgB,CAAA;AAI9C,IAAM,mBAAA,GAAsB,GAAA;AAG5B,IAAM,iBAAA,GAA+D;AAAA,EACnE,KAAA,EAAO,CAAC,+BAAA,EAAiC,+BAA+B,CAAA;AAAA,EACxE,KAAA,EAAO,CAAC,gCAAA,EAAkC,gCAAgC;AAC5E,CAAA;AAgBA,SAAS,WAAA,CAAY,OAAA,EAAiB,IAAA,EAAc,KAAA,EAAyC;AAC3F,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACtC,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,CAAA,EAAG,IAAI,GAAG,IAAI,CAAA,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,IAAI,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA,SAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAC1E;AACA,EAAA,MAAM,EAAA,GAAK,OAAO,QAAA,EAAS;AAC3B,EAAA,OAAO,EAAA,GAAK,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA;AACrD;AAEA,SAAS,cAAA,CAAe,MAAc,KAAA,EAAgB;AACpD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,UAAS,GAAI,KAAA;AACxD;AAEA,eAAe,gBAAA,CAAiB,OAAA,EAAiB,IAAA,EAAc,IAAA,EAA2C;AACxG,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,OAAA,EAAS,IAAA,EAAM,MAAM,KAAK,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,mBAAmB,CAAA;AAC1E,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB;AAAA,MACtC,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,IAAI,UAAU,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA,CAAA;AAC7D,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,IAAI,IAAA,EAAM,SAAS,OAAA,GAAU,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,KAAK,OAAO,CAAA,CAAA;AAAA,MACvE,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACvC;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,IAAA,EAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,IAAA;AAAA,EAClD,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,SAAS,CAAA;AAAA,EACxB;AACF;AAEA,eAAe,eAAA,CACb,OAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACkB;AAClB,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,OAAA,EAAS,IAAI,CAAA;AACrC,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,mBAAmB,CAAA;AAC1E,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,QAAQ,kBAAA,EAAmB;AAAA,MAC1E,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,cAAc,CAAA;AAAA,MACzC,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,IAAI,UAAU,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA,CAAA;AAC7D,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAW,MAAM,QAAA,CAAS,IAAA,EAAK;AACrC,QAAA,IAAI,OAAA,EAAS,SAAS,OAAA,GAAU,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,QAAQ,OAAO,CAAA,CAAA;AAAA,MAC7E,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACvC;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,IAAA,EAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,IAAA;AAAA,EAClD,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,SAAS,CAAA;AAAA,EACxB;AACF;AAEA,SAAS,wBAAwB,OAAA,EAA6B;AAC5D,EAAA,MAAM,IAAA,GAAO,kBAAkB,OAAO,CAAA;AACtC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0CAAA,EAA6C,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EACzE;AACA,EAAA,eAAe,oBAAuB,EAAA,EAAiD;AACrF,IAAA,IAAI,SAAA;AACJ,IAAA,KAAA,MAAW,WAAW,IAAA,EAAM;AAC1B,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAG,OAAO,CAAA;AAAA,MACzB,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,GAAY,CAAA;AAAA,MACd;AAAA,IACF;AACA,IAAA,MAAM,SAAS,SAAA,YAAqB,KAAA,GAAQ,SAAA,CAAU,OAAA,GAAU,OAAO,SAAS,CAAA;AAChF,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,4CAA4C,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,kBAAkB,MAAM,CAAA;AAAA,KACrF;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAC,IAAA,EAAM,IAAA,KAAS,mBAAA,CAAoB,CAAC,OAAA,KAAY,gBAAA,CAAiB,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,IACjG,QAAA,EAAU,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,KAAS,mBAAA,CAAoB,CAAC,OAAA,KAAY,eAAA,CAAgB,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC;AAAA,GAC7G;AACF;AAiEA,IAAM,UAAA,uBAAiB,GAAA,EAA+B;AAE/C,SAAS,aAAa,OAAA,EAAoC;AAC/D,EAAA,IAAI,CAAC,mBAAA,CAAoB,OAAO,CAAA,EAAG;AACjC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,OAAO,CAAA,iDAAA,CAAmD,CAAA;AAAA,EAC7G;AACA,EAAA,IAAI,GAAA,GAAM,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAChC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,GAAM,IAAI,UAAU,EAAE,OAAA,EAAS,KAAK,uBAAA,CAAwB,OAAO,GAAG,CAAA;AACtE,IAAA,UAAA,CAAW,GAAA,CAAI,SAAS,GAAG,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,GAAA;AACT;AC1MO,SAAS,cAAc,WAAA,EAA6B;AACzD,EAAA,MAAM,OAAA,GAAU,YAAY,IAAA,EAAK;AACjC,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AACA,EAAA,MAAM,CAAC,KAAA,EAAO,IAAA,GAAO,EAAE,CAAA,GAAI,OAAA,CAAQ,MAAM,GAAG,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAA,CAAc,OAAO,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAG,KAAA,CAAM,GAAG,EAAE,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,IAAc,GAAG,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,GAAA,IAAO,GAAA,GAAM,KAAA;AACpC,EAAA,IAAI,KAAA,IAAS,EAAA,EAAI,MAAM,IAAI,MAAM,uCAAuC,CAAA;AACxE,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,mBAAA,CAAoB,aAAqB,QAAA,EAA0B;AACjF,EAAA,OAAO,UAAA,CAAW,aAAa,QAAQ,CAAA;AACzC;ACXO,SAAS,oBAAoB,GAAA,EAA+C;AACjF,EAAA,IAAI,OAAO,IAAA,IAAQ,CAAC,OAAO,QAAA,CAAS,GAAG,GAAG,OAAO,IAAA;AACjD,EAAA,MAAM,MAAM,GAAA,GAAM,GAAA;AAClB,EAAA,IAAI,GAAA,IAAO,GAAG,OAAO,IAAA;AACrB,EAAA,OAAO,CAAA,EAAG,IAAI,cAAA,CAAe,OAAA,EAAS,EAAE,qBAAA,EAAuB,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA;AACrE;AAEO,SAAS,kBAAA,CACd,aACA,kBAAA,EAC2B;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,WAAW,kBAAkB,CAAA;AAC9C,IAAA,OAAO,YAAY,QAAQ,CAAA,IAAK,YAAY,QAAA,CAAS,WAAA,EAAa,CAAA,IAAK,IAAA;AAAA,EACzE,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,EAAK,CAAE,WAAA,EAAY;AACpD,IAAA,OAAO,WAAA,CAAY,KAAK,CAAA,IAAK,IAAA;AAAA,EAC/B;AACF;AAEO,SAAS,2BAAA,CACd,KACA,WAAA,EACA;AACA,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,WAAA,EAAa,GAAA,CAAI,kBAAkB,CAAA;AACpE,EAAA,MAAM,GAAA,GAAM,OAAO,GAAA,IAAO,IAAA;AAC1B,EAAA,OAAO;AAAA,IACL,GAAG,GAAA;AAAA,IACH,GAAA;AAAA,IACA,OAAA,EAAS,OAAO,OAAA,IAAW,IAAA;AAAA,IAC3B,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,IAC7B,eAAA,EAAiB,oBAAoB,GAAG;AAAA,GAC1C;AACF;ACrCA,eAAsB,gBAAgB,OAAA,EAA0C;AAC9E,EAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,EAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,YAAA,EAAa;AACvC,EAAA,OAAO,OAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,UAAA,IAAc,CAAA,CAAE,QAAA,KAAa,KAAK,CAAA,CACnD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,MAAA,CAAO,aAAA,CAAc,CAAA,CAAE,MAAA,EAAQ,MAAA,EAAW,EAAE,WAAA,EAAa,MAAA,EAAQ,CAAC,CAAA;AACxF;AAEA,eAAsB,eAAe,OAAA,EAAyC;AAC5E,EAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,EAAA,OAAO,IAAI,WAAA,EAAY;AACzB;AAEA,eAAsB,uBAAA,CAAwB,SAAiB,MAAA,EAAsC;AACnG,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AACtC,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,OAAO,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,EAAQ,WAAA,EAAY,KAAM,GAAG,CAAA;AAC9D,EAAA,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,CAAA,oCAAA,EAAuC,OAAO,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE,CAAA;AACrF,EAAA,OAAO,GAAA;AACT;AAEA,eAAsB,6BAAA,CAA8B,SAAiB,YAAA,EAAwC;AAC3G,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAOC,UAAAA,CAAW,YAAY,CAAA,CAAE,WAAA,EAAY;AAClD,IAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,OAAO,CAAA;AAC3C,IAAA,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,KAAM,EAAE,OAAA,EAAS,WAAA,OAAkB,IAAI,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,SAAS,0BAA0B,YAAA,EAAgC;AACxE,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,KAAA,CAAM,eAAe,CAAA;AAC5C,EAAA,IAAI,CAAC,CAAA,GAAI,CAAC,CAAA,SAAU,EAAC;AACrB,EAAA,OAAO,CAAA,CAAE,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAC5D;AAEO,SAAS,0BAAA,CAA2B,cAAsB,gBAAA,EAAmC;AAClG,EAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,IAAA,EAAK,CAAE,WAAA,EAAY;AAChD,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,MAAA,GAAS,0BAA0B,YAAY,CAAA;AACrD,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,OAAO,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,WAAA,OAAkB,GAAG,CAAA;AACnD;AAEA,eAAsB,6BAAA,CACpB,SACA,gBAAA,EACyB;AACzB,EAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,OAAO,CAAA;AAC7C,EAAA,OAAO,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,2BAA2B,CAAA,CAAE,MAAA,EAAQ,gBAAgB,CAAC,CAAA;AACrF;AAEA,eAAsB,wBAAA,CAAyB,SAAiB,MAAA,EAAuC;AACrG,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,EAAK;AACxB,EAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,OAAO,CAAA;AAC7C,EAAA,MAAM,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,GAAG,CAAA;AAChD,EAAA,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,CAAA,qCAAA,EAAwC,OAAO,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE,CAAA;AACtF,EAAA,IAAI,CAAC,GAAA,CAAI,gBAAA,IAAoB,CAAC,IAAI,iBAAA,EAAmB;AACnD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,MAAM,CAAA,wCAAA,CAA0C,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,eAAsB,gCAAA,CACpB,SACA,cAAA,EAC8B;AAC9B,EAAA,MAAM,IAAA,GAAOA,UAAAA,CAAW,cAAc,CAAA,CAAE,WAAA,EAAY;AACpD,EAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,OAAO,CAAA;AAC7C,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,EAAE,kBAAA,EAAoB,WAAA,EAAY,KAAM,IAAI,CAAA,IAAK,IAAA;AAC9E;AAaA,eAAsB,yBAAyB,OAAA,EAAmD;AAChG,EAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,OAAO,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,OAAO,CAAA;AAC3C,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,QAAQ,WAAA,EAAY,EAAG,CAAA,CAAE,MAAM,CAAC,CAAC,CAAA;AAClF,EAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,EAAA,MAAM,kBAAsD,EAAC;AAC7D,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,QAAA,EAAS,CAAE,MAAM,OAAO,EAAE,OAAA,EAAS,eAAA,EAAgB,CAAE,CAAA;AAC9E,EAAA,MAAM,WAAA,GAAe,OAAO,OAAA,IAAW,eAAA;AACvC,EAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,CAAA,KAClB,2BAAA;AAAA,MACE;AAAA,QACE,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,oBAAoB,CAAA,CAAE,kBAAA;AAAA,QACtB,eAAA,EAAiB,YAAY,GAAA,CAAA,CAAK,CAAA,CAAE,oBAAoB,EAAA,EAAI,WAAA,EAAa,CAAA,IAAK,IAAA;AAAA,QAC9E,gBAAA,EAAkB,YAAY,GAAA,CAAA,CAAK,CAAA,CAAE,qBAAqB,EAAA,EAAI,WAAA,EAAa,CAAA,IAAK;AAAA,OAClF;AAAA,MACA;AAAA;AACF,GACF;AACF;ACzGO,SAAS,eAAe,KAAA,EAAmE;AAChG,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,IAAA;AAC1B,EAAA,IAAI,CAAA;AACJ,EAAA,IAAI;AACF,IAAA,CAAA,GAAI,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAC9D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAA,IAAK,IAAI,OAAO,IAAA;AACpB,EAAA,MAAM,WAAW,CAAA,GAAI,EAAA;AACrB,EAAA,MAAM,GAAA,GAAM,QAAA,GAAW,CAAC,CAAA,GAAI,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,IAAO,GAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,IAAO,GAAA;AAC1B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,EAAS,CAAE,QAAA,CAAS,IAAI,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACnE,EAAA,MAAM,GAAA,GAAM,UAAU,CAAA,EAAG,KAAK,IAAI,OAAO,CAAA,CAAA,GAAK,MAAM,QAAA,EAAS;AAC7D,EAAA,MAAM,MAAA,GAAS,OAAO,GAAG,CAAA;AACzB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AACrC,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,CAAE,eAAe,OAAA,EAAS;AAAA,IACzD,qBAAA,EAAuB,CAAA;AAAA,IACvB,qBAAA,EAAuB,MAAA,IAAU,GAAA,GAAM,CAAA,GAAI;AAAA,GAC5C,CAAA;AACD,EAAA,OAAO,QAAA,GAAW,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA,GAAK,IAAI,SAAS,CAAA,CAAA;AACpD;AAGO,SAAS,yBAAyB,KAAA,EAAmE;AAC1G,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,IAAA;AAC1B,EAAA,IAAI,CAAA;AACJ,EAAA,IAAI;AACF,IAAA,CAAA,GAAI,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAC9D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAA,IAAK,IAAI,OAAO,IAAA;AACpB,EAAA,MAAM,WAAW,CAAA,GAAI,EAAA;AACrB,EAAA,MAAM,GAAA,GAAM,QAAA,GAAW,CAAC,CAAA,GAAI,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,IAAO,GAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,IAAO,GAAA;AAC1B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,EAAS,CAAE,QAAA,CAAS,IAAI,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACnE,EAAA,MAAM,GAAA,GAAM,UAAU,CAAA,EAAG,KAAK,IAAI,OAAO,CAAA,CAAA,GAAK,MAAM,QAAA,EAAS;AAC7D,EAAA,OAAO,QAAA,GAAW,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAChC;AAGO,SAAS,yBAAA,CAA0B,WAAmB,QAAA,EAA0B;AACrF,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,SAAA,EAAW,QAAQ,CAAA;AAC3C,EAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,GAAG,GAAG,OAAO,GAAA;AAC/B,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACjC;AAGO,SAAS,qBAAqB,KAAA,EAAmE;AACtG,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,IAAA;AAC1B,EAAA,IAAI,CAAA;AACJ,EAAA,IAAI;AACF,IAAA,CAAA,GAAI,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAC9D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAA,IAAK,IAAI,OAAO,IAAA;AACpB,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,GAAA;AACtB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,IAAK,GAAG,OAAO,IAAA;AAC1C,EAAA,OAAO,CAAA,EAAG,CAAA,CAAE,cAAA,CAAe,OAAA,EAAS,EAAE,uBAAuB,CAAA,EAAG,qBAAA,EAAuB,CAAA,EAAG,CAAC,CAAA,IAAA,CAAA;AAC7F;AC9DA,IAAMD,QAAAA,GAAUE,aAAAA,CAAcC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC5D,IAAM,EAAE,iBAAA,EAAmB,sBAAA,EAAuB,GAAIH,SAAQ,2BAA2B,CAAA;AAalF,IAAM,8BAAA,GAAiC,MAAM,GAAA,IAAO,GAAA;AAQ3D,IAAM,cAAA,uBAAqB,GAAA,EAAoC;AAE/D,SAAS,iBAAiB,SAAA,EAA2C;AACnE,EAAA,MAAM,aAAsD,EAAC;AAC7D,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAE,CAAA;AACtC,IAAA,IAAI,OAAA,EAAS,UAAA,CAAW,OAAO,CAAA,GAAI,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,UAAA;AACT;AAEA,eAAsB,qBAAqB,OAAA,EAAyC;AAClF,EAAA,IAAI,OAAA,GAAU,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAA,CAAW,YAAY;AACrB,MAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,MAAA,MAAM,CAAC,cAAA,EAAgB,SAAS,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QACpD,IAAI,gBAAA,EAAiB;AAAA,QACrB,IAAI,eAAA;AAAgB,OACrB,CAAA;AACD,MAAA,MAAM,UAAA,GAAa,iBAAiB,SAAS,CAAA;AAC7C,MAAA,MAAM,kBAA2D,EAAC;AAClE,MAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,QAAA,MAAM,WAAW,iBAAA,CAAkB,EAAE,SAAS,aAAA,EAAe,GAAA,EAAK,YAAY,CAAA;AAC9E,QAAA,IAAI,UAAU,kBAAA,EAAoB;AAChC,UAAA,eAAA,CAAgB,MAAA,CAAO,QAAA,CAAS,kBAAkB,CAAC,CAAA,GAAI,QAAA;AAAA,QACzD;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,eAAA;AAAA,QACA,UAAA;AAAA,QACA,gBAAA,EAAkB;AAAA,OACpB;AAAA,IACF,CAAA,GAAG;AACH,IAAA,cAAA,CAAe,GAAA,CAAI,SAAS,OAAO,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,wBAAA,CAAyB,SAAiB,MAAA,EAAgB;AAC9E,EAAA,MAAM,GAAA,GAAM,MAAM,oBAAA,CAAqB,OAAO,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,GAAA,CAAI,eAAA,EAAiB,OAAO,CAAA;AACnE,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,OAAO,GAAA,CAAI,gBAAgB,OAAO,CAAA;AACpC;AAEA,eAAsB,uBAAA,CAAwB,SAAiB,MAAA,EAAgB;AAC7E,EAAA,MAAM,GAAA,GAAM,MAAM,oBAAA,CAAqB,OAAO,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AACtC,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,UAAU,EAAE,IAAA,CAAK,CAAC,CAAA,KAAM,MAAA,CAAO,EAAE,MAAA,IAAU,EAAE,CAAA,CAAE,WAAA,OAAkB,GAAG,CAAA;AAC/F;;;ACzEA,IAAMA,QAAAA,GAAUE,aAAAA,CAAcC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC5D,IAAM,EAAE,eAAA,EAAgB,GAAIH,QAAAA,CAAQ,6BAA6B,CAAA;AAkBjE,SAAS,SAAS,CAAA,EAAgC;AAChD,EAAA,IAAI,CAAA,IAAK,MAAM,OAAO,MAAA;AACtB,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,IAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAA,CAAc,KAA8B,QAAA,EAAoC;AACvF,EAAA,MAAM,IAAA,GAAO,OAAO,QAAA,EAAU,SAAA,IAAa,IAAI,SAAA,IAAa,EAAE,EAAE,IAAA,EAAK;AACrE,EAAA,IAAI,MAAM,OAAO,IAAA;AACjB,EAAA,MAAM,SAAS,MAAA,CAAO,GAAA,CAAI,aAAA,IAAiB,EAAE,EAAE,IAAA,EAAK;AACpD,EAAA,OAAO,SAAS,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,UAAA;AACpD;AAEA,eAAsB,4BAAA,CACpB,SACA,SAAA,EACkC;AAClC,EAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AACpC,EAAA,MAAM,GAAA,GAAM,MAAM,oBAAA,CAAqB,OAAO,CAAA;AAE9C,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AAC/B,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,aAAA,IAAiB,EAAE,CAAA;AACpD,IAAA,MAAM,UAAA,GAAa,aAAA,GAAgB,GAAA,CAAI,eAAA,CAAgB,aAAa,CAAA,GAAI,MAAA;AACxE,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,eAAA,CAAgB;AAAA,UACzB,QAAA,EAAU,GAAA;AAAA,UACV,UAAA;AAAA,UACA,kBAAkB,GAAA,CAAI,gBAAA;AAAA,UACtB,gBAAA,EAAkB,KAAA,CAAA;AAAA,UAClB,iBAAA,EAAmB,KAAA;AAAA,UACnB,WAAA,EAAa;AAAA,SACd,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,GAAW,MAAA;AAAA,MACb;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,QAAA,IAAY,GAAA;AAC3B,IAAA,MAAM,kBAAkB,MAAA,CAAO,eAAA;AAE/B,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,MAAA,CAAO,GAAA,CAAI,GAAA,IAAO,GAAA,CAAI,eAAe,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACjE,SAAA,EAAW,aAAA,CAAc,GAAA,EAAK,QAAQ,CAAA;AAAA,MACtC,MAAA,EAAQ,OAAA,CAAQ,MAAA,CAAO,MAAA,IAAU,IAAI,MAAM,CAAA;AAAA,MAC3C,SAAS,cAAA,CAAe,QAAA,CAAS,OAAO,SAAA,IAAa,GAAA,CAAI,SAAS,CAAC,CAAA;AAAA,MACnE,eAAe,cAAA,CAAe,QAAA,CAAS,OAAO,aAAA,IAAiB,GAAA,CAAI,aAAa,CAAC,CAAA;AAAA,MACjF,kBAAkB,eAAA,EAAiB,MAAA,GAAS,MAAA,CAAO,eAAA,CAAgB,MAAM,CAAA,GAAI,IAAA;AAAA,MAC7E,aAAA,EAAe,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,MACzD,YAAA,EAAc,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,MACvD,mBAAA,EAAqB,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,gBAAgB,CAAC,CAAA;AAAA,MACrE,eAAe,oBAAA,CAAqB,QAAA,CAAS,OAAO,QAAA,IAAY,MAAA,CAAO,kBAAkB,CAAC,CAAA;AAAA,MAC1F,MAAA,EAAQ,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,GAAG,CAAC;AAAA,KAC7C;AAAA,EACF,CAAC,CAAA;AACH;AC/EA,IAAMA,QAAAA,GAAUE,aAAAA,CAAcC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC5D,IAAM,EAAE,qBAAA,EAAsB,GAAIH,QAAAA,CAAQ,2BAA2B,CAAA;AAQ9D,SAAS,wBAAwB,UAAA,EAA6C;AACnF,EAAA,OAAO,qBAAA,CAAsB;AAAA,IAC3B,qBAAqB,UAAA,CAAW,mBAAA;AAAA,IAChC,mCAAmC,UAAA,CAAW,iCAAA;AAAA,IAC9C,2CAA2C,UAAA,CAAW;AAAA,GAGvD,CAAA;AACH;AAEO,SAAS,0BAA0B,UAAA,EAAoD;AAC5F,EAAA,MAAM,GAAA,GAAM,wBAAwB,UAAU,CAAA;AAC9C,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,IAAO,GAAG,OAAO,IAAA;AAC9C,EAAA,OAAO,oBAAA,CAAqB,MAAA,CAAO,GAAG,CAAC,CAAA;AACzC;ACvBA,IAAMA,QAAAA,GAAUE,aAAAA,CAAcC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC5D,IAAM,EAAE,WAAA,EAAY,GAAIH,QAAAA,CAAQ,+BAA+B,CAAA;AAIxD,SAAS,kBAAA,CAAmB,SAAiB,IAAA,EAAuB;AACzE,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,OAAA,EAAS,IAAI,CAAA;AACrC,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,4CAAA,EAA8C;AAChE,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,IAAI,CAAA,8BAAA,EAAiC,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EAClF;AACA,EAAA,OAAO,GAAA;AACT;;;ACFA,eAAsB,6BAA6B,IAAA,EAAoD;AACrG,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACrC,EAAA,MAAM,SAAA,GAAY,MAAM,GAAA,CAAI,kBAAA,CAAmB;AAAA,IAC7C,SAAS,IAAA,CAAK,eAAA;AAAA,IACd,oBAAA,EAAsB;AAAA,GACvB,CAAA;AACD,EAAA,OAAO;AAAA,IACL;AAAA,GACF;AACF;AAEA,eAAsB,4BAA4B,IAAA,EAAoD;AACpG,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,6BAA6B,IAAI,CAAA;AAC7D,EAAA,OAAO,4BAAA,CAA6B,IAAA,CAAK,OAAA,EAAS,SAAS,CAAA;AAC7D;AAEA,eAAsB,0BAA0B,IAAA,EAAoD;AAClG,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACrC,EAAA,OAAO,IAAI,WAAA,CAAY,EAAE,OAAA,EAAS,IAAA,CAAK,iBAAiB,CAAA;AAC1D;AAEA,eAAsB,uBAAuB,IAAA,EAA2B;AACtE,EAAA,MAAM,CAAC,OAAA,EAAS,GAAG,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA,EAAG,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAC,CAAC,CAAA;AAC5G,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AAC1B,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,kBAAA,IAAsB,EAAE,CAAA;AAC9C,MAAA,MAAM,IAAA,GACJ,GAAA,CAAI,eAAA,CAAgB,IAAI,KACxB,GAAA,CAAI,eAAA,CAAgB,IAAA,CAAK,WAAA,EAAa,CAAA,IACtC,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA,CAAE,IAAA;AAAA,QACjC,CAAC,GAAA,KAAQ,MAAA,CAAO,GAAA,CAAI,kBAAA,IAAsB,EAAE,CAAA,CAAE,WAAA,EAAY,KAAM,IAAA,CAAK,WAAA;AAAY,OACnF;AACF,MAAA,OAAO;AAAA,QACL,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,oBAAoB,CAAA,CAAE,kBAAA;AAAA,QACtB,gBAAA,EAAkB,IAAA,GAAO,yBAAA,CAA0B,IAAI,CAAA,GAAI;AAAA,OAC7D;AAAA,IACF,CAAC;AAAA,GACH;AACF;AAEA,eAAsB,yBAAyB,IAAA,EAA2B;AACxE,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AAChD,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACxB,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,SAAS,CAAA,CAAE,OAAA;AAAA,IACX,UAAU,CAAA,CAAE;AAAA,GACd,CAAE,CAAA;AACJ;AAEA,eAAsB,kBAAkB,IAAA,EAA2B;AACjE,EAAA,MAAM,OAAA,GAAU,MAAM,wBAAA,CAAyB,IAAA,CAAK,OAAO,CAAA;AAC3D,EAAA,OAAO,EAAE,OAAA,EAAQ;AACnB;AAGA,eAAsB,cAAc,IAAA,EAA2B;AAC7D,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,kBAAkB,IAAI,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAO,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,CAAE,GAAA,IAAO,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACtE,EAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAC3B;AAEA,eAAsB,qBAAqB,IAAA,EAAoD;AAC7F,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,iBAAA,CAAkB,EAAE,OAAA,EAAS,IAAA,CAAK,iBAAiB,CAAA;AAC3E,EAAA,OAAO;AAAA,IACL,cAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,EAAG,CAAA,KAAO,OAAO,MAAM,QAAA,GAAW,CAAA,CAAE,QAAA,EAAS,GAAI,CAAE,CAAC;AAAA,GACtG;AACF;AAEA,eAAsB,yBAAyB,IAAA,EAAmD;AAChG,EAAA,MAAM,SAAS,MAAM,gCAAA,CAAiC,IAAA,CAAK,OAAA,EAAS,KAAK,cAAc,CAAA;AACvF,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAE,QAAQ,IAAA,EAAK;AACnC,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AAChD,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAY,EAAG,CAAC,CAAC,CAAC,CAAA;AAC3E,EAAA,MAAM,OAAO,WAAA,CAAY,GAAA,CAAA,CAAK,OAAO,gBAAA,IAAoB,EAAA,EAAI,aAAa,CAAA;AAC1E,EAAA,MAAM,QAAQ,WAAA,CAAY,GAAA,CAAA,CAAK,OAAO,iBAAA,IAAqB,EAAA,EAAI,aAAa,CAAA;AAC5E,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,oBAAoB,MAAA,CAAO,kBAAA;AAAA,MAC3B,eAAA,EAAiB,MAAM,MAAA,IAAU,IAAA;AAAA,MACjC,gBAAA,EAAkB,OAAO,MAAA,IAAU,IAAA;AAAA,MACnC,UAAA,EAAY;AAAA;AACd,GACF;AACF;AAEO,SAAS,mBAAmB,OAAA,EAAyB;AAC1D,EAAA,OAAO,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAC1C;AAEA,eAAsB,yBAAA,CAA0B,SAAiB,YAAA,EAAwC;AACvG,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,gCAAA,CAAiC,OAAA,EAAS,YAAY,CAAA;AAC3E,IAAA,OAAO,MAAA,IAAU,IAAA;AAAA,EACnB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,SAAS,yBAAA,CAA0B,SAAiB,YAAA,EAA+B;AACxF,EAAA,IAAI;AACF,IAAA,OAAOC,UAAAA,CAAW,YAAY,CAAA,CAAE,WAAA,OAAkB,kBAAA,CAAmB,OAAO,EAAE,WAAA,EAAY;AAAA,EAC5F,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACvHO,SAAS,gBAAA,CAAiB,aAAqB,aAAA,EAAgC;AACpF,EAAA,MAAM,CAAA,GAAI,YAAY,IAAA,EAAK;AAC3B,EAAA,MAAM,MAAA,GAAA,CAAU,aAAA,IAAiB,EAAA,EAAI,IAAA,EAAK;AAC1C,EAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AACpB,EAAA,OAAO,CAAA,GAAI,GAAG,CAAC;;AAAA,EAAO,MAAM,CAAA,CAAA,GAAK,MAAA;AACnC;;;AC8BO,SAAS,kBAAkB,KAAA,EAAsD;AACtF,EAAA,MAAM,EAAE,MAAA,EAAQ,kBAAA,EAAoB,IAAA,EAAK,GAAI,KAAA;AAC7C,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AAEA,EAAA,MAAM,EAAA,GAAA,CAAM,MAAA,CAAO,SAAA,IAAa,EAAA,EAAI,IAAA,EAAK;AACzC,EAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAEhE,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,EAAC;AACnC,EAAA,MAAM,QAAA,GAAW,4BAA4B,MAAM,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AAEpB,EAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAC/C,EAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACjC,oBAAoB,CAAA,CAAE,kBAAA;AAAA,IACtB,eAAe,CAAA,CAAE,aAAA;AAAA,IACjB,GAAG,CAAA,CAAE;AAAA,GACP,CAAE,CAAA;AAEF,EAAA,MAAM,gBAAA,GAAmB,IAAA,CACtB,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,gBAAgB,CAAA,CAC7B,MAAA,CAAO,CAAC,CAAA,KAAoC,CAAA,IAAK,IAAA,IAAQ,OAAO,MAAM,QAAQ,CAAA;AAEjF,EAAA,MAAM,YAAA,GAAwC;AAAA,IAC5C,SAAA;AAAA,IACA,GAAI,KAAA,CAAM,SAAA,IAAa;AAAC,GAC1B;AACA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA;AAE7C,EAAA,MAAM,WAAA,GAAuC;AAAA,IAC3C,OAAA;AAAA,IACA,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAS,cAAc,CAAC,CAAA;AAAA,IACxB,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,kBAAA;AAAA,IACA,kBAAA,EAAoB,KAAA,CAAM,kBAAA,IAAsB,KAAA,CAAM,kBAAA;AAAA,IACtD,SAAA;AAAA,IACA,eAAe,KAAA,CAAM,aAAA;AAAA,IACrB,OAAA,EAAS,gBAAA,CAAiB,KAAA,CAAM,WAAA,EAAa,MAAM,aAAa,CAAA;AAAA,IAChE,GAAG,KAAA,CAAM;AAAA,GACX;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,WAAA,CAAY,aAAA,GAAgB,aAAA;AAC5B,IAAA,WAAA,CAAY,eAAA,GAAkB,eAAA;AAAA,EAChC;AAEA,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,IAAA,WAAA,CAAY,gBAAA,GAAmB,gBAAA;AAAA,EACjC;AAEA,EAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,EAAA,IAAI,QAAA,IAAY,IAAA,IAAQ,QAAA,GAAW,EAAA,EAAI;AACrC,IAAA,WAAA,CAAY,KAAA,GAAQ,SAAS,QAAA,EAAS;AAAA,EACxC;AAEA,EAAA,IAAI,QAAA,cAAsB,QAAA,GAAW,QAAA;AAErC,EAAA,OAAO,EAAE,WAAA,EAAa,aAAA,EAAe,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,EAAE;AACnE;AC9FO,SAAS,8BAAA,CACd,cACA,aAAA,EACQ;AACR,EAAA,IAAI,iBAAiB,IAAA,IAAQ,MAAA,CAAO,SAAS,aAAa,CAAA,IAAK,gBAAgB,CAAA,EAAG;AAChF,IAAA,OAAO,kCAAA,CAAmC,cAAc,aAAa,CAAA;AAAA,EACvE;AACA,EAAA,OAAA,CAAQ,YAAA,GAAe,MAAM,EAAA,IAAM,GAAA;AACrC;;;ACgDA,eAAsB,uBAAuB,IAAA,EAAwD;AACnG,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,IAAA;AAC3B,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,qBAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAE3F,EAAA,MAAM,KAAK,WAAA,CAAY;AAAA,IACrB,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,gBAAgB,EAAE,QAAA,EAAU,IAAI,IAAA,EAAM,OAAA,EAAS,QAAQ,KAAA,EAAM;AAAA,IAC7D,OAAA,EAAS,EAAE,OAAA,EAAS,EAAE,MAAM,CAAC,MAAM,GAAE;AAAE,GACxC,CAAA;AACD,EAAA,MAAM,YAAA,GAAe,mBAAmB,EAAE,KAAA,EAAO,IAAI,SAAA,EAAW,IAAA,CAAK,MAAM,CAAA,EAAG,CAAA;AAE9E,EAAA,MAAM,SAAA,GAAY,MAAM,mBAAA,CAAoB,MAAA,EAAQ,OAAO,CAAA;AAC3D,EAAA,MAAM,SAAS,OAAA,CAAQ,WAAA,EAAa,MAAM,CAAA,IAAK,CAAC,SAAA,CAAU,SAAA;AAC1D,EAAA,MAAM,gBAAA,GAAmB,CAAC,MAAA,GAAA,CACpB,MAAM,YAAA,CAAa,QAAA,CAAS,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA,EAAG,aAAA,IAAiB,EAAA,GACxE,EAAA;AAEJ,EAAA,MAAM,cAAA,GACJ,gBAAgB,WAAA,EAAa,QAAA,IAAY,OAAO,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAA,GAAI,MAAA;AACjF,EAAA,MAAM,sBACJ,WAAA,EAAa,QAAA,IAAY,QACzB,MAAA,CAAO,QAAA,CAAS,OAAO,WAAA,CAAY,QAAQ,CAAC,CAAA,IAC5C,MAAA,CAAO,YAAY,QAAQ,CAAA,GAAI,IAC3B,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAA,GAC3B,MAAA;AACN,EAAA,MAAM,gBAAA,GACJ,gBAAgB,WAAA,EAAa,aAAA,IAAiB,OAAO,MAAA,CAAO,WAAA,CAAY,aAAa,CAAA,GAAI,MAAA;AAE3F,EAAA,MAAM,QAAA,GAAWA,WAAW,eAAe,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,mBAAA,CAAoB,EAAE,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,CAAA;AAEnG,EAAA,MAAM,OAAuB,EAAC;AAE9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,eAAe,SAAA,GAAY,CAAA;AAEjC,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,YAAA,GAAe,MAAM,KAAK,kBAAA,CAAmB,EAAE,MAAM,KAAA,EAAO,CAAA,EAAG,YAAA,EAAc,QAAA,EAAU,CAAA;AAAA,IACzF,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,MAAM,aAAa,WAAA,CAAY;AAAA,UAC5C,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AACN,QAAA,YAAA,GAAe,KAAK,WAAA,IAAe,OAAA;AAAA,MACrC;AAAA,IACF;AAEA,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,SAAA,GAAY,MAAM,KAAK,eAAA,CAAgB,EAAE,MAAM,KAAA,EAAO,CAAA,EAAG,YAAA,EAAc,YAAA,EAAc,CAAA;AAAA,IACvF,CAAA,MAAA,IAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,SAAA,GAAY,8BAAA,CAA+B,cAAc,mBAAmB,CAAA;AAAA,IAC9E,CAAA,MAAO;AACL,MAAA,SAAA,GAAY,YAAA,GACRG,kCAAAA,CAAmC,YAAA,EAAc,cAAc,CAAA,GAC/D,YAAA;AAAA,IACN;AAEA,IAAA,IAAI,gBAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,WAAA,GAAc,MAAM,YAAA,CAAa,WAAA,EAAY;AACjD,MAAA,IAAI,YAAA,IAAgB,gBAAA,IAAoB,IAAA,IAAQ,gBAAA,GAAmB,CAAA,EAAG;AACpE,QAAA,WAAA,GAAe,WAAA,GAAc,MAAA,CAAO,GAAA,GAAM,gBAAgB,CAAA,GAAK,IAAA;AAAA,MACjE;AACA,MAAA,IAAI,gBAAgB,WAAA,EAAa,QAAA,IAAY,IAAA,IAAQ,WAAA,CAAY,WAAW,CAAA,EAAG;AAC7E,QAAA,MAAM,aAAa,SAAA,CAAU,mBAAA,CAAoB,OAAO,WAAA,CAAY,QAAQ,CAAC,CAAC,CAAA;AAC9E,QAAA,IAAI,UAAA,GAAa,aAAa,WAAA,GAAc,UAAA;AAAA,MAC9C;AACA,MAAA,UAAA,GAAa,oBAAA,CAAqB;AAAA,QAChC,IAAA,EAAM,QAAA;AAAA,QACN,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,GAAA,EAAK,SAAA;AAAA,QACL,QAAA,EAAU,WAAA;AAAA,QACV,KAAA,EAAO,YAAA;AAAA,QACP;AAAA,OACD,CAAA;AACD,MAAA,gBAAA,GAAmB;AAAA,QACjB,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,UAAU,QAAA,EAAS;AAAA,QAC7B,MAAA,EAAQ,QAAA;AAAA,QACR,QAAA,EAAU,YAAY,QAAA;AAAS,OACjC;AACA,MAAA,WAAA,GAAc,8BAA8B,gBAAgB,CAAA;AAAA,IAC9D,CAAA,MAAO;AACL,MAAA,MAAM,WAAA,GAAc,UAAU,WAAA,IAAe,CAAA;AAC7C,MAAA,MAAM,eAAA,GAAkB,UAAU,eAAA,IAAmB,CAAA;AACrD,MAAA,MAAM,cAAA,GACJ,gBAAgB,WAAA,EAAa,OAAA,IAAW,OAAO,MAAA,CAAO,WAAA,CAAY,OAAO,CAAA,GAAI,CAAA;AAC/E,MAAA,MAAM,kBAAA,GACJ,gBAAgB,WAAA,EAAa,WAAA,IAAe,OAAO,MAAA,CAAO,WAAA,CAAY,WAAW,CAAA,GAAI,CAAA;AACvF,MAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,cAAc,CAAA;AACjE,MAAA,MAAM,wBAAA,GAA2B,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,kBAAkB,CAAA;AAC7E,MAAA,MAAM,oBAAA,GACJ,YAAA,IAAgB,WAAA,EAAa,iBAAA,IAAqB,IAAA,GAC9C,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,WAAA,CAAY,iBAAiB,CAAC,CAAA,GACnD,GAAA;AACN,MAAA,MAAM,iBAAA,GAAqB,uBAAuB,oBAAA,GAAwB,GAAA;AAC1E,MAAA,MAAM,mBAAmB,iBAAA,GAAoB,wBAAA;AAC7C,MAAA,IAAI,oBAAA,GACF,2BAA2B,CAAA,GACvB,SAAA,CAAU,oBAAoB,wBAAwB,CAAC,CAAA,GACvD,SAAA,CAAU,GAAG,CAAA;AACnB,MAAA,IAAI,YAAA,GAAe,SAAA,CAAU,mBAAA,CAAoB,gBAAgB,CAAC,CAAA;AAClE,MAAA,IAAI,YAAA,IAAgB,gBAAA,IAAoB,IAAA,IAAQ,gBAAA,GAAmB,CAAA,EAAG;AACpE,QAAA,oBAAA,GAAwB,oBAAA,GAAuB,MAAA,CAAO,GAAA,GAAM,gBAAgB,CAAA,GAAK,IAAA;AACjF,QAAA,YAAA,GAAgB,YAAA,GAAe,MAAA,CAAO,GAAA,GAAM,gBAAgB,CAAA,GAAK,IAAA;AAAA,MACnE;AACC,MAAA,CAAC,EAAE,YAAA,EAAc,oBAAA,EAAqB,GAAI,8BAAA;AAAA,QACzC,YAAA;AAAA,QACA,oBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,UAAA,GAAa,oBAAA,CAAqB;AAAA,QAChC,IAAA,EAAM,SAAA;AAAA,QACN,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,GAAA,EAAK,SAAA;AAAA,QACL,YAAA;AAAA,QACA,oBAAA;AAAA,QACA,KAAA,EAAO,YAAA;AAAA,QACP;AAAA,OACD,CAAA;AACD,MAAA,gBAAA,GAAmB;AAAA,QACjB,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,UAAU,QAAA,EAAS;AAAA,QAC7B,MAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAc,aAAa,QAAA,EAAS;AAAA,QACpC,oBAAA,EAAsB,qBAAqB,QAAA;AAAS,OACtD;AACA,MAAA,WAAA,GAAc,CAAA,KAAM,CAAA,GAAI,6BAAA,CAA8B,gBAAgB,IAAI,EAAC;AAAA,IAC7E;AAEA,IAAA,MAAM,CAAA,GAAI,UAAU,UAAU,CAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,EAAE,UAAA,CAAW,IAAI,IAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAElD,IAAA,MAAM,cAAA,GAAiB,KAAK,cAAA,CAAe,EAAE,MAAM,KAAA,EAAO,CAAA,EAAG,QAAA,EAAU,SAAA,EAAW,CAAA;AAElF,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,OAAA;AAAA,MACA,QAAQ,CAAA,KAAM,CAAA,IAAK,KAAK,eAAA,IAAmB,IAAA,GAAO,KAAK,eAAA,GAAkB,UAAA;AAAA,MACzE,oBAAoB,IAAA,CAAK,EAAA;AAAA,MACzB,aAAA,EACE,OAAO,cAAA,CAAe,aAAA,KAAkB,QAAA,GACpC,cAAA,CAAe,aAAA,GACf,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,aAAA,IAAiB,EAAE,CAAA;AAAA,MACvD,KAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,CAAA,KAAM,CAAA,GAAI,WAAA,GAAc,EAAC;AAAA,MACtC,gBAAA;AAAA,MACA,QAAA,EAAU,CAAA,KAAM,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ;AAAA,KAClC,CAAA;AAED,IAAA,IAAI,CAAA,KAAM,CAAA,IAAK,IAAA,CAAK,eAAA,IAAmB,IAAA,EAAM;AAC3C,MAAA,IAAA,CAAK,CAAC,CAAA,CAAG,MAAA,GAAS,IAAA,CAAK,eAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,MAAM,YAAqC,EAAC;AAC5C,EAAA,IAAI,gBAAgB,qBAAA,IAAyB,MAAA,CAAO,KAAK,qBAAqB,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1F,IAAA,SAAA,CAAU,qBAAA,GAAwB,qBAAA;AAAA,EACpC;AAEA,EAAA,MAAM,SAAS,iBAAA,CAAkB;AAAA,IAC/B,MAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,kBAAA,EAAoB,OAAO,OAAO,CAAA;AAAA,IAClC,kBAAA,EAAoB,IAAA,CAAK,kBAAA,IAAsB,KAAA,CAAM,CAAC,CAAA,CAAG,EAAA;AAAA,IACzD,IAAA;AAAA,IACA,WAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,GAAS,IAAI,SAAA,GAAY;AAAA,GAC5D,CAAA;AACD,EAAA,MAAM,KAAK,IAAA,CAAK,eAAA;AAChB,EAAA,IAAI,EAAA,IAAM,IAAA,IAAQ,EAAA,GAAK,EAAA,EAAI;AACzB,IAAA,MAAA,CAAO,WAAA,CAAY,KAAA,GAAQ,EAAA,CAAG,QAAA,EAAS;AAAA,EACzC;AACA,EAAA,OAAO,MAAA;AACT;AC7PO,IAAM,kCAAA,GAAsE;AAAA,EACjF,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO;AACT;AAGO,IAAM,8BAAA,GAAkE;AAAA,EAC7E,KAAA,EAAO,KAAA;AAAA,EACP,KAAA,EAAO;AACT;AAEO,SAAS,+BAA+B,OAAA,EAAgC;AAC7E,EAAA,IAAI,CAAC,mBAAA,CAAoB,OAAO,CAAA,EAAG,OAAO,IAAA;AAC1C,EAAA,OAAO,kCAAA,CAAmC,OAAO,CAAA,IAAK,IAAA;AACxD;AAEO,SAAS,2BAA2B,OAAA,EAAgC;AACzE,EAAA,IAAI,CAAC,mBAAA,CAAoB,OAAO,CAAA,EAAG,OAAO,IAAA;AAC1C,EAAA,OAAO,8BAAA,CAA+B,OAAO,CAAA,IAAK,IAAA;AACpD;AAEO,SAAS,yBAAA,CAA0B,QAAgC,OAAA,EAAqC;AAC7G,EAAA,MAAM,GAAA,GAAM,+BAA+B,OAAO,CAAA;AAClD,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,EAAQ,WAAA,EAAY,KAAM,GAAA,CAAI,WAAA,EAAa,CAAA,IAAK,IAAA;AAC9E;AAGO,SAAS,sBAAsB,IAAA,EAGpB;AAChB,EAAA,MAAM,GAAA,GAAA,CAAO,IAAA,CAAK,eAAA,IAAmB,EAAA,EAAI,IAAA,EAAK;AAC9C,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAIH,WAAW,GAAG,CAAA;AACxB,IAAA,IAAI,CAAA,CAAE,WAAA,EAAY,KAAM,4CAAA,IAAgD,KAAK,aAAA,EAAe;AAC1F,MAAA,OAAOA,WAAW,IAAA,CAAK,aAAA,CAAc,IAAA,EAAuB,EAAE,WAAA,EAAY;AAAA,IAC5E;AACA,IAAA,OAAO,EAAE,WAAA,EAAY;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AClCA,IAAMD,QAAAA,GAAUE,aAAAA,CAAcC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC5D,IAAM,EAAE,0BAAA,EAA4B,qCAAA,EAAsC,GAAIH,SAAQ,yBAAyB,CAAA;AAI/G,IAAM,EAAE,0BAAA,EAA4B,qCAAA,EAAsC,GAAIA,SAAQ,yBAAyB,CAAA;AAI/G,IAAM,EAAE,kBAAA,EAAmB,GAAIA,QAAAA,CAAQ,wBAAwB,CAAA;AAG/D,IAAM,EAAE,eAAA,EAAgB,GAAIA,QAAAA,CAAQ,0BAA0B,CAAA;AAC9D,IAAM,EAAE,oBAAA,EAAqB,GAAIA,QAAAA,CAAQ,0BAA0B,CAAA;AAGnE,IAAM,EAAE,eAAA,EAAAK,gBAAAA,EAAgB,GAAIL,SAAQ,6BAA6B,CAAA;AAsBjE,SAASM,UAAS,CAAA,EAAgC;AAChD,EAAA,IAAI,CAAA,IAAK,MAAM,OAAO,MAAA;AACtB,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,IAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,0BAA0B,IAAA,EAMhC;AACD,EAAA,OAAO,kBAAA,CAAmB;AAAA,IACxB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,gBAAA,EAAkB,KAAK,SAAA,CAAU,OAAA;AAAA,IACjC,cAAA,EAAgB,KAAK,eAAA,CAAgB,OAAA;AAAA,IACrC,iBAAiB,IAAA,CAAK,eAAA;AAAA,IACtB,mBAAA,EAAqB,EAAE,SAAA,EAAW,IAAI,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW;AAAA,IAChF,iBAAiB,eAAA,CAAgB;AAAA,GAClC,CAAA;AACH;AAmBA,eAAe,uBAAuB,IAAA,EAON;AAC9B,EAAA,MAAM,SAAS,MAAM,wBAAA,CAAyB,IAAA,CAAK,OAAA,EAAS,KAAK,MAAM,CAAA;AACvE,EAAA,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAEnE,EAAA,MAAM,kBAAkB,MAAM,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,KAAK,eAAe,CAAA;AACxF,EAAA,IAAI,CAAC,iBAAiB,MAAM,IAAI,MAAM,CAAA,gCAAA,EAAmC,IAAA,CAAK,eAAe,CAAA,CAAE,CAAA;AAE/F,EAAA,MAAM,GAAA,GAAM,MAAM,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AACnD,EAAA,MAAM,SAAA,GAAY,eAAA;AAClB,EAAA,MAAM,MAAA,GAAS,KAAK,SAAA,KAAc,MAAA;AAClC,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,YAAY,CAAA;AAE/C,EAAA,MAAM,aAAa,MAAA,CAAO,UAAA;AAC1B,EAAA,MAAM,cAAc,UAAA,CAAW,MAAA;AAC/B,EAAA,MAAM,UAAA,GAAaA,SAAAA,CAAS,WAAA,EAAa,QAAQ,CAAA;AACjD,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,IAAc,IAAI,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAEhG,EAAA,MAAM,gBAAA,GAAmB,qBAAqB,OAAA,EAAS,MAAA,CAAO,WAAW,QAAA,IAAY,EAAE,GAAG,UAAU,CAAA;AACpG,EAAA,MAAM,eAAe,yBAAA,CAA0B;AAAA,IAC7C,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,SAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAiB,GAAA,CAAI,eAAA;AAAA,IACrB,YAAY,GAAA,CAAI;AAAA,GACjB,CAAA;AAED,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,IAAA,CAAK,eAAA,EAAiB,IAAA,EAAK,EAAG;AAChC,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACrC,IAAA,MAAM,SAAA,GAAY,MAAM,GAAA,CAAI,kBAAA,CAAmB,EAAE,SAAS,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAK,EAAG,CAAA;AACvF,IAAA,gBAAA,GAAmB,SAAA,CAAU,IAAA;AAAA,MAC3B,CAAC,CAAA,KACC,MAAA,CAAO,EAAE,aAAA,IAAiB,EAAE,EAAE,WAAA,EAAY,KAAM,OAAO,MAAA,CAAO,kBAAA,IAAsB,EAAE,CAAA,CAAE,WAAA,MACxF,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,KAAM;AAAA,KAC1B;AACA,IAAA,IAAI,oBAAoB,GAAA,CAAI,eAAA,CAAgB,OAAO,MAAA,CAAO,kBAAkB,CAAC,CAAA,EAAG;AAC9E,MAAA,gBAAA,GAAmBD,gBAAAA,CAAgB;AAAA,QACjC,QAAA,EAAU,gBAAA;AAAA,QACV,UAAA,EAAY,MAAA;AAAA,QACZ,kBAAkB,GAAA,CAAI,gBAAA;AAAA,QACtB,gBAAA,EAAkB,MAAA;AAAA,QAClB,iBAAA,EAAmB,KAAA;AAAA,QACnB,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,wBAAwB,MAAM,CAAA;AACrD,EAAA,OAAO;AAAA,IACL,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,MAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,GAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA,EAAkB,0BAA0B,MAAM,CAAA;AAAA,IAClD,kBAAA,EAAoB,MAAA,CAAO,eAAA,CAAgB,QAAA,IAAY,EAAE;AAAA,GAC3D;AACF;AAEA,SAAS,+BAAA,CACP,KACA,gBAAA,EACgG;AAChG,EAAA,MAAM,kBAAkB,0BAAA,CAA2B;AAAA,IACjD,YAAY,GAAA,CAAI,MAAA;AAAA,IAChB,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,wBAAwB,GAAA,CAAI,SAAA;AAAA,IAC5B,iBAAiB,GAAA,CAAI,eAAA;AAAA,IACrB,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,uBAAA,EAAyB,gBAAA;AAAA,IACzB,UAAU,GAAA,CAAI,gBAAA;AAAA,IACd,kBAAkB,GAAA,CAAI,gBAAA;AAAA,IACtB,QAAA,EAAU,aAAA;AAAA,IACV,cAAc,GAAA,CAAI,YAAA;AAAA,IAClB,WAAA,EAAa,EAAA;AAAA,IACb,eAAA,EAAiB,IAAI,GAAA,CAAI,eAAA;AAAA,IACzB,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,iBAAA,EAAmB,MAAA;AAAA,IACnB,uBAAA,EAAyB,MAAA;AAAA,IACzB,iCAAA,EAAmC,KAAA;AAAA,IACnC,gBAAA,EAAkB;AAAA,GACnB,CAAA;AAED,EAAA,MAAM,OAAO,qCAAA,CAAsC;AAAA,IACjD,kBAAkB,GAAA,CAAI,gBAAA;AAAA,IACtB,YAAY,GAAA,CAAI,MAAA;AAAA,IAChB,iBAAiB,GAAA,CAAI,eAAA;AAAA,IACrB,6BAA6B,eAAA,CAAgB,2BAAA;AAAA,IAC7C,cAAc,eAAA,CAAgB,YAAA;AAAA,IAC9B,mBAAmB,eAAA,CAAgB,iBAAA;AAAA,IACnC,oBAAoB,eAAA,CAAgB,kBAAA;AAAA,IACpC,uBAAuB,eAAA,CAAgB,qBAAA;AAAA,IACvC,YAAY,eAAA,CAAgB,UAAA;AAAA,IAC5B,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,iBAAA,EAAmB,KAAA;AAAA,IACnB,gBAAA,EAAkB,IAAI,GAAA,CAAI,gBAAA;AAAA,IAC1B,gBAAA,EAAkB;AAAA,GACnB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,eAAA,EAAiBC,SAAAA,CAAS,IAAA,CAAK,YAAY,CAAA,IAAK,IAAA;AAAA,IAChD,cAAA,EAAgBA,SAAAA,CAAS,IAAA,CAAK,cAAc,CAAA,IAAK,IAAA;AAAA,IACjD,YAAA,EAAcA,SAAAA,CAAS,IAAA,CAAK,YAAY,CAAA,IAAK;AAAA,GAC/C;AACF;AAEA,SAAS,gCAAgC,GAAA,EAAwC;AAC/E,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA;AACxC,EAAA,MAAM,gBAAA,GAAmB,IAAI,eAAA,CAAgB,MAAA;AAC7C,EAAA,MAAM,eAAA,GAAkBA,SAAAA,CAAS,gBAAA,EAAkB,QAAQ,CAAA;AAC3D,EAAA,IAAI,CAAC,eAAA,IAAmB,eAAA,IAAmB,EAAA,EAAI,OAAO,IAAA;AAEtD,EAAA,IAAI,KAAK,oBAAA,CAAqB,GAAA,CAAI,UAAU,EAAA,EAAI,GAAA,CAAI,oBAAoB,eAAe,CAAA;AACvF,EAAA,IAAI,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AAElB,EAAA,MAAM,KAAA,GAAQ,+BAAA,CAAgC,GAAA,EAAK,EAAE,CAAA;AACrD,EAAA,IAAI,KAAA,CAAM,eAAA,IAAmB,IAAA,IAAQ,KAAA,CAAM,kBAAkB,MAAA,EAAQ;AACnE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,EAAA,GAAK,EAAA;AACT,EAAA,OAAO,KAAK,EAAA,EAAI;AACd,IAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,EAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,GAAA;AAChC,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,+BAAA,CAAgC,KAAK,KAAK,CAAA;AACtE,IAAA,IAAI,eAAA,IAAmB,IAAA,IAAQ,eAAA,IAAmB,MAAA,EAAQ;AACxD,MAAA,EAAA,GAAK,KAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,EAAA,GAAK,KAAA,GAAQ,EAAA;AAAA,IACf;AAAA,EACF;AACA,EAAA,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACxB;AAEA,eAAsB,2BAA2B,IAAA,EAQnB;AAC5B,EAAA,MAAM,GAAA,GAAM,MAAM,sBAAA,CAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,IAAA,CAAK,qBAAA,EAAuB,IAAI,kBAAkB,CAAA;AAC/F,EAAA,MAAM,EAAE,eAAA,EAAiB,cAAA,EAAgB,cAAa,GAAI,+BAAA,CAAgC,KAAK,gBAAgB,CAAA;AAE/G,EAAA,MAAM,KAAA,GAAQ,eAAe,cAAc,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,eAAe,YAAY,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,qBAAqB,eAAe,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,gCAAgC,GAAG,CAAA;AAClD,EAAA,MAAM,2BACJ,MAAA,IAAU,IAAA,GAAO,0BAA0B,MAAA,EAAQ,GAAA,CAAI,kBAAkB,CAAA,GAAI,IAAA;AAC/E,EAAA,MAAM,qBACH,eAAA,IAAmB,IAAA,IAAQ,kBAAkB,MAAA,IAC7C,MAAA,IAAU,QAAQ,gBAAA,GAAmB,MAAA;AAExC,EAAA,OAAO;AAAA,IACL,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAAA,IAC/B,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,IAAA,EAAK;AAAA,IACrC,gBAAA,EAAkB,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAK;AAAA,IAC5C,qBAAA,EAAuB,IAAA,CAAK,qBAAA,CAAsB,IAAA,EAAK;AAAA,IACvD,wBAAA,EAA0B,IAAA;AAAA,IAC1B,wBAAA,EAA0B,IAAA;AAAA,IAC1B,aAAA,EAAe,KAAA;AAAA,IACf,mBAAA,EAAqB,GAAA;AAAA,IACrB,aAAA,EAAe,GAAA;AAAA,IACf,kBAAkB,GAAA,CAAI,gBAAA;AAAA,IACtB,wBAAA;AAAA,IACA,kBAAA;AAAA,IACA,IAAA,EAAM,GAAA,CAAI,gBAAA,GAAmB,+CAAA,GAAkD;AAAA,GACjF;AACF;AAOA,eAAe,wBAAwB,IAAA,EAKpC;AACD,EAAA,MAAM,SAAS,MAAM,wBAAA,CAAyB,IAAA,CAAK,OAAA,EAAS,KAAK,MAAM,CAAA;AACvE,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,MAAM,MAAA,GAAS,KAAK,SAAA,KAAc,MAAA;AAClC,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACrC,EAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,kBAAA,CAAmB,EAAE,SAAS,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAK,EAAG,CAAA;AAC1F,EAAA,OAAO,YAAA,CAAa,IAAA;AAAA,IAClB,CAAC,CAAA,KACC,MAAA,CAAO,EAAE,aAAA,IAAiB,EAAE,EAAE,WAAA,EAAY,KAAM,OAAO,MAAA,CAAO,kBAAA,IAAsB,EAAE,CAAA,CAAE,WAAA,MACxF,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,KAAM;AAAA,GAC1B;AACF;AAEA,eAAsB,yBAAyB,IAAA,EAKd;AAC/B,EAAA,MAAM,GAAA,GAAM,MAAM,uBAAA,CAAwB,IAAI,CAAA;AAC9C,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,EAAE,wBAAA,EAA0B,IAAA,EAAM,wBAAA,EAA0B,IAAA,EAAK;AAAA,EAC1E;AACA,EAAA,MAAM,YAAY,GAAA,CAAI,SAAA;AACtB,EAAA,OAAO;AAAA,IACL,wBAAA,EAA0B,yBAAyB,SAAS,CAAA;AAAA,IAC5D,wBAAA,EAA0B,eAAe,SAAS;AAAA,GACpD;AACF;AAEA,eAAsB,2BAA2B,IAAA,EAOnB;AAC5B,EAAA,MAAM,SAAS,MAAM,wBAAA,CAAyB,IAAA,CAAK,OAAA,EAAS,KAAK,MAAM,CAAA;AACvE,EAAA,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAEnE,EAAA,MAAM,kBAAkB,MAAM,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,KAAK,eAAe,CAAA;AACxF,EAAA,IAAI,CAAC,iBAAiB,MAAM,IAAI,MAAM,CAAA,gCAAA,EAAmC,IAAA,CAAK,eAAe,CAAA,CAAE,CAAA;AAE/F,EAAA,MAAM,GAAA,GAAM,MAAM,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AACnD,EAAA,MAAM,MAAA,GAAS,KAAK,SAAA,KAAc,MAAA;AAClC,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,IAAA,CAAK,YAAY,CAAA;AAEpD,EAAA,MAAM,GAAA,GAAM,MAAM,uBAAA,CAAwB;AAAA,IACxC,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,iBAAiB,IAAA,CAAK;AAAA,GACvB,CAAA;AAED,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO;AAAA,MACL,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAAA,MAC/B,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,IAAA,EAAK;AAAA,MACrC,gBAAA,EAAkB,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAK;AAAA,MAC5C,qBAAA,EAAuB,IAAA;AAAA,MACvB,wBAAA,EAA0B,IAAA;AAAA,MAC1B,wBAAA,EAA0B,IAAA;AAAA,MAC1B,aAAA,EAAe,IAAA;AAAA,MACf,mBAAA,EAAqB,IAAA;AAAA,MACrB,aAAA,EAAe,IAAA;AAAA,MACf,gBAAA,EAAkB,0BAA0B,MAAM,CAAA;AAAA,MAClD,wBAAA,EAA0B,IAAA;AAAA,MAC1B,kBAAA,EAAoB,KAAA;AAAA,MACpB,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,GAAA,CAAI,SAAA;AACtB,EAAA,MAAM,wBAAA,GAA2B,yBAAyB,SAAS,CAAA;AACnE,EAAA,MAAM,wBAAA,GAA2B,eAAe,SAAS,CAAA;AAEzD,EAAA,MAAM,WAAWD,gBAAAA,CAAgB;AAAA,IAC/B,QAAA,EAAU,GAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,kBAAkB,GAAA,CAAI,gBAAA;AAAA,IACtB,gBAAA,EAAkB,MAAA;AAAA,IAClB,iBAAA,EAAmB,KAAA;AAAA,IACnB,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,kBAAkB,0BAAA,CAA2B;AAAA,IACjD,UAAA,EAAY,MAAA;AAAA,IACZ,eAAA,EAAiB,SAAS,eAAA,IAAmB,eAAA;AAAA,IAC7C,MAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA,EAAc,KAAA;AAAA,IACd,gBAAA,EAAkB,MAAA;AAAA,IAClB,kBAAkB,GAAA,CAAI,gBAAA;AAAA,IACtB,kBAAA,EAAoB,EAAA;AAAA,IACpB,WAAA,EAAa,EAAA;AAAA,IACb,iCAAA,EAAmC;AAAA,GACpC,CAAA;AAED,EAAA,MAAM,OAAO,qCAAA,CAAsC;AAAA,IACjD,gBAAA,EAAkB,QAAA;AAAA,IAClB,UAAA,EAAY,MAAA;AAAA,IACZ,eAAA,EAAiB,SAAS,eAAA,IAAmB,eAAA;AAAA,IAC7C,cAAc,eAAA,CAAgB,YAAA;AAAA,IAC9B,mBAAmB,eAAA,CAAgB,iBAAA;AAAA,IACnC,aAAa,eAAA,CAAgB,WAAA;AAAA,IAC7B,cAAc,eAAA,CAAgB,YAAA;AAAA,IAC9B,oBAAoB,eAAA,CAAgB,kBAAA;AAAA,IACpC,uBAAuB,eAAA,CAAgB,qBAAA;AAAA,IACvC,6BAA6B,eAAA,CAAgB,2BAAA;AAAA,IAC7C,gCAAgC,eAAA,CAAgB,8BAAA;AAAA,IAChD,mCAAmC,eAAA,CAAgB,iCAAA;AAAA,IACnD,iBAAA,EAAmB,KAAA;AAAA,IACnB,MAAA;AAAA,IACA,kBAAkB,GAAA,CAAI,gBAAA;AAAA,IACtB,gBAAA,EAAkB;AAAA,GACnB,CAAA;AAED,EAAA,MAAM,QAAA,GAAWC,SAAAA,CAAS,IAAA,CAAK,WAAW,CAAA,IAAK,EAAA;AAC/C,EAAA,MAAM,GAAA,GACJ,WAAW,EAAA,GAAK,cAAA,CAAeA,UAAS,IAAA,CAAK,YAAY,CAAC,CAAA,GAAI,IAAA;AAChE,EAAA,MAAM,GAAA,GAAM,WAAW,EAAA,GAAK,oBAAA,CAAqBA,UAAS,IAAA,CAAK,YAAY,CAAC,CAAA,GAAI,IAAA;AAEhF,EAAA,MAAM,YAAY,QAAA,IAAY,EAAA;AAC9B,EAAA,OAAO;AAAA,IACL,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAAA,IAC/B,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,IAAA,EAAK;AAAA,IACrC,gBAAA,EAAkB,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAK;AAAA,IAC5C,qBAAA,EAAuB,IAAA;AAAA,IACvB,wBAAA;AAAA,IACA,wBAAA;AAAA,IACA,aAAA,EAAe,cAAA,CAAeA,SAAAA,CAAS,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,IAC3D,mBAAA,EAAqB,GAAA;AAAA,IACrB,aAAA,EAAe,GAAA;AAAA,IACf,gBAAA,EAAkB,0BAA0B,MAAM,CAAA;AAAA,IAClD,wBAAA,EAA0B,IAAA;AAAA,IAC1B,kBAAA,EAAoB,KAAA;AAAA,IACpB,IAAA,EAAM,YACF,2DAAA,GACA;AAAA,GACN;AACF;AAEA,eAAsB,wCAAwC,IAAA,EAQ5C;AAChB,EAAA,MAAM,QAAA,GAAW,MAAM,0BAAA,CAA2B,IAAI,CAAA;AACtD,EAAA,IAAI,CAAC,SAAS,kBAAA,EAAoB;AAClC,EAAA,MAAM,MAAA,GAAS,SAAS,gBAAA,IAAoB,YAAA;AAC5C,EAAA,MAAM,SAAS,QAAA,CAAS,wBAAA;AACxB,EAAA,MAAM,MAAM,QAAA,CAAS,gBAAA;AACrB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,0BAAA,EAA6B,MAAM,CAAA,iBAAA,EAAoB,QAAA,CAAS,YAAY,CAAA,gBAAA,EAAmB,MAAM,IAAI,GAAG,CAAA,CAAA;AAAA,KAC9G;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,0BAAA,EAA6B,MAAM,CAAA,iBAAA,EAAoB,QAAA,CAAS,YAAY,CAAA,qCAAA;AAAA,GAC9E;AACF;AAGO,SAAS,6BAA6B,IAAA,EAGjC;AACV,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,CAAK,iBAAiB,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,CAAK,wBAAwB,CAAA;AACxD,IAAA,OAAO,KAAA,GAAQ,MAAM,KAAA,IAAS,IAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACzcA,IAAM,sBAAA,GAAyB,QAAA;AAC/B,IAAM,yBAAA,GAA4B,OAAA;AAClC,IAAM,0BAAA,GAA6B,OAAA;AAEnC,IAAM,cAAA,GAAiB,QAAA,CAAS,CAAC,4BAA4B,CAAC,CAAA;AAC9D,IAAM,oBAAoB,QAAA,CAAS;AAAA,EACjC;AACF,CAAC,CAAA;AACD,IAAM,eAAA,GAAkB,QAAA,CAAS,CAAC,kEAAkE,CAAC,CAAA;AA+CrG,SAAS,cAAc,OAAA,EAAwD;AAC7E,EAAA,IAAI,CAAC,OAAA,EAAS,EAAA,IAAM,CAAC,SAAS,IAAA,EAAM;AAClC,IAAA,MAAM,IAAI,MAAM,yEAAyE,CAAA;AAAA,EAC3F;AACA,EAAA,MAAM,EAAA,GAAKL,UAAAA,CAAW,OAAA,CAAQ,EAAA,CAAG,MAAuB,CAAA;AACxD,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAS;AAClC,EAAA,MAAM,OAAQ,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA,GAAM,KAAK,GAAG,CAAA,CAAA;AACnD,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,OAAA,CAAQ,SAAS,IAAA,EAAM;AACzB,IAAA,KAAA,GAAQ,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,GAAW,OAAA,CAAQ,QAAQ,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAC1F;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,aAAa,sBAAA,EAAuB;AAChE;AAEA,eAAe,+BAA+B,IAAA,EAQrB;AACvB,EAAA,MAAM,IAAA,GAAOA,UAAAA,CAAW,IAAA,CAAK,aAAa,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAWA,UAAAA,CAAW,IAAA,CAAK,eAAe,CAAA;AAChD,EAAA,MAAM,MAAA,GAASA,UAAAA,CAAW,IAAA,CAAK,cAAc,CAAA;AAC7C,EAAA,MAAM,QAAQ,MAAM,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,KAAK,eAAe,CAAA;AAC9E,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,IAAA,CAAK,qBAAA,EAAuB,MAAM,QAAQ,CAAA;AAChF,EAAA,IAAI,SAAA,KAAc,EAAA,EAAI,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAEvG,EAAA,MAAM,KAAKM,WAAAA,CAAY;AAAA,IACrB,IAAI,IAAA,CAAK,OAAA;AAAA,IACT,IAAA,EAAM,aAAA;AAAA,IACN,gBAAgB,EAAE,QAAA,EAAU,IAAI,IAAA,EAAM,QAAA,EAAU,QAAQ,GAAA,EAAI;AAAA,IAC5D,OAAA,EAAS,EAAE,OAAA,EAAS,EAAE,MAAM,CAAC,IAAA,CAAK,MAAM,CAAA,EAAE;AAAE,GAC7C,CAAA;AACD,EAAA,MAAM,YAAA,GAAeC,kBAAAA,CAAmB,EAAE,KAAA,EAAO,EAAA,EAAI,WAAWC,IAAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG,CAAA;AAEnF,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,EAAE,GAAA,EAAK,cAAA,EAAgB,cAAc,SAAA,EAAW,IAAA,EAAM,EAAC,EAAG,CAAA;AACjG,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,aAAa,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,yBAAA,EAA2B,CAAA;AAEpG,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,IAChD,OAAA,EAAS,IAAA;AAAA,IACT,GAAA,EAAK,iBAAA;AAAA,IACL,YAAA,EAAc,WAAA;AAAA,IACd,IAAA,EAAM,CAAC,QAAA,EAAU,MAAM;AAAA,GACxB,CAAA;AACD,EAAA,IAAI,YAAY,SAAA,EAAW;AACzB,IAAA,IAAI,YAAY,EAAA,EAAI;AAClB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,EAAA,EAAI,IAAA;AAAA,QACJ,IAAA,EAAM,kBAAA,CAAmB,EAAE,GAAA,EAAK,eAAA,EAAiB,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,CAAC,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA;AAAA,QAC9F,KAAA,EAAO,EAAA;AAAA,QACP,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AACA,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,EAAA,EAAI,IAAA;AAAA,MACJ,IAAA,EAAM,kBAAA,CAAmB,EAAE,GAAA,EAAK,eAAA,EAAiB,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,EAAG,CAAA;AAAA,MACrG,KAAA,EAAO,EAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH;AACA,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,sCACb,MAAA,EACA,QAAA,EACA,aAAA,EACA,SAAA,GAAyB,EAAC,EAC1B;AACA,EAAA,MAAM,QAAA,GAAWR,UAAAA,CAAW,MAAA,CAAO,eAAe,CAAA;AAClD,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,QAAA,CAAS,OAAO,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,SAAA,EAAW,SAAS,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,GAAI,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,SAAA,CAAU,IAAA;AAEvF,EAAA,OAAO,sBAAA,CAAuB;AAAA,IAC5B,OAAA,EAAS;AAAA,MACP,aAAA,EAAe,KAAA;AAAA,MACf,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,eAAA,EAAiB,QAAA;AAAA,MACjB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,uBAAuB,MAAA,CAAO;AAAA,KAChC;AAAA,IACA,KAAA;AAAA,IACA,aAAA,EAAe,+DAAA;AAAA,IACf,eAAA,EAAiB,QAAA;AAAA,IACjB,oBAAoB,SAAA,CAAU,EAAA;AAAA,IAC9B,eAAA,EAAiB,OAAO,EAAE,YAAA,EAAc,OAAM,KAAM;AAClD,MAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,IAAe,sBAAA;AACtC,MAAA,OAAO,YAAA,GAAe,WAAW,YAAA,GAAe,QAAA;AAAA,IAClD,CAAA;AAAA,IACA,cAAA,EAAgB,CAAC,EAAE,KAAA,EAAM,KAAM;AAC7B,MAAA,IAAI,KAAA,GAAQ,UAAU,MAAA,EAAQ;AAC5B,QAAA,MAAM,IAAA,GAAO,UAAU,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,EAAG,KAAA,GAAQ,KAAK,cAAA,GAAiB,SAAA;AACxE,QAAA,OAAO;AAAA,UACL,aAAA,EAAe,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,OAAO,IAAA,EAAM,IAAA,EAAM,GAAG,aAAA,EAAe,CAAA;AAAA,UAC3E,GAAA,EAAK,EAAE,IAAA,EAAM,IAAA,KAAS,cAAA,GAAiB,kBAAA,GAAqB,mBAAA,EAAqB,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAE,SAC/H;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,KAAK,SAAA,CAAU;AAAA,UAC5B,IAAA,EAAM,KAAA;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,GAAG;AAAA,SACJ,CAAA;AAAA,QACD,GAAA,EAAK,EAAE,IAAA,EAAM,mBAAA,EAAqB,OAAA,EAAS,GAAG,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAE,OAChF;AAAA,IACF;AAAA,GACD,CAAA;AACH;AAEA,eAAe,eAAA,CAAgB,eAAA,EAAyB,qBAAA,EAA+B,OAAA,EAAiB;AACtG,EAAA,MAAM,KAAA,GAAQ,MAAM,uBAAA,CAAwB,OAAA,EAAS,eAAe,CAAA;AACpE,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,qBAAA,EAAuB,KAAA,CAAM,QAAQ,CAAA;AACxE,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,MAAA,EAAO;AACvC;AAEA,SAAS,+BAA+B,IAAA,EAAoC;AAC1E,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,MAAM,OAAA,GAAU,8BAAA,CAA+B,IAAA,CAAK,OAAO,CAAA;AAC3D,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,oEAAoE,CAAA;AAClG,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,gBAAgB,IAAA,EAAK;AACnC;AAEA,eAAsB,sCAAsC,IAAA,EAA4B;AACtF,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACrC,EAAA,MAAM,QAAA,GAAWA,UAAAA,CAAW,IAAA,CAAK,eAAe,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,CAAK,YAAY,CAAA;AAC5C,EAAA,MAAM,gBAAA,GAAmB,+BAA+B,IAAI,CAAA;AAC5D,EAAA,MAAM,uCAAA,CAAwC;AAAA,IAC5C,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAAA,IACzB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,eAAA,EAAiB,gBAAA;AAAA,IACjB,uBAAuB,IAAA,CAAK,qBAAA;AAAA,IAC5B,eAAA,EAAiB;AAAA,GAClB,CAAA;AACD,EAAA,MAAM,qBAAqB,MAAM,eAAA,CAAgB,kBAAkB,IAAA,CAAK,qBAAA,EAAuB,KAAK,OAAO,CAAA;AAE3G,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,EAAe,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAC7F,IAAA,MAAM,OAAA,GAAU,8BAAA,CAA+B,IAAA,CAAK,OAAO,CAAA;AAC3D,IAAA,IAAI,gBAAA,CAAiB,WAAA,EAAY,KAAM,OAAA,EAAS,aAAY,EAAG;AAC7D,MAAA,MAAM,IAAI,MAAM,qEAAqE,CAAA;AAAA,IACvF;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAuC;AAAA,IAC3C,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAAA,IACzB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,IAAA;AAAA,IACA,eAAA,EAAiB,gBAAA;AAAA,IACjB,eAAA,EAAiB,kBAAA;AAAA,IACjB,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AACA,EAAA,IAAI,IAAA,CAAK,cAAc,OAAA,EAAS;AAC9B,IAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB,IAAA,IAAQ,MAAM,IAAI,MAAM,4CAA4C,CAAA;AACpG,IAAA,WAAA,CAAY,YAAA,GAAe,aAAA,CAAc,IAAA,CAAK,oBAAoB,CAAA;AAAA,EACpE;AACA,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,EAAM,WAAA,CAAY,WAAW,IAAA,CAAK,WAAA;AAC1D,EAAA,IAAI,IAAA,CAAK,qBAAA,IAAyB,IAAA,EAAM,WAAA,CAAY,wBAAwB,IAAA,CAAK,qBAAA;AAEjF,EAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAa,WAAW,CAAA;AACnD,EAAA,IAAI,QAAA,CAAS,gBAAgB,aAAA,EAAe;AAC1C,IAAA,MAAM,IAAI,MAAM,iFAAiF,CAAA;AAAA,EACnG;AAEA,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,QAAA,CAAS,OAAO,CAAA;AAEhD,EAAA,IAAI,YAAyB,EAAC;AAC9B,EAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,aAAA,EAAe;AACzC,IAAA,SAAA,GAAY,MAAM,8BAAA,CAA+B;AAAA,MAC/C,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,eAAA,EAAiB,QAAA;AAAA,MACjB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,eAAA,EAAiB,gBAAA;AAAA,MACjB,uBAAuB,IAAA,CAAK,qBAAA;AAAA,MAC5B,gBAAgB,SAAA,CAAU;AAAA,KAC3B,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,qCAAA;AAAA,IACL,IAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,UAAA;AAAA,MACR,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,eAAA,EAAiB,gBAAA;AAAA,MACjB,uBAAuB,IAAA,CAAK,qBAAA;AAAA,MAC5B,UAAA,EAAY,OAAA,CAAQ,IAAA,CAAK,UAAU;AAAA,KACrC;AAAA,IACA;AAAA,GACF;AACF;AAEA,eAAsB,sCAAsC,IAAA,EAA4B;AACtF,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACrC,EAAA,MAAM,QAAA,GAAWA,UAAAA,CAAW,IAAA,CAAK,eAAe,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,CAAK,YAAY,CAAA;AAE5C,EAAA,MAAM,WAAA,GAAuC;AAAA,IAC3C,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAAA,IACzB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,IAAA;AAAA,IACA,eAAA,EAAiB,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAK;AAAA,IAC3C,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AACA,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,MAAM,SAAA,GAAY,0BAAA,CAA2B,IAAA,CAAK,OAAO,CAAA;AACzD,IAAA,IAAI,CAAC,SAAA,EAAW,MAAM,IAAI,MAAM,yDAAyD,CAAA;AACzF,IAAA,WAAA,CAAY,YAAA,GAAe,SAAA;AAAA,EAC7B,CAAA,MAAA,IAAW,IAAA,CAAK,YAAA,EAAc,IAAA,EAAK,EAAG;AACpC,IAAA,WAAA,CAAY,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,IAAA,EAAK;AAAA,EACpD;AACA,EAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,IAAA,EAAM,WAAA,CAAY,eAAe,IAAA,CAAK,YAAA;AAC/D,EAAA,IAAI,IAAA,CAAK,cAAc,OAAA,EAAS;AAC9B,IAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB,IAAA,IAAQ,MAAM,IAAI,MAAM,4CAA4C,CAAA;AACpG,IAAA,WAAA,CAAY,YAAA,GAAe,aAAA,CAAc,IAAA,CAAK,oBAAoB,CAAA;AAAA,EACpE;AACA,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,EAAM,WAAA,CAAY,WAAW,IAAA,CAAK,WAAA;AAC1D,EAAA,IAAI,IAAA,CAAK,qBAAA,IAAyB,IAAA,EAAM,WAAA,CAAY,wBAAwB,IAAA,CAAK,qBAAA;AAEjF,EAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAa,WAAW,CAAA;AACnD,EAAA,IAAI,QAAA,CAAS,gBAAgB,aAAA,EAAe;AAC1C,IAAA,MAAM,IAAI,MAAM,iFAAiF,CAAA;AAAA,EACnG;AAEA,EAAA,OAAO,qCAAA,CAAsC,MAAM,QAAA,EAAU;AAAA,IAC3D,MAAA,EAAQ,UAAA;AAAA,IACR,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,iBAAiB,IAAA,CAAK,eAAA;AAAA,IACtB,WAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,WAAW;AAAA,GACtC,CAAA;AACH;AAGO,IAAM,0CAAA,GAA6C;AAGnD,IAAM,0CAAA,GAA6C;AAE1D,eAAsB,oCAAoC,IAAA,EAA0B;AAClF,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACrC,EAAA,MAAM,QAAA,GAAWA,UAAAA,CAAW,IAAA,CAAK,eAAe,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK;AAClC,EAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAE1E,EAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,kBAAA,CAAmB;AAAA,IAC5C,OAAA;AAAA,IACA,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACP,CAAA;AACD,EAAA,IAAI,QAAA,CAAS,gBAAgB,aAAA,EAAe;AAC1C,IAAA,MAAM,IAAI,MAAM,uFAAuF,CAAA;AAAA,EACzG;AAEA,EAAA,OAAO,qCAAA,CAAsC,MAAM,QAAA,EAAU;AAAA,IAC3D,MAAA,EAAQ,QAAA;AAAA,IACR;AAAA,GACD,CAAA;AACH;AC5VA,IAAMD,QAAAA,GAAUE,aAAAA,CAAcC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC5D,IAAM;AAAA,EACJ,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,kCAAA;AAAA,EACA,mCAAA;AAAA,EACA;AACF,CAAA,GAAIH,SAAQ,+BAA+B,CAAA;AAQ3C,IAAM,EAAE,WAAA,EAAY,GAAIA,QAAAA,CAAQ,2BAA2B,CAAA;AAG3D,IAAM;AAAA,EACJ,8BAAA;AAAA,EACA;AACF,CAAA,GAAIA,SAAQ,wBAAwB,CAAA;AAiBpC,IAAM,YAAA,GAAeU,QAAAA,CAAS,CAAC,sDAAsD,CAAC,CAAA;AAWtF,IAAM,cAAA,uBAAqB,GAAA,EAA0B;AAErD,eAAe,gBAAA,CAAiB,SAAiB,MAAA,EAAuC;AACtF,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AACzC,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,OAAA,EAAS,WAAW,CAAA;AACzD,EAAA,MAAM,KAAKH,WAAAA,CAAY;AAAA,IACrB,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,gBAAgB,EAAE,QAAA,EAAU,IAAI,IAAA,EAAM,QAAA,EAAU,QAAQ,GAAA,EAAI;AAAA,IAC5D,OAAA,EAAS,EAAE,OAAA,EAAS,EAAE,MAAM,CAAC,MAAM,GAAE;AAAE,GACxC,CAAA;AACD,EAAA,MAAM,YAAA,GAAeC,mBAAmB,EAAE,KAAA,EAAO,IAAI,SAAA,EAAWC,IAAAA,CAAK,MAAM,CAAA,EAAG,CAAA;AAE9E,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,CAAC,cAAA,EAAgB,kBAAA,EAAoB,CAAA;AAAA,IACrC,CAAC,sBAAA,EAAwB,qBAAA,EAAuB,CAAA;AAAA,IAChD,CAAC,YAAA,EAAc,qBAAA,EAAuB,CAAA;AAAA,IACtC,CAAC,6BAA6B,kCAAkC,CAAA;AAAA,IAChE,CAAC,iCAAiC,kCAAkC,CAAA;AAAA,IACpE,CAAC,gCAAgC,mCAAmC;AAAA,GACtE;AAEA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,YAAA,EAAc,EAAA;AAAA,IACd,oBAAA,EAAsB,EAAA;AAAA,IACtB,UAAA,EAAY,EAAA;AAAA,IACZ,yBAAA,EAA2B,EAAA;AAAA,IAC3B,6BAAA,EAA+B,EAAA;AAAA,IAC/B,4BAAA,EAA8B;AAAA,GAChC;AAEA,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,KAAK,GAAA,CAAI,OAAO,CAAC,KAAA,EAAO,GAAG,CAAA,KAAM;AAC/B,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,QAC5C,OAAA,EAAS,SAAA;AAAA,QACT,GAAA,EAAK,YAAA;AAAA,QACL,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,CAAC,GAAG;AAAA,OACX,CAAA;AACD,MAAA,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA;AAAA,IAClB,CAAC;AAAA,GACH;AAEA,EAAA,cAAA,CAAe,GAAA,CAAI,SAAS,MAAM,CAAA;AAClC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,4BAA4B,IAAA,EAM1B;AACT,EAAA,MAAM,EAAE,SAAA,EAAW,iBAAA,EAAmB,QAAA,EAAU,gBAAA,EAAkB,WAAU,GAAI,IAAA;AAChF,EAAA,IAAI,WAAW,SAAA,CAAU,yBAAA;AACzB,EAAA,QAAA,IAAY,UAAU,6BAAA,GAAgC,gBAAA;AACtD,EAAA,MAAM,aAAa,SAAA,CAAU,4BAAA;AAC7B,EAAA,QAAA,IAAY,WAAA,CAAY,mBAAmB,UAAU,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,QAAA,GAAY,QAAA,GAAW,MAAA,CAAO,SAAS,CAAA,GAAK,MAAA;AAC7D,EAAA,OAAO,QAAA,GAAW,QAAA;AACpB;AAEA,IAAM,gCAAA,GAAmC,GAAA;AAEzC,eAAsB,0BAA0B,IAAA,EAK5B;AAClB,EAAA,MAAM,SAAA,GAAY,KAAK,qBAAA,IAAyB,gCAAA;AAChD,EAAA,MAAM,YAAY,MAAM,gBAAA,CAAiB,IAAA,CAAK,OAAA,EAAS,KAAK,MAAM,CAAA;AAClE,EAAA,MAAM,KAAKF,WAAAA,CAAY;AAAA,IACrB,IAAI,IAAA,CAAK,OAAA;AAAA,IACT,IAAA,EAAM,aAAA;AAAA,IACN,gBAAgB,EAAE,QAAA,EAAU,IAAI,IAAA,EAAM,QAAA,EAAU,QAAQ,GAAA,EAAI;AAAA,IAC5D,OAAA,EAAS,EAAE,OAAA,EAAS,EAAE,MAAM,CAAC,IAAA,CAAK,MAAM,CAAA,EAAE;AAAE,GAC7C,CAAA;AACD,EAAA,MAAM,YAAA,GAAeC,kBAAAA,CAAmB,EAAE,KAAA,EAAO,EAAA,EAAI,WAAWC,IAAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG,CAAA;AACnF,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,WAAA,EAAY;AAEhD,EAAA,MAAM,gBAAA,GAAmB,EAAA;AACzB,EAAA,MAAM,iBAAA,GACJ,KAAK,SAAA,KAAc,SAAA,GACf,+BAA+B,SAAA,EAAW,EAAE,YAAY,CAAA,EAAG,gBAAA,EAAkB,IAAI,CAAA,GACjF,kCAAkC,SAAA,EAAW,EAAE,YAAY,EAAA,EAAI,gBAAA,EAAkB,IAAI,CAAA;AAE3F,EAAA,OAAO,2BAAA,CAA4B;AAAA,IACjC,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAEO,SAAS,cAAA,GAA0B;AACxC,EAAA,OAAO,4CAAA;AACT;;;AC7IA,IAAMT,QAAAA,GAAUE,aAAAA,CAAcC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC5D,IAAM,iBAAA,GAAoBH,QAAAA,CAAQ,iCAAiC,CAAA,CAAE,OAAA;AAErE,IAAM,yBAAA,GAA4B,QAAA;AAClC,IAAMW,0BAAAA,GAA4B,OAAA;AAClC,IAAMC,2BAAAA,GAA6B,OAAA;AAEnC,IAAMC,eAAAA,GAAiBH,QAAAA,CAAS,CAAC,4BAA4B,CAAC,CAAA;AAC9D,IAAMI,qBAAoBJ,QAAAA,CAAS;AAAA,EACjC;AACF,CAAC,CAAA;AACD,IAAMK,gBAAAA,GAAkBL,QAAAA,CAAS,CAAC,kEAAkE,CAAC,CAAA;AA8BrG,eAAe,0BAA0B,IAAA,EAOhB;AACvB,EAAA,MAAM,KAAKH,WAAAA,CAAY;AAAA,IACrB,IAAI,IAAA,CAAK,OAAA;AAAA,IACT,IAAA,EAAM,aAAA;AAAA,IACN,gBAAgB,EAAE,QAAA,EAAU,IAAI,IAAA,EAAM,QAAA,EAAU,QAAQ,GAAA,EAAI;AAAA,IAC5D,OAAA,EAAS,EAAE,OAAA,EAAS,EAAE,MAAM,CAAC,IAAA,CAAK,MAAM,CAAA,EAAE;AAAE,GAC7C,CAAA;AACD,EAAA,MAAM,YAAA,GAAeC,kBAAAA,CAAmB,EAAE,KAAA,EAAO,EAAA,EAAI,WAAWC,IAAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG,CAAA;AACnF,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,IAChD,SAAS,IAAA,CAAK,KAAA;AAAA,IACd,GAAA,EAAKK,kBAAAA;AAAA,IACL,YAAA,EAAc,WAAA;AAAA,IACd,IAAA,EAAM,CAAC,IAAA,CAAK,eAAA,EAAiB,KAAK,OAAO;AAAA,GAC1C,CAAA;AACD,EAAA,IAAI,SAAA,IAAa,IAAA,CAAK,SAAA,EAAW,OAAO,EAAC;AACzC,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,IAAI,YAAY,EAAA,EAAI;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAI,IAAA,CAAK,KAAA;AAAA,MACT,IAAA,EAAME,kBAAAA,CAAmB,EAAE,GAAA,EAAKD,gBAAAA,EAAiB,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,CAAC,IAAA,CAAK,OAAA,EAAS,EAAE,GAAG,CAAA;AAAA,MACpG,KAAA,EAAO,EAAA;AAAA,MACP,WAAA,EAAaH;AAAA,KACd,CAAA;AAAA,EACH;AACA,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,IAAI,IAAA,CAAK,KAAA;AAAA,IACT,IAAA,EAAMI,kBAAAA,CAAmB,EAAE,GAAA,EAAKD,kBAAiB,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,IAChH,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAaH;AAAA,GACd,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,yBAAyB,IAAA,EAOf;AACvB,EAAA,MAAM,IAAA,GAAOX,UAAAA,CAAW,IAAA,CAAK,aAAa,CAAA;AAC1C,EAAA,MAAM,MAAA,GAASA,UAAAA,CAAW,IAAA,CAAK,cAAc,CAAA;AAC7C,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,EAAA,EAAI,IAAA;AAAA,IACJ,IAAA,EAAMe,kBAAAA,CAAmB,EAAE,GAAA,EAAKH,eAAAA,EAAgB,cAAc,SAAA,EAAW,IAAA,EAAM,EAAC,EAAG,CAAA;AAAA,IACnF,OAAO,IAAA,CAAK,SAAA;AAAA,IACZ,WAAA,EAAaF;AAAA,GACd,CAAA;AACD,EAAA,MAAM,YAAA,GAAe,MAAM,yBAAA,CAA0B;AAAA,IACnD,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,iBAAiB,IAAA,CAAK,eAAA;AAAA,IACtB,KAAA,EAAO,IAAA;AAAA,IACP,OAAA,EAAS,MAAA;AAAA,IACT,WAAW,IAAA,CAAK;AAAA,GACjB,CAAA;AACD,EAAA,KAAA,CAAM,IAAA,CAAK,GAAG,YAAY,CAAA;AAC1B,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,2BAA2B,IAAA,EAKf;AACnB,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,EAAe,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAC7F,IAAA,MAAM,OAAA,GAAU,8BAAA,CAA+B,IAAA,CAAK,OAAO,CAAA;AAC3D,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,yDAAyD,CAAA;AACvF,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAK,CAAE,aAAY,KAAM,OAAA,CAAQ,aAAY,EAAG;AACvE,MAAA,MAAM,IAAI,MAAM,wEAAwE,CAAA;AAAA,IAC1F;AACA,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQV,UAAAA,CAAW,IAAA,CAAK,aAAa,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,eAAe,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAMA,UAAAA,CAAW,CAAA,CAAE,OAAkB,CAAC,CAAA;AACjH;AAEA,eAAe,8BAAA,CACb,MAAA,EACA,KAAA,EACA,aAAA,EACA,aAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAWA,UAAAA,CAAW,MAAA,CAAO,eAAe,CAAA;AAClD,EAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,GAAI,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,SAAA,CAAU,IAAA;AAEvF,EAAA,OAAO,sBAAA,CAAuB;AAAA,IAC5B,OAAA,EAAS;AAAA,MACP,aAAA,EAAe,KAAA;AAAA,MACf,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,eAAA,EAAiB,QAAA;AAAA,MACjB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,uBAAuB,MAAA,CAAO;AAAA,KAChC;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA,EAAiB,QAAA;AAAA,IACjB,oBAAoB,SAAA,CAAU,EAAA;AAAA,IAC9B,eAAA,EAAiB,OAAO,EAAE,YAAA,EAAc,OAAM,KAAM;AAClD,MAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,IAAe,yBAAA;AACtC,MAAA,OAAO,YAAA,GAAe,WAAW,YAAA,GAAe,QAAA;AAAA,IAClD,CAAA;AAAA,IACA,cAAA,EAAgB,CAAC,EAAE,KAAA,EAAM,KAAM;AAC7B,MAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,MAAA,MAAM,SAAA,GAAY,MAAM,WAAA,KAAgBW,2BAAAA;AACxC,MAAA,MAAM,MAAA,GAAS,IAAA,EAAM,KAAA,GAAQ,EAAA,IAAM,MAAM,WAAA,KAAgBD,0BAAAA;AACzD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO;AAAA,UACL,aAAA,EAAe,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,OAAO,IAAA,EAAM,cAAA,EAAgB,GAAG,aAAA,EAAe,CAAA;AAAA,UACrF,GAAA,EAAK,EAAE,IAAA,EAAM,kBAAA,EAAoB,OAAA,EAAS,GAAG,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAE,SAC/E;AAAA,MACF;AACA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,OAAO;AAAA,UACL,aAAA,EAAe,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,OAAO,IAAA,EAAM,SAAA,EAAW,GAAG,aAAA,EAAe,CAAA;AAAA,UAChF,GAAA,EAAK,EAAE,IAAA,EAAM,mBAAA,EAAqB,OAAA,EAAS,GAAG,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAE,SAChF;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,KAAK,SAAA,CAAU,EAAE,MAAM,KAAA,EAAO,GAAG,eAAe,CAAA;AAAA,QAC/D,GAAA,EAAK,EAAE,IAAA,EAAM,kBAAA,EAAoB,OAAA,EAAS,GAAG,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAE,OAC/E;AAAA,IACF;AAAA,GACD,CAAA;AACH;AAEA,eAAsB,uCAAuC,IAAA,EAAwB;AACnF,EAAA,MAAM,QAAA,GAAWV,UAAAA,CAAW,IAAA,CAAK,eAAe,CAAA;AAChD,EAAA,MAAM,SAAS,MAAM,wBAAA,CAAyB,IAAA,CAAK,OAAA,EAAS,KAAK,YAAY,CAAA;AAC7E,EAAA,MAAM,cAAA,GAAiB,MAAM,0BAAA,CAA2B,IAAI,CAAA;AAC5D,EAAA,MAAM,gBAAgB,MAAM,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,KAAK,eAAe,CAAA;AACtF,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,IAAA,CAAK,qBAAA,EAAuB,cAAc,QAAQ,CAAA;AACxF,EAAA,IAAI,SAAA,KAAc,EAAA,EAAI,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAEvG,EAAA,MAAM,SAAA,GAAYA,UAAAA,CAAW,MAAA,CAAO,gBAA2B,CAAA;AAC/D,EAAA,MAAM,UAAA,GAAaA,UAAAA,CAAW,MAAA,CAAO,iBAA4B,CAAA;AACjE,EAAA,IAAI,cAAA,KAAmB,SAAA,IAAa,cAAA,KAAmB,UAAA,EAAY;AACjE,IAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,EACpF;AAEA,EAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,gBAAgB,CAAA;AACxE,EAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AACpE,EAAA,MAAM,YAAA,GAAe,MAAM,yBAAA,CAA0B;AAAA,IACnD,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,SAAA,EAAW,SAAA;AAAA,IACX,uBAAuB,IAAA,CAAK;AAAA,GAC7B,CAAA;AAED,EAAA,MAAM,YAAyB,EAAC;AAChC,EAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,aAAA,EAAe;AACzC,IAAA,SAAA,CAAU,IAAA;AAAA,MACR,GAAI,MAAM,wBAAA,CAAyB;AAAA,QACjC,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,eAAA,EAAiB,QAAA;AAAA,QACjB,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,cAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AAAA,EACF,CAAA,MAAO;AACL,IAAA,SAAA,CAAU,IAAA;AAAA,MACR,GAAI,MAAM,yBAAA,CAA0B;AAAA,QAClC,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,eAAA,EAAiB,QAAA;AAAA,QACjB,KAAA,EAAO,cAAA;AAAA,QACP,OAAA,EAAS,cAAA;AAAA,QACT;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpBe,kBAAAA,CAAmB;AAAA,MACjB,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,SAAA;AAAA,MACd,IAAA,EAAM,CAAC,YAAA,EAAc,YAAY;AAAA,KAClC,CAAA;AAAA,IACDA,kBAAAA,CAAmB;AAAA,MACjB,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,YAAA;AAAA,MACd,IAAA,EAAM,CAAC,cAAA,EAAgB,YAAA,EAAc,SAAS;AAAA,KAC/C,CAAA;AAAA,IACDA,kBAAAA,CAAmB;AAAA,MACjB,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,eAAA;AAAA,MACd,IAAA,EAAM;AAAA,QACJ;AAAA,UACE,SAAA,EAAW;AAAA,YACT,QAAA,EAAU,QAAA;AAAA,YACV,kBAAkB,cAAA,EAAe;AAAA,YACjC,eAAe,cAAA,EAAe;AAAA,YAC9B,MAAA,EAAQf,UAAAA,CAAW,MAAA,CAAO,kBAA6B,CAAA;AAAA,YACvD,gBAAA,EAAkB,SAAA;AAAA,YAClB,iBAAA,EAAmB,UAAA;AAAA,YACnB,mBAAmB,EAAC;AAAA,YACpB,oBAAoB;AAAC,WACvB;AAAA,UACA,eAAA,EAAiB,EAAA;AAAA,UACjB,uBAAA,EAAyB,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAAA,UAChD,YAAA;AAAA,UACA,gBAAA,EAAkB,EAAA;AAAA,UAClB,UAAU;AAAC;AACb;AACF,KACD;AAAA,GACH;AAEA,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,EAAA,EAAI,cAAA;AAAA,IACJ,MAAMe,kBAAAA,CAAmB;AAAA,MACvB,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,WAAA;AAAA,MACd,IAAA,EAAM,CAAC,aAAa;AAAA,KACrB,CAAA;AAAA,IACD,KAAA,EAAO,YAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAEA,EAAA,OAAO,8BAAA;AAAA,IACL,IAAA;AAAA,IACA,CAAC,GAAG,SAAA,EAAW,SAAS,CAAA;AAAA,IACxB;AAAA,MACE,MAAA,EAAQ,YAAA;AAAA,MACR,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,uBAAuB,IAAA,CAAK,qBAAA;AAAA,MAC5B,UAAA,EAAY,OAAA,CAAQ,IAAA,CAAK,UAAU;AAAA,KACrC;AAAA,IACA;AAAA,GACF;AACF;AAEA,eAAsB,wCAAwC,IAAA,EAAyB;AACrF,EAAA,MAAM,QAAA,GAAWf,UAAAA,CAAW,IAAA,CAAK,eAAe,CAAA;AAChD,EAAA,MAAM,SAAS,MAAM,wBAAA,CAAyB,IAAA,CAAK,OAAA,EAAS,KAAK,YAAY,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAUA,UAAAA,CAAW,MAAA,CAAO,kBAA6B,CAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,EAAA;AACtC,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,IAAA,CAAK,aAAA,EAAe,UAAU,CAAA;AACtE,EAAA,IAAI,WAAA,KAAgB,EAAA,EAAI,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAEjG,EAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,gBAAgB,CAAA;AACxE,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,iBAAiB,CAAA;AAC1E,EAAA,MAAM,YAAA,GAAe,MAAM,yBAAA,CAA0B;AAAA,IACnD,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,SAAA,EAAW,YAAA;AAAA,IACX,uBAAuB,IAAA,CAAK;AAAA,GAC7B,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,MAAM,yBAAA,CAA0B;AAAA,IAChD,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,eAAA,EAAiB,QAAA;AAAA,IACjB,KAAA,EAAO,OAAA;AAAA,IACP,OAAA,EAAS,cAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpBe,kBAAAA,CAAmB;AAAA,MACjB,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,SAAA;AAAA,MACd,IAAA,EAAM,CAAC,eAAA,EAAiB,YAAY;AAAA,KACrC,CAAA;AAAA,IACDA,kBAAAA,CAAmB;AAAA,MACjB,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,YAAA;AAAA,MACd,IAAA,EAAM,CAAC,OAAA,EAAS,eAAA,EAAiB,WAAW;AAAA,KAC7C,CAAA;AAAA,IACDA,kBAAAA,CAAmB;AAAA,MACjB,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,kBAAA;AAAA,MACd,IAAA,EAAM;AAAA,QACJ;AAAA,UACE,SAAA,EAAW;AAAA,YACT,QAAA,EAAU,QAAA;AAAA,YACV,kBAAkB,cAAA,EAAe;AAAA,YACjC,eAAe,cAAA,EAAe;AAAA,YAC9B,MAAA,EAAQ,OAAA;AAAA,YACR,mBAAmB,EAAC;AAAA,YACpB,oBAAoB;AAAC,WACvB;AAAA,UACA,kBAAA,EAAoB,EAAA;AAAA,UACpB,mBAAA,EAAqB,EAAA;AAAA,UACrB,uBAAA,EAAyB,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA;AAAA,UACjD,YAAA;AAAA,UACA,gBAAA,EAAkB,EAAA;AAAA,UAClB,UAAU;AAAC;AACb;AACF,KACD;AAAA,GACH;AAEA,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,EAAA,EAAI,cAAA;AAAA,IACJ,MAAMA,kBAAAA,CAAmB;AAAA,MACvB,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,WAAA;AAAA,MACd,IAAA,EAAM,CAAC,aAAa;AAAA,KACrB,CAAA;AAAA,IACD,KAAA,EAAO,YAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAEA,EAAA,OAAO,8BAAA;AAAA,IACL,IAAA;AAAA,IACA,CAAC,GAAG,SAAA,EAAW,SAAS,CAAA;AAAA,IACxB;AAAA,MACE,MAAA,EAAQ,aAAA;AAAA,MACR,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,WAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,WAAW;AAAA,KACvC;AAAA,IACA;AAAA,GACF;AACF;AC1XA,IAAMhB,SAAAA,GAAUE,aAAAA,CAAcC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC5D,IAAM,eAAA,GAAkBH,SAAAA,CAAQ,+BAA+B,CAAA,CAAE,OAAA;AAEjE,IAAM,kBAAA,GAAqB,OAAA;AAC3B,IAAMY,2BAAAA,GAA6B,OAAA;AAEnC,IAAME,qBAAoBJ,QAAAA,CAAS;AAAA,EACjC;AACF,CAAC,CAAA;AACD,IAAMK,gBAAAA,GAAkBL,QAAAA,CAAS,CAAC,kEAAkE,CAAC,CAAA;AAuBrG,eAAe,2BAAA,CACb,MAAA,EACA,KAAA,EACA,aAAA,EACA,aAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAWT,UAAAA,CAAW,MAAA,CAAO,eAAe,CAAA;AAClD,EAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,GAAI,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,SAAA,CAAU,IAAA;AAEvF,EAAA,OAAO,sBAAA,CAAuB;AAAA,IAC5B,OAAA,EAAS;AAAA,MACP,aAAA,EAAe,KAAA;AAAA,MACf,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,eAAA,EAAiB,QAAA;AAAA,MACjB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,uBAAuB,MAAA,CAAO;AAAA,KAChC;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA,EAAiB,QAAA;AAAA,IACjB,oBAAoB,SAAA,CAAU,EAAA;AAAA,IAC9B,eAAA,EAAiB,OAAO,EAAE,YAAA,EAAc,OAAM,KAAM;AAClD,MAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,IAAe,kBAAA;AACtC,MAAA,OAAO,YAAA,GAAe,WAAW,YAAA,GAAe,QAAA;AAAA,IAClD,CAAA;AAAA,IACA,cAAA,EAAgB,CAAC,EAAE,KAAA,EAAM,KAAM;AAC7B,MAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,MAAA,MAAM,SAAA,GAAY,MAAM,WAAA,KAAgBW,2BAAAA;AACxC,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,OAAO;AAAA,UACL,aAAA,EAAe,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,OAAO,IAAA,EAAM,SAAA,EAAW,GAAG,aAAA,EAAe,CAAA;AAAA,UAChF,GAAA,EAAK,EAAE,IAAA,EAAM,mBAAA,EAAqB,OAAA,EAAS,GAAG,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAE,SAChF;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,KAAK,SAAA,CAAU,EAAE,MAAM,KAAA,EAAO,GAAG,eAAe,CAAA;AAAA,QAC/D,GAAA,EAAK,EAAE,IAAA,EAAM,iBAAA,EAAmB,OAAA,EAAS,GAAG,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAE,OAC9E;AAAA,IACF;AAAA,GACD,CAAA;AACH;AAEA,eAAe,qBAAqB,IAAA,EAOX;AACvB,EAAA,MAAM,KAAKL,WAAAA,CAAY;AAAA,IACrB,IAAI,IAAA,CAAK,OAAA;AAAA,IACT,IAAA,EAAM,aAAA;AAAA,IACN,gBAAgB,EAAE,QAAA,EAAU,IAAI,IAAA,EAAM,QAAA,EAAU,QAAQ,GAAA,EAAI;AAAA,IAC5D,OAAA,EAAS,EAAE,OAAA,EAAS,EAAE,MAAM,CAAC,IAAA,CAAK,MAAM,CAAA,EAAE;AAAE,GAC7C,CAAA;AACD,EAAA,MAAM,YAAA,GAAeC,kBAAAA,CAAmB,EAAE,KAAA,EAAO,EAAA,EAAI,WAAWC,IAAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG,CAAA;AACnF,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,IAChD,SAAS,IAAA,CAAK,QAAA;AAAA,IACd,GAAA,EAAKK,kBAAAA;AAAA,IACL,YAAA,EAAc,WAAA;AAAA,IACd,IAAA,EAAM,CAAC,IAAA,CAAK,eAAA,EAAiB,KAAK,YAAY;AAAA,GAC/C,CAAA;AACD,EAAA,IAAI,SAAA,IAAa,IAAA,CAAK,SAAA,EAAW,OAAO,EAAC;AACzC,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,IAAI,YAAY,EAAA,EAAI;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAI,IAAA,CAAK,QAAA;AAAA,MACT,IAAA,EAAME,kBAAAA,CAAmB,EAAE,GAAA,EAAKD,gBAAAA,EAAiB,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,CAAC,IAAA,CAAK,YAAA,EAAc,EAAE,GAAG,CAAA;AAAA,MACzG,KAAA,EAAO,EAAA;AAAA,MACP,WAAA,EAAaH;AAAA,KACd,CAAA;AAAA,EACH;AACA,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA,IACT,IAAI,IAAA,CAAK,QAAA;AAAA,IACT,IAAA,EAAMI,kBAAAA,CAAmB,EAAE,GAAA,EAAKD,kBAAiB,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,CAAC,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,IACrH,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAaH;AAAA,GACd,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AAEA,eAAsB,sCAAsC,IAAA,EAAuB;AACjF,EAAA,MAAM,QAAA,GAAWX,UAAAA,CAAW,IAAA,CAAK,eAAe,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AACvD,EAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AACpE,EAAA,MAAM,YAAY,mBAAA,CAAoB,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,eAAe,EAAE,CAAA;AAC9E,EAAA,IAAI,SAAA,KAAc,EAAA,EAAI,MAAM,IAAI,MAAM,gEAAgE,CAAA;AAEtG,EAAA,MAAM,SAAA,GAAY,MAAM,oBAAA,CAAqB;AAAA,IAC3C,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,eAAA,EAAiB,QAAA;AAAA,IACjB,QAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,EAAA,EAAI,YAAA;AAAA,IACJ,MAAMe,kBAAAA,CAAmB;AAAA,MACvB,GAAA,EAAK,eAAA;AAAA,MACL,YAAA,EAAc,UAAA;AAAA,MACd,IAAA,EAAM,CAAC,SAAS;AAAA,KACjB,CAAA;AAAA,IACD,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAEA,EAAA,OAAO,2BAAA;AAAA,IACL,IAAA;AAAA,IACA,CAAC,GAAG,SAAA,EAAW,SAAS,CAAA;AAAA,IACxB,EAAE,MAAA,EAAQ,WAAA,EAAa,WAAA,EAAa,KAAK,WAAA,EAAY;AAAA,IACrD;AAAA,GACF;AACF;AAEA,eAAsB,wCAAwC,IAAA,EAAyB;AACrF,EAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AACpE,EAAA,MAAM,YAAY,mBAAA,CAAoB,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,eAAe,EAAE,CAAA;AAC9E,EAAA,IAAI,SAAA,KAAc,EAAA,EAAI,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAExG,EAAA,MAAM,WAAA,GAAyB;AAAA,IAC7B,EAAA,EAAI,YAAA;AAAA,IACJ,MAAMA,kBAAAA,CAAmB;AAAA,MACvB,GAAA,EAAK,eAAA;AAAA,MACL,YAAA,EAAc,YAAA;AAAA,MACd,IAAA,EAAM,CAAC,SAAS;AAAA,KACjB,CAAA;AAAA,IACD,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAEA,EAAA,OAAO,2BAAA;AAAA,IACL,IAAA;AAAA,IACA,CAAC,WAAW,CAAA;AAAA,IACZ,EAAE,MAAA,EAAQ,aAAA,EAAe,WAAA,EAAa,KAAK,WAAA,EAAY;AAAA,IACvD;AAAA,GACF;AACF;ACtLA,IAAM,kBAAkBN,QAAAA,CAAS;AAAA,EAC/B,4DAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,mBAAA,GAAsB,EAAA;AAE5B,SAAS,kBAAkB,YAAA,EAA8B;AACvD,EAAA,MAAM,UAAU,YAAA,CAAa,KAAA,CAAM,YAAY,CAAA,GAAI,CAAC,GAAG,IAAA,EAAK;AAC5D,EAAA,MAAM,IAAA,GAAA,CAAQ,OAAA,IAAW,YAAA,EAAc,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,GAAS,EAAA,GAAK,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,MAAA,CAAA,GAAM,IAAA;AAC7D,EAAA,OAAO,MAAM,OAAO,CAAA,CAAA;AACtB;AAEA,SAAS,gBAAgB,YAAA,EAA8B;AACrD,EAAA,OAAO,CAAA,OAAA,EAAU,YAAA,CAAa,IAAA,EAAM,CAAA,CAAA;AACtC;AAeA,eAAsB,6BAA6B,IAAA,EAKA;AACjD,EAAA,MAAM,QAAA,GAAWT,UAAAA,CAAW,IAAA,CAAK,eAAe,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAEhF,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACrC,EAAA,MAAM,CAAC,OAAA,EAAS,MAAM,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IAC1C,wBAAA,CAAyB,KAAK,OAAO,CAAA;AAAA,IACrC,GAAA,CAAI,UAAS,CAAE,KAAA,CAAM,OAAO,EAAE,OAAA,EAAS,EAAC,EAAsC,CAAE;AAAA,GACjF,CAAA;AACD,EAAA,MAAM,WAAA,GAAe,MAAA,CAA0D,OAAA,IAAW,EAAC;AAE3F,EAAA,MAAM,KAAKM,WAAAA,CAAY;AAAA,IACrB,IAAI,IAAA,CAAK,OAAA;AAAA,IACT,IAAA,EAAM,aAAA;AAAA,IACN,gBAAgB,EAAE,QAAA,EAAU,IAAI,IAAA,EAAM,QAAA,EAAU,QAAQ,GAAA,EAAI;AAAA,IAC5D,OAAA,EAAS,EAAE,OAAA,EAAS,EAAE,MAAM,CAAC,MAAM,GAAE;AAAE,GACxC,CAAA;AACD,EAAA,MAAM,YAAA,GAAeC,mBAAmB,EAAE,KAAA,EAAO,IAAI,SAAA,EAAWC,IAAAA,CAAK,MAAM,CAAA,EAAG,CAAA;AAE9E,EAAA,MAAM,OAAoC,EAAC;AAE3C,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,OAAO,MAAA,KAAW;AAC5B,MAAA,MAAM,KAAA,GAAQR,UAAAA,CAAW,MAAA,CAAO,kBAA6B,CAAA;AAC7D,MAAA,IAAI,OAAA,GAAU,EAAA;AACd,MAAA,IAAI,QAAA,GAAW,mBAAA;AACf,MAAA,IAAI;AACF,QAAA;AAAC,QAAA,CAAC,OAAA,EAAS,QAAQ,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,UACvC,aAAa,YAAA,CAAa;AAAA,YACxB,OAAA,EAAS,KAAA;AAAA,YACT,GAAA,EAAK,eAAA;AAAA,YACL,YAAA,EAAc,WAAA;AAAA,YACd,IAAA,EAAM,CAAC,QAAQ;AAAA,WAChB,CAAA;AAAA,UACD,aAAa,YAAA,CAAa;AAAA,YACxB,OAAA,EAAS,KAAA;AAAA,YACT,GAAA,EAAK,eAAA;AAAA,YACL,YAAA,EAAc;AAAA,WACf,CAAA,CAAE,KAAA,CAAM,MAAM,mBAAmB;AAAA,SACnC,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,IAAsB,OAAA,KAAY,EAAA,EAAI;AAEhD,MAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,WAAA,EAAa,KAAK,CAAA;AACtD,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,oBAAoB,MAAA,CAAO,kBAAA;AAAA,QAC3B,iBAAiB,MAAA,CAAO,eAAA;AAAA,QACxB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,QACzB,UAAA,EAAY,OAAO,QAAQ,CAAA;AAAA,QAC3B,YAAA,EAAc,QAAQ,QAAA,EAAS;AAAA,QAC/B,cAAA,EAAgBgB,WAAAA,CAAY,OAAA,EAAS,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,QACrD,eAAA,EAAiB,mBAAA,CAAoB,QAAA,EAAU,GAAG,CAAA;AAAA,QAClD,eAAA,EAAiB,iBAAA,CAAkB,MAAA,CAAO,MAAM,CAAA;AAAA,QAChD,aAAA,EAAe,eAAA,CAAgB,MAAA,CAAO,MAAM;AAAA,OAC7C,CAAA;AAAA,IACH,CAAC;AAAA,GACH;AAEA,EAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,MAAA,CAAO,aAAA,CAAc,CAAA,CAAE,MAAA,EAAQ,MAAA,EAAW,EAAE,WAAA,EAAa,MAAA,EAAQ,CAAC,CAAA;AACxF,EAAA,OAAO,EAAE,IAAA,EAAK;AAChB;;;ACrFO,IAAM,oBAAA,GAAuB,CAAC,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI;AAGpF,IAAM,mBAAA,GAAsB,EAAA;AAE5B,SAAS,2BAA2B,MAAA,EAAwB;AAC1D,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,EAAK,CAAE,MAAM,gBAAgB,CAAA;AAC9C,EAAA,OAAO,IAAI,CAAC,CAAA,EAAG,IAAA,EAAK,IAAK,OAAO,IAAA,EAAK;AACvC;AAEA,SAASX,UAAS,CAAA,EAAgC;AAChD,EAAA,IAAI,CAAA,IAAK,MAAM,OAAO,MAAA;AACtB,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,IAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,wBAAA,CAAyB,WAAmB,aAAA,EAAsC;AACzF,EAAA,IAAI,SAAA,IAAa,EAAA,IAAM,aAAA,IAAiB,EAAA,EAAI,OAAO,IAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAS,CAAA,GAAI,IAAA;AAClC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,aAAa,CAAA,GAAI,IAAA;AACrC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,IAAQ,CAAA,EAAG,OAAO,IAAA;AAC3E,EAAA,MAAM,QAAQ,KAAA,GAAQ,IAAA;AACtB,EAAA,OAAO,KAAA,CAAM,eAAe,OAAA,EAAS,EAAE,uBAAuB,CAAA,EAAG,qBAAA,EAAuB,GAAG,CAAA;AAC7F;AAEA,SAAS,iBAAiB,WAAA,EAA6B;AACrD,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAA,CAAK,WAAW,CAAA,CAAE,eAAe,KAAA,CAAA,EAAW;AAAA,MACrD,KAAA,EAAO,OAAA;AAAA,MACP,GAAA,EAAK,SAAA;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,WAAW,CAAA;AAAA,EAC3B;AACF;AAEA,SAAS,YAAA,CACP,KACA,IAAA,EACqB;AACrB,EAAA,MAAM,SAAS,CAAC,GAAG,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,IAAA,KAAS,KAAA,GAAQ,EAAE,SAAA,GAAY,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA,GAAY,EAAE,SAAU,CAAA;AAC/G,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACxB,aAAa,CAAA,CAAE,SAAA;AAAA,IACf,SAAA,EAAW,gBAAA,CAAiB,CAAA,CAAE,SAAS,CAAA;AAAA,IACvC,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,OAAO,CAAA,CAAE;AAAA,GACX,CAAE,CAAA;AACJ;AAEO,SAAS,wBAAwB,SAAA,EAAsC;AAC5E,EAAA,MAAM,EAAA,GAAK,UAAU,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAE,oBAAA,CAA2C,QAAA,CAAS,EAAE,CAAA,EAAG;AAC7D,IAAA,MAAM,IAAI,MAAM,CAAA,mBAAA,EAAsB,SAAS,YAAY,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9F;AACA,EAAA,OAAO,EAAA;AACT;AAEA,eAAsB,qBAAqB,IAAA,EAId;AAC3B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAChC,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAK;AACpD,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAC7D,EAAA,IAAI,CAAC,gBAAA,EAAkB,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAEvE,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACrC,EAAA,MAAM,CAAC,OAAA,EAAS,eAAe,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACnD,IAAI,mBAAA,CAAoB,EAAE,SAAS,CAAC,MAAM,GAAG,CAAA;AAAA,IAC7C,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,gBAAgB;AAAA,GACvD,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,EAAE,CAAA,KAAM,MAAM,CAAA,IAAK,QAAQ,CAAC,CAAA;AAClF,EAAA,MAAM,IAAA,GAAOA,SAAAA,CAAS,MAAA,EAAQ,SAAA,IAAa,QAAQ,QAAQ,CAAA;AAC3D,EAAA,MAAM,YAAA,GAAe,eAAe,IAAI,CAAA;AAExC,EAAA,MAAM,eAAA,GAAkBA,SAAAA;AAAA,IACrB,iBAAiB,MAAA,EAA+C;AAAA,GACnE;AACA,EAAA,MAAM,aAAA,GAAgB,eAAe,eAAe,CAAA;AACpD,EAAA,MAAM,kBAAA,GACJ,QAAQ,IAAA,IAAQ,eAAA,IAAmB,OAAO,wBAAA,CAAyB,IAAA,EAAM,eAAe,CAAA,GAAI,IAAA;AAE9F,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,UAAA,EAAY,2BAA2B,MAAM,CAAA;AAAA,IAC7C,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAA,EAAa,KAAK,GAAA;AAAI,GACxB;AACF;AAEA,eAAsB,cAAc,IAAA,EAMwD;AAC1F,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,IAAA,CAAK,SAAA,IAAa,KAAK,CAAA;AACjE,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,mBAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,MAAA;AAE1B,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,UAAA,CAAW,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA;AAElE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,EAAS,YAAA,CAAa,QAAA,EAAU,IAAI;AAAA,GACtC;AACF;AAEA,eAAsB,uBAAuB,IAAA,EAKd;AAC7B,EAAA,MAAM,cAAA,GAAiB,uBAAA,CAAwB,IAAA,CAAK,cAAA,IAAkB,KAAK,CAAA;AAC3E,EAAA,MAAM,CAAC,MAAA,EAAQ,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACxC,qBAAqB,IAAI,CAAA;AAAA,IACzB,aAAA,CAAc,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,IAAA,EAAM,MAAA,EAAQ;AAAA,GACtG,CAAA;AACD,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,gBAAgB,KAAA,CAAM,SAAA;AAAA,IACtB,OAAO,KAAA,CAAM;AAAA,GACf;AACF;;;AClJO,IAAM,eAAA,GAAkB;AAExB,IAAM,iBAAA,GAAoC;AAAA,EAC/C,EAAA,EAAI,eAAA;AAAA,EACJ,aAAA,EAAe,KAAA;AAAA,EACf,iBAAiB,GAAA,EAAK;AACpB,IAAA,IAAI,GAAA,CAAI,aAAA,KAAkB,KAAA,EAAO,OAAO,KAAA;AACxC,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,OAAA,KAAY,WAAW,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAClF,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,IAAK,oBAAoB,OAAO,CAAA;AAAA,EAChE,CAAA;AAAA,EACA,iBAAiB,KAAA,EAAO;AACtB,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,KAAA,EAAO,OAAO,KAAA;AACrC,IAAA,OAAO,MAAM,IAAA,KAAS,OAAA;AAAA,EACxB,CAAA;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,EAAA,EAAI,cAAA;AAAA,MACJ,UAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe,KAAA;AAAA,MACf,WAAA,EAAa,6DAAA;AAAA,MACb,YAAA,EAAc,CAAC,QAAA,EAAU,aAAA,EAAe,cAAc,CAAA;AAAA,MACtD,MAAA,EAAQ;AAAA,QACN,QAAQ,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,4CAAA,EAA6C;AAAA,QACpG,WAAW,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,eAAA,EAAgB;AAAA,QAC1E,WAAW,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,iBAAA,EAAkB;AAAA,QAC5E,cAAc,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,sBAAA,EAAuB;AAAA,QACpF,iBAAiB,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,mCAAA,EAAoC;AAAA,QACpG,uBAAuB,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,kCAAA;AAAmC;AAC3G,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAI,cAAA;AAAA,MACJ,UAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe,KAAA;AAAA,MACf,WAAA,EAAa,8DAAA;AAAA,MACb,YAAA,EAAc,CAAC,QAAA,EAAU,aAAA,EAAe,cAAc,CAAA;AAAA,MACtD,MAAA,EAAQ;AAAA,QACN,QAAQ,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,mBAAA,EAAoB;AAAA,QAC3E,WAAW,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,eAAA,EAAgB;AAAA,QAC1E,WAAW,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,iBAAA,EAAkB;AAAA,QAC5E,cAAc,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,sBAAA,EAAuB;AAAA,QACpF,iBAAiB,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,kCAAA;AAAmC;AACrG,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAI,YAAA;AAAA,MACJ,UAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe,KAAA;AAAA,MACf,WAAA,EAAa,+CAAA;AAAA,MACb,YAAA,EAAc,CAAC,QAAA,EAAU,aAAA,EAAe,cAAc,CAAA;AAAA,MACtD,MAAA,EAAQ;AAAA,QACN,SAAS,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,4BAAA;AAA6B;AACvF,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAI,eAAA;AAAA,MACJ,UAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe,KAAA;AAAA,MACf,WAAA,EAAa,4EAAA;AAAA,MACb,YAAA,EAAc,CAAC,QAAA,EAAU,aAAA,EAAe,cAAc,CAAA;AAAA,MACtD,MAAA,EAAQ;AAAA,QACN,cAAc,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,2CAAA,EAA4C;AAAA,QACzG,iBAAiB,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,8BAAA,EAA+B;AAAA,QAC/F,uBAAuB,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,uBAAA;AAAwB;AAChG,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAI,gBAAA;AAAA,MACJ,UAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe,KAAA;AAAA,MACf,WAAA,EAAa,qDAAA;AAAA,MACb,YAAA,EAAc,CAAC,QAAA,EAAU,aAAA,EAAe,cAAc,CAAA;AAAA,MACtD,MAAA,EAAQ;AAAA,QACN,cAAc,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,kBAAA,EAAmB;AAAA,QAChF,eAAe,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,6BAAA;AAA8B;AAC9F,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAI,cAAA;AAAA,MACJ,UAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe,KAAA;AAAA,MACf,WAAA,EAAa,mCAAA;AAAA,MACb,YAAA,EAAc,CAAC,QAAA,EAAU,aAAA,EAAe,cAAc,CAAA;AAAA,MACtD,MAAA,EAAQ;AAAA,QACN,aAAa,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,qBAAA;AAAsB;AACpF,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAI,gBAAA;AAAA,MACJ,UAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe,KAAA;AAAA,MACf,WAAA,EAAa,qCAAA;AAAA,MACb,YAAA,EAAc,CAAC,QAAA,EAAU,aAAA,EAAe,cAAc,CAAA;AAAA,MACtD,MAAA,EAAQ;AAAA,QACN,aAAa,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,uBAAA;AAAwB;AACtF;AACF;AAEJ;AAEA,sBAAA,CAAuB,iBAAiB,CAAA","file":"index.js","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** GMX V2 production chains supported in Continuum multi-sign v1. */\nexport const GMX_SUPPORTED_CHAIN_IDS = [42161, 43114] as const\n\nexport type GmxSupportedChainId = (typeof GMX_SUPPORTED_CHAIN_IDS)[number]\n\nexport function isGmxChainSupported(chainId: number): chainId is GmxSupportedChainId {\n return (GMX_SUPPORTED_CHAIN_IDS as readonly number[]).includes(chainId)\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { isGmxChainSupported } from './support.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { GmxApiSdk } = require('@gmx-io/sdk/v2') as {\n GmxApiSdk: new (args: { chainId: number; api?: GmxHttpApi }) => GmxApiSdkInstance\n}\n\nconst GMX_HTTP_TIMEOUT_MS = 30_000\n\n/** Prefer .io (primary GMX API); .ai is secondary. SDK default order is random. */\nconst GMX_API_BASE_URLS: Record<number, readonly [string, string]> = {\n 42161: ['https://arbitrum.gmxapi.io/v1', 'https://arbitrum.gmxapi.ai/v1'],\n 43114: ['https://avalanche.gmxapi.io/v1', 'https://avalanche.gmxapi.ai/v1'],\n}\n\ntype GmxHttpApi = {\n fetchJson: (path: string, opts?: GmxFetchJsonOpts) => Promise<unknown>\n postJson: (path: string, body: unknown, opts?: GmxPostJsonOpts) => Promise<unknown>\n}\n\ntype GmxFetchJsonOpts = {\n query?: Record<string, unknown>\n transform?: (raw: unknown) => unknown\n}\n\ntype GmxPostJsonOpts = {\n transform?: (raw: unknown) => unknown\n}\n\nfunction buildGmxUrl(baseUrl: string, path: string, query?: Record<string, unknown>): string {\n const base = baseUrl.replace(/\\/$/, '')\n if (!query) return `${base}${path}`\n const params = new URLSearchParams()\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) params.set(key, String(value))\n }\n const qs = params.toString()\n return qs ? `${base}${path}?${qs}` : `${base}${path}`\n}\n\nfunction bigintReplacer(_key: string, value: unknown) {\n return typeof value === 'bigint' ? value.toString() : value\n}\n\nasync function gmxHttpFetchJson(baseUrl: string, path: string, opts?: GmxFetchJsonOpts): Promise<unknown> {\n const url = buildGmxUrl(baseUrl, path, opts?.query)\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), GMX_HTTP_TIMEOUT_MS)\n try {\n const response = await fetch(url, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n if (!response.ok) {\n let message = `HTTP ${response.status}: ${response.statusText}`\n try {\n const body = (await response.json()) as { message?: string }\n if (body?.message) message = `HTTP ${response.status}: ${body.message}`\n } catch {\n // ignore parse errors\n }\n throw new Error(`${message} (${url})`)\n }\n const json = await response.json()\n return opts?.transform ? opts.transform(json) : json\n } finally {\n clearTimeout(timeoutId)\n }\n}\n\nasync function gmxHttpPostJson(\n baseUrl: string,\n path: string,\n body: unknown,\n opts?: GmxPostJsonOpts,\n): Promise<unknown> {\n const url = buildGmxUrl(baseUrl, path)\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), GMX_HTTP_TIMEOUT_MS)\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify(body, bigintReplacer),\n signal: controller.signal,\n })\n if (!response.ok) {\n let message = `HTTP ${response.status}: ${response.statusText}`\n try {\n const errBody = (await response.json()) as { message?: string }\n if (errBody?.message) message = `HTTP ${response.status}: ${errBody.message}`\n } catch {\n // ignore parse errors\n }\n throw new Error(`${message} (${url})`)\n }\n const json = await response.json()\n return opts?.transform ? opts.transform(json) : json\n } finally {\n clearTimeout(timeoutId)\n }\n}\n\nfunction createIoFirstGmxHttpApi(chainId: number): GmxHttpApi {\n const urls = GMX_API_BASE_URLS[chainId]\n if (!urls) {\n throw new Error(`GMX API URLs are not configured for chain ${chainId}.`)\n }\n async function withIoFirstFallback<T>(fn: (baseUrl: string) => Promise<T>): Promise<T> {\n let lastError: unknown\n for (const baseUrl of urls) {\n try {\n return await fn(baseUrl)\n } catch (e) {\n lastError = e\n }\n }\n const detail = lastError instanceof Error ? lastError.message : String(lastError)\n throw new Error(\n `GMX API request failed on all endpoints (${urls.join(', ')}). Last error: ${detail}`,\n )\n }\n return {\n fetchJson: (path, opts) => withIoFirstFallback((baseUrl) => gmxHttpFetchJson(baseUrl, path, opts)),\n postJson: (path, body, opts) => withIoFirstFallback((baseUrl) => gmxHttpPostJson(baseUrl, path, body, opts)),\n }\n}\n\nexport type GmxApiSdkInstance = {\n fetchMarkets: () => Promise<GmxMarketRow[]>\n fetchMarketsTickers: (args?: { symbols?: string[] }) => Promise<unknown[]>\n fetchOhlcv: (args: {\n symbol: string\n timeframe: string\n limit?: number\n since?: number\n }) => Promise<Array<{ timestamp: number; open: string; high: string; low: string; close: string }>>\n fetchTokens: () => Promise<GmxTokenRow[]>\n fetchTokensData: () => Promise<unknown[]>\n fetchPositionsInfo: (args: { address: string; includeRelatedOrders?: boolean }) => Promise<GmxPositionRow[]>\n fetchOrders: (args: { address: string }) => Promise<GmxOrderRow[]>\n fetchStakingPower: (args: { address: string }) => Promise<Record<string, unknown>>\n fetchApy: (params?: Record<string, unknown>) => Promise<Record<string, unknown>>\n prepareOrder: (args: Record<string, unknown>) => Promise<GmxPrepareOrderResponse>\n prepareCancelOrder: (args: Record<string, unknown>) => Promise<GmxPrepareOrderResponse>\n}\n\nexport type GmxMarketRow = {\n symbol: string\n marketTokenAddress: string\n indexTokenAddress?: string\n longTokenAddress?: string\n shortTokenAddress?: string\n isSpotOnly?: boolean\n isListed?: boolean\n}\n\nexport type GmxTokenRow = {\n symbol: string\n address: string\n decimals: number\n}\n\nexport type GmxPositionRow = {\n key?: string\n indexName?: string\n isLong?: boolean\n sizeInUsd?: bigint | string | number\n collateralUsd?: bigint | string | number\n marketAddress?: string\n}\n\nexport type GmxOrderRow = {\n key?: string\n isLong?: boolean\n sizeDeltaUsd?: bigint | string | number\n triggerPrice?: bigint | string | number\n}\n\nexport type GmxPrepareOrderResponse = {\n requestId?: string\n payloadType: 'transaction' | 'typed-data'\n mode: string\n payload: {\n to?: string\n data?: string\n value?: string | bigint | number\n }\n estimates?: Record<string, unknown>\n}\n\nconst sdkByChain = new Map<number, GmxApiSdkInstance>()\n\nexport function getGmxApiSdk(chainId: number): GmxApiSdkInstance {\n if (!isGmxChainSupported(chainId)) {\n throw new Error(`GMX is not supported on chain ${chainId}. Supported: 42161 (Arbitrum), 43114 (Avalanche).`)\n }\n let sdk = sdkByChain.get(chainId)\n if (!sdk) {\n sdk = new GmxApiSdk({ chainId, api: createIoFirstGmxHttpApi(chainId) })\n sdkByChain.set(chainId, sdk)\n }\n return sdk\n}\n","import { parseUnits } from 'viem'\n\n/** Parse a USD amount to GMX 30-decimal fixed point. */\nexport function parseGmxUsd30(amountHuman: string): bigint {\n const trimmed = amountHuman.trim()\n if (!trimmed || !/^\\d+(\\.\\d+)?$/.test(trimmed)) {\n throw new Error('USD amount must be a positive decimal number.')\n }\n const [whole, frac = ''] = trimmed.split('.')\n const fracPadded = (frac + '0'.repeat(30)).slice(0, 30)\n const wholeN = BigInt(whole)\n const fracN = BigInt(fracPadded || '0')\n const value = wholeN * 10n ** 30n + fracN\n if (value <= 0n) throw new Error('USD amount must be greater than zero.')\n return value\n}\n\nexport function parseGmxTokenAmount(amountHuman: string, decimals: number): bigint {\n return parseUnits(amountHuman, decimals)\n}\n","import { getAddress } from 'viem'\n\nexport type GmxMarketApySource = {\n apy?: number\n baseApy?: number\n bonusApr?: number\n}\n\nexport function gmxFormatApyPercent(apy: number | null | undefined): string | null {\n if (apy == null || !Number.isFinite(apy)) return null\n const pct = apy * 100\n if (pct <= 0) return null\n return `${pct.toLocaleString('en-US', { maximumFractionDigits: 2 })}%`\n}\n\nexport function gmxLookupMarketApy(\n apyByMarket: Record<string, GmxMarketApySource>,\n marketTokenAddress: string,\n): GmxMarketApySource | null {\n try {\n const checksum = getAddress(marketTokenAddress)\n return apyByMarket[checksum] ?? apyByMarket[checksum.toLowerCase()] ?? null\n } catch {\n const lower = marketTokenAddress.trim().toLowerCase()\n return apyByMarket[lower] ?? null\n }\n}\n\nexport function gmxEnrichGmMarketRowWithApy<T extends { marketTokenAddress: string }>(\n row: T,\n apyByMarket: Record<string, GmxMarketApySource>,\n) {\n const entry = gmxLookupMarketApy(apyByMarket, row.marketTokenAddress)\n const apy = entry?.apy ?? null\n return {\n ...row,\n apy,\n baseApy: entry?.baseApy ?? null,\n bonusApr: entry?.bonusApr ?? null,\n apyPercentLabel: gmxFormatApyPercent(apy),\n }\n}\n","import { getAddress } from 'viem'\nimport { gmxEnrichGmMarketRowWithApy, type GmxMarketApySource } from './apy.js'\nimport { getGmxApiSdk, type GmxMarketRow, type GmxTokenRow } from './api.js'\n\nexport async function gmxFetchMarkets(chainId: number): Promise<GmxMarketRow[]> {\n const sdk = getGmxApiSdk(chainId)\n const markets = await sdk.fetchMarkets()\n return markets\n .filter((m) => !m.isSpotOnly && m.isListed !== false)\n .sort((a, b) => a.symbol.localeCompare(b.symbol, undefined, { sensitivity: 'base' }))\n}\n\nexport async function gmxFetchTokens(chainId: number): Promise<GmxTokenRow[]> {\n const sdk = getGmxApiSdk(chainId)\n return sdk.fetchTokens()\n}\n\nexport async function gmxResolveTokenBySymbol(chainId: number, symbol: string): Promise<GmxTokenRow> {\n const sym = symbol.trim().toUpperCase()\n const tokens = await gmxFetchTokens(chainId)\n const row = tokens.find((t) => t.symbol?.toUpperCase() === sym)\n if (!row) throw new Error(`GMX token symbol not found on chain ${chainId}: ${symbol}`)\n return row\n}\n\nexport async function gmxIsCollateralTokenSupported(chainId: number, tokenAddress: string): Promise<boolean> {\n try {\n const addr = getAddress(tokenAddress).toLowerCase()\n const tokens = await gmxFetchTokens(chainId)\n return tokens.some((t) => t.address?.toLowerCase() === addr)\n } catch {\n return false\n }\n}\n\n/** Parse collateral pool tokens from e.g. `ETH/USD [WETH-USDC]` → `WETH`, `USDC`. */\nexport function gmxMarketCollateralTokens(marketSymbol: string): string[] {\n const m = marketSymbol.match(/\\[([^[\\]]+)\\]/)\n if (!m?.[1]) return []\n return m[1].split('-').map((s) => s.trim()).filter(Boolean)\n}\n\nexport function gmxMarketAcceptsCollateral(marketSymbol: string, collateralSymbol: string): boolean {\n const col = collateralSymbol.trim().toUpperCase()\n if (!col) return true\n const tokens = gmxMarketCollateralTokens(marketSymbol)\n if (tokens.length === 0) return true\n return tokens.some((t) => t.toUpperCase() === col)\n}\n\nexport async function gmxMarketsForCollateralSymbol(\n chainId: number,\n collateralSymbol: string,\n): Promise<GmxMarketRow[]> {\n const markets = await gmxFetchMarkets(chainId)\n return markets.filter((m) => gmxMarketAcceptsCollateral(m.symbol, collateralSymbol))\n}\n\nexport async function gmxResolveMarketBySymbol(chainId: number, symbol: string): Promise<GmxMarketRow> {\n const sym = symbol.trim()\n const markets = await gmxFetchMarkets(chainId)\n const row = markets.find((m) => m.symbol === sym)\n if (!row) throw new Error(`GMX market symbol not found on chain ${chainId}: ${symbol}`)\n if (!row.longTokenAddress || !row.shortTokenAddress) {\n throw new Error(`GMX market \"${symbol}\" is missing long/short token addresses.`)\n }\n return row\n}\n\nexport async function gmxResolveMarketByGmTokenAddress(\n chainId: number,\n gmTokenAddress: string,\n): Promise<GmxMarketRow | null> {\n const addr = getAddress(gmTokenAddress).toLowerCase()\n const markets = await gmxFetchMarkets(chainId)\n return markets.find((m) => m.marketTokenAddress?.toLowerCase() === addr) ?? null\n}\n\nexport type GmxGmMarketSummaryRow = {\n symbol: string\n marketTokenAddress: string\n longTokenSymbol: string | null\n shortTokenSymbol: string | null\n apy: number | null\n baseApy: number | null\n bonusApr: number | null\n apyPercentLabel: string | null\n}\n\nexport async function gmxFetchGmMarketsSummary(chainId: number): Promise<GmxGmMarketSummaryRow[]> {\n const markets = await gmxFetchMarkets(chainId)\n const tokens = await gmxFetchTokens(chainId)\n const tokenByAddr = new Map(tokens.map((t) => [t.address.toLowerCase(), t.symbol]))\n const sdk = getGmxApiSdk(chainId)\n const emptyApyMarkets: Record<string, GmxMarketApySource> = {}\n const apyRes = await sdk.fetchApy().catch(() => ({ markets: emptyApyMarkets }))\n const apyByMarket = (apyRes.markets ?? emptyApyMarkets) as Record<string, GmxMarketApySource>\n return markets.map((m) =>\n gmxEnrichGmMarketRowWithApy(\n {\n symbol: m.symbol,\n marketTokenAddress: m.marketTokenAddress,\n longTokenSymbol: tokenByAddr.get((m.longTokenAddress ?? '').toLowerCase()) ?? null,\n shortTokenSymbol: tokenByAddr.get((m.shortTokenAddress ?? '').toLowerCase()) ?? null,\n },\n apyByMarket,\n ),\n )\n}\n","import { formatUnits } from 'viem'\n\n/** Format a GMX 30-decimal USD bigint as a human-readable dollar string. */\nexport function formatGmxUsd30(value: bigint | string | number | null | undefined): string | null {\n if (value == null) return null\n let n: bigint\n try {\n n = typeof value === 'bigint' ? value : BigInt(String(value))\n } catch {\n return null\n }\n if (n <= 0n) return null\n const negative = n < 0n\n const abs = negative ? -n : n\n const whole = abs / 10n ** 30n\n const frac = abs % 10n ** 30n\n const fracStr = frac.toString().padStart(30, '0').replace(/0+$/, '')\n const num = fracStr ? `${whole}.${fracStr}` : whole.toString()\n const parsed = Number(num)\n if (!Number.isFinite(parsed)) return null\n const formatted = Math.abs(parsed).toLocaleString('en-US', {\n minimumFractionDigits: 0,\n maximumFractionDigits: parsed >= 100 ? 2 : 4,\n })\n return negative ? `-$${formatted}` : `$${formatted}`\n}\n\n/** Decimal USD string suitable for amount inputs (no currency symbol). */\nexport function formatGmxUsd30HumanInput(value: bigint | string | number | null | undefined): string | null {\n if (value == null) return null\n let n: bigint\n try {\n n = typeof value === 'bigint' ? value : BigInt(String(value))\n } catch {\n return null\n }\n if (n <= 0n) return null\n const negative = n < 0n\n const abs = negative ? -n : n\n const whole = abs / 10n ** 30n\n const frac = abs % 10n ** 30n\n const fracStr = frac.toString().padStart(30, '0').replace(/0+$/, '')\n const raw = fracStr ? `${whole}.${fracStr}` : whole.toString()\n return negative ? `-${raw}` : raw\n}\n\n/** Trim trailing zeros from a decimal token amount string. */\nexport function formatGmxTokenAmountHuman(amountWei: bigint, decimals: number): string {\n const raw = formatUnits(amountWei, decimals)\n if (!raw.includes('.')) return raw\n return raw.replace(/\\.?0+$/, '')\n}\n\n/** GMX leverage is returned in basis points (size / effective collateral * 10_000). */\nexport function formatGmxLeverageBps(value: bigint | string | number | null | undefined): string | null {\n if (value == null) return null\n let n: bigint\n try {\n n = typeof value === 'bigint' ? value : BigInt(String(value))\n } catch {\n return null\n }\n if (n <= 0n) return null\n const x = Number(n) / 10_000\n if (!Number.isFinite(x) || x <= 0) return null\n return `${x.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}×`\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { getGmxApiSdk } from './api.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { hydrateMarketInfo, getMarketAddressByName } = require('@gmx-io/sdk/utils/markets') as {\n hydrateMarketInfo: (args: {\n chainId: number\n rawMarketInfo: Record<string, unknown>\n tokensData: Record<string, unknown>\n }) => Record<string, unknown> | undefined\n getMarketAddressByName: (\n marketsInfoData: Record<string, Record<string, unknown>>,\n name: string,\n ) => string | undefined\n}\n\n/** GMX default when market constants are absent from API payloads. */\nexport const GMX_DEFAULT_MIN_COLLATERAL_USD = 10n * 10n ** 30n\n\ntype MarketContext = {\n marketsInfoData: Record<string, Record<string, unknown>>\n tokensData: Record<string, Record<string, unknown>>\n minCollateralUsd: bigint\n}\n\nconst contextByChain = new Map<number, Promise<MarketContext>>()\n\nfunction tokensArrayToMap(tokensArr: Array<Record<string, unknown>>) {\n const tokensData: Record<string, Record<string, unknown>> = {}\n for (const t of tokensArr) {\n const address = String(t.address ?? '')\n if (address) tokensData[address] = t\n }\n return tokensData\n}\n\nexport async function loadGmxMarketContext(chainId: number): Promise<MarketContext> {\n let pending = contextByChain.get(chainId)\n if (!pending) {\n pending = (async () => {\n const sdk = getGmxApiSdk(chainId)\n const [marketsInfoArr, tokensArr] = await Promise.all([\n sdk.fetchMarketsInfo() as Promise<Array<Record<string, unknown>>>,\n sdk.fetchTokensData() as Promise<Array<Record<string, unknown>>>,\n ])\n const tokensData = tokensArrayToMap(tokensArr)\n const marketsInfoData: Record<string, Record<string, unknown>> = {}\n for (const raw of marketsInfoArr) {\n const hydrated = hydrateMarketInfo({ chainId, rawMarketInfo: raw, tokensData })\n if (hydrated?.marketTokenAddress) {\n marketsInfoData[String(hydrated.marketTokenAddress)] = hydrated\n }\n }\n return {\n marketsInfoData,\n tokensData,\n minCollateralUsd: GMX_DEFAULT_MIN_COLLATERAL_USD,\n }\n })()\n contextByChain.set(chainId, pending)\n }\n return pending\n}\n\nexport async function resolveGmxMarketBySymbol(chainId: number, symbol: string) {\n const ctx = await loadGmxMarketContext(chainId)\n const trimmed = symbol.trim()\n if (!trimmed) return undefined\n const address = getMarketAddressByName(ctx.marketsInfoData, trimmed)\n if (!address) return undefined\n return ctx.marketsInfoData[address]\n}\n\nexport async function resolveGmxTokenBySymbol(chainId: number, symbol: string) {\n const ctx = await loadGmxMarketContext(chainId)\n const sym = symbol.trim().toUpperCase()\n return Object.values(ctx.tokensData).find((t) => String(t.symbol ?? '').toUpperCase() === sym)\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { formatGmxLeverageBps, formatGmxUsd30 } from './format.js'\nimport { loadGmxMarketContext } from './marketContext.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { getPositionInfo } = require('@gmx-io/sdk/utils/positions') as {\n getPositionInfo: (p: Record<string, unknown>) => Record<string, unknown>\n}\n\nexport type GmxPositionDisplayRow = {\n key: string\n indexName: string\n isLong: boolean\n sizeUsd: string | null\n collateralUsd: string | null\n collateralSymbol: string | null\n entryPriceUsd: string | null\n markPriceUsd: string | null\n liquidationPriceUsd: string | null\n leverageLabel: string | null\n pnlUsd: string | null\n}\n\nfunction asBigint(v: unknown): bigint | undefined {\n if (v == null) return undefined\n try {\n return typeof v === 'bigint' ? v : BigInt(String(v))\n } catch {\n return undefined\n }\n}\n\nfunction pickIndexName(raw: Record<string, unknown>, enriched?: Record<string, unknown>) {\n const name = String(enriched?.indexName ?? raw.indexName ?? '').trim()\n if (name) return name\n const market = String(raw.marketAddress ?? '').trim()\n return market ? `Market ${market.slice(0, 6)}…` : 'Position'\n}\n\nexport async function gmxFormatPositionsForDisplay(\n chainId: number,\n positions: Array<Record<string, unknown>>,\n): Promise<GmxPositionDisplayRow[]> {\n if (positions.length === 0) return []\n const ctx = await loadGmxMarketContext(chainId)\n\n return positions.map((raw, i) => {\n const marketAddress = String(raw.marketAddress ?? '')\n const marketInfo = marketAddress ? ctx.marketsInfoData[marketAddress] : undefined\n let enriched: Record<string, unknown> | undefined\n if (marketInfo) {\n try {\n enriched = getPositionInfo({\n position: raw,\n marketInfo,\n minCollateralUsd: ctx.minCollateralUsd,\n userReferralInfo: undefined,\n showPnlInLeverage: false,\n uiFeeFactor: 0n,\n }) as Record<string, unknown>\n } catch {\n enriched = undefined\n }\n }\n\n const source = enriched ?? raw\n const collateralToken = source.collateralToken as { symbol?: string } | undefined\n\n return {\n key: String(raw.key ?? raw.contractKey ?? `${marketAddress}-${i}`),\n indexName: pickIndexName(raw, enriched),\n isLong: Boolean(source.isLong ?? raw.isLong),\n sizeUsd: formatGmxUsd30(asBigint(source.sizeInUsd ?? raw.sizeInUsd)),\n collateralUsd: formatGmxUsd30(asBigint(source.collateralUsd ?? raw.collateralUsd)),\n collateralSymbol: collateralToken?.symbol ? String(collateralToken.symbol) : null,\n entryPriceUsd: formatGmxUsd30(asBigint(source.entryPrice)),\n markPriceUsd: formatGmxUsd30(asBigint(source.markPrice)),\n liquidationPriceUsd: formatGmxUsd30(asBigint(source.liquidationPrice)),\n leverageLabel: formatGmxLeverageBps(asBigint(source.leverage ?? source.leverageWithoutPnl)),\n pnlUsd: formatGmxUsd30(asBigint(source.pnl)),\n }\n })\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { formatGmxLeverageBps } from './format.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { getMaxAllowedLeverage } = require('@gmx-io/sdk/utils/markets') as {\n getMaxAllowedLeverage: (args: {\n minCollateralFactor?: bigint\n minCollateralFactorForLiquidation?: bigint\n positionFeeFactorForBalanceWasNotImproved?: bigint\n }) => number\n}\n\nexport function gmxMarketMaxLeverageBps(marketInfo: Record<string, unknown>): number {\n return getMaxAllowedLeverage({\n minCollateralFactor: marketInfo.minCollateralFactor as bigint | undefined,\n minCollateralFactorForLiquidation: marketInfo.minCollateralFactorForLiquidation as bigint | undefined,\n positionFeeFactorForBalanceWasNotImproved: marketInfo.positionFeeFactorForBalanceWasNotImproved as\n | bigint\n | undefined,\n })\n}\n\nexport function gmxMarketMaxLeverageLabel(marketInfo: Record<string, unknown>): string | null {\n const bps = gmxMarketMaxLeverageBps(marketInfo)\n if (!Number.isFinite(bps) || bps <= 0) return null\n return formatGmxLeverageBps(BigInt(bps))\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport type { Address } from 'viem'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { getContract } = require('@gmx-io/sdk/configs/contracts') as {\n getContract: (chainId: number, name: string) => string\n}\n\nexport function gmxContractAddress(chainId: number, name: string): Address {\n const raw = getContract(chainId, name)\n if (!raw || raw === '0x0000000000000000000000000000000000000000') {\n throw new Error(`GMX contract \"${name}\" is not configured for chain ${chainId}.`)\n }\n return raw as Address\n}\n","import { getAddress } from 'viem'\nimport { getGmxApiSdk } from './api.js'\nimport { gmxFormatPositionsForDisplay } from './positionDisplay.js'\nimport { gmxMarketMaxLeverageLabel } from './leverage.js'\nimport { loadGmxMarketContext } from './marketContext.js'\nimport {\n gmxFetchGmMarketsSummary,\n gmxFetchMarkets,\n gmxFetchTokens,\n gmxResolveMarketByGmTokenAddress,\n} from './markets.js'\nimport { gmxContractAddress } from './contracts.js'\n\nexport async function gmxFetchPositionsForExecutor(args: { chainId: number; executorAddress: string }) {\n const sdk = getGmxApiSdk(args.chainId)\n const positions = await sdk.fetchPositionsInfo({\n address: args.executorAddress,\n includeRelatedOrders: true,\n })\n return {\n positions: positions as Array<Record<string, unknown>>,\n }\n}\n\nexport async function gmxFetchPositionDisplayRows(args: { chainId: number; executorAddress: string }) {\n const { positions } = await gmxFetchPositionsForExecutor(args)\n return gmxFormatPositionsForDisplay(args.chainId, positions)\n}\n\nexport async function gmxFetchOrdersForExecutor(args: { chainId: number; executorAddress: string }) {\n const sdk = getGmxApiSdk(args.chainId)\n return sdk.fetchOrders({ address: args.executorAddress })\n}\n\nexport async function gmxFetchMarketsSummary(args: { chainId: number }) {\n const [markets, ctx] = await Promise.all([gmxFetchMarkets(args.chainId), loadGmxMarketContext(args.chainId)])\n return {\n markets: markets.map((m) => {\n const addr = String(m.marketTokenAddress ?? '')\n const info =\n ctx.marketsInfoData[addr] ??\n ctx.marketsInfoData[addr.toLowerCase()] ??\n Object.values(ctx.marketsInfoData).find(\n (row) => String(row.marketTokenAddress ?? '').toLowerCase() === addr.toLowerCase(),\n )\n return {\n symbol: m.symbol,\n marketTokenAddress: m.marketTokenAddress,\n maxLeverageLabel: info ? gmxMarketMaxLeverageLabel(info) : null,\n }\n }),\n }\n}\n\nexport async function gmxFetchCollateralTokens(args: { chainId: number }) {\n const tokens = await gmxFetchTokens(args.chainId)\n return tokens.map((t) => ({\n symbol: t.symbol,\n address: t.address,\n decimals: t.decimals,\n }))\n}\n\nexport async function gmxFetchGmMarkets(args: { chainId: number }) {\n const markets = await gmxFetchGmMarketsSummary(args.chainId)\n return { markets }\n}\n\n/** GM liquidity pool APY per market (sorted highest APY first). Read-only. */\nexport async function gmxFetchGmApy(args: { chainId: number }) {\n const { markets } = await gmxFetchGmMarkets(args)\n const sorted = [...markets].sort((a, b) => (b.apy ?? 0) - (a.apy ?? 0))\n return { markets: sorted }\n}\n\nexport async function gmxFetchStakingPower(args: { chainId: number; executorAddress: string }) {\n const sdk = getGmxApiSdk(args.chainId)\n const power = await sdk.fetchStakingPower({ address: args.executorAddress })\n return {\n stakingPower: JSON.parse(JSON.stringify(power, (_, v) => (typeof v === 'bigint' ? v.toString() : v))),\n }\n}\n\nexport async function gmxFetchGmMarketForToken(args: { chainId: number; gmTokenAddress: string }) {\n const market = await gmxResolveMarketByGmTokenAddress(args.chainId, args.gmTokenAddress)\n if (!market) return { market: null }\n const tokens = await gmxFetchTokens(args.chainId)\n const tokenByAddr = new Map(tokens.map((t) => [t.address.toLowerCase(), t]))\n const long = tokenByAddr.get((market.longTokenAddress ?? '').toLowerCase())\n const short = tokenByAddr.get((market.shortTokenAddress ?? '').toLowerCase())\n return {\n market: {\n symbol: market.symbol,\n marketTokenAddress: market.marketTokenAddress,\n longTokenSymbol: long?.symbol ?? null,\n shortTokenSymbol: short?.symbol ?? null,\n gmDecimals: 18,\n },\n }\n}\n\nexport function gmxGmxTokenAddress(chainId: number): string {\n return gmxContractAddress(chainId, 'GMX')\n}\n\nexport async function gmxIsGmMarketTokenAddress(chainId: number, tokenAddress: string): Promise<boolean> {\n try {\n const market = await gmxResolveMarketByGmTokenAddress(chainId, tokenAddress)\n return market != null\n } catch {\n return false\n }\n}\n\nexport function gmxIsGmxStakeTokenAddress(chainId: number, tokenAddress: string): boolean {\n try {\n return getAddress(tokenAddress).toLowerCase() === gmxGmxTokenAddress(chainId).toLowerCase()\n } catch {\n return false\n }\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string, purposeSuffix?: string): string {\n const t = purposeText.trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload)\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import { getAddress } from 'viem'\nimport { isGmxChainSupported } from './support.js'\nimport type { GmxTokenRow } from './api.js'\n\n/** Wrapped native collateral symbol GMX perp markets accept (not the zero-address gas token). */\nexport const GMX_WRAPPED_NATIVE_SYMBOL_BY_CHAIN: Partial<Record<number, string>> = {\n 42161: 'WETH',\n 43114: 'WAVAX',\n}\n\n/** Native gas token symbol for GMX receiveToken unwrap on decrease. */\nexport const GMX_NATIVE_GAS_SYMBOL_BY_CHAIN: Partial<Record<number, string>> = {\n 42161: 'ETH',\n 43114: 'AVAX',\n}\n\nexport function gmxWrappedNativeSymbolForChain(chainId: number): string | null {\n if (!isGmxChainSupported(chainId)) return null\n return GMX_WRAPPED_NATIVE_SYMBOL_BY_CHAIN[chainId] ?? null\n}\n\nexport function gmxNativeGasSymbolForChain(chainId: number): string | null {\n if (!isGmxChainSupported(chainId)) return null\n return GMX_NATIVE_GAS_SYMBOL_BY_CHAIN[chainId] ?? null\n}\n\nexport function gmxFindWrappedNativeToken(tokens: readonly GmxTokenRow[], chainId: number): GmxTokenRow | null {\n const sym = gmxWrappedNativeSymbolForChain(chainId)\n if (!sym) return null\n return tokens.find((t) => t.symbol?.toUpperCase() === sym.toUpperCase()) ?? null\n}\n\n/** Map node asset row address to GMX collateral lookup key (native gas row → wrapped ERC-20). */\nexport function gmxKeyForNodeAssetRow(args: {\n contractAddress: string\n nativeWrapped: string | null\n}): string | null {\n const raw = (args.contractAddress ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === '0x0000000000000000000000000000000000000000' && args.nativeWrapped) {\n return getAddress(args.nativeWrapped.trim() as `0x${string}`).toLowerCase()\n }\n return a.toLowerCase()\n } catch {\n return null\n }\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { parseGmxTokenAmount, parseGmxUsd30 } from './amounts.js'\nimport {\n formatGmxLeverageBps,\n formatGmxTokenAmountHuman,\n formatGmxUsd30,\n formatGmxUsd30HumanInput,\n} from './format.js'\nimport { gmxMarketMaxLeverageBps, gmxMarketMaxLeverageLabel } from './leverage.js'\nimport { loadGmxMarketContext, resolveGmxMarketBySymbol, resolveGmxTokenBySymbol } from './marketContext.js'\nimport { getGmxApiSdk } from './api.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { getIncreasePositionAmounts, getNextPositionValuesForIncreaseTrade } = require('@gmx-io/sdk/utils/trade') as {\n getIncreasePositionAmounts: (p: Record<string, unknown>) => Record<string, unknown>\n getNextPositionValuesForIncreaseTrade: (p: Record<string, unknown>) => Record<string, unknown>\n}\nconst { getDecreasePositionAmounts, getNextPositionValuesForDecreaseTrade } = require('@gmx-io/sdk/utils/trade') as {\n getDecreasePositionAmounts: (p: Record<string, unknown>) => Record<string, unknown>\n getNextPositionValuesForDecreaseTrade: (p: Record<string, unknown>) => Record<string, unknown>\n}\nconst { createFindSwapPath } = require('@gmx-io/sdk/utils/swap') as {\n createFindSwapPath: (p: Record<string, unknown>) => (args: Record<string, unknown>) => unknown\n}\nconst { SwapPricingType } = require('@gmx-io/sdk/utils/orders') as { SwapPricingType: { Swap: unknown } }\nconst { convertToTokenAmount } = require('@gmx-io/sdk/utils/tokens') as {\n convertToTokenAmount: (usd: bigint, decimals: number, price: bigint) => bigint\n}\nconst { getPositionInfo } = require('@gmx-io/sdk/utils/positions') as {\n getPositionInfo: (p: Record<string, unknown>) => Record<string, unknown>\n}\n\nexport type GmxTradeEstimate = {\n direction: 'long' | 'short'\n marketSymbol: string\n sizeUsdHuman: string\n collateralSymbol: string\n collateralAmountHuman: string | null\n /** Current open position size (Close tab); use for MAX and validation. */\n openPositionSizeUsdHuman: string | null\n openPositionSizeUsdLabel: string | null\n entryPriceUsd: string | null\n liquidationPriceUsd: string | null\n leverageLabel: string | null\n maxLeverageLabel: string | null\n minCollateralAmountHuman: string | null\n exceedsMaxLeverage: boolean\n note: string | null\n}\n\nfunction asBigint(v: unknown): bigint | undefined {\n if (v == null) return undefined\n try {\n return typeof v === 'bigint' ? v : BigInt(String(v))\n } catch {\n return undefined\n }\n}\n\nfunction findSwapPathForCollateral(args: {\n chainId: number\n fromToken: Record<string, unknown>\n collateralToken: Record<string, unknown>\n marketsInfoData: Record<string, Record<string, unknown>>\n tokensData: Record<string, Record<string, unknown>>\n}) {\n return createFindSwapPath({\n chainId: args.chainId,\n fromTokenAddress: args.fromToken.address,\n toTokenAddress: args.collateralToken.address,\n marketsInfoData: args.marketsInfoData,\n gasEstimationParams: { gasLimits: {}, gasPrice: 1n, tokensData: args.tokensData },\n swapPricingType: SwapPricingType.Swap,\n })\n}\n\ntype IncreaseSimContext = {\n chainId: number\n market: Record<string, unknown>\n collateralToken: Record<string, unknown>\n fromToken: Record<string, unknown>\n isLong: boolean\n sizeUsd: bigint\n indexToken: Record<string, unknown>\n indexTokenAmount: bigint\n findSwapPath: ReturnType<typeof findSwapPathForCollateral>\n existingPosition: Record<string, unknown> | undefined\n ctx: Awaited<ReturnType<typeof loadGmxMarketContext>>\n maxLeverageBps: number\n maxLeverageLabel: string | null\n collateralDecimals: number\n}\n\nasync function loadIncreaseSimContext(args: {\n chainId: number\n symbol: string\n direction: 'long' | 'short'\n sizeUsdHuman: string\n collateralToken: string\n executorAddress?: string\n}): Promise<IncreaseSimContext> {\n const market = await resolveGmxMarketBySymbol(args.chainId, args.symbol)\n if (!market) throw new Error(`GMX market not found: ${args.symbol}`)\n\n const collateralToken = await resolveGmxTokenBySymbol(args.chainId, args.collateralToken)\n if (!collateralToken) throw new Error(`GMX collateral token not found: ${args.collateralToken}`)\n\n const ctx = await loadGmxMarketContext(args.chainId)\n const fromToken = collateralToken\n const isLong = args.direction === 'long'\n const sizeUsd = parseGmxUsd30(args.sizeUsdHuman)\n\n const indexToken = market.indexToken as Record<string, unknown>\n const indexPrices = indexToken.prices as { minPrice?: bigint } | undefined\n const indexPrice = asBigint(indexPrices?.minPrice)\n if (!indexPrice || indexPrice <= 0n) throw new Error('GMX index price unavailable for estimate.')\n\n const indexTokenAmount = convertToTokenAmount(sizeUsd, Number(indexToken.decimals ?? 18), indexPrice)\n const findSwapPath = findSwapPathForCollateral({\n chainId: args.chainId,\n fromToken,\n collateralToken,\n marketsInfoData: ctx.marketsInfoData,\n tokensData: ctx.tokensData,\n })\n\n let existingPosition: Record<string, unknown> | undefined\n if (args.executorAddress?.trim()) {\n const sdk = getGmxApiSdk(args.chainId)\n const positions = await sdk.fetchPositionsInfo({ address: args.executorAddress.trim() })\n existingPosition = positions.find(\n (p) =>\n String(p.marketAddress ?? '').toLowerCase() === String(market.marketTokenAddress ?? '').toLowerCase() &&\n Boolean(p.isLong) === isLong,\n ) as Record<string, unknown> | undefined\n if (existingPosition && ctx.marketsInfoData[String(market.marketTokenAddress)]) {\n existingPosition = getPositionInfo({\n position: existingPosition,\n marketInfo: market,\n minCollateralUsd: ctx.minCollateralUsd,\n userReferralInfo: undefined,\n showPnlInLeverage: false,\n uiFeeFactor: 0n,\n }) as Record<string, unknown>\n }\n }\n\n const maxLeverageBps = gmxMarketMaxLeverageBps(market)\n return {\n chainId: args.chainId,\n market,\n collateralToken,\n fromToken,\n isLong,\n sizeUsd,\n indexToken,\n indexTokenAmount,\n findSwapPath,\n existingPosition,\n ctx,\n maxLeverageBps,\n maxLeverageLabel: gmxMarketMaxLeverageLabel(market),\n collateralDecimals: Number(collateralToken.decimals ?? 18),\n }\n}\n\nfunction simulateIncreaseAtCollateralWei(\n sim: IncreaseSimContext,\n collateralAmount: bigint,\n): { nextLeverageBps: bigint | null; nextEntryPrice: bigint | null; nextLiqPrice: bigint | null } {\n const increaseAmounts = getIncreasePositionAmounts({\n marketInfo: sim.market,\n indexToken: sim.indexToken,\n initialCollateralToken: sim.fromToken,\n collateralToken: sim.collateralToken,\n isLong: sim.isLong,\n initialCollateralAmount: collateralAmount,\n position: sim.existingPosition,\n indexTokenAmount: sim.indexTokenAmount,\n strategy: 'independent',\n findSwapPath: sim.findSwapPath,\n uiFeeFactor: 0n,\n marketsInfoData: sim.ctx.marketsInfoData,\n chainId: sim.chainId,\n externalSwapQuote: undefined,\n externalSwapQuoteParams: undefined,\n isSetAcceptablePriceImpactEnabled: false,\n userReferralInfo: undefined,\n })\n\n const next = getNextPositionValuesForIncreaseTrade({\n existingPosition: sim.existingPosition,\n marketInfo: sim.market,\n collateralToken: sim.collateralToken,\n positionPriceImpactDeltaUsd: increaseAmounts.positionPriceImpactDeltaUsd,\n sizeDeltaUsd: increaseAmounts.sizeDeltaUsd,\n sizeDeltaInTokens: increaseAmounts.sizeDeltaInTokens,\n collateralDeltaUsd: increaseAmounts.collateralDeltaUsd,\n collateralDeltaAmount: increaseAmounts.collateralDeltaAmount,\n indexPrice: increaseAmounts.indexPrice,\n isLong: sim.isLong,\n showPnlInLeverage: false,\n minCollateralUsd: sim.ctx.minCollateralUsd,\n userReferralInfo: undefined,\n })\n\n return {\n nextLeverageBps: asBigint(next.nextLeverage) ?? null,\n nextEntryPrice: asBigint(next.nextEntryPrice) ?? null,\n nextLiqPrice: asBigint(next.nextLiqPrice) ?? null,\n }\n}\n\nfunction findMinCollateralWeiForIncrease(sim: IncreaseSimContext): bigint | null {\n const maxBps = BigInt(sim.maxLeverageBps)\n const collateralPrices = sim.collateralToken.prices as { minPrice?: bigint } | undefined\n const collateralPrice = asBigint(collateralPrices?.minPrice)\n if (!collateralPrice || collateralPrice <= 0n) return null\n\n let hi = convertToTokenAmount(sim.sizeUsd * 2n, sim.collateralDecimals, collateralPrice)\n if (hi < 1n) hi = 1n\n\n const hiSim = simulateIncreaseAtCollateralWei(sim, hi)\n if (hiSim.nextLeverageBps == null || hiSim.nextLeverageBps > maxBps) {\n return null\n }\n\n let lo = 0n\n while (lo < hi) {\n const mid = (lo + hi) / 2n\n const probe = mid === 0n ? 1n : mid\n const { nextLeverageBps } = simulateIncreaseAtCollateralWei(sim, probe)\n if (nextLeverageBps != null && nextLeverageBps <= maxBps) {\n hi = probe\n } else {\n lo = probe + 1n\n }\n }\n return lo > 0n ? lo : 1n\n}\n\nexport async function gmxEstimateIncreasePreview(args: {\n chainId: number\n symbol: string\n direction: 'long' | 'short'\n sizeUsdHuman: string\n collateralToken: string\n collateralAmountHuman: string\n executorAddress?: string\n}): Promise<GmxTradeEstimate> {\n const sim = await loadIncreaseSimContext(args)\n const collateralAmount = parseGmxTokenAmount(args.collateralAmountHuman, sim.collateralDecimals)\n const { nextLeverageBps, nextEntryPrice, nextLiqPrice } = simulateIncreaseAtCollateralWei(sim, collateralAmount)\n\n const entry = formatGmxUsd30(nextEntryPrice)\n const liq = formatGmxUsd30(nextLiqPrice)\n const lev = formatGmxLeverageBps(nextLeverageBps)\n const maxBps = BigInt(sim.maxLeverageBps)\n const minWei = findMinCollateralWeiForIncrease(sim)\n const minCollateralAmountHuman =\n minWei != null ? formatGmxTokenAmountHuman(minWei, sim.collateralDecimals) : null\n const exceedsMaxLeverage =\n (nextLeverageBps != null && nextLeverageBps > maxBps) ||\n (minWei != null && collateralAmount < minWei)\n\n return {\n direction: args.direction,\n marketSymbol: args.symbol.trim(),\n sizeUsdHuman: args.sizeUsdHuman.trim(),\n collateralSymbol: args.collateralToken.trim(),\n collateralAmountHuman: args.collateralAmountHuman.trim(),\n openPositionSizeUsdHuman: null,\n openPositionSizeUsdLabel: null,\n entryPriceUsd: entry,\n liquidationPriceUsd: liq,\n leverageLabel: lev,\n maxLeverageLabel: sim.maxLeverageLabel,\n minCollateralAmountHuman,\n exceedsMaxLeverage,\n note: sim.existingPosition ? 'Estimated after adding to your open position.' : 'Estimated for a new position.',\n }\n}\n\nexport type GmxClosePositionCap = {\n openPositionSizeUsdHuman: string | null\n openPositionSizeUsdLabel: string | null\n}\n\nasync function gmxFindRawClosePosition(args: {\n chainId: number\n symbol: string\n direction: 'long' | 'short'\n executorAddress: string\n}) {\n const market = await resolveGmxMarketBySymbol(args.chainId, args.symbol)\n if (!market) return undefined\n const isLong = args.direction === 'long'\n const sdk = getGmxApiSdk(args.chainId)\n const rawPositions = await sdk.fetchPositionsInfo({ address: args.executorAddress.trim() })\n return rawPositions.find(\n (p) =>\n String(p.marketAddress ?? '').toLowerCase() === String(market.marketTokenAddress ?? '').toLowerCase() &&\n Boolean(p.isLong) === isLong,\n ) as Record<string, unknown> | undefined\n}\n\nexport async function gmxFetchClosePositionCap(args: {\n chainId: number\n symbol: string\n direction: 'long' | 'short'\n executorAddress: string\n}): Promise<GmxClosePositionCap> {\n const raw = await gmxFindRawClosePosition(args)\n if (!raw) {\n return { openPositionSizeUsdHuman: null, openPositionSizeUsdLabel: null }\n }\n const sizeInUsd = raw.sizeInUsd as bigint | string | number | null | undefined\n return {\n openPositionSizeUsdHuman: formatGmxUsd30HumanInput(sizeInUsd),\n openPositionSizeUsdLabel: formatGmxUsd30(sizeInUsd),\n }\n}\n\nexport async function gmxEstimateDecreasePreview(args: {\n chainId: number\n symbol: string\n direction: 'long' | 'short'\n sizeUsdHuman: string\n collateralToken: string\n executorAddress: string\n}): Promise<GmxTradeEstimate> {\n const market = await resolveGmxMarketBySymbol(args.chainId, args.symbol)\n if (!market) throw new Error(`GMX market not found: ${args.symbol}`)\n\n const collateralToken = await resolveGmxTokenBySymbol(args.chainId, args.collateralToken)\n if (!collateralToken) throw new Error(`GMX collateral token not found: ${args.collateralToken}`)\n\n const ctx = await loadGmxMarketContext(args.chainId)\n const isLong = args.direction === 'long'\n const closeSizeUsd = parseGmxUsd30(args.sizeUsdHuman)\n\n const raw = await gmxFindRawClosePosition({\n chainId: args.chainId,\n symbol: args.symbol,\n direction: args.direction,\n executorAddress: args.executorAddress,\n })\n\n if (!raw) {\n return {\n direction: args.direction,\n marketSymbol: args.symbol.trim(),\n sizeUsdHuman: args.sizeUsdHuman.trim(),\n collateralSymbol: args.collateralToken.trim(),\n collateralAmountHuman: null,\n openPositionSizeUsdHuman: null,\n openPositionSizeUsdLabel: null,\n entryPriceUsd: null,\n liquidationPriceUsd: null,\n leverageLabel: null,\n maxLeverageLabel: gmxMarketMaxLeverageLabel(market),\n minCollateralAmountHuman: null,\n exceedsMaxLeverage: false,\n note: 'No matching open position found for this market and direction.',\n }\n }\n\n const sizeInUsd = raw.sizeInUsd as bigint | string | number | null | undefined\n const openPositionSizeUsdHuman = formatGmxUsd30HumanInput(sizeInUsd)\n const openPositionSizeUsdLabel = formatGmxUsd30(sizeInUsd)\n\n const position = getPositionInfo({\n position: raw,\n marketInfo: market,\n minCollateralUsd: ctx.minCollateralUsd,\n userReferralInfo: undefined,\n showPnlInLeverage: false,\n uiFeeFactor: 0n,\n }) as Record<string, unknown>\n\n const decreaseAmounts = getDecreasePositionAmounts({\n marketInfo: market,\n collateralToken: position.collateralToken ?? collateralToken,\n isLong,\n position,\n closeSizeUsd,\n keepLeverage: false,\n userReferralInfo: undefined,\n minCollateralUsd: ctx.minCollateralUsd,\n minPositionSizeUsd: 1n,\n uiFeeFactor: 0n,\n isSetAcceptablePriceImpactEnabled: false,\n })\n\n const next = getNextPositionValuesForDecreaseTrade({\n existingPosition: position,\n marketInfo: market,\n collateralToken: position.collateralToken ?? collateralToken,\n sizeDeltaUsd: decreaseAmounts.sizeDeltaUsd,\n sizeDeltaInTokens: decreaseAmounts.sizeDeltaInTokens,\n realizedPnl: decreaseAmounts.realizedPnl,\n estimatedPnl: decreaseAmounts.estimatedPnl,\n collateralDeltaUsd: decreaseAmounts.collateralDeltaUsd,\n collateralDeltaAmount: decreaseAmounts.collateralDeltaAmount,\n payedRemainingCollateralUsd: decreaseAmounts.payedRemainingCollateralUsd,\n payedRemainingCollateralAmount: decreaseAmounts.payedRemainingCollateralAmount,\n proportionalPendingImpactDeltaUsd: decreaseAmounts.proportionalPendingImpactDeltaUsd,\n showPnlInLeverage: false,\n isLong,\n minCollateralUsd: ctx.minCollateralUsd,\n userReferralInfo: undefined,\n })\n\n const nextSize = asBigint(next.nextSizeUsd) ?? 0n\n const liq =\n nextSize > 0n ? formatGmxUsd30(asBigint(next.nextLiqPrice)) : null\n const lev = nextSize > 0n ? formatGmxLeverageBps(asBigint(next.nextLeverage)) : null\n\n const fullClose = nextSize <= 0n\n return {\n direction: args.direction,\n marketSymbol: args.symbol.trim(),\n sizeUsdHuman: args.sizeUsdHuman.trim(),\n collateralSymbol: args.collateralToken.trim(),\n collateralAmountHuman: null,\n openPositionSizeUsdHuman,\n openPositionSizeUsdLabel,\n entryPriceUsd: formatGmxUsd30(asBigint(position.entryPrice)),\n liquidationPriceUsd: liq,\n leverageLabel: lev,\n maxLeverageLabel: gmxMarketMaxLeverageLabel(market),\n minCollateralAmountHuman: null,\n exceedsMaxLeverage: false,\n note: fullClose\n ? 'Full close — no remaining position after this order.'\n : 'Estimated remaining position after this close.',\n }\n}\n\nexport async function gmxAssertIncreaseOrderWithinMaxLeverage(args: {\n chainId: number\n symbol: string\n direction: 'long' | 'short'\n sizeUsdHuman: string\n collateralToken: string\n collateralAmountHuman: string\n executorAddress?: string\n}): Promise<void> {\n const estimate = await gmxEstimateIncreasePreview(args)\n if (!estimate.exceedsMaxLeverage) return\n const maxLev = estimate.maxLeverageLabel ?? 'market max'\n const minCol = estimate.minCollateralAmountHuman\n const sym = estimate.collateralSymbol\n if (minCol) {\n throw new Error(\n `Collateral is too low for ${maxLev} max leverage on ${estimate.marketSymbol}. Need at least ${minCol} ${sym}.`,\n )\n }\n throw new Error(\n `Collateral is too low for ${maxLev} max leverage on ${estimate.marketSymbol}. Increase collateral or reduce size.`,\n )\n}\n\n/** Returns true when close size is positive and does not exceed the open position. */\nexport function gmxIsCloseSizeWithinPosition(args: {\n closeSizeUsdHuman: string\n openPositionSizeUsdHuman: string\n}): boolean {\n try {\n const close = parseGmxUsd30(args.closeSizeUsdHuman)\n const open = parseGmxUsd30(args.openPositionSizeUsdHuman)\n return close > 0n && close <= open\n } catch {\n return false\n }\n}\n","import {\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n type Address,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport { getGmxApiSdk, type GmxPrepareOrderResponse } from './api.js'\nimport { parseGmxTokenAmount, parseGmxUsd30 } from './amounts.js'\nimport { gmxNativeGasSymbolForChain, gmxWrappedNativeSymbolForChain } from './native.js'\nimport { gmxAssertIncreaseOrderWithinMaxLeverage } from './estimates.js'\nimport { gmxResolveTokenBySymbol } from './markets.js'\n\nconst GMX_ORDER_GAS_FALLBACK = 2_500_000n\nconst GMX_WETH_DEPOSIT_FALLBACK = 120_000n\nconst GMX_ERC20_APPROVE_FALLBACK = 100_000n\n\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\ntype GmxMultisignCommon = {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n executorAddress: Address\n purposeText: string\n}\n\nexport type GmxIncreaseOrderArgs = GmxMultisignCommon & {\n symbol: string\n direction: 'long' | 'short'\n orderType: 'market' | 'limit'\n sizeUsdHuman: string\n collateralToken: string\n collateralAmountHuman: string\n triggerPriceUsdHuman?: string\n slippageBps?: number\n executionFeeBufferBps?: number\n isNativeIn?: boolean\n /** Wrapped native (WETH/WAVAX); required when `isNativeIn`. */\n nativeWrapped?: Address\n}\n\nexport type GmxDecreaseOrderArgs = GmxMultisignCommon & {\n symbol: string\n direction: 'long' | 'short'\n orderType: 'market' | 'limit'\n sizeUsdHuman: string\n collateralToken: string\n receiveToken?: string\n triggerPriceUsdHuman?: string\n keepLeverage?: boolean\n slippageBps?: number\n executionFeeBufferBps?: number\n /** When true, receive native gas token (GMX unwraps WETH/WAVAX in the order). */\n isNativeOut?: boolean\n}\n\nexport type GmxCancelOrderArgs = GmxMultisignCommon & {\n orderId: string\n}\n\nfunction payloadToStep(payload: GmxPrepareOrderResponse['payload']): EvmTxStep {\n if (!payload?.to || !payload?.data) {\n throw new Error('GMX prepareOrder did not return classic transaction calldata (to/data).')\n }\n const to = getAddress(payload.to.trim() as `0x${string}`)\n const raw = payload.data.toString()\n const data = (raw.startsWith('0x') ? raw : `0x${raw}`) as `0x${string}`\n let value = 0n\n if (payload.value != null) {\n value = typeof payload.value === 'bigint' ? payload.value : BigInt(String(payload.value))\n }\n return { to, data, value, fallbackGas: GMX_ORDER_GAS_FALLBACK }\n}\n\nasync function buildNativeCollateralPrepSteps(args: {\n chainId: number\n rpcUrl: string\n executorAddress: Address\n nativeWrapped: Address\n collateralToken: string\n collateralAmountHuman: string\n exchangeRouter: Address\n}): Promise<EvmTxStep[]> {\n const weth = getAddress(args.nativeWrapped)\n const executor = getAddress(args.executorAddress)\n const router = getAddress(args.exchangeRouter)\n const token = await gmxResolveTokenBySymbol(args.chainId, args.collateralToken)\n const amountWei = parseGmxTokenAmount(args.collateralAmountHuman, token.decimals)\n if (amountWei === 0n) throw new Error('Collateral amount is zero after converting with token decimals.')\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Native', symbol: 'N' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const steps: EvmTxStep[] = []\n const dataDeposit = encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit', args: [] })\n steps.push({ to: weth, data: dataDeposit, value: amountWei, fallbackGas: GMX_WETH_DEPOSIT_FALLBACK })\n\n const allowance = await publicClient.readContract({\n address: weth,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, router],\n })\n if (allowance < amountWei) {\n if (allowance > 0n) {\n steps.push({\n to: weth,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [router, 0n] }),\n value: 0n,\n fallbackGas: GMX_ERC20_APPROVE_FALLBACK,\n })\n }\n steps.push({\n to: weth,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [router, amountWei] }),\n value: 0n,\n fallbackGas: GMX_ERC20_APPROVE_FALLBACK,\n })\n }\n return steps\n}\n\nasync function buildGmxClassicPreparedMultisignBatch(\n common: GmxMultisignCommon,\n prepared: GmxPrepareOrderResponse,\n signatureMeta: Record<string, unknown>,\n prepSteps: EvmTxStep[] = [],\n) {\n const executor = getAddress(common.executorAddress)\n const orderStep = payloadToStep(prepared.payload)\n const steps = [...prepSteps, orderStep]\n const firstStep = steps[0]!\n const dataNo0x = firstStep.data.startsWith('0x') ? firstStep.data.slice(2) : firstStep.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: common.keyGen,\n purposeText: common.purposeText,\n chainId: common.chainId,\n rpcUrl: common.rpcUrl,\n executorAddress: executor,\n chainDetail: common.chainDetail,\n useCustomGas: common.useCustomGas,\n customGasChainDetails: common.customGasChainDetails,\n },\n steps,\n purposeSuffix: 'GMX: classic on-chain order (keeper-executed asynchronously).',\n firstMsgRawNo0x: dataNo0x,\n destinationAddress: firstStep.to,\n resolveGasLimit: async ({ estimatedGas, index }) => {\n const step = steps[index]\n const fallback = step?.fallbackGas ?? GMX_ORDER_GAS_FALLBACK\n return estimatedGas > fallback ? estimatedGas : fallback\n },\n buildBatchMeta: ({ index }) => {\n if (index < prepSteps.length) {\n const kind = index === 0 && prepSteps[0]?.value > 0n ? 'weth_deposit' : 'approve'\n return {\n signatureText: JSON.stringify({ kind: 'GMX', step: kind, ...signatureMeta }),\n evm: { type: kind === 'weth_deposit' ? 'gmx_weth_deposit' : 'gmx_erc20_approve', version: 1, chainId: String(common.chainId) },\n }\n }\n return {\n signatureText: JSON.stringify({\n kind: 'GMX',\n mode: 'classic',\n ...signatureMeta,\n }),\n evm: { type: 'gmx_classic_order', version: 1, chainId: String(common.chainId) },\n }\n },\n })\n}\n\nasync function collateralToPay(collateralToken: string, collateralAmountHuman: string, chainId: number) {\n const token = await gmxResolveTokenBySymbol(chainId, collateralToken)\n const amount = parseGmxTokenAmount(collateralAmountHuman, token.decimals)\n return { amount, token: token.symbol }\n}\n\nfunction resolveIncreaseCollateralToken(args: GmxIncreaseOrderArgs): string {\n if (args.isNativeIn) {\n const wrapped = gmxWrappedNativeSymbolForChain(args.chainId)\n if (!wrapped) throw new Error('Wrapped native collateral symbol is not configured for this chain.')\n return wrapped\n }\n return args.collateralToken.trim()\n}\n\nexport async function buildEvmMultisignBodyGmxIncreaseBatch(args: GmxIncreaseOrderArgs) {\n const sdk = getGmxApiSdk(args.chainId)\n const executor = getAddress(args.executorAddress)\n const size = parseGmxUsd30(args.sizeUsdHuman)\n const collateralSymbol = resolveIncreaseCollateralToken(args)\n await gmxAssertIncreaseOrderWithinMaxLeverage({\n chainId: args.chainId,\n symbol: args.symbol.trim(),\n direction: args.direction,\n sizeUsdHuman: args.sizeUsdHuman,\n collateralToken: collateralSymbol,\n collateralAmountHuman: args.collateralAmountHuman,\n executorAddress: executor,\n })\n const collateralToPayArg = await collateralToPay(collateralSymbol, args.collateralAmountHuman, args.chainId)\n\n if (args.isNativeIn) {\n if (!args.nativeWrapped) throw new Error('nativeWrapped is required when isNativeIn is true.')\n const wrapped = gmxWrappedNativeSymbolForChain(args.chainId)\n if (collateralSymbol.toUpperCase() !== wrapped?.toUpperCase()) {\n throw new Error('Native GMX collateral path requires the chain wrapped native token.')\n }\n }\n\n const prepareArgs: Record<string, unknown> = {\n kind: 'increase',\n symbol: args.symbol.trim(),\n direction: args.direction,\n orderType: args.orderType,\n size,\n collateralToken: collateralSymbol,\n collateralToPay: collateralToPayArg,\n mode: 'classic',\n from: executor,\n }\n if (args.orderType === 'limit') {\n if (!args.triggerPriceUsdHuman?.trim()) throw new Error('Limit orders require triggerPriceUsdHuman.')\n prepareArgs.triggerPrice = parseGmxUsd30(args.triggerPriceUsdHuman)\n }\n if (args.slippageBps != null) prepareArgs.slippage = args.slippageBps\n if (args.executionFeeBufferBps != null) prepareArgs.executionFeeBufferBps = args.executionFeeBufferBps\n\n const prepared = await sdk.prepareOrder(prepareArgs)\n if (prepared.payloadType !== 'transaction') {\n throw new Error('GMX prepareOrder returned typed-data; classic mode required for MPC multi-sign.')\n }\n\n const orderStep = payloadToStep(prepared.payload)\n\n let prepSteps: EvmTxStep[] = []\n if (args.isNativeIn && args.nativeWrapped) {\n prepSteps = await buildNativeCollateralPrepSteps({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n nativeWrapped: args.nativeWrapped,\n collateralToken: collateralSymbol,\n collateralAmountHuman: args.collateralAmountHuman,\n exchangeRouter: orderStep.to,\n })\n }\n\n return buildGmxClassicPreparedMultisignBatch(\n args,\n prepared,\n {\n action: 'increase',\n symbol: args.symbol,\n direction: args.direction,\n orderType: args.orderType,\n sizeUsdHuman: args.sizeUsdHuman,\n collateralToken: collateralSymbol,\n collateralAmountHuman: args.collateralAmountHuman,\n isNativeIn: Boolean(args.isNativeIn),\n },\n prepSteps,\n )\n}\n\nexport async function buildEvmMultisignBodyGmxDecreaseBatch(args: GmxDecreaseOrderArgs) {\n const sdk = getGmxApiSdk(args.chainId)\n const executor = getAddress(args.executorAddress)\n const size = parseGmxUsd30(args.sizeUsdHuman)\n\n const prepareArgs: Record<string, unknown> = {\n kind: 'decrease',\n symbol: args.symbol.trim(),\n direction: args.direction,\n orderType: args.orderType,\n size,\n collateralToken: args.collateralToken.trim(),\n mode: 'classic',\n from: executor,\n }\n if (args.isNativeOut) {\n const nativeSym = gmxNativeGasSymbolForChain(args.chainId)\n if (!nativeSym) throw new Error('Native receive symbol is not configured for this chain.')\n prepareArgs.receiveToken = nativeSym\n } else if (args.receiveToken?.trim()) {\n prepareArgs.receiveToken = args.receiveToken.trim()\n }\n if (args.keepLeverage != null) prepareArgs.keepLeverage = args.keepLeverage\n if (args.orderType === 'limit') {\n if (!args.triggerPriceUsdHuman?.trim()) throw new Error('Limit orders require triggerPriceUsdHuman.')\n prepareArgs.triggerPrice = parseGmxUsd30(args.triggerPriceUsdHuman)\n }\n if (args.slippageBps != null) prepareArgs.slippage = args.slippageBps\n if (args.executionFeeBufferBps != null) prepareArgs.executionFeeBufferBps = args.executionFeeBufferBps\n\n const prepared = await sdk.prepareOrder(prepareArgs)\n if (prepared.payloadType !== 'transaction') {\n throw new Error('GMX prepareOrder returned typed-data; classic mode required for MPC multi-sign.')\n }\n\n return buildGmxClassicPreparedMultisignBatch(args, prepared, {\n action: 'decrease',\n symbol: args.symbol,\n direction: args.direction,\n orderType: args.orderType,\n sizeUsdHuman: args.sizeUsdHuman,\n collateralToken: args.collateralToken,\n isNativeOut: Boolean(args.isNativeOut),\n })\n}\n\n/** Alias: limit increase uses orderType limit on increase builder. */\nexport const buildEvmMultisignBodyGmxLimitIncreaseBatch = buildEvmMultisignBodyGmxIncreaseBatch\n\n/** Alias: limit decrease uses orderType limit on decrease builder. */\nexport const buildEvmMultisignBodyGmxLimitDecreaseBatch = buildEvmMultisignBodyGmxDecreaseBatch\n\nexport async function buildEvmMultisignBodyGmxCancelBatch(args: GmxCancelOrderArgs) {\n const sdk = getGmxApiSdk(args.chainId)\n const executor = getAddress(args.executorAddress)\n const orderId = args.orderId.trim()\n if (!orderId) throw new Error('orderId is required to cancel a GMX order.')\n\n const prepared = await sdk.prepareCancelOrder({\n orderId,\n mode: 'classic',\n from: executor,\n })\n if (prepared.payloadType !== 'transaction') {\n throw new Error('GMX prepareCancelOrder returned typed-data; classic mode required for MPC multi-sign.')\n }\n\n return buildGmxClassicPreparedMultisignBatch(args, prepared, {\n action: 'cancel',\n orderId,\n })\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport {\n createPublicClient,\n defineChain,\n http,\n parseAbi,\n type Address,\n} from 'viem'\nimport { gmxContractAddress } from './contracts.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst {\n depositGasLimitKey,\n withdrawalGasLimitKey,\n singleSwapGasLimitKey,\n ESTIMATED_GAS_FEE_BASE_AMOUNT_V2_1,\n ESTIMATED_GAS_FEE_MULTIPLIER_FACTOR,\n ESTIMATED_GAS_FEE_PER_ORACLE_PRICE,\n} = require('@gmx-io/sdk/configs/dataStore') as {\n depositGasLimitKey: () => `0x${string}`\n withdrawalGasLimitKey: () => `0x${string}`\n singleSwapGasLimitKey: () => `0x${string}`\n ESTIMATED_GAS_FEE_BASE_AMOUNT_V2_1: `0x${string}`\n ESTIMATED_GAS_FEE_MULTIPLIER_FACTOR: `0x${string}`\n ESTIMATED_GAS_FEE_PER_ORACLE_PRICE: `0x${string}`\n}\nconst { applyFactor } = require('@gmx-io/sdk/utils/numbers') as {\n applyFactor: (value: bigint, factor: bigint) => bigint\n}\nconst {\n estimateExecuteDepositGasLimit,\n estimateExecuteWithdrawalGasLimit,\n} = require('@gmx-io/sdk/utils/fees') as {\n estimateExecuteDepositGasLimit: (\n gasLimits: {\n depositToken: bigint\n singleSwap: bigint\n },\n deposit: { swapsCount?: number; callbackGasLimit?: bigint },\n ) => bigint\n estimateExecuteWithdrawalGasLimit: (\n gasLimits: {\n withdrawalMultiToken: bigint\n singleSwap: bigint\n },\n withdrawal: { swapsCount?: bigint; callbackGasLimit?: bigint },\n ) => bigint\n}\n\nconst dataStoreAbi = parseAbi(['function getUint(bytes32 key) view returns (uint256)'])\n\ntype GmxGasLimits = {\n depositToken: bigint\n withdrawalMultiToken: bigint\n singleSwap: bigint\n estimatedGasFeeBaseAmount: bigint\n estimatedGasFeePerOraclePrice: bigint\n estimatedFeeMultiplierFactor: bigint\n}\n\nconst gasLimitsCache = new Map<number, GmxGasLimits>()\n\nasync function gmxLoadGasLimits(chainId: number, rpcUrl: string): Promise<GmxGasLimits> {\n const cached = gasLimitsCache.get(chainId)\n if (cached) return cached\n\n const dataStore = gmxContractAddress(chainId, 'DataStore')\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Native', symbol: 'N' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const keys = [\n ['depositToken', depositGasLimitKey()],\n ['withdrawalMultiToken', withdrawalGasLimitKey()],\n ['singleSwap', singleSwapGasLimitKey()],\n ['estimatedGasFeeBaseAmount', ESTIMATED_GAS_FEE_BASE_AMOUNT_V2_1],\n ['estimatedGasFeePerOraclePrice', ESTIMATED_GAS_FEE_PER_ORACLE_PRICE],\n ['estimatedFeeMultiplierFactor', ESTIMATED_GAS_FEE_MULTIPLIER_FACTOR],\n ] as const\n\n const limits = {\n depositToken: 0n,\n withdrawalMultiToken: 0n,\n singleSwap: 0n,\n estimatedGasFeeBaseAmount: 0n,\n estimatedGasFeePerOraclePrice: 0n,\n estimatedFeeMultiplierFactor: 0n,\n } satisfies GmxGasLimits\n\n await Promise.all(\n keys.map(async ([field, key]) => {\n const value = await publicClient.readContract({\n address: dataStore,\n abi: dataStoreAbi,\n functionName: 'getUint',\n args: [key],\n })\n limits[field] = value\n }),\n )\n\n gasLimitsCache.set(chainId, limits)\n return limits\n}\n\nfunction applyGmxExecutionFeeFormula(args: {\n gasLimits: GmxGasLimits\n estimatedGasLimit: bigint\n gasPrice: bigint\n oraclePriceCount: bigint\n bufferBps: number\n}): bigint {\n const { gasLimits, estimatedGasLimit, gasPrice, oraclePriceCount, bufferBps } = args\n let gasLimit = gasLimits.estimatedGasFeeBaseAmount\n gasLimit += gasLimits.estimatedGasFeePerOraclePrice * oraclePriceCount\n const multiplier = gasLimits.estimatedFeeMultiplierFactor\n gasLimit += applyFactor(estimatedGasLimit, multiplier)\n const buffered = gasLimit + (gasLimit * BigInt(bufferBps)) / 10_000n\n return buffered * gasPrice\n}\n\nconst DEFAULT_EXECUTION_FEE_BUFFER_BPS = 3000\n\nexport async function gmxEstimateGmExecutionFee(args: {\n chainId: number\n rpcUrl: string\n operation: 'deposit' | 'withdrawal'\n executionFeeBufferBps?: number\n}): Promise<bigint> {\n const bufferBps = args.executionFeeBufferBps ?? DEFAULT_EXECUTION_FEE_BUFFER_BPS\n const gasLimits = await gmxLoadGasLimits(args.chainId, args.rpcUrl)\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Native', symbol: 'N' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const gasPrice = await publicClient.getGasPrice()\n\n const oraclePriceCount = 3n\n const estimatedGasLimit =\n args.operation === 'deposit'\n ? estimateExecuteDepositGasLimit(gasLimits, { swapsCount: 0, callbackGasLimit: 0n })\n : estimateExecuteWithdrawalGasLimit(gasLimits, { swapsCount: 0n, callbackGasLimit: 0n })\n\n return applyGmxExecutionFeeFormula({\n gasLimits,\n estimatedGasLimit,\n gasPrice,\n oraclePriceCount,\n bufferBps,\n })\n}\n\nexport function gmxZeroAddress(): Address {\n return '0x0000000000000000000000000000000000000000'\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport {\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n type Address,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport { parseGmxTokenAmount } from './amounts.js'\nimport { gmxContractAddress } from './contracts.js'\nimport { gmxEstimateGmExecutionFee, gmxZeroAddress } from './executionFee.js'\nimport { gmxResolveMarketBySymbol, gmxResolveTokenBySymbol } from './markets.js'\nimport { gmxWrappedNativeSymbolForChain } from './native.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst ExchangeRouterAbi = require('@gmx-io/sdk/abis/ExchangeRouter').default as readonly unknown[]\n\nconst GMX_GM_MULTICALL_FALLBACK = 2_800_000n\nconst GMX_WETH_DEPOSIT_FALLBACK = 120_000n\nconst GMX_ERC20_APPROVE_FALLBACK = 100_000n\n\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\ntype GmxGmMultisignCommon = {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n executorAddress: Address\n purposeText: string\n}\n\nexport type GmxGmDepositArgs = GmxGmMultisignCommon & {\n marketSymbol: string\n collateralToken: string\n collateralAmountHuman: string\n executionFeeBufferBps?: number\n isNativeIn?: boolean\n nativeWrapped?: Address\n}\n\nexport type GmxGmWithdrawArgs = GmxGmMultisignCommon & {\n marketSymbol: string\n gmAmountHuman: string\n gmDecimals?: number\n executionFeeBufferBps?: number\n isNativeOut?: boolean\n}\n\nasync function buildApproveStepsIfNeeded(args: {\n chainId: number\n rpcUrl: string\n executorAddress: Address\n token: Address\n spender: Address\n amountWei: bigint\n}): Promise<EvmTxStep[]> {\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Native', symbol: 'N' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const allowance = await publicClient.readContract({\n address: args.token,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [args.executorAddress, args.spender],\n })\n if (allowance >= args.amountWei) return []\n const steps: EvmTxStep[] = []\n if (allowance > 0n) {\n steps.push({\n to: args.token,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [args.spender, 0n] }),\n value: 0n,\n fallbackGas: GMX_ERC20_APPROVE_FALLBACK,\n })\n }\n steps.push({\n to: args.token,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [args.spender, args.amountWei] }),\n value: 0n,\n fallbackGas: GMX_ERC20_APPROVE_FALLBACK,\n })\n return steps\n}\n\nasync function buildNativeWrapPrepSteps(args: {\n chainId: number\n rpcUrl: string\n executorAddress: Address\n nativeWrapped: Address\n exchangeRouter: Address\n amountWei: bigint\n}): Promise<EvmTxStep[]> {\n const weth = getAddress(args.nativeWrapped)\n const router = getAddress(args.exchangeRouter)\n const steps: EvmTxStep[] = []\n steps.push({\n to: weth,\n data: encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit', args: [] }),\n value: args.amountWei,\n fallbackGas: GMX_WETH_DEPOSIT_FALLBACK,\n })\n const approveSteps = await buildApproveStepsIfNeeded({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: args.executorAddress,\n token: weth,\n spender: router,\n amountWei: args.amountWei,\n })\n steps.push(...approveSteps)\n return steps\n}\n\nfunction resolveGmCollateralAddress(args: {\n chainId: number\n collateralToken: string\n isNativeIn?: boolean\n nativeWrapped?: Address\n}): Promise<Address> {\n if (args.isNativeIn) {\n if (!args.nativeWrapped) throw new Error('nativeWrapped is required when isNativeIn is true.')\n const wrapped = gmxWrappedNativeSymbolForChain(args.chainId)\n if (!wrapped) throw new Error('Wrapped native symbol is not configured for this chain.')\n if (args.collateralToken.trim().toUpperCase() !== wrapped.toUpperCase()) {\n throw new Error('Native GM deposit requires the chain wrapped native collateral symbol.')\n }\n return Promise.resolve(getAddress(args.nativeWrapped))\n }\n return gmxResolveTokenBySymbol(args.chainId, args.collateralToken).then((t) => getAddress(t.address as Address))\n}\n\nasync function buildGmLiquidityMultisignBatch(\n common: GmxGmMultisignCommon,\n steps: EvmTxStep[],\n signatureMeta: Record<string, unknown>,\n purposeSuffix: string,\n) {\n const executor = getAddress(common.executorAddress)\n const firstStep = steps[0]!\n const dataNo0x = firstStep.data.startsWith('0x') ? firstStep.data.slice(2) : firstStep.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: common.keyGen,\n purposeText: common.purposeText,\n chainId: common.chainId,\n rpcUrl: common.rpcUrl,\n executorAddress: executor,\n chainDetail: common.chainDetail,\n useCustomGas: common.useCustomGas,\n customGasChainDetails: common.customGasChainDetails,\n },\n steps,\n purposeSuffix,\n firstMsgRawNo0x: dataNo0x,\n destinationAddress: firstStep.to,\n resolveGasLimit: async ({ estimatedGas, index }) => {\n const step = steps[index]\n const fallback = step?.fallbackGas ?? GMX_GM_MULTICALL_FALLBACK\n return estimatedGas > fallback ? estimatedGas : fallback\n },\n buildBatchMeta: ({ index }) => {\n const step = steps[index]\n const isApprove = step?.fallbackGas === GMX_ERC20_APPROVE_FALLBACK\n const isWrap = step?.value > 0n && step?.fallbackGas === GMX_WETH_DEPOSIT_FALLBACK\n if (isWrap) {\n return {\n signatureText: JSON.stringify({ kind: 'GMX', step: 'weth_deposit', ...signatureMeta }),\n evm: { type: 'gmx_weth_deposit', version: 1, chainId: String(common.chainId) },\n }\n }\n if (isApprove) {\n return {\n signatureText: JSON.stringify({ kind: 'GMX', step: 'approve', ...signatureMeta }),\n evm: { type: 'gmx_erc20_approve', version: 1, chainId: String(common.chainId) },\n }\n }\n return {\n signatureText: JSON.stringify({ kind: 'GMX', ...signatureMeta }),\n evm: { type: 'gmx_gm_liquidity', version: 1, chainId: String(common.chainId) },\n }\n },\n })\n}\n\nexport async function buildEvmMultisignBodyGmxGmDepositBatch(args: GmxGmDepositArgs) {\n const executor = getAddress(args.executorAddress)\n const market = await gmxResolveMarketBySymbol(args.chainId, args.marketSymbol)\n const collateralAddr = await resolveGmCollateralAddress(args)\n const collateralRow = await gmxResolveTokenBySymbol(args.chainId, args.collateralToken)\n const amountWei = parseGmxTokenAmount(args.collateralAmountHuman, collateralRow.decimals)\n if (amountWei === 0n) throw new Error('Collateral amount is zero after converting with token decimals.')\n\n const longToken = getAddress(market.longTokenAddress as Address)\n const shortToken = getAddress(market.shortTokenAddress as Address)\n if (collateralAddr !== longToken && collateralAddr !== shortToken) {\n throw new Error('Collateral token is not a pool token for the selected GM market.')\n }\n\n const exchangeRouter = gmxContractAddress(args.chainId, 'ExchangeRouter')\n const depositVault = gmxContractAddress(args.chainId, 'DepositVault')\n const executionFee = await gmxEstimateGmExecutionFee({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n operation: 'deposit',\n executionFeeBufferBps: args.executionFeeBufferBps,\n })\n\n const prepSteps: EvmTxStep[] = []\n if (args.isNativeIn && args.nativeWrapped) {\n prepSteps.push(\n ...(await buildNativeWrapPrepSteps({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n nativeWrapped: args.nativeWrapped,\n exchangeRouter,\n amountWei,\n })),\n )\n } else {\n prepSteps.push(\n ...(await buildApproveStepsIfNeeded({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n token: collateralAddr,\n spender: exchangeRouter,\n amountWei,\n })),\n )\n }\n\n const multicallData = [\n encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'sendWnt',\n args: [depositVault, executionFee],\n }),\n encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'sendTokens',\n args: [collateralAddr, depositVault, amountWei],\n }),\n encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'createDeposit',\n args: [\n {\n addresses: {\n receiver: executor,\n callbackContract: gmxZeroAddress(),\n uiFeeReceiver: gmxZeroAddress(),\n market: getAddress(market.marketTokenAddress as Address),\n initialLongToken: longToken,\n initialShortToken: shortToken,\n longTokenSwapPath: [],\n shortTokenSwapPath: [],\n },\n minMarketTokens: 0n,\n shouldUnwrapNativeToken: Boolean(args.isNativeIn),\n executionFee,\n callbackGasLimit: 0n,\n dataList: [],\n },\n ],\n }),\n ]\n\n const orderStep: EvmTxStep = {\n to: exchangeRouter,\n data: encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'multicall',\n args: [multicallData],\n }),\n value: executionFee,\n fallbackGas: GMX_GM_MULTICALL_FALLBACK,\n }\n\n return buildGmLiquidityMultisignBatch(\n args,\n [...prepSteps, orderStep],\n {\n action: 'gm-deposit',\n marketSymbol: args.marketSymbol,\n collateralToken: args.collateralToken,\n collateralAmountHuman: args.collateralAmountHuman,\n isNativeIn: Boolean(args.isNativeIn),\n },\n 'GMX: GM pool deposit (keeper-executed asynchronously).',\n )\n}\n\nexport async function buildEvmMultisignBodyGmxGmWithdrawBatch(args: GmxGmWithdrawArgs) {\n const executor = getAddress(args.executorAddress)\n const market = await gmxResolveMarketBySymbol(args.chainId, args.marketSymbol)\n const gmToken = getAddress(market.marketTokenAddress as Address)\n const gmDecimals = args.gmDecimals ?? 18\n const gmAmountWei = parseGmxTokenAmount(args.gmAmountHuman, gmDecimals)\n if (gmAmountWei === 0n) throw new Error('GM amount is zero after converting with token decimals.')\n\n const exchangeRouter = gmxContractAddress(args.chainId, 'ExchangeRouter')\n const withdrawalVault = gmxContractAddress(args.chainId, 'WithdrawalVault')\n const executionFee = await gmxEstimateGmExecutionFee({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n operation: 'withdrawal',\n executionFeeBufferBps: args.executionFeeBufferBps,\n })\n\n const prepSteps = await buildApproveStepsIfNeeded({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n token: gmToken,\n spender: exchangeRouter,\n amountWei: gmAmountWei,\n })\n\n const multicallData = [\n encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'sendWnt',\n args: [withdrawalVault, executionFee],\n }),\n encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'sendTokens',\n args: [gmToken, withdrawalVault, gmAmountWei],\n }),\n encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'createWithdrawal',\n args: [\n {\n addresses: {\n receiver: executor,\n callbackContract: gmxZeroAddress(),\n uiFeeReceiver: gmxZeroAddress(),\n market: gmToken,\n longTokenSwapPath: [],\n shortTokenSwapPath: [],\n },\n minLongTokenAmount: 0n,\n minShortTokenAmount: 0n,\n shouldUnwrapNativeToken: Boolean(args.isNativeOut),\n executionFee,\n callbackGasLimit: 0n,\n dataList: [],\n },\n ],\n }),\n ]\n\n const orderStep: EvmTxStep = {\n to: exchangeRouter,\n data: encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'multicall',\n args: [multicallData],\n }),\n value: executionFee,\n fallbackGas: GMX_GM_MULTICALL_FALLBACK,\n }\n\n return buildGmLiquidityMultisignBatch(\n args,\n [...prepSteps, orderStep],\n {\n action: 'gm-withdraw',\n marketSymbol: args.marketSymbol,\n gmAmountHuman: args.gmAmountHuman,\n isNativeOut: Boolean(args.isNativeOut),\n },\n 'GMX: GM pool withdrawal (keeper-executed asynchronously).',\n )\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport {\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n type Address,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport { parseGmxTokenAmount } from './amounts.js'\nimport { gmxContractAddress } from './contracts.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst RewardRouterAbi = require('@gmx-io/sdk/abis/RewardRouter').default as readonly unknown[]\n\nconst GMX_STAKE_FALLBACK = 600_000n\nconst GMX_ERC20_APPROVE_FALLBACK = 100_000n\n\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\ntype GmxStakeMultisignCommon = {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n executorAddress: Address\n purposeText: string\n}\n\nexport type GmxStakeGmxArgs = GmxStakeMultisignCommon & {\n amountHuman: string\n gmxDecimals?: number\n}\n\nexport type GmxUnstakeGmxArgs = GmxStakeMultisignCommon & {\n amountHuman: string\n gmxDecimals?: number\n}\n\nasync function buildGmxStakeMultisignBatch(\n common: GmxStakeMultisignCommon,\n steps: EvmTxStep[],\n signatureMeta: Record<string, unknown>,\n purposeSuffix: string,\n) {\n const executor = getAddress(common.executorAddress)\n const firstStep = steps[0]!\n const dataNo0x = firstStep.data.startsWith('0x') ? firstStep.data.slice(2) : firstStep.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: common.keyGen,\n purposeText: common.purposeText,\n chainId: common.chainId,\n rpcUrl: common.rpcUrl,\n executorAddress: executor,\n chainDetail: common.chainDetail,\n useCustomGas: common.useCustomGas,\n customGasChainDetails: common.customGasChainDetails,\n },\n steps,\n purposeSuffix,\n firstMsgRawNo0x: dataNo0x,\n destinationAddress: firstStep.to,\n resolveGasLimit: async ({ estimatedGas, index }) => {\n const step = steps[index]\n const fallback = step?.fallbackGas ?? GMX_STAKE_FALLBACK\n return estimatedGas > fallback ? estimatedGas : fallback\n },\n buildBatchMeta: ({ index }) => {\n const step = steps[index]\n const isApprove = step?.fallbackGas === GMX_ERC20_APPROVE_FALLBACK\n if (isApprove) {\n return {\n signatureText: JSON.stringify({ kind: 'GMX', step: 'approve', ...signatureMeta }),\n evm: { type: 'gmx_erc20_approve', version: 1, chainId: String(common.chainId) },\n }\n }\n return {\n signatureText: JSON.stringify({ kind: 'GMX', ...signatureMeta }),\n evm: { type: 'gmx_token_stake', version: 1, chainId: String(common.chainId) },\n }\n },\n })\n}\n\nasync function buildGmxApproveSteps(args: {\n chainId: number\n rpcUrl: string\n executorAddress: Address\n gmxToken: Address\n rewardRouter: Address\n amountWei: bigint\n}): Promise<EvmTxStep[]> {\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Native', symbol: 'N' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const allowance = await publicClient.readContract({\n address: args.gmxToken,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [args.executorAddress, args.rewardRouter],\n })\n if (allowance >= args.amountWei) return []\n const steps: EvmTxStep[] = []\n if (allowance > 0n) {\n steps.push({\n to: args.gmxToken,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [args.rewardRouter, 0n] }),\n value: 0n,\n fallbackGas: GMX_ERC20_APPROVE_FALLBACK,\n })\n }\n steps.push({\n to: args.gmxToken,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [args.rewardRouter, args.amountWei] }),\n value: 0n,\n fallbackGas: GMX_ERC20_APPROVE_FALLBACK,\n })\n return steps\n}\n\nexport async function buildEvmMultisignBodyGmxStakeGmxBatch(args: GmxStakeGmxArgs) {\n const executor = getAddress(args.executorAddress)\n const gmxToken = gmxContractAddress(args.chainId, 'GMX')\n const rewardRouter = gmxContractAddress(args.chainId, 'RewardRouter')\n const amountWei = parseGmxTokenAmount(args.amountHuman, args.gmxDecimals ?? 18)\n if (amountWei === 0n) throw new Error('GMX stake amount is zero after converting with token decimals.')\n\n const prepSteps = await buildGmxApproveSteps({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n gmxToken,\n rewardRouter,\n amountWei,\n })\n\n const stakeStep: EvmTxStep = {\n to: rewardRouter,\n data: encodeFunctionData({\n abi: RewardRouterAbi,\n functionName: 'stakeGmx',\n args: [amountWei],\n }),\n value: 0n,\n fallbackGas: GMX_STAKE_FALLBACK,\n }\n\n return buildGmxStakeMultisignBatch(\n args,\n [...prepSteps, stakeStep],\n { action: 'stake-gmx', amountHuman: args.amountHuman },\n 'GMX: stake GMX tokens via RewardRouter.',\n )\n}\n\nexport async function buildEvmMultisignBodyGmxUnstakeGmxBatch(args: GmxUnstakeGmxArgs) {\n const rewardRouter = gmxContractAddress(args.chainId, 'RewardRouter')\n const amountWei = parseGmxTokenAmount(args.amountHuman, args.gmxDecimals ?? 18)\n if (amountWei === 0n) throw new Error('GMX unstake amount is zero after converting with token decimals.')\n\n const unstakeStep: EvmTxStep = {\n to: rewardRouter,\n data: encodeFunctionData({\n abi: RewardRouterAbi,\n functionName: 'unstakeGmx',\n args: [amountWei],\n }),\n value: 0n,\n fallbackGas: GMX_STAKE_FALLBACK,\n }\n\n return buildGmxStakeMultisignBatch(\n args,\n [unstakeStep],\n { action: 'unstake-gmx', amountHuman: args.amountHuman },\n 'GMX: unstake GMX tokens via RewardRouter.',\n )\n}\n","import {\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n parseAbi,\n type Address,\n} from 'viem'\nimport { gmxFormatApyPercent, gmxLookupMarketApy } from './apy.js'\nimport { getGmxApiSdk } from './api.js'\nimport { gmxFetchGmMarketsSummary } from './markets.js'\n\nconst erc20BalanceAbi = parseAbi([\n 'function balanceOf(address account) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n])\n\nconst GM_DECIMALS_DEFAULT = 18\n\nfunction gmTokenListSymbol(marketSymbol: string): string {\n const bracket = marketSymbol.match(/^([^[\\]]+)/)?.[1]?.trim()\n const base = (bracket ?? marketSymbol).replace(/\\s+/g, '')\n const compact = base.length > 20 ? `${base.slice(0, 17)}…` : base\n return `GM:${compact}`\n}\n\nfunction gmTokenListName(marketSymbol: string): string {\n return `GMX GM ${marketSymbol.trim()}`\n}\n\nexport type GmxGmLiquidityPositionRow = {\n symbol: string\n marketTokenAddress: string\n longTokenSymbol: string | null\n shortTokenSymbol: string | null\n gmDecimals: number\n gmBalanceWei: string\n gmBalanceHuman: string\n apyPercentLabel: string | null\n tokenListSymbol: string\n tokenListName: string\n}\n\nexport async function gmxFetchGmLiquidityPositions(args: {\n chainId: number\n executorAddress: string\n rpcUrl: string\n includeZeroBalance?: boolean\n}): Promise<{ rows: GmxGmLiquidityPositionRow[] }> {\n const executor = getAddress(args.executorAddress)\n const rpcUrl = args.rpcUrl.trim()\n if (!rpcUrl) throw new Error('rpcUrl is required to read GM liquidity balances.')\n\n const sdk = getGmxApiSdk(args.chainId)\n const [markets, apyRes] = await Promise.all([\n gmxFetchGmMarketsSummary(args.chainId),\n sdk.fetchApy().catch(() => ({ markets: {} as Record<string, { apy?: number }> })),\n ])\n const apyByMarket = (apyRes as { markets?: Record<string, { apy?: number }> }).markets ?? {}\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Native', symbol: 'N' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const rows: GmxGmLiquidityPositionRow[] = []\n\n await Promise.all(\n markets.map(async (market) => {\n const token = getAddress(market.marketTokenAddress as Address)\n let balance = 0n\n let decimals = GM_DECIMALS_DEFAULT\n try {\n ;[balance, decimals] = await Promise.all([\n publicClient.readContract({\n address: token,\n abi: erc20BalanceAbi,\n functionName: 'balanceOf',\n args: [executor],\n }),\n publicClient.readContract({\n address: token,\n abi: erc20BalanceAbi,\n functionName: 'decimals',\n }).catch(() => GM_DECIMALS_DEFAULT),\n ])\n } catch {\n return\n }\n if (!args.includeZeroBalance && balance === 0n) return\n\n const apyEntry = gmxLookupMarketApy(apyByMarket, token)\n rows.push({\n symbol: market.symbol,\n marketTokenAddress: market.marketTokenAddress,\n longTokenSymbol: market.longTokenSymbol,\n shortTokenSymbol: market.shortTokenSymbol,\n gmDecimals: Number(decimals),\n gmBalanceWei: balance.toString(),\n gmBalanceHuman: formatUnits(balance, Number(decimals)),\n apyPercentLabel: gmxFormatApyPercent(apyEntry?.apy),\n tokenListSymbol: gmTokenListSymbol(market.symbol),\n tokenListName: gmTokenListName(market.symbol),\n })\n }),\n )\n\n rows.sort((a, b) => a.symbol.localeCompare(b.symbol, undefined, { sensitivity: 'base' }))\n return { rows }\n}\n","import { getGmxApiSdk } from './api.js'\nimport { formatGmxUsd30 } from './format.js'\nimport { resolveGmxTokenBySymbol } from './marketContext.js'\n\nexport type GmxOhlcvCandleRow = {\n timestampMs: number\n timeLabel: string\n open: string\n high: string\n low: string\n close: string\n}\n\nexport type GmxMarketPrices = {\n symbol: string\n indexLabel: string\n collateralSymbol: string\n indexMarkUsd: string | null\n collateralUsd: string | null\n indexPerCollateral: string | null\n fetchedAtMs: number\n}\n\nexport type GmxMarketSnapshot = GmxMarketPrices & {\n ohlcvTimeframe: GmxOhlcvTimeframe\n ohlcv: GmxOhlcvCandleRow[]\n}\n\nexport const GMX_OHLCV_TIMEFRAMES = ['1m', '5m', '15m', '1h', '4h', '1d', '1w', '1M'] as const\nexport type GmxOhlcvTimeframe = (typeof GMX_OHLCV_TIMEFRAMES)[number]\n\nconst DEFAULT_OHLCV_LIMIT = 16\n\nfunction indexLabelFromMarketSymbol(symbol: string): string {\n const m = symbol.trim().match(/^([^/]+)\\/USD/i)\n return m?.[1]?.trim() || symbol.trim()\n}\n\nfunction asBigint(v: unknown): bigint | undefined {\n if (v == null) return undefined\n try {\n return typeof v === 'bigint' ? v : BigInt(String(v))\n } catch {\n return undefined\n }\n}\n\nfunction formatIndexPerCollateral(indexMark: bigint, collateralUsd: bigint): string | null {\n if (indexMark <= 0n || collateralUsd <= 0n) return null\n const index = Number(indexMark) / 1e30\n const coll = Number(collateralUsd) / 1e30\n if (!Number.isFinite(index) || !Number.isFinite(coll) || coll <= 0) return null\n const ratio = index / coll\n return ratio.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 6 })\n}\n\nfunction formatCandleTime(timestampMs: number): string {\n try {\n return new Date(timestampMs).toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n } catch {\n return String(timestampMs)\n }\n}\n\nfunction mapOhlcvRows(\n raw: Array<{ timestamp: number; open: string; high: string; low: string; close: string }>,\n sort: 'asc' | 'desc',\n): GmxOhlcvCandleRow[] {\n const sorted = [...raw].sort((a, b) => (sort === 'asc' ? a.timestamp - b.timestamp : b.timestamp - a.timestamp))\n return sorted.map((c) => ({\n timestampMs: c.timestamp,\n timeLabel: formatCandleTime(c.timestamp),\n open: c.open,\n high: c.high,\n low: c.low,\n close: c.close,\n }))\n}\n\nexport function assertGmxOhlcvTimeframe(timeframe: string): GmxOhlcvTimeframe {\n const tf = timeframe.trim() as GmxOhlcvTimeframe\n if (!(GMX_OHLCV_TIMEFRAMES as readonly string[]).includes(tf)) {\n throw new Error(`Invalid timeframe: ${timeframe}. Valid: ${GMX_OHLCV_TIMEFRAMES.join(', ')}`)\n }\n return tf\n}\n\nexport async function gmxFetchMarketPrices(args: {\n chainId: number\n symbol: string\n collateralSymbol: string\n}): Promise<GmxMarketPrices> {\n const symbol = args.symbol.trim()\n const collateralSymbol = args.collateralSymbol.trim()\n if (!symbol) throw new Error('GMX market symbol is required.')\n if (!collateralSymbol) throw new Error('Collateral symbol is required.')\n\n const sdk = getGmxApiSdk(args.chainId)\n const [tickers, collateralToken] = await Promise.all([\n sdk.fetchMarketsTickers({ symbols: [symbol] }) as Promise<Array<Record<string, unknown>>>,\n resolveGmxTokenBySymbol(args.chainId, collateralSymbol),\n ])\n\n const ticker = tickers.find((t) => String(t.symbol ?? '') === symbol) ?? tickers[0]\n const mark = asBigint(ticker?.markPrice ?? ticker?.minPrice)\n const indexMarkUsd = formatGmxUsd30(mark)\n\n const collateralPrice = asBigint(\n (collateralToken?.prices as { minPrice?: unknown } | undefined)?.minPrice,\n )\n const collateralUsd = formatGmxUsd30(collateralPrice)\n const indexPerCollateral =\n mark != null && collateralPrice != null ? formatIndexPerCollateral(mark, collateralPrice) : null\n\n return {\n symbol,\n indexLabel: indexLabelFromMarketSymbol(symbol),\n collateralSymbol,\n indexMarkUsd,\n collateralUsd,\n indexPerCollateral,\n fetchedAtMs: Date.now(),\n }\n}\n\nexport async function gmxFetchOhlcv(args: {\n chainId: number\n symbol: string\n timeframe?: string\n limit?: number\n sort?: 'asc' | 'desc'\n}): Promise<{ symbol: string; timeframe: GmxOhlcvTimeframe; candles: GmxOhlcvCandleRow[] }> {\n const symbol = args.symbol.trim()\n if (!symbol) throw new Error('GMX market symbol is required.')\n const timeframe = assertGmxOhlcvTimeframe(args.timeframe ?? '15m')\n const limit = args.limit ?? DEFAULT_OHLCV_LIMIT\n const sort = args.sort ?? 'desc'\n\n const sdk = getGmxApiSdk(args.chainId)\n const ohlcvRaw = await sdk.fetchOhlcv({ symbol, timeframe, limit })\n\n return {\n symbol,\n timeframe,\n candles: mapOhlcvRows(ohlcvRaw, sort),\n }\n}\n\nexport async function gmxFetchMarketSnapshot(args: {\n chainId: number\n symbol: string\n collateralSymbol: string\n ohlcvTimeframe?: string\n}): Promise<GmxMarketSnapshot> {\n const ohlcvTimeframe = assertGmxOhlcvTimeframe(args.ohlcvTimeframe ?? '15m')\n const [prices, ohlcv] = await Promise.all([\n gmxFetchMarketPrices(args),\n gmxFetchOhlcv({ chainId: args.chainId, symbol: args.symbol, timeframe: ohlcvTimeframe, sort: 'desc' }),\n ])\n return {\n ...prices,\n ohlcvTimeframe: ohlcv.timeframe,\n ohlcv: ohlcv.candles,\n }\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isGmxChainSupported } from './support.js'\n\nexport * from './support.js'\nexport * from './api.js'\nexport * from './amounts.js'\nexport * from './apy.js'\nexport * from './markets.js'\nexport * from './reads.js'\nexport * from './multisign.js'\nexport * from './gmLiquidityMultisign.js'\nexport * from './gmxTokenStakingMultisign.js'\nexport * from './contracts.js'\nexport * from './executionFee.js'\nexport * from './gmLiquidityReads.js'\nexport * from './format.js'\nexport * from './estimates.js'\nexport * from './leverage.js'\nexport * from './positionDisplay.js'\nexport * from './prices.js'\nexport * from './native.js'\n\nexport const GMX_PROTOCOL_ID = 'gmx'\n\nexport const gmxProtocolModule: ProtocolModule = {\n id: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const chainId = typeof ctx.chainId === 'number' ? ctx.chainId : Number(ctx.chainId)\n return Number.isFinite(chainId) && isGmxChainSupported(chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'erc20'\n },\n actions: [\n {\n id: 'gmx.increase',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Open or add to a GMX perp position (classic on-chain order)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n symbol: { type: 'string', required: true, description: 'GMX market symbol e.g. ETH/USD [WETH-USDC]' },\n direction: { type: 'string', required: true, description: 'long or short' },\n orderType: { type: 'string', required: true, description: 'market or limit' },\n sizeUsdHuman: { type: 'string', required: true, description: 'Position size in USD' },\n collateralToken: { type: 'string', required: true, description: 'Collateral token symbol e.g. USDC' },\n collateralAmountHuman: { type: 'string', required: true, description: 'Collateral amount in token units' },\n },\n },\n {\n id: 'gmx.decrease',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Close or reduce a GMX perp position (classic on-chain order)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n symbol: { type: 'string', required: true, description: 'GMX market symbol' },\n direction: { type: 'string', required: true, description: 'long or short' },\n orderType: { type: 'string', required: true, description: 'market or limit' },\n sizeUsdHuman: { type: 'string', required: true, description: 'Size to close in USD' },\n collateralToken: { type: 'string', required: true, description: 'Position collateral token symbol' },\n },\n },\n {\n id: 'gmx.cancel',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Cancel a pending GMX order (classic on-chain)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n orderId: { type: 'string', required: true, description: 'Order key from fetchOrders' },\n },\n },\n {\n id: 'gmx.gmDeposit',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Deposit collateral into a GMX GM liquidity pool (ExchangeRouter multicall)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n marketSymbol: { type: 'string', required: true, description: 'GM market symbol e.g. ETH/USD [WETH-USDC]' },\n collateralToken: { type: 'string', required: true, description: 'Pool collateral token symbol' },\n collateralAmountHuman: { type: 'string', required: true, description: 'Amount in token units' },\n },\n },\n {\n id: 'gmx.gmWithdraw',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Withdraw GM market tokens from a GMX liquidity pool',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n marketSymbol: { type: 'string', required: true, description: 'GM market symbol' },\n gmAmountHuman: { type: 'string', required: true, description: 'GM token amount to withdraw' },\n },\n },\n {\n id: 'gmx.stakeGmx',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Stake GMX tokens via RewardRouter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n amountHuman: { type: 'string', required: true, description: 'GMX amount to stake' },\n },\n },\n {\n id: 'gmx.unstakeGmx',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Unstake GMX tokens via RewardRouter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n amountHuman: { type: 'string', required: true, description: 'GMX amount to unstake' },\n },\n },\n ],\n}\n\nregisterProtocolModule(gmxProtocolModule)\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/protocols/evm/gmx/support.ts","../../../../src/protocols/evm/gmx/api.ts","../../../../src/protocols/evm/gmx/amounts.ts","../../../../src/protocols/evm/gmx/apy.ts","../../../../src/protocols/evm/gmx/markets.ts","../../../../src/protocols/evm/gmx/format.ts","../../../../src/protocols/evm/gmx/marketContext.ts","../../../../src/protocols/evm/gmx/positionDisplay.ts","../../../../src/protocols/evm/gmx/leverage.ts","../../../../src/protocols/evm/gmx/contracts.ts","../../../../src/protocols/evm/gmx/reads.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/gmx/native.ts","../../../../src/protocols/evm/gmx/estimates.ts","../../../../src/protocols/evm/gmx/multisign.ts","../../../../src/protocols/evm/gmx/executionFee.ts","../../../../src/protocols/evm/gmx/gmLiquidityMultisign.ts","../../../../src/protocols/evm/gmx/gmxTokenStakingMultisign.ts","../../../../src/protocols/evm/gmx/gmLiquidityReads.ts","../../../../src/protocols/evm/gmx/prices.ts","../../../../src/protocols/evm/gmx/index.ts"],"names":["require","getAddress","createRequire","fileURLToPath","gasLimitFromEstimateAndChainConfig","getPositionInfo","asBigint","defineChain","createPublicClient","http","parseAbi","GMX_WETH_DEPOSIT_FALLBACK","GMX_ERC20_APPROVE_FALLBACK","wethDepositAbi","erc20AllowanceAbi","erc20ApproveAbi","encodeFunctionData","formatUnits"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** GMX V2 production chains supported in Continuum multi-sign v1. */\nexport const GMX_SUPPORTED_CHAIN_IDS = [42161, 43114] as const\n\nexport type GmxSupportedChainId = (typeof GMX_SUPPORTED_CHAIN_IDS)[number]\n\nexport function isGmxChainSupported(chainId: number): chainId is GmxSupportedChainId {\n return (GMX_SUPPORTED_CHAIN_IDS as readonly number[]).includes(chainId)\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { isGmxChainSupported } from './support.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { GmxApiSdk } = require('@gmx-io/sdk/v2') as {\n GmxApiSdk: new (args: { chainId: number; api?: GmxHttpApi }) => GmxApiSdkInstance\n}\n\nconst GMX_HTTP_TIMEOUT_MS = 30_000\n\n/** Prefer .io (primary GMX API); .ai is secondary. Base host only — SDK paths include `/v1/...`. */\nconst GMX_API_BASE_URLS: Record<number, readonly [string, string]> = {\n 42161: ['https://arbitrum.gmxapi.io', 'https://arbitrum.gmxapi.ai'],\n 43114: ['https://avalanche.gmxapi.io', 'https://avalanche.gmxapi.ai'],\n}\n\ntype GmxHttpApi = {\n fetchJson: (path: string, opts?: GmxFetchJsonOpts) => Promise<unknown>\n postJson: (path: string, body: unknown, opts?: GmxPostJsonOpts) => Promise<unknown>\n}\n\ntype GmxFetchJsonOpts = {\n query?: Record<string, unknown>\n transform?: (raw: unknown) => unknown\n}\n\ntype GmxPostJsonOpts = {\n transform?: (raw: unknown) => unknown\n}\n\nfunction buildGmxUrl(baseUrl: string, path: string, query?: Record<string, unknown>): string {\n const base = baseUrl.replace(/\\/$/, '')\n if (!query) return `${base}${path}`\n const params = new URLSearchParams()\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) params.set(key, String(value))\n }\n const qs = params.toString()\n return qs ? `${base}${path}?${qs}` : `${base}${path}`\n}\n\nfunction bigintReplacer(_key: string, value: unknown) {\n return typeof value === 'bigint' ? value.toString() : value\n}\n\nasync function gmxHttpFetchJson(baseUrl: string, path: string, opts?: GmxFetchJsonOpts): Promise<unknown> {\n const url = buildGmxUrl(baseUrl, path, opts?.query)\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), GMX_HTTP_TIMEOUT_MS)\n try {\n const response = await fetch(url, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n if (!response.ok) {\n let message = `HTTP ${response.status}: ${response.statusText}`\n try {\n const body = (await response.json()) as { message?: string }\n if (body?.message) message = `HTTP ${response.status}: ${body.message}`\n } catch {\n // ignore parse errors\n }\n throw new Error(`${message} (${url})`)\n }\n const json = await response.json()\n return opts?.transform ? opts.transform(json) : json\n } finally {\n clearTimeout(timeoutId)\n }\n}\n\nasync function gmxHttpPostJson(\n baseUrl: string,\n path: string,\n body: unknown,\n opts?: GmxPostJsonOpts,\n): Promise<unknown> {\n const url = buildGmxUrl(baseUrl, path)\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), GMX_HTTP_TIMEOUT_MS)\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify(body, bigintReplacer),\n signal: controller.signal,\n })\n if (!response.ok) {\n let message = `HTTP ${response.status}: ${response.statusText}`\n try {\n const errBody = (await response.json()) as { message?: string }\n if (errBody?.message) message = `HTTP ${response.status}: ${errBody.message}`\n } catch {\n // ignore parse errors\n }\n throw new Error(`${message} (${url})`)\n }\n const json = await response.json()\n return opts?.transform ? opts.transform(json) : json\n } finally {\n clearTimeout(timeoutId)\n }\n}\n\nfunction createIoFirstGmxHttpApi(chainId: number): GmxHttpApi {\n const urls = GMX_API_BASE_URLS[chainId]\n if (!urls) {\n throw new Error(`GMX API URLs are not configured for chain ${chainId}.`)\n }\n async function withIoFirstFallback<T>(fn: (baseUrl: string) => Promise<T>): Promise<T> {\n let lastError: unknown\n for (const baseUrl of urls) {\n try {\n return await fn(baseUrl)\n } catch (e) {\n lastError = e\n }\n }\n const detail = lastError instanceof Error ? lastError.message : String(lastError)\n throw new Error(\n `GMX API request failed on all endpoints (${urls.join(', ')}). Last error: ${detail}`,\n )\n }\n return {\n fetchJson: (path, opts) => withIoFirstFallback((baseUrl) => gmxHttpFetchJson(baseUrl, path, opts)),\n postJson: (path, body, opts) => withIoFirstFallback((baseUrl) => gmxHttpPostJson(baseUrl, path, body, opts)),\n }\n}\n\nexport type GmxApiSdkInstance = {\n fetchMarkets: () => Promise<GmxMarketRow[]>\n fetchMarketsTickers: (args?: { symbols?: string[] }) => Promise<unknown[]>\n fetchOhlcv: (args: {\n symbol: string\n timeframe: string\n limit?: number\n since?: number\n }) => Promise<Array<{ timestamp: number; open: string; high: string; low: string; close: string }>>\n fetchTokens: () => Promise<GmxTokenRow[]>\n fetchTokensData: () => Promise<unknown[]>\n fetchPositionsInfo: (args: { address: string; includeRelatedOrders?: boolean }) => Promise<GmxPositionRow[]>\n fetchOrders: (args: { address: string }) => Promise<GmxOrderRow[]>\n fetchStakingPower: (args: { address: string }) => Promise<Record<string, unknown>>\n fetchApy: (params?: Record<string, unknown>) => Promise<Record<string, unknown>>\n prepareOrder: (args: Record<string, unknown>) => Promise<GmxPrepareOrderResponse>\n prepareCancelOrder: (args: Record<string, unknown>) => Promise<GmxPrepareOrderResponse>\n}\n\nexport type GmxMarketRow = {\n symbol: string\n marketTokenAddress: string\n indexTokenAddress?: string\n longTokenAddress?: string\n shortTokenAddress?: string\n isSpotOnly?: boolean\n isListed?: boolean\n}\n\nexport type GmxTokenRow = {\n symbol: string\n address: string\n decimals: number\n}\n\nexport type GmxPositionRow = {\n key?: string\n indexName?: string\n isLong?: boolean\n sizeInUsd?: bigint | string | number\n collateralUsd?: bigint | string | number\n marketAddress?: string\n}\n\nexport type GmxOrderRow = {\n key?: string\n isLong?: boolean\n sizeDeltaUsd?: bigint | string | number\n triggerPrice?: bigint | string | number\n}\n\nexport type GmxPrepareOrderResponse = {\n requestId?: string\n payloadType: 'transaction' | 'typed-data'\n mode: string\n payload: {\n to?: string\n data?: string\n value?: string | bigint | number\n }\n estimates?: Record<string, unknown>\n}\n\nconst sdkByChain = new Map<number, GmxApiSdkInstance>()\n\nexport function getGmxApiSdk(chainId: number): GmxApiSdkInstance {\n if (!isGmxChainSupported(chainId)) {\n throw new Error(`GMX is not supported on chain ${chainId}. Supported: 42161 (Arbitrum), 43114 (Avalanche).`)\n }\n let sdk = sdkByChain.get(chainId)\n if (!sdk) {\n sdk = new GmxApiSdk({ chainId, api: createIoFirstGmxHttpApi(chainId) })\n sdkByChain.set(chainId, sdk)\n }\n return sdk\n}\n","import { parseUnits } from 'viem'\n\n/** Parse a USD amount to GMX 30-decimal fixed point. */\nexport function parseGmxUsd30(amountHuman: string): bigint {\n const trimmed = amountHuman.trim()\n if (!trimmed || !/^\\d+(\\.\\d+)?$/.test(trimmed)) {\n throw new Error('USD amount must be a positive decimal number.')\n }\n const [whole, frac = ''] = trimmed.split('.')\n const fracPadded = (frac + '0'.repeat(30)).slice(0, 30)\n const wholeN = BigInt(whole)\n const fracN = BigInt(fracPadded || '0')\n const value = wholeN * 10n ** 30n + fracN\n if (value <= 0n) throw new Error('USD amount must be greater than zero.')\n return value\n}\n\nexport function parseGmxTokenAmount(amountHuman: string, decimals: number): bigint {\n return parseUnits(amountHuman, decimals)\n}\n","import { getAddress } from 'viem'\n\nexport type GmxMarketApySource = {\n apy?: number\n baseApy?: number\n bonusApr?: number\n}\n\nexport function gmxFormatApyPercent(apy: number | null | undefined): string | null {\n if (apy == null || !Number.isFinite(apy)) return null\n const pct = apy * 100\n if (pct <= 0) return null\n return `${pct.toLocaleString('en-US', { maximumFractionDigits: 2 })}%`\n}\n\nexport function gmxLookupMarketApy(\n apyByMarket: Record<string, GmxMarketApySource>,\n marketTokenAddress: string,\n): GmxMarketApySource | null {\n try {\n const checksum = getAddress(marketTokenAddress)\n return apyByMarket[checksum] ?? apyByMarket[checksum.toLowerCase()] ?? null\n } catch {\n const lower = marketTokenAddress.trim().toLowerCase()\n return apyByMarket[lower] ?? null\n }\n}\n\nexport function gmxEnrichGmMarketRowWithApy<T extends { marketTokenAddress: string }>(\n row: T,\n apyByMarket: Record<string, GmxMarketApySource>,\n) {\n const entry = gmxLookupMarketApy(apyByMarket, row.marketTokenAddress)\n const apy = entry?.apy ?? null\n return {\n ...row,\n apy,\n baseApy: entry?.baseApy ?? null,\n bonusApr: entry?.bonusApr ?? null,\n apyPercentLabel: gmxFormatApyPercent(apy),\n }\n}\n","import { getAddress } from 'viem'\nimport { gmxEnrichGmMarketRowWithApy, type GmxMarketApySource } from './apy.js'\nimport { getGmxApiSdk, type GmxMarketRow, type GmxTokenRow } from './api.js'\n\nexport async function gmxFetchMarkets(chainId: number): Promise<GmxMarketRow[]> {\n const sdk = getGmxApiSdk(chainId)\n const markets = await sdk.fetchMarkets()\n return markets\n .filter((m) => !m.isSpotOnly && m.isListed !== false)\n .sort((a, b) => a.symbol.localeCompare(b.symbol, undefined, { sensitivity: 'base' }))\n}\n\nexport async function gmxFetchTokens(chainId: number): Promise<GmxTokenRow[]> {\n const sdk = getGmxApiSdk(chainId)\n return sdk.fetchTokens()\n}\n\nexport async function gmxResolveTokenBySymbol(chainId: number, symbol: string): Promise<GmxTokenRow> {\n const sym = symbol.trim().toUpperCase()\n const tokens = await gmxFetchTokens(chainId)\n const row = tokens.find((t) => t.symbol?.toUpperCase() === sym)\n if (!row) throw new Error(`GMX token symbol not found on chain ${chainId}: ${symbol}`)\n return row\n}\n\nexport async function gmxIsCollateralTokenSupported(chainId: number, tokenAddress: string): Promise<boolean> {\n try {\n const addr = getAddress(tokenAddress).toLowerCase()\n const tokens = await gmxFetchTokens(chainId)\n return tokens.some((t) => t.address?.toLowerCase() === addr)\n } catch {\n return false\n }\n}\n\n/** Parse collateral pool tokens from e.g. `ETH/USD [WETH-USDC]` → `WETH`, `USDC`. */\nexport function gmxMarketCollateralTokens(marketSymbol: string): string[] {\n const m = marketSymbol.match(/\\[([^[\\]]+)\\]/)\n if (!m?.[1]) return []\n return m[1].split('-').map((s) => s.trim()).filter(Boolean)\n}\n\nexport function gmxMarketAcceptsCollateral(marketSymbol: string, collateralSymbol: string): boolean {\n const col = collateralSymbol.trim().toUpperCase()\n if (!col) return true\n const tokens = gmxMarketCollateralTokens(marketSymbol)\n if (tokens.length === 0) return true\n return tokens.some((t) => t.toUpperCase() === col)\n}\n\nexport async function gmxMarketsForCollateralSymbol(\n chainId: number,\n collateralSymbol: string,\n): Promise<GmxMarketRow[]> {\n const markets = await gmxFetchMarkets(chainId)\n return markets.filter((m) => gmxMarketAcceptsCollateral(m.symbol, collateralSymbol))\n}\n\nexport async function gmxResolveMarketBySymbol(chainId: number, symbol: string): Promise<GmxMarketRow> {\n const sym = symbol.trim()\n const markets = await gmxFetchMarkets(chainId)\n const row = markets.find((m) => m.symbol === sym)\n if (!row) throw new Error(`GMX market symbol not found on chain ${chainId}: ${symbol}`)\n if (!row.longTokenAddress || !row.shortTokenAddress) {\n throw new Error(`GMX market \"${symbol}\" is missing long/short token addresses.`)\n }\n return row\n}\n\nexport async function gmxResolveMarketByGmTokenAddress(\n chainId: number,\n gmTokenAddress: string,\n): Promise<GmxMarketRow | null> {\n const addr = getAddress(gmTokenAddress).toLowerCase()\n const markets = await gmxFetchMarkets(chainId)\n return markets.find((m) => m.marketTokenAddress?.toLowerCase() === addr) ?? null\n}\n\nexport type GmxGmMarketSummaryRow = {\n symbol: string\n marketTokenAddress: string\n longTokenSymbol: string | null\n shortTokenSymbol: string | null\n apy: number | null\n baseApy: number | null\n bonusApr: number | null\n apyPercentLabel: string | null\n}\n\nexport async function gmxFetchGmMarketsSummary(chainId: number): Promise<GmxGmMarketSummaryRow[]> {\n const markets = await gmxFetchMarkets(chainId)\n const tokens = await gmxFetchTokens(chainId)\n const tokenByAddr = new Map(tokens.map((t) => [t.address.toLowerCase(), t.symbol]))\n const sdk = getGmxApiSdk(chainId)\n const emptyApyMarkets: Record<string, GmxMarketApySource> = {}\n const apyRes = await sdk.fetchApy().catch(() => ({ markets: emptyApyMarkets }))\n const apyByMarket = (apyRes.markets ?? emptyApyMarkets) as Record<string, GmxMarketApySource>\n return markets.map((m) =>\n gmxEnrichGmMarketRowWithApy(\n {\n symbol: m.symbol,\n marketTokenAddress: m.marketTokenAddress,\n longTokenSymbol: tokenByAddr.get((m.longTokenAddress ?? '').toLowerCase()) ?? null,\n shortTokenSymbol: tokenByAddr.get((m.shortTokenAddress ?? '').toLowerCase()) ?? null,\n },\n apyByMarket,\n ),\n )\n}\n","import { formatUnits } from 'viem'\n\n/** Format a GMX 30-decimal USD bigint as a human-readable dollar string. */\nexport function formatGmxUsd30(value: bigint | string | number | null | undefined): string | null {\n if (value == null) return null\n let n: bigint\n try {\n n = typeof value === 'bigint' ? value : BigInt(String(value))\n } catch {\n return null\n }\n if (n <= 0n) return null\n const negative = n < 0n\n const abs = negative ? -n : n\n const whole = abs / 10n ** 30n\n const frac = abs % 10n ** 30n\n const fracStr = frac.toString().padStart(30, '0').replace(/0+$/, '')\n const num = fracStr ? `${whole}.${fracStr}` : whole.toString()\n const parsed = Number(num)\n if (!Number.isFinite(parsed)) return null\n const formatted = Math.abs(parsed).toLocaleString('en-US', {\n minimumFractionDigits: 0,\n maximumFractionDigits: parsed >= 100 ? 2 : 4,\n })\n return negative ? `-$${formatted}` : `$${formatted}`\n}\n\n/** Decimal USD string suitable for amount inputs (no currency symbol). */\nexport function formatGmxUsd30HumanInput(value: bigint | string | number | null | undefined): string | null {\n if (value == null) return null\n let n: bigint\n try {\n n = typeof value === 'bigint' ? value : BigInt(String(value))\n } catch {\n return null\n }\n if (n <= 0n) return null\n const negative = n < 0n\n const abs = negative ? -n : n\n const whole = abs / 10n ** 30n\n const frac = abs % 10n ** 30n\n const fracStr = frac.toString().padStart(30, '0').replace(/0+$/, '')\n const raw = fracStr ? `${whole}.${fracStr}` : whole.toString()\n return negative ? `-${raw}` : raw\n}\n\n/** Trim trailing zeros from a decimal token amount string. */\nexport function formatGmxTokenAmountHuman(amountWei: bigint, decimals: number): string {\n const raw = formatUnits(amountWei, decimals)\n if (!raw.includes('.')) return raw\n return raw.replace(/\\.?0+$/, '')\n}\n\n/** GMX leverage is returned in basis points (size / effective collateral * 10_000). */\nexport function formatGmxLeverageBps(value: bigint | string | number | null | undefined): string | null {\n if (value == null) return null\n let n: bigint\n try {\n n = typeof value === 'bigint' ? value : BigInt(String(value))\n } catch {\n return null\n }\n if (n <= 0n) return null\n const x = Number(n) / 10_000\n if (!Number.isFinite(x) || x <= 0) return null\n return `${x.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}×`\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { getGmxApiSdk } from './api.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { hydrateMarketInfo, getMarketAddressByName } = require('@gmx-io/sdk/utils/markets') as {\n hydrateMarketInfo: (args: {\n chainId: number\n rawMarketInfo: Record<string, unknown>\n tokensData: Record<string, unknown>\n }) => Record<string, unknown> | undefined\n getMarketAddressByName: (\n marketsInfoData: Record<string, Record<string, unknown>>,\n name: string,\n ) => string | undefined\n}\n\n/** GMX default when market constants are absent from API payloads. */\nexport const GMX_DEFAULT_MIN_COLLATERAL_USD = 10n * 10n ** 30n\n\ntype MarketContext = {\n marketsInfoData: Record<string, Record<string, unknown>>\n tokensData: Record<string, Record<string, unknown>>\n minCollateralUsd: bigint\n}\n\nconst contextByChain = new Map<number, Promise<MarketContext>>()\n\nfunction tokensArrayToMap(tokensArr: Array<Record<string, unknown>>) {\n const tokensData: Record<string, Record<string, unknown>> = {}\n for (const t of tokensArr) {\n const address = String(t.address ?? '')\n if (address) tokensData[address] = t\n }\n return tokensData\n}\n\nexport async function loadGmxMarketContext(chainId: number): Promise<MarketContext> {\n let pending = contextByChain.get(chainId)\n if (!pending) {\n pending = (async () => {\n const sdk = getGmxApiSdk(chainId)\n const [marketsInfoArr, tokensArr] = await Promise.all([\n sdk.fetchMarketsInfo() as Promise<Array<Record<string, unknown>>>,\n sdk.fetchTokensData() as Promise<Array<Record<string, unknown>>>,\n ])\n const tokensData = tokensArrayToMap(tokensArr)\n const marketsInfoData: Record<string, Record<string, unknown>> = {}\n for (const raw of marketsInfoArr) {\n const hydrated = hydrateMarketInfo({ chainId, rawMarketInfo: raw, tokensData })\n if (hydrated?.marketTokenAddress) {\n marketsInfoData[String(hydrated.marketTokenAddress)] = hydrated\n }\n }\n return {\n marketsInfoData,\n tokensData,\n minCollateralUsd: GMX_DEFAULT_MIN_COLLATERAL_USD,\n }\n })()\n contextByChain.set(chainId, pending)\n }\n return pending\n}\n\nexport async function resolveGmxMarketBySymbol(chainId: number, symbol: string) {\n const ctx = await loadGmxMarketContext(chainId)\n const trimmed = symbol.trim()\n if (!trimmed) return undefined\n const address = getMarketAddressByName(ctx.marketsInfoData, trimmed)\n if (!address) return undefined\n return ctx.marketsInfoData[address]\n}\n\nexport async function resolveGmxTokenBySymbol(chainId: number, symbol: string) {\n const ctx = await loadGmxMarketContext(chainId)\n const sym = symbol.trim().toUpperCase()\n return Object.values(ctx.tokensData).find((t) => String(t.symbol ?? '').toUpperCase() === sym)\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { formatGmxLeverageBps, formatGmxUsd30 } from './format.js'\nimport { loadGmxMarketContext } from './marketContext.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { getPositionInfo } = require('@gmx-io/sdk/utils/positions') as {\n getPositionInfo: (p: Record<string, unknown>) => Record<string, unknown>\n}\n\nexport type GmxPositionDisplayRow = {\n key: string\n indexName: string\n isLong: boolean\n sizeUsd: string | null\n collateralUsd: string | null\n collateralSymbol: string | null\n entryPriceUsd: string | null\n markPriceUsd: string | null\n liquidationPriceUsd: string | null\n leverageLabel: string | null\n pnlUsd: string | null\n}\n\nfunction asBigint(v: unknown): bigint | undefined {\n if (v == null) return undefined\n try {\n return typeof v === 'bigint' ? v : BigInt(String(v))\n } catch {\n return undefined\n }\n}\n\nfunction pickIndexName(raw: Record<string, unknown>, enriched?: Record<string, unknown>) {\n const name = String(enriched?.indexName ?? raw.indexName ?? '').trim()\n if (name) return name\n const market = String(raw.marketAddress ?? '').trim()\n return market ? `Market ${market.slice(0, 6)}…` : 'Position'\n}\n\nexport async function gmxFormatPositionsForDisplay(\n chainId: number,\n positions: Array<Record<string, unknown>>,\n): Promise<GmxPositionDisplayRow[]> {\n if (positions.length === 0) return []\n const ctx = await loadGmxMarketContext(chainId)\n\n return positions.map((raw, i) => {\n const marketAddress = String(raw.marketAddress ?? '')\n const marketInfo = marketAddress ? ctx.marketsInfoData[marketAddress] : undefined\n let enriched: Record<string, unknown> | undefined\n if (marketInfo) {\n try {\n enriched = getPositionInfo({\n position: raw,\n marketInfo,\n minCollateralUsd: ctx.minCollateralUsd,\n userReferralInfo: undefined,\n showPnlInLeverage: false,\n uiFeeFactor: 0n,\n }) as Record<string, unknown>\n } catch {\n enriched = undefined\n }\n }\n\n const source = enriched ?? raw\n const collateralToken = source.collateralToken as { symbol?: string } | undefined\n\n return {\n key: String(raw.key ?? raw.contractKey ?? `${marketAddress}-${i}`),\n indexName: pickIndexName(raw, enriched),\n isLong: Boolean(source.isLong ?? raw.isLong),\n sizeUsd: formatGmxUsd30(asBigint(source.sizeInUsd ?? raw.sizeInUsd)),\n collateralUsd: formatGmxUsd30(asBigint(source.collateralUsd ?? raw.collateralUsd)),\n collateralSymbol: collateralToken?.symbol ? String(collateralToken.symbol) : null,\n entryPriceUsd: formatGmxUsd30(asBigint(source.entryPrice)),\n markPriceUsd: formatGmxUsd30(asBigint(source.markPrice)),\n liquidationPriceUsd: formatGmxUsd30(asBigint(source.liquidationPrice)),\n leverageLabel: formatGmxLeverageBps(asBigint(source.leverage ?? source.leverageWithoutPnl)),\n pnlUsd: formatGmxUsd30(asBigint(source.pnl)),\n }\n })\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { formatGmxLeverageBps } from './format.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { getMaxAllowedLeverage } = require('@gmx-io/sdk/utils/markets') as {\n getMaxAllowedLeverage: (args: {\n minCollateralFactor?: bigint\n minCollateralFactorForLiquidation?: bigint\n positionFeeFactorForBalanceWasNotImproved?: bigint\n }) => number\n}\n\nexport function gmxMarketMaxLeverageBps(marketInfo: Record<string, unknown>): number {\n return getMaxAllowedLeverage({\n minCollateralFactor: marketInfo.minCollateralFactor as bigint | undefined,\n minCollateralFactorForLiquidation: marketInfo.minCollateralFactorForLiquidation as bigint | undefined,\n positionFeeFactorForBalanceWasNotImproved: marketInfo.positionFeeFactorForBalanceWasNotImproved as\n | bigint\n | undefined,\n })\n}\n\nexport function gmxMarketMaxLeverageLabel(marketInfo: Record<string, unknown>): string | null {\n const bps = gmxMarketMaxLeverageBps(marketInfo)\n if (!Number.isFinite(bps) || bps <= 0) return null\n return formatGmxLeverageBps(BigInt(bps))\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport type { Address } from 'viem'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { getContract } = require('@gmx-io/sdk/configs/contracts') as {\n getContract: (chainId: number, name: string) => string\n}\n\nexport function gmxContractAddress(chainId: number, name: string): Address {\n const raw = getContract(chainId, name)\n if (!raw || raw === '0x0000000000000000000000000000000000000000') {\n throw new Error(`GMX contract \"${name}\" is not configured for chain ${chainId}.`)\n }\n return raw as Address\n}\n","import { getAddress } from 'viem'\nimport { getGmxApiSdk } from './api.js'\nimport { gmxFormatPositionsForDisplay } from './positionDisplay.js'\nimport { gmxMarketMaxLeverageLabel } from './leverage.js'\nimport { loadGmxMarketContext } from './marketContext.js'\nimport {\n gmxFetchGmMarketsSummary,\n gmxFetchMarkets,\n gmxFetchTokens,\n gmxResolveMarketByGmTokenAddress,\n} from './markets.js'\nimport { gmxContractAddress } from './contracts.js'\n\nexport async function gmxFetchPositionsForExecutor(args: { chainId: number; executorAddress: string }) {\n const sdk = getGmxApiSdk(args.chainId)\n const positions = await sdk.fetchPositionsInfo({\n address: args.executorAddress,\n includeRelatedOrders: true,\n })\n return {\n positions: positions as Array<Record<string, unknown>>,\n }\n}\n\nexport async function gmxFetchPositionDisplayRows(args: { chainId: number; executorAddress: string }) {\n const { positions } = await gmxFetchPositionsForExecutor(args)\n return gmxFormatPositionsForDisplay(args.chainId, positions)\n}\n\nexport async function gmxFetchOrdersForExecutor(args: { chainId: number; executorAddress: string }) {\n const sdk = getGmxApiSdk(args.chainId)\n return sdk.fetchOrders({ address: args.executorAddress })\n}\n\nexport async function gmxFetchMarketsSummary(args: { chainId: number }) {\n const [markets, ctx] = await Promise.all([gmxFetchMarkets(args.chainId), loadGmxMarketContext(args.chainId)])\n return {\n markets: markets.map((m) => {\n const addr = String(m.marketTokenAddress ?? '')\n const info =\n ctx.marketsInfoData[addr] ??\n ctx.marketsInfoData[addr.toLowerCase()] ??\n Object.values(ctx.marketsInfoData).find(\n (row) => String(row.marketTokenAddress ?? '').toLowerCase() === addr.toLowerCase(),\n )\n return {\n symbol: m.symbol,\n marketTokenAddress: m.marketTokenAddress,\n maxLeverageLabel: info ? gmxMarketMaxLeverageLabel(info) : null,\n }\n }),\n }\n}\n\nexport async function gmxFetchCollateralTokens(args: { chainId: number }) {\n const tokens = await gmxFetchTokens(args.chainId)\n return tokens.map((t) => ({\n symbol: t.symbol,\n address: t.address,\n decimals: t.decimals,\n }))\n}\n\nexport async function gmxFetchGmMarkets(args: { chainId: number }) {\n const markets = await gmxFetchGmMarketsSummary(args.chainId)\n return { markets }\n}\n\n/** GM liquidity pool APY per market (sorted highest APY first). Read-only. */\nexport async function gmxFetchGmApy(args: { chainId: number }) {\n const { markets } = await gmxFetchGmMarkets(args)\n const sorted = [...markets].sort((a, b) => (b.apy ?? 0) - (a.apy ?? 0))\n return { markets: sorted }\n}\n\nexport async function gmxFetchStakingPower(args: { chainId: number; executorAddress: string }) {\n const sdk = getGmxApiSdk(args.chainId)\n const power = await sdk.fetchStakingPower({ address: args.executorAddress })\n return {\n stakingPower: JSON.parse(JSON.stringify(power, (_, v) => (typeof v === 'bigint' ? v.toString() : v))),\n }\n}\n\nexport async function gmxFetchGmMarketForToken(args: { chainId: number; gmTokenAddress: string }) {\n const market = await gmxResolveMarketByGmTokenAddress(args.chainId, args.gmTokenAddress)\n if (!market) return { market: null }\n const tokens = await gmxFetchTokens(args.chainId)\n const tokenByAddr = new Map(tokens.map((t) => [t.address.toLowerCase(), t]))\n const long = tokenByAddr.get((market.longTokenAddress ?? '').toLowerCase())\n const short = tokenByAddr.get((market.shortTokenAddress ?? '').toLowerCase())\n return {\n market: {\n symbol: market.symbol,\n marketTokenAddress: market.marketTokenAddress,\n longTokenSymbol: long?.symbol ?? null,\n shortTokenSymbol: short?.symbol ?? null,\n gmDecimals: 18,\n },\n }\n}\n\nexport function gmxGmxTokenAddress(chainId: number): string {\n return gmxContractAddress(chainId, 'GMX')\n}\n\nexport async function gmxIsGmMarketTokenAddress(chainId: number, tokenAddress: string): Promise<boolean> {\n try {\n const market = await gmxResolveMarketByGmTokenAddress(chainId, tokenAddress)\n return market != null\n } catch {\n return false\n }\n}\n\nexport function gmxIsGmxStakeTokenAddress(chainId: number, tokenAddress: string): boolean {\n try {\n return getAddress(tokenAddress).toLowerCase() === gmxGmxTokenAddress(chainId).toLowerCase()\n } catch {\n return false\n }\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string, purposeSuffix?: string): string {\n const t = purposeText.trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload)\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import { getAddress } from 'viem'\nimport { isGmxChainSupported } from './support.js'\nimport type { GmxTokenRow } from './api.js'\n\n/** Wrapped native collateral symbol GMX perp markets accept (not the zero-address gas token). */\nexport const GMX_WRAPPED_NATIVE_SYMBOL_BY_CHAIN: Partial<Record<number, string>> = {\n 42161: 'WETH',\n 43114: 'WAVAX',\n}\n\n/** Native gas token symbol for GMX receiveToken unwrap on decrease. */\nexport const GMX_NATIVE_GAS_SYMBOL_BY_CHAIN: Partial<Record<number, string>> = {\n 42161: 'ETH',\n 43114: 'AVAX',\n}\n\nexport function gmxWrappedNativeSymbolForChain(chainId: number): string | null {\n if (!isGmxChainSupported(chainId)) return null\n return GMX_WRAPPED_NATIVE_SYMBOL_BY_CHAIN[chainId] ?? null\n}\n\nexport function gmxNativeGasSymbolForChain(chainId: number): string | null {\n if (!isGmxChainSupported(chainId)) return null\n return GMX_NATIVE_GAS_SYMBOL_BY_CHAIN[chainId] ?? null\n}\n\nexport function gmxFindWrappedNativeToken(tokens: readonly GmxTokenRow[], chainId: number): GmxTokenRow | null {\n const sym = gmxWrappedNativeSymbolForChain(chainId)\n if (!sym) return null\n return tokens.find((t) => t.symbol?.toUpperCase() === sym.toUpperCase()) ?? null\n}\n\n/** Map node asset row address to GMX collateral lookup key (native gas row → wrapped ERC-20). */\nexport function gmxKeyForNodeAssetRow(args: {\n contractAddress: string\n nativeWrapped: string | null\n}): string | null {\n const raw = (args.contractAddress ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === '0x0000000000000000000000000000000000000000' && args.nativeWrapped) {\n return getAddress(args.nativeWrapped.trim() as `0x${string}`).toLowerCase()\n }\n return a.toLowerCase()\n } catch {\n return null\n }\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { parseGmxTokenAmount, parseGmxUsd30 } from './amounts.js'\nimport {\n formatGmxLeverageBps,\n formatGmxTokenAmountHuman,\n formatGmxUsd30,\n formatGmxUsd30HumanInput,\n} from './format.js'\nimport { gmxMarketMaxLeverageBps, gmxMarketMaxLeverageLabel } from './leverage.js'\nimport { loadGmxMarketContext, resolveGmxMarketBySymbol, resolveGmxTokenBySymbol } from './marketContext.js'\nimport { getGmxApiSdk } from './api.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { getIncreasePositionAmounts, getNextPositionValuesForIncreaseTrade } = require('@gmx-io/sdk/utils/trade') as {\n getIncreasePositionAmounts: (p: Record<string, unknown>) => Record<string, unknown>\n getNextPositionValuesForIncreaseTrade: (p: Record<string, unknown>) => Record<string, unknown>\n}\nconst { getDecreasePositionAmounts, getNextPositionValuesForDecreaseTrade } = require('@gmx-io/sdk/utils/trade') as {\n getDecreasePositionAmounts: (p: Record<string, unknown>) => Record<string, unknown>\n getNextPositionValuesForDecreaseTrade: (p: Record<string, unknown>) => Record<string, unknown>\n}\nconst { createFindSwapPath } = require('@gmx-io/sdk/utils/swap') as {\n createFindSwapPath: (p: Record<string, unknown>) => (args: Record<string, unknown>) => unknown\n}\nconst { SwapPricingType } = require('@gmx-io/sdk/utils/orders') as { SwapPricingType: { Swap: unknown } }\nconst { convertToTokenAmount } = require('@gmx-io/sdk/utils/tokens') as {\n convertToTokenAmount: (usd: bigint, decimals: number, price: bigint) => bigint\n}\nconst { getPositionInfo } = require('@gmx-io/sdk/utils/positions') as {\n getPositionInfo: (p: Record<string, unknown>) => Record<string, unknown>\n}\n\nexport type GmxTradeEstimate = {\n direction: 'long' | 'short'\n marketSymbol: string\n sizeUsdHuman: string\n collateralSymbol: string\n collateralAmountHuman: string | null\n /** Current open position size (Close tab); use for MAX and validation. */\n openPositionSizeUsdHuman: string | null\n openPositionSizeUsdLabel: string | null\n entryPriceUsd: string | null\n liquidationPriceUsd: string | null\n leverageLabel: string | null\n maxLeverageLabel: string | null\n minCollateralAmountHuman: string | null\n exceedsMaxLeverage: boolean\n note: string | null\n}\n\nfunction asBigint(v: unknown): bigint | undefined {\n if (v == null) return undefined\n try {\n return typeof v === 'bigint' ? v : BigInt(String(v))\n } catch {\n return undefined\n }\n}\n\nfunction findSwapPathForCollateral(args: {\n chainId: number\n fromToken: Record<string, unknown>\n collateralToken: Record<string, unknown>\n marketsInfoData: Record<string, Record<string, unknown>>\n tokensData: Record<string, Record<string, unknown>>\n}) {\n return createFindSwapPath({\n chainId: args.chainId,\n fromTokenAddress: args.fromToken.address,\n toTokenAddress: args.collateralToken.address,\n marketsInfoData: args.marketsInfoData,\n gasEstimationParams: { gasLimits: {}, gasPrice: 1n, tokensData: args.tokensData },\n swapPricingType: SwapPricingType.Swap,\n })\n}\n\ntype IncreaseSimContext = {\n chainId: number\n market: Record<string, unknown>\n collateralToken: Record<string, unknown>\n fromToken: Record<string, unknown>\n isLong: boolean\n sizeUsd: bigint\n indexToken: Record<string, unknown>\n indexTokenAmount: bigint\n findSwapPath: ReturnType<typeof findSwapPathForCollateral>\n existingPosition: Record<string, unknown> | undefined\n ctx: Awaited<ReturnType<typeof loadGmxMarketContext>>\n maxLeverageBps: number\n maxLeverageLabel: string | null\n collateralDecimals: number\n}\n\nasync function loadIncreaseSimContext(args: {\n chainId: number\n symbol: string\n direction: 'long' | 'short'\n sizeUsdHuman: string\n collateralToken: string\n executorAddress?: string\n}): Promise<IncreaseSimContext> {\n const market = await resolveGmxMarketBySymbol(args.chainId, args.symbol)\n if (!market) throw new Error(`GMX market not found: ${args.symbol}`)\n\n const collateralToken = await resolveGmxTokenBySymbol(args.chainId, args.collateralToken)\n if (!collateralToken) throw new Error(`GMX collateral token not found: ${args.collateralToken}`)\n\n const ctx = await loadGmxMarketContext(args.chainId)\n const fromToken = collateralToken\n const isLong = args.direction === 'long'\n const sizeUsd = parseGmxUsd30(args.sizeUsdHuman)\n\n const indexToken = market.indexToken as Record<string, unknown>\n const indexPrices = indexToken.prices as { minPrice?: bigint } | undefined\n const indexPrice = asBigint(indexPrices?.minPrice)\n if (!indexPrice || indexPrice <= 0n) throw new Error('GMX index price unavailable for estimate.')\n\n const indexTokenAmount = convertToTokenAmount(sizeUsd, Number(indexToken.decimals ?? 18), indexPrice)\n const findSwapPath = findSwapPathForCollateral({\n chainId: args.chainId,\n fromToken,\n collateralToken,\n marketsInfoData: ctx.marketsInfoData,\n tokensData: ctx.tokensData,\n })\n\n let existingPosition: Record<string, unknown> | undefined\n if (args.executorAddress?.trim()) {\n const sdk = getGmxApiSdk(args.chainId)\n const positions = await sdk.fetchPositionsInfo({ address: args.executorAddress.trim() })\n existingPosition = positions.find(\n (p) =>\n String(p.marketAddress ?? '').toLowerCase() === String(market.marketTokenAddress ?? '').toLowerCase() &&\n Boolean(p.isLong) === isLong,\n ) as Record<string, unknown> | undefined\n if (existingPosition && ctx.marketsInfoData[String(market.marketTokenAddress)]) {\n existingPosition = getPositionInfo({\n position: existingPosition,\n marketInfo: market,\n minCollateralUsd: ctx.minCollateralUsd,\n userReferralInfo: undefined,\n showPnlInLeverage: false,\n uiFeeFactor: 0n,\n }) as Record<string, unknown>\n }\n }\n\n const maxLeverageBps = gmxMarketMaxLeverageBps(market)\n return {\n chainId: args.chainId,\n market,\n collateralToken,\n fromToken,\n isLong,\n sizeUsd,\n indexToken,\n indexTokenAmount,\n findSwapPath,\n existingPosition,\n ctx,\n maxLeverageBps,\n maxLeverageLabel: gmxMarketMaxLeverageLabel(market),\n collateralDecimals: Number(collateralToken.decimals ?? 18),\n }\n}\n\nfunction simulateIncreaseAtCollateralWei(\n sim: IncreaseSimContext,\n collateralAmount: bigint,\n): { nextLeverageBps: bigint | null; nextEntryPrice: bigint | null; nextLiqPrice: bigint | null } {\n const increaseAmounts = getIncreasePositionAmounts({\n marketInfo: sim.market,\n indexToken: sim.indexToken,\n initialCollateralToken: sim.fromToken,\n collateralToken: sim.collateralToken,\n isLong: sim.isLong,\n initialCollateralAmount: collateralAmount,\n position: sim.existingPosition,\n indexTokenAmount: sim.indexTokenAmount,\n strategy: 'independent',\n findSwapPath: sim.findSwapPath,\n uiFeeFactor: 0n,\n marketsInfoData: sim.ctx.marketsInfoData,\n chainId: sim.chainId,\n externalSwapQuote: undefined,\n externalSwapQuoteParams: undefined,\n isSetAcceptablePriceImpactEnabled: false,\n userReferralInfo: undefined,\n })\n\n const next = getNextPositionValuesForIncreaseTrade({\n existingPosition: sim.existingPosition,\n marketInfo: sim.market,\n collateralToken: sim.collateralToken,\n positionPriceImpactDeltaUsd: increaseAmounts.positionPriceImpactDeltaUsd,\n sizeDeltaUsd: increaseAmounts.sizeDeltaUsd,\n sizeDeltaInTokens: increaseAmounts.sizeDeltaInTokens,\n collateralDeltaUsd: increaseAmounts.collateralDeltaUsd,\n collateralDeltaAmount: increaseAmounts.collateralDeltaAmount,\n indexPrice: increaseAmounts.indexPrice,\n isLong: sim.isLong,\n showPnlInLeverage: false,\n minCollateralUsd: sim.ctx.minCollateralUsd,\n userReferralInfo: undefined,\n })\n\n return {\n nextLeverageBps: asBigint(next.nextLeverage) ?? null,\n nextEntryPrice: asBigint(next.nextEntryPrice) ?? null,\n nextLiqPrice: asBigint(next.nextLiqPrice) ?? null,\n }\n}\n\nfunction findMinCollateralWeiForIncrease(sim: IncreaseSimContext): bigint | null {\n const maxBps = BigInt(sim.maxLeverageBps)\n const collateralPrices = sim.collateralToken.prices as { minPrice?: bigint } | undefined\n const collateralPrice = asBigint(collateralPrices?.minPrice)\n if (!collateralPrice || collateralPrice <= 0n) return null\n\n let hi = convertToTokenAmount(sim.sizeUsd * 2n, sim.collateralDecimals, collateralPrice)\n if (hi < 1n) hi = 1n\n\n const hiSim = simulateIncreaseAtCollateralWei(sim, hi)\n if (hiSim.nextLeverageBps == null || hiSim.nextLeverageBps > maxBps) {\n return null\n }\n\n let lo = 0n\n while (lo < hi) {\n const mid = (lo + hi) / 2n\n const probe = mid === 0n ? 1n : mid\n const { nextLeverageBps } = simulateIncreaseAtCollateralWei(sim, probe)\n if (nextLeverageBps != null && nextLeverageBps <= maxBps) {\n hi = probe\n } else {\n lo = probe + 1n\n }\n }\n return lo > 0n ? lo : 1n\n}\n\nexport async function gmxEstimateIncreasePreview(args: {\n chainId: number\n symbol: string\n direction: 'long' | 'short'\n sizeUsdHuman: string\n collateralToken: string\n collateralAmountHuman: string\n executorAddress?: string\n}): Promise<GmxTradeEstimate> {\n const sim = await loadIncreaseSimContext(args)\n const collateralAmount = parseGmxTokenAmount(args.collateralAmountHuman, sim.collateralDecimals)\n const { nextLeverageBps, nextEntryPrice, nextLiqPrice } = simulateIncreaseAtCollateralWei(sim, collateralAmount)\n\n const entry = formatGmxUsd30(nextEntryPrice)\n const liq = formatGmxUsd30(nextLiqPrice)\n const lev = formatGmxLeverageBps(nextLeverageBps)\n const maxBps = BigInt(sim.maxLeverageBps)\n const minWei = findMinCollateralWeiForIncrease(sim)\n const minCollateralAmountHuman =\n minWei != null ? formatGmxTokenAmountHuman(minWei, sim.collateralDecimals) : null\n const exceedsMaxLeverage =\n (nextLeverageBps != null && nextLeverageBps > maxBps) ||\n (minWei != null && collateralAmount < minWei)\n\n return {\n direction: args.direction,\n marketSymbol: args.symbol.trim(),\n sizeUsdHuman: args.sizeUsdHuman.trim(),\n collateralSymbol: args.collateralToken.trim(),\n collateralAmountHuman: args.collateralAmountHuman.trim(),\n openPositionSizeUsdHuman: null,\n openPositionSizeUsdLabel: null,\n entryPriceUsd: entry,\n liquidationPriceUsd: liq,\n leverageLabel: lev,\n maxLeverageLabel: sim.maxLeverageLabel,\n minCollateralAmountHuman,\n exceedsMaxLeverage,\n note: sim.existingPosition ? 'Estimated after adding to your open position.' : 'Estimated for a new position.',\n }\n}\n\nexport type GmxClosePositionCap = {\n openPositionSizeUsdHuman: string | null\n openPositionSizeUsdLabel: string | null\n}\n\nasync function gmxFindRawClosePosition(args: {\n chainId: number\n symbol: string\n direction: 'long' | 'short'\n executorAddress: string\n}) {\n const market = await resolveGmxMarketBySymbol(args.chainId, args.symbol)\n if (!market) return undefined\n const isLong = args.direction === 'long'\n const sdk = getGmxApiSdk(args.chainId)\n const rawPositions = await sdk.fetchPositionsInfo({ address: args.executorAddress.trim() })\n return rawPositions.find(\n (p) =>\n String(p.marketAddress ?? '').toLowerCase() === String(market.marketTokenAddress ?? '').toLowerCase() &&\n Boolean(p.isLong) === isLong,\n ) as Record<string, unknown> | undefined\n}\n\nexport async function gmxFetchClosePositionCap(args: {\n chainId: number\n symbol: string\n direction: 'long' | 'short'\n executorAddress: string\n}): Promise<GmxClosePositionCap> {\n const raw = await gmxFindRawClosePosition(args)\n if (!raw) {\n return { openPositionSizeUsdHuman: null, openPositionSizeUsdLabel: null }\n }\n const sizeInUsd = raw.sizeInUsd as bigint | string | number | null | undefined\n return {\n openPositionSizeUsdHuman: formatGmxUsd30HumanInput(sizeInUsd),\n openPositionSizeUsdLabel: formatGmxUsd30(sizeInUsd),\n }\n}\n\nexport async function gmxEstimateDecreasePreview(args: {\n chainId: number\n symbol: string\n direction: 'long' | 'short'\n sizeUsdHuman: string\n collateralToken: string\n executorAddress: string\n}): Promise<GmxTradeEstimate> {\n const market = await resolveGmxMarketBySymbol(args.chainId, args.symbol)\n if (!market) throw new Error(`GMX market not found: ${args.symbol}`)\n\n const collateralToken = await resolveGmxTokenBySymbol(args.chainId, args.collateralToken)\n if (!collateralToken) throw new Error(`GMX collateral token not found: ${args.collateralToken}`)\n\n const ctx = await loadGmxMarketContext(args.chainId)\n const isLong = args.direction === 'long'\n const closeSizeUsd = parseGmxUsd30(args.sizeUsdHuman)\n\n const raw = await gmxFindRawClosePosition({\n chainId: args.chainId,\n symbol: args.symbol,\n direction: args.direction,\n executorAddress: args.executorAddress,\n })\n\n if (!raw) {\n return {\n direction: args.direction,\n marketSymbol: args.symbol.trim(),\n sizeUsdHuman: args.sizeUsdHuman.trim(),\n collateralSymbol: args.collateralToken.trim(),\n collateralAmountHuman: null,\n openPositionSizeUsdHuman: null,\n openPositionSizeUsdLabel: null,\n entryPriceUsd: null,\n liquidationPriceUsd: null,\n leverageLabel: null,\n maxLeverageLabel: gmxMarketMaxLeverageLabel(market),\n minCollateralAmountHuman: null,\n exceedsMaxLeverage: false,\n note: 'No matching open position found for this market and direction.',\n }\n }\n\n const sizeInUsd = raw.sizeInUsd as bigint | string | number | null | undefined\n const openPositionSizeUsdHuman = formatGmxUsd30HumanInput(sizeInUsd)\n const openPositionSizeUsdLabel = formatGmxUsd30(sizeInUsd)\n\n const position = getPositionInfo({\n position: raw,\n marketInfo: market,\n minCollateralUsd: ctx.minCollateralUsd,\n userReferralInfo: undefined,\n showPnlInLeverage: false,\n uiFeeFactor: 0n,\n }) as Record<string, unknown>\n\n const decreaseAmounts = getDecreasePositionAmounts({\n marketInfo: market,\n collateralToken: position.collateralToken ?? collateralToken,\n isLong,\n position,\n closeSizeUsd,\n keepLeverage: false,\n userReferralInfo: undefined,\n minCollateralUsd: ctx.minCollateralUsd,\n minPositionSizeUsd: 1n,\n uiFeeFactor: 0n,\n isSetAcceptablePriceImpactEnabled: false,\n })\n\n const next = getNextPositionValuesForDecreaseTrade({\n existingPosition: position,\n marketInfo: market,\n collateralToken: position.collateralToken ?? collateralToken,\n sizeDeltaUsd: decreaseAmounts.sizeDeltaUsd,\n sizeDeltaInTokens: decreaseAmounts.sizeDeltaInTokens,\n realizedPnl: decreaseAmounts.realizedPnl,\n estimatedPnl: decreaseAmounts.estimatedPnl,\n collateralDeltaUsd: decreaseAmounts.collateralDeltaUsd,\n collateralDeltaAmount: decreaseAmounts.collateralDeltaAmount,\n payedRemainingCollateralUsd: decreaseAmounts.payedRemainingCollateralUsd,\n payedRemainingCollateralAmount: decreaseAmounts.payedRemainingCollateralAmount,\n proportionalPendingImpactDeltaUsd: decreaseAmounts.proportionalPendingImpactDeltaUsd,\n showPnlInLeverage: false,\n isLong,\n minCollateralUsd: ctx.minCollateralUsd,\n userReferralInfo: undefined,\n })\n\n const nextSize = asBigint(next.nextSizeUsd) ?? 0n\n const liq =\n nextSize > 0n ? formatGmxUsd30(asBigint(next.nextLiqPrice)) : null\n const lev = nextSize > 0n ? formatGmxLeverageBps(asBigint(next.nextLeverage)) : null\n\n const fullClose = nextSize <= 0n\n return {\n direction: args.direction,\n marketSymbol: args.symbol.trim(),\n sizeUsdHuman: args.sizeUsdHuman.trim(),\n collateralSymbol: args.collateralToken.trim(),\n collateralAmountHuman: null,\n openPositionSizeUsdHuman,\n openPositionSizeUsdLabel,\n entryPriceUsd: formatGmxUsd30(asBigint(position.entryPrice)),\n liquidationPriceUsd: liq,\n leverageLabel: lev,\n maxLeverageLabel: gmxMarketMaxLeverageLabel(market),\n minCollateralAmountHuman: null,\n exceedsMaxLeverage: false,\n note: fullClose\n ? 'Full close — no remaining position after this order.'\n : 'Estimated remaining position after this close.',\n }\n}\n\nexport async function gmxAssertIncreaseOrderWithinMaxLeverage(args: {\n chainId: number\n symbol: string\n direction: 'long' | 'short'\n sizeUsdHuman: string\n collateralToken: string\n collateralAmountHuman: string\n executorAddress?: string\n}): Promise<void> {\n const estimate = await gmxEstimateIncreasePreview(args)\n if (!estimate.exceedsMaxLeverage) return\n const maxLev = estimate.maxLeverageLabel ?? 'market max'\n const minCol = estimate.minCollateralAmountHuman\n const sym = estimate.collateralSymbol\n if (minCol) {\n throw new Error(\n `Collateral is too low for ${maxLev} max leverage on ${estimate.marketSymbol}. Need at least ${minCol} ${sym}.`,\n )\n }\n throw new Error(\n `Collateral is too low for ${maxLev} max leverage on ${estimate.marketSymbol}. Increase collateral or reduce size.`,\n )\n}\n\n/** Returns true when close size is positive and does not exceed the open position. */\nexport function gmxIsCloseSizeWithinPosition(args: {\n closeSizeUsdHuman: string\n openPositionSizeUsdHuman: string\n}): boolean {\n try {\n const close = parseGmxUsd30(args.closeSizeUsdHuman)\n const open = parseGmxUsd30(args.openPositionSizeUsdHuman)\n return close > 0n && close <= open\n } catch {\n return false\n }\n}\n","import {\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n type Address,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport { getGmxApiSdk, type GmxPrepareOrderResponse } from './api.js'\nimport { parseGmxTokenAmount, parseGmxUsd30 } from './amounts.js'\nimport { gmxNativeGasSymbolForChain, gmxWrappedNativeSymbolForChain } from './native.js'\nimport { gmxAssertIncreaseOrderWithinMaxLeverage } from './estimates.js'\nimport { gmxResolveTokenBySymbol } from './markets.js'\n\nconst GMX_ORDER_GAS_FALLBACK = 2_500_000n\nconst GMX_WETH_DEPOSIT_FALLBACK = 120_000n\nconst GMX_ERC20_APPROVE_FALLBACK = 100_000n\n\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\ntype GmxMultisignCommon = {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n executorAddress: Address\n purposeText: string\n}\n\nexport type GmxIncreaseOrderArgs = GmxMultisignCommon & {\n symbol: string\n direction: 'long' | 'short'\n orderType: 'market' | 'limit'\n sizeUsdHuman: string\n collateralToken: string\n collateralAmountHuman: string\n triggerPriceUsdHuman?: string\n slippageBps?: number\n executionFeeBufferBps?: number\n isNativeIn?: boolean\n /** Wrapped native (WETH/WAVAX); required when `isNativeIn`. */\n nativeWrapped?: Address\n}\n\nexport type GmxDecreaseOrderArgs = GmxMultisignCommon & {\n symbol: string\n direction: 'long' | 'short'\n orderType: 'market' | 'limit'\n sizeUsdHuman: string\n collateralToken: string\n receiveToken?: string\n triggerPriceUsdHuman?: string\n keepLeverage?: boolean\n slippageBps?: number\n executionFeeBufferBps?: number\n /** When true, receive native gas token (GMX unwraps WETH/WAVAX in the order). */\n isNativeOut?: boolean\n}\n\nexport type GmxCancelOrderArgs = GmxMultisignCommon & {\n orderId: string\n}\n\nfunction payloadToStep(payload: GmxPrepareOrderResponse['payload']): EvmTxStep {\n if (!payload?.to || !payload?.data) {\n throw new Error('GMX prepareOrder did not return classic transaction calldata (to/data).')\n }\n const to = getAddress(payload.to.trim() as `0x${string}`)\n const raw = payload.data.toString()\n const data = (raw.startsWith('0x') ? raw : `0x${raw}`) as `0x${string}`\n let value = 0n\n if (payload.value != null) {\n value = typeof payload.value === 'bigint' ? payload.value : BigInt(String(payload.value))\n }\n return { to, data, value, fallbackGas: GMX_ORDER_GAS_FALLBACK }\n}\n\nasync function buildNativeCollateralPrepSteps(args: {\n chainId: number\n rpcUrl: string\n executorAddress: Address\n nativeWrapped: Address\n collateralToken: string\n collateralAmountHuman: string\n exchangeRouter: Address\n}): Promise<EvmTxStep[]> {\n const weth = getAddress(args.nativeWrapped)\n const executor = getAddress(args.executorAddress)\n const router = getAddress(args.exchangeRouter)\n const token = await gmxResolveTokenBySymbol(args.chainId, args.collateralToken)\n const amountWei = parseGmxTokenAmount(args.collateralAmountHuman, token.decimals)\n if (amountWei === 0n) throw new Error('Collateral amount is zero after converting with token decimals.')\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Native', symbol: 'N' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const steps: EvmTxStep[] = []\n const dataDeposit = encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit', args: [] })\n steps.push({ to: weth, data: dataDeposit, value: amountWei, fallbackGas: GMX_WETH_DEPOSIT_FALLBACK })\n\n const allowance = await publicClient.readContract({\n address: weth,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, router],\n })\n if (allowance < amountWei) {\n if (allowance > 0n) {\n steps.push({\n to: weth,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [router, 0n] }),\n value: 0n,\n fallbackGas: GMX_ERC20_APPROVE_FALLBACK,\n })\n }\n steps.push({\n to: weth,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [router, amountWei] }),\n value: 0n,\n fallbackGas: GMX_ERC20_APPROVE_FALLBACK,\n })\n }\n return steps\n}\n\nasync function buildGmxClassicPreparedMultisignBatch(\n common: GmxMultisignCommon,\n prepared: GmxPrepareOrderResponse,\n signatureMeta: Record<string, unknown>,\n prepSteps: EvmTxStep[] = [],\n) {\n const executor = getAddress(common.executorAddress)\n const orderStep = payloadToStep(prepared.payload)\n const steps = [...prepSteps, orderStep]\n const firstStep = steps[0]!\n const dataNo0x = firstStep.data.startsWith('0x') ? firstStep.data.slice(2) : firstStep.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: common.keyGen,\n purposeText: common.purposeText,\n chainId: common.chainId,\n rpcUrl: common.rpcUrl,\n executorAddress: executor,\n chainDetail: common.chainDetail,\n useCustomGas: common.useCustomGas,\n customGasChainDetails: common.customGasChainDetails,\n },\n steps,\n purposeSuffix: 'GMX: classic on-chain order (keeper-executed asynchronously).',\n firstMsgRawNo0x: dataNo0x,\n destinationAddress: firstStep.to,\n resolveGasLimit: async ({ estimatedGas, index }) => {\n const step = steps[index]\n const fallback = step?.fallbackGas ?? GMX_ORDER_GAS_FALLBACK\n return estimatedGas > fallback ? estimatedGas : fallback\n },\n buildBatchMeta: ({ index }) => {\n if (index < prepSteps.length) {\n const kind = index === 0 && prepSteps[0]?.value > 0n ? 'weth_deposit' : 'approve'\n return {\n signatureText: JSON.stringify({ kind: 'GMX', step: kind, ...signatureMeta }),\n evm: { type: kind === 'weth_deposit' ? 'gmx_weth_deposit' : 'gmx_erc20_approve', version: 1, chainId: String(common.chainId) },\n }\n }\n return {\n signatureText: JSON.stringify({\n kind: 'GMX',\n mode: 'classic',\n ...signatureMeta,\n }),\n evm: { type: 'gmx_classic_order', version: 1, chainId: String(common.chainId) },\n }\n },\n })\n}\n\nasync function collateralToPay(collateralToken: string, collateralAmountHuman: string, chainId: number) {\n const token = await gmxResolveTokenBySymbol(chainId, collateralToken)\n const amount = parseGmxTokenAmount(collateralAmountHuman, token.decimals)\n return { amount, token: token.symbol }\n}\n\nfunction resolveIncreaseCollateralToken(args: GmxIncreaseOrderArgs): string {\n if (args.isNativeIn) {\n const wrapped = gmxWrappedNativeSymbolForChain(args.chainId)\n if (!wrapped) throw new Error('Wrapped native collateral symbol is not configured for this chain.')\n return wrapped\n }\n return args.collateralToken.trim()\n}\n\nexport async function buildEvmMultisignBodyGmxIncreaseBatch(args: GmxIncreaseOrderArgs) {\n const sdk = getGmxApiSdk(args.chainId)\n const executor = getAddress(args.executorAddress)\n const size = parseGmxUsd30(args.sizeUsdHuman)\n const collateralSymbol = resolveIncreaseCollateralToken(args)\n await gmxAssertIncreaseOrderWithinMaxLeverage({\n chainId: args.chainId,\n symbol: args.symbol.trim(),\n direction: args.direction,\n sizeUsdHuman: args.sizeUsdHuman,\n collateralToken: collateralSymbol,\n collateralAmountHuman: args.collateralAmountHuman,\n executorAddress: executor,\n })\n const collateralToPayArg = await collateralToPay(collateralSymbol, args.collateralAmountHuman, args.chainId)\n\n if (args.isNativeIn) {\n if (!args.nativeWrapped) throw new Error('nativeWrapped is required when isNativeIn is true.')\n const wrapped = gmxWrappedNativeSymbolForChain(args.chainId)\n if (collateralSymbol.toUpperCase() !== wrapped?.toUpperCase()) {\n throw new Error('Native GMX collateral path requires the chain wrapped native token.')\n }\n }\n\n const prepareArgs: Record<string, unknown> = {\n kind: 'increase',\n symbol: args.symbol.trim(),\n direction: args.direction,\n orderType: args.orderType,\n size,\n collateralToken: collateralSymbol,\n collateralToPay: collateralToPayArg,\n mode: 'classic',\n from: executor,\n }\n if (args.orderType === 'limit') {\n if (!args.triggerPriceUsdHuman?.trim()) throw new Error('Limit orders require triggerPriceUsdHuman.')\n prepareArgs.triggerPrice = parseGmxUsd30(args.triggerPriceUsdHuman)\n }\n if (args.slippageBps != null) prepareArgs.slippage = args.slippageBps\n if (args.executionFeeBufferBps != null) prepareArgs.executionFeeBufferBps = args.executionFeeBufferBps\n\n const prepared = await sdk.prepareOrder(prepareArgs)\n if (prepared.payloadType !== 'transaction') {\n throw new Error('GMX prepareOrder returned typed-data; classic mode required for MPC multi-sign.')\n }\n\n const orderStep = payloadToStep(prepared.payload)\n\n let prepSteps: EvmTxStep[] = []\n if (args.isNativeIn && args.nativeWrapped) {\n prepSteps = await buildNativeCollateralPrepSteps({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n nativeWrapped: args.nativeWrapped,\n collateralToken: collateralSymbol,\n collateralAmountHuman: args.collateralAmountHuman,\n exchangeRouter: orderStep.to,\n })\n }\n\n return buildGmxClassicPreparedMultisignBatch(\n args,\n prepared,\n {\n action: 'increase',\n symbol: args.symbol,\n direction: args.direction,\n orderType: args.orderType,\n sizeUsdHuman: args.sizeUsdHuman,\n collateralToken: collateralSymbol,\n collateralAmountHuman: args.collateralAmountHuman,\n isNativeIn: Boolean(args.isNativeIn),\n },\n prepSteps,\n )\n}\n\nexport async function buildEvmMultisignBodyGmxDecreaseBatch(args: GmxDecreaseOrderArgs) {\n const sdk = getGmxApiSdk(args.chainId)\n const executor = getAddress(args.executorAddress)\n const size = parseGmxUsd30(args.sizeUsdHuman)\n\n const prepareArgs: Record<string, unknown> = {\n kind: 'decrease',\n symbol: args.symbol.trim(),\n direction: args.direction,\n orderType: args.orderType,\n size,\n collateralToken: args.collateralToken.trim(),\n mode: 'classic',\n from: executor,\n }\n if (args.isNativeOut) {\n const nativeSym = gmxNativeGasSymbolForChain(args.chainId)\n if (!nativeSym) throw new Error('Native receive symbol is not configured for this chain.')\n prepareArgs.receiveToken = nativeSym\n } else if (args.receiveToken?.trim()) {\n prepareArgs.receiveToken = args.receiveToken.trim()\n }\n if (args.keepLeverage != null) prepareArgs.keepLeverage = args.keepLeverage\n if (args.orderType === 'limit') {\n if (!args.triggerPriceUsdHuman?.trim()) throw new Error('Limit orders require triggerPriceUsdHuman.')\n prepareArgs.triggerPrice = parseGmxUsd30(args.triggerPriceUsdHuman)\n }\n if (args.slippageBps != null) prepareArgs.slippage = args.slippageBps\n if (args.executionFeeBufferBps != null) prepareArgs.executionFeeBufferBps = args.executionFeeBufferBps\n\n const prepared = await sdk.prepareOrder(prepareArgs)\n if (prepared.payloadType !== 'transaction') {\n throw new Error('GMX prepareOrder returned typed-data; classic mode required for MPC multi-sign.')\n }\n\n return buildGmxClassicPreparedMultisignBatch(args, prepared, {\n action: 'decrease',\n symbol: args.symbol,\n direction: args.direction,\n orderType: args.orderType,\n sizeUsdHuman: args.sizeUsdHuman,\n collateralToken: args.collateralToken,\n isNativeOut: Boolean(args.isNativeOut),\n })\n}\n\n/** Alias: limit increase uses orderType limit on increase builder. */\nexport const buildEvmMultisignBodyGmxLimitIncreaseBatch = buildEvmMultisignBodyGmxIncreaseBatch\n\n/** Alias: limit decrease uses orderType limit on decrease builder. */\nexport const buildEvmMultisignBodyGmxLimitDecreaseBatch = buildEvmMultisignBodyGmxDecreaseBatch\n\nexport async function buildEvmMultisignBodyGmxCancelBatch(args: GmxCancelOrderArgs) {\n const sdk = getGmxApiSdk(args.chainId)\n const executor = getAddress(args.executorAddress)\n const orderId = args.orderId.trim()\n if (!orderId) throw new Error('orderId is required to cancel a GMX order.')\n\n const prepared = await sdk.prepareCancelOrder({\n orderId,\n mode: 'classic',\n from: executor,\n })\n if (prepared.payloadType !== 'transaction') {\n throw new Error('GMX prepareCancelOrder returned typed-data; classic mode required for MPC multi-sign.')\n }\n\n return buildGmxClassicPreparedMultisignBatch(args, prepared, {\n action: 'cancel',\n orderId,\n })\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport {\n createPublicClient,\n defineChain,\n http,\n parseAbi,\n type Address,\n} from 'viem'\nimport { gmxContractAddress } from './contracts.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst {\n depositGasLimitKey,\n withdrawalGasLimitKey,\n singleSwapGasLimitKey,\n ESTIMATED_GAS_FEE_BASE_AMOUNT_V2_1,\n ESTIMATED_GAS_FEE_MULTIPLIER_FACTOR,\n ESTIMATED_GAS_FEE_PER_ORACLE_PRICE,\n} = require('@gmx-io/sdk/configs/dataStore') as {\n depositGasLimitKey: () => `0x${string}`\n withdrawalGasLimitKey: () => `0x${string}`\n singleSwapGasLimitKey: () => `0x${string}`\n ESTIMATED_GAS_FEE_BASE_AMOUNT_V2_1: `0x${string}`\n ESTIMATED_GAS_FEE_MULTIPLIER_FACTOR: `0x${string}`\n ESTIMATED_GAS_FEE_PER_ORACLE_PRICE: `0x${string}`\n}\nconst { applyFactor } = require('@gmx-io/sdk/utils/numbers') as {\n applyFactor: (value: bigint, factor: bigint) => bigint\n}\nconst {\n estimateExecuteDepositGasLimit,\n estimateExecuteWithdrawalGasLimit,\n} = require('@gmx-io/sdk/utils/fees') as {\n estimateExecuteDepositGasLimit: (\n gasLimits: {\n depositToken: bigint\n singleSwap: bigint\n },\n deposit: { swapsCount?: number; callbackGasLimit?: bigint },\n ) => bigint\n estimateExecuteWithdrawalGasLimit: (\n gasLimits: {\n withdrawalMultiToken: bigint\n singleSwap: bigint\n },\n withdrawal: { swapsCount?: bigint; callbackGasLimit?: bigint },\n ) => bigint\n}\n\nconst dataStoreAbi = parseAbi(['function getUint(bytes32 key) view returns (uint256)'])\n\ntype GmxGasLimits = {\n depositToken: bigint\n withdrawalMultiToken: bigint\n singleSwap: bigint\n estimatedGasFeeBaseAmount: bigint\n estimatedGasFeePerOraclePrice: bigint\n estimatedFeeMultiplierFactor: bigint\n}\n\nconst gasLimitsCache = new Map<number, GmxGasLimits>()\n\nasync function gmxLoadGasLimits(chainId: number, rpcUrl: string): Promise<GmxGasLimits> {\n const cached = gasLimitsCache.get(chainId)\n if (cached) return cached\n\n const dataStore = gmxContractAddress(chainId, 'DataStore')\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Native', symbol: 'N' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const keys = [\n ['depositToken', depositGasLimitKey()],\n ['withdrawalMultiToken', withdrawalGasLimitKey()],\n ['singleSwap', singleSwapGasLimitKey()],\n ['estimatedGasFeeBaseAmount', ESTIMATED_GAS_FEE_BASE_AMOUNT_V2_1],\n ['estimatedGasFeePerOraclePrice', ESTIMATED_GAS_FEE_PER_ORACLE_PRICE],\n ['estimatedFeeMultiplierFactor', ESTIMATED_GAS_FEE_MULTIPLIER_FACTOR],\n ] as const\n\n const limits = {\n depositToken: 0n,\n withdrawalMultiToken: 0n,\n singleSwap: 0n,\n estimatedGasFeeBaseAmount: 0n,\n estimatedGasFeePerOraclePrice: 0n,\n estimatedFeeMultiplierFactor: 0n,\n } satisfies GmxGasLimits\n\n await Promise.all(\n keys.map(async ([field, key]) => {\n const value = await publicClient.readContract({\n address: dataStore,\n abi: dataStoreAbi,\n functionName: 'getUint',\n args: [key],\n })\n limits[field] = value\n }),\n )\n\n gasLimitsCache.set(chainId, limits)\n return limits\n}\n\nfunction applyGmxExecutionFeeFormula(args: {\n gasLimits: GmxGasLimits\n estimatedGasLimit: bigint\n gasPrice: bigint\n oraclePriceCount: bigint\n bufferBps: number\n}): bigint {\n const { gasLimits, estimatedGasLimit, gasPrice, oraclePriceCount, bufferBps } = args\n let gasLimit = gasLimits.estimatedGasFeeBaseAmount\n gasLimit += gasLimits.estimatedGasFeePerOraclePrice * oraclePriceCount\n const multiplier = gasLimits.estimatedFeeMultiplierFactor\n gasLimit += applyFactor(estimatedGasLimit, multiplier)\n const buffered = gasLimit + (gasLimit * BigInt(bufferBps)) / 10_000n\n return buffered * gasPrice\n}\n\nconst DEFAULT_EXECUTION_FEE_BUFFER_BPS = 3000\n\nexport async function gmxEstimateGmExecutionFee(args: {\n chainId: number\n rpcUrl: string\n operation: 'deposit' | 'withdrawal'\n executionFeeBufferBps?: number\n}): Promise<bigint> {\n const bufferBps = args.executionFeeBufferBps ?? DEFAULT_EXECUTION_FEE_BUFFER_BPS\n const gasLimits = await gmxLoadGasLimits(args.chainId, args.rpcUrl)\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Native', symbol: 'N' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const gasPrice = await publicClient.getGasPrice()\n\n const oraclePriceCount = 3n\n const estimatedGasLimit =\n args.operation === 'deposit'\n ? estimateExecuteDepositGasLimit(gasLimits, { swapsCount: 0, callbackGasLimit: 0n })\n : estimateExecuteWithdrawalGasLimit(gasLimits, { swapsCount: 0n, callbackGasLimit: 0n })\n\n return applyGmxExecutionFeeFormula({\n gasLimits,\n estimatedGasLimit,\n gasPrice,\n oraclePriceCount,\n bufferBps,\n })\n}\n\nexport function gmxZeroAddress(): Address {\n return '0x0000000000000000000000000000000000000000'\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport {\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n type Address,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport { parseGmxTokenAmount } from './amounts.js'\nimport { gmxContractAddress } from './contracts.js'\nimport { gmxEstimateGmExecutionFee, gmxZeroAddress } from './executionFee.js'\nimport { gmxResolveMarketBySymbol, gmxResolveTokenBySymbol } from './markets.js'\nimport { gmxWrappedNativeSymbolForChain } from './native.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst ExchangeRouterAbi = require('@gmx-io/sdk/abis/ExchangeRouter').default as readonly unknown[]\n\nconst GMX_GM_MULTICALL_FALLBACK = 2_800_000n\nconst GMX_WETH_DEPOSIT_FALLBACK = 120_000n\nconst GMX_ERC20_APPROVE_FALLBACK = 100_000n\n\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\ntype GmxGmMultisignCommon = {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n executorAddress: Address\n purposeText: string\n}\n\nexport type GmxGmDepositArgs = GmxGmMultisignCommon & {\n marketSymbol: string\n collateralToken: string\n collateralAmountHuman: string\n executionFeeBufferBps?: number\n isNativeIn?: boolean\n nativeWrapped?: Address\n}\n\nexport type GmxGmWithdrawArgs = GmxGmMultisignCommon & {\n marketSymbol: string\n gmAmountHuman: string\n gmDecimals?: number\n executionFeeBufferBps?: number\n isNativeOut?: boolean\n}\n\nasync function buildApproveStepsIfNeeded(args: {\n chainId: number\n rpcUrl: string\n executorAddress: Address\n token: Address\n spender: Address\n amountWei: bigint\n}): Promise<EvmTxStep[]> {\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Native', symbol: 'N' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const allowance = await publicClient.readContract({\n address: args.token,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [args.executorAddress, args.spender],\n })\n if (allowance >= args.amountWei) return []\n const steps: EvmTxStep[] = []\n if (allowance > 0n) {\n steps.push({\n to: args.token,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [args.spender, 0n] }),\n value: 0n,\n fallbackGas: GMX_ERC20_APPROVE_FALLBACK,\n })\n }\n steps.push({\n to: args.token,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [args.spender, args.amountWei] }),\n value: 0n,\n fallbackGas: GMX_ERC20_APPROVE_FALLBACK,\n })\n return steps\n}\n\nasync function buildNativeWrapPrepSteps(args: {\n chainId: number\n rpcUrl: string\n executorAddress: Address\n nativeWrapped: Address\n exchangeRouter: Address\n amountWei: bigint\n}): Promise<EvmTxStep[]> {\n const weth = getAddress(args.nativeWrapped)\n const router = getAddress(args.exchangeRouter)\n const steps: EvmTxStep[] = []\n steps.push({\n to: weth,\n data: encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit', args: [] }),\n value: args.amountWei,\n fallbackGas: GMX_WETH_DEPOSIT_FALLBACK,\n })\n const approveSteps = await buildApproveStepsIfNeeded({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: args.executorAddress,\n token: weth,\n spender: router,\n amountWei: args.amountWei,\n })\n steps.push(...approveSteps)\n return steps\n}\n\nfunction resolveGmCollateralAddress(args: {\n chainId: number\n collateralToken: string\n isNativeIn?: boolean\n nativeWrapped?: Address\n}): Promise<Address> {\n if (args.isNativeIn) {\n if (!args.nativeWrapped) throw new Error('nativeWrapped is required when isNativeIn is true.')\n const wrapped = gmxWrappedNativeSymbolForChain(args.chainId)\n if (!wrapped) throw new Error('Wrapped native symbol is not configured for this chain.')\n if (args.collateralToken.trim().toUpperCase() !== wrapped.toUpperCase()) {\n throw new Error('Native GM deposit requires the chain wrapped native collateral symbol.')\n }\n return Promise.resolve(getAddress(args.nativeWrapped))\n }\n return gmxResolveTokenBySymbol(args.chainId, args.collateralToken).then((t) => getAddress(t.address as Address))\n}\n\nasync function buildGmLiquidityMultisignBatch(\n common: GmxGmMultisignCommon,\n steps: EvmTxStep[],\n signatureMeta: Record<string, unknown>,\n purposeSuffix: string,\n) {\n const executor = getAddress(common.executorAddress)\n const firstStep = steps[0]!\n const dataNo0x = firstStep.data.startsWith('0x') ? firstStep.data.slice(2) : firstStep.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: common.keyGen,\n purposeText: common.purposeText,\n chainId: common.chainId,\n rpcUrl: common.rpcUrl,\n executorAddress: executor,\n chainDetail: common.chainDetail,\n useCustomGas: common.useCustomGas,\n customGasChainDetails: common.customGasChainDetails,\n },\n steps,\n purposeSuffix,\n firstMsgRawNo0x: dataNo0x,\n destinationAddress: firstStep.to,\n resolveGasLimit: async ({ estimatedGas, index }) => {\n const step = steps[index]\n const fallback = step?.fallbackGas ?? GMX_GM_MULTICALL_FALLBACK\n return estimatedGas > fallback ? estimatedGas : fallback\n },\n buildBatchMeta: ({ index }) => {\n const step = steps[index]\n const isApprove = step?.fallbackGas === GMX_ERC20_APPROVE_FALLBACK\n const isWrap = step?.value > 0n && step?.fallbackGas === GMX_WETH_DEPOSIT_FALLBACK\n if (isWrap) {\n return {\n signatureText: JSON.stringify({ kind: 'GMX', step: 'weth_deposit', ...signatureMeta }),\n evm: { type: 'gmx_weth_deposit', version: 1, chainId: String(common.chainId) },\n }\n }\n if (isApprove) {\n return {\n signatureText: JSON.stringify({ kind: 'GMX', step: 'approve', ...signatureMeta }),\n evm: { type: 'gmx_erc20_approve', version: 1, chainId: String(common.chainId) },\n }\n }\n return {\n signatureText: JSON.stringify({ kind: 'GMX', ...signatureMeta }),\n evm: { type: 'gmx_gm_liquidity', version: 1, chainId: String(common.chainId) },\n }\n },\n })\n}\n\nexport async function buildEvmMultisignBodyGmxGmDepositBatch(args: GmxGmDepositArgs) {\n const executor = getAddress(args.executorAddress)\n const market = await gmxResolveMarketBySymbol(args.chainId, args.marketSymbol)\n const collateralAddr = await resolveGmCollateralAddress(args)\n const collateralRow = await gmxResolveTokenBySymbol(args.chainId, args.collateralToken)\n const amountWei = parseGmxTokenAmount(args.collateralAmountHuman, collateralRow.decimals)\n if (amountWei === 0n) throw new Error('Collateral amount is zero after converting with token decimals.')\n\n const longToken = getAddress(market.longTokenAddress as Address)\n const shortToken = getAddress(market.shortTokenAddress as Address)\n if (collateralAddr !== longToken && collateralAddr !== shortToken) {\n throw new Error('Collateral token is not a pool token for the selected GM market.')\n }\n\n const exchangeRouter = gmxContractAddress(args.chainId, 'ExchangeRouter')\n const depositVault = gmxContractAddress(args.chainId, 'DepositVault')\n const executionFee = await gmxEstimateGmExecutionFee({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n operation: 'deposit',\n executionFeeBufferBps: args.executionFeeBufferBps,\n })\n\n const prepSteps: EvmTxStep[] = []\n if (args.isNativeIn && args.nativeWrapped) {\n prepSteps.push(\n ...(await buildNativeWrapPrepSteps({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n nativeWrapped: args.nativeWrapped,\n exchangeRouter,\n amountWei,\n })),\n )\n } else {\n prepSteps.push(\n ...(await buildApproveStepsIfNeeded({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n token: collateralAddr,\n spender: exchangeRouter,\n amountWei,\n })),\n )\n }\n\n const multicallData = [\n encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'sendWnt',\n args: [depositVault, executionFee],\n }),\n encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'sendTokens',\n args: [collateralAddr, depositVault, amountWei],\n }),\n encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'createDeposit',\n args: [\n {\n addresses: {\n receiver: executor,\n callbackContract: gmxZeroAddress(),\n uiFeeReceiver: gmxZeroAddress(),\n market: getAddress(market.marketTokenAddress as Address),\n initialLongToken: longToken,\n initialShortToken: shortToken,\n longTokenSwapPath: [],\n shortTokenSwapPath: [],\n },\n minMarketTokens: 0n,\n shouldUnwrapNativeToken: Boolean(args.isNativeIn),\n executionFee,\n callbackGasLimit: 0n,\n dataList: [],\n },\n ],\n }),\n ]\n\n const orderStep: EvmTxStep = {\n to: exchangeRouter,\n data: encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'multicall',\n args: [multicallData],\n }),\n value: executionFee,\n fallbackGas: GMX_GM_MULTICALL_FALLBACK,\n }\n\n return buildGmLiquidityMultisignBatch(\n args,\n [...prepSteps, orderStep],\n {\n action: 'gm-deposit',\n marketSymbol: args.marketSymbol,\n collateralToken: args.collateralToken,\n collateralAmountHuman: args.collateralAmountHuman,\n isNativeIn: Boolean(args.isNativeIn),\n },\n 'GMX: GM pool deposit (keeper-executed asynchronously).',\n )\n}\n\nexport async function buildEvmMultisignBodyGmxGmWithdrawBatch(args: GmxGmWithdrawArgs) {\n const executor = getAddress(args.executorAddress)\n const market = await gmxResolveMarketBySymbol(args.chainId, args.marketSymbol)\n const gmToken = getAddress(market.marketTokenAddress as Address)\n const gmDecimals = args.gmDecimals ?? 18\n const gmAmountWei = parseGmxTokenAmount(args.gmAmountHuman, gmDecimals)\n if (gmAmountWei === 0n) throw new Error('GM amount is zero after converting with token decimals.')\n\n const exchangeRouter = gmxContractAddress(args.chainId, 'ExchangeRouter')\n const withdrawalVault = gmxContractAddress(args.chainId, 'WithdrawalVault')\n const executionFee = await gmxEstimateGmExecutionFee({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n operation: 'withdrawal',\n executionFeeBufferBps: args.executionFeeBufferBps,\n })\n\n const prepSteps = await buildApproveStepsIfNeeded({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n token: gmToken,\n spender: exchangeRouter,\n amountWei: gmAmountWei,\n })\n\n const multicallData = [\n encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'sendWnt',\n args: [withdrawalVault, executionFee],\n }),\n encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'sendTokens',\n args: [gmToken, withdrawalVault, gmAmountWei],\n }),\n encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'createWithdrawal',\n args: [\n {\n addresses: {\n receiver: executor,\n callbackContract: gmxZeroAddress(),\n uiFeeReceiver: gmxZeroAddress(),\n market: gmToken,\n longTokenSwapPath: [],\n shortTokenSwapPath: [],\n },\n minLongTokenAmount: 0n,\n minShortTokenAmount: 0n,\n shouldUnwrapNativeToken: Boolean(args.isNativeOut),\n executionFee,\n callbackGasLimit: 0n,\n dataList: [],\n },\n ],\n }),\n ]\n\n const orderStep: EvmTxStep = {\n to: exchangeRouter,\n data: encodeFunctionData({\n abi: ExchangeRouterAbi,\n functionName: 'multicall',\n args: [multicallData],\n }),\n value: executionFee,\n fallbackGas: GMX_GM_MULTICALL_FALLBACK,\n }\n\n return buildGmLiquidityMultisignBatch(\n args,\n [...prepSteps, orderStep],\n {\n action: 'gm-withdraw',\n marketSymbol: args.marketSymbol,\n gmAmountHuman: args.gmAmountHuman,\n isNativeOut: Boolean(args.isNativeOut),\n },\n 'GMX: GM pool withdrawal (keeper-executed asynchronously).',\n )\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport {\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n type Address,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport { parseGmxTokenAmount } from './amounts.js'\nimport { gmxContractAddress } from './contracts.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst RewardRouterAbi = require('@gmx-io/sdk/abis/RewardRouter').default as readonly unknown[]\n\nconst GMX_STAKE_FALLBACK = 600_000n\nconst GMX_ERC20_APPROVE_FALLBACK = 100_000n\n\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\ntype GmxStakeMultisignCommon = {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n executorAddress: Address\n purposeText: string\n}\n\nexport type GmxStakeGmxArgs = GmxStakeMultisignCommon & {\n amountHuman: string\n gmxDecimals?: number\n}\n\nexport type GmxUnstakeGmxArgs = GmxStakeMultisignCommon & {\n amountHuman: string\n gmxDecimals?: number\n}\n\nasync function buildGmxStakeMultisignBatch(\n common: GmxStakeMultisignCommon,\n steps: EvmTxStep[],\n signatureMeta: Record<string, unknown>,\n purposeSuffix: string,\n) {\n const executor = getAddress(common.executorAddress)\n const firstStep = steps[0]!\n const dataNo0x = firstStep.data.startsWith('0x') ? firstStep.data.slice(2) : firstStep.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: common.keyGen,\n purposeText: common.purposeText,\n chainId: common.chainId,\n rpcUrl: common.rpcUrl,\n executorAddress: executor,\n chainDetail: common.chainDetail,\n useCustomGas: common.useCustomGas,\n customGasChainDetails: common.customGasChainDetails,\n },\n steps,\n purposeSuffix,\n firstMsgRawNo0x: dataNo0x,\n destinationAddress: firstStep.to,\n resolveGasLimit: async ({ estimatedGas, index }) => {\n const step = steps[index]\n const fallback = step?.fallbackGas ?? GMX_STAKE_FALLBACK\n return estimatedGas > fallback ? estimatedGas : fallback\n },\n buildBatchMeta: ({ index }) => {\n const step = steps[index]\n const isApprove = step?.fallbackGas === GMX_ERC20_APPROVE_FALLBACK\n if (isApprove) {\n return {\n signatureText: JSON.stringify({ kind: 'GMX', step: 'approve', ...signatureMeta }),\n evm: { type: 'gmx_erc20_approve', version: 1, chainId: String(common.chainId) },\n }\n }\n return {\n signatureText: JSON.stringify({ kind: 'GMX', ...signatureMeta }),\n evm: { type: 'gmx_token_stake', version: 1, chainId: String(common.chainId) },\n }\n },\n })\n}\n\nasync function buildGmxApproveSteps(args: {\n chainId: number\n rpcUrl: string\n executorAddress: Address\n gmxToken: Address\n rewardRouter: Address\n amountWei: bigint\n}): Promise<EvmTxStep[]> {\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Native', symbol: 'N' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const allowance = await publicClient.readContract({\n address: args.gmxToken,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [args.executorAddress, args.rewardRouter],\n })\n if (allowance >= args.amountWei) return []\n const steps: EvmTxStep[] = []\n if (allowance > 0n) {\n steps.push({\n to: args.gmxToken,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [args.rewardRouter, 0n] }),\n value: 0n,\n fallbackGas: GMX_ERC20_APPROVE_FALLBACK,\n })\n }\n steps.push({\n to: args.gmxToken,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [args.rewardRouter, args.amountWei] }),\n value: 0n,\n fallbackGas: GMX_ERC20_APPROVE_FALLBACK,\n })\n return steps\n}\n\nexport async function buildEvmMultisignBodyGmxStakeGmxBatch(args: GmxStakeGmxArgs) {\n const executor = getAddress(args.executorAddress)\n const gmxToken = gmxContractAddress(args.chainId, 'GMX')\n const rewardRouter = gmxContractAddress(args.chainId, 'RewardRouter')\n const amountWei = parseGmxTokenAmount(args.amountHuman, args.gmxDecimals ?? 18)\n if (amountWei === 0n) throw new Error('GMX stake amount is zero after converting with token decimals.')\n\n const prepSteps = await buildGmxApproveSteps({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n gmxToken,\n rewardRouter,\n amountWei,\n })\n\n const stakeStep: EvmTxStep = {\n to: rewardRouter,\n data: encodeFunctionData({\n abi: RewardRouterAbi,\n functionName: 'stakeGmx',\n args: [amountWei],\n }),\n value: 0n,\n fallbackGas: GMX_STAKE_FALLBACK,\n }\n\n return buildGmxStakeMultisignBatch(\n args,\n [...prepSteps, stakeStep],\n { action: 'stake-gmx', amountHuman: args.amountHuman },\n 'GMX: stake GMX tokens via RewardRouter.',\n )\n}\n\nexport async function buildEvmMultisignBodyGmxUnstakeGmxBatch(args: GmxUnstakeGmxArgs) {\n const rewardRouter = gmxContractAddress(args.chainId, 'RewardRouter')\n const amountWei = parseGmxTokenAmount(args.amountHuman, args.gmxDecimals ?? 18)\n if (amountWei === 0n) throw new Error('GMX unstake amount is zero after converting with token decimals.')\n\n const unstakeStep: EvmTxStep = {\n to: rewardRouter,\n data: encodeFunctionData({\n abi: RewardRouterAbi,\n functionName: 'unstakeGmx',\n args: [amountWei],\n }),\n value: 0n,\n fallbackGas: GMX_STAKE_FALLBACK,\n }\n\n return buildGmxStakeMultisignBatch(\n args,\n [unstakeStep],\n { action: 'unstake-gmx', amountHuman: args.amountHuman },\n 'GMX: unstake GMX tokens via RewardRouter.',\n )\n}\n","import {\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n parseAbi,\n type Address,\n} from 'viem'\nimport { gmxFormatApyPercent, gmxLookupMarketApy } from './apy.js'\nimport { getGmxApiSdk } from './api.js'\nimport { gmxFetchGmMarketsSummary } from './markets.js'\n\nconst erc20BalanceAbi = parseAbi([\n 'function balanceOf(address account) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n])\n\nconst GM_DECIMALS_DEFAULT = 18\n\nfunction gmTokenListSymbol(marketSymbol: string): string {\n const bracket = marketSymbol.match(/^([^[\\]]+)/)?.[1]?.trim()\n const base = (bracket ?? marketSymbol).replace(/\\s+/g, '')\n const compact = base.length > 20 ? `${base.slice(0, 17)}…` : base\n return `GM:${compact}`\n}\n\nfunction gmTokenListName(marketSymbol: string): string {\n return `GMX GM ${marketSymbol.trim()}`\n}\n\nexport type GmxGmLiquidityPositionRow = {\n symbol: string\n marketTokenAddress: string\n longTokenSymbol: string | null\n shortTokenSymbol: string | null\n gmDecimals: number\n gmBalanceWei: string\n gmBalanceHuman: string\n apyPercentLabel: string | null\n tokenListSymbol: string\n tokenListName: string\n}\n\nexport async function gmxFetchGmLiquidityPositions(args: {\n chainId: number\n executorAddress: string\n rpcUrl: string\n includeZeroBalance?: boolean\n}): Promise<{ rows: GmxGmLiquidityPositionRow[] }> {\n const executor = getAddress(args.executorAddress)\n const rpcUrl = args.rpcUrl.trim()\n if (!rpcUrl) throw new Error('rpcUrl is required to read GM liquidity balances.')\n\n const sdk = getGmxApiSdk(args.chainId)\n const [markets, apyRes] = await Promise.all([\n gmxFetchGmMarketsSummary(args.chainId),\n sdk.fetchApy().catch(() => ({ markets: {} as Record<string, { apy?: number }> })),\n ])\n const apyByMarket = (apyRes as { markets?: Record<string, { apy?: number }> }).markets ?? {}\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Native', symbol: 'N' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const rows: GmxGmLiquidityPositionRow[] = []\n\n await Promise.all(\n markets.map(async (market) => {\n const token = getAddress(market.marketTokenAddress as Address)\n let balance = 0n\n let decimals = GM_DECIMALS_DEFAULT\n try {\n ;[balance, decimals] = await Promise.all([\n publicClient.readContract({\n address: token,\n abi: erc20BalanceAbi,\n functionName: 'balanceOf',\n args: [executor],\n }),\n publicClient.readContract({\n address: token,\n abi: erc20BalanceAbi,\n functionName: 'decimals',\n }).catch(() => GM_DECIMALS_DEFAULT),\n ])\n } catch {\n return\n }\n if (!args.includeZeroBalance && balance === 0n) return\n\n const apyEntry = gmxLookupMarketApy(apyByMarket, token)\n rows.push({\n symbol: market.symbol,\n marketTokenAddress: market.marketTokenAddress,\n longTokenSymbol: market.longTokenSymbol,\n shortTokenSymbol: market.shortTokenSymbol,\n gmDecimals: Number(decimals),\n gmBalanceWei: balance.toString(),\n gmBalanceHuman: formatUnits(balance, Number(decimals)),\n apyPercentLabel: gmxFormatApyPercent(apyEntry?.apy),\n tokenListSymbol: gmTokenListSymbol(market.symbol),\n tokenListName: gmTokenListName(market.symbol),\n })\n }),\n )\n\n rows.sort((a, b) => a.symbol.localeCompare(b.symbol, undefined, { sensitivity: 'base' }))\n return { rows }\n}\n","import { getGmxApiSdk } from './api.js'\nimport { formatGmxUsd30 } from './format.js'\nimport { resolveGmxTokenBySymbol } from './marketContext.js'\n\nexport type GmxOhlcvCandleRow = {\n timestampMs: number\n timeLabel: string\n open: string\n high: string\n low: string\n close: string\n}\n\nexport type GmxMarketPrices = {\n symbol: string\n indexLabel: string\n collateralSymbol: string\n indexMarkUsd: string | null\n collateralUsd: string | null\n indexPerCollateral: string | null\n fetchedAtMs: number\n}\n\nexport type GmxMarketSnapshot = GmxMarketPrices & {\n ohlcvTimeframe: GmxOhlcvTimeframe\n ohlcv: GmxOhlcvCandleRow[]\n}\n\nexport const GMX_OHLCV_TIMEFRAMES = ['1m', '5m', '15m', '1h', '4h', '1d', '1w', '1M'] as const\nexport type GmxOhlcvTimeframe = (typeof GMX_OHLCV_TIMEFRAMES)[number]\n\nconst DEFAULT_OHLCV_LIMIT = 16\n\nfunction indexLabelFromMarketSymbol(symbol: string): string {\n const m = symbol.trim().match(/^([^/]+)\\/USD/i)\n return m?.[1]?.trim() || symbol.trim()\n}\n\nfunction asBigint(v: unknown): bigint | undefined {\n if (v == null) return undefined\n try {\n return typeof v === 'bigint' ? v : BigInt(String(v))\n } catch {\n return undefined\n }\n}\n\nfunction formatIndexPerCollateral(indexMark: bigint, collateralUsd: bigint): string | null {\n if (indexMark <= 0n || collateralUsd <= 0n) return null\n const index = Number(indexMark) / 1e30\n const coll = Number(collateralUsd) / 1e30\n if (!Number.isFinite(index) || !Number.isFinite(coll) || coll <= 0) return null\n const ratio = index / coll\n return ratio.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 6 })\n}\n\nfunction formatCandleTime(timestampMs: number): string {\n try {\n return new Date(timestampMs).toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n } catch {\n return String(timestampMs)\n }\n}\n\nfunction mapOhlcvRows(\n raw: Array<{ timestamp: number; open: string; high: string; low: string; close: string }>,\n sort: 'asc' | 'desc',\n): GmxOhlcvCandleRow[] {\n const sorted = [...raw].sort((a, b) => (sort === 'asc' ? a.timestamp - b.timestamp : b.timestamp - a.timestamp))\n return sorted.map((c) => ({\n timestampMs: c.timestamp,\n timeLabel: formatCandleTime(c.timestamp),\n open: c.open,\n high: c.high,\n low: c.low,\n close: c.close,\n }))\n}\n\nexport function assertGmxOhlcvTimeframe(timeframe: string): GmxOhlcvTimeframe {\n const tf = timeframe.trim() as GmxOhlcvTimeframe\n if (!(GMX_OHLCV_TIMEFRAMES as readonly string[]).includes(tf)) {\n throw new Error(`Invalid timeframe: ${timeframe}. Valid: ${GMX_OHLCV_TIMEFRAMES.join(', ')}`)\n }\n return tf\n}\n\nexport async function gmxFetchMarketPrices(args: {\n chainId: number\n symbol: string\n collateralSymbol: string\n}): Promise<GmxMarketPrices> {\n const symbol = args.symbol.trim()\n const collateralSymbol = args.collateralSymbol.trim()\n if (!symbol) throw new Error('GMX market symbol is required.')\n if (!collateralSymbol) throw new Error('Collateral symbol is required.')\n\n const sdk = getGmxApiSdk(args.chainId)\n const [tickers, collateralToken] = await Promise.all([\n sdk.fetchMarketsTickers({ symbols: [symbol] }) as Promise<Array<Record<string, unknown>>>,\n resolveGmxTokenBySymbol(args.chainId, collateralSymbol),\n ])\n\n const ticker = tickers.find((t) => String(t.symbol ?? '') === symbol) ?? tickers[0]\n const mark = asBigint(ticker?.markPrice ?? ticker?.minPrice)\n const indexMarkUsd = formatGmxUsd30(mark)\n\n const collateralPrice = asBigint(\n (collateralToken?.prices as { minPrice?: unknown } | undefined)?.minPrice,\n )\n const collateralUsd = formatGmxUsd30(collateralPrice)\n const indexPerCollateral =\n mark != null && collateralPrice != null ? formatIndexPerCollateral(mark, collateralPrice) : null\n\n return {\n symbol,\n indexLabel: indexLabelFromMarketSymbol(symbol),\n collateralSymbol,\n indexMarkUsd,\n collateralUsd,\n indexPerCollateral,\n fetchedAtMs: Date.now(),\n }\n}\n\nexport async function gmxFetchOhlcv(args: {\n chainId: number\n symbol: string\n timeframe?: string\n limit?: number\n sort?: 'asc' | 'desc'\n}): Promise<{ symbol: string; timeframe: GmxOhlcvTimeframe; candles: GmxOhlcvCandleRow[] }> {\n const symbol = args.symbol.trim()\n if (!symbol) throw new Error('GMX market symbol is required.')\n const timeframe = assertGmxOhlcvTimeframe(args.timeframe ?? '15m')\n const limit = args.limit ?? DEFAULT_OHLCV_LIMIT\n const sort = args.sort ?? 'desc'\n\n const sdk = getGmxApiSdk(args.chainId)\n const ohlcvRaw = await sdk.fetchOhlcv({ symbol, timeframe, limit })\n\n return {\n symbol,\n timeframe,\n candles: mapOhlcvRows(ohlcvRaw, sort),\n }\n}\n\nexport async function gmxFetchMarketSnapshot(args: {\n chainId: number\n symbol: string\n collateralSymbol: string\n ohlcvTimeframe?: string\n}): Promise<GmxMarketSnapshot> {\n const ohlcvTimeframe = assertGmxOhlcvTimeframe(args.ohlcvTimeframe ?? '15m')\n const [prices, ohlcv] = await Promise.all([\n gmxFetchMarketPrices(args),\n gmxFetchOhlcv({ chainId: args.chainId, symbol: args.symbol, timeframe: ohlcvTimeframe, sort: 'desc' }),\n ])\n return {\n ...prices,\n ohlcvTimeframe: ohlcv.timeframe,\n ohlcv: ohlcv.candles,\n }\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isGmxChainSupported } from './support.js'\n\nexport * from './support.js'\nexport * from './api.js'\nexport * from './amounts.js'\nexport * from './apy.js'\nexport * from './markets.js'\nexport * from './reads.js'\nexport * from './multisign.js'\nexport * from './gmLiquidityMultisign.js'\nexport * from './gmxTokenStakingMultisign.js'\nexport * from './contracts.js'\nexport * from './executionFee.js'\nexport * from './gmLiquidityReads.js'\nexport * from './format.js'\nexport * from './estimates.js'\nexport * from './leverage.js'\nexport * from './positionDisplay.js'\nexport * from './prices.js'\nexport * from './native.js'\n\nexport const GMX_PROTOCOL_ID = 'gmx'\n\nexport const gmxProtocolModule: ProtocolModule = {\n id: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const chainId = typeof ctx.chainId === 'number' ? ctx.chainId : Number(ctx.chainId)\n return Number.isFinite(chainId) && isGmxChainSupported(chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'erc20'\n },\n actions: [\n {\n id: 'gmx.increase',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Open or add to a GMX perp position (classic on-chain order)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n symbol: { type: 'string', required: true, description: 'GMX market symbol e.g. ETH/USD [WETH-USDC]' },\n direction: { type: 'string', required: true, description: 'long or short' },\n orderType: { type: 'string', required: true, description: 'market or limit' },\n sizeUsdHuman: { type: 'string', required: true, description: 'Position size in USD' },\n collateralToken: { type: 'string', required: true, description: 'Collateral token symbol e.g. USDC' },\n collateralAmountHuman: { type: 'string', required: true, description: 'Collateral amount in token units' },\n },\n },\n {\n id: 'gmx.decrease',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Close or reduce a GMX perp position (classic on-chain order)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n symbol: { type: 'string', required: true, description: 'GMX market symbol' },\n direction: { type: 'string', required: true, description: 'long or short' },\n orderType: { type: 'string', required: true, description: 'market or limit' },\n sizeUsdHuman: { type: 'string', required: true, description: 'Size to close in USD' },\n collateralToken: { type: 'string', required: true, description: 'Position collateral token symbol' },\n },\n },\n {\n id: 'gmx.cancel',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Cancel a pending GMX order (classic on-chain)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n orderId: { type: 'string', required: true, description: 'Order key from fetchOrders' },\n },\n },\n {\n id: 'gmx.gmDeposit',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Deposit collateral into a GMX GM liquidity pool (ExchangeRouter multicall)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n marketSymbol: { type: 'string', required: true, description: 'GM market symbol e.g. ETH/USD [WETH-USDC]' },\n collateralToken: { type: 'string', required: true, description: 'Pool collateral token symbol' },\n collateralAmountHuman: { type: 'string', required: true, description: 'Amount in token units' },\n },\n },\n {\n id: 'gmx.gmWithdraw',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Withdraw GM market tokens from a GMX liquidity pool',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n marketSymbol: { type: 'string', required: true, description: 'GM market symbol' },\n gmAmountHuman: { type: 'string', required: true, description: 'GM token amount to withdraw' },\n },\n },\n {\n id: 'gmx.stakeGmx',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Stake GMX tokens via RewardRouter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n amountHuman: { type: 'string', required: true, description: 'GMX amount to stake' },\n },\n },\n {\n id: 'gmx.unstakeGmx',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Unstake GMX tokens via RewardRouter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n amountHuman: { type: 'string', required: true, description: 'GMX amount to unstake' },\n },\n },\n ],\n}\n\nregisterProtocolModule(gmxProtocolModule)\n"]}
|