four-flap-meme-sdk 2.2.18 → 2.2.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__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 +240 -0
- package/dist/abis/contracts/TaxToken.json +969 -0
- package/dist/abis/contracts/TokenManager.json +836 -0
- package/dist/abis/contracts/TokenManager2.json +136 -0
- package/dist/abis/contracts/TokenManagerHelper3.json +993 -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 +5 -0
- package/dist/abis/flap/index.js +5 -0
- package/dist/abis/flap/portal-eip7702.d.ts +4 -0
- package/dist/abis/flap/portal-eip7702.js +39 -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-merkle.d.ts +4 -0
- package/dist/abis/flap/portal-merkle.js +25 -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 +37 -0
- package/dist/bundle-core/config-helpers.js +58 -0
- package/dist/bundle-core/errors.d.ts +50 -0
- package/dist/bundle-core/errors.js +38 -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 +41 -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 +456 -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 +28 -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 +16 -0
- package/dist/bundle-core/internal.js +160 -0
- package/dist/bundle-core/sign-context-helpers.d.ts +26 -0
- package/dist/bundle-core/sign-context-helpers.js +63 -0
- package/dist/bundle-core/submit.d.ts +293 -0
- package/dist/bundle-core/submit.js +731 -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 +155 -0
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +80 -0
- package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
- package/dist/chains/bsc/pancake/bundle-buy-first.js +98 -213
- 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 +287 -0
- package/dist/chains/index.d.ts +13 -0
- package/dist/chains/index.js +13 -0
- package/dist/chains/xlayer/constants.d.ts +5 -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 +104 -74
- 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 +11 -26
- package/dist/chains/xlayer/eip7702/constants.js +15 -68
- 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 +58 -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.d.ts +1 -1
- package/dist/chains/xlayer/eoa/constants.js +2 -16
- package/dist/chains/xlayer/eoa/dex-helpers.d.ts +1 -1
- package/dist/chains/xlayer/eoa/dex-helpers.js +7 -37
- 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 +5 -4
- 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 +73 -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 +120 -187
- package/dist/contracts/tm.d.ts +10 -8
- package/dist/contracts/tm.js +39 -35
- package/dist/contracts/tm1.js +9 -4
- package/dist/contracts/tm2.js +10 -5
- package/dist/dex/direct-router-helpers.d.ts +269 -0
- package/dist/dex/direct-router-helpers.js +536 -0
- package/dist/dex/direct-router.d.ts +3 -125
- package/dist/dex/direct-router.js +244 -672
- 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 +11 -0
- package/dist/flap/index.js +9 -0
- package/dist/flows/create.d.ts +2 -1
- package/dist/flows/create.js +6 -6
- package/dist/flows/index.d.ts +9 -0
- package/dist/flows/index.js +9 -0
- package/dist/index.d.ts +20 -88
- package/dist/index.js +20 -218
- 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 -254
- package/dist/shared/abis/index.d.ts +5 -6
- package/dist/shared/abis/index.js +5 -7
- package/dist/shared/clients/blockrazor.d.ts +4 -8
- package/dist/shared/clients/blockrazor.js +43 -35
- package/dist/shared/clients/club48.d.ts +2 -2
- package/dist/shared/clients/club48.js +36 -30
- 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.d.ts +4 -3
- package/dist/shared/clients/merkle.js +30 -47
- package/dist/shared/constants/addresses.d.ts +27 -1
- package/dist/shared/constants/addresses.js +39 -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 +4 -1
- package/dist/shared/constants/index.js +2 -1
- 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 +3 -4
- 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 +4 -5
- package/dist/shared/flap/index.js +4 -5
- package/dist/shared/flap/launch-v6.d.ts +0 -5
- package/dist/shared/flap/launch-v6.js +2 -16
- package/dist/shared/flap/meta.d.ts +22 -18
- package/dist/shared/flap/meta.js +32 -24
- package/dist/shared/flap/permit.js +10 -3
- 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 +168 -175
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.d.ts +17 -4
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +96 -117
- package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +104 -122
- 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-batch.d.ts +8 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-batch.js +227 -0
- 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 +69 -288
- package/dist/shared/flap/portal-bundle-merkle/swap-cross.d.ts +9 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-cross.js +139 -0
- 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-planning.d.ts +70 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-planning.js +182 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-quick-batch.d.ts +16 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-quick-batch.js +327 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-single.d.ts +2 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-single.js +184 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-types.d.ts +101 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-types.js +1 -0
- package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +6 -199
- package/dist/shared/flap/portal-bundle-merkle/swap.js +5 -1357
- package/dist/shared/flap/portal-bundle-merkle/types.d.ts +88 -12
- 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 +83 -78
- package/dist/shared/flap/portal-create-token.d.ts +39 -21
- package/dist/shared/flap/portal-create-token.js +121 -124
- package/dist/shared/flap/portal.d.ts +1 -2
- package/dist/shared/flap/portal.js +36 -28
- package/dist/shared/flap/vanity.d.ts +6 -6
- package/dist/shared/flap/vanity.js +15 -21
- package/dist/shared/flap/vault.d.ts +25 -93
- package/dist/shared/flap/vault.js +77 -127
- package/dist/shared/foundation/amount/split-by-weight.d.ts +5 -0
- package/dist/shared/foundation/amount/split-by-weight.js +35 -0
- 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/erc20/decimals.d.ts +7 -0
- package/dist/shared/foundation/erc20/decimals.js +24 -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 +15 -0
- package/dist/shared/foundation/index.js +14 -0
- package/dist/shared/foundation/nonce/nonce-manager.d.ts +19 -0
- package/dist/shared/foundation/nonce/nonce-manager.js +217 -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/foundation/wallet/generate.d.ts +5 -0
- package/dist/shared/foundation/wallet/generate.js +8 -0
- package/dist/shared/four/tax-token.d.ts +1 -1
- package/dist/shared/four/tax-token.js +31 -10
- 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 +98 -129
- 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 +50 -671
- 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 +78 -293
- 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 +39 -19
- 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 +4 -25
- package/dist/utils/wallet.js +27 -22
- package/dist/vanity/index.d.ts +5 -0
- package/dist/vanity/index.js +5 -0
- package/package.json +100 -2
|
@@ -1,92 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core - 主函数
|
|
3
|
+
*/
|
|
1
4
|
import { ethers, Wallet, Contract, Interface } from 'ethers';
|
|
2
|
-
import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
|
|
3
|
-
import {
|
|
4
|
-
import { GAS_LIMITS
|
|
5
|
-
import { MULTICALL3_ABI
|
|
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';
|
|
6
9
|
import { FLAP_PORTAL_ADDRESSES, FLAP_ORIGINAL_PORTAL_ADDRESSES } from '../constants.js';
|
|
7
|
-
import {
|
|
8
|
-
import { CHAIN_ID_MAP, PORTAL_ABI, getErrorMessage, getTxType, getGasPriceConfig, shouldExtractProfit, calculateProfit, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA } from './config.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
const
|
|
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
|
+
import { SdkError } from '../../../utils/errors.js';
|
|
15
|
+
import { SdkErrorCode } from '../../../types/errors.js';
|
|
16
|
+
function validateQuoteTokenDecimals(decimals, source) {
|
|
17
|
+
if (decimals === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (!Number.isInteger(decimals) || decimals < 0 || decimals > 18) {
|
|
20
|
+
throw new SdkError(SdkErrorCode.INVALID_AMOUNT, `${source}: quoteTokenDecimals 必须是 0-18 的整数,收到 ${String(decimals)}`);
|
|
21
|
+
}
|
|
22
|
+
return decimals;
|
|
23
|
+
}
|
|
24
|
+
function resolveCreateTokenLaunchFlags(params) {
|
|
25
|
+
const normalizedTax = normalizeTaxLaunchConfig(params.taxV2Config, params.taxRate);
|
|
26
|
+
const isTaxLaunch = !!normalizedTax || (params.taxRate ?? 0) > 0;
|
|
27
|
+
const hasVault = !!normalizedTax?.vaultConfig && normalizedTax.vaultConfig.vaultType !== 'none';
|
|
28
|
+
const useV7Portal = !isTaxLaunch &&
|
|
29
|
+
!hasVault &&
|
|
30
|
+
(params.lpFeeProfile !== undefined ||
|
|
31
|
+
params.dexId !== undefined ||
|
|
32
|
+
params.migratorType === MigratorType.PCS_INFINITY_CL_MIGRATOR);
|
|
33
|
+
return { normalizedTax, isTaxLaunch, hasVault, useV7Portal };
|
|
34
|
+
}
|
|
24
35
|
/**
|
|
25
|
-
*
|
|
26
|
-
* @param provider - Provider 实例
|
|
27
|
-
* @param tokenAddress - ERC20 代币地址
|
|
28
|
-
* @param tokenAmount - 代币数量(wei)
|
|
29
|
-
* @param chainId - 链 ID(56=BSC, 143=Monad)
|
|
30
|
-
* @returns 等值的原生代币数量(wei),失败返回 0n
|
|
36
|
+
* 无捆绑钱包、仅 Dev 自跟买、原生报价 → Flap 文档方式 A(create 内 quoteAmt + msg.value)
|
|
31
37
|
*/
|
|
32
|
-
|
|
33
|
-
if (
|
|
34
|
-
return
|
|
38
|
+
function canUseLaunchMethodA(privateKeys, buyAmounts, devAddress, useNativeToken) {
|
|
39
|
+
if (!useNativeToken || buyAmounts.length !== 1 || privateKeys.length !== 2) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
35
42
|
try {
|
|
36
|
-
|
|
37
|
-
|
|
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;
|
|
43
|
+
const buyerAddr = new Wallet(privateKeys[1]).address;
|
|
44
|
+
return buyerAddr.toLowerCase() === devAddress.toLowerCase();
|
|
62
45
|
}
|
|
63
46
|
catch {
|
|
64
|
-
|
|
65
|
-
return 0n;
|
|
47
|
+
return false;
|
|
66
48
|
}
|
|
67
49
|
}
|
|
68
|
-
/**
|
|
69
|
-
* 获取 Gas Limit
|
|
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
|
|
89
|
-
*/
|
|
90
50
|
export async function createTokenWithBundleBuyMerkle(params) {
|
|
91
51
|
const { chain, privateKeys, buyAmounts, tokenInfo, tokenAddress, config } = params;
|
|
92
52
|
if (privateKeys.length === 0) {
|
|
@@ -103,6 +63,16 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
103
63
|
const originalPortalAddr = FLAP_ORIGINAL_PORTAL_ADDRESSES[chain];
|
|
104
64
|
const portal = new ethers.Contract(originalPortalAddr, PORTAL_ABI, devWallet);
|
|
105
65
|
const { normalizedTax, useV7Portal } = resolveCreateTokenLaunchFlags(params);
|
|
66
|
+
const inputToken = params.quoteToken && params.quoteToken !== ZERO_ADDRESS ? params.quoteToken : ZERO_ADDRESS;
|
|
67
|
+
const useNativeToken = inputToken === ZERO_ADDRESS;
|
|
68
|
+
const extractProfit = config.extractProfitOnLaunch === false ? false : shouldExtractProfit(config);
|
|
69
|
+
const useMethodA = canUseLaunchMethodA(privateKeys, buyAmounts, devWallet.address, useNativeToken);
|
|
70
|
+
let methodAQuoteAmt = 0n;
|
|
71
|
+
let methodABuyMeta;
|
|
72
|
+
if (useMethodA) {
|
|
73
|
+
methodABuyMeta = analyzeBuyFunds(buyAmounts, config, extractProfit);
|
|
74
|
+
methodAQuoteAmt = methodABuyMeta.fundsList[0] ?? 0n;
|
|
75
|
+
}
|
|
106
76
|
const createTxPromise = populateCreateTokenTransaction({
|
|
107
77
|
chain,
|
|
108
78
|
devWallet,
|
|
@@ -114,20 +84,18 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
114
84
|
salt: params.salt,
|
|
115
85
|
migratorType: params.migratorType,
|
|
116
86
|
taxRate: params.taxRate,
|
|
117
|
-
buyTaxRate: params.buyTaxRate,
|
|
118
|
-
sellTaxRate: params.sellTaxRate,
|
|
119
87
|
dexId: params.dexId,
|
|
120
88
|
lpFeeProfile: params.lpFeeProfile,
|
|
121
89
|
extensionID: params.extensionID,
|
|
122
90
|
extensionData: params.extensionData,
|
|
123
91
|
useV7Portal,
|
|
124
92
|
taxConfig: normalizedTax,
|
|
125
|
-
initialQuoteAmt: 0n,
|
|
93
|
+
initialQuoteAmt: useMethodA ? methodAQuoteAmt : 0n,
|
|
126
94
|
});
|
|
127
95
|
const [gasPrice, createTxUnsigned, devNonce] = await Promise.all([
|
|
128
96
|
resolveGasPrice(provider, config),
|
|
129
97
|
createTxPromise,
|
|
130
|
-
nonceManager.getNextNonce(devWallet)
|
|
98
|
+
nonceManager.getNextNonce(devWallet),
|
|
131
99
|
]);
|
|
132
100
|
const createTxRequest = {
|
|
133
101
|
...createTxUnsigned,
|
|
@@ -136,36 +104,75 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
136
104
|
gasLimit: getGasLimit(config),
|
|
137
105
|
gasPrice,
|
|
138
106
|
chainId,
|
|
139
|
-
type: getTxType(config)
|
|
107
|
+
type: getTxType(config),
|
|
108
|
+
value: useMethodA ? methodAQuoteAmt : 0n,
|
|
140
109
|
};
|
|
141
110
|
const signedCreateTx = await devWallet.signTransaction(createTxRequest);
|
|
142
111
|
signedTxs.push(signedCreateTx);
|
|
112
|
+
if (useMethodA && methodABuyMeta) {
|
|
113
|
+
const { totalBuyAmount, totalProfit } = methodABuyMeta;
|
|
114
|
+
const bribeAmount = getBribeAmount(config);
|
|
115
|
+
const bribeTxs = [];
|
|
116
|
+
let nextDevNonce = devNonce + 1;
|
|
117
|
+
if (bribeAmount > 0n) {
|
|
118
|
+
const bribeTx = await devWallet.signTransaction({
|
|
119
|
+
to: BLOCKRAZOR_BUILDER_EOA,
|
|
120
|
+
value: bribeAmount,
|
|
121
|
+
nonce: nextDevNonce,
|
|
122
|
+
gasPrice,
|
|
123
|
+
gasLimit: GAS_LIMITS.BRIBE,
|
|
124
|
+
chainId,
|
|
125
|
+
type: getTxType(config),
|
|
126
|
+
});
|
|
127
|
+
bribeTxs.push(bribeTx);
|
|
128
|
+
nextDevNonce += 1;
|
|
129
|
+
}
|
|
130
|
+
const profitTxs = [];
|
|
131
|
+
let profitHopWallets;
|
|
132
|
+
if (extractProfit && totalProfit > 0n) {
|
|
133
|
+
const profitHopResult = await buildProfitHopTransactions({
|
|
134
|
+
provider,
|
|
135
|
+
payerWallet: devWallet,
|
|
136
|
+
profitAmount: totalProfit,
|
|
137
|
+
profitRecipient: getProfitRecipient(),
|
|
138
|
+
hopCount: PROFIT_HOP_COUNT,
|
|
139
|
+
gasPrice,
|
|
140
|
+
chainId,
|
|
141
|
+
txType: getTxType(config),
|
|
142
|
+
startNonce: nextDevNonce,
|
|
143
|
+
});
|
|
144
|
+
profitTxs.push(...profitHopResult.signedTransactions);
|
|
145
|
+
profitHopWallets = profitHopResult.hopWallets;
|
|
146
|
+
}
|
|
147
|
+
nonceManager.clearTemp();
|
|
148
|
+
return {
|
|
149
|
+
signedTransactions: [...bribeTxs, ...signedTxs, ...profitTxs],
|
|
150
|
+
tokenAddress,
|
|
151
|
+
profitHopWallets,
|
|
152
|
+
metadata: {
|
|
153
|
+
...buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, 0),
|
|
154
|
+
launchMethod: 'quoteAmt',
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
143
158
|
const buyers = createWallets(privateKeys.slice(1), provider);
|
|
144
|
-
const extractProfit = shouldExtractProfit(config);
|
|
145
159
|
const { fundsList, originalAmounts, totalBuyAmount, totalProfit } = analyzeBuyFunds(buyAmounts, config, extractProfit);
|
|
146
160
|
const maxFundsIndex = findMaxIndex(originalAmounts);
|
|
147
161
|
const gasLimits = buildGasLimitList(buyers.length, config);
|
|
148
|
-
|
|
149
|
-
const inputToken = params.quoteToken && params.quoteToken !== ZERO_ADDRESS ? params.quoteToken : ZERO_ADDRESS;
|
|
150
|
-
const useNativeToken = inputToken === ZERO_ADDRESS;
|
|
162
|
+
const validatedCreateQuoteDecimals = validateQuoteTokenDecimals(params.quoteTokenDecimals, 'createTokenWithBundleBuyMerkle');
|
|
151
163
|
// ✅ 如果使用非原生代币(如 USDC),需要根据精度转换金额
|
|
152
164
|
let adjustedFundsList = fundsList;
|
|
153
165
|
let profitTokenAmount = totalProfit;
|
|
154
|
-
if (!useNativeToken &&
|
|
155
|
-
const decimalsDiff = 18 -
|
|
166
|
+
if (!useNativeToken && validatedCreateQuoteDecimals !== undefined && validatedCreateQuoteDecimals !== 18) {
|
|
167
|
+
const decimalsDiff = 18 - validatedCreateQuoteDecimals;
|
|
156
168
|
const divisor = BigInt(10 ** decimalsDiff);
|
|
157
|
-
adjustedFundsList = fundsList.map(amount => amount / divisor);
|
|
169
|
+
adjustedFundsList = fundsList.map((amount) => amount / divisor);
|
|
158
170
|
profitTokenAmount = totalProfit / divisor;
|
|
159
171
|
}
|
|
160
172
|
// ✅ 优化:并行获取 unsignedBuys 和 buyerNonces
|
|
161
|
-
// TOKEN_V3_PERMIT / newTokenV7 内盘买入须 swapExactInputV3(与 create-to-dex 一致)
|
|
162
|
-
const usePortalSwapV3 = useV7Portal ||
|
|
163
|
-
(params.lpFeeProfile !== undefined && !normalizedTax) ||
|
|
164
|
-
(!!params.extensionID &&
|
|
165
|
-
params.extensionID !== '0x' + '00'.repeat(32));
|
|
166
173
|
const [unsignedBuys, buyerNonces] = await Promise.all([
|
|
167
|
-
populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, adjustedFundsList, inputToken, useNativeToken
|
|
168
|
-
allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, useNativeToken ? totalProfit : profitTokenAmount, nonceManager)
|
|
174
|
+
populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, adjustedFundsList, inputToken, useNativeToken),
|
|
175
|
+
allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, useNativeToken ? totalProfit : profitTokenAmount, nonceManager),
|
|
169
176
|
]);
|
|
170
177
|
// ✅ 贿赂交易放在首位(提高 BlockRazor 打包优先级)
|
|
171
178
|
const bribeAmount = getBribeAmount(config);
|
|
@@ -180,7 +187,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
180
187
|
gasPrice,
|
|
181
188
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
182
189
|
chainId,
|
|
183
|
-
type: getTxType(config)
|
|
190
|
+
type: getTxType(config),
|
|
184
191
|
});
|
|
185
192
|
bribeTxs.push(bribeTx);
|
|
186
193
|
// 调整 maxFundsIndex 钱包的 nonce(买入交易 +1)
|
|
@@ -195,7 +202,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
195
202
|
chainId,
|
|
196
203
|
config,
|
|
197
204
|
fundsList: adjustedFundsList, // ✅ 使用调整后的金额
|
|
198
|
-
useNativeToken // ✅ 传递是否使用原生代币
|
|
205
|
+
useNativeToken, // ✅ 传递是否使用原生代币
|
|
199
206
|
});
|
|
200
207
|
// ✅ 利润多跳转账(强制 2 跳中转)
|
|
201
208
|
const profitTxs = [];
|
|
@@ -216,7 +223,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
216
223
|
gasPrice,
|
|
217
224
|
chainId,
|
|
218
225
|
txType: getTxType(config),
|
|
219
|
-
startNonce: profitNonce
|
|
226
|
+
startNonce: profitNonce,
|
|
220
227
|
});
|
|
221
228
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
222
229
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -228,7 +235,10 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
228
235
|
signedTransactions: [...bribeTxs, ...signedTxs, ...signedBuys, ...profitTxs],
|
|
229
236
|
tokenAddress,
|
|
230
237
|
profitHopWallets, // ✅ 返回利润多跳钱包
|
|
231
|
-
metadata:
|
|
238
|
+
metadata: {
|
|
239
|
+
...buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyers.length),
|
|
240
|
+
launchMethod: 'swapExactInput',
|
|
241
|
+
},
|
|
232
242
|
};
|
|
233
243
|
}
|
|
234
244
|
/**
|
|
@@ -243,9 +253,8 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
243
253
|
}
|
|
244
254
|
const { provider, chainId } = createChainContext(chain, config.rpcUrl);
|
|
245
255
|
const nonceManager = new NonceManager(provider);
|
|
246
|
-
const signedTxs = [];
|
|
247
256
|
const buyers = createWallets(privateKeys, provider);
|
|
248
|
-
const extractProfit = shouldExtractProfit(
|
|
257
|
+
const extractProfit = shouldExtractProfit();
|
|
249
258
|
const { fundsList, originalAmounts, totalBuyAmount, totalProfit } = analyzeBuyFunds(buyAmounts, config, extractProfit);
|
|
250
259
|
const maxFundsIndex = findMaxIndex(originalAmounts);
|
|
251
260
|
const gasLimits = buildGasLimitList(buyers.length, config);
|
|
@@ -253,17 +262,18 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
253
262
|
const inputToken = quoteToken && quoteToken !== ZERO_ADDRESS ? quoteToken : ZERO_ADDRESS;
|
|
254
263
|
// ✅ 如果使用非原生代币,则 value 应为 0(不发送原生代币)
|
|
255
264
|
const useNativeToken = inputToken === ZERO_ADDRESS;
|
|
265
|
+
const validatedBatchQuoteDecimals = validateQuoteTokenDecimals(quoteTokenDecimals, 'batchBuyWithBundleMerkle');
|
|
256
266
|
// ✅ 如果使用非原生代币(如 USDC),需要根据精度转换金额
|
|
257
267
|
// buyAmounts 是按 18 位精度传入的,需要转换为目标代币精度
|
|
258
268
|
let adjustedFundsList = fundsList;
|
|
259
269
|
let profitTokenAmount = totalProfit;
|
|
260
|
-
if (!useNativeToken &&
|
|
270
|
+
if (!useNativeToken && validatedBatchQuoteDecimals !== undefined && validatedBatchQuoteDecimals !== 18) {
|
|
261
271
|
// 从 18 位精度转换为目标精度
|
|
262
272
|
// 例如:0.1 ETH (18位) = 100000000000000000 wei
|
|
263
273
|
// 转为 USDC (6位) = 100000 (0.1 USDC)
|
|
264
|
-
const decimalsDiff = 18 -
|
|
274
|
+
const decimalsDiff = 18 - validatedBatchQuoteDecimals;
|
|
265
275
|
const divisor = BigInt(10 ** decimalsDiff);
|
|
266
|
-
adjustedFundsList = fundsList.map(amount => amount / divisor);
|
|
276
|
+
adjustedFundsList = fundsList.map((amount) => amount / divisor);
|
|
267
277
|
profitTokenAmount = totalProfit / divisor;
|
|
268
278
|
}
|
|
269
279
|
// ✅ ERC20 购买:获取代币利润等值的原生代币(BNB)报价
|
|
@@ -280,10 +290,8 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
280
290
|
populateBuyTransactionsWithQuote(buyers, FLAP_PORTAL_ADDRESSES[chain], tokenAddress, adjustedFundsList, inputToken, useNativeToken),
|
|
281
291
|
presetNonces && presetNonces.length === buyers.length
|
|
282
292
|
? adjustNoncesForProfit(presetNonces) // ✅ 调整 nonces 避免冲突
|
|
283
|
-
: allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, nativeProfitAmount, nonceManager)
|
|
293
|
+
: allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, nativeProfitAmount, nonceManager),
|
|
284
294
|
]);
|
|
285
|
-
if (presetNonces) {
|
|
286
|
-
}
|
|
287
295
|
// ✅ 贿赂交易放在首位(提高 BlockRazor 打包优先级)
|
|
288
296
|
const bribeAmount = getBribeAmount(config);
|
|
289
297
|
const bribeTxs = [];
|
|
@@ -296,7 +304,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
296
304
|
gasPrice,
|
|
297
305
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
298
306
|
chainId,
|
|
299
|
-
type: getTxType(config)
|
|
307
|
+
type: getTxType(config),
|
|
300
308
|
});
|
|
301
309
|
bribeTxs.push(bribeTx);
|
|
302
310
|
// 调整 maxFundsIndex 钱包的 nonce(买入交易 +1)
|
|
@@ -311,20 +319,18 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
311
319
|
chainId,
|
|
312
320
|
config,
|
|
313
321
|
fundsList: adjustedFundsList, // ✅ 使用调整后的金额
|
|
314
|
-
useNativeToken // ✅ USDT 购买时 value=0,BNB 购买时 value=金额
|
|
322
|
+
useNativeToken, // ✅ USDT 购买时 value=0,BNB 购买时 value=金额
|
|
315
323
|
});
|
|
316
324
|
// ✅ 利润多跳转账
|
|
317
325
|
const profitTxs = [];
|
|
318
326
|
let profitHopWallets;
|
|
319
327
|
// ✅ 检查是否使用分布式利润模式
|
|
320
|
-
const profitMode = config.profitMode
|
|
321
|
-
console.log('🔧 [SDK batchBuyWithBundleMerkle] config.profitMode:', config.profitMode, '-> resolved:', profitMode, 'wallets:', buyers.length);
|
|
328
|
+
const profitMode = config.profitMode ?? 'single';
|
|
322
329
|
if (extractProfit && nativeProfitAmount > 0n) {
|
|
323
330
|
if (profitMode === 'distributed') {
|
|
324
331
|
// ✅ 分布式模式:每个钱包独立扣除自己的利润,每个都有独立的多跳
|
|
325
332
|
// 最多支持 12 个钱包(12 交易 + 36 多跳 + 1 贿赂 = 49 笔)
|
|
326
333
|
const MAX_DISTRIBUTED_WALLETS = 12;
|
|
327
|
-
console.log('🔧 [SDK] 使用分布式利润模式,钱包数:', buyers.length);
|
|
328
334
|
if (buyers.length > MAX_DISTRIBUTED_WALLETS) {
|
|
329
335
|
throw new Error(`分布式利润模式最多支持 ${MAX_DISTRIBUTED_WALLETS} 个钱包,当前 ${buyers.length} 个`);
|
|
330
336
|
}
|
|
@@ -334,9 +340,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
334
340
|
for (let i = 0; i < buyers.length; i++) {
|
|
335
341
|
const walletOriginalAmount = originalAmounts[i];
|
|
336
342
|
// 按比例计算该钱包应承担的利润
|
|
337
|
-
const walletProfit = totalBuyAmount > 0n
|
|
338
|
-
? (nativeProfitAmount * walletOriginalAmount) / totalBuyAmount
|
|
339
|
-
: 0n;
|
|
343
|
+
const walletProfit = totalBuyAmount > 0n ? (nativeProfitAmount * walletOriginalAmount) / totalBuyAmount : 0n;
|
|
340
344
|
perWalletProfits.push(walletProfit);
|
|
341
345
|
}
|
|
342
346
|
// 为每个钱包生成独立的利润多跳交易
|
|
@@ -353,7 +357,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
353
357
|
gasPrice,
|
|
354
358
|
chainId,
|
|
355
359
|
txType: getTxType(config),
|
|
356
|
-
startNonce: profitNonce
|
|
360
|
+
startNonce: profitNonce,
|
|
357
361
|
});
|
|
358
362
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
359
363
|
if (profitHopResult.hopWallets) {
|
|
@@ -375,7 +379,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
375
379
|
gasPrice,
|
|
376
380
|
chainId,
|
|
377
381
|
txType: getTxType(config),
|
|
378
|
-
startNonce: profitNonce
|
|
382
|
+
startNonce: profitNonce,
|
|
379
383
|
});
|
|
380
384
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
381
385
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -390,7 +394,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
390
394
|
metadata: {
|
|
391
395
|
...buildProfitMetadata(extractProfit, totalBuyAmount, nativeProfitAmount, buyers.length),
|
|
392
396
|
profitMode, // ✅ 返回使用的利润模式
|
|
393
|
-
}
|
|
397
|
+
},
|
|
394
398
|
};
|
|
395
399
|
}
|
|
396
400
|
/**
|
|
@@ -405,23 +409,22 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
405
409
|
}
|
|
406
410
|
const { provider, chainId } = createChainContext(chain, config.rpcUrl);
|
|
407
411
|
const nonceManager = new NonceManager(provider);
|
|
408
|
-
const signedTxs = [];
|
|
409
412
|
const wallets = createWallets(privateKeys, provider);
|
|
410
|
-
const amountsWei = sellAmounts.map(a => ethers.parseUnits(a, 18));
|
|
413
|
+
const amountsWei = sellAmounts.map((a) => ethers.parseUnits(a, 18));
|
|
411
414
|
const portalAddr = FLAP_PORTAL_ADDRESSES[chain];
|
|
412
415
|
const readOnlyPortal = new ethers.Contract(portalAddr, PORTAL_ABI, provider);
|
|
413
416
|
const gasLimits = buildGasLimitList(wallets.length, config);
|
|
414
|
-
const portals = wallets.map(w => new ethers.Contract(portalAddr, PORTAL_ABI, w));
|
|
417
|
+
const portals = wallets.map((w) => new ethers.Contract(portalAddr, PORTAL_ABI, w));
|
|
415
418
|
// ✅ 确定 outputToken:如果传入了 quoteToken 且非零地址,则使用它;否则使用零地址(原生代币)
|
|
416
419
|
const outputToken = quoteToken && quoteToken !== ZERO_ADDRESS ? quoteToken : ZERO_ADDRESS;
|
|
417
420
|
const useNativeOutput = outputToken === ZERO_ADDRESS;
|
|
418
421
|
// ✅ 优化:如果前端传入了 nonces,直接使用(跳过 RPC 调用)
|
|
419
422
|
const presetNonces = config.nonces;
|
|
420
|
-
const extractProfit = shouldExtractProfit(
|
|
423
|
+
const extractProfit = shouldExtractProfit();
|
|
421
424
|
// ✅ 并行执行 gasPrice 和 quoteSellOutputs(Multicall3)
|
|
422
425
|
const [gasPrice, quotedOutputs] = await Promise.all([
|
|
423
426
|
resolveGasPrice(provider, config),
|
|
424
|
-
quoteSellOutputsWithQuote(readOnlyPortal, tokenAddress, amountsWei, outputToken)
|
|
427
|
+
quoteSellOutputsWithQuote(readOnlyPortal, tokenAddress, amountsWei, outputToken),
|
|
425
428
|
]);
|
|
426
429
|
// ✅ 计算利润和 maxRevenueIndex(用于 nonce 分配)
|
|
427
430
|
let totalTokenProfit = 0n;
|
|
@@ -431,7 +434,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
431
434
|
for (let i = 0; i < wallets.length; i++) {
|
|
432
435
|
const quoted = quotedOutputs[i];
|
|
433
436
|
if (quoted > 0n) {
|
|
434
|
-
const { profit } = calculateProfit(quoted
|
|
437
|
+
const { profit } = calculateProfit(quoted);
|
|
435
438
|
totalTokenProfit += profit;
|
|
436
439
|
if (quoted > maxRevenue) {
|
|
437
440
|
maxRevenue = quoted;
|
|
@@ -463,9 +466,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
463
466
|
const maxRevenueNonces = await nonceManager.getNextNonceBatch(wallets[maxRevenueIndex], maxRevenueNonceCount);
|
|
464
467
|
// 其他钱包各需要 1 个 nonce
|
|
465
468
|
const otherWallets = wallets.filter((_, i) => i !== maxRevenueIndex);
|
|
466
|
-
const otherNonces = otherWallets.length > 0
|
|
467
|
-
? await nonceManager.getNextNoncesForWallets(otherWallets)
|
|
468
|
-
: [];
|
|
469
|
+
const otherNonces = otherWallets.length > 0 ? await nonceManager.getNextNoncesForWallets(otherWallets) : [];
|
|
469
470
|
// 组装最终的 nonces 数组(保持原顺序)
|
|
470
471
|
nonces = [];
|
|
471
472
|
let otherIdx = 0;
|
|
@@ -496,7 +497,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
496
497
|
outputToken, // ✅ 使用动态 outputToken
|
|
497
498
|
inputAmount: amountsWei[i],
|
|
498
499
|
minOutputAmount: minOuts[i],
|
|
499
|
-
permitData: '0x'
|
|
500
|
+
permitData: '0x',
|
|
500
501
|
})));
|
|
501
502
|
// ✅ 贿赂交易放在首位
|
|
502
503
|
const bribeTxs = [];
|
|
@@ -508,7 +509,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
508
509
|
gasPrice,
|
|
509
510
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
510
511
|
chainId,
|
|
511
|
-
type: getTxType(config)
|
|
512
|
+
type: getTxType(config),
|
|
512
513
|
});
|
|
513
514
|
bribeTxs.push(bribeTx);
|
|
514
515
|
}
|
|
@@ -522,14 +523,13 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
522
523
|
gasPrice,
|
|
523
524
|
chainId,
|
|
524
525
|
type: getTxType(config),
|
|
525
|
-
value: 0n // ✅ 卖出交易不发送原生代币
|
|
526
|
+
value: 0n, // ✅ 卖出交易不发送原生代币
|
|
526
527
|
})));
|
|
527
528
|
// ✅ 利润多跳转账
|
|
528
529
|
const profitTxs = [];
|
|
529
530
|
let profitHopWallets;
|
|
530
531
|
// ✅ 检查是否使用分布式利润模式
|
|
531
|
-
const profitMode = config.profitMode
|
|
532
|
-
console.log('🔧 [SDK batchSellWithBundleMerkle] config.profitMode:', config.profitMode, '-> resolved:', profitMode, 'wallets:', wallets.length);
|
|
532
|
+
const profitMode = config.profitMode ?? 'single';
|
|
533
533
|
if (needProfitTx) {
|
|
534
534
|
// ERC20 输出时:获取代币利润等值的原生代币(BNB)报价
|
|
535
535
|
let totalNativeProfitAmount = totalTokenProfit;
|
|
@@ -563,7 +563,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
563
563
|
gasPrice,
|
|
564
564
|
chainId,
|
|
565
565
|
txType: getTxType(config),
|
|
566
|
-
startNonce: walletProfitNonce
|
|
566
|
+
startNonce: walletProfitNonce,
|
|
567
567
|
});
|
|
568
568
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
569
569
|
if (profitHopResult.hopWallets) {
|
|
@@ -585,7 +585,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
585
585
|
gasPrice,
|
|
586
586
|
chainId,
|
|
587
587
|
txType: getTxType(config),
|
|
588
|
-
startNonce: profitNonce
|
|
588
|
+
startNonce: profitNonce,
|
|
589
589
|
});
|
|
590
590
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
591
591
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -601,7 +601,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
601
601
|
metadata: {
|
|
602
602
|
profitMode, // ✅ 返回使用的利润模式
|
|
603
603
|
totalProfit: totalTokenProfit.toString(),
|
|
604
|
-
}
|
|
604
|
+
},
|
|
605
605
|
};
|
|
606
606
|
}
|
|
607
607
|
// ✅ Provider 缓存(复用连接,减少初始化开销)
|
|
@@ -622,29 +622,27 @@ function createChainContext(chain, rpcUrl) {
|
|
|
622
622
|
return { chainId, provider };
|
|
623
623
|
}
|
|
624
624
|
async function resolveGasPrice(provider, config) {
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
const gasPrice = config.gasPrice;
|
|
628
|
-
return gasPrice;
|
|
625
|
+
if ('gasPrice' in config && config.gasPrice !== undefined) {
|
|
626
|
+
return config.gasPrice;
|
|
629
627
|
}
|
|
630
628
|
return await getOptimizedGasPrice(provider, getGasPriceConfig(config));
|
|
631
629
|
}
|
|
632
630
|
function createWallets(privateKeys, provider) {
|
|
633
|
-
return privateKeys.map(key => new Wallet(key, provider));
|
|
631
|
+
return privateKeys.map((key) => new Wallet(key, provider));
|
|
634
632
|
}
|
|
635
633
|
function analyzeBuyFunds(buyAmounts, config, extractProfit) {
|
|
636
634
|
const result = {
|
|
637
635
|
fundsList: [],
|
|
638
636
|
originalAmounts: [],
|
|
639
637
|
totalBuyAmount: 0n,
|
|
640
|
-
totalProfit: 0n
|
|
638
|
+
totalProfit: 0n,
|
|
641
639
|
};
|
|
642
|
-
buyAmounts.forEach(amount => {
|
|
640
|
+
buyAmounts.forEach((amount) => {
|
|
643
641
|
const originalAmount = ethers.parseEther(amount);
|
|
644
642
|
result.originalAmounts.push(originalAmount);
|
|
645
643
|
result.totalBuyAmount += originalAmount;
|
|
646
644
|
if (extractProfit) {
|
|
647
|
-
const { remaining, profit } = calculateProfit(originalAmount
|
|
645
|
+
const { remaining, profit } = calculateProfit(originalAmount);
|
|
648
646
|
result.totalProfit += profit;
|
|
649
647
|
result.fundsList.push(remaining);
|
|
650
648
|
}
|
|
@@ -672,22 +670,17 @@ function findMaxIndex(values) {
|
|
|
672
670
|
* ✅ 支持 quoteToken 的买入交易构建
|
|
673
671
|
* 当 inputToken 为非零地址(如 USDC)时,value 为 0
|
|
674
672
|
*/
|
|
675
|
-
async function populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, fundsList, inputToken, useNativeToken
|
|
676
|
-
const portals = buyers.map(wallet => new ethers.Contract(portalAddr, PORTAL_ABI, wallet));
|
|
677
|
-
return await Promise.all(portals.map((portal, i) => {
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
if (usePortalSwapV3) {
|
|
687
|
-
return portal.swapExactInputV3.populateTransaction({ ...swapParams, extensionData: extensionData ?? '0x' }, overrides);
|
|
688
|
-
}
|
|
689
|
-
return portal.swapExactInput.populateTransaction(swapParams, overrides);
|
|
690
|
-
}));
|
|
673
|
+
async function populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, fundsList, inputToken, useNativeToken) {
|
|
674
|
+
const portals = buyers.map((wallet) => new ethers.Contract(portalAddr, PORTAL_ABI, wallet));
|
|
675
|
+
return await Promise.all(portals.map((portal, i) => portal.swapExactInput.populateTransaction({
|
|
676
|
+
inputToken,
|
|
677
|
+
outputToken: tokenAddress,
|
|
678
|
+
inputAmount: fundsList[i],
|
|
679
|
+
minOutputAmount: 0n,
|
|
680
|
+
permitData: '0x',
|
|
681
|
+
},
|
|
682
|
+
// ✅ 如果使用原生代币,value 为购买金额;否则为 0
|
|
683
|
+
useNativeToken ? { value: fundsList[i] } : {})));
|
|
691
684
|
}
|
|
692
685
|
function buildGasLimitList(length, config) {
|
|
693
686
|
const gasLimit = getGasLimit(config);
|
|
@@ -721,9 +714,7 @@ async function allocateBuyerNonces(buyers, extractProfit, maxIndex, totalProfit,
|
|
|
721
714
|
const maxIndexNonces = await nonceManager.getNextNonceBatch(buyers[maxIndex], 2);
|
|
722
715
|
// 其他钱包各需要 1 个 nonce
|
|
723
716
|
const otherBuyers = buyers.filter((_, i) => i !== maxIndex);
|
|
724
|
-
const otherNonces = otherBuyers.length > 0
|
|
725
|
-
? await nonceManager.getNextNoncesForWallets(otherBuyers)
|
|
726
|
-
: [];
|
|
717
|
+
const otherNonces = otherBuyers.length > 0 ? await nonceManager.getNextNoncesForWallets(otherBuyers) : [];
|
|
727
718
|
// 组装最终的 nonces 数组(保持原顺序)
|
|
728
719
|
const nonces = [];
|
|
729
720
|
let otherIdx = 0;
|
|
@@ -737,7 +728,7 @@ async function allocateBuyerNonces(buyers, extractProfit, maxIndex, totalProfit,
|
|
|
737
728
|
}
|
|
738
729
|
return nonces;
|
|
739
730
|
}
|
|
740
|
-
async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, gasPrice, chainId, config, fundsList, useNativeToken = true // ✅ 默认使用原生代币
|
|
731
|
+
async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, gasPrice, chainId, config, fundsList, useNativeToken = true, // ✅ 默认使用原生代币
|
|
741
732
|
}) {
|
|
742
733
|
return await Promise.all(unsignedBuys.map((unsigned, i) => buyers[i].signTransaction({
|
|
743
734
|
...unsigned,
|
|
@@ -747,7 +738,7 @@ async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, ga
|
|
|
747
738
|
gasPrice,
|
|
748
739
|
chainId,
|
|
749
740
|
type: getTxType(config),
|
|
750
|
-
value: useNativeToken ? fundsList[i] : 0n // ✅ 非原生代币时 value 为 0
|
|
741
|
+
value: useNativeToken ? fundsList[i] : 0n, // ✅ 非原生代币时 value 为 0
|
|
751
742
|
})));
|
|
752
743
|
}
|
|
753
744
|
function buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyerCount) {
|
|
@@ -758,7 +749,7 @@ function buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyerCo
|
|
|
758
749
|
totalBuyAmount: ethers.formatEther(totalBuyAmount),
|
|
759
750
|
profitAmount: ethers.formatEther(totalProfit),
|
|
760
751
|
profitRecipient: getProfitRecipient(),
|
|
761
|
-
buyerCount
|
|
752
|
+
buyerCount,
|
|
762
753
|
};
|
|
763
754
|
}
|
|
764
755
|
/**
|
|
@@ -774,7 +765,7 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
|
|
|
774
765
|
const result = await portal.quoteExactInput.staticCall({
|
|
775
766
|
inputToken: tokenAddress,
|
|
776
767
|
outputToken,
|
|
777
|
-
inputAmount: amountsWei[0]
|
|
768
|
+
inputAmount: amountsWei[0],
|
|
778
769
|
});
|
|
779
770
|
return [result];
|
|
780
771
|
}
|
|
@@ -787,14 +778,16 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
|
|
|
787
778
|
const portalIface = new Interface(PORTAL_ABI);
|
|
788
779
|
const multicall = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
|
|
789
780
|
// 构建批量调用
|
|
790
|
-
const calls = amountsWei.map(amount => ({
|
|
781
|
+
const calls = amountsWei.map((amount) => ({
|
|
791
782
|
target: portalAddress,
|
|
792
783
|
allowFailure: true, // 允许单个失败
|
|
793
|
-
callData: portalIface.encodeFunctionData('quoteExactInput', [
|
|
784
|
+
callData: portalIface.encodeFunctionData('quoteExactInput', [
|
|
785
|
+
{
|
|
794
786
|
inputToken: tokenAddress,
|
|
795
787
|
outputToken,
|
|
796
|
-
inputAmount: amount
|
|
797
|
-
}
|
|
788
|
+
inputAmount: amount,
|
|
789
|
+
},
|
|
790
|
+
]),
|
|
798
791
|
}));
|
|
799
792
|
try {
|
|
800
793
|
const results = await multicall.aggregate3.staticCall(calls);
|
|
@@ -818,7 +811,7 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
|
|
|
818
811
|
return await portal.quoteExactInput.staticCall({
|
|
819
812
|
inputToken: tokenAddress,
|
|
820
813
|
outputToken,
|
|
821
|
-
inputAmount: amount
|
|
814
|
+
inputAmount: amount,
|
|
822
815
|
});
|
|
823
816
|
}
|
|
824
817
|
catch {
|