four-flap-meme-sdk 1.9.49 → 2.0.0
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/abis/common.js +74 -68
- package/dist/abis/flap/vault.js +9 -7
- package/dist/abis/index.d.ts +3 -4
- package/dist/abis/index.js +3 -4
- package/dist/bundle-core/__tests__/config-helpers.test.js +28 -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 +34 -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 -116
- package/dist/chains/bsc/four/config.d.ts +5 -70
- package/dist/chains/bsc/four/config.js +2 -115
- package/dist/chains/bsc/four/core.d.ts +1 -4
- package/dist/chains/bsc/four/core.js +1 -589
- package/dist/chains/bsc/four/disperse.d.ts +12 -0
- package/dist/chains/bsc/four/disperse.js +470 -0
- 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 -50
- package/dist/chains/bsc/four/internal.js +2 -237
- package/dist/chains/bsc/four/pairwise.d.ts +7 -0
- package/dist/chains/bsc/four/pairwise.js +308 -0
- package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
- package/dist/chains/bsc/four/pancake-proxy.js +1 -688
- 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 -746
- package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
- package/dist/chains/bsc/four/swap-buy-first.js +2 -506
- 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 -760
- package/dist/chains/bsc/four/sweep.d.ts +13 -0
- package/dist/chains/bsc/four/sweep.js +788 -0
- 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 -1534
- 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 -207
- 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 +111 -686
- 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.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 +54 -23
- package/dist/chains/eni/batch-router/utils.js +32 -6
- package/dist/chains/eni/bundler/sign.js +4 -4
- package/dist/chains/eni/bundler/submit.js +1 -4
- package/dist/chains/eni/constants.js +1 -1
- package/dist/chains/eni/index.d.ts +1 -1
- 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 +8 -4
- package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -43
- 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 -47
- 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.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.js +5 -13
- package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
- package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -20
- 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 -56
- package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
- package/dist/chains/xlayer/eip7702/bundle-sell.js +26 -74
- package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
- package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -68
- package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
- package/dist/chains/xlayer/eip7702/constants.js +3 -21
- package/dist/chains/xlayer/eip7702/index.d.ts +27 -46
- package/dist/chains/xlayer/eip7702/index.js +27 -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 +58 -291
- 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 +83 -158
- 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 +64 -276
- package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
- package/dist/chains/xlayer/eoa/eoa-wash-volume.js +14 -14
- 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-core.d.ts +363 -0
- package/dist/chains/xlayer/eoa/types-core.js +53 -0
- package/dist/chains/xlayer/eoa/types-create.d.ts +413 -0
- package/dist/chains/xlayer/eoa/types-create.js +9 -0
- package/dist/chains/xlayer/eoa/types-volume.d.ts +209 -0
- package/dist/chains/xlayer/eoa/types-volume.js +13 -0
- package/dist/chains/xlayer/eoa/types.d.ts +2 -2
- package/dist/chains/xlayer/eoa/types.js +1 -3
- package/dist/contracts/helper3.d.ts +20 -17
- 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 -117
- package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -70
- package/dist/contracts/tm-bundle-merkle/config.js +2 -115
- package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
- package/dist/contracts/tm-bundle-merkle/core.js +1 -588
- 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 -50
- package/dist/contracts/tm-bundle-merkle/internal.js +2 -236
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -687
- 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 -919
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -505
- 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 -757
- 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 +5 -6
- package/dist/contracts/tm-bundle-merkle/utils.js +5 -6
- package/dist/contracts/tm-bundle.d.ts +3 -51
- package/dist/contracts/tm-bundle.js +102 -142
- package/dist/contracts/tm.d.ts +3 -2
- package/dist/contracts/tm.js +36 -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 -652
- 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/flows/create.d.ts +2 -2
- 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 -91
- package/dist/index.js +20 -215
- 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 +41 -24
- package/dist/shared/clients/club48.js +30 -26
- package/dist/shared/clients/emitservice.js +2 -0
- package/dist/shared/clients/four.js +23 -18
- package/dist/shared/clients/index.d.ts +8 -0
- package/dist/shared/clients/index.js +8 -0
- package/dist/shared/clients/merkle.js +26 -30
- 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 +1 -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/__tests__/curve.test.js +3 -3
- package/dist/shared/flap/abi.js +1 -1
- package/dist/shared/flap/constants.d.ts +1 -1
- package/dist/shared/flap/constants.js +2 -2
- package/dist/shared/flap/curve.js +3 -0
- package/dist/shared/flap/errors.d.ts +1 -4
- package/dist/shared/flap/errors.js +21 -3
- package/dist/shared/flap/index.d.ts +2 -2
- package/dist/shared/flap/index.js +2 -2
- package/dist/shared/flap/meta.d.ts +16 -18
- package/dist/shared/flap/meta.js +14 -26
- package/dist/shared/flap/permit.js +6 -5
- package/dist/shared/flap/pinata.d.ts +9 -2
- package/dist/shared/flap/pinata.js +20 -18
- 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 +66 -156
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +81 -86
- 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 +73 -3
- package/dist/shared/flap/portal-bundle-merkle/utils-helpers.d.ts +100 -0
- package/dist/shared/flap/portal-bundle-merkle/utils-helpers.js +133 -0
- 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 +54 -42
- package/dist/shared/flap/portal.js +32 -10
- package/dist/shared/flap/vanity.js +4 -7
- package/dist/shared/flap/vault.d.ts +1 -1
- package/dist/shared/flap/vault.js +54 -48
- package/dist/shared/flap 2/__tests__/curve.test.d.ts +1 -0
- package/dist/shared/flap 2/portal-bundle-merkle/types.js +1 -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/gas/bundle-gas.d.ts +39 -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 +180 -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 +4 -0
- package/dist/shared/index.js +4 -0
- package/dist/types/distribute.d.ts +72 -0
- package/dist/types/distribute.js +1 -0
- package/dist/types 2/errors.d.ts +27 -0
- package/dist/types 2/errors.js +34 -0
- package/dist/utils/airdrop-sweep-types.d.ts +1 -0
- package/dist/utils/airdrop-sweep-types.js +1 -0
- package/dist/utils/airdrop-sweep.d.ts +4 -76
- package/dist/utils/airdrop-sweep.js +38 -52
- 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-types.d.ts +1 -0
- package/dist/utils/erc20-types.js +1 -0
- package/dist/utils/erc20.d.ts +8 -90
- package/dist/utils/erc20.js +94 -153
- package/dist/utils/errors.d.ts +10 -22
- package/dist/utils/errors.js +61 -79
- 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-types.d.ts +1 -0
- package/dist/utils/holders-maker-types.js +1 -0
- package/dist/utils/holders-maker.d.ts +2 -138
- package/dist/utils/holders-maker.js +23 -651
- 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-types.d.ts +1 -0
- package/dist/utils/lp-inspect-types.js +1 -0
- package/dist/utils/lp-inspect.d.ts +2 -112
- package/dist/utils/lp-inspect.js +63 -195
- package/dist/utils/mpcExclusive.d.ts +2 -5
- package/dist/utils/mpcExclusive.js +4 -3
- package/dist/utils/private-sale-types.d.ts +1 -0
- package/dist/utils/private-sale-types.js +1 -0
- package/dist/utils/private-sale.d.ts +2 -58
- package/dist/utils/private-sale.js +2 -7
- package/dist/utils/provider-factory.d.ts +4 -0
- package/dist/utils/provider-factory.js +10 -0
- package/dist/utils/quote-helpers-types.d.ts +1 -0
- package/dist/utils/quote-helpers-types.js +1 -0
- package/dist/utils/quote-helpers.d.ts +4 -45
- package/dist/utils/quote-helpers.js +15 -65
- package/dist/utils/stealth-transfer.d.ts +2 -28
- package/dist/utils/stealth-transfer.js +30 -14
- package/dist/utils/swap-helpers.d.ts +0 -3
- package/dist/utils/swap-helpers.js +6 -9
- 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 +9 -10
- package/package.json +55 -2
- 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 2/flap/__tests__/curve.test.d.ts → bundle-core/__tests__/config-helpers.test.d.ts} +0 -0
- /package/dist/{shared 2/flap/portal-bundle-merkle/types.js → bundle-core/__tests__/facade-parity.test.d.ts} +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/TaxToken.json +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/TokenManager.json +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/TokenManager2.json +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/TokenManagerHelper3.json +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/common.d.ts +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/common.js +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/index.d.ts +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/index.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/club48.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/club48.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/emitservice.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/emitservice.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/four.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/four.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/merkle.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/merkle.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/__tests__/curve.test.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/abi.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/abi.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/constants.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/constants.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/curve.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/curve.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/errors.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/errors.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/index.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/index.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/ipfs.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/ipfs.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/meta.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/meta.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/permit.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/permit.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/pinata.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/pinata.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/types.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/vanity.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/vanity.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/vault.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/vault.js +0 -0
- /package/dist/{shared 2/four → shared/four 2}/index.d.ts +0 -0
- /package/dist/{shared 2/four → shared/four 2}/index.js +0 -0
- /package/dist/{shared 2/four → shared/four 2}/tax-token.d.ts +0 -0
- /package/dist/{shared 2/four → shared/four 2}/tax-token.js +0 -0
- /package/dist/{shared 2/index.d.ts → shared/index 2.js} +0 -0
- /package/dist/{shared 2/index.js → shared/index.d 2.ts} +0 -0
|
@@ -1,127 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* 功能:钱包B先买入代币 → 钱包A卖出相同数量 → 原子执行
|
|
2
|
+
* bundle-buy-first - 主函数
|
|
5
3
|
*/
|
|
6
4
|
import { ethers, Contract, Wallet } from 'ethers';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
5
|
+
import { createSignProvider } from '../../../bundle-core/sign-context-helpers.js';
|
|
6
|
+
import { NonceManager, getDeadline, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../../utils/bundle-helpers.js';
|
|
7
|
+
import { BLOCKRAZOR_BUILDER_EOA, ZERO_ADDRESS } from '../../../shared/constants/index.js';
|
|
8
|
+
import { GAS_LIMITS, getProfitRecipient } from '../../../shared/constants/index.js';
|
|
10
9
|
import { quoteV2, quoteV3, getTokenToNativeQuote } from '../../../utils/quote-helpers.js';
|
|
11
|
-
import {
|
|
12
|
-
/**
|
|
13
|
-
* 获取 Gas Limit
|
|
14
|
-
*/
|
|
15
|
-
function getGasLimit(config, defaultGas = 800000) {
|
|
16
|
-
if (config.gasLimit !== undefined) {
|
|
17
|
-
return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
|
|
18
|
-
}
|
|
19
|
-
const multiplier = config.gasLimitMultiplier ?? 1.0;
|
|
20
|
-
const calculatedGas = Math.ceil(defaultGas * multiplier);
|
|
21
|
-
return BigInt(calculatedGas);
|
|
22
|
-
}
|
|
23
|
-
async function getGasPrice(provider, config) {
|
|
24
|
-
const feeData = await provider.getFeeData();
|
|
25
|
-
let gasPrice = feeData.gasPrice || ethers.parseUnits('3', 'gwei');
|
|
26
|
-
if (config.minGasPriceGwei) {
|
|
27
|
-
const minGas = ethers.parseUnits(config.minGasPriceGwei.toString(), 'gwei');
|
|
28
|
-
if (gasPrice < minGas)
|
|
29
|
-
gasPrice = minGas;
|
|
30
|
-
}
|
|
31
|
-
if (config.maxGasPriceGwei) {
|
|
32
|
-
const maxGas = ethers.parseUnits(config.maxGasPriceGwei.toString(), 'gwei');
|
|
33
|
-
if (gasPrice > maxGas)
|
|
34
|
-
gasPrice = maxGas;
|
|
35
|
-
}
|
|
36
|
-
return gasPrice;
|
|
37
|
-
}
|
|
38
|
-
// ✅ ABI 别名(从公共模块导入)
|
|
39
|
-
const PANCAKE_V2_ROUTER_ABI = V2_ROUTER_ABI;
|
|
40
|
-
const PANCAKE_V3_ROUTER_ABI = V3_ROUTER02_ABI;
|
|
41
|
-
const ERC20_BALANCE_OF_ABI = ERC20_BALANCE_ABI;
|
|
42
|
-
// ✅ 使用官方 PancakeSwap Router 地址
|
|
43
|
-
const PANCAKE_V2_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV2Router;
|
|
44
|
-
const PANCAKE_V3_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV3Router;
|
|
45
|
-
// 常量
|
|
46
|
-
const FLAT_FEE = 0n;
|
|
47
|
-
// ==================== 多笔买卖常量 ====================
|
|
48
|
-
/** 最大 Bundle 签名数 */
|
|
49
|
-
const MAX_BUNDLE_SIGNATURES = 50;
|
|
50
|
-
/** 贿赂交易数 */
|
|
51
|
-
const BRIBE_TX_COUNT = 1;
|
|
52
|
-
/** 利润中转交易数(支付者 1 笔 + 中转钱包 PROFIT_HOP_COUNT 笔 + 最终接收 1 笔) */
|
|
53
|
-
const PROFIT_TX_COUNT = PROFIT_HOP_COUNT + 2; // 2 + 2 = 4
|
|
54
|
-
/** 最大买卖交易数 */
|
|
55
|
-
const MAX_SWAP_TX_COUNT = MAX_BUNDLE_SIGNATURES - BRIBE_TX_COUNT - PROFIT_TX_COUNT; // 50 - 1 - 4 = 45
|
|
56
|
-
/**
|
|
57
|
-
* 根据 userType 获取每笔交易的利润率
|
|
58
|
-
*/
|
|
59
|
-
function getProfitRatePerTxBps(userType) {
|
|
60
|
-
if (userType === 'v1') {
|
|
61
|
-
return PROFIT_CONFIG.RATE_BPS_V1_DOUBLE;
|
|
62
|
-
}
|
|
63
|
-
return PROFIT_CONFIG.RATE_BPS_V0_DOUBLE; // v0 或默认
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* 验证买卖笔数
|
|
67
|
-
*/
|
|
68
|
-
function validateSwapCounts(buyCount, sellCount) {
|
|
69
|
-
if (buyCount < 1) {
|
|
70
|
-
throw new Error(`买入笔数必须至少为 1,当前为 ${buyCount}`);
|
|
71
|
-
}
|
|
72
|
-
if (sellCount < 1) {
|
|
73
|
-
throw new Error(`卖出笔数必须至少为 1,当前为 ${sellCount}`);
|
|
74
|
-
}
|
|
75
|
-
const totalSwaps = buyCount + sellCount;
|
|
76
|
-
if (totalSwaps > MAX_SWAP_TX_COUNT) {
|
|
77
|
-
throw new Error(`买卖笔数总和 (${totalSwaps}) 超出限制 (${MAX_SWAP_TX_COUNT}),` +
|
|
78
|
-
`最大签名数为 ${MAX_BUNDLE_SIGNATURES}(${BRIBE_TX_COUNT} 贿赂 + ${PROFIT_TX_COUNT} 利润 + ${MAX_SWAP_TX_COUNT} 买卖)`);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* ✅ 将金额随机拆分成多份(更自然,不像机器人)
|
|
83
|
-
* 每份金额在平均值的 50%-150% 之间随机浮动
|
|
84
|
-
*/
|
|
85
|
-
function splitAmount(totalAmount, count) {
|
|
86
|
-
if (count <= 0) {
|
|
87
|
-
throw new Error('拆分份数必须大于 0');
|
|
88
|
-
}
|
|
89
|
-
if (count === 1) {
|
|
90
|
-
return [totalAmount];
|
|
91
|
-
}
|
|
92
|
-
// 生成随机权重(0.5 - 1.5 之间)
|
|
93
|
-
const weights = [];
|
|
94
|
-
for (let i = 0; i < count; i++) {
|
|
95
|
-
// 随机值在 0.5 - 1.5 之间,使每份金额有 ±50% 的浮动
|
|
96
|
-
weights.push(0.5 + Math.random());
|
|
97
|
-
}
|
|
98
|
-
// 计算权重总和
|
|
99
|
-
const totalWeight = weights.reduce((a, b) => a + b, 0);
|
|
100
|
-
// 根据权重分配金额
|
|
101
|
-
const amounts = [];
|
|
102
|
-
let allocated = 0n;
|
|
103
|
-
for (let i = 0; i < count - 1; i++) {
|
|
104
|
-
// 按权重比例分配
|
|
105
|
-
const ratio = weights[i] / totalWeight;
|
|
106
|
-
const amount = BigInt(Math.floor(Number(totalAmount) * ratio));
|
|
107
|
-
amounts.push(amount);
|
|
108
|
-
allocated += amount;
|
|
109
|
-
}
|
|
110
|
-
// 最后一份分配剩余的全部(确保总和精确)
|
|
111
|
-
amounts.push(totalAmount - allocated);
|
|
112
|
-
// 随机打乱顺序(让大小金额交错出现)
|
|
113
|
-
for (let i = amounts.length - 1; i > 0; i--) {
|
|
114
|
-
const j = Math.floor(Math.random() * (i + 1));
|
|
115
|
-
[amounts[i], amounts[j]] = [amounts[j], amounts[i]];
|
|
116
|
-
}
|
|
117
|
-
return amounts;
|
|
118
|
-
}
|
|
10
|
+
import { ERC20_BALANCE_OF_ABI, FLAT_FEE, PANCAKE_V2_ROUTER_ABI, PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V3_ROUTER_ABI, PANCAKE_V3_ROUTER_ADDRESS, getGasLimit, getGasPrice, getProfitRatePerTxBps, splitAmount, validateSwapCounts, } from './bundle-buy-first-helpers.js';
|
|
119
11
|
export async function pancakeBundleBuyFirstMerkle(params) {
|
|
120
|
-
const { buyerPrivateKey, buyerPrivateKeys, sellerPrivateKey, sellerPrivateKeys,
|
|
12
|
+
const { buyerPrivateKey, buyerPrivateKeys, sellerPrivateKey, sellerPrivateKeys, routeParams, buyerFunds, buyerFundsPercentage, config, quoteToken, quoteTokenDecimals = 18, buyCount: _buyCount, sellCount: _sellCount, taxRateBps = 0, // ✅ 税率(基点),用于计算实际可卖出代币数量
|
|
121
13
|
} = params;
|
|
122
14
|
// ✅ 判断是否为多钱包模式
|
|
123
|
-
const isMultiWalletMode = !!(buyerPrivateKeys && buyerPrivateKeys.length > 0) ||
|
|
124
|
-
!!(sellerPrivateKeys && sellerPrivateKeys.length > 0);
|
|
15
|
+
const isMultiWalletMode = !!(buyerPrivateKeys && buyerPrivateKeys.length > 0) || !!(sellerPrivateKeys && sellerPrivateKeys.length > 0);
|
|
125
16
|
// ✅ 多钱包模式:buyCount/sellCount 代表钱包数量
|
|
126
17
|
// 单钱包模式(向后兼容):buyCount/sellCount 代表同一钱包执行的交易笔数
|
|
127
18
|
const buyCount = _buyCount ?? 1;
|
|
@@ -131,13 +22,12 @@ export async function pancakeBundleBuyFirstMerkle(params) {
|
|
|
131
22
|
return await pancakeBundleBuyFirstMultiWallet({
|
|
132
23
|
buyerPrivateKeys: buyerPrivateKeys || (buyerPrivateKey ? [buyerPrivateKey] : []),
|
|
133
24
|
sellerPrivateKeys: sellerPrivateKeys || (sellerPrivateKey ? [sellerPrivateKey] : []),
|
|
134
|
-
tokenAddress,
|
|
135
25
|
routeParams,
|
|
136
26
|
buyerFunds,
|
|
137
27
|
config,
|
|
138
28
|
quoteToken,
|
|
139
29
|
quoteTokenDecimals,
|
|
140
|
-
taxRateBps // ✅ 传递税率
|
|
30
|
+
taxRateBps, // ✅ 传递税率
|
|
141
31
|
});
|
|
142
32
|
}
|
|
143
33
|
// ✅ 单钱包模式(向后兼容):验证买卖笔数
|
|
@@ -162,13 +52,13 @@ export async function pancakeBundleBuyFirstMerkle(params) {
|
|
|
162
52
|
useNativeToken,
|
|
163
53
|
quoteToken,
|
|
164
54
|
quoteTokenDecimals,
|
|
165
|
-
provider: context.provider
|
|
55
|
+
provider: context.provider,
|
|
166
56
|
});
|
|
167
57
|
const quoteResult = await quoteTokenOutput({
|
|
168
58
|
routeParams,
|
|
169
59
|
buyerFundsWei: buyerFundsInfo.buyerFundsWei,
|
|
170
60
|
provider: context.provider,
|
|
171
|
-
v2RouterOverride: config.v2RouterAddress
|
|
61
|
+
v2RouterOverride: config.v2RouterAddress,
|
|
172
62
|
});
|
|
173
63
|
// ✅ 拆分买入和卖出金额
|
|
174
64
|
const buyAmountsWei = splitAmount(buyerFundsInfo.buyerFundsWei, buyCount);
|
|
@@ -187,9 +77,8 @@ export async function pancakeBundleBuyFirstMerkle(params) {
|
|
|
187
77
|
sellAmountsWei,
|
|
188
78
|
buyer,
|
|
189
79
|
seller,
|
|
190
|
-
tokenAddress,
|
|
191
80
|
useNativeToken,
|
|
192
|
-
v2RouterAddress: config.v2RouterAddress
|
|
81
|
+
v2RouterAddress: config.v2RouterAddress,
|
|
193
82
|
});
|
|
194
83
|
const finalGasLimit = getGasLimit(config);
|
|
195
84
|
const gasPrice = await getGasPrice(context.provider, config);
|
|
@@ -208,9 +97,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
|
|
|
208
97
|
// ERC20→BNB 转换完成
|
|
209
98
|
}
|
|
210
99
|
// ✅ 获取贿赂金额
|
|
211
|
-
const bribeAmount = config.bribeAmount && config.bribeAmount > 0
|
|
212
|
-
? ethers.parseEther(String(config.bribeAmount))
|
|
213
|
-
: 0n;
|
|
100
|
+
const bribeAmount = config.bribeAmount && config.bribeAmount > 0 ? ethers.parseEther(String(config.bribeAmount)) : 0n;
|
|
214
101
|
const needBribeTx = bribeAmount > 0n;
|
|
215
102
|
// ✅ 规划多笔交易 nonce(忽略 startNonces,使用新的多笔规划)
|
|
216
103
|
const multiNoncePlan = await planMultiNonces({
|
|
@@ -221,7 +108,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
|
|
|
221
108
|
sameAddress,
|
|
222
109
|
extractProfit: profitAmount > 0n,
|
|
223
110
|
needBribeTx,
|
|
224
|
-
nonceManager
|
|
111
|
+
nonceManager,
|
|
225
112
|
});
|
|
226
113
|
// ✅ 贿赂交易放在首位(由卖方发送,与利润交易同一钱包)
|
|
227
114
|
let bribeTx = null;
|
|
@@ -233,7 +120,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
|
|
|
233
120
|
gasPrice,
|
|
234
121
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
235
122
|
chainId: context.chainId,
|
|
236
|
-
type: txType
|
|
123
|
+
type: txType,
|
|
237
124
|
});
|
|
238
125
|
}
|
|
239
126
|
// ✅ 并行签名所有买入交易
|
|
@@ -244,7 +131,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
|
|
|
244
131
|
gasLimit: finalGasLimit,
|
|
245
132
|
gasPrice,
|
|
246
133
|
chainId: context.chainId,
|
|
247
|
-
type: txType
|
|
134
|
+
type: txType,
|
|
248
135
|
})));
|
|
249
136
|
// ✅ 并行签名所有卖出交易
|
|
250
137
|
const signedSells = await Promise.all(swapUnsignedArray.sellUnsignedArray.map((unsigned, i) => seller.signTransaction({
|
|
@@ -254,7 +141,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
|
|
|
254
141
|
gasLimit: finalGasLimit,
|
|
255
142
|
gasPrice,
|
|
256
143
|
chainId: context.chainId,
|
|
257
|
-
type: txType
|
|
144
|
+
type: txType,
|
|
258
145
|
})));
|
|
259
146
|
nonceManager.clearTemp();
|
|
260
147
|
validateFinalBalances({
|
|
@@ -267,7 +154,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
|
|
|
267
154
|
useNativeToken,
|
|
268
155
|
quoteTokenDecimals,
|
|
269
156
|
provider: context.provider,
|
|
270
|
-
buyerAddress: buyer.address
|
|
157
|
+
buyerAddress: buyer.address,
|
|
271
158
|
});
|
|
272
159
|
// ✅ 组装顺序:贿赂 → 买入(多笔) → 卖出(多笔)(与 Flap 一致)
|
|
273
160
|
const allTransactions = [];
|
|
@@ -282,7 +169,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
|
|
|
282
169
|
profitNonce: multiNoncePlan.profitNonce,
|
|
283
170
|
gasPrice,
|
|
284
171
|
chainId: context.chainId,
|
|
285
|
-
txType
|
|
172
|
+
txType,
|
|
286
173
|
});
|
|
287
174
|
let profitHopWallets;
|
|
288
175
|
if (profitResult) {
|
|
@@ -304,22 +191,17 @@ export async function pancakeBundleBuyFirstMerkle(params) {
|
|
|
304
191
|
buyCount,
|
|
305
192
|
sellCount,
|
|
306
193
|
// ✅ 返回每笔交易的具体金额(随机分配后的数组)
|
|
307
|
-
buyAmounts: buyAmountsWei.map(amt => useNativeToken
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
sellAmounts: sellAmountsWei.map(amt => amt.toString())
|
|
311
|
-
}
|
|
194
|
+
buyAmounts: buyAmountsWei.map((amt) => useNativeToken ? ethers.formatEther(amt) : ethers.formatUnits(amt, quoteTokenDecimals)),
|
|
195
|
+
sellAmounts: sellAmountsWei.map((amt) => amt.toString()),
|
|
196
|
+
},
|
|
312
197
|
};
|
|
313
198
|
}
|
|
314
199
|
function createPancakeContext(config) {
|
|
315
200
|
const chainId = config.chainId ?? 56;
|
|
316
|
-
const provider =
|
|
317
|
-
chainId,
|
|
318
|
-
name: 'BSC'
|
|
319
|
-
});
|
|
201
|
+
const provider = createSignProvider(config.rpcUrl, chainId, 'BSC');
|
|
320
202
|
return { chainId, provider };
|
|
321
203
|
}
|
|
322
|
-
async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, reserveGas, useNativeToken = true, quoteToken, quoteTokenDecimals = 18, provider }) {
|
|
204
|
+
async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, reserveGas, useNativeToken = true, quoteToken, quoteTokenDecimals = 18, provider, }) {
|
|
323
205
|
const reserveGasWei = ethers.parseEther((reserveGas ?? 0.0005).toString());
|
|
324
206
|
// ✅ 根据是否使用原生代币获取不同的余额
|
|
325
207
|
let buyerBalance;
|
|
@@ -342,7 +224,9 @@ async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, re
|
|
|
342
224
|
const pct = Math.max(0, Math.min(100, buyerFundsPercentage));
|
|
343
225
|
// ✅ 原生代币需要预留 Gas,ERC20 不需要
|
|
344
226
|
const spendable = useNativeToken
|
|
345
|
-
?
|
|
227
|
+
? buyerBalance > reserveGasWei
|
|
228
|
+
? buyerBalance - reserveGasWei
|
|
229
|
+
: 0n
|
|
346
230
|
: buyerBalance;
|
|
347
231
|
buyerFundsWei = (spendable * BigInt(Math.floor(pct * 100))) / 10000n;
|
|
348
232
|
}
|
|
@@ -374,7 +258,7 @@ async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, re
|
|
|
374
258
|
/**
|
|
375
259
|
* ✅ 使用 quote-helpers 统一报价
|
|
376
260
|
*/
|
|
377
|
-
async function quoteTokenOutput({ routeParams, buyerFundsWei, provider, v2RouterOverride }) {
|
|
261
|
+
async function quoteTokenOutput({ routeParams, buyerFundsWei, provider, v2RouterOverride, }) {
|
|
378
262
|
// V2 路由
|
|
379
263
|
if (routeParams.routeType === 'v2') {
|
|
380
264
|
const { v2Path } = routeParams;
|
|
@@ -411,7 +295,7 @@ async function quoteTokenOutput({ routeParams, buyerFundsWei, provider, v2Router
|
|
|
411
295
|
/**
|
|
412
296
|
* ✅ 构建多笔买入和卖出交易
|
|
413
297
|
*/
|
|
414
|
-
async function buildMultiRouteTransactions({ routeParams, buyAmountsWei, sellAmountsWei, buyer, seller, useNativeToken = true, v2RouterAddress }) {
|
|
298
|
+
async function buildMultiRouteTransactions({ routeParams, buyAmountsWei, sellAmountsWei, buyer, seller, useNativeToken = true, v2RouterAddress, }) {
|
|
415
299
|
const deadline = getDeadline();
|
|
416
300
|
if (routeParams.routeType === 'v2') {
|
|
417
301
|
const { v2Path } = routeParams;
|
|
@@ -422,17 +306,17 @@ async function buildMultiRouteTransactions({ routeParams, buyAmountsWei, sellAmo
|
|
|
422
306
|
// ✅ 根据是否使用原生代币选择不同的函数
|
|
423
307
|
if (useNativeToken) {
|
|
424
308
|
// BNB 池子:使用 swapExactETHForTokens / swapExactTokensForETH
|
|
425
|
-
const buyUnsignedArray = await Promise.all(buyAmountsWei.map(amount => {
|
|
309
|
+
const buyUnsignedArray = await Promise.all(buyAmountsWei.map((amount) => {
|
|
426
310
|
const buyValue = amount + FLAT_FEE;
|
|
427
311
|
return v2RouterBuyer.swapExactETHForTokensSupportingFeeOnTransferTokens.populateTransaction(0n, v2Path, buyer.address, deadline, { value: buyValue });
|
|
428
312
|
}));
|
|
429
|
-
const sellUnsignedArray = await Promise.all(sellAmountsWei.map(amount => v2RouterSeller.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(amount, 0n, reversePath, seller.address, deadline)));
|
|
313
|
+
const sellUnsignedArray = await Promise.all(sellAmountsWei.map((amount) => v2RouterSeller.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(amount, 0n, reversePath, seller.address, deadline)));
|
|
430
314
|
return { buyUnsignedArray, sellUnsignedArray };
|
|
431
315
|
}
|
|
432
316
|
else {
|
|
433
317
|
// ✅ ERC20 池子(如 USDT):使用 swapExactTokensForTokens
|
|
434
|
-
const buyUnsignedArray = await Promise.all(buyAmountsWei.map(amount => v2RouterBuyer.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(amount, 0n, v2Path, buyer.address, deadline)));
|
|
435
|
-
const sellUnsignedArray = await Promise.all(sellAmountsWei.map(amount => v2RouterSeller.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(amount, 0n, reversePath, seller.address, deadline)));
|
|
318
|
+
const buyUnsignedArray = await Promise.all(buyAmountsWei.map((amount) => v2RouterBuyer.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(amount, 0n, v2Path, buyer.address, deadline)));
|
|
319
|
+
const sellUnsignedArray = await Promise.all(sellAmountsWei.map((amount) => v2RouterSeller.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(amount, 0n, reversePath, seller.address, deadline)));
|
|
436
320
|
return { buyUnsignedArray, sellUnsignedArray };
|
|
437
321
|
}
|
|
438
322
|
}
|
|
@@ -442,32 +326,36 @@ async function buildMultiRouteTransactions({ routeParams, buyAmountsWei, sellAmo
|
|
|
442
326
|
const v3RouterBuyer = new Contract(PANCAKE_V3_ROUTER_ADDRESS, PANCAKE_V3_ROUTER_ABI, buyer);
|
|
443
327
|
const v3RouterSeller = new Contract(PANCAKE_V3_ROUTER_ADDRESS, PANCAKE_V3_ROUTER_ABI, seller);
|
|
444
328
|
// 构建多笔买入交易(ERC20 模式 value = 0,因为通过代币授权支付)
|
|
445
|
-
const buyUnsignedArray = await Promise.all(buyAmountsWei.map(amount => {
|
|
329
|
+
const buyUnsignedArray = await Promise.all(buyAmountsWei.map((amount) => {
|
|
446
330
|
const buyValue = useNativeToken ? amount + FLAT_FEE : 0n;
|
|
447
|
-
const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
331
|
+
const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
332
|
+
{
|
|
448
333
|
tokenIn: v3TokenIn,
|
|
449
334
|
tokenOut: v3TokenOut,
|
|
450
335
|
fee: v3Fee,
|
|
451
336
|
recipient: buyer.address,
|
|
452
337
|
amountIn: amount,
|
|
453
338
|
amountOutMinimum: 0n,
|
|
454
|
-
sqrtPriceLimitX96: 0n
|
|
455
|
-
}
|
|
339
|
+
sqrtPriceLimitX96: 0n,
|
|
340
|
+
},
|
|
341
|
+
]);
|
|
456
342
|
return v3RouterBuyer.multicall.populateTransaction(deadline, [buySwapData], { value: buyValue });
|
|
457
343
|
}));
|
|
458
344
|
// ✅ 根据是否使用原生代币构建不同的卖出交易
|
|
459
345
|
if (useNativeToken) {
|
|
460
346
|
// BNB 池子:卖出后 unwrap WBNB 为 BNB
|
|
461
|
-
const sellUnsignedArray = await Promise.all(sellAmountsWei.map(amount => {
|
|
462
|
-
const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
347
|
+
const sellUnsignedArray = await Promise.all(sellAmountsWei.map((amount) => {
|
|
348
|
+
const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
349
|
+
{
|
|
463
350
|
tokenIn: v3TokenOut,
|
|
464
351
|
tokenOut: v3TokenIn,
|
|
465
352
|
fee: v3Fee,
|
|
466
353
|
recipient: PANCAKE_V3_ROUTER_ADDRESS,
|
|
467
354
|
amountIn: amount,
|
|
468
355
|
amountOutMinimum: 0n,
|
|
469
|
-
sqrtPriceLimitX96: 0n
|
|
470
|
-
}
|
|
356
|
+
sqrtPriceLimitX96: 0n,
|
|
357
|
+
},
|
|
358
|
+
]);
|
|
471
359
|
const sellUnwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
|
|
472
360
|
return v3RouterSeller.multicall.populateTransaction(deadline, [sellSwapData, sellUnwrapData]);
|
|
473
361
|
}));
|
|
@@ -475,16 +363,18 @@ async function buildMultiRouteTransactions({ routeParams, buyAmountsWei, sellAmo
|
|
|
475
363
|
}
|
|
476
364
|
else {
|
|
477
365
|
// ✅ ERC20 池子:卖出后直接获得 ERC20
|
|
478
|
-
const sellUnsignedArray = await Promise.all(sellAmountsWei.map(amount => {
|
|
479
|
-
const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
366
|
+
const sellUnsignedArray = await Promise.all(sellAmountsWei.map((amount) => {
|
|
367
|
+
const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
368
|
+
{
|
|
480
369
|
tokenIn: v3TokenOut,
|
|
481
370
|
tokenOut: v3TokenIn,
|
|
482
371
|
fee: v3Fee,
|
|
483
372
|
recipient: seller.address, // 直接发送到卖方地址
|
|
484
373
|
amountIn: amount,
|
|
485
374
|
amountOutMinimum: 0n,
|
|
486
|
-
sqrtPriceLimitX96: 0n
|
|
487
|
-
}
|
|
375
|
+
sqrtPriceLimitX96: 0n,
|
|
376
|
+
},
|
|
377
|
+
]);
|
|
488
378
|
return v3RouterSeller.multicall.populateTransaction(deadline, [sellSwapData]);
|
|
489
379
|
}));
|
|
490
380
|
return { buyUnsignedArray, sellUnsignedArray };
|
|
@@ -496,7 +386,7 @@ async function buildMultiRouteTransactions({ routeParams, buyAmountsWei, sellAmo
|
|
|
496
386
|
* ✅ 规划多笔交易 nonce(与 Flap 一致)
|
|
497
387
|
* 交易顺序:贿赂 → 买入(多笔) → 卖出(多笔) → 利润
|
|
498
388
|
*/
|
|
499
|
-
async function planMultiNonces({ buyer, seller, buyCount, sellCount, sameAddress, extractProfit, needBribeTx, nonceManager }) {
|
|
389
|
+
async function planMultiNonces({ buyer, seller, buyCount, sellCount, sameAddress, extractProfit, needBribeTx, nonceManager, }) {
|
|
500
390
|
const profitNonceCount = extractProfit ? 1 : 0;
|
|
501
391
|
if (sameAddress) {
|
|
502
392
|
// 同一地址:贿赂(可选) + 买入(多笔) + 卖出(多笔) + 利润(可选)
|
|
@@ -508,8 +398,7 @@ async function planMultiNonces({ buyer, seller, buyCount, sellCount, sameAddress
|
|
|
508
398
|
const buyerNonces = nonces.slice(idx, idx + buyCount);
|
|
509
399
|
idx += buyCount;
|
|
510
400
|
const sellerNonces = nonces.slice(idx, idx + sellCount);
|
|
511
|
-
idx
|
|
512
|
-
const profitNonce = extractProfit ? nonces[idx] : undefined;
|
|
401
|
+
const profitNonce = extractProfit ? nonces[idx + sellCount] : undefined;
|
|
513
402
|
return { buyerNonces, sellerNonces, bribeNonce, profitNonce };
|
|
514
403
|
}
|
|
515
404
|
// 不同地址
|
|
@@ -519,19 +408,18 @@ async function planMultiNonces({ buyer, seller, buyCount, sellCount, sameAddress
|
|
|
519
408
|
const sellerTxCount = bribeTxCount + sellCount + profitNonceCount;
|
|
520
409
|
const [buyerNonces, sellerNoncesAll] = await Promise.all([
|
|
521
410
|
nonceManager.getNextNonceBatch(buyer, buyCount),
|
|
522
|
-
nonceManager.getNextNonceBatch(seller, sellerTxCount)
|
|
411
|
+
nonceManager.getNextNonceBatch(seller, sellerTxCount),
|
|
523
412
|
]);
|
|
524
413
|
let idx = 0;
|
|
525
414
|
const bribeNonce = needBribeTx ? sellerNoncesAll[idx++] : undefined;
|
|
526
415
|
const sellerNonces = sellerNoncesAll.slice(idx, idx + sellCount);
|
|
527
|
-
idx
|
|
528
|
-
const profitNonce = extractProfit ? sellerNoncesAll[idx] : undefined;
|
|
416
|
+
const profitNonce = extractProfit ? sellerNoncesAll[idx + sellCount] : undefined;
|
|
529
417
|
return { buyerNonces, sellerNonces, bribeNonce, profitNonce };
|
|
530
418
|
}
|
|
531
419
|
/**
|
|
532
420
|
* 构建利润多跳转账交易(强制 2 跳中转)
|
|
533
421
|
*/
|
|
534
|
-
async function buildProfitTransaction({ provider, seller, profitAmount, profitNonce, gasPrice, chainId, txType }) {
|
|
422
|
+
async function buildProfitTransaction({ provider, seller, profitAmount, profitNonce, gasPrice, chainId, txType, }) {
|
|
535
423
|
if (profitNonce === undefined || profitAmount === 0n) {
|
|
536
424
|
return null;
|
|
537
425
|
}
|
|
@@ -539,16 +427,16 @@ async function buildProfitTransaction({ provider, seller, profitAmount, profitNo
|
|
|
539
427
|
provider,
|
|
540
428
|
payerWallet: seller,
|
|
541
429
|
profitAmount,
|
|
542
|
-
profitRecipient:
|
|
430
|
+
profitRecipient: getProfitRecipient(),
|
|
543
431
|
hopCount: PROFIT_HOP_COUNT,
|
|
544
432
|
gasPrice,
|
|
545
433
|
chainId,
|
|
546
434
|
txType,
|
|
547
|
-
startNonce: profitNonce
|
|
435
|
+
startNonce: profitNonce,
|
|
548
436
|
});
|
|
549
437
|
return { signedTransactions: profitHopResult.signedTransactions, hopWallets: profitHopResult.hopWallets };
|
|
550
438
|
}
|
|
551
|
-
async function validateFinalBalances({ sameAddress, buyerFundsWei, buyerBalance, reserveGas, gasLimit, gasPrice, useNativeToken = true, quoteTokenDecimals = 18, provider, buyerAddress }) {
|
|
439
|
+
async function validateFinalBalances({ sameAddress, buyerFundsWei, buyerBalance, reserveGas, gasLimit, gasPrice, useNativeToken = true, quoteTokenDecimals = 18, provider, buyerAddress, }) {
|
|
552
440
|
const gasCost = gasLimit * gasPrice;
|
|
553
441
|
if (sameAddress) {
|
|
554
442
|
// 同一地址:需要足够的余额支付两笔交易
|
|
@@ -592,7 +480,7 @@ async function validateFinalBalances({ sameAddress, buyerFundsWei, buyerBalance,
|
|
|
592
480
|
* - ✅ 优化:最大化并行操作
|
|
593
481
|
*/
|
|
594
482
|
async function pancakeBundleBuyFirstMultiWallet(params) {
|
|
595
|
-
const { buyerPrivateKeys, sellerPrivateKeys, routeParams, buyerFunds, config, quoteToken, quoteTokenDecimals = 18, taxRateBps = 0 // ✅ 税率(基点)
|
|
483
|
+
const { buyerPrivateKeys, sellerPrivateKeys, routeParams, buyerFunds, config, quoteToken, quoteTokenDecimals = 18, taxRateBps = 0, // ✅ 税率(基点)
|
|
596
484
|
} = params;
|
|
597
485
|
const buyCount = buyerPrivateKeys.length;
|
|
598
486
|
const sellCount = sellerPrivateKeys.length;
|
|
@@ -610,8 +498,8 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
|
|
|
610
498
|
const context = createPancakeContext(config);
|
|
611
499
|
const nonceManager = new NonceManager(context.provider);
|
|
612
500
|
// 创建所有钱包实例
|
|
613
|
-
const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, context.provider));
|
|
614
|
-
const sellers = sellerPrivateKeys.map(pk => new Wallet(pk, context.provider));
|
|
501
|
+
const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, context.provider));
|
|
502
|
+
const sellers = sellerPrivateKeys.map((pk) => new Wallet(pk, context.provider));
|
|
615
503
|
// 使用第一个卖方作为主卖方(支付贿赂和利润)
|
|
616
504
|
const mainSeller = sellers[0];
|
|
617
505
|
// ✅ 计算总交易金额
|
|
@@ -630,16 +518,14 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
|
|
|
630
518
|
const finalGasLimit = getGasLimit(config);
|
|
631
519
|
const txType = config.txType ?? 0;
|
|
632
520
|
const deadline = BigInt(getDeadline());
|
|
633
|
-
const bribeAmount = config.bribeAmount && config.bribeAmount > 0
|
|
634
|
-
? ethers.parseEther(String(config.bribeAmount))
|
|
635
|
-
: 0n;
|
|
521
|
+
const bribeAmount = config.bribeAmount && config.bribeAmount > 0 ? ethers.parseEther(String(config.bribeAmount)) : 0n;
|
|
636
522
|
const needBribeTx = bribeAmount > 0n;
|
|
637
523
|
// ✅ 第一批并行:报价 + Gas价格 + 所有钱包 nonces
|
|
638
524
|
// 预先计算所有唯一钱包地址(去重)
|
|
639
525
|
const allWallets = [...sellers, ...buyers];
|
|
640
526
|
const uniqueWallets = allWallets.filter((w, i) => {
|
|
641
527
|
const addr = w.address.toLowerCase();
|
|
642
|
-
const firstIdx = allWallets.findIndex(x => x.address.toLowerCase() === addr);
|
|
528
|
+
const firstIdx = allWallets.findIndex((x) => x.address.toLowerCase() === addr);
|
|
643
529
|
return firstIdx === i;
|
|
644
530
|
});
|
|
645
531
|
const [quoteResult, gasPrice, noncesArray] = await Promise.all([
|
|
@@ -647,10 +533,10 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
|
|
|
647
533
|
routeParams,
|
|
648
534
|
buyerFundsWei: totalFundsWei,
|
|
649
535
|
provider: context.provider,
|
|
650
|
-
v2RouterOverride: config.v2RouterAddress
|
|
536
|
+
v2RouterOverride: config.v2RouterAddress,
|
|
651
537
|
}),
|
|
652
538
|
getGasPrice(context.provider, config),
|
|
653
|
-
nonceManager.getNextNoncesForWallets(uniqueWallets)
|
|
539
|
+
nonceManager.getNextNoncesForWallets(uniqueWallets),
|
|
654
540
|
]);
|
|
655
541
|
// 构建 nonces Map
|
|
656
542
|
const noncesMap = new Map();
|
|
@@ -692,19 +578,19 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
|
|
|
692
578
|
gasPrice,
|
|
693
579
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
694
580
|
chainId: context.chainId,
|
|
695
|
-
type: txType
|
|
581
|
+
type: txType,
|
|
696
582
|
});
|
|
697
583
|
}
|
|
698
584
|
// 2. 预分配所有 nonces(同步操作,避免竞态)
|
|
699
585
|
const buyerNonces = [];
|
|
700
586
|
const sellerNonces = [];
|
|
701
|
-
buyers.forEach(buyer => {
|
|
587
|
+
buyers.forEach((buyer) => {
|
|
702
588
|
const addr = buyer.address.toLowerCase();
|
|
703
589
|
const nonce = noncesMap.get(addr);
|
|
704
590
|
buyerNonces.push(nonce);
|
|
705
591
|
noncesMap.set(addr, nonce + 1);
|
|
706
592
|
});
|
|
707
|
-
sellers.forEach(seller => {
|
|
593
|
+
sellers.forEach((seller) => {
|
|
708
594
|
const addr = seller.address.toLowerCase();
|
|
709
595
|
const nonce = noncesMap.get(addr);
|
|
710
596
|
sellerNonces.push(nonce);
|
|
@@ -718,7 +604,7 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
|
|
|
718
604
|
buyer,
|
|
719
605
|
useNativeToken,
|
|
720
606
|
deadline,
|
|
721
|
-
v2RouterAddress: config.v2RouterAddress
|
|
607
|
+
v2RouterAddress: config.v2RouterAddress,
|
|
722
608
|
});
|
|
723
609
|
return buyer.signTransaction({
|
|
724
610
|
...unsigned,
|
|
@@ -727,7 +613,7 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
|
|
|
727
613
|
gasLimit: finalGasLimit,
|
|
728
614
|
gasPrice,
|
|
729
615
|
chainId: context.chainId,
|
|
730
|
-
type: txType
|
|
616
|
+
type: txType,
|
|
731
617
|
});
|
|
732
618
|
});
|
|
733
619
|
// 4. 并行构建所有卖出交易
|
|
@@ -738,7 +624,7 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
|
|
|
738
624
|
seller,
|
|
739
625
|
useNativeToken,
|
|
740
626
|
deadline,
|
|
741
|
-
v2RouterAddress: config.v2RouterAddress
|
|
627
|
+
v2RouterAddress: config.v2RouterAddress,
|
|
742
628
|
});
|
|
743
629
|
return seller.signTransaction({
|
|
744
630
|
...unsigned,
|
|
@@ -747,14 +633,14 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
|
|
|
747
633
|
gasLimit: finalGasLimit,
|
|
748
634
|
gasPrice,
|
|
749
635
|
chainId: context.chainId,
|
|
750
|
-
type: txType
|
|
636
|
+
type: txType,
|
|
751
637
|
});
|
|
752
638
|
});
|
|
753
639
|
// ✅ 并行签名所有交易(贿赂 + 买入 + 卖出)
|
|
754
640
|
const [bribeTx, signedBuys, signedSells] = await Promise.all([
|
|
755
641
|
bribeTxPromise,
|
|
756
642
|
Promise.all(buyTxPromises),
|
|
757
|
-
Promise.all(sellTxPromises)
|
|
643
|
+
Promise.all(sellTxPromises),
|
|
758
644
|
]);
|
|
759
645
|
// 组装交易顺序:贿赂 → 买入 → 卖出
|
|
760
646
|
if (bribeTx)
|
|
@@ -772,7 +658,7 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
|
|
|
772
658
|
profitNonce,
|
|
773
659
|
gasPrice,
|
|
774
660
|
chainId: context.chainId,
|
|
775
|
-
txType
|
|
661
|
+
txType,
|
|
776
662
|
});
|
|
777
663
|
if (profitResult) {
|
|
778
664
|
allTransactions.push(...profitResult.signedTransactions);
|
|
@@ -784,8 +670,8 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
|
|
|
784
670
|
signedTransactions: allTransactions,
|
|
785
671
|
profitHopWallets,
|
|
786
672
|
metadata: {
|
|
787
|
-
buyerAddress: buyers.map(b => b.address).join(','),
|
|
788
|
-
sellerAddress: sellers.map(s => s.address).join(','),
|
|
673
|
+
buyerAddress: buyers.map((b) => b.address).join(','),
|
|
674
|
+
sellerAddress: sellers.map((s) => s.address).join(','),
|
|
789
675
|
buyAmount: useNativeToken
|
|
790
676
|
? ethers.formatEther(totalFundsWei)
|
|
791
677
|
: ethers.formatUnits(totalFundsWei, quoteTokenDecimals),
|
|
@@ -793,15 +679,13 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
|
|
|
793
679
|
profitAmount: profitAmount > 0n ? ethers.formatEther(profitAmount) : undefined,
|
|
794
680
|
buyCount,
|
|
795
681
|
sellCount,
|
|
796
|
-
buyAmounts: buyAmountsWei.map(amt => useNativeToken
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
sellAmounts: sellAmountsWei.map(amt => amt.toString())
|
|
800
|
-
}
|
|
682
|
+
buyAmounts: buyAmountsWei.map((amt) => useNativeToken ? ethers.formatEther(amt) : ethers.formatUnits(amt, quoteTokenDecimals)),
|
|
683
|
+
sellAmounts: sellAmountsWei.map((amt) => amt.toString()),
|
|
684
|
+
},
|
|
801
685
|
};
|
|
802
686
|
}
|
|
803
687
|
// ✅ 构建单笔买入交易
|
|
804
|
-
async function buildSingleBuyTx({ routeParams, buyAmount, buyer, useNativeToken, deadline, v2RouterAddress }) {
|
|
688
|
+
async function buildSingleBuyTx({ routeParams, buyAmount, buyer, useNativeToken, deadline, v2RouterAddress, }) {
|
|
805
689
|
if (routeParams.routeType === 'v2') {
|
|
806
690
|
const { v2Path } = routeParams;
|
|
807
691
|
const v2Router = new Contract(v2RouterAddress || PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V2_ROUTER_ABI, buyer);
|
|
@@ -817,21 +701,23 @@ async function buildSingleBuyTx({ routeParams, buyAmount, buyer, useNativeToken,
|
|
|
817
701
|
const v3RouterIface = new ethers.Interface(PANCAKE_V3_ROUTER_ABI);
|
|
818
702
|
const v3Router = new Contract(PANCAKE_V3_ROUTER_ADDRESS, PANCAKE_V3_ROUTER_ABI, buyer);
|
|
819
703
|
const buyValue = useNativeToken ? buyAmount : 0n;
|
|
820
|
-
const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
704
|
+
const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
705
|
+
{
|
|
821
706
|
tokenIn: v3TokenIn,
|
|
822
707
|
tokenOut: v3TokenOut,
|
|
823
708
|
fee: v3Fee,
|
|
824
709
|
recipient: buyer.address,
|
|
825
710
|
amountIn: buyAmount,
|
|
826
711
|
amountOutMinimum: 0n,
|
|
827
|
-
sqrtPriceLimitX96: 0n
|
|
828
|
-
}
|
|
712
|
+
sqrtPriceLimitX96: 0n,
|
|
713
|
+
},
|
|
714
|
+
]);
|
|
829
715
|
return await v3Router.multicall.populateTransaction(deadline, [buySwapData], { value: buyValue });
|
|
830
716
|
}
|
|
831
717
|
throw new Error('V3 多跳路由暂不支持');
|
|
832
718
|
}
|
|
833
719
|
// ✅ 构建单笔卖出交易
|
|
834
|
-
async function buildSingleSellTx({ routeParams, sellAmount, seller, useNativeToken, deadline, v2RouterAddress }) {
|
|
720
|
+
async function buildSingleSellTx({ routeParams, sellAmount, seller, useNativeToken, deadline, v2RouterAddress, }) {
|
|
835
721
|
if (routeParams.routeType === 'v2') {
|
|
836
722
|
const { v2Path } = routeParams;
|
|
837
723
|
const reversePath = [...v2Path].reverse();
|
|
@@ -848,28 +734,32 @@ async function buildSingleSellTx({ routeParams, sellAmount, seller, useNativeTok
|
|
|
848
734
|
const v3RouterIface = new ethers.Interface(PANCAKE_V3_ROUTER_ABI);
|
|
849
735
|
const v3Router = new Contract(PANCAKE_V3_ROUTER_ADDRESS, PANCAKE_V3_ROUTER_ABI, seller);
|
|
850
736
|
if (useNativeToken) {
|
|
851
|
-
const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
737
|
+
const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
738
|
+
{
|
|
852
739
|
tokenIn: v3TokenOut,
|
|
853
740
|
tokenOut: v3TokenIn,
|
|
854
741
|
fee: v3Fee,
|
|
855
742
|
recipient: PANCAKE_V3_ROUTER_ADDRESS,
|
|
856
743
|
amountIn: sellAmount,
|
|
857
744
|
amountOutMinimum: 0n,
|
|
858
|
-
sqrtPriceLimitX96: 0n
|
|
859
|
-
}
|
|
745
|
+
sqrtPriceLimitX96: 0n,
|
|
746
|
+
},
|
|
747
|
+
]);
|
|
860
748
|
const sellUnwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
|
|
861
749
|
return await v3Router.multicall.populateTransaction(deadline, [sellSwapData, sellUnwrapData]);
|
|
862
750
|
}
|
|
863
751
|
else {
|
|
864
|
-
const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
752
|
+
const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
753
|
+
{
|
|
865
754
|
tokenIn: v3TokenOut,
|
|
866
755
|
tokenOut: v3TokenIn,
|
|
867
756
|
fee: v3Fee,
|
|
868
757
|
recipient: seller.address,
|
|
869
758
|
amountIn: sellAmount,
|
|
870
759
|
amountOutMinimum: 0n,
|
|
871
|
-
sqrtPriceLimitX96: 0n
|
|
872
|
-
}
|
|
760
|
+
sqrtPriceLimitX96: 0n,
|
|
761
|
+
},
|
|
762
|
+
]);
|
|
873
763
|
return await v3Router.multicall.populateTransaction(deadline, [sellSwapData]);
|
|
874
764
|
}
|
|
875
765
|
}
|