four-flap-meme-sdk 2.2.19 → 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/pcs-infinity-cl.js +18 -54
- 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,117 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* 功能:钱包B先买入代币 → 钱包A卖出相同数量 → 原子执行
|
|
2
|
+
* swap-buy-first - 主函数
|
|
5
3
|
*/
|
|
6
4
|
import { ethers, Contract, Wallet } from 'ethers';
|
|
7
|
-
import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
|
|
5
|
+
import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../../utils/bundle-helpers.js';
|
|
8
6
|
import { FLAP_PORTAL_ADDRESSES } from '../constants.js';
|
|
9
|
-
import {
|
|
10
|
-
import { GAS_LIMITS
|
|
11
|
-
import { ERC20_BALANCE_ABI
|
|
12
|
-
import { getGasPriceConfig, getTxType, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA, PORTAL_ABI } from './config.js';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const ROUTER_ABI = V2_ROUTER_QUOTE_ABI;
|
|
19
|
-
/**
|
|
20
|
-
* 获取 ERC20 代币 → 原生代币的报价
|
|
21
|
-
* @param provider - Provider 实例
|
|
22
|
-
* @param tokenAddress - ERC20 代币地址
|
|
23
|
-
* @param tokenAmount - 代币数量(wei)
|
|
24
|
-
* @param chainId - 链 ID(56=BSC, 143=Monad)
|
|
25
|
-
* @returns 等值的原生代币数量(wei),失败返回 0n
|
|
26
|
-
*/
|
|
27
|
-
async function getTokenToNativeQuote(provider, tokenAddress, tokenAmount, chainId) {
|
|
28
|
-
if (tokenAmount <= 0n)
|
|
29
|
-
return 0n;
|
|
30
|
-
try {
|
|
31
|
-
if (chainId === CHAINS.BSC.chainId) {
|
|
32
|
-
// BSC: 使用 PancakeSwap V2 Router
|
|
33
|
-
const router = new Contract(BSC_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
|
|
34
|
-
const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, BSC_WBNB]);
|
|
35
|
-
return amounts[1];
|
|
36
|
-
}
|
|
37
|
-
if (chainId === CHAINS.MONAD.chainId) {
|
|
38
|
-
// ✅ Monad: 使用 PancakeSwap V2 Router
|
|
39
|
-
const router = new Contract(MONAD_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
|
|
40
|
-
const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, MONAD_WMON]);
|
|
41
|
-
return amounts[1];
|
|
42
|
-
}
|
|
43
|
-
// ✅ Base (8453) / XLayer (196) 等链暂不支持 V2 报价,返回 0
|
|
44
|
-
return 0n;
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
// 报价失败返回 0(可能是流动性不足或路径不存在)
|
|
48
|
-
return 0n;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* 获取 Gas Limit(支持 FlapAnyConfig)
|
|
53
|
-
*/
|
|
54
|
-
function getGasLimit(config, defaultGas = 800000) {
|
|
55
|
-
if (config.gasLimit !== undefined) {
|
|
56
|
-
return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
|
|
57
|
-
}
|
|
58
|
-
const multiplier = config.gasLimitMultiplier ?? 1.0;
|
|
59
|
-
return BigInt(Math.ceil(defaultGas * multiplier));
|
|
60
|
-
}
|
|
61
|
-
// ==================== 多笔买卖常量 ====================
|
|
62
|
-
/** 最大 Bundle 签名数 */
|
|
63
|
-
const MAX_BUNDLE_SIGNATURES = 50;
|
|
64
|
-
/** 贿赂交易数 */
|
|
65
|
-
const BRIBE_TX_COUNT = 1;
|
|
66
|
-
/** 利润中转交易数(支付者 1 笔 + 中转钱包 PROFIT_HOP_COUNT 笔 + 最终接收 1 笔) */
|
|
67
|
-
const PROFIT_TX_COUNT = PROFIT_HOP_COUNT + 2; // 2 + 2 = 4
|
|
68
|
-
/** 最大买卖交易数 */
|
|
69
|
-
const MAX_SWAP_TX_COUNT = MAX_BUNDLE_SIGNATURES - BRIBE_TX_COUNT - PROFIT_TX_COUNT; // 50 - 1 - 4 = 45
|
|
70
|
-
/**
|
|
71
|
-
* 根据 userType 获取每笔交易的利润率
|
|
72
|
-
*/
|
|
73
|
-
function getProfitRatePerTxBps(userType) {
|
|
74
|
-
if (userType === 'v1') {
|
|
75
|
-
return PROFIT_CONFIG.RATE_BPS_V1_DOUBLE;
|
|
76
|
-
}
|
|
77
|
-
return PROFIT_CONFIG.RATE_BPS_V0_DOUBLE; // v0 或默认
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* 验证买卖笔数
|
|
81
|
-
*/
|
|
82
|
-
function validateSwapCounts(buyCount, sellCount) {
|
|
83
|
-
if (buyCount < 1) {
|
|
84
|
-
throw new Error(`买入笔数必须至少为 1,当前为 ${buyCount}`);
|
|
85
|
-
}
|
|
86
|
-
if (sellCount < 1) {
|
|
87
|
-
throw new Error(`卖出笔数必须至少为 1,当前为 ${sellCount}`);
|
|
88
|
-
}
|
|
89
|
-
const totalSwaps = buyCount + sellCount;
|
|
90
|
-
if (totalSwaps > MAX_SWAP_TX_COUNT) {
|
|
91
|
-
throw new Error(`买卖笔数总和 (${totalSwaps}) 超出限制 (${MAX_SWAP_TX_COUNT}),` +
|
|
92
|
-
`最大签名数为 ${MAX_BUNDLE_SIGNATURES}(${BRIBE_TX_COUNT} 贿赂 + ${PROFIT_TX_COUNT} 利润 + ${MAX_SWAP_TX_COUNT} 买卖)`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function getChainId(chain) {
|
|
96
|
-
switch (chain) {
|
|
97
|
-
case 'bsc': return 56;
|
|
98
|
-
case 'xlayer': return 196;
|
|
99
|
-
case 'base': return 8453;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
function getNativeTokenName(chain) {
|
|
103
|
-
switch (chain) {
|
|
104
|
-
case 'bsc': return 'BNB';
|
|
105
|
-
case 'xlayer': return 'OKB';
|
|
106
|
-
case 'base': return 'ETH';
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// 使用公共工具的 getGasLimit,移除本地重复实现
|
|
7
|
+
import { ZERO_ADDRESS } from '../../../shared/constants/index.js';
|
|
8
|
+
import { GAS_LIMITS } from '../../constants/index.js';
|
|
9
|
+
import { ERC20_BALANCE_ABI } from '../../abis/common.js';
|
|
10
|
+
import { getGasPriceConfig, getTxType, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA, PORTAL_ABI, } from './config.js';
|
|
11
|
+
import { createSignProvider } from '../../../bundle-core/sign-context-helpers.js';
|
|
12
|
+
import { buildTransactionRequest } from '../../foundation/tx/build-request.js';
|
|
13
|
+
import { getErrorMessageFromUnknown } from '../../foundation/index.js';
|
|
14
|
+
import { splitAmountByWeight as splitAmount } from '../../foundation/amount/split-by-weight.js';
|
|
15
|
+
import { getChainId, getGasLimit, getNativeTokenName, getProfitRatePerTxBps, getTokenToNativeQuote, validateSwapCounts, } from './swap-buy-first-helpers.js';
|
|
110
16
|
export async function flapBundleBuyFirstMerkle(params) {
|
|
111
|
-
const { chain, buyerPrivateKey, buyerPrivateKeys, sellerPrivateKey, sellerPrivateKeys, tokenAddress, buyerFunds, buyerFundsPercentage, config, quoteToken, quoteTokenDecimals, buyCount: _buyCount, sellCount: _sellCount } = params;
|
|
17
|
+
const { chain, buyerPrivateKey, buyerPrivateKeys, sellerPrivateKey, sellerPrivateKeys, tokenAddress, buyerFunds, buyerFundsPercentage, config, quoteToken, quoteTokenDecimals, buyCount: _buyCount, sellCount: _sellCount, } = params;
|
|
112
18
|
// ✅ 判断是否为多钱包模式
|
|
113
|
-
const isMultiWalletMode = !!(buyerPrivateKeys && buyerPrivateKeys.length > 0) ||
|
|
114
|
-
!!(sellerPrivateKeys && sellerPrivateKeys.length > 0);
|
|
19
|
+
const isMultiWalletMode = !!(buyerPrivateKeys && buyerPrivateKeys.length > 0) || !!(sellerPrivateKeys && sellerPrivateKeys.length > 0);
|
|
115
20
|
const buyCount = _buyCount ?? 1;
|
|
116
21
|
const sellCount = _sellCount ?? 1;
|
|
117
22
|
// ✅ 多钱包模式:使用单独的处理逻辑
|
|
@@ -124,7 +29,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
124
29
|
buyerFunds,
|
|
125
30
|
config,
|
|
126
31
|
quoteToken,
|
|
127
|
-
quoteTokenDecimals
|
|
32
|
+
quoteTokenDecimals,
|
|
128
33
|
});
|
|
129
34
|
}
|
|
130
35
|
// ✅ 单钱包模式(向后兼容)
|
|
@@ -158,11 +63,11 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
158
63
|
useNativeToken,
|
|
159
64
|
quoteToken,
|
|
160
65
|
quoteTokenDecimals,
|
|
161
|
-
provider: chainContext.provider
|
|
66
|
+
provider: chainContext.provider,
|
|
162
67
|
}),
|
|
163
|
-
getOptimizedGasPrice(chainContext.provider, getGasPriceConfig(config))
|
|
68
|
+
getOptimizedGasPrice(chainContext.provider, getGasPriceConfig(config)),
|
|
164
69
|
]);
|
|
165
|
-
const { buyerFundsWei
|
|
70
|
+
const { buyerFundsWei } = buyerFundsResult;
|
|
166
71
|
const priorityFee = gasPrice / 10n === 0n ? 1n : gasPrice / 10n;
|
|
167
72
|
// ✅ 获取报价
|
|
168
73
|
const quoteResult = await quoteBuyerOutput({
|
|
@@ -171,7 +76,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
171
76
|
buyerFundsWei,
|
|
172
77
|
provider: chainContext.provider,
|
|
173
78
|
skipQuoteOnError: config.skipQuoteOnError,
|
|
174
|
-
inputToken // ✅ 传递输入代币
|
|
79
|
+
inputToken, // ✅ 传递输入代币
|
|
175
80
|
});
|
|
176
81
|
const sellAmountWei = quoteResult.sellAmountWei;
|
|
177
82
|
// ✅ 验证卖方余额
|
|
@@ -180,7 +85,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
180
85
|
provider: chainContext.provider,
|
|
181
86
|
seller,
|
|
182
87
|
sellAmountWei,
|
|
183
|
-
skipBalanceCheck: sameAddress
|
|
88
|
+
skipBalanceCheck: sameAddress,
|
|
184
89
|
});
|
|
185
90
|
const portalBuyer = new Contract(chainContext.portalAddress, PORTAL_ABI, buyer);
|
|
186
91
|
const portalSeller = new Contract(chainContext.portalAddress, PORTAL_ABI, seller);
|
|
@@ -188,24 +93,24 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
188
93
|
const buyAmountsWei = splitAmount(buyerFundsWei, buyCount);
|
|
189
94
|
const sellAmountsWei = splitAmount(sellAmountWei, sellCount);
|
|
190
95
|
// ✅ 第三批并行 - 构建多笔买入和卖出交易、estimatedSellFunds
|
|
191
|
-
const buyUnsignedPromises = buyAmountsWei.map(amount => portalBuyer.swapExactInput.populateTransaction({
|
|
96
|
+
const buyUnsignedPromises = buyAmountsWei.map((amount) => portalBuyer.swapExactInput.populateTransaction({
|
|
192
97
|
inputToken,
|
|
193
98
|
outputToken: tokenAddress,
|
|
194
99
|
inputAmount: amount,
|
|
195
100
|
minOutputAmount: 0n,
|
|
196
|
-
permitData: '0x'
|
|
101
|
+
permitData: '0x',
|
|
197
102
|
}, useNativeToken ? { value: amount } : {}));
|
|
198
|
-
const sellUnsignedPromises = sellAmountsWei.map(amount => portalSeller.swapExactInput.populateTransaction({
|
|
103
|
+
const sellUnsignedPromises = sellAmountsWei.map((amount) => portalSeller.swapExactInput.populateTransaction({
|
|
199
104
|
inputToken: tokenAddress,
|
|
200
105
|
outputToken,
|
|
201
106
|
inputAmount: amount,
|
|
202
107
|
minOutputAmount: 0,
|
|
203
|
-
permitData: '0x'
|
|
108
|
+
permitData: '0x',
|
|
204
109
|
}));
|
|
205
110
|
const [buyUnsignedArray, sellUnsignedArray, estimatedSellFunds] = await Promise.all([
|
|
206
111
|
Promise.all(buyUnsignedPromises),
|
|
207
112
|
Promise.all(sellUnsignedPromises),
|
|
208
|
-
estimateSellFunds(portalSeller, tokenAddress, sellAmountWei, outputToken)
|
|
113
|
+
estimateSellFunds(portalSeller, tokenAddress, sellAmountWei, outputToken),
|
|
209
114
|
]);
|
|
210
115
|
// ✅ 获取贿赂金额
|
|
211
116
|
const bribeAmount = getBribeAmount(config);
|
|
@@ -219,7 +124,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
219
124
|
extractProfit: true,
|
|
220
125
|
needBribeTx,
|
|
221
126
|
sameAddress,
|
|
222
|
-
nonceManager
|
|
127
|
+
nonceManager,
|
|
223
128
|
});
|
|
224
129
|
// ✅ 修复:基于卖出收益估算利润(使用动态利润比例)
|
|
225
130
|
const profitBase = estimatedSellFunds > 0n ? estimatedSellFunds : buyerFundsWei;
|
|
@@ -239,7 +144,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
239
144
|
priorityFee,
|
|
240
145
|
chainId: chainContext.chainId,
|
|
241
146
|
txType,
|
|
242
|
-
value: useNativeToken ? buyAmountsWei[i] : 0n
|
|
147
|
+
value: useNativeToken ? buyAmountsWei[i] : 0n,
|
|
243
148
|
}));
|
|
244
149
|
// ✅ 构建多笔卖出交易
|
|
245
150
|
const sellTxs = sellUnsignedArray.map((unsigned, i) => buildTransactionRequest(unsigned, {
|
|
@@ -250,7 +155,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
250
155
|
priorityFee,
|
|
251
156
|
chainId: chainContext.chainId,
|
|
252
157
|
txType,
|
|
253
|
-
value: 0n
|
|
158
|
+
value: 0n,
|
|
254
159
|
}));
|
|
255
160
|
// ✅ 贿赂交易放在首位
|
|
256
161
|
let bribeTx = null;
|
|
@@ -262,13 +167,13 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
262
167
|
gasPrice,
|
|
263
168
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
264
169
|
chainId: chainContext.chainId,
|
|
265
|
-
type: txType
|
|
170
|
+
type: txType,
|
|
266
171
|
});
|
|
267
172
|
}
|
|
268
173
|
// ✅ 并行签名所有买入和卖出交易
|
|
269
174
|
const [signedBuys, signedSells] = await Promise.all([
|
|
270
|
-
Promise.all(buyTxs.map(tx => buyer.signTransaction(tx))),
|
|
271
|
-
Promise.all(sellTxs.map(tx => seller.signTransaction(tx)))
|
|
175
|
+
Promise.all(buyTxs.map((tx) => buyer.signTransaction(tx))),
|
|
176
|
+
Promise.all(sellTxs.map((tx) => seller.signTransaction(tx))),
|
|
272
177
|
]);
|
|
273
178
|
nonceManager.clearTemp();
|
|
274
179
|
// ✅ 组装顺序:贿赂 → 买入(多笔) → 卖出(多笔)
|
|
@@ -284,7 +189,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
284
189
|
profitNonce: multiNoncePlan.profitNonce,
|
|
285
190
|
gasPrice,
|
|
286
191
|
chainId: chainContext.chainId,
|
|
287
|
-
txType
|
|
192
|
+
txType,
|
|
288
193
|
});
|
|
289
194
|
let profitHopWallets;
|
|
290
195
|
if (profitResult) {
|
|
@@ -304,14 +209,14 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
304
209
|
buyCount,
|
|
305
210
|
sellCount,
|
|
306
211
|
// ✅ 返回每笔交易的具体金额(随机分配后的数组)
|
|
307
|
-
buyAmounts: buyAmountsWei.map(amt => ethers.formatEther(amt)),
|
|
308
|
-
sellAmounts: sellAmountsWei.map(amt => ethers.formatUnits(amt, sellerInfo.decimals))
|
|
309
|
-
}
|
|
212
|
+
buyAmounts: buyAmountsWei.map((amt) => ethers.formatEther(amt)),
|
|
213
|
+
sellAmounts: sellAmountsWei.map((amt) => ethers.formatUnits(amt, sellerInfo.decimals)),
|
|
214
|
+
},
|
|
310
215
|
};
|
|
311
216
|
}
|
|
312
217
|
// ✅ 使用公共模块中的 ERC20_BALANCE_ABI
|
|
313
218
|
const ERC20_BALANCE_OF_ABI = ERC20_BALANCE_ABI;
|
|
314
|
-
async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, reserveGasEth, nativeToken, useNativeToken = true, quoteToken, quoteTokenDecimals = 18, provider }) {
|
|
219
|
+
async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, reserveGasEth, nativeToken, useNativeToken = true, quoteToken, quoteTokenDecimals = 18, provider, }) {
|
|
315
220
|
const reserveGas = ethers.parseEther((reserveGasEth || 0.0005).toString());
|
|
316
221
|
// ✅ 根据是否使用原生代币获取不同的余额
|
|
317
222
|
let buyerBalance;
|
|
@@ -333,9 +238,7 @@ async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, re
|
|
|
333
238
|
else if (buyerFundsPercentage !== undefined) {
|
|
334
239
|
const pct = Math.max(0, Math.min(100, buyerFundsPercentage));
|
|
335
240
|
// ✅ 原生代币需要预留 Gas,ERC20 不需要
|
|
336
|
-
const spendable = useNativeToken
|
|
337
|
-
? (buyerBalance > reserveGas ? buyerBalance - reserveGas : 0n)
|
|
338
|
-
: buyerBalance;
|
|
241
|
+
const spendable = useNativeToken ? (buyerBalance > reserveGas ? buyerBalance - reserveGas : 0n) : buyerBalance;
|
|
339
242
|
buyerFundsWei = (spendable * BigInt(Math.floor(pct * 100))) / 10000n;
|
|
340
243
|
}
|
|
341
244
|
else {
|
|
@@ -363,15 +266,15 @@ async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, re
|
|
|
363
266
|
}
|
|
364
267
|
return { buyerFundsWei, buyerBalance };
|
|
365
268
|
}
|
|
366
|
-
async function quoteBuyerOutput({ portalAddress, tokenAddress, buyerFundsWei, provider, skipQuoteOnError, inputToken = ZERO_ADDRESS // ✅ 默认使用原生代币
|
|
269
|
+
async function quoteBuyerOutput({ portalAddress, tokenAddress, buyerFundsWei, provider, skipQuoteOnError, inputToken = ZERO_ADDRESS, // ✅ 默认使用原生代币
|
|
367
270
|
}) {
|
|
368
|
-
let quotedToken
|
|
271
|
+
let quotedToken;
|
|
369
272
|
const portal = new Contract(portalAddress, PORTAL_ABI, provider);
|
|
370
273
|
try {
|
|
371
274
|
quotedToken = await portal.quoteExactInput.staticCall({
|
|
372
275
|
inputToken, // ✅ 使用动态输入代币
|
|
373
276
|
outputToken: tokenAddress,
|
|
374
|
-
inputAmount: buyerFundsWei
|
|
277
|
+
inputAmount: buyerFundsWei,
|
|
375
278
|
});
|
|
376
279
|
}
|
|
377
280
|
catch (error) {
|
|
@@ -379,7 +282,7 @@ async function quoteBuyerOutput({ portalAddress, tokenAddress, buyerFundsWei, pr
|
|
|
379
282
|
quotedToken = 0n;
|
|
380
283
|
}
|
|
381
284
|
else {
|
|
382
|
-
throw new Error(`买入报价失败: ${error}`);
|
|
285
|
+
throw new Error(`买入报价失败: ${getErrorMessageFromUnknown(error)}`);
|
|
383
286
|
}
|
|
384
287
|
}
|
|
385
288
|
const sellAmountWei = quotedToken;
|
|
@@ -388,46 +291,26 @@ async function quoteBuyerOutput({ portalAddress, tokenAddress, buyerFundsWei, pr
|
|
|
388
291
|
}
|
|
389
292
|
return { quotedToken, sellAmountWei };
|
|
390
293
|
}
|
|
391
|
-
async function ensureSellerBalance({ tokenAddress, provider, seller, sellAmountWei, skipBalanceCheck }) {
|
|
294
|
+
async function ensureSellerBalance({ tokenAddress, provider, seller, sellAmountWei, skipBalanceCheck, }) {
|
|
392
295
|
const erc20 = new Contract(tokenAddress, ERC20_BALANCE_ABI, provider);
|
|
393
|
-
const [sellerTokenBal, decimals] = await Promise.all([
|
|
394
|
-
erc20.balanceOf(seller.address),
|
|
395
|
-
erc20.decimals()
|
|
396
|
-
]);
|
|
296
|
+
const [sellerTokenBal, decimals] = await Promise.all([erc20.balanceOf(seller.address), erc20.decimals()]);
|
|
397
297
|
if (!skipBalanceCheck && sellerTokenBal < sellAmountWei) {
|
|
398
298
|
throw new Error(`卖方代币余额不足: 需要 ${ethers.formatUnits(sellAmountWei, decimals)},实际 ${ethers.formatUnits(sellerTokenBal, decimals)}`);
|
|
399
299
|
}
|
|
400
300
|
return { decimals };
|
|
401
301
|
}
|
|
402
|
-
async function estimateSellFunds(portal, tokenAddress, sellAmountWei, outputToken = ZERO_ADDRESS
|
|
403
|
-
) {
|
|
302
|
+
async function estimateSellFunds(portal, tokenAddress, sellAmountWei, outputToken = ZERO_ADDRESS) {
|
|
404
303
|
try {
|
|
405
304
|
return await portal.quoteExactInput.staticCall({
|
|
406
305
|
inputToken: tokenAddress,
|
|
407
306
|
outputToken, // ✅ 使用动态输出代币
|
|
408
|
-
inputAmount: sellAmountWei
|
|
307
|
+
inputAmount: sellAmountWei,
|
|
409
308
|
});
|
|
410
309
|
}
|
|
411
310
|
catch {
|
|
412
311
|
return 0n;
|
|
413
312
|
}
|
|
414
313
|
}
|
|
415
|
-
/**
|
|
416
|
-
* 根据 userType 获取利润率(基点)
|
|
417
|
-
*/
|
|
418
|
-
function getProfitRateBps(userType) {
|
|
419
|
-
if (userType === 'v1') {
|
|
420
|
-
return PROFIT_CONFIG.RATE_BPS_V1; // 0.05%
|
|
421
|
-
}
|
|
422
|
-
return PROFIT_CONFIG.RATE_BPS_V0; // v0 或默认 0.06%
|
|
423
|
-
}
|
|
424
|
-
function calculateProfitAmount(expectedFunds, userType) {
|
|
425
|
-
if (expectedFunds <= 0n) {
|
|
426
|
-
return 0n;
|
|
427
|
-
}
|
|
428
|
-
const rateBps = getProfitRateBps(userType);
|
|
429
|
-
return (expectedFunds * BigInt(rateBps)) / 10000n;
|
|
430
|
-
}
|
|
431
314
|
/**
|
|
432
315
|
* 计算多笔交易的利润金额
|
|
433
316
|
* @param expectedFunds - 预期收益
|
|
@@ -439,88 +322,13 @@ function calculateMultiProfitAmount(expectedFunds, rateBps) {
|
|
|
439
322
|
}
|
|
440
323
|
return (expectedFunds * BigInt(rateBps)) / 10000n;
|
|
441
324
|
}
|
|
442
|
-
/**
|
|
443
|
-
* ✅ 将金额随机拆分成多份(更自然,不像机器人)
|
|
444
|
-
* @param totalAmount - 总金额
|
|
445
|
-
* @param count - 拆分份数
|
|
446
|
-
* @returns 拆分后的金额数组(随机分配,总和精确)
|
|
447
|
-
*/
|
|
448
|
-
function splitAmount(totalAmount, count) {
|
|
449
|
-
if (count <= 0) {
|
|
450
|
-
throw new Error('拆分份数必须大于 0');
|
|
451
|
-
}
|
|
452
|
-
if (count === 1) {
|
|
453
|
-
return [totalAmount];
|
|
454
|
-
}
|
|
455
|
-
// 生成随机权重(0.5 - 1.5 之间)
|
|
456
|
-
const weights = [];
|
|
457
|
-
for (let i = 0; i < count; i++) {
|
|
458
|
-
// 随机值在 0.5 - 1.5 之间,使每份金额有 ±50% 的浮动
|
|
459
|
-
weights.push(0.5 + Math.random());
|
|
460
|
-
}
|
|
461
|
-
// 计算权重总和
|
|
462
|
-
const totalWeight = weights.reduce((a, b) => a + b, 0);
|
|
463
|
-
// 根据权重分配金额
|
|
464
|
-
const amounts = [];
|
|
465
|
-
let allocated = 0n;
|
|
466
|
-
for (let i = 0; i < count - 1; i++) {
|
|
467
|
-
// 按权重比例分配
|
|
468
|
-
const ratio = weights[i] / totalWeight;
|
|
469
|
-
const amount = BigInt(Math.floor(Number(totalAmount) * ratio));
|
|
470
|
-
amounts.push(amount);
|
|
471
|
-
allocated += amount;
|
|
472
|
-
}
|
|
473
|
-
// 最后一份分配剩余的全部(确保总和精确)
|
|
474
|
-
amounts.push(totalAmount - allocated);
|
|
475
|
-
// 随机打乱顺序(让大小金额交错出现)
|
|
476
|
-
for (let i = amounts.length - 1; i > 0; i--) {
|
|
477
|
-
const j = Math.floor(Math.random() * (i + 1));
|
|
478
|
-
[amounts[i], amounts[j]] = [amounts[j], amounts[i]];
|
|
479
|
-
}
|
|
480
|
-
return amounts;
|
|
481
|
-
}
|
|
482
|
-
/**
|
|
483
|
-
* ✅ 规划 nonce
|
|
484
|
-
* 交易顺序:贿赂 → 买入 → 卖出 → 利润
|
|
485
|
-
*/
|
|
486
|
-
async function planNonces({ buyer, seller, extractProfit, needBribeTx, sameAddress, nonceManager }) {
|
|
487
|
-
if (sameAddress) {
|
|
488
|
-
// 同一地址:贿赂(可选) + 买入 + 卖出 + 利润(可选)
|
|
489
|
-
const txCount = countTruthy([needBribeTx, true, true, extractProfit]);
|
|
490
|
-
const nonces = await nonceManager.getNextNonceBatch(buyer, txCount);
|
|
491
|
-
let idx = 0;
|
|
492
|
-
const bribeNonce = needBribeTx ? nonces[idx++] : undefined;
|
|
493
|
-
const buyerNonce = nonces[idx++];
|
|
494
|
-
const sellerNonce = nonces[idx++];
|
|
495
|
-
const profitNonce = extractProfit ? nonces[idx] : undefined;
|
|
496
|
-
return { buyerNonce, sellerNonce, bribeNonce, profitNonce };
|
|
497
|
-
}
|
|
498
|
-
if (needBribeTx || extractProfit) {
|
|
499
|
-
// 卖方需要多个 nonce:贿赂(可选) + 卖出 + 利润(可选)
|
|
500
|
-
const sellerTxCount = countTruthy([needBribeTx, true, extractProfit]);
|
|
501
|
-
// ✅ 并行获取 buyer 和 seller 的 nonce
|
|
502
|
-
const [sellerNonces, buyerNonces] = await Promise.all([
|
|
503
|
-
nonceManager.getNextNonceBatch(seller, sellerTxCount),
|
|
504
|
-
nonceManager.getNextNoncesForWallets([buyer])
|
|
505
|
-
]);
|
|
506
|
-
let idx = 0;
|
|
507
|
-
const bribeNonce = needBribeTx ? sellerNonces[idx++] : undefined;
|
|
508
|
-
const sellerNonce = sellerNonces[idx++];
|
|
509
|
-
const profitNonce = extractProfit ? sellerNonces[idx] : undefined;
|
|
510
|
-
const buyerNonce = buyerNonces[0];
|
|
511
|
-
return { buyerNonce, sellerNonce, bribeNonce, profitNonce };
|
|
512
|
-
}
|
|
513
|
-
// ✅ 使用 getNextNoncesForWallets 批量获取
|
|
514
|
-
const nonces = await nonceManager.getNextNoncesForWallets([buyer, seller]);
|
|
515
|
-
return { buyerNonce: nonces[0], sellerNonce: nonces[1] };
|
|
516
|
-
}
|
|
517
325
|
/**
|
|
518
326
|
* ✅ 规划多笔交易 nonce
|
|
519
327
|
* 交易顺序:贿赂 → 买入(多笔) → 卖出(多笔) → 利润
|
|
520
328
|
*
|
|
521
329
|
* 利润中转需要 PROFIT_HOP_COUNT + 1 个 nonce(支付者→跳1→跳2→利润地址)
|
|
522
330
|
*/
|
|
523
|
-
async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProfit, needBribeTx, sameAddress, nonceManager }) {
|
|
331
|
+
async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProfit, needBribeTx, sameAddress, nonceManager, }) {
|
|
524
332
|
// 利润中转交易数(支付者只需要 1 个 nonce,中转钱包的 nonce 由 buildProfitHopTransactions 内部处理)
|
|
525
333
|
const profitNonceCount = extractProfit ? 1 : 0;
|
|
526
334
|
if (sameAddress) {
|
|
@@ -544,7 +352,7 @@ async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProf
|
|
|
544
352
|
const sellerTxCount = bribeTxCount + sellCount + profitNonceCount;
|
|
545
353
|
const [buyerNonces, sellerNoncesAll] = await Promise.all([
|
|
546
354
|
nonceManager.getNextNonceBatch(buyer, buyCount),
|
|
547
|
-
nonceManager.getNextNonceBatch(seller, sellerTxCount)
|
|
355
|
+
nonceManager.getNextNonceBatch(seller, sellerTxCount),
|
|
548
356
|
]);
|
|
549
357
|
let idx = 0;
|
|
550
358
|
const bribeNonce = needBribeTx ? sellerNoncesAll[idx++] : undefined;
|
|
@@ -553,31 +361,10 @@ async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProf
|
|
|
553
361
|
const profitNonce = extractProfit ? sellerNoncesAll[idx] : undefined;
|
|
554
362
|
return { buyerNonces, sellerNonces, bribeNonce, profitNonce };
|
|
555
363
|
}
|
|
556
|
-
function buildTransactionRequest(unsigned, { from, nonce, gasLimit, gasPrice, priorityFee, chainId, txType, value }) {
|
|
557
|
-
const tx = {
|
|
558
|
-
...unsigned,
|
|
559
|
-
from,
|
|
560
|
-
nonce,
|
|
561
|
-
gasLimit,
|
|
562
|
-
chainId,
|
|
563
|
-
type: txType
|
|
564
|
-
};
|
|
565
|
-
if (value !== undefined) {
|
|
566
|
-
tx.value = value;
|
|
567
|
-
}
|
|
568
|
-
if (txType === 2) {
|
|
569
|
-
tx.maxFeePerGas = gasPrice;
|
|
570
|
-
tx.maxPriorityFeePerGas = priorityFee;
|
|
571
|
-
}
|
|
572
|
-
else {
|
|
573
|
-
tx.gasPrice = gasPrice;
|
|
574
|
-
}
|
|
575
|
-
return tx;
|
|
576
|
-
}
|
|
577
364
|
/**
|
|
578
365
|
* 构建利润多跳转账交易(强制 2 跳中转)
|
|
579
366
|
*/
|
|
580
|
-
async function buildProfitTransaction({ provider, seller, profitAmount, profitNonce, gasPrice, chainId, txType }) {
|
|
367
|
+
async function buildProfitTransaction({ provider, seller, profitAmount, profitNonce, gasPrice, chainId, txType, }) {
|
|
581
368
|
if (profitNonce === undefined || profitAmount === 0n) {
|
|
582
369
|
return null;
|
|
583
370
|
}
|
|
@@ -590,13 +377,10 @@ async function buildProfitTransaction({ provider, seller, profitAmount, profitNo
|
|
|
590
377
|
gasPrice,
|
|
591
378
|
chainId,
|
|
592
379
|
txType,
|
|
593
|
-
startNonce: profitNonce
|
|
380
|
+
startNonce: profitNonce,
|
|
594
381
|
});
|
|
595
382
|
return { signedTransactions: profitHopResult.signedTransactions, hopWallets: profitHopResult.hopWallets };
|
|
596
383
|
}
|
|
597
|
-
function countTruthy(values) {
|
|
598
|
-
return values.filter(Boolean).length;
|
|
599
|
-
}
|
|
600
384
|
// ✅ Provider 缓存(复用连接,减少初始化开销)
|
|
601
385
|
const providerCache = new Map();
|
|
602
386
|
const PROVIDER_CACHE_TTL_MS = 60 * 1000; // 60秒缓存
|
|
@@ -613,10 +397,7 @@ function createChainContext(chain, rpcUrl) {
|
|
|
613
397
|
provider = cached.provider;
|
|
614
398
|
}
|
|
615
399
|
else {
|
|
616
|
-
provider =
|
|
617
|
-
chainId,
|
|
618
|
-
name: chain.toUpperCase()
|
|
619
|
-
});
|
|
400
|
+
provider = createSignProvider(rpcUrl, chainId, chain.toUpperCase());
|
|
620
401
|
providerCache.set(cacheKey, { provider, expireAt: now + PROVIDER_CACHE_TTL_MS });
|
|
621
402
|
}
|
|
622
403
|
return { chainId, nativeToken, portalAddress, provider };
|
|
@@ -629,7 +410,7 @@ function createChainContext(chain, rpcUrl) {
|
|
|
629
410
|
* - ✅ 优化:最大化并行操作
|
|
630
411
|
*/
|
|
631
412
|
async function flapBundleBuyFirstMultiWallet(params) {
|
|
632
|
-
const { chain, buyerPrivateKeys, sellerPrivateKeys, tokenAddress, buyerFunds, config, quoteToken, quoteTokenDecimals = 18 } = params;
|
|
413
|
+
const { chain, buyerPrivateKeys, sellerPrivateKeys, tokenAddress, buyerFunds, config, quoteToken, quoteTokenDecimals = 18, } = params;
|
|
633
414
|
const buyCount = buyerPrivateKeys.length;
|
|
634
415
|
const sellCount = sellerPrivateKeys.length;
|
|
635
416
|
if (buyCount === 0)
|
|
@@ -644,8 +425,8 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
644
425
|
const chainContext = createChainContext(chain, config.rpcUrl);
|
|
645
426
|
const nonceManager = new NonceManager(chainContext.provider);
|
|
646
427
|
// 创建所有钱包实例
|
|
647
|
-
const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, chainContext.provider));
|
|
648
|
-
const sellers = sellerPrivateKeys.map(pk => new Wallet(pk, chainContext.provider));
|
|
428
|
+
const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, chainContext.provider));
|
|
429
|
+
const sellers = sellerPrivateKeys.map((pk) => new Wallet(pk, chainContext.provider));
|
|
649
430
|
// 使用第一个卖方作为主卖方(支付贿赂和利润)
|
|
650
431
|
const mainSeller = sellers[0];
|
|
651
432
|
// ✅ 判断是否使用原生代币
|
|
@@ -671,7 +452,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
671
452
|
const allWallets = [...sellers, ...buyers];
|
|
672
453
|
const uniqueWallets = allWallets.filter((w, i) => {
|
|
673
454
|
const addr = w.address.toLowerCase();
|
|
674
|
-
const firstIdx = allWallets.findIndex(x => x.address.toLowerCase() === addr);
|
|
455
|
+
const firstIdx = allWallets.findIndex((x) => x.address.toLowerCase() === addr);
|
|
675
456
|
return firstIdx === i;
|
|
676
457
|
});
|
|
677
458
|
const erc20 = new Contract(tokenAddress, ERC20_BALANCE_ABI, chainContext.provider);
|
|
@@ -682,11 +463,11 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
682
463
|
buyerFundsWei: totalFundsWei,
|
|
683
464
|
provider: chainContext.provider,
|
|
684
465
|
skipQuoteOnError: config.skipQuoteOnError,
|
|
685
|
-
inputToken
|
|
466
|
+
inputToken,
|
|
686
467
|
}),
|
|
687
468
|
getOptimizedGasPrice(chainContext.provider, getGasPriceConfig(config)),
|
|
688
469
|
erc20.decimals(),
|
|
689
|
-
nonceManager.getNextNoncesForWallets(uniqueWallets)
|
|
470
|
+
nonceManager.getNextNoncesForWallets(uniqueWallets),
|
|
690
471
|
]);
|
|
691
472
|
// 构建 nonces Map
|
|
692
473
|
const noncesMap = new Map();
|
|
@@ -723,19 +504,19 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
723
504
|
gasPrice,
|
|
724
505
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
725
506
|
chainId: chainContext.chainId,
|
|
726
|
-
type: txType
|
|
507
|
+
type: txType,
|
|
727
508
|
});
|
|
728
509
|
}
|
|
729
510
|
// 2. 预分配所有 nonces(同步操作,避免竞态)
|
|
730
511
|
const buyerNonces = [];
|
|
731
512
|
const sellerNonces = [];
|
|
732
|
-
buyers.forEach(buyer => {
|
|
513
|
+
buyers.forEach((buyer) => {
|
|
733
514
|
const addr = buyer.address.toLowerCase();
|
|
734
515
|
const nonce = noncesMap.get(addr);
|
|
735
516
|
buyerNonces.push(nonce);
|
|
736
517
|
noncesMap.set(addr, nonce + 1);
|
|
737
518
|
});
|
|
738
|
-
sellers.forEach(seller => {
|
|
519
|
+
sellers.forEach((seller) => {
|
|
739
520
|
const addr = seller.address.toLowerCase();
|
|
740
521
|
const nonce = noncesMap.get(addr);
|
|
741
522
|
sellerNonces.push(nonce);
|
|
@@ -749,7 +530,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
749
530
|
outputToken: tokenAddress,
|
|
750
531
|
inputAmount: buyAmountsWei[i],
|
|
751
532
|
minOutputAmount: 0n,
|
|
752
|
-
permitData: '0x'
|
|
533
|
+
permitData: '0x',
|
|
753
534
|
}, useNativeToken ? { value: buyAmountsWei[i] } : {});
|
|
754
535
|
return buyer.signTransaction(buildTransactionRequest(unsigned, {
|
|
755
536
|
from: buyer.address,
|
|
@@ -759,7 +540,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
759
540
|
priorityFee,
|
|
760
541
|
chainId: chainContext.chainId,
|
|
761
542
|
txType,
|
|
762
|
-
value: useNativeToken ? buyAmountsWei[i] : 0n
|
|
543
|
+
value: useNativeToken ? buyAmountsWei[i] : 0n,
|
|
763
544
|
}));
|
|
764
545
|
});
|
|
765
546
|
// 4. 并行构建所有卖出交易
|
|
@@ -770,7 +551,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
770
551
|
outputToken,
|
|
771
552
|
inputAmount: sellAmountsWei[i],
|
|
772
553
|
minOutputAmount: 0n,
|
|
773
|
-
permitData: '0x'
|
|
554
|
+
permitData: '0x',
|
|
774
555
|
});
|
|
775
556
|
return seller.signTransaction(buildTransactionRequest(unsigned, {
|
|
776
557
|
from: seller.address,
|
|
@@ -780,14 +561,14 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
780
561
|
priorityFee,
|
|
781
562
|
chainId: chainContext.chainId,
|
|
782
563
|
txType,
|
|
783
|
-
value: 0n
|
|
564
|
+
value: 0n,
|
|
784
565
|
}));
|
|
785
566
|
});
|
|
786
567
|
// ✅ 并行签名所有交易(贿赂 + 买入 + 卖出)
|
|
787
568
|
const [bribeTx, signedBuys, signedSells] = await Promise.all([
|
|
788
569
|
bribeTxPromise,
|
|
789
570
|
Promise.all(buyTxPromises),
|
|
790
|
-
Promise.all(sellTxPromises)
|
|
571
|
+
Promise.all(sellTxPromises),
|
|
791
572
|
]);
|
|
792
573
|
// 组装交易顺序:贿赂 → 买入 → 卖出
|
|
793
574
|
if (bribeTx)
|
|
@@ -805,7 +586,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
805
586
|
profitNonce,
|
|
806
587
|
gasPrice,
|
|
807
588
|
chainId: chainContext.chainId,
|
|
808
|
-
txType
|
|
589
|
+
txType,
|
|
809
590
|
});
|
|
810
591
|
if (profitResult) {
|
|
811
592
|
allTransactions.push(...profitResult.signedTransactions);
|
|
@@ -817,15 +598,15 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
817
598
|
signedTransactions: allTransactions,
|
|
818
599
|
profitHopWallets,
|
|
819
600
|
metadata: {
|
|
820
|
-
buyerAddress: buyers.map(b => b.address).join(','),
|
|
821
|
-
sellerAddress: sellers.map(s => s.address).join(','),
|
|
601
|
+
buyerAddress: buyers.map((b) => b.address).join(','),
|
|
602
|
+
sellerAddress: sellers.map((s) => s.address).join(','),
|
|
822
603
|
buyAmount: ethers.formatEther(totalFundsWei),
|
|
823
604
|
sellAmount: ethers.formatUnits(quoteResult.sellAmountWei, decimals),
|
|
824
605
|
profitAmount: nativeProfitAmount > 0n ? ethers.formatEther(nativeProfitAmount) : undefined,
|
|
825
606
|
buyCount,
|
|
826
607
|
sellCount,
|
|
827
|
-
buyAmounts: buyAmountsWei.map(amt => ethers.formatEther(amt)),
|
|
828
|
-
sellAmounts: sellAmountsWei.map(amt => ethers.formatUnits(amt, decimals))
|
|
829
|
-
}
|
|
608
|
+
buyAmounts: buyAmountsWei.map((amt) => ethers.formatEther(amt)),
|
|
609
|
+
sellAmounts: sellAmountsWei.map((amt) => ethers.formatUnits(amt, decimals)),
|
|
610
|
+
},
|
|
830
611
|
};
|
|
831
612
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FlapCrossSwapParams, FlapCrossSwapResult } from './swap-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Flap 交叉换手(多卖多买,循环执行)
|
|
4
|
+
* - 每个卖方单独卖出,买入金额由卖出所得等分分配给当轮买方
|
|
5
|
+
* - 利润刮取、转账多跳逻辑继承 flapQuickBatchSwapMerkle
|
|
6
|
+
* - 结果按顺序拼接 signedTransactions(可交由前端/后端顺序广播)
|
|
7
|
+
* - ✅ 正确处理 nonce:同一钱包在多轮中使用时 nonce 自动递增
|
|
8
|
+
*/
|
|
9
|
+
export declare function flapCrossSwapMerkle(params: FlapCrossSwapParams): Promise<FlapCrossSwapResult>;
|