four-flap-meme-sdk 2.2.2 → 2.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +41 -6
- package/README.md +31 -0
- package/README.zh-CN.md +41 -6
- package/dist/__tests__/subpath-exports.test.d.ts +1 -0
- package/dist/__tests__/subpath-exports.test.js +64 -0
- package/dist/abis/common.d.ts +85 -0
- package/dist/abis/common.js +264 -0
- package/dist/abis/contracts/TaxToken.json +969 -0
- package/dist/abis/contracts/TokenManager2.json +136 -0
- package/dist/abis/contracts/index.d.ts +5 -0
- package/dist/abis/contracts/index.js +5 -0
- package/dist/abis/flap/index.d.ts +3 -0
- package/dist/abis/flap/index.js +3 -0
- package/dist/abis/flap/portal-events.d.ts +6 -0
- package/dist/abis/flap/portal-events.js +17 -0
- package/dist/abis/flap/portal.d.ts +6 -0
- package/dist/abis/flap/portal.js +37 -0
- package/dist/abis/flap/vault.d.ts +171 -0
- package/dist/abis/flap/vault.js +91 -0
- package/dist/abis/index.d.ts +8 -0
- package/dist/abis/index.js +11 -0
- package/dist/bundle-core/__tests__/config-helpers.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
- package/dist/bundle-core/__tests__/facade-parity.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
- package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
- package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
- package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
- package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
- package/dist/bundle-core/config-helpers.d.ts +36 -0
- package/dist/bundle-core/config-helpers.js +57 -0
- package/dist/bundle-core/errors.d.ts +50 -0
- package/dist/bundle-core/errors.js +35 -0
- package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
- package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
- package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
- package/dist/bundle-core/four-meme/core-helpers.js +40 -0
- package/dist/bundle-core/four-meme/core.d.ts +4 -0
- package/dist/bundle-core/four-meme/core.js +515 -0
- package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
- package/dist/bundle-core/four-meme/pancake-proxy.js +679 -0
- package/dist/bundle-core/four-meme/private.d.ts +27 -0
- package/dist/bundle-core/four-meme/private.js +465 -0
- package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
- package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
- package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
- package/dist/bundle-core/four-meme/swap-buy-first.js +493 -0
- package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
- package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
- package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
- package/dist/bundle-core/four-meme/swap-internal.js +18 -0
- package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +27 -0
- package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
- package/dist/bundle-core/four-meme/swap.d.ts +17 -0
- package/dist/bundle-core/four-meme/swap.js +505 -0
- package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
- package/dist/bundle-core/four-meme/types/buy-first.js +1 -0
- package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
- package/dist/bundle-core/four-meme/types/core-flow.js +1 -0
- package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
- package/dist/bundle-core/four-meme/types/index.js +1 -0
- package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
- package/dist/bundle-core/four-meme/types/swap-internal.js +1 -0
- package/dist/bundle-core/four-meme/types.d.ts +1 -0
- package/dist/bundle-core/four-meme/types.js +1 -0
- package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
- package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
- package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
- package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
- package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
- package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
- package/dist/bundle-core/index.d.ts +8 -0
- package/dist/bundle-core/index.js +8 -0
- package/dist/bundle-core/internal.d.ts +21 -0
- package/dist/bundle-core/internal.js +182 -0
- package/dist/bundle-core/sign-context-helpers.d.ts +25 -0
- package/dist/bundle-core/sign-context-helpers.js +67 -0
- package/dist/bundle-core/submit.d.ts +293 -0
- package/dist/bundle-core/submit.js +727 -0
- package/dist/bundle-core/types/index.d.ts +8 -0
- package/dist/bundle-core/types/index.js +1 -0
- package/dist/bundle-core/types.d.ts +1 -0
- package/dist/bundle-core/types.js +1 -0
- package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
- package/dist/chains/bsc/four/approve-tokenmanager.js +1 -113
- package/dist/chains/bsc/four/config.d.ts +5 -67
- package/dist/chains/bsc/four/config.js +2 -114
- package/dist/chains/bsc/four/core.d.ts +1 -4
- package/dist/chains/bsc/four/core.js +1 -592
- package/dist/chains/bsc/four/index.d.ts +6 -6
- package/dist/chains/bsc/four/index.js +6 -6
- package/dist/chains/bsc/four/internal.d.ts +2 -46
- package/dist/chains/bsc/four/internal.js +2 -239
- package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
- package/dist/chains/bsc/four/pancake-proxy.js +1 -687
- package/dist/chains/bsc/four/private.d.ts +1 -27
- package/dist/chains/bsc/four/private.js +1 -477
- package/dist/chains/bsc/four/submit.d.ts +2 -315
- package/dist/chains/bsc/four/submit.js +2 -752
- package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
- package/dist/chains/bsc/four/swap-buy-first.js +2 -507
- package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
- package/dist/chains/bsc/four/swap-internal.js +1 -18
- package/dist/chains/bsc/four/swap.d.ts +2 -144
- package/dist/chains/bsc/four/swap.js +2 -766
- package/dist/chains/bsc/four/types.d.ts +1 -476
- package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
- package/dist/chains/bsc/four/utils-disperse.js +1 -0
- package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
- package/dist/chains/bsc/four/utils-pairwise.js +1 -0
- package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
- package/dist/chains/bsc/four/utils-sweep.js +1 -0
- package/dist/chains/bsc/four/utils.d.ts +5 -18
- package/dist/chains/bsc/four/utils.js +5 -1552
- package/dist/chains/bsc/iro.d.ts +5 -0
- package/dist/chains/bsc/iro.js +4 -0
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +159 -0
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +117 -0
- package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
- package/dist/chains/bsc/pancake/bundle-buy-first.js +97 -212
- package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
- package/dist/chains/bsc/pancake/bundle-swap-helpers.js +565 -0
- package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
- package/dist/chains/bsc/pancake/bundle-swap.js +114 -726
- package/dist/chains/bsc/pancake/index.d.ts +4 -2
- package/dist/chains/bsc/pancake/index.js +1 -3
- package/dist/chains/bsc/platforms/iro/factory.d.ts +2 -2
- package/dist/chains/bsc/platforms/iro/factory.js +3 -1
- package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
- package/dist/chains/bsc/platforms/iro/index.js +3 -3
- package/dist/chains/bsc/platforms/iro/pool.js +31 -10
- package/dist/chains/bsc/platforms/iro/token.js +4 -1
- package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
- package/dist/chains/eni/batch-router/transfer.js +55 -25
- package/dist/chains/eni/batch-router/utils.js +32 -6
- package/dist/chains/eni/bundler/sign.js +5 -6
- package/dist/chains/eni/bundler/submit.js +1 -4
- package/dist/chains/eni/constants.js +1 -1
- package/dist/chains/eni/flat-aliases.d.ts +10 -0
- package/dist/chains/eni/flat-aliases.js +8 -0
- package/dist/chains/eni/index.d.ts +2 -1
- package/dist/chains/eni/index.js +1 -0
- package/dist/chains/eni/platforms/daoaas/create.js +2 -2
- package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
- package/dist/chains/eni/platforms/daoaas/index.js +3 -3
- package/dist/chains/eni/platforms/daoaas/meta.js +9 -6
- package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -44
- package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
- package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
- package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
- package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
- package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -46
- package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
- package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
- package/dist/chains/eni/platforms/iro/factory.d.ts +2 -2
- package/dist/chains/eni/platforms/iro/factory.js +3 -1
- package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
- package/dist/chains/eni/platforms/iro/index.js +4 -4
- package/dist/chains/eni/platforms/iro/pool.js +90 -26
- package/dist/chains/eni/platforms/iro/token.js +107 -31
- package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
- package/dist/chains/eni/submit.d.ts +43 -0
- package/dist/chains/eni/submit.js +286 -0
- package/dist/chains/index.d.ts +13 -0
- package/dist/chains/index.js +13 -0
- package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
- package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -21
- package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
- package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
- package/dist/chains/xlayer/eip7702/bundle-create.js +93 -59
- package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
- package/dist/chains/xlayer/eip7702/bundle-sell.js +29 -111
- package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
- package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -245
- package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
- package/dist/chains/xlayer/eip7702/constants.js +3 -21
- package/dist/chains/xlayer/eip7702/flat-aliases.d.ts +13 -0
- package/dist/chains/xlayer/eip7702/flat-aliases.js +10 -0
- package/dist/chains/xlayer/eip7702/index.d.ts +28 -46
- package/dist/chains/xlayer/eip7702/index.js +28 -81
- package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +79 -0
- package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +1 -0
- package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
- package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +63 -307
- package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
- package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +57 -0
- package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
- package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
- package/dist/chains/xlayer/eip7702/utils.js +23 -28
- package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +148 -0
- package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
- package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
- package/dist/chains/xlayer/eip7702/volume.js +89 -164
- package/dist/chains/xlayer/eoa/constants.js +1 -1
- package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
- package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
- package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
- package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
- package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +66 -299
- package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
- package/dist/chains/xlayer/eoa/eoa-wash-volume.js +18 -23
- package/dist/chains/xlayer/eoa/index.d.ts +10 -6
- package/dist/chains/xlayer/eoa/index.js +8 -23
- package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
- package/dist/chains/xlayer/eoa/router-manager.js +3 -3
- package/dist/chains/xlayer/eoa/types.d.ts +2 -2
- package/dist/chains/xlayer/eoa/types.js +1 -3
- package/dist/chains/xlayer/index.d.ts +3 -2
- package/dist/chains/xlayer/index.js +4 -7
- package/dist/contracts/helper3.d.ts +20 -5
- package/dist/contracts/helper3.js +56 -20
- package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
- package/dist/contracts/tm-bundle-helpers.js +72 -0
- package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
- package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -113
- package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -67
- package/dist/contracts/tm-bundle-merkle/config.js +2 -114
- package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
- package/dist/contracts/tm-bundle-merkle/core.js +1 -591
- package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
- package/dist/contracts/tm-bundle-merkle/index.js +5 -5
- package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -46
- package/dist/contracts/tm-bundle-merkle/internal.js +2 -238
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -686
- package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
- package/dist/contracts/tm-bundle-merkle/private.js +1 -476
- package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
- package/dist/contracts/tm-bundle-merkle/submit.js +3 -928
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -506
- package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
- package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
- package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
- package/dist/contracts/tm-bundle-merkle/swap.js +2 -764
- package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
- package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
- package/dist/contracts/tm-bundle-merkle/utils.d.ts +6 -18
- package/dist/contracts/tm-bundle-merkle/utils.js +6 -1501
- package/dist/contracts/tm-bundle.d.ts +3 -51
- package/dist/contracts/tm-bundle.js +108 -177
- package/dist/contracts/tm.d.ts +3 -2
- package/dist/contracts/tm.js +37 -32
- package/dist/contracts/tm1.js +9 -4
- package/dist/contracts/tm2.js +9 -4
- package/dist/dex/direct-router-helpers.d.ts +264 -0
- package/dist/dex/direct-router-helpers.js +539 -0
- package/dist/dex/direct-router.d.ts +3 -125
- package/dist/dex/direct-router.js +237 -666
- package/dist/dex/types.d.ts +81 -0
- package/dist/dex/types.js +1 -0
- package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
- package/dist/exports/root-bundle-and-tooling.js +30 -0
- package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
- package/dist/exports/root-eni-and-bsc-iro.js +66 -0
- package/dist/exports/root-foundations.d.ts +35 -0
- package/dist/exports/root-foundations.js +70 -0
- package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
- package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
- package/dist/flap/index.d.ts +10 -0
- package/dist/flap/index.js +8 -0
- package/dist/flows/create.d.ts +2 -1
- package/dist/flows/create.js +6 -6
- package/dist/flows/index.d.ts +1 -0
- package/dist/flows/index.js +1 -0
- package/dist/index.d.ts +20 -85
- package/dist/index.js +20 -215
- package/dist/merkle/index.d.ts +12 -0
- package/dist/merkle/index.js +11 -0
- package/dist/shared/abis/common.d.ts +2 -83
- package/dist/shared/abis/common.js +2 -252
- package/dist/shared/abis/index.d.ts +5 -6
- package/dist/shared/abis/index.js +5 -7
- package/dist/shared/clients/blockrazor.js +39 -25
- package/dist/shared/clients/club48.d.ts +2 -2
- package/dist/shared/clients/club48.js +34 -29
- package/dist/shared/clients/emitservice.js +2 -0
- package/dist/shared/clients/four.d.ts +21 -6
- package/dist/shared/clients/four.js +29 -24
- package/dist/shared/clients/index.d.ts +8 -0
- package/dist/shared/clients/index.js +8 -0
- package/dist/shared/clients/merkle.js +27 -34
- package/dist/shared/constants/addresses.d.ts +1 -1
- package/dist/shared/constants/addresses.js +11 -2
- package/dist/shared/constants/chains.d.ts +1 -1
- package/dist/shared/constants/chains.js +1 -1
- package/dist/shared/constants/gas.d.ts +1 -1
- package/dist/shared/constants/gas.js +2 -6
- package/dist/shared/constants/index.d.ts +3 -0
- package/dist/shared/constants/index.js +1 -0
- package/dist/shared/constants/quote.d.ts +30 -0
- package/dist/shared/constants/quote.js +37 -0
- package/dist/shared/flap/abi.js +1 -1
- package/dist/shared/flap/constants.d.ts +1 -2
- package/dist/shared/flap/constants.js +2 -3
- package/dist/shared/flap/curve.js +3 -0
- package/dist/shared/flap/errors.d.ts +1 -4
- package/dist/shared/flap/errors.js +20 -1
- package/dist/shared/flap/index.d.ts +5 -4
- package/dist/shared/flap/index.js +5 -4
- package/dist/shared/flap/meta.d.ts +22 -18
- package/dist/shared/flap/meta.js +12 -17
- package/dist/shared/flap/permit.js +5 -2
- package/dist/shared/flap/pinata.d.ts +22 -6
- package/dist/shared/flap/pinata.js +21 -26
- package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
- package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
- package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
- package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
- package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
- package/dist/shared/flap/portal-bundle-merkle/core.js +96 -277
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.d.ts +7 -2
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +107 -206
- package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +100 -92
- package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
- package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
- package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
- package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +66 -247
- package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
- package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +2 -71
- package/dist/shared/flap/portal-bundle-merkle/swap.js +103 -410
- package/dist/shared/flap/portal-bundle-merkle/types.d.ts +88 -9
- package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
- package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
- package/dist/shared/flap/portal-bundle.js +55 -56
- package/dist/shared/flap/portal-create-token.d.ts +80 -0
- package/dist/shared/flap/portal-create-token.js +257 -0
- package/dist/shared/flap/portal.d.ts +14 -3
- package/dist/shared/flap/portal.js +50 -25
- package/dist/shared/flap/vanity.d.ts +1 -5
- package/dist/shared/flap/vanity.js +6 -17
- package/dist/shared/flap/vault.d.ts +17 -124
- package/dist/shared/flap/vault.js +67 -148
- package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
- package/dist/shared/foundation/dex/v3-path.js +35 -0
- package/dist/shared/foundation/gas/bundle-gas.d.ts +49 -0
- package/dist/shared/foundation/gas/bundle-gas.js +93 -0
- package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
- package/dist/shared/foundation/gas/profit-hop.js +72 -0
- package/dist/shared/foundation/index.d.ts +13 -0
- package/dist/shared/foundation/index.js +12 -0
- package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
- package/dist/shared/foundation/nonce/nonce-manager.js +183 -0
- package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
- package/dist/shared/foundation/normalize-unknown.js +29 -0
- package/dist/shared/foundation/sdk-logger.d.ts +13 -0
- package/dist/shared/foundation/sdk-logger.js +12 -0
- package/dist/shared/foundation/tx/build-request.d.ts +17 -0
- package/dist/shared/foundation/tx/build-request.js +25 -0
- package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
- package/dist/shared/foundation/tx/sign-batch.js +26 -0
- package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
- package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
- package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
- package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
- package/dist/shared/foundation/types/erc20.d.ts +65 -0
- package/dist/shared/foundation/types/erc20.js +1 -0
- package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
- package/dist/shared/foundation/types/holders-maker.js +1 -0
- package/dist/shared/foundation/types/index.d.ts +7 -0
- package/dist/shared/foundation/types/index.js +1 -0
- package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
- package/dist/shared/foundation/types/lp-inspect.js +1 -0
- package/dist/shared/foundation/types/multicall.d.ts +5 -0
- package/dist/shared/foundation/types/multicall.js +1 -0
- package/dist/shared/foundation/types/private-sale.d.ts +35 -0
- package/dist/shared/foundation/types/private-sale.js +1 -0
- package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
- package/dist/shared/foundation/types/quote-helpers.js +1 -0
- package/dist/shared/four/tax-token.d.ts +1 -1
- package/dist/shared/four/tax-token.js +27 -7
- package/dist/shared/index.d.ts +6 -0
- package/dist/shared/index.js +4 -0
- package/dist/types/errors.d.ts +27 -0
- package/dist/types/errors.js +34 -0
- package/dist/utils/airdrop-sweep.d.ts +4 -76
- package/dist/utils/airdrop-sweep.js +42 -55
- package/dist/utils/bundle-helpers.d.ts +9 -243
- package/dist/utils/bundle-helpers.js +10 -584
- package/dist/utils/constants.d.ts +5 -61
- package/dist/utils/constants.js +5 -80
- package/dist/utils/contract-factory.d.ts +2 -4
- package/dist/utils/contract-factory.js +25 -18
- package/dist/utils/erc20.d.ts +7 -89
- package/dist/utils/erc20.js +94 -125
- package/dist/utils/errors.d.ts +12 -1
- package/dist/utils/errors.js +60 -1
- package/dist/utils/holders-maker/addresses.d.ts +12 -0
- package/dist/utils/holders-maker/addresses.js +15 -0
- package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
- package/dist/utils/holders-maker/buy-tx.js +278 -0
- package/dist/utils/holders-maker/constants.d.ts +6 -0
- package/dist/utils/holders-maker/constants.js +7 -0
- package/dist/utils/holders-maker/disperse.d.ts +18 -0
- package/dist/utils/holders-maker/disperse.js +90 -0
- package/dist/utils/holders-maker/routing.d.ts +4 -0
- package/dist/utils/holders-maker/routing.js +45 -0
- package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
- package/dist/utils/holders-maker/transfer-tx.js +67 -0
- package/dist/utils/holders-maker-helpers.d.ts +9 -0
- package/dist/utils/holders-maker-helpers.js +9 -0
- package/dist/utils/holders-maker.d.ts +2 -138
- package/dist/utils/holders-maker.js +26 -661
- package/dist/utils/hop-chains.d.ts +35 -0
- package/dist/utils/hop-chains.js +215 -0
- package/dist/utils/lp-inspect-helpers.d.ts +9 -0
- package/dist/utils/lp-inspect-helpers.js +109 -0
- package/dist/utils/lp-inspect.d.ts +2 -112
- package/dist/utils/lp-inspect.js +73 -223
- package/dist/utils/mpcExclusive.d.ts +2 -5
- package/dist/utils/mpcExclusive.js +4 -3
- package/dist/utils/private-sale.d.ts +2 -58
- package/dist/utils/private-sale.js +4 -15
- package/dist/utils/provider-factory.d.ts +4 -0
- package/dist/utils/provider-factory.js +10 -0
- package/dist/utils/quote-helpers.d.ts +4 -45
- package/dist/utils/quote-helpers.js +17 -74
- package/dist/utils/stealth-transfer.d.ts +2 -28
- package/dist/utils/stealth-transfer.js +31 -15
- package/dist/utils/swap-helpers.d.ts +2 -15
- package/dist/utils/swap-helpers.js +6 -11
- package/dist/utils/types/airdrop-sweep.d.ts +1 -0
- package/dist/utils/types/airdrop-sweep.js +1 -0
- package/dist/utils/types/contract-factory.d.ts +1 -0
- package/dist/utils/types/contract-factory.js +1 -0
- package/dist/utils/types/erc20.d.ts +1 -0
- package/dist/utils/types/erc20.js +1 -0
- package/dist/utils/types/errors.d.ts +1 -0
- package/dist/utils/types/errors.js +1 -0
- package/dist/utils/types/holders-maker.d.ts +1 -0
- package/dist/utils/types/holders-maker.js +1 -0
- package/dist/utils/types/hop-chains.d.ts +8 -0
- package/dist/utils/types/hop-chains.js +1 -0
- package/dist/utils/types/index.d.ts +13 -0
- package/dist/utils/types/index.js +1 -0
- package/dist/utils/types/lp-inspect.d.ts +1 -0
- package/dist/utils/types/lp-inspect.js +1 -0
- package/dist/utils/types/mpc-exclusive.d.ts +5 -0
- package/dist/utils/types/mpc-exclusive.js +1 -0
- package/dist/utils/types/private-sale.d.ts +1 -0
- package/dist/utils/types/private-sale.js +1 -0
- package/dist/utils/types/quote-helpers.d.ts +1 -0
- package/dist/utils/types/quote-helpers.js +1 -0
- package/dist/utils/types/stealth-transfer.d.ts +44 -0
- package/dist/utils/types/stealth-transfer.js +1 -0
- package/dist/utils/types/wallet.d.ts +25 -0
- package/dist/utils/types/wallet.js +1 -0
- package/dist/utils/wallet.d.ts +2 -25
- package/dist/utils/wallet.js +13 -10
- package/dist/vanity/index.d.ts +5 -0
- package/dist/vanity/index.js +5 -0
- package/package.json +160 -4
- package/src/abis/contracts/TaxToken.json +969 -0
- package/src/abis/contracts/TokenManager.json +836 -0
- package/src/abis/contracts/TokenManager2.json +136 -0
- package/src/abis/contracts/TokenManagerHelper3.json +993 -0
- package/dist/shared/abis/TaxToken.json +0 -105
- package/dist/shared/abis/TokenManager2.json +0 -60
- /package/dist/{shared/abis → abis/contracts}/TokenManager.json +0 -0
- /package/dist/{shared/abis → abis/contracts}/TokenManagerHelper3.json +0 -0
|
@@ -1,180 +1,32 @@
|
|
|
1
|
-
import { ethers, Wallet } from 'ethers';
|
|
2
|
-
import { getOptimizedGasPrice, NonceManager, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
|
|
3
|
-
import { ADDRESSES } from '../../../utils/constants.js';
|
|
4
|
-
import { GAS_LIMITS, PROFIT_CONFIG, calculateTransferFee } from '../../constants/index.js';
|
|
5
|
-
import { MULTICALL3_ABI, ERC20_BALANCE_ABI } from '../../abis/common.js';
|
|
6
|
-
import { getTxType, getGasPriceConfig, shouldExtractProfit, getProfitRecipient } from './config.js';
|
|
7
|
-
// ==================== 链配置 ====================
|
|
8
|
-
const CHAIN_ID_MAP = {
|
|
9
|
-
'BSC': 56,
|
|
10
|
-
'MONAD': 143,
|
|
11
|
-
'XLAYER': 196
|
|
12
|
-
};
|
|
13
|
-
// ==================== 链常量 ====================
|
|
14
|
-
// ✅ 使用公共模块
|
|
15
|
-
const MULTICALL3_ADDRESS = ADDRESSES.BSC.Multicall3;
|
|
16
|
-
// ==================== 内部辅助函数 ====================
|
|
17
|
-
const decimalsCache = new Map();
|
|
18
|
-
async function getErc20Decimals(provider, token) {
|
|
19
|
-
const network = await provider.getNetwork();
|
|
20
|
-
const key = `${network.chainId}_${token.toLowerCase()}`;
|
|
21
|
-
if (decimalsCache.has(key))
|
|
22
|
-
return decimalsCache.get(key);
|
|
23
|
-
try {
|
|
24
|
-
const erc20 = new ethers.Contract(token, ['function decimals() view returns (uint8)'], provider);
|
|
25
|
-
const d = await erc20.decimals();
|
|
26
|
-
if (!Number.isFinite(d) || d < 0 || d > 36)
|
|
27
|
-
return 18;
|
|
28
|
-
decimalsCache.set(key, d);
|
|
29
|
-
return d;
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return 18;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* ✅ 生成多跳中间钱包(返回完整钱包信息:地址 + 私钥)
|
|
37
|
-
*/
|
|
38
|
-
function generateHopWallets(recipientCount, hopCount) {
|
|
39
|
-
const hopCounts = Array.isArray(hopCount) ? hopCount : new Array(recipientCount).fill(hopCount);
|
|
40
|
-
if (hopCounts.every(h => h <= 0))
|
|
41
|
-
return null;
|
|
42
|
-
const result = [];
|
|
43
|
-
for (let i = 0; i < recipientCount; i++) {
|
|
44
|
-
const chain = [];
|
|
45
|
-
for (let j = 0; j < hopCounts[i]; j++) {
|
|
46
|
-
const wallet = Wallet.createRandom();
|
|
47
|
-
chain.push({
|
|
48
|
-
address: wallet.address,
|
|
49
|
-
privateKey: wallet.privateKey
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
result.push(chain);
|
|
53
|
-
}
|
|
54
|
-
return result;
|
|
55
|
-
}
|
|
56
|
-
function normalizeAmounts(recipients, amount, amounts) {
|
|
57
|
-
if (amounts && amounts.length > 0) {
|
|
58
|
-
if (amounts.length !== recipients.length) {
|
|
59
|
-
throw new Error(`amounts length (${amounts.length}) must match recipients length (${recipients.length})`);
|
|
60
|
-
}
|
|
61
|
-
return amounts;
|
|
62
|
-
}
|
|
63
|
-
if (amount !== undefined && amount.trim().length > 0) {
|
|
64
|
-
return new Array(recipients.length).fill(amount);
|
|
65
|
-
}
|
|
66
|
-
throw new Error('Either amount or amounts must be provided');
|
|
67
|
-
}
|
|
68
|
-
async function batchGetBalances(provider, addresses, tokenAddress) {
|
|
69
|
-
if (addresses.length === 0)
|
|
70
|
-
return [];
|
|
71
|
-
if (!tokenAddress) {
|
|
72
|
-
return Promise.all(addresses.map(addr => provider.getBalance(addr).catch(() => 0n)));
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
// ✅ 使用公共模块
|
|
76
|
-
const multicall = new ethers.Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
|
|
77
|
-
const iface = new ethers.Interface(ERC20_BALANCE_ABI);
|
|
78
|
-
const calls = addresses.map(addr => ({
|
|
79
|
-
target: tokenAddress,
|
|
80
|
-
allowFailure: true,
|
|
81
|
-
callData: iface.encodeFunctionData('balanceOf', [addr])
|
|
82
|
-
}));
|
|
83
|
-
try {
|
|
84
|
-
const results = await multicall.aggregate3(calls);
|
|
85
|
-
return results.map((result) => {
|
|
86
|
-
if (result.success) {
|
|
87
|
-
return iface.decodeFunctionResult('balanceOf', result.returnData)[0];
|
|
88
|
-
}
|
|
89
|
-
return 0n;
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
const fallbackCalls = addresses.map(addr => provider
|
|
94
|
-
.call({ to: tokenAddress, data: iface.encodeFunctionData('balanceOf', [addr]) })
|
|
95
|
-
.then(raw => iface.decodeFunctionResult('balanceOf', raw)[0])
|
|
96
|
-
.catch(() => 0n));
|
|
97
|
-
return Promise.all(fallbackCalls);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* 计算 Gas Limit
|
|
103
|
-
* - 原生代币转账:21000 gas(固定)
|
|
104
|
-
* - ERC20 标准 transfer:约 45000-55000 gas,使用 55000 作为安全值
|
|
105
|
-
*
|
|
106
|
-
* ✅ 优化:降低 ERC20 gas limit,减少中转钱包 BNB 残留
|
|
107
|
-
*/
|
|
108
|
-
function calculateGasLimit(config, isNative, hasHops, _hopCount = 0) {
|
|
109
|
-
if (config.gasLimit !== undefined) {
|
|
110
|
-
return BigInt(config.gasLimit);
|
|
111
|
-
}
|
|
112
|
-
// ✅ 原生代币: 21000, ERC20 标准 transfer: 48000(USDT 最低约 46815)
|
|
113
|
-
const baseGas = isNative ? 21000 : 48000;
|
|
114
|
-
// ✅ 多跳时每个中转钱包只执行一笔 transfer,使用较小的安全系数
|
|
115
|
-
const multiplier = config.gasLimitMultiplier ?? 1.1;
|
|
116
|
-
return BigInt(Math.ceil(baseGas * multiplier));
|
|
117
|
-
}
|
|
118
|
-
function isNativeTokenAddress(tokenAddress) {
|
|
119
|
-
if (!tokenAddress)
|
|
120
|
-
return true;
|
|
121
|
-
const v = tokenAddress.trim().toLowerCase();
|
|
122
|
-
if (!v)
|
|
123
|
-
return true;
|
|
124
|
-
if (v === 'native')
|
|
125
|
-
return true;
|
|
126
|
-
if (v === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee')
|
|
127
|
-
return true;
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
// ==================== 分散函数 ====================
|
|
131
1
|
/**
|
|
132
|
-
*
|
|
133
|
-
* ✅ 支持利润提取(按地址数量收取固定费用)
|
|
134
|
-
* ✅ 支持多跳
|
|
135
|
-
* ✅ 支持 Multicall3 批量获取余额
|
|
2
|
+
* utils - 主函数
|
|
136
3
|
*/
|
|
4
|
+
import { ethers, Wallet } from 'ethers';
|
|
5
|
+
import { getOptimizedGasPrice, NonceManager, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../../utils/bundle-helpers.js';
|
|
6
|
+
import { GAS_LIMITS, calculateTransferFee } from '../../constants/index.js';
|
|
7
|
+
import { CHAIN_ID_MAP, getTxType, getGasPriceConfig, shouldExtractProfit, getProfitRecipient } from './config.js';
|
|
8
|
+
import { batchGetBalances, calculateGasLimit, generateHopWallets, getErc20Decimals, isNativeTokenAddress, normalizeAmounts, } from '../../../bundle-core/internal.js';
|
|
9
|
+
import { createSignProvider, createSignWallet, normalizeItemsOrRecipientsAmounts, resolveHopCountInput, resolveProvidedHops, } from '../../../bundle-core/sign-context-helpers.js';
|
|
137
10
|
export async function flapDisperseWithBundleMerkle(params) {
|
|
138
|
-
const { chain, fromPrivateKey, recipients, amount, amounts, tokenAddress, tokenDecimals, hopCount = 0, hopPrivateKeys, items, config, startNonce } = params;
|
|
11
|
+
const { chain, fromPrivateKey, recipients, amount, amounts, tokenAddress, tokenDecimals, hopCount = 0, hopPrivateKeys, items, config, startNonce, } = params;
|
|
139
12
|
if (!recipients || recipients.length === 0) {
|
|
140
13
|
return { signedTransactions: [], hopWallets: undefined };
|
|
141
14
|
}
|
|
142
15
|
const chainIdNum = CHAIN_ID_MAP[chain] ?? 56;
|
|
143
|
-
const provider =
|
|
144
|
-
const mainWallet =
|
|
16
|
+
const provider = createSignProvider(config.rpcUrl, chainIdNum, chain);
|
|
17
|
+
const mainWallet = createSignWallet(fromPrivateKey, provider);
|
|
145
18
|
const isNative = isNativeTokenAddress(tokenAddress);
|
|
146
19
|
const txType = getTxType(config);
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
: normalizeAmounts(recipients, amount, amounts);
|
|
151
|
-
const providedHops = (() => {
|
|
152
|
-
if (hopPrivateKeys && hopPrivateKeys.length > 0) {
|
|
153
|
-
if (hopPrivateKeys.length !== recipients.length) {
|
|
154
|
-
throw new Error(`hopPrivateKeys length (${hopPrivateKeys.length}) must match recipients length (${recipients.length})`);
|
|
155
|
-
}
|
|
156
|
-
return hopPrivateKeys.every(h => h.length === 0) ? null : hopPrivateKeys;
|
|
157
|
-
}
|
|
158
|
-
if (items && items.length > 0) {
|
|
159
|
-
const hops = items.map(it => it.hopPrivateKeys ?? []);
|
|
160
|
-
return hops.every(h => h.length === 0) ? null : hops;
|
|
161
|
-
}
|
|
162
|
-
return null;
|
|
163
|
-
})();
|
|
164
|
-
const hopCountInput = (() => {
|
|
165
|
-
if (items && items.length > 0) {
|
|
166
|
-
const baseArray = Array.isArray(hopCount) ? hopCount : new Array(recipients.length).fill(hopCount);
|
|
167
|
-
return items.map((it, i) => (typeof it.hopCount === 'number' ? it.hopCount : (baseArray[i] ?? 0)));
|
|
168
|
-
}
|
|
169
|
-
return hopCount;
|
|
170
|
-
})();
|
|
20
|
+
const normalizedAmounts = normalizeItemsOrRecipientsAmounts(recipients, items, amount, amounts, normalizeAmounts);
|
|
21
|
+
const providedHops = resolveProvidedHops(recipients.length, hopPrivateKeys, items);
|
|
22
|
+
const hopCountInput = resolveHopCountInput(recipients.length, hopCount, items);
|
|
171
23
|
const preparedHops = providedHops ?? generateHopWallets(recipients.length, hopCountInput);
|
|
172
24
|
const hasHops = preparedHops !== null;
|
|
173
|
-
const maxHopCount = hasHops ? Math.max(...preparedHops.map(h => h.length)) : 0;
|
|
25
|
+
const maxHopCount = hasHops ? Math.max(...preparedHops.map((h) => h.length)) : 0;
|
|
174
26
|
const finalGasLimit = calculateGasLimit(config, isNative, hasHops, maxHopCount);
|
|
175
27
|
const nativeGasLimit = GAS_LIMITS.BRIBE;
|
|
176
28
|
const signedTxs = [];
|
|
177
|
-
const extractProfit = shouldExtractProfit(
|
|
29
|
+
const extractProfit = shouldExtractProfit();
|
|
178
30
|
const profitAddr = getProfitRecipient();
|
|
179
31
|
let totalProfit = 0n;
|
|
180
32
|
let totalAmountBeforeProfit = 0n;
|
|
@@ -188,12 +40,11 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
188
40
|
getOptimizedGasPrice(provider, getGasPriceConfig(config)),
|
|
189
41
|
startNonce !== undefined
|
|
190
42
|
? Promise.resolve(Array.from({ length: totalTxCount }, (_, i) => startNonce + i))
|
|
191
|
-
: nonceManager.getNextNonceBatch(mainWallet, totalTxCount)
|
|
43
|
+
: nonceManager.getNextNonceBatch(mainWallet, totalTxCount),
|
|
192
44
|
]);
|
|
193
45
|
// ✅ 按地址数量收取固定费用(原生代币)
|
|
194
46
|
if (extractProfit) {
|
|
195
47
|
totalProfit = calculateTransferFee(chainIdNum, recipients.length);
|
|
196
|
-
console.log(`[flap disperse] 利润按地址数量收取: ${ethers.formatEther(totalProfit)} 原生币 (${recipients.length} 地址)`);
|
|
197
48
|
}
|
|
198
49
|
if (isNative) {
|
|
199
50
|
const txDataList = recipients.map((to, i) => {
|
|
@@ -209,7 +60,7 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
209
60
|
gasPrice,
|
|
210
61
|
gasLimit: nativeGasLimit,
|
|
211
62
|
chainId: chainIdNum,
|
|
212
|
-
type: txType
|
|
63
|
+
type: txType,
|
|
213
64
|
}));
|
|
214
65
|
signedTxs.push(...(await Promise.all(txPromises)));
|
|
215
66
|
}
|
|
@@ -231,7 +82,7 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
231
82
|
gasPrice,
|
|
232
83
|
gasLimit: finalGasLimit,
|
|
233
84
|
chainId: chainIdNum,
|
|
234
|
-
type: txType
|
|
85
|
+
type: txType,
|
|
235
86
|
}));
|
|
236
87
|
signedTxs.push(...(await Promise.all(txPromises)));
|
|
237
88
|
}
|
|
@@ -246,7 +97,7 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
246
97
|
gasPrice,
|
|
247
98
|
chainId: chainIdNum,
|
|
248
99
|
txType,
|
|
249
|
-
startNonce: nonces[recipients.length]
|
|
100
|
+
startNonce: nonces[recipients.length],
|
|
250
101
|
});
|
|
251
102
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
252
103
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -256,7 +107,9 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
256
107
|
// ========== 有多跳:构建跳转链 ==========
|
|
257
108
|
const [gasPrice, decimals] = await Promise.all([
|
|
258
109
|
getOptimizedGasPrice(provider, getGasPriceConfig(config)),
|
|
259
|
-
isNative
|
|
110
|
+
isNative
|
|
111
|
+
? Promise.resolve(18)
|
|
112
|
+
: Promise.resolve(tokenDecimals ?? (await getErc20Decimals(provider, tokenAddress))),
|
|
260
113
|
]);
|
|
261
114
|
const iface = isNative ? null : new ethers.Interface(['function transfer(address,uint256) returns (bool)']);
|
|
262
115
|
const gasFeePerHop = finalGasLimit * gasPrice;
|
|
@@ -267,7 +120,7 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
267
120
|
mainWalletNonceCount += 1;
|
|
268
121
|
}
|
|
269
122
|
else {
|
|
270
|
-
const nonceNeed = isNative ? 1 :
|
|
123
|
+
const nonceNeed = isNative ? 1 : hopChain.length + 1;
|
|
271
124
|
mainWalletNonceCount += nonceNeed;
|
|
272
125
|
}
|
|
273
126
|
}
|
|
@@ -281,7 +134,6 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
281
134
|
// ✅ 按地址数量收取固定费用(原生代币)
|
|
282
135
|
if (extractProfit) {
|
|
283
136
|
totalProfit = calculateTransferFee(chainIdNum, recipients.length);
|
|
284
|
-
console.log(`[flap disperse hops] 利润按地址数量收取: ${ethers.formatEther(totalProfit)} 原生币 (${recipients.length} 地址)`);
|
|
285
137
|
}
|
|
286
138
|
for (let i = 0; i < recipients.length; i++) {
|
|
287
139
|
const finalRecipient = recipients[i];
|
|
@@ -297,27 +149,55 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
297
149
|
if (isNative) {
|
|
298
150
|
txsToSign.push({
|
|
299
151
|
wallet: mainWallet,
|
|
300
|
-
tx: {
|
|
152
|
+
tx: {
|
|
153
|
+
to: finalRecipient,
|
|
154
|
+
value: amountWei,
|
|
155
|
+
nonce,
|
|
156
|
+
gasPrice,
|
|
157
|
+
gasLimit: nativeGasLimit,
|
|
158
|
+
chainId: chainIdNum,
|
|
159
|
+
type: txType,
|
|
160
|
+
},
|
|
301
161
|
});
|
|
302
162
|
}
|
|
303
163
|
else {
|
|
304
164
|
const data = iface.encodeFunctionData('transfer', [finalRecipient, amountWei]);
|
|
305
165
|
txsToSign.push({
|
|
306
166
|
wallet: mainWallet,
|
|
307
|
-
tx: {
|
|
167
|
+
tx: {
|
|
168
|
+
to: tokenAddress,
|
|
169
|
+
data,
|
|
170
|
+
value: 0n,
|
|
171
|
+
nonce,
|
|
172
|
+
gasPrice,
|
|
173
|
+
gasLimit: finalGasLimit,
|
|
174
|
+
chainId: chainIdNum,
|
|
175
|
+
type: txType,
|
|
176
|
+
},
|
|
308
177
|
});
|
|
309
178
|
}
|
|
310
179
|
continue;
|
|
311
180
|
}
|
|
312
181
|
// ✅ 支持 string 和 GeneratedWallet 两种类型
|
|
313
|
-
const fullChain = [
|
|
314
|
-
|
|
182
|
+
const fullChain = [
|
|
183
|
+
mainWallet,
|
|
184
|
+
...hopChain.map((w) => new Wallet(typeof w === 'string' ? w : w.privateKey, provider)),
|
|
185
|
+
];
|
|
186
|
+
const addresses = [...fullChain.map((w) => w.address), finalRecipient];
|
|
315
187
|
if (!isNative) {
|
|
316
188
|
for (let j = 0; j < hopChain.length; j++) {
|
|
317
189
|
const nonce = allMainNonces[mainNonceIdx++];
|
|
318
190
|
txsToSign.push({
|
|
319
191
|
wallet: mainWallet,
|
|
320
|
-
tx: {
|
|
192
|
+
tx: {
|
|
193
|
+
to: fullChain[j + 1].address,
|
|
194
|
+
value: gasFeePerHop,
|
|
195
|
+
nonce,
|
|
196
|
+
gasPrice,
|
|
197
|
+
gasLimit: nativeGasLimit,
|
|
198
|
+
chainId: chainIdNum,
|
|
199
|
+
type: txType,
|
|
200
|
+
},
|
|
321
201
|
});
|
|
322
202
|
}
|
|
323
203
|
}
|
|
@@ -331,14 +211,31 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
331
211
|
const transferValue = amountWei + additionalGas;
|
|
332
212
|
txsToSign.push({
|
|
333
213
|
wallet: fromWallet,
|
|
334
|
-
tx: {
|
|
214
|
+
tx: {
|
|
215
|
+
to: toAddress,
|
|
216
|
+
value: transferValue,
|
|
217
|
+
nonce,
|
|
218
|
+
gasPrice,
|
|
219
|
+
gasLimit: finalGasLimit,
|
|
220
|
+
chainId: chainIdNum,
|
|
221
|
+
type: txType,
|
|
222
|
+
},
|
|
335
223
|
});
|
|
336
224
|
}
|
|
337
225
|
else {
|
|
338
226
|
const data = iface.encodeFunctionData('transfer', [toAddress, amountWei]);
|
|
339
227
|
txsToSign.push({
|
|
340
228
|
wallet: fromWallet,
|
|
341
|
-
tx: {
|
|
229
|
+
tx: {
|
|
230
|
+
to: tokenAddress,
|
|
231
|
+
data,
|
|
232
|
+
value: 0n,
|
|
233
|
+
nonce,
|
|
234
|
+
gasPrice,
|
|
235
|
+
gasLimit: finalGasLimit,
|
|
236
|
+
chainId: chainIdNum,
|
|
237
|
+
type: txType,
|
|
238
|
+
},
|
|
342
239
|
});
|
|
343
240
|
}
|
|
344
241
|
}
|
|
@@ -347,7 +244,7 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
347
244
|
signedTxs.push(...signedTxsResult);
|
|
348
245
|
// ✅ 利润多跳转账(固定费用,原生代币)
|
|
349
246
|
if (extractProfit && totalProfit > 0n) {
|
|
350
|
-
const profitNonce = allMainNonces[mainNonceIdx
|
|
247
|
+
const profitNonce = allMainNonces[mainNonceIdx];
|
|
351
248
|
const profitHopResult = await buildProfitHopTransactions({
|
|
352
249
|
provider,
|
|
353
250
|
payerWallet: mainWallet,
|
|
@@ -357,7 +254,7 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
357
254
|
gasPrice,
|
|
358
255
|
chainId: chainIdNum,
|
|
359
256
|
txType,
|
|
360
|
-
startNonce: profitNonce
|
|
257
|
+
startNonce: profitNonce,
|
|
361
258
|
});
|
|
362
259
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
363
260
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -367,14 +264,16 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
367
264
|
signedTransactions: signedTxs,
|
|
368
265
|
hopWallets: preparedHops || undefined,
|
|
369
266
|
profitHopWallets, // ✅ 返回利润多跳钱包
|
|
370
|
-
metadata: extractProfit
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
267
|
+
metadata: extractProfit
|
|
268
|
+
? {
|
|
269
|
+
totalAmount: ethers.formatEther(totalAmountBeforeProfit),
|
|
270
|
+
profitAmount: ethers.formatEther(totalProfit),
|
|
271
|
+
profitRecipient: profitAddr,
|
|
272
|
+
recipientCount: recipients.length,
|
|
273
|
+
isNative,
|
|
274
|
+
tokenAddress: isNative ? undefined : tokenAddress,
|
|
275
|
+
}
|
|
276
|
+
: undefined,
|
|
378
277
|
};
|
|
379
278
|
}
|
|
380
279
|
// ==================== 归集函数 ====================
|
|
@@ -386,71 +285,50 @@ export async function flapDisperseWithBundleMerkle(params) {
|
|
|
386
285
|
* ✅ 支持 Multicall3 批量获取余额
|
|
387
286
|
*/
|
|
388
287
|
export async function flapSweepWithBundleMerkle(params) {
|
|
389
|
-
const { chain, sourcePrivateKeys, target, ratioPct, ratios, amount, amounts, tokenAddress, tokenDecimals, skipIfInsufficient = true, hopCount = 0, hopPrivateKeys, sources, config } = params;
|
|
288
|
+
const { chain, sourcePrivateKeys, target, ratioPct, ratios, amount, amounts, tokenAddress, tokenDecimals, skipIfInsufficient = true, hopCount = 0, hopPrivateKeys, sources, config, } = params;
|
|
390
289
|
if (!sourcePrivateKeys || sourcePrivateKeys.length === 0) {
|
|
391
290
|
return { signedTransactions: [], hopWallets: undefined };
|
|
392
291
|
}
|
|
393
292
|
const chainIdNum = CHAIN_ID_MAP[chain] ?? 56;
|
|
394
|
-
const provider =
|
|
293
|
+
const provider = createSignProvider(config.rpcUrl, chainIdNum, chain);
|
|
395
294
|
const isNative = isNativeTokenAddress(tokenAddress);
|
|
396
295
|
const txType = getTxType(config);
|
|
397
|
-
const clamp = (n) =>
|
|
398
|
-
? Math.max(0, Math.min(100, Math.floor(n)))
|
|
399
|
-
: undefined);
|
|
296
|
+
const clamp = (n) => typeof n === 'number' && Number.isFinite(n) ? Math.max(0, Math.min(100, Math.floor(n))) : undefined;
|
|
400
297
|
const ratio = clamp(ratioPct);
|
|
401
298
|
const actualKeys = (() => {
|
|
402
299
|
if (sources && sources.length > 0)
|
|
403
|
-
return sources.map(s => s.privateKey);
|
|
300
|
+
return sources.map((s) => s.privateKey);
|
|
404
301
|
return sourcePrivateKeys;
|
|
405
302
|
})();
|
|
406
|
-
const providedHops = (
|
|
407
|
-
|
|
408
|
-
if (hopPrivateKeys.length !== actualKeys.length) {
|
|
409
|
-
throw new Error(`hopPrivateKeys length (${hopPrivateKeys.length}) must match sourcePrivateKeys length (${actualKeys.length})`);
|
|
410
|
-
}
|
|
411
|
-
return hopPrivateKeys.every(h => h.length === 0) ? null : hopPrivateKeys;
|
|
412
|
-
}
|
|
413
|
-
if (sources && sources.length > 0) {
|
|
414
|
-
const hops = sources.map(s => s.hopPrivateKeys ?? []);
|
|
415
|
-
return hops.every(h => h.length === 0) ? null : hops;
|
|
416
|
-
}
|
|
417
|
-
return null;
|
|
418
|
-
})();
|
|
419
|
-
const hopCountInput = (() => {
|
|
420
|
-
if (sources && sources.length > 0) {
|
|
421
|
-
const baseArray = Array.isArray(hopCount) ? hopCount : new Array(actualKeys.length).fill(hopCount);
|
|
422
|
-
return sources.map((s, i) => (typeof s.hopCount === 'number' ? s.hopCount : (baseArray[i] ?? 0)));
|
|
423
|
-
}
|
|
424
|
-
return hopCount;
|
|
425
|
-
})();
|
|
303
|
+
const providedHops = resolveProvidedHops(actualKeys.length, hopPrivateKeys, sources);
|
|
304
|
+
const hopCountInput = resolveHopCountInput(actualKeys.length, hopCount, sources);
|
|
426
305
|
const preparedHops = providedHops ?? generateHopWallets(actualKeys.length, hopCountInput);
|
|
427
306
|
const hasHops = preparedHops !== null;
|
|
428
|
-
const maxHopCount = hasHops ? Math.max(...preparedHops.map(h => h.length)) : 0;
|
|
307
|
+
const maxHopCount = hasHops ? Math.max(...preparedHops.map((h) => h.length)) : 0;
|
|
429
308
|
const finalGasLimit = calculateGasLimit(config, isNative, hasHops, maxHopCount);
|
|
430
309
|
const nativeGasLimit = GAS_LIMITS.BRIBE;
|
|
431
310
|
const signedTxs = [];
|
|
432
|
-
const extractProfit = shouldExtractProfit(
|
|
311
|
+
const extractProfit = shouldExtractProfit();
|
|
433
312
|
const profitAddr = getProfitRecipient();
|
|
434
313
|
let totalProfit = 0n;
|
|
435
314
|
let totalAmountBeforeProfit = 0n;
|
|
436
315
|
let profitHopWallets; // ✅ 收集利润多跳钱包
|
|
437
316
|
if (!preparedHops) {
|
|
438
317
|
// ========== 无多跳:直接批量归集 ==========
|
|
439
|
-
const wallets = actualKeys.map(pk => new Wallet(pk, provider));
|
|
440
|
-
const addresses = wallets.map(w => w.address);
|
|
318
|
+
const wallets = actualKeys.map((pk) => new Wallet(pk, provider));
|
|
319
|
+
const addresses = wallets.map((w) => w.address);
|
|
441
320
|
const nonceManager = new NonceManager(provider);
|
|
442
321
|
// ✅ 按地址数量收取固定费用(原生代币)
|
|
443
322
|
if (extractProfit) {
|
|
444
323
|
totalProfit = calculateTransferFee(chainIdNum, wallets.length);
|
|
445
|
-
console.log(`[flap sweep] 利润按地址数量收取: ${ethers.formatEther(totalProfit)} 原生币 (${wallets.length} 地址)`);
|
|
446
324
|
}
|
|
447
325
|
if (isNative) {
|
|
448
326
|
const [gasPrice, balances] = await Promise.all([
|
|
449
327
|
getOptimizedGasPrice(provider, getGasPriceConfig(config)),
|
|
450
|
-
batchGetBalances(provider, addresses)
|
|
328
|
+
batchGetBalances(provider, addresses),
|
|
451
329
|
]);
|
|
452
330
|
const gasCostBase = nativeGasLimit * gasPrice;
|
|
453
|
-
const profitTxGas =
|
|
331
|
+
const profitTxGas = GAS_LIMITS.NATIVE_TRANSFER * gasPrice * BigInt(PROFIT_HOP_COUNT + 1);
|
|
454
332
|
// 第一步:计算所有钱包的归集金额,找出余额最大的钱包
|
|
455
333
|
const sweepAmounts = [];
|
|
456
334
|
let maxSweepIndex = -1;
|
|
@@ -475,7 +353,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
475
353
|
const gasCost = gasCostBase;
|
|
476
354
|
if (ratioForI !== undefined) {
|
|
477
355
|
const want = (bal * BigInt(ratioForI)) / 100n;
|
|
478
|
-
const maxSendable = bal > gasCost ?
|
|
356
|
+
const maxSendable = bal > gasCost ? bal - gasCost : 0n;
|
|
479
357
|
toSend = want > maxSendable ? maxSendable : want;
|
|
480
358
|
}
|
|
481
359
|
else if (amountStrForI && amountStrForI.trim().length > 0) {
|
|
@@ -499,7 +377,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
499
377
|
const payerNeedGas = gasCostBase + profitTxGas;
|
|
500
378
|
if (payerBalance < payerSweepAmount + payerNeedGas + totalProfit) {
|
|
501
379
|
// 余额不足支付利润,减少归集金额
|
|
502
|
-
const maxPayerSweep = payerBalance >
|
|
380
|
+
const maxPayerSweep = payerBalance > payerNeedGas + totalProfit ? payerBalance - payerNeedGas - totalProfit : 0n;
|
|
503
381
|
sweepAmounts[maxSweepIndex] = maxPayerSweep;
|
|
504
382
|
totalAmountBeforeProfit = sweepAmounts.reduce((sum, amt) => sum + amt, 0n);
|
|
505
383
|
}
|
|
@@ -512,9 +390,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
512
390
|
payerProfitNonce = nonces[1];
|
|
513
391
|
}
|
|
514
392
|
const walletsToSweep = wallets.filter((_, i) => sweepAmounts[i] > 0n && i !== maxSweepIndex);
|
|
515
|
-
const nonces = walletsToSweep.length > 0
|
|
516
|
-
? await nonceManager.getNextNoncesForWallets(walletsToSweep)
|
|
517
|
-
: [];
|
|
393
|
+
const nonces = walletsToSweep.length > 0 ? await nonceManager.getNextNoncesForWallets(walletsToSweep) : [];
|
|
518
394
|
let nonceIdx = 0;
|
|
519
395
|
const txPromises = wallets.map(async (w, i) => {
|
|
520
396
|
const toSend = sweepAmounts[i];
|
|
@@ -535,11 +411,11 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
535
411
|
gasPrice,
|
|
536
412
|
gasLimit: nativeGasLimit,
|
|
537
413
|
chainId: chainIdNum,
|
|
538
|
-
type: txType
|
|
414
|
+
type: txType,
|
|
539
415
|
});
|
|
540
416
|
return mainTx;
|
|
541
417
|
});
|
|
542
|
-
const allTxs = (await Promise.all(txPromises)).filter(tx => tx !== null);
|
|
418
|
+
const allTxs = (await Promise.all(txPromises)).filter((tx) => tx !== null);
|
|
543
419
|
signedTxs.push(...allTxs);
|
|
544
420
|
// ✅ 利润多跳转账(固定费用,原生代币)
|
|
545
421
|
if (extractProfit && totalProfit > 0n && maxSweepIndex >= 0 && payerProfitNonce !== undefined) {
|
|
@@ -553,7 +429,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
553
429
|
gasPrice,
|
|
554
430
|
chainId: chainIdNum,
|
|
555
431
|
txType,
|
|
556
|
-
startNonce: payerProfitNonce
|
|
432
|
+
startNonce: payerProfitNonce,
|
|
557
433
|
});
|
|
558
434
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
559
435
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -563,12 +439,12 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
563
439
|
// ERC20 归集
|
|
564
440
|
const [gasPrice, decimals, balances, nativeBalances] = await Promise.all([
|
|
565
441
|
getOptimizedGasPrice(provider, getGasPriceConfig(config)),
|
|
566
|
-
Promise.resolve(tokenDecimals ?? await getErc20Decimals(provider, tokenAddress)),
|
|
442
|
+
Promise.resolve(tokenDecimals ?? (await getErc20Decimals(provider, tokenAddress))),
|
|
567
443
|
batchGetBalances(provider, addresses, tokenAddress),
|
|
568
|
-
batchGetBalances(provider, addresses)
|
|
444
|
+
batchGetBalances(provider, addresses),
|
|
569
445
|
]);
|
|
570
446
|
const iface = new ethers.Interface(['function transfer(address,uint256) returns (bool)']);
|
|
571
|
-
const profitTxGas =
|
|
447
|
+
const profitTxGas = GAS_LIMITS.NATIVE_TRANSFER * gasPrice * BigInt(PROFIT_HOP_COUNT + 1);
|
|
572
448
|
const sweepAmounts = [];
|
|
573
449
|
let maxSweepIndex = -1;
|
|
574
450
|
let maxSweepAmount = 0n;
|
|
@@ -629,9 +505,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
629
505
|
payerProfitNonce = nonces[1];
|
|
630
506
|
}
|
|
631
507
|
const walletsToSweepErc20 = wallets.filter((_, i) => sweepAmounts[i] > 0n && i !== maxSweepIndex);
|
|
632
|
-
const noncesErc20 = walletsToSweepErc20.length > 0
|
|
633
|
-
? await nonceManager.getNextNoncesForWallets(walletsToSweepErc20)
|
|
634
|
-
: [];
|
|
508
|
+
const noncesErc20 = walletsToSweepErc20.length > 0 ? await nonceManager.getNextNoncesForWallets(walletsToSweepErc20) : [];
|
|
635
509
|
let nonceIdxErc20 = 0;
|
|
636
510
|
const txPromises = wallets.map(async (w, i) => {
|
|
637
511
|
const toSend = sweepAmounts[i];
|
|
@@ -654,11 +528,11 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
654
528
|
gasPrice,
|
|
655
529
|
gasLimit: finalGasLimit,
|
|
656
530
|
chainId: chainIdNum,
|
|
657
|
-
type: txType
|
|
531
|
+
type: txType,
|
|
658
532
|
});
|
|
659
533
|
return mainTx;
|
|
660
534
|
});
|
|
661
|
-
const allTxs = (await Promise.all(txPromises)).filter(tx => tx !== null);
|
|
535
|
+
const allTxs = (await Promise.all(txPromises)).filter((tx) => tx !== null);
|
|
662
536
|
signedTxs.push(...allTxs);
|
|
663
537
|
// ✅ 利润多跳转账(固定费用,原生代币)
|
|
664
538
|
if (extractProfit && totalProfit > 0n && maxSweepIndex >= 0 && payerProfitNonce !== undefined) {
|
|
@@ -672,7 +546,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
672
546
|
gasPrice,
|
|
673
547
|
chainId: chainIdNum,
|
|
674
548
|
txType,
|
|
675
|
-
startNonce: payerProfitNonce
|
|
549
|
+
startNonce: payerProfitNonce,
|
|
676
550
|
});
|
|
677
551
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
678
552
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -681,11 +555,10 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
681
555
|
}
|
|
682
556
|
else {
|
|
683
557
|
// ========== 有多跳:构建跳转链归集 ==========
|
|
684
|
-
const sourceWallets = actualKeys.map(pk => new Wallet(pk, provider));
|
|
558
|
+
const sourceWallets = actualKeys.map((pk) => new Wallet(pk, provider));
|
|
685
559
|
// ✅ 按地址数量收取固定费用(原生代币)
|
|
686
560
|
if (extractProfit) {
|
|
687
561
|
totalProfit = calculateTransferFee(chainIdNum, sourceWallets.length);
|
|
688
|
-
console.log(`[flap sweep hops] 利润按地址数量收取: ${ethers.formatEther(totalProfit)} 原生币 (${sourceWallets.length} 地址)`);
|
|
689
562
|
}
|
|
690
563
|
const withHopIndexes = [];
|
|
691
564
|
const withoutHopIndexes = [];
|
|
@@ -697,12 +570,14 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
697
570
|
withoutHopIndexes.push(i);
|
|
698
571
|
}
|
|
699
572
|
}
|
|
700
|
-
const sourceAddresses = sourceWallets.map(w => w.address);
|
|
573
|
+
const sourceAddresses = sourceWallets.map((w) => w.address);
|
|
701
574
|
const [gasPrice, decimals, balances, nativeBalances] = await Promise.all([
|
|
702
575
|
getOptimizedGasPrice(provider, getGasPriceConfig(config)),
|
|
703
|
-
isNative
|
|
576
|
+
isNative
|
|
577
|
+
? Promise.resolve(18)
|
|
578
|
+
: Promise.resolve(tokenDecimals ?? (await getErc20Decimals(provider, tokenAddress))),
|
|
704
579
|
batchGetBalances(provider, sourceAddresses, tokenAddress),
|
|
705
|
-
isNative ? Promise.resolve([]) : batchGetBalances(provider, sourceAddresses)
|
|
580
|
+
isNative ? Promise.resolve([]) : batchGetBalances(provider, sourceAddresses),
|
|
706
581
|
]);
|
|
707
582
|
const iface = isNative ? null : new ethers.Interface(['function transfer(address,uint256) returns (bool)']);
|
|
708
583
|
const gasFeePerHop = finalGasLimit * gasPrice;
|
|
@@ -731,7 +606,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
731
606
|
})();
|
|
732
607
|
if (ratioForI !== undefined) {
|
|
733
608
|
const want = (bal * BigInt(ratioForI)) / 100n;
|
|
734
|
-
const maxSendable = bal > gasCost ?
|
|
609
|
+
const maxSendable = bal > gasCost ? bal - gasCost : 0n;
|
|
735
610
|
toSend = want > maxSendable ? maxSendable : want;
|
|
736
611
|
}
|
|
737
612
|
else if (amountStrForI && amountStrForI.trim().length > 0) {
|
|
@@ -751,7 +626,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
751
626
|
gasPrice,
|
|
752
627
|
gasLimit: nativeGasLimit,
|
|
753
628
|
chainId: chainIdNum,
|
|
754
|
-
type: txType
|
|
629
|
+
type: txType,
|
|
755
630
|
});
|
|
756
631
|
signedTxs.push(tx);
|
|
757
632
|
}
|
|
@@ -790,7 +665,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
790
665
|
gasPrice,
|
|
791
666
|
gasLimit: finalGasLimit,
|
|
792
667
|
chainId: chainIdNum,
|
|
793
|
-
type: txType
|
|
668
|
+
type: txType,
|
|
794
669
|
});
|
|
795
670
|
signedTxs.push(tx);
|
|
796
671
|
}
|
|
@@ -820,7 +695,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
820
695
|
})();
|
|
821
696
|
if (ratioForI !== undefined) {
|
|
822
697
|
const want = (bal * BigInt(ratioForI)) / 100n;
|
|
823
|
-
const maxSendable = bal > totalGasCost ?
|
|
698
|
+
const maxSendable = bal > totalGasCost ? bal - totalGasCost : 0n;
|
|
824
699
|
toSend = want > maxSendable ? maxSendable : want;
|
|
825
700
|
}
|
|
826
701
|
else if (amountStrForI && amountStrForI.trim().length > 0) {
|
|
@@ -832,7 +707,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
832
707
|
}
|
|
833
708
|
else {
|
|
834
709
|
const nativeBal = nativeBalances[i];
|
|
835
|
-
const nativeNeeded =
|
|
710
|
+
const nativeNeeded = gasFeePerHop * BigInt(hopChain.length) + finalGasLimit * gasPrice;
|
|
836
711
|
if (nativeBal < nativeNeeded && skipIfInsufficient)
|
|
837
712
|
continue;
|
|
838
713
|
const ratioForI = (() => {
|
|
@@ -863,8 +738,11 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
863
738
|
sweepAmounts[i] = toSend;
|
|
864
739
|
totalAmountBeforeProfit += toSend;
|
|
865
740
|
// ✅ 支持 string 和 GeneratedWallet 两种类型
|
|
866
|
-
const fullChain = [
|
|
867
|
-
|
|
741
|
+
const fullChain = [
|
|
742
|
+
sourceWallet,
|
|
743
|
+
...hopChain.map((w) => new Wallet(typeof w === 'string' ? w : w.privateKey, provider)),
|
|
744
|
+
];
|
|
745
|
+
const addresses = [...fullChain.map((w) => w.address), target];
|
|
868
746
|
if (!isNative) {
|
|
869
747
|
const gasNonces = await nonceManager.getNextNonceBatch(sourceWallet, hopChain.length);
|
|
870
748
|
for (let j = 0; j < hopChain.length; j++) {
|
|
@@ -875,7 +753,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
875
753
|
gasPrice,
|
|
876
754
|
gasLimit: nativeGasLimit,
|
|
877
755
|
chainId: chainIdNum,
|
|
878
|
-
type: txType
|
|
756
|
+
type: txType,
|
|
879
757
|
});
|
|
880
758
|
signedTxs.push(tx);
|
|
881
759
|
}
|
|
@@ -883,9 +761,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
883
761
|
for (let j = 0; j < addresses.length - 1; j++) {
|
|
884
762
|
const fromWallet = fullChain[j];
|
|
885
763
|
const toAddress = addresses[j + 1];
|
|
886
|
-
const nonce = j === 0
|
|
887
|
-
? await nonceManager.getNextNonce(sourceWallet)
|
|
888
|
-
: 0;
|
|
764
|
+
const nonce = j === 0 ? await nonceManager.getNextNonce(sourceWallet) : 0;
|
|
889
765
|
if (isNative) {
|
|
890
766
|
const remainingHops = addresses.length - 2 - j;
|
|
891
767
|
const additionalGas = gasFeePerHop * BigInt(remainingHops);
|
|
@@ -897,7 +773,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
897
773
|
gasPrice,
|
|
898
774
|
gasLimit: finalGasLimit,
|
|
899
775
|
chainId: chainIdNum,
|
|
900
|
-
type: txType
|
|
776
|
+
type: txType,
|
|
901
777
|
});
|
|
902
778
|
signedTxs.push(tx);
|
|
903
779
|
}
|
|
@@ -911,7 +787,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
911
787
|
gasPrice,
|
|
912
788
|
gasLimit: finalGasLimit,
|
|
913
789
|
chainId: chainIdNum,
|
|
914
|
-
type: txType
|
|
790
|
+
type: txType,
|
|
915
791
|
});
|
|
916
792
|
signedTxs.push(tx);
|
|
917
793
|
}
|
|
@@ -940,7 +816,7 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
940
816
|
gasPrice,
|
|
941
817
|
chainId: chainIdNum,
|
|
942
818
|
txType,
|
|
943
|
-
startNonce: profitNonce
|
|
819
|
+
startNonce: profitNonce,
|
|
944
820
|
});
|
|
945
821
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
946
822
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -951,13 +827,17 @@ export async function flapSweepWithBundleMerkle(params) {
|
|
|
951
827
|
signedTransactions: signedTxs,
|
|
952
828
|
hopWallets: preparedHops || undefined,
|
|
953
829
|
profitHopWallets, // ✅ 返回利润多跳钱包
|
|
954
|
-
metadata: extractProfit
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
830
|
+
metadata: extractProfit
|
|
831
|
+
? {
|
|
832
|
+
totalAmount: isNative
|
|
833
|
+
? ethers.formatEther(totalAmountBeforeProfit)
|
|
834
|
+
: ethers.formatUnits(totalAmountBeforeProfit, tokenDecimals ?? 18),
|
|
835
|
+
profitAmount: ethers.formatEther(totalProfit),
|
|
836
|
+
profitRecipient: profitAddr,
|
|
837
|
+
sourceCount: actualKeys.length,
|
|
838
|
+
isNative,
|
|
839
|
+
tokenAddress: isNative ? undefined : tokenAddress,
|
|
840
|
+
}
|
|
841
|
+
: undefined,
|
|
962
842
|
};
|
|
963
843
|
}
|