four-flap-meme-sdk 2.2.2 → 2.2.3
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/README.en.md +41 -6
- package/README.md +31 -0
- package/README.zh-CN.md +41 -6
- package/dist/__tests__/subpath-exports.test.d.ts +1 -0
- package/dist/__tests__/subpath-exports.test.js +64 -0
- package/dist/abis/common.d.ts +85 -0
- package/dist/abis/common.js +264 -0
- package/dist/abis/contracts/TaxToken.json +969 -0
- package/dist/abis/contracts/TokenManager2.json +136 -0
- package/dist/abis/contracts/index.d.ts +5 -0
- package/dist/abis/contracts/index.js +5 -0
- package/dist/abis/flap/index.d.ts +3 -0
- package/dist/abis/flap/index.js +3 -0
- package/dist/abis/flap/portal-events.d.ts +6 -0
- package/dist/abis/flap/portal-events.js +17 -0
- package/dist/abis/flap/portal.d.ts +6 -0
- package/dist/abis/flap/portal.js +37 -0
- package/dist/abis/flap/vault.d.ts +171 -0
- package/dist/abis/flap/vault.js +91 -0
- package/dist/abis/index.d.ts +8 -0
- package/dist/abis/index.js +11 -0
- package/dist/bundle-core/__tests__/config-helpers.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
- package/dist/bundle-core/__tests__/facade-parity.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
- package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
- package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
- package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
- package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
- package/dist/bundle-core/config-helpers.d.ts +36 -0
- package/dist/bundle-core/config-helpers.js +57 -0
- package/dist/bundle-core/errors.d.ts +50 -0
- package/dist/bundle-core/errors.js +35 -0
- package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
- package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
- package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
- package/dist/bundle-core/four-meme/core-helpers.js +40 -0
- package/dist/bundle-core/four-meme/core.d.ts +4 -0
- package/dist/bundle-core/four-meme/core.js +515 -0
- package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
- package/dist/bundle-core/four-meme/pancake-proxy.js +679 -0
- package/dist/bundle-core/four-meme/private.d.ts +27 -0
- package/dist/bundle-core/four-meme/private.js +465 -0
- package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
- package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
- package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
- package/dist/bundle-core/four-meme/swap-buy-first.js +493 -0
- package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
- package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
- package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
- package/dist/bundle-core/four-meme/swap-internal.js +18 -0
- package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +27 -0
- package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
- package/dist/bundle-core/four-meme/swap.d.ts +17 -0
- package/dist/bundle-core/four-meme/swap.js +505 -0
- package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
- package/dist/bundle-core/four-meme/types/buy-first.js +1 -0
- package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
- package/dist/bundle-core/four-meme/types/core-flow.js +1 -0
- package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
- package/dist/bundle-core/four-meme/types/index.js +1 -0
- package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
- package/dist/bundle-core/four-meme/types/swap-internal.js +1 -0
- package/dist/bundle-core/four-meme/types.d.ts +1 -0
- package/dist/bundle-core/four-meme/types.js +1 -0
- package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
- package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
- package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
- package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
- package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
- package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
- package/dist/bundle-core/index.d.ts +8 -0
- package/dist/bundle-core/index.js +8 -0
- package/dist/bundle-core/internal.d.ts +21 -0
- package/dist/bundle-core/internal.js +182 -0
- package/dist/bundle-core/sign-context-helpers.d.ts +25 -0
- package/dist/bundle-core/sign-context-helpers.js +67 -0
- package/dist/bundle-core/submit.d.ts +293 -0
- package/dist/bundle-core/submit.js +727 -0
- package/dist/bundle-core/types/index.d.ts +8 -0
- package/dist/bundle-core/types/index.js +1 -0
- package/dist/bundle-core/types.d.ts +1 -0
- package/dist/bundle-core/types.js +1 -0
- package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
- package/dist/chains/bsc/four/approve-tokenmanager.js +1 -113
- package/dist/chains/bsc/four/config.d.ts +5 -67
- package/dist/chains/bsc/four/config.js +2 -114
- package/dist/chains/bsc/four/core.d.ts +1 -4
- package/dist/chains/bsc/four/core.js +1 -592
- package/dist/chains/bsc/four/index.d.ts +6 -6
- package/dist/chains/bsc/four/index.js +6 -6
- package/dist/chains/bsc/four/internal.d.ts +2 -46
- package/dist/chains/bsc/four/internal.js +2 -239
- package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
- package/dist/chains/bsc/four/pancake-proxy.js +1 -687
- package/dist/chains/bsc/four/private.d.ts +1 -27
- package/dist/chains/bsc/four/private.js +1 -477
- package/dist/chains/bsc/four/submit.d.ts +2 -315
- package/dist/chains/bsc/four/submit.js +2 -752
- package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
- package/dist/chains/bsc/four/swap-buy-first.js +2 -507
- package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
- package/dist/chains/bsc/four/swap-internal.js +1 -18
- package/dist/chains/bsc/four/swap.d.ts +2 -144
- package/dist/chains/bsc/four/swap.js +2 -766
- package/dist/chains/bsc/four/types.d.ts +1 -476
- package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
- package/dist/chains/bsc/four/utils-disperse.js +1 -0
- package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
- package/dist/chains/bsc/four/utils-pairwise.js +1 -0
- package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
- package/dist/chains/bsc/four/utils-sweep.js +1 -0
- package/dist/chains/bsc/four/utils.d.ts +5 -18
- package/dist/chains/bsc/four/utils.js +5 -1552
- package/dist/chains/bsc/iro.d.ts +5 -0
- package/dist/chains/bsc/iro.js +4 -0
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +159 -0
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +117 -0
- package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
- package/dist/chains/bsc/pancake/bundle-buy-first.js +97 -212
- package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
- package/dist/chains/bsc/pancake/bundle-swap-helpers.js +565 -0
- package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
- package/dist/chains/bsc/pancake/bundle-swap.js +114 -726
- package/dist/chains/bsc/pancake/index.d.ts +4 -2
- package/dist/chains/bsc/pancake/index.js +1 -3
- package/dist/chains/bsc/platforms/iro/factory.d.ts +2 -2
- package/dist/chains/bsc/platforms/iro/factory.js +3 -1
- package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
- package/dist/chains/bsc/platforms/iro/index.js +3 -3
- package/dist/chains/bsc/platforms/iro/pool.js +31 -10
- package/dist/chains/bsc/platforms/iro/token.js +4 -1
- package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
- package/dist/chains/eni/batch-router/transfer.js +55 -25
- package/dist/chains/eni/batch-router/utils.js +32 -6
- package/dist/chains/eni/bundler/sign.js +5 -6
- package/dist/chains/eni/bundler/submit.js +1 -4
- package/dist/chains/eni/constants.js +1 -1
- package/dist/chains/eni/flat-aliases.d.ts +10 -0
- package/dist/chains/eni/flat-aliases.js +8 -0
- package/dist/chains/eni/index.d.ts +2 -1
- package/dist/chains/eni/index.js +1 -0
- package/dist/chains/eni/platforms/daoaas/create.js +2 -2
- package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
- package/dist/chains/eni/platforms/daoaas/index.js +3 -3
- package/dist/chains/eni/platforms/daoaas/meta.js +9 -6
- package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -44
- package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
- package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
- package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
- package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
- package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -46
- package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
- package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
- package/dist/chains/eni/platforms/iro/factory.d.ts +2 -2
- package/dist/chains/eni/platforms/iro/factory.js +3 -1
- package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
- package/dist/chains/eni/platforms/iro/index.js +4 -4
- package/dist/chains/eni/platforms/iro/pool.js +90 -26
- package/dist/chains/eni/platforms/iro/token.js +107 -31
- package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
- package/dist/chains/eni/submit.d.ts +43 -0
- package/dist/chains/eni/submit.js +286 -0
- package/dist/chains/index.d.ts +13 -0
- package/dist/chains/index.js +13 -0
- package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
- package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -21
- package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
- package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
- package/dist/chains/xlayer/eip7702/bundle-create.js +93 -59
- package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
- package/dist/chains/xlayer/eip7702/bundle-sell.js +29 -111
- package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
- package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -245
- package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
- package/dist/chains/xlayer/eip7702/constants.js +3 -21
- package/dist/chains/xlayer/eip7702/flat-aliases.d.ts +13 -0
- package/dist/chains/xlayer/eip7702/flat-aliases.js +10 -0
- package/dist/chains/xlayer/eip7702/index.d.ts +28 -46
- package/dist/chains/xlayer/eip7702/index.js +28 -81
- package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +79 -0
- package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +1 -0
- package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
- package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +63 -307
- package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
- package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +57 -0
- package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
- package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
- package/dist/chains/xlayer/eip7702/utils.js +23 -28
- package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +148 -0
- package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
- package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
- package/dist/chains/xlayer/eip7702/volume.js +89 -164
- package/dist/chains/xlayer/eoa/constants.js +1 -1
- package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
- package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
- package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
- package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
- package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +66 -299
- package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
- package/dist/chains/xlayer/eoa/eoa-wash-volume.js +18 -23
- package/dist/chains/xlayer/eoa/index.d.ts +10 -6
- package/dist/chains/xlayer/eoa/index.js +8 -23
- package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
- package/dist/chains/xlayer/eoa/router-manager.js +3 -3
- package/dist/chains/xlayer/eoa/types.d.ts +2 -2
- package/dist/chains/xlayer/eoa/types.js +1 -3
- package/dist/chains/xlayer/index.d.ts +3 -2
- package/dist/chains/xlayer/index.js +4 -7
- package/dist/contracts/helper3.d.ts +20 -5
- package/dist/contracts/helper3.js +56 -20
- package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
- package/dist/contracts/tm-bundle-helpers.js +72 -0
- package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
- package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -113
- package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -67
- package/dist/contracts/tm-bundle-merkle/config.js +2 -114
- package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
- package/dist/contracts/tm-bundle-merkle/core.js +1 -591
- package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
- package/dist/contracts/tm-bundle-merkle/index.js +5 -5
- package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -46
- package/dist/contracts/tm-bundle-merkle/internal.js +2 -238
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -686
- package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
- package/dist/contracts/tm-bundle-merkle/private.js +1 -476
- package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
- package/dist/contracts/tm-bundle-merkle/submit.js +3 -928
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -506
- package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
- package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
- package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
- package/dist/contracts/tm-bundle-merkle/swap.js +2 -764
- package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
- package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
- package/dist/contracts/tm-bundle-merkle/utils.d.ts +6 -18
- package/dist/contracts/tm-bundle-merkle/utils.js +6 -1501
- package/dist/contracts/tm-bundle.d.ts +3 -51
- package/dist/contracts/tm-bundle.js +108 -177
- package/dist/contracts/tm.d.ts +3 -2
- package/dist/contracts/tm.js +37 -32
- package/dist/contracts/tm1.js +9 -4
- package/dist/contracts/tm2.js +9 -4
- package/dist/dex/direct-router-helpers.d.ts +264 -0
- package/dist/dex/direct-router-helpers.js +539 -0
- package/dist/dex/direct-router.d.ts +3 -125
- package/dist/dex/direct-router.js +237 -666
- package/dist/dex/types.d.ts +81 -0
- package/dist/dex/types.js +1 -0
- package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
- package/dist/exports/root-bundle-and-tooling.js +30 -0
- package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
- package/dist/exports/root-eni-and-bsc-iro.js +66 -0
- package/dist/exports/root-foundations.d.ts +35 -0
- package/dist/exports/root-foundations.js +70 -0
- package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
- package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
- package/dist/flap/index.d.ts +10 -0
- package/dist/flap/index.js +8 -0
- package/dist/flows/create.d.ts +2 -1
- package/dist/flows/create.js +6 -6
- package/dist/flows/index.d.ts +1 -0
- package/dist/flows/index.js +1 -0
- package/dist/index.d.ts +20 -85
- package/dist/index.js +20 -215
- package/dist/merkle/index.d.ts +12 -0
- package/dist/merkle/index.js +11 -0
- package/dist/shared/abis/common.d.ts +2 -83
- package/dist/shared/abis/common.js +2 -252
- package/dist/shared/abis/index.d.ts +5 -6
- package/dist/shared/abis/index.js +5 -7
- package/dist/shared/clients/blockrazor.js +39 -25
- package/dist/shared/clients/club48.d.ts +2 -2
- package/dist/shared/clients/club48.js +34 -29
- package/dist/shared/clients/emitservice.js +2 -0
- package/dist/shared/clients/four.d.ts +21 -6
- package/dist/shared/clients/four.js +29 -24
- package/dist/shared/clients/index.d.ts +8 -0
- package/dist/shared/clients/index.js +8 -0
- package/dist/shared/clients/merkle.js +27 -34
- package/dist/shared/constants/addresses.d.ts +1 -1
- package/dist/shared/constants/addresses.js +11 -2
- package/dist/shared/constants/chains.d.ts +1 -1
- package/dist/shared/constants/chains.js +1 -1
- package/dist/shared/constants/gas.d.ts +1 -1
- package/dist/shared/constants/gas.js +2 -6
- package/dist/shared/constants/index.d.ts +3 -0
- package/dist/shared/constants/index.js +1 -0
- package/dist/shared/constants/quote.d.ts +30 -0
- package/dist/shared/constants/quote.js +37 -0
- package/dist/shared/flap/abi.js +1 -1
- package/dist/shared/flap/constants.d.ts +1 -2
- package/dist/shared/flap/constants.js +2 -3
- package/dist/shared/flap/curve.js +3 -0
- package/dist/shared/flap/errors.d.ts +1 -4
- package/dist/shared/flap/errors.js +20 -1
- package/dist/shared/flap/index.d.ts +5 -4
- package/dist/shared/flap/index.js +5 -4
- package/dist/shared/flap/meta.d.ts +22 -18
- package/dist/shared/flap/meta.js +12 -17
- package/dist/shared/flap/permit.js +5 -2
- package/dist/shared/flap/pinata.d.ts +22 -6
- package/dist/shared/flap/pinata.js +21 -26
- package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
- package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
- package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
- package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
- package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
- package/dist/shared/flap/portal-bundle-merkle/core.js +86 -278
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.d.ts +7 -2
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +101 -206
- package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +100 -92
- package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
- package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
- package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
- package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +66 -247
- package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
- package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +2 -71
- package/dist/shared/flap/portal-bundle-merkle/swap.js +103 -410
- package/dist/shared/flap/portal-bundle-merkle/types.d.ts +83 -9
- package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
- package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
- package/dist/shared/flap/portal-bundle.js +55 -56
- package/dist/shared/flap/portal-create-token.d.ts +77 -0
- package/dist/shared/flap/portal-create-token.js +214 -0
- package/dist/shared/flap/portal.d.ts +14 -3
- package/dist/shared/flap/portal.js +50 -25
- package/dist/shared/flap/vanity.d.ts +1 -5
- package/dist/shared/flap/vanity.js +6 -17
- package/dist/shared/flap/vault.d.ts +17 -124
- package/dist/shared/flap/vault.js +67 -148
- package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
- package/dist/shared/foundation/dex/v3-path.js +35 -0
- package/dist/shared/foundation/gas/bundle-gas.d.ts +49 -0
- package/dist/shared/foundation/gas/bundle-gas.js +93 -0
- package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
- package/dist/shared/foundation/gas/profit-hop.js +72 -0
- package/dist/shared/foundation/index.d.ts +13 -0
- package/dist/shared/foundation/index.js +12 -0
- package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
- package/dist/shared/foundation/nonce/nonce-manager.js +183 -0
- package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
- package/dist/shared/foundation/normalize-unknown.js +29 -0
- package/dist/shared/foundation/sdk-logger.d.ts +13 -0
- package/dist/shared/foundation/sdk-logger.js +12 -0
- package/dist/shared/foundation/tx/build-request.d.ts +17 -0
- package/dist/shared/foundation/tx/build-request.js +25 -0
- package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
- package/dist/shared/foundation/tx/sign-batch.js +26 -0
- package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
- package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
- package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
- package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
- package/dist/shared/foundation/types/erc20.d.ts +65 -0
- package/dist/shared/foundation/types/erc20.js +1 -0
- package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
- package/dist/shared/foundation/types/holders-maker.js +1 -0
- package/dist/shared/foundation/types/index.d.ts +7 -0
- package/dist/shared/foundation/types/index.js +1 -0
- package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
- package/dist/shared/foundation/types/lp-inspect.js +1 -0
- package/dist/shared/foundation/types/multicall.d.ts +5 -0
- package/dist/shared/foundation/types/multicall.js +1 -0
- package/dist/shared/foundation/types/private-sale.d.ts +35 -0
- package/dist/shared/foundation/types/private-sale.js +1 -0
- package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
- package/dist/shared/foundation/types/quote-helpers.js +1 -0
- package/dist/shared/four/tax-token.d.ts +1 -1
- package/dist/shared/four/tax-token.js +27 -7
- package/dist/shared/index.d.ts +6 -0
- package/dist/shared/index.js +4 -0
- package/dist/types/errors.d.ts +27 -0
- package/dist/types/errors.js +34 -0
- package/dist/utils/airdrop-sweep.d.ts +4 -76
- package/dist/utils/airdrop-sweep.js +42 -55
- package/dist/utils/bundle-helpers.d.ts +9 -243
- package/dist/utils/bundle-helpers.js +10 -584
- package/dist/utils/constants.d.ts +5 -61
- package/dist/utils/constants.js +5 -80
- package/dist/utils/contract-factory.d.ts +2 -4
- package/dist/utils/contract-factory.js +25 -18
- package/dist/utils/erc20.d.ts +7 -89
- package/dist/utils/erc20.js +94 -125
- package/dist/utils/errors.d.ts +12 -1
- package/dist/utils/errors.js +60 -1
- package/dist/utils/holders-maker/addresses.d.ts +12 -0
- package/dist/utils/holders-maker/addresses.js +15 -0
- package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
- package/dist/utils/holders-maker/buy-tx.js +278 -0
- package/dist/utils/holders-maker/constants.d.ts +6 -0
- package/dist/utils/holders-maker/constants.js +7 -0
- package/dist/utils/holders-maker/disperse.d.ts +18 -0
- package/dist/utils/holders-maker/disperse.js +90 -0
- package/dist/utils/holders-maker/routing.d.ts +4 -0
- package/dist/utils/holders-maker/routing.js +45 -0
- package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
- package/dist/utils/holders-maker/transfer-tx.js +67 -0
- package/dist/utils/holders-maker-helpers.d.ts +9 -0
- package/dist/utils/holders-maker-helpers.js +9 -0
- package/dist/utils/holders-maker.d.ts +2 -138
- package/dist/utils/holders-maker.js +26 -661
- package/dist/utils/hop-chains.d.ts +35 -0
- package/dist/utils/hop-chains.js +215 -0
- package/dist/utils/lp-inspect-helpers.d.ts +9 -0
- package/dist/utils/lp-inspect-helpers.js +109 -0
- package/dist/utils/lp-inspect.d.ts +2 -112
- package/dist/utils/lp-inspect.js +73 -223
- package/dist/utils/mpcExclusive.d.ts +2 -5
- package/dist/utils/mpcExclusive.js +4 -3
- package/dist/utils/private-sale.d.ts +2 -58
- package/dist/utils/private-sale.js +4 -15
- package/dist/utils/provider-factory.d.ts +4 -0
- package/dist/utils/provider-factory.js +10 -0
- package/dist/utils/quote-helpers.d.ts +4 -45
- package/dist/utils/quote-helpers.js +17 -74
- package/dist/utils/stealth-transfer.d.ts +2 -28
- package/dist/utils/stealth-transfer.js +31 -15
- package/dist/utils/swap-helpers.d.ts +2 -15
- package/dist/utils/swap-helpers.js +6 -11
- package/dist/utils/types/airdrop-sweep.d.ts +1 -0
- package/dist/utils/types/airdrop-sweep.js +1 -0
- package/dist/utils/types/contract-factory.d.ts +1 -0
- package/dist/utils/types/contract-factory.js +1 -0
- package/dist/utils/types/erc20.d.ts +1 -0
- package/dist/utils/types/erc20.js +1 -0
- package/dist/utils/types/errors.d.ts +1 -0
- package/dist/utils/types/errors.js +1 -0
- package/dist/utils/types/holders-maker.d.ts +1 -0
- package/dist/utils/types/holders-maker.js +1 -0
- package/dist/utils/types/hop-chains.d.ts +8 -0
- package/dist/utils/types/hop-chains.js +1 -0
- package/dist/utils/types/index.d.ts +13 -0
- package/dist/utils/types/index.js +1 -0
- package/dist/utils/types/lp-inspect.d.ts +1 -0
- package/dist/utils/types/lp-inspect.js +1 -0
- package/dist/utils/types/mpc-exclusive.d.ts +5 -0
- package/dist/utils/types/mpc-exclusive.js +1 -0
- package/dist/utils/types/private-sale.d.ts +1 -0
- package/dist/utils/types/private-sale.js +1 -0
- package/dist/utils/types/quote-helpers.d.ts +1 -0
- package/dist/utils/types/quote-helpers.js +1 -0
- package/dist/utils/types/stealth-transfer.d.ts +44 -0
- package/dist/utils/types/stealth-transfer.js +1 -0
- package/dist/utils/types/wallet.d.ts +25 -0
- package/dist/utils/types/wallet.js +1 -0
- package/dist/utils/wallet.d.ts +2 -25
- package/dist/utils/wallet.js +13 -10
- package/dist/vanity/index.d.ts +5 -0
- package/dist/vanity/index.js +5 -0
- package/package.json +160 -4
- package/src/abis/contracts/TaxToken.json +969 -0
- package/src/abis/contracts/TokenManager.json +836 -0
- package/src/abis/contracts/TokenManager2.json +136 -0
- package/src/abis/contracts/TokenManagerHelper3.json +993 -0
- package/dist/shared/abis/TaxToken.json +0 -105
- package/dist/shared/abis/TokenManager2.json +0 -60
- /package/dist/{shared/abis → abis/contracts}/TokenManager.json +0 -0
- /package/dist/{shared/abis → abis/contracts}/TokenManagerHelper3.json +0 -0
|
@@ -1,92 +1,15 @@
|
|
|
1
|
-
import { ethers, Wallet, Contract, Interface } from 'ethers';
|
|
2
|
-
import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
|
|
3
|
-
import { ADDRESSES, ZERO_ADDRESS } from '../../../utils/constants.js';
|
|
4
|
-
import { GAS_LIMITS, CHAINS } from '../../constants/index.js';
|
|
5
|
-
import { MULTICALL3_ABI, V2_ROUTER_QUOTE_ABI } from '../../abis/common.js';
|
|
6
|
-
import { FLAP_PORTAL_ADDRESSES, FLAP_ORIGINAL_PORTAL_ADDRESSES } from '../constants.js';
|
|
7
|
-
import { buildNewTokenV6WithVaultParams, VAULT_PORTAL_ADDRESSES, VAULT_PORTAL_ABI } from '../vault.js';
|
|
8
|
-
import { CHAIN_ID_MAP, PORTAL_ABI, getErrorMessage, getTxType, getGasPriceConfig, shouldExtractProfit, calculateProfit, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA } from './config.js';
|
|
9
|
-
// ✅ 常量
|
|
10
|
-
const MULTICALL3_ADDRESS = ADDRESSES.BSC.Multicall3;
|
|
11
|
-
// ==================== ERC20 → 原生代币报价 ====================
|
|
12
|
-
// BSC 链常量
|
|
13
|
-
const BSC_PANCAKE_V2_ROUTER = ADDRESSES.BSC.PancakeV2Router;
|
|
14
|
-
const BSC_WBNB = ADDRESSES.BSC.WBNB;
|
|
15
|
-
// ✅ Monad 链常量
|
|
16
|
-
const MONAD_PANCAKE_V2_ROUTER = '0xb1bc24c34e88f7d43d5923034e3a14b24daacff9';
|
|
17
|
-
const MONAD_WMON = ADDRESSES.MONAD.WMON;
|
|
18
|
-
// ✅ XLAYER 链常量(PotatoSwap V2)
|
|
19
|
-
const XLAYER_POTATOSWAP_V2_ROUTER = ADDRESSES.XLAYER.PotatoSwapV2Router;
|
|
20
|
-
const XLAYER_WOKB = ADDRESSES.XLAYER.WOKB;
|
|
21
|
-
// ✅ Base 链常量(Uniswap V3 SwapRouter02)
|
|
22
|
-
const BASE_WETH = ADDRESSES.BASE.WETH;
|
|
23
|
-
const ROUTER_ABI = V2_ROUTER_QUOTE_ABI;
|
|
24
|
-
/**
|
|
25
|
-
* 获取 ERC20 代币 → 原生代币的报价
|
|
26
|
-
* @param provider - Provider 实例
|
|
27
|
-
* @param tokenAddress - ERC20 代币地址
|
|
28
|
-
* @param tokenAmount - 代币数量(wei)
|
|
29
|
-
* @param chainId - 链 ID(56=BSC, 143=Monad)
|
|
30
|
-
* @returns 等值的原生代币数量(wei),失败返回 0n
|
|
31
|
-
*/
|
|
32
|
-
async function getTokenToNativeQuote(provider, tokenAddress, tokenAmount, chainId) {
|
|
33
|
-
if (tokenAmount <= 0n)
|
|
34
|
-
return 0n;
|
|
35
|
-
try {
|
|
36
|
-
if (chainId === CHAINS.BSC.chainId) {
|
|
37
|
-
// BSC: 使用 PancakeSwap V2 Router
|
|
38
|
-
const router = new Contract(BSC_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
|
|
39
|
-
const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, BSC_WBNB]);
|
|
40
|
-
return amounts[1];
|
|
41
|
-
}
|
|
42
|
-
if (chainId === CHAINS.MONAD.chainId) {
|
|
43
|
-
// ✅ Monad: 使用 PancakeSwap V2 Router
|
|
44
|
-
const router = new Contract(MONAD_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
|
|
45
|
-
const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, MONAD_WMON]);
|
|
46
|
-
return amounts[1];
|
|
47
|
-
}
|
|
48
|
-
if (chainId === CHAINS.XLAYER.chainId) {
|
|
49
|
-
// ✅ XLAYER: 使用 PotatoSwap V2 Router(USDT0 → WOKB)
|
|
50
|
-
const router = new Contract(XLAYER_POTATOSWAP_V2_ROUTER, ROUTER_ABI, provider);
|
|
51
|
-
const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, XLAYER_WOKB]);
|
|
52
|
-
return amounts[1];
|
|
53
|
-
}
|
|
54
|
-
if (chainId === CHAINS.BASE.chainId) {
|
|
55
|
-
// ✅ Base: 目前大部分 Flap 交易使用 ETH(原生代币),ERC20 报价暂不支持
|
|
56
|
-
// Base 主力 DEX 是 Uniswap V3,V2 Router 流动性有限,暂返回 0
|
|
57
|
-
// TODO: 后续可接入 Uniswap V3 QuoterV2 进行精确报价
|
|
58
|
-
return 0n;
|
|
59
|
-
}
|
|
60
|
-
// 其他链暂不支持报价,返回 0
|
|
61
|
-
return 0n;
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
// 报价失败返回 0(可能是流动性不足或路径不存在)
|
|
65
|
-
return 0n;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
1
|
/**
|
|
69
|
-
*
|
|
70
|
-
* 优先使用 config.gasLimit,否则使用默认值 * multiplier
|
|
71
|
-
*
|
|
72
|
-
* ✅ ethers v6 最佳实践:直接使用 bigint 类型
|
|
73
|
-
*/
|
|
74
|
-
function getGasLimit(config, defaultGas = 800000) {
|
|
75
|
-
// 优先使用前端传入的 gasLimit
|
|
76
|
-
if (config.gasLimit !== undefined) {
|
|
77
|
-
// 如果已经是 bigint,直接返回;否则转换
|
|
78
|
-
return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
|
|
79
|
-
}
|
|
80
|
-
// 使用默认值 * multiplier
|
|
81
|
-
const multiplier = config.gasLimitMultiplier ?? 1.0;
|
|
82
|
-
const calculatedGas = Math.ceil(defaultGas * multiplier);
|
|
83
|
-
// JavaScript 原生 BigInt 转换(ethers v6 兼容)
|
|
84
|
-
return BigInt(calculatedGas);
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Flap Protocol: 创建代币 + 捆绑购买(仅签名版本 - 不依赖 Merkle)
|
|
88
|
-
* ✅ 精简版:只负责签名交易,不提交到 Merkle
|
|
2
|
+
* core - 主函数
|
|
89
3
|
*/
|
|
4
|
+
import { ethers, Wallet, Contract, Interface } from 'ethers';
|
|
5
|
+
import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../../utils/bundle-helpers.js';
|
|
6
|
+
import { ZERO_ADDRESS } from '../../../shared/constants/index.js';
|
|
7
|
+
import { GAS_LIMITS } from '../../constants/index.js';
|
|
8
|
+
import { MULTICALL3_ABI } from '../../abis/common.js';
|
|
9
|
+
import { FLAP_PORTAL_ADDRESSES, FLAP_ORIGINAL_PORTAL_ADDRESSES } from '../constants.js';
|
|
10
|
+
import { normalizeTaxLaunchConfig, populateCreateTokenTransaction, } from '../portal-create-token.js';
|
|
11
|
+
import { CHAIN_ID_MAP, PORTAL_ABI, getErrorMessage, getTxType, getGasPriceConfig, shouldExtractProfit, calculateProfit, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA, } from './config.js';
|
|
12
|
+
import { MULTICALL3_ADDRESS, getGasLimit, getTokenToNativeQuote } from './core-helpers.js';
|
|
90
13
|
export async function createTokenWithBundleBuyMerkle(params) {
|
|
91
14
|
const { chain, privateKeys, buyAmounts, tokenInfo, tokenAddress, config } = params;
|
|
92
15
|
if (privateKeys.length === 0) {
|
|
@@ -102,136 +25,34 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
102
25
|
const portalAddr = FLAP_PORTAL_ADDRESSES[chain];
|
|
103
26
|
const originalPortalAddr = FLAP_ORIGINAL_PORTAL_ADDRESSES[chain];
|
|
104
27
|
const portal = new ethers.Contract(originalPortalAddr, PORTAL_ABI, devWallet);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
throw new Error(`链 "${chain}" 不支持 Tax Vault 金库功能`);
|
|
130
|
-
}
|
|
131
|
-
const vaultPortal = new ethers.Contract(vaultPortalAddr, VAULT_PORTAL_ABI, devWallet);
|
|
132
|
-
const v6Params = buildNewTokenV6WithVaultParams({
|
|
133
|
-
tokenInfo,
|
|
134
|
-
taxV2: tv2,
|
|
135
|
-
chain,
|
|
136
|
-
salt: params.salt ?? ('0x' + '00'.repeat(32)),
|
|
137
|
-
taxRate: params.taxRate ?? 0,
|
|
138
|
-
buyTaxRate: params.buyTaxRate,
|
|
139
|
-
sellTaxRate: params.sellTaxRate,
|
|
140
|
-
dexThresh: params.dexThresh,
|
|
141
|
-
migratorType: params.migratorType,
|
|
142
|
-
quoteToken: params.quoteToken,
|
|
143
|
-
quoteAmt: 0n,
|
|
144
|
-
dexId: params.dexId,
|
|
145
|
-
lpFeeProfile: params.lpFeeProfile,
|
|
146
|
-
});
|
|
147
|
-
createTxPromise = vaultPortal.newTokenV6WithVault.populateTransaction(v6Params);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
// 标准 V5: Portal.newTokenV5(无金库)
|
|
151
|
-
createTxPromise = portal.newTokenV5.populateTransaction({
|
|
152
|
-
name: tokenInfo.name,
|
|
153
|
-
symbol: tokenInfo.symbol,
|
|
154
|
-
meta: tokenInfo.meta,
|
|
155
|
-
dexThresh: (params.dexThresh ?? 1) & 0xff,
|
|
156
|
-
salt: params.salt ?? '0x' + '00'.repeat(32),
|
|
157
|
-
taxRate: (params.taxRate ?? 0) & 0xffff,
|
|
158
|
-
migratorType: (params.migratorType ?? 0) & 0xff,
|
|
159
|
-
quoteToken: params.quoteToken || ZERO_ADDRESS,
|
|
160
|
-
quoteAmt: 0n,
|
|
161
|
-
beneficiary: devWallet.address,
|
|
162
|
-
permitData: '0x',
|
|
163
|
-
extensionID: params.extensionID ?? '0x' + '00'.repeat(32),
|
|
164
|
-
extensionData: params.extensionData ?? '0x',
|
|
165
|
-
dexId: (params.dexId ?? 0) & 0xff,
|
|
166
|
-
lpFeeProfile: (params.lpFeeProfile ?? 0) & 0xff,
|
|
167
|
-
taxDuration: BigInt(tv2.taxDuration),
|
|
168
|
-
antiFarmerDuration: BigInt(tv2.antiFarmerDuration),
|
|
169
|
-
mktBps: dist.mktBps,
|
|
170
|
-
deflationBps: dist.deflationBps,
|
|
171
|
-
dividendBps: dist.dividendBps,
|
|
172
|
-
lpBps: dist.lpBps,
|
|
173
|
-
minimumShareBalance: BigInt(dist.minimumShareBalance ?? 10000) * (10n ** 18n),
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
else if (useV4) {
|
|
178
|
-
// V4: 支持 DEX ID 和 LP 费率配置
|
|
179
|
-
createTxPromise = portal.newTokenV4.populateTransaction({
|
|
180
|
-
name: tokenInfo.name,
|
|
181
|
-
symbol: tokenInfo.symbol,
|
|
182
|
-
meta: tokenInfo.meta,
|
|
183
|
-
dexThresh: (params.dexThresh ?? 1) & 0xff,
|
|
184
|
-
salt: params.salt ?? '0x' + '00'.repeat(32),
|
|
185
|
-
taxRate: (params.taxRate ?? 0) & 0xffff,
|
|
186
|
-
migratorType: (params.migratorType ?? 0) & 0xff,
|
|
187
|
-
quoteToken: params.quoteToken || ZERO_ADDRESS,
|
|
188
|
-
quoteAmt: 0n,
|
|
189
|
-
beneficiary: devWallet.address,
|
|
190
|
-
permitData: '0x',
|
|
191
|
-
extensionID: params.extensionID ?? '0x' + '00'.repeat(32),
|
|
192
|
-
extensionData: params.extensionData ?? '0x',
|
|
193
|
-
dexId: (params.dexId ?? 0) & 0xff,
|
|
194
|
-
lpFeeProfile: (params.lpFeeProfile ?? 0) & 0xff
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
else if (useV3) {
|
|
198
|
-
// V3: 支持扩展数据
|
|
199
|
-
createTxPromise = portal.newTokenV3.populateTransaction({
|
|
200
|
-
name: tokenInfo.name,
|
|
201
|
-
symbol: tokenInfo.symbol,
|
|
202
|
-
meta: tokenInfo.meta,
|
|
203
|
-
dexThresh: (params.dexThresh ?? 1) & 0xff,
|
|
204
|
-
salt: params.salt ?? '0x' + '00'.repeat(32),
|
|
205
|
-
taxRate: (params.taxRate ?? 0) & 0xffff,
|
|
206
|
-
migratorType: (params.migratorType ?? 0) & 0xff,
|
|
207
|
-
quoteToken: params.quoteToken || ZERO_ADDRESS,
|
|
208
|
-
quoteAmt: 0n,
|
|
209
|
-
beneficiary: devWallet.address,
|
|
210
|
-
permitData: '0x',
|
|
211
|
-
extensionID: params.extensionID,
|
|
212
|
-
extensionData: params.extensionData ?? '0x'
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
// V2: 基础版本
|
|
217
|
-
createTxPromise = portal.newTokenV2.populateTransaction({
|
|
218
|
-
name: tokenInfo.name,
|
|
219
|
-
symbol: tokenInfo.symbol,
|
|
220
|
-
meta: tokenInfo.meta,
|
|
221
|
-
dexThresh: (params.dexThresh ?? 1) & 0xff,
|
|
222
|
-
salt: params.salt ?? '0x' + '00'.repeat(32),
|
|
223
|
-
taxRate: (params.taxRate ?? 0) & 0xffff,
|
|
224
|
-
migratorType: (params.migratorType ?? 0) & 0xff,
|
|
225
|
-
quoteToken: params.quoteToken || ZERO_ADDRESS,
|
|
226
|
-
quoteAmt: 0n,
|
|
227
|
-
beneficiary: devWallet.address,
|
|
228
|
-
permitData: '0x'
|
|
229
|
-
});
|
|
230
|
-
}
|
|
28
|
+
const normalizedTax = normalizeTaxLaunchConfig(params.taxV2Config, params.taxRate);
|
|
29
|
+
const isTaxLaunch = !!normalizedTax || (params.taxRate ?? 0) > 0;
|
|
30
|
+
const hasVault = !!normalizedTax?.vaultConfig && normalizedTax.vaultConfig.vaultType !== 'none';
|
|
31
|
+
const useV3Standard = !isTaxLaunch &&
|
|
32
|
+
!hasVault &&
|
|
33
|
+
(params.lpFeeProfile !== undefined || params.dexId !== undefined);
|
|
34
|
+
const createTxPromise = populateCreateTokenTransaction({
|
|
35
|
+
chain,
|
|
36
|
+
devWallet,
|
|
37
|
+
originalPortal: portal,
|
|
38
|
+
tokenInfo,
|
|
39
|
+
quoteToken: params.quoteToken || ZERO_ADDRESS,
|
|
40
|
+
beneficiary: devWallet.address,
|
|
41
|
+
dexThresh: params.dexThresh,
|
|
42
|
+
salt: params.salt,
|
|
43
|
+
migratorType: params.migratorType,
|
|
44
|
+
taxRate: params.taxRate,
|
|
45
|
+
dexId: params.dexId,
|
|
46
|
+
lpFeeProfile: params.lpFeeProfile,
|
|
47
|
+
extensionID: params.extensionID,
|
|
48
|
+
extensionData: params.extensionData,
|
|
49
|
+
useV3Standard,
|
|
50
|
+
taxConfig: normalizedTax,
|
|
51
|
+
});
|
|
231
52
|
const [gasPrice, createTxUnsigned, devNonce] = await Promise.all([
|
|
232
53
|
resolveGasPrice(provider, config),
|
|
233
54
|
createTxPromise,
|
|
234
|
-
nonceManager.getNextNonce(devWallet)
|
|
55
|
+
nonceManager.getNextNonce(devWallet),
|
|
235
56
|
]);
|
|
236
57
|
const createTxRequest = {
|
|
237
58
|
...createTxUnsigned,
|
|
@@ -240,12 +61,12 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
240
61
|
gasLimit: getGasLimit(config),
|
|
241
62
|
gasPrice,
|
|
242
63
|
chainId,
|
|
243
|
-
type: getTxType(config)
|
|
64
|
+
type: getTxType(config),
|
|
244
65
|
};
|
|
245
66
|
const signedCreateTx = await devWallet.signTransaction(createTxRequest);
|
|
246
67
|
signedTxs.push(signedCreateTx);
|
|
247
68
|
const buyers = createWallets(privateKeys.slice(1), provider);
|
|
248
|
-
const extractProfit = shouldExtractProfit(
|
|
69
|
+
const extractProfit = shouldExtractProfit();
|
|
249
70
|
const { fundsList, originalAmounts, totalBuyAmount, totalProfit } = analyzeBuyFunds(buyAmounts, config, extractProfit);
|
|
250
71
|
const maxFundsIndex = findMaxIndex(originalAmounts);
|
|
251
72
|
const gasLimits = buildGasLimitList(buyers.length, config);
|
|
@@ -258,13 +79,13 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
258
79
|
if (!useNativeToken && params.quoteTokenDecimals !== undefined && params.quoteTokenDecimals !== 18) {
|
|
259
80
|
const decimalsDiff = 18 - params.quoteTokenDecimals;
|
|
260
81
|
const divisor = BigInt(10 ** decimalsDiff);
|
|
261
|
-
adjustedFundsList = fundsList.map(amount => amount / divisor);
|
|
82
|
+
adjustedFundsList = fundsList.map((amount) => amount / divisor);
|
|
262
83
|
profitTokenAmount = totalProfit / divisor;
|
|
263
84
|
}
|
|
264
85
|
// ✅ 优化:并行获取 unsignedBuys 和 buyerNonces
|
|
265
86
|
const [unsignedBuys, buyerNonces] = await Promise.all([
|
|
266
87
|
populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, adjustedFundsList, inputToken, useNativeToken),
|
|
267
|
-
allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, useNativeToken ? totalProfit : profitTokenAmount, nonceManager)
|
|
88
|
+
allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, useNativeToken ? totalProfit : profitTokenAmount, nonceManager),
|
|
268
89
|
]);
|
|
269
90
|
// ✅ 贿赂交易放在首位(提高 BlockRazor 打包优先级)
|
|
270
91
|
const bribeAmount = getBribeAmount(config);
|
|
@@ -279,7 +100,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
279
100
|
gasPrice,
|
|
280
101
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
281
102
|
chainId,
|
|
282
|
-
type: getTxType(config)
|
|
103
|
+
type: getTxType(config),
|
|
283
104
|
});
|
|
284
105
|
bribeTxs.push(bribeTx);
|
|
285
106
|
// 调整 maxFundsIndex 钱包的 nonce(买入交易 +1)
|
|
@@ -294,7 +115,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
294
115
|
chainId,
|
|
295
116
|
config,
|
|
296
117
|
fundsList: adjustedFundsList, // ✅ 使用调整后的金额
|
|
297
|
-
useNativeToken // ✅ 传递是否使用原生代币
|
|
118
|
+
useNativeToken, // ✅ 传递是否使用原生代币
|
|
298
119
|
});
|
|
299
120
|
// ✅ 利润多跳转账(强制 2 跳中转)
|
|
300
121
|
const profitTxs = [];
|
|
@@ -315,7 +136,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
315
136
|
gasPrice,
|
|
316
137
|
chainId,
|
|
317
138
|
txType: getTxType(config),
|
|
318
|
-
startNonce: profitNonce
|
|
139
|
+
startNonce: profitNonce,
|
|
319
140
|
});
|
|
320
141
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
321
142
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -327,7 +148,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
327
148
|
signedTransactions: [...bribeTxs, ...signedTxs, ...signedBuys, ...profitTxs],
|
|
328
149
|
tokenAddress,
|
|
329
150
|
profitHopWallets, // ✅ 返回利润多跳钱包
|
|
330
|
-
metadata: buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyers.length)
|
|
151
|
+
metadata: buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyers.length),
|
|
331
152
|
};
|
|
332
153
|
}
|
|
333
154
|
/**
|
|
@@ -342,9 +163,8 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
342
163
|
}
|
|
343
164
|
const { provider, chainId } = createChainContext(chain, config.rpcUrl);
|
|
344
165
|
const nonceManager = new NonceManager(provider);
|
|
345
|
-
const signedTxs = [];
|
|
346
166
|
const buyers = createWallets(privateKeys, provider);
|
|
347
|
-
const extractProfit = shouldExtractProfit(
|
|
167
|
+
const extractProfit = shouldExtractProfit();
|
|
348
168
|
const { fundsList, originalAmounts, totalBuyAmount, totalProfit } = analyzeBuyFunds(buyAmounts, config, extractProfit);
|
|
349
169
|
const maxFundsIndex = findMaxIndex(originalAmounts);
|
|
350
170
|
const gasLimits = buildGasLimitList(buyers.length, config);
|
|
@@ -362,7 +182,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
362
182
|
// 转为 USDC (6位) = 100000 (0.1 USDC)
|
|
363
183
|
const decimalsDiff = 18 - quoteTokenDecimals;
|
|
364
184
|
const divisor = BigInt(10 ** decimalsDiff);
|
|
365
|
-
adjustedFundsList = fundsList.map(amount => amount / divisor);
|
|
185
|
+
adjustedFundsList = fundsList.map((amount) => amount / divisor);
|
|
366
186
|
profitTokenAmount = totalProfit / divisor;
|
|
367
187
|
}
|
|
368
188
|
// ✅ ERC20 购买:获取代币利润等值的原生代币(BNB)报价
|
|
@@ -379,10 +199,8 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
379
199
|
populateBuyTransactionsWithQuote(buyers, FLAP_PORTAL_ADDRESSES[chain], tokenAddress, adjustedFundsList, inputToken, useNativeToken),
|
|
380
200
|
presetNonces && presetNonces.length === buyers.length
|
|
381
201
|
? adjustNoncesForProfit(presetNonces) // ✅ 调整 nonces 避免冲突
|
|
382
|
-
: allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, nativeProfitAmount, nonceManager)
|
|
202
|
+
: allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, nativeProfitAmount, nonceManager),
|
|
383
203
|
]);
|
|
384
|
-
if (presetNonces) {
|
|
385
|
-
}
|
|
386
204
|
// ✅ 贿赂交易放在首位(提高 BlockRazor 打包优先级)
|
|
387
205
|
const bribeAmount = getBribeAmount(config);
|
|
388
206
|
const bribeTxs = [];
|
|
@@ -395,7 +213,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
395
213
|
gasPrice,
|
|
396
214
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
397
215
|
chainId,
|
|
398
|
-
type: getTxType(config)
|
|
216
|
+
type: getTxType(config),
|
|
399
217
|
});
|
|
400
218
|
bribeTxs.push(bribeTx);
|
|
401
219
|
// 调整 maxFundsIndex 钱包的 nonce(买入交易 +1)
|
|
@@ -410,20 +228,18 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
410
228
|
chainId,
|
|
411
229
|
config,
|
|
412
230
|
fundsList: adjustedFundsList, // ✅ 使用调整后的金额
|
|
413
|
-
useNativeToken // ✅ USDT 购买时 value=0,BNB 购买时 value=金额
|
|
231
|
+
useNativeToken, // ✅ USDT 购买时 value=0,BNB 购买时 value=金额
|
|
414
232
|
});
|
|
415
233
|
// ✅ 利润多跳转账
|
|
416
234
|
const profitTxs = [];
|
|
417
235
|
let profitHopWallets;
|
|
418
236
|
// ✅ 检查是否使用分布式利润模式
|
|
419
|
-
const profitMode = config.profitMode
|
|
420
|
-
console.log('🔧 [SDK batchBuyWithBundleMerkle] config.profitMode:', config.profitMode, '-> resolved:', profitMode, 'wallets:', buyers.length);
|
|
237
|
+
const profitMode = config.profitMode ?? 'single';
|
|
421
238
|
if (extractProfit && nativeProfitAmount > 0n) {
|
|
422
239
|
if (profitMode === 'distributed') {
|
|
423
240
|
// ✅ 分布式模式:每个钱包独立扣除自己的利润,每个都有独立的多跳
|
|
424
241
|
// 最多支持 12 个钱包(12 交易 + 36 多跳 + 1 贿赂 = 49 笔)
|
|
425
242
|
const MAX_DISTRIBUTED_WALLETS = 12;
|
|
426
|
-
console.log('🔧 [SDK] 使用分布式利润模式,钱包数:', buyers.length);
|
|
427
243
|
if (buyers.length > MAX_DISTRIBUTED_WALLETS) {
|
|
428
244
|
throw new Error(`分布式利润模式最多支持 ${MAX_DISTRIBUTED_WALLETS} 个钱包,当前 ${buyers.length} 个`);
|
|
429
245
|
}
|
|
@@ -433,9 +249,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
433
249
|
for (let i = 0; i < buyers.length; i++) {
|
|
434
250
|
const walletOriginalAmount = originalAmounts[i];
|
|
435
251
|
// 按比例计算该钱包应承担的利润
|
|
436
|
-
const walletProfit = totalBuyAmount > 0n
|
|
437
|
-
? (nativeProfitAmount * walletOriginalAmount) / totalBuyAmount
|
|
438
|
-
: 0n;
|
|
252
|
+
const walletProfit = totalBuyAmount > 0n ? (nativeProfitAmount * walletOriginalAmount) / totalBuyAmount : 0n;
|
|
439
253
|
perWalletProfits.push(walletProfit);
|
|
440
254
|
}
|
|
441
255
|
// 为每个钱包生成独立的利润多跳交易
|
|
@@ -452,7 +266,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
452
266
|
gasPrice,
|
|
453
267
|
chainId,
|
|
454
268
|
txType: getTxType(config),
|
|
455
|
-
startNonce: profitNonce
|
|
269
|
+
startNonce: profitNonce,
|
|
456
270
|
});
|
|
457
271
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
458
272
|
if (profitHopResult.hopWallets) {
|
|
@@ -474,7 +288,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
474
288
|
gasPrice,
|
|
475
289
|
chainId,
|
|
476
290
|
txType: getTxType(config),
|
|
477
|
-
startNonce: profitNonce
|
|
291
|
+
startNonce: profitNonce,
|
|
478
292
|
});
|
|
479
293
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
480
294
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -489,7 +303,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
489
303
|
metadata: {
|
|
490
304
|
...buildProfitMetadata(extractProfit, totalBuyAmount, nativeProfitAmount, buyers.length),
|
|
491
305
|
profitMode, // ✅ 返回使用的利润模式
|
|
492
|
-
}
|
|
306
|
+
},
|
|
493
307
|
};
|
|
494
308
|
}
|
|
495
309
|
/**
|
|
@@ -504,23 +318,22 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
504
318
|
}
|
|
505
319
|
const { provider, chainId } = createChainContext(chain, config.rpcUrl);
|
|
506
320
|
const nonceManager = new NonceManager(provider);
|
|
507
|
-
const signedTxs = [];
|
|
508
321
|
const wallets = createWallets(privateKeys, provider);
|
|
509
|
-
const amountsWei = sellAmounts.map(a => ethers.parseUnits(a, 18));
|
|
322
|
+
const amountsWei = sellAmounts.map((a) => ethers.parseUnits(a, 18));
|
|
510
323
|
const portalAddr = FLAP_PORTAL_ADDRESSES[chain];
|
|
511
324
|
const readOnlyPortal = new ethers.Contract(portalAddr, PORTAL_ABI, provider);
|
|
512
325
|
const gasLimits = buildGasLimitList(wallets.length, config);
|
|
513
|
-
const portals = wallets.map(w => new ethers.Contract(portalAddr, PORTAL_ABI, w));
|
|
326
|
+
const portals = wallets.map((w) => new ethers.Contract(portalAddr, PORTAL_ABI, w));
|
|
514
327
|
// ✅ 确定 outputToken:如果传入了 quoteToken 且非零地址,则使用它;否则使用零地址(原生代币)
|
|
515
328
|
const outputToken = quoteToken && quoteToken !== ZERO_ADDRESS ? quoteToken : ZERO_ADDRESS;
|
|
516
329
|
const useNativeOutput = outputToken === ZERO_ADDRESS;
|
|
517
330
|
// ✅ 优化:如果前端传入了 nonces,直接使用(跳过 RPC 调用)
|
|
518
331
|
const presetNonces = config.nonces;
|
|
519
|
-
const extractProfit = shouldExtractProfit(
|
|
332
|
+
const extractProfit = shouldExtractProfit();
|
|
520
333
|
// ✅ 并行执行 gasPrice 和 quoteSellOutputs(Multicall3)
|
|
521
334
|
const [gasPrice, quotedOutputs] = await Promise.all([
|
|
522
335
|
resolveGasPrice(provider, config),
|
|
523
|
-
quoteSellOutputsWithQuote(readOnlyPortal, tokenAddress, amountsWei, outputToken)
|
|
336
|
+
quoteSellOutputsWithQuote(readOnlyPortal, tokenAddress, amountsWei, outputToken),
|
|
524
337
|
]);
|
|
525
338
|
// ✅ 计算利润和 maxRevenueIndex(用于 nonce 分配)
|
|
526
339
|
let totalTokenProfit = 0n;
|
|
@@ -530,7 +343,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
530
343
|
for (let i = 0; i < wallets.length; i++) {
|
|
531
344
|
const quoted = quotedOutputs[i];
|
|
532
345
|
if (quoted > 0n) {
|
|
533
|
-
const { profit } = calculateProfit(quoted
|
|
346
|
+
const { profit } = calculateProfit(quoted);
|
|
534
347
|
totalTokenProfit += profit;
|
|
535
348
|
if (quoted > maxRevenue) {
|
|
536
349
|
maxRevenue = quoted;
|
|
@@ -562,9 +375,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
562
375
|
const maxRevenueNonces = await nonceManager.getNextNonceBatch(wallets[maxRevenueIndex], maxRevenueNonceCount);
|
|
563
376
|
// 其他钱包各需要 1 个 nonce
|
|
564
377
|
const otherWallets = wallets.filter((_, i) => i !== maxRevenueIndex);
|
|
565
|
-
const otherNonces = otherWallets.length > 0
|
|
566
|
-
? await nonceManager.getNextNoncesForWallets(otherWallets)
|
|
567
|
-
: [];
|
|
378
|
+
const otherNonces = otherWallets.length > 0 ? await nonceManager.getNextNoncesForWallets(otherWallets) : [];
|
|
568
379
|
// 组装最终的 nonces 数组(保持原顺序)
|
|
569
380
|
nonces = [];
|
|
570
381
|
let otherIdx = 0;
|
|
@@ -595,7 +406,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
595
406
|
outputToken, // ✅ 使用动态 outputToken
|
|
596
407
|
inputAmount: amountsWei[i],
|
|
597
408
|
minOutputAmount: minOuts[i],
|
|
598
|
-
permitData: '0x'
|
|
409
|
+
permitData: '0x',
|
|
599
410
|
})));
|
|
600
411
|
// ✅ 贿赂交易放在首位
|
|
601
412
|
const bribeTxs = [];
|
|
@@ -607,7 +418,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
607
418
|
gasPrice,
|
|
608
419
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
609
420
|
chainId,
|
|
610
|
-
type: getTxType(config)
|
|
421
|
+
type: getTxType(config),
|
|
611
422
|
});
|
|
612
423
|
bribeTxs.push(bribeTx);
|
|
613
424
|
}
|
|
@@ -621,14 +432,13 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
621
432
|
gasPrice,
|
|
622
433
|
chainId,
|
|
623
434
|
type: getTxType(config),
|
|
624
|
-
value: 0n // ✅ 卖出交易不发送原生代币
|
|
435
|
+
value: 0n, // ✅ 卖出交易不发送原生代币
|
|
625
436
|
})));
|
|
626
437
|
// ✅ 利润多跳转账
|
|
627
438
|
const profitTxs = [];
|
|
628
439
|
let profitHopWallets;
|
|
629
440
|
// ✅ 检查是否使用分布式利润模式
|
|
630
|
-
const profitMode = config.profitMode
|
|
631
|
-
console.log('🔧 [SDK batchSellWithBundleMerkle] config.profitMode:', config.profitMode, '-> resolved:', profitMode, 'wallets:', wallets.length);
|
|
441
|
+
const profitMode = config.profitMode ?? 'single';
|
|
632
442
|
if (needProfitTx) {
|
|
633
443
|
// ERC20 输出时:获取代币利润等值的原生代币(BNB)报价
|
|
634
444
|
let totalNativeProfitAmount = totalTokenProfit;
|
|
@@ -662,7 +472,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
662
472
|
gasPrice,
|
|
663
473
|
chainId,
|
|
664
474
|
txType: getTxType(config),
|
|
665
|
-
startNonce: walletProfitNonce
|
|
475
|
+
startNonce: walletProfitNonce,
|
|
666
476
|
});
|
|
667
477
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
668
478
|
if (profitHopResult.hopWallets) {
|
|
@@ -684,7 +494,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
684
494
|
gasPrice,
|
|
685
495
|
chainId,
|
|
686
496
|
txType: getTxType(config),
|
|
687
|
-
startNonce: profitNonce
|
|
497
|
+
startNonce: profitNonce,
|
|
688
498
|
});
|
|
689
499
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
690
500
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -700,7 +510,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
700
510
|
metadata: {
|
|
701
511
|
profitMode, // ✅ 返回使用的利润模式
|
|
702
512
|
totalProfit: totalTokenProfit.toString(),
|
|
703
|
-
}
|
|
513
|
+
},
|
|
704
514
|
};
|
|
705
515
|
}
|
|
706
516
|
// ✅ Provider 缓存(复用连接,减少初始化开销)
|
|
@@ -721,29 +531,27 @@ function createChainContext(chain, rpcUrl) {
|
|
|
721
531
|
return { chainId, provider };
|
|
722
532
|
}
|
|
723
533
|
async function resolveGasPrice(provider, config) {
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
const gasPrice = config.gasPrice;
|
|
727
|
-
return gasPrice;
|
|
534
|
+
if ('gasPrice' in config && config.gasPrice !== undefined) {
|
|
535
|
+
return config.gasPrice;
|
|
728
536
|
}
|
|
729
537
|
return await getOptimizedGasPrice(provider, getGasPriceConfig(config));
|
|
730
538
|
}
|
|
731
539
|
function createWallets(privateKeys, provider) {
|
|
732
|
-
return privateKeys.map(key => new Wallet(key, provider));
|
|
540
|
+
return privateKeys.map((key) => new Wallet(key, provider));
|
|
733
541
|
}
|
|
734
542
|
function analyzeBuyFunds(buyAmounts, config, extractProfit) {
|
|
735
543
|
const result = {
|
|
736
544
|
fundsList: [],
|
|
737
545
|
originalAmounts: [],
|
|
738
546
|
totalBuyAmount: 0n,
|
|
739
|
-
totalProfit: 0n
|
|
547
|
+
totalProfit: 0n,
|
|
740
548
|
};
|
|
741
|
-
buyAmounts.forEach(amount => {
|
|
549
|
+
buyAmounts.forEach((amount) => {
|
|
742
550
|
const originalAmount = ethers.parseEther(amount);
|
|
743
551
|
result.originalAmounts.push(originalAmount);
|
|
744
552
|
result.totalBuyAmount += originalAmount;
|
|
745
553
|
if (extractProfit) {
|
|
746
|
-
const { remaining, profit } = calculateProfit(originalAmount
|
|
554
|
+
const { remaining, profit } = calculateProfit(originalAmount);
|
|
747
555
|
result.totalProfit += profit;
|
|
748
556
|
result.fundsList.push(remaining);
|
|
749
557
|
}
|
|
@@ -772,13 +580,13 @@ function findMaxIndex(values) {
|
|
|
772
580
|
* 当 inputToken 为非零地址(如 USDC)时,value 为 0
|
|
773
581
|
*/
|
|
774
582
|
async function populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, fundsList, inputToken, useNativeToken) {
|
|
775
|
-
const portals = buyers.map(wallet => new ethers.Contract(portalAddr, PORTAL_ABI, wallet));
|
|
583
|
+
const portals = buyers.map((wallet) => new ethers.Contract(portalAddr, PORTAL_ABI, wallet));
|
|
776
584
|
return await Promise.all(portals.map((portal, i) => portal.swapExactInput.populateTransaction({
|
|
777
585
|
inputToken,
|
|
778
586
|
outputToken: tokenAddress,
|
|
779
587
|
inputAmount: fundsList[i],
|
|
780
588
|
minOutputAmount: 0n,
|
|
781
|
-
permitData: '0x'
|
|
589
|
+
permitData: '0x',
|
|
782
590
|
},
|
|
783
591
|
// ✅ 如果使用原生代币,value 为购买金额;否则为 0
|
|
784
592
|
useNativeToken ? { value: fundsList[i] } : {})));
|
|
@@ -815,9 +623,7 @@ async function allocateBuyerNonces(buyers, extractProfit, maxIndex, totalProfit,
|
|
|
815
623
|
const maxIndexNonces = await nonceManager.getNextNonceBatch(buyers[maxIndex], 2);
|
|
816
624
|
// 其他钱包各需要 1 个 nonce
|
|
817
625
|
const otherBuyers = buyers.filter((_, i) => i !== maxIndex);
|
|
818
|
-
const otherNonces = otherBuyers.length > 0
|
|
819
|
-
? await nonceManager.getNextNoncesForWallets(otherBuyers)
|
|
820
|
-
: [];
|
|
626
|
+
const otherNonces = otherBuyers.length > 0 ? await nonceManager.getNextNoncesForWallets(otherBuyers) : [];
|
|
821
627
|
// 组装最终的 nonces 数组(保持原顺序)
|
|
822
628
|
const nonces = [];
|
|
823
629
|
let otherIdx = 0;
|
|
@@ -831,7 +637,7 @@ async function allocateBuyerNonces(buyers, extractProfit, maxIndex, totalProfit,
|
|
|
831
637
|
}
|
|
832
638
|
return nonces;
|
|
833
639
|
}
|
|
834
|
-
async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, gasPrice, chainId, config, fundsList, useNativeToken = true // ✅ 默认使用原生代币
|
|
640
|
+
async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, gasPrice, chainId, config, fundsList, useNativeToken = true, // ✅ 默认使用原生代币
|
|
835
641
|
}) {
|
|
836
642
|
return await Promise.all(unsignedBuys.map((unsigned, i) => buyers[i].signTransaction({
|
|
837
643
|
...unsigned,
|
|
@@ -841,7 +647,7 @@ async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, ga
|
|
|
841
647
|
gasPrice,
|
|
842
648
|
chainId,
|
|
843
649
|
type: getTxType(config),
|
|
844
|
-
value: useNativeToken ? fundsList[i] : 0n // ✅ 非原生代币时 value 为 0
|
|
650
|
+
value: useNativeToken ? fundsList[i] : 0n, // ✅ 非原生代币时 value 为 0
|
|
845
651
|
})));
|
|
846
652
|
}
|
|
847
653
|
function buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyerCount) {
|
|
@@ -852,7 +658,7 @@ function buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyerCo
|
|
|
852
658
|
totalBuyAmount: ethers.formatEther(totalBuyAmount),
|
|
853
659
|
profitAmount: ethers.formatEther(totalProfit),
|
|
854
660
|
profitRecipient: getProfitRecipient(),
|
|
855
|
-
buyerCount
|
|
661
|
+
buyerCount,
|
|
856
662
|
};
|
|
857
663
|
}
|
|
858
664
|
/**
|
|
@@ -868,7 +674,7 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
|
|
|
868
674
|
const result = await portal.quoteExactInput.staticCall({
|
|
869
675
|
inputToken: tokenAddress,
|
|
870
676
|
outputToken,
|
|
871
|
-
inputAmount: amountsWei[0]
|
|
677
|
+
inputAmount: amountsWei[0],
|
|
872
678
|
});
|
|
873
679
|
return [result];
|
|
874
680
|
}
|
|
@@ -881,14 +687,16 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
|
|
|
881
687
|
const portalIface = new Interface(PORTAL_ABI);
|
|
882
688
|
const multicall = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
|
|
883
689
|
// 构建批量调用
|
|
884
|
-
const calls = amountsWei.map(amount => ({
|
|
690
|
+
const calls = amountsWei.map((amount) => ({
|
|
885
691
|
target: portalAddress,
|
|
886
692
|
allowFailure: true, // 允许单个失败
|
|
887
|
-
callData: portalIface.encodeFunctionData('quoteExactInput', [
|
|
693
|
+
callData: portalIface.encodeFunctionData('quoteExactInput', [
|
|
694
|
+
{
|
|
888
695
|
inputToken: tokenAddress,
|
|
889
696
|
outputToken,
|
|
890
|
-
inputAmount: amount
|
|
891
|
-
}
|
|
697
|
+
inputAmount: amount,
|
|
698
|
+
},
|
|
699
|
+
]),
|
|
892
700
|
}));
|
|
893
701
|
try {
|
|
894
702
|
const results = await multicall.aggregate3.staticCall(calls);
|
|
@@ -912,7 +720,7 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
|
|
|
912
720
|
return await portal.quoteExactInput.staticCall({
|
|
913
721
|
inputToken: tokenAddress,
|
|
914
722
|
outputToken,
|
|
915
|
-
inputAmount: amount
|
|
723
|
+
inputAmount: amount,
|
|
916
724
|
});
|
|
917
725
|
}
|
|
918
726
|
catch {
|