four-flap-meme-sdk 1.9.49 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +41 -6
- package/README.md +31 -0
- package/README.zh-CN.md +41 -6
- package/dist/abis/common.js +74 -68
- package/dist/abis/flap/vault.js +9 -7
- package/dist/abis/index.d.ts +3 -4
- package/dist/abis/index.js +3 -4
- package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
- package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
- package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
- package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
- package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
- package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
- package/dist/bundle-core/config-helpers.d.ts +36 -0
- package/dist/bundle-core/config-helpers.js +57 -0
- package/dist/bundle-core/errors.d.ts +50 -0
- package/dist/bundle-core/errors.js +34 -0
- package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
- package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
- package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
- package/dist/bundle-core/four-meme/core-helpers.js +40 -0
- package/dist/bundle-core/four-meme/core.d.ts +4 -0
- package/dist/bundle-core/four-meme/core.js +515 -0
- package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
- package/dist/bundle-core/four-meme/pancake-proxy.js +679 -0
- package/dist/bundle-core/four-meme/private.d.ts +27 -0
- package/dist/bundle-core/four-meme/private.js +465 -0
- package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
- package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
- package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
- package/dist/bundle-core/four-meme/swap-buy-first.js +493 -0
- package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
- package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
- package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
- package/dist/bundle-core/four-meme/swap-internal.js +18 -0
- package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +27 -0
- package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
- package/dist/bundle-core/four-meme/swap.d.ts +17 -0
- package/dist/bundle-core/four-meme/swap.js +505 -0
- package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
- package/dist/bundle-core/four-meme/types/buy-first.js +1 -0
- package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
- package/dist/bundle-core/four-meme/types/core-flow.js +1 -0
- package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
- package/dist/bundle-core/four-meme/types/index.js +1 -0
- package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
- package/dist/bundle-core/four-meme/types/swap-internal.js +1 -0
- package/dist/bundle-core/four-meme/types.d.ts +1 -0
- package/dist/bundle-core/four-meme/types.js +1 -0
- package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
- package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
- package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
- package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
- package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
- package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
- package/dist/bundle-core/index.d.ts +8 -0
- package/dist/bundle-core/index.js +8 -0
- package/dist/bundle-core/internal.d.ts +21 -0
- package/dist/bundle-core/internal.js +182 -0
- package/dist/bundle-core/sign-context-helpers.d.ts +25 -0
- package/dist/bundle-core/sign-context-helpers.js +67 -0
- package/dist/bundle-core/submit.d.ts +293 -0
- package/dist/bundle-core/submit.js +727 -0
- package/dist/bundle-core/types/index.d.ts +8 -0
- package/dist/bundle-core/types/index.js +1 -0
- package/dist/bundle-core/types.d.ts +1 -0
- package/dist/bundle-core/types.js +1 -0
- package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
- package/dist/chains/bsc/four/approve-tokenmanager.js +1 -116
- package/dist/chains/bsc/four/config.d.ts +5 -70
- package/dist/chains/bsc/four/config.js +2 -115
- package/dist/chains/bsc/four/core.d.ts +1 -4
- package/dist/chains/bsc/four/core.js +1 -589
- package/dist/chains/bsc/four/disperse.d.ts +12 -0
- package/dist/chains/bsc/four/disperse.js +470 -0
- package/dist/chains/bsc/four/index.d.ts +6 -6
- package/dist/chains/bsc/four/index.js +6 -6
- package/dist/chains/bsc/four/internal.d.ts +2 -50
- package/dist/chains/bsc/four/internal.js +2 -237
- package/dist/chains/bsc/four/pairwise.d.ts +7 -0
- package/dist/chains/bsc/four/pairwise.js +308 -0
- package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
- package/dist/chains/bsc/four/pancake-proxy.js +1 -688
- package/dist/chains/bsc/four/private.d.ts +1 -27
- package/dist/chains/bsc/four/private.js +1 -477
- package/dist/chains/bsc/four/submit.d.ts +2 -315
- package/dist/chains/bsc/four/submit.js +2 -746
- package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
- package/dist/chains/bsc/four/swap-buy-first.js +2 -506
- package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
- package/dist/chains/bsc/four/swap-internal.js +1 -18
- package/dist/chains/bsc/four/swap.d.ts +2 -144
- package/dist/chains/bsc/four/swap.js +2 -760
- package/dist/chains/bsc/four/sweep.d.ts +13 -0
- package/dist/chains/bsc/four/sweep.js +788 -0
- package/dist/chains/bsc/four/types.d.ts +1 -476
- package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
- package/dist/chains/bsc/four/utils-disperse.js +1 -0
- package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
- package/dist/chains/bsc/four/utils-pairwise.js +1 -0
- package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
- package/dist/chains/bsc/four/utils-sweep.js +1 -0
- package/dist/chains/bsc/four/utils.d.ts +5 -18
- package/dist/chains/bsc/four/utils.js +5 -1534
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +159 -0
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +117 -0
- package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
- package/dist/chains/bsc/pancake/bundle-buy-first.js +97 -207
- package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
- package/dist/chains/bsc/pancake/bundle-swap-helpers.js +565 -0
- package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
- package/dist/chains/bsc/pancake/bundle-swap.js +111 -686
- package/dist/chains/bsc/pancake/index.d.ts +4 -2
- package/dist/chains/bsc/pancake/index.js +1 -3
- package/dist/chains/bsc/platforms/iro/factory.js +3 -1
- package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
- package/dist/chains/bsc/platforms/iro/index.js +3 -3
- package/dist/chains/bsc/platforms/iro/pool.js +31 -10
- package/dist/chains/bsc/platforms/iro/token.js +4 -1
- package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
- package/dist/chains/eni/batch-router/transfer.js +54 -23
- package/dist/chains/eni/batch-router/utils.js +32 -6
- package/dist/chains/eni/bundler/sign.js +4 -4
- package/dist/chains/eni/bundler/submit.js +1 -4
- package/dist/chains/eni/constants.js +1 -1
- package/dist/chains/eni/index.d.ts +1 -1
- package/dist/chains/eni/platforms/daoaas/create.js +2 -2
- package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
- package/dist/chains/eni/platforms/daoaas/index.js +3 -3
- package/dist/chains/eni/platforms/daoaas/meta.js +8 -4
- package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -43
- package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
- package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
- package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
- package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
- package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -47
- package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
- package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
- package/dist/chains/eni/platforms/iro/factory.js +3 -1
- package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
- package/dist/chains/eni/platforms/iro/index.js +4 -4
- package/dist/chains/eni/platforms/iro/pool.js +90 -26
- package/dist/chains/eni/platforms/iro/token.js +107 -31
- package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
- package/dist/chains/eni/submit.js +5 -13
- package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
- package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -20
- package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
- package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
- package/dist/chains/xlayer/eip7702/bundle-create.js +93 -56
- package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
- package/dist/chains/xlayer/eip7702/bundle-sell.js +26 -74
- package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
- package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -68
- package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
- package/dist/chains/xlayer/eip7702/constants.js +3 -21
- package/dist/chains/xlayer/eip7702/index.d.ts +27 -46
- package/dist/chains/xlayer/eip7702/index.js +27 -81
- package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +79 -0
- package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +1 -0
- package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
- package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +58 -291
- package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
- package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +57 -0
- package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
- package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
- package/dist/chains/xlayer/eip7702/utils.js +23 -28
- package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +148 -0
- package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
- package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
- package/dist/chains/xlayer/eip7702/volume.js +83 -158
- package/dist/chains/xlayer/eoa/constants.js +1 -1
- package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
- package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
- package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
- package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
- package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +64 -276
- package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
- package/dist/chains/xlayer/eoa/eoa-wash-volume.js +14 -14
- package/dist/chains/xlayer/eoa/index.d.ts +10 -6
- package/dist/chains/xlayer/eoa/index.js +8 -23
- package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
- package/dist/chains/xlayer/eoa/router-manager.js +3 -3
- package/dist/chains/xlayer/eoa/types-core.d.ts +363 -0
- package/dist/chains/xlayer/eoa/types-core.js +53 -0
- package/dist/chains/xlayer/eoa/types-create.d.ts +413 -0
- package/dist/chains/xlayer/eoa/types-create.js +9 -0
- package/dist/chains/xlayer/eoa/types-volume.d.ts +209 -0
- package/dist/chains/xlayer/eoa/types-volume.js +13 -0
- package/dist/chains/xlayer/eoa/types.d.ts +2 -2
- package/dist/chains/xlayer/eoa/types.js +1 -3
- package/dist/contracts/helper3.d.ts +20 -17
- package/dist/contracts/helper3.js +56 -20
- package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
- package/dist/contracts/tm-bundle-helpers.js +72 -0
- package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
- package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -117
- package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -70
- package/dist/contracts/tm-bundle-merkle/config.js +2 -115
- package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
- package/dist/contracts/tm-bundle-merkle/core.js +1 -588
- package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
- package/dist/contracts/tm-bundle-merkle/index.js +5 -5
- package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -50
- package/dist/contracts/tm-bundle-merkle/internal.js +2 -236
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -687
- package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
- package/dist/contracts/tm-bundle-merkle/private.js +1 -476
- package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
- package/dist/contracts/tm-bundle-merkle/submit.js +3 -919
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -505
- package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
- package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
- package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
- package/dist/contracts/tm-bundle-merkle/swap.js +2 -757
- package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
- package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
- package/dist/contracts/tm-bundle-merkle/utils.d.ts +5 -6
- package/dist/contracts/tm-bundle-merkle/utils.js +5 -6
- package/dist/contracts/tm-bundle.d.ts +3 -51
- package/dist/contracts/tm-bundle.js +102 -142
- package/dist/contracts/tm.d.ts +3 -2
- package/dist/contracts/tm.js +36 -32
- package/dist/contracts/tm1.js +9 -4
- package/dist/contracts/tm2.js +9 -4
- package/dist/dex/direct-router-helpers.d.ts +264 -0
- package/dist/dex/direct-router-helpers.js +539 -0
- package/dist/dex/direct-router.d.ts +3 -125
- package/dist/dex/direct-router.js +237 -652
- package/dist/dex/types.d.ts +81 -0
- package/dist/dex/types.js +1 -0
- package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
- package/dist/exports/root-bundle-and-tooling.js +30 -0
- package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
- package/dist/exports/root-eni-and-bsc-iro.js +66 -0
- package/dist/exports/root-foundations.d.ts +35 -0
- package/dist/exports/root-foundations.js +70 -0
- package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
- package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
- package/dist/flows/create.d.ts +2 -2
- package/dist/flows/create.js +6 -6
- package/dist/flows/index.d.ts +1 -0
- package/dist/flows/index.js +1 -0
- package/dist/index.d.ts +20 -91
- package/dist/index.js +20 -215
- package/dist/shared/abis/common.d.ts +2 -83
- package/dist/shared/abis/common.js +2 -252
- package/dist/shared/abis/index.d.ts +5 -6
- package/dist/shared/abis/index.js +5 -7
- package/dist/shared/clients/blockrazor.js +41 -24
- package/dist/shared/clients/club48.js +30 -26
- package/dist/shared/clients/emitservice.js +2 -0
- package/dist/shared/clients/four.js +23 -18
- package/dist/shared/clients/index.d.ts +8 -0
- package/dist/shared/clients/index.js +8 -0
- package/dist/shared/clients/merkle.js +26 -30
- package/dist/shared/constants/addresses.d.ts +1 -1
- package/dist/shared/constants/addresses.js +11 -2
- package/dist/shared/constants/chains.d.ts +1 -1
- package/dist/shared/constants/chains.js +1 -1
- package/dist/shared/constants/gas.d.ts +1 -1
- package/dist/shared/constants/gas.js +2 -6
- package/dist/shared/constants/index.d.ts +1 -0
- package/dist/shared/constants/index.js +1 -0
- package/dist/shared/constants/quote.d.ts +30 -0
- package/dist/shared/constants/quote.js +37 -0
- package/dist/shared/flap/__tests__/curve.test.js +3 -3
- package/dist/shared/flap/abi.js +1 -1
- package/dist/shared/flap/constants.d.ts +1 -1
- package/dist/shared/flap/constants.js +2 -2
- package/dist/shared/flap/curve.js +3 -0
- package/dist/shared/flap/errors.d.ts +1 -4
- package/dist/shared/flap/errors.js +21 -3
- package/dist/shared/flap/index.d.ts +2 -2
- package/dist/shared/flap/index.js +2 -2
- package/dist/shared/flap/meta.d.ts +16 -18
- package/dist/shared/flap/meta.js +14 -26
- package/dist/shared/flap/permit.js +6 -5
- package/dist/shared/flap/pinata.d.ts +9 -2
- package/dist/shared/flap/pinata.js +20 -18
- package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
- package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
- package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
- package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
- package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
- package/dist/shared/flap/portal-bundle-merkle/core.js +66 -156
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +81 -86
- package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +100 -92
- package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
- package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
- package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
- package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +66 -247
- package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
- package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +2 -71
- package/dist/shared/flap/portal-bundle-merkle/swap.js +103 -410
- package/dist/shared/flap/portal-bundle-merkle/types.d.ts +73 -3
- package/dist/shared/flap/portal-bundle-merkle/utils-helpers.d.ts +100 -0
- package/dist/shared/flap/portal-bundle-merkle/utils-helpers.js +133 -0
- package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
- package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
- package/dist/shared/flap/portal-bundle.js +54 -42
- package/dist/shared/flap/portal.js +32 -10
- package/dist/shared/flap/vanity.js +4 -7
- package/dist/shared/flap/vault.d.ts +1 -1
- package/dist/shared/flap/vault.js +54 -48
- package/dist/shared/flap 2/__tests__/curve.test.d.ts +1 -0
- package/dist/shared/flap 2/portal-bundle-merkle/types.js +1 -0
- package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
- package/dist/shared/foundation/dex/v3-path.js +35 -0
- package/dist/shared/foundation/gas/bundle-gas.d.ts +39 -0
- package/dist/shared/foundation/gas/bundle-gas.js +93 -0
- package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
- package/dist/shared/foundation/gas/profit-hop.js +72 -0
- package/dist/shared/foundation/index.d.ts +13 -0
- package/dist/shared/foundation/index.js +12 -0
- package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
- package/dist/shared/foundation/nonce/nonce-manager.js +180 -0
- package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
- package/dist/shared/foundation/normalize-unknown.js +29 -0
- package/dist/shared/foundation/sdk-logger.d.ts +13 -0
- package/dist/shared/foundation/sdk-logger.js +12 -0
- package/dist/shared/foundation/tx/build-request.d.ts +17 -0
- package/dist/shared/foundation/tx/build-request.js +25 -0
- package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
- package/dist/shared/foundation/tx/sign-batch.js +26 -0
- package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
- package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
- package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
- package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
- package/dist/shared/foundation/types/erc20.d.ts +65 -0
- package/dist/shared/foundation/types/erc20.js +1 -0
- package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
- package/dist/shared/foundation/types/holders-maker.js +1 -0
- package/dist/shared/foundation/types/index.d.ts +7 -0
- package/dist/shared/foundation/types/index.js +1 -0
- package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
- package/dist/shared/foundation/types/lp-inspect.js +1 -0
- package/dist/shared/foundation/types/multicall.d.ts +5 -0
- package/dist/shared/foundation/types/multicall.js +1 -0
- package/dist/shared/foundation/types/private-sale.d.ts +35 -0
- package/dist/shared/foundation/types/private-sale.js +1 -0
- package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
- package/dist/shared/foundation/types/quote-helpers.js +1 -0
- package/dist/shared/four/tax-token.d.ts +1 -1
- package/dist/shared/four/tax-token.js +27 -7
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared/index.js +4 -0
- package/dist/types/distribute.d.ts +72 -0
- package/dist/types/distribute.js +1 -0
- package/dist/types 2/errors.d.ts +27 -0
- package/dist/types 2/errors.js +34 -0
- package/dist/utils/airdrop-sweep-types.d.ts +1 -0
- package/dist/utils/airdrop-sweep-types.js +1 -0
- package/dist/utils/airdrop-sweep.d.ts +4 -76
- package/dist/utils/airdrop-sweep.js +38 -52
- package/dist/utils/bundle-helpers.d.ts +9 -243
- package/dist/utils/bundle-helpers.js +10 -584
- package/dist/utils/constants.d.ts +5 -61
- package/dist/utils/constants.js +5 -80
- package/dist/utils/contract-factory.d.ts +2 -4
- package/dist/utils/contract-factory.js +25 -18
- package/dist/utils/erc20-types.d.ts +1 -0
- package/dist/utils/erc20-types.js +1 -0
- package/dist/utils/erc20.d.ts +8 -90
- package/dist/utils/erc20.js +94 -153
- package/dist/utils/errors.d.ts +10 -22
- package/dist/utils/errors.js +61 -79
- package/dist/utils/holders-maker/addresses.d.ts +12 -0
- package/dist/utils/holders-maker/addresses.js +15 -0
- package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
- package/dist/utils/holders-maker/buy-tx.js +278 -0
- package/dist/utils/holders-maker/constants.d.ts +6 -0
- package/dist/utils/holders-maker/constants.js +7 -0
- package/dist/utils/holders-maker/disperse.d.ts +18 -0
- package/dist/utils/holders-maker/disperse.js +90 -0
- package/dist/utils/holders-maker/routing.d.ts +4 -0
- package/dist/utils/holders-maker/routing.js +45 -0
- package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
- package/dist/utils/holders-maker/transfer-tx.js +67 -0
- package/dist/utils/holders-maker-helpers.d.ts +9 -0
- package/dist/utils/holders-maker-helpers.js +9 -0
- package/dist/utils/holders-maker-types.d.ts +1 -0
- package/dist/utils/holders-maker-types.js +1 -0
- package/dist/utils/holders-maker.d.ts +2 -138
- package/dist/utils/holders-maker.js +23 -651
- package/dist/utils/hop-chains.d.ts +35 -0
- package/dist/utils/hop-chains.js +215 -0
- package/dist/utils/lp-inspect-helpers.d.ts +9 -0
- package/dist/utils/lp-inspect-helpers.js +109 -0
- package/dist/utils/lp-inspect-types.d.ts +1 -0
- package/dist/utils/lp-inspect-types.js +1 -0
- package/dist/utils/lp-inspect.d.ts +2 -112
- package/dist/utils/lp-inspect.js +63 -195
- package/dist/utils/mpcExclusive.d.ts +2 -5
- package/dist/utils/mpcExclusive.js +4 -3
- package/dist/utils/private-sale-types.d.ts +1 -0
- package/dist/utils/private-sale-types.js +1 -0
- package/dist/utils/private-sale.d.ts +2 -58
- package/dist/utils/private-sale.js +2 -7
- package/dist/utils/provider-factory.d.ts +4 -0
- package/dist/utils/provider-factory.js +10 -0
- package/dist/utils/quote-helpers-types.d.ts +1 -0
- package/dist/utils/quote-helpers-types.js +1 -0
- package/dist/utils/quote-helpers.d.ts +4 -45
- package/dist/utils/quote-helpers.js +15 -65
- package/dist/utils/stealth-transfer.d.ts +2 -28
- package/dist/utils/stealth-transfer.js +30 -14
- package/dist/utils/swap-helpers.d.ts +0 -3
- package/dist/utils/swap-helpers.js +6 -9
- package/dist/utils/types/airdrop-sweep.d.ts +1 -0
- package/dist/utils/types/airdrop-sweep.js +1 -0
- package/dist/utils/types/contract-factory.d.ts +1 -0
- package/dist/utils/types/contract-factory.js +1 -0
- package/dist/utils/types/erc20.d.ts +1 -0
- package/dist/utils/types/erc20.js +1 -0
- package/dist/utils/types/errors.d.ts +1 -0
- package/dist/utils/types/errors.js +1 -0
- package/dist/utils/types/holders-maker.d.ts +1 -0
- package/dist/utils/types/holders-maker.js +1 -0
- package/dist/utils/types/hop-chains.d.ts +8 -0
- package/dist/utils/types/hop-chains.js +1 -0
- package/dist/utils/types/index.d.ts +13 -0
- package/dist/utils/types/index.js +1 -0
- package/dist/utils/types/lp-inspect.d.ts +1 -0
- package/dist/utils/types/lp-inspect.js +1 -0
- package/dist/utils/types/mpc-exclusive.d.ts +5 -0
- package/dist/utils/types/mpc-exclusive.js +1 -0
- package/dist/utils/types/private-sale.d.ts +1 -0
- package/dist/utils/types/private-sale.js +1 -0
- package/dist/utils/types/quote-helpers.d.ts +1 -0
- package/dist/utils/types/quote-helpers.js +1 -0
- package/dist/utils/types/stealth-transfer.d.ts +44 -0
- package/dist/utils/types/stealth-transfer.js +1 -0
- package/dist/utils/types/wallet.d.ts +25 -0
- package/dist/utils/types/wallet.js +1 -0
- package/dist/utils/wallet.d.ts +2 -25
- package/dist/utils/wallet.js +9 -10
- package/package.json +55 -2
- package/src/abis/contracts/TaxToken.json +969 -0
- package/src/abis/contracts/TokenManager.json +836 -0
- package/src/abis/contracts/TokenManager2.json +136 -0
- package/src/abis/contracts/TokenManagerHelper3.json +993 -0
- /package/dist/{shared 2/flap/__tests__/curve.test.d.ts → bundle-core/__tests__/config-helpers.test.d.ts} +0 -0
- /package/dist/{shared 2/flap/portal-bundle-merkle/types.js → bundle-core/__tests__/facade-parity.test.d.ts} +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/TaxToken.json +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/TokenManager.json +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/TokenManager2.json +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/TokenManagerHelper3.json +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/common.d.ts +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/common.js +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/index.d.ts +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/index.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/club48.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/club48.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/emitservice.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/emitservice.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/four.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/four.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/merkle.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/merkle.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/__tests__/curve.test.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/abi.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/abi.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/constants.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/constants.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/curve.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/curve.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/errors.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/errors.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/index.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/index.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/ipfs.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/ipfs.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/meta.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/meta.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/permit.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/permit.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/pinata.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/pinata.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/types.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/vanity.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/vanity.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/vault.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/vault.js +0 -0
- /package/dist/{shared 2/four → shared/four 2}/index.d.ts +0 -0
- /package/dist/{shared 2/four → shared/four 2}/index.js +0 -0
- /package/dist/{shared 2/four → shared/four 2}/tax-token.d.ts +0 -0
- /package/dist/{shared 2/four → shared/four 2}/tax-token.js +0 -0
- /package/dist/{shared 2/index.d.ts → shared/index 2.js} +0 -0
- /package/dist/{shared 2/index.js → shared/index.d 2.ts} +0 -0
|
@@ -1,65 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Flap Protocol 内盘捆绑换手(Merkle Bundle)- 先买后卖
|
|
3
|
-
*
|
|
4
|
-
* 功能:钱包B先买入代币 → 钱包A卖出相同数量 → 原子执行
|
|
5
|
-
*/
|
|
6
|
-
import { CommonBundleConfig } from '../../../utils/bundle-helpers.js';
|
|
7
|
-
import { FlapSignConfig } from './config.js';
|
|
8
|
-
import type { GeneratedWallet } from '../../../utils/wallet.js';
|
|
9
|
-
export type FlapChain = 'bsc' | 'xlayer' | 'base';
|
|
10
|
-
export type UserType = 'v0' | 'v1';
|
|
11
|
-
export interface FlapBuyFirstSignConfig extends FlapSignConfig {
|
|
12
|
-
reserveGasETH?: number;
|
|
13
|
-
skipQuoteOnError?: boolean;
|
|
14
|
-
userType?: UserType;
|
|
15
|
-
}
|
|
16
|
-
export interface FlapBuyFirstConfig extends CommonBundleConfig {
|
|
17
|
-
apiKey: string;
|
|
18
|
-
customRpcUrl?: string;
|
|
19
|
-
bundleBlockOffset?: number;
|
|
20
|
-
reserveGasETH?: number;
|
|
21
|
-
skipQuoteOnError?: boolean;
|
|
22
|
-
waitForConfirmation?: boolean;
|
|
23
|
-
waitTimeoutMs?: number;
|
|
24
|
-
}
|
|
25
|
-
export interface FlapBundleBuyFirstSignParams {
|
|
26
|
-
chain: FlapChain;
|
|
27
|
-
buyerPrivateKey?: string;
|
|
28
|
-
buyerPrivateKeys?: string[];
|
|
29
|
-
sellerPrivateKey?: string;
|
|
30
|
-
sellerPrivateKeys?: string[];
|
|
31
|
-
tokenAddress: string;
|
|
32
|
-
buyerFunds?: string;
|
|
33
|
-
buyerFundsPercentage?: number;
|
|
34
|
-
config: FlapBuyFirstSignConfig;
|
|
35
|
-
quoteToken?: string;
|
|
36
|
-
quoteTokenDecimals?: number;
|
|
37
|
-
buyCount?: number;
|
|
38
|
-
sellCount?: number;
|
|
39
|
-
}
|
|
40
|
-
export interface FlapBundleBuyFirstParams {
|
|
41
|
-
chain: FlapChain;
|
|
42
|
-
buyerPrivateKey: string;
|
|
43
|
-
sellerPrivateKey: string;
|
|
44
|
-
tokenAddress: string;
|
|
45
|
-
buyerFunds?: string;
|
|
46
|
-
buyerFundsPercentage?: number;
|
|
47
|
-
config: FlapBuyFirstConfig;
|
|
48
|
-
}
|
|
49
|
-
/** ✅ Flap BuyFirst 结果(简化版) */
|
|
50
|
-
export type FlapBuyFirstResult = {
|
|
51
|
-
signedTransactions: string[];
|
|
52
|
-
profitHopWallets?: GeneratedWallet[];
|
|
53
|
-
metadata?: {
|
|
54
|
-
buyerAddress: string;
|
|
55
|
-
sellerAddress: string;
|
|
56
|
-
buyAmount: string;
|
|
57
|
-
sellAmount: string;
|
|
58
|
-
profitAmount?: string;
|
|
59
|
-
buyCount?: number;
|
|
60
|
-
sellCount?: number;
|
|
61
|
-
buyAmounts?: string[];
|
|
62
|
-
sellAmounts?: string[];
|
|
63
|
-
};
|
|
64
|
-
};
|
|
1
|
+
import { FlapBundleBuyFirstSignParams, FlapBuyFirstResult } from './swap-buy-first-helpers.js';
|
|
65
2
|
export declare function flapBundleBuyFirstMerkle(params: FlapBundleBuyFirstSignParams): Promise<FlapBuyFirstResult>;
|
|
@@ -1,117 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* 功能:钱包B先买入代币 → 钱包A卖出相同数量 → 原子执行
|
|
2
|
+
* swap-buy-first - 主函数
|
|
5
3
|
*/
|
|
6
4
|
import { ethers, Contract, Wallet } from 'ethers';
|
|
7
|
-
import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
|
|
5
|
+
import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../../utils/bundle-helpers.js';
|
|
8
6
|
import { FLAP_PORTAL_ADDRESSES } from '../constants.js';
|
|
9
|
-
import {
|
|
10
|
-
import { GAS_LIMITS
|
|
11
|
-
import { ERC20_BALANCE_ABI
|
|
12
|
-
import { getGasPriceConfig, getTxType, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA, PORTAL_ABI } from './config.js';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const MONAD_PANCAKE_V2_ROUTER = '0xb1bc24c34e88f7d43d5923034e3a14b24daacff9';
|
|
17
|
-
const MONAD_WMON = ADDRESSES.MONAD.WMON;
|
|
18
|
-
const ROUTER_ABI = V2_ROUTER_QUOTE_ABI;
|
|
19
|
-
/**
|
|
20
|
-
* 获取 ERC20 代币 → 原生代币的报价
|
|
21
|
-
* @param provider - Provider 实例
|
|
22
|
-
* @param tokenAddress - ERC20 代币地址
|
|
23
|
-
* @param tokenAmount - 代币数量(wei)
|
|
24
|
-
* @param chainId - 链 ID(56=BSC, 143=Monad)
|
|
25
|
-
* @returns 等值的原生代币数量(wei),失败返回 0n
|
|
26
|
-
*/
|
|
27
|
-
async function getTokenToNativeQuote(provider, tokenAddress, tokenAmount, chainId) {
|
|
28
|
-
if (tokenAmount <= 0n)
|
|
29
|
-
return 0n;
|
|
30
|
-
try {
|
|
31
|
-
if (chainId === CHAINS.BSC.chainId) {
|
|
32
|
-
// BSC: 使用 PancakeSwap V2 Router
|
|
33
|
-
const router = new Contract(BSC_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
|
|
34
|
-
const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, BSC_WBNB]);
|
|
35
|
-
return amounts[1];
|
|
36
|
-
}
|
|
37
|
-
if (chainId === CHAINS.MONAD.chainId) {
|
|
38
|
-
// ✅ Monad: 使用 PancakeSwap V2 Router
|
|
39
|
-
const router = new Contract(MONAD_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
|
|
40
|
-
const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, MONAD_WMON]);
|
|
41
|
-
return amounts[1];
|
|
42
|
-
}
|
|
43
|
-
// ✅ Base (8453) / XLayer (196) 等链暂不支持 V2 报价,返回 0
|
|
44
|
-
return 0n;
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
// 报价失败返回 0(可能是流动性不足或路径不存在)
|
|
48
|
-
return 0n;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* 获取 Gas Limit(支持 FlapAnyConfig)
|
|
53
|
-
*/
|
|
54
|
-
function getGasLimit(config, defaultGas = 800000) {
|
|
55
|
-
if (config.gasLimit !== undefined) {
|
|
56
|
-
return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
|
|
57
|
-
}
|
|
58
|
-
const multiplier = config.gasLimitMultiplier ?? 1.0;
|
|
59
|
-
return BigInt(Math.ceil(defaultGas * multiplier));
|
|
60
|
-
}
|
|
61
|
-
// ==================== 多笔买卖常量 ====================
|
|
62
|
-
/** 最大 Bundle 签名数 */
|
|
63
|
-
const MAX_BUNDLE_SIGNATURES = 50;
|
|
64
|
-
/** 贿赂交易数 */
|
|
65
|
-
const BRIBE_TX_COUNT = 1;
|
|
66
|
-
/** 利润中转交易数(支付者 1 笔 + 中转钱包 PROFIT_HOP_COUNT 笔 + 最终接收 1 笔) */
|
|
67
|
-
const PROFIT_TX_COUNT = PROFIT_HOP_COUNT + 2; // 2 + 2 = 4
|
|
68
|
-
/** 最大买卖交易数 */
|
|
69
|
-
const MAX_SWAP_TX_COUNT = MAX_BUNDLE_SIGNATURES - BRIBE_TX_COUNT - PROFIT_TX_COUNT; // 50 - 1 - 4 = 45
|
|
70
|
-
/**
|
|
71
|
-
* 根据 userType 获取每笔交易的利润率
|
|
72
|
-
*/
|
|
73
|
-
function getProfitRatePerTxBps(userType) {
|
|
74
|
-
if (userType === 'v1') {
|
|
75
|
-
return PROFIT_CONFIG.RATE_BPS_V1_DOUBLE;
|
|
76
|
-
}
|
|
77
|
-
return PROFIT_CONFIG.RATE_BPS_V0_DOUBLE; // v0 或默认
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* 验证买卖笔数
|
|
81
|
-
*/
|
|
82
|
-
function validateSwapCounts(buyCount, sellCount) {
|
|
83
|
-
if (buyCount < 1) {
|
|
84
|
-
throw new Error(`买入笔数必须至少为 1,当前为 ${buyCount}`);
|
|
85
|
-
}
|
|
86
|
-
if (sellCount < 1) {
|
|
87
|
-
throw new Error(`卖出笔数必须至少为 1,当前为 ${sellCount}`);
|
|
88
|
-
}
|
|
89
|
-
const totalSwaps = buyCount + sellCount;
|
|
90
|
-
if (totalSwaps > MAX_SWAP_TX_COUNT) {
|
|
91
|
-
throw new Error(`买卖笔数总和 (${totalSwaps}) 超出限制 (${MAX_SWAP_TX_COUNT}),` +
|
|
92
|
-
`最大签名数为 ${MAX_BUNDLE_SIGNATURES}(${BRIBE_TX_COUNT} 贿赂 + ${PROFIT_TX_COUNT} 利润 + ${MAX_SWAP_TX_COUNT} 买卖)`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function getChainId(chain) {
|
|
96
|
-
switch (chain) {
|
|
97
|
-
case 'bsc': return 56;
|
|
98
|
-
case 'xlayer': return 196;
|
|
99
|
-
case 'base': return 8453;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
function getNativeTokenName(chain) {
|
|
103
|
-
switch (chain) {
|
|
104
|
-
case 'bsc': return 'BNB';
|
|
105
|
-
case 'xlayer': return 'OKB';
|
|
106
|
-
case 'base': return 'ETH';
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// 使用公共工具的 getGasLimit,移除本地重复实现
|
|
7
|
+
import { ZERO_ADDRESS } from '../../../shared/constants/index.js';
|
|
8
|
+
import { GAS_LIMITS } from '../../constants/index.js';
|
|
9
|
+
import { ERC20_BALANCE_ABI } from '../../abis/common.js';
|
|
10
|
+
import { getGasPriceConfig, getTxType, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA, PORTAL_ABI, } from './config.js';
|
|
11
|
+
import { createSignProvider } from '../../../bundle-core/sign-context-helpers.js';
|
|
12
|
+
import { buildTransactionRequest } from '../../foundation/tx/build-request.js';
|
|
13
|
+
import { getChainId, getGasLimit, getNativeTokenName, getProfitRatePerTxBps, getTokenToNativeQuote, validateSwapCounts, } from './swap-buy-first-helpers.js';
|
|
110
14
|
export async function flapBundleBuyFirstMerkle(params) {
|
|
111
|
-
const { chain, buyerPrivateKey, buyerPrivateKeys, sellerPrivateKey, sellerPrivateKeys, tokenAddress, buyerFunds, buyerFundsPercentage, config, quoteToken, quoteTokenDecimals, buyCount: _buyCount, sellCount: _sellCount } = params;
|
|
15
|
+
const { chain, buyerPrivateKey, buyerPrivateKeys, sellerPrivateKey, sellerPrivateKeys, tokenAddress, buyerFunds, buyerFundsPercentage, config, quoteToken, quoteTokenDecimals, buyCount: _buyCount, sellCount: _sellCount, } = params;
|
|
112
16
|
// ✅ 判断是否为多钱包模式
|
|
113
|
-
const isMultiWalletMode = !!(buyerPrivateKeys && buyerPrivateKeys.length > 0) ||
|
|
114
|
-
!!(sellerPrivateKeys && sellerPrivateKeys.length > 0);
|
|
17
|
+
const isMultiWalletMode = !!(buyerPrivateKeys && buyerPrivateKeys.length > 0) || !!(sellerPrivateKeys && sellerPrivateKeys.length > 0);
|
|
115
18
|
const buyCount = _buyCount ?? 1;
|
|
116
19
|
const sellCount = _sellCount ?? 1;
|
|
117
20
|
// ✅ 多钱包模式:使用单独的处理逻辑
|
|
@@ -124,7 +27,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
124
27
|
buyerFunds,
|
|
125
28
|
config,
|
|
126
29
|
quoteToken,
|
|
127
|
-
quoteTokenDecimals
|
|
30
|
+
quoteTokenDecimals,
|
|
128
31
|
});
|
|
129
32
|
}
|
|
130
33
|
// ✅ 单钱包模式(向后兼容)
|
|
@@ -158,11 +61,11 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
158
61
|
useNativeToken,
|
|
159
62
|
quoteToken,
|
|
160
63
|
quoteTokenDecimals,
|
|
161
|
-
provider: chainContext.provider
|
|
64
|
+
provider: chainContext.provider,
|
|
162
65
|
}),
|
|
163
|
-
getOptimizedGasPrice(chainContext.provider, getGasPriceConfig(config))
|
|
66
|
+
getOptimizedGasPrice(chainContext.provider, getGasPriceConfig(config)),
|
|
164
67
|
]);
|
|
165
|
-
const { buyerFundsWei
|
|
68
|
+
const { buyerFundsWei } = buyerFundsResult;
|
|
166
69
|
const priorityFee = gasPrice / 10n === 0n ? 1n : gasPrice / 10n;
|
|
167
70
|
// ✅ 获取报价
|
|
168
71
|
const quoteResult = await quoteBuyerOutput({
|
|
@@ -171,7 +74,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
171
74
|
buyerFundsWei,
|
|
172
75
|
provider: chainContext.provider,
|
|
173
76
|
skipQuoteOnError: config.skipQuoteOnError,
|
|
174
|
-
inputToken // ✅ 传递输入代币
|
|
77
|
+
inputToken, // ✅ 传递输入代币
|
|
175
78
|
});
|
|
176
79
|
const sellAmountWei = quoteResult.sellAmountWei;
|
|
177
80
|
// ✅ 验证卖方余额
|
|
@@ -180,7 +83,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
180
83
|
provider: chainContext.provider,
|
|
181
84
|
seller,
|
|
182
85
|
sellAmountWei,
|
|
183
|
-
skipBalanceCheck: sameAddress
|
|
86
|
+
skipBalanceCheck: sameAddress,
|
|
184
87
|
});
|
|
185
88
|
const portalBuyer = new Contract(chainContext.portalAddress, PORTAL_ABI, buyer);
|
|
186
89
|
const portalSeller = new Contract(chainContext.portalAddress, PORTAL_ABI, seller);
|
|
@@ -188,24 +91,24 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
188
91
|
const buyAmountsWei = splitAmount(buyerFundsWei, buyCount);
|
|
189
92
|
const sellAmountsWei = splitAmount(sellAmountWei, sellCount);
|
|
190
93
|
// ✅ 第三批并行 - 构建多笔买入和卖出交易、estimatedSellFunds
|
|
191
|
-
const buyUnsignedPromises = buyAmountsWei.map(amount => portalBuyer.swapExactInput.populateTransaction({
|
|
94
|
+
const buyUnsignedPromises = buyAmountsWei.map((amount) => portalBuyer.swapExactInput.populateTransaction({
|
|
192
95
|
inputToken,
|
|
193
96
|
outputToken: tokenAddress,
|
|
194
97
|
inputAmount: amount,
|
|
195
98
|
minOutputAmount: 0n,
|
|
196
|
-
permitData: '0x'
|
|
99
|
+
permitData: '0x',
|
|
197
100
|
}, useNativeToken ? { value: amount } : {}));
|
|
198
|
-
const sellUnsignedPromises = sellAmountsWei.map(amount => portalSeller.swapExactInput.populateTransaction({
|
|
101
|
+
const sellUnsignedPromises = sellAmountsWei.map((amount) => portalSeller.swapExactInput.populateTransaction({
|
|
199
102
|
inputToken: tokenAddress,
|
|
200
103
|
outputToken,
|
|
201
104
|
inputAmount: amount,
|
|
202
105
|
minOutputAmount: 0,
|
|
203
|
-
permitData: '0x'
|
|
106
|
+
permitData: '0x',
|
|
204
107
|
}));
|
|
205
108
|
const [buyUnsignedArray, sellUnsignedArray, estimatedSellFunds] = await Promise.all([
|
|
206
109
|
Promise.all(buyUnsignedPromises),
|
|
207
110
|
Promise.all(sellUnsignedPromises),
|
|
208
|
-
estimateSellFunds(portalSeller, tokenAddress, sellAmountWei, outputToken)
|
|
111
|
+
estimateSellFunds(portalSeller, tokenAddress, sellAmountWei, outputToken),
|
|
209
112
|
]);
|
|
210
113
|
// ✅ 获取贿赂金额
|
|
211
114
|
const bribeAmount = getBribeAmount(config);
|
|
@@ -219,7 +122,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
219
122
|
extractProfit: true,
|
|
220
123
|
needBribeTx,
|
|
221
124
|
sameAddress,
|
|
222
|
-
nonceManager
|
|
125
|
+
nonceManager,
|
|
223
126
|
});
|
|
224
127
|
// ✅ 修复:基于卖出收益估算利润(使用动态利润比例)
|
|
225
128
|
const profitBase = estimatedSellFunds > 0n ? estimatedSellFunds : buyerFundsWei;
|
|
@@ -239,7 +142,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
239
142
|
priorityFee,
|
|
240
143
|
chainId: chainContext.chainId,
|
|
241
144
|
txType,
|
|
242
|
-
value: useNativeToken ? buyAmountsWei[i] : 0n
|
|
145
|
+
value: useNativeToken ? buyAmountsWei[i] : 0n,
|
|
243
146
|
}));
|
|
244
147
|
// ✅ 构建多笔卖出交易
|
|
245
148
|
const sellTxs = sellUnsignedArray.map((unsigned, i) => buildTransactionRequest(unsigned, {
|
|
@@ -250,7 +153,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
250
153
|
priorityFee,
|
|
251
154
|
chainId: chainContext.chainId,
|
|
252
155
|
txType,
|
|
253
|
-
value: 0n
|
|
156
|
+
value: 0n,
|
|
254
157
|
}));
|
|
255
158
|
// ✅ 贿赂交易放在首位
|
|
256
159
|
let bribeTx = null;
|
|
@@ -262,13 +165,13 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
262
165
|
gasPrice,
|
|
263
166
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
264
167
|
chainId: chainContext.chainId,
|
|
265
|
-
type: txType
|
|
168
|
+
type: txType,
|
|
266
169
|
});
|
|
267
170
|
}
|
|
268
171
|
// ✅ 并行签名所有买入和卖出交易
|
|
269
172
|
const [signedBuys, signedSells] = await Promise.all([
|
|
270
|
-
Promise.all(buyTxs.map(tx => buyer.signTransaction(tx))),
|
|
271
|
-
Promise.all(sellTxs.map(tx => seller.signTransaction(tx)))
|
|
173
|
+
Promise.all(buyTxs.map((tx) => buyer.signTransaction(tx))),
|
|
174
|
+
Promise.all(sellTxs.map((tx) => seller.signTransaction(tx))),
|
|
272
175
|
]);
|
|
273
176
|
nonceManager.clearTemp();
|
|
274
177
|
// ✅ 组装顺序:贿赂 → 买入(多笔) → 卖出(多笔)
|
|
@@ -284,7 +187,7 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
284
187
|
profitNonce: multiNoncePlan.profitNonce,
|
|
285
188
|
gasPrice,
|
|
286
189
|
chainId: chainContext.chainId,
|
|
287
|
-
txType
|
|
190
|
+
txType,
|
|
288
191
|
});
|
|
289
192
|
let profitHopWallets;
|
|
290
193
|
if (profitResult) {
|
|
@@ -304,14 +207,14 @@ export async function flapBundleBuyFirstMerkle(params) {
|
|
|
304
207
|
buyCount,
|
|
305
208
|
sellCount,
|
|
306
209
|
// ✅ 返回每笔交易的具体金额(随机分配后的数组)
|
|
307
|
-
buyAmounts: buyAmountsWei.map(amt => ethers.formatEther(amt)),
|
|
308
|
-
sellAmounts: sellAmountsWei.map(amt => ethers.formatUnits(amt, sellerInfo.decimals))
|
|
309
|
-
}
|
|
210
|
+
buyAmounts: buyAmountsWei.map((amt) => ethers.formatEther(amt)),
|
|
211
|
+
sellAmounts: sellAmountsWei.map((amt) => ethers.formatUnits(amt, sellerInfo.decimals)),
|
|
212
|
+
},
|
|
310
213
|
};
|
|
311
214
|
}
|
|
312
215
|
// ✅ 使用公共模块中的 ERC20_BALANCE_ABI
|
|
313
216
|
const ERC20_BALANCE_OF_ABI = ERC20_BALANCE_ABI;
|
|
314
|
-
async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, reserveGasEth, nativeToken, useNativeToken = true, quoteToken, quoteTokenDecimals = 18, provider }) {
|
|
217
|
+
async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, reserveGasEth, nativeToken, useNativeToken = true, quoteToken, quoteTokenDecimals = 18, provider, }) {
|
|
315
218
|
const reserveGas = ethers.parseEther((reserveGasEth || 0.0005).toString());
|
|
316
219
|
// ✅ 根据是否使用原生代币获取不同的余额
|
|
317
220
|
let buyerBalance;
|
|
@@ -333,9 +236,7 @@ async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, re
|
|
|
333
236
|
else if (buyerFundsPercentage !== undefined) {
|
|
334
237
|
const pct = Math.max(0, Math.min(100, buyerFundsPercentage));
|
|
335
238
|
// ✅ 原生代币需要预留 Gas,ERC20 不需要
|
|
336
|
-
const spendable = useNativeToken
|
|
337
|
-
? (buyerBalance > reserveGas ? buyerBalance - reserveGas : 0n)
|
|
338
|
-
: buyerBalance;
|
|
239
|
+
const spendable = useNativeToken ? (buyerBalance > reserveGas ? buyerBalance - reserveGas : 0n) : buyerBalance;
|
|
339
240
|
buyerFundsWei = (spendable * BigInt(Math.floor(pct * 100))) / 10000n;
|
|
340
241
|
}
|
|
341
242
|
else {
|
|
@@ -363,15 +264,15 @@ async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, re
|
|
|
363
264
|
}
|
|
364
265
|
return { buyerFundsWei, buyerBalance };
|
|
365
266
|
}
|
|
366
|
-
async function quoteBuyerOutput({ portalAddress, tokenAddress, buyerFundsWei, provider, skipQuoteOnError, inputToken = ZERO_ADDRESS // ✅ 默认使用原生代币
|
|
267
|
+
async function quoteBuyerOutput({ portalAddress, tokenAddress, buyerFundsWei, provider, skipQuoteOnError, inputToken = ZERO_ADDRESS, // ✅ 默认使用原生代币
|
|
367
268
|
}) {
|
|
368
|
-
let quotedToken
|
|
269
|
+
let quotedToken;
|
|
369
270
|
const portal = new Contract(portalAddress, PORTAL_ABI, provider);
|
|
370
271
|
try {
|
|
371
272
|
quotedToken = await portal.quoteExactInput.staticCall({
|
|
372
273
|
inputToken, // ✅ 使用动态输入代币
|
|
373
274
|
outputToken: tokenAddress,
|
|
374
|
-
inputAmount: buyerFundsWei
|
|
275
|
+
inputAmount: buyerFundsWei,
|
|
375
276
|
});
|
|
376
277
|
}
|
|
377
278
|
catch (error) {
|
|
@@ -388,46 +289,26 @@ async function quoteBuyerOutput({ portalAddress, tokenAddress, buyerFundsWei, pr
|
|
|
388
289
|
}
|
|
389
290
|
return { quotedToken, sellAmountWei };
|
|
390
291
|
}
|
|
391
|
-
async function ensureSellerBalance({ tokenAddress, provider, seller, sellAmountWei, skipBalanceCheck }) {
|
|
292
|
+
async function ensureSellerBalance({ tokenAddress, provider, seller, sellAmountWei, skipBalanceCheck, }) {
|
|
392
293
|
const erc20 = new Contract(tokenAddress, ERC20_BALANCE_ABI, provider);
|
|
393
|
-
const [sellerTokenBal, decimals] = await Promise.all([
|
|
394
|
-
erc20.balanceOf(seller.address),
|
|
395
|
-
erc20.decimals()
|
|
396
|
-
]);
|
|
294
|
+
const [sellerTokenBal, decimals] = await Promise.all([erc20.balanceOf(seller.address), erc20.decimals()]);
|
|
397
295
|
if (!skipBalanceCheck && sellerTokenBal < sellAmountWei) {
|
|
398
296
|
throw new Error(`卖方代币余额不足: 需要 ${ethers.formatUnits(sellAmountWei, decimals)},实际 ${ethers.formatUnits(sellerTokenBal, decimals)}`);
|
|
399
297
|
}
|
|
400
298
|
return { decimals };
|
|
401
299
|
}
|
|
402
|
-
async function estimateSellFunds(portal, tokenAddress, sellAmountWei, outputToken = ZERO_ADDRESS
|
|
403
|
-
) {
|
|
300
|
+
async function estimateSellFunds(portal, tokenAddress, sellAmountWei, outputToken = ZERO_ADDRESS) {
|
|
404
301
|
try {
|
|
405
302
|
return await portal.quoteExactInput.staticCall({
|
|
406
303
|
inputToken: tokenAddress,
|
|
407
304
|
outputToken, // ✅ 使用动态输出代币
|
|
408
|
-
inputAmount: sellAmountWei
|
|
305
|
+
inputAmount: sellAmountWei,
|
|
409
306
|
});
|
|
410
307
|
}
|
|
411
308
|
catch {
|
|
412
309
|
return 0n;
|
|
413
310
|
}
|
|
414
311
|
}
|
|
415
|
-
/**
|
|
416
|
-
* 根据 userType 获取利润率(基点)
|
|
417
|
-
*/
|
|
418
|
-
function getProfitRateBps(userType) {
|
|
419
|
-
if (userType === 'v1') {
|
|
420
|
-
return PROFIT_CONFIG.RATE_BPS_V1; // 0.05%
|
|
421
|
-
}
|
|
422
|
-
return PROFIT_CONFIG.RATE_BPS_V0; // v0 或默认 0.06%
|
|
423
|
-
}
|
|
424
|
-
function calculateProfitAmount(expectedFunds, userType) {
|
|
425
|
-
if (expectedFunds <= 0n) {
|
|
426
|
-
return 0n;
|
|
427
|
-
}
|
|
428
|
-
const rateBps = getProfitRateBps(userType);
|
|
429
|
-
return (expectedFunds * BigInt(rateBps)) / 10000n;
|
|
430
|
-
}
|
|
431
312
|
/**
|
|
432
313
|
* 计算多笔交易的利润金额
|
|
433
314
|
* @param expectedFunds - 预期收益
|
|
@@ -479,48 +360,13 @@ function splitAmount(totalAmount, count) {
|
|
|
479
360
|
}
|
|
480
361
|
return amounts;
|
|
481
362
|
}
|
|
482
|
-
/**
|
|
483
|
-
* ✅ 规划 nonce
|
|
484
|
-
* 交易顺序:贿赂 → 买入 → 卖出 → 利润
|
|
485
|
-
*/
|
|
486
|
-
async function planNonces({ buyer, seller, extractProfit, needBribeTx, sameAddress, nonceManager }) {
|
|
487
|
-
if (sameAddress) {
|
|
488
|
-
// 同一地址:贿赂(可选) + 买入 + 卖出 + 利润(可选)
|
|
489
|
-
const txCount = countTruthy([needBribeTx, true, true, extractProfit]);
|
|
490
|
-
const nonces = await nonceManager.getNextNonceBatch(buyer, txCount);
|
|
491
|
-
let idx = 0;
|
|
492
|
-
const bribeNonce = needBribeTx ? nonces[idx++] : undefined;
|
|
493
|
-
const buyerNonce = nonces[idx++];
|
|
494
|
-
const sellerNonce = nonces[idx++];
|
|
495
|
-
const profitNonce = extractProfit ? nonces[idx] : undefined;
|
|
496
|
-
return { buyerNonce, sellerNonce, bribeNonce, profitNonce };
|
|
497
|
-
}
|
|
498
|
-
if (needBribeTx || extractProfit) {
|
|
499
|
-
// 卖方需要多个 nonce:贿赂(可选) + 卖出 + 利润(可选)
|
|
500
|
-
const sellerTxCount = countTruthy([needBribeTx, true, extractProfit]);
|
|
501
|
-
// ✅ 并行获取 buyer 和 seller 的 nonce
|
|
502
|
-
const [sellerNonces, buyerNonces] = await Promise.all([
|
|
503
|
-
nonceManager.getNextNonceBatch(seller, sellerTxCount),
|
|
504
|
-
nonceManager.getNextNoncesForWallets([buyer])
|
|
505
|
-
]);
|
|
506
|
-
let idx = 0;
|
|
507
|
-
const bribeNonce = needBribeTx ? sellerNonces[idx++] : undefined;
|
|
508
|
-
const sellerNonce = sellerNonces[idx++];
|
|
509
|
-
const profitNonce = extractProfit ? sellerNonces[idx] : undefined;
|
|
510
|
-
const buyerNonce = buyerNonces[0];
|
|
511
|
-
return { buyerNonce, sellerNonce, bribeNonce, profitNonce };
|
|
512
|
-
}
|
|
513
|
-
// ✅ 使用 getNextNoncesForWallets 批量获取
|
|
514
|
-
const nonces = await nonceManager.getNextNoncesForWallets([buyer, seller]);
|
|
515
|
-
return { buyerNonce: nonces[0], sellerNonce: nonces[1] };
|
|
516
|
-
}
|
|
517
363
|
/**
|
|
518
364
|
* ✅ 规划多笔交易 nonce
|
|
519
365
|
* 交易顺序:贿赂 → 买入(多笔) → 卖出(多笔) → 利润
|
|
520
366
|
*
|
|
521
367
|
* 利润中转需要 PROFIT_HOP_COUNT + 1 个 nonce(支付者→跳1→跳2→利润地址)
|
|
522
368
|
*/
|
|
523
|
-
async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProfit, needBribeTx, sameAddress, nonceManager }) {
|
|
369
|
+
async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProfit, needBribeTx, sameAddress, nonceManager, }) {
|
|
524
370
|
// 利润中转交易数(支付者只需要 1 个 nonce,中转钱包的 nonce 由 buildProfitHopTransactions 内部处理)
|
|
525
371
|
const profitNonceCount = extractProfit ? 1 : 0;
|
|
526
372
|
if (sameAddress) {
|
|
@@ -544,7 +390,7 @@ async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProf
|
|
|
544
390
|
const sellerTxCount = bribeTxCount + sellCount + profitNonceCount;
|
|
545
391
|
const [buyerNonces, sellerNoncesAll] = await Promise.all([
|
|
546
392
|
nonceManager.getNextNonceBatch(buyer, buyCount),
|
|
547
|
-
nonceManager.getNextNonceBatch(seller, sellerTxCount)
|
|
393
|
+
nonceManager.getNextNonceBatch(seller, sellerTxCount),
|
|
548
394
|
]);
|
|
549
395
|
let idx = 0;
|
|
550
396
|
const bribeNonce = needBribeTx ? sellerNoncesAll[idx++] : undefined;
|
|
@@ -553,31 +399,10 @@ async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProf
|
|
|
553
399
|
const profitNonce = extractProfit ? sellerNoncesAll[idx] : undefined;
|
|
554
400
|
return { buyerNonces, sellerNonces, bribeNonce, profitNonce };
|
|
555
401
|
}
|
|
556
|
-
function buildTransactionRequest(unsigned, { from, nonce, gasLimit, gasPrice, priorityFee, chainId, txType, value }) {
|
|
557
|
-
const tx = {
|
|
558
|
-
...unsigned,
|
|
559
|
-
from,
|
|
560
|
-
nonce,
|
|
561
|
-
gasLimit,
|
|
562
|
-
chainId,
|
|
563
|
-
type: txType
|
|
564
|
-
};
|
|
565
|
-
if (value !== undefined) {
|
|
566
|
-
tx.value = value;
|
|
567
|
-
}
|
|
568
|
-
if (txType === 2) {
|
|
569
|
-
tx.maxFeePerGas = gasPrice;
|
|
570
|
-
tx.maxPriorityFeePerGas = priorityFee;
|
|
571
|
-
}
|
|
572
|
-
else {
|
|
573
|
-
tx.gasPrice = gasPrice;
|
|
574
|
-
}
|
|
575
|
-
return tx;
|
|
576
|
-
}
|
|
577
402
|
/**
|
|
578
403
|
* 构建利润多跳转账交易(强制 2 跳中转)
|
|
579
404
|
*/
|
|
580
|
-
async function buildProfitTransaction({ provider, seller, profitAmount, profitNonce, gasPrice, chainId, txType }) {
|
|
405
|
+
async function buildProfitTransaction({ provider, seller, profitAmount, profitNonce, gasPrice, chainId, txType, }) {
|
|
581
406
|
if (profitNonce === undefined || profitAmount === 0n) {
|
|
582
407
|
return null;
|
|
583
408
|
}
|
|
@@ -590,13 +415,10 @@ async function buildProfitTransaction({ provider, seller, profitAmount, profitNo
|
|
|
590
415
|
gasPrice,
|
|
591
416
|
chainId,
|
|
592
417
|
txType,
|
|
593
|
-
startNonce: profitNonce
|
|
418
|
+
startNonce: profitNonce,
|
|
594
419
|
});
|
|
595
420
|
return { signedTransactions: profitHopResult.signedTransactions, hopWallets: profitHopResult.hopWallets };
|
|
596
421
|
}
|
|
597
|
-
function countTruthy(values) {
|
|
598
|
-
return values.filter(Boolean).length;
|
|
599
|
-
}
|
|
600
422
|
// ✅ Provider 缓存(复用连接,减少初始化开销)
|
|
601
423
|
const providerCache = new Map();
|
|
602
424
|
const PROVIDER_CACHE_TTL_MS = 60 * 1000; // 60秒缓存
|
|
@@ -613,10 +435,7 @@ function createChainContext(chain, rpcUrl) {
|
|
|
613
435
|
provider = cached.provider;
|
|
614
436
|
}
|
|
615
437
|
else {
|
|
616
|
-
provider =
|
|
617
|
-
chainId,
|
|
618
|
-
name: chain.toUpperCase()
|
|
619
|
-
});
|
|
438
|
+
provider = createSignProvider(rpcUrl, chainId, chain.toUpperCase());
|
|
620
439
|
providerCache.set(cacheKey, { provider, expireAt: now + PROVIDER_CACHE_TTL_MS });
|
|
621
440
|
}
|
|
622
441
|
return { chainId, nativeToken, portalAddress, provider };
|
|
@@ -629,7 +448,7 @@ function createChainContext(chain, rpcUrl) {
|
|
|
629
448
|
* - ✅ 优化:最大化并行操作
|
|
630
449
|
*/
|
|
631
450
|
async function flapBundleBuyFirstMultiWallet(params) {
|
|
632
|
-
const { chain, buyerPrivateKeys, sellerPrivateKeys, tokenAddress, buyerFunds, config, quoteToken, quoteTokenDecimals = 18 } = params;
|
|
451
|
+
const { chain, buyerPrivateKeys, sellerPrivateKeys, tokenAddress, buyerFunds, config, quoteToken, quoteTokenDecimals = 18, } = params;
|
|
633
452
|
const buyCount = buyerPrivateKeys.length;
|
|
634
453
|
const sellCount = sellerPrivateKeys.length;
|
|
635
454
|
if (buyCount === 0)
|
|
@@ -644,8 +463,8 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
644
463
|
const chainContext = createChainContext(chain, config.rpcUrl);
|
|
645
464
|
const nonceManager = new NonceManager(chainContext.provider);
|
|
646
465
|
// 创建所有钱包实例
|
|
647
|
-
const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, chainContext.provider));
|
|
648
|
-
const sellers = sellerPrivateKeys.map(pk => new Wallet(pk, chainContext.provider));
|
|
466
|
+
const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, chainContext.provider));
|
|
467
|
+
const sellers = sellerPrivateKeys.map((pk) => new Wallet(pk, chainContext.provider));
|
|
649
468
|
// 使用第一个卖方作为主卖方(支付贿赂和利润)
|
|
650
469
|
const mainSeller = sellers[0];
|
|
651
470
|
// ✅ 判断是否使用原生代币
|
|
@@ -671,7 +490,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
671
490
|
const allWallets = [...sellers, ...buyers];
|
|
672
491
|
const uniqueWallets = allWallets.filter((w, i) => {
|
|
673
492
|
const addr = w.address.toLowerCase();
|
|
674
|
-
const firstIdx = allWallets.findIndex(x => x.address.toLowerCase() === addr);
|
|
493
|
+
const firstIdx = allWallets.findIndex((x) => x.address.toLowerCase() === addr);
|
|
675
494
|
return firstIdx === i;
|
|
676
495
|
});
|
|
677
496
|
const erc20 = new Contract(tokenAddress, ERC20_BALANCE_ABI, chainContext.provider);
|
|
@@ -682,11 +501,11 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
682
501
|
buyerFundsWei: totalFundsWei,
|
|
683
502
|
provider: chainContext.provider,
|
|
684
503
|
skipQuoteOnError: config.skipQuoteOnError,
|
|
685
|
-
inputToken
|
|
504
|
+
inputToken,
|
|
686
505
|
}),
|
|
687
506
|
getOptimizedGasPrice(chainContext.provider, getGasPriceConfig(config)),
|
|
688
507
|
erc20.decimals(),
|
|
689
|
-
nonceManager.getNextNoncesForWallets(uniqueWallets)
|
|
508
|
+
nonceManager.getNextNoncesForWallets(uniqueWallets),
|
|
690
509
|
]);
|
|
691
510
|
// 构建 nonces Map
|
|
692
511
|
const noncesMap = new Map();
|
|
@@ -723,19 +542,19 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
723
542
|
gasPrice,
|
|
724
543
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
725
544
|
chainId: chainContext.chainId,
|
|
726
|
-
type: txType
|
|
545
|
+
type: txType,
|
|
727
546
|
});
|
|
728
547
|
}
|
|
729
548
|
// 2. 预分配所有 nonces(同步操作,避免竞态)
|
|
730
549
|
const buyerNonces = [];
|
|
731
550
|
const sellerNonces = [];
|
|
732
|
-
buyers.forEach(buyer => {
|
|
551
|
+
buyers.forEach((buyer) => {
|
|
733
552
|
const addr = buyer.address.toLowerCase();
|
|
734
553
|
const nonce = noncesMap.get(addr);
|
|
735
554
|
buyerNonces.push(nonce);
|
|
736
555
|
noncesMap.set(addr, nonce + 1);
|
|
737
556
|
});
|
|
738
|
-
sellers.forEach(seller => {
|
|
557
|
+
sellers.forEach((seller) => {
|
|
739
558
|
const addr = seller.address.toLowerCase();
|
|
740
559
|
const nonce = noncesMap.get(addr);
|
|
741
560
|
sellerNonces.push(nonce);
|
|
@@ -749,7 +568,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
749
568
|
outputToken: tokenAddress,
|
|
750
569
|
inputAmount: buyAmountsWei[i],
|
|
751
570
|
minOutputAmount: 0n,
|
|
752
|
-
permitData: '0x'
|
|
571
|
+
permitData: '0x',
|
|
753
572
|
}, useNativeToken ? { value: buyAmountsWei[i] } : {});
|
|
754
573
|
return buyer.signTransaction(buildTransactionRequest(unsigned, {
|
|
755
574
|
from: buyer.address,
|
|
@@ -759,7 +578,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
759
578
|
priorityFee,
|
|
760
579
|
chainId: chainContext.chainId,
|
|
761
580
|
txType,
|
|
762
|
-
value: useNativeToken ? buyAmountsWei[i] : 0n
|
|
581
|
+
value: useNativeToken ? buyAmountsWei[i] : 0n,
|
|
763
582
|
}));
|
|
764
583
|
});
|
|
765
584
|
// 4. 并行构建所有卖出交易
|
|
@@ -770,7 +589,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
770
589
|
outputToken,
|
|
771
590
|
inputAmount: sellAmountsWei[i],
|
|
772
591
|
minOutputAmount: 0n,
|
|
773
|
-
permitData: '0x'
|
|
592
|
+
permitData: '0x',
|
|
774
593
|
});
|
|
775
594
|
return seller.signTransaction(buildTransactionRequest(unsigned, {
|
|
776
595
|
from: seller.address,
|
|
@@ -780,14 +599,14 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
780
599
|
priorityFee,
|
|
781
600
|
chainId: chainContext.chainId,
|
|
782
601
|
txType,
|
|
783
|
-
value: 0n
|
|
602
|
+
value: 0n,
|
|
784
603
|
}));
|
|
785
604
|
});
|
|
786
605
|
// ✅ 并行签名所有交易(贿赂 + 买入 + 卖出)
|
|
787
606
|
const [bribeTx, signedBuys, signedSells] = await Promise.all([
|
|
788
607
|
bribeTxPromise,
|
|
789
608
|
Promise.all(buyTxPromises),
|
|
790
|
-
Promise.all(sellTxPromises)
|
|
609
|
+
Promise.all(sellTxPromises),
|
|
791
610
|
]);
|
|
792
611
|
// 组装交易顺序:贿赂 → 买入 → 卖出
|
|
793
612
|
if (bribeTx)
|
|
@@ -805,7 +624,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
805
624
|
profitNonce,
|
|
806
625
|
gasPrice,
|
|
807
626
|
chainId: chainContext.chainId,
|
|
808
|
-
txType
|
|
627
|
+
txType,
|
|
809
628
|
});
|
|
810
629
|
if (profitResult) {
|
|
811
630
|
allTransactions.push(...profitResult.signedTransactions);
|
|
@@ -817,15 +636,15 @@ async function flapBundleBuyFirstMultiWallet(params) {
|
|
|
817
636
|
signedTransactions: allTransactions,
|
|
818
637
|
profitHopWallets,
|
|
819
638
|
metadata: {
|
|
820
|
-
buyerAddress: buyers.map(b => b.address).join(','),
|
|
821
|
-
sellerAddress: sellers.map(s => s.address).join(','),
|
|
639
|
+
buyerAddress: buyers.map((b) => b.address).join(','),
|
|
640
|
+
sellerAddress: sellers.map((s) => s.address).join(','),
|
|
822
641
|
buyAmount: ethers.formatEther(totalFundsWei),
|
|
823
642
|
sellAmount: ethers.formatUnits(quoteResult.sellAmountWei, decimals),
|
|
824
643
|
profitAmount: nativeProfitAmount > 0n ? ethers.formatEther(nativeProfitAmount) : undefined,
|
|
825
644
|
buyCount,
|
|
826
645
|
sellCount,
|
|
827
|
-
buyAmounts: buyAmountsWei.map(amt => ethers.formatEther(amt)),
|
|
828
|
-
sellAmounts: sellAmountsWei.map(amt => ethers.formatUnits(amt, decimals))
|
|
829
|
-
}
|
|
646
|
+
buyAmounts: buyAmountsWei.map((amt) => ethers.formatEther(amt)),
|
|
647
|
+
sellAmounts: sellAmountsWei.map((amt) => ethers.formatUnits(amt, decimals)),
|
|
648
|
+
},
|
|
830
649
|
};
|
|
831
650
|
}
|