four-flap-meme-sdk 1.9.49 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +41 -6
- package/README.md +31 -0
- package/README.zh-CN.md +41 -6
- package/dist/abis/common.js +74 -68
- package/dist/abis/flap/vault.js +9 -7
- package/dist/abis/index.d.ts +3 -4
- package/dist/abis/index.js +3 -4
- package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
- package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
- package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
- package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +1 -0
- package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
- package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
- package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
- package/dist/bundle-core/config-helpers.d.ts +36 -0
- package/dist/bundle-core/config-helpers.js +57 -0
- package/dist/bundle-core/errors.d.ts +50 -0
- package/dist/bundle-core/errors.js +34 -0
- package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
- package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
- package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
- package/dist/bundle-core/four-meme/core-helpers.js +40 -0
- package/dist/bundle-core/four-meme/core.d.ts +4 -0
- package/dist/bundle-core/four-meme/core.js +515 -0
- package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
- package/dist/bundle-core/four-meme/pancake-proxy.js +679 -0
- package/dist/bundle-core/four-meme/private.d.ts +27 -0
- package/dist/bundle-core/four-meme/private.js +465 -0
- package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
- package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
- package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
- package/dist/bundle-core/four-meme/swap-buy-first.js +493 -0
- package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
- package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
- package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
- package/dist/bundle-core/four-meme/swap-internal.js +18 -0
- package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +27 -0
- package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
- package/dist/bundle-core/four-meme/swap.d.ts +17 -0
- package/dist/bundle-core/four-meme/swap.js +505 -0
- package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
- package/dist/bundle-core/four-meme/types/buy-first.js +1 -0
- package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
- package/dist/bundle-core/four-meme/types/core-flow.js +1 -0
- package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
- package/dist/bundle-core/four-meme/types/index.js +1 -0
- package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
- package/dist/bundle-core/four-meme/types/swap-internal.js +1 -0
- package/dist/bundle-core/four-meme/types.d.ts +1 -0
- package/dist/bundle-core/four-meme/types.js +1 -0
- package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
- package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
- package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
- package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
- package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
- package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
- package/dist/bundle-core/index.d.ts +8 -0
- package/dist/bundle-core/index.js +8 -0
- package/dist/bundle-core/internal.d.ts +21 -0
- package/dist/bundle-core/internal.js +182 -0
- package/dist/bundle-core/sign-context-helpers.d.ts +25 -0
- package/dist/bundle-core/sign-context-helpers.js +67 -0
- package/dist/bundle-core/submit.d.ts +293 -0
- package/dist/bundle-core/submit.js +727 -0
- package/dist/bundle-core/types/index.d.ts +8 -0
- package/dist/bundle-core/types/index.js +1 -0
- package/dist/bundle-core/types.d.ts +1 -0
- package/dist/bundle-core/types.js +1 -0
- package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
- package/dist/chains/bsc/four/approve-tokenmanager.js +1 -116
- package/dist/chains/bsc/four/config.d.ts +5 -70
- package/dist/chains/bsc/four/config.js +2 -115
- package/dist/chains/bsc/four/core.d.ts +1 -4
- package/dist/chains/bsc/four/core.js +1 -589
- package/dist/chains/bsc/four/disperse.d.ts +12 -0
- package/dist/chains/bsc/four/disperse.js +470 -0
- package/dist/chains/bsc/four/index.d.ts +6 -6
- package/dist/chains/bsc/four/index.js +6 -6
- package/dist/chains/bsc/four/internal.d.ts +2 -50
- package/dist/chains/bsc/four/internal.js +2 -237
- package/dist/chains/bsc/four/pairwise.d.ts +7 -0
- package/dist/chains/bsc/four/pairwise.js +308 -0
- package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
- package/dist/chains/bsc/four/pancake-proxy.js +1 -688
- package/dist/chains/bsc/four/private.d.ts +1 -27
- package/dist/chains/bsc/four/private.js +1 -477
- package/dist/chains/bsc/four/submit.d.ts +2 -315
- package/dist/chains/bsc/four/submit.js +2 -746
- package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
- package/dist/chains/bsc/four/swap-buy-first.js +2 -506
- package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
- package/dist/chains/bsc/four/swap-internal.js +1 -18
- package/dist/chains/bsc/four/swap.d.ts +2 -144
- package/dist/chains/bsc/four/swap.js +2 -760
- package/dist/chains/bsc/four/sweep.d.ts +13 -0
- package/dist/chains/bsc/four/sweep.js +788 -0
- package/dist/chains/bsc/four/types.d.ts +1 -476
- package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
- package/dist/chains/bsc/four/utils-disperse.js +1 -0
- package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
- package/dist/chains/bsc/four/utils-pairwise.js +1 -0
- package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
- package/dist/chains/bsc/four/utils-sweep.js +1 -0
- package/dist/chains/bsc/four/utils.d.ts +5 -18
- package/dist/chains/bsc/four/utils.js +5 -1534
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +159 -0
- package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +117 -0
- package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
- package/dist/chains/bsc/pancake/bundle-buy-first.js +97 -207
- package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
- package/dist/chains/bsc/pancake/bundle-swap-helpers.js +565 -0
- package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
- package/dist/chains/bsc/pancake/bundle-swap.js +111 -686
- package/dist/chains/bsc/pancake/index.d.ts +4 -2
- package/dist/chains/bsc/pancake/index.js +1 -3
- package/dist/chains/bsc/platforms/iro/factory.js +3 -1
- package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
- package/dist/chains/bsc/platforms/iro/index.js +3 -3
- package/dist/chains/bsc/platforms/iro/pool.js +31 -10
- package/dist/chains/bsc/platforms/iro/token.js +4 -1
- package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
- package/dist/chains/eni/batch-router/transfer.js +54 -23
- package/dist/chains/eni/batch-router/utils.js +32 -6
- package/dist/chains/eni/bundler/sign.js +4 -4
- package/dist/chains/eni/bundler/submit.js +1 -4
- package/dist/chains/eni/constants.js +1 -1
- package/dist/chains/eni/index.d.ts +1 -1
- package/dist/chains/eni/platforms/daoaas/create.js +2 -2
- package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
- package/dist/chains/eni/platforms/daoaas/index.js +3 -3
- package/dist/chains/eni/platforms/daoaas/meta.js +8 -4
- package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -43
- package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
- package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
- package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
- package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
- package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -47
- package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
- package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
- package/dist/chains/eni/platforms/iro/factory.js +3 -1
- package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
- package/dist/chains/eni/platforms/iro/index.js +4 -4
- package/dist/chains/eni/platforms/iro/pool.js +90 -26
- package/dist/chains/eni/platforms/iro/token.js +107 -31
- package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
- package/dist/chains/eni/submit.js +5 -13
- package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
- package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -20
- package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
- package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
- package/dist/chains/xlayer/eip7702/bundle-create.js +93 -56
- package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
- package/dist/chains/xlayer/eip7702/bundle-sell.js +26 -74
- package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
- package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -68
- package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
- package/dist/chains/xlayer/eip7702/constants.js +3 -21
- package/dist/chains/xlayer/eip7702/index.d.ts +27 -46
- package/dist/chains/xlayer/eip7702/index.js +27 -81
- package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +79 -0
- package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +1 -0
- package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
- package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +58 -291
- package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
- package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +57 -0
- package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
- package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
- package/dist/chains/xlayer/eip7702/utils.js +23 -28
- package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +148 -0
- package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
- package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
- package/dist/chains/xlayer/eip7702/volume.js +83 -158
- package/dist/chains/xlayer/eoa/constants.js +1 -1
- package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
- package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
- package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
- package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
- package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +64 -276
- package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
- package/dist/chains/xlayer/eoa/eoa-wash-volume.js +14 -14
- package/dist/chains/xlayer/eoa/index.d.ts +10 -6
- package/dist/chains/xlayer/eoa/index.js +8 -23
- package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
- package/dist/chains/xlayer/eoa/router-manager.js +3 -3
- package/dist/chains/xlayer/eoa/types-core.d.ts +363 -0
- package/dist/chains/xlayer/eoa/types-core.js +53 -0
- package/dist/chains/xlayer/eoa/types-create.d.ts +413 -0
- package/dist/chains/xlayer/eoa/types-create.js +9 -0
- package/dist/chains/xlayer/eoa/types-volume.d.ts +209 -0
- package/dist/chains/xlayer/eoa/types-volume.js +13 -0
- package/dist/chains/xlayer/eoa/types.d.ts +2 -2
- package/dist/chains/xlayer/eoa/types.js +1 -3
- package/dist/contracts/helper3.d.ts +20 -17
- package/dist/contracts/helper3.js +56 -20
- package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
- package/dist/contracts/tm-bundle-helpers.js +72 -0
- package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
- package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -117
- package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -70
- package/dist/contracts/tm-bundle-merkle/config.js +2 -115
- package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
- package/dist/contracts/tm-bundle-merkle/core.js +1 -588
- package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
- package/dist/contracts/tm-bundle-merkle/index.js +5 -5
- package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -50
- package/dist/contracts/tm-bundle-merkle/internal.js +2 -236
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
- package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -687
- package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
- package/dist/contracts/tm-bundle-merkle/private.js +1 -476
- package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
- package/dist/contracts/tm-bundle-merkle/submit.js +3 -919
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
- package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -505
- package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
- package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
- package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
- package/dist/contracts/tm-bundle-merkle/swap.js +2 -757
- package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
- package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
- package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
- package/dist/contracts/tm-bundle-merkle/utils.d.ts +5 -6
- package/dist/contracts/tm-bundle-merkle/utils.js +5 -6
- package/dist/contracts/tm-bundle.d.ts +3 -51
- package/dist/contracts/tm-bundle.js +102 -142
- package/dist/contracts/tm.d.ts +3 -2
- package/dist/contracts/tm.js +36 -32
- package/dist/contracts/tm1.js +9 -4
- package/dist/contracts/tm2.js +9 -4
- package/dist/dex/direct-router-helpers.d.ts +264 -0
- package/dist/dex/direct-router-helpers.js +539 -0
- package/dist/dex/direct-router.d.ts +3 -125
- package/dist/dex/direct-router.js +237 -652
- package/dist/dex/types.d.ts +81 -0
- package/dist/dex/types.js +1 -0
- package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
- package/dist/exports/root-bundle-and-tooling.js +30 -0
- package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
- package/dist/exports/root-eni-and-bsc-iro.js +66 -0
- package/dist/exports/root-foundations.d.ts +35 -0
- package/dist/exports/root-foundations.js +70 -0
- package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
- package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
- package/dist/flows/create.d.ts +2 -2
- package/dist/flows/create.js +6 -6
- package/dist/flows/index.d.ts +1 -0
- package/dist/flows/index.js +1 -0
- package/dist/index.d.ts +20 -91
- package/dist/index.js +20 -215
- package/dist/shared/abis/common.d.ts +2 -83
- package/dist/shared/abis/common.js +2 -252
- package/dist/shared/abis/index.d.ts +5 -6
- package/dist/shared/abis/index.js +5 -7
- package/dist/shared/clients/blockrazor.js +41 -24
- package/dist/shared/clients/club48.js +30 -26
- package/dist/shared/clients/emitservice.js +2 -0
- package/dist/shared/clients/four.js +23 -18
- package/dist/shared/clients/index.d.ts +8 -0
- package/dist/shared/clients/index.js +8 -0
- package/dist/shared/clients/merkle.js +26 -30
- package/dist/shared/constants/addresses.d.ts +1 -1
- package/dist/shared/constants/addresses.js +11 -2
- package/dist/shared/constants/chains.d.ts +1 -1
- package/dist/shared/constants/chains.js +1 -1
- package/dist/shared/constants/gas.d.ts +1 -1
- package/dist/shared/constants/gas.js +2 -6
- package/dist/shared/constants/index.d.ts +1 -0
- package/dist/shared/constants/index.js +1 -0
- package/dist/shared/constants/quote.d.ts +30 -0
- package/dist/shared/constants/quote.js +37 -0
- package/dist/shared/flap/__tests__/curve.test.js +3 -3
- package/dist/shared/flap/abi.js +1 -1
- package/dist/shared/flap/constants.d.ts +1 -1
- package/dist/shared/flap/constants.js +2 -2
- package/dist/shared/flap/curve.js +3 -0
- package/dist/shared/flap/errors.d.ts +1 -4
- package/dist/shared/flap/errors.js +21 -3
- package/dist/shared/flap/index.d.ts +2 -2
- package/dist/shared/flap/index.js +2 -2
- package/dist/shared/flap/meta.d.ts +16 -18
- package/dist/shared/flap/meta.js +14 -26
- package/dist/shared/flap/permit.js +6 -5
- package/dist/shared/flap/pinata.d.ts +9 -2
- package/dist/shared/flap/pinata.js +20 -18
- package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
- package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
- package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
- package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
- package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
- package/dist/shared/flap/portal-bundle-merkle/core.js +66 -156
- package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +81 -86
- package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +100 -92
- package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
- package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
- package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
- package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
- package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +66 -247
- package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
- package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
- package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +2 -71
- package/dist/shared/flap/portal-bundle-merkle/swap.js +103 -410
- package/dist/shared/flap/portal-bundle-merkle/types.d.ts +73 -3
- package/dist/shared/flap/portal-bundle-merkle/utils-helpers.d.ts +100 -0
- package/dist/shared/flap/portal-bundle-merkle/utils-helpers.js +133 -0
- package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
- package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
- package/dist/shared/flap/portal-bundle.js +54 -42
- package/dist/shared/flap/portal.js +32 -10
- package/dist/shared/flap/vanity.js +4 -7
- package/dist/shared/flap/vault.d.ts +1 -1
- package/dist/shared/flap/vault.js +54 -48
- package/dist/shared/flap 2/__tests__/curve.test.d.ts +1 -0
- package/dist/shared/flap 2/portal-bundle-merkle/types.js +1 -0
- package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
- package/dist/shared/foundation/dex/v3-path.js +35 -0
- package/dist/shared/foundation/gas/bundle-gas.d.ts +39 -0
- package/dist/shared/foundation/gas/bundle-gas.js +93 -0
- package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
- package/dist/shared/foundation/gas/profit-hop.js +72 -0
- package/dist/shared/foundation/index.d.ts +13 -0
- package/dist/shared/foundation/index.js +12 -0
- package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
- package/dist/shared/foundation/nonce/nonce-manager.js +180 -0
- package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
- package/dist/shared/foundation/normalize-unknown.js +29 -0
- package/dist/shared/foundation/sdk-logger.d.ts +13 -0
- package/dist/shared/foundation/sdk-logger.js +12 -0
- package/dist/shared/foundation/tx/build-request.d.ts +17 -0
- package/dist/shared/foundation/tx/build-request.js +25 -0
- package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
- package/dist/shared/foundation/tx/sign-batch.js +26 -0
- package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
- package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
- package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
- package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
- package/dist/shared/foundation/types/erc20.d.ts +65 -0
- package/dist/shared/foundation/types/erc20.js +1 -0
- package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
- package/dist/shared/foundation/types/holders-maker.js +1 -0
- package/dist/shared/foundation/types/index.d.ts +7 -0
- package/dist/shared/foundation/types/index.js +1 -0
- package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
- package/dist/shared/foundation/types/lp-inspect.js +1 -0
- package/dist/shared/foundation/types/multicall.d.ts +5 -0
- package/dist/shared/foundation/types/multicall.js +1 -0
- package/dist/shared/foundation/types/private-sale.d.ts +35 -0
- package/dist/shared/foundation/types/private-sale.js +1 -0
- package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
- package/dist/shared/foundation/types/quote-helpers.js +1 -0
- package/dist/shared/four/tax-token.d.ts +1 -1
- package/dist/shared/four/tax-token.js +27 -7
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared/index.js +4 -0
- package/dist/types/distribute.d.ts +72 -0
- package/dist/types/distribute.js +1 -0
- package/dist/types 2/errors.d.ts +27 -0
- package/dist/types 2/errors.js +34 -0
- package/dist/utils/airdrop-sweep-types.d.ts +1 -0
- package/dist/utils/airdrop-sweep-types.js +1 -0
- package/dist/utils/airdrop-sweep.d.ts +4 -76
- package/dist/utils/airdrop-sweep.js +38 -52
- package/dist/utils/bundle-helpers.d.ts +9 -243
- package/dist/utils/bundle-helpers.js +10 -584
- package/dist/utils/constants.d.ts +5 -61
- package/dist/utils/constants.js +5 -80
- package/dist/utils/contract-factory.d.ts +2 -4
- package/dist/utils/contract-factory.js +25 -18
- package/dist/utils/erc20-types.d.ts +1 -0
- package/dist/utils/erc20-types.js +1 -0
- package/dist/utils/erc20.d.ts +8 -90
- package/dist/utils/erc20.js +94 -153
- package/dist/utils/errors.d.ts +10 -22
- package/dist/utils/errors.js +61 -79
- package/dist/utils/holders-maker/addresses.d.ts +12 -0
- package/dist/utils/holders-maker/addresses.js +15 -0
- package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
- package/dist/utils/holders-maker/buy-tx.js +278 -0
- package/dist/utils/holders-maker/constants.d.ts +6 -0
- package/dist/utils/holders-maker/constants.js +7 -0
- package/dist/utils/holders-maker/disperse.d.ts +18 -0
- package/dist/utils/holders-maker/disperse.js +90 -0
- package/dist/utils/holders-maker/routing.d.ts +4 -0
- package/dist/utils/holders-maker/routing.js +45 -0
- package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
- package/dist/utils/holders-maker/transfer-tx.js +67 -0
- package/dist/utils/holders-maker-helpers.d.ts +9 -0
- package/dist/utils/holders-maker-helpers.js +9 -0
- package/dist/utils/holders-maker-types.d.ts +1 -0
- package/dist/utils/holders-maker-types.js +1 -0
- package/dist/utils/holders-maker.d.ts +2 -138
- package/dist/utils/holders-maker.js +23 -651
- package/dist/utils/hop-chains.d.ts +35 -0
- package/dist/utils/hop-chains.js +215 -0
- package/dist/utils/lp-inspect-helpers.d.ts +9 -0
- package/dist/utils/lp-inspect-helpers.js +109 -0
- package/dist/utils/lp-inspect-types.d.ts +1 -0
- package/dist/utils/lp-inspect-types.js +1 -0
- package/dist/utils/lp-inspect.d.ts +2 -112
- package/dist/utils/lp-inspect.js +63 -195
- package/dist/utils/mpcExclusive.d.ts +2 -5
- package/dist/utils/mpcExclusive.js +4 -3
- package/dist/utils/private-sale-types.d.ts +1 -0
- package/dist/utils/private-sale-types.js +1 -0
- package/dist/utils/private-sale.d.ts +2 -58
- package/dist/utils/private-sale.js +2 -7
- package/dist/utils/provider-factory.d.ts +4 -0
- package/dist/utils/provider-factory.js +10 -0
- package/dist/utils/quote-helpers-types.d.ts +1 -0
- package/dist/utils/quote-helpers-types.js +1 -0
- package/dist/utils/quote-helpers.d.ts +4 -45
- package/dist/utils/quote-helpers.js +15 -65
- package/dist/utils/stealth-transfer.d.ts +2 -28
- package/dist/utils/stealth-transfer.js +30 -14
- package/dist/utils/swap-helpers.d.ts +0 -3
- package/dist/utils/swap-helpers.js +6 -9
- package/dist/utils/types/airdrop-sweep.d.ts +1 -0
- package/dist/utils/types/airdrop-sweep.js +1 -0
- package/dist/utils/types/contract-factory.d.ts +1 -0
- package/dist/utils/types/contract-factory.js +1 -0
- package/dist/utils/types/erc20.d.ts +1 -0
- package/dist/utils/types/erc20.js +1 -0
- package/dist/utils/types/errors.d.ts +1 -0
- package/dist/utils/types/errors.js +1 -0
- package/dist/utils/types/holders-maker.d.ts +1 -0
- package/dist/utils/types/holders-maker.js +1 -0
- package/dist/utils/types/hop-chains.d.ts +8 -0
- package/dist/utils/types/hop-chains.js +1 -0
- package/dist/utils/types/index.d.ts +13 -0
- package/dist/utils/types/index.js +1 -0
- package/dist/utils/types/lp-inspect.d.ts +1 -0
- package/dist/utils/types/lp-inspect.js +1 -0
- package/dist/utils/types/mpc-exclusive.d.ts +5 -0
- package/dist/utils/types/mpc-exclusive.js +1 -0
- package/dist/utils/types/private-sale.d.ts +1 -0
- package/dist/utils/types/private-sale.js +1 -0
- package/dist/utils/types/quote-helpers.d.ts +1 -0
- package/dist/utils/types/quote-helpers.js +1 -0
- package/dist/utils/types/stealth-transfer.d.ts +44 -0
- package/dist/utils/types/stealth-transfer.js +1 -0
- package/dist/utils/types/wallet.d.ts +25 -0
- package/dist/utils/types/wallet.js +1 -0
- package/dist/utils/wallet.d.ts +2 -25
- package/dist/utils/wallet.js +9 -10
- package/package.json +55 -2
- package/src/abis/contracts/TaxToken.json +969 -0
- package/src/abis/contracts/TokenManager.json +836 -0
- package/src/abis/contracts/TokenManager2.json +136 -0
- package/src/abis/contracts/TokenManagerHelper3.json +993 -0
- /package/dist/{shared 2/flap/__tests__/curve.test.d.ts → bundle-core/__tests__/config-helpers.test.d.ts} +0 -0
- /package/dist/{shared 2/flap/portal-bundle-merkle/types.js → bundle-core/__tests__/facade-parity.test.d.ts} +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/TaxToken.json +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/TokenManager.json +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/TokenManager2.json +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/TokenManagerHelper3.json +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/common.d.ts +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/common.js +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/index.d.ts +0 -0
- /package/dist/{shared 2/abis → shared/abis 2}/index.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/club48.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/club48.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/emitservice.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/emitservice.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/four.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/four.js +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/merkle.d.ts +0 -0
- /package/dist/{shared 2/clients → shared/clients 2}/merkle.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/__tests__/curve.test.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/abi.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/abi.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/constants.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/constants.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/curve.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/curve.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/errors.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/errors.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/index.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/index.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/ipfs.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/ipfs.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/meta.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/meta.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/permit.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/permit.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/pinata.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/pinata.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/types.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/portal.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/vanity.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/vanity.js +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/vault.d.ts +0 -0
- /package/dist/{shared 2/flap → shared/flap 2}/vault.js +0 -0
- /package/dist/{shared 2/four → shared/four 2}/index.d.ts +0 -0
- /package/dist/{shared 2/four → shared/four 2}/index.js +0 -0
- /package/dist/{shared 2/four → shared/four 2}/tax-token.d.ts +0 -0
- /package/dist/{shared 2/four → shared/four 2}/tax-token.js +0 -0
- /package/dist/{shared 2/index.d.ts → shared/index 2.js} +0 -0
- /package/dist/{shared 2/index.js → shared/index.d 2.ts} +0 -0
|
@@ -1,100 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* 支持三种模式:
|
|
5
|
-
* 1. 分散 (disperse): 一对多分发资金
|
|
6
|
-
* 2. 归集 (sweep): 多对一收集资金
|
|
7
|
-
* 3. 多对多 (pairwise): sender[i] → receiver[i] 一一对应转账
|
|
8
|
-
*
|
|
9
|
-
* 所有模式都支持:
|
|
10
|
-
* - 原生 OKB 转账
|
|
11
|
-
* - ERC20 代币转账
|
|
12
|
-
* - 可选的多跳混淆
|
|
13
|
-
*
|
|
14
|
-
* 只生成签名,由调用方决定如何提交
|
|
2
|
+
* multi-hop-transfer - 主函数
|
|
15
3
|
*/
|
|
16
4
|
import { ethers, Contract } from 'ethers';
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
5
|
+
import { createWallet, signAuthorizationsWithNonces, batchGetNonces, buildEIP7702TransactionSync } from './utils.js';
|
|
6
|
+
import { ERC20_ABI, XLAYER_CHAIN_ID } from './constants.js';
|
|
19
7
|
import { calculateTransferFee } from '../../../shared/constants/index.js';
|
|
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
|
-
*/
|
|
8
|
+
import { createEip7702DelegateContext, generateHopWalletMatrix, isNativeTransferToken, normalizePairwiseAmounts, parseTransferAmountsWei, resolveDispersePayerWallets, resolveListPayerWallet, } from './transfer-context-helpers.js';
|
|
56
9
|
export async function disperse(params) {
|
|
57
10
|
const { mainPrivateKey, payerPrivateKey, recipients, amounts, tokenAddress, tokenDecimals = 18, hopCount = 0, userType, config, } = params;
|
|
58
11
|
if (recipients.length !== amounts.length) {
|
|
59
12
|
throw new Error('recipients 和 amounts 长度必须相同');
|
|
60
13
|
}
|
|
61
|
-
const provider =
|
|
62
|
-
const
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
const
|
|
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
|
-
// ✅ 为每个接收者生成独立的中间钱包链
|
|
73
|
-
// 每个接收者有自己的 hopCount 个中间钱包
|
|
74
|
-
const allHopWalletInfos = [];
|
|
75
|
-
const allHopWallets = [];
|
|
76
|
-
for (let i = 0; i < recipients.length; i++) {
|
|
77
|
-
if (hopCount > 0) {
|
|
78
|
-
const hopInfos = generateRandomWallets(hopCount);
|
|
79
|
-
allHopWalletInfos.push(hopInfos);
|
|
80
|
-
allHopWallets.push(hopInfos.map(info => createWallet(info.privateKey, provider)));
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
allHopWalletInfos.push([]);
|
|
84
|
-
allHopWallets.push([]);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
// 解析金额
|
|
88
|
-
const amountsWei = amounts.map(amt => isNative ? ethers.parseEther(amt) : ethers.parseUnits(amt, tokenDecimals));
|
|
14
|
+
const { provider, delegateAddress, delegateInterface, profitRecipient } = createEip7702DelegateContext(config);
|
|
15
|
+
const { mainWallet, payerWallet, txSender } = resolveDispersePayerWallets(mainPrivateKey, payerPrivateKey, provider);
|
|
16
|
+
const isNative = isNativeTransferToken(tokenAddress);
|
|
17
|
+
const { allHopWalletInfos, allHopWallets } = generateHopWalletMatrix(recipients.length, hopCount, provider);
|
|
18
|
+
const amountsWei = parseTransferAmountsWei(amounts, isNative, tokenDecimals);
|
|
89
19
|
const totalAmount = amountsWei.reduce((sum, amt) => sum + amt, 0n);
|
|
90
20
|
// ✅ 按地址数量收取固定费用(原生 OKB)
|
|
91
21
|
const profitAmountOkb = calculateTransferFee(XLAYER_CHAIN_ID, recipients.length);
|
|
92
22
|
// ========================================
|
|
93
23
|
// 并行获取数据
|
|
94
24
|
// ========================================
|
|
95
|
-
const addressesToGetNonces = payerWallet
|
|
96
|
-
? [payerWallet.address, mainWallet.address]
|
|
97
|
-
: [mainWallet.address];
|
|
25
|
+
const addressesToGetNonces = payerWallet ? [payerWallet.address, mainWallet.address] : [mainWallet.address];
|
|
98
26
|
const [allNoncesResult, feeData] = await Promise.all([
|
|
99
27
|
batchGetNonces(addressesToGetNonces, provider),
|
|
100
28
|
provider.getFeeData(),
|
|
@@ -113,8 +41,7 @@ export async function disperse(params) {
|
|
|
113
41
|
allNonces.push(0);
|
|
114
42
|
}
|
|
115
43
|
}
|
|
116
|
-
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0
|
|
117
|
-
);
|
|
44
|
+
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0);
|
|
118
45
|
// ========================================
|
|
119
46
|
// 同步构建调用
|
|
120
47
|
// ========================================
|
|
@@ -152,11 +79,7 @@ export async function disperse(params) {
|
|
|
152
79
|
target: mainWallet.address,
|
|
153
80
|
allowFailure: false,
|
|
154
81
|
value: 0n,
|
|
155
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
156
|
-
tokenAddress,
|
|
157
|
-
recipient,
|
|
158
|
-
amtWei,
|
|
159
|
-
]),
|
|
82
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [tokenAddress, recipient, amtWei]),
|
|
160
83
|
});
|
|
161
84
|
}
|
|
162
85
|
}
|
|
@@ -209,11 +132,7 @@ export async function disperse(params) {
|
|
|
209
132
|
target: mainWallet.address,
|
|
210
133
|
allowFailure: false,
|
|
211
134
|
value: 0n,
|
|
212
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
213
|
-
tokenAddress,
|
|
214
|
-
firstHop.address,
|
|
215
|
-
amtWei,
|
|
216
|
-
]),
|
|
135
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [tokenAddress, firstHop.address, amtWei]),
|
|
217
136
|
});
|
|
218
137
|
// 中间钱包之间转账
|
|
219
138
|
for (let j = 0; j < hopWallets.length - 1; j++) {
|
|
@@ -232,10 +151,7 @@ export async function disperse(params) {
|
|
|
232
151
|
target: lastHop.address,
|
|
233
152
|
allowFailure: false,
|
|
234
153
|
value: 0n,
|
|
235
|
-
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
236
|
-
tokenAddress,
|
|
237
|
-
recipient,
|
|
238
|
-
]),
|
|
154
|
+
callData: delegateInterface.encodeFunctionData('executeTransferAll', [tokenAddress, recipient]),
|
|
239
155
|
});
|
|
240
156
|
}
|
|
241
157
|
}
|
|
@@ -256,7 +172,7 @@ export async function disperse(params) {
|
|
|
256
172
|
// ========================================
|
|
257
173
|
// ✅ Payer 模式下 value 为 0(资金从 mainWallet 转出,不是 Payer)
|
|
258
174
|
// 无 Payer 时,原生币分发需要传递 value(资金从 txSender 转出)
|
|
259
|
-
const totalValue =
|
|
175
|
+
const totalValue = isNative && !payerWallet ? totalAmount : 0n;
|
|
260
176
|
const signedTransaction = buildEIP7702TransactionSync(txSender, // ✅ 使用 txSender(Payer 或 mainWallet)发起交易
|
|
261
177
|
authorizations, calls, totalValue, payerNonce, // ✅ 使用 txSender 的 nonce
|
|
262
178
|
feeData, config);
|
|
@@ -278,95 +194,44 @@ export async function disperse(params) {
|
|
|
278
194
|
},
|
|
279
195
|
};
|
|
280
196
|
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
* 支持:原生 OKB / ERC20 代币 + 可选多跳
|
|
285
|
-
*
|
|
286
|
-
* 流程(无多跳):多个源钱包 → 目标地址
|
|
287
|
-
* 流程(有多跳):多个源钱包 → hop1 → hop2 → ... → 目标地址
|
|
288
|
-
*
|
|
289
|
-
* @example
|
|
290
|
-
* // 原生 OKB 直接归集
|
|
291
|
-
* const result = await sweep({
|
|
292
|
-
* targetAddress: '0xTARGET',
|
|
293
|
-
* sourcePrivateKeys: ['0x...', '0x...'],
|
|
294
|
-
* });
|
|
295
|
-
*
|
|
296
|
-
* @example
|
|
297
|
-
* // 原生 OKB 多跳归集
|
|
298
|
-
* const result = await sweep({
|
|
299
|
-
* targetAddress: '0xTARGET',
|
|
300
|
-
* sourcePrivateKeys: ['0x...', '0x...'],
|
|
301
|
-
* hopCount: 2,
|
|
302
|
-
* });
|
|
303
|
-
*
|
|
304
|
-
* @example
|
|
305
|
-
* // ERC20 代币归集
|
|
306
|
-
* const result = await sweep({
|
|
307
|
-
* targetAddress: '0xTARGET',
|
|
308
|
-
* sourcePrivateKeys: ['0x...', '0x...'],
|
|
309
|
-
* tokenAddress: '0xTOKEN...',
|
|
310
|
-
* tokenDecimals: 18,
|
|
311
|
-
* hopCount: 2,
|
|
312
|
-
* });
|
|
313
|
-
*/
|
|
197
|
+
// ========================================
|
|
198
|
+
// 归集 (Sweep) - 多对一
|
|
199
|
+
// ========================================
|
|
314
200
|
export async function sweep(params) {
|
|
315
201
|
const { targetAddress, sourcePrivateKeys, payerPrivateKey, tokenAddress, tokenDecimals = 18, hopCount = 0, reserveGas = true, percent = 100, userType, config, } = params;
|
|
316
|
-
const provider =
|
|
317
|
-
const
|
|
318
|
-
const
|
|
319
|
-
const
|
|
320
|
-
const
|
|
321
|
-
const profitRecipient = getProfitRecipient(config);
|
|
322
|
-
// ✅ 为每个源钱包生成独立的中间钱包链
|
|
323
|
-
const allHopWalletInfos = [];
|
|
324
|
-
const allHopWallets = [];
|
|
325
|
-
for (let i = 0; i < sourceWallets.length; i++) {
|
|
326
|
-
if (hopCount > 0) {
|
|
327
|
-
const hopInfos = generateRandomWallets(hopCount);
|
|
328
|
-
allHopWalletInfos.push(hopInfos);
|
|
329
|
-
allHopWallets.push(hopInfos.map(info => createWallet(info.privateKey, provider)));
|
|
330
|
-
}
|
|
331
|
-
else {
|
|
332
|
-
allHopWalletInfos.push([]);
|
|
333
|
-
allHopWallets.push([]);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
// ✅ 支持单独的 Payer 钱包(用于支付 gas)
|
|
337
|
-
const hasSeparatePayer = payerPrivateKey && !sourcePrivateKeys.includes(payerPrivateKey);
|
|
338
|
-
const payerWallet = hasSeparatePayer ? createWallet(payerPrivateKey, provider) : null;
|
|
202
|
+
const { provider, delegateAddress, delegateInterface, profitRecipient } = createEip7702DelegateContext(config);
|
|
203
|
+
const sourceWallets = sourcePrivateKeys.map((pk) => createWallet(pk, provider));
|
|
204
|
+
const isNative = isNativeTransferToken(tokenAddress);
|
|
205
|
+
const { allHopWalletInfos, allHopWallets } = generateHopWalletMatrix(sourceWallets.length, hopCount, provider);
|
|
206
|
+
const { payerWallet } = resolveListPayerWallet(sourcePrivateKeys, payerPrivateKey, provider);
|
|
339
207
|
const mainWallet = payerWallet ?? sourceWallets[0];
|
|
340
208
|
// ========================================
|
|
341
209
|
// 并行获取数据
|
|
342
210
|
// ========================================
|
|
343
|
-
const sourceAddresses = sourceWallets.map(w => w.address);
|
|
344
|
-
const addressesToGetNonces = payerWallet
|
|
345
|
-
|
|
346
|
-
: sourceAddresses;
|
|
347
|
-
const parallelPromises = [
|
|
348
|
-
batchGetNonces(addressesToGetNonces, provider),
|
|
349
|
-
provider.getFeeData(),
|
|
350
|
-
];
|
|
211
|
+
const sourceAddresses = sourceWallets.map((w) => w.address);
|
|
212
|
+
const addressesToGetNonces = payerWallet ? [payerWallet.address, ...sourceAddresses] : sourceAddresses;
|
|
213
|
+
const parallelPromises = [batchGetNonces(addressesToGetNonces, provider), provider.getFeeData()];
|
|
351
214
|
if (isNative) {
|
|
352
|
-
parallelPromises.push(Promise.all(sourceWallets.map(w => provider.getBalance(w.address))));
|
|
215
|
+
parallelPromises.push(Promise.all(sourceWallets.map((w) => provider.getBalance(w.address))));
|
|
353
216
|
}
|
|
354
217
|
else {
|
|
218
|
+
if (!tokenAddress)
|
|
219
|
+
throw new Error('tokenAddress is required for ERC20 sweep');
|
|
355
220
|
const tokenContract = new Contract(tokenAddress, ERC20_ABI, provider);
|
|
356
|
-
parallelPromises.push(Promise.all(sourceWallets.map(w => tokenContract.balanceOf(w.address))));
|
|
221
|
+
parallelPromises.push(Promise.all(sourceWallets.map((w) => tokenContract.balanceOf(w.address))));
|
|
357
222
|
}
|
|
358
223
|
const results = await Promise.all(parallelPromises);
|
|
359
224
|
const allNoncesResult = results[0];
|
|
360
225
|
const payerNonce = payerWallet ? allNoncesResult[0] : allNoncesResult[0];
|
|
361
226
|
const nonces = payerWallet ? allNoncesResult.slice(1) : allNoncesResult;
|
|
362
227
|
const feeData = results[1];
|
|
363
|
-
const balances = results[2].map(b => typeof b === 'bigint' ? b : BigInt(b.toString()));
|
|
228
|
+
const balances = results[2].map((b) => typeof b === 'bigint' ? b : BigInt(b.toString()));
|
|
364
229
|
// 计算转账金额
|
|
365
230
|
// ✅ 修复:当 percent=100 时,不预留 gas,归集全部余额
|
|
366
231
|
const isFullSweep = percent >= 100;
|
|
367
|
-
const gasReserve =
|
|
232
|
+
const gasReserve = reserveGas && isNative && !isFullSweep ? ethers.parseEther('0.001') : 0n;
|
|
368
233
|
const percentBigInt = BigInt(Math.min(100, Math.max(1, percent)));
|
|
369
|
-
const transferAmounts = balances.map(b => {
|
|
234
|
+
const transferAmounts = balances.map((b) => {
|
|
370
235
|
if (isFullSweep) {
|
|
371
236
|
// 100% 归集:使用全部余额
|
|
372
237
|
return b;
|
|
@@ -397,7 +262,7 @@ export async function sweep(params) {
|
|
|
397
262
|
if (amount <= 0n)
|
|
398
263
|
continue;
|
|
399
264
|
// ✅ 使用 Payer 时所有源钱包都用自己的余额(value: 0n)
|
|
400
|
-
const callValue =
|
|
265
|
+
const callValue = payerWallet || i > 0 ? 0n : amount;
|
|
401
266
|
if (hopCount === 0 || hopWallets.length === 0) {
|
|
402
267
|
// ========================================
|
|
403
268
|
// 直接归集:源钱包 → 目标地址
|
|
@@ -426,11 +291,7 @@ export async function sweep(params) {
|
|
|
426
291
|
target: sourceWallet.address,
|
|
427
292
|
allowFailure: false,
|
|
428
293
|
value: 0n,
|
|
429
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
430
|
-
tokenAddress,
|
|
431
|
-
targetAddress,
|
|
432
|
-
amount,
|
|
433
|
-
]),
|
|
294
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [tokenAddress, targetAddress, amount]),
|
|
434
295
|
});
|
|
435
296
|
}
|
|
436
297
|
}
|
|
@@ -482,11 +343,7 @@ export async function sweep(params) {
|
|
|
482
343
|
target: sourceWallet.address,
|
|
483
344
|
allowFailure: false,
|
|
484
345
|
value: 0n,
|
|
485
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
486
|
-
tokenAddress,
|
|
487
|
-
firstHop.address,
|
|
488
|
-
amount,
|
|
489
|
-
]),
|
|
346
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [tokenAddress, firstHop.address, amount]),
|
|
490
347
|
});
|
|
491
348
|
// 中间钱包之间转账
|
|
492
349
|
for (let j = 0; j < hopWallets.length - 1; j++) {
|
|
@@ -505,10 +362,7 @@ export async function sweep(params) {
|
|
|
505
362
|
target: lastHop.address,
|
|
506
363
|
allowFailure: false,
|
|
507
364
|
value: 0n,
|
|
508
|
-
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
509
|
-
tokenAddress,
|
|
510
|
-
targetAddress,
|
|
511
|
-
]),
|
|
365
|
+
callData: delegateInterface.encodeFunctionData('executeTransferAll', [tokenAddress, targetAddress]),
|
|
512
366
|
});
|
|
513
367
|
}
|
|
514
368
|
}
|
|
@@ -531,13 +385,12 @@ export async function sweep(params) {
|
|
|
531
385
|
allNonces.push(0);
|
|
532
386
|
}
|
|
533
387
|
}
|
|
534
|
-
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0
|
|
535
|
-
);
|
|
388
|
+
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0);
|
|
536
389
|
// ========================================
|
|
537
390
|
// 同步构建交易
|
|
538
391
|
// ========================================
|
|
539
392
|
// ✅ Payer 模式下 value 为 0(资金来自源钱包)
|
|
540
|
-
const totalValue =
|
|
393
|
+
const totalValue = isNative && !payerWallet ? transferAmounts[0] : 0n;
|
|
541
394
|
const signedTransaction = buildEIP7702TransactionSync(mainWallet, authorizations, calls, totalValue, payerWallet ? payerNonce : nonces[0], feeData, config);
|
|
542
395
|
// ✅ 返回所有中间钱包(扁平化)
|
|
543
396
|
const flatHopWallets = allHopWalletInfos.flat();
|
|
@@ -557,41 +410,9 @@ export async function sweep(params) {
|
|
|
557
410
|
},
|
|
558
411
|
};
|
|
559
412
|
}
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
* 支持:原生 OKB / ERC20 代币 + 可选多跳
|
|
564
|
-
*
|
|
565
|
-
* 每对都有独立的多跳链:sender → hop1 → hop2 → ... → receiver
|
|
566
|
-
*
|
|
567
|
-
* @example
|
|
568
|
-
* // 原生 OKB 多对多(直接转账)
|
|
569
|
-
* const result = await pairwiseTransfer({
|
|
570
|
-
* senderPrivateKeys: ['0xA...', '0xB...', '0xC...'],
|
|
571
|
-
* receiverAddresses: ['0x111', '0x222', '0x333'],
|
|
572
|
-
* amount: '0.1',
|
|
573
|
-
* });
|
|
574
|
-
*
|
|
575
|
-
* @example
|
|
576
|
-
* // 原生 OKB 多对多(带多跳)
|
|
577
|
-
* const result = await pairwiseTransfer({
|
|
578
|
-
* senderPrivateKeys: ['0xA...', '0xB...'],
|
|
579
|
-
* receiverAddresses: ['0x111', '0x222'],
|
|
580
|
-
* amounts: ['0.1', '0.2'],
|
|
581
|
-
* hopCount: 2, // A → hop1 → hop2 → 111, B → hop3 → hop4 → 222
|
|
582
|
-
* });
|
|
583
|
-
*
|
|
584
|
-
* @example
|
|
585
|
-
* // ERC20 多对多(带多跳)
|
|
586
|
-
* const result = await pairwiseTransfer({
|
|
587
|
-
* senderPrivateKeys: ['0xA...', '0xB...'],
|
|
588
|
-
* receiverAddresses: ['0x111', '0x222'],
|
|
589
|
-
* amount: '100',
|
|
590
|
-
* tokenAddress: '0xTOKEN...',
|
|
591
|
-
* tokenDecimals: 18,
|
|
592
|
-
* hopCount: 2,
|
|
593
|
-
* });
|
|
594
|
-
*/
|
|
413
|
+
// ========================================
|
|
414
|
+
// 多对多 (Pairwise) - sender[i] → receiver[i]
|
|
415
|
+
// ========================================
|
|
595
416
|
export async function pairwiseTransfer(params) {
|
|
596
417
|
const { senderPrivateKeys, receiverAddresses, payerPrivateKey, amount, amounts, tokenAddress, tokenDecimals = 18, hopCount = 0, userType, config, } = params;
|
|
597
418
|
// 验证参数
|
|
@@ -602,46 +423,14 @@ export async function pairwiseTransfer(params) {
|
|
|
602
423
|
if (pairCount === 0) {
|
|
603
424
|
throw new Error('至少需要一对发送者/接收者');
|
|
604
425
|
}
|
|
605
|
-
|
|
606
|
-
const
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
}
|
|
611
|
-
return amounts;
|
|
612
|
-
}
|
|
613
|
-
if (amount !== undefined && amount.trim().length > 0) {
|
|
614
|
-
return new Array(pairCount).fill(amount);
|
|
615
|
-
}
|
|
616
|
-
throw new Error('必须提供 amount 或 amounts');
|
|
617
|
-
})();
|
|
618
|
-
const provider = getCachedProvider(config?.rpcUrl);
|
|
619
|
-
const delegateAddress = (config?.delegateAddress && config.delegateAddress.trim()) || UNIFIED_DELEGATE_ADDRESS;
|
|
620
|
-
const delegateInterface = new ethers.Interface(UNIFIED_DELEGATE_ABI);
|
|
621
|
-
const isNative = !tokenAddress;
|
|
622
|
-
const profitRecipient = getProfitRecipient(config);
|
|
623
|
-
// 创建钱包
|
|
624
|
-
const senderWallets = senderPrivateKeys.map(pk => createWallet(pk, provider));
|
|
625
|
-
// ✅ 支持单独的 Payer 钱包(用于支付 gas)
|
|
626
|
-
const hasSeparatePayer = payerPrivateKey && !senderPrivateKeys.includes(payerPrivateKey);
|
|
627
|
-
const payerWallet = hasSeparatePayer ? createWallet(payerPrivateKey, provider) : null;
|
|
426
|
+
const normalizedAmounts = normalizePairwiseAmounts(pairCount, amount, amounts);
|
|
427
|
+
const { provider, delegateAddress, delegateInterface, profitRecipient } = createEip7702DelegateContext(config);
|
|
428
|
+
const isNative = isNativeTransferToken(tokenAddress);
|
|
429
|
+
const senderWallets = senderPrivateKeys.map((pk) => createWallet(pk, provider));
|
|
430
|
+
const { payerWallet } = resolveListPayerWallet(senderPrivateKeys, payerPrivateKey, provider);
|
|
628
431
|
const mainWallet = payerWallet ?? senderWallets[0];
|
|
629
|
-
|
|
630
|
-
const
|
|
631
|
-
const allHopWallets = [];
|
|
632
|
-
for (let i = 0; i < pairCount; i++) {
|
|
633
|
-
if (hopCount > 0) {
|
|
634
|
-
const hopInfos = generateRandomWallets(hopCount);
|
|
635
|
-
allHopWalletInfos.push(hopInfos);
|
|
636
|
-
allHopWallets.push(hopInfos.map(info => createWallet(info.privateKey, provider)));
|
|
637
|
-
}
|
|
638
|
-
else {
|
|
639
|
-
allHopWalletInfos.push([]);
|
|
640
|
-
allHopWallets.push([]);
|
|
641
|
-
}
|
|
642
|
-
}
|
|
643
|
-
// 解析金额为 Wei
|
|
644
|
-
const amountsWei = normalizedAmounts.map(amt => isNative ? ethers.parseEther(amt) : ethers.parseUnits(amt, tokenDecimals));
|
|
432
|
+
const { allHopWalletInfos, allHopWallets } = generateHopWalletMatrix(pairCount, hopCount, provider);
|
|
433
|
+
const amountsWei = parseTransferAmountsWei(normalizedAmounts, isNative, tokenDecimals);
|
|
645
434
|
const totalAmount = amountsWei.reduce((sum, amt) => sum + amt, 0n);
|
|
646
435
|
// ✅ 按地址数量收取固定费用(原生 OKB)
|
|
647
436
|
const profitAmountOkb = calculateTransferFee(XLAYER_CHAIN_ID, pairCount);
|
|
@@ -650,10 +439,8 @@ export async function pairwiseTransfer(params) {
|
|
|
650
439
|
// ========================================
|
|
651
440
|
// 并行获取数据
|
|
652
441
|
// ========================================
|
|
653
|
-
const senderAddresses = senderWallets.map(w => w.address);
|
|
654
|
-
const addressesToGetNonces = payerWallet
|
|
655
|
-
? [payerWallet.address, ...senderAddresses]
|
|
656
|
-
: senderAddresses;
|
|
442
|
+
const senderAddresses = senderWallets.map((w) => w.address);
|
|
443
|
+
const addressesToGetNonces = payerWallet ? [payerWallet.address, ...senderAddresses] : senderAddresses;
|
|
657
444
|
const [allNoncesResult, feeData] = await Promise.all([
|
|
658
445
|
batchGetNonces(addressesToGetNonces, provider),
|
|
659
446
|
provider.getFeeData(),
|
|
@@ -687,7 +474,6 @@ export async function pairwiseTransfer(params) {
|
|
|
687
474
|
});
|
|
688
475
|
}
|
|
689
476
|
if (isNative) {
|
|
690
|
-
// ✅ 使用 transferAmount 转移指定金额(而不是 transferTo 全额)
|
|
691
477
|
calls.push({
|
|
692
478
|
target: senderWallet.address,
|
|
693
479
|
allowFailure: false,
|
|
@@ -701,11 +487,7 @@ export async function pairwiseTransfer(params) {
|
|
|
701
487
|
target: senderWallet.address,
|
|
702
488
|
allowFailure: false,
|
|
703
489
|
value: 0n,
|
|
704
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
705
|
-
tokenAddress,
|
|
706
|
-
receiver,
|
|
707
|
-
amtWei,
|
|
708
|
-
]),
|
|
490
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [tokenAddress, receiver, amtWei]),
|
|
709
491
|
});
|
|
710
492
|
}
|
|
711
493
|
}
|
|
@@ -726,14 +508,12 @@ export async function pairwiseTransfer(params) {
|
|
|
726
508
|
}
|
|
727
509
|
if (isNative) {
|
|
728
510
|
// 原生 OKB 多跳
|
|
729
|
-
// ✅ sender → 第一个中间钱包(使用 transferAmount 转移指定金额)
|
|
730
511
|
calls.push({
|
|
731
512
|
target: senderWallet.address,
|
|
732
513
|
allowFailure: false,
|
|
733
514
|
value: shouldPassValue ? amtWei : 0n,
|
|
734
515
|
callData: delegateInterface.encodeFunctionData('transferAmount', [firstHop.address, amtWei]),
|
|
735
516
|
});
|
|
736
|
-
// 中间钱包之间转账(使用 transferTo,因为中间钱包只有这笔钱)
|
|
737
517
|
for (let j = 0; j < hopWallets.length - 1; j++) {
|
|
738
518
|
calls.push({
|
|
739
519
|
target: hopWallets[j].address,
|
|
@@ -742,7 +522,6 @@ export async function pairwiseTransfer(params) {
|
|
|
742
522
|
callData: delegateInterface.encodeFunctionData('transferTo', [hopWallets[j + 1].address]),
|
|
743
523
|
});
|
|
744
524
|
}
|
|
745
|
-
// 最后一个中间钱包 → receiver(使用 transferTo 转移全部)
|
|
746
525
|
calls.push({
|
|
747
526
|
target: lastHop.address,
|
|
748
527
|
allowFailure: false,
|
|
@@ -757,11 +536,7 @@ export async function pairwiseTransfer(params) {
|
|
|
757
536
|
target: senderWallet.address,
|
|
758
537
|
allowFailure: false,
|
|
759
538
|
value: 0n,
|
|
760
|
-
callData: delegateInterface.encodeFunctionData('executeTransfer', [
|
|
761
|
-
tokenAddress,
|
|
762
|
-
firstHop.address,
|
|
763
|
-
amtWei,
|
|
764
|
-
]),
|
|
539
|
+
callData: delegateInterface.encodeFunctionData('executeTransfer', [tokenAddress, firstHop.address, amtWei]),
|
|
765
540
|
});
|
|
766
541
|
// 中间钱包之间转账
|
|
767
542
|
for (let j = 0; j < hopWallets.length - 1; j++) {
|
|
@@ -780,10 +555,7 @@ export async function pairwiseTransfer(params) {
|
|
|
780
555
|
target: lastHop.address,
|
|
781
556
|
allowFailure: false,
|
|
782
557
|
value: 0n,
|
|
783
|
-
callData: delegateInterface.encodeFunctionData('executeTransferAll', [
|
|
784
|
-
tokenAddress,
|
|
785
|
-
receiver,
|
|
786
|
-
]),
|
|
558
|
+
callData: delegateInterface.encodeFunctionData('executeTransferAll', [tokenAddress, receiver]),
|
|
787
559
|
});
|
|
788
560
|
}
|
|
789
561
|
}
|
|
@@ -792,25 +564,20 @@ export async function pairwiseTransfer(params) {
|
|
|
792
564
|
// 同步签署授权(已有 nonce)
|
|
793
565
|
// ========================================
|
|
794
566
|
// ✅ 如果有单独的 Payer,需要为 Payer 也生成授权
|
|
795
|
-
const allWallets = payerWallet
|
|
796
|
-
|
|
797
|
-
: [...senderWallets];
|
|
798
|
-
const allNonces = payerWallet
|
|
799
|
-
? [payerNonce, ...nonces]
|
|
800
|
-
: [...nonces];
|
|
567
|
+
const allWallets = payerWallet ? [payerWallet, ...senderWallets] : [...senderWallets];
|
|
568
|
+
const allNonces = payerWallet ? [payerNonce, ...nonces] : [...nonces];
|
|
801
569
|
for (const hopWallets of allHopWallets) {
|
|
802
570
|
for (const hopWallet of hopWallets) {
|
|
803
571
|
allWallets.push(hopWallet);
|
|
804
572
|
allNonces.push(0);
|
|
805
573
|
}
|
|
806
574
|
}
|
|
807
|
-
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0
|
|
808
|
-
);
|
|
575
|
+
const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0);
|
|
809
576
|
// ========================================
|
|
810
577
|
// 同步构建交易
|
|
811
578
|
// ========================================
|
|
812
579
|
// ✅ Payer 模式下 value 为 0(资金来自发送者钱包)
|
|
813
|
-
const totalValue =
|
|
580
|
+
const totalValue = isNative && !payerWallet ? totalAmount : 0n;
|
|
814
581
|
const signedTransaction = buildEIP7702TransactionSync(mainWallet, authorizations, calls, totalValue, payerWallet ? payerNonce : nonces[0], feeData, config);
|
|
815
582
|
return {
|
|
816
583
|
signedTransaction,
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ethers, Wallet, type JsonRpcProvider } from 'ethers';
|
|
2
|
+
import type { GeneratedWallet, EIP7702Config } from './types.js';
|
|
3
|
+
export declare function createEip7702DelegateContext(config?: EIP7702Config): {
|
|
4
|
+
provider: ethers.JsonRpcProvider;
|
|
5
|
+
delegateAddress: string;
|
|
6
|
+
delegateInterface: ethers.Interface;
|
|
7
|
+
profitRecipient: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function isNativeTransferToken(tokenAddress?: string): boolean;
|
|
10
|
+
export declare function generateHopWalletMatrix(rowCount: number, hopCount: number, provider: JsonRpcProvider): {
|
|
11
|
+
allHopWalletInfos: GeneratedWallet[][];
|
|
12
|
+
allHopWallets: Wallet[][];
|
|
13
|
+
};
|
|
14
|
+
export declare function resolveDispersePayerWallets(mainPrivateKey: string, payerPrivateKey: string | undefined, provider: JsonRpcProvider): {
|
|
15
|
+
mainWallet: ethers.Wallet;
|
|
16
|
+
payerWallet: ethers.Wallet | null;
|
|
17
|
+
txSender: ethers.Wallet;
|
|
18
|
+
hasSeparatePayer: boolean;
|
|
19
|
+
};
|
|
20
|
+
export declare function resolveListPayerWallet(ownerPrivateKeys: string[], payerPrivateKey: string | undefined, provider: JsonRpcProvider, fallbackToFirst?: boolean): {
|
|
21
|
+
payerWallet: ethers.Wallet | null;
|
|
22
|
+
hasSeparatePayer: boolean;
|
|
23
|
+
mainWallet: ethers.Wallet | null;
|
|
24
|
+
};
|
|
25
|
+
export declare function parseTransferAmountsWei(amounts: string[], isNative: boolean, tokenDecimals: number): bigint[];
|
|
26
|
+
export declare function normalizePairwiseAmounts(pairCount: number, amount: string | undefined, amounts: string[] | undefined): string[];
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ethers } from 'ethers';
|
|
2
|
+
import { getCachedProvider, createWallet, generateRandomWallets, getProfitRecipient } from './utils.js';
|
|
3
|
+
import { UNIFIED_DELEGATE_ADDRESS, UNIFIED_DELEGATE_ABI } from './constants.js';
|
|
4
|
+
export function createEip7702DelegateContext(config) {
|
|
5
|
+
const provider = getCachedProvider(config?.rpcUrl);
|
|
6
|
+
const delegateAddress = (config?.delegateAddress && config.delegateAddress.trim()) || UNIFIED_DELEGATE_ADDRESS;
|
|
7
|
+
const delegateInterface = new ethers.Interface(UNIFIED_DELEGATE_ABI);
|
|
8
|
+
const profitRecipient = getProfitRecipient(config);
|
|
9
|
+
return { provider, delegateAddress, delegateInterface, profitRecipient };
|
|
10
|
+
}
|
|
11
|
+
export function isNativeTransferToken(tokenAddress) {
|
|
12
|
+
return !tokenAddress;
|
|
13
|
+
}
|
|
14
|
+
export function generateHopWalletMatrix(rowCount, hopCount, provider) {
|
|
15
|
+
const allHopWalletInfos = [];
|
|
16
|
+
const allHopWallets = [];
|
|
17
|
+
for (let i = 0; i < rowCount; i++) {
|
|
18
|
+
if (hopCount > 0) {
|
|
19
|
+
const hopInfos = generateRandomWallets(hopCount);
|
|
20
|
+
allHopWalletInfos.push(hopInfos);
|
|
21
|
+
allHopWallets.push(hopInfos.map((info) => createWallet(info.privateKey, provider)));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
allHopWalletInfos.push([]);
|
|
25
|
+
allHopWallets.push([]);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return { allHopWalletInfos, allHopWallets };
|
|
29
|
+
}
|
|
30
|
+
export function resolveDispersePayerWallets(mainPrivateKey, payerPrivateKey, provider) {
|
|
31
|
+
const mainWallet = createWallet(mainPrivateKey, provider);
|
|
32
|
+
const hasSeparatePayer = Boolean(payerPrivateKey && payerPrivateKey !== mainPrivateKey);
|
|
33
|
+
const payerWallet = hasSeparatePayer ? createWallet(payerPrivateKey, provider) : null;
|
|
34
|
+
const txSender = payerWallet ?? mainWallet;
|
|
35
|
+
return { mainWallet, payerWallet, txSender, hasSeparatePayer };
|
|
36
|
+
}
|
|
37
|
+
export function resolveListPayerWallet(ownerPrivateKeys, payerPrivateKey, provider, fallbackToFirst = true) {
|
|
38
|
+
const hasSeparatePayer = Boolean(payerPrivateKey && !ownerPrivateKeys.includes(payerPrivateKey));
|
|
39
|
+
const payerWallet = hasSeparatePayer ? createWallet(payerPrivateKey, provider) : null;
|
|
40
|
+
const mainWallet = payerWallet ?? (fallbackToFirst ? createWallet(ownerPrivateKeys[0], provider) : null);
|
|
41
|
+
return { payerWallet, hasSeparatePayer, mainWallet };
|
|
42
|
+
}
|
|
43
|
+
export function parseTransferAmountsWei(amounts, isNative, tokenDecimals) {
|
|
44
|
+
return amounts.map((amt) => (isNative ? ethers.parseEther(amt) : ethers.parseUnits(amt, tokenDecimals)));
|
|
45
|
+
}
|
|
46
|
+
export function normalizePairwiseAmounts(pairCount, amount, amounts) {
|
|
47
|
+
if (amounts && amounts.length > 0) {
|
|
48
|
+
if (amounts.length !== pairCount) {
|
|
49
|
+
throw new Error(`amounts 长度 (${amounts.length}) 必须与对数 (${pairCount}) 相同`);
|
|
50
|
+
}
|
|
51
|
+
return amounts;
|
|
52
|
+
}
|
|
53
|
+
if (amount !== undefined && amount.trim().length > 0) {
|
|
54
|
+
return new Array(pairCount).fill(amount);
|
|
55
|
+
}
|
|
56
|
+
throw new Error('必须提供 amount 或 amounts');
|
|
57
|
+
}
|