@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
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { uniswapV3PoolAbi, airlockAbi } from './chunk-OTG75GVH.mjs';
|
|
2
|
+
import { getAddresses } from './chunk-AW3WR2D3.mjs';
|
|
3
|
+
import { zeroAddress } from 'viem';
|
|
4
4
|
|
|
5
5
|
var StaticAuction = class {
|
|
6
|
+
get rpc() {
|
|
7
|
+
return this.client;
|
|
8
|
+
}
|
|
6
9
|
constructor(client, poolAddress) {
|
|
7
10
|
this.client = client;
|
|
8
11
|
this.poolAddress = poolAddress;
|
|
@@ -18,41 +21,47 @@ var StaticAuction = class {
|
|
|
18
21
|
*/
|
|
19
22
|
async getPoolInfo() {
|
|
20
23
|
const [slot0, liquidity, token0, token1, fee] = await Promise.all([
|
|
21
|
-
this.
|
|
24
|
+
this.rpc.readContract({
|
|
22
25
|
address: this.poolAddress,
|
|
23
26
|
abi: uniswapV3PoolAbi,
|
|
24
27
|
functionName: "slot0"
|
|
25
28
|
}),
|
|
26
|
-
this.
|
|
29
|
+
this.rpc.readContract({
|
|
27
30
|
address: this.poolAddress,
|
|
28
31
|
abi: uniswapV3PoolAbi,
|
|
29
32
|
functionName: "liquidity"
|
|
30
33
|
}),
|
|
31
|
-
this.
|
|
34
|
+
this.rpc.readContract({
|
|
32
35
|
address: this.poolAddress,
|
|
33
36
|
abi: uniswapV3PoolAbi,
|
|
34
37
|
functionName: "token0"
|
|
35
38
|
}),
|
|
36
|
-
this.
|
|
39
|
+
this.rpc.readContract({
|
|
37
40
|
address: this.poolAddress,
|
|
38
41
|
abi: uniswapV3PoolAbi,
|
|
39
42
|
functionName: "token1"
|
|
40
43
|
}),
|
|
41
|
-
this.
|
|
44
|
+
this.rpc.readContract({
|
|
42
45
|
address: this.poolAddress,
|
|
43
46
|
abi: uniswapV3PoolAbi,
|
|
44
47
|
functionName: "fee"
|
|
45
48
|
})
|
|
46
49
|
]);
|
|
47
|
-
const chainId = await this.
|
|
50
|
+
const chainId = await this.rpc.getChainId();
|
|
48
51
|
const addresses = getAddresses(chainId);
|
|
49
|
-
const assetData = await this.
|
|
52
|
+
const assetData = await this.rpc.readContract({
|
|
50
53
|
address: addresses.airlock,
|
|
51
54
|
abi: airlockAbi,
|
|
52
55
|
functionName: "getAssetData",
|
|
53
56
|
args: [token0]
|
|
54
57
|
});
|
|
55
|
-
|
|
58
|
+
let poolOrHook0;
|
|
59
|
+
if (Array.isArray(assetData)) {
|
|
60
|
+
poolOrHook0 = assetData[5];
|
|
61
|
+
} else if (assetData && typeof assetData === "object") {
|
|
62
|
+
poolOrHook0 = assetData.poolOrHook ?? assetData.pool;
|
|
63
|
+
}
|
|
64
|
+
const isToken0AuctionToken = poolOrHook0 && poolOrHook0 !== zeroAddress;
|
|
56
65
|
return {
|
|
57
66
|
address: this.poolAddress,
|
|
58
67
|
tokenAddress: isToken0AuctionToken ? token0 : token1,
|
|
@@ -75,15 +84,16 @@ var StaticAuction = class {
|
|
|
75
84
|
*/
|
|
76
85
|
async hasGraduated() {
|
|
77
86
|
const tokenAddress = await this.getTokenAddress();
|
|
78
|
-
const chainId = await this.
|
|
87
|
+
const chainId = await this.rpc.getChainId();
|
|
79
88
|
const addresses = getAddresses(chainId);
|
|
80
|
-
const assetData = await this.
|
|
89
|
+
const assetData = await this.rpc.readContract({
|
|
81
90
|
address: addresses.airlock,
|
|
82
91
|
abi: airlockAbi,
|
|
83
92
|
functionName: "getAssetData",
|
|
84
93
|
args: [tokenAddress]
|
|
85
94
|
});
|
|
86
|
-
|
|
95
|
+
const liquidityMigrator = Array.isArray(assetData) ? assetData[3] : assetData?.liquidityMigrator;
|
|
96
|
+
return liquidityMigrator === zeroAddress;
|
|
87
97
|
}
|
|
88
98
|
/**
|
|
89
99
|
* Get the current price in the pool
|
|
@@ -92,12 +102,12 @@ var StaticAuction = class {
|
|
|
92
102
|
async getCurrentPrice() {
|
|
93
103
|
const poolInfo = await this.getPoolInfo();
|
|
94
104
|
const [token0, token1] = await Promise.all([
|
|
95
|
-
this.
|
|
105
|
+
this.rpc.readContract({
|
|
96
106
|
address: this.poolAddress,
|
|
97
107
|
abi: uniswapV3PoolAbi,
|
|
98
108
|
functionName: "token0"
|
|
99
109
|
}),
|
|
100
|
-
this.
|
|
110
|
+
this.rpc.readContract({
|
|
101
111
|
address: this.poolAddress,
|
|
102
112
|
abi: uniswapV3PoolAbi,
|
|
103
113
|
functionName: "token1"
|
|
@@ -118,7 +128,7 @@ var StaticAuction = class {
|
|
|
118
128
|
* Get total liquidity in the pool
|
|
119
129
|
*/
|
|
120
130
|
async getTotalLiquidity() {
|
|
121
|
-
return await this.
|
|
131
|
+
return await this.rpc.readContract({
|
|
122
132
|
address: this.poolAddress,
|
|
123
133
|
abi: uniswapV3PoolAbi,
|
|
124
134
|
functionName: "liquidity"
|
|
@@ -127,5 +137,5 @@ var StaticAuction = class {
|
|
|
127
137
|
};
|
|
128
138
|
|
|
129
139
|
export { StaticAuction };
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
131
|
-
//# sourceMappingURL=chunk-
|
|
140
|
+
//# sourceMappingURL=chunk-AKSEBAR7.mjs.map
|
|
141
|
+
//# sourceMappingURL=chunk-AKSEBAR7.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/entities/auction/StaticAuction.ts"],"names":[],"mappings":"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","file":"chunk-AKSEBAR7.mjs","sourcesContent":["import { type Address, getAddress, zeroAddress, type PublicClient } from 'viem'\nimport type { PoolInfo, SupportedPublicClient } from '../../types'\nimport { uniswapV3PoolAbi, airlockAbi } from '../../abis'\nimport { getAddresses } from '../../addresses'\n\n/**\n * StaticAuction class for interacting with static auctions (Uniswap V3 based)\n * \n * Static auctions use a fixed price range on Uniswap V3 for initial liquidity bootstrapping.\n * This is ideal for simple, predictable price discovery events.\n */\nexport class StaticAuction {\n private client: SupportedPublicClient\n private poolAddress: Address\n private get rpc(): PublicClient {\n return this.client as PublicClient\n }\n \n constructor(client: SupportedPublicClient, poolAddress: Address) {\n this.client = client\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 information\n */\n async getPoolInfo(): Promise<PoolInfo> {\n // Fetch all pool data in parallel\n const [slot0, liquidity, token0, token1, fee] = await Promise.all([\n this.rpc.readContract({\n address: this.poolAddress,\n abi: uniswapV3PoolAbi,\n functionName: 'slot0',\n }),\n this.rpc.readContract({\n address: this.poolAddress,\n abi: uniswapV3PoolAbi,\n functionName: 'liquidity',\n }),\n this.rpc.readContract({\n address: this.poolAddress,\n abi: uniswapV3PoolAbi,\n functionName: 'token0',\n }),\n this.rpc.readContract({\n address: this.poolAddress,\n abi: uniswapV3PoolAbi,\n functionName: 'token1',\n }),\n this.rpc.readContract({\n address: this.poolAddress,\n abi: uniswapV3PoolAbi,\n functionName: 'fee',\n }),\n ])\n \n // Determine which token is the auction token and which is numeraire\n // This requires checking with the Airlock contract\n const chainId = await this.rpc.getChainId()\n const addresses = getAddresses(chainId)\n \n const assetData = await this.rpc.readContract({\n address: addresses.airlock,\n abi: airlockAbi,\n functionName: 'getAssetData',\n args: [token0],\n })\n // Determine whether token0 is the auction token.\n // Handle both tuple and object return shapes from getAssetData.\n // Tuple (legacy): [numeraire, timelock, governance, liquidityMigrator, poolInitializer, pool, ...]\n // Object (unified): { poolOrHook, liquidityMigrator, numeraire, ... }\n let poolOrHook0: any\n if (Array.isArray(assetData)) {\n poolOrHook0 = assetData[5]\n } else if (assetData && typeof assetData === 'object') {\n poolOrHook0 = (assetData as any).poolOrHook ?? (assetData as any).pool\n }\n const isToken0AuctionToken = poolOrHook0 && poolOrHook0 !== zeroAddress\n \n return {\n address: this.poolAddress,\n tokenAddress: isToken0AuctionToken ? token0 : token1,\n numeraireAddress: isToken0AuctionToken ? token1 : token0,\n fee,\n liquidity,\n sqrtPriceX96: slot0[0], // First element is sqrtPriceX96\n }\n }\n \n /**\n * Get the token address for this auction\n */\n async getTokenAddress(): Promise<Address> {\n const poolInfo = await this.getPoolInfo()\n return poolInfo.tokenAddress\n }\n \n /**\n * Check if the auction has graduated (ready for migration)\n */\n async hasGraduated(): Promise<boolean> {\n const tokenAddress = await this.getTokenAddress()\n const chainId = await this.rpc.getChainId()\n const addresses = getAddresses(chainId)\n \n const assetData = await this.rpc.readContract({\n address: addresses.airlock,\n abi: airlockAbi,\n functionName: 'getAssetData',\n args: [tokenAddress],\n })\n // Check if the asset is graduated (liquidityMigrator is zero)\n const liquidityMigrator = Array.isArray(assetData)\n ? (assetData as any)[3]\n : (assetData as any)?.liquidityMigrator\n return liquidityMigrator === zeroAddress\n }\n \n /**\n * Get the current price in the pool\n * Returns the price of token in terms of numeraire (token/numeraire)\n */\n async getCurrentPrice(): Promise<bigint> {\n const poolInfo = await this.getPoolInfo()\n \n // Get token ordering\n const [token0, token1] = await Promise.all([\n this.rpc.readContract({\n address: this.poolAddress,\n abi: uniswapV3PoolAbi,\n functionName: 'token0',\n }),\n this.rpc.readContract({\n address: this.poolAddress,\n abi: uniswapV3PoolAbi,\n functionName: 'token1',\n }),\n ])\n \n // Calculate price from sqrtPriceX96\n // sqrtPriceX96 = sqrt(price) * 2^96\n // price = (sqrtPriceX96 / 2^96)^2\n const sqrtPriceX96 = poolInfo.sqrtPriceX96\n const Q96 = BigInt(2) ** BigInt(96)\n \n // price0 = amount of token1 per token0\n const sqrtPriceX96Squared = sqrtPriceX96 * sqrtPriceX96\n const Q96Squared = Q96 * Q96\n const price0 = sqrtPriceX96Squared / Q96Squared\n \n // Return price based on which token is the auction token\n if (poolInfo.tokenAddress === token0) {\n // Auction token is token0, return price in terms of token1 (numeraire)\n return price0\n } else {\n // Auction token is token1, return reciprocal price\n // price1 = 1 / price0 (with precision handling)\n return Q96Squared / price0\n }\n }\n \n /**\n * Get total liquidity in the pool\n */\n async getTotalLiquidity(): Promise<bigint> {\n return await this.rpc.readContract({\n address: this.poolAddress,\n abi: uniswapV3PoolAbi,\n functionName: 'liquidity',\n })\n }\n}\n"]}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkHM25ZMO3_js = require('./chunk-HM25ZMO3.js');
|
|
4
|
+
var chunkP7KLEPVI_js = require('./chunk-P7KLEPVI.js');
|
|
5
|
+
|
|
6
|
+
// src/utils/marketCapHelpers.ts
|
|
7
|
+
function marketCapToTokenPrice(marketCapUSD, tokenSupply, tokenDecimals = 18) {
|
|
8
|
+
if (marketCapUSD <= 0) {
|
|
9
|
+
throw new Error("Market cap must be positive");
|
|
10
|
+
}
|
|
11
|
+
if (tokenSupply <= 0n) {
|
|
12
|
+
throw new Error("Token supply must be positive");
|
|
13
|
+
}
|
|
14
|
+
const supplyNum = Number(tokenSupply) / 10 ** tokenDecimals;
|
|
15
|
+
return marketCapUSD / supplyNum;
|
|
16
|
+
}
|
|
17
|
+
function tokenPriceToRatio(tokenPriceUSD, numerairePriceUSD, tokenDecimals = 18, numeraireDecimals = 18) {
|
|
18
|
+
if (tokenPriceUSD <= 0) {
|
|
19
|
+
throw new Error("Token price must be positive");
|
|
20
|
+
}
|
|
21
|
+
if (numerairePriceUSD <= 0) {
|
|
22
|
+
throw new Error("Numeraire price must be positive");
|
|
23
|
+
}
|
|
24
|
+
const ratio = numerairePriceUSD / tokenPriceUSD;
|
|
25
|
+
const decimalAdjustment = 10 ** (tokenDecimals - numeraireDecimals);
|
|
26
|
+
return ratio * decimalAdjustment;
|
|
27
|
+
}
|
|
28
|
+
function ratioToTick(ratio) {
|
|
29
|
+
if (ratio <= 0) {
|
|
30
|
+
throw new Error("Ratio must be positive");
|
|
31
|
+
}
|
|
32
|
+
return Math.log(ratio) / Math.log(1.0001);
|
|
33
|
+
}
|
|
34
|
+
function isToken1(tokenAddress, numeraireAddress) {
|
|
35
|
+
return tokenAddress.toLowerCase() > numeraireAddress.toLowerCase();
|
|
36
|
+
}
|
|
37
|
+
function marketCapToTick(marketCapUSD, tokenSupply, numerairePriceUSD, tokenDecimals = 18, numeraireDecimals = 18, tickSpacing, numeraire) {
|
|
38
|
+
const tokenIsToken1 = !chunkHM25ZMO3_js.isToken0Expected(numeraire);
|
|
39
|
+
const tokenPrice = marketCapToTokenPrice(marketCapUSD, tokenSupply, tokenDecimals);
|
|
40
|
+
const ratio = tokenPriceToRatio(
|
|
41
|
+
tokenPrice,
|
|
42
|
+
numerairePriceUSD,
|
|
43
|
+
tokenDecimals,
|
|
44
|
+
numeraireDecimals
|
|
45
|
+
);
|
|
46
|
+
const rawTick = ratioToTick(ratio);
|
|
47
|
+
let tick = Math.floor(rawTick / tickSpacing) * tickSpacing;
|
|
48
|
+
if (tokenIsToken1) {
|
|
49
|
+
tick = -tick;
|
|
50
|
+
}
|
|
51
|
+
if (tick === 0) tick = 0;
|
|
52
|
+
if (tick < chunkP7KLEPVI_js.MIN_TICK || tick > chunkP7KLEPVI_js.MAX_TICK) {
|
|
53
|
+
throw new Error(
|
|
54
|
+
`Calculated tick ${tick} is out of bounds [${chunkP7KLEPVI_js.MIN_TICK}, ${chunkP7KLEPVI_js.MAX_TICK}]. Market cap ${marketCapUSD.toLocaleString()} may be too extreme for the given parameters.`
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
return tick;
|
|
58
|
+
}
|
|
59
|
+
function marketCapRangeToTicks(marketCapRange, tokenSupply, numerairePriceUSD, tokenDecimals = 18, numeraireDecimals = 18, tickSpacing, numeraire) {
|
|
60
|
+
if (marketCapRange.start <= 0 || marketCapRange.end <= 0) {
|
|
61
|
+
throw new Error("Market cap values must be positive");
|
|
62
|
+
}
|
|
63
|
+
if (marketCapRange.start >= marketCapRange.end) {
|
|
64
|
+
throw new Error("Start market cap must be less than end market cap");
|
|
65
|
+
}
|
|
66
|
+
const tickStart = marketCapToTick(
|
|
67
|
+
marketCapRange.start,
|
|
68
|
+
tokenSupply,
|
|
69
|
+
numerairePriceUSD,
|
|
70
|
+
tokenDecimals,
|
|
71
|
+
numeraireDecimals,
|
|
72
|
+
tickSpacing,
|
|
73
|
+
numeraire
|
|
74
|
+
);
|
|
75
|
+
const tickEnd = marketCapToTick(
|
|
76
|
+
marketCapRange.end,
|
|
77
|
+
tokenSupply,
|
|
78
|
+
numerairePriceUSD,
|
|
79
|
+
tokenDecimals,
|
|
80
|
+
numeraireDecimals,
|
|
81
|
+
tickSpacing,
|
|
82
|
+
numeraire
|
|
83
|
+
);
|
|
84
|
+
const startTick = Math.min(tickStart, tickEnd);
|
|
85
|
+
const endTick = Math.max(tickStart, tickEnd);
|
|
86
|
+
if (startTick === endTick) {
|
|
87
|
+
throw new Error(
|
|
88
|
+
`Market cap range ${marketCapRange.start.toLocaleString()} - ${marketCapRange.end.toLocaleString()} resulted in same tick (${startTick}). Try a wider range or smaller tick spacing.`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
return { startTick, endTick };
|
|
92
|
+
}
|
|
93
|
+
function transformTicksForAuction(rawStartTick, rawEndTick, numeraire) {
|
|
94
|
+
const tokenIsToken1 = !chunkHM25ZMO3_js.isToken0Expected(numeraire);
|
|
95
|
+
if (tokenIsToken1) {
|
|
96
|
+
return {
|
|
97
|
+
startTick: -rawEndTick,
|
|
98
|
+
endTick: -rawStartTick
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return { startTick: rawStartTick, endTick: rawEndTick };
|
|
102
|
+
}
|
|
103
|
+
function applyTickOffsets(pegTick, offsetLower, offsetUpper, numeraire) {
|
|
104
|
+
const tokenIsToken1 = !chunkHM25ZMO3_js.isToken0Expected(numeraire);
|
|
105
|
+
if (tokenIsToken1) {
|
|
106
|
+
return {
|
|
107
|
+
tickLower: pegTick + offsetLower,
|
|
108
|
+
tickUpper: pegTick + offsetUpper
|
|
109
|
+
};
|
|
110
|
+
} else {
|
|
111
|
+
return {
|
|
112
|
+
tickLower: pegTick - offsetUpper,
|
|
113
|
+
tickUpper: pegTick - offsetLower
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function marketCapRangeToTicksForCurve(marketCapLower, marketCapUpper, tokenSupply, numerairePriceUSD, tokenDecimals = 18, numeraireDecimals = 18, tickSpacing, numeraire) {
|
|
118
|
+
if (marketCapLower <= 0 || marketCapUpper <= 0) {
|
|
119
|
+
throw new Error("Market cap values must be positive");
|
|
120
|
+
}
|
|
121
|
+
if (marketCapLower >= marketCapUpper) {
|
|
122
|
+
throw new Error("Lower market cap must be less than upper market cap");
|
|
123
|
+
}
|
|
124
|
+
const tickAtLower = marketCapToTick(
|
|
125
|
+
marketCapLower,
|
|
126
|
+
tokenSupply,
|
|
127
|
+
numerairePriceUSD,
|
|
128
|
+
tokenDecimals,
|
|
129
|
+
numeraireDecimals,
|
|
130
|
+
tickSpacing,
|
|
131
|
+
numeraire
|
|
132
|
+
);
|
|
133
|
+
const tickAtUpper = marketCapToTick(
|
|
134
|
+
marketCapUpper,
|
|
135
|
+
tokenSupply,
|
|
136
|
+
numerairePriceUSD,
|
|
137
|
+
tokenDecimals,
|
|
138
|
+
numeraireDecimals,
|
|
139
|
+
tickSpacing,
|
|
140
|
+
numeraire
|
|
141
|
+
);
|
|
142
|
+
const tickLower = Math.min(tickAtLower, tickAtUpper);
|
|
143
|
+
const tickUpper = Math.max(tickAtLower, tickAtUpper);
|
|
144
|
+
if (tickLower === tickUpper) {
|
|
145
|
+
throw new Error(
|
|
146
|
+
`Market cap range $${marketCapLower.toLocaleString()} - $${marketCapUpper.toLocaleString()} resulted in same tick (${tickLower}). Try a wider range or smaller tick spacing.`
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
return { tickLower, tickUpper };
|
|
150
|
+
}
|
|
151
|
+
function validateMarketCapParameters(marketCap, tokenSupply, tokenDecimals = 18) {
|
|
152
|
+
const warnings = [];
|
|
153
|
+
if (marketCap < 1e3) {
|
|
154
|
+
warnings.push(
|
|
155
|
+
`Market cap $${marketCap.toLocaleString()} is very small. Consider if this is intentional.`
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
if (marketCap > 1e12) {
|
|
159
|
+
warnings.push(
|
|
160
|
+
`Market cap $${marketCap.toLocaleString()} is very large (> $1T). Verify this is correct.`
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
const tokenPrice = marketCapToTokenPrice(marketCap, tokenSupply, tokenDecimals);
|
|
164
|
+
if (tokenPrice < 1e-6) {
|
|
165
|
+
warnings.push(
|
|
166
|
+
`Implied token price $${tokenPrice.toExponential(2)} is very small. This may cause precision issues.`
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
if (tokenPrice > 1e6) {
|
|
170
|
+
warnings.push(
|
|
171
|
+
`Implied token price $${tokenPrice.toLocaleString()} is very large. Verify your token supply and market cap values.`
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
valid: warnings.length === 0,
|
|
176
|
+
warnings
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function tickToMarketCap(tick, tokenSupply, numerairePriceUSD, tokenDecimals = 18, numeraireDecimals = 18, numeraire) {
|
|
180
|
+
const tokenIsToken1 = !chunkHM25ZMO3_js.isToken0Expected(numeraire);
|
|
181
|
+
let adjustedTick = tick;
|
|
182
|
+
if (tokenIsToken1) {
|
|
183
|
+
adjustedTick = -tick;
|
|
184
|
+
}
|
|
185
|
+
const ratio = Math.pow(1.0001, adjustedTick);
|
|
186
|
+
const decimalAdjustment = 10 ** (tokenDecimals - numeraireDecimals);
|
|
187
|
+
const tokenPriceUSD = numerairePriceUSD / (ratio / decimalAdjustment);
|
|
188
|
+
const supplyNum = Number(tokenSupply) / 10 ** tokenDecimals;
|
|
189
|
+
return tokenPriceUSD * supplyNum;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
exports.applyTickOffsets = applyTickOffsets;
|
|
193
|
+
exports.isToken1 = isToken1;
|
|
194
|
+
exports.marketCapRangeToTicks = marketCapRangeToTicks;
|
|
195
|
+
exports.marketCapRangeToTicksForCurve = marketCapRangeToTicksForCurve;
|
|
196
|
+
exports.marketCapToTick = marketCapToTick;
|
|
197
|
+
exports.marketCapToTokenPrice = marketCapToTokenPrice;
|
|
198
|
+
exports.ratioToTick = ratioToTick;
|
|
199
|
+
exports.tickToMarketCap = tickToMarketCap;
|
|
200
|
+
exports.tokenPriceToRatio = tokenPriceToRatio;
|
|
201
|
+
exports.transformTicksForAuction = transformTicksForAuction;
|
|
202
|
+
exports.validateMarketCapParameters = validateMarketCapParameters;
|
|
203
|
+
//# sourceMappingURL=chunk-AS64GWBX.js.map
|
|
204
|
+
//# sourceMappingURL=chunk-AS64GWBX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/marketCapHelpers.ts"],"names":["isToken0Expected","MIN_TICK","MAX_TICK"],"mappings":"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","file":"chunk-AS64GWBX.js","sourcesContent":["/**\n * Market cap conversion utilities for token launches\n *\n * These utilities convert between market cap (USD) and Uniswap ticks\n * following the mathematical relationship:\n *\n * Market Cap (USD) → Token Price (USD) → Ratio (numeraire/token) → Tick\n *\n * Based on reference implementation: plan/priceMultiCurve.py\n */\n\nimport type { Address } from 'viem'\nimport type { MarketCapRange, MarketCapValidationResult } from '../types'\nimport { MIN_TICK, MAX_TICK } from './tickMath'\nimport { isToken0Expected } from './isToken0Expected'\n\n// Re-export types from types.ts for convenience\nexport type { MarketCapRange, MarketCapValidationResult } from '../types'\n\n/**\n * Convert market cap to token price\n *\n * @param marketCapUSD - Market capitalization in USD\n * @param tokenSupply - Total token supply (as bigint with decimals, e.g., parseEther('1000000000'))\n * @param tokenDecimals - Token decimals (default: 18)\n * @returns Price of one token in USD\n *\n * @example\n * ```ts\n * // $1M market cap with 1B tokens (18 decimals)\n * const price = marketCapToTokenPrice(1_000_000, parseEther('1000000000'))\n * // Returns: 0.001 (each token is worth $0.001)\n * ```\n */\nexport function marketCapToTokenPrice(\n marketCapUSD: number,\n tokenSupply: bigint,\n tokenDecimals: number = 18\n): number {\n if (marketCapUSD <= 0) {\n throw new Error('Market cap must be positive')\n }\n if (tokenSupply <= 0n) {\n throw new Error('Token supply must be positive')\n }\n\n // Convert supply from bigint with decimals to human-readable number\n const supplyNum = Number(tokenSupply) / 10 ** tokenDecimals\n return marketCapUSD / supplyNum\n}\n\n/**\n * Convert token price to price ratio (numeraire per token)\n *\n * @param tokenPriceUSD - Price of one token in USD\n * @param numerairePriceUSD - Price of numeraire (e.g., ETH) in USD\n * @param tokenDecimals - Token decimals (default: 18)\n * @param numeraireDecimals - Numeraire decimals (default: 18)\n * @returns Price ratio adjusted for decimals\n *\n * @example\n * ```ts\n * // Token at $0.001, ETH at $3000, both 18 decimals\n * const ratio = tokenPriceToRatio(0.001, 3000, 18, 18)\n * // Returns: 3,000,000 (3M ETH wei per token wei at this ratio)\n * ```\n */\nexport function tokenPriceToRatio(\n tokenPriceUSD: number,\n numerairePriceUSD: number,\n tokenDecimals: number = 18,\n numeraireDecimals: number = 18\n): number {\n if (tokenPriceUSD <= 0) {\n throw new Error('Token price must be positive')\n }\n if (numerairePriceUSD <= 0) {\n throw new Error('Numeraire price must be positive')\n }\n\n // How much numeraire per token (in USD terms first)\n // tokenPriceUSD / numerairePriceUSD = numeraire per token\n const ratio = numerairePriceUSD / tokenPriceUSD\n\n // Adjust for decimal differences\n // Formula: (numeraire / tokenPrice) * (10 ** (assetDecimals - numeraireDecimals))\n const decimalAdjustment = 10 ** (tokenDecimals - numeraireDecimals)\n\n return ratio * decimalAdjustment\n}\n\n/**\n * Convert ratio to tick using Uniswap's formula: tick = log(ratio) / log(1.0001)\n *\n * @param ratio - Price ratio (must be positive)\n * @returns Raw tick value (before spacing adjustment)\n *\n * @example\n * ```ts\n * ratioToTick(1) // Returns: 0\n * ratioToTick(1.0001) // Returns: ~1\n * ratioToTick(Math.pow(1.0001, 1000)) // Returns: ~1000\n * ```\n */\nexport function ratioToTick(ratio: number): number {\n if (ratio <= 0) {\n throw new Error('Ratio must be positive')\n }\n\n // Uniswap tick formula: tick = log(price) / log(1.0001)\n return Math.log(ratio) / Math.log(1.0001)\n}\n\n/**\n * Determine if the new token will be token1 in the Uniswap pair\n *\n * Uniswap orders tokens by address (token0 < token1 in hex comparison).\n * This affects how ticks are interpreted for price calculations.\n *\n * @param tokenAddress - Address of the new token\n * @param numeraireAddress - Address of the numeraire (e.g., WETH)\n * @returns true if token will be token1, false if token0\n *\n * @example\n * ```ts\n * isToken1('0xB000...', '0xA000...') // true (B > A)\n * isToken1('0xA000...', '0xB000...') // false (A < B)\n * ```\n */\nexport function isToken1(\n tokenAddress: string,\n numeraireAddress: string\n): boolean {\n return tokenAddress.toLowerCase() > numeraireAddress.toLowerCase()\n}\n\n/**\n * Complete conversion from market cap to usable tick\n *\n * This is the main entry point combining all conversion steps:\n * 1. Market cap → Token price\n * 2. Token price → Ratio\n * 3. Ratio → Raw tick\n * 4. Raw tick → Nearest usable tick (aligned to spacing)\n * 5. Handle token ordering (negate if token is token1)\n *\n * **Important**: The returned tick includes token ordering adjustment.\n * When the token is token1 (determined from numeraire address), the tick is NEGATED:\n * - Higher market cap → smaller (more negative) tick\n * - Lower market cap → larger (less negative) tick\n *\n * Builders apply additional transformations based on auction type.\n * See builder implementations for auction-specific tick conventions.\n *\n * @param marketCapUSD - Target market cap in USD\n * @param tokenSupply - Total token supply (with decimals, as bigint)\n * @param numerairePriceUSD - Price of numeraire in USD (e.g., ETH = 3000)\n * @param tokenDecimals - Token decimals (default: 18)\n * @param numeraireDecimals - Numeraire decimals (default: 18)\n * @param tickSpacing - Tick spacing of the pool (e.g., 60, 100)\n * @param numeraire - Address of the numeraire token (e.g., WETH). Used to determine token ordering.\n * @returns Nearest usable tick (negated when token is token1)\n *\n * @throws Error if calculated tick is out of bounds [-887272, 887272]\n *\n * @example\n * ```ts\n * // With WETH numeraire on Base:\n * const tick = marketCapToTick(\n * 1_000_000, // $1M market cap\n * parseEther('1000000000'), // 1B tokens\n * 3000, // ETH = $3000\n * 18, 18, // both 18 decimals\n * 60, // tick spacing\n * '0x4200000000000000000000000000000000000006' // WETH address\n * )\n * // Returns negative tick (e.g., -149100) because token will be token1\n * ```\n */\nexport function marketCapToTick(\n marketCapUSD: number,\n tokenSupply: bigint,\n numerairePriceUSD: number,\n tokenDecimals: number = 18,\n numeraireDecimals: number = 18,\n tickSpacing: number,\n numeraire: Address\n): number {\n // Determine token ordering from numeraire address\n const tokenIsToken1 = !isToken0Expected(numeraire)\n\n // Step 1: Market cap → token price\n const tokenPrice = marketCapToTokenPrice(marketCapUSD, tokenSupply, tokenDecimals)\n\n // Step 2: Token price → ratio\n const ratio = tokenPriceToRatio(\n tokenPrice,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals\n )\n\n // Step 3: Ratio → raw tick\n const rawTick = ratioToTick(ratio)\n\n // Step 4: Round to tick spacing using floor division\n let tick = Math.floor(rawTick / tickSpacing) * tickSpacing\n\n // Step 5: Handle token ordering\n // When token is token1: negate tick (V4 multicurve convention)\n // When token is token0: keep tick as-is\n // Note: V3 static auctions handle this differently and negate at the builder level\n if (tokenIsToken1) {\n tick = -tick\n }\n\n // Normalize -0 to 0 (JavaScript quirk: -0 !== 0 in Object.is)\n if (tick === 0) tick = 0\n\n // Step 6: Validate bounds\n if (tick < MIN_TICK || tick > MAX_TICK) {\n throw new Error(\n `Calculated tick ${tick} is out of bounds [${MIN_TICK}, ${MAX_TICK}]. ` +\n `Market cap ${marketCapUSD.toLocaleString()} may be too extreme for the given parameters.`\n )\n }\n\n return tick\n}\n\n/**\n * Convert a market cap range to tick range\n *\n * Used for V3 Static Auctions and V4 Dynamic Auctions where you need\n * a start and end tick for the bonding curve.\n *\n * **Important**: This function applies token ordering via marketCapToTick\n * (negates ticks when token is token1), then normalizes so startTick < endTick.\n *\n * Due to the negation + normalization:\n * - When token is token1: both ticks are NEGATIVE\n * - startTick = more negative (corresponds to LOWER market cap)\n * - endTick = less negative (corresponds to HIGHER market cap)\n * - When token is token0: both ticks are POSITIVE\n * - startTick = smaller positive (corresponds to LOWER market cap)\n * - endTick = larger positive (corresponds to HIGHER market cap)\n *\n * Builders apply additional transformations based on auction type semantics.\n * See builder implementations for auction-specific tick handling.\n *\n * @param marketCapRange - Start and end market caps in USD (start < end required)\n * @param tokenSupply - Total token supply (with decimals)\n * @param numerairePriceUSD - Price of numeraire in USD\n * @param tokenDecimals - Token decimals (default: 18)\n * @param numeraireDecimals - Numeraire decimals (default: 18)\n * @param tickSpacing - Tick spacing\n * @param numeraire - Address of the numeraire token. Used to determine token ordering.\n * @returns Object with startTick and endTick (startTick < endTick numerically)\n *\n * @throws Error if start >= end market cap or if ticks are out of bounds\n *\n * @example\n * ```ts\n * // With WETH numeraire on Base:\n * const { startTick, endTick } = marketCapRangeToTicks(\n * { start: 500_000, end: 50_000_000 }, // $500k → $50M\n * parseEther('1000000000'),\n * 3000,\n * 18, 18,\n * 60,\n * '0x4200000000000000000000000000000000000006' // WETH address\n * )\n * // Returns: startTick=-156080 (500k), endTick=-110020 (50M)\n * // Note: startTick < endTick, but startTick corresponds to LOWER market cap\n * ```\n */\nexport function marketCapRangeToTicks(\n marketCapRange: MarketCapRange,\n tokenSupply: bigint,\n numerairePriceUSD: number,\n tokenDecimals: number = 18,\n numeraireDecimals: number = 18,\n tickSpacing: number,\n numeraire: Address\n): { startTick: number; endTick: number } {\n if (marketCapRange.start <= 0 || marketCapRange.end <= 0) {\n throw new Error('Market cap values must be positive')\n }\n\n if (marketCapRange.start >= marketCapRange.end) {\n throw new Error('Start market cap must be less than end market cap')\n }\n\n const tickStart = marketCapToTick(\n marketCapRange.start,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n numeraire\n )\n\n const tickEnd = marketCapToTick(\n marketCapRange.end,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n numeraire\n )\n\n // Ensure startTick < endTick (Uniswap requirement)\n const startTick = Math.min(tickStart, tickEnd)\n const endTick = Math.max(tickStart, tickEnd)\n\n if (startTick === endTick) {\n throw new Error(\n `Market cap range ${marketCapRange.start.toLocaleString()} - ${marketCapRange.end.toLocaleString()} ` +\n `resulted in same tick (${startTick}). Try a wider range or smaller tick spacing.`\n )\n }\n\n return { startTick, endTick }\n}\n\n/**\n * Transform ticks from marketCapRangeToTicks format to auction contract format.\n *\n * For range-based auctions (Static V3, Dynamic V4), the contracts expect ticks\n * in a specific format based on token ordering. This function handles the\n * negation and swapping required when the token is token1.\n *\n * @param rawStartTick - Start tick from marketCapRangeToTicks (lower market cap)\n * @param rawEndTick - End tick from marketCapRangeToTicks (higher market cap)\n * @param numeraire - Address of the numeraire token. Used to determine token ordering.\n * @returns Transformed ticks ready for auction contract\n *\n * @example\n * ```ts\n * const { startTick: raw1, endTick: raw2 } = marketCapRangeToTicks(...)\n * const { startTick, endTick } = transformTicksForAuction(raw1, raw2, WETH_ADDRESS)\n * ```\n */\nexport function transformTicksForAuction(\n rawStartTick: number,\n rawEndTick: number,\n numeraire: Address\n): { startTick: number; endTick: number } {\n const tokenIsToken1 = !isToken0Expected(numeraire)\n\n if (tokenIsToken1) {\n // For token1: negate and swap to satisfy contract requirements\n // Raw ticks are negative, negating makes them positive, swapping maintains startTick < endTick\n return {\n startTick: -rawEndTick,\n endTick: -rawStartTick,\n }\n }\n\n // For token0: use raw ticks as-is\n return { startTick: rawStartTick, endTick: rawEndTick }\n}\n\n/**\n * Apply curvature offsets to a peg tick for Multicurve positions\n *\n * Multicurve positions are defined relative to a \"peg\" tick (starting market cap).\n * Offsets define how far above/below the peg each curve extends.\n *\n * Token ordering (determined from numeraire address) affects how offsets are applied:\n * - token1: tickLower = pegTick + offsetLower, tickUpper = pegTick + offsetUpper\n * - token0: tickLower = pegTick - offsetUpper, tickUpper = pegTick - offsetLower\n *\n * @param pegTick - Base tick calculated from starting market cap\n * @param offsetLower - Lower offset in ticks (distance from peg)\n * @param offsetUpper - Upper offset in ticks (distance from peg)\n * @param numeraire - Address of the numeraire token. Used to determine token ordering.\n * @returns Tick range with offsets applied\n *\n * @example\n * ```ts\n * // Peg at -200000, curve from peg to 10000 ticks above (WETH numeraire)\n * const { tickLower, tickUpper } = applyTickOffsets(\n * -200000, 0, 10000,\n * '0x4200000000000000000000000000000000000006'\n * )\n * // Returns: { tickLower: -200000, tickUpper: -190000 }\n * ```\n */\nexport function applyTickOffsets(\n pegTick: number,\n offsetLower: number,\n offsetUpper: number,\n numeraire: Address\n): { tickLower: number; tickUpper: number } {\n const tokenIsToken1 = !isToken0Expected(numeraire)\n\n if (tokenIsToken1) {\n // For token1, add offsets directly\n return {\n tickLower: pegTick + offsetLower,\n tickUpper: pegTick + offsetUpper,\n }\n } else {\n // For token0, subtract offsets in reverse order\n return {\n tickLower: pegTick - offsetUpper,\n tickUpper: pegTick - offsetLower,\n }\n }\n}\n\n/**\n * Convert a market cap range to tick range for Multicurve curves.\n *\n * Unlike range-based auctions, Multicurve curves use ticks directly without\n * the negate-and-swap transformation. This function converts market cap\n * bounds to the appropriate tick bounds based on token ordering.\n *\n * @param marketCapLower - Lower market cap bound in USD\n * @param marketCapUpper - Upper market cap bound in USD\n * @param tokenSupply - Total token supply (with decimals)\n * @param numerairePriceUSD - Price of numeraire in USD\n * @param tokenDecimals - Token decimals (default: 18)\n * @param numeraireDecimals - Numeraire decimals (default: 18)\n * @param tickSpacing - Tick spacing\n * @param numeraire - Address of the numeraire token\n * @returns Tick range { tickLower, tickUpper } where tickLower < tickUpper\n *\n * @example\n * ```ts\n * const { tickLower, tickUpper } = marketCapRangeToTicksForCurve(\n * 500_000, // $500k lower\n * 1_000_000, // $1M upper\n * parseEther('1000000000'),\n * 3000,\n * 18, 18,\n * 60,\n * WETH_ADDRESS\n * )\n * ```\n */\nexport function marketCapRangeToTicksForCurve(\n marketCapLower: number,\n marketCapUpper: number,\n tokenSupply: bigint,\n numerairePriceUSD: number,\n tokenDecimals: number = 18,\n numeraireDecimals: number = 18,\n tickSpacing: number,\n numeraire: Address\n): { tickLower: number; tickUpper: number } {\n if (marketCapLower <= 0 || marketCapUpper <= 0) {\n throw new Error('Market cap values must be positive')\n }\n\n if (marketCapLower >= marketCapUpper) {\n throw new Error('Lower market cap must be less than upper market cap')\n }\n\n // Get ticks for both bounds\n const tickAtLower = marketCapToTick(\n marketCapLower,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n numeraire\n )\n\n const tickAtUpper = marketCapToTick(\n marketCapUpper,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n numeraire\n )\n\n // Ensure tickLower < tickUpper (may need to swap depending on token ordering)\n const tickLower = Math.min(tickAtLower, tickAtUpper)\n const tickUpper = Math.max(tickAtLower, tickAtUpper)\n\n if (tickLower === tickUpper) {\n throw new Error(\n `Market cap range $${marketCapLower.toLocaleString()} - $${marketCapUpper.toLocaleString()} ` +\n `resulted in same tick (${tickLower}). Try a wider range or smaller tick spacing.`\n )\n }\n\n return { tickLower, tickUpper }\n}\n\n/**\n * Validate market cap parameters and return warnings for unusual values\n *\n * This doesn't prevent execution but helps catch potential mistakes:\n * - Very small market caps (< $1,000)\n * - Very large market caps (> $1 trillion)\n * - Extreme token prices (< $0.000001 or > $1M)\n *\n * @param marketCap - Market cap value to validate\n * @param tokenSupply - Token supply (with decimals)\n * @param tokenDecimals - Token decimals (default: 18)\n * @returns Validation result with warnings array\n *\n * @example\n * ```ts\n * const result = validateMarketCapParameters(500, parseEther('1000000'))\n * if (result.warnings.length > 0) {\n * console.warn('Warnings:', result.warnings)\n * }\n * ```\n */\nexport function validateMarketCapParameters(\n marketCap: number,\n tokenSupply: bigint,\n tokenDecimals: number = 18\n): MarketCapValidationResult {\n const warnings: string[] = []\n\n // Check for unreasonably small market caps\n if (marketCap < 1000) {\n warnings.push(\n `Market cap $${marketCap.toLocaleString()} is very small. Consider if this is intentional.`\n )\n }\n\n // Check for unreasonably large market caps\n if (marketCap > 1_000_000_000_000) {\n warnings.push(\n `Market cap $${marketCap.toLocaleString()} is very large (> $1T). Verify this is correct.`\n )\n }\n\n // Calculate implied token price\n const tokenPrice = marketCapToTokenPrice(marketCap, tokenSupply, tokenDecimals)\n\n // Check for extremely small token prices\n if (tokenPrice < 0.000001) {\n warnings.push(\n `Implied token price $${tokenPrice.toExponential(2)} is very small. ` +\n `This may cause precision issues.`\n )\n }\n\n // Check for extremely large token prices\n if (tokenPrice > 1_000_000) {\n warnings.push(\n `Implied token price $${tokenPrice.toLocaleString()} is very large. ` +\n `Verify your token supply and market cap values.`\n )\n }\n\n return {\n valid: warnings.length === 0,\n warnings,\n }\n}\n\n/**\n * Calculate market cap from a tick (reverse conversion)\n *\n * Useful for displaying what market cap a given tick represents.\n *\n * @param tick - Uniswap tick value\n * @param tokenSupply - Total token supply (with decimals)\n * @param numerairePriceUSD - Price of numeraire in USD\n * @param tokenDecimals - Token decimals (default: 18)\n * @param numeraireDecimals - Numeraire decimals (default: 18)\n * @param numeraire - Address of the numeraire token. Used to determine token ordering.\n * @returns Market cap in USD\n *\n * @example\n * ```ts\n * const marketCap = tickToMarketCap(\n * -192100,\n * parseEther('1000000000'),\n * 3000,\n * 18, 18,\n * '0x4200000000000000000000000000000000000006' // WETH address\n * )\n * ```\n */\nexport function tickToMarketCap(\n tick: number,\n tokenSupply: bigint,\n numerairePriceUSD: number,\n tokenDecimals: number = 18,\n numeraireDecimals: number = 18,\n numeraire: Address\n): number {\n const tokenIsToken1 = !isToken0Expected(numeraire)\n\n // Reverse the token ordering adjustment\n // When token IS token1, the tick was negated, so negate again to reverse\n let adjustedTick = tick\n if (tokenIsToken1) {\n adjustedTick = -tick\n }\n\n // Tick → ratio (reverse of ratioToTick)\n const ratio = Math.pow(1.0001, adjustedTick)\n\n // Ratio → token price (reverse of tokenPriceToRatio)\n // ratio = (numerairePriceUSD / tokenPriceUSD) * 10^(tokenDecimals - numeraireDecimals)\n // tokenPriceUSD = numerairePriceUSD / (ratio / decimalAdjustment)\n const decimalAdjustment = 10 ** (tokenDecimals - numeraireDecimals)\n const tokenPriceUSD = numerairePriceUSD / (ratio / decimalAdjustment)\n\n // Token price → market cap (reverse of marketCapToTokenPrice)\n const supplyNum = Number(tokenSupply) / 10 ** tokenDecimals\n return tokenPriceUSD * supplyNum\n}\n\n"]}
|