@whetstone-research/doppler-sdk 0.0.1-alpha.8 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +726 -25
- package/dist/DopplerSDK.d.mts +45 -7
- package/dist/DopplerSDK.d.ts +45 -7
- package/dist/DopplerSDK.js +35 -12
- package/dist/DopplerSDK.mjs +34 -11
- package/dist/abis/bytecodes.d.mts +3 -2
- package/dist/abis/bytecodes.d.ts +3 -2
- package/dist/abis/bytecodes.js +9 -6
- package/dist/abis/bytecodes.mjs +1 -2
- package/dist/abis/index.d.mts +1507 -129
- package/dist/abis/index.d.ts +1507 -129
- package/dist/abis/index.js +43 -20
- package/dist/abis/index.mjs +2 -3
- package/dist/addresses.d.mts +16 -3
- package/dist/addresses.d.ts +16 -3
- package/dist/addresses.js +13 -5
- package/dist/addresses.mjs +2 -2
- package/dist/builders/DynamicAuctionBuilder.d.mts +119 -0
- package/dist/builders/DynamicAuctionBuilder.d.ts +119 -0
- package/dist/builders/DynamicAuctionBuilder.js +29 -0
- package/dist/builders/DynamicAuctionBuilder.js.map +1 -0
- package/dist/builders/DynamicAuctionBuilder.mjs +20 -0
- package/dist/builders/DynamicAuctionBuilder.mjs.map +1 -0
- package/dist/builders/MulticurveBuilder.d.mts +132 -0
- package/dist/builders/MulticurveBuilder.d.ts +132 -0
- package/dist/builders/MulticurveBuilder.js +29 -0
- package/dist/builders/MulticurveBuilder.js.map +1 -0
- package/dist/builders/MulticurveBuilder.mjs +20 -0
- package/dist/builders/MulticurveBuilder.mjs.map +1 -0
- package/dist/builders/StaticAuctionBuilder.d.mts +124 -0
- package/dist/builders/StaticAuctionBuilder.d.ts +124 -0
- package/dist/builders/StaticAuctionBuilder.js +29 -0
- package/dist/builders/StaticAuctionBuilder.js.map +1 -0
- package/dist/builders/StaticAuctionBuilder.mjs +20 -0
- package/dist/builders/StaticAuctionBuilder.mjs.map +1 -0
- package/dist/builders/index.d.mts +8 -0
- package/dist/builders/index.d.ts +8 -0
- package/dist/builders/index.js +56 -0
- package/dist/builders/index.js.map +1 -0
- package/dist/builders/index.mjs +23 -0
- package/dist/builders/index.mjs.map +1 -0
- package/dist/builders/shared.d.mts +116 -0
- package/dist/builders/shared.d.ts +116 -0
- package/dist/builders/shared.js +39 -0
- package/dist/builders/shared.js.map +1 -0
- package/dist/builders/shared.mjs +18 -0
- package/dist/builders/shared.mjs.map +1 -0
- package/dist/builders.d.mts +8 -131
- package/dist/builders.d.ts +8 -131
- package/dist/builders.js +44 -5
- package/dist/builders.mjs +22 -3
- package/dist/chunk-3PNCB4W5.js +4 -0
- package/dist/{chunk-KRN3ROUE.js.map → chunk-3PNCB4W5.js.map} +1 -1
- package/dist/chunk-3RK7LRAA.js +282 -0
- package/dist/chunk-3RK7LRAA.js.map +1 -0
- package/dist/chunk-4HM3ERBU.js +13 -0
- package/dist/chunk-4HM3ERBU.js.map +1 -0
- package/dist/{chunk-7W72MFJO.mjs → chunk-4TROGENW.mjs} +5 -4
- package/dist/chunk-4TROGENW.mjs.map +1 -0
- package/dist/chunk-5TL5V6UX.mjs +3 -0
- package/dist/{chunk-AZLFJNTG.mjs.map → chunk-5TL5V6UX.mjs.map} +1 -1
- package/dist/chunk-64AWG57M.mjs +192 -0
- package/dist/chunk-64AWG57M.mjs.map +1 -0
- package/dist/chunk-6KWCHTK3.js +166 -0
- package/dist/chunk-6KWCHTK3.js.map +1 -0
- package/dist/chunk-6OOWOPCX.js +1708 -0
- package/dist/chunk-6OOWOPCX.js.map +1 -0
- package/dist/chunk-7BBRPWQJ.js +257 -0
- package/dist/chunk-7BBRPWQJ.js.map +1 -0
- package/dist/{chunk-FVTIDXYK.mjs → chunk-AKSEBAR7.mjs} +29 -19
- package/dist/chunk-AKSEBAR7.mjs.map +1 -0
- package/dist/chunk-AS64GWBX.js +204 -0
- package/dist/chunk-AS64GWBX.js.map +1 -0
- package/dist/chunk-AULFBXM5.mjs +331 -0
- package/dist/chunk-AULFBXM5.mjs.map +1 -0
- package/dist/chunk-AW3WR2D3.mjs +238 -0
- package/dist/chunk-AW3WR2D3.mjs.map +1 -0
- package/dist/chunk-BIQQ53O2.js +45 -0
- package/dist/chunk-BIQQ53O2.js.map +1 -0
- package/dist/chunk-C6MPV3CY.js +260 -0
- package/dist/chunk-C6MPV3CY.js.map +1 -0
- package/dist/{chunk-AYPP5JEQ.mjs → chunk-CLEQO6GU.mjs} +5 -5
- package/dist/chunk-CLEQO6GU.mjs.map +1 -0
- package/dist/chunk-CVHPLURA.js +147 -0
- package/dist/chunk-CVHPLURA.js.map +1 -0
- package/dist/chunk-D2RBCFNW.mjs +130 -0
- package/dist/chunk-D2RBCFNW.mjs.map +1 -0
- package/dist/chunk-ECD4FV3A.mjs +11 -0
- package/dist/chunk-ECD4FV3A.mjs.map +1 -0
- package/dist/chunk-EDJBZPMW.mjs +255 -0
- package/dist/chunk-EDJBZPMW.mjs.map +1 -0
- package/dist/chunk-FPAI4QYW.mjs +145 -0
- package/dist/chunk-FPAI4QYW.mjs.map +1 -0
- package/dist/chunk-HM25ZMO3.js +18 -0
- package/dist/chunk-HM25ZMO3.js.map +1 -0
- package/dist/chunk-IHC6UYKK.js +4 -0
- package/dist/{chunk-DRBRT57F.js.map → chunk-IHC6UYKK.js.map} +1 -1
- package/dist/{chunk-DMAHXBA5.mjs → chunk-J5BFFL3X.mjs} +87 -47
- package/dist/chunk-J5BFFL3X.mjs.map +1 -0
- package/dist/chunk-JIKAD4YL.js +4 -0
- package/dist/{chunk-KEXKKQVW.js.map → chunk-JIKAD4YL.js.map} +1 -1
- package/dist/{chunk-EFAPDN4J.js → chunk-JWEXGALU.js} +730 -33
- package/dist/chunk-JWEXGALU.js.map +1 -0
- package/dist/{chunk-4K5GBNQV.mjs → chunk-KDT76YQE.mjs} +52 -13
- package/dist/chunk-KDT76YQE.mjs.map +1 -0
- package/dist/chunk-LMQLMMEX.js +317 -0
- package/dist/chunk-LMQLMMEX.js.map +1 -0
- package/dist/{chunk-TOMVBPNZ.js → chunk-LS4TK6SX.js} +9 -4
- package/dist/chunk-LS4TK6SX.js.map +1 -0
- package/dist/chunk-M4WMHD3X.mjs +40 -0
- package/dist/chunk-M4WMHD3X.mjs.map +1 -0
- package/dist/chunk-MCOK3UFR.mjs +280 -0
- package/dist/chunk-MCOK3UFR.mjs.map +1 -0
- package/dist/chunk-MGQSQCFG.js +176 -0
- package/dist/chunk-MGQSQCFG.js.map +1 -0
- package/dist/chunk-MKE3BUL3.mjs +3 -0
- package/dist/{chunk-CYDWEPFL.mjs.map → chunk-MKE3BUL3.mjs.map} +1 -1
- package/dist/chunk-MNJ5OYPE.mjs +17 -0
- package/dist/chunk-MNJ5OYPE.mjs.map +1 -0
- package/dist/chunk-MNXD45J7.mjs +164 -0
- package/dist/chunk-MNXD45J7.mjs.map +1 -0
- package/dist/chunk-NGDPQC5E.js +333 -0
- package/dist/chunk-NGDPQC5E.js.map +1 -0
- package/dist/chunk-NNNCVFOH.mjs +16 -0
- package/dist/chunk-NNNCVFOH.mjs.map +1 -0
- package/dist/chunk-NZ4BJ2IC.mjs +315 -0
- package/dist/chunk-NZ4BJ2IC.mjs.map +1 -0
- package/dist/chunk-OKNM7ODQ.js +29 -0
- package/dist/chunk-OKNM7ODQ.js.map +1 -0
- package/dist/{chunk-DCFHANLR.mjs → chunk-OTG75GVH.mjs} +725 -34
- package/dist/chunk-OTG75GVH.mjs.map +1 -0
- package/dist/chunk-OZ6DGBRL.mjs +25 -0
- package/dist/chunk-OZ6DGBRL.mjs.map +1 -0
- package/dist/chunk-P25HBGP5.mjs +3 -0
- package/dist/chunk-P25HBGP5.mjs.map +1 -0
- package/dist/{chunk-XG7K4R56.js → chunk-P7KLEPVI.js} +52 -12
- package/dist/chunk-P7KLEPVI.js.map +1 -0
- package/dist/{chunk-OPKQMN46.mjs → chunk-PAPXGPJB.mjs} +9 -4
- package/dist/chunk-PAPXGPJB.mjs.map +1 -0
- package/dist/chunk-PCNXJAU5.js +19 -0
- package/dist/chunk-PCNXJAU5.js.map +1 -0
- package/dist/{chunk-5IT5OXQ5.js → chunk-PD6HWEMG.js} +40 -30
- package/dist/chunk-PD6HWEMG.js.map +1 -0
- package/dist/{chunk-ER42VG7H.js → chunk-PH2KXREH.js} +20 -3
- package/dist/chunk-PH2KXREH.js.map +1 -0
- package/dist/chunk-Q5ERW5ZW.mjs +107 -0
- package/dist/chunk-Q5ERW5ZW.mjs.map +1 -0
- package/dist/chunk-Q7YNBSVH.js +28 -0
- package/dist/chunk-Q7YNBSVH.js.map +1 -0
- package/dist/{chunk-T644D54P.mjs → chunk-QKO2FZGN.mjs} +16 -4
- package/dist/chunk-QKO2FZGN.mjs.map +1 -0
- package/dist/{chunk-CIRZKWLL.js → chunk-RVFSRYI5.js} +5 -3
- package/dist/chunk-RVFSRYI5.js.map +1 -0
- package/dist/{chunk-KPBCG4X2.js → chunk-RW37KJ77.js} +11 -11
- package/dist/chunk-RW37KJ77.js.map +1 -0
- package/dist/chunk-SD7BHT2F.mjs +3 -0
- package/dist/chunk-SD7BHT2F.mjs.map +1 -0
- package/dist/chunk-SP5M57BG.mjs +258 -0
- package/dist/chunk-SP5M57BG.mjs.map +1 -0
- package/dist/chunk-TKSHYEYA.mjs +1706 -0
- package/dist/chunk-TKSHYEYA.mjs.map +1 -0
- package/dist/chunk-WTS75RUC.js +4 -0
- package/dist/chunk-WTS75RUC.js.map +1 -0
- package/dist/{chunk-ZRDU6CIB.js → chunk-XRPIGMA2.js} +108 -68
- package/dist/chunk-XRPIGMA2.js.map +1 -0
- package/dist/chunk-XTKSM4QE.js +132 -0
- package/dist/chunk-XTKSM4QE.js.map +1 -0
- package/dist/chunk-XUE3CIJ5.mjs +174 -0
- package/dist/chunk-XUE3CIJ5.mjs.map +1 -0
- package/dist/chunk-YYUOLM6U.js +244 -0
- package/dist/chunk-YYUOLM6U.js.map +1 -0
- package/dist/chunk-ZH44DHVR.mjs +26 -0
- package/dist/chunk-ZH44DHVR.mjs.map +1 -0
- package/dist/chunk-ZPHOOG72.js +112 -0
- package/dist/chunk-ZPHOOG72.js.map +1 -0
- package/dist/constants.d.mts +7 -2
- package/dist/constants.d.ts +7 -2
- package/dist/constants.js +57 -38
- package/dist/constants.mjs +1 -2
- package/dist/deployments.generated.d.mts +2 -0
- package/dist/deployments.generated.d.ts +2 -0
- package/dist/deployments.generated.js +12 -0
- package/dist/deployments.generated.js.map +1 -0
- package/dist/deployments.generated.mjs +3 -0
- package/dist/deployments.generated.mjs.map +1 -0
- package/dist/entities/DopplerFactory.d.mts +139 -11
- package/dist/entities/DopplerFactory.d.ts +139 -11
- package/dist/entities/DopplerFactory.js +17 -7
- package/dist/entities/DopplerFactory.mjs +16 -6
- package/dist/entities/auction/DynamicAuction.d.mts +19 -4
- package/dist/entities/auction/DynamicAuction.d.ts +19 -4
- package/dist/entities/auction/DynamicAuction.js +6 -6
- package/dist/entities/auction/DynamicAuction.mjs +5 -5
- package/dist/entities/auction/MulticurvePool.d.mts +55 -0
- package/dist/entities/auction/MulticurvePool.d.ts +55 -0
- package/dist/entities/auction/MulticurvePool.js +18 -0
- package/dist/entities/auction/MulticurvePool.js.map +1 -0
- package/dist/entities/auction/MulticurvePool.mjs +9 -0
- package/dist/entities/auction/MulticurvePool.mjs.map +1 -0
- package/dist/entities/auction/StaticAuction.d.mts +6 -3
- package/dist/entities/auction/StaticAuction.d.ts +6 -3
- package/dist/entities/auction/StaticAuction.js +6 -6
- package/dist/entities/auction/StaticAuction.mjs +5 -5
- package/dist/entities/auction/index.d.mts +3 -0
- package/dist/entities/auction/index.d.ts +3 -0
- package/dist/entities/auction/index.js +16 -9
- package/dist/entities/auction/index.mjs +10 -7
- package/dist/entities/quoter/Quoter.d.mts +44 -2
- package/dist/entities/quoter/Quoter.d.ts +44 -2
- package/dist/entities/quoter/Quoter.js +6 -6
- package/dist/entities/quoter/Quoter.mjs +5 -5
- package/dist/entities/quoter/index.d.mts +3 -0
- package/dist/entities/quoter/index.d.ts +3 -0
- package/dist/entities/quoter/index.js +6 -6
- package/dist/entities/quoter/index.mjs +5 -5
- package/dist/entities/token/derc20/Derc20.d.mts +33 -7
- package/dist/entities/token/derc20/Derc20.d.ts +33 -7
- package/dist/entities/token/derc20/Derc20.js +4 -5
- package/dist/entities/token/derc20/Derc20.mjs +3 -4
- package/dist/entities/token/derc20/index.d.mts +3 -0
- package/dist/entities/token/derc20/index.d.ts +3 -0
- package/dist/entities/token/derc20/index.js +4 -5
- package/dist/entities/token/derc20/index.mjs +3 -4
- package/dist/entities/token/eth/Eth.d.mts +7 -3
- package/dist/entities/token/eth/Eth.d.ts +7 -3
- package/dist/entities/token/eth/Eth.js +2 -3
- package/dist/entities/token/eth/Eth.mjs +1 -2
- package/dist/entities/token/eth/index.d.mts +3 -0
- package/dist/entities/token/eth/index.d.ts +3 -0
- package/dist/entities/token/eth/index.js +2 -3
- package/dist/entities/token/eth/index.mjs +1 -2
- package/dist/entities/token/index.d.mts +3 -0
- package/dist/entities/token/index.d.ts +3 -0
- package/dist/entities/token/index.js +6 -7
- package/dist/entities/token/index.mjs +4 -5
- package/dist/index.d.mts +18 -6
- package/dist/index.d.ts +18 -6
- package/dist/index.js +305 -140
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +32 -19
- package/dist/index.mjs.map +1 -1
- package/dist/types.d.mts +260 -22
- package/dist/types.d.ts +260 -22
- package/dist/types.js +12 -3
- package/dist/types.mjs +3 -2
- package/dist/utils/airlock.d.mts +11 -0
- package/dist/utils/airlock.d.ts +11 -0
- package/dist/utils/airlock.js +26 -0
- package/dist/utils/airlock.js.map +1 -0
- package/dist/utils/airlock.mjs +5 -0
- package/dist/utils/airlock.mjs.map +1 -0
- package/dist/utils/balanceDelta.d.mts +10 -0
- package/dist/utils/balanceDelta.d.ts +10 -0
- package/dist/utils/balanceDelta.js +12 -0
- package/dist/utils/balanceDelta.js.map +1 -0
- package/dist/utils/balanceDelta.mjs +3 -0
- package/dist/utils/balanceDelta.mjs.map +1 -0
- package/dist/utils/computeOptimalGamma.d.mts +7 -0
- package/dist/utils/computeOptimalGamma.d.ts +7 -0
- package/dist/utils/computeOptimalGamma.js +12 -0
- package/dist/utils/computeOptimalGamma.js.map +1 -0
- package/dist/utils/computeOptimalGamma.mjs +3 -0
- package/dist/utils/computeOptimalGamma.mjs.map +1 -0
- package/dist/utils/index.d.mts +11 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/index.js +114 -24
- package/dist/utils/index.mjs +14 -4
- package/dist/utils/isToken0Expected.d.mts +13 -0
- package/dist/utils/isToken0Expected.d.ts +13 -0
- package/dist/utils/isToken0Expected.js +12 -0
- package/dist/utils/isToken0Expected.js.map +1 -0
- package/dist/utils/isToken0Expected.mjs +3 -0
- package/dist/utils/isToken0Expected.mjs.map +1 -0
- package/dist/utils/marketCapHelpers.d.mts +309 -0
- package/dist/utils/marketCapHelpers.d.ts +309 -0
- package/dist/utils/marketCapHelpers.js +54 -0
- package/dist/utils/marketCapHelpers.js.map +1 -0
- package/dist/utils/marketCapHelpers.mjs +5 -0
- package/dist/utils/marketCapHelpers.mjs.map +1 -0
- package/dist/utils/poolKey.d.mts +17 -0
- package/dist/utils/poolKey.d.ts +17 -0
- package/dist/utils/poolKey.js +12 -0
- package/dist/utils/poolKey.js.map +1 -0
- package/dist/utils/poolKey.mjs +3 -0
- package/dist/utils/poolKey.mjs.map +1 -0
- package/dist/utils/priceHelpers.d.mts +3 -3
- package/dist/utils/priceHelpers.d.ts +3 -3
- package/dist/utils/priceHelpers.js +10 -11
- package/dist/utils/priceHelpers.mjs +2 -3
- package/dist/utils/tickMath.d.mts +8 -1
- package/dist/utils/tickMath.d.ts +8 -1
- package/dist/utils/tickMath.js +17 -14
- package/dist/utils/tickMath.mjs +1 -2
- package/dist/utils/tokenAddressMiner.d.mts +30 -0
- package/dist/utils/tokenAddressMiner.d.ts +30 -0
- package/dist/utils/tokenAddressMiner.js +14 -0
- package/dist/utils/tokenAddressMiner.js.map +1 -0
- package/dist/utils/tokenAddressMiner.mjs +5 -0
- package/dist/utils/tokenAddressMiner.mjs.map +1 -0
- package/package.json +14 -11
- package/dist/__tests__/mocks/addresses.d.mts +0 -46
- package/dist/__tests__/mocks/addresses.d.ts +0 -46
- package/dist/__tests__/mocks/addresses.js +0 -53
- package/dist/__tests__/mocks/addresses.js.map +0 -1
- package/dist/__tests__/mocks/addresses.mjs +0 -44
- package/dist/__tests__/mocks/addresses.mjs.map +0 -1
- package/dist/__tests__/mocks/clients.d.mts +0 -22
- package/dist/__tests__/mocks/clients.d.ts +0 -22
- package/dist/__tests__/mocks/clients.js +0 -17036
- package/dist/__tests__/mocks/clients.js.map +0 -1
- package/dist/__tests__/mocks/clients.mjs +0 -17032
- package/dist/__tests__/mocks/clients.mjs.map +0 -1
- package/dist/chunk-2N5JZSZ4.js +0 -14
- package/dist/chunk-2N5JZSZ4.js.map +0 -1
- package/dist/chunk-3OZRDL3O.js +0 -162
- package/dist/chunk-3OZRDL3O.js.map +0 -1
- package/dist/chunk-4K5GBNQV.mjs.map +0 -1
- package/dist/chunk-5IT5OXQ5.js.map +0 -1
- package/dist/chunk-7F5IXZLH.js +0 -308
- package/dist/chunk-7F5IXZLH.js.map +0 -1
- package/dist/chunk-7VP5VR7J.js +0 -82
- package/dist/chunk-7VP5VR7J.js.map +0 -1
- package/dist/chunk-7W72MFJO.mjs.map +0 -1
- package/dist/chunk-AYPP5JEQ.mjs.map +0 -1
- package/dist/chunk-AZLFJNTG.mjs +0 -3
- package/dist/chunk-CIRZKWLL.js.map +0 -1
- package/dist/chunk-CYDWEPFL.mjs +0 -3
- package/dist/chunk-DCFHANLR.mjs.map +0 -1
- package/dist/chunk-DMAHXBA5.mjs.map +0 -1
- package/dist/chunk-DRBRT57F.js +0 -4
- package/dist/chunk-EFAPDN4J.js.map +0 -1
- package/dist/chunk-ER42VG7H.js.map +0 -1
- package/dist/chunk-FVTIDXYK.mjs.map +0 -1
- package/dist/chunk-IHBIBFZK.mjs +0 -12
- package/dist/chunk-IHBIBFZK.mjs.map +0 -1
- package/dist/chunk-IXSKPEHB.mjs +0 -160
- package/dist/chunk-IXSKPEHB.mjs.map +0 -1
- package/dist/chunk-KEXKKQVW.js +0 -42
- package/dist/chunk-KFD6U3LQ.mjs +0 -305
- package/dist/chunk-KFD6U3LQ.mjs.map +0 -1
- package/dist/chunk-KPBCG4X2.js.map +0 -1
- package/dist/chunk-KRN3ROUE.js +0 -4
- package/dist/chunk-KT7U37XS.mjs +0 -207
- package/dist/chunk-KT7U37XS.mjs.map +0 -1
- package/dist/chunk-LOROXNH3.mjs +0 -37
- package/dist/chunk-LOROXNH3.mjs.map +0 -1
- package/dist/chunk-O6GYIJ6X.mjs +0 -80
- package/dist/chunk-O6GYIJ6X.mjs.map +0 -1
- package/dist/chunk-OPKQMN46.mjs.map +0 -1
- package/dist/chunk-RIMM47JL.mjs +0 -176
- package/dist/chunk-RIMM47JL.mjs.map +0 -1
- package/dist/chunk-SUOMK3CU.js +0 -872
- package/dist/chunk-SUOMK3CU.js.map +0 -1
- package/dist/chunk-T644D54P.mjs.map +0 -1
- package/dist/chunk-TOMVBPNZ.js.map +0 -1
- package/dist/chunk-XEMZQHTX.mjs +0 -870
- package/dist/chunk-XEMZQHTX.mjs.map +0 -1
- package/dist/chunk-XG7K4R56.js.map +0 -1
- package/dist/chunk-XQ2VMR26.js +0 -180
- package/dist/chunk-XQ2VMR26.js.map +0 -1
- package/dist/chunk-ZAIP54LX.js +0 -209
- package/dist/chunk-ZAIP54LX.js.map +0 -1
- package/dist/chunk-ZRDU6CIB.js.map +0 -1
- package/dist/magic-string.es-CBLXTCZP.js +0 -1304
- package/dist/magic-string.es-CBLXTCZP.js.map +0 -1
- package/dist/magic-string.es-QHA47FSB.mjs +0 -1298
- package/dist/magic-string.es-QHA47FSB.mjs.map +0 -1
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { computePoolId } from './chunk-ZH44DHVR.mjs';
|
|
2
|
+
import { v4MulticurveInitializerAbi, v4MulticurveMigratorAbi, streamableFeesLockerAbi } from './chunk-OTG75GVH.mjs';
|
|
3
|
+
import { getAddresses } from './chunk-AW3WR2D3.mjs';
|
|
4
|
+
|
|
5
|
+
// src/entities/auction/MulticurvePool.ts
|
|
6
|
+
var MulticurvePool = class {
|
|
7
|
+
get rpc() {
|
|
8
|
+
return this.client;
|
|
9
|
+
}
|
|
10
|
+
constructor(client, walletClient, poolAddress) {
|
|
11
|
+
this.client = client;
|
|
12
|
+
this.walletClient = walletClient;
|
|
13
|
+
this.poolAddress = poolAddress;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get the pool address
|
|
17
|
+
*/
|
|
18
|
+
getAddress() {
|
|
19
|
+
return this.poolAddress;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get current pool state from the multicurve initializer
|
|
23
|
+
*/
|
|
24
|
+
async getState() {
|
|
25
|
+
const chainId = await this.rpc.getChainId();
|
|
26
|
+
const addresses = getAddresses(chainId);
|
|
27
|
+
const initializerAddress = addresses.v4ScheduledMulticurveInitializer ?? addresses.v4MulticurveInitializer;
|
|
28
|
+
if (!initializerAddress) {
|
|
29
|
+
throw new Error("V4 multicurve initializer or scheduled multicurve initializer address not configured for this chain");
|
|
30
|
+
}
|
|
31
|
+
const stateData = await this.rpc.readContract({
|
|
32
|
+
address: initializerAddress,
|
|
33
|
+
abi: v4MulticurveInitializerAbi,
|
|
34
|
+
functionName: "getState",
|
|
35
|
+
args: [this.poolAddress]
|
|
36
|
+
});
|
|
37
|
+
const [numeraire, status, rawPoolKey, farTick] = stateData;
|
|
38
|
+
const poolKey = this.parsePoolKey(rawPoolKey);
|
|
39
|
+
return {
|
|
40
|
+
asset: this.poolAddress,
|
|
41
|
+
numeraire,
|
|
42
|
+
fee: poolKey.fee,
|
|
43
|
+
tickSpacing: poolKey.tickSpacing,
|
|
44
|
+
status,
|
|
45
|
+
poolKey,
|
|
46
|
+
farTick: Number(farTick)
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Collect fees from the pool and distribute to beneficiaries
|
|
51
|
+
*
|
|
52
|
+
* This function can be called by any beneficiary to trigger fee collection
|
|
53
|
+
* and distribution. Fees are automatically distributed according to the
|
|
54
|
+
* configured beneficiary shares.
|
|
55
|
+
*
|
|
56
|
+
* @returns Object containing the amounts of fees0 and fees1 distributed, and the transaction hash
|
|
57
|
+
*/
|
|
58
|
+
async collectFees() {
|
|
59
|
+
if (!this.walletClient) {
|
|
60
|
+
throw new Error("Wallet client required to collect fees");
|
|
61
|
+
}
|
|
62
|
+
const chainId = await this.rpc.getChainId();
|
|
63
|
+
const addresses = getAddresses(chainId);
|
|
64
|
+
if (!addresses.v4MulticurveInitializer && !addresses.v4ScheduledMulticurveInitializer) {
|
|
65
|
+
throw new Error("V4 multicurve initializer and scheduled multicurve initializer address not configured for this chain");
|
|
66
|
+
}
|
|
67
|
+
const state = await this.getState();
|
|
68
|
+
const initializerAddress = addresses.v4ScheduledMulticurveInitializer ?? addresses.v4MulticurveInitializer;
|
|
69
|
+
if (!initializerAddress) {
|
|
70
|
+
throw new Error("V4 multicurve initializer or scheduled multicurve initializer address not configured for this chain");
|
|
71
|
+
}
|
|
72
|
+
if (state.status === 2 /* Locked */) {
|
|
73
|
+
const poolId = computePoolId(state.poolKey);
|
|
74
|
+
return this.collectFeesFromContract(initializerAddress, v4MulticurveInitializerAbi, poolId);
|
|
75
|
+
}
|
|
76
|
+
if (state.status === 3 /* Exited */) {
|
|
77
|
+
if (!addresses.v4Migrator) {
|
|
78
|
+
throw new Error("V4 multicurve migrator address not configured for this chain");
|
|
79
|
+
}
|
|
80
|
+
const assetData = await this.rpc.readContract({
|
|
81
|
+
address: addresses.v4Migrator,
|
|
82
|
+
abi: v4MulticurveMigratorAbi,
|
|
83
|
+
functionName: "getAssetData",
|
|
84
|
+
args: [state.poolKey.currency0, state.poolKey.currency1]
|
|
85
|
+
});
|
|
86
|
+
const migratorPoolKey = this.parsePoolKey(assetData.poolKey ?? assetData[1]);
|
|
87
|
+
const poolId = computePoolId(migratorPoolKey);
|
|
88
|
+
const beneficiaries = assetData.beneficiaries ?? assetData[4] ?? [];
|
|
89
|
+
if (!Array.isArray(beneficiaries) || beneficiaries.length === 0) {
|
|
90
|
+
throw new Error("Migrated multicurve pool has no beneficiaries configured");
|
|
91
|
+
}
|
|
92
|
+
const lockerAddress = await this.resolveLockerAddress(addresses.v4Migrator, addresses.streamableFeesLocker);
|
|
93
|
+
const streamData = await this.rpc.readContract({
|
|
94
|
+
address: lockerAddress,
|
|
95
|
+
abi: streamableFeesLockerAbi,
|
|
96
|
+
functionName: "streams",
|
|
97
|
+
args: [poolId]
|
|
98
|
+
});
|
|
99
|
+
const startDate = Number(streamData.startDate ?? streamData[2] ?? 0);
|
|
100
|
+
if (startDate === 0) {
|
|
101
|
+
throw new Error("Migrated multicurve stream not initialized");
|
|
102
|
+
}
|
|
103
|
+
return this.collectFeesFromContract(lockerAddress, streamableFeesLockerAbi, poolId);
|
|
104
|
+
}
|
|
105
|
+
throw new Error("Multicurve pool is not locked or migrated");
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get the token address for this pool
|
|
109
|
+
*/
|
|
110
|
+
async getTokenAddress() {
|
|
111
|
+
const state = await this.getState();
|
|
112
|
+
return state.asset;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get the numeraire address for this pool
|
|
116
|
+
*/
|
|
117
|
+
async getNumeraireAddress() {
|
|
118
|
+
const state = await this.getState();
|
|
119
|
+
return state.numeraire;
|
|
120
|
+
}
|
|
121
|
+
parsePoolKey(rawPoolKey) {
|
|
122
|
+
const poolKeyStruct = rawPoolKey;
|
|
123
|
+
return {
|
|
124
|
+
currency0: poolKeyStruct.currency0 ?? poolKeyStruct[0],
|
|
125
|
+
currency1: poolKeyStruct.currency1 ?? poolKeyStruct[1],
|
|
126
|
+
fee: Number(poolKeyStruct.fee ?? poolKeyStruct[2]),
|
|
127
|
+
tickSpacing: Number(poolKeyStruct.tickSpacing ?? poolKeyStruct[3]),
|
|
128
|
+
hooks: poolKeyStruct.hooks ?? poolKeyStruct[4]
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async resolveLockerAddress(migratorAddress, configuredLocker) {
|
|
132
|
+
if (configuredLocker) {
|
|
133
|
+
return configuredLocker;
|
|
134
|
+
}
|
|
135
|
+
const lockerAddress = await this.rpc.readContract({
|
|
136
|
+
address: migratorAddress,
|
|
137
|
+
abi: v4MulticurveMigratorAbi,
|
|
138
|
+
functionName: "locker",
|
|
139
|
+
args: []
|
|
140
|
+
});
|
|
141
|
+
return lockerAddress;
|
|
142
|
+
}
|
|
143
|
+
async collectFeesFromContract(contractAddress, abi, poolId) {
|
|
144
|
+
const { request, result } = await this.rpc.simulateContract({
|
|
145
|
+
address: contractAddress,
|
|
146
|
+
abi,
|
|
147
|
+
functionName: "collectFees",
|
|
148
|
+
args: [poolId],
|
|
149
|
+
account: this.walletClient.account
|
|
150
|
+
});
|
|
151
|
+
const hash = await this.walletClient.writeContract(request);
|
|
152
|
+
await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });
|
|
153
|
+
const [fees0, fees1] = result;
|
|
154
|
+
return {
|
|
155
|
+
fees0,
|
|
156
|
+
fees1,
|
|
157
|
+
transactionHash: hash
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
export { MulticurvePool };
|
|
163
|
+
//# sourceMappingURL=chunk-MNXD45J7.mjs.map
|
|
164
|
+
//# sourceMappingURL=chunk-MNXD45J7.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/entities/auction/MulticurvePool.ts"],"names":[],"mappings":"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","file":"chunk-MNXD45J7.mjs","sourcesContent":["import { type Address, type PublicClient, type WalletClient, type Hash, type Hex } from 'viem'\nimport { LockablePoolStatus, type MulticurvePoolState, type SupportedPublicClient, type V4PoolKey } from '../../types'\nimport { v4MulticurveInitializerAbi, v4MulticurveMigratorAbi, streamableFeesLockerAbi } from '../../abis'\nimport { getAddresses } from '../../addresses'\nimport type { SupportedChainId } from '../../addresses'\nimport { computePoolId } from '../../utils/poolKey'\n\n/**\n * MulticurvePool class for interacting with V4 multicurve pools\n *\n * Multicurve pools use the V4 multicurve initializer which supports:\n * - Multiple bonding curves with different price ranges\n * - Fee collection for configured beneficiaries\n * - No-migration lockable liquidity\n */\nexport class MulticurvePool {\n private client: SupportedPublicClient\n private walletClient?: WalletClient\n private poolAddress: Address\n private get rpc(): PublicClient {\n return this.client as PublicClient\n }\n\n constructor(client: SupportedPublicClient, walletClient: WalletClient | undefined, poolAddress: Address) {\n this.client = client\n this.walletClient = walletClient\n this.poolAddress = poolAddress\n }\n\n /**\n * Get the pool address\n */\n getAddress(): Address {\n return this.poolAddress\n }\n\n /**\n * Get current pool state from the multicurve initializer\n */\n async getState(): Promise<MulticurvePoolState> {\n const chainId = await this.rpc.getChainId()\n const addresses = getAddresses(chainId as SupportedChainId)\n\n const initializerAddress = addresses.v4ScheduledMulticurveInitializer ?? addresses.v4MulticurveInitializer\n\n if (!initializerAddress) {\n throw new Error('V4 multicurve initializer or scheduled multicurve initializer address not configured for this chain')\n }\n\n const stateData = await this.rpc.readContract({\n address: initializerAddress,\n abi: v4MulticurveInitializerAbi,\n functionName: 'getState',\n args: [this.poolAddress],\n })\n\n // Parse the returned tuple into a strongly typed PoolKey\n const [numeraire, status, rawPoolKey, farTick] = stateData as readonly [\n Address,\n number,\n {\n currency0: Address\n currency1: Address\n fee: number\n tickSpacing: number\n hooks: Address\n } & readonly [Address, Address, number, number, Address],\n number\n ]\n\n const poolKey = this.parsePoolKey(rawPoolKey)\n\n return {\n asset: this.poolAddress,\n numeraire,\n fee: poolKey.fee,\n tickSpacing: poolKey.tickSpacing,\n status,\n poolKey,\n farTick: Number(farTick),\n }\n }\n\n /**\n * Collect fees from the pool and distribute to beneficiaries\n *\n * This function can be called by any beneficiary to trigger fee collection\n * and distribution. Fees are automatically distributed according to the\n * configured beneficiary shares.\n *\n * @returns Object containing the amounts of fees0 and fees1 distributed, and the transaction hash\n */\n async collectFees(): Promise<{ fees0: bigint; fees1: bigint; transactionHash: Hash }> {\n if (!this.walletClient) {\n throw new Error('Wallet client required to collect fees')\n }\n\n const chainId = await this.rpc.getChainId()\n const addresses = getAddresses(chainId as SupportedChainId)\n\n if (!addresses.v4MulticurveInitializer && !addresses.v4ScheduledMulticurveInitializer) {\n throw new Error('V4 multicurve initializer and scheduled multicurve initializer address not configured for this chain')\n }\n\n // Get pool state to retrieve pool parameters\n const state = await this.getState()\n\n const initializerAddress = addresses.v4ScheduledMulticurveInitializer ?? addresses.v4MulticurveInitializer\n\n if (!initializerAddress) {\n throw new Error('V4 multicurve initializer or scheduled multicurve initializer address not configured for this chain')\n }\n\n if (state.status === LockablePoolStatus.Locked) {\n const poolId = computePoolId(state.poolKey)\n return this.collectFeesFromContract(initializerAddress, v4MulticurveInitializerAbi, poolId)\n }\n\n if (state.status === LockablePoolStatus.Exited) {\n if (!addresses.v4Migrator) {\n throw new Error('V4 multicurve migrator address not configured for this chain')\n }\n\n const assetData = await this.rpc.readContract({\n address: addresses.v4Migrator,\n abi: v4MulticurveMigratorAbi,\n functionName: 'getAssetData',\n args: [state.poolKey.currency0, state.poolKey.currency1],\n })\n\n const migratorPoolKey = this.parsePoolKey((assetData as any).poolKey ?? (assetData as any)[1])\n const poolId = computePoolId(migratorPoolKey)\n\n const beneficiaries =\n (assetData as any).beneficiaries ?? (assetData as any)[4] ?? []\n if (!Array.isArray(beneficiaries) || beneficiaries.length === 0) {\n throw new Error('Migrated multicurve pool has no beneficiaries configured')\n }\n\n const lockerAddress = await this.resolveLockerAddress(addresses.v4Migrator, addresses.streamableFeesLocker)\n\n const streamData = await this.rpc.readContract({\n address: lockerAddress,\n abi: streamableFeesLockerAbi,\n functionName: 'streams',\n args: [poolId],\n })\n\n const startDate = Number((streamData as any).startDate ?? (streamData as any)[2] ?? 0)\n if (startDate === 0) {\n throw new Error('Migrated multicurve stream not initialized')\n }\n\n return this.collectFeesFromContract(lockerAddress, streamableFeesLockerAbi, poolId)\n }\n\n throw new Error('Multicurve pool is not locked or migrated')\n }\n\n /**\n * Get the token address for this pool\n */\n async getTokenAddress(): Promise<Address> {\n const state = await this.getState()\n return state.asset\n }\n\n /**\n * Get the numeraire address for this pool\n */\n async getNumeraireAddress(): Promise<Address> {\n const state = await this.getState()\n return state.numeraire\n }\n\n private parsePoolKey(rawPoolKey: unknown): V4PoolKey {\n const poolKeyStruct = rawPoolKey as any\n return {\n currency0: (poolKeyStruct.currency0 ?? poolKeyStruct[0]) as Address,\n currency1: (poolKeyStruct.currency1 ?? poolKeyStruct[1]) as Address,\n fee: Number(poolKeyStruct.fee ?? poolKeyStruct[2]),\n tickSpacing: Number(poolKeyStruct.tickSpacing ?? poolKeyStruct[3]),\n hooks: (poolKeyStruct.hooks ?? poolKeyStruct[4]) as Address,\n }\n }\n\n private async resolveLockerAddress(migratorAddress: Address, configuredLocker?: Address): Promise<Address> {\n if (configuredLocker) {\n return configuredLocker\n }\n\n const lockerAddress = await this.rpc.readContract({\n address: migratorAddress,\n abi: v4MulticurveMigratorAbi,\n functionName: 'locker',\n args: [],\n })\n\n return lockerAddress as Address\n }\n\n private async collectFeesFromContract(\n contractAddress: Address,\n abi: typeof v4MulticurveInitializerAbi | typeof streamableFeesLockerAbi,\n poolId: Hex\n ): Promise<{ fees0: bigint; fees1: bigint; transactionHash: Hash }> {\n const { request, result } = await this.rpc.simulateContract({\n address: contractAddress,\n abi,\n functionName: 'collectFees',\n args: [poolId],\n account: this.walletClient!.account,\n })\n\n const hash = await this.walletClient!.writeContract(request)\n\n await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 })\n\n const [fees0, fees1] = result as readonly [bigint, bigint]\n\n return {\n fees0,\n fees1,\n transactionHash: hash,\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkZPHOOG72_js = require('./chunk-ZPHOOG72.js');
|
|
4
|
+
var chunkAS64GWBX_js = require('./chunk-AS64GWBX.js');
|
|
5
|
+
var chunkPH2KXREH_js = require('./chunk-PH2KXREH.js');
|
|
6
|
+
var chunkOKNM7ODQ_js = require('./chunk-OKNM7ODQ.js');
|
|
7
|
+
|
|
8
|
+
// src/builders/MulticurveBuilder.ts
|
|
9
|
+
var MulticurveBuilder = class _MulticurveBuilder {
|
|
10
|
+
constructor(chainId) {
|
|
11
|
+
this.chainId = chainId;
|
|
12
|
+
}
|
|
13
|
+
static forChain(chainId) {
|
|
14
|
+
return new _MulticurveBuilder(chainId);
|
|
15
|
+
}
|
|
16
|
+
tokenConfig(params) {
|
|
17
|
+
if (params && "type" in params && params.type === "doppler404") {
|
|
18
|
+
this.token = {
|
|
19
|
+
type: "doppler404",
|
|
20
|
+
name: params.name,
|
|
21
|
+
symbol: params.symbol,
|
|
22
|
+
baseURI: params.baseURI,
|
|
23
|
+
unit: params.unit
|
|
24
|
+
};
|
|
25
|
+
} else {
|
|
26
|
+
this.token = {
|
|
27
|
+
type: "standard",
|
|
28
|
+
name: params.name,
|
|
29
|
+
symbol: params.symbol,
|
|
30
|
+
tokenURI: params.tokenURI,
|
|
31
|
+
yearlyMintRate: params.yearlyMintRate ?? chunkPH2KXREH_js.DEFAULT_V3_YEARLY_MINT_RATE
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
saleConfig(params) {
|
|
37
|
+
this.sale = { initialSupply: params.initialSupply, numTokensToSell: params.numTokensToSell, numeraire: params.numeraire };
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
poolConfig(params) {
|
|
41
|
+
const sortedBeneficiaries = params.beneficiaries ? [...params.beneficiaries].sort((a, b) => {
|
|
42
|
+
const aAddr = a.beneficiary.toLowerCase();
|
|
43
|
+
const bAddr = b.beneficiary.toLowerCase();
|
|
44
|
+
return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;
|
|
45
|
+
}) : void 0;
|
|
46
|
+
this.pool = { fee: params.fee, tickSpacing: params.tickSpacing, curves: params.curves, beneficiaries: sortedBeneficiaries };
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
withMarketCapPresets(params) {
|
|
50
|
+
const { fee, tickSpacing, curves } = chunkZPHOOG72_js.buildCurvesFromPresets({
|
|
51
|
+
fee: params?.fee,
|
|
52
|
+
tickSpacing: params?.tickSpacing,
|
|
53
|
+
presets: params?.presets,
|
|
54
|
+
overrides: params?.overrides
|
|
55
|
+
});
|
|
56
|
+
return this.poolConfig({
|
|
57
|
+
fee,
|
|
58
|
+
tickSpacing,
|
|
59
|
+
curves,
|
|
60
|
+
beneficiaries: params?.beneficiaries
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Configure multicurve using market cap ranges (no tick math required).
|
|
65
|
+
*
|
|
66
|
+
* This is the recommended way to configure multicurve pools. Simply specify
|
|
67
|
+
* market cap ranges in USD for each curve.
|
|
68
|
+
*
|
|
69
|
+
* Curves can be provided in any order - they will be automatically sorted
|
|
70
|
+
* by market cap (ascending) before validation and processing. Curves must
|
|
71
|
+
* be contiguous or overlapping (no gaps allowed).
|
|
72
|
+
*
|
|
73
|
+
* @param params - Market cap configuration with curves defined by market cap ranges
|
|
74
|
+
* @returns Builder instance for chaining
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* builder
|
|
79
|
+
* .saleConfig({ initialSupply, numTokensToSell, numeraire: WETH })
|
|
80
|
+
* .withCurves({
|
|
81
|
+
* numerairePrice: 3000, // ETH = $3000
|
|
82
|
+
* curves: [
|
|
83
|
+
* { marketCap: { start: 500_000, end: 1_000_000 }, numPositions: 10, shares: parseEther('0.3') },
|
|
84
|
+
* { marketCap: { start: 1_000_000, end: 5_000_000 }, numPositions: 20, shares: parseEther('0.5') },
|
|
85
|
+
* { marketCap: { start: 5_000_000, end: 50_000_000 }, numPositions: 10, shares: parseEther('0.2') },
|
|
86
|
+
* ],
|
|
87
|
+
* })
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
withCurves(params) {
|
|
91
|
+
if (!this.sale?.numeraire) {
|
|
92
|
+
throw new Error("Must call saleConfig() before withCurves()");
|
|
93
|
+
}
|
|
94
|
+
if (params.numerairePrice <= 0) {
|
|
95
|
+
throw new Error("numerairePrice must be greater than 0");
|
|
96
|
+
}
|
|
97
|
+
if (!params.curves || params.curves.length === 0) {
|
|
98
|
+
throw new Error("curves array must contain at least one curve");
|
|
99
|
+
}
|
|
100
|
+
for (let i = 0; i < params.curves.length; i++) {
|
|
101
|
+
const curve = params.curves[i];
|
|
102
|
+
this.validateCurveRange(
|
|
103
|
+
curve.marketCap.start,
|
|
104
|
+
curve.marketCap.end,
|
|
105
|
+
curve.numPositions,
|
|
106
|
+
curve.shares,
|
|
107
|
+
`curves[${i}]`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
const sortedCurves = this.sortCurvesByMarketCap(params.curves);
|
|
111
|
+
this.validateCurveContiguity(sortedCurves);
|
|
112
|
+
const totalShares = sortedCurves.reduce((sum, c) => sum + c.shares, 0n);
|
|
113
|
+
if (totalShares !== chunkPH2KXREH_js.WAD) {
|
|
114
|
+
throw new Error(
|
|
115
|
+
`Total curve shares must equal 100% (${chunkPH2KXREH_js.WAD}). Got ${totalShares} (${Number(totalShares * 10000n / chunkPH2KXREH_js.WAD) / 100}%)`
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
const tokenSupply = params.tokenSupply ?? this.sale.initialSupply;
|
|
119
|
+
if (!tokenSupply) {
|
|
120
|
+
throw new Error(
|
|
121
|
+
"tokenSupply must be provided (either via saleConfig() or withCurves() params)"
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
const fee = params.fee ?? chunkPH2KXREH_js.FEE_TIERS.LOW;
|
|
125
|
+
const tickSpacing = params.tickSpacing ?? chunkPH2KXREH_js.TICK_SPACINGS[fee];
|
|
126
|
+
if (tickSpacing === void 0) {
|
|
127
|
+
throw new Error("tickSpacing must be provided when using a custom fee tier");
|
|
128
|
+
}
|
|
129
|
+
const numeraire = this.sale.numeraire;
|
|
130
|
+
const firstCurve = sortedCurves[0];
|
|
131
|
+
const startValidation = chunkAS64GWBX_js.validateMarketCapParameters(
|
|
132
|
+
firstCurve.marketCap.start,
|
|
133
|
+
tokenSupply,
|
|
134
|
+
params.tokenDecimals
|
|
135
|
+
);
|
|
136
|
+
const endValidation = chunkAS64GWBX_js.validateMarketCapParameters(
|
|
137
|
+
firstCurve.marketCap.end,
|
|
138
|
+
tokenSupply,
|
|
139
|
+
params.tokenDecimals
|
|
140
|
+
);
|
|
141
|
+
const allWarnings = [...startValidation.warnings, ...endValidation.warnings];
|
|
142
|
+
if (allWarnings.length > 0) {
|
|
143
|
+
console.warn("First curve market cap validation warnings:");
|
|
144
|
+
allWarnings.forEach((w) => console.warn(` - ${w}`));
|
|
145
|
+
}
|
|
146
|
+
const curves = [];
|
|
147
|
+
for (const curve of sortedCurves) {
|
|
148
|
+
const curveTicks = chunkAS64GWBX_js.marketCapRangeToTicksForCurve(
|
|
149
|
+
curve.marketCap.start,
|
|
150
|
+
curve.marketCap.end,
|
|
151
|
+
tokenSupply,
|
|
152
|
+
params.numerairePrice,
|
|
153
|
+
params.tokenDecimals ?? 18,
|
|
154
|
+
params.numeraireDecimals ?? 18,
|
|
155
|
+
tickSpacing,
|
|
156
|
+
numeraire
|
|
157
|
+
);
|
|
158
|
+
curves.push({
|
|
159
|
+
tickLower: curveTicks.tickLower,
|
|
160
|
+
tickUpper: curveTicks.tickUpper,
|
|
161
|
+
numPositions: curve.numPositions,
|
|
162
|
+
shares: curve.shares
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return this.poolConfig({
|
|
166
|
+
fee,
|
|
167
|
+
tickSpacing,
|
|
168
|
+
curves,
|
|
169
|
+
beneficiaries: params.beneficiaries
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Sort curves by market cap (start, then end) for deterministic ordering
|
|
174
|
+
*/
|
|
175
|
+
sortCurvesByMarketCap(curves) {
|
|
176
|
+
return [...curves].sort((a, b) => {
|
|
177
|
+
const startDiff = a.marketCap.start - b.marketCap.start;
|
|
178
|
+
if (startDiff !== 0) return startDiff;
|
|
179
|
+
return a.marketCap.end - b.marketCap.end;
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Validate a single curve's parameters
|
|
184
|
+
*/
|
|
185
|
+
validateCurveRange(startMarketCap, endMarketCap, numPositions, shares, label) {
|
|
186
|
+
if (startMarketCap <= 0) {
|
|
187
|
+
throw new Error(`${label}: marketCap.start must be greater than 0`);
|
|
188
|
+
}
|
|
189
|
+
if (endMarketCap <= 0) {
|
|
190
|
+
throw new Error(`${label}: marketCap.end must be greater than 0`);
|
|
191
|
+
}
|
|
192
|
+
if (startMarketCap >= endMarketCap) {
|
|
193
|
+
throw new Error(
|
|
194
|
+
`${label}: startMarketCap ($${startMarketCap.toLocaleString()}) must be less than endMarketCap ($${endMarketCap.toLocaleString()})`
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
if (numPositions <= 0) {
|
|
198
|
+
throw new Error(`${label}: numPositions must be greater than 0`);
|
|
199
|
+
}
|
|
200
|
+
if (shares <= 0n) {
|
|
201
|
+
throw new Error(`${label}: shares must be greater than 0`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Validate that curves are contiguous or overlapping (no gaps allowed).
|
|
206
|
+
* Expects curves to be pre-sorted by market cap.
|
|
207
|
+
*/
|
|
208
|
+
validateCurveContiguity(sortedCurves) {
|
|
209
|
+
if (sortedCurves.length <= 1) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
for (let i = 1; i < sortedCurves.length; i++) {
|
|
213
|
+
const prevCurve = sortedCurves[i - 1];
|
|
214
|
+
const currCurve = sortedCurves[i];
|
|
215
|
+
if (currCurve.marketCap.start > prevCurve.marketCap.end) {
|
|
216
|
+
throw new Error(
|
|
217
|
+
`Gap detected between market cap ranges: $${prevCurve.marketCap.start.toLocaleString()}-$${prevCurve.marketCap.end.toLocaleString()} and $${currCurve.marketCap.start.toLocaleString()}-$${currCurve.marketCap.end.toLocaleString()}. Curves must be contiguous or overlapping.`
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
withVesting(params) {
|
|
223
|
+
if (!params) {
|
|
224
|
+
this.vesting = void 0;
|
|
225
|
+
return this;
|
|
226
|
+
}
|
|
227
|
+
this.vesting = { duration: Number(params.duration ?? 0n), cliffDuration: params.cliffDuration ?? 0, recipients: params.recipients, amounts: params.amounts };
|
|
228
|
+
return this;
|
|
229
|
+
}
|
|
230
|
+
withSchedule(params) {
|
|
231
|
+
if (!params) {
|
|
232
|
+
this.schedule = void 0;
|
|
233
|
+
return this;
|
|
234
|
+
}
|
|
235
|
+
let startTimeSeconds;
|
|
236
|
+
const { startTime } = params;
|
|
237
|
+
if (startTime instanceof Date) {
|
|
238
|
+
startTimeSeconds = Math.floor(startTime.getTime() / 1e3);
|
|
239
|
+
} else if (typeof startTime === "bigint") {
|
|
240
|
+
startTimeSeconds = Number(startTime);
|
|
241
|
+
} else {
|
|
242
|
+
startTimeSeconds = Number(startTime);
|
|
243
|
+
}
|
|
244
|
+
if (!Number.isFinite(startTimeSeconds) || !Number.isInteger(startTimeSeconds)) {
|
|
245
|
+
throw new Error("Schedule startTime must be an integer number of seconds since Unix epoch");
|
|
246
|
+
}
|
|
247
|
+
if (startTimeSeconds < 0) {
|
|
248
|
+
throw new Error("Schedule startTime cannot be negative");
|
|
249
|
+
}
|
|
250
|
+
const UINT32_MAX = 4294967295;
|
|
251
|
+
if (startTimeSeconds > UINT32_MAX) {
|
|
252
|
+
throw new Error("Schedule startTime must fit within uint32 (seconds since Unix epoch up to year 2106)");
|
|
253
|
+
}
|
|
254
|
+
this.schedule = { startTime: startTimeSeconds };
|
|
255
|
+
return this;
|
|
256
|
+
}
|
|
257
|
+
withGovernance(params) {
|
|
258
|
+
this.governance = params;
|
|
259
|
+
return this;
|
|
260
|
+
}
|
|
261
|
+
withMigration(migration) {
|
|
262
|
+
this.migration = migration;
|
|
263
|
+
return this;
|
|
264
|
+
}
|
|
265
|
+
withUserAddress(address) {
|
|
266
|
+
this.userAddress = address;
|
|
267
|
+
return this;
|
|
268
|
+
}
|
|
269
|
+
withIntegrator(address) {
|
|
270
|
+
this.integrator = address ?? chunkPH2KXREH_js.ZERO_ADDRESS;
|
|
271
|
+
return this;
|
|
272
|
+
}
|
|
273
|
+
withGasLimit(gas) {
|
|
274
|
+
this.gasLimit = gas;
|
|
275
|
+
return this;
|
|
276
|
+
}
|
|
277
|
+
overrideModule(key, address) {
|
|
278
|
+
this.moduleAddresses = { ...this.moduleAddresses ?? {}, [key]: address };
|
|
279
|
+
return this;
|
|
280
|
+
}
|
|
281
|
+
withTokenFactory(address) {
|
|
282
|
+
return this.overrideModule("tokenFactory", address);
|
|
283
|
+
}
|
|
284
|
+
withAirlock(address) {
|
|
285
|
+
return this.overrideModule("airlock", address);
|
|
286
|
+
}
|
|
287
|
+
withV4MulticurveInitializer(address) {
|
|
288
|
+
return this.overrideModule("v4MulticurveInitializer", address);
|
|
289
|
+
}
|
|
290
|
+
withV4ScheduledMulticurveInitializer(address) {
|
|
291
|
+
return this.overrideModule("v4ScheduledMulticurveInitializer", address);
|
|
292
|
+
}
|
|
293
|
+
withGovernanceFactory(address) {
|
|
294
|
+
return this.overrideModule("governanceFactory", address);
|
|
295
|
+
}
|
|
296
|
+
withV2Migrator(address) {
|
|
297
|
+
return this.overrideModule("v2Migrator", address);
|
|
298
|
+
}
|
|
299
|
+
withV3Migrator(address) {
|
|
300
|
+
return this.overrideModule("v3Migrator", address);
|
|
301
|
+
}
|
|
302
|
+
withV4Migrator(address) {
|
|
303
|
+
return this.overrideModule("v4Migrator", address);
|
|
304
|
+
}
|
|
305
|
+
withNoOpMigrator(address) {
|
|
306
|
+
return this.overrideModule("noOpMigrator", address);
|
|
307
|
+
}
|
|
308
|
+
build() {
|
|
309
|
+
if (!this.token) throw new Error("tokenConfig is required");
|
|
310
|
+
if (!this.sale) throw new Error("saleConfig is required");
|
|
311
|
+
if (!this.pool) throw new Error("poolConfig is required");
|
|
312
|
+
if (!this.migration) throw new Error("migration configuration is required");
|
|
313
|
+
if (!this.userAddress) throw new Error("userAddress is required");
|
|
314
|
+
const governance = this.governance ?? (chunkOKNM7ODQ_js.isNoOpEnabledChain(this.chainId) ? { type: "noOp" } : { type: "default" });
|
|
315
|
+
return {
|
|
316
|
+
token: this.token,
|
|
317
|
+
sale: this.sale,
|
|
318
|
+
pool: this.pool,
|
|
319
|
+
schedule: this.schedule,
|
|
320
|
+
vesting: this.vesting,
|
|
321
|
+
governance,
|
|
322
|
+
migration: this.migration,
|
|
323
|
+
integrator: this.integrator ?? chunkPH2KXREH_js.ZERO_ADDRESS,
|
|
324
|
+
userAddress: this.userAddress,
|
|
325
|
+
modules: this.moduleAddresses,
|
|
326
|
+
gas: this.gasLimit
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
exports.MulticurveBuilder = MulticurveBuilder;
|
|
332
|
+
//# sourceMappingURL=chunk-NGDPQC5E.js.map
|
|
333
|
+
//# sourceMappingURL=chunk-NGDPQC5E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builders/MulticurveBuilder.ts"],"names":["DEFAULT_V3_YEARLY_MINT_RATE","buildCurvesFromPresets","WAD","FEE_TIERS","TICK_SPACINGS","validateMarketCapParameters","marketCapRangeToTicksForCurve","ZERO_ADDRESS","isNoOpEnabledChain"],"mappings":"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","file":"chunk-NGDPQC5E.js","sourcesContent":["import type { Address } from 'viem'\nimport {\n DEFAULT_V3_YEARLY_MINT_RATE,\n FEE_TIERS,\n TICK_SPACINGS,\n WAD,\n ZERO_ADDRESS,\n} from '../constants'\nimport {\n marketCapRangeToTicksForCurve,\n validateMarketCapParameters,\n} from '../utils'\nimport {\n isNoOpEnabledChain,\n type CreateMulticurveParams,\n type GovernanceOption,\n type MigrationConfig,\n type VestingConfig,\n type TokenConfig,\n type MulticurveMarketCapCurvesConfig,\n type MulticurveMarketCapPreset,\n type ModuleAddressOverrides,\n} from '../types'\nimport { type SupportedChainId } from '../addresses'\nimport {\n type BaseAuctionBuilder,\n type MarketCapPresetOverrides,\n buildCurvesFromPresets,\n} from './shared'\n\nexport class MulticurveBuilder<C extends SupportedChainId>\n implements BaseAuctionBuilder<C> {\n private token?: TokenConfig\n private sale?: CreateMulticurveParams<C>['sale']\n private pool?: CreateMulticurveParams<C>['pool']\n private schedule?: CreateMulticurveParams<C>['schedule']\n private vesting?: VestingConfig\n private governance?: GovernanceOption<C>\n private migration?: MigrationConfig\n private integrator?: Address\n private userAddress?: Address\n private moduleAddresses?: ModuleAddressOverrides\n private gasLimit?: bigint\n public chainId: C\n\n constructor(chainId: C) {\n this.chainId = chainId\n }\n\n static forChain<C extends SupportedChainId>(chainId: C): MulticurveBuilder<C> {\n return new MulticurveBuilder(chainId)\n }\n\n tokenConfig(\n params:\n | { type?: 'standard'; name: string; symbol: string; tokenURI: string; yearlyMintRate?: bigint }\n | { type: 'doppler404'; name: string; symbol: string; baseURI: string; unit?: bigint }\n ): this {\n if (params && 'type' in params && params.type === 'doppler404') {\n this.token = {\n type: 'doppler404',\n name: params.name,\n symbol: params.symbol,\n baseURI: params.baseURI,\n unit: params.unit,\n }\n } else {\n this.token = {\n type: 'standard',\n name: params.name,\n symbol: params.symbol,\n tokenURI: params.tokenURI,\n yearlyMintRate: params.yearlyMintRate ?? DEFAULT_V3_YEARLY_MINT_RATE,\n }\n }\n return this\n }\n\n saleConfig(params: { initialSupply: bigint; numTokensToSell: bigint; numeraire: Address }): this {\n this.sale = { initialSupply: params.initialSupply, numTokensToSell: params.numTokensToSell, numeraire: params.numeraire }\n return this\n }\n\n poolConfig(params: { fee: number; tickSpacing: number; curves: { tickLower: number; tickUpper: number; numPositions: number; shares: bigint }[]; beneficiaries?: { beneficiary: Address; shares: bigint }[] }): this {\n const sortedBeneficiaries = params.beneficiaries\n ? [...params.beneficiaries].sort((a, b) => {\n const aAddr = a.beneficiary.toLowerCase()\n const bAddr = b.beneficiary.toLowerCase()\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0\n })\n : undefined\n\n this.pool = { fee: params.fee, tickSpacing: params.tickSpacing, curves: params.curves, beneficiaries: sortedBeneficiaries }\n return this\n }\n\n withMarketCapPresets(params?: {\n fee?: number\n tickSpacing?: number\n presets?: MulticurveMarketCapPreset[]\n overrides?: MarketCapPresetOverrides\n beneficiaries?: { beneficiary: Address; shares: bigint }[]\n }): this {\n const { fee, tickSpacing, curves } = buildCurvesFromPresets({\n fee: params?.fee,\n tickSpacing: params?.tickSpacing,\n presets: params?.presets,\n overrides: params?.overrides,\n })\n\n return this.poolConfig({\n fee,\n tickSpacing,\n curves,\n beneficiaries: params?.beneficiaries,\n })\n }\n\n /**\n * Configure multicurve using market cap ranges (no tick math required).\n *\n * This is the recommended way to configure multicurve pools. Simply specify\n * market cap ranges in USD for each curve.\n *\n * Curves can be provided in any order - they will be automatically sorted\n * by market cap (ascending) before validation and processing. Curves must\n * be contiguous or overlapping (no gaps allowed).\n *\n * @param params - Market cap configuration with curves defined by market cap ranges\n * @returns Builder instance for chaining\n *\n * @example\n * ```ts\n * builder\n * .saleConfig({ initialSupply, numTokensToSell, numeraire: WETH })\n * .withCurves({\n * numerairePrice: 3000, // ETH = $3000\n * curves: [\n * { marketCap: { start: 500_000, end: 1_000_000 }, numPositions: 10, shares: parseEther('0.3') },\n * { marketCap: { start: 1_000_000, end: 5_000_000 }, numPositions: 20, shares: parseEther('0.5') },\n * { marketCap: { start: 5_000_000, end: 50_000_000 }, numPositions: 10, shares: parseEther('0.2') },\n * ],\n * })\n * ```\n */\n withCurves(params: MulticurveMarketCapCurvesConfig): this {\n // Validate required config\n if (!this.sale?.numeraire) {\n throw new Error('Must call saleConfig() before withCurves()')\n }\n\n // Validate numerairePrice\n if (params.numerairePrice <= 0) {\n throw new Error('numerairePrice must be greater than 0')\n }\n\n // Validate curves array\n if (!params.curves || params.curves.length === 0) {\n throw new Error('curves array must contain at least one curve')\n }\n\n // Validate each curve\n for (let i = 0; i < params.curves.length; i++) {\n const curve = params.curves[i]\n this.validateCurveRange(\n curve.marketCap.start,\n curve.marketCap.end,\n curve.numPositions,\n curve.shares,\n `curves[${i}]`\n )\n }\n\n // Sort curves by market cap (start, then end) for deterministic ordering\n const sortedCurves = this.sortCurvesByMarketCap(params.curves)\n\n // Validate curve contiguity (no gaps allowed, overlaps OK)\n this.validateCurveContiguity(sortedCurves)\n\n // Validate total shares sum to exactly WAD\n const totalShares = sortedCurves.reduce((sum, c) => sum + c.shares, 0n)\n if (totalShares !== WAD) {\n throw new Error(\n `Total curve shares must equal 100% (${WAD}). Got ${totalShares} (${Number(totalShares * 10000n / WAD) / 100}%)`\n )\n }\n\n // Get token supply\n const tokenSupply = params.tokenSupply ?? this.sale.initialSupply\n if (!tokenSupply) {\n throw new Error(\n 'tokenSupply must be provided (either via saleConfig() or withCurves() params)'\n )\n }\n\n // Get fee and tick spacing\n const fee = params.fee ?? FEE_TIERS.LOW\n const tickSpacing = params.tickSpacing ??\n (TICK_SPACINGS as Record<number, number>)[fee]\n\n if (tickSpacing === undefined) {\n throw new Error('tickSpacing must be provided when using a custom fee tier')\n }\n\n const numeraire = this.sale.numeraire\n\n // Validate first curve market caps (the launch price)\n const firstCurve = sortedCurves[0]\n const startValidation = validateMarketCapParameters(\n firstCurve.marketCap.start,\n tokenSupply,\n params.tokenDecimals\n )\n const endValidation = validateMarketCapParameters(\n firstCurve.marketCap.end,\n tokenSupply,\n params.tokenDecimals\n )\n const allWarnings = [...startValidation.warnings, ...endValidation.warnings]\n if (allWarnings.length > 0) {\n console.warn('First curve market cap validation warnings:')\n allWarnings.forEach(w => console.warn(` - ${w}`))\n }\n\n // Convert all curves to ticks\n const curves: { tickLower: number; tickUpper: number; numPositions: number; shares: bigint }[] = []\n\n for (const curve of sortedCurves) {\n const curveTicks = marketCapRangeToTicksForCurve(\n curve.marketCap.start,\n curve.marketCap.end,\n tokenSupply,\n params.numerairePrice,\n params.tokenDecimals ?? 18,\n params.numeraireDecimals ?? 18,\n tickSpacing,\n numeraire\n )\n\n curves.push({\n tickLower: curveTicks.tickLower,\n tickUpper: curveTicks.tickUpper,\n numPositions: curve.numPositions,\n shares: curve.shares,\n })\n }\n\n // Delegate to existing poolConfig method\n return this.poolConfig({\n fee,\n tickSpacing,\n curves,\n beneficiaries: params.beneficiaries,\n })\n }\n\n /**\n * Sort curves by market cap (start, then end) for deterministic ordering\n */\n private sortCurvesByMarketCap<T extends { marketCap: { start: number; end: number } }>(\n curves: T[]\n ): T[] {\n return [...curves].sort((a, b) => {\n const startDiff = a.marketCap.start - b.marketCap.start\n if (startDiff !== 0) return startDiff\n return a.marketCap.end - b.marketCap.end\n })\n }\n\n /**\n * Validate a single curve's parameters\n */\n private validateCurveRange(\n startMarketCap: number,\n endMarketCap: number,\n numPositions: number,\n shares: bigint,\n label: string\n ): void {\n if (startMarketCap <= 0) {\n throw new Error(`${label}: marketCap.start must be greater than 0`)\n }\n if (endMarketCap <= 0) {\n throw new Error(`${label}: marketCap.end must be greater than 0`)\n }\n if (startMarketCap >= endMarketCap) {\n throw new Error(\n `${label}: startMarketCap ($${startMarketCap.toLocaleString()}) must be less than endMarketCap ($${endMarketCap.toLocaleString()})`\n )\n }\n if (numPositions <= 0) {\n throw new Error(`${label}: numPositions must be greater than 0`)\n }\n if (shares <= 0n) {\n throw new Error(`${label}: shares must be greater than 0`)\n }\n }\n\n /**\n * Validate that curves are contiguous or overlapping (no gaps allowed).\n * Expects curves to be pre-sorted by market cap.\n */\n private validateCurveContiguity(\n sortedCurves: { marketCap: { start: number; end: number } }[]\n ): void {\n if (sortedCurves.length <= 1) {\n return\n }\n\n for (let i = 1; i < sortedCurves.length; i++) {\n const prevCurve = sortedCurves[i - 1]\n const currCurve = sortedCurves[i]\n\n if (currCurve.marketCap.start > prevCurve.marketCap.end) {\n throw new Error(\n `Gap detected between market cap ranges: ` +\n `$${prevCurve.marketCap.start.toLocaleString()}-$${prevCurve.marketCap.end.toLocaleString()} ` +\n `and $${currCurve.marketCap.start.toLocaleString()}-$${currCurve.marketCap.end.toLocaleString()}. ` +\n `Curves must be contiguous or overlapping.`\n )\n }\n }\n }\n\n withVesting(params?: { duration?: bigint; cliffDuration?: number; recipients?: Address[]; amounts?: bigint[] }): this {\n if (!params) { this.vesting = undefined; return this }\n this.vesting = { duration: Number(params.duration ?? 0n), cliffDuration: params.cliffDuration ?? 0, recipients: params.recipients, amounts: params.amounts }\n return this\n }\n\n withSchedule(params?: { startTime: number | bigint | Date }): this {\n if (!params) {\n this.schedule = undefined\n return this\n }\n\n let startTimeSeconds: number\n const { startTime } = params\n\n if (startTime instanceof Date) {\n startTimeSeconds = Math.floor(startTime.getTime() / 1000)\n } else if (typeof startTime === 'bigint') {\n startTimeSeconds = Number(startTime)\n } else {\n startTimeSeconds = Number(startTime)\n }\n\n if (!Number.isFinite(startTimeSeconds) || !Number.isInteger(startTimeSeconds)) {\n throw new Error('Schedule startTime must be an integer number of seconds since Unix epoch')\n }\n\n if (startTimeSeconds < 0) {\n throw new Error('Schedule startTime cannot be negative')\n }\n\n const UINT32_MAX = 0xffffffff\n if (startTimeSeconds > UINT32_MAX) {\n throw new Error('Schedule startTime must fit within uint32 (seconds since Unix epoch up to year 2106)')\n }\n\n this.schedule = { startTime: startTimeSeconds }\n return this\n }\n\n withGovernance(params: GovernanceOption<C>): this {\n this.governance = params\n return this\n }\n\n withMigration(migration: MigrationConfig): this {\n this.migration = migration\n return this\n }\n\n withUserAddress(address: Address): this {\n this.userAddress = address\n return this\n }\n\n withIntegrator(address?: Address): this {\n this.integrator = address ?? ZERO_ADDRESS\n return this\n }\n\n withGasLimit(gas?: bigint): this {\n this.gasLimit = gas\n return this\n }\n\n private overrideModule<K extends keyof ModuleAddressOverrides>(key: K, address: NonNullable<ModuleAddressOverrides[K]>): this {\n this.moduleAddresses = { ...(this.moduleAddresses ?? {}), [key]: address } as ModuleAddressOverrides\n return this\n }\n\n withTokenFactory(address: Address): this { return this.overrideModule('tokenFactory', address) }\n withAirlock(address: Address): this { return this.overrideModule('airlock', address) }\n withV4MulticurveInitializer(address: Address): this { return this.overrideModule('v4MulticurveInitializer', address) }\n withV4ScheduledMulticurveInitializer(address: Address): this { return this.overrideModule('v4ScheduledMulticurveInitializer', address) }\n withGovernanceFactory(address: Address): this { return this.overrideModule('governanceFactory', address) }\n withV2Migrator(address: Address): this { return this.overrideModule('v2Migrator', address) }\n withV3Migrator(address: Address): this { return this.overrideModule('v3Migrator', address) }\n withV4Migrator(address: Address): this { return this.overrideModule('v4Migrator', address) }\n withNoOpMigrator(address: Address): this { return this.overrideModule('noOpMigrator', address) }\n\n build(): CreateMulticurveParams<C> {\n if (!this.token) throw new Error('tokenConfig is required')\n if (!this.sale) throw new Error('saleConfig is required')\n if (!this.pool) throw new Error('poolConfig is required')\n if (!this.migration) throw new Error('migration configuration is required')\n if (!this.userAddress) throw new Error('userAddress is required')\n\n // Default governance: noOp on supported chains, default on others (e.g., Ink)\n const governance = this.governance ?? (\n isNoOpEnabledChain(this.chainId)\n ? { type: 'noOp' as const }\n : { type: 'default' as const }\n )\n\n return {\n token: this.token,\n sale: this.sale,\n pool: this.pool,\n schedule: this.schedule,\n vesting: this.vesting,\n governance: governance as GovernanceOption<C>,\n migration: this.migration,\n integrator: this.integrator ?? ZERO_ADDRESS,\n userAddress: this.userAddress,\n modules: this.moduleAddresses,\n gas: this.gasLimit,\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// src/utils/isToken0Expected.ts
|
|
2
|
+
function isToken0Expected(numeraire) {
|
|
3
|
+
const numeraireBigInt = BigInt(numeraire);
|
|
4
|
+
const halfMaxUint160 = 2n ** 159n - 1n;
|
|
5
|
+
if (numeraireBigInt === 0n) {
|
|
6
|
+
return false;
|
|
7
|
+
} else if (numeraireBigInt > halfMaxUint160) {
|
|
8
|
+
return true;
|
|
9
|
+
} else {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { isToken0Expected };
|
|
15
|
+
//# sourceMappingURL=chunk-NNNCVFOH.mjs.map
|
|
16
|
+
//# sourceMappingURL=chunk-NNNCVFOH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/isToken0Expected.ts"],"names":[],"mappings":";AAUO,SAAS,iBAAiB,SAAA,EAA6B;AAC5D,EAAA,MAAM,eAAA,GAAkB,OAAO,SAAS,CAAA;AACxC,EAAA,MAAM,cAAA,GAAkB,MAAM,IAAA,GAAQ,EAAA;AAEtC,EAAA,IAAI,oBAAoB,EAAA,EAAI;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,MAAA,IAAW,kBAAkB,cAAA,EAAgB;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,OAAO,KAAA;AAAA,EACT;AACF","file":"chunk-NNNCVFOH.mjs","sourcesContent":["import { Address } from \"viem\"\n\n/**\n * Determine token ordering based on numeraire address.\n * Mining will find a salt such that token address is correctly ordered relative to numeraire.\n * For numeraires > halfMaxUint160, token must be token0 (smaller address)\n * For all other cases, token should be token1 (larger address)\n * @param numeraire - Address of numeraire token\n * @returns Whether base token address is expected to be generated as token0\n */\nexport function isToken0Expected(numeraire: Address): boolean {\n const numeraireBigInt = BigInt(numeraire)\n const halfMaxUint160 = (2n ** 159n) - 1n\n\n if (numeraireBigInt === 0n) {\n return false // ETH paired, token will be > 0x0\n } else if (numeraireBigInt > halfMaxUint160) {\n return true // Large numeraire, token will be < numeraire\n } else {\n return false // Normal case, token will be > numeraire\n }\n}"]}
|