four-flap-meme-sdk 2.2.2 → 2.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +41 -6
- package/README.md +31 -0
- package/README.zh-CN.md +41 -6
- package/dist/__tests__/subpath-exports.test.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 +264 -0
- package/dist/abis/contracts/TaxToken.json +969 -0
- package/dist/abis/contracts/TokenManager2.json +136 -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 +3 -0
- package/dist/abis/flap/index.js +3 -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.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 +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 +35 -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 -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 +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 -212
- 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 +286 -0
- package/dist/chains/index.d.ts +13 -0
- package/dist/chains/index.js +13 -0
- package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
- package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -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 +93 -59
- 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 +1 -16
- package/dist/chains/xlayer/eip7702/constants.js +3 -21
- 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 +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 +89 -164
- 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 +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 +3 -3
- 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 +72 -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 +108 -177
- package/dist/contracts/tm.d.ts +3 -2
- package/dist/contracts/tm.js +37 -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 -666
- 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 +10 -0
- package/dist/flap/index.js +8 -0
- package/dist/flows/create.d.ts +2 -1
- 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 -85
- package/dist/index.js +20 -215
- 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 -252
- package/dist/shared/abis/index.d.ts +5 -6
- package/dist/shared/abis/index.js +5 -7
- package/dist/shared/clients/blockrazor.js +39 -25
- package/dist/shared/clients/club48.d.ts +2 -2
- package/dist/shared/clients/club48.js +34 -29
- 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.js +27 -34
- package/dist/shared/constants/addresses.d.ts +1 -1
- package/dist/shared/constants/addresses.js +11 -2
- package/dist/shared/constants/chains.d.ts +1 -1
- package/dist/shared/constants/chains.js +1 -1
- package/dist/shared/constants/gas.d.ts +1 -1
- package/dist/shared/constants/gas.js +2 -6
- package/dist/shared/constants/index.d.ts +3 -0
- package/dist/shared/constants/index.js +1 -0
- package/dist/shared/constants/quote.d.ts +30 -0
- package/dist/shared/constants/quote.js +37 -0
- package/dist/shared/flap/abi.js +1 -1
- package/dist/shared/flap/constants.d.ts +1 -2
- package/dist/shared/flap/constants.js +2 -3
- 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 +5 -4
- package/dist/shared/flap/index.js +5 -4
- package/dist/shared/flap/meta.d.ts +22 -18
- package/dist/shared/flap/meta.js +12 -17
- package/dist/shared/flap/permit.js +5 -2
- 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 +96 -277
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.d.ts +7 -2
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +107 -206
- 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 +88 -9
- 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 +55 -56
- package/dist/shared/flap/portal-create-token.d.ts +80 -0
- package/dist/shared/flap/portal-create-token.js +257 -0
- package/dist/shared/flap/portal.d.ts +14 -3
- package/dist/shared/flap/portal.js +50 -25
- package/dist/shared/flap/vanity.d.ts +1 -5
- package/dist/shared/flap/vanity.js +6 -17
- package/dist/shared/flap/vault.d.ts +17 -124
- package/dist/shared/flap/vault.js +67 -148
- 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 +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 +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 +183 -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 +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 +94 -125
- 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 +26 -661
- 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 +73 -223
- 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 +31 -15
- 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 +2 -25
- package/dist/utils/wallet.js +13 -10
- package/dist/vanity/index.d.ts +5 -0
- package/dist/vanity/index.js +5 -0
- package/package.json +160 -4
- 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/abis/TaxToken.json +0 -105
- package/dist/shared/abis/TokenManager2.json +0 -60
- /package/dist/{shared/abis → abis/contracts}/TokenManager.json +0 -0
- /package/dist/{shared/abis → abis/contracts}/TokenManagerHelper3.json +0 -0
|
@@ -1,112 +1,16 @@
|
|
|
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 } 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
|
-
* 使用 48.club Bundle 服务实现原子化交易
|
|
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 { getErrorMessage, waitForBundleWithProvider, } from './tm-bundle-helpers.js';
|
|
13
|
+
const TM2_ABI = TM2Abi;
|
|
110
14
|
export async function createTokenWithBundleBuy(params) {
|
|
111
15
|
const { privateKeys, buyAmounts, tokenInfo, config } = params;
|
|
112
16
|
if (privateKeys.length === 0) {
|
|
@@ -122,7 +26,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
122
26
|
if (!config.customSubmitFn) {
|
|
123
27
|
club48 = new Club48Client({
|
|
124
28
|
endpoint: 'https://puissant-bsc.48.club',
|
|
125
|
-
explorerEndpoint: config.club48ExplorerEndpoint
|
|
29
|
+
explorerEndpoint: config.club48ExplorerEndpoint,
|
|
126
30
|
});
|
|
127
31
|
}
|
|
128
32
|
const fourClient = new FourClient({ baseUrl: config.fourApiUrl });
|
|
@@ -130,7 +34,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
130
34
|
const nonce = await fourClient.generateNonce({
|
|
131
35
|
accountAddress: devWallet.address,
|
|
132
36
|
verifyType: 'LOGIN',
|
|
133
|
-
networkCode: 'BSC'
|
|
37
|
+
networkCode: 'BSC',
|
|
134
38
|
});
|
|
135
39
|
const loginSignature = await devWallet.signMessage(buildLoginMessage(nonce));
|
|
136
40
|
const accessToken = await fourClient.loginDex({
|
|
@@ -140,9 +44,9 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
140
44
|
address: devWallet.address,
|
|
141
45
|
networkCode: 'BSC',
|
|
142
46
|
signature: loginSignature,
|
|
143
|
-
verifyType: 'LOGIN'
|
|
47
|
+
verifyType: 'LOGIN',
|
|
144
48
|
},
|
|
145
|
-
walletName: 'MetaMask'
|
|
49
|
+
walletName: 'MetaMask',
|
|
146
50
|
});
|
|
147
51
|
// 2. 上传图片(如果需要)
|
|
148
52
|
let imgUrl = tokenInfo.imageUrl || '';
|
|
@@ -210,13 +114,15 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
210
114
|
const b0AmountWei = ethers.parseEther(b0AmountStr);
|
|
211
115
|
const preSaleWei = tokenInfo.preSale ? ethers.parseEther(tokenInfo.preSale) : 0n;
|
|
212
116
|
const valueWei = b0AmountWei + preSaleWei;
|
|
213
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
214
|
-
const createTxUnsigned = await tm2.createToken.populateTransaction(createResp.createArg, createResp.signature, {
|
|
117
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, devWallet);
|
|
118
|
+
const createTxUnsigned = await tm2.createToken.populateTransaction(createResp.createArg, createResp.signature, {
|
|
119
|
+
value: valueWei,
|
|
120
|
+
});
|
|
215
121
|
// 估算 gas 并添加 20% 安全余量
|
|
216
122
|
const estimatedCreateGas = await provider.estimateGas({
|
|
217
123
|
...createTxUnsigned,
|
|
218
124
|
from: devWallet.address,
|
|
219
|
-
value: valueWei
|
|
125
|
+
value: valueWei,
|
|
220
126
|
});
|
|
221
127
|
const createGasLimit = (estimatedCreateGas * 120n) / 100n;
|
|
222
128
|
const createTxRequest = {
|
|
@@ -226,14 +132,14 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
226
132
|
gasLimit: createGasLimit,
|
|
227
133
|
gasPrice: gasPrice,
|
|
228
134
|
chainId: 56,
|
|
229
|
-
type: 0 // Legacy transaction (required for BSC on 48.club)
|
|
135
|
+
type: 0, // Legacy transaction (required for BSC on 48.club)
|
|
230
136
|
};
|
|
231
137
|
const signedCreateTx = await devWallet.signTransaction(createTxRequest);
|
|
232
138
|
signedTxs.push(signedCreateTx);
|
|
233
139
|
// 4.2 购买交易
|
|
234
140
|
const buyTxs = [];
|
|
235
141
|
const profitTxs = [];
|
|
236
|
-
const buyAmountsWei = buyAmounts.map(a => ethers.parseEther(a));
|
|
142
|
+
const buyAmountsWei = buyAmounts.map((a) => ethers.parseEther(a));
|
|
237
143
|
// 🔍 找出买入金额最多的买家(由他支付所有利润)
|
|
238
144
|
let maxBuyerIndex = 0;
|
|
239
145
|
let maxAmount = buyAmountsWei[0];
|
|
@@ -244,13 +150,13 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
244
150
|
}
|
|
245
151
|
}
|
|
246
152
|
// ✅ 并行构建所有购买交易
|
|
247
|
-
const buyerWallets = privateKeys.slice(1).map(pk => new Wallet(pk, provider));
|
|
153
|
+
const buyerWallets = privateKeys.slice(1).map((pk) => new Wallet(pk, provider));
|
|
248
154
|
// 并行获取所有买家的 nonce
|
|
249
|
-
const buyerNonces = await Promise.all(buyerWallets.map(w => getNextNonce(w)));
|
|
155
|
+
const buyerNonces = await Promise.all(buyerWallets.map((w) => getNextNonce(w)));
|
|
250
156
|
// 并行构建未签名交易和估算 gas
|
|
251
157
|
const buyTxDataList = await Promise.all(buyAmountsWei.map(async (fundsWei, i) => {
|
|
252
158
|
const buyerWallet = buyerWallets[i];
|
|
253
|
-
const buyTm2 = new ethers.Contract(tmAddr,
|
|
159
|
+
const buyTm2 = new ethers.Contract(tmAddr, TM2_ABI, buyerWallet);
|
|
254
160
|
const buyTxUnsigned = await buyTm2.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyerWallet.address, fundsWei, 0n, { value: fundsWei });
|
|
255
161
|
// 估算 gas 并添加 20% 安全余量
|
|
256
162
|
let buyGasLimit;
|
|
@@ -258,7 +164,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
258
164
|
const estimatedBuyGas = await provider.estimateGas({
|
|
259
165
|
...buyTxUnsigned,
|
|
260
166
|
from: buyerWallet.address,
|
|
261
|
-
value: fundsWei
|
|
167
|
+
value: fundsWei,
|
|
262
168
|
});
|
|
263
169
|
buyGasLimit = (estimatedBuyGas * 120n) / 100n;
|
|
264
170
|
}
|
|
@@ -275,7 +181,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
275
181
|
nonce: buyerNonces[i],
|
|
276
182
|
gasLimit: data.buyGasLimit,
|
|
277
183
|
gasPrice: gasPrice,
|
|
278
|
-
chainId: 56
|
|
184
|
+
chainId: 56,
|
|
279
185
|
};
|
|
280
186
|
return data.buyerWallet.signTransaction(buyTxRequest);
|
|
281
187
|
}));
|
|
@@ -283,7 +189,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
283
189
|
buyTxs.push(...signedBuyTxList);
|
|
284
190
|
// ✅ 聚合利润:由买入最多的人支付总利润(强制 2 跳中转)
|
|
285
191
|
const totalBuyAmount = buyAmountsWei.reduce((sum, amount) => sum + amount, 0n);
|
|
286
|
-
const totalProfitAmount = (totalBuyAmount * BigInt(
|
|
192
|
+
const totalProfitAmount = (totalBuyAmount * BigInt(getProfitRateBps('normal'))) / 10000n;
|
|
287
193
|
let profitHopWallets;
|
|
288
194
|
if (totalProfitAmount > 0n) {
|
|
289
195
|
const payerWallet = new Wallet(privateKeys[maxBuyerIndex + 1], provider);
|
|
@@ -292,12 +198,12 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
292
198
|
provider,
|
|
293
199
|
payerWallet,
|
|
294
200
|
profitAmount: totalProfitAmount,
|
|
295
|
-
profitRecipient:
|
|
201
|
+
profitRecipient: getProfitRecipient(),
|
|
296
202
|
hopCount: PROFIT_HOP_COUNT,
|
|
297
203
|
gasPrice,
|
|
298
204
|
chainId: 56,
|
|
299
205
|
txType: 0,
|
|
300
|
-
startNonce: profitNonce
|
|
206
|
+
startNonce: profitNonce,
|
|
301
207
|
});
|
|
302
208
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
303
209
|
profitTxs.push(...profitHopResult.signedTransactions);
|
|
@@ -312,7 +218,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
312
218
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
313
219
|
chainId: 56,
|
|
314
220
|
type: 0, // Legacy transaction
|
|
315
|
-
nonce: await getNextNonce(devWallet)
|
|
221
|
+
nonce: await getNextNonce(devWallet),
|
|
316
222
|
});
|
|
317
223
|
signedTxs.push(tipTx);
|
|
318
224
|
}
|
|
@@ -325,10 +231,14 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
325
231
|
else if (config.spPrivateKey) {
|
|
326
232
|
await sendBatchPrivateTransactions(signedTxs, config.spPrivateKey, config.club48Endpoint || 'https://puissant-bsc.48.club', {
|
|
327
233
|
spMode: config.spMode ?? 'timestampPersonalSign',
|
|
328
|
-
spVMode: config.spVMode
|
|
234
|
+
spVMode: config.spVMode,
|
|
329
235
|
});
|
|
330
236
|
// 批量提交不返回 bundleUuid,使用第一笔交易的 hash 作为标识
|
|
331
|
-
|
|
237
|
+
const firstHash = ethers.Transaction.from(signedTxs[0]).hash;
|
|
238
|
+
if (!firstHash) {
|
|
239
|
+
throw new Error('无法解析首笔已签名交易的 hash(48SP 批量提交)');
|
|
240
|
+
}
|
|
241
|
+
bundleUuid = firstHash;
|
|
332
242
|
}
|
|
333
243
|
else {
|
|
334
244
|
// ✅ 直接提交到 48.club Bundle(仅服务器端可用)
|
|
@@ -338,11 +248,11 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
338
248
|
bundleUuid = await club48.sendBundle({
|
|
339
249
|
txs: signedTxs,
|
|
340
250
|
maxBlockNumber: (await provider.getBlockNumber()) + (config.bundleBlockOffset ?? 100),
|
|
341
|
-
noMerge: config.noMerge
|
|
251
|
+
noMerge: config.noMerge,
|
|
342
252
|
}, {
|
|
343
253
|
spMode: config.spMode ?? 'timestampPersonalSign',
|
|
344
254
|
spPrivateKey: config.spPrivateKey || privateKeys[0],
|
|
345
|
-
spVMode: config.spVMode
|
|
255
|
+
spVMode: config.spVMode,
|
|
346
256
|
});
|
|
347
257
|
}
|
|
348
258
|
// 6. 等待完成
|
|
@@ -363,7 +273,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
363
273
|
if (createTxHash) {
|
|
364
274
|
const receipt = await provider.getTransactionReceipt(createTxHash);
|
|
365
275
|
if (receipt && receipt.logs) {
|
|
366
|
-
const tm2Interface = new ethers.Interface(
|
|
276
|
+
const tm2Interface = new ethers.Interface(TM2_ABI);
|
|
367
277
|
for (const log of receipt.logs) {
|
|
368
278
|
try {
|
|
369
279
|
const parsed = tm2Interface.parseLog({ topics: log.topics, data: log.data });
|
|
@@ -372,15 +282,15 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
372
282
|
break;
|
|
373
283
|
}
|
|
374
284
|
}
|
|
375
|
-
catch (
|
|
285
|
+
catch (_e) {
|
|
376
286
|
// 忽略无法解析的日志
|
|
377
287
|
}
|
|
378
288
|
}
|
|
379
289
|
}
|
|
380
290
|
}
|
|
381
291
|
}
|
|
382
|
-
catch
|
|
383
|
-
|
|
292
|
+
catch {
|
|
293
|
+
// ignore receipt parse errors
|
|
384
294
|
}
|
|
385
295
|
}
|
|
386
296
|
return {
|
|
@@ -390,7 +300,7 @@ export async function createTokenWithBundleBuy(params) {
|
|
|
390
300
|
createTx: signedCreateTx,
|
|
391
301
|
buyTxs,
|
|
392
302
|
profitTxs,
|
|
393
|
-
profitHopWallets // ✅ 返回利润多跳钱包
|
|
303
|
+
profitHopWallets, // ✅ 返回利润多跳钱包
|
|
394
304
|
};
|
|
395
305
|
}
|
|
396
306
|
/**
|
|
@@ -404,7 +314,7 @@ export async function batchBuyWithBundle(params) {
|
|
|
404
314
|
const provider = new JsonRpcProvider(config.rpcUrl);
|
|
405
315
|
const club48 = new Club48Client({
|
|
406
316
|
endpoint: config.club48Endpoint,
|
|
407
|
-
explorerEndpoint: config.club48ExplorerEndpoint
|
|
317
|
+
explorerEndpoint: config.club48ExplorerEndpoint,
|
|
408
318
|
});
|
|
409
319
|
const blockOffset = config.bundleBlockOffset ?? 100;
|
|
410
320
|
const tmAddr = ADDRESSES.BSC.TokenManagerOriginal;
|
|
@@ -424,8 +334,8 @@ export async function batchBuyWithBundle(params) {
|
|
|
424
334
|
return onchain;
|
|
425
335
|
};
|
|
426
336
|
// ✅ 并行处理所有买家
|
|
427
|
-
const wallets = privateKeys.map(pk => new Wallet(pk, provider));
|
|
428
|
-
const fundsWeiList = buyAmounts.map(a => ethers.parseEther(a));
|
|
337
|
+
const wallets = privateKeys.map((pk) => new Wallet(pk, provider));
|
|
338
|
+
const fundsWeiList = buyAmounts.map((a) => ethers.parseEther(a));
|
|
429
339
|
// 找出买入最多的买家(由他支付所有利润)
|
|
430
340
|
let maxBuyerIndex = 0;
|
|
431
341
|
let maxFunds = fundsWeiList[0];
|
|
@@ -436,7 +346,7 @@ export async function batchBuyWithBundle(params) {
|
|
|
436
346
|
}
|
|
437
347
|
}
|
|
438
348
|
// 并行获取所有钱包的初始 nonce
|
|
439
|
-
const initialNonces = await Promise.all(wallets.map(w => w.getNonce()));
|
|
349
|
+
const initialNonces = await Promise.all(wallets.map((w) => w.getNonce()));
|
|
440
350
|
// 为每个钱包分配 nonce(普通钱包1个,利润支付者2个)
|
|
441
351
|
const nonceMap = new Map();
|
|
442
352
|
wallets.forEach((w, i) => {
|
|
@@ -451,14 +361,14 @@ export async function batchBuyWithBundle(params) {
|
|
|
451
361
|
// 并行构建未签名交易和估算 gas
|
|
452
362
|
const txDataList = await Promise.all(wallets.map(async (buyerWallet, i) => {
|
|
453
363
|
const fundsWei = fundsWeiList[i];
|
|
454
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
364
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, buyerWallet);
|
|
455
365
|
const buyTxUnsigned = await tm2.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyerWallet.address, fundsWei, 0n, { value: fundsWei });
|
|
456
366
|
let gasLimit;
|
|
457
367
|
try {
|
|
458
368
|
const estimatedGas = await provider.estimateGas({
|
|
459
369
|
...buyTxUnsigned,
|
|
460
370
|
from: buyerWallet.address,
|
|
461
|
-
value: fundsWei
|
|
371
|
+
value: fundsWei,
|
|
462
372
|
});
|
|
463
373
|
gasLimit = (estimatedGas * 120n) / 100n;
|
|
464
374
|
}
|
|
@@ -468,21 +378,21 @@ export async function batchBuyWithBundle(params) {
|
|
|
468
378
|
return { buyTxUnsigned, gasLimit, buyerWallet, fundsWei };
|
|
469
379
|
}));
|
|
470
380
|
// 并行签名所有买入交易
|
|
471
|
-
const signedBuyTxList = await Promise.all(txDataList.map(async (data
|
|
381
|
+
const signedBuyTxList = await Promise.all(txDataList.map(async (data) => {
|
|
472
382
|
const buyTxRequest = {
|
|
473
383
|
...data.buyTxUnsigned,
|
|
474
384
|
from: data.buyerWallet.address,
|
|
475
385
|
nonce: getNextNonceLocal(data.buyerWallet),
|
|
476
386
|
gasLimit: data.gasLimit,
|
|
477
387
|
gasPrice: gasPrice,
|
|
478
|
-
chainId: 56
|
|
388
|
+
chainId: 56,
|
|
479
389
|
};
|
|
480
390
|
return data.buyerWallet.signTransaction(buyTxRequest);
|
|
481
391
|
}));
|
|
482
392
|
signedTxs.push(...signedBuyTxList);
|
|
483
393
|
// ✅ 聚合利润:由买入最多的人支付总利润(强制 2 跳中转)
|
|
484
394
|
const totalFunds = fundsWeiList.reduce((sum, f) => sum + f, 0n);
|
|
485
|
-
const totalProfit = (totalFunds * BigInt(
|
|
395
|
+
const totalProfit = (totalFunds * BigInt(getProfitRateBps('normal'))) / 10000n;
|
|
486
396
|
let profitHopWallets;
|
|
487
397
|
if (totalProfit > 0n) {
|
|
488
398
|
const payerWallet = wallets[maxBuyerIndex];
|
|
@@ -491,12 +401,12 @@ export async function batchBuyWithBundle(params) {
|
|
|
491
401
|
provider,
|
|
492
402
|
payerWallet,
|
|
493
403
|
profitAmount: totalProfit,
|
|
494
|
-
profitRecipient:
|
|
404
|
+
profitRecipient: getProfitRecipient(),
|
|
495
405
|
hopCount: PROFIT_HOP_COUNT,
|
|
496
406
|
gasPrice,
|
|
497
407
|
chainId: 56,
|
|
498
408
|
txType: 0,
|
|
499
|
-
startNonce: profitNonce
|
|
409
|
+
startNonce: profitNonce,
|
|
500
410
|
});
|
|
501
411
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
502
412
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -511,18 +421,18 @@ export async function batchBuyWithBundle(params) {
|
|
|
511
421
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
512
422
|
chainId: 56,
|
|
513
423
|
type: 0, // Legacy transaction
|
|
514
|
-
nonce: await getNextNonce(tipWallet)
|
|
424
|
+
nonce: await getNextNonce(tipWallet),
|
|
515
425
|
});
|
|
516
426
|
signedTxs.unshift(tipTx);
|
|
517
427
|
}
|
|
518
428
|
const bundleUuid = await club48.sendBundle({
|
|
519
429
|
txs: signedTxs,
|
|
520
430
|
maxBlockNumber: (await provider.getBlockNumber()) + blockOffset,
|
|
521
|
-
noMerge: config.noMerge
|
|
431
|
+
noMerge: config.noMerge,
|
|
522
432
|
}, {
|
|
523
433
|
spMode: config.spMode ?? 'timestampPersonalSign',
|
|
524
434
|
spPrivateKey: config.spPrivateKey || privateKeys[0],
|
|
525
|
-
spVMode: config.spVMode
|
|
435
|
+
spVMode: config.spVMode,
|
|
526
436
|
});
|
|
527
437
|
const status = await club48.waitForBundle(bundleUuid);
|
|
528
438
|
return { bundleUuid, status, buyTxs: signedTxs, profitHopWallets }; // ✅ 返回利润多跳钱包
|
|
@@ -538,7 +448,7 @@ export async function batchSellWithBundle(params) {
|
|
|
538
448
|
const provider = new JsonRpcProvider(config.rpcUrl);
|
|
539
449
|
const club48 = new Club48Client({
|
|
540
450
|
endpoint: config.club48Endpoint,
|
|
541
|
-
explorerEndpoint: config.club48ExplorerEndpoint
|
|
451
|
+
explorerEndpoint: config.club48ExplorerEndpoint,
|
|
542
452
|
});
|
|
543
453
|
const blockOffset = config.bundleBlockOffset ?? 100;
|
|
544
454
|
const tmAddr = ADDRESSES.BSC.TokenManagerOriginal;
|
|
@@ -558,8 +468,8 @@ export async function batchSellWithBundle(params) {
|
|
|
558
468
|
return onchain;
|
|
559
469
|
};
|
|
560
470
|
// ✅ 并行处理所有卖家
|
|
561
|
-
const wallets = privateKeys.map(pk => new Wallet(pk, provider));
|
|
562
|
-
const amountsWei = sellAmounts.map(a => ethers.parseUnits(a, 18));
|
|
471
|
+
const wallets = privateKeys.map((pk) => new Wallet(pk, provider));
|
|
472
|
+
const amountsWei = sellAmounts.map((a) => ethers.parseUnits(a, 18));
|
|
563
473
|
// 并行预估所有卖出能获得的 BNB
|
|
564
474
|
const estimatedBnbOuts = await Promise.all(amountsWei.map(async (amountWei) => {
|
|
565
475
|
try {
|
|
@@ -580,7 +490,7 @@ export async function batchSellWithBundle(params) {
|
|
|
580
490
|
}
|
|
581
491
|
}
|
|
582
492
|
// 并行获取所有钱包的初始 nonce
|
|
583
|
-
const initialNonces = await Promise.all(wallets.map(w => w.getNonce()));
|
|
493
|
+
const initialNonces = await Promise.all(wallets.map((w) => w.getNonce()));
|
|
584
494
|
const nonceMap = new Map();
|
|
585
495
|
wallets.forEach((w, i) => {
|
|
586
496
|
nonceMap.set(w.address.toLowerCase(), initialNonces[i]);
|
|
@@ -594,13 +504,13 @@ export async function batchSellWithBundle(params) {
|
|
|
594
504
|
// 并行构建未签名交易和估算 gas
|
|
595
505
|
const txDataList = await Promise.all(wallets.map(async (sellerWallet, i) => {
|
|
596
506
|
const amountWei = amountsWei[i];
|
|
597
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
507
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, sellerWallet);
|
|
598
508
|
const sellTxUnsigned = await tm2.sellToken.populateTransaction(0n, tokenAddress, amountWei, 0n);
|
|
599
509
|
let gasLimit;
|
|
600
510
|
try {
|
|
601
511
|
const estimatedGas = await provider.estimateGas({
|
|
602
512
|
...sellTxUnsigned,
|
|
603
|
-
from: sellerWallet.address
|
|
513
|
+
from: sellerWallet.address,
|
|
604
514
|
});
|
|
605
515
|
gasLimit = (estimatedGas * 120n) / 100n;
|
|
606
516
|
}
|
|
@@ -610,21 +520,21 @@ export async function batchSellWithBundle(params) {
|
|
|
610
520
|
return { sellTxUnsigned, gasLimit, sellerWallet };
|
|
611
521
|
}));
|
|
612
522
|
// 并行签名所有卖出交易
|
|
613
|
-
const signedSellTxList = await Promise.all(txDataList.map(async (data
|
|
523
|
+
const signedSellTxList = await Promise.all(txDataList.map(async (data) => {
|
|
614
524
|
const sellTxRequest = {
|
|
615
525
|
...data.sellTxUnsigned,
|
|
616
526
|
from: data.sellerWallet.address,
|
|
617
527
|
nonce: getNextNonceLocal(data.sellerWallet),
|
|
618
528
|
gasLimit: data.gasLimit,
|
|
619
529
|
gasPrice: gasPrice,
|
|
620
|
-
chainId: 56
|
|
530
|
+
chainId: 56,
|
|
621
531
|
};
|
|
622
532
|
return data.sellerWallet.signTransaction(sellTxRequest);
|
|
623
533
|
}));
|
|
624
534
|
signedTxs.push(...signedSellTxList);
|
|
625
535
|
// ✅ 聚合利润:由收益最高的人支付总利润(强制 2 跳中转)
|
|
626
536
|
const totalBnbOut = estimatedBnbOuts.reduce((sum, b) => sum + b, 0n);
|
|
627
|
-
const totalProfit = (totalBnbOut * BigInt(
|
|
537
|
+
const totalProfit = (totalBnbOut * BigInt(getProfitRateBps('normal'))) / 10000n;
|
|
628
538
|
let profitHopWallets;
|
|
629
539
|
if (totalProfit > 0n) {
|
|
630
540
|
const payerWallet = wallets[maxSellerIndex];
|
|
@@ -633,12 +543,12 @@ export async function batchSellWithBundle(params) {
|
|
|
633
543
|
provider,
|
|
634
544
|
payerWallet,
|
|
635
545
|
profitAmount: totalProfit,
|
|
636
|
-
profitRecipient:
|
|
546
|
+
profitRecipient: getProfitRecipient(),
|
|
637
547
|
hopCount: PROFIT_HOP_COUNT,
|
|
638
548
|
gasPrice,
|
|
639
549
|
chainId: 56,
|
|
640
550
|
txType: 0,
|
|
641
|
-
startNonce: profitNonce
|
|
551
|
+
startNonce: profitNonce,
|
|
642
552
|
});
|
|
643
553
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
644
554
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -653,18 +563,18 @@ export async function batchSellWithBundle(params) {
|
|
|
653
563
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
654
564
|
chainId: 56,
|
|
655
565
|
type: 0, // Legacy transaction
|
|
656
|
-
nonce: await getNextNonce(tipWallet)
|
|
566
|
+
nonce: await getNextNonce(tipWallet),
|
|
657
567
|
});
|
|
658
568
|
signedTxs.unshift(tipTx);
|
|
659
569
|
}
|
|
660
570
|
const bundleUuid = await club48.sendBundle({
|
|
661
571
|
txs: signedTxs,
|
|
662
572
|
maxBlockNumber: (await provider.getBlockNumber()) + blockOffset,
|
|
663
|
-
noMerge: config.noMerge
|
|
573
|
+
noMerge: config.noMerge,
|
|
664
574
|
}, {
|
|
665
575
|
spMode: config.spMode ?? 'timestampPersonalSign',
|
|
666
576
|
spPrivateKey: config.spPrivateKey || privateKeys[0],
|
|
667
|
-
spVMode: config.spVMode
|
|
577
|
+
spVMode: config.spVMode,
|
|
668
578
|
});
|
|
669
579
|
const status = await club48.waitForBundle(bundleUuid);
|
|
670
580
|
return { bundleUuid, status, sellTxs: signedTxs, profitHopWallets }; // ✅ 返回利润多跳钱包
|
|
@@ -678,12 +588,20 @@ export async function fourPrivateBuy(params) {
|
|
|
678
588
|
const gasPrice = await club48.getMinGasPrice();
|
|
679
589
|
const fundsWei = ethers.parseEther(funds);
|
|
680
590
|
const minAmount = 0n;
|
|
681
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
591
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, wallet);
|
|
682
592
|
const unsigned = await tm2.buyTokenAMAP.populateTransaction(0n, tokenAddress, to ?? wallet.address, fundsWei, minAmount, { value: fundsWei });
|
|
683
593
|
// 估算 gas 并添加 20% 安全余量
|
|
684
594
|
const estimatedGas = await provider.estimateGas({ ...unsigned, from: wallet.address, value: fundsWei });
|
|
685
595
|
const gasLimit = (estimatedGas * 120n) / 100n;
|
|
686
|
-
const req = {
|
|
596
|
+
const req = {
|
|
597
|
+
...unsigned,
|
|
598
|
+
from: wallet.address,
|
|
599
|
+
nonce: await wallet.getNonce(),
|
|
600
|
+
gasLimit,
|
|
601
|
+
gasPrice,
|
|
602
|
+
chainId: 56,
|
|
603
|
+
type: 0,
|
|
604
|
+
};
|
|
687
605
|
const signed = await wallet.signTransaction(req);
|
|
688
606
|
if (spPrivateKey)
|
|
689
607
|
return await club48.sendPrivateTransactionWith48SP(signed, spPrivateKey);
|
|
@@ -698,12 +616,20 @@ export async function fourPrivateSell(params) {
|
|
|
698
616
|
const gasPrice = await club48.getMinGasPrice();
|
|
699
617
|
const amountWei = ethers.parseUnits(amount, 18);
|
|
700
618
|
const minOut = minFunds ?? 0n;
|
|
701
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
619
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, wallet);
|
|
702
620
|
const unsigned = await tm2.sellToken.populateTransaction(0n, tokenAddress, amountWei, minOut);
|
|
703
621
|
// 估算 gas 并添加 20% 安全余量
|
|
704
622
|
const estimatedGas = await provider.estimateGas({ ...unsigned, from: wallet.address });
|
|
705
623
|
const gasLimit = (estimatedGas * 120n) / 100n;
|
|
706
|
-
const req = {
|
|
624
|
+
const req = {
|
|
625
|
+
...unsigned,
|
|
626
|
+
from: wallet.address,
|
|
627
|
+
nonce: await wallet.getNonce(),
|
|
628
|
+
gasLimit,
|
|
629
|
+
gasPrice,
|
|
630
|
+
chainId: 56,
|
|
631
|
+
type: 0,
|
|
632
|
+
};
|
|
707
633
|
const signed = await wallet.signTransaction(req);
|
|
708
634
|
if (spPrivateKey)
|
|
709
635
|
return await club48.sendPrivateTransactionWith48SP(signed, spPrivateKey);
|
|
@@ -717,18 +643,20 @@ export async function fourBatchPrivateBuy(params) {
|
|
|
717
643
|
const club48 = new Club48Client({ endpoint: club48Endpoint, explorerEndpoint: club48ExplorerEndpoint });
|
|
718
644
|
const tmAddr = ADDRESSES.BSC.TokenManagerOriginal;
|
|
719
645
|
// ✅ 并行处理
|
|
720
|
-
const wallets = privateKeys.map(pk => new Wallet(pk, provider));
|
|
721
|
-
const fundsWeiList = fundsList.map(f => ethers.parseEther(f));
|
|
646
|
+
const wallets = privateKeys.map((pk) => new Wallet(pk, provider));
|
|
647
|
+
const fundsWeiList = fundsList.map((f) => ethers.parseEther(f));
|
|
722
648
|
// 并行获取 gasPrice 和所有 nonce
|
|
723
649
|
const [gasPrice, nonces] = await Promise.all([
|
|
724
650
|
club48.getMinGasPrice(),
|
|
725
|
-
Promise.all(wallets.map(w => w.getNonce()))
|
|
651
|
+
Promise.all(wallets.map((w) => w.getNonce())),
|
|
726
652
|
]);
|
|
727
653
|
// 并行构建未签名交易和估算 gas
|
|
728
654
|
const txDataList = await Promise.all(wallets.map(async (w, i) => {
|
|
729
655
|
const fundsWei = fundsWeiList[i];
|
|
730
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
731
|
-
const unsigned = await tm2.buyTokenAMAP.populateTransaction(0n, tokenAddress, w.address, fundsWei, 0n, {
|
|
656
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, w);
|
|
657
|
+
const unsigned = await tm2.buyTokenAMAP.populateTransaction(0n, tokenAddress, w.address, fundsWei, 0n, {
|
|
658
|
+
value: fundsWei,
|
|
659
|
+
});
|
|
732
660
|
let gasLimit;
|
|
733
661
|
try {
|
|
734
662
|
const estimatedGas = await provider.estimateGas({ ...unsigned, from: w.address, value: fundsWei });
|
|
@@ -748,7 +676,7 @@ export async function fourBatchPrivateBuy(params) {
|
|
|
748
676
|
gasLimit: data.gasLimit,
|
|
749
677
|
gasPrice,
|
|
750
678
|
chainId: 56,
|
|
751
|
-
type: 0
|
|
679
|
+
type: 0,
|
|
752
680
|
};
|
|
753
681
|
return data.wallet.signTransaction(req);
|
|
754
682
|
}));
|
|
@@ -756,11 +684,14 @@ export async function fourBatchPrivateBuy(params) {
|
|
|
756
684
|
return await sendBatchPrivateTransactions(signedTxs, spPrivateKey, club48Endpoint || 'https://puissant-bsc.48.club');
|
|
757
685
|
}
|
|
758
686
|
// 无 48SP:走 bundle 提交通道
|
|
759
|
-
const bundleUuid = await club48.sendBundle({
|
|
687
|
+
const bundleUuid = await club48.sendBundle({
|
|
688
|
+
txs: signedTxs,
|
|
689
|
+
maxBlockNumber: (await provider.getBlockNumber()) + 100,
|
|
690
|
+
});
|
|
760
691
|
return !!bundleUuid;
|
|
761
692
|
}
|
|
762
693
|
export async function fourBatchPrivateSell(params) {
|
|
763
|
-
const { rpcUrl, privateKeys, amounts, tokenAddress, club48Endpoint, club48ExplorerEndpoint, spPrivateKey, minFundsEach } = params;
|
|
694
|
+
const { rpcUrl, privateKeys, amounts, tokenAddress, club48Endpoint, club48ExplorerEndpoint, spPrivateKey, minFundsEach, } = params;
|
|
764
695
|
if (privateKeys.length !== amounts.length)
|
|
765
696
|
throw new Error('privateKeys and amounts length mismatch');
|
|
766
697
|
const provider = new JsonRpcProvider(rpcUrl);
|
|
@@ -768,17 +699,17 @@ export async function fourBatchPrivateSell(params) {
|
|
|
768
699
|
const tmAddr = ADDRESSES.BSC.TokenManagerOriginal;
|
|
769
700
|
const minOut = minFundsEach ?? 0n;
|
|
770
701
|
// ✅ 并行处理
|
|
771
|
-
const wallets = privateKeys.map(pk => new Wallet(pk, provider));
|
|
772
|
-
const amountsWei = amounts.map(a => ethers.parseUnits(a, 18));
|
|
702
|
+
const wallets = privateKeys.map((pk) => new Wallet(pk, provider));
|
|
703
|
+
const amountsWei = amounts.map((a) => ethers.parseUnits(a, 18));
|
|
773
704
|
// 并行获取 gasPrice 和所有 nonce
|
|
774
705
|
const [gasPrice, nonces] = await Promise.all([
|
|
775
706
|
club48.getMinGasPrice(),
|
|
776
|
-
Promise.all(wallets.map(w => w.getNonce()))
|
|
707
|
+
Promise.all(wallets.map((w) => w.getNonce())),
|
|
777
708
|
]);
|
|
778
709
|
// 并行构建未签名交易和估算 gas
|
|
779
710
|
const txDataList = await Promise.all(wallets.map(async (w, i) => {
|
|
780
711
|
const amountWei = amountsWei[i];
|
|
781
|
-
const tm2 = new ethers.Contract(tmAddr,
|
|
712
|
+
const tm2 = new ethers.Contract(tmAddr, TM2_ABI, w);
|
|
782
713
|
const unsigned = await tm2.sellToken.populateTransaction(0n, tokenAddress, amountWei, minOut);
|
|
783
714
|
let gasLimit;
|
|
784
715
|
try {
|
|
@@ -799,7 +730,7 @@ export async function fourBatchPrivateSell(params) {
|
|
|
799
730
|
gasLimit: data.gasLimit,
|
|
800
731
|
gasPrice,
|
|
801
732
|
chainId: 56,
|
|
802
|
-
type: 0
|
|
733
|
+
type: 0,
|
|
803
734
|
};
|
|
804
735
|
return data.wallet.signTransaction(req);
|
|
805
736
|
}));
|
package/dist/contracts/tm.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { BytesLike,
|
|
2
|
-
|
|
1
|
+
import { BytesLike, Wallet } from 'ethers';
|
|
2
|
+
import { createBscProvider } from '../utils/provider-factory.js';
|
|
3
|
+
export type Providerish = ReturnType<typeof createBscProvider>;
|
|
3
4
|
export type Signerish = Wallet;
|
|
4
5
|
export type CreateOnChainParams = {
|
|
5
6
|
chain: 'BSC';
|