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,159 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Four.meme 内盘捆绑换手(Merkle Bundle)
|
|
3
|
-
*
|
|
4
|
-
* 功能:钱包A卖出代币 → 钱包B买入相同数量 → 原子执行
|
|
5
3
|
*/
|
|
6
4
|
import { ethers, Contract, Wallet } from 'ethers';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
function getProfitRateBps(userType) {
|
|
15
|
-
if (userType === 'v0') {
|
|
16
|
-
return PROFIT_CONFIG.RATE_BPS_V0; // 0.06%
|
|
17
|
-
}
|
|
18
|
-
else if (userType === 'v1') {
|
|
19
|
-
return PROFIT_CONFIG.RATE_BPS_V1; // 0.05%
|
|
20
|
-
}
|
|
21
|
-
return PROFIT_CONFIG.RATE_BPS_V0; // 默认 0.06%
|
|
22
|
-
}
|
|
23
|
-
import { TM_ABI, HELPER3_ABI, TM_ADDRESS } from '../swap-internal.js';
|
|
24
|
-
import { getBribeAmount, getProfitRecipient } from '../config.js';
|
|
25
|
-
import { generateWallets } from '../../../../utils/wallet.js';
|
|
26
|
-
// ==================== 多跳转账常量(使用统一常量) ====================
|
|
27
|
-
const NATIVE_TRANSFER_GAS_LIMIT = GAS_LIMITS.NATIVE_TRANSFER;
|
|
28
|
-
const BRIBE_GAS_LIMIT = GAS_LIMITS.BRIBE;
|
|
29
|
-
hopWallets: Wallet[];
|
|
30
|
-
hopWalletsInfo: GeneratedWallet[];
|
|
31
|
-
;
|
|
32
|
-
/**
|
|
33
|
-
* 生成分发多跳路径
|
|
34
|
-
*/
|
|
35
|
-
function generateDisperseHopPaths(targetAddresses, hopCount, provider) {
|
|
36
|
-
if (hopCount <= 0) {
|
|
37
|
-
return targetAddresses.map(addr => ({
|
|
38
|
-
targetAddress: addr,
|
|
39
|
-
hopWallets: [],
|
|
40
|
-
hopWalletsInfo: []
|
|
41
|
-
}));
|
|
42
|
-
}
|
|
43
|
-
return targetAddresses.map(targetAddress => {
|
|
44
|
-
const hopWalletsInfo = generateWallets(hopCount);
|
|
45
|
-
const hopWallets = hopWalletsInfo.map(w => new Wallet(w.privateKey, provider));
|
|
46
|
-
return { targetAddress, hopWallets, hopWalletsInfo };
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* 构建原生代币多跳转账链
|
|
51
|
-
*/
|
|
52
|
-
async function buildNativeHopChain(payer, path, finalAmount, gasPrice, chainId, txType, payerNonce) {
|
|
53
|
-
const signedTxs = [];
|
|
54
|
-
const hopCount = path.hopWallets.length;
|
|
55
|
-
if (hopCount === 0) {
|
|
56
|
-
const tx = {
|
|
57
|
-
to: path.targetAddress,
|
|
58
|
-
value: finalAmount,
|
|
59
|
-
nonce: payerNonce,
|
|
60
|
-
gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
|
|
61
|
-
gasPrice,
|
|
62
|
-
chainId,
|
|
63
|
-
type: txType
|
|
64
|
-
};
|
|
65
|
-
signedTxs.push(await payer.signTransaction(tx));
|
|
66
|
-
return signedTxs;
|
|
67
|
-
}
|
|
68
|
-
const hopGasCost = NATIVE_TRANSFER_GAS_LIMIT * gasPrice;
|
|
69
|
-
// 计算每跳需要的金额
|
|
70
|
-
const amountsPerHop = [];
|
|
71
|
-
for (let i = 0; i < hopCount; i++) {
|
|
72
|
-
const remainingHops = hopCount - i;
|
|
73
|
-
amountsPerHop.push(finalAmount + hopGasCost * BigInt(remainingHops));
|
|
74
|
-
}
|
|
75
|
-
// payer → hop1
|
|
76
|
-
signedTxs.push(await payer.signTransaction({
|
|
77
|
-
to: path.hopWallets[0].address,
|
|
78
|
-
value: amountsPerHop[0],
|
|
79
|
-
nonce: payerNonce,
|
|
80
|
-
gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
|
|
81
|
-
gasPrice,
|
|
82
|
-
chainId,
|
|
83
|
-
type: txType
|
|
84
|
-
}));
|
|
85
|
-
// hop1 → hop2 → ... → target
|
|
86
|
-
for (let i = 0; i < hopCount; i++) {
|
|
87
|
-
const fromWallet = path.hopWallets[i];
|
|
88
|
-
const toAddress = i === hopCount - 1 ? path.targetAddress : path.hopWallets[i + 1].address;
|
|
89
|
-
const amount = i === hopCount - 1 ? finalAmount : amountsPerHop[i + 1];
|
|
90
|
-
signedTxs.push(await fromWallet.signTransaction({
|
|
91
|
-
to: toAddress,
|
|
92
|
-
value: amount,
|
|
93
|
-
nonce: 0,
|
|
94
|
-
gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
|
|
95
|
-
gasPrice,
|
|
96
|
-
chainId,
|
|
97
|
-
type: txType
|
|
98
|
-
}));
|
|
99
|
-
}
|
|
100
|
-
return signedTxs;
|
|
101
|
-
}
|
|
102
|
-
// ✅ 用户类型(影响利润率)
|
|
103
|
-
// ✅ 简化的签名配置
|
|
104
|
-
// ✅ Merkle 配置(保留兼容)
|
|
105
|
-
// ✅ 签名参数(不依赖 Merkle)
|
|
106
|
-
// ✅ Merkle 参数(保留兼容)
|
|
107
|
-
profitHopWallets ? : GeneratedWallet[]; // ✅ 利润多跳中间钱包
|
|
108
|
-
metadata ? : {
|
|
109
|
-
sellerAddress: string,
|
|
110
|
-
buyerAddress: string,
|
|
111
|
-
sellAmount: string,
|
|
112
|
-
buyAmount: string,
|
|
113
|
-
hasApproval: boolean, // 是否包含授权交易
|
|
114
|
-
profitAmount: string
|
|
115
|
-
};
|
|
116
|
-
;
|
|
5
|
+
import { countSellerNonceSlots, createFourSwapGasContext, fetchFourSwapSellQuoteAndAllowance, fetchFourSwapSellQuoteAllowanceAndBalances, getFourSwapProfitRateBps, needsTmTokenApproval, planSellerNonces, quoteFourSwapSellFunds, signTmMaxApprovalTx, } from './swap-sign-helpers.js';
|
|
6
|
+
import { generateDisperseHopPaths, buildNativeHopChain, NATIVE_TRANSFER_GAS_LIMIT } from './swap-hop-helpers.js';
|
|
7
|
+
import { signBribeTransaction } from '../sign-context-helpers.js';
|
|
8
|
+
import { calculateSellAmount } from '../../utils/swap-helpers.js';
|
|
9
|
+
import { NonceManager, getOptimizedGasPrice, getGasPriceConfig, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../utils/bundle-helpers.js';
|
|
10
|
+
import { getBribeAmount, getProfitRecipient } from '../config-helpers.js';
|
|
11
|
+
import { TM_ABI, TM_ADDRESS } from './swap-internal.js';
|
|
117
12
|
/**
|
|
118
13
|
* Four内盘捆绑换手
|
|
119
14
|
*/
|
|
120
15
|
export async function fourBundleSwapMerkle(params) {
|
|
121
|
-
const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKey, tokenAddress, config, startNonces // ✅ 可选:前端预获取的 nonces
|
|
16
|
+
const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKey, tokenAddress, config, startNonces, // ✅ 可选:前端预获取的 nonces
|
|
122
17
|
} = params;
|
|
123
|
-
const chainIdNum = config
|
|
124
|
-
const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
|
|
125
|
-
chainId: chainIdNum,
|
|
126
|
-
name: 'BSC'
|
|
127
|
-
});
|
|
18
|
+
const { chainIdNum, provider, bundleConfig, finalGasLimit, txType } = createFourSwapGasContext(config);
|
|
128
19
|
const seller = new Wallet(sellerPrivateKey, provider);
|
|
129
20
|
const buyer = new Wallet(buyerPrivateKey, provider);
|
|
130
21
|
const nonceManager = new NonceManager(provider);
|
|
131
|
-
// ✅ 创建适配的配置对象
|
|
132
|
-
const bundleConfig = {
|
|
133
|
-
minGasPriceGwei: config.minGasPriceGwei,
|
|
134
|
-
maxGasPriceGwei: config.maxGasPriceGwei,
|
|
135
|
-
gasLimit: typeof config.gasLimit === 'bigint' ? Number(config.gasLimit) : config.gasLimit,
|
|
136
|
-
gasLimitMultiplier: config.gasLimitMultiplier,
|
|
137
|
-
txType: config.txType,
|
|
138
|
-
chainId: config.chainId
|
|
139
|
-
};
|
|
140
|
-
const finalGasLimit = getGasLimit(bundleConfig);
|
|
141
|
-
const txType = getTxType(bundleConfig);
|
|
142
22
|
// ✅ 优化:第一批并行 - calculateSellAmount、gasPrice
|
|
143
23
|
const [sellAmountResult, gasPrice] = await Promise.all([
|
|
144
24
|
calculateSellAmount(provider, tokenAddress, seller.address, sellAmount, sellPercentage),
|
|
145
|
-
getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig))
|
|
25
|
+
getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig)),
|
|
146
26
|
]);
|
|
147
27
|
const { amount: sellAmountWei, decimals } = sellAmountResult;
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
const [sellQuote, currentAllowance, buyerBalance] = await Promise.all([
|
|
152
|
-
helper3.trySell(tokenAddress, sellAmountWei),
|
|
153
|
-
erc20Contract.allowance(seller.address, TM_ADDRESS),
|
|
154
|
-
provider.getBalance(buyer.address)
|
|
28
|
+
const [{ sellFunds: sellerWillGetBNB, allowance: currentAllowance }, buyerBalance] = await Promise.all([
|
|
29
|
+
fetchFourSwapSellQuoteAndAllowance(provider, tokenAddress, seller.address, sellAmountWei),
|
|
30
|
+
provider.getBalance(buyer.address),
|
|
155
31
|
]);
|
|
156
|
-
const sellerWillGetBNB = sellQuote.funds;
|
|
157
32
|
const buyerFunds = sellerWillGetBNB;
|
|
158
33
|
// 验证买方余额
|
|
159
34
|
const reserveGas = ethers.parseEther((config.reserveGasBNB || 0.0005).toString());
|
|
@@ -164,28 +39,18 @@ export async function fourBundleSwapMerkle(params) {
|
|
|
164
39
|
` - 实际: ${ethers.formatEther(buyerBalance)} BNB`);
|
|
165
40
|
}
|
|
166
41
|
// 检查是否需要授权
|
|
167
|
-
const
|
|
168
|
-
const needApproval = currentAllowance < APPROVAL_THRESHOLD;
|
|
42
|
+
const needApproval = needsTmTokenApproval(currentAllowance, decimals);
|
|
169
43
|
// 利润配置
|
|
170
44
|
const extractProfit = true;
|
|
171
|
-
const profitRateBps =
|
|
172
|
-
const profitAmount = extractProfit && sellerWillGetBNB > 0n
|
|
173
|
-
? (sellerWillGetBNB * BigInt(profitRateBps)) / 10000n
|
|
174
|
-
: 0n;
|
|
45
|
+
const profitRateBps = getFourSwapProfitRateBps(config.userType);
|
|
46
|
+
const profitAmount = extractProfit && sellerWillGetBNB > 0n ? (sellerWillGetBNB * BigInt(profitRateBps)) / 10000n : 0n;
|
|
175
47
|
// ✅ 获取贿赂金额
|
|
176
48
|
const bribeAmount = getBribeAmount(config);
|
|
177
49
|
const needBribeTx = bribeAmount > 0n;
|
|
178
50
|
// ✅ 优化:第三批并行 - 构建交易、获取 nonces
|
|
179
51
|
const tmSeller = new Contract(TM_ADDRESS, TM_ABI, seller);
|
|
180
52
|
const tmBuyer = new Contract(TM_ADDRESS, TM_ABI, buyer);
|
|
181
|
-
|
|
182
|
-
let sellerNonceCount = 1; // 卖出交易
|
|
183
|
-
if (needBribeTx)
|
|
184
|
-
sellerNonceCount++; // 贿赂交易
|
|
185
|
-
if (needApproval)
|
|
186
|
-
sellerNonceCount++; // 授权交易
|
|
187
|
-
if (extractProfit)
|
|
188
|
-
sellerNonceCount++; // 利润交易
|
|
53
|
+
const sellerNonceCount = countSellerNonceSlots(needBribeTx, needApproval, extractProfit);
|
|
189
54
|
// ✅ 优化:使用批量 nonce 获取(JSON-RPC 批量请求)
|
|
190
55
|
// 如果前端传入了 startNonces,直接使用;否则从链上获取
|
|
191
56
|
const [sellUnsigned, buyUnsigned, noncesResult] = await Promise.all([
|
|
@@ -203,57 +68,25 @@ export async function fourBundleSwapMerkle(params) {
|
|
|
203
68
|
const sellerNonces = Array.from({ length: sellerNonceCount }, (_, i) => initialNonces[0] + i);
|
|
204
69
|
const buyerNonce = initialNonces[1];
|
|
205
70
|
return { sellerNonces, buyerNonce };
|
|
206
|
-
})()
|
|
71
|
+
})(),
|
|
207
72
|
]);
|
|
208
73
|
const { sellerNonces, buyerNonce } = noncesResult;
|
|
209
|
-
|
|
210
|
-
let idx = 0;
|
|
211
|
-
let bribeNonce;
|
|
212
|
-
let approvalNonce;
|
|
213
|
-
if (needBribeTx)
|
|
214
|
-
bribeNonce = sellerNonces[idx++];
|
|
215
|
-
if (needApproval)
|
|
216
|
-
approvalNonce = sellerNonces[idx++];
|
|
217
|
-
const sellerNonce = sellerNonces[idx++];
|
|
218
|
-
const profitNonce = extractProfit ? sellerNonces[idx] : undefined;
|
|
219
|
-
// ✅ 并行签名所有交易
|
|
74
|
+
const noncePlan = planSellerNonces(sellerNonces, needBribeTx, needApproval, extractProfit);
|
|
220
75
|
const signPromises = [];
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
signPromises.push(seller.signTransaction({
|
|
224
|
-
to: BLOCKRAZOR_BUILDER_EOA,
|
|
225
|
-
value: bribeAmount,
|
|
226
|
-
nonce: bribeNonce,
|
|
227
|
-
gasPrice,
|
|
228
|
-
gasLimit: BRIBE_GAS_LIMIT,
|
|
229
|
-
chainId: chainIdNum,
|
|
230
|
-
type: txType
|
|
231
|
-
}));
|
|
76
|
+
if (needBribeTx && noncePlan.bribeNonce !== undefined) {
|
|
77
|
+
signPromises.push(signBribeTransaction(seller, bribeAmount, noncePlan.bribeNonce, gasPrice, chainIdNum, txType));
|
|
232
78
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
const approveInterface = new ethers.Interface(['function approve(address,uint256) returns (bool)']);
|
|
236
|
-
const approveData = approveInterface.encodeFunctionData('approve', [TM_ADDRESS, ethers.MaxUint256]);
|
|
237
|
-
signPromises.push(seller.signTransaction({
|
|
238
|
-
to: tokenAddress,
|
|
239
|
-
data: approveData,
|
|
240
|
-
value: 0n,
|
|
241
|
-
nonce: approvalNonce,
|
|
242
|
-
gasLimit: 80000n,
|
|
243
|
-
gasPrice,
|
|
244
|
-
chainId: chainIdNum,
|
|
245
|
-
type: txType
|
|
246
|
-
}));
|
|
79
|
+
if (needApproval && noncePlan.approvalNonce !== undefined) {
|
|
80
|
+
signPromises.push(signTmMaxApprovalTx(seller, tokenAddress, noncePlan.approvalNonce, gasPrice, chainIdNum, txType));
|
|
247
81
|
}
|
|
248
|
-
// 卖出和买入交易
|
|
249
82
|
signPromises.push(seller.signTransaction({
|
|
250
83
|
...sellUnsigned,
|
|
251
84
|
from: seller.address,
|
|
252
|
-
nonce: sellerNonce,
|
|
85
|
+
nonce: noncePlan.sellerNonce,
|
|
253
86
|
gasLimit: finalGasLimit,
|
|
254
87
|
gasPrice,
|
|
255
88
|
chainId: chainIdNum,
|
|
256
|
-
type: txType
|
|
89
|
+
type: txType,
|
|
257
90
|
}), buyer.signTransaction({
|
|
258
91
|
...buyUnsigned,
|
|
259
92
|
from: buyer.address,
|
|
@@ -262,10 +95,9 @@ export async function fourBundleSwapMerkle(params) {
|
|
|
262
95
|
gasPrice,
|
|
263
96
|
chainId: chainIdNum,
|
|
264
97
|
type: txType,
|
|
265
|
-
value: buyerFunds
|
|
98
|
+
value: buyerFunds,
|
|
266
99
|
}));
|
|
267
100
|
const signedTxs = await Promise.all(signPromises);
|
|
268
|
-
// 解析签名结果
|
|
269
101
|
let signIdx = 0;
|
|
270
102
|
let bribeTx = null;
|
|
271
103
|
let approvalTx = null;
|
|
@@ -274,7 +106,8 @@ export async function fourBundleSwapMerkle(params) {
|
|
|
274
106
|
if (needApproval)
|
|
275
107
|
approvalTx = signedTxs[signIdx++];
|
|
276
108
|
const signedSell = signedTxs[signIdx++];
|
|
277
|
-
const signedBuy = signedTxs[signIdx
|
|
109
|
+
const signedBuy = signedTxs[signIdx];
|
|
110
|
+
const profitNonce = noncePlan.profitNonce;
|
|
278
111
|
nonceManager.clearTemp();
|
|
279
112
|
// ✅ 组装交易列表:贿赂 → 授权 → 卖出 → 买入
|
|
280
113
|
const allTransactions = [];
|
|
@@ -295,7 +128,7 @@ export async function fourBundleSwapMerkle(params) {
|
|
|
295
128
|
gasPrice,
|
|
296
129
|
chainId: chainIdNum,
|
|
297
130
|
txType,
|
|
298
|
-
startNonce: profitNonce
|
|
131
|
+
startNonce: profitNonce,
|
|
299
132
|
});
|
|
300
133
|
allTransactions.push(...profitHopResult.signedTransactions);
|
|
301
134
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -309,37 +142,16 @@ export async function fourBundleSwapMerkle(params) {
|
|
|
309
142
|
sellAmount: ethers.formatUnits(sellAmountWei, decimals),
|
|
310
143
|
buyAmount: ethers.formatEther(buyerFunds),
|
|
311
144
|
hasApproval: !!approvalTx,
|
|
312
|
-
profitAmount: extractProfit ? ethers.formatEther(profitAmount) : undefined
|
|
313
|
-
}
|
|
145
|
+
profitAmount: extractProfit ? ethers.formatEther(profitAmount) : undefined,
|
|
146
|
+
},
|
|
314
147
|
};
|
|
315
148
|
}
|
|
316
149
|
// ==================== 批量换手(一卖多买)====================
|
|
317
|
-
sellAmount ? : string; // 卖出数量
|
|
318
|
-
sellPercentage ? : number; // 卖出比例(0-100)
|
|
319
|
-
buyerPrivateKeys: string[]; // 买方私钥数组(子钱包)
|
|
320
|
-
buyerRatios ? : number[]; // 每个买方的分配比例(如 [0.3, 0.5, 0.2])
|
|
321
|
-
tokenAddress: string; // 代币地址
|
|
322
|
-
config: FourSwapSignConfig; // 配置
|
|
323
|
-
// ✅ 可选:前端预获取的 nonces(性能优化)
|
|
324
|
-
// 顺序:[sellerNonce, buyer1Nonce, buyer2Nonce, ...]
|
|
325
|
-
startNonces ? : number[];
|
|
326
|
-
profitHopWallets ? : GeneratedWallet[]; // ✅ 利润多跳中间钱包
|
|
327
|
-
metadata ? : {
|
|
328
|
-
sellerAddress: string,
|
|
329
|
-
buyerAddresses: string[],
|
|
330
|
-
sellAmount: string,
|
|
331
|
-
buyAmounts: string[],
|
|
332
|
-
hasApproval: boolean,
|
|
333
|
-
profitAmount: string
|
|
334
|
-
};
|
|
335
150
|
/**
|
|
336
151
|
* Four 内盘批量换手(一卖多买)
|
|
337
|
-
*
|
|
338
|
-
* 功能:主钱包一次卖出 → 多个子钱包同时买入 → 在同一个区块中完成
|
|
339
|
-
* 限制:最多 24 个买方(服务器限制 25 笔交易,包含 1 笔利润交易)
|
|
340
152
|
*/
|
|
341
153
|
export async function fourBatchSwapMerkle(params) {
|
|
342
|
-
const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKeys, tokenAddress, config, startNonces // ✅ 可选:前端预获取的 nonces
|
|
154
|
+
const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKeys, tokenAddress, config, startNonces, // ✅ 可选:前端预获取的 nonces
|
|
343
155
|
} = params;
|
|
344
156
|
// ✅ 校验买方数量(最多 24 个)
|
|
345
157
|
const MAX_BUYERS = 24;
|
|
@@ -349,45 +161,22 @@ export async function fourBatchSwapMerkle(params) {
|
|
|
349
161
|
if (buyerPrivateKeys.length > MAX_BUYERS) {
|
|
350
162
|
throw new Error(`买方钱包数量超过限制: ${buyerPrivateKeys.length} > ${MAX_BUYERS}`);
|
|
351
163
|
}
|
|
352
|
-
const chainIdNum = config
|
|
353
|
-
const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
|
|
354
|
-
chainId: chainIdNum,
|
|
355
|
-
name: 'BSC'
|
|
356
|
-
});
|
|
164
|
+
const { chainIdNum, provider, bundleConfig, finalGasLimit, txType } = createFourSwapGasContext(config);
|
|
357
165
|
const seller = new Wallet(sellerPrivateKey, provider);
|
|
358
|
-
const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, provider));
|
|
166
|
+
const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, provider));
|
|
359
167
|
const nonceManager = new NonceManager(provider);
|
|
360
|
-
// 创建适配的配置对象
|
|
361
|
-
const bundleConfig = {
|
|
362
|
-
minGasPriceGwei: config.minGasPriceGwei,
|
|
363
|
-
maxGasPriceGwei: config.maxGasPriceGwei,
|
|
364
|
-
gasLimit: typeof config.gasLimit === 'bigint' ? Number(config.gasLimit) : config.gasLimit,
|
|
365
|
-
gasLimitMultiplier: config.gasLimitMultiplier,
|
|
366
|
-
txType: config.txType,
|
|
367
|
-
chainId: config.chainId
|
|
368
|
-
};
|
|
369
|
-
const finalGasLimit = getGasLimit(bundleConfig);
|
|
370
|
-
const txType = getTxType(bundleConfig);
|
|
371
168
|
// ✅ 并行获取:卖出数量、gasPrice
|
|
372
169
|
const [sellAmountResult, gasPrice] = await Promise.all([
|
|
373
170
|
calculateSellAmount(provider, tokenAddress, seller.address, sellAmount, sellPercentage),
|
|
374
|
-
getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig))
|
|
171
|
+
getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig)),
|
|
375
172
|
]);
|
|
376
173
|
const { amount: sellAmountWei, decimals } = sellAmountResult;
|
|
377
|
-
|
|
378
|
-
const helper3 = new Contract(ADDRESSES.BSC.TokenManagerHelper3, HELPER3_ABI, provider);
|
|
379
|
-
const erc20Contract = new Contract(tokenAddress, ['function allowance(address,address) view returns (uint256)'], provider);
|
|
380
|
-
const [sellQuote, currentAllowance, ...buyerBalances] = await Promise.all([
|
|
381
|
-
helper3.trySell(tokenAddress, sellAmountWei),
|
|
382
|
-
erc20Contract.allowance(seller.address, TM_ADDRESS),
|
|
383
|
-
...buyers.map(buyer => provider.getBalance(buyer.address))
|
|
384
|
-
]);
|
|
385
|
-
const totalBuyerFunds = sellQuote.funds;
|
|
174
|
+
const { sellFunds: totalBuyerFunds, allowance: currentAllowance, buyerBalances, } = await fetchFourSwapSellQuoteAllowanceAndBalances(provider, tokenAddress, seller.address, sellAmountWei, buyers.map((b) => b.address));
|
|
386
175
|
// ✅ 计算每个买方的买入金额(按比例分配)
|
|
387
176
|
let buyAmountsWei;
|
|
388
177
|
if (params.buyerRatios && params.buyerRatios.length === buyers.length) {
|
|
389
178
|
// 按比例分配
|
|
390
|
-
buyAmountsWei = params.buyerRatios.map((ratio
|
|
179
|
+
buyAmountsWei = params.buyerRatios.map((ratio) => {
|
|
391
180
|
const amount = (totalBuyerFunds * BigInt(Math.round(ratio * 10000))) / 10000n;
|
|
392
181
|
return amount;
|
|
393
182
|
});
|
|
@@ -406,13 +195,10 @@ export async function fourBatchSwapMerkle(params) {
|
|
|
406
195
|
}
|
|
407
196
|
});
|
|
408
197
|
// 检查是否需要授权
|
|
409
|
-
const
|
|
410
|
-
const needApproval = currentAllowance < APPROVAL_THRESHOLD;
|
|
198
|
+
const needApproval = needsTmTokenApproval(currentAllowance, decimals);
|
|
411
199
|
// 利润配置
|
|
412
|
-
const profitRateBps =
|
|
413
|
-
const profitAmount = totalBuyerFunds > 0n
|
|
414
|
-
? (totalBuyerFunds * BigInt(profitRateBps)) / 10000n
|
|
415
|
-
: 0n;
|
|
200
|
+
const profitRateBps = getFourSwapProfitRateBps(config.userType);
|
|
201
|
+
const profitAmount = totalBuyerFunds > 0n ? (totalBuyerFunds * BigInt(profitRateBps)) / 10000n : 0n;
|
|
416
202
|
// ✅ 获取贿赂金额
|
|
417
203
|
const bribeAmount = getBribeAmount(config);
|
|
418
204
|
const needBribeTx = bribeAmount > 0n;
|
|
@@ -425,17 +211,12 @@ export async function fourBatchSwapMerkle(params) {
|
|
|
425
211
|
...buyers.map((buyer, i) => {
|
|
426
212
|
const tmBuyer = new Contract(TM_ADDRESS, TM_ABI, buyer);
|
|
427
213
|
const buyAmount = buyAmountsWei[i];
|
|
428
|
-
return tmBuyer.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyer.address, buyAmount, 0n, {
|
|
429
|
-
|
|
214
|
+
return tmBuyer.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyer.address, buyAmount, 0n, {
|
|
215
|
+
value: buyAmount,
|
|
216
|
+
});
|
|
217
|
+
}),
|
|
430
218
|
]);
|
|
431
|
-
|
|
432
|
-
// seller 需要的 nonce 数量
|
|
433
|
-
let sellerNonceCount = 1; // 卖出交易
|
|
434
|
-
if (needBribeTx)
|
|
435
|
-
sellerNonceCount++; // 贿赂交易
|
|
436
|
-
if (needApproval)
|
|
437
|
-
sellerNonceCount++; // 授权交易
|
|
438
|
-
sellerNonceCount++; // 利润交易
|
|
219
|
+
const sellerNonceCount = countSellerNonceSlots(needBribeTx, needApproval, true);
|
|
439
220
|
// ✅ 如果前端传入了 startNonces,直接使用(性能优化)
|
|
440
221
|
// 否则从链上获取
|
|
441
222
|
const allWallets = [seller, ...buyers];
|
|
@@ -444,55 +225,24 @@ export async function fourBatchSwapMerkle(params) {
|
|
|
444
225
|
: await nonceManager.getNextNoncesForWallets(allWallets);
|
|
445
226
|
// 分配 seller nonces
|
|
446
227
|
const sellerNonces = Array.from({ length: sellerNonceCount }, (_, i) => initialNonces[0] + i);
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
let approvalNonce;
|
|
450
|
-
if (needBribeTx)
|
|
451
|
-
bribeNonce = sellerNonces[idx++];
|
|
452
|
-
if (needApproval)
|
|
453
|
-
approvalNonce = sellerNonces[idx++];
|
|
454
|
-
const sellerNonce = sellerNonces[idx++];
|
|
455
|
-
const profitNonce = sellerNonces[idx];
|
|
456
|
-
// buyer nonces
|
|
228
|
+
const noncePlan = planSellerNonces(sellerNonces, needBribeTx, needApproval, true);
|
|
229
|
+
const profitNonce = noncePlan.profitNonce;
|
|
457
230
|
const buyerNonces = initialNonces.slice(1);
|
|
458
|
-
// ✅ 并行签名所有交易
|
|
459
231
|
const signPromises = [];
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
signPromises.push(seller.signTransaction({
|
|
463
|
-
to: BLOCKRAZOR_BUILDER_EOA,
|
|
464
|
-
value: bribeAmount,
|
|
465
|
-
nonce: bribeNonce,
|
|
466
|
-
gasPrice,
|
|
467
|
-
gasLimit: BRIBE_GAS_LIMIT,
|
|
468
|
-
chainId: chainIdNum,
|
|
469
|
-
type: txType
|
|
470
|
-
}));
|
|
232
|
+
if (needBribeTx && noncePlan.bribeNonce !== undefined) {
|
|
233
|
+
signPromises.push(signBribeTransaction(seller, bribeAmount, noncePlan.bribeNonce, gasPrice, chainIdNum, txType));
|
|
471
234
|
}
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
const approveInterface = new ethers.Interface(['function approve(address,uint256) returns (bool)']);
|
|
475
|
-
const approveData = approveInterface.encodeFunctionData('approve', [TM_ADDRESS, ethers.MaxUint256]);
|
|
476
|
-
signPromises.push(seller.signTransaction({
|
|
477
|
-
to: tokenAddress,
|
|
478
|
-
data: approveData,
|
|
479
|
-
value: 0n,
|
|
480
|
-
nonce: approvalNonce,
|
|
481
|
-
gasLimit: 80000n,
|
|
482
|
-
gasPrice,
|
|
483
|
-
chainId: chainIdNum,
|
|
484
|
-
type: txType
|
|
485
|
-
}));
|
|
235
|
+
if (needApproval && noncePlan.approvalNonce !== undefined) {
|
|
236
|
+
signPromises.push(signTmMaxApprovalTx(seller, tokenAddress, noncePlan.approvalNonce, gasPrice, chainIdNum, txType));
|
|
486
237
|
}
|
|
487
|
-
// 卖出交易
|
|
488
238
|
signPromises.push(seller.signTransaction({
|
|
489
239
|
...sellUnsigned,
|
|
490
240
|
from: seller.address,
|
|
491
|
-
nonce: sellerNonce,
|
|
241
|
+
nonce: noncePlan.sellerNonce,
|
|
492
242
|
gasLimit: finalGasLimit,
|
|
493
243
|
gasPrice,
|
|
494
244
|
chainId: chainIdNum,
|
|
495
|
-
type: txType
|
|
245
|
+
type: txType,
|
|
496
246
|
}));
|
|
497
247
|
// 所有买入交易
|
|
498
248
|
buyers.forEach((buyer, i) => {
|
|
@@ -504,7 +254,7 @@ export async function fourBatchSwapMerkle(params) {
|
|
|
504
254
|
gasPrice,
|
|
505
255
|
chainId: chainIdNum,
|
|
506
256
|
type: txType,
|
|
507
|
-
value: buyAmountsWei[i]
|
|
257
|
+
value: buyAmountsWei[i],
|
|
508
258
|
}));
|
|
509
259
|
});
|
|
510
260
|
const signedTxs = await Promise.all(signPromises);
|
|
@@ -539,7 +289,7 @@ export async function fourBatchSwapMerkle(params) {
|
|
|
539
289
|
gasPrice,
|
|
540
290
|
chainId: chainIdNum,
|
|
541
291
|
txType,
|
|
542
|
-
startNonce: profitNonce
|
|
292
|
+
startNonce: profitNonce,
|
|
543
293
|
});
|
|
544
294
|
signedTransactions.push(...profitHopResult.signedTransactions);
|
|
545
295
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -549,54 +299,21 @@ export async function fourBatchSwapMerkle(params) {
|
|
|
549
299
|
profitHopWallets, // ✅ 导出利润多跳钱包
|
|
550
300
|
metadata: {
|
|
551
301
|
sellerAddress: seller.address,
|
|
552
|
-
buyerAddresses: buyers.map(b => b.address),
|
|
302
|
+
buyerAddresses: buyers.map((b) => b.address),
|
|
553
303
|
sellAmount: ethers.formatUnits(sellAmountWei, decimals),
|
|
554
|
-
buyAmounts: buyAmountsWei.map(amt => ethers.formatEther(amt)),
|
|
304
|
+
buyAmounts: buyAmountsWei.map((amt) => ethers.formatEther(amt)),
|
|
555
305
|
hasApproval: !!approvalTx,
|
|
556
|
-
profitAmount: ethers.formatEther(profitAmount)
|
|
557
|
-
}
|
|
306
|
+
profitAmount: ethers.formatEther(profitAmount),
|
|
307
|
+
},
|
|
558
308
|
};
|
|
559
309
|
}
|
|
560
310
|
// ==================== 快捷批量换手(资金利用率模式)====================
|
|
561
|
-
sellAmount ? : string; // 卖出数量
|
|
562
|
-
sellPercentage ? : number; // 卖出比例(0-100)
|
|
563
|
-
buyerPrivateKeys: string[]; // 买方私钥数组(子钱包)
|
|
564
|
-
buyerRatios ? : number[]; // 每个买方的分配比例(如 [0.3, 0.5, 0.2])
|
|
565
|
-
buyerAmounts ? : string[]; // 每个买方的固定金额(BNB)
|
|
566
|
-
tokenAddress: string; // 代币地址
|
|
567
|
-
config: FourSwapSignConfig; // 配置
|
|
568
|
-
// ✅ 转账多跳配置(可选)
|
|
569
|
-
disperseHopCount ? : number; // 转账多跳数(0=直接转账,1=1跳,2=2跳...)
|
|
570
|
-
// ✅ 可选:前端预获取的 nonces(性能优化)
|
|
571
|
-
// 顺序:[sellerNonce, buyer1Nonce, buyer2Nonce, ...]
|
|
572
|
-
startNonces ? : number[];
|
|
573
|
-
disperseHopWallets ? : GeneratedWallet[]; // ✅ 转账多跳中间钱包
|
|
574
|
-
profitHopWallets ? : GeneratedWallet[]; // ✅ 利润多跳中间钱包
|
|
575
|
-
metadata ? : {
|
|
576
|
-
sellerAddress: string,
|
|
577
|
-
buyerAddresses: string[],
|
|
578
|
-
sellAmount: string,
|
|
579
|
-
estimatedBNBOut: string,
|
|
580
|
-
transferAmounts: string[],
|
|
581
|
-
profitAmount: string,
|
|
582
|
-
disperseHopCount: number
|
|
583
|
-
};
|
|
584
311
|
/**
|
|
585
312
|
* Four 内盘快捷批量换手(资金利用率模式)
|
|
586
|
-
*
|
|
587
|
-
* 流程:[贿赂] → [卖出] → [转账多跳...] → [买入1, 买入2, ...] → [利润]
|
|
588
|
-
*
|
|
589
|
-
* 特点:
|
|
590
|
-
* - 子钱包不需要预先有 BNB
|
|
591
|
-
* - 资金来自主钱包卖出代币所得
|
|
592
|
-
* - 提升资金利用率
|
|
593
|
-
* - ✅ 支持转账多跳,隐藏资金流向
|
|
594
|
-
*
|
|
595
|
-
* 限制:根据多跳数动态计算最大买方数量
|
|
596
313
|
*/
|
|
597
314
|
export async function fourQuickBatchSwapMerkle(params) {
|
|
598
315
|
const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKeys, buyerRatios, buyerAmounts, tokenAddress, config, disperseHopCount = 0, // ✅ 转账多跳数(默认0=直接转账)
|
|
599
|
-
startNonces // ✅ 可选:前端预获取的 nonces
|
|
316
|
+
startNonces, // ✅ 可选:前端预获取的 nonces
|
|
600
317
|
} = params;
|
|
601
318
|
// ✅ 动态计算最大买方数量(根据多跳数)
|
|
602
319
|
// 固定开销: 贿赂(1) + 卖出(1) + 利润多跳(PROFIT_HOP_COUNT + 1)
|
|
@@ -605,7 +322,6 @@ export async function fourQuickBatchSwapMerkle(params) {
|
|
|
605
322
|
const maxTxs = 50 - fixedOverhead;
|
|
606
323
|
let MAX_BUYERS = Math.floor(maxTxs / (disperseHopCount + 2));
|
|
607
324
|
MAX_BUYERS = Math.max(1, MAX_BUYERS);
|
|
608
|
-
console.log(`[fourQuickBatchSwapMerkle] 多跳数: ${disperseHopCount}, 最大买方数: ${MAX_BUYERS}`);
|
|
609
325
|
if (buyerPrivateKeys.length === 0) {
|
|
610
326
|
throw new Error('至少需要一个买方钱包');
|
|
611
327
|
}
|
|
@@ -622,48 +338,26 @@ export async function fourQuickBatchSwapMerkle(params) {
|
|
|
622
338
|
if (buyerAmounts && buyerAmounts.length !== buyerPrivateKeys.length) {
|
|
623
339
|
throw new Error(`buyerAmounts 长度 (${buyerAmounts.length}) 与 buyerPrivateKeys 长度 (${buyerPrivateKeys.length}) 不匹配`);
|
|
624
340
|
}
|
|
625
|
-
const chainIdNum = config
|
|
626
|
-
const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
|
|
627
|
-
chainId: chainIdNum,
|
|
628
|
-
name: 'BSC'
|
|
629
|
-
});
|
|
341
|
+
const { chainIdNum, provider, bundleConfig, finalGasLimit, txType } = createFourSwapGasContext(config);
|
|
630
342
|
const seller = new Wallet(sellerPrivateKey, provider);
|
|
631
|
-
const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, provider));
|
|
343
|
+
const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, provider));
|
|
632
344
|
const nonceManager = new NonceManager(provider);
|
|
633
|
-
// 创建适配的配置对象
|
|
634
|
-
const bundleConfig = {
|
|
635
|
-
minGasPriceGwei: config.minGasPriceGwei,
|
|
636
|
-
maxGasPriceGwei: config.maxGasPriceGwei,
|
|
637
|
-
gasLimit: typeof config.gasLimit === 'bigint' ? Number(config.gasLimit) : config.gasLimit,
|
|
638
|
-
gasLimitMultiplier: config.gasLimitMultiplier,
|
|
639
|
-
txType: config.txType,
|
|
640
|
-
chainId: config.chainId
|
|
641
|
-
};
|
|
642
|
-
const finalGasLimit = getGasLimit(bundleConfig);
|
|
643
|
-
const txType = getTxType(bundleConfig);
|
|
644
345
|
// ✅ 并行获取:卖出数量、gasPrice
|
|
645
346
|
const [sellAmountResult, gasPrice] = await Promise.all([
|
|
646
347
|
calculateSellAmount(provider, tokenAddress, seller.address, sellAmount, sellPercentage),
|
|
647
|
-
getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig))
|
|
348
|
+
getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig)),
|
|
648
349
|
]);
|
|
649
350
|
const { amount: sellAmountWei, decimals } = sellAmountResult;
|
|
650
|
-
|
|
651
|
-
const helper3 = new Contract(ADDRESSES.BSC.TokenManagerHelper3, HELPER3_ABI, provider);
|
|
652
|
-
const sellQuote = await helper3.trySell(tokenAddress, sellAmountWei);
|
|
653
|
-
const estimatedBNBOut = sellQuote.funds;
|
|
654
|
-
console.log(`[fourQuickBatchSwapMerkle] 卖出数量: ${ethers.formatUnits(sellAmountWei, decimals)}`);
|
|
655
|
-
console.log(`[fourQuickBatchSwapMerkle] 预估卖出所得: ${ethers.formatEther(estimatedBNBOut)} BNB`);
|
|
351
|
+
const estimatedBNBOut = await quoteFourSwapSellFunds(provider, tokenAddress, sellAmountWei);
|
|
656
352
|
// ✅ 计算利润(根据 userType 动态调整)
|
|
657
|
-
const profitRateBps =
|
|
658
|
-
const profitAmount = estimatedBNBOut > 0n
|
|
659
|
-
? (estimatedBNBOut * BigInt(profitRateBps)) / 10000n
|
|
660
|
-
: 0n;
|
|
353
|
+
const profitRateBps = getFourSwapProfitRateBps(config.userType);
|
|
354
|
+
const profitAmount = estimatedBNBOut > 0n ? (estimatedBNBOut * BigInt(profitRateBps)) / 10000n : 0n;
|
|
661
355
|
const distributableAmount = estimatedBNBOut - profitAmount;
|
|
662
356
|
// ✅ 计算每个买方分到的金额
|
|
663
357
|
let transferAmountsWei;
|
|
664
358
|
if (buyerAmounts && buyerAmounts.length === buyers.length) {
|
|
665
359
|
// 数量模式
|
|
666
|
-
transferAmountsWei = buyerAmounts.map(amt => ethers.parseEther(amt));
|
|
360
|
+
transferAmountsWei = buyerAmounts.map((amt) => ethers.parseEther(amt));
|
|
667
361
|
const totalTransfer = transferAmountsWei.reduce((a, b) => a + b, 0n);
|
|
668
362
|
if (totalTransfer > distributableAmount) {
|
|
669
363
|
throw new Error(`指定的买入总金额超过可分配金额 (${ethers.formatEther(distributableAmount)} BNB)`);
|
|
@@ -671,7 +365,7 @@ export async function fourQuickBatchSwapMerkle(params) {
|
|
|
671
365
|
}
|
|
672
366
|
else if (buyerRatios && buyerRatios.length === buyers.length) {
|
|
673
367
|
// 比例模式
|
|
674
|
-
transferAmountsWei = buyerRatios.map(ratio => {
|
|
368
|
+
transferAmountsWei = buyerRatios.map((ratio) => {
|
|
675
369
|
return (distributableAmount * BigInt(Math.round(ratio * 10000))) / 10000n;
|
|
676
370
|
});
|
|
677
371
|
}
|
|
@@ -683,29 +377,19 @@ export async function fourQuickBatchSwapMerkle(params) {
|
|
|
683
377
|
// ✅ 验证主钱包余额
|
|
684
378
|
const sellerBalance = await seller.provider.getBalance(seller.address);
|
|
685
379
|
// 主钱包只需要支付:贿赂 + Gas(卖出后有 BNB 可用于转账和利润)
|
|
686
|
-
const sellerGasCost = gasPrice * (
|
|
380
|
+
const sellerGasCost = gasPrice * (21000n + finalGasLimit + 21000n * BigInt(buyers.length) + 21000n);
|
|
687
381
|
const sellerRequired = bribeAmount + sellerGasCost;
|
|
688
382
|
if (sellerBalance < sellerRequired) {
|
|
689
383
|
throw new Error(`主钱包 BNB 余额不足: 需要约 ${ethers.formatEther(sellerRequired)} BNB (贿赂: ${ethers.formatEther(bribeAmount)}, Gas: ${ethers.formatEther(sellerGasCost)}), 实际 ${ethers.formatEther(sellerBalance)} BNB`);
|
|
690
384
|
}
|
|
691
385
|
// ==================== 规划 Nonce ====================
|
|
692
386
|
// ✅ 如果前端传入了 startNonces,直接使用(性能优化)
|
|
693
|
-
let sellerNonce = startNonces && startNonces.length > 0
|
|
694
|
-
? startNonces[0]
|
|
695
|
-
: await nonceManager.getNextNonce(seller);
|
|
387
|
+
let sellerNonce = startNonces && startNonces.length > 0 ? startNonces[0] : await nonceManager.getNextNonce(seller);
|
|
696
388
|
// ==================== 1. 贿赂交易 ====================
|
|
697
389
|
let bribeTx = null;
|
|
698
390
|
if (bribeAmount > 0n) {
|
|
699
|
-
bribeTx = await seller
|
|
700
|
-
|
|
701
|
-
value: bribeAmount,
|
|
702
|
-
nonce: sellerNonce++,
|
|
703
|
-
gasPrice,
|
|
704
|
-
gasLimit: BRIBE_GAS_LIMIT,
|
|
705
|
-
chainId: chainIdNum,
|
|
706
|
-
type: txType
|
|
707
|
-
});
|
|
708
|
-
console.log(`[fourQuickBatchSwapMerkle] 贿赂交易已签名`);
|
|
391
|
+
bribeTx = await signBribeTransaction(seller, bribeAmount, sellerNonce, gasPrice, chainIdNum, txType);
|
|
392
|
+
sellerNonce++;
|
|
709
393
|
}
|
|
710
394
|
// ==================== 2. 卖出交易 ====================
|
|
711
395
|
const tmSeller = new Contract(TM_ADDRESS, TM_ABI, seller);
|
|
@@ -717,20 +401,19 @@ export async function fourQuickBatchSwapMerkle(params) {
|
|
|
717
401
|
gasLimit: finalGasLimit,
|
|
718
402
|
gasPrice,
|
|
719
403
|
chainId: chainIdNum,
|
|
720
|
-
type: txType
|
|
404
|
+
type: txType,
|
|
721
405
|
});
|
|
722
|
-
console.log(`[fourQuickBatchSwapMerkle] 卖出交易已签名`);
|
|
723
406
|
// ==================== 3. 转账交易(支持多跳)====================
|
|
724
407
|
const reserveGas = ethers.parseEther((config.reserveGasBNB || 0.0005).toString());
|
|
725
408
|
const buyerGasCost = gasPrice * finalGasLimit;
|
|
726
409
|
// ✅ 生成多跳路径
|
|
727
|
-
const hopPaths = generateDisperseHopPaths(buyers.map(b => b.address), disperseHopCount, provider);
|
|
410
|
+
const hopPaths = generateDisperseHopPaths(buyers.map((b) => b.address), disperseHopCount, provider);
|
|
728
411
|
// 收集所有中间钱包信息
|
|
729
412
|
const allHopWallets = [];
|
|
730
|
-
hopPaths.forEach(path => {
|
|
413
|
+
hopPaths.forEach((path) => {
|
|
731
414
|
allHopWallets.push(...path.hopWalletsInfo);
|
|
732
415
|
});
|
|
733
|
-
let transferTxs
|
|
416
|
+
let transferTxs;
|
|
734
417
|
if (disperseHopCount === 0) {
|
|
735
418
|
// ✅ 无多跳:直接转账
|
|
736
419
|
const transferNonces = buyers.map((_, i) => sellerNonce + i);
|
|
@@ -744,7 +427,7 @@ export async function fourQuickBatchSwapMerkle(params) {
|
|
|
744
427
|
gasPrice,
|
|
745
428
|
gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
|
|
746
429
|
chainId: chainIdNum,
|
|
747
|
-
type: txType
|
|
430
|
+
type: txType,
|
|
748
431
|
});
|
|
749
432
|
}));
|
|
750
433
|
}
|
|
@@ -759,12 +442,11 @@ export async function fourQuickBatchSwapMerkle(params) {
|
|
|
759
442
|
transferTxs = hopChains.flat();
|
|
760
443
|
sellerNonce += buyers.length; // ✅ payer 只增加 buyers.length 个 nonce
|
|
761
444
|
}
|
|
762
|
-
console.log(`[fourQuickBatchSwapMerkle] ${transferTxs.length} 笔转账交易已签名 (多跳数=${disperseHopCount})`);
|
|
763
445
|
// ==================== 4. 买入交易 ====================
|
|
764
446
|
// ✅ 如果前端传入了 startNonces,使用 buyer 部分(从索引 1 开始)
|
|
765
447
|
const buyerNonces = startNonces && startNonces.length > 1
|
|
766
448
|
? startNonces.slice(1)
|
|
767
|
-
: await Promise.all(buyers.map(buyer => nonceManager.getNextNonce(buyer)));
|
|
449
|
+
: await Promise.all(buyers.map((buyer) => nonceManager.getNextNonce(buyer)));
|
|
768
450
|
const signedBuys = await Promise.all(buyers.map(async (buyer, i) => {
|
|
769
451
|
const buyAmount = transferAmountsWei[i];
|
|
770
452
|
const tmBuyer = new Contract(TM_ADDRESS, TM_ABI, buyer);
|
|
@@ -777,10 +459,9 @@ export async function fourQuickBatchSwapMerkle(params) {
|
|
|
777
459
|
gasPrice,
|
|
778
460
|
chainId: chainIdNum,
|
|
779
461
|
type: txType,
|
|
780
|
-
value: buyAmount
|
|
462
|
+
value: buyAmount,
|
|
781
463
|
});
|
|
782
464
|
}));
|
|
783
|
-
console.log(`[fourQuickBatchSwapMerkle] ${signedBuys.length} 笔买入交易已签名`);
|
|
784
465
|
nonceManager.clearTemp();
|
|
785
466
|
// ==================== 组装交易数组 ====================
|
|
786
467
|
const signedTransactions = [];
|
|
@@ -801,29 +482,24 @@ export async function fourQuickBatchSwapMerkle(params) {
|
|
|
801
482
|
gasPrice,
|
|
802
483
|
chainId: chainIdNum,
|
|
803
484
|
txType,
|
|
804
|
-
startNonce: sellerNonce
|
|
485
|
+
startNonce: sellerNonce++,
|
|
805
486
|
});
|
|
806
487
|
signedTransactions.push(...profitHopResult.signedTransactions);
|
|
807
488
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
808
489
|
// 多跳交易已签名
|
|
809
490
|
}
|
|
810
|
-
console.log(`[fourQuickBatchSwapMerkle] 交易组装完成: ${signedTransactions.length} 笔`);
|
|
811
|
-
console.log(` - 贿赂: ${bribeTx ? 1 : 0}`);
|
|
812
|
-
console.log(` - 卖出: 1`);
|
|
813
|
-
console.log(` - 转账: ${transferTxs.length}`);
|
|
814
|
-
console.log(` - 买入: ${signedBuys.length}`);
|
|
815
491
|
return {
|
|
816
492
|
signedTransactions,
|
|
817
493
|
disperseHopWallets: allHopWallets.length > 0 ? allHopWallets : undefined, // ✅ 返回转账多跳钱包
|
|
818
494
|
profitHopWallets, // ✅ 返回利润多跳钱包
|
|
819
495
|
metadata: {
|
|
820
496
|
sellerAddress: seller.address,
|
|
821
|
-
buyerAddresses: buyers.map(b => b.address),
|
|
497
|
+
buyerAddresses: buyers.map((b) => b.address),
|
|
822
498
|
sellAmount: ethers.formatUnits(sellAmountWei, decimals),
|
|
823
499
|
estimatedBNBOut: ethers.formatEther(estimatedBNBOut),
|
|
824
|
-
transferAmounts: transferAmountsWei.map(amt => ethers.formatEther(amt)),
|
|
500
|
+
transferAmounts: transferAmountsWei.map((amt) => ethers.formatEther(amt)),
|
|
825
501
|
profitAmount: profitAmount > 0n ? ethers.formatEther(profitAmount) : undefined,
|
|
826
|
-
disperseHopCount: disperseHopCount > 0 ? disperseHopCount : undefined // ✅ 返回多跳数
|
|
827
|
-
}
|
|
502
|
+
disperseHopCount: disperseHopCount > 0 ? disperseHopCount : undefined, // ✅ 返回多跳数
|
|
503
|
+
},
|
|
828
504
|
};
|
|
829
505
|
}
|