four-flap-meme-sdk 2.2.7 → 2.2.10
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 +6 -41
- package/README.md +0 -31
- package/README.zh-CN.md +6 -41
- package/dist/chains/bsc/four/approve-tokenmanager.d.ts +26 -1
- package/dist/chains/bsc/four/approve-tokenmanager.js +113 -1
- package/dist/chains/bsc/four/config.d.ts +67 -5
- package/dist/chains/bsc/four/config.js +114 -2
- package/dist/chains/bsc/four/core.d.ts +4 -1
- package/dist/chains/bsc/four/core.js +592 -1
- 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 +46 -2
- package/dist/chains/bsc/four/internal.js +239 -2
- package/dist/chains/bsc/four/pancake-proxy.d.ts +28 -1
- package/dist/chains/bsc/four/pancake-proxy.js +687 -1
- package/dist/chains/bsc/four/private.d.ts +27 -1
- package/dist/chains/bsc/four/private.js +477 -1
- package/dist/chains/bsc/four/submit.d.ts +315 -2
- package/dist/chains/bsc/four/submit.js +752 -2
- package/dist/chains/bsc/four/swap-buy-first.d.ts +55 -2
- package/dist/chains/bsc/four/swap-buy-first.js +507 -2
- package/dist/chains/bsc/four/swap-internal.d.ts +3 -1
- package/dist/chains/bsc/four/swap-internal.js +18 -1
- package/dist/chains/bsc/four/swap.d.ts +144 -2
- package/dist/chains/bsc/four/swap.js +766 -2
- package/dist/chains/bsc/four/types.d.ts +476 -1
- package/dist/chains/bsc/four/utils.d.ts +18 -5
- package/dist/chains/bsc/four/utils.js +1552 -5
- package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +91 -1
- package/dist/chains/bsc/pancake/bundle-buy-first.js +212 -97
- package/dist/chains/bsc/pancake/bundle-swap.d.ts +79 -1
- package/dist/chains/bsc/pancake/bundle-swap.js +726 -114
- package/dist/chains/bsc/pancake/index.d.ts +2 -4
- package/dist/chains/bsc/pancake/index.js +3 -1
- package/dist/chains/bsc/platforms/iro/factory.d.ts +2 -2
- package/dist/chains/bsc/platforms/iro/factory.js +1 -3
- 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 +10 -31
- package/dist/chains/bsc/platforms/iro/token.js +1 -4
- package/dist/chains/eni/batch-router/bundle-approve.js +3 -4
- package/dist/chains/eni/batch-router/transfer.js +25 -55
- package/dist/chains/eni/batch-router/utils.js +6 -32
- package/dist/chains/eni/bundler/sign.js +6 -5
- package/dist/chains/eni/bundler/submit.js +4 -1
- package/dist/chains/eni/constants.js +1 -1
- package/dist/chains/eni/index.d.ts +1 -2
- package/dist/chains/eni/index.js +0 -1
- package/dist/chains/eni/platforms/daoaas/create.js +2 -2
- package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
- package/dist/chains/eni/platforms/daoaas/index.js +3 -3
- package/dist/chains/eni/platforms/daoaas/meta.js +6 -9
- package/dist/chains/eni/platforms/daoaas/portal-direct.js +44 -28
- package/dist/chains/eni/platforms/daoaas/portal.js +6 -10
- package/dist/chains/eni/platforms/dswap/liquidity.js +26 -58
- 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 +46 -87
- package/dist/chains/eni/platforms/fair-launch/pool.js +1 -4
- 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 +1 -3
- 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 +26 -90
- package/dist/chains/eni/platforms/iro/token.js +31 -107
- package/dist/chains/eni/platforms/iro/whitelist.js +18 -6
- package/dist/chains/index.d.ts +0 -13
- package/dist/chains/index.js +0 -13
- package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +26 -2
- package/dist/chains/xlayer/eip7702/bundle-approve.js +21 -11
- package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +6 -2
- package/dist/chains/xlayer/eip7702/bundle-buy.js +51 -13
- package/dist/chains/xlayer/eip7702/bundle-create.js +59 -93
- package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +6 -2
- package/dist/chains/xlayer/eip7702/bundle-sell.js +111 -29
- package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +65 -3
- package/dist/chains/xlayer/eip7702/bundle-swap.js +245 -51
- package/dist/chains/xlayer/eip7702/constants.d.ts +16 -1
- package/dist/chains/xlayer/eip7702/constants.js +21 -3
- package/dist/chains/xlayer/eip7702/index.d.ts +46 -28
- package/dist/chains/xlayer/eip7702/index.js +81 -28
- package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +203 -2
- package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +307 -63
- package/dist/chains/xlayer/eip7702/types.d.ts +0 -88
- package/dist/chains/xlayer/eip7702/utils.d.ts +3 -0
- package/dist/chains/xlayer/eip7702/utils.js +28 -23
- package/dist/chains/xlayer/eip7702/volume.d.ts +184 -6
- package/dist/chains/xlayer/eip7702/volume.js +164 -89
- 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.d.ts +95 -1
- package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +299 -66
- package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
- package/dist/chains/xlayer/eoa/eoa-wash-volume.js +23 -18
- package/dist/chains/xlayer/eoa/index.d.ts +6 -10
- package/dist/chains/xlayer/eoa/index.js +23 -8
- package/dist/chains/xlayer/eoa/portal-ops.js +2 -7
- 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 +3 -1
- package/dist/chains/xlayer/index.d.ts +2 -3
- package/dist/chains/xlayer/index.js +7 -4
- package/dist/contracts/helper3.d.ts +5 -20
- package/dist/contracts/helper3.js +20 -56
- package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +26 -1
- package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +113 -1
- package/dist/contracts/tm-bundle-merkle/config.d.ts +67 -5
- package/dist/contracts/tm-bundle-merkle/config.js +114 -2
- package/dist/contracts/tm-bundle-merkle/core.d.ts +4 -1
- package/dist/contracts/tm-bundle-merkle/core.js +591 -1
- 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 +46 -2
- package/dist/contracts/tm-bundle-merkle/internal.js +238 -2
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +28 -1
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +686 -1
- package/dist/contracts/tm-bundle-merkle/private.d.ts +27 -1
- package/dist/contracts/tm-bundle-merkle/private.js +476 -1
- package/dist/contracts/tm-bundle-merkle/submit.d.ts +314 -3
- package/dist/contracts/tm-bundle-merkle/submit.js +928 -3
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +55 -2
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +506 -2
- package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +3 -1
- package/dist/contracts/tm-bundle-merkle/swap-internal.js +18 -1
- package/dist/contracts/tm-bundle-merkle/swap.d.ts +144 -2
- package/dist/contracts/tm-bundle-merkle/swap.js +764 -2
- package/dist/contracts/tm-bundle-merkle/types.d.ts +476 -1
- package/dist/contracts/tm-bundle-merkle/utils.d.ts +18 -6
- package/dist/contracts/tm-bundle-merkle/utils.js +1501 -6
- package/dist/contracts/tm-bundle.d.ts +51 -3
- package/dist/contracts/tm-bundle.js +177 -108
- package/dist/contracts/tm.d.ts +2 -3
- package/dist/contracts/tm.js +32 -37
- package/dist/contracts/tm1.js +4 -9
- package/dist/contracts/tm2.js +4 -9
- package/dist/dex/direct-router.d.ts +125 -3
- package/dist/dex/direct-router.js +666 -237
- package/dist/flows/create.d.ts +1 -2
- package/dist/flows/create.js +6 -6
- package/dist/index.d.ts +86 -20
- package/dist/index.js +216 -20
- package/dist/shared/abis/TaxToken.json +105 -0
- package/dist/shared/abis/TokenManager2.json +60 -0
- package/dist/shared/abis/common.d.ts +83 -2
- package/dist/shared/abis/common.js +253 -2
- package/dist/shared/abis/index.d.ts +6 -5
- package/dist/shared/abis/index.js +7 -5
- package/dist/shared/clients/blockrazor.js +25 -39
- package/dist/shared/clients/club48.d.ts +2 -2
- package/dist/shared/clients/club48.js +29 -34
- package/dist/shared/clients/emitservice.js +0 -2
- package/dist/shared/clients/four.d.ts +6 -21
- package/dist/shared/clients/four.js +24 -29
- package/dist/shared/clients/merkle.js +34 -27
- package/dist/shared/constants/addresses.d.ts +1 -1
- package/dist/shared/constants/addresses.js +2 -11
- 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 +6 -2
- package/dist/shared/constants/index.d.ts +0 -3
- package/dist/shared/constants/index.js +0 -1
- package/dist/shared/flap/abi.js +1 -1
- package/dist/shared/flap/constants.d.ts +2 -1
- package/dist/shared/flap/constants.js +4 -3
- package/dist/shared/flap/curve.js +0 -3
- package/dist/shared/flap/errors.d.ts +4 -1
- package/dist/shared/flap/errors.js +1 -20
- package/dist/shared/flap/index.d.ts +5 -5
- package/dist/shared/flap/index.js +5 -5
- package/dist/shared/flap/launch-v6.d.ts +117 -0
- package/dist/shared/flap/launch-v6.js +111 -0
- package/dist/shared/flap/meta.d.ts +18 -22
- package/dist/shared/flap/meta.js +17 -12
- package/dist/shared/flap/permit.js +2 -5
- package/dist/shared/flap/pinata.d.ts +6 -22
- package/dist/shared/flap/pinata.js +26 -21
- package/dist/shared/flap/portal-bundle-merkle/config.d.ts +72 -3
- package/dist/shared/flap/portal-bundle-merkle/config.js +124 -4
- package/dist/shared/flap/portal-bundle-merkle/core.d.ts +4 -0
- package/dist/shared/flap/portal-bundle-merkle/core.js +267 -164
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.d.ts +4 -17
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +195 -107
- package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +92 -100
- package/dist/shared/flap/portal-bundle-merkle/index.d.ts +7 -11
- package/dist/shared/flap/portal-bundle-merkle/index.js +7 -4
- package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +68 -71
- package/dist/shared/flap/portal-bundle-merkle/private.js +114 -61
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +64 -1
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +247 -66
- package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +71 -2
- package/dist/shared/flap/portal-bundle-merkle/swap.js +410 -103
- package/dist/shared/flap/portal-bundle-merkle/types.d.ts +12 -88
- package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +80 -1
- package/dist/shared/flap/portal-bundle-merkle/utils.js +265 -145
- package/dist/shared/flap/portal-bundle.js +56 -55
- package/dist/shared/flap/portal.d.ts +3 -14
- package/dist/shared/flap/portal.js +26 -49
- package/dist/shared/flap/vanity.d.ts +5 -4
- package/dist/shared/flap/vanity.js +20 -13
- package/dist/shared/flap/vault.d.ts +93 -25
- package/dist/shared/flap/vault.js +126 -75
- package/dist/shared/four/tax-token.d.ts +1 -1
- package/dist/shared/four/tax-token.js +7 -27
- package/dist/shared/index.d.ts +0 -6
- package/dist/shared/index.js +0 -4
- package/dist/utils/airdrop-sweep.d.ts +76 -4
- package/dist/utils/airdrop-sweep.js +55 -42
- package/dist/utils/bundle-helpers.d.ts +243 -9
- package/dist/utils/bundle-helpers.js +584 -10
- package/dist/utils/constants.d.ts +61 -5
- package/dist/utils/constants.js +80 -5
- package/dist/utils/contract-factory.d.ts +4 -2
- package/dist/utils/contract-factory.js +18 -25
- package/dist/utils/erc20.d.ts +89 -7
- package/dist/utils/erc20.js +125 -94
- package/dist/utils/errors.d.ts +1 -12
- package/dist/utils/errors.js +1 -60
- package/dist/utils/holders-maker.d.ts +138 -2
- package/dist/utils/holders-maker.js +661 -26
- package/dist/utils/lp-inspect.d.ts +112 -2
- package/dist/utils/lp-inspect.js +223 -73
- package/dist/utils/mpcExclusive.d.ts +5 -2
- package/dist/utils/mpcExclusive.js +3 -4
- package/dist/utils/private-sale.d.ts +58 -2
- package/dist/utils/private-sale.js +15 -4
- package/dist/utils/provider-factory.d.ts +0 -4
- package/dist/utils/provider-factory.js +0 -10
- package/dist/utils/quote-helpers.d.ts +45 -4
- package/dist/utils/quote-helpers.js +74 -17
- package/dist/utils/stealth-transfer.d.ts +28 -2
- package/dist/utils/stealth-transfer.js +15 -31
- package/dist/utils/swap-helpers.d.ts +15 -2
- package/dist/utils/swap-helpers.js +11 -6
- package/dist/utils/wallet.d.ts +25 -2
- package/dist/utils/wallet.js +10 -13
- package/package.json +4 -160
- package/dist/__tests__/subpath-exports.test.d.ts +0 -1
- package/dist/__tests__/subpath-exports.test.js +0 -64
- package/dist/abis/common.d.ts +0 -85
- package/dist/abis/common.js +0 -264
- package/dist/abis/contracts/TaxToken.json +0 -969
- package/dist/abis/contracts/TokenManager2.json +0 -136
- package/dist/abis/contracts/index.d.ts +0 -5
- package/dist/abis/contracts/index.js +0 -5
- package/dist/abis/flap/index.d.ts +0 -3
- package/dist/abis/flap/index.js +0 -3
- package/dist/abis/flap/portal-events.d.ts +0 -6
- package/dist/abis/flap/portal-events.js +0 -17
- package/dist/abis/flap/portal.d.ts +0 -6
- package/dist/abis/flap/portal.js +0 -37
- package/dist/abis/flap/vault.d.ts +0 -171
- package/dist/abis/flap/vault.js +0 -91
- package/dist/abis/index.d.ts +0 -8
- package/dist/abis/index.js +0 -11
- package/dist/bundle-core/__tests__/config-helpers.test.d.ts +0 -1
- package/dist/bundle-core/__tests__/config-helpers.test.js +0 -28
- package/dist/bundle-core/__tests__/facade-parity.test.d.ts +0 -1
- package/dist/bundle-core/__tests__/facade-parity.test.js +0 -33
- package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +0 -1
- package/dist/bundle-core/__tests__/sign-context-helpers.test.js +0 -60
- package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +0 -1
- package/dist/bundle-core/__tests__/sign-fixture.test.js +0 -220
- package/dist/bundle-core/__tests__/sign-fixtures.d.ts +0 -10
- package/dist/bundle-core/__tests__/sign-fixtures.js +0 -16
- package/dist/bundle-core/config-helpers.d.ts +0 -36
- package/dist/bundle-core/config-helpers.js +0 -57
- package/dist/bundle-core/errors.d.ts +0 -50
- package/dist/bundle-core/errors.js +0 -35
- package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +0 -7
- package/dist/bundle-core/four-meme/approve-tokenmanager.js +0 -99
- package/dist/bundle-core/four-meme/core-helpers.d.ts +0 -8
- package/dist/bundle-core/four-meme/core-helpers.js +0 -40
- package/dist/bundle-core/four-meme/core.d.ts +0 -4
- package/dist/bundle-core/four-meme/core.js +0 -515
- package/dist/bundle-core/four-meme/pancake-proxy.d.ts +0 -28
- package/dist/bundle-core/four-meme/pancake-proxy.js +0 -679
- package/dist/bundle-core/four-meme/private.d.ts +0 -27
- package/dist/bundle-core/four-meme/private.js +0 -465
- package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +0 -2
- package/dist/bundle-core/four-meme/sign-context-helpers.js +0 -2
- package/dist/bundle-core/four-meme/swap-buy-first.d.ts +0 -8
- package/dist/bundle-core/four-meme/swap-buy-first.js +0 -493
- package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +0 -6
- package/dist/bundle-core/four-meme/swap-hop-helpers.js +0 -63
- package/dist/bundle-core/four-meme/swap-internal.d.ts +0 -3
- package/dist/bundle-core/four-meme/swap-internal.js +0 -18
- package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +0 -27
- package/dist/bundle-core/four-meme/swap-sign-helpers.js +0 -105
- package/dist/bundle-core/four-meme/swap.d.ts +0 -17
- package/dist/bundle-core/four-meme/swap.js +0 -505
- package/dist/bundle-core/four-meme/types/buy-first.d.ts +0 -50
- package/dist/bundle-core/four-meme/types/buy-first.js +0 -1
- package/dist/bundle-core/four-meme/types/core-flow.d.ts +0 -63
- package/dist/bundle-core/four-meme/types/core-flow.js +0 -1
- package/dist/bundle-core/four-meme/types/index.d.ts +0 -600
- package/dist/bundle-core/four-meme/types/index.js +0 -1
- package/dist/bundle-core/four-meme/types/swap-internal.d.ts +0 -19
- package/dist/bundle-core/four-meme/types/swap-internal.js +0 -1
- package/dist/bundle-core/four-meme/types.d.ts +0 -1
- package/dist/bundle-core/four-meme/types.js +0 -1
- package/dist/bundle-core/four-meme/utils-disperse.d.ts +0 -7
- package/dist/bundle-core/four-meme/utils-disperse.js +0 -396
- package/dist/bundle-core/four-meme/utils-pairwise.d.ts +0 -8
- package/dist/bundle-core/four-meme/utils-pairwise.js +0 -328
- package/dist/bundle-core/four-meme/utils-sweep.d.ts +0 -8
- package/dist/bundle-core/four-meme/utils-sweep.js +0 -744
- package/dist/bundle-core/index.d.ts +0 -8
- package/dist/bundle-core/index.js +0 -8
- package/dist/bundle-core/internal.d.ts +0 -21
- package/dist/bundle-core/internal.js +0 -182
- package/dist/bundle-core/sign-context-helpers.d.ts +0 -25
- package/dist/bundle-core/sign-context-helpers.js +0 -67
- package/dist/bundle-core/submit.d.ts +0 -293
- package/dist/bundle-core/submit.js +0 -727
- package/dist/bundle-core/types/index.d.ts +0 -8
- package/dist/bundle-core/types/index.js +0 -1
- package/dist/bundle-core/types.d.ts +0 -1
- package/dist/bundle-core/types.js +0 -1
- package/dist/chains/bsc/four/utils-disperse.d.ts +0 -1
- package/dist/chains/bsc/four/utils-disperse.js +0 -1
- package/dist/chains/bsc/four/utils-pairwise.d.ts +0 -1
- package/dist/chains/bsc/four/utils-pairwise.js +0 -1
- package/dist/chains/bsc/four/utils-sweep.d.ts +0 -1
- package/dist/chains/bsc/four/utils-sweep.js +0 -1
- package/dist/chains/bsc/iro.d.ts +0 -5
- package/dist/chains/bsc/iro.js +0 -4
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +0 -159
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +0 -117
- package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +0 -241
- package/dist/chains/bsc/pancake/bundle-swap-helpers.js +0 -565
- package/dist/chains/eni/flat-aliases.d.ts +0 -10
- package/dist/chains/eni/flat-aliases.js +0 -8
- package/dist/chains/eni/submit.d.ts +0 -43
- package/dist/chains/eni/submit.js +0 -286
- package/dist/chains/xlayer/eip7702/flat-aliases.d.ts +0 -13
- package/dist/chains/xlayer/eip7702/flat-aliases.js +0 -10
- package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +0 -79
- package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +0 -1
- package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +0 -26
- package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +0 -57
- package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +0 -148
- package/dist/chains/xlayer/eip7702/volume-helpers.js +0 -48
- package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +0 -126
- package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +0 -228
- package/dist/contracts/tm-bundle-helpers.d.ts +0 -88
- package/dist/contracts/tm-bundle-helpers.js +0 -72
- package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +0 -1
- package/dist/contracts/tm-bundle-merkle/utils-disperse.js +0 -1
- package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +0 -1
- package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +0 -1
- package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +0 -1
- package/dist/contracts/tm-bundle-merkle/utils-sweep.js +0 -1
- package/dist/dex/direct-router-helpers.d.ts +0 -264
- package/dist/dex/direct-router-helpers.js +0 -539
- package/dist/dex/types.d.ts +0 -81
- package/dist/dex/types.js +0 -1
- package/dist/exports/root-bundle-and-tooling.d.ts +0 -27
- package/dist/exports/root-bundle-and-tooling.js +0 -30
- package/dist/exports/root-eni-and-bsc-iro.d.ts +0 -26
- package/dist/exports/root-eni-and-bsc-iro.js +0 -66
- package/dist/exports/root-foundations.d.ts +0 -35
- package/dist/exports/root-foundations.js +0 -70
- package/dist/exports/root-swap-dex-and-xlayer.d.ts +0 -30
- package/dist/exports/root-swap-dex-and-xlayer.js +0 -78
- package/dist/flap/index.d.ts +0 -10
- package/dist/flap/index.js +0 -8
- package/dist/flows/index.d.ts +0 -1
- package/dist/flows/index.js +0 -1
- package/dist/merkle/index.d.ts +0 -12
- package/dist/merkle/index.js +0 -11
- package/dist/shared/clients/index.d.ts +0 -8
- package/dist/shared/clients/index.js +0 -8
- package/dist/shared/constants/quote.d.ts +0 -30
- package/dist/shared/constants/quote.js +0 -37
- package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +0 -32
- package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +0 -83
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +0 -125
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +0 -113
- package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +0 -149
- package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +0 -259
- package/dist/shared/flap/portal-create-token.d.ts +0 -79
- package/dist/shared/flap/portal-create-token.js +0 -261
- package/dist/shared/foundation/dex/v3-path.d.ts +0 -6
- package/dist/shared/foundation/dex/v3-path.js +0 -35
- package/dist/shared/foundation/gas/bundle-gas.d.ts +0 -49
- package/dist/shared/foundation/gas/bundle-gas.js +0 -93
- package/dist/shared/foundation/gas/profit-hop.d.ts +0 -20
- package/dist/shared/foundation/gas/profit-hop.js +0 -72
- package/dist/shared/foundation/index.d.ts +0 -13
- package/dist/shared/foundation/index.js +0 -12
- package/dist/shared/foundation/nonce/nonce-manager.d.ts +0 -17
- package/dist/shared/foundation/nonce/nonce-manager.js +0 -183
- package/dist/shared/foundation/normalize-unknown.d.ts +0 -9
- package/dist/shared/foundation/normalize-unknown.js +0 -29
- package/dist/shared/foundation/sdk-logger.d.ts +0 -13
- package/dist/shared/foundation/sdk-logger.js +0 -12
- package/dist/shared/foundation/tx/build-request.d.ts +0 -17
- package/dist/shared/foundation/tx/build-request.js +0 -25
- package/dist/shared/foundation/tx/sign-batch.d.ts +0 -5
- package/dist/shared/foundation/tx/sign-batch.js +0 -26
- package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +0 -1
- package/dist/shared/foundation/tx/wallet-sign-patch.js +0 -18
- package/dist/shared/foundation/types/airdrop-sweep.d.ts +0 -79
- package/dist/shared/foundation/types/airdrop-sweep.js +0 -1
- package/dist/shared/foundation/types/erc20.d.ts +0 -65
- package/dist/shared/foundation/types/erc20.js +0 -1
- package/dist/shared/foundation/types/holders-maker.d.ts +0 -64
- package/dist/shared/foundation/types/holders-maker.js +0 -1
- package/dist/shared/foundation/types/index.d.ts +0 -7
- package/dist/shared/foundation/types/index.js +0 -1
- package/dist/shared/foundation/types/lp-inspect.d.ts +0 -102
- package/dist/shared/foundation/types/lp-inspect.js +0 -1
- package/dist/shared/foundation/types/multicall.d.ts +0 -5
- package/dist/shared/foundation/types/multicall.js +0 -1
- package/dist/shared/foundation/types/private-sale.d.ts +0 -35
- package/dist/shared/foundation/types/private-sale.js +0 -1
- package/dist/shared/foundation/types/quote-helpers.d.ts +0 -17
- package/dist/shared/foundation/types/quote-helpers.js +0 -1
- package/dist/types/errors.d.ts +0 -27
- package/dist/types/errors.js +0 -34
- package/dist/utils/holders-maker/addresses.d.ts +0 -12
- package/dist/utils/holders-maker/addresses.js +0 -15
- package/dist/utils/holders-maker/buy-tx.d.ts +0 -44
- package/dist/utils/holders-maker/buy-tx.js +0 -278
- package/dist/utils/holders-maker/constants.d.ts +0 -6
- package/dist/utils/holders-maker/constants.js +0 -7
- package/dist/utils/holders-maker/disperse.d.ts +0 -18
- package/dist/utils/holders-maker/disperse.js +0 -90
- package/dist/utils/holders-maker/routing.d.ts +0 -4
- package/dist/utils/holders-maker/routing.js +0 -45
- package/dist/utils/holders-maker/transfer-tx.d.ts +0 -4
- package/dist/utils/holders-maker/transfer-tx.js +0 -67
- package/dist/utils/holders-maker-helpers.d.ts +0 -9
- package/dist/utils/holders-maker-helpers.js +0 -9
- package/dist/utils/hop-chains.d.ts +0 -35
- package/dist/utils/hop-chains.js +0 -215
- package/dist/utils/lp-inspect-helpers.d.ts +0 -9
- package/dist/utils/lp-inspect-helpers.js +0 -109
- package/dist/utils/types/airdrop-sweep.d.ts +0 -1
- package/dist/utils/types/airdrop-sweep.js +0 -1
- package/dist/utils/types/contract-factory.d.ts +0 -1
- package/dist/utils/types/contract-factory.js +0 -1
- package/dist/utils/types/erc20.d.ts +0 -1
- package/dist/utils/types/erc20.js +0 -1
- package/dist/utils/types/errors.d.ts +0 -1
- package/dist/utils/types/errors.js +0 -1
- package/dist/utils/types/holders-maker.d.ts +0 -1
- package/dist/utils/types/holders-maker.js +0 -1
- package/dist/utils/types/hop-chains.d.ts +0 -8
- package/dist/utils/types/hop-chains.js +0 -1
- package/dist/utils/types/index.d.ts +0 -13
- package/dist/utils/types/index.js +0 -1
- package/dist/utils/types/lp-inspect.d.ts +0 -1
- package/dist/utils/types/lp-inspect.js +0 -1
- package/dist/utils/types/mpc-exclusive.d.ts +0 -5
- package/dist/utils/types/mpc-exclusive.js +0 -1
- package/dist/utils/types/private-sale.d.ts +0 -1
- package/dist/utils/types/private-sale.js +0 -1
- package/dist/utils/types/quote-helpers.d.ts +0 -1
- package/dist/utils/types/quote-helpers.js +0 -1
- package/dist/utils/types/stealth-transfer.d.ts +0 -44
- package/dist/utils/types/stealth-transfer.js +0 -1
- package/dist/utils/types/wallet.d.ts +0 -25
- package/dist/utils/types/wallet.js +0 -1
- package/dist/vanity/index.d.ts +0 -5
- package/dist/vanity/index.js +0 -5
- package/src/abis/contracts/TaxToken.json +0 -969
- package/src/abis/contracts/TokenManager.json +0 -836
- package/src/abis/contracts/TokenManager2.json +0 -136
- package/src/abis/contracts/TokenManagerHelper3.json +0 -993
- /package/dist/{abis/contracts → shared/abis}/TokenManager.json +0 -0
- /package/dist/{abis/contracts → shared/abis}/TokenManagerHelper3.json +0 -0
|
@@ -1,28 +1,103 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* EIP-7702 转账功能
|
|
3
|
+
*
|
|
4
|
+
* 支持三种模式:
|
|
5
|
+
* 1. 分散 (disperse): 一对多分发资金
|
|
6
|
+
* 2. 归集 (sweep): 多对一收集资金
|
|
7
|
+
* 3. 多对多 (pairwise): sender[i] → receiver[i] 一一对应转账
|
|
8
|
+
*
|
|
9
|
+
* 所有模式都支持:
|
|
10
|
+
* - 原生 OKB 转账
|
|
11
|
+
* - ERC20 代币转账
|
|
12
|
+
* - 可选的多跳混淆
|
|
13
|
+
*
|
|
14
|
+
* 只生成签名,由调用方决定如何提交
|
|
3
15
|
*/
|
|
4
16
|
import { ethers, Contract } from 'ethers';
|
|
5
|
-
import { createWallet, signAuthorizationsWithNonces, batchGetNonces, buildEIP7702TransactionSync } from './utils.js';
|
|
6
|
-
import { ERC20_ABI, XLAYER_CHAIN_ID } from './constants.js';
|
|
17
|
+
import { getCachedProvider, createWallet, signAuthorizationsWithNonces, batchGetNonces, buildEIP7702TransactionSync, generateRandomWallets, getProfitRecipient, } from './utils.js';
|
|
18
|
+
import { UNIFIED_DELEGATE_ADDRESS, UNIFIED_DELEGATE_ABI, ERC20_ABI, XLAYER_CHAIN_ID, } from './constants.js';
|
|
7
19
|
import { calculateTransferFee } from '../../../shared/constants/index.js';
|
|
8
|
-
|
|
20
|
+
/**
|
|
21
|
+
* 分散资金 - 一对多分发
|
|
22
|
+
*
|
|
23
|
+
* 支持:原生 OKB / ERC20 代币 + 可选多跳
|
|
24
|
+
*
|
|
25
|
+
* 流程(无多跳):主钱包 → 多个接收者
|
|
26
|
+
* 流程(有多跳):主钱包 → hop1 → hop2 → ... → 分发给接收者
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* // 原生 OKB 直接分发
|
|
30
|
+
* const result = await disperse({
|
|
31
|
+
* mainPrivateKey: '0x...',
|
|
32
|
+
* recipients: ['0xAAA', '0xBBB', '0xCCC'],
|
|
33
|
+
* amounts: ['0.1', '0.2', '0.3'],
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* // 原生 OKB 多跳分发
|
|
38
|
+
* const result = await disperse({
|
|
39
|
+
* mainPrivateKey: '0x...',
|
|
40
|
+
* recipients: ['0xAAA', '0xBBB'],
|
|
41
|
+
* amounts: ['0.5', '0.5'],
|
|
42
|
+
* hopCount: 2,
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* // ERC20 代币分发
|
|
47
|
+
* const result = await disperse({
|
|
48
|
+
* mainPrivateKey: '0x...',
|
|
49
|
+
* recipients: ['0xAAA', '0xBBB'],
|
|
50
|
+
* amounts: ['100', '200'],
|
|
51
|
+
* tokenAddress: '0xTOKEN...',
|
|
52
|
+
* tokenDecimals: 18,
|
|
53
|
+
* hopCount: 2,
|
|
54
|
+
* });
|
|
55
|
+
*/
|
|
9
56
|
export async function disperse(params) {
|
|
10
57
|
const { mainPrivateKey, payerPrivateKey, recipients, amounts, tokenAddress, tokenDecimals = 18, hopCount = 0, userType, config, } = params;
|
|
11
58
|
if (recipients.length !== amounts.length) {
|
|
12
59
|
throw new Error('recipients 和 amounts 长度必须相同');
|
|
13
60
|
}
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
const
|
|
61
|
+
const provider = getCachedProvider(config?.rpcUrl);
|
|
62
|
+
const delegateAddress = (config?.delegateAddress && config.delegateAddress.trim()) || UNIFIED_DELEGATE_ADDRESS;
|
|
63
|
+
const delegateInterface = new ethers.Interface(UNIFIED_DELEGATE_ABI);
|
|
64
|
+
// ✅ mainWallet: 资金来源(Token/OKB 从这里转出)
|
|
65
|
+
const mainWallet = createWallet(mainPrivateKey, provider);
|
|
66
|
+
const isNative = !tokenAddress;
|
|
67
|
+
const profitRecipient = getProfitRecipient(config);
|
|
68
|
+
// ✅ 支持单独的 Payer 钱包(用于支付 gas)
|
|
69
|
+
const hasSeparatePayer = payerPrivateKey && payerPrivateKey !== mainPrivateKey;
|
|
70
|
+
const payerWallet = hasSeparatePayer ? createWallet(payerPrivateKey, provider) : null;
|
|
71
|
+
const txSender = payerWallet ?? mainWallet; // 交易发起者
|
|
72
|
+
console.log(`[disperse] 资金钱包: ${mainWallet.address}`);
|
|
73
|
+
console.log(`[disperse] Gas Payer: ${txSender.address}${hasSeparatePayer ? ' (独立 Payer)' : ''}`);
|
|
74
|
+
// ✅ 为每个接收者生成独立的中间钱包链
|
|
75
|
+
// 每个接收者有自己的 hopCount 个中间钱包
|
|
76
|
+
const allHopWalletInfos = [];
|
|
77
|
+
const allHopWallets = [];
|
|
78
|
+
for (let i = 0; i < recipients.length; i++) {
|
|
79
|
+
if (hopCount > 0) {
|
|
80
|
+
const hopInfos = generateRandomWallets(hopCount);
|
|
81
|
+
allHopWalletInfos.push(hopInfos);
|
|
82
|
+
allHopWallets.push(hopInfos.map(info => createWallet(info.privateKey, provider)));
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
allHopWalletInfos.push([]);
|
|
86
|
+
allHopWallets.push([]);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// 解析金额
|
|
90
|
+
const amountsWei = amounts.map(amt => isNative ? ethers.parseEther(amt) : ethers.parseUnits(amt, tokenDecimals));
|
|
19
91
|
const totalAmount = amountsWei.reduce((sum, amt) => sum + amt, 0n);
|
|
20
92
|
// ✅ 按地址数量收取固定费用(原生 OKB)
|
|
21
93
|
const profitAmountOkb = calculateTransferFee(XLAYER_CHAIN_ID, recipients.length);
|
|
94
|
+
console.log(`[disperse] 按地址收费: ${recipients.length} 个地址 × ${ethers.formatEther(calculateTransferFee(XLAYER_CHAIN_ID, 1))} = ${ethers.formatEther(profitAmountOkb)} OKB`);
|
|
22
95
|
// ========================================
|
|
23
96
|
// 并行获取数据
|
|
24
97
|
// ========================================
|
|
25
|
-
const addressesToGetNonces = payerWallet
|
|
98
|
+
const addressesToGetNonces = payerWallet
|
|
99
|
+
? [payerWallet.address, mainWallet.address]
|
|
100
|
+
: [mainWallet.address];
|
|
26
101
|
const [allNoncesResult, feeData] = await Promise.all([
|
|
27
102
|
batchGetNonces(addressesToGetNonces, provider),
|
|
28
103
|
provider.getFeeData(),
|
|
@@ -41,7 +116,8 @@ export async function disperse(params) {
|
|
|
41
116
|
allNonces.push(0);
|
|
42
117
|
}
|
|
43
118
|
}
|
|
44
|
-
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0
|
|
119
|
+
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0 // txSender(Payer 或 mainWallet)是交易发起者
|
|
120
|
+
);
|
|
45
121
|
// ========================================
|
|
46
122
|
// 同步构建调用
|
|
47
123
|
// ========================================
|
|
@@ -79,7 +155,11 @@ export async function disperse(params) {
|
|
|
79
155
|
target: mainWallet.address,
|
|
80
156
|
allowFailure: false,
|
|
81
157
|
value: 0n,
|
|
82
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
158
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
159
|
+
tokenAddress,
|
|
160
|
+
recipient,
|
|
161
|
+
amtWei,
|
|
162
|
+
]),
|
|
83
163
|
});
|
|
84
164
|
}
|
|
85
165
|
}
|
|
@@ -132,7 +212,11 @@ export async function disperse(params) {
|
|
|
132
212
|
target: mainWallet.address,
|
|
133
213
|
allowFailure: false,
|
|
134
214
|
value: 0n,
|
|
135
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
215
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
216
|
+
tokenAddress,
|
|
217
|
+
firstHop.address,
|
|
218
|
+
amtWei,
|
|
219
|
+
]),
|
|
136
220
|
});
|
|
137
221
|
// 中间钱包之间转账
|
|
138
222
|
for (let j = 0; j < hopWallets.length - 1; j++) {
|
|
@@ -151,7 +235,10 @@ export async function disperse(params) {
|
|
|
151
235
|
target: lastHop.address,
|
|
152
236
|
allowFailure: false,
|
|
153
237
|
value: 0n,
|
|
154
|
-
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
238
|
+
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
239
|
+
tokenAddress,
|
|
240
|
+
recipient,
|
|
241
|
+
]),
|
|
155
242
|
});
|
|
156
243
|
}
|
|
157
244
|
}
|
|
@@ -166,13 +253,14 @@ export async function disperse(params) {
|
|
|
166
253
|
value: 0n,
|
|
167
254
|
callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
|
|
168
255
|
});
|
|
256
|
+
console.log(`[disperse] 已添加利润转账调用: ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
|
|
169
257
|
}
|
|
170
258
|
// ========================================
|
|
171
259
|
// 构建交易
|
|
172
260
|
// ========================================
|
|
173
261
|
// ✅ Payer 模式下 value 为 0(资金从 mainWallet 转出,不是 Payer)
|
|
174
262
|
// 无 Payer 时,原生币分发需要传递 value(资金从 txSender 转出)
|
|
175
|
-
const totalValue = isNative && !payerWallet ? totalAmount : 0n;
|
|
263
|
+
const totalValue = (isNative && !payerWallet) ? totalAmount : 0n;
|
|
176
264
|
const signedTransaction = buildEIP7702TransactionSync(txSender, // ✅ 使用 txSender(Payer 或 mainWallet)发起交易
|
|
177
265
|
authorizations, calls, totalValue, payerNonce, // ✅ 使用 txSender 的 nonce
|
|
178
266
|
feeData, config);
|
|
@@ -194,43 +282,95 @@ export async function disperse(params) {
|
|
|
194
282
|
},
|
|
195
283
|
};
|
|
196
284
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
285
|
+
/**
|
|
286
|
+
* 归集资金 - 多对一收集
|
|
287
|
+
*
|
|
288
|
+
* 支持:原生 OKB / ERC20 代币 + 可选多跳
|
|
289
|
+
*
|
|
290
|
+
* 流程(无多跳):多个源钱包 → 目标地址
|
|
291
|
+
* 流程(有多跳):多个源钱包 → hop1 → hop2 → ... → 目标地址
|
|
292
|
+
*
|
|
293
|
+
* @example
|
|
294
|
+
* // 原生 OKB 直接归集
|
|
295
|
+
* const result = await sweep({
|
|
296
|
+
* targetAddress: '0xTARGET',
|
|
297
|
+
* sourcePrivateKeys: ['0x...', '0x...'],
|
|
298
|
+
* });
|
|
299
|
+
*
|
|
300
|
+
* @example
|
|
301
|
+
* // 原生 OKB 多跳归集
|
|
302
|
+
* const result = await sweep({
|
|
303
|
+
* targetAddress: '0xTARGET',
|
|
304
|
+
* sourcePrivateKeys: ['0x...', '0x...'],
|
|
305
|
+
* hopCount: 2,
|
|
306
|
+
* });
|
|
307
|
+
*
|
|
308
|
+
* @example
|
|
309
|
+
* // ERC20 代币归集
|
|
310
|
+
* const result = await sweep({
|
|
311
|
+
* targetAddress: '0xTARGET',
|
|
312
|
+
* sourcePrivateKeys: ['0x...', '0x...'],
|
|
313
|
+
* tokenAddress: '0xTOKEN...',
|
|
314
|
+
* tokenDecimals: 18,
|
|
315
|
+
* hopCount: 2,
|
|
316
|
+
* });
|
|
317
|
+
*/
|
|
200
318
|
export async function sweep(params) {
|
|
201
319
|
const { targetAddress, sourcePrivateKeys, payerPrivateKey, tokenAddress, tokenDecimals = 18, hopCount = 0, reserveGas = true, percent = 100, userType, config, } = params;
|
|
202
|
-
const
|
|
203
|
-
const
|
|
204
|
-
const
|
|
205
|
-
const
|
|
206
|
-
const
|
|
320
|
+
const provider = getCachedProvider(config?.rpcUrl);
|
|
321
|
+
const delegateAddress = (config?.delegateAddress && config.delegateAddress.trim()) || UNIFIED_DELEGATE_ADDRESS;
|
|
322
|
+
const delegateInterface = new ethers.Interface(UNIFIED_DELEGATE_ABI);
|
|
323
|
+
const sourceWallets = sourcePrivateKeys.map(pk => createWallet(pk, provider));
|
|
324
|
+
const isNative = !tokenAddress;
|
|
325
|
+
const profitRecipient = getProfitRecipient(config);
|
|
326
|
+
// ✅ 为每个源钱包生成独立的中间钱包链
|
|
327
|
+
const allHopWalletInfos = [];
|
|
328
|
+
const allHopWallets = [];
|
|
329
|
+
for (let i = 0; i < sourceWallets.length; i++) {
|
|
330
|
+
if (hopCount > 0) {
|
|
331
|
+
const hopInfos = generateRandomWallets(hopCount);
|
|
332
|
+
allHopWalletInfos.push(hopInfos);
|
|
333
|
+
allHopWallets.push(hopInfos.map(info => createWallet(info.privateKey, provider)));
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
allHopWalletInfos.push([]);
|
|
337
|
+
allHopWallets.push([]);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// ✅ 支持单独的 Payer 钱包(用于支付 gas)
|
|
341
|
+
const hasSeparatePayer = payerPrivateKey && !sourcePrivateKeys.includes(payerPrivateKey);
|
|
342
|
+
const payerWallet = hasSeparatePayer ? createWallet(payerPrivateKey, provider) : null;
|
|
207
343
|
const mainWallet = payerWallet ?? sourceWallets[0];
|
|
208
344
|
// ========================================
|
|
209
345
|
// 并行获取数据
|
|
210
346
|
// ========================================
|
|
211
|
-
const sourceAddresses = sourceWallets.map(
|
|
212
|
-
const addressesToGetNonces = payerWallet
|
|
213
|
-
|
|
347
|
+
const sourceAddresses = sourceWallets.map(w => w.address);
|
|
348
|
+
const addressesToGetNonces = payerWallet
|
|
349
|
+
? [payerWallet.address, ...sourceAddresses]
|
|
350
|
+
: sourceAddresses;
|
|
351
|
+
const parallelPromises = [
|
|
214
352
|
batchGetNonces(addressesToGetNonces, provider),
|
|
215
353
|
provider.getFeeData(),
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
354
|
+
];
|
|
355
|
+
if (isNative) {
|
|
356
|
+
parallelPromises.push(Promise.all(sourceWallets.map(w => provider.getBalance(w.address))));
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
const tokenContract = new Contract(tokenAddress, ERC20_ABI, provider);
|
|
360
|
+
parallelPromises.push(Promise.all(sourceWallets.map(w => tokenContract.balanceOf(w.address))));
|
|
361
|
+
}
|
|
362
|
+
const results = await Promise.all(parallelPromises);
|
|
363
|
+
const allNoncesResult = results[0];
|
|
225
364
|
const payerNonce = payerWallet ? allNoncesResult[0] : allNoncesResult[0];
|
|
226
365
|
const nonces = payerWallet ? allNoncesResult.slice(1) : allNoncesResult;
|
|
227
|
-
const
|
|
366
|
+
const feeData = results[1];
|
|
367
|
+
const balances = results[2].map(b => typeof b === 'bigint' ? b : BigInt(b.toString()));
|
|
228
368
|
// 计算转账金额
|
|
229
369
|
// ✅ 修复:当 percent=100 时,不预留 gas,归集全部余额
|
|
230
370
|
const isFullSweep = percent >= 100;
|
|
231
|
-
const gasReserve = reserveGas && isNative && !isFullSweep ? ethers.parseEther('0.001') : 0n;
|
|
371
|
+
const gasReserve = (reserveGas && isNative && !isFullSweep) ? ethers.parseEther('0.001') : 0n;
|
|
232
372
|
const percentBigInt = BigInt(Math.min(100, Math.max(1, percent)));
|
|
233
|
-
const transferAmounts = balances.map(
|
|
373
|
+
const transferAmounts = balances.map(b => {
|
|
234
374
|
if (isFullSweep) {
|
|
235
375
|
// 100% 归集:使用全部余额
|
|
236
376
|
return b;
|
|
@@ -241,6 +381,7 @@ export async function sweep(params) {
|
|
|
241
381
|
const totalAmount = transferAmounts.reduce((sum, amt) => sum + amt, 0n);
|
|
242
382
|
// ✅ 按地址数量收取固定费用(原生 OKB)
|
|
243
383
|
const profitAmountOkb = calculateTransferFee(XLAYER_CHAIN_ID, sourceWallets.length);
|
|
384
|
+
console.log(`[sweep] 按地址收费: ${sourceWallets.length} 个地址 × ${ethers.formatEther(calculateTransferFee(XLAYER_CHAIN_ID, 1))} = ${ethers.formatEther(profitAmountOkb)} OKB`);
|
|
244
385
|
// ✅ 找出归集金额最大的钱包(用于支付 OKB 利润)
|
|
245
386
|
let maxSweepIndex = -1;
|
|
246
387
|
let maxSweepAmount = 0n;
|
|
@@ -261,7 +402,7 @@ export async function sweep(params) {
|
|
|
261
402
|
if (amount <= 0n)
|
|
262
403
|
continue;
|
|
263
404
|
// ✅ 使用 Payer 时所有源钱包都用自己的余额(value: 0n)
|
|
264
|
-
const callValue = payerWallet || i > 0 ? 0n : amount;
|
|
405
|
+
const callValue = (payerWallet || i > 0) ? 0n : amount;
|
|
265
406
|
if (hopCount === 0 || hopWallets.length === 0) {
|
|
266
407
|
// ========================================
|
|
267
408
|
// 直接归集:源钱包 → 目标地址
|
|
@@ -274,6 +415,7 @@ export async function sweep(params) {
|
|
|
274
415
|
value: 0n,
|
|
275
416
|
callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
|
|
276
417
|
});
|
|
418
|
+
console.log(`[sweep] 钱包 ${i} 转利润: ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
|
|
277
419
|
}
|
|
278
420
|
if (isNative) {
|
|
279
421
|
// ✅ 原生 OKB 归集
|
|
@@ -290,7 +432,11 @@ export async function sweep(params) {
|
|
|
290
432
|
target: sourceWallet.address,
|
|
291
433
|
allowFailure: false,
|
|
292
434
|
value: 0n,
|
|
293
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
435
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
436
|
+
tokenAddress,
|
|
437
|
+
targetAddress,
|
|
438
|
+
amount,
|
|
439
|
+
]),
|
|
294
440
|
});
|
|
295
441
|
}
|
|
296
442
|
}
|
|
@@ -308,6 +454,7 @@ export async function sweep(params) {
|
|
|
308
454
|
value: 0n,
|
|
309
455
|
callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
|
|
310
456
|
});
|
|
457
|
+
console.log(`[sweep] 钱包 ${i} 转利润(多跳): ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
|
|
311
458
|
}
|
|
312
459
|
if (isNative) {
|
|
313
460
|
// 源钱包 → 第一个中间钱包
|
|
@@ -342,7 +489,11 @@ export async function sweep(params) {
|
|
|
342
489
|
target: sourceWallet.address,
|
|
343
490
|
allowFailure: false,
|
|
344
491
|
value: 0n,
|
|
345
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
492
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
493
|
+
tokenAddress,
|
|
494
|
+
firstHop.address,
|
|
495
|
+
amount,
|
|
496
|
+
]),
|
|
346
497
|
});
|
|
347
498
|
// 中间钱包之间转账
|
|
348
499
|
for (let j = 0; j < hopWallets.length - 1; j++) {
|
|
@@ -361,7 +512,10 @@ export async function sweep(params) {
|
|
|
361
512
|
target: lastHop.address,
|
|
362
513
|
allowFailure: false,
|
|
363
514
|
value: 0n,
|
|
364
|
-
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
515
|
+
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
516
|
+
tokenAddress,
|
|
517
|
+
targetAddress,
|
|
518
|
+
]),
|
|
365
519
|
});
|
|
366
520
|
}
|
|
367
521
|
}
|
|
@@ -384,12 +538,13 @@ export async function sweep(params) {
|
|
|
384
538
|
allNonces.push(0);
|
|
385
539
|
}
|
|
386
540
|
}
|
|
387
|
-
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0
|
|
541
|
+
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0 // mainWallet 是交易发起者
|
|
542
|
+
);
|
|
388
543
|
// ========================================
|
|
389
544
|
// 同步构建交易
|
|
390
545
|
// ========================================
|
|
391
546
|
// ✅ Payer 模式下 value 为 0(资金来自源钱包)
|
|
392
|
-
const totalValue = isNative && !payerWallet ? transferAmounts[0] : 0n;
|
|
547
|
+
const totalValue = (isNative && !payerWallet) ? transferAmounts[0] : 0n;
|
|
393
548
|
const signedTransaction = buildEIP7702TransactionSync(mainWallet, authorizations, calls, totalValue, payerWallet ? payerNonce : nonces[0], feeData, config);
|
|
394
549
|
// ✅ 返回所有中间钱包(扁平化)
|
|
395
550
|
const flatHopWallets = allHopWalletInfos.flat();
|
|
@@ -409,9 +564,41 @@ export async function sweep(params) {
|
|
|
409
564
|
},
|
|
410
565
|
};
|
|
411
566
|
}
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
567
|
+
/**
|
|
568
|
+
* 多对多转账 - sender[i] → receiver[i] 一一对应
|
|
569
|
+
*
|
|
570
|
+
* 支持:原生 OKB / ERC20 代币 + 可选多跳
|
|
571
|
+
*
|
|
572
|
+
* 每对都有独立的多跳链:sender → hop1 → hop2 → ... → receiver
|
|
573
|
+
*
|
|
574
|
+
* @example
|
|
575
|
+
* // 原生 OKB 多对多(直接转账)
|
|
576
|
+
* const result = await pairwiseTransfer({
|
|
577
|
+
* senderPrivateKeys: ['0xA...', '0xB...', '0xC...'],
|
|
578
|
+
* receiverAddresses: ['0x111', '0x222', '0x333'],
|
|
579
|
+
* amount: '0.1',
|
|
580
|
+
* });
|
|
581
|
+
*
|
|
582
|
+
* @example
|
|
583
|
+
* // 原生 OKB 多对多(带多跳)
|
|
584
|
+
* const result = await pairwiseTransfer({
|
|
585
|
+
* senderPrivateKeys: ['0xA...', '0xB...'],
|
|
586
|
+
* receiverAddresses: ['0x111', '0x222'],
|
|
587
|
+
* amounts: ['0.1', '0.2'],
|
|
588
|
+
* hopCount: 2, // A → hop1 → hop2 → 111, B → hop3 → hop4 → 222
|
|
589
|
+
* });
|
|
590
|
+
*
|
|
591
|
+
* @example
|
|
592
|
+
* // ERC20 多对多(带多跳)
|
|
593
|
+
* const result = await pairwiseTransfer({
|
|
594
|
+
* senderPrivateKeys: ['0xA...', '0xB...'],
|
|
595
|
+
* receiverAddresses: ['0x111', '0x222'],
|
|
596
|
+
* amount: '100',
|
|
597
|
+
* tokenAddress: '0xTOKEN...',
|
|
598
|
+
* tokenDecimals: 18,
|
|
599
|
+
* hopCount: 2,
|
|
600
|
+
* });
|
|
601
|
+
*/
|
|
415
602
|
export async function pairwiseTransfer(params) {
|
|
416
603
|
const { senderPrivateKeys, receiverAddresses, payerPrivateKey, amount, amounts, tokenAddress, tokenDecimals = 18, hopCount = 0, userType, config, } = params;
|
|
417
604
|
// 验证参数
|
|
@@ -422,24 +609,59 @@ export async function pairwiseTransfer(params) {
|
|
|
422
609
|
if (pairCount === 0) {
|
|
423
610
|
throw new Error('至少需要一对发送者/接收者');
|
|
424
611
|
}
|
|
425
|
-
|
|
426
|
-
const
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
612
|
+
// 解析金额
|
|
613
|
+
const normalizedAmounts = (() => {
|
|
614
|
+
if (amounts && amounts.length > 0) {
|
|
615
|
+
if (amounts.length !== pairCount) {
|
|
616
|
+
throw new Error(`amounts 长度 (${amounts.length}) 必须与对数 (${pairCount}) 相同`);
|
|
617
|
+
}
|
|
618
|
+
return amounts;
|
|
619
|
+
}
|
|
620
|
+
if (amount !== undefined && amount.trim().length > 0) {
|
|
621
|
+
return new Array(pairCount).fill(amount);
|
|
622
|
+
}
|
|
623
|
+
throw new Error('必须提供 amount 或 amounts');
|
|
624
|
+
})();
|
|
625
|
+
const provider = getCachedProvider(config?.rpcUrl);
|
|
626
|
+
const delegateAddress = (config?.delegateAddress && config.delegateAddress.trim()) || UNIFIED_DELEGATE_ADDRESS;
|
|
627
|
+
const delegateInterface = new ethers.Interface(UNIFIED_DELEGATE_ABI);
|
|
628
|
+
const isNative = !tokenAddress;
|
|
629
|
+
const profitRecipient = getProfitRecipient(config);
|
|
630
|
+
// 创建钱包
|
|
631
|
+
const senderWallets = senderPrivateKeys.map(pk => createWallet(pk, provider));
|
|
632
|
+
// ✅ 支持单独的 Payer 钱包(用于支付 gas)
|
|
633
|
+
const hasSeparatePayer = payerPrivateKey && !senderPrivateKeys.includes(payerPrivateKey);
|
|
634
|
+
const payerWallet = hasSeparatePayer ? createWallet(payerPrivateKey, provider) : null;
|
|
430
635
|
const mainWallet = payerWallet ?? senderWallets[0];
|
|
431
|
-
|
|
432
|
-
const
|
|
636
|
+
// 为每对生成独立的中间钱包链
|
|
637
|
+
const allHopWalletInfos = [];
|
|
638
|
+
const allHopWallets = [];
|
|
639
|
+
for (let i = 0; i < pairCount; i++) {
|
|
640
|
+
if (hopCount > 0) {
|
|
641
|
+
const hopInfos = generateRandomWallets(hopCount);
|
|
642
|
+
allHopWalletInfos.push(hopInfos);
|
|
643
|
+
allHopWallets.push(hopInfos.map(info => createWallet(info.privateKey, provider)));
|
|
644
|
+
}
|
|
645
|
+
else {
|
|
646
|
+
allHopWalletInfos.push([]);
|
|
647
|
+
allHopWallets.push([]);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
// 解析金额为 Wei
|
|
651
|
+
const amountsWei = normalizedAmounts.map(amt => isNative ? ethers.parseEther(amt) : ethers.parseUnits(amt, tokenDecimals));
|
|
433
652
|
const totalAmount = amountsWei.reduce((sum, amt) => sum + amt, 0n);
|
|
434
653
|
// ✅ 按地址数量收取固定费用(原生 OKB)
|
|
435
654
|
const profitAmountOkb = calculateTransferFee(XLAYER_CHAIN_ID, pairCount);
|
|
655
|
+
console.log(`[pairwiseTransfer] 按地址收费: ${pairCount} 个地址 × ${ethers.formatEther(calculateTransferFee(XLAYER_CHAIN_ID, 1))} = ${ethers.formatEther(profitAmountOkb)} OKB`);
|
|
436
656
|
// ✅ 使用第一个发送者支付 OKB 利润
|
|
437
657
|
const maxTransferIndex = 0;
|
|
438
658
|
// ========================================
|
|
439
659
|
// 并行获取数据
|
|
440
660
|
// ========================================
|
|
441
|
-
const senderAddresses = senderWallets.map(
|
|
442
|
-
const addressesToGetNonces = payerWallet
|
|
661
|
+
const senderAddresses = senderWallets.map(w => w.address);
|
|
662
|
+
const addressesToGetNonces = payerWallet
|
|
663
|
+
? [payerWallet.address, ...senderAddresses]
|
|
664
|
+
: senderAddresses;
|
|
443
665
|
const [allNoncesResult, feeData] = await Promise.all([
|
|
444
666
|
batchGetNonces(addressesToGetNonces, provider),
|
|
445
667
|
provider.getFeeData(),
|
|
@@ -471,8 +693,10 @@ export async function pairwiseTransfer(params) {
|
|
|
471
693
|
value: 0n,
|
|
472
694
|
callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
|
|
473
695
|
});
|
|
696
|
+
console.log(`[pairwiseTransfer] 发送者 ${i} 转利润: ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
|
|
474
697
|
}
|
|
475
698
|
if (isNative) {
|
|
699
|
+
// ✅ 使用 transferAmount 转移指定金额(而不是 transferTo 全额)
|
|
476
700
|
calls.push({
|
|
477
701
|
target: senderWallet.address,
|
|
478
702
|
allowFailure: false,
|
|
@@ -486,7 +710,11 @@ export async function pairwiseTransfer(params) {
|
|
|
486
710
|
target: senderWallet.address,
|
|
487
711
|
allowFailure: false,
|
|
488
712
|
value: 0n,
|
|
489
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
713
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
714
|
+
tokenAddress,
|
|
715
|
+
receiver,
|
|
716
|
+
amtWei,
|
|
717
|
+
]),
|
|
490
718
|
});
|
|
491
719
|
}
|
|
492
720
|
}
|
|
@@ -504,15 +732,18 @@ export async function pairwiseTransfer(params) {
|
|
|
504
732
|
value: 0n,
|
|
505
733
|
callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
|
|
506
734
|
});
|
|
735
|
+
console.log(`[pairwiseTransfer] 发送者 ${i} 转利润(多跳): ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
|
|
507
736
|
}
|
|
508
737
|
if (isNative) {
|
|
509
738
|
// 原生 OKB 多跳
|
|
739
|
+
// ✅ sender → 第一个中间钱包(使用 transferAmount 转移指定金额)
|
|
510
740
|
calls.push({
|
|
511
741
|
target: senderWallet.address,
|
|
512
742
|
allowFailure: false,
|
|
513
743
|
value: shouldPassValue ? amtWei : 0n,
|
|
514
744
|
callData: delegateInterface.encodeFunctionData('transferAmount', [firstHop.address, amtWei]),
|
|
515
745
|
});
|
|
746
|
+
// 中间钱包之间转账(使用 transferTo,因为中间钱包只有这笔钱)
|
|
516
747
|
for (let j = 0; j < hopWallets.length - 1; j++) {
|
|
517
748
|
calls.push({
|
|
518
749
|
target: hopWallets[j].address,
|
|
@@ -521,6 +752,7 @@ export async function pairwiseTransfer(params) {
|
|
|
521
752
|
callData: delegateInterface.encodeFunctionData('transferTo', [hopWallets[j + 1].address]),
|
|
522
753
|
});
|
|
523
754
|
}
|
|
755
|
+
// 最后一个中间钱包 → receiver(使用 transferTo 转移全部)
|
|
524
756
|
calls.push({
|
|
525
757
|
target: lastHop.address,
|
|
526
758
|
allowFailure: false,
|
|
@@ -535,7 +767,11 @@ export async function pairwiseTransfer(params) {
|
|
|
535
767
|
target: senderWallet.address,
|
|
536
768
|
allowFailure: false,
|
|
537
769
|
value: 0n,
|
|
538
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
770
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
771
|
+
tokenAddress,
|
|
772
|
+
firstHop.address,
|
|
773
|
+
amtWei,
|
|
774
|
+
]),
|
|
539
775
|
});
|
|
540
776
|
// 中间钱包之间转账
|
|
541
777
|
for (let j = 0; j < hopWallets.length - 1; j++) {
|
|
@@ -554,7 +790,10 @@ export async function pairwiseTransfer(params) {
|
|
|
554
790
|
target: lastHop.address,
|
|
555
791
|
allowFailure: false,
|
|
556
792
|
value: 0n,
|
|
557
|
-
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
793
|
+
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
794
|
+
tokenAddress,
|
|
795
|
+
receiver,
|
|
796
|
+
]),
|
|
558
797
|
});
|
|
559
798
|
}
|
|
560
799
|
}
|
|
@@ -563,20 +802,25 @@ export async function pairwiseTransfer(params) {
|
|
|
563
802
|
// 同步签署授权(已有 nonce)
|
|
564
803
|
// ========================================
|
|
565
804
|
// ✅ 如果有单独的 Payer,需要为 Payer 也生成授权
|
|
566
|
-
const allWallets = payerWallet
|
|
567
|
-
|
|
805
|
+
const allWallets = payerWallet
|
|
806
|
+
? [payerWallet, ...senderWallets]
|
|
807
|
+
: [...senderWallets];
|
|
808
|
+
const allNonces = payerWallet
|
|
809
|
+
? [payerNonce, ...nonces]
|
|
810
|
+
: [...nonces];
|
|
568
811
|
for (const hopWallets of allHopWallets) {
|
|
569
812
|
for (const hopWallet of hopWallets) {
|
|
570
813
|
allWallets.push(hopWallet);
|
|
571
814
|
allNonces.push(0);
|
|
572
815
|
}
|
|
573
816
|
}
|
|
574
|
-
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0
|
|
817
|
+
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0 // mainWallet(可能是 Payer 或第一个发送者钱包)是交易发起者
|
|
818
|
+
);
|
|
575
819
|
// ========================================
|
|
576
820
|
// 同步构建交易
|
|
577
821
|
// ========================================
|
|
578
822
|
// ✅ Payer 模式下 value 为 0(资金来自发送者钱包)
|
|
579
|
-
const totalValue = isNative && !payerWallet ? totalAmount : 0n;
|
|
823
|
+
const totalValue = (isNative && !payerWallet) ? totalAmount : 0n;
|
|
580
824
|
const signedTransaction = buildEIP7702TransactionSync(mainWallet, authorizations, calls, totalValue, payerWallet ? payerNonce : nonces[0], feeData, config);
|
|
581
825
|
return {
|
|
582
826
|
signedTransaction,
|