four-flap-meme-sdk 2.2.0 → 2.2.2
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.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 +4 -4
- 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 +4 -8
- 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.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 +97 -26
- 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 +301 -58
- 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 +158 -83
- 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 +85 -20
- package/dist/index.js +215 -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 +252 -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 +5 -5
- package/dist/shared/clients/four.js +17 -21
- 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 +3 -2
- 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 +3 -3
- package/dist/shared/flap/index.js +3 -3
- package/dist/shared/flap/meta.d.ts +18 -16
- package/dist/shared/flap/meta.js +17 -12
- package/dist/shared/flap/permit.js +2 -5
- package/dist/shared/flap/pinata.d.ts +4 -11
- package/dist/shared/flap/pinata.js +16 -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 +172 -92
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +99 -106
- 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 +7 -73
- 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 -1
- package/dist/shared/flap/portal.js +25 -32
- package/dist/shared/flap/vanity.d.ts +5 -1
- package/dist/shared/flap/vanity.js +17 -6
- package/dist/shared/flap/vault.d.ts +124 -17
- package/dist/shared/flap/vault.js +148 -67
- 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 +54 -40
- 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 +10 -5
- package/dist/utils/wallet.d.ts +25 -2
- package/dist/utils/wallet.js +8 -9
- package/package.json +4 -159
- 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 -260
- 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 -34
- 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/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 -39
- 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 -180
- 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,44 +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 = [
|
|
352
|
+
batchGetNonces(addressesToGetNonces, provider),
|
|
353
|
+
provider.getFeeData(),
|
|
354
|
+
];
|
|
214
355
|
if (isNative) {
|
|
215
|
-
parallelPromises.push(Promise.all(sourceWallets.map(
|
|
356
|
+
parallelPromises.push(Promise.all(sourceWallets.map(w => provider.getBalance(w.address))));
|
|
216
357
|
}
|
|
217
358
|
else {
|
|
218
|
-
if (!tokenAddress)
|
|
219
|
-
throw new Error('tokenAddress is required for ERC20 sweep');
|
|
220
359
|
const tokenContract = new Contract(tokenAddress, ERC20_ABI, provider);
|
|
221
|
-
parallelPromises.push(Promise.all(sourceWallets.map(
|
|
360
|
+
parallelPromises.push(Promise.all(sourceWallets.map(w => tokenContract.balanceOf(w.address))));
|
|
222
361
|
}
|
|
223
362
|
const results = await Promise.all(parallelPromises);
|
|
224
363
|
const allNoncesResult = results[0];
|
|
225
364
|
const payerNonce = payerWallet ? allNoncesResult[0] : allNoncesResult[0];
|
|
226
365
|
const nonces = payerWallet ? allNoncesResult.slice(1) : allNoncesResult;
|
|
227
366
|
const feeData = results[1];
|
|
228
|
-
const balances = results[2].map(
|
|
367
|
+
const balances = results[2].map(b => typeof b === 'bigint' ? b : BigInt(b.toString()));
|
|
229
368
|
// 计算转账金额
|
|
230
369
|
// ✅ 修复:当 percent=100 时,不预留 gas,归集全部余额
|
|
231
370
|
const isFullSweep = percent >= 100;
|
|
232
|
-
const gasReserve = reserveGas && isNative && !isFullSweep ? ethers.parseEther('0.001') : 0n;
|
|
371
|
+
const gasReserve = (reserveGas && isNative && !isFullSweep) ? ethers.parseEther('0.001') : 0n;
|
|
233
372
|
const percentBigInt = BigInt(Math.min(100, Math.max(1, percent)));
|
|
234
|
-
const transferAmounts = balances.map(
|
|
373
|
+
const transferAmounts = balances.map(b => {
|
|
235
374
|
if (isFullSweep) {
|
|
236
375
|
// 100% 归集:使用全部余额
|
|
237
376
|
return b;
|
|
@@ -242,6 +381,7 @@ export async function sweep(params) {
|
|
|
242
381
|
const totalAmount = transferAmounts.reduce((sum, amt) => sum + amt, 0n);
|
|
243
382
|
// ✅ 按地址数量收取固定费用(原生 OKB)
|
|
244
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`);
|
|
245
385
|
// ✅ 找出归集金额最大的钱包(用于支付 OKB 利润)
|
|
246
386
|
let maxSweepIndex = -1;
|
|
247
387
|
let maxSweepAmount = 0n;
|
|
@@ -262,7 +402,7 @@ export async function sweep(params) {
|
|
|
262
402
|
if (amount <= 0n)
|
|
263
403
|
continue;
|
|
264
404
|
// ✅ 使用 Payer 时所有源钱包都用自己的余额(value: 0n)
|
|
265
|
-
const callValue = payerWallet || i > 0 ? 0n : amount;
|
|
405
|
+
const callValue = (payerWallet || i > 0) ? 0n : amount;
|
|
266
406
|
if (hopCount === 0 || hopWallets.length === 0) {
|
|
267
407
|
// ========================================
|
|
268
408
|
// 直接归集:源钱包 → 目标地址
|
|
@@ -275,6 +415,7 @@ export async function sweep(params) {
|
|
|
275
415
|
value: 0n,
|
|
276
416
|
callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
|
|
277
417
|
});
|
|
418
|
+
console.log(`[sweep] 钱包 ${i} 转利润: ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
|
|
278
419
|
}
|
|
279
420
|
if (isNative) {
|
|
280
421
|
// ✅ 原生 OKB 归集
|
|
@@ -291,7 +432,11 @@ export async function sweep(params) {
|
|
|
291
432
|
target: sourceWallet.address,
|
|
292
433
|
allowFailure: false,
|
|
293
434
|
value: 0n,
|
|
294
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
435
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
436
|
+
tokenAddress,
|
|
437
|
+
targetAddress,
|
|
438
|
+
amount,
|
|
439
|
+
]),
|
|
295
440
|
});
|
|
296
441
|
}
|
|
297
442
|
}
|
|
@@ -309,6 +454,7 @@ export async function sweep(params) {
|
|
|
309
454
|
value: 0n,
|
|
310
455
|
callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
|
|
311
456
|
});
|
|
457
|
+
console.log(`[sweep] 钱包 ${i} 转利润(多跳): ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
|
|
312
458
|
}
|
|
313
459
|
if (isNative) {
|
|
314
460
|
// 源钱包 → 第一个中间钱包
|
|
@@ -343,7 +489,11 @@ export async function sweep(params) {
|
|
|
343
489
|
target: sourceWallet.address,
|
|
344
490
|
allowFailure: false,
|
|
345
491
|
value: 0n,
|
|
346
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
492
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
493
|
+
tokenAddress,
|
|
494
|
+
firstHop.address,
|
|
495
|
+
amount,
|
|
496
|
+
]),
|
|
347
497
|
});
|
|
348
498
|
// 中间钱包之间转账
|
|
349
499
|
for (let j = 0; j < hopWallets.length - 1; j++) {
|
|
@@ -362,7 +512,10 @@ export async function sweep(params) {
|
|
|
362
512
|
target: lastHop.address,
|
|
363
513
|
allowFailure: false,
|
|
364
514
|
value: 0n,
|
|
365
|
-
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
515
|
+
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
516
|
+
tokenAddress,
|
|
517
|
+
targetAddress,
|
|
518
|
+
]),
|
|
366
519
|
});
|
|
367
520
|
}
|
|
368
521
|
}
|
|
@@ -385,12 +538,13 @@ export async function sweep(params) {
|
|
|
385
538
|
allNonces.push(0);
|
|
386
539
|
}
|
|
387
540
|
}
|
|
388
|
-
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0
|
|
541
|
+
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0 // mainWallet 是交易发起者
|
|
542
|
+
);
|
|
389
543
|
// ========================================
|
|
390
544
|
// 同步构建交易
|
|
391
545
|
// ========================================
|
|
392
546
|
// ✅ Payer 模式下 value 为 0(资金来自源钱包)
|
|
393
|
-
const totalValue = isNative && !payerWallet ? transferAmounts[0] : 0n;
|
|
547
|
+
const totalValue = (isNative && !payerWallet) ? transferAmounts[0] : 0n;
|
|
394
548
|
const signedTransaction = buildEIP7702TransactionSync(mainWallet, authorizations, calls, totalValue, payerWallet ? payerNonce : nonces[0], feeData, config);
|
|
395
549
|
// ✅ 返回所有中间钱包(扁平化)
|
|
396
550
|
const flatHopWallets = allHopWalletInfos.flat();
|
|
@@ -410,9 +564,41 @@ export async function sweep(params) {
|
|
|
410
564
|
},
|
|
411
565
|
};
|
|
412
566
|
}
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
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
|
+
*/
|
|
416
602
|
export async function pairwiseTransfer(params) {
|
|
417
603
|
const { senderPrivateKeys, receiverAddresses, payerPrivateKey, amount, amounts, tokenAddress, tokenDecimals = 18, hopCount = 0, userType, config, } = params;
|
|
418
604
|
// 验证参数
|
|
@@ -423,24 +609,59 @@ export async function pairwiseTransfer(params) {
|
|
|
423
609
|
if (pairCount === 0) {
|
|
424
610
|
throw new Error('至少需要一对发送者/接收者');
|
|
425
611
|
}
|
|
426
|
-
|
|
427
|
-
const
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
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;
|
|
431
635
|
const mainWallet = payerWallet ?? senderWallets[0];
|
|
432
|
-
|
|
433
|
-
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));
|
|
434
652
|
const totalAmount = amountsWei.reduce((sum, amt) => sum + amt, 0n);
|
|
435
653
|
// ✅ 按地址数量收取固定费用(原生 OKB)
|
|
436
654
|
const profitAmountOkb = calculateTransferFee(XLAYER_CHAIN_ID, pairCount);
|
|
655
|
+
console.log(`[pairwiseTransfer] 按地址收费: ${pairCount} 个地址 × ${ethers.formatEther(calculateTransferFee(XLAYER_CHAIN_ID, 1))} = ${ethers.formatEther(profitAmountOkb)} OKB`);
|
|
437
656
|
// ✅ 使用第一个发送者支付 OKB 利润
|
|
438
657
|
const maxTransferIndex = 0;
|
|
439
658
|
// ========================================
|
|
440
659
|
// 并行获取数据
|
|
441
660
|
// ========================================
|
|
442
|
-
const senderAddresses = senderWallets.map(
|
|
443
|
-
const addressesToGetNonces = payerWallet
|
|
661
|
+
const senderAddresses = senderWallets.map(w => w.address);
|
|
662
|
+
const addressesToGetNonces = payerWallet
|
|
663
|
+
? [payerWallet.address, ...senderAddresses]
|
|
664
|
+
: senderAddresses;
|
|
444
665
|
const [allNoncesResult, feeData] = await Promise.all([
|
|
445
666
|
batchGetNonces(addressesToGetNonces, provider),
|
|
446
667
|
provider.getFeeData(),
|
|
@@ -472,8 +693,10 @@ export async function pairwiseTransfer(params) {
|
|
|
472
693
|
value: 0n,
|
|
473
694
|
callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
|
|
474
695
|
});
|
|
696
|
+
console.log(`[pairwiseTransfer] 发送者 ${i} 转利润: ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
|
|
475
697
|
}
|
|
476
698
|
if (isNative) {
|
|
699
|
+
// ✅ 使用 transferAmount 转移指定金额(而不是 transferTo 全额)
|
|
477
700
|
calls.push({
|
|
478
701
|
target: senderWallet.address,
|
|
479
702
|
allowFailure: false,
|
|
@@ -487,7 +710,11 @@ export async function pairwiseTransfer(params) {
|
|
|
487
710
|
target: senderWallet.address,
|
|
488
711
|
allowFailure: false,
|
|
489
712
|
value: 0n,
|
|
490
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
713
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
714
|
+
tokenAddress,
|
|
715
|
+
receiver,
|
|
716
|
+
amtWei,
|
|
717
|
+
]),
|
|
491
718
|
});
|
|
492
719
|
}
|
|
493
720
|
}
|
|
@@ -505,15 +732,18 @@ export async function pairwiseTransfer(params) {
|
|
|
505
732
|
value: 0n,
|
|
506
733
|
callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
|
|
507
734
|
});
|
|
735
|
+
console.log(`[pairwiseTransfer] 发送者 ${i} 转利润(多跳): ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
|
|
508
736
|
}
|
|
509
737
|
if (isNative) {
|
|
510
738
|
// 原生 OKB 多跳
|
|
739
|
+
// ✅ sender → 第一个中间钱包(使用 transferAmount 转移指定金额)
|
|
511
740
|
calls.push({
|
|
512
741
|
target: senderWallet.address,
|
|
513
742
|
allowFailure: false,
|
|
514
743
|
value: shouldPassValue ? amtWei : 0n,
|
|
515
744
|
callData: delegateInterface.encodeFunctionData('transferAmount', [firstHop.address, amtWei]),
|
|
516
745
|
});
|
|
746
|
+
// 中间钱包之间转账(使用 transferTo,因为中间钱包只有这笔钱)
|
|
517
747
|
for (let j = 0; j < hopWallets.length - 1; j++) {
|
|
518
748
|
calls.push({
|
|
519
749
|
target: hopWallets[j].address,
|
|
@@ -522,6 +752,7 @@ export async function pairwiseTransfer(params) {
|
|
|
522
752
|
callData: delegateInterface.encodeFunctionData('transferTo', [hopWallets[j + 1].address]),
|
|
523
753
|
});
|
|
524
754
|
}
|
|
755
|
+
// 最后一个中间钱包 → receiver(使用 transferTo 转移全部)
|
|
525
756
|
calls.push({
|
|
526
757
|
target: lastHop.address,
|
|
527
758
|
allowFailure: false,
|
|
@@ -536,7 +767,11 @@ export async function pairwiseTransfer(params) {
|
|
|
536
767
|
target: senderWallet.address,
|
|
537
768
|
allowFailure: false,
|
|
538
769
|
value: 0n,
|
|
539
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
770
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
771
|
+
tokenAddress,
|
|
772
|
+
firstHop.address,
|
|
773
|
+
amtWei,
|
|
774
|
+
]),
|
|
540
775
|
});
|
|
541
776
|
// 中间钱包之间转账
|
|
542
777
|
for (let j = 0; j < hopWallets.length - 1; j++) {
|
|
@@ -555,7 +790,10 @@ export async function pairwiseTransfer(params) {
|
|
|
555
790
|
target: lastHop.address,
|
|
556
791
|
allowFailure: false,
|
|
557
792
|
value: 0n,
|
|
558
|
-
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
793
|
+
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
794
|
+
tokenAddress,
|
|
795
|
+
receiver,
|
|
796
|
+
]),
|
|
559
797
|
});
|
|
560
798
|
}
|
|
561
799
|
}
|
|
@@ -564,20 +802,25 @@ export async function pairwiseTransfer(params) {
|
|
|
564
802
|
// 同步签署授权(已有 nonce)
|
|
565
803
|
// ========================================
|
|
566
804
|
// ✅ 如果有单独的 Payer,需要为 Payer 也生成授权
|
|
567
|
-
const allWallets = payerWallet
|
|
568
|
-
|
|
805
|
+
const allWallets = payerWallet
|
|
806
|
+
? [payerWallet, ...senderWallets]
|
|
807
|
+
: [...senderWallets];
|
|
808
|
+
const allNonces = payerWallet
|
|
809
|
+
? [payerNonce, ...nonces]
|
|
810
|
+
: [...nonces];
|
|
569
811
|
for (const hopWallets of allHopWallets) {
|
|
570
812
|
for (const hopWallet of hopWallets) {
|
|
571
813
|
allWallets.push(hopWallet);
|
|
572
814
|
allNonces.push(0);
|
|
573
815
|
}
|
|
574
816
|
}
|
|
575
|
-
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0
|
|
817
|
+
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0 // mainWallet(可能是 Payer 或第一个发送者钱包)是交易发起者
|
|
818
|
+
);
|
|
576
819
|
// ========================================
|
|
577
820
|
// 同步构建交易
|
|
578
821
|
// ========================================
|
|
579
822
|
// ✅ Payer 模式下 value 为 0(资金来自发送者钱包)
|
|
580
|
-
const totalValue = isNative && !payerWallet ? totalAmount : 0n;
|
|
823
|
+
const totalValue = (isNative && !payerWallet) ? totalAmount : 0n;
|
|
581
824
|
const signedTransaction = buildEIP7702TransactionSync(mainWallet, authorizations, calls, totalValue, payerWallet ? payerNonce : nonces[0], feeData, config);
|
|
582
825
|
return {
|
|
583
826
|
signedTransaction,
|