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,92 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core - 主函数
|
|
3
|
+
*/
|
|
1
4
|
import { ethers, Wallet, Contract, Interface } from 'ethers';
|
|
2
|
-
import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
|
|
3
|
-
import {
|
|
4
|
-
import { GAS_LIMITS
|
|
5
|
-
import { MULTICALL3_ABI
|
|
5
|
+
import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../../utils/bundle-helpers.js';
|
|
6
|
+
import { ZERO_ADDRESS } from '../../../shared/constants/index.js';
|
|
7
|
+
import { GAS_LIMITS } from '../../constants/index.js';
|
|
8
|
+
import { MULTICALL3_ABI } from '../../abis/common.js';
|
|
6
9
|
import { FLAP_PORTAL_ADDRESSES, FLAP_ORIGINAL_PORTAL_ADDRESSES } from '../constants.js';
|
|
7
10
|
import { buildVaultParams, VAULT_PORTAL_ADDRESSES, VAULT_PORTAL_ABI } from '../vault.js';
|
|
8
|
-
import { CHAIN_ID_MAP, PORTAL_ABI, getErrorMessage, getTxType, getGasPriceConfig, shouldExtractProfit, calculateProfit, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA } from './config.js';
|
|
9
|
-
|
|
10
|
-
const MULTICALL3_ADDRESS = ADDRESSES.BSC.Multicall3;
|
|
11
|
-
// ==================== ERC20 → 原生代币报价 ====================
|
|
12
|
-
// BSC 链常量
|
|
13
|
-
const BSC_PANCAKE_V2_ROUTER = ADDRESSES.BSC.PancakeV2Router;
|
|
14
|
-
const BSC_WBNB = ADDRESSES.BSC.WBNB;
|
|
15
|
-
// ✅ Monad 链常量
|
|
16
|
-
const MONAD_PANCAKE_V2_ROUTER = '0xb1bc24c34e88f7d43d5923034e3a14b24daacff9';
|
|
17
|
-
const MONAD_WMON = ADDRESSES.MONAD.WMON;
|
|
18
|
-
// ✅ XLAYER 链常量(PotatoSwap V2)
|
|
19
|
-
const XLAYER_POTATOSWAP_V2_ROUTER = ADDRESSES.XLAYER.PotatoSwapV2Router;
|
|
20
|
-
const XLAYER_WOKB = ADDRESSES.XLAYER.WOKB;
|
|
21
|
-
// ✅ Base 链常量(Uniswap V3 SwapRouter02)
|
|
22
|
-
const BASE_WETH = ADDRESSES.BASE.WETH;
|
|
23
|
-
const ROUTER_ABI = V2_ROUTER_QUOTE_ABI;
|
|
24
|
-
/**
|
|
25
|
-
* 获取 ERC20 代币 → 原生代币的报价
|
|
26
|
-
* @param provider - Provider 实例
|
|
27
|
-
* @param tokenAddress - ERC20 代币地址
|
|
28
|
-
* @param tokenAmount - 代币数量(wei)
|
|
29
|
-
* @param chainId - 链 ID(56=BSC, 143=Monad)
|
|
30
|
-
* @returns 等值的原生代币数量(wei),失败返回 0n
|
|
31
|
-
*/
|
|
32
|
-
async function getTokenToNativeQuote(provider, tokenAddress, tokenAmount, chainId) {
|
|
33
|
-
if (tokenAmount <= 0n)
|
|
34
|
-
return 0n;
|
|
35
|
-
try {
|
|
36
|
-
if (chainId === CHAINS.BSC.chainId) {
|
|
37
|
-
// BSC: 使用 PancakeSwap V2 Router
|
|
38
|
-
const router = new Contract(BSC_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
|
|
39
|
-
const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, BSC_WBNB]);
|
|
40
|
-
return amounts[1];
|
|
41
|
-
}
|
|
42
|
-
if (chainId === CHAINS.MONAD.chainId) {
|
|
43
|
-
// ✅ Monad: 使用 PancakeSwap V2 Router
|
|
44
|
-
const router = new Contract(MONAD_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
|
|
45
|
-
const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, MONAD_WMON]);
|
|
46
|
-
return amounts[1];
|
|
47
|
-
}
|
|
48
|
-
if (chainId === CHAINS.XLAYER.chainId) {
|
|
49
|
-
// ✅ XLAYER: 使用 PotatoSwap V2 Router(USDT0 → WOKB)
|
|
50
|
-
const router = new Contract(XLAYER_POTATOSWAP_V2_ROUTER, ROUTER_ABI, provider);
|
|
51
|
-
const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, XLAYER_WOKB]);
|
|
52
|
-
return amounts[1];
|
|
53
|
-
}
|
|
54
|
-
if (chainId === CHAINS.BASE.chainId) {
|
|
55
|
-
// ✅ Base: 目前大部分 Flap 交易使用 ETH(原生代币),ERC20 报价暂不支持
|
|
56
|
-
// Base 主力 DEX 是 Uniswap V3,V2 Router 流动性有限,暂返回 0
|
|
57
|
-
// TODO: 后续可接入 Uniswap V3 QuoterV2 进行精确报价
|
|
58
|
-
return 0n;
|
|
59
|
-
}
|
|
60
|
-
// 其他链暂不支持报价,返回 0
|
|
61
|
-
return 0n;
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
// 报价失败返回 0(可能是流动性不足或路径不存在)
|
|
65
|
-
return 0n;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* 获取 Gas Limit
|
|
70
|
-
* 优先使用 config.gasLimit,否则使用默认值 * multiplier
|
|
71
|
-
*
|
|
72
|
-
* ✅ ethers v6 最佳实践:直接使用 bigint 类型
|
|
73
|
-
*/
|
|
74
|
-
function getGasLimit(config, defaultGas = 800000) {
|
|
75
|
-
// 优先使用前端传入的 gasLimit
|
|
76
|
-
if (config.gasLimit !== undefined) {
|
|
77
|
-
// 如果已经是 bigint,直接返回;否则转换
|
|
78
|
-
return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
|
|
79
|
-
}
|
|
80
|
-
// 使用默认值 * multiplier
|
|
81
|
-
const multiplier = config.gasLimitMultiplier ?? 1.0;
|
|
82
|
-
const calculatedGas = Math.ceil(defaultGas * multiplier);
|
|
83
|
-
// JavaScript 原生 BigInt 转换(ethers v6 兼容)
|
|
84
|
-
return BigInt(calculatedGas);
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Flap Protocol: 创建代币 + 捆绑购买(仅签名版本 - 不依赖 Merkle)
|
|
88
|
-
* ✅ 精简版:只负责签名交易,不提交到 Merkle
|
|
89
|
-
*/
|
|
11
|
+
import { CHAIN_ID_MAP, PORTAL_ABI, getErrorMessage, getTxType, getGasPriceConfig, shouldExtractProfit, calculateProfit, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA, } from './config.js';
|
|
12
|
+
import { MULTICALL3_ADDRESS, getGasLimit, getTokenToNativeQuote } from './core-helpers.js';
|
|
90
13
|
export async function createTokenWithBundleBuyMerkle(params) {
|
|
91
14
|
const { chain, privateKeys, buyAmounts, tokenInfo, tokenAddress, config } = params;
|
|
92
15
|
if (privateKeys.length === 0) {
|
|
@@ -151,7 +74,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
151
74
|
deflationBps: dist.deflationBps,
|
|
152
75
|
dividendBps: dist.dividendBps,
|
|
153
76
|
lpBps: dist.lpBps,
|
|
154
|
-
minimumShareBalance: BigInt(dist.minimumShareBalance ?? 10000) *
|
|
77
|
+
minimumShareBalance: BigInt(dist.minimumShareBalance ?? 10000) * 10n ** 18n,
|
|
155
78
|
vaultFactory,
|
|
156
79
|
vaultData,
|
|
157
80
|
});
|
|
@@ -180,7 +103,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
180
103
|
deflationBps: dist.deflationBps,
|
|
181
104
|
dividendBps: dist.dividendBps,
|
|
182
105
|
lpBps: dist.lpBps,
|
|
183
|
-
minimumShareBalance: BigInt(dist.minimumShareBalance ?? 10000) *
|
|
106
|
+
minimumShareBalance: BigInt(dist.minimumShareBalance ?? 10000) * 10n ** 18n,
|
|
184
107
|
});
|
|
185
108
|
}
|
|
186
109
|
}
|
|
@@ -201,7 +124,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
201
124
|
extensionID: params.extensionID ?? '0x' + '00'.repeat(32),
|
|
202
125
|
extensionData: params.extensionData ?? '0x',
|
|
203
126
|
dexId: (params.dexId ?? 0) & 0xff,
|
|
204
|
-
lpFeeProfile: (params.lpFeeProfile ?? 0) & 0xff
|
|
127
|
+
lpFeeProfile: (params.lpFeeProfile ?? 0) & 0xff,
|
|
205
128
|
});
|
|
206
129
|
}
|
|
207
130
|
else if (useV3) {
|
|
@@ -219,7 +142,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
219
142
|
beneficiary: devWallet.address,
|
|
220
143
|
permitData: '0x',
|
|
221
144
|
extensionID: params.extensionID,
|
|
222
|
-
extensionData: params.extensionData ?? '0x'
|
|
145
|
+
extensionData: params.extensionData ?? '0x',
|
|
223
146
|
});
|
|
224
147
|
}
|
|
225
148
|
else {
|
|
@@ -235,13 +158,13 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
235
158
|
quoteToken: params.quoteToken || ZERO_ADDRESS,
|
|
236
159
|
quoteAmt: 0n,
|
|
237
160
|
beneficiary: devWallet.address,
|
|
238
|
-
permitData: '0x'
|
|
161
|
+
permitData: '0x',
|
|
239
162
|
});
|
|
240
163
|
}
|
|
241
164
|
const [gasPrice, createTxUnsigned, devNonce] = await Promise.all([
|
|
242
165
|
resolveGasPrice(provider, config),
|
|
243
166
|
createTxPromise,
|
|
244
|
-
nonceManager.getNextNonce(devWallet)
|
|
167
|
+
nonceManager.getNextNonce(devWallet),
|
|
245
168
|
]);
|
|
246
169
|
const createTxRequest = {
|
|
247
170
|
...createTxUnsigned,
|
|
@@ -250,12 +173,12 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
250
173
|
gasLimit: getGasLimit(config),
|
|
251
174
|
gasPrice,
|
|
252
175
|
chainId,
|
|
253
|
-
type: getTxType(config)
|
|
176
|
+
type: getTxType(config),
|
|
254
177
|
};
|
|
255
178
|
const signedCreateTx = await devWallet.signTransaction(createTxRequest);
|
|
256
179
|
signedTxs.push(signedCreateTx);
|
|
257
180
|
const buyers = createWallets(privateKeys.slice(1), provider);
|
|
258
|
-
const extractProfit = shouldExtractProfit(
|
|
181
|
+
const extractProfit = shouldExtractProfit();
|
|
259
182
|
const { fundsList, originalAmounts, totalBuyAmount, totalProfit } = analyzeBuyFunds(buyAmounts, config, extractProfit);
|
|
260
183
|
const maxFundsIndex = findMaxIndex(originalAmounts);
|
|
261
184
|
const gasLimits = buildGasLimitList(buyers.length, config);
|
|
@@ -268,13 +191,13 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
268
191
|
if (!useNativeToken && params.quoteTokenDecimals !== undefined && params.quoteTokenDecimals !== 18) {
|
|
269
192
|
const decimalsDiff = 18 - params.quoteTokenDecimals;
|
|
270
193
|
const divisor = BigInt(10 ** decimalsDiff);
|
|
271
|
-
adjustedFundsList = fundsList.map(amount => amount / divisor);
|
|
194
|
+
adjustedFundsList = fundsList.map((amount) => amount / divisor);
|
|
272
195
|
profitTokenAmount = totalProfit / divisor;
|
|
273
196
|
}
|
|
274
197
|
// ✅ 优化:并行获取 unsignedBuys 和 buyerNonces
|
|
275
198
|
const [unsignedBuys, buyerNonces] = await Promise.all([
|
|
276
199
|
populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, adjustedFundsList, inputToken, useNativeToken),
|
|
277
|
-
allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, useNativeToken ? totalProfit : profitTokenAmount, nonceManager)
|
|
200
|
+
allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, useNativeToken ? totalProfit : profitTokenAmount, nonceManager),
|
|
278
201
|
]);
|
|
279
202
|
// ✅ 贿赂交易放在首位(提高 BlockRazor 打包优先级)
|
|
280
203
|
const bribeAmount = getBribeAmount(config);
|
|
@@ -289,7 +212,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
289
212
|
gasPrice,
|
|
290
213
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
291
214
|
chainId,
|
|
292
|
-
type: getTxType(config)
|
|
215
|
+
type: getTxType(config),
|
|
293
216
|
});
|
|
294
217
|
bribeTxs.push(bribeTx);
|
|
295
218
|
// 调整 maxFundsIndex 钱包的 nonce(买入交易 +1)
|
|
@@ -304,7 +227,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
304
227
|
chainId,
|
|
305
228
|
config,
|
|
306
229
|
fundsList: adjustedFundsList, // ✅ 使用调整后的金额
|
|
307
|
-
useNativeToken // ✅ 传递是否使用原生代币
|
|
230
|
+
useNativeToken, // ✅ 传递是否使用原生代币
|
|
308
231
|
});
|
|
309
232
|
// ✅ 利润多跳转账(强制 2 跳中转)
|
|
310
233
|
const profitTxs = [];
|
|
@@ -325,7 +248,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
325
248
|
gasPrice,
|
|
326
249
|
chainId,
|
|
327
250
|
txType: getTxType(config),
|
|
328
|
-
startNonce: profitNonce
|
|
251
|
+
startNonce: profitNonce,
|
|
329
252
|
});
|
|
330
253
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
331
254
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -337,7 +260,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
|
|
|
337
260
|
signedTransactions: [...bribeTxs, ...signedTxs, ...signedBuys, ...profitTxs],
|
|
338
261
|
tokenAddress,
|
|
339
262
|
profitHopWallets, // ✅ 返回利润多跳钱包
|
|
340
|
-
metadata: buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyers.length)
|
|
263
|
+
metadata: buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyers.length),
|
|
341
264
|
};
|
|
342
265
|
}
|
|
343
266
|
/**
|
|
@@ -352,9 +275,8 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
352
275
|
}
|
|
353
276
|
const { provider, chainId } = createChainContext(chain, config.rpcUrl);
|
|
354
277
|
const nonceManager = new NonceManager(provider);
|
|
355
|
-
const signedTxs = [];
|
|
356
278
|
const buyers = createWallets(privateKeys, provider);
|
|
357
|
-
const extractProfit = shouldExtractProfit(
|
|
279
|
+
const extractProfit = shouldExtractProfit();
|
|
358
280
|
const { fundsList, originalAmounts, totalBuyAmount, totalProfit } = analyzeBuyFunds(buyAmounts, config, extractProfit);
|
|
359
281
|
const maxFundsIndex = findMaxIndex(originalAmounts);
|
|
360
282
|
const gasLimits = buildGasLimitList(buyers.length, config);
|
|
@@ -372,7 +294,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
372
294
|
// 转为 USDC (6位) = 100000 (0.1 USDC)
|
|
373
295
|
const decimalsDiff = 18 - quoteTokenDecimals;
|
|
374
296
|
const divisor = BigInt(10 ** decimalsDiff);
|
|
375
|
-
adjustedFundsList = fundsList.map(amount => amount / divisor);
|
|
297
|
+
adjustedFundsList = fundsList.map((amount) => amount / divisor);
|
|
376
298
|
profitTokenAmount = totalProfit / divisor;
|
|
377
299
|
}
|
|
378
300
|
// ✅ ERC20 购买:获取代币利润等值的原生代币(BNB)报价
|
|
@@ -389,10 +311,8 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
389
311
|
populateBuyTransactionsWithQuote(buyers, FLAP_PORTAL_ADDRESSES[chain], tokenAddress, adjustedFundsList, inputToken, useNativeToken),
|
|
390
312
|
presetNonces && presetNonces.length === buyers.length
|
|
391
313
|
? adjustNoncesForProfit(presetNonces) // ✅ 调整 nonces 避免冲突
|
|
392
|
-
: allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, nativeProfitAmount, nonceManager)
|
|
314
|
+
: allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, nativeProfitAmount, nonceManager),
|
|
393
315
|
]);
|
|
394
|
-
if (presetNonces) {
|
|
395
|
-
}
|
|
396
316
|
// ✅ 贿赂交易放在首位(提高 BlockRazor 打包优先级)
|
|
397
317
|
const bribeAmount = getBribeAmount(config);
|
|
398
318
|
const bribeTxs = [];
|
|
@@ -405,7 +325,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
405
325
|
gasPrice,
|
|
406
326
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
407
327
|
chainId,
|
|
408
|
-
type: getTxType(config)
|
|
328
|
+
type: getTxType(config),
|
|
409
329
|
});
|
|
410
330
|
bribeTxs.push(bribeTx);
|
|
411
331
|
// 调整 maxFundsIndex 钱包的 nonce(买入交易 +1)
|
|
@@ -420,20 +340,18 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
420
340
|
chainId,
|
|
421
341
|
config,
|
|
422
342
|
fundsList: adjustedFundsList, // ✅ 使用调整后的金额
|
|
423
|
-
useNativeToken // ✅ USDT 购买时 value=0,BNB 购买时 value=金额
|
|
343
|
+
useNativeToken, // ✅ USDT 购买时 value=0,BNB 购买时 value=金额
|
|
424
344
|
});
|
|
425
345
|
// ✅ 利润多跳转账
|
|
426
346
|
const profitTxs = [];
|
|
427
347
|
let profitHopWallets;
|
|
428
348
|
// ✅ 检查是否使用分布式利润模式
|
|
429
|
-
const profitMode = config.profitMode
|
|
430
|
-
console.log('🔧 [SDK batchBuyWithBundleMerkle] config.profitMode:', config.profitMode, '-> resolved:', profitMode, 'wallets:', buyers.length);
|
|
349
|
+
const profitMode = config.profitMode ?? 'single';
|
|
431
350
|
if (extractProfit && nativeProfitAmount > 0n) {
|
|
432
351
|
if (profitMode === 'distributed') {
|
|
433
352
|
// ✅ 分布式模式:每个钱包独立扣除自己的利润,每个都有独立的多跳
|
|
434
353
|
// 最多支持 12 个钱包(12 交易 + 36 多跳 + 1 贿赂 = 49 笔)
|
|
435
354
|
const MAX_DISTRIBUTED_WALLETS = 12;
|
|
436
|
-
console.log('🔧 [SDK] 使用分布式利润模式,钱包数:', buyers.length);
|
|
437
355
|
if (buyers.length > MAX_DISTRIBUTED_WALLETS) {
|
|
438
356
|
throw new Error(`分布式利润模式最多支持 ${MAX_DISTRIBUTED_WALLETS} 个钱包,当前 ${buyers.length} 个`);
|
|
439
357
|
}
|
|
@@ -443,9 +361,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
443
361
|
for (let i = 0; i < buyers.length; i++) {
|
|
444
362
|
const walletOriginalAmount = originalAmounts[i];
|
|
445
363
|
// 按比例计算该钱包应承担的利润
|
|
446
|
-
const walletProfit = totalBuyAmount > 0n
|
|
447
|
-
? (nativeProfitAmount * walletOriginalAmount) / totalBuyAmount
|
|
448
|
-
: 0n;
|
|
364
|
+
const walletProfit = totalBuyAmount > 0n ? (nativeProfitAmount * walletOriginalAmount) / totalBuyAmount : 0n;
|
|
449
365
|
perWalletProfits.push(walletProfit);
|
|
450
366
|
}
|
|
451
367
|
// 为每个钱包生成独立的利润多跳交易
|
|
@@ -462,7 +378,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
462
378
|
gasPrice,
|
|
463
379
|
chainId,
|
|
464
380
|
txType: getTxType(config),
|
|
465
|
-
startNonce: profitNonce
|
|
381
|
+
startNonce: profitNonce,
|
|
466
382
|
});
|
|
467
383
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
468
384
|
if (profitHopResult.hopWallets) {
|
|
@@ -484,7 +400,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
484
400
|
gasPrice,
|
|
485
401
|
chainId,
|
|
486
402
|
txType: getTxType(config),
|
|
487
|
-
startNonce: profitNonce
|
|
403
|
+
startNonce: profitNonce,
|
|
488
404
|
});
|
|
489
405
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
490
406
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -499,7 +415,7 @@ export async function batchBuyWithBundleMerkle(params) {
|
|
|
499
415
|
metadata: {
|
|
500
416
|
...buildProfitMetadata(extractProfit, totalBuyAmount, nativeProfitAmount, buyers.length),
|
|
501
417
|
profitMode, // ✅ 返回使用的利润模式
|
|
502
|
-
}
|
|
418
|
+
},
|
|
503
419
|
};
|
|
504
420
|
}
|
|
505
421
|
/**
|
|
@@ -514,23 +430,22 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
514
430
|
}
|
|
515
431
|
const { provider, chainId } = createChainContext(chain, config.rpcUrl);
|
|
516
432
|
const nonceManager = new NonceManager(provider);
|
|
517
|
-
const signedTxs = [];
|
|
518
433
|
const wallets = createWallets(privateKeys, provider);
|
|
519
|
-
const amountsWei = sellAmounts.map(a => ethers.parseUnits(a, 18));
|
|
434
|
+
const amountsWei = sellAmounts.map((a) => ethers.parseUnits(a, 18));
|
|
520
435
|
const portalAddr = FLAP_PORTAL_ADDRESSES[chain];
|
|
521
436
|
const readOnlyPortal = new ethers.Contract(portalAddr, PORTAL_ABI, provider);
|
|
522
437
|
const gasLimits = buildGasLimitList(wallets.length, config);
|
|
523
|
-
const portals = wallets.map(w => new ethers.Contract(portalAddr, PORTAL_ABI, w));
|
|
438
|
+
const portals = wallets.map((w) => new ethers.Contract(portalAddr, PORTAL_ABI, w));
|
|
524
439
|
// ✅ 确定 outputToken:如果传入了 quoteToken 且非零地址,则使用它;否则使用零地址(原生代币)
|
|
525
440
|
const outputToken = quoteToken && quoteToken !== ZERO_ADDRESS ? quoteToken : ZERO_ADDRESS;
|
|
526
441
|
const useNativeOutput = outputToken === ZERO_ADDRESS;
|
|
527
442
|
// ✅ 优化:如果前端传入了 nonces,直接使用(跳过 RPC 调用)
|
|
528
443
|
const presetNonces = config.nonces;
|
|
529
|
-
const extractProfit = shouldExtractProfit(
|
|
444
|
+
const extractProfit = shouldExtractProfit();
|
|
530
445
|
// ✅ 并行执行 gasPrice 和 quoteSellOutputs(Multicall3)
|
|
531
446
|
const [gasPrice, quotedOutputs] = await Promise.all([
|
|
532
447
|
resolveGasPrice(provider, config),
|
|
533
|
-
quoteSellOutputsWithQuote(readOnlyPortal, tokenAddress, amountsWei, outputToken)
|
|
448
|
+
quoteSellOutputsWithQuote(readOnlyPortal, tokenAddress, amountsWei, outputToken),
|
|
534
449
|
]);
|
|
535
450
|
// ✅ 计算利润和 maxRevenueIndex(用于 nonce 分配)
|
|
536
451
|
let totalTokenProfit = 0n;
|
|
@@ -540,7 +455,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
540
455
|
for (let i = 0; i < wallets.length; i++) {
|
|
541
456
|
const quoted = quotedOutputs[i];
|
|
542
457
|
if (quoted > 0n) {
|
|
543
|
-
const { profit } = calculateProfit(quoted
|
|
458
|
+
const { profit } = calculateProfit(quoted);
|
|
544
459
|
totalTokenProfit += profit;
|
|
545
460
|
if (quoted > maxRevenue) {
|
|
546
461
|
maxRevenue = quoted;
|
|
@@ -572,9 +487,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
572
487
|
const maxRevenueNonces = await nonceManager.getNextNonceBatch(wallets[maxRevenueIndex], maxRevenueNonceCount);
|
|
573
488
|
// 其他钱包各需要 1 个 nonce
|
|
574
489
|
const otherWallets = wallets.filter((_, i) => i !== maxRevenueIndex);
|
|
575
|
-
const otherNonces = otherWallets.length > 0
|
|
576
|
-
? await nonceManager.getNextNoncesForWallets(otherWallets)
|
|
577
|
-
: [];
|
|
490
|
+
const otherNonces = otherWallets.length > 0 ? await nonceManager.getNextNoncesForWallets(otherWallets) : [];
|
|
578
491
|
// 组装最终的 nonces 数组(保持原顺序)
|
|
579
492
|
nonces = [];
|
|
580
493
|
let otherIdx = 0;
|
|
@@ -605,7 +518,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
605
518
|
outputToken, // ✅ 使用动态 outputToken
|
|
606
519
|
inputAmount: amountsWei[i],
|
|
607
520
|
minOutputAmount: minOuts[i],
|
|
608
|
-
permitData: '0x'
|
|
521
|
+
permitData: '0x',
|
|
609
522
|
})));
|
|
610
523
|
// ✅ 贿赂交易放在首位
|
|
611
524
|
const bribeTxs = [];
|
|
@@ -617,7 +530,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
617
530
|
gasPrice,
|
|
618
531
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
619
532
|
chainId,
|
|
620
|
-
type: getTxType(config)
|
|
533
|
+
type: getTxType(config),
|
|
621
534
|
});
|
|
622
535
|
bribeTxs.push(bribeTx);
|
|
623
536
|
}
|
|
@@ -631,14 +544,13 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
631
544
|
gasPrice,
|
|
632
545
|
chainId,
|
|
633
546
|
type: getTxType(config),
|
|
634
|
-
value: 0n // ✅ 卖出交易不发送原生代币
|
|
547
|
+
value: 0n, // ✅ 卖出交易不发送原生代币
|
|
635
548
|
})));
|
|
636
549
|
// ✅ 利润多跳转账
|
|
637
550
|
const profitTxs = [];
|
|
638
551
|
let profitHopWallets;
|
|
639
552
|
// ✅ 检查是否使用分布式利润模式
|
|
640
|
-
const profitMode = config.profitMode
|
|
641
|
-
console.log('🔧 [SDK batchSellWithBundleMerkle] config.profitMode:', config.profitMode, '-> resolved:', profitMode, 'wallets:', wallets.length);
|
|
553
|
+
const profitMode = config.profitMode ?? 'single';
|
|
642
554
|
if (needProfitTx) {
|
|
643
555
|
// ERC20 输出时:获取代币利润等值的原生代币(BNB)报价
|
|
644
556
|
let totalNativeProfitAmount = totalTokenProfit;
|
|
@@ -672,7 +584,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
672
584
|
gasPrice,
|
|
673
585
|
chainId,
|
|
674
586
|
txType: getTxType(config),
|
|
675
|
-
startNonce: walletProfitNonce
|
|
587
|
+
startNonce: walletProfitNonce,
|
|
676
588
|
});
|
|
677
589
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
678
590
|
if (profitHopResult.hopWallets) {
|
|
@@ -694,7 +606,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
694
606
|
gasPrice,
|
|
695
607
|
chainId,
|
|
696
608
|
txType: getTxType(config),
|
|
697
|
-
startNonce: profitNonce
|
|
609
|
+
startNonce: profitNonce,
|
|
698
610
|
});
|
|
699
611
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
700
612
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -710,7 +622,7 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
710
622
|
metadata: {
|
|
711
623
|
profitMode, // ✅ 返回使用的利润模式
|
|
712
624
|
totalProfit: totalTokenProfit.toString(),
|
|
713
|
-
}
|
|
625
|
+
},
|
|
714
626
|
};
|
|
715
627
|
}
|
|
716
628
|
// ✅ Provider 缓存(复用连接,减少初始化开销)
|
|
@@ -731,29 +643,27 @@ function createChainContext(chain, rpcUrl) {
|
|
|
731
643
|
return { chainId, provider };
|
|
732
644
|
}
|
|
733
645
|
async function resolveGasPrice(provider, config) {
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
const gasPrice = config.gasPrice;
|
|
737
|
-
return gasPrice;
|
|
646
|
+
if ('gasPrice' in config && config.gasPrice !== undefined) {
|
|
647
|
+
return config.gasPrice;
|
|
738
648
|
}
|
|
739
649
|
return await getOptimizedGasPrice(provider, getGasPriceConfig(config));
|
|
740
650
|
}
|
|
741
651
|
function createWallets(privateKeys, provider) {
|
|
742
|
-
return privateKeys.map(key => new Wallet(key, provider));
|
|
652
|
+
return privateKeys.map((key) => new Wallet(key, provider));
|
|
743
653
|
}
|
|
744
654
|
function analyzeBuyFunds(buyAmounts, config, extractProfit) {
|
|
745
655
|
const result = {
|
|
746
656
|
fundsList: [],
|
|
747
657
|
originalAmounts: [],
|
|
748
658
|
totalBuyAmount: 0n,
|
|
749
|
-
totalProfit: 0n
|
|
659
|
+
totalProfit: 0n,
|
|
750
660
|
};
|
|
751
|
-
buyAmounts.forEach(amount => {
|
|
661
|
+
buyAmounts.forEach((amount) => {
|
|
752
662
|
const originalAmount = ethers.parseEther(amount);
|
|
753
663
|
result.originalAmounts.push(originalAmount);
|
|
754
664
|
result.totalBuyAmount += originalAmount;
|
|
755
665
|
if (extractProfit) {
|
|
756
|
-
const { remaining, profit } = calculateProfit(originalAmount
|
|
666
|
+
const { remaining, profit } = calculateProfit(originalAmount);
|
|
757
667
|
result.totalProfit += profit;
|
|
758
668
|
result.fundsList.push(remaining);
|
|
759
669
|
}
|
|
@@ -782,13 +692,13 @@ function findMaxIndex(values) {
|
|
|
782
692
|
* 当 inputToken 为非零地址(如 USDC)时,value 为 0
|
|
783
693
|
*/
|
|
784
694
|
async function populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, fundsList, inputToken, useNativeToken) {
|
|
785
|
-
const portals = buyers.map(wallet => new ethers.Contract(portalAddr, PORTAL_ABI, wallet));
|
|
695
|
+
const portals = buyers.map((wallet) => new ethers.Contract(portalAddr, PORTAL_ABI, wallet));
|
|
786
696
|
return await Promise.all(portals.map((portal, i) => portal.swapExactInput.populateTransaction({
|
|
787
697
|
inputToken,
|
|
788
698
|
outputToken: tokenAddress,
|
|
789
699
|
inputAmount: fundsList[i],
|
|
790
700
|
minOutputAmount: 0n,
|
|
791
|
-
permitData: '0x'
|
|
701
|
+
permitData: '0x',
|
|
792
702
|
},
|
|
793
703
|
// ✅ 如果使用原生代币,value 为购买金额;否则为 0
|
|
794
704
|
useNativeToken ? { value: fundsList[i] } : {})));
|
|
@@ -825,9 +735,7 @@ async function allocateBuyerNonces(buyers, extractProfit, maxIndex, totalProfit,
|
|
|
825
735
|
const maxIndexNonces = await nonceManager.getNextNonceBatch(buyers[maxIndex], 2);
|
|
826
736
|
// 其他钱包各需要 1 个 nonce
|
|
827
737
|
const otherBuyers = buyers.filter((_, i) => i !== maxIndex);
|
|
828
|
-
const otherNonces = otherBuyers.length > 0
|
|
829
|
-
? await nonceManager.getNextNoncesForWallets(otherBuyers)
|
|
830
|
-
: [];
|
|
738
|
+
const otherNonces = otherBuyers.length > 0 ? await nonceManager.getNextNoncesForWallets(otherBuyers) : [];
|
|
831
739
|
// 组装最终的 nonces 数组(保持原顺序)
|
|
832
740
|
const nonces = [];
|
|
833
741
|
let otherIdx = 0;
|
|
@@ -841,7 +749,7 @@ async function allocateBuyerNonces(buyers, extractProfit, maxIndex, totalProfit,
|
|
|
841
749
|
}
|
|
842
750
|
return nonces;
|
|
843
751
|
}
|
|
844
|
-
async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, gasPrice, chainId, config, fundsList, useNativeToken = true // ✅ 默认使用原生代币
|
|
752
|
+
async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, gasPrice, chainId, config, fundsList, useNativeToken = true, // ✅ 默认使用原生代币
|
|
845
753
|
}) {
|
|
846
754
|
return await Promise.all(unsignedBuys.map((unsigned, i) => buyers[i].signTransaction({
|
|
847
755
|
...unsigned,
|
|
@@ -851,7 +759,7 @@ async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, ga
|
|
|
851
759
|
gasPrice,
|
|
852
760
|
chainId,
|
|
853
761
|
type: getTxType(config),
|
|
854
|
-
value: useNativeToken ? fundsList[i] : 0n // ✅ 非原生代币时 value 为 0
|
|
762
|
+
value: useNativeToken ? fundsList[i] : 0n, // ✅ 非原生代币时 value 为 0
|
|
855
763
|
})));
|
|
856
764
|
}
|
|
857
765
|
function buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyerCount) {
|
|
@@ -862,7 +770,7 @@ function buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyerCo
|
|
|
862
770
|
totalBuyAmount: ethers.formatEther(totalBuyAmount),
|
|
863
771
|
profitAmount: ethers.formatEther(totalProfit),
|
|
864
772
|
profitRecipient: getProfitRecipient(),
|
|
865
|
-
buyerCount
|
|
773
|
+
buyerCount,
|
|
866
774
|
};
|
|
867
775
|
}
|
|
868
776
|
/**
|
|
@@ -878,7 +786,7 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
|
|
|
878
786
|
const result = await portal.quoteExactInput.staticCall({
|
|
879
787
|
inputToken: tokenAddress,
|
|
880
788
|
outputToken,
|
|
881
|
-
inputAmount: amountsWei[0]
|
|
789
|
+
inputAmount: amountsWei[0],
|
|
882
790
|
});
|
|
883
791
|
return [result];
|
|
884
792
|
}
|
|
@@ -891,14 +799,16 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
|
|
|
891
799
|
const portalIface = new Interface(PORTAL_ABI);
|
|
892
800
|
const multicall = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
|
|
893
801
|
// 构建批量调用
|
|
894
|
-
const calls = amountsWei.map(amount => ({
|
|
802
|
+
const calls = amountsWei.map((amount) => ({
|
|
895
803
|
target: portalAddress,
|
|
896
804
|
allowFailure: true, // 允许单个失败
|
|
897
|
-
callData: portalIface.encodeFunctionData('quoteExactInput', [
|
|
805
|
+
callData: portalIface.encodeFunctionData('quoteExactInput', [
|
|
806
|
+
{
|
|
898
807
|
inputToken: tokenAddress,
|
|
899
808
|
outputToken,
|
|
900
|
-
inputAmount: amount
|
|
901
|
-
}
|
|
809
|
+
inputAmount: amount,
|
|
810
|
+
},
|
|
811
|
+
]),
|
|
902
812
|
}));
|
|
903
813
|
try {
|
|
904
814
|
const results = await multicall.aggregate3.staticCall(calls);
|
|
@@ -922,7 +832,7 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
|
|
|
922
832
|
return await portal.quoteExactInput.staticCall({
|
|
923
833
|
inputToken: tokenAddress,
|
|
924
834
|
outputToken,
|
|
925
|
-
inputAmount: amount
|
|
835
|
+
inputAmount: amount,
|
|
926
836
|
});
|
|
927
837
|
}
|
|
928
838
|
catch {
|