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