four-flap-meme-sdk 1.9.49 → 2.1.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/__tests__/subpath-exports.test.js +34 -0
- 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.js +60 -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/{shared 2/flap/portal-bundle-merkle/pancake-proxy.js → bundle-core/four-meme/pancake-proxy.js} +277 -299
- 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/{chains/bsc/four/swap/index.js → bundle-core/four-meme/swap.js} +84 -408
- package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
- package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
- package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
- package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
- package/dist/bundle-core/four-meme/types.d.ts +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.d.ts +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/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/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/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 → bundle-swap-helpers.js} +63 -70
- 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/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 -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 +29 -46
- package/dist/chains/xlayer/eip7702/index.js +27 -81
- package/dist/chains/xlayer/eip7702/{multi-hop-transfer/types.d.ts → multi-hop-transfer-helpers.d.ts} +17 -23
- 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/types.d.ts → volume-helpers.d.ts} +41 -17
- 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.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/{direct-router/types.d.ts → types.d.ts} +1 -1
- 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 -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 +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 -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.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/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.js +18 -0
- package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
- package/dist/{utils/erc20/types.d.ts → shared/foundation/types/erc20.d.ts} +7 -19
- package/dist/{utils/holders-maker/types.d.ts → shared/foundation/types/holders-maker.d.ts} +4 -12
- package/dist/shared/foundation/types/index.d.ts +7 -0
- package/dist/{utils/lp-inspect/types.d.ts → shared/foundation/types/lp-inspect.d.ts} +4 -2
- 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/{utils/quote-helpers/types.d.ts → shared/foundation/types/quote-helpers.d.ts} +1 -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/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.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.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.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.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.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 +120 -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/chains/bsc/four/submit/blockrazor.d.ts +0 -18
- package/dist/chains/bsc/four/submit/blockrazor.js +0 -86
- package/dist/chains/bsc/four/submit/direct.d.ts +0 -66
- package/dist/chains/bsc/four/submit/direct.js +0 -452
- package/dist/chains/bsc/four/submit/helpers.d.ts +0 -18
- package/dist/chains/bsc/four/submit/helpers.js +0 -57
- package/dist/chains/bsc/four/submit/index.d.ts +0 -12
- package/dist/chains/bsc/four/submit/index.js +0 -11
- package/dist/chains/bsc/four/submit/merkle.d.ts +0 -18
- package/dist/chains/bsc/four/submit/merkle.js +0 -74
- package/dist/chains/bsc/four/submit/types.d.ts +0 -143
- package/dist/chains/bsc/four/swap/index.d.ts +0 -32
- package/dist/chains/bsc/four/swap/types.d.ts +0 -70
- package/dist/chains/bsc/four/utils/index.d.ts +0 -20
- package/dist/chains/bsc/four/utils/index.js +0 -1558
- package/dist/chains/bsc/pancake/bundle-buy-first/index.d.ts +0 -8
- package/dist/chains/bsc/pancake/bundle-buy-first/index.js +0 -907
- package/dist/chains/bsc/pancake/bundle-buy-first/types.d.ts +0 -73
- package/dist/chains/bsc/pancake/bundle-swap/helpers.d.ts +0 -102
- package/dist/chains/bsc/pancake/bundle-swap/index.d.ts +0 -50
- package/dist/chains/bsc/pancake/bundle-swap/index.js +0 -1066
- package/dist/chains/bsc/pancake/bundle-swap/types.d.ts +0 -202
- package/dist/chains/bsc/pancake/bundle-swap/types.js +0 -3
- package/dist/chains/xlayer/eip7702/bundle-swap/index.d.ts +0 -72
- package/dist/chains/xlayer/eip7702/bundle-swap/index.js +0 -921
- package/dist/chains/xlayer/eip7702/bundle-swap/types.d.ts +0 -65
- package/dist/chains/xlayer/eip7702/multi-hop-transfer/index.d.ts +0 -128
- package/dist/chains/xlayer/eip7702/multi-hop-transfer/index.js +0 -857
- package/dist/chains/xlayer/eip7702/volume/index.d.ts +0 -96
- package/dist/chains/xlayer/eip7702/volume/index.js +0 -793
- package/dist/dex/direct-router/index.d.ts +0 -70
- package/dist/dex/direct-router/index.js +0 -1410
- package/dist/shared/abis/TaxToken.json +0 -969
- package/dist/shared/abis/TokenManager.json +0 -836
- package/dist/shared/abis/TokenManager2.json +0 -136
- package/dist/shared/abis/TokenManagerHelper3.json +0 -993
- package/dist/shared/flap/__tests__/curve.test.js +0 -85
- package/dist/shared/flap/portal/index.d.ts +0 -12
- package/dist/shared/flap/portal/index.js +0 -11
- package/dist/shared/flap/portal/portal.d.ts +0 -47
- package/dist/shared/flap/portal/portal.js +0 -218
- package/dist/shared/flap/portal/types.d.ts +0 -227
- package/dist/shared/flap/portal/types.js +0 -80
- package/dist/shared/flap/portal/writer.d.ts +0 -121
- package/dist/shared/flap/portal/writer.js +0 -265
- package/dist/shared/flap/portal-bundle-merkle/core/index.d.ts +0 -18
- package/dist/shared/flap/portal-bundle-merkle/core/index.js +0 -938
- package/dist/shared/flap/portal-bundle-merkle/swap/index.d.ts +0 -42
- package/dist/shared/flap/portal-bundle-merkle/swap/index.js +0 -1448
- package/dist/shared/flap/portal-bundle-merkle/swap/types.d.ts +0 -84
- package/dist/shared/flap/portal-bundle-merkle/utils/index.d.ts +0 -17
- package/dist/shared/flap/portal-bundle-merkle/utils/index.js +0 -1024
- package/dist/shared/flap/portal-bundle-merkle/utils/types.d.ts +0 -16
- package/dist/shared 2/abis/TaxToken.json +0 -105
- package/dist/shared 2/abis/TokenManager.json +0 -836
- package/dist/shared 2/abis/TokenManager2.json +0 -60
- package/dist/shared 2/abis/TokenManagerHelper3.json +0 -993
- package/dist/shared 2/abis/common.d.ts +0 -85
- package/dist/shared 2/abis/common.js +0 -254
- package/dist/shared 2/abis/index.d.ts +0 -8
- package/dist/shared 2/abis/index.js +0 -8
- package/dist/shared 2/clients/blockrazor.d.ts +0 -314
- package/dist/shared 2/clients/blockrazor.js +0 -596
- package/dist/shared 2/clients/club48.d.ts +0 -154
- package/dist/shared 2/clients/club48.js +0 -331
- package/dist/shared 2/clients/emitservice.d.ts +0 -47
- package/dist/shared 2/clients/emitservice.js +0 -44
- package/dist/shared 2/clients/four.d.ts +0 -132
- package/dist/shared 2/clients/four.js +0 -281
- package/dist/shared 2/clients/merkle.d.ts +0 -210
- package/dist/shared 2/clients/merkle.js +0 -400
- package/dist/shared 2/flap/__tests__/curve.test.js +0 -85
- package/dist/shared 2/flap/abi.d.ts +0 -4
- package/dist/shared 2/flap/abi.js +0 -4
- package/dist/shared 2/flap/constants.d.ts +0 -128
- package/dist/shared 2/flap/constants.js +0 -143
- package/dist/shared 2/flap/curve.d.ts +0 -33
- package/dist/shared 2/flap/curve.js +0 -84
- package/dist/shared 2/flap/errors.d.ts +0 -37
- package/dist/shared 2/flap/errors.js +0 -114
- package/dist/shared 2/flap/index.d.ts +0 -22
- package/dist/shared 2/flap/index.js +0 -33
- package/dist/shared 2/flap/ipfs.d.ts +0 -21
- package/dist/shared 2/flap/ipfs.js +0 -38
- package/dist/shared 2/flap/meta.d.ts +0 -30
- package/dist/shared 2/flap/meta.js +0 -195
- package/dist/shared 2/flap/permit.d.ts +0 -16
- package/dist/shared 2/flap/permit.js +0 -67
- package/dist/shared 2/flap/pinata.d.ts +0 -40
- package/dist/shared 2/flap/pinata.js +0 -106
- package/dist/shared 2/flap/portal-bundle-merkle/config.d.ts +0 -79
- package/dist/shared 2/flap/portal-bundle-merkle/config.js +0 -133
- package/dist/shared 2/flap/portal-bundle-merkle/core.d.ts +0 -18
- package/dist/shared 2/flap/portal-bundle-merkle/core.js +0 -938
- package/dist/shared 2/flap/portal-bundle-merkle/create-to-dex.d.ts +0 -125
- package/dist/shared 2/flap/portal-bundle-merkle/create-to-dex.js +0 -665
- package/dist/shared 2/flap/portal-bundle-merkle/curve-to-dex.d.ts +0 -88
- package/dist/shared 2/flap/portal-bundle-merkle/curve-to-dex.js +0 -446
- package/dist/shared 2/flap/portal-bundle-merkle/index.d.ts +0 -14
- package/dist/shared 2/flap/portal-bundle-merkle/index.js +0 -26
- package/dist/shared 2/flap/portal-bundle-merkle/pancake-proxy.d.ts +0 -28
- package/dist/shared 2/flap/portal-bundle-merkle/private.d.ts +0 -17
- package/dist/shared 2/flap/portal-bundle-merkle/private.js +0 -549
- package/dist/shared 2/flap/portal-bundle-merkle/swap-buy-first.d.ts +0 -65
- package/dist/shared 2/flap/portal-bundle-merkle/swap-buy-first.js +0 -831
- package/dist/shared 2/flap/portal-bundle-merkle/swap.d.ts +0 -201
- package/dist/shared 2/flap/portal-bundle-merkle/swap.js +0 -1359
- package/dist/shared 2/flap/portal-bundle-merkle/types.d.ts +0 -358
- package/dist/shared 2/flap/portal-bundle-merkle/utils.d.ts +0 -89
- package/dist/shared 2/flap/portal-bundle-merkle/utils.js +0 -963
- package/dist/shared 2/flap/portal-bundle.d.ts +0 -119
- package/dist/shared 2/flap/portal-bundle.js +0 -584
- package/dist/shared 2/flap/portal.d.ts +0 -392
- package/dist/shared 2/flap/portal.js +0 -559
- package/dist/shared 2/flap/vanity.d.ts +0 -48
- package/dist/shared 2/flap/vanity.js +0 -110
- package/dist/shared 2/flap/vault.d.ts +0 -240
- package/dist/shared 2/flap/vault.js +0 -366
- package/dist/shared 2/four/index.d.ts +0 -7
- package/dist/shared 2/four/index.js +0 -22
- package/dist/shared 2/four/tax-token.d.ts +0 -176
- package/dist/shared 2/four/tax-token.js +0 -302
- package/dist/shared 2/index.d.ts +0 -10
- package/dist/shared 2/index.js +0 -10
- package/dist/utils/__tests__/errors.test.js +0 -76
- package/dist/utils/erc20/index.d.ts +0 -242
- package/dist/utils/erc20/index.js +0 -645
- package/dist/utils/holders-maker/helpers.d.ts +0 -43
- package/dist/utils/holders-maker/helpers.js +0 -371
- package/dist/utils/holders-maker/index.d.ts +0 -26
- package/dist/utils/holders-maker/index.js +0 -218
- package/dist/utils/holders-maker/types.js +0 -4
- package/dist/utils/lp-inspect/index.d.ts +0 -44
- package/dist/utils/lp-inspect/index.js +0 -937
- package/dist/utils/quote-helpers/index.d.ts +0 -107
- package/dist/utils/quote-helpers/index.js +0 -346
- /package/dist/{chains/bsc/four/submit/types.js → __tests__/subpath-exports.test.d.ts} +0 -0
- /package/dist/{chains/bsc/four/swap/types.js → bundle-core/__tests__/config-helpers.test.d.ts} +0 -0
- /package/dist/{chains/bsc/four/utils/types.d.ts → bundle-core/__tests__/facade-parity.test.d.ts} +0 -0
- /package/dist/{chains/bsc/four/utils/types.js → bundle-core/__tests__/sign-context-helpers.test.d.ts} +0 -0
- /package/dist/{chains/bsc/pancake/bundle-buy-first/types.js → bundle-core/__tests__/sign-fixture.test.d.ts} +0 -0
- /package/dist/{chains/xlayer/eip7702/multi-hop-transfer/types.js → bundle-core/four-meme/types/buy-first.js} +0 -0
- /package/dist/{chains/xlayer/eip7702/volume/types.js → bundle-core/four-meme/types/core-flow.js} +0 -0
- /package/dist/{dex/direct-router/types.js → bundle-core/four-meme/types/index.js} +0 -0
- /package/dist/{shared 2/flap/__tests__/curve.test.d.ts → bundle-core/four-meme/types/swap-internal.js} +0 -0
- /package/dist/{chains/xlayer/eip7702/bundle-swap → bundle-core/four-meme}/types.js +0 -0
- /package/dist/{shared/flap/__tests__/curve.test.d.ts → bundle-core/types/index.js} +0 -0
- /package/dist/{shared 2/flap/portal-bundle-merkle → bundle-core}/types.js +0 -0
- /package/dist/{shared/flap/portal-bundle-merkle/core/types.d.ts → chains/xlayer/eip7702/multi-hop-transfer-helpers.js} +0 -0
- /package/dist/{shared/flap/portal-bundle-merkle/core → dex}/types.js +0 -0
- /package/dist/shared/{flap/portal-bundle-merkle/swap/types.js → foundation/tx/wallet-sign-patch.d.ts} +0 -0
- /package/dist/shared/{flap/portal-bundle-merkle/utils/types.js → foundation/types/airdrop-sweep.js} +0 -0
- /package/dist/{utils/__tests__/errors.test.d.ts → shared/foundation/types/erc20.js} +0 -0
- /package/dist/{utils/erc20/types.js → shared/foundation/types/holders-maker.js} +0 -0
- /package/dist/{utils/lp-inspect/types.js → shared/foundation/types/index.js} +0 -0
- /package/dist/{utils/quote-helpers/types.js → shared/foundation/types/lp-inspect.js} +0 -0
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* PancakeSwap 官方 Router
|
|
2
|
+
* PancakeSwap 官方 Router 交易模块
|
|
3
3
|
*
|
|
4
4
|
* ✅ 使用官方 PancakeSwap V2/V3 Router(非代理合约)
|
|
5
|
-
* - V2 Router
|
|
6
|
-
* - V3 Router
|
|
7
|
-
* - V3 Quoter
|
|
5
|
+
* - V2 Router: 0x10ED43C718714eb63d5aA57B78B54704E256024E
|
|
6
|
+
* - V3 Router: 0x13f4EA83D0bd40E75C8222255bc855a974568Dd4
|
|
7
|
+
* - V3 Quoter: 0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997
|
|
8
8
|
*/
|
|
9
|
-
import { ethers, Wallet,
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
9
|
+
import { ethers, Wallet, Contract, Interface } from 'ethers';
|
|
10
|
+
import { createSignProvider } from '../sign-context-helpers.js';
|
|
11
|
+
import { NonceManager, getOptimizedGasPrice, getDeadline, encodeV3Path, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../utils/bundle-helpers.js';
|
|
12
|
+
import { ADDRESSES, BLOCKRAZOR_BUILDER_EOA } from '../../shared/constants/index.js';
|
|
13
13
|
import { MULTICALL3_ABI, V2_ROUTER_ABI, V3_ROUTER02_ABI, V3_QUOTER_ABI, ERC20_ABI } from '../../abis/common.js';
|
|
14
|
-
import {
|
|
14
|
+
import { getErrorMessageFromUnknown } from '../../shared/foundation/index.js';
|
|
15
|
+
import { getTxType, getGasPriceConfig, shouldExtractProfit, calculateProfit, calculateBatchProfit, getProfitRecipient, getBribeAmount, } from '../config-helpers.js';
|
|
15
16
|
// ==================== 常量 ====================
|
|
16
17
|
const MULTICALL3_ADDRESS = ADDRESSES.BSC.Multicall3;
|
|
17
18
|
const WBNB_ADDRESS = ADDRESSES.BSC.WBNB;
|
|
@@ -21,28 +22,12 @@ const PANCAKE_V2_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV2Router;
|
|
|
21
22
|
const PANCAKE_V3_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV3Router;
|
|
22
23
|
const PANCAKE_V3_QUOTER_ADDRESS = ADDRESSES.BSC.PancakeV3Quoter;
|
|
23
24
|
// ==================== ABI 别名(从公共模块导入)====================
|
|
25
|
+
// ✅ 使用公共 ABI:V2_ROUTER_ABI, V3_ROUTER02_ABI (as V3_ROUTER_ABI), V3_QUOTER_ABI, ERC20_ABI, MULTICALL3_ABI
|
|
24
26
|
const V3_ROUTER_ABI = V3_ROUTER02_ABI;
|
|
25
|
-
// ==================== 官方 ABI ====================
|
|
26
|
-
// ✅ ABI 从公共模块导入:V2_ROUTER_ABI, V3_ROUTER02_ABI (as V3_ROUTER_ABI), V3_QUOTER_ABI, ERC20_ABI, MULTICALL3_ABI
|
|
27
|
-
// ✅ 工具函数从 bundle-helpers.js 导入:getDeadline, encodeV3Path
|
|
28
|
-
// ==================== Provider 缓存 ====================
|
|
29
|
-
const providerCache = new Map();
|
|
30
|
-
const PROVIDER_CACHE_TTL_MS = 60 * 1000;
|
|
31
|
-
// Token Decimals 缓存
|
|
32
|
-
const tokenDecimalsCache = new Map();
|
|
33
|
-
function getCachedProvider(chain, rpcUrl, chainId) {
|
|
34
|
-
const cacheKey = `${chain}-${rpcUrl}`;
|
|
35
|
-
const now = Date.now();
|
|
36
|
-
const cached = providerCache.get(cacheKey);
|
|
37
|
-
if (cached && cached.expireAt > now) {
|
|
38
|
-
return cached.provider;
|
|
39
|
-
}
|
|
40
|
-
const resolvedChainId = chainId ?? (CHAIN_ID_MAP[chain] || 56);
|
|
41
|
-
const provider = new JsonRpcProvider(rpcUrl, { chainId: resolvedChainId, name: chain });
|
|
42
|
-
providerCache.set(cacheKey, { provider, expireAt: now + PROVIDER_CACHE_TTL_MS });
|
|
43
|
-
return provider;
|
|
44
|
-
}
|
|
45
27
|
// ==================== 辅助函数 ====================
|
|
28
|
+
/**
|
|
29
|
+
* 获取 Gas Limit
|
|
30
|
+
*/
|
|
46
31
|
function getGasLimit(config, defaultGas = DEFAULT_GAS_LIMIT) {
|
|
47
32
|
if (config.gasLimit !== undefined) {
|
|
48
33
|
return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
|
|
@@ -51,52 +36,34 @@ function getGasLimit(config, defaultGas = DEFAULT_GAS_LIMIT) {
|
|
|
51
36
|
const calculatedGas = Math.ceil(defaultGas * multiplier);
|
|
52
37
|
return BigInt(calculatedGas);
|
|
53
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* 查询代币 decimals
|
|
41
|
+
*/
|
|
54
42
|
async function getTokenDecimals(tokenAddress, provider) {
|
|
55
|
-
const cacheKey = tokenAddress.toLowerCase();
|
|
56
|
-
const cached = tokenDecimalsCache.get(cacheKey);
|
|
57
|
-
if (cached !== undefined) {
|
|
58
|
-
return cached;
|
|
59
|
-
}
|
|
60
43
|
try {
|
|
61
44
|
const token = new Contract(tokenAddress, ERC20_ABI, provider);
|
|
62
45
|
const decimals = await token.decimals();
|
|
63
|
-
|
|
64
|
-
tokenDecimalsCache.set(cacheKey, result);
|
|
65
|
-
return result;
|
|
46
|
+
return Number(decimals);
|
|
66
47
|
}
|
|
67
48
|
catch {
|
|
68
|
-
tokenDecimalsCache.set(cacheKey, 18);
|
|
69
49
|
return 18;
|
|
70
50
|
}
|
|
71
51
|
}
|
|
72
|
-
function needSendBNB(routeType, params
|
|
73
|
-
if (!useNativeToken) {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
52
|
+
function needSendBNB(routeType, params) {
|
|
76
53
|
if (routeType === 'v2' && params.v2Path && params.v2Path[0].toLowerCase() === WBNB_ADDRESS.toLowerCase()) {
|
|
77
54
|
return true;
|
|
78
55
|
}
|
|
79
56
|
if (routeType === 'v3-single' && params.v3TokenIn && params.v3TokenIn.toLowerCase() === WBNB_ADDRESS.toLowerCase()) {
|
|
80
57
|
return true;
|
|
81
58
|
}
|
|
82
|
-
if (routeType === 'v3-multi' &&
|
|
59
|
+
if (routeType === 'v3-multi' &&
|
|
60
|
+
params.v3ExactTokenIn &&
|
|
61
|
+
params.v3ExactTokenIn.toLowerCase() === WBNB_ADDRESS.toLowerCase()) {
|
|
83
62
|
return true;
|
|
84
63
|
}
|
|
85
64
|
return false;
|
|
86
65
|
}
|
|
87
|
-
function isUsingNativeToken(quoteToken) {
|
|
88
|
-
return !quoteToken || quoteToken === ZERO_ADDRESS || quoteToken.toLowerCase() === WBNB_ADDRESS.toLowerCase();
|
|
89
|
-
}
|
|
90
66
|
// ✅ getDeadline 从 bundle-helpers.js 导入
|
|
91
|
-
/**
|
|
92
|
-
* 根据 routeType 获取授权目标地址
|
|
93
|
-
*/
|
|
94
|
-
function getApprovalTarget(routeType) {
|
|
95
|
-
if (routeType === 'v2') {
|
|
96
|
-
return PANCAKE_V2_ROUTER_ADDRESS;
|
|
97
|
-
}
|
|
98
|
-
return PANCAKE_V3_ROUTER_ADDRESS;
|
|
99
|
-
}
|
|
100
67
|
/**
|
|
101
68
|
* ✅ 构建 V2 交易(使用官方 Router)
|
|
102
69
|
*/
|
|
@@ -104,10 +71,20 @@ async function buildV2Transactions(routers, wallets, amountsWei, minOuts, path,
|
|
|
104
71
|
const deadline = getDeadline();
|
|
105
72
|
return Promise.all(routers.map(async (router, i) => {
|
|
106
73
|
if (isBuy && needBNB) {
|
|
107
|
-
|
|
74
|
+
// ✅ 买入:BNB → Token,使用 swapExactETHForTokensSupportingFeeOnTransferTokens
|
|
75
|
+
return router.swapExactETHForTokensSupportingFeeOnTransferTokens.populateTransaction(minOuts[i], // amountOutMin
|
|
76
|
+
path, // path
|
|
77
|
+
wallets[i].address, // to
|
|
78
|
+
deadline, // deadline
|
|
79
|
+
{ value: amountsWei[i] });
|
|
108
80
|
}
|
|
109
81
|
else {
|
|
110
|
-
|
|
82
|
+
// ✅ 卖出:Token → BNB,使用 swapExactTokensForETHSupportingFeeOnTransferTokens
|
|
83
|
+
return router.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(amountsWei[i], // amountIn
|
|
84
|
+
minOuts[i], // amountOutMin
|
|
85
|
+
path, // path
|
|
86
|
+
wallets[i].address, // to
|
|
87
|
+
deadline);
|
|
111
88
|
}
|
|
112
89
|
}));
|
|
113
90
|
}
|
|
@@ -119,32 +96,48 @@ async function buildV3SingleTransactions(routers, wallets, tokenIn, tokenOut, fe
|
|
|
119
96
|
const v3RouterIface = new Interface(V3_ROUTER_ABI);
|
|
120
97
|
return Promise.all(routers.map(async (router, i) => {
|
|
121
98
|
const isTokenOutWBNB = tokenOut.toLowerCase() === WBNB_ADDRESS.toLowerCase();
|
|
122
|
-
|
|
99
|
+
// ✅ 构建 exactInputSingle calldata
|
|
100
|
+
const exactInputSingleData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
101
|
+
{
|
|
123
102
|
tokenIn: tokenIn,
|
|
124
103
|
tokenOut: tokenOut,
|
|
125
104
|
fee: fee,
|
|
126
|
-
recipient: isTokenOutWBNB ? PANCAKE_V3_ROUTER_ADDRESS : wallets[i].address,
|
|
105
|
+
recipient: isTokenOutWBNB ? PANCAKE_V3_ROUTER_ADDRESS : wallets[i].address, // 如果输出是 WBNB,先发给 Router
|
|
127
106
|
amountIn: amountsWei[i],
|
|
128
107
|
amountOutMinimum: minOuts[i],
|
|
129
|
-
sqrtPriceLimitX96: 0n
|
|
130
|
-
}
|
|
108
|
+
sqrtPriceLimitX96: 0n,
|
|
109
|
+
},
|
|
110
|
+
]);
|
|
131
111
|
if (isBuy && needBNB) {
|
|
112
|
+
// ✅ 买入:BNB → Token,只需要 exactInputSingle
|
|
113
|
+
// 通过 multicall 包装,传入 deadline 和 ETH value
|
|
132
114
|
return router.multicall.populateTransaction(deadline, [exactInputSingleData], { value: amountsWei[i] });
|
|
133
115
|
}
|
|
134
116
|
else if (!isBuy && isTokenOutWBNB) {
|
|
117
|
+
// ✅ 卖出:Token → WBNB → BNB,需要 exactInputSingle + unwrapWETH9
|
|
135
118
|
const unwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [
|
|
136
|
-
minOuts[i],
|
|
137
|
-
wallets[i].address
|
|
119
|
+
minOuts[i], // amountMinimum
|
|
120
|
+
wallets[i].address, // recipient
|
|
138
121
|
]);
|
|
139
122
|
return router.multicall.populateTransaction(deadline, [exactInputSingleData, unwrapData]);
|
|
140
123
|
}
|
|
141
124
|
else {
|
|
125
|
+
// ✅ Token → Token,只需要 exactInputSingle
|
|
142
126
|
return router.multicall.populateTransaction(deadline, [exactInputSingleData]);
|
|
143
127
|
}
|
|
144
128
|
}));
|
|
145
129
|
}
|
|
146
130
|
/**
|
|
147
131
|
* ✅ 构建 V3 多跳交易(使用官方 SwapRouter02 的 exactInput)
|
|
132
|
+
*
|
|
133
|
+
* @param routers - V3 Router 合约数组
|
|
134
|
+
* @param wallets - 钱包数组
|
|
135
|
+
* @param tokens - 代币路径 [tokenIn, tokenMid1, ..., tokenOut]
|
|
136
|
+
* @param fees - 费率路径 [fee0, fee1, ...]
|
|
137
|
+
* @param amountsWei - 每个钱包的输入金额
|
|
138
|
+
* @param minOuts - 最小输出金额
|
|
139
|
+
* @param isBuy - 是否为买入操作
|
|
140
|
+
* @param needBNB - 是否需要发送 BNB
|
|
148
141
|
*/
|
|
149
142
|
async function buildV3MultiHopTransactions(routers, wallets, tokens, fees, amountsWei, minOuts, isBuy, needBNB) {
|
|
150
143
|
if (!tokens || tokens.length < 2) {
|
|
@@ -155,7 +148,9 @@ async function buildV3MultiHopTransactions(routers, wallets, tokens, fees, amoun
|
|
|
155
148
|
}
|
|
156
149
|
const deadline = getDeadline();
|
|
157
150
|
const v3RouterIface = new Interface(V3_ROUTER_ABI);
|
|
151
|
+
// 编码正向 path(用于买入:BNB → Token)
|
|
158
152
|
const forwardPath = encodeV3Path(tokens, fees);
|
|
153
|
+
// 编码反向 path(用于卖出:Token → BNB)
|
|
159
154
|
const reversedTokens = [...tokens].reverse();
|
|
160
155
|
const reversedFees = [...fees].reverse();
|
|
161
156
|
const reversePath = encodeV3Path(reversedTokens, reversedFees);
|
|
@@ -163,46 +158,119 @@ async function buildV3MultiHopTransactions(routers, wallets, tokens, fees, amoun
|
|
|
163
158
|
const isTokenOutWBNB = tokenOut.toLowerCase() === WBNB_ADDRESS.toLowerCase();
|
|
164
159
|
return Promise.all(routers.map(async (router, i) => {
|
|
165
160
|
if (isBuy && needBNB) {
|
|
166
|
-
|
|
161
|
+
// ✅ 买入:BNB → ... → Token
|
|
162
|
+
const swapData = v3RouterIface.encodeFunctionData('exactInput', [
|
|
163
|
+
{
|
|
167
164
|
path: forwardPath,
|
|
168
165
|
recipient: wallets[i].address,
|
|
169
166
|
amountIn: amountsWei[i],
|
|
170
|
-
amountOutMinimum: minOuts[i]
|
|
171
|
-
}
|
|
167
|
+
amountOutMinimum: minOuts[i],
|
|
168
|
+
},
|
|
169
|
+
]);
|
|
172
170
|
return router.multicall.populateTransaction(deadline, [swapData], { value: amountsWei[i] });
|
|
173
171
|
}
|
|
174
172
|
else if (!isBuy) {
|
|
175
|
-
|
|
173
|
+
// ✅ 卖出:Token → ... → BNB
|
|
174
|
+
const swapData = v3RouterIface.encodeFunctionData('exactInput', [
|
|
175
|
+
{
|
|
176
176
|
path: reversePath,
|
|
177
177
|
recipient: isTokenOutWBNB ? PANCAKE_V3_ROUTER_ADDRESS : wallets[i].address,
|
|
178
178
|
amountIn: amountsWei[i],
|
|
179
|
-
amountOutMinimum: minOuts[i]
|
|
180
|
-
}
|
|
179
|
+
amountOutMinimum: minOuts[i],
|
|
180
|
+
},
|
|
181
|
+
]);
|
|
181
182
|
if (isTokenOutWBNB) {
|
|
183
|
+
// 需要 unwrapWETH9
|
|
182
184
|
const unwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [minOuts[i], wallets[i].address]);
|
|
183
185
|
return router.multicall.populateTransaction(deadline, [swapData, unwrapData]);
|
|
184
186
|
}
|
|
185
187
|
return router.multicall.populateTransaction(deadline, [swapData]);
|
|
186
188
|
}
|
|
187
189
|
else {
|
|
188
|
-
|
|
190
|
+
// Token → Token(不需要 BNB)
|
|
191
|
+
const swapData = v3RouterIface.encodeFunctionData('exactInput', [
|
|
192
|
+
{
|
|
189
193
|
path: forwardPath,
|
|
190
194
|
recipient: wallets[i].address,
|
|
191
195
|
amountIn: amountsWei[i],
|
|
192
|
-
amountOutMinimum: minOuts[i]
|
|
193
|
-
}
|
|
196
|
+
amountOutMinimum: minOuts[i],
|
|
197
|
+
},
|
|
198
|
+
]);
|
|
194
199
|
return router.multicall.populateTransaction(deadline, [swapData]);
|
|
195
200
|
}
|
|
196
201
|
}));
|
|
197
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* ✅ 使用 Multicall3 批量获取 V2 报价
|
|
205
|
+
*/
|
|
206
|
+
async function batchGetV2Quotes(provider, amountsWei, v2Path) {
|
|
207
|
+
if (amountsWei.length === 0)
|
|
208
|
+
return [];
|
|
209
|
+
if (amountsWei.length === 1) {
|
|
210
|
+
try {
|
|
211
|
+
const v2Router = new Contract(PANCAKE_V2_ROUTER_ADDRESS, V2_ROUTER_ABI, provider);
|
|
212
|
+
const amounts = await v2Router.getAmountsOut(amountsWei[0], v2Path);
|
|
213
|
+
return [amounts[amounts.length - 1]];
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return [0n];
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
const v2RouterIface = new Interface(V2_ROUTER_ABI);
|
|
221
|
+
const multicall = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
|
|
222
|
+
const calls = amountsWei.map((amount) => ({
|
|
223
|
+
target: PANCAKE_V2_ROUTER_ADDRESS,
|
|
224
|
+
allowFailure: true,
|
|
225
|
+
callData: v2RouterIface.encodeFunctionData('getAmountsOut', [amount, v2Path]),
|
|
226
|
+
}));
|
|
227
|
+
const results = await multicall.aggregate3.staticCall(calls);
|
|
228
|
+
return results.map((r) => {
|
|
229
|
+
if (r.success && r.returnData && r.returnData !== '0x') {
|
|
230
|
+
try {
|
|
231
|
+
const decoded = v2RouterIface.decodeFunctionResult('getAmountsOut', r.returnData);
|
|
232
|
+
const amounts = decoded[0];
|
|
233
|
+
return amounts[amounts.length - 1];
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return 0n;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return 0n;
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
return await Promise.all(amountsWei.map(async (amount) => {
|
|
244
|
+
try {
|
|
245
|
+
const v2Router = new Contract(PANCAKE_V2_ROUTER_ADDRESS, V2_ROUTER_ABI, provider);
|
|
246
|
+
const amounts = await v2Router.getAmountsOut(amount, v2Path);
|
|
247
|
+
return amounts[amounts.length - 1];
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return 0n;
|
|
251
|
+
}
|
|
252
|
+
}));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* 根据 routeType 获取授权目标地址
|
|
257
|
+
*/
|
|
258
|
+
function getApprovalTarget(routeType) {
|
|
259
|
+
if (routeType === 'v2') {
|
|
260
|
+
return PANCAKE_V2_ROUTER_ADDRESS;
|
|
261
|
+
}
|
|
262
|
+
// V3 路由授权给 V3 Router
|
|
263
|
+
return PANCAKE_V3_ROUTER_ADDRESS;
|
|
264
|
+
}
|
|
198
265
|
// ==================== 主要导出函数 ====================
|
|
199
266
|
/**
|
|
200
|
-
* ✅ 授权代币给 PancakeSwap Router
|
|
267
|
+
* ✅ 授权代币给 PancakeSwap Router(根据 routeType 选择 V2/V3)
|
|
201
268
|
*/
|
|
202
|
-
export async function
|
|
203
|
-
const {
|
|
269
|
+
export async function approveFourPancakeProxy(params) {
|
|
270
|
+
const { privateKey, tokenAddress, amount, rpcUrl, routeType } = params;
|
|
271
|
+
// 根据 routeType 选择授权目标
|
|
204
272
|
const approvalTarget = getApprovalTarget(routeType || 'v2');
|
|
205
|
-
const provider =
|
|
273
|
+
const provider = createSignProvider(rpcUrl, 56, 'BSC');
|
|
206
274
|
const wallet = new Wallet(privateKey, provider);
|
|
207
275
|
const token = new Contract(tokenAddress, ERC20_ABI, wallet);
|
|
208
276
|
const decimals = await getTokenDecimals(tokenAddress, provider);
|
|
@@ -215,26 +283,28 @@ export async function approvePancakeProxy(params) {
|
|
|
215
283
|
const receipt = await tx.wait();
|
|
216
284
|
return {
|
|
217
285
|
txHash: receipt.hash,
|
|
218
|
-
approved: receipt.status === 1
|
|
286
|
+
approved: receipt.status === 1,
|
|
219
287
|
};
|
|
220
288
|
}
|
|
221
289
|
/**
|
|
222
290
|
* ✅ 批量授权代币给 PancakeSwap Router
|
|
223
291
|
*/
|
|
224
|
-
export async function
|
|
225
|
-
const {
|
|
292
|
+
export async function approveFourPancakeProxyBatch(params) {
|
|
293
|
+
const { privateKeys, tokenAddress, amounts, config, routeType } = params;
|
|
226
294
|
if (privateKeys.length === 0 || amounts.length !== privateKeys.length) {
|
|
227
295
|
throw new Error('Private key count and amount count must match');
|
|
228
296
|
}
|
|
297
|
+
// 根据 routeType 选择授权目标
|
|
229
298
|
const approvalTarget = getApprovalTarget(routeType || 'v2');
|
|
230
|
-
const
|
|
231
|
-
const provider = getCachedProvider(chain, config.rpcUrl, chainId);
|
|
299
|
+
const provider = createSignProvider(config.rpcUrl, 56, 'BSC');
|
|
232
300
|
const gasPrice = await getOptimizedGasPrice(provider, getGasPriceConfig(config));
|
|
233
301
|
const decimals = await getTokenDecimals(tokenAddress, provider);
|
|
234
|
-
const wallets = privateKeys.map(k => new Wallet(k, provider));
|
|
235
|
-
const amountsBigInt = amounts.map(a => a === 'max' ? ethers.MaxUint256 : ethers.parseUnits(a, decimals));
|
|
236
|
-
|
|
302
|
+
const wallets = privateKeys.map((k) => new Wallet(k, provider));
|
|
303
|
+
const amountsBigInt = amounts.map((a) => (a === 'max' ? ethers.MaxUint256 : ethers.parseUnits(a, decimals)));
|
|
304
|
+
// 检查现有授权
|
|
305
|
+
const tokens = wallets.map((w) => new Contract(tokenAddress, ERC20_ABI, w));
|
|
237
306
|
const allowances = await Promise.all(tokens.map((token, i) => token.allowance(wallets[i].address, approvalTarget)));
|
|
307
|
+
// 只授权不足的
|
|
238
308
|
const needApproval = wallets.filter((_, i) => allowances[i] < amountsBigInt[i]);
|
|
239
309
|
const needApprovalAmounts = amountsBigInt.filter((amount, i) => allowances[i] < amount);
|
|
240
310
|
if (needApproval.length === 0) {
|
|
@@ -242,24 +312,27 @@ export async function approvePancakeProxyBatch(params) {
|
|
|
242
312
|
success: true,
|
|
243
313
|
approvedCount: 0,
|
|
244
314
|
signedTransactions: [],
|
|
245
|
-
message: '所有钱包已授权'
|
|
315
|
+
message: '所有钱包已授权',
|
|
246
316
|
};
|
|
247
317
|
}
|
|
248
|
-
|
|
318
|
+
// 构建授权交易
|
|
319
|
+
const needApprovalTokens = needApproval.map((w) => new Contract(tokenAddress, ERC20_ABI, w));
|
|
249
320
|
const unsignedApprovals = await Promise.all(needApprovalTokens.map((token, i) => token.approve.populateTransaction(approvalTarget, needApprovalAmounts[i])));
|
|
250
321
|
const finalGasLimit = getGasLimit(config);
|
|
251
322
|
const nonceManager = new NonceManager(provider);
|
|
252
|
-
const nonces = await Promise.all(needApproval.map(w => nonceManager.getNextNonce(w)));
|
|
323
|
+
const nonces = await Promise.all(needApproval.map((w) => nonceManager.getNextNonce(w)));
|
|
324
|
+
const txType = getTxType(config);
|
|
253
325
|
const signedTxs = await Promise.all(unsignedApprovals.map((unsigned, i) => needApproval[i].signTransaction({
|
|
254
326
|
...unsigned,
|
|
255
327
|
from: needApproval[i].address,
|
|
256
328
|
nonce: nonces[i],
|
|
257
329
|
gasLimit: finalGasLimit,
|
|
258
330
|
gasPrice,
|
|
259
|
-
chainId,
|
|
260
|
-
type:
|
|
331
|
+
chainId: 56,
|
|
332
|
+
type: txType,
|
|
261
333
|
})));
|
|
262
334
|
nonceManager.clearTemp();
|
|
335
|
+
// 广播交易
|
|
263
336
|
const txHashes = [];
|
|
264
337
|
const errors = [];
|
|
265
338
|
for (let i = 0; i < signedTxs.length; i++) {
|
|
@@ -268,7 +341,7 @@ export async function approvePancakeProxyBatch(params) {
|
|
|
268
341
|
txHashes.push(tx.hash);
|
|
269
342
|
}
|
|
270
343
|
catch (error) {
|
|
271
|
-
errors.push(`钱包 ${i} 授权失败: ${error
|
|
344
|
+
errors.push(`钱包 ${i} 授权失败: ${getErrorMessageFromUnknown(error)}`);
|
|
272
345
|
}
|
|
273
346
|
}
|
|
274
347
|
const successCount = txHashes.length;
|
|
@@ -278,7 +351,7 @@ export async function approvePancakeProxyBatch(params) {
|
|
|
278
351
|
approvedCount: successCount,
|
|
279
352
|
signedTransactions: signedTxs,
|
|
280
353
|
txHashes,
|
|
281
|
-
message: `授权成功,共 ${successCount} 个钱包${errors.length > 0 ? `,${errors.length} 个失败` : ''}
|
|
354
|
+
message: `授权成功,共 ${successCount} 个钱包${errors.length > 0 ? `,${errors.length} 个失败` : ''}`,
|
|
282
355
|
};
|
|
283
356
|
}
|
|
284
357
|
else {
|
|
@@ -287,49 +360,59 @@ export async function approvePancakeProxyBatch(params) {
|
|
|
287
360
|
approvedCount: 0,
|
|
288
361
|
signedTransactions: signedTxs,
|
|
289
362
|
txHashes: [],
|
|
290
|
-
message: `授权失败: ${errors.join('; ')}
|
|
363
|
+
message: `授权失败: ${errors.join('; ')}`,
|
|
291
364
|
};
|
|
292
365
|
}
|
|
293
366
|
}
|
|
294
367
|
/**
|
|
295
368
|
* ✅ 使用 PancakeSwap 官方 Router 批量购买代币
|
|
296
369
|
*/
|
|
297
|
-
export async function
|
|
298
|
-
const {
|
|
370
|
+
export async function fourPancakeProxyBatchBuyMerkle(params) {
|
|
371
|
+
const { privateKeys, buyAmounts, tokenAddress, routeType, config } = params;
|
|
299
372
|
if (privateKeys.length === 0 || buyAmounts.length !== privateKeys.length) {
|
|
300
373
|
throw new Error('Private key count and buy amount count must match');
|
|
301
374
|
}
|
|
302
|
-
const
|
|
303
|
-
const
|
|
304
|
-
const buyers = privateKeys.map(k => new Wallet(k, provider));
|
|
305
|
-
const
|
|
306
|
-
const
|
|
375
|
+
const provider = createSignProvider(config.rpcUrl, 56, 'BSC');
|
|
376
|
+
const txType = getTxType(config);
|
|
377
|
+
const buyers = privateKeys.map((k) => new Wallet(k, provider));
|
|
378
|
+
const originalAmountsWei = buyAmounts.map((a) => ethers.parseEther(a));
|
|
379
|
+
const extractProfit = shouldExtractProfit();
|
|
380
|
+
const { totalProfit, remainingAmounts } = calculateBatchProfit(originalAmountsWei);
|
|
381
|
+
const actualAmountsWei = remainingAmounts;
|
|
307
382
|
const finalGasLimit = getGasLimit(config);
|
|
308
|
-
const
|
|
309
|
-
const
|
|
310
|
-
const
|
|
311
|
-
const
|
|
312
|
-
|
|
313
|
-
const nativeProfitAmount = shouldExtractProfitForBuy ? totalProfit : 0n;
|
|
314
|
-
let actualAmountsWei = remainingAmounts;
|
|
315
|
-
if (!useNativeToken && quoteTokenDecimals !== undefined && quoteTokenDecimals !== 18) {
|
|
316
|
-
const decimalsDiff = 18 - quoteTokenDecimals;
|
|
317
|
-
const divisor = BigInt(10 ** decimalsDiff);
|
|
318
|
-
actualAmountsWei = remainingAmounts.map(amount => amount / divisor);
|
|
319
|
-
}
|
|
320
|
-
const presetGasPrice = config.gasPrice;
|
|
321
|
-
const presetNonces = config.nonces;
|
|
322
|
-
const [gasPrice, tokenDecimals, nonces] = await Promise.all([
|
|
323
|
-
presetGasPrice !== undefined
|
|
324
|
-
? Promise.resolve(presetGasPrice)
|
|
325
|
-
: getOptimizedGasPrice(provider, getGasPriceConfig(config)),
|
|
383
|
+
const nonceManager = new NonceManager(provider);
|
|
384
|
+
const bribeAmount = getBribeAmount(config);
|
|
385
|
+
const needBribeTx = bribeAmount > 0n;
|
|
386
|
+
const [gasPrice, tokenDecimals] = await Promise.all([
|
|
387
|
+
getOptimizedGasPrice(provider, getGasPriceConfig(config)),
|
|
326
388
|
getTokenDecimals(tokenAddress, provider),
|
|
327
|
-
presetNonces && presetNonces.length === buyers.length
|
|
328
|
-
? Promise.resolve(presetNonces)
|
|
329
|
-
: allocateProfitAwareNonces(buyers, shouldExtractProfitForBuy, maxFundsIndex, nativeProfitAmount, nonceManager)
|
|
330
389
|
]);
|
|
331
|
-
|
|
332
|
-
const
|
|
390
|
+
// 计算 nonce 分配
|
|
391
|
+
const needProfitTx = extractProfit && totalProfit > 0n;
|
|
392
|
+
let buyer0NeedCount = 1;
|
|
393
|
+
if (needBribeTx)
|
|
394
|
+
buyer0NeedCount++;
|
|
395
|
+
if (needProfitTx)
|
|
396
|
+
buyer0NeedCount++;
|
|
397
|
+
const buyer0Nonces = await nonceManager.getNextNonceBatch(buyers[0], buyer0NeedCount);
|
|
398
|
+
let otherNonces = [];
|
|
399
|
+
if (buyers.length > 1) {
|
|
400
|
+
otherNonces = await nonceManager.getNextNoncesForWallets(buyers.slice(1));
|
|
401
|
+
}
|
|
402
|
+
let buyer0NonceIdx = 0;
|
|
403
|
+
const bribeNonce = needBribeTx ? buyer0Nonces[buyer0NonceIdx++] : undefined;
|
|
404
|
+
const buyer0BuyNonce = buyer0Nonces[buyer0NonceIdx++];
|
|
405
|
+
const profitNonce = needProfitTx ? buyer0Nonces[buyer0NonceIdx] : undefined;
|
|
406
|
+
const nonces = [buyer0BuyNonce, ...otherNonces];
|
|
407
|
+
// 计算 minOutputAmounts
|
|
408
|
+
let minOuts;
|
|
409
|
+
if (params.minOutputAmounts && params.minOutputAmounts.length === buyers.length) {
|
|
410
|
+
minOuts = params.minOutputAmounts.map((m) => (typeof m === 'string' ? ethers.parseUnits(m, tokenDecimals) : m));
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
minOuts = new Array(buyers.length).fill(0n);
|
|
414
|
+
}
|
|
415
|
+
const needBNB = needSendBNB(routeType, params);
|
|
333
416
|
// ✅ 使用官方 Router
|
|
334
417
|
let routers;
|
|
335
418
|
let unsignedBuys;
|
|
@@ -337,14 +420,14 @@ export async function pancakeProxyBatchBuyMerkle(params) {
|
|
|
337
420
|
if (!params.v2Path || params.v2Path.length < 2) {
|
|
338
421
|
throw new Error('v2Path is required for V2 routing');
|
|
339
422
|
}
|
|
340
|
-
routers = buyers.map(w => new Contract(PANCAKE_V2_ROUTER_ADDRESS, V2_ROUTER_ABI, w));
|
|
423
|
+
routers = buyers.map((w) => new Contract(PANCAKE_V2_ROUTER_ADDRESS, V2_ROUTER_ABI, w));
|
|
341
424
|
unsignedBuys = await buildV2Transactions(routers, buyers, actualAmountsWei, minOuts, params.v2Path, true, needBNB);
|
|
342
425
|
}
|
|
343
426
|
else if (routeType === 'v3-single') {
|
|
344
427
|
if (!params.v3TokenIn || !params.v3Fee) {
|
|
345
428
|
throw new Error('v3TokenIn and v3Fee are required for V3 single-hop');
|
|
346
429
|
}
|
|
347
|
-
routers = buyers.map(w => new Contract(PANCAKE_V3_ROUTER_ADDRESS, V3_ROUTER_ABI, w));
|
|
430
|
+
routers = buyers.map((w) => new Contract(PANCAKE_V3_ROUTER_ADDRESS, V3_ROUTER_ABI, w));
|
|
348
431
|
unsignedBuys = await buildV3SingleTransactions(routers, buyers, params.v3TokenIn, tokenAddress, params.v3Fee, actualAmountsWei, minOuts, true, needBNB);
|
|
349
432
|
}
|
|
350
433
|
else if (routeType === 'v3-multi') {
|
|
@@ -355,61 +438,53 @@ export async function pancakeProxyBatchBuyMerkle(params) {
|
|
|
355
438
|
if (!params.v3Fees || params.v3Fees.length !== params.v3Tokens.length - 1) {
|
|
356
439
|
throw new Error(`v3Fees 长度必须等于 v3Tokens 长度 - 1`);
|
|
357
440
|
}
|
|
358
|
-
routers = buyers.map(w => new Contract(PANCAKE_V3_ROUTER_ADDRESS, V3_ROUTER_ABI, w));
|
|
441
|
+
routers = buyers.map((w) => new Contract(PANCAKE_V3_ROUTER_ADDRESS, V3_ROUTER_ABI, w));
|
|
359
442
|
unsignedBuys = await buildV3MultiHopTransactions(routers, buyers, params.v3Tokens, params.v3Fees, actualAmountsWei, minOuts, true, needBNB);
|
|
360
443
|
}
|
|
361
444
|
else {
|
|
362
445
|
throw new Error(`Unsupported routeType: ${routeType}`);
|
|
363
446
|
}
|
|
364
|
-
|
|
365
|
-
const needBribeTx = bribeAmount > 0n && maxFundsIndex >= 0 && buyers.length > 0;
|
|
366
|
-
const txType = getTxType(config);
|
|
367
|
-
let bribeNonce;
|
|
368
|
-
const mutableNonces = [...nonces];
|
|
369
|
-
if (needBribeTx) {
|
|
370
|
-
bribeNonce = mutableNonces[maxFundsIndex];
|
|
371
|
-
mutableNonces[maxFundsIndex] = bribeNonce + 1;
|
|
372
|
-
}
|
|
447
|
+
// 签名交易
|
|
373
448
|
const signPromises = [];
|
|
449
|
+
// 贿赂交易
|
|
374
450
|
if (needBribeTx && bribeNonce !== undefined) {
|
|
375
|
-
signPromises.push(buyers[
|
|
451
|
+
signPromises.push(buyers[0].signTransaction({
|
|
376
452
|
to: BLOCKRAZOR_BUILDER_EOA,
|
|
377
453
|
value: bribeAmount,
|
|
378
454
|
nonce: bribeNonce,
|
|
379
455
|
gasPrice,
|
|
380
|
-
gasLimit:
|
|
381
|
-
chainId,
|
|
382
|
-
type: txType
|
|
456
|
+
gasLimit: 21000n,
|
|
457
|
+
chainId: 56,
|
|
458
|
+
type: txType,
|
|
383
459
|
}));
|
|
384
460
|
}
|
|
461
|
+
// 买入交易
|
|
385
462
|
unsignedBuys.forEach((unsigned, i) => {
|
|
386
|
-
const txValue = useNativeToken ? unsigned.value : 0n;
|
|
387
463
|
signPromises.push(buyers[i].signTransaction({
|
|
388
464
|
...unsigned,
|
|
389
465
|
from: buyers[i].address,
|
|
390
|
-
nonce:
|
|
466
|
+
nonce: nonces[i],
|
|
391
467
|
gasLimit: finalGasLimit,
|
|
392
468
|
gasPrice,
|
|
393
|
-
chainId,
|
|
469
|
+
chainId: 56,
|
|
394
470
|
type: txType,
|
|
395
|
-
value:
|
|
471
|
+
value: unsigned.value,
|
|
396
472
|
}));
|
|
397
473
|
});
|
|
398
474
|
const signedTxs = await Promise.all(signPromises);
|
|
399
475
|
// 利润多跳转账(强制 2 跳中转)
|
|
400
476
|
let profitHopWallets;
|
|
401
|
-
if (
|
|
402
|
-
const profitNonce = mutableNonces[maxFundsIndex] + 1;
|
|
477
|
+
if (extractProfit && totalProfit > 0n && profitNonce !== undefined) {
|
|
403
478
|
const profitHopResult = await buildProfitHopTransactions({
|
|
404
479
|
provider,
|
|
405
|
-
payerWallet: buyers[
|
|
406
|
-
profitAmount:
|
|
480
|
+
payerWallet: buyers[0],
|
|
481
|
+
profitAmount: totalProfit,
|
|
407
482
|
profitRecipient: getProfitRecipient(),
|
|
408
483
|
hopCount: PROFIT_HOP_COUNT,
|
|
409
484
|
gasPrice,
|
|
410
|
-
chainId,
|
|
485
|
+
chainId: 56,
|
|
411
486
|
txType,
|
|
412
|
-
startNonce: profitNonce
|
|
487
|
+
startNonce: profitNonce,
|
|
413
488
|
});
|
|
414
489
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
415
490
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -417,32 +492,30 @@ export async function pancakeProxyBatchBuyMerkle(params) {
|
|
|
417
492
|
nonceManager.clearTemp();
|
|
418
493
|
return {
|
|
419
494
|
signedTransactions: signedTxs,
|
|
420
|
-
profitHopWallets // ✅ 返回利润多跳钱包
|
|
495
|
+
profitHopWallets, // ✅ 返回利润多跳钱包
|
|
421
496
|
};
|
|
422
497
|
}
|
|
423
498
|
/**
|
|
424
499
|
* ✅ 使用 PancakeSwap 官方 Router 批量卖出代币
|
|
425
500
|
*/
|
|
426
|
-
export async function
|
|
427
|
-
const {
|
|
501
|
+
export async function fourPancakeProxyBatchSellMerkle(params) {
|
|
502
|
+
const { privateKeys, sellAmounts, tokenAddress, routeType, config } = params;
|
|
428
503
|
if (privateKeys.length === 0 || sellAmounts.length !== privateKeys.length) {
|
|
429
504
|
throw new Error('Private key count and sell amount count must match');
|
|
430
505
|
}
|
|
431
|
-
const
|
|
432
|
-
const
|
|
433
|
-
const sellers = privateKeys.map(k => new Wallet(k, provider));
|
|
506
|
+
const provider = createSignProvider(config.rpcUrl, 56, 'BSC');
|
|
507
|
+
const txType = getTxType(config);
|
|
508
|
+
const sellers = privateKeys.map((k) => new Wallet(k, provider));
|
|
434
509
|
const finalGasLimit = getGasLimit(config);
|
|
435
|
-
const extractProfit = shouldExtractProfit(config);
|
|
436
510
|
const nonceManager = new NonceManager(provider);
|
|
437
|
-
const
|
|
438
|
-
const
|
|
511
|
+
const extractProfit = shouldExtractProfit();
|
|
512
|
+
const bribeAmount = getBribeAmount(config);
|
|
513
|
+
const needBribeTx = bribeAmount > 0n;
|
|
439
514
|
const [gasPrice, tokenDecimals] = await Promise.all([
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
: getOptimizedGasPrice(provider, getGasPriceConfig(config)),
|
|
443
|
-
getTokenDecimals(tokenAddress, provider)
|
|
515
|
+
getOptimizedGasPrice(provider, getGasPriceConfig(config)),
|
|
516
|
+
getTokenDecimals(tokenAddress, provider),
|
|
444
517
|
]);
|
|
445
|
-
const amountsWei = sellAmounts.map(
|
|
518
|
+
const amountsWei = sellAmounts.map((a) => ethers.parseUnits(a, tokenDecimals));
|
|
446
519
|
// 获取报价
|
|
447
520
|
let quotedOutputs;
|
|
448
521
|
if (routeType === 'v2' && params.v2Path && params.v2Path.length >= 2) {
|
|
@@ -457,7 +530,7 @@ export async function pancakeProxyBatchSellMerkle(params) {
|
|
|
457
530
|
tokenOut: params.v3TokenOut,
|
|
458
531
|
amountIn: amount,
|
|
459
532
|
fee: params.v3Fee,
|
|
460
|
-
sqrtPriceLimitX96: 0
|
|
533
|
+
sqrtPriceLimitX96: 0,
|
|
461
534
|
});
|
|
462
535
|
return result[0];
|
|
463
536
|
}
|
|
@@ -466,85 +539,78 @@ export async function pancakeProxyBatchSellMerkle(params) {
|
|
|
466
539
|
}
|
|
467
540
|
}));
|
|
468
541
|
}
|
|
542
|
+
else if (routeType === 'v3-multi' && params.v2Path && params.v2Path.length >= 2) {
|
|
543
|
+
quotedOutputs = await batchGetV2Quotes(provider, amountsWei, params.v2Path);
|
|
544
|
+
}
|
|
469
545
|
else {
|
|
470
546
|
quotedOutputs = new Array(amountsWei.length).fill(0n);
|
|
471
547
|
}
|
|
472
548
|
const minOuts = new Array(sellers.length).fill(0n);
|
|
473
549
|
// 计算利润
|
|
474
550
|
let totalProfit = 0n;
|
|
475
|
-
let maxRevenueIndex =
|
|
551
|
+
let maxRevenueIndex = 0;
|
|
476
552
|
let maxRevenue = 0n;
|
|
477
553
|
if (extractProfit && quotedOutputs.length > 0) {
|
|
478
554
|
for (let i = 0; i < sellers.length; i++) {
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
const { profit } = calculateProfit(quoted, config);
|
|
555
|
+
if (quotedOutputs[i] > 0n) {
|
|
556
|
+
const { profit } = calculateProfit(quotedOutputs[i]);
|
|
482
557
|
totalProfit += profit;
|
|
483
|
-
if (
|
|
484
|
-
maxRevenue =
|
|
558
|
+
if (quotedOutputs[i] > maxRevenue) {
|
|
559
|
+
maxRevenue = quotedOutputs[i];
|
|
485
560
|
maxRevenueIndex = i;
|
|
486
561
|
}
|
|
487
562
|
}
|
|
488
563
|
}
|
|
489
564
|
}
|
|
490
|
-
|
|
491
|
-
const
|
|
492
|
-
const needProfitTx = extractProfit && totalProfit > 0n && maxRevenueIndex >= 0;
|
|
493
|
-
const maxRevenueNonceCount = 1 + (needBribeTx ? 1 : 0) + (needProfitTx ? 1 : 0);
|
|
565
|
+
// 分配 nonces
|
|
566
|
+
const needProfitTx = extractProfit && totalProfit > 0n && maxRevenue > 0n;
|
|
494
567
|
let nonces;
|
|
495
568
|
let bribeNonce;
|
|
496
569
|
let profitNonce;
|
|
497
|
-
if (
|
|
498
|
-
|
|
499
|
-
if (needBribeTx)
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
profitNonce = needProfitTx ? nonces[maxRevenueIndex] + 1 : undefined;
|
|
504
|
-
}
|
|
505
|
-
else if (maxRevenueNonceCount > 1 && maxRevenueIndex >= 0) {
|
|
570
|
+
if (needBribeTx || needProfitTx) {
|
|
571
|
+
let maxRevenueNonceCount = 1;
|
|
572
|
+
if (needBribeTx)
|
|
573
|
+
maxRevenueNonceCount++;
|
|
574
|
+
if (needProfitTx)
|
|
575
|
+
maxRevenueNonceCount++;
|
|
506
576
|
const maxRevenueNonces = await nonceManager.getNextNonceBatch(sellers[maxRevenueIndex], maxRevenueNonceCount);
|
|
507
577
|
const otherSellers = sellers.filter((_, i) => i !== maxRevenueIndex);
|
|
508
|
-
const otherNonces = otherSellers.length > 0
|
|
509
|
-
|
|
510
|
-
|
|
578
|
+
const otherNonces = otherSellers.length > 0 ? await nonceManager.getNextNoncesForWallets(otherSellers) : [];
|
|
579
|
+
let maxRevenueNonceIdx = 0;
|
|
580
|
+
bribeNonce = needBribeTx ? maxRevenueNonces[maxRevenueNonceIdx++] : undefined;
|
|
581
|
+
const maxRevenueSellNonce = maxRevenueNonces[maxRevenueNonceIdx++];
|
|
582
|
+
profitNonce = needProfitTx ? maxRevenueNonces[maxRevenueNonceIdx] : undefined;
|
|
511
583
|
nonces = [];
|
|
512
584
|
let otherIdx = 0;
|
|
513
|
-
let nonceIdx = 0;
|
|
514
|
-
if (needBribeTx) {
|
|
515
|
-
bribeNonce = maxRevenueNonces[nonceIdx++];
|
|
516
|
-
}
|
|
517
585
|
for (let i = 0; i < sellers.length; i++) {
|
|
518
586
|
if (i === maxRevenueIndex) {
|
|
519
|
-
nonces.push(
|
|
587
|
+
nonces.push(maxRevenueSellNonce);
|
|
520
588
|
}
|
|
521
589
|
else {
|
|
522
590
|
nonces.push(otherNonces[otherIdx++]);
|
|
523
591
|
}
|
|
524
592
|
}
|
|
525
|
-
if (needProfitTx) {
|
|
526
|
-
profitNonce = maxRevenueNonces[nonceIdx];
|
|
527
|
-
}
|
|
528
593
|
}
|
|
529
594
|
else {
|
|
530
595
|
nonces = await nonceManager.getNextNoncesForWallets(sellers);
|
|
531
596
|
}
|
|
532
597
|
// ✅ 使用官方 Router 构建卖出交易
|
|
598
|
+
const needBNB = false;
|
|
533
599
|
let routers;
|
|
534
600
|
let unsignedSells;
|
|
535
601
|
if (routeType === 'v2') {
|
|
536
602
|
if (!params.v2Path || params.v2Path.length < 2) {
|
|
537
603
|
throw new Error('v2Path is required for V2 routing');
|
|
538
604
|
}
|
|
539
|
-
routers = sellers.map(w => new Contract(PANCAKE_V2_ROUTER_ADDRESS, V2_ROUTER_ABI, w));
|
|
540
|
-
unsignedSells = await buildV2Transactions(routers, sellers, amountsWei, minOuts, params.v2Path, false,
|
|
605
|
+
routers = sellers.map((w) => new Contract(PANCAKE_V2_ROUTER_ADDRESS, V2_ROUTER_ABI, w));
|
|
606
|
+
unsignedSells = await buildV2Transactions(routers, sellers, amountsWei, minOuts, params.v2Path, false, needBNB);
|
|
541
607
|
}
|
|
542
608
|
else if (routeType === 'v3-single') {
|
|
543
609
|
if (!params.v3TokenOut || !params.v3Fee) {
|
|
544
610
|
throw new Error('v3TokenOut and v3Fee are required for V3 single-hop');
|
|
545
611
|
}
|
|
546
|
-
routers = sellers.map(w => new Contract(PANCAKE_V3_ROUTER_ADDRESS, V3_ROUTER_ABI, w));
|
|
547
|
-
unsignedSells = await buildV3SingleTransactions(routers, sellers, tokenAddress, params.v3TokenOut, params.v3Fee, amountsWei, minOuts, false,
|
|
612
|
+
routers = sellers.map((w) => new Contract(PANCAKE_V3_ROUTER_ADDRESS, V3_ROUTER_ABI, w));
|
|
613
|
+
unsignedSells = await buildV3SingleTransactions(routers, sellers, tokenAddress, params.v3TokenOut, params.v3Fee, amountsWei, minOuts, false, needBNB);
|
|
548
614
|
}
|
|
549
615
|
else if (routeType === 'v3-multi') {
|
|
550
616
|
// ✅ V3 多跳:需要 v3Tokens 和 v3Fees 参数
|
|
@@ -554,42 +620,43 @@ export async function pancakeProxyBatchSellMerkle(params) {
|
|
|
554
620
|
if (!params.v3Fees || params.v3Fees.length !== params.v3Tokens.length - 1) {
|
|
555
621
|
throw new Error(`v3Fees 长度必须等于 v3Tokens 长度 - 1`);
|
|
556
622
|
}
|
|
557
|
-
routers = sellers.map(w => new Contract(PANCAKE_V3_ROUTER_ADDRESS, V3_ROUTER_ABI, w));
|
|
558
|
-
unsignedSells = await buildV3MultiHopTransactions(routers, sellers, params.v3Tokens, params.v3Fees, amountsWei, minOuts, false,
|
|
623
|
+
routers = sellers.map((w) => new Contract(PANCAKE_V3_ROUTER_ADDRESS, V3_ROUTER_ABI, w));
|
|
624
|
+
unsignedSells = await buildV3MultiHopTransactions(routers, sellers, params.v3Tokens, params.v3Fees, amountsWei, minOuts, false, needBNB);
|
|
559
625
|
}
|
|
560
626
|
else {
|
|
561
627
|
throw new Error(`Unsupported routeType: ${routeType}`);
|
|
562
628
|
}
|
|
563
|
-
|
|
629
|
+
// 签名交易
|
|
564
630
|
const signPromises = [];
|
|
631
|
+
// 贿赂交易
|
|
565
632
|
if (needBribeTx && bribeNonce !== undefined) {
|
|
566
633
|
signPromises.push(sellers[maxRevenueIndex].signTransaction({
|
|
567
634
|
to: BLOCKRAZOR_BUILDER_EOA,
|
|
568
635
|
value: bribeAmount,
|
|
569
636
|
nonce: bribeNonce,
|
|
570
637
|
gasPrice,
|
|
571
|
-
gasLimit:
|
|
572
|
-
chainId,
|
|
573
|
-
type: txType
|
|
638
|
+
gasLimit: 21000n,
|
|
639
|
+
chainId: 56,
|
|
640
|
+
type: txType,
|
|
574
641
|
}));
|
|
575
642
|
}
|
|
643
|
+
// 卖出交易
|
|
576
644
|
unsignedSells.forEach((unsigned, i) => {
|
|
577
|
-
const txValue = unsigned.value ?? 0n;
|
|
578
645
|
signPromises.push(sellers[i].signTransaction({
|
|
579
646
|
...unsigned,
|
|
580
647
|
from: sellers[i].address,
|
|
581
648
|
nonce: nonces[i],
|
|
582
649
|
gasLimit: finalGasLimit,
|
|
583
650
|
gasPrice,
|
|
584
|
-
chainId,
|
|
651
|
+
chainId: 56,
|
|
585
652
|
type: txType,
|
|
586
|
-
value:
|
|
653
|
+
value: unsigned.value,
|
|
587
654
|
}));
|
|
588
655
|
});
|
|
589
656
|
const signedTxs = await Promise.all(signPromises);
|
|
590
657
|
// 利润多跳转账(强制 2 跳中转)
|
|
591
658
|
let profitHopWallets;
|
|
592
|
-
if (
|
|
659
|
+
if (extractProfit && totalProfit > 0n && profitNonce !== undefined) {
|
|
593
660
|
const profitHopResult = await buildProfitHopTransactions({
|
|
594
661
|
provider,
|
|
595
662
|
payerWallet: sellers[maxRevenueIndex],
|
|
@@ -597,9 +664,9 @@ export async function pancakeProxyBatchSellMerkle(params) {
|
|
|
597
664
|
profitRecipient: getProfitRecipient(),
|
|
598
665
|
hopCount: PROFIT_HOP_COUNT,
|
|
599
666
|
gasPrice,
|
|
600
|
-
chainId,
|
|
667
|
+
chainId: 56,
|
|
601
668
|
txType,
|
|
602
|
-
startNonce: profitNonce
|
|
669
|
+
startNonce: profitNonce,
|
|
603
670
|
});
|
|
604
671
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
605
672
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -607,95 +674,6 @@ export async function pancakeProxyBatchSellMerkle(params) {
|
|
|
607
674
|
nonceManager.clearTemp();
|
|
608
675
|
return {
|
|
609
676
|
signedTransactions: signedTxs,
|
|
610
|
-
profitHopWallets // ✅ 返回利润多跳钱包
|
|
677
|
+
profitHopWallets, // ✅ 返回利润多跳钱包
|
|
611
678
|
};
|
|
612
679
|
}
|
|
613
|
-
// ==================== 内部工具函数 ====================
|
|
614
|
-
/**
|
|
615
|
-
* ✅ 使用 Multicall3 批量获取 V2 报价
|
|
616
|
-
*/
|
|
617
|
-
async function batchGetV2Quotes(provider, amountsWei, v2Path) {
|
|
618
|
-
if (amountsWei.length === 0)
|
|
619
|
-
return [];
|
|
620
|
-
if (amountsWei.length === 1) {
|
|
621
|
-
try {
|
|
622
|
-
const v2Router = new Contract(PANCAKE_V2_ROUTER_ADDRESS, V2_ROUTER_ABI, provider);
|
|
623
|
-
const amounts = await v2Router.getAmountsOut(amountsWei[0], v2Path);
|
|
624
|
-
return [amounts[amounts.length - 1]];
|
|
625
|
-
}
|
|
626
|
-
catch {
|
|
627
|
-
return [0n];
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
try {
|
|
631
|
-
const v2RouterIface = new Interface(V2_ROUTER_ABI);
|
|
632
|
-
const multicall = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
|
|
633
|
-
const calls = amountsWei.map(amount => ({
|
|
634
|
-
target: PANCAKE_V2_ROUTER_ADDRESS,
|
|
635
|
-
allowFailure: true,
|
|
636
|
-
callData: v2RouterIface.encodeFunctionData('getAmountsOut', [amount, v2Path])
|
|
637
|
-
}));
|
|
638
|
-
const results = await multicall.aggregate3.staticCall(calls);
|
|
639
|
-
return results.map((r) => {
|
|
640
|
-
if (r.success && r.returnData && r.returnData !== '0x') {
|
|
641
|
-
try {
|
|
642
|
-
const decoded = v2RouterIface.decodeFunctionResult('getAmountsOut', r.returnData);
|
|
643
|
-
const amounts = decoded[0];
|
|
644
|
-
return amounts[amounts.length - 1];
|
|
645
|
-
}
|
|
646
|
-
catch {
|
|
647
|
-
return 0n;
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
return 0n;
|
|
651
|
-
});
|
|
652
|
-
}
|
|
653
|
-
catch {
|
|
654
|
-
return await Promise.all(amountsWei.map(async (amount) => {
|
|
655
|
-
try {
|
|
656
|
-
const v2Router = new Contract(PANCAKE_V2_ROUTER_ADDRESS, V2_ROUTER_ABI, provider);
|
|
657
|
-
const amounts = await v2Router.getAmountsOut(amount, v2Path);
|
|
658
|
-
return amounts[amounts.length - 1];
|
|
659
|
-
}
|
|
660
|
-
catch {
|
|
661
|
-
return 0n;
|
|
662
|
-
}
|
|
663
|
-
}));
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
function findMaxAmountIndex(amounts) {
|
|
667
|
-
if (!amounts.length) {
|
|
668
|
-
return -1;
|
|
669
|
-
}
|
|
670
|
-
let maxIndex = 0;
|
|
671
|
-
let maxValue = amounts[0];
|
|
672
|
-
for (let i = 1; i < amounts.length; i++) {
|
|
673
|
-
if (amounts[i] > maxValue) {
|
|
674
|
-
maxValue = amounts[i];
|
|
675
|
-
maxIndex = i;
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
return maxIndex;
|
|
679
|
-
}
|
|
680
|
-
async function allocateProfitAwareNonces(wallets, extractProfit, maxIndex, totalProfit, nonceManager) {
|
|
681
|
-
const needProfitTx = extractProfit && totalProfit > 0n && maxIndex >= 0 && maxIndex < wallets.length;
|
|
682
|
-
if (!needProfitTx) {
|
|
683
|
-
return await nonceManager.getNextNoncesForWallets(wallets);
|
|
684
|
-
}
|
|
685
|
-
const maxIndexNonces = await nonceManager.getNextNonceBatch(wallets[maxIndex], 2);
|
|
686
|
-
const otherWallets = wallets.filter((_, i) => i !== maxIndex);
|
|
687
|
-
const otherNonces = otherWallets.length > 0
|
|
688
|
-
? await nonceManager.getNextNoncesForWallets(otherWallets)
|
|
689
|
-
: [];
|
|
690
|
-
const nonces = [];
|
|
691
|
-
let otherIdx = 0;
|
|
692
|
-
for (let i = 0; i < wallets.length; i++) {
|
|
693
|
-
if (i === maxIndex) {
|
|
694
|
-
nonces.push(maxIndexNonces[0]);
|
|
695
|
-
}
|
|
696
|
-
else {
|
|
697
|
-
nonces.push(otherNonces[otherIdx++]);
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
return nonces;
|
|
701
|
-
}
|