four-flap-meme-sdk 2.2.2 → 2.2.4
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 +96 -277
- 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 +107 -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 +88 -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 +80 -0
- package/dist/shared/flap/portal-create-token.js +257 -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,29 @@
|
|
|
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 类型
|
|
2
|
+
* core - 主函数
|
|
73
3
|
*/
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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 { MigratorType } from '../portal.js';
|
|
13
|
+
import { MULTICALL3_ADDRESS, getGasLimit, getTokenToNativeQuote } from './core-helpers.js';
|
|
14
|
+
function resolveCreateTokenLaunchFlags(params) {
|
|
15
|
+
const normalizedTax = normalizeTaxLaunchConfig(params.taxV2Config, params.taxRate);
|
|
16
|
+
const isTaxLaunch = !!normalizedTax || (params.taxRate ?? 0) > 0;
|
|
17
|
+
const hasVault = !!normalizedTax?.vaultConfig && normalizedTax.vaultConfig.vaultType !== 'none';
|
|
18
|
+
const useV4Portal = !isTaxLaunch &&
|
|
19
|
+
!hasVault &&
|
|
20
|
+
(params.lpFeeProfile !== undefined || params.dexId !== undefined);
|
|
21
|
+
const useClInfinityLaunch = !isTaxLaunch &&
|
|
22
|
+
!hasVault &&
|
|
23
|
+
!useV4Portal &&
|
|
24
|
+
params.migratorType === MigratorType.PCS_INFINITY_CL_MIGRATOR;
|
|
25
|
+
return { normalizedTax, isTaxLaunch, hasVault, useV4Portal, useClInfinityLaunch };
|
|
85
26
|
}
|
|
86
|
-
/**
|
|
87
|
-
* Flap Protocol: 创建代币 + 捆绑购买(仅签名版本 - 不依赖 Merkle)
|
|
88
|
-
* ✅ 精简版:只负责签名交易,不提交到 Merkle
|
|
89
|
-
*/
|
|
90
27
|
export async function createTokenWithBundleBuyMerkle(params) {
|
|
91
28
|
const { chain, privateKeys, buyAmounts, tokenInfo, tokenAddress, config } = params;
|
|
92
29
|
if (privateKeys.length === 0) {
|
|
@@ -102,136 +39,30 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
102
39
|
const portalAddr = FLAP_PORTAL_ADDRESSES[chain];
|
|
103
40
|
const originalPortalAddr = FLAP_ORIGINAL_PORTAL_ADDRESSES[chain];
|
|
104
41
|
const portal = new ethers.Contract(originalPortalAddr, PORTAL_ABI, devWallet);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (hasVault) {
|
|
126
|
-
// ✅ 金库模式:通过 VaultPortal.newTokenV6WithVault 创建代币
|
|
127
|
-
const vaultPortalAddr = VAULT_PORTAL_ADDRESSES[chain];
|
|
128
|
-
if (!vaultPortalAddr) {
|
|
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
|
-
}
|
|
42
|
+
const { normalizedTax, useV4Portal, useClInfinityLaunch } = resolveCreateTokenLaunchFlags(params);
|
|
43
|
+
const createTxPromise = populateCreateTokenTransaction({
|
|
44
|
+
chain,
|
|
45
|
+
devWallet,
|
|
46
|
+
originalPortal: portal,
|
|
47
|
+
tokenInfo,
|
|
48
|
+
quoteToken: params.quoteToken || ZERO_ADDRESS,
|
|
49
|
+
beneficiary: devWallet.address,
|
|
50
|
+
dexThresh: params.dexThresh,
|
|
51
|
+
salt: params.salt,
|
|
52
|
+
migratorType: params.migratorType,
|
|
53
|
+
taxRate: params.taxRate,
|
|
54
|
+
dexId: params.dexId,
|
|
55
|
+
lpFeeProfile: params.lpFeeProfile,
|
|
56
|
+
extensionID: params.extensionID,
|
|
57
|
+
extensionData: params.extensionData,
|
|
58
|
+
useV4Portal,
|
|
59
|
+
useClInfinityLaunch,
|
|
60
|
+
taxConfig: normalizedTax,
|
|
61
|
+
});
|
|
231
62
|
const [gasPrice, createTxUnsigned, devNonce] = await Promise.all([
|
|
232
63
|
resolveGasPrice(provider, config),
|
|
233
64
|
createTxPromise,
|
|
234
|
-
nonceManager.getNextNonce(devWallet)
|
|
65
|
+
nonceManager.getNextNonce(devWallet),
|
|
235
66
|
]);
|
|
236
67
|
const createTxRequest = {
|
|
237
68
|
...createTxUnsigned,
|
|
@@ -240,12 +71,13 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
240
71
|
gasLimit: getGasLimit(config),
|
|
241
72
|
gasPrice,
|
|
242
73
|
chainId,
|
|
243
|
-
type: getTxType(config)
|
|
74
|
+
type: getTxType(config),
|
|
244
75
|
};
|
|
245
76
|
const signedCreateTx = await devWallet.signTransaction(createTxRequest);
|
|
246
77
|
signedTxs.push(signedCreateTx);
|
|
247
78
|
const buyers = createWallets(privateKeys.slice(1), provider);
|
|
248
|
-
|
|
79
|
+
// 发币+捆绑买:默认不刮利润,避免跟买缩水与 Dev 钱包多 3 笔多跳导致 BlockRazor 模拟失败
|
|
80
|
+
const extractProfit = config.extractProfitOnLaunch === true ? shouldExtractProfit(config) : false;
|
|
249
81
|
const { fundsList, originalAmounts, totalBuyAmount, totalProfit } = analyzeBuyFunds(buyAmounts, config, extractProfit);
|
|
250
82
|
const maxFundsIndex = findMaxIndex(originalAmounts);
|
|
251
83
|
const gasLimits = buildGasLimitList(buyers.length, config);
|
|
@@ -258,13 +90,13 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
258
90
|
if (!useNativeToken && params.quoteTokenDecimals !== undefined && params.quoteTokenDecimals !== 18) {
|
|
259
91
|
const decimalsDiff = 18 - params.quoteTokenDecimals;
|
|
260
92
|
const divisor = BigInt(10 ** decimalsDiff);
|
|
261
|
-
adjustedFundsList = fundsList.map(amount => amount / divisor);
|
|
93
|
+
adjustedFundsList = fundsList.map((amount) => amount / divisor);
|
|
262
94
|
profitTokenAmount = totalProfit / divisor;
|
|
263
95
|
}
|
|
264
96
|
// ✅ 优化:并行获取 unsignedBuys 和 buyerNonces
|
|
265
97
|
const [unsignedBuys, buyerNonces] = await Promise.all([
|
|
266
98
|
populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, adjustedFundsList, inputToken, useNativeToken),
|
|
267
|
-
allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, useNativeToken ? totalProfit : profitTokenAmount, nonceManager)
|
|
99
|
+
allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, useNativeToken ? totalProfit : profitTokenAmount, nonceManager),
|
|
268
100
|
]);
|
|
269
101
|
// ✅ 贿赂交易放在首位(提高 BlockRazor 打包优先级)
|
|
270
102
|
const bribeAmount = getBribeAmount(config);
|
|
@@ -279,7 +111,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
279
111
|
gasPrice,
|
|
280
112
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
281
113
|
chainId,
|
|
282
|
-
type: getTxType(config)
|
|
114
|
+
type: getTxType(config),
|
|
283
115
|
});
|
|
284
116
|
bribeTxs.push(bribeTx);
|
|
285
117
|
// 调整 maxFundsIndex 钱包的 nonce(买入交易 +1)
|
|
@@ -294,7 +126,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
294
126
|
chainId,
|
|
295
127
|
config,
|
|
296
128
|
fundsList: adjustedFundsList, // ✅ 使用调整后的金额
|
|
297
|
-
useNativeToken // ✅ 传递是否使用原生代币
|
|
129
|
+
useNativeToken, // ✅ 传递是否使用原生代币
|
|
298
130
|
});
|
|
299
131
|
// ✅ 利润多跳转账(强制 2 跳中转)
|
|
300
132
|
const profitTxs = [];
|
|
@@ -315,7 +147,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
315
147
|
gasPrice,
|
|
316
148
|
chainId,
|
|
317
149
|
txType: getTxType(config),
|
|
318
|
-
startNonce: profitNonce
|
|
150
|
+
startNonce: profitNonce,
|
|
319
151
|
});
|
|
320
152
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
321
153
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -327,7 +159,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
327
159
|
signedTransactions: [...bribeTxs, ...signedTxs, ...signedBuys, ...profitTxs],
|
|
328
160
|
tokenAddress,
|
|
329
161
|
profitHopWallets, // ✅ 返回利润多跳钱包
|
|
330
|
-
metadata: buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyers.length)
|
|
162
|
+
metadata: buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyers.length),
|
|
331
163
|
};
|
|
332
164
|
}
|
|
333
165
|
/**
|
|
@@ -342,9 +174,8 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
342
174
|
}
|
|
343
175
|
const { provider, chainId } = createChainContext(chain, config.rpcUrl);
|
|
344
176
|
const nonceManager = new NonceManager(provider);
|
|
345
|
-
const signedTxs = [];
|
|
346
177
|
const buyers = createWallets(privateKeys, provider);
|
|
347
|
-
const extractProfit = shouldExtractProfit(
|
|
178
|
+
const extractProfit = shouldExtractProfit();
|
|
348
179
|
const { fundsList, originalAmounts, totalBuyAmount, totalProfit } = analyzeBuyFunds(buyAmounts, config, extractProfit);
|
|
349
180
|
const maxFundsIndex = findMaxIndex(originalAmounts);
|
|
350
181
|
const gasLimits = buildGasLimitList(buyers.length, config);
|
|
@@ -362,7 +193,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
362
193
|
// 转为 USDC (6位) = 100000 (0.1 USDC)
|
|
363
194
|
const decimalsDiff = 18 - quoteTokenDecimals;
|
|
364
195
|
const divisor = BigInt(10 ** decimalsDiff);
|
|
365
|
-
adjustedFundsList = fundsList.map(amount => amount / divisor);
|
|
196
|
+
adjustedFundsList = fundsList.map((amount) => amount / divisor);
|
|
366
197
|
profitTokenAmount = totalProfit / divisor;
|
|
367
198
|
}
|
|
368
199
|
// ✅ ERC20 购买:获取代币利润等值的原生代币(BNB)报价
|
|
@@ -379,10 +210,8 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
379
210
|
populateBuyTransactionsWithQuote(buyers, FLAP_PORTAL_ADDRESSES[chain], tokenAddress, adjustedFundsList, inputToken, useNativeToken),
|
|
380
211
|
presetNonces && presetNonces.length === buyers.length
|
|
381
212
|
? adjustNoncesForProfit(presetNonces) // ✅ 调整 nonces 避免冲突
|
|
382
|
-
: allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, nativeProfitAmount, nonceManager)
|
|
213
|
+
: allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, nativeProfitAmount, nonceManager),
|
|
383
214
|
]);
|
|
384
|
-
if (presetNonces) {
|
|
385
|
-
}
|
|
386
215
|
// ✅ 贿赂交易放在首位(提高 BlockRazor 打包优先级)
|
|
387
216
|
const bribeAmount = getBribeAmount(config);
|
|
388
217
|
const bribeTxs = [];
|
|
@@ -395,7 +224,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
395
224
|
gasPrice,
|
|
396
225
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
397
226
|
chainId,
|
|
398
|
-
type: getTxType(config)
|
|
227
|
+
type: getTxType(config),
|
|
399
228
|
});
|
|
400
229
|
bribeTxs.push(bribeTx);
|
|
401
230
|
// 调整 maxFundsIndex 钱包的 nonce(买入交易 +1)
|
|
@@ -410,20 +239,18 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
410
239
|
chainId,
|
|
411
240
|
config,
|
|
412
241
|
fundsList: adjustedFundsList, // ✅ 使用调整后的金额
|
|
413
|
-
useNativeToken // ✅ USDT 购买时 value=0,BNB 购买时 value=金额
|
|
242
|
+
useNativeToken, // ✅ USDT 购买时 value=0,BNB 购买时 value=金额
|
|
414
243
|
});
|
|
415
244
|
// ✅ 利润多跳转账
|
|
416
245
|
const profitTxs = [];
|
|
417
246
|
let profitHopWallets;
|
|
418
247
|
// ✅ 检查是否使用分布式利润模式
|
|
419
|
-
const profitMode = config.profitMode
|
|
420
|
-
console.log('🔧 [SDK batchBuyWithBundleMerkle] config.profitMode:', config.profitMode, '-> resolved:', profitMode, 'wallets:', buyers.length);
|
|
248
|
+
const profitMode = config.profitMode ?? 'single';
|
|
421
249
|
if (extractProfit && nativeProfitAmount > 0n) {
|
|
422
250
|
if (profitMode === 'distributed') {
|
|
423
251
|
// ✅ 分布式模式:每个钱包独立扣除自己的利润,每个都有独立的多跳
|
|
424
252
|
// 最多支持 12 个钱包(12 交易 + 36 多跳 + 1 贿赂 = 49 笔)
|
|
425
253
|
const MAX_DISTRIBUTED_WALLETS = 12;
|
|
426
|
-
console.log('🔧 [SDK] 使用分布式利润模式,钱包数:', buyers.length);
|
|
427
254
|
if (buyers.length > MAX_DISTRIBUTED_WALLETS) {
|
|
428
255
|
throw new Error(`分布式利润模式最多支持 ${MAX_DISTRIBUTED_WALLETS} 个钱包,当前 ${buyers.length} 个`);
|
|
429
256
|
}
|
|
@@ -433,9 +260,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
433
260
|
for (let i = 0; i < buyers.length; i++) {
|
|
434
261
|
const walletOriginalAmount = originalAmounts[i];
|
|
435
262
|
// 按比例计算该钱包应承担的利润
|
|
436
|
-
const walletProfit = totalBuyAmount > 0n
|
|
437
|
-
? (nativeProfitAmount * walletOriginalAmount) / totalBuyAmount
|
|
438
|
-
: 0n;
|
|
263
|
+
const walletProfit = totalBuyAmount > 0n ? (nativeProfitAmount * walletOriginalAmount) / totalBuyAmount : 0n;
|
|
439
264
|
perWalletProfits.push(walletProfit);
|
|
440
265
|
}
|
|
441
266
|
// 为每个钱包生成独立的利润多跳交易
|
|
@@ -452,7 +277,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
452
277
|
gasPrice,
|
|
453
278
|
chainId,
|
|
454
279
|
txType: getTxType(config),
|
|
455
|
-
startNonce: profitNonce
|
|
280
|
+
startNonce: profitNonce,
|
|
456
281
|
});
|
|
457
282
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
458
283
|
if (profitHopResult.hopWallets) {
|
|
@@ -474,7 +299,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
474
299
|
gasPrice,
|
|
475
300
|
chainId,
|
|
476
301
|
txType: getTxType(config),
|
|
477
|
-
startNonce: profitNonce
|
|
302
|
+
startNonce: profitNonce,
|
|
478
303
|
});
|
|
479
304
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
480
305
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -489,7 +314,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
489
314
|
metadata: {
|
|
490
315
|
...buildProfitMetadata(extractProfit, totalBuyAmount, nativeProfitAmount, buyers.length),
|
|
491
316
|
profitMode, // ✅ 返回使用的利润模式
|
|
492
|
-
}
|
|
317
|
+
},
|
|
493
318
|
};
|
|
494
319
|
}
|
|
495
320
|
/**
|
|
@@ -504,23 +329,22 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
504
329
|
}
|
|
505
330
|
const { provider, chainId } = createChainContext(chain, config.rpcUrl);
|
|
506
331
|
const nonceManager = new NonceManager(provider);
|
|
507
|
-
const signedTxs = [];
|
|
508
332
|
const wallets = createWallets(privateKeys, provider);
|
|
509
|
-
const amountsWei = sellAmounts.map(a => ethers.parseUnits(a, 18));
|
|
333
|
+
const amountsWei = sellAmounts.map((a) => ethers.parseUnits(a, 18));
|
|
510
334
|
const portalAddr = FLAP_PORTAL_ADDRESSES[chain];
|
|
511
335
|
const readOnlyPortal = new ethers.Contract(portalAddr, PORTAL_ABI, provider);
|
|
512
336
|
const gasLimits = buildGasLimitList(wallets.length, config);
|
|
513
|
-
const portals = wallets.map(w => new ethers.Contract(portalAddr, PORTAL_ABI, w));
|
|
337
|
+
const portals = wallets.map((w) => new ethers.Contract(portalAddr, PORTAL_ABI, w));
|
|
514
338
|
// ✅ 确定 outputToken:如果传入了 quoteToken 且非零地址,则使用它;否则使用零地址(原生代币)
|
|
515
339
|
const outputToken = quoteToken && quoteToken !== ZERO_ADDRESS ? quoteToken : ZERO_ADDRESS;
|
|
516
340
|
const useNativeOutput = outputToken === ZERO_ADDRESS;
|
|
517
341
|
// ✅ 优化:如果前端传入了 nonces,直接使用(跳过 RPC 调用)
|
|
518
342
|
const presetNonces = config.nonces;
|
|
519
|
-
const extractProfit = shouldExtractProfit(
|
|
343
|
+
const extractProfit = shouldExtractProfit();
|
|
520
344
|
// ✅ 并行执行 gasPrice 和 quoteSellOutputs(Multicall3)
|
|
521
345
|
const [gasPrice, quotedOutputs] = await Promise.all([
|
|
522
346
|
resolveGasPrice(provider, config),
|
|
523
|
-
quoteSellOutputsWithQuote(readOnlyPortal, tokenAddress, amountsWei, outputToken)
|
|
347
|
+
quoteSellOutputsWithQuote(readOnlyPortal, tokenAddress, amountsWei, outputToken),
|
|
524
348
|
]);
|
|
525
349
|
// ✅ 计算利润和 maxRevenueIndex(用于 nonce 分配)
|
|
526
350
|
let totalTokenProfit = 0n;
|
|
@@ -530,7 +354,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
530
354
|
for (let i = 0; i < wallets.length; i++) {
|
|
531
355
|
const quoted = quotedOutputs[i];
|
|
532
356
|
if (quoted > 0n) {
|
|
533
|
-
const { profit } = calculateProfit(quoted
|
|
357
|
+
const { profit } = calculateProfit(quoted);
|
|
534
358
|
totalTokenProfit += profit;
|
|
535
359
|
if (quoted > maxRevenue) {
|
|
536
360
|
maxRevenue = quoted;
|
|
@@ -562,9 +386,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
562
386
|
const maxRevenueNonces = await nonceManager.getNextNonceBatch(wallets[maxRevenueIndex], maxRevenueNonceCount);
|
|
563
387
|
// 其他钱包各需要 1 个 nonce
|
|
564
388
|
const otherWallets = wallets.filter((_, i) => i !== maxRevenueIndex);
|
|
565
|
-
const otherNonces = otherWallets.length > 0
|
|
566
|
-
? await nonceManager.getNextNoncesForWallets(otherWallets)
|
|
567
|
-
: [];
|
|
389
|
+
const otherNonces = otherWallets.length > 0 ? await nonceManager.getNextNoncesForWallets(otherWallets) : [];
|
|
568
390
|
// 组装最终的 nonces 数组(保持原顺序)
|
|
569
391
|
nonces = [];
|
|
570
392
|
let otherIdx = 0;
|
|
@@ -595,7 +417,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
595
417
|
outputToken, // ✅ 使用动态 outputToken
|
|
596
418
|
inputAmount: amountsWei[i],
|
|
597
419
|
minOutputAmount: minOuts[i],
|
|
598
|
-
permitData: '0x'
|
|
420
|
+
permitData: '0x',
|
|
599
421
|
})));
|
|
600
422
|
// ✅ 贿赂交易放在首位
|
|
601
423
|
const bribeTxs = [];
|
|
@@ -607,7 +429,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
607
429
|
gasPrice,
|
|
608
430
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
609
431
|
chainId,
|
|
610
|
-
type: getTxType(config)
|
|
432
|
+
type: getTxType(config),
|
|
611
433
|
});
|
|
612
434
|
bribeTxs.push(bribeTx);
|
|
613
435
|
}
|
|
@@ -621,14 +443,13 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
621
443
|
gasPrice,
|
|
622
444
|
chainId,
|
|
623
445
|
type: getTxType(config),
|
|
624
|
-
value: 0n // ✅ 卖出交易不发送原生代币
|
|
446
|
+
value: 0n, // ✅ 卖出交易不发送原生代币
|
|
625
447
|
})));
|
|
626
448
|
// ✅ 利润多跳转账
|
|
627
449
|
const profitTxs = [];
|
|
628
450
|
let profitHopWallets;
|
|
629
451
|
// ✅ 检查是否使用分布式利润模式
|
|
630
|
-
const profitMode = config.profitMode
|
|
631
|
-
console.log('🔧 [SDK batchSellWithBundleMerkle] config.profitMode:', config.profitMode, '-> resolved:', profitMode, 'wallets:', wallets.length);
|
|
452
|
+
const profitMode = config.profitMode ?? 'single';
|
|
632
453
|
if (needProfitTx) {
|
|
633
454
|
// ERC20 输出时:获取代币利润等值的原生代币(BNB)报价
|
|
634
455
|
let totalNativeProfitAmount = totalTokenProfit;
|
|
@@ -662,7 +483,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
662
483
|
gasPrice,
|
|
663
484
|
chainId,
|
|
664
485
|
txType: getTxType(config),
|
|
665
|
-
startNonce: walletProfitNonce
|
|
486
|
+
startNonce: walletProfitNonce,
|
|
666
487
|
});
|
|
667
488
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
668
489
|
if (profitHopResult.hopWallets) {
|
|
@@ -684,7 +505,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
684
505
|
gasPrice,
|
|
685
506
|
chainId,
|
|
686
507
|
txType: getTxType(config),
|
|
687
|
-
startNonce: profitNonce
|
|
508
|
+
startNonce: profitNonce,
|
|
688
509
|
});
|
|
689
510
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
690
511
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -700,7 +521,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
700
521
|
metadata: {
|
|
701
522
|
profitMode, // ✅ 返回使用的利润模式
|
|
702
523
|
totalProfit: totalTokenProfit.toString(),
|
|
703
|
-
}
|
|
524
|
+
},
|
|
704
525
|
};
|
|
705
526
|
}
|
|
706
527
|
// ✅ Provider 缓存(复用连接,减少初始化开销)
|
|
@@ -721,29 +542,27 @@ function createChainContext(chain, rpcUrl) {
|
|
|
721
542
|
return { chainId, provider };
|
|
722
543
|
}
|
|
723
544
|
async function resolveGasPrice(provider, config) {
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
const gasPrice = config.gasPrice;
|
|
727
|
-
return gasPrice;
|
|
545
|
+
if ('gasPrice' in config && config.gasPrice !== undefined) {
|
|
546
|
+
return config.gasPrice;
|
|
728
547
|
}
|
|
729
548
|
return await getOptimizedGasPrice(provider, getGasPriceConfig(config));
|
|
730
549
|
}
|
|
731
550
|
function createWallets(privateKeys, provider) {
|
|
732
|
-
return privateKeys.map(key => new Wallet(key, provider));
|
|
551
|
+
return privateKeys.map((key) => new Wallet(key, provider));
|
|
733
552
|
}
|
|
734
553
|
function analyzeBuyFunds(buyAmounts, config, extractProfit) {
|
|
735
554
|
const result = {
|
|
736
555
|
fundsList: [],
|
|
737
556
|
originalAmounts: [],
|
|
738
557
|
totalBuyAmount: 0n,
|
|
739
|
-
totalProfit: 0n
|
|
558
|
+
totalProfit: 0n,
|
|
740
559
|
};
|
|
741
|
-
buyAmounts.forEach(amount => {
|
|
560
|
+
buyAmounts.forEach((amount) => {
|
|
742
561
|
const originalAmount = ethers.parseEther(amount);
|
|
743
562
|
result.originalAmounts.push(originalAmount);
|
|
744
563
|
result.totalBuyAmount += originalAmount;
|
|
745
564
|
if (extractProfit) {
|
|
746
|
-
const { remaining, profit } = calculateProfit(originalAmount
|
|
565
|
+
const { remaining, profit } = calculateProfit(originalAmount);
|
|
747
566
|
result.totalProfit += profit;
|
|
748
567
|
result.fundsList.push(remaining);
|
|
749
568
|
}
|
|
@@ -772,13 +591,13 @@ function findMaxIndex(values) {
|
|
|
772
591
|
* 当 inputToken 为非零地址(如 USDC)时,value 为 0
|
|
773
592
|
*/
|
|
774
593
|
async function populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, fundsList, inputToken, useNativeToken) {
|
|
775
|
-
const portals = buyers.map(wallet => new ethers.Contract(portalAddr, PORTAL_ABI, wallet));
|
|
594
|
+
const portals = buyers.map((wallet) => new ethers.Contract(portalAddr, PORTAL_ABI, wallet));
|
|
776
595
|
return await Promise.all(portals.map((portal, i) => portal.swapExactInput.populateTransaction({
|
|
777
596
|
inputToken,
|
|
778
597
|
outputToken: tokenAddress,
|
|
779
598
|
inputAmount: fundsList[i],
|
|
780
599
|
minOutputAmount: 0n,
|
|
781
|
-
permitData: '0x'
|
|
600
|
+
permitData: '0x',
|
|
782
601
|
},
|
|
783
602
|
// ✅ 如果使用原生代币,value 为购买金额;否则为 0
|
|
784
603
|
useNativeToken ? { value: fundsList[i] } : {})));
|
|
@@ -815,9 +634,7 @@ async function allocateBuyerNonces(buyers, extractProfit, maxIndex, totalProfit,
|
|
|
815
634
|
const maxIndexNonces = await nonceManager.getNextNonceBatch(buyers[maxIndex], 2);
|
|
816
635
|
// 其他钱包各需要 1 个 nonce
|
|
817
636
|
const otherBuyers = buyers.filter((_, i) => i !== maxIndex);
|
|
818
|
-
const otherNonces = otherBuyers.length > 0
|
|
819
|
-
? await nonceManager.getNextNoncesForWallets(otherBuyers)
|
|
820
|
-
: [];
|
|
637
|
+
const otherNonces = otherBuyers.length > 0 ? await nonceManager.getNextNoncesForWallets(otherBuyers) : [];
|
|
821
638
|
// 组装最终的 nonces 数组(保持原顺序)
|
|
822
639
|
const nonces = [];
|
|
823
640
|
let otherIdx = 0;
|
|
@@ -831,7 +648,7 @@ async function allocateBuyerNonces(buyers, extractProfit, maxIndex, totalProfit,
|
|
|
831
648
|
}
|
|
832
649
|
return nonces;
|
|
833
650
|
}
|
|
834
|
-
async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, gasPrice, chainId, config, fundsList, useNativeToken = true // ✅ 默认使用原生代币
|
|
651
|
+
async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, gasPrice, chainId, config, fundsList, useNativeToken = true, // ✅ 默认使用原生代币
|
|
835
652
|
}) {
|
|
836
653
|
return await Promise.all(unsignedBuys.map((unsigned, i) => buyers[i].signTransaction({
|
|
837
654
|
...unsigned,
|
|
@@ -841,7 +658,7 @@ async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, ga
|
|
|
841
658
|
gasPrice,
|
|
842
659
|
chainId,
|
|
843
660
|
type: getTxType(config),
|
|
844
|
-
value: useNativeToken ? fundsList[i] : 0n // ✅ 非原生代币时 value 为 0
|
|
661
|
+
value: useNativeToken ? fundsList[i] : 0n, // ✅ 非原生代币时 value 为 0
|
|
845
662
|
})));
|
|
846
663
|
}
|
|
847
664
|
function buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyerCount) {
|
|
@@ -852,7 +669,7 @@ function buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyerCo
|
|
|
852
669
|
totalBuyAmount: ethers.formatEther(totalBuyAmount),
|
|
853
670
|
profitAmount: ethers.formatEther(totalProfit),
|
|
854
671
|
profitRecipient: getProfitRecipient(),
|
|
855
|
-
buyerCount
|
|
672
|
+
buyerCount,
|
|
856
673
|
};
|
|
857
674
|
}
|
|
858
675
|
/**
|
|
@@ -868,7 +685,7 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
|
|
|
868
685
|
const result = await portal.quoteExactInput.staticCall({
|
|
869
686
|
inputToken: tokenAddress,
|
|
870
687
|
outputToken,
|
|
871
|
-
inputAmount: amountsWei[0]
|
|
688
|
+
inputAmount: amountsWei[0],
|
|
872
689
|
});
|
|
873
690
|
return [result];
|
|
874
691
|
}
|
|
@@ -881,14 +698,16 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
|
|
|
881
698
|
const portalIface = new Interface(PORTAL_ABI);
|
|
882
699
|
const multicall = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
|
|
883
700
|
// 构建批量调用
|
|
884
|
-
const calls = amountsWei.map(amount => ({
|
|
701
|
+
const calls = amountsWei.map((amount) => ({
|
|
885
702
|
target: portalAddress,
|
|
886
703
|
allowFailure: true, // 允许单个失败
|
|
887
|
-
callData: portalIface.encodeFunctionData('quoteExactInput', [
|
|
704
|
+
callData: portalIface.encodeFunctionData('quoteExactInput', [
|
|
705
|
+
{
|
|
888
706
|
inputToken: tokenAddress,
|
|
889
707
|
outputToken,
|
|
890
|
-
inputAmount: amount
|
|
891
|
-
}
|
|
708
|
+
inputAmount: amount,
|
|
709
|
+
},
|
|
710
|
+
]),
|
|
892
711
|
}));
|
|
893
712
|
try {
|
|
894
713
|
const results = await multicall.aggregate3.staticCall(calls);
|
|
@@ -912,7 +731,7 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
|
|
|
912
731
|
return await portal.quoteExactInput.staticCall({
|
|
913
732
|
inputToken: tokenAddress,
|
|
914
733
|
outputToken,
|
|
915
|
-
inputAmount: amount
|
|
734
|
+
inputAmount: amount,
|
|
916
735
|
});
|
|
917
736
|
}
|
|
918
737
|
catch {
|