four-flap-meme-sdk 2.2.18 → 2.2.20
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/dist/__tests__/subpath-exports.test.d.ts +1 -0
- package/dist/__tests__/subpath-exports.test.js +64 -0
- package/dist/abis/common.d.ts +85 -0
- package/dist/abis/common.js +240 -0
- package/dist/abis/contracts/TaxToken.json +969 -0
- package/dist/abis/contracts/TokenManager.json +836 -0
- package/dist/abis/contracts/TokenManager2.json +136 -0
- package/dist/abis/contracts/TokenManagerHelper3.json +993 -0
- package/dist/abis/contracts/index.d.ts +5 -0
- package/dist/abis/contracts/index.js +5 -0
- package/dist/abis/flap/index.d.ts +5 -0
- package/dist/abis/flap/index.js +5 -0
- package/dist/abis/flap/portal-eip7702.d.ts +4 -0
- package/dist/abis/flap/portal-eip7702.js +39 -0
- package/dist/abis/flap/portal-events.d.ts +6 -0
- package/dist/abis/flap/portal-events.js +17 -0
- package/dist/abis/flap/portal-merkle.d.ts +4 -0
- package/dist/abis/flap/portal-merkle.js +25 -0
- package/dist/abis/flap/portal.d.ts +6 -0
- package/dist/abis/flap/portal.js +37 -0
- package/dist/abis/flap/vault.d.ts +171 -0
- package/dist/abis/flap/vault.js +91 -0
- package/dist/abis/index.d.ts +8 -0
- package/dist/abis/index.js +11 -0
- package/dist/bundle-core/__tests__/config-helpers.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
- package/dist/bundle-core/__tests__/facade-parity.test.d.ts +1 -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 +37 -0
- package/dist/bundle-core/config-helpers.js +58 -0
- package/dist/bundle-core/errors.d.ts +50 -0
- package/dist/bundle-core/errors.js +38 -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 +41 -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 +456 -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 +28 -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 +16 -0
- package/dist/bundle-core/internal.js +160 -0
- package/dist/bundle-core/sign-context-helpers.d.ts +26 -0
- package/dist/bundle-core/sign-context-helpers.js +63 -0
- package/dist/bundle-core/submit.d.ts +293 -0
- package/dist/bundle-core/submit.js +731 -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 -113
- package/dist/chains/bsc/four/config.d.ts +5 -67
- package/dist/chains/bsc/four/config.js +2 -114
- package/dist/chains/bsc/four/core.d.ts +1 -4
- package/dist/chains/bsc/four/core.js +1 -592
- 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 -46
- package/dist/chains/bsc/four/internal.js +2 -239
- package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
- package/dist/chains/bsc/four/pancake-proxy.js +1 -687
- 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 -752
- package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
- package/dist/chains/bsc/four/swap-buy-first.js +2 -507
- 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 -766
- 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 -1552
- package/dist/chains/bsc/iro.d.ts +5 -0
- package/dist/chains/bsc/iro.js +4 -0
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +155 -0
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +80 -0
- package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
- package/dist/chains/bsc/pancake/bundle-buy-first.js +98 -213
- 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 +114 -726
- 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.d.ts +2 -2
- 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 +55 -25
- package/dist/chains/eni/batch-router/utils.js +32 -6
- package/dist/chains/eni/bundler/sign.js +5 -6
- package/dist/chains/eni/bundler/submit.js +1 -4
- package/dist/chains/eni/constants.js +1 -1
- package/dist/chains/eni/flat-aliases.d.ts +10 -0
- package/dist/chains/eni/flat-aliases.js +8 -0
- package/dist/chains/eni/index.d.ts +2 -1
- package/dist/chains/eni/index.js +1 -0
- 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 +9 -6
- package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -44
- 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 -46
- 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.d.ts +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.d.ts +43 -0
- package/dist/chains/eni/submit.js +287 -0
- package/dist/chains/index.d.ts +13 -0
- package/dist/chains/index.js +13 -0
- package/dist/chains/xlayer/constants.d.ts +5 -0
- package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
- package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -21
- 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 +104 -74
- package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
- package/dist/chains/xlayer/eip7702/bundle-sell.js +29 -111
- package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
- package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -245
- package/dist/chains/xlayer/eip7702/constants.d.ts +11 -26
- package/dist/chains/xlayer/eip7702/constants.js +15 -68
- package/dist/chains/xlayer/eip7702/flat-aliases.d.ts +13 -0
- package/dist/chains/xlayer/eip7702/flat-aliases.js +10 -0
- package/dist/chains/xlayer/eip7702/index.d.ts +28 -46
- package/dist/chains/xlayer/eip7702/index.js +28 -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 +63 -307
- package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
- package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +58 -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 +89 -164
- package/dist/chains/xlayer/eoa/constants.d.ts +1 -1
- package/dist/chains/xlayer/eoa/constants.js +2 -16
- package/dist/chains/xlayer/eoa/dex-helpers.d.ts +1 -1
- package/dist/chains/xlayer/eoa/dex-helpers.js +7 -37
- 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 +66 -299
- package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
- package/dist/chains/xlayer/eoa/eoa-wash-volume.js +18 -23
- 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 +5 -4
- package/dist/chains/xlayer/eoa/types.d.ts +2 -2
- package/dist/chains/xlayer/eoa/types.js +1 -3
- package/dist/chains/xlayer/index.d.ts +3 -2
- package/dist/chains/xlayer/index.js +4 -7
- package/dist/contracts/helper3.d.ts +20 -5
- package/dist/contracts/helper3.js +56 -20
- package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
- package/dist/contracts/tm-bundle-helpers.js +73 -0
- package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
- package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -113
- package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -67
- package/dist/contracts/tm-bundle-merkle/config.js +2 -114
- package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
- package/dist/contracts/tm-bundle-merkle/core.js +1 -591
- 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 -46
- package/dist/contracts/tm-bundle-merkle/internal.js +2 -238
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -686
- 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 -928
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -506
- 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 -764
- 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 +6 -18
- package/dist/contracts/tm-bundle-merkle/utils.js +6 -1501
- package/dist/contracts/tm-bundle.d.ts +3 -51
- package/dist/contracts/tm-bundle.js +120 -187
- package/dist/contracts/tm.d.ts +10 -8
- package/dist/contracts/tm.js +39 -35
- package/dist/contracts/tm1.js +9 -4
- package/dist/contracts/tm2.js +10 -5
- package/dist/dex/direct-router-helpers.d.ts +269 -0
- package/dist/dex/direct-router-helpers.js +536 -0
- package/dist/dex/direct-router.d.ts +3 -125
- package/dist/dex/direct-router.js +244 -672
- 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/flap/index.d.ts +11 -0
- package/dist/flap/index.js +9 -0
- package/dist/flows/create.d.ts +2 -1
- package/dist/flows/create.js +6 -6
- package/dist/flows/index.d.ts +9 -0
- package/dist/flows/index.js +9 -0
- package/dist/index.d.ts +20 -88
- package/dist/index.js +20 -218
- package/dist/merkle/index.d.ts +12 -0
- package/dist/merkle/index.js +11 -0
- package/dist/shared/abis/common.d.ts +2 -83
- package/dist/shared/abis/common.js +2 -254
- package/dist/shared/abis/index.d.ts +5 -6
- package/dist/shared/abis/index.js +5 -7
- package/dist/shared/clients/blockrazor.d.ts +4 -8
- package/dist/shared/clients/blockrazor.js +43 -35
- package/dist/shared/clients/club48.d.ts +2 -2
- package/dist/shared/clients/club48.js +36 -30
- package/dist/shared/clients/emitservice.js +2 -0
- package/dist/shared/clients/four.d.ts +21 -6
- package/dist/shared/clients/four.js +29 -24
- package/dist/shared/clients/index.d.ts +8 -0
- package/dist/shared/clients/index.js +8 -0
- package/dist/shared/clients/merkle.d.ts +4 -3
- package/dist/shared/clients/merkle.js +30 -47
- package/dist/shared/constants/addresses.d.ts +27 -1
- package/dist/shared/constants/addresses.js +39 -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 +4 -1
- package/dist/shared/constants/index.js +2 -1
- package/dist/shared/constants/quote.d.ts +30 -0
- package/dist/shared/constants/quote.js +37 -0
- package/dist/shared/flap/abi.js +1 -1
- package/dist/shared/flap/constants.d.ts +1 -2
- package/dist/shared/flap/constants.js +3 -4
- package/dist/shared/flap/curve.js +3 -0
- package/dist/shared/flap/errors.d.ts +1 -4
- package/dist/shared/flap/errors.js +20 -1
- package/dist/shared/flap/index.d.ts +4 -5
- package/dist/shared/flap/index.js +4 -5
- package/dist/shared/flap/launch-v6.d.ts +0 -5
- package/dist/shared/flap/launch-v6.js +2 -16
- package/dist/shared/flap/meta.d.ts +22 -18
- package/dist/shared/flap/meta.js +32 -24
- package/dist/shared/flap/permit.js +10 -3
- package/dist/shared/flap/pinata.d.ts +22 -6
- package/dist/shared/flap/pinata.js +21 -26
- 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 +168 -175
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.d.ts +17 -4
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +96 -117
- package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +104 -122
- 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-batch.d.ts +8 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-batch.js +227 -0
- 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 +69 -288
- package/dist/shared/flap/portal-bundle-merkle/swap-cross.d.ts +9 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-cross.js +139 -0
- 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-planning.d.ts +70 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-planning.js +182 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-quick-batch.d.ts +16 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-quick-batch.js +327 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-single.d.ts +2 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-single.js +184 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-types.d.ts +101 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-types.js +1 -0
- package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +6 -199
- package/dist/shared/flap/portal-bundle-merkle/swap.js +5 -1357
- package/dist/shared/flap/portal-bundle-merkle/types.d.ts +88 -12
- 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 +83 -78
- package/dist/shared/flap/portal-create-token.d.ts +39 -21
- package/dist/shared/flap/portal-create-token.js +121 -124
- package/dist/shared/flap/portal.d.ts +1 -2
- package/dist/shared/flap/portal.js +36 -28
- package/dist/shared/flap/vanity.d.ts +6 -6
- package/dist/shared/flap/vanity.js +15 -21
- package/dist/shared/flap/vault.d.ts +25 -93
- package/dist/shared/flap/vault.js +77 -127
- package/dist/shared/foundation/amount/split-by-weight.d.ts +5 -0
- package/dist/shared/foundation/amount/split-by-weight.js +35 -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/erc20/decimals.d.ts +7 -0
- package/dist/shared/foundation/erc20/decimals.js +24 -0
- package/dist/shared/foundation/gas/bundle-gas.d.ts +49 -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 +15 -0
- package/dist/shared/foundation/index.js +14 -0
- package/dist/shared/foundation/nonce/nonce-manager.d.ts +19 -0
- package/dist/shared/foundation/nonce/nonce-manager.js +217 -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/foundation/wallet/generate.d.ts +5 -0
- package/dist/shared/foundation/wallet/generate.js +8 -0
- package/dist/shared/four/tax-token.d.ts +1 -1
- package/dist/shared/four/tax-token.js +31 -10
- package/dist/shared/index.d.ts +6 -0
- package/dist/shared/index.js +4 -0
- package/dist/types/errors.d.ts +27 -0
- package/dist/types/errors.js +34 -0
- package/dist/utils/airdrop-sweep.d.ts +4 -76
- package/dist/utils/airdrop-sweep.js +42 -55
- package/dist/utils/bundle-helpers.d.ts +9 -243
- package/dist/utils/bundle-helpers.js +10 -584
- package/dist/utils/constants.d.ts +5 -61
- package/dist/utils/constants.js +5 -80
- package/dist/utils/contract-factory.d.ts +2 -4
- package/dist/utils/contract-factory.js +25 -18
- package/dist/utils/erc20.d.ts +7 -89
- package/dist/utils/erc20.js +98 -129
- package/dist/utils/errors.d.ts +12 -1
- package/dist/utils/errors.js +60 -1
- package/dist/utils/holders-maker/addresses.d.ts +12 -0
- package/dist/utils/holders-maker/addresses.js +15 -0
- package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
- package/dist/utils/holders-maker/buy-tx.js +278 -0
- package/dist/utils/holders-maker/constants.d.ts +6 -0
- package/dist/utils/holders-maker/constants.js +7 -0
- package/dist/utils/holders-maker/disperse.d.ts +18 -0
- package/dist/utils/holders-maker/disperse.js +90 -0
- package/dist/utils/holders-maker/routing.d.ts +4 -0
- package/dist/utils/holders-maker/routing.js +45 -0
- package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
- package/dist/utils/holders-maker/transfer-tx.js +67 -0
- package/dist/utils/holders-maker-helpers.d.ts +9 -0
- package/dist/utils/holders-maker-helpers.js +9 -0
- package/dist/utils/holders-maker.d.ts +2 -138
- package/dist/utils/holders-maker.js +50 -671
- package/dist/utils/hop-chains.d.ts +35 -0
- package/dist/utils/hop-chains.js +215 -0
- package/dist/utils/lp-inspect-helpers.d.ts +9 -0
- package/dist/utils/lp-inspect-helpers.js +109 -0
- package/dist/utils/lp-inspect.d.ts +2 -112
- package/dist/utils/lp-inspect.js +78 -293
- package/dist/utils/mpcExclusive.d.ts +2 -5
- package/dist/utils/mpcExclusive.js +4 -3
- package/dist/utils/private-sale.d.ts +2 -58
- package/dist/utils/private-sale.js +4 -15
- package/dist/utils/provider-factory.d.ts +4 -0
- package/dist/utils/provider-factory.js +10 -0
- package/dist/utils/quote-helpers.d.ts +4 -45
- package/dist/utils/quote-helpers.js +17 -74
- package/dist/utils/stealth-transfer.d.ts +2 -28
- package/dist/utils/stealth-transfer.js +39 -19
- package/dist/utils/swap-helpers.d.ts +2 -15
- package/dist/utils/swap-helpers.js +6 -11
- 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 +4 -25
- package/dist/utils/wallet.js +27 -22
- package/dist/vanity/index.d.ts +5 -0
- package/dist/vanity/index.js +5 -0
- package/package.json +100 -2
|
@@ -1,112 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tm-bundle - 主函数
|
|
3
|
+
*/
|
|
1
4
|
import { ethers, Wallet, JsonRpcProvider } from 'ethers';
|
|
2
|
-
import { Club48Client, sendBatchPrivateTransactions, BUILDER_CONTROL_EOA } from '../shared/clients/club48.js';
|
|
3
|
-
import { ADDRESSES,
|
|
4
|
-
import { GAS_LIMITS } from '../shared/constants/index.js';
|
|
5
|
+
import { Club48Client, sendBatchPrivateTransactions, BUILDER_CONTROL_EOA, } from '../shared/clients/club48.js';
|
|
6
|
+
import { ADDRESSES, CHAINS, ZERO_ADDRESS } from '../shared/constants/index.js';
|
|
7
|
+
import { GAS_LIMITS, getProfitRateBps, getProfitRecipient } from '../shared/constants/index.js';
|
|
5
8
|
import { buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../utils/bundle-helpers.js';
|
|
6
|
-
import TM2Abi from '../
|
|
9
|
+
import TM2Abi from '../abis/contracts/TokenManager2.json' with { type: 'json' };
|
|
7
10
|
import { FourClient, buildLoginMessage } from '../shared/clients/four.js';
|
|
8
11
|
import { trySell } from './tm.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
// 错误信息国际化
|
|
14
|
-
const ERRORS = {
|
|
15
|
-
NO_PRIVATE_KEY: {
|
|
16
|
-
en: 'At least 1 private key (creator) is required',
|
|
17
|
-
zh: '至少需要 1 个私钥(创建者)'
|
|
18
|
-
},
|
|
19
|
-
AMOUNT_MISMATCH: {
|
|
20
|
-
en: (buyCount, buyerCount) => `Buy amount count (${buyCount}) must equal buyer count (${buyerCount})`,
|
|
21
|
-
zh: (buyCount, buyerCount) => `购买金额数量(${buyCount})必须等于买家数量(${buyerCount})`
|
|
22
|
-
},
|
|
23
|
-
IMAGE_REQUIRED: {
|
|
24
|
-
en: 'Either imageUrl or imageFile must be provided',
|
|
25
|
-
zh: '必须提供 imageUrl 或 imageFile'
|
|
26
|
-
},
|
|
27
|
-
KEY_AMOUNT_MISMATCH: {
|
|
28
|
-
en: 'Private key count and amount count must match',
|
|
29
|
-
zh: '私钥和购买金额数量必须一致'
|
|
30
|
-
},
|
|
31
|
-
SELL_KEY_AMOUNT_MISMATCH: {
|
|
32
|
-
en: 'Private key count and sell amount count must match',
|
|
33
|
-
zh: '私钥和卖出数量必须一致'
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
// 获取错误信息(根据环境语言)
|
|
37
|
-
function getErrorMessage(key, ...args) {
|
|
38
|
-
const lang = (process.env.LANG || process.env.LANGUAGE || 'en').toLowerCase().includes('zh') ? 'zh' : 'en';
|
|
39
|
-
const message = ERRORS[key][lang];
|
|
40
|
-
return typeof message === 'function' ? message(...args) : message;
|
|
41
|
-
}
|
|
42
|
-
// ========================================
|
|
43
|
-
// 辅助函数
|
|
44
|
-
// ========================================
|
|
45
|
-
/**
|
|
46
|
-
* 等待交易上链(不使用 club48 客户端)
|
|
47
|
-
*/
|
|
48
|
-
async function waitForBundleWithProvider(provider, firstTxSigned, bundleUuid) {
|
|
49
|
-
const maxAttempts = 60; // 最多等待 60 秒
|
|
50
|
-
for (let i = 0; i < maxAttempts; i++) {
|
|
51
|
-
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
52
|
-
try {
|
|
53
|
-
const txHash = ethers.keccak256(firstTxSigned);
|
|
54
|
-
const receipt = await provider.getTransactionReceipt(txHash);
|
|
55
|
-
if (receipt) {
|
|
56
|
-
if (receipt.status === 1) {
|
|
57
|
-
return { status: 'INCLUDED', includedBlock: receipt.blockNumber };
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
return { status: 'FAILED' };
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
// 继续等待
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return { status: 'PENDING' };
|
|
69
|
-
}
|
|
70
|
-
// ========================================
|
|
71
|
-
// 辅助函数:估算 gas 并应用配置
|
|
72
|
-
// ========================================
|
|
73
|
-
/**
|
|
74
|
-
* 估算 gas 并应用用户配置的倍数
|
|
75
|
-
*/
|
|
76
|
-
async function estimateGasWithMultiplier(provider, txRequest, multiplier) {
|
|
77
|
-
const estimated = await provider.estimateGas(txRequest);
|
|
78
|
-
const mult = multiplier ?? 1.2; // 默认 20% 安全余量
|
|
79
|
-
return BigInt(Math.ceil(Number(estimated) * mult));
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* 获取交易类型(用户可配置)
|
|
83
|
-
*/
|
|
84
|
-
function getTxType(config) {
|
|
85
|
-
return config.txType ?? 0; // 默认 Legacy (type 0),适用于 48.club/BSC
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* 构建完整的交易请求(包含 gas 估算和交易类型)
|
|
89
|
-
*/
|
|
90
|
-
async function buildTxRequest(provider, unsigned, from, nonce, gasPrice, config, value) {
|
|
91
|
-
const gasLimit = await estimateGasWithMultiplier(provider, { ...unsigned, from, value }, config.gasLimitMultiplier);
|
|
92
|
-
return {
|
|
93
|
-
...unsigned,
|
|
94
|
-
from,
|
|
95
|
-
nonce,
|
|
96
|
-
gasLimit,
|
|
97
|
-
gasPrice,
|
|
98
|
-
chainId: 56,
|
|
99
|
-
type: getTxType(config)
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* four.meme: 创建代币 + 捆绑购买
|
|
104
|
-
*
|
|
105
|
-
* 用户只需传入:
|
|
106
|
-
* - dev 私钥 + N 个买家私钥
|
|
107
|
-
* - 对应的购买金额
|
|
108
|
-
* - 代币基本信息
|
|
109
|
-
*/
|
|
12
|
+
import { consoleSdkLogger, getErrorMessageFromUnknown } from '../shared/foundation/index.js';
|
|
13
|
+
import { getErrorMessage, waitForBundleWithProvider, } from './tm-bundle-helpers.js';
|
|
14
|
+
const TM2_ABI = TM2Abi;
|
|
15
|
+
const sdkLogger = consoleSdkLogger;
|
|
110
16
|
export async function createTokenWithBundleBuy(params) {
|
|
111
17
|
const { privateKeys, buyAmounts, tokenInfo, config } = params;
|
|
112
18
|
if (privateKeys.length === 0) {
|
|
@@ -122,7 +28,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
122
28
|
if (!config.customSubmitFn) {
|
|
123
29
|
club48 = new Club48Client({
|
|
124
30
|
endpoint: 'https://puissant-bsc.48.club',
|
|
125
|
-
explorerEndpoint: config.club48ExplorerEndpoint
|
|
31
|
+
explorerEndpoint: config.club48ExplorerEndpoint,
|
|
126
32
|
});
|
|
127
33
|
}
|
|
128
34
|
const fourClient = new FourClient({ baseUrl: config.fourApiUrl });
|
|
@@ -130,7 +36,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
130
36
|
const nonce = await fourClient.generateNonce({
|
|
131
37
|
accountAddress: devWallet.address,
|
|
132
38
|
verifyType: 'LOGIN',
|
|
133
|
-
networkCode: 'BSC'
|
|
39
|
+
networkCode: 'BSC',
|
|
134
40
|
});
|
|
135
41
|
const loginSignature = await devWallet.signMessage(buildLoginMessage(nonce));
|
|
136
42
|
const accessToken = await fourClient.loginDex({
|
|
@@ -140,9 +46,9 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
140
46
|
address: devWallet.address,
|
|
141
47
|
networkCode: 'BSC',
|
|
142
48
|
signature: loginSignature,
|
|
143
|
-
verifyType: 'LOGIN'
|
|
49
|
+
verifyType: 'LOGIN',
|
|
144
50
|
},
|
|
145
|
-
walletName: 'MetaMask'
|
|
51
|
+
walletName: 'MetaMask',
|
|
146
52
|
});
|
|
147
53
|
// 2. 上传图片(如果需要)
|
|
148
54
|
let imgUrl = tokenInfo.imageUrl || '';
|
|
@@ -203,20 +109,22 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
203
109
|
return onchain;
|
|
204
110
|
};
|
|
205
111
|
// four.meme 只支持 BNB,固定使用 0 地址
|
|
206
|
-
const tokenAddress =
|
|
112
|
+
const tokenAddress = ZERO_ADDRESS;
|
|
207
113
|
// 4.1 创建交易
|
|
208
114
|
// 根据文档:b0Amount(初始金额,默认 8 BNB)+ preSale(预购金额)
|
|
209
115
|
const b0AmountStr = params.b0Amount ?? '8';
|
|
210
116
|
const b0AmountWei = ethers.parseEther(b0AmountStr);
|
|
211
117
|
const preSaleWei = tokenInfo.preSale ? ethers.parseEther(tokenInfo.preSale) : 0n;
|
|
212
118
|
const valueWei = b0AmountWei + preSaleWei;
|
|
213
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
214
|
-
const createTxUnsigned = await tm2.createToken.populateTransaction(createResp.createArg, createResp.signature, {
|
|
119
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, devWallet);
|
|
120
|
+
const createTxUnsigned = await tm2.createToken.populateTransaction(createResp.createArg, createResp.signature, {
|
|
121
|
+
value: valueWei,
|
|
122
|
+
});
|
|
215
123
|
// 估算 gas 并添加 20% 安全余量
|
|
216
124
|
const estimatedCreateGas = await provider.estimateGas({
|
|
217
125
|
...createTxUnsigned,
|
|
218
126
|
from: devWallet.address,
|
|
219
|
-
value: valueWei
|
|
127
|
+
value: valueWei,
|
|
220
128
|
});
|
|
221
129
|
const createGasLimit = (estimatedCreateGas * 120n) / 100n;
|
|
222
130
|
const createTxRequest = {
|
|
@@ -225,15 +133,15 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
225
133
|
nonce: await getNextNonce(devWallet),
|
|
226
134
|
gasLimit: createGasLimit,
|
|
227
135
|
gasPrice: gasPrice,
|
|
228
|
-
chainId:
|
|
229
|
-
type: 0 // Legacy transaction (required for BSC on 48.club)
|
|
136
|
+
chainId: CHAINS.BSC.chainId,
|
|
137
|
+
type: 0, // Legacy transaction (required for BSC on 48.club)
|
|
230
138
|
};
|
|
231
139
|
const signedCreateTx = await devWallet.signTransaction(createTxRequest);
|
|
232
140
|
signedTxs.push(signedCreateTx);
|
|
233
141
|
// 4.2 购买交易
|
|
234
142
|
const buyTxs = [];
|
|
235
143
|
const profitTxs = [];
|
|
236
|
-
const buyAmountsWei = buyAmounts.map(a => ethers.parseEther(a));
|
|
144
|
+
const buyAmountsWei = buyAmounts.map((a) => ethers.parseEther(a));
|
|
237
145
|
// 🔍 找出买入金额最多的买家(由他支付所有利润)
|
|
238
146
|
let maxBuyerIndex = 0;
|
|
239
147
|
let maxAmount = buyAmountsWei[0];
|
|
@@ -244,13 +152,13 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
244
152
|
}
|
|
245
153
|
}
|
|
246
154
|
// ✅ 并行构建所有购买交易
|
|
247
|
-
const buyerWallets = privateKeys.slice(1).map(pk => new Wallet(pk, provider));
|
|
155
|
+
const buyerWallets = privateKeys.slice(1).map((pk) => new Wallet(pk, provider));
|
|
248
156
|
// 并行获取所有买家的 nonce
|
|
249
|
-
const buyerNonces = await Promise.all(buyerWallets.map(w => getNextNonce(w)));
|
|
157
|
+
const buyerNonces = await Promise.all(buyerWallets.map((w) => getNextNonce(w)));
|
|
250
158
|
// 并行构建未签名交易和估算 gas
|
|
251
159
|
const buyTxDataList = await Promise.all(buyAmountsWei.map(async (fundsWei, i) => {
|
|
252
160
|
const buyerWallet = buyerWallets[i];
|
|
253
|
-
const buyTm2 = new ethers.Contract(tmAddr,
|
|
161
|
+
const buyTm2 = new ethers.Contract(tmAddr, TM2_ABI, buyerWallet);
|
|
254
162
|
const buyTxUnsigned = await buyTm2.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyerWallet.address, fundsWei, 0n, { value: fundsWei });
|
|
255
163
|
// 估算 gas 并添加 20% 安全余量
|
|
256
164
|
let buyGasLimit;
|
|
@@ -258,7 +166,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
258
166
|
const estimatedBuyGas = await provider.estimateGas({
|
|
259
167
|
...buyTxUnsigned,
|
|
260
168
|
from: buyerWallet.address,
|
|
261
|
-
value: fundsWei
|
|
169
|
+
value: fundsWei,
|
|
262
170
|
});
|
|
263
171
|
buyGasLimit = (estimatedBuyGas * 120n) / 100n;
|
|
264
172
|
}
|
|
@@ -275,7 +183,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
275
183
|
nonce: buyerNonces[i],
|
|
276
184
|
gasLimit: data.buyGasLimit,
|
|
277
185
|
gasPrice: gasPrice,
|
|
278
|
-
chainId:
|
|
186
|
+
chainId: CHAINS.BSC.chainId,
|
|
279
187
|
};
|
|
280
188
|
return data.buyerWallet.signTransaction(buyTxRequest);
|
|
281
189
|
}));
|
|
@@ -283,7 +191,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
283
191
|
buyTxs.push(...signedBuyTxList);
|
|
284
192
|
// ✅ 聚合利润:由买入最多的人支付总利润(强制 2 跳中转)
|
|
285
193
|
const totalBuyAmount = buyAmountsWei.reduce((sum, amount) => sum + amount, 0n);
|
|
286
|
-
const totalProfitAmount = (totalBuyAmount * BigInt(
|
|
194
|
+
const totalProfitAmount = (totalBuyAmount * BigInt(getProfitRateBps('normal'))) / 10000n;
|
|
287
195
|
let profitHopWallets;
|
|
288
196
|
if (totalProfitAmount > 0n) {
|
|
289
197
|
const payerWallet = new Wallet(privateKeys[maxBuyerIndex + 1], provider);
|
|
@@ -292,12 +200,12 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
292
200
|
provider,
|
|
293
201
|
payerWallet,
|
|
294
202
|
profitAmount: totalProfitAmount,
|
|
295
|
-
profitRecipient:
|
|
203
|
+
profitRecipient: getProfitRecipient(),
|
|
296
204
|
hopCount: PROFIT_HOP_COUNT,
|
|
297
205
|
gasPrice,
|
|
298
|
-
chainId:
|
|
206
|
+
chainId: CHAINS.BSC.chainId,
|
|
299
207
|
txType: 0,
|
|
300
|
-
startNonce: profitNonce
|
|
208
|
+
startNonce: profitNonce,
|
|
301
209
|
});
|
|
302
210
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
303
211
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
@@ -310,9 +218,9 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
310
218
|
value: config.tipAmountWei,
|
|
311
219
|
gasPrice,
|
|
312
220
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
313
|
-
chainId:
|
|
221
|
+
chainId: CHAINS.BSC.chainId,
|
|
314
222
|
type: 0, // Legacy transaction
|
|
315
|
-
nonce: await getNextNonce(devWallet)
|
|
223
|
+
nonce: await getNextNonce(devWallet),
|
|
316
224
|
});
|
|
317
225
|
signedTxs.push(tipTx);
|
|
318
226
|
}
|
|
@@ -325,10 +233,14 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
325
233
|
else if (config.spPrivateKey) {
|
|
326
234
|
await sendBatchPrivateTransactions(signedTxs, config.spPrivateKey, config.club48Endpoint || 'https://puissant-bsc.48.club', {
|
|
327
235
|
spMode: config.spMode ?? 'timestampPersonalSign',
|
|
328
|
-
spVMode: config.spVMode
|
|
236
|
+
spVMode: config.spVMode,
|
|
329
237
|
});
|
|
330
238
|
// 批量提交不返回 bundleUuid,使用第一笔交易的 hash 作为标识
|
|
331
|
-
|
|
239
|
+
const firstHash = ethers.Transaction.from(signedTxs[0]).hash;
|
|
240
|
+
if (!firstHash) {
|
|
241
|
+
throw new Error('无法解析首笔已签名交易的 hash(48SP 批量提交)');
|
|
242
|
+
}
|
|
243
|
+
bundleUuid = firstHash;
|
|
332
244
|
}
|
|
333
245
|
else {
|
|
334
246
|
// ✅ 直接提交到 48.club Bundle(仅服务器端可用)
|
|
@@ -338,11 +250,11 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
338
250
|
bundleUuid = await club48.sendBundle({
|
|
339
251
|
txs: signedTxs,
|
|
340
252
|
maxBlockNumber: (await provider.getBlockNumber()) + (config.bundleBlockOffset ?? 100),
|
|
341
|
-
noMerge: config.noMerge
|
|
253
|
+
noMerge: config.noMerge,
|
|
342
254
|
}, {
|
|
343
255
|
spMode: config.spMode ?? 'timestampPersonalSign',
|
|
344
256
|
spPrivateKey: config.spPrivateKey || privateKeys[0],
|
|
345
|
-
spVMode: config.spVMode
|
|
257
|
+
spVMode: config.spVMode,
|
|
346
258
|
});
|
|
347
259
|
}
|
|
348
260
|
// 6. 等待完成
|
|
@@ -363,7 +275,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
363
275
|
if (createTxHash) {
|
|
364
276
|
const receipt = await provider.getTransactionReceipt(createTxHash);
|
|
365
277
|
if (receipt && receipt.logs) {
|
|
366
|
-
const tm2Interface = new ethers.Interface(
|
|
278
|
+
const tm2Interface = new ethers.Interface(TM2_ABI);
|
|
367
279
|
for (const log of receipt.logs) {
|
|
368
280
|
try {
|
|
369
281
|
const parsed = tm2Interface.parseLog({ topics: log.topics, data: log.data });
|
|
@@ -372,15 +284,15 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
372
284
|
break;
|
|
373
285
|
}
|
|
374
286
|
}
|
|
375
|
-
catch (
|
|
287
|
+
catch (_e) {
|
|
376
288
|
// 忽略无法解析的日志
|
|
377
289
|
}
|
|
378
290
|
}
|
|
379
291
|
}
|
|
380
292
|
}
|
|
381
293
|
}
|
|
382
|
-
catch (
|
|
383
|
-
|
|
294
|
+
catch (error) {
|
|
295
|
+
sdkLogger.debug?.('[TM bundle] 解析创建交易回执失败', getErrorMessageFromUnknown(error));
|
|
384
296
|
}
|
|
385
297
|
}
|
|
386
298
|
return {
|
|
@@ -390,7 +302,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
390
302
|
createTx: signedCreateTx,
|
|
391
303
|
buyTxs,
|
|
392
304
|
profitTxs,
|
|
393
|
-
profitHopWallets // ✅ 返回利润多跳钱包
|
|
305
|
+
profitHopWallets, // ✅ 返回利润多跳钱包
|
|
394
306
|
};
|
|
395
307
|
}
|
|
396
308
|
/**
|
|
@@ -404,7 +316,7 @@ export async function batchBuyWithBundle(params) {
|
|
|
404
316
|
const provider = new JsonRpcProvider(config.rpcUrl);
|
|
405
317
|
const club48 = new Club48Client({
|
|
406
318
|
endpoint: config.club48Endpoint,
|
|
407
|
-
explorerEndpoint: config.club48ExplorerEndpoint
|
|
319
|
+
explorerEndpoint: config.club48ExplorerEndpoint,
|
|
408
320
|
});
|
|
409
321
|
const blockOffset = config.bundleBlockOffset ?? 100;
|
|
410
322
|
const tmAddr = ADDRESSES.BSC.TokenManagerOriginal;
|
|
@@ -424,8 +336,8 @@ export async function batchBuyWithBundle(params) {
|
|
|
424
336
|
return onchain;
|
|
425
337
|
};
|
|
426
338
|
// ✅ 并行处理所有买家
|
|
427
|
-
const wallets = privateKeys.map(pk => new Wallet(pk, provider));
|
|
428
|
-
const fundsWeiList = buyAmounts.map(a => ethers.parseEther(a));
|
|
339
|
+
const wallets = privateKeys.map((pk) => new Wallet(pk, provider));
|
|
340
|
+
const fundsWeiList = buyAmounts.map((a) => ethers.parseEther(a));
|
|
429
341
|
// 找出买入最多的买家(由他支付所有利润)
|
|
430
342
|
let maxBuyerIndex = 0;
|
|
431
343
|
let maxFunds = fundsWeiList[0];
|
|
@@ -436,7 +348,7 @@ export async function batchBuyWithBundle(params) {
|
|
|
436
348
|
}
|
|
437
349
|
}
|
|
438
350
|
// 并行获取所有钱包的初始 nonce
|
|
439
|
-
const initialNonces = await Promise.all(wallets.map(w => w.getNonce()));
|
|
351
|
+
const initialNonces = await Promise.all(wallets.map((w) => w.getNonce()));
|
|
440
352
|
// 为每个钱包分配 nonce(普通钱包1个,利润支付者2个)
|
|
441
353
|
const nonceMap = new Map();
|
|
442
354
|
wallets.forEach((w, i) => {
|
|
@@ -451,14 +363,14 @@ export async function batchBuyWithBundle(params) {
|
|
|
451
363
|
// 并行构建未签名交易和估算 gas
|
|
452
364
|
const txDataList = await Promise.all(wallets.map(async (buyerWallet, i) => {
|
|
453
365
|
const fundsWei = fundsWeiList[i];
|
|
454
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
366
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, buyerWallet);
|
|
455
367
|
const buyTxUnsigned = await tm2.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyerWallet.address, fundsWei, 0n, { value: fundsWei });
|
|
456
368
|
let gasLimit;
|
|
457
369
|
try {
|
|
458
370
|
const estimatedGas = await provider.estimateGas({
|
|
459
371
|
...buyTxUnsigned,
|
|
460
372
|
from: buyerWallet.address,
|
|
461
|
-
value: fundsWei
|
|
373
|
+
value: fundsWei,
|
|
462
374
|
});
|
|
463
375
|
gasLimit = (estimatedGas * 120n) / 100n;
|
|
464
376
|
}
|
|
@@ -468,21 +380,21 @@ export async function batchBuyWithBundle(params) {
|
|
|
468
380
|
return { buyTxUnsigned, gasLimit, buyerWallet, fundsWei };
|
|
469
381
|
}));
|
|
470
382
|
// 并行签名所有买入交易
|
|
471
|
-
const signedBuyTxList = await Promise.all(txDataList.map(async (data
|
|
383
|
+
const signedBuyTxList = await Promise.all(txDataList.map(async (data) => {
|
|
472
384
|
const buyTxRequest = {
|
|
473
385
|
...data.buyTxUnsigned,
|
|
474
386
|
from: data.buyerWallet.address,
|
|
475
387
|
nonce: getNextNonceLocal(data.buyerWallet),
|
|
476
388
|
gasLimit: data.gasLimit,
|
|
477
389
|
gasPrice: gasPrice,
|
|
478
|
-
chainId:
|
|
390
|
+
chainId: CHAINS.BSC.chainId,
|
|
479
391
|
};
|
|
480
392
|
return data.buyerWallet.signTransaction(buyTxRequest);
|
|
481
393
|
}));
|
|
482
394
|
signedTxs.push(...signedBuyTxList);
|
|
483
395
|
// ✅ 聚合利润:由买入最多的人支付总利润(强制 2 跳中转)
|
|
484
396
|
const totalFunds = fundsWeiList.reduce((sum, f) => sum + f, 0n);
|
|
485
|
-
const totalProfit = (totalFunds * BigInt(
|
|
397
|
+
const totalProfit = (totalFunds * BigInt(getProfitRateBps('normal'))) / 10000n;
|
|
486
398
|
let profitHopWallets;
|
|
487
399
|
if (totalProfit > 0n) {
|
|
488
400
|
const payerWallet = wallets[maxBuyerIndex];
|
|
@@ -491,12 +403,12 @@ export async function batchBuyWithBundle(params) {
|
|
|
491
403
|
provider,
|
|
492
404
|
payerWallet,
|
|
493
405
|
profitAmount: totalProfit,
|
|
494
|
-
profitRecipient:
|
|
406
|
+
profitRecipient: getProfitRecipient(),
|
|
495
407
|
hopCount: PROFIT_HOP_COUNT,
|
|
496
408
|
gasPrice,
|
|
497
|
-
chainId:
|
|
409
|
+
chainId: CHAINS.BSC.chainId,
|
|
498
410
|
txType: 0,
|
|
499
|
-
startNonce: profitNonce
|
|
411
|
+
startNonce: profitNonce,
|
|
500
412
|
});
|
|
501
413
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
502
414
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -509,20 +421,20 @@ export async function batchBuyWithBundle(params) {
|
|
|
509
421
|
value: config.tipAmountWei,
|
|
510
422
|
gasPrice,
|
|
511
423
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
512
|
-
chainId:
|
|
424
|
+
chainId: CHAINS.BSC.chainId,
|
|
513
425
|
type: 0, // Legacy transaction
|
|
514
|
-
nonce: await getNextNonce(tipWallet)
|
|
426
|
+
nonce: await getNextNonce(tipWallet),
|
|
515
427
|
});
|
|
516
428
|
signedTxs.unshift(tipTx);
|
|
517
429
|
}
|
|
518
430
|
const bundleUuid = await club48.sendBundle({
|
|
519
431
|
txs: signedTxs,
|
|
520
432
|
maxBlockNumber: (await provider.getBlockNumber()) + blockOffset,
|
|
521
|
-
noMerge: config.noMerge
|
|
433
|
+
noMerge: config.noMerge,
|
|
522
434
|
}, {
|
|
523
435
|
spMode: config.spMode ?? 'timestampPersonalSign',
|
|
524
436
|
spPrivateKey: config.spPrivateKey || privateKeys[0],
|
|
525
|
-
spVMode: config.spVMode
|
|
437
|
+
spVMode: config.spVMode,
|
|
526
438
|
});
|
|
527
439
|
const status = await club48.waitForBundle(bundleUuid);
|
|
528
440
|
return { bundleUuid, status, buyTxs: signedTxs, profitHopWallets }; // ✅ 返回利润多跳钱包
|
|
@@ -538,7 +450,7 @@ export async function batchSellWithBundle(params) {
|
|
|
538
450
|
const provider = new JsonRpcProvider(config.rpcUrl);
|
|
539
451
|
const club48 = new Club48Client({
|
|
540
452
|
endpoint: config.club48Endpoint,
|
|
541
|
-
explorerEndpoint: config.club48ExplorerEndpoint
|
|
453
|
+
explorerEndpoint: config.club48ExplorerEndpoint,
|
|
542
454
|
});
|
|
543
455
|
const blockOffset = config.bundleBlockOffset ?? 100;
|
|
544
456
|
const tmAddr = ADDRESSES.BSC.TokenManagerOriginal;
|
|
@@ -558,8 +470,8 @@ export async function batchSellWithBundle(params) {
|
|
|
558
470
|
return onchain;
|
|
559
471
|
};
|
|
560
472
|
// ✅ 并行处理所有卖家
|
|
561
|
-
const wallets = privateKeys.map(pk => new Wallet(pk, provider));
|
|
562
|
-
const amountsWei = sellAmounts.map(a => ethers.parseUnits(a, 18));
|
|
473
|
+
const wallets = privateKeys.map((pk) => new Wallet(pk, provider));
|
|
474
|
+
const amountsWei = sellAmounts.map((a) => ethers.parseUnits(a, 18));
|
|
563
475
|
// 并行预估所有卖出能获得的 BNB
|
|
564
476
|
const estimatedBnbOuts = await Promise.all(amountsWei.map(async (amountWei) => {
|
|
565
477
|
try {
|
|
@@ -580,7 +492,7 @@ export async function batchSellWithBundle(params) {
|
|
|
580
492
|
}
|
|
581
493
|
}
|
|
582
494
|
// 并行获取所有钱包的初始 nonce
|
|
583
|
-
const initialNonces = await Promise.all(wallets.map(w => w.getNonce()));
|
|
495
|
+
const initialNonces = await Promise.all(wallets.map((w) => w.getNonce()));
|
|
584
496
|
const nonceMap = new Map();
|
|
585
497
|
wallets.forEach((w, i) => {
|
|
586
498
|
nonceMap.set(w.address.toLowerCase(), initialNonces[i]);
|
|
@@ -594,13 +506,13 @@ export async function batchSellWithBundle(params) {
|
|
|
594
506
|
// 并行构建未签名交易和估算 gas
|
|
595
507
|
const txDataList = await Promise.all(wallets.map(async (sellerWallet, i) => {
|
|
596
508
|
const amountWei = amountsWei[i];
|
|
597
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
509
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, sellerWallet);
|
|
598
510
|
const sellTxUnsigned = await tm2.sellToken.populateTransaction(0n, tokenAddress, amountWei, 0n);
|
|
599
511
|
let gasLimit;
|
|
600
512
|
try {
|
|
601
513
|
const estimatedGas = await provider.estimateGas({
|
|
602
514
|
...sellTxUnsigned,
|
|
603
|
-
from: sellerWallet.address
|
|
515
|
+
from: sellerWallet.address,
|
|
604
516
|
});
|
|
605
517
|
gasLimit = (estimatedGas * 120n) / 100n;
|
|
606
518
|
}
|
|
@@ -610,21 +522,21 @@ export async function batchSellWithBundle(params) {
|
|
|
610
522
|
return { sellTxUnsigned, gasLimit, sellerWallet };
|
|
611
523
|
}));
|
|
612
524
|
// 并行签名所有卖出交易
|
|
613
|
-
const signedSellTxList = await Promise.all(txDataList.map(async (data
|
|
525
|
+
const signedSellTxList = await Promise.all(txDataList.map(async (data) => {
|
|
614
526
|
const sellTxRequest = {
|
|
615
527
|
...data.sellTxUnsigned,
|
|
616
528
|
from: data.sellerWallet.address,
|
|
617
529
|
nonce: getNextNonceLocal(data.sellerWallet),
|
|
618
530
|
gasLimit: data.gasLimit,
|
|
619
531
|
gasPrice: gasPrice,
|
|
620
|
-
chainId:
|
|
532
|
+
chainId: CHAINS.BSC.chainId,
|
|
621
533
|
};
|
|
622
534
|
return data.sellerWallet.signTransaction(sellTxRequest);
|
|
623
535
|
}));
|
|
624
536
|
signedTxs.push(...signedSellTxList);
|
|
625
537
|
// ✅ 聚合利润:由收益最高的人支付总利润(强制 2 跳中转)
|
|
626
538
|
const totalBnbOut = estimatedBnbOuts.reduce((sum, b) => sum + b, 0n);
|
|
627
|
-
const totalProfit = (totalBnbOut * BigInt(
|
|
539
|
+
const totalProfit = (totalBnbOut * BigInt(getProfitRateBps('normal'))) / 10000n;
|
|
628
540
|
let profitHopWallets;
|
|
629
541
|
if (totalProfit > 0n) {
|
|
630
542
|
const payerWallet = wallets[maxSellerIndex];
|
|
@@ -633,12 +545,12 @@ export async function batchSellWithBundle(params) {
|
|
|
633
545
|
provider,
|
|
634
546
|
payerWallet,
|
|
635
547
|
profitAmount: totalProfit,
|
|
636
|
-
profitRecipient:
|
|
548
|
+
profitRecipient: getProfitRecipient(),
|
|
637
549
|
hopCount: PROFIT_HOP_COUNT,
|
|
638
550
|
gasPrice,
|
|
639
|
-
chainId:
|
|
551
|
+
chainId: CHAINS.BSC.chainId,
|
|
640
552
|
txType: 0,
|
|
641
|
-
startNonce: profitNonce
|
|
553
|
+
startNonce: profitNonce,
|
|
642
554
|
});
|
|
643
555
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
644
556
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -651,20 +563,20 @@ export async function batchSellWithBundle(params) {
|
|
|
651
563
|
value: config.tipAmountWei,
|
|
652
564
|
gasPrice,
|
|
653
565
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
654
|
-
chainId:
|
|
566
|
+
chainId: CHAINS.BSC.chainId,
|
|
655
567
|
type: 0, // Legacy transaction
|
|
656
|
-
nonce: await getNextNonce(tipWallet)
|
|
568
|
+
nonce: await getNextNonce(tipWallet),
|
|
657
569
|
});
|
|
658
570
|
signedTxs.unshift(tipTx);
|
|
659
571
|
}
|
|
660
572
|
const bundleUuid = await club48.sendBundle({
|
|
661
573
|
txs: signedTxs,
|
|
662
574
|
maxBlockNumber: (await provider.getBlockNumber()) + blockOffset,
|
|
663
|
-
noMerge: config.noMerge
|
|
575
|
+
noMerge: config.noMerge,
|
|
664
576
|
}, {
|
|
665
577
|
spMode: config.spMode ?? 'timestampPersonalSign',
|
|
666
578
|
spPrivateKey: config.spPrivateKey || privateKeys[0],
|
|
667
|
-
spVMode: config.spVMode
|
|
579
|
+
spVMode: config.spVMode,
|
|
668
580
|
});
|
|
669
581
|
const status = await club48.waitForBundle(bundleUuid);
|
|
670
582
|
return { bundleUuid, status, sellTxs: signedTxs, profitHopWallets }; // ✅ 返回利润多跳钱包
|
|
@@ -678,12 +590,20 @@ export async function fourPrivateBuy(params) {
|
|
|
678
590
|
const gasPrice = await club48.getMinGasPrice();
|
|
679
591
|
const fundsWei = ethers.parseEther(funds);
|
|
680
592
|
const minAmount = 0n;
|
|
681
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
593
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, wallet);
|
|
682
594
|
const unsigned = await tm2.buyTokenAMAP.populateTransaction(0n, tokenAddress, to ?? wallet.address, fundsWei, minAmount, { value: fundsWei });
|
|
683
595
|
// 估算 gas 并添加 20% 安全余量
|
|
684
596
|
const estimatedGas = await provider.estimateGas({ ...unsigned, from: wallet.address, value: fundsWei });
|
|
685
597
|
const gasLimit = (estimatedGas * 120n) / 100n;
|
|
686
|
-
const req = {
|
|
598
|
+
const req = {
|
|
599
|
+
...unsigned,
|
|
600
|
+
from: wallet.address,
|
|
601
|
+
nonce: await wallet.getNonce(),
|
|
602
|
+
gasLimit,
|
|
603
|
+
gasPrice,
|
|
604
|
+
chainId: CHAINS.BSC.chainId,
|
|
605
|
+
type: 0,
|
|
606
|
+
};
|
|
687
607
|
const signed = await wallet.signTransaction(req);
|
|
688
608
|
if (spPrivateKey)
|
|
689
609
|
return await club48.sendPrivateTransactionWith48SP(signed, spPrivateKey);
|
|
@@ -698,12 +618,20 @@ export async function fourPrivateSell(params) {
|
|
|
698
618
|
const gasPrice = await club48.getMinGasPrice();
|
|
699
619
|
const amountWei = ethers.parseUnits(amount, 18);
|
|
700
620
|
const minOut = minFunds ?? 0n;
|
|
701
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
621
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, wallet);
|
|
702
622
|
const unsigned = await tm2.sellToken.populateTransaction(0n, tokenAddress, amountWei, minOut);
|
|
703
623
|
// 估算 gas 并添加 20% 安全余量
|
|
704
624
|
const estimatedGas = await provider.estimateGas({ ...unsigned, from: wallet.address });
|
|
705
625
|
const gasLimit = (estimatedGas * 120n) / 100n;
|
|
706
|
-
const req = {
|
|
626
|
+
const req = {
|
|
627
|
+
...unsigned,
|
|
628
|
+
from: wallet.address,
|
|
629
|
+
nonce: await wallet.getNonce(),
|
|
630
|
+
gasLimit,
|
|
631
|
+
gasPrice,
|
|
632
|
+
chainId: CHAINS.BSC.chainId,
|
|
633
|
+
type: 0,
|
|
634
|
+
};
|
|
707
635
|
const signed = await wallet.signTransaction(req);
|
|
708
636
|
if (spPrivateKey)
|
|
709
637
|
return await club48.sendPrivateTransactionWith48SP(signed, spPrivateKey);
|
|
@@ -717,18 +645,20 @@ export async function fourBatchPrivateBuy(params) {
|
|
|
717
645
|
const club48 = new Club48Client({ endpoint: club48Endpoint, explorerEndpoint: club48ExplorerEndpoint });
|
|
718
646
|
const tmAddr = ADDRESSES.BSC.TokenManagerOriginal;
|
|
719
647
|
// ✅ 并行处理
|
|
720
|
-
const wallets = privateKeys.map(pk => new Wallet(pk, provider));
|
|
721
|
-
const fundsWeiList = fundsList.map(f => ethers.parseEther(f));
|
|
648
|
+
const wallets = privateKeys.map((pk) => new Wallet(pk, provider));
|
|
649
|
+
const fundsWeiList = fundsList.map((f) => ethers.parseEther(f));
|
|
722
650
|
// 并行获取 gasPrice 和所有 nonce
|
|
723
651
|
const [gasPrice, nonces] = await Promise.all([
|
|
724
652
|
club48.getMinGasPrice(),
|
|
725
|
-
Promise.all(wallets.map(w => w.getNonce()))
|
|
653
|
+
Promise.all(wallets.map((w) => w.getNonce())),
|
|
726
654
|
]);
|
|
727
655
|
// 并行构建未签名交易和估算 gas
|
|
728
656
|
const txDataList = await Promise.all(wallets.map(async (w, i) => {
|
|
729
657
|
const fundsWei = fundsWeiList[i];
|
|
730
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
731
|
-
const unsigned = await tm2.buyTokenAMAP.populateTransaction(0n, tokenAddress, w.address, fundsWei, 0n, {
|
|
658
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, w);
|
|
659
|
+
const unsigned = await tm2.buyTokenAMAP.populateTransaction(0n, tokenAddress, w.address, fundsWei, 0n, {
|
|
660
|
+
value: fundsWei,
|
|
661
|
+
});
|
|
732
662
|
let gasLimit;
|
|
733
663
|
try {
|
|
734
664
|
const estimatedGas = await provider.estimateGas({ ...unsigned, from: w.address, value: fundsWei });
|
|
@@ -747,8 +677,8 @@ export async function fourBatchPrivateBuy(params) {
|
|
|
747
677
|
nonce: nonces[i],
|
|
748
678
|
gasLimit: data.gasLimit,
|
|
749
679
|
gasPrice,
|
|
750
|
-
chainId:
|
|
751
|
-
type: 0
|
|
680
|
+
chainId: CHAINS.BSC.chainId,
|
|
681
|
+
type: 0,
|
|
752
682
|
};
|
|
753
683
|
return data.wallet.signTransaction(req);
|
|
754
684
|
}));
|
|
@@ -756,11 +686,14 @@ export async function fourBatchPrivateBuy(params) {
|
|
|
756
686
|
return await sendBatchPrivateTransactions(signedTxs, spPrivateKey, club48Endpoint || 'https://puissant-bsc.48.club');
|
|
757
687
|
}
|
|
758
688
|
// 无 48SP:走 bundle 提交通道
|
|
759
|
-
const bundleUuid = await club48.sendBundle({
|
|
689
|
+
const bundleUuid = await club48.sendBundle({
|
|
690
|
+
txs: signedTxs,
|
|
691
|
+
maxBlockNumber: (await provider.getBlockNumber()) + 100,
|
|
692
|
+
});
|
|
760
693
|
return !!bundleUuid;
|
|
761
694
|
}
|
|
762
695
|
export async function fourBatchPrivateSell(params) {
|
|
763
|
-
const { rpcUrl, privateKeys, amounts, tokenAddress, club48Endpoint, club48ExplorerEndpoint, spPrivateKey, minFundsEach } = params;
|
|
696
|
+
const { rpcUrl, privateKeys, amounts, tokenAddress, club48Endpoint, club48ExplorerEndpoint, spPrivateKey, minFundsEach, } = params;
|
|
764
697
|
if (privateKeys.length !== amounts.length)
|
|
765
698
|
throw new Error('privateKeys and amounts length mismatch');
|
|
766
699
|
const provider = new JsonRpcProvider(rpcUrl);
|
|
@@ -768,17 +701,17 @@ export async function fourBatchPrivateSell(params) {
|
|
|
768
701
|
const tmAddr = ADDRESSES.BSC.TokenManagerOriginal;
|
|
769
702
|
const minOut = minFundsEach ?? 0n;
|
|
770
703
|
// ✅ 并行处理
|
|
771
|
-
const wallets = privateKeys.map(pk => new Wallet(pk, provider));
|
|
772
|
-
const amountsWei = amounts.map(a => ethers.parseUnits(a, 18));
|
|
704
|
+
const wallets = privateKeys.map((pk) => new Wallet(pk, provider));
|
|
705
|
+
const amountsWei = amounts.map((a) => ethers.parseUnits(a, 18));
|
|
773
706
|
// 并行获取 gasPrice 和所有 nonce
|
|
774
707
|
const [gasPrice, nonces] = await Promise.all([
|
|
775
708
|
club48.getMinGasPrice(),
|
|
776
|
-
Promise.all(wallets.map(w => w.getNonce()))
|
|
709
|
+
Promise.all(wallets.map((w) => w.getNonce())),
|
|
777
710
|
]);
|
|
778
711
|
// 并行构建未签名交易和估算 gas
|
|
779
712
|
const txDataList = await Promise.all(wallets.map(async (w, i) => {
|
|
780
713
|
const amountWei = amountsWei[i];
|
|
781
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
714
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, w);
|
|
782
715
|
const unsigned = await tm2.sellToken.populateTransaction(0n, tokenAddress, amountWei, minOut);
|
|
783
716
|
let gasLimit;
|
|
784
717
|
try {
|
|
@@ -798,8 +731,8 @@ export async function fourBatchPrivateSell(params) {
|
|
|
798
731
|
nonce: nonces[i],
|
|
799
732
|
gasLimit: data.gasLimit,
|
|
800
733
|
gasPrice,
|
|
801
|
-
chainId:
|
|
802
|
-
type: 0
|
|
734
|
+
chainId: CHAINS.BSC.chainId,
|
|
735
|
+
type: 0,
|
|
803
736
|
};
|
|
804
737
|
return data.wallet.signTransaction(req);
|
|
805
738
|
}));
|