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,239 +1,4 @@
|
|
|
1
|
-
import { ethers, Wallet } from 'ethers';
|
|
2
|
-
import { ADDRESSES } from '../../../utils/constants.js';
|
|
3
|
-
import { MULTICALL3_ABI, ERC20_BALANCE_ABI } from '../../../shared/abis/common.js';
|
|
4
|
-
import { CHAINS, GAS_LIMITS } from '../../../shared/constants/index.js';
|
|
5
|
-
// 内部缓存:ERC20 小数位
|
|
6
|
-
const decimalsCache = new Map();
|
|
7
1
|
/**
|
|
8
|
-
*
|
|
9
|
-
* ✅ 优化:避免每次调用都获取 network,直接使用传入的 chainId
|
|
2
|
+
* @deprecated 实现已迁移至 bundle-core/internal.ts,此处仅 re-export 保持 import 路径不变。
|
|
10
3
|
*/
|
|
11
|
-
export
|
|
12
|
-
// ✅ 修复:不访问 provider._network(ethers v6 可能未准备好导致 NETWORK_ERROR)
|
|
13
|
-
// 直接使用传入的 chainId,如果没传则默认 56 (BSC)
|
|
14
|
-
const resolvedChainId = chainId ?? 56;
|
|
15
|
-
const key = `${resolvedChainId}_${token.toLowerCase()}`;
|
|
16
|
-
if (decimalsCache.has(key))
|
|
17
|
-
return decimalsCache.get(key);
|
|
18
|
-
try {
|
|
19
|
-
const erc20 = new ethers.Contract(token, ['function decimals() view returns (uint8)'], provider);
|
|
20
|
-
const d = await erc20.decimals();
|
|
21
|
-
if (!Number.isFinite(d) || d < 0 || d > 36)
|
|
22
|
-
return 18;
|
|
23
|
-
decimalsCache.set(key, d);
|
|
24
|
-
return d;
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
return 18;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* ✅ 生成多跳中间钱包(返回完整钱包信息:地址 + 私钥)
|
|
32
|
-
*/
|
|
33
|
-
export function generateHopWallets(recipientCount, hopCount) {
|
|
34
|
-
const hopCounts = Array.isArray(hopCount) ? hopCount : new Array(recipientCount).fill(hopCount);
|
|
35
|
-
if (hopCounts.every(h => h <= 0))
|
|
36
|
-
return null;
|
|
37
|
-
const result = [];
|
|
38
|
-
for (let i = 0; i < recipientCount; i++) {
|
|
39
|
-
const chain = [];
|
|
40
|
-
for (let j = 0; j < hopCounts[i]; j++) {
|
|
41
|
-
const wallet = Wallet.createRandom();
|
|
42
|
-
chain.push({
|
|
43
|
-
address: wallet.address,
|
|
44
|
-
privateKey: wallet.privateKey
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
result.push(chain);
|
|
48
|
-
}
|
|
49
|
-
return result;
|
|
50
|
-
}
|
|
51
|
-
export function normalizeAmounts(recipients, amount, amounts) {
|
|
52
|
-
if (amounts && amounts.length > 0) {
|
|
53
|
-
if (amounts.length !== recipients.length) {
|
|
54
|
-
throw new Error(`amounts length (${amounts.length}) must match recipients length (${recipients.length})`);
|
|
55
|
-
}
|
|
56
|
-
return amounts.map(a => (typeof a === 'bigint' ? a.toString() : String(a)));
|
|
57
|
-
}
|
|
58
|
-
if (amount !== undefined && String(amount).trim().length > 0) {
|
|
59
|
-
return new Array(recipients.length).fill(typeof amount === 'bigint' ? amount.toString() : String(amount));
|
|
60
|
-
}
|
|
61
|
-
throw new Error('Either amount or amounts must be provided');
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* 批量获取余额(原生代币或 ERC20)
|
|
65
|
-
* ✅ 优化:原生代币也使用 Multicall3 批量获取,减少 RPC 调用
|
|
66
|
-
*/
|
|
67
|
-
export async function batchGetBalances(provider, addresses, tokenAddress) {
|
|
68
|
-
if (addresses.length === 0)
|
|
69
|
-
return [];
|
|
70
|
-
// ✅ 使用公共模块
|
|
71
|
-
const MULTICALL3_ADDRESS = ADDRESSES.BSC.Multicall3;
|
|
72
|
-
const multicall = new ethers.Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
|
|
73
|
-
if (!tokenAddress) {
|
|
74
|
-
// ✅ 优化:原生代币使用 Multicall3.getEthBalance 批量获取(单次 RPC 调用)
|
|
75
|
-
const multicallIface = new ethers.Interface(MULTICALL3_ABI);
|
|
76
|
-
const calls = addresses.map(addr => ({
|
|
77
|
-
target: MULTICALL3_ADDRESS,
|
|
78
|
-
allowFailure: true,
|
|
79
|
-
callData: multicallIface.encodeFunctionData('getEthBalance', [addr])
|
|
80
|
-
}));
|
|
81
|
-
try {
|
|
82
|
-
const results = await multicall.aggregate3(calls);
|
|
83
|
-
return results.map((result) => {
|
|
84
|
-
if (result.success && result.returnData && result.returnData !== '0x') {
|
|
85
|
-
try {
|
|
86
|
-
const decoded = multicallIface.decodeFunctionResult('getEthBalance', result.returnData);
|
|
87
|
-
return decoded[0];
|
|
88
|
-
}
|
|
89
|
-
catch {
|
|
90
|
-
return 0n;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return 0n;
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
// ✅ 回退:并行调用(如果 Multicall3 失败)
|
|
98
|
-
return Promise.all(addresses.map(addr => provider.getBalance(addr).catch(() => 0n)));
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
// ✅ ERC20 余额:使用 Multicall3 批量获取
|
|
103
|
-
const iface = new ethers.Interface(ERC20_BALANCE_ABI);
|
|
104
|
-
const calls = addresses.map(addr => ({
|
|
105
|
-
target: tokenAddress,
|
|
106
|
-
allowFailure: true,
|
|
107
|
-
callData: iface.encodeFunctionData('balanceOf', [addr])
|
|
108
|
-
}));
|
|
109
|
-
try {
|
|
110
|
-
const results = await multicall.aggregate3(calls);
|
|
111
|
-
return results.map((result) => {
|
|
112
|
-
if (result.success && result.returnData && result.returnData !== '0x') {
|
|
113
|
-
try {
|
|
114
|
-
return iface.decodeFunctionResult('balanceOf', result.returnData)[0];
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
return 0n;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
return 0n;
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
// ✅ 回退:并行调用(如果 Multicall3 失败)
|
|
125
|
-
const fallbackCalls = addresses.map(addr => provider
|
|
126
|
-
.call({ to: tokenAddress, data: iface.encodeFunctionData('balanceOf', [addr]) })
|
|
127
|
-
.then(raw => iface.decodeFunctionResult('balanceOf', raw)[0])
|
|
128
|
-
.catch(() => 0n));
|
|
129
|
-
return Promise.all(fallbackCalls);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* 通过模拟交易获取 ERC20 转账的最小 Gas Limit
|
|
135
|
-
* ✅ 使用 eth_estimateGas 预估实际需要的 gas,然后加一个小的缓冲量
|
|
136
|
-
*
|
|
137
|
-
* @param provider - Provider 实例
|
|
138
|
-
* @param tokenAddress - ERC20 代币地址
|
|
139
|
-
* @param from - 发送方地址
|
|
140
|
-
* @param to - 接收方地址
|
|
141
|
-
* @param amount - 转账金额(wei)
|
|
142
|
-
* @param bufferPercent - 缓冲百分比(默认 5%)
|
|
143
|
-
* @returns 预估的 gas limit
|
|
144
|
-
*/
|
|
145
|
-
export async function estimateErc20TransferGas(provider, tokenAddress, from, to, amount, bufferPercent = 5) {
|
|
146
|
-
try {
|
|
147
|
-
const iface = new ethers.Interface(['function transfer(address,uint256) returns (bool)']);
|
|
148
|
-
const data = iface.encodeFunctionData('transfer', [to, amount]);
|
|
149
|
-
const estimatedGas = await provider.estimateGas({
|
|
150
|
-
from,
|
|
151
|
-
to: tokenAddress,
|
|
152
|
-
data,
|
|
153
|
-
value: 0n
|
|
154
|
-
});
|
|
155
|
-
// 添加缓冲量(默认 5%)
|
|
156
|
-
const buffer = (estimatedGas * BigInt(bufferPercent)) / 100n;
|
|
157
|
-
const finalGas = estimatedGas + buffer;
|
|
158
|
-
return finalGas;
|
|
159
|
-
}
|
|
160
|
-
catch (error) {
|
|
161
|
-
console.warn(`[estimateErc20TransferGas] 预估失败,使用默认值:`, error);
|
|
162
|
-
// 回退到默认值
|
|
163
|
-
return 52000n;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* 批量预估多个 ERC20 转账的 Gas Limit
|
|
168
|
-
* ✅ 选取最大值作为统一的 gas limit(确保所有转账都能成功)
|
|
169
|
-
*/
|
|
170
|
-
export async function estimateMaxErc20TransferGas(provider, tokenAddress, from, recipients, amounts, bufferPercent = 5) {
|
|
171
|
-
if (recipients.length === 0)
|
|
172
|
-
return 52000n;
|
|
173
|
-
// 为了减少 RPC 调用,最多预估前 3 个和最后 1 个
|
|
174
|
-
const sampleIndices = [];
|
|
175
|
-
sampleIndices.push(0); // 第一个
|
|
176
|
-
if (recipients.length > 1)
|
|
177
|
-
sampleIndices.push(Math.min(1, recipients.length - 1));
|
|
178
|
-
if (recipients.length > 2)
|
|
179
|
-
sampleIndices.push(Math.min(2, recipients.length - 1));
|
|
180
|
-
if (recipients.length > 3)
|
|
181
|
-
sampleIndices.push(recipients.length - 1); // 最后一个
|
|
182
|
-
// 去重
|
|
183
|
-
const uniqueIndices = [...new Set(sampleIndices)];
|
|
184
|
-
try {
|
|
185
|
-
const estimates = await Promise.all(uniqueIndices.map(i => estimateErc20TransferGas(provider, tokenAddress, from, recipients[i], amounts[i], bufferPercent)));
|
|
186
|
-
// 取最大值
|
|
187
|
-
const maxGas = estimates.reduce((max, gas) => gas > max ? gas : max, 0n);
|
|
188
|
-
return maxGas;
|
|
189
|
-
}
|
|
190
|
-
catch (error) {
|
|
191
|
-
console.warn(`[estimateMaxErc20TransferGas] 批量预估失败,使用默认值:`, error);
|
|
192
|
-
return 52000n;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* 计算 Gas Limit
|
|
197
|
-
* - 原生代币转账:
|
|
198
|
-
* - BSC: 21000 gas(固定)
|
|
199
|
-
* - XLayer: 50000 gas(EIP-7702 授权地址需要更多 gas)
|
|
200
|
-
* - ERC20 标准 transfer:约 45000-55000 gas,使用 55000 作为安全值
|
|
201
|
-
*
|
|
202
|
-
* ✅ 优化:降低 ERC20 gas limit,减少中转钱包 BNB 残留
|
|
203
|
-
* ✅ XLayer 特殊处理:EIP-7702 授权的地址接收 OKB 时会触发 delegate 代码,需要更多 gas
|
|
204
|
-
*/
|
|
205
|
-
export function calculateGasLimit(config, isNative, hasHops, hopCount = 0) {
|
|
206
|
-
if (config.gasLimit !== undefined) {
|
|
207
|
-
return BigInt(config.gasLimit);
|
|
208
|
-
}
|
|
209
|
-
// ✅ XLayer 链原生代币需要更多 gas(EIP-7702 delegate 执行)
|
|
210
|
-
const isXLayer = config.chainId === CHAINS.XLAYER.chainId;
|
|
211
|
-
// ✅ 原生代币: BSC 21000, XLayer 50000(EIP-7702 安全)
|
|
212
|
-
// ✅ ERC20 标准 transfer: 48000(USDT 最低约 46815)
|
|
213
|
-
const baseGas = isNative
|
|
214
|
-
? (isXLayer ? Number(GAS_LIMITS.XLAYER_NATIVE_TRANSFER) : Number(GAS_LIMITS.NATIVE_TRANSFER))
|
|
215
|
-
: 46815;
|
|
216
|
-
// ✅ 多跳时只需要累加单次转账的 gas,不需要额外乘数
|
|
217
|
-
// 每个中转钱包只执行一笔 transfer
|
|
218
|
-
if (hasHops && hopCount > 0) {
|
|
219
|
-
// 多跳场景:返回单次转账的 gas limit(中转钱包只执行一笔交易)
|
|
220
|
-
// 这里不累加,因为每个中转钱包独立执行
|
|
221
|
-
const multiplier = config.gasLimitMultiplier ?? 1.1; // ✅ 降低安全系数
|
|
222
|
-
return BigInt(Math.ceil(baseGas * multiplier));
|
|
223
|
-
}
|
|
224
|
-
// 无多跳或单次调用:使用较小的安全系数
|
|
225
|
-
const multiplier = config.gasLimitMultiplier ?? 1.1;
|
|
226
|
-
return BigInt(Math.ceil(baseGas * multiplier));
|
|
227
|
-
}
|
|
228
|
-
export function isNativeTokenAddress(tokenAddress) {
|
|
229
|
-
if (!tokenAddress)
|
|
230
|
-
return true;
|
|
231
|
-
const v = tokenAddress.trim().toLowerCase();
|
|
232
|
-
if (!v)
|
|
233
|
-
return true;
|
|
234
|
-
if (v === 'native')
|
|
235
|
-
return true;
|
|
236
|
-
if (v === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee')
|
|
237
|
-
return true;
|
|
238
|
-
return false;
|
|
239
|
-
}
|
|
4
|
+
export { getErc20Decimals, getErc20DecimalsMerkle, generateHopWallets, normalizeAmounts, batchGetBalances, estimateErc20TransferGas, estimateMaxErc20TransferGas, calculateGasLimit, isNativeTokenAddress, } from '../../../bundle-core/internal.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PairwiseTransferSignParams, PairwiseTransferMerkleResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 分发(仅签名版本 - 不依赖 Merkle)
|
|
4
|
+
* ✅ 精简版:只负责签名交易,不提交到 Merkle
|
|
5
|
+
* ✅ 优化版:支持 startNonce 参数避免并行调用时的 nonce 冲突
|
|
6
|
+
*/
|
|
7
|
+
export declare function pairwiseTransferWithBundleMerkle(params: PairwiseTransferSignParams): Promise<PairwiseTransferMerkleResult>;
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { ethers, Wallet } from 'ethers';
|
|
2
|
+
import { getOptimizedGasPrice, NonceManager, buildProfitHopTransactions, PROFIT_HOP_COUNT, buildGasFields } from '../../../utils/bundle-helpers.js';
|
|
3
|
+
import { BLOCKRAZOR_BUILDER_EOA, calculateTransferFee } from '../../../utils/constants.js';
|
|
4
|
+
import { GAS_LIMITS, CHAINS } from '../../../shared/constants/index.js';
|
|
5
|
+
import { getTxType, getGasPriceConfig, shouldExtractProfit, getProfitRecipient, getBribeAmount } from './config.js';
|
|
6
|
+
// ==================== Gas 常量(使用统一常量) ====================
|
|
7
|
+
const NATIVE_TRANSFER_GAS_LIMIT = GAS_LIMITS.NATIVE_TRANSFER;
|
|
8
|
+
const BRIBE_GAS_LIMIT = GAS_LIMITS.BRIBE;
|
|
9
|
+
import { getErc20DecimalsMerkle as _getErc20DecimalsMerkle, generateHopWallets as _generateHopWallets, calculateGasLimit as _calculateGasLimit, isNativeTokenAddress as _isNativeTokenAddress } from './internal.js';
|
|
10
|
+
// ==================== 钱包转账按地址收费 ====================
|
|
11
|
+
/**
|
|
12
|
+
* 分发(仅签名版本 - 不依赖 Merkle)
|
|
13
|
+
* ✅ 精简版:只负责签名交易,不提交到 Merkle
|
|
14
|
+
* ✅ 优化版:支持 startNonce 参数避免并行调用时的 nonce 冲突
|
|
15
|
+
*/
|
|
16
|
+
export async function pairwiseTransferWithBundleMerkle(params) {
|
|
17
|
+
const { senderPrivateKeys, receiverAddresses, amount, amounts, tokenAddress, tokenDecimals, hopCount = 0, hopPrivateKeys, config, startNonce, } = params;
|
|
18
|
+
if (!senderPrivateKeys || senderPrivateKeys.length === 0) {
|
|
19
|
+
return { signedTransactions: [], hopWallets: undefined };
|
|
20
|
+
}
|
|
21
|
+
if (!receiverAddresses || receiverAddresses.length === 0) {
|
|
22
|
+
return { signedTransactions: [], hopWallets: undefined };
|
|
23
|
+
}
|
|
24
|
+
if (senderPrivateKeys.length !== receiverAddresses.length) {
|
|
25
|
+
throw new Error(`senderPrivateKeys length (${senderPrivateKeys.length}) must match receiverAddresses length (${receiverAddresses.length})`);
|
|
26
|
+
}
|
|
27
|
+
const pairCount = senderPrivateKeys.length;
|
|
28
|
+
const normalizedAmounts = (() => {
|
|
29
|
+
if (amounts && amounts.length > 0) {
|
|
30
|
+
if (amounts.length !== pairCount) {
|
|
31
|
+
throw new Error(`amounts length (${amounts.length}) must match pair count (${pairCount})`);
|
|
32
|
+
}
|
|
33
|
+
return amounts.map(a => (typeof a === 'bigint' ? a.toString() : String(a)));
|
|
34
|
+
}
|
|
35
|
+
if (amount !== undefined && String(amount).trim().length > 0) {
|
|
36
|
+
const v = typeof amount === 'bigint' ? amount.toString() : String(amount);
|
|
37
|
+
return new Array(pairCount).fill(v);
|
|
38
|
+
}
|
|
39
|
+
throw new Error('Either amount or amounts must be provided');
|
|
40
|
+
})();
|
|
41
|
+
const chainIdNum = config.chainId ?? CHAINS.BSC.chainId;
|
|
42
|
+
const chainName = chainIdNum === CHAINS.MONAD.chainId ? 'Monad' : chainIdNum === CHAINS.BSC.chainId ? 'BSC' : `Chain-${chainIdNum}`;
|
|
43
|
+
const provider = new ethers.JsonRpcProvider(config.rpcUrl, { chainId: chainIdNum, name: chainName });
|
|
44
|
+
const txType = getTxType(config);
|
|
45
|
+
const isNative = _isNativeTokenAddress(tokenAddress);
|
|
46
|
+
const nonceManager = new NonceManager(provider);
|
|
47
|
+
// hop 私钥链优先使用传入
|
|
48
|
+
const providedHops = (() => {
|
|
49
|
+
if (hopPrivateKeys && hopPrivateKeys.length > 0) {
|
|
50
|
+
if (hopPrivateKeys.length !== pairCount) {
|
|
51
|
+
throw new Error(`hopPrivateKeys length (${hopPrivateKeys.length}) must match pair count (${pairCount})`);
|
|
52
|
+
}
|
|
53
|
+
return hopPrivateKeys.every(h => h.length === 0) ? null : hopPrivateKeys;
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
})();
|
|
57
|
+
const preparedHops = providedHops ?? _generateHopWallets(pairCount, hopCount);
|
|
58
|
+
const hasHops = preparedHops !== null;
|
|
59
|
+
const maxHopCount = hasHops ? Math.max(...preparedHops.map(h => h.length)) : 0;
|
|
60
|
+
const finalGasLimit = _calculateGasLimit(config, isNative, hasHops, maxHopCount);
|
|
61
|
+
const nativeGasLimit = (config.prefer21000ForNative ?? false) ? BRIBE_GAS_LIMIT : finalGasLimit;
|
|
62
|
+
// 与 disperse/swap.ts 保持一致:多跳场景固定 gas limit
|
|
63
|
+
const nativeTransferGasLimit = NATIVE_TRANSFER_GAS_LIMIT;
|
|
64
|
+
const erc20TransferGasLimit = GAS_LIMITS.ERC20_TRANSFER;
|
|
65
|
+
const [gasPrice, decimals] = await Promise.all([
|
|
66
|
+
getOptimizedGasPrice(provider, getGasPriceConfig(config)),
|
|
67
|
+
isNative ? Promise.resolve(18) : Promise.resolve(tokenDecimals ?? await _getErc20DecimalsMerkle(provider, tokenAddress, chainIdNum))
|
|
68
|
+
]);
|
|
69
|
+
const gasFields = buildGasFields(txType, gasPrice);
|
|
70
|
+
const iface = isNative ? null : new ethers.Interface(['function transfer(address,uint256) returns (bool)']);
|
|
71
|
+
// ✅ 费用:按地址数量收取固定费用(原生代币),由第一个 sender 支付
|
|
72
|
+
const extractProfit = shouldExtractProfit(config);
|
|
73
|
+
const profitAddr = getProfitRecipient();
|
|
74
|
+
let totalAmountBeforeProfit = 0n;
|
|
75
|
+
let totalProfitNative = 0n;
|
|
76
|
+
const parsedAmountsWei = normalizedAmounts.map(v => {
|
|
77
|
+
const amt = isNative ? ethers.parseEther(v) : ethers.parseUnits(v, decimals);
|
|
78
|
+
totalAmountBeforeProfit += amt;
|
|
79
|
+
return amt;
|
|
80
|
+
});
|
|
81
|
+
// ✅ 按地址数量收取固定费用
|
|
82
|
+
if (extractProfit && pairCount > 0) {
|
|
83
|
+
totalProfitNative = calculateTransferFee(chainIdNum, pairCount);
|
|
84
|
+
}
|
|
85
|
+
// ✅ BSC 链贿赂支持(由第一个 sender 支付)
|
|
86
|
+
const bribeAmount = chainIdNum === CHAINS.BSC.chainId ? getBribeAmount(config) : 0n;
|
|
87
|
+
const needBribeTx = bribeAmount > 0n;
|
|
88
|
+
const bribeSignedTx = [];
|
|
89
|
+
// 计算每个 sender 需要的 nonce 数量(聚合到地址)
|
|
90
|
+
const senderWallets = senderPrivateKeys.map(pk => new Wallet(pk, provider));
|
|
91
|
+
const senderAddrLowerList = senderWallets.map(w => w.address.toLowerCase());
|
|
92
|
+
const firstSenderAddrLower = senderAddrLowerList[0];
|
|
93
|
+
const nonceNeedBySender = new Map();
|
|
94
|
+
for (let i = 0; i < pairCount; i++) {
|
|
95
|
+
const addrLower = senderAddrLowerList[i];
|
|
96
|
+
const hopLen = preparedHops ? preparedHops[i].length : 0;
|
|
97
|
+
const perPairTxCount = (() => {
|
|
98
|
+
if (isNative)
|
|
99
|
+
return 1;
|
|
100
|
+
return hopLen > 0 ? 2 : 1;
|
|
101
|
+
})();
|
|
102
|
+
const cur = nonceNeedBySender.get(addrLower);
|
|
103
|
+
if (cur)
|
|
104
|
+
cur.count += perPairTxCount;
|
|
105
|
+
else
|
|
106
|
+
nonceNeedBySender.set(addrLower, { wallet: senderWallets[i], count: perPairTxCount });
|
|
107
|
+
}
|
|
108
|
+
// ✅ 贿赂交易需要 1 个额外的 nonce
|
|
109
|
+
if (needBribeTx) {
|
|
110
|
+
const cur = nonceNeedBySender.get(firstSenderAddrLower);
|
|
111
|
+
if (cur)
|
|
112
|
+
cur.count += 1;
|
|
113
|
+
}
|
|
114
|
+
if (extractProfit && totalProfitNative > 0n) {
|
|
115
|
+
const cur = nonceNeedBySender.get(firstSenderAddrLower);
|
|
116
|
+
if (cur)
|
|
117
|
+
cur.count += 1;
|
|
118
|
+
}
|
|
119
|
+
const nonceQueueBySender = new Map();
|
|
120
|
+
for (const [addrLower, entry] of nonceNeedBySender.entries()) {
|
|
121
|
+
const count = entry.count;
|
|
122
|
+
const nonces = (addrLower === firstSenderAddrLower && startNonce !== undefined)
|
|
123
|
+
? Array.from({ length: count }, (_, i) => startNonce + i)
|
|
124
|
+
: await nonceManager.getNextNonceBatch(entry.wallet, count);
|
|
125
|
+
nonceQueueBySender.set(addrLower, nonces);
|
|
126
|
+
}
|
|
127
|
+
const popNonce = (addrLower) => {
|
|
128
|
+
const q = nonceQueueBySender.get(addrLower);
|
|
129
|
+
if (!q || q.length === 0)
|
|
130
|
+
throw new Error(`nonce queue empty for sender ${addrLower}`);
|
|
131
|
+
return q.shift();
|
|
132
|
+
};
|
|
133
|
+
const txsToSign = [];
|
|
134
|
+
const nativeHopGasFee = nativeTransferGasLimit * gasPrice;
|
|
135
|
+
const erc20HopGasFee = erc20TransferGasLimit * gasPrice;
|
|
136
|
+
const nativeHopGasFeeForErc20 = nativeTransferGasLimit * gasPrice;
|
|
137
|
+
for (let i = 0; i < pairCount; i++) {
|
|
138
|
+
const senderWallet = senderWallets[i];
|
|
139
|
+
const senderLower = senderAddrLowerList[i];
|
|
140
|
+
const to = receiverAddresses[i];
|
|
141
|
+
const amtWei = parsedAmountsWei[i];
|
|
142
|
+
const hopChain = preparedHops ? preparedHops[i] : [];
|
|
143
|
+
if (!hopChain || hopChain.length === 0) {
|
|
144
|
+
const nonce = popNonce(senderLower);
|
|
145
|
+
if (isNative) {
|
|
146
|
+
txsToSign.push({
|
|
147
|
+
wallet: senderWallet,
|
|
148
|
+
tx: { to, value: amtWei, nonce, gasLimit: nativeGasLimit, chainId: chainIdNum, ...gasFields }
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
const data = iface.encodeFunctionData('transfer', [to, amtWei]);
|
|
153
|
+
txsToSign.push({
|
|
154
|
+
wallet: senderWallet,
|
|
155
|
+
tx: { to: tokenAddress, data, value: 0n, nonce, gasLimit: finalGasLimit, chainId: chainIdNum, ...gasFields }
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const fullChain = [senderWallet, ...hopChain.map(w => new Wallet(typeof w === 'string' ? w : w.privateKey, provider))];
|
|
161
|
+
const addresses = [...fullChain.map(w => w.address), to];
|
|
162
|
+
if (isNative) {
|
|
163
|
+
for (let j = 0; j < addresses.length - 1; j++) {
|
|
164
|
+
const fromWallet = fullChain[j];
|
|
165
|
+
const toAddress = addresses[j + 1];
|
|
166
|
+
const nonce = j === 0 ? popNonce(senderLower) : 0;
|
|
167
|
+
const remainingHops = addresses.length - 2 - j;
|
|
168
|
+
const additionalGas = nativeHopGasFee * BigInt(remainingHops);
|
|
169
|
+
const transferValue = amtWei + additionalGas;
|
|
170
|
+
txsToSign.push({
|
|
171
|
+
wallet: fromWallet,
|
|
172
|
+
tx: { to: toAddress, value: transferValue, nonce, gasLimit: nativeTransferGasLimit, chainId: chainIdNum, ...gasFields }
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
const hopGasNeeds = [];
|
|
178
|
+
for (let j = hopChain.length - 1; j >= 0; j--) {
|
|
179
|
+
if (j === hopChain.length - 1)
|
|
180
|
+
hopGasNeeds.unshift(erc20HopGasFee);
|
|
181
|
+
else {
|
|
182
|
+
const nextHopGas = hopGasNeeds[0];
|
|
183
|
+
hopGasNeeds.unshift(nativeHopGasFeeForErc20 + erc20HopGasFee + nextHopGas);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
txsToSign.push({
|
|
187
|
+
wallet: senderWallet,
|
|
188
|
+
tx: {
|
|
189
|
+
to: fullChain[1].address,
|
|
190
|
+
value: hopGasNeeds[0],
|
|
191
|
+
nonce: popNonce(senderLower),
|
|
192
|
+
gasLimit: nativeTransferGasLimit,
|
|
193
|
+
chainId: chainIdNum,
|
|
194
|
+
...gasFields
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
const mainToFirstHopData = iface.encodeFunctionData('transfer', [fullChain[1].address, amtWei]);
|
|
198
|
+
txsToSign.push({
|
|
199
|
+
wallet: senderWallet,
|
|
200
|
+
tx: {
|
|
201
|
+
to: tokenAddress,
|
|
202
|
+
data: mainToFirstHopData,
|
|
203
|
+
value: 0n,
|
|
204
|
+
nonce: popNonce(senderLower),
|
|
205
|
+
gasLimit: erc20TransferGasLimit,
|
|
206
|
+
chainId: chainIdNum,
|
|
207
|
+
...gasFields
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// hop wallets:逐层传递
|
|
211
|
+
for (let j = 1; j < fullChain.length; j++) {
|
|
212
|
+
const fromWallet = fullChain[j];
|
|
213
|
+
const toAddress = addresses[j + 1];
|
|
214
|
+
const isLastHop = j === fullChain.length - 1;
|
|
215
|
+
if (!isLastHop) {
|
|
216
|
+
const gasToTransfer = hopGasNeeds[j];
|
|
217
|
+
txsToSign.push({
|
|
218
|
+
wallet: fromWallet,
|
|
219
|
+
tx: {
|
|
220
|
+
to: toAddress,
|
|
221
|
+
value: gasToTransfer,
|
|
222
|
+
nonce: 0,
|
|
223
|
+
gasLimit: nativeTransferGasLimit,
|
|
224
|
+
chainId: chainIdNum,
|
|
225
|
+
...gasFields
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
const erc20Data = iface.encodeFunctionData('transfer', [toAddress, amtWei]);
|
|
229
|
+
txsToSign.push({
|
|
230
|
+
wallet: fromWallet,
|
|
231
|
+
tx: {
|
|
232
|
+
to: tokenAddress,
|
|
233
|
+
data: erc20Data,
|
|
234
|
+
value: 0n,
|
|
235
|
+
nonce: 1,
|
|
236
|
+
gasLimit: erc20TransferGasLimit,
|
|
237
|
+
chainId: chainIdNum,
|
|
238
|
+
...gasFields
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
const erc20Data = iface.encodeFunctionData('transfer', [toAddress, amtWei]);
|
|
244
|
+
txsToSign.push({
|
|
245
|
+
wallet: fromWallet,
|
|
246
|
+
tx: {
|
|
247
|
+
to: tokenAddress,
|
|
248
|
+
data: erc20Data,
|
|
249
|
+
value: 0n,
|
|
250
|
+
nonce: 0,
|
|
251
|
+
gasLimit: erc20TransferGasLimit,
|
|
252
|
+
chainId: chainIdNum,
|
|
253
|
+
...gasFields
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (needBribeTx) {
|
|
261
|
+
const firstSenderWallet = senderWallets[0];
|
|
262
|
+
const bribeNonce = popNonce(firstSenderAddrLower);
|
|
263
|
+
const bribeTx = await firstSenderWallet.signTransaction({
|
|
264
|
+
to: BLOCKRAZOR_BUILDER_EOA,
|
|
265
|
+
value: bribeAmount,
|
|
266
|
+
nonce: bribeNonce,
|
|
267
|
+
gasLimit: BRIBE_GAS_LIMIT,
|
|
268
|
+
chainId: chainIdNum,
|
|
269
|
+
...gasFields
|
|
270
|
+
});
|
|
271
|
+
bribeSignedTx.push(bribeTx);
|
|
272
|
+
}
|
|
273
|
+
const signedTxs = await Promise.all(txsToSign.map(({ wallet, tx }) => wallet.signTransaction(tx)));
|
|
274
|
+
// 利润多跳(固定 2 hop)
|
|
275
|
+
let profitHopWallets;
|
|
276
|
+
if (extractProfit && totalProfitNative > 0n) {
|
|
277
|
+
const firstSenderWallet = senderWallets[0];
|
|
278
|
+
const profitNonce = popNonce(firstSenderAddrLower);
|
|
279
|
+
const profitHopResult = await buildProfitHopTransactions({
|
|
280
|
+
provider,
|
|
281
|
+
payerWallet: firstSenderWallet,
|
|
282
|
+
profitAmount: totalProfitNative,
|
|
283
|
+
profitRecipient: profitAddr,
|
|
284
|
+
hopCount: PROFIT_HOP_COUNT,
|
|
285
|
+
gasPrice,
|
|
286
|
+
chainId: chainIdNum,
|
|
287
|
+
txType,
|
|
288
|
+
startNonce: profitNonce
|
|
289
|
+
});
|
|
290
|
+
signedTxs.push(...profitHopResult.signedTransactions);
|
|
291
|
+
profitHopWallets = profitHopResult.hopWallets;
|
|
292
|
+
}
|
|
293
|
+
return {
|
|
294
|
+
signedTransactions: [...bribeSignedTx, ...signedTxs], // ✅ 贿赂交易放在最前面
|
|
295
|
+
hopWallets: preparedHops || undefined,
|
|
296
|
+
profitHopWallets,
|
|
297
|
+
metadata: extractProfit ? {
|
|
298
|
+
pairCount,
|
|
299
|
+
isNative,
|
|
300
|
+
tokenAddress: isNative ? undefined : tokenAddress,
|
|
301
|
+
totalAmount: isNative ? ethers.formatEther(totalAmountBeforeProfit) : ethers.formatUnits(totalAmountBeforeProfit, decimals),
|
|
302
|
+
profitAmount: ethers.formatEther(totalProfitNative),
|
|
303
|
+
profitRecipient: profitAddr,
|
|
304
|
+
hasBribeTx: bribeSignedTx.length > 0, // ✅ 标记是否有贿赂交易
|
|
305
|
+
bribeAmount: bribeSignedTx.length > 0 ? ethers.formatEther(bribeAmount) : undefined
|
|
306
|
+
} : undefined
|
|
307
|
+
};
|
|
308
|
+
}
|
|
@@ -1,28 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* PancakeSwap 官方 Router 交易模块
|
|
3
|
-
*
|
|
4
|
-
* ✅ 使用官方 PancakeSwap V2/V3 Router(非代理合约)
|
|
5
|
-
* - V2 Router: 0x10ED43C718714eb63d5aA57B78B54704E256024E
|
|
6
|
-
* - V3 Router: 0x13f4EA83D0bd40E75C8222255bc855a974568Dd4
|
|
7
|
-
* - V3 Quoter: 0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997
|
|
8
|
-
*/
|
|
9
|
-
import { FourPancakeProxyBatchBuySignParams, FourPancakeProxyBatchBuyResult, FourPancakeProxyBatchSellSignParams, FourPancakeProxyBatchSellResult, FourPancakeProxyApprovalParams, FourPancakeProxyApprovalBatchParams, FourPancakeProxyApprovalBatchResult } from './types.js';
|
|
10
|
-
/**
|
|
11
|
-
* ✅ 授权代币给 PancakeSwap Router(根据 routeType 选择 V2/V3)
|
|
12
|
-
*/
|
|
13
|
-
export declare function approveFourPancakeProxy(params: FourPancakeProxyApprovalParams): Promise<{
|
|
14
|
-
txHash: string;
|
|
15
|
-
approved: boolean;
|
|
16
|
-
}>;
|
|
17
|
-
/**
|
|
18
|
-
* ✅ 批量授权代币给 PancakeSwap Router
|
|
19
|
-
*/
|
|
20
|
-
export declare function approveFourPancakeProxyBatch(params: FourPancakeProxyApprovalBatchParams): Promise<FourPancakeProxyApprovalBatchResult>;
|
|
21
|
-
/**
|
|
22
|
-
* ✅ 使用 PancakeSwap 官方 Router 批量购买代币
|
|
23
|
-
*/
|
|
24
|
-
export declare function fourPancakeProxyBatchBuyMerkle(params: FourPancakeProxyBatchBuySignParams): Promise<FourPancakeProxyBatchBuyResult>;
|
|
25
|
-
/**
|
|
26
|
-
* ✅ 使用 PancakeSwap 官方 Router 批量卖出代币
|
|
27
|
-
*/
|
|
28
|
-
export declare function fourPancakeProxyBatchSellMerkle(params: FourPancakeProxyBatchSellSignParams): Promise<FourPancakeProxyBatchSellResult>;
|
|
1
|
+
export { fourPancakeProxyBatchBuyMerkle, fourPancakeProxyBatchSellMerkle, approveFourPancakeProxy, approveFourPancakeProxyBatch, } from '../../../bundle-core/four-meme/pancake-proxy.js';
|