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,233 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* 专门为 XLayer 链设计,不影响 BSC 链的逻辑
|
|
5
|
-
* - 使用 PotatoSwap V3 Quoter
|
|
6
|
-
* - 使用 WOKB 作为 Wrapped Native Token
|
|
7
|
-
* - 支持多跳转账和利润刮取
|
|
2
|
+
* eoa-bundle-swap - 主函数
|
|
8
3
|
*/
|
|
9
4
|
import { ethers, Contract, Wallet } from 'ethers';
|
|
10
5
|
import { calculateSellAmount } from '../../../utils/swap-helpers.js';
|
|
11
|
-
import { NonceManager, getDeadline, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
|
|
12
|
-
import {
|
|
13
|
-
import { GAS_LIMITS
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { generateWallets } from '../../../utils/wallet.js';
|
|
17
|
-
// ✅ 从 XLayer 常量导入正确的路由地址
|
|
18
|
-
import { POTATOSWAP_V2_ROUTER, POTATOSWAP_SWAP_ROUTER02, WOKB as WOKB_CONST } from './constants.js';
|
|
19
|
-
// ==================== XLayer 专用常量 ====================
|
|
20
|
-
const XLAYER_CHAIN_ID = CHAINS.XLAYER.chainId;
|
|
21
|
-
const XLAYER_CHAIN_NAME = CHAINS.XLAYER.name;
|
|
22
|
-
const WOKB_ADDRESS = ethers.getAddress(WOKB_CONST);
|
|
23
|
-
// ✅ 强制校验和,避免大小写错误导致的 bad address checksum
|
|
24
|
-
const POTATO_V2_ROUTER = ethers.getAddress(POTATOSWAP_V2_ROUTER);
|
|
25
|
-
const POTATO_V3_ROUTER = ethers.getAddress(POTATOSWAP_SWAP_ROUTER02); // ✅ SwapRouter02 用于 V3 交易
|
|
26
|
-
const NATIVE_TRANSFER_GAS_LIMIT = GAS_LIMITS.NATIVE_TRANSFER;
|
|
27
|
-
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
28
|
-
// ==================== 工具函数 ====================
|
|
29
|
-
function createXLayerContext(config) {
|
|
30
|
-
const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
|
|
31
|
-
chainId: XLAYER_CHAIN_ID,
|
|
32
|
-
name: 'XLayer'
|
|
33
|
-
});
|
|
34
|
-
return { chainId: XLAYER_CHAIN_ID, provider };
|
|
35
|
-
}
|
|
36
|
-
function getGasLimit(config, defaultGas = 800000) {
|
|
37
|
-
if (config.gasLimit !== undefined) {
|
|
38
|
-
return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
|
|
39
|
-
}
|
|
40
|
-
const multiplier = config.gasLimitMultiplier ?? 1.0;
|
|
41
|
-
return BigInt(Math.ceil(defaultGas * multiplier));
|
|
42
|
-
}
|
|
43
|
-
async function getGasPrice(provider, config) {
|
|
44
|
-
const feeData = await provider.getFeeData();
|
|
45
|
-
let gasPrice = feeData.gasPrice || ethers.parseUnits('0.1', 'gwei');
|
|
46
|
-
if (config.minGasPriceGwei) {
|
|
47
|
-
const minGas = ethers.parseUnits(config.minGasPriceGwei.toString(), 'gwei');
|
|
48
|
-
if (gasPrice < minGas)
|
|
49
|
-
gasPrice = minGas;
|
|
50
|
-
}
|
|
51
|
-
if (config.maxGasPriceGwei) {
|
|
52
|
-
const maxGas = ethers.parseUnits(config.maxGasPriceGwei.toString(), 'gwei');
|
|
53
|
-
if (gasPrice > maxGas)
|
|
54
|
-
gasPrice = maxGas;
|
|
55
|
-
}
|
|
56
|
-
return gasPrice;
|
|
57
|
-
}
|
|
58
|
-
function getProfitRateBps(userType) {
|
|
59
|
-
if (userType === 'v0')
|
|
60
|
-
return PROFIT_CONFIG.RATE_BPS_V0;
|
|
61
|
-
if (userType === 'v1')
|
|
62
|
-
return PROFIT_CONFIG.RATE_BPS_V1;
|
|
63
|
-
return PROFIT_CONFIG.RATE_BPS_V0;
|
|
64
|
-
}
|
|
65
|
-
function calculateProfitAmount(estimatedOutput, userType) {
|
|
66
|
-
if (estimatedOutput <= 0n)
|
|
67
|
-
return 0n;
|
|
68
|
-
const rateBps = getProfitRateBps(userType);
|
|
69
|
-
return (estimatedOutput * BigInt(rateBps)) / 10000n;
|
|
70
|
-
}
|
|
71
|
-
// ==================== 报价函数 ====================
|
|
72
|
-
async function quoteSellOutput(provider, routeParams, sellAmountWei) {
|
|
73
|
-
if (routeParams.routeType === 'v2') {
|
|
74
|
-
const { v2Path } = routeParams;
|
|
75
|
-
const tokenIn = v2Path[0];
|
|
76
|
-
const tokenOut = v2Path[v2Path.length - 1];
|
|
77
|
-
const result = await quoteV2(provider, tokenIn, tokenOut, sellAmountWei, XLAYER_CHAIN_NAME);
|
|
78
|
-
if (result.amountOut > 0n) {
|
|
79
|
-
return result.amountOut;
|
|
80
|
-
}
|
|
81
|
-
throw new Error('V2 报价失败');
|
|
82
|
-
}
|
|
83
|
-
if (routeParams.routeType === 'v3-single') {
|
|
84
|
-
const params = routeParams;
|
|
85
|
-
const result = await quoteV3(provider, params.v3TokenIn, params.v3TokenOut, sellAmountWei, XLAYER_CHAIN_NAME, params.v3Fee);
|
|
86
|
-
if (result.amountOut > 0n) {
|
|
87
|
-
return result.amountOut;
|
|
88
|
-
}
|
|
89
|
-
// ❗️兜底:如果 V3 报价失败且提供了 v2Path,则尝试 V2 报价(避免因为无对应费率池导致失败)
|
|
90
|
-
if (params.v2Path && params.v2Path.length >= 2) {
|
|
91
|
-
const tokenIn = params.v2Path[0];
|
|
92
|
-
const tokenOut = params.v2Path[params.v2Path.length - 1];
|
|
93
|
-
const v2Result = await quoteV2(provider, tokenIn, tokenOut, sellAmountWei, XLAYER_CHAIN_NAME);
|
|
94
|
-
if (v2Result.amountOut > 0n) {
|
|
95
|
-
return v2Result.amountOut;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
throw new Error(`V3 单跳报价失败: tokenIn=${params.v3TokenIn}, tokenOut=${params.v3TokenOut}, fee=${params.v3Fee}`);
|
|
99
|
-
}
|
|
100
|
-
if (routeParams.routeType === 'v3-multi') {
|
|
101
|
-
const params = routeParams;
|
|
102
|
-
const tokenIn = params.v3ExactTokenIn;
|
|
103
|
-
const result = await quoteV3(provider, tokenIn, WOKB_ADDRESS, sellAmountWei, XLAYER_CHAIN_NAME);
|
|
104
|
-
if (result.amountOut > 0n) {
|
|
105
|
-
return result.amountOut;
|
|
106
|
-
}
|
|
107
|
-
// ❗️兜底:如果 V3 多跳失败且提供 v2Path,则尝试 V2 报价
|
|
108
|
-
if (params.v2Path && params.v2Path.length >= 2) {
|
|
109
|
-
const tokenInV2 = params.v2Path[0];
|
|
110
|
-
const tokenOutV2 = params.v2Path[params.v2Path.length - 1];
|
|
111
|
-
const v2Result = await quoteV2(provider, tokenInV2, tokenOutV2, sellAmountWei, XLAYER_CHAIN_NAME);
|
|
112
|
-
if (v2Result.amountOut > 0n) {
|
|
113
|
-
return v2Result.amountOut;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
throw new Error(`V3 多跳报价失败`);
|
|
117
|
-
}
|
|
118
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
119
|
-
throw new Error(`不支持的路由类型: ${routeParams.routeType}`);
|
|
120
|
-
}
|
|
121
|
-
async function getERC20ToOkbQuote(provider, tokenAddress, tokenAmount, version = 'v2', fee) {
|
|
122
|
-
if (tokenAmount <= 0n)
|
|
123
|
-
return 0n;
|
|
124
|
-
const tokenLower = tokenAddress.toLowerCase();
|
|
125
|
-
const wokbLower = WOKB_ADDRESS.toLowerCase();
|
|
126
|
-
if (tokenLower === wokbLower)
|
|
127
|
-
return tokenAmount;
|
|
128
|
-
if (version === 'v3') {
|
|
129
|
-
const result = await quoteV3(provider, tokenAddress, WOKB_ADDRESS, tokenAmount, XLAYER_CHAIN_NAME, fee);
|
|
130
|
-
if (result.amountOut > 0n) {
|
|
131
|
-
return result.amountOut;
|
|
132
|
-
}
|
|
133
|
-
return 0n;
|
|
134
|
-
}
|
|
135
|
-
const result = await quoteV2(provider, tokenAddress, WOKB_ADDRESS, tokenAmount, XLAYER_CHAIN_NAME);
|
|
136
|
-
if (result.amountOut > 0n) {
|
|
137
|
-
return result.amountOut;
|
|
138
|
-
}
|
|
139
|
-
return 0n;
|
|
140
|
-
}
|
|
141
|
-
function generateDisperseHopPaths(targetAddresses, hopCount, provider) {
|
|
142
|
-
if (hopCount <= 0) {
|
|
143
|
-
return targetAddresses.map(addr => ({
|
|
144
|
-
targetAddress: addr,
|
|
145
|
-
hopWallets: [],
|
|
146
|
-
hopWalletsInfo: []
|
|
147
|
-
}));
|
|
148
|
-
}
|
|
149
|
-
return targetAddresses.map(targetAddress => {
|
|
150
|
-
const hopWalletsInfo = generateWallets(hopCount);
|
|
151
|
-
const hopWallets = hopWalletsInfo.map(w => new Wallet(w.privateKey, provider));
|
|
152
|
-
return { targetAddress, hopWallets, hopWalletsInfo };
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
async function buildNativeHopChain(payer, path, finalAmount, gasPrice, txType, payerNonce) {
|
|
156
|
-
const signedTxs = [];
|
|
157
|
-
const hopCount = path.hopWallets.length;
|
|
158
|
-
if (hopCount === 0) {
|
|
159
|
-
const tx = {
|
|
160
|
-
to: path.targetAddress,
|
|
161
|
-
value: finalAmount,
|
|
162
|
-
nonce: payerNonce,
|
|
163
|
-
gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
|
|
164
|
-
chainId: XLAYER_CHAIN_ID,
|
|
165
|
-
type: txType
|
|
166
|
-
};
|
|
167
|
-
if (txType === 2) {
|
|
168
|
-
tx.maxFeePerGas = gasPrice;
|
|
169
|
-
tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
tx.gasPrice = gasPrice;
|
|
173
|
-
}
|
|
174
|
-
signedTxs.push(await payer.signTransaction(tx));
|
|
175
|
-
return signedTxs;
|
|
176
|
-
}
|
|
177
|
-
const hopGasCost = NATIVE_TRANSFER_GAS_LIMIT * gasPrice;
|
|
178
|
-
const amountsPerHop = [];
|
|
179
|
-
for (let i = 0; i < hopCount; i++) {
|
|
180
|
-
const remainingHops = hopCount - i;
|
|
181
|
-
amountsPerHop.push(finalAmount + hopGasCost * BigInt(remainingHops));
|
|
182
|
-
}
|
|
183
|
-
// payer → hop1
|
|
184
|
-
const firstTx = {
|
|
185
|
-
to: path.hopWallets[0].address,
|
|
186
|
-
value: amountsPerHop[0],
|
|
187
|
-
nonce: payerNonce,
|
|
188
|
-
gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
|
|
189
|
-
chainId: XLAYER_CHAIN_ID,
|
|
190
|
-
type: txType
|
|
191
|
-
};
|
|
192
|
-
if (txType === 2) {
|
|
193
|
-
firstTx.maxFeePerGas = gasPrice;
|
|
194
|
-
firstTx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
firstTx.gasPrice = gasPrice;
|
|
198
|
-
}
|
|
199
|
-
signedTxs.push(await payer.signTransaction(firstTx));
|
|
200
|
-
// hop1 → hop2 → ... → target
|
|
201
|
-
for (let i = 0; i < hopCount; i++) {
|
|
202
|
-
const fromWallet = path.hopWallets[i];
|
|
203
|
-
const toAddress = i === hopCount - 1 ? path.targetAddress : path.hopWallets[i + 1].address;
|
|
204
|
-
const amount = i === hopCount - 1 ? finalAmount : amountsPerHop[i + 1];
|
|
205
|
-
const tx = {
|
|
206
|
-
to: toAddress,
|
|
207
|
-
value: amount,
|
|
208
|
-
nonce: 0,
|
|
209
|
-
gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
|
|
210
|
-
chainId: XLAYER_CHAIN_ID,
|
|
211
|
-
type: txType
|
|
212
|
-
};
|
|
213
|
-
if (txType === 2) {
|
|
214
|
-
tx.maxFeePerGas = gasPrice;
|
|
215
|
-
tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
tx.gasPrice = gasPrice;
|
|
219
|
-
}
|
|
220
|
-
signedTxs.push(await fromWallet.signTransaction(tx));
|
|
221
|
-
}
|
|
222
|
-
return signedTxs;
|
|
223
|
-
}
|
|
224
|
-
// ==================== XLayer 快捷批量换手 ====================
|
|
6
|
+
import { NonceManager, getDeadline, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../../utils/bundle-helpers.js';
|
|
7
|
+
import { BLOCKRAZOR_BUILDER_EOA, getProfitRecipient } from '../../../shared/constants/index.js';
|
|
8
|
+
import { GAS_LIMITS } from '../../../shared/constants/index.js';
|
|
9
|
+
import { V2_ROUTER_ABI, V3_ROUTER02_ABI } from '../../../abis/common.js';
|
|
10
|
+
import { NATIVE_TRANSFER_GAS_LIMIT, POTATO_V2_ROUTER, POTATO_V3_ROUTER, WOKB_ADDRESS, XLAYER_CHAIN_ID, ZERO_ADDRESS, buildNativeHopChain, calculateProfitAmount, createXLayerContext, generateDisperseHopPaths, getERC20ToOkbQuote, getGasLimit, getGasPrice, quoteSellOutput, } from './eoa-bundle-swap-helpers.js';
|
|
225
11
|
export async function xlayerQuickBatchSwapMerkle(params) {
|
|
226
|
-
const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKeys, buyerRatios, buyerAmounts, tokenAddress, routeParams, config, quoteToken, quoteTokenDecimals = 18, disperseHopCount = 0, startNonces } = params;
|
|
12
|
+
const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKeys, buyerRatios, buyerAmounts, tokenAddress, routeParams, config, quoteToken, quoteTokenDecimals = 18, disperseHopCount = 0, startNonces, } = params;
|
|
227
13
|
const useNativeToken = !quoteToken || quoteToken === ZERO_ADDRESS;
|
|
228
14
|
const context = createXLayerContext(config);
|
|
229
15
|
const seller = new Wallet(sellerPrivateKey, context.provider);
|
|
230
|
-
const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, context.provider));
|
|
16
|
+
const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, context.provider));
|
|
231
17
|
// 校验卖出路径输出代币
|
|
232
18
|
let sellOutputToken;
|
|
233
19
|
if (routeParams.routeType === 'v2') {
|
|
@@ -256,7 +42,7 @@ export async function xlayerQuickBatchSwapMerkle(params) {
|
|
|
256
42
|
const txType = config.txType ?? 0;
|
|
257
43
|
const [gasPrice, sellAmountResult] = await Promise.all([
|
|
258
44
|
getGasPrice(context.provider, config),
|
|
259
|
-
calculateSellAmount(context.provider, tokenAddress, seller.address, sellAmount, sellPercentage)
|
|
45
|
+
calculateSellAmount(context.provider, tokenAddress, seller.address, sellAmount, sellPercentage),
|
|
260
46
|
]);
|
|
261
47
|
const { amount: sellAmountWei, decimals } = sellAmountResult;
|
|
262
48
|
// 获取卖出报价
|
|
@@ -276,22 +62,18 @@ export async function xlayerQuickBatchSwapMerkle(params) {
|
|
|
276
62
|
// 计算每个买方分到的金额
|
|
277
63
|
let transferAmountsWei;
|
|
278
64
|
if (buyerAmounts && buyerAmounts.length === buyers.length) {
|
|
279
|
-
transferAmountsWei = buyerAmounts.map(amt => useNativeToken ? ethers.parseEther(amt) : ethers.parseUnits(amt, quoteTokenDecimals));
|
|
65
|
+
transferAmountsWei = buyerAmounts.map((amt) => useNativeToken ? ethers.parseEther(amt) : ethers.parseUnits(amt, quoteTokenDecimals));
|
|
280
66
|
}
|
|
281
67
|
else if (buyerRatios && buyerRatios.length === buyers.length) {
|
|
282
|
-
transferAmountsWei = buyerRatios.map(ratio => (distributableAmount * BigInt(Math.round(ratio * 10000))) / 10000n);
|
|
68
|
+
transferAmountsWei = buyerRatios.map((ratio) => (distributableAmount * BigInt(Math.round(ratio * 10000))) / 10000n);
|
|
283
69
|
}
|
|
284
70
|
else {
|
|
285
71
|
throw new Error('必须提供 buyerRatios 或 buyerAmounts');
|
|
286
72
|
}
|
|
287
73
|
// 获取贿赂金额
|
|
288
|
-
const bribeAmount = config.bribeAmount && config.bribeAmount > 0
|
|
289
|
-
? ethers.parseEther(String(config.bribeAmount))
|
|
290
|
-
: 0n;
|
|
74
|
+
const bribeAmount = config.bribeAmount && config.bribeAmount > 0 ? ethers.parseEther(String(config.bribeAmount)) : 0n;
|
|
291
75
|
// 规划 Nonce
|
|
292
|
-
let sellerNonce = startNonces && startNonces.length > 0
|
|
293
|
-
? startNonces[0]
|
|
294
|
-
: await nonceManager.getNextNonce(seller);
|
|
76
|
+
let sellerNonce = startNonces && startNonces.length > 0 ? startNonces[0] : await nonceManager.getNextNonce(seller);
|
|
295
77
|
const deadline = getDeadline();
|
|
296
78
|
// 1. 贿赂交易
|
|
297
79
|
let bribeTx = null;
|
|
@@ -303,7 +85,7 @@ export async function xlayerQuickBatchSwapMerkle(params) {
|
|
|
303
85
|
gasPrice,
|
|
304
86
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
305
87
|
chainId: XLAYER_CHAIN_ID,
|
|
306
|
-
type: txType
|
|
88
|
+
type: txType,
|
|
307
89
|
});
|
|
308
90
|
}
|
|
309
91
|
// 2. 卖出交易
|
|
@@ -322,15 +104,17 @@ export async function xlayerQuickBatchSwapMerkle(params) {
|
|
|
322
104
|
else if (routeParams.routeType === 'v3-single') {
|
|
323
105
|
const { v3TokenIn, v3TokenOut, v3Fee } = routeParams;
|
|
324
106
|
const v3RouterSeller = new Contract(POTATO_V3_ROUTER, V3_ROUTER02_ABI, seller);
|
|
325
|
-
const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
107
|
+
const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
108
|
+
{
|
|
326
109
|
tokenIn: v3TokenIn,
|
|
327
110
|
tokenOut: v3TokenOut,
|
|
328
111
|
fee: v3Fee,
|
|
329
112
|
recipient: useNativeToken ? POTATO_V3_ROUTER : seller.address,
|
|
330
113
|
amountIn: sellAmountWei,
|
|
331
114
|
amountOutMinimum: 0n,
|
|
332
|
-
sqrtPriceLimitX96: 0n
|
|
333
|
-
}
|
|
115
|
+
sqrtPriceLimitX96: 0n,
|
|
116
|
+
},
|
|
117
|
+
]);
|
|
334
118
|
if (useNativeToken) {
|
|
335
119
|
const sellUnwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
|
|
336
120
|
sellUnsigned = await v3RouterSeller.multicall.populateTransaction(deadline, [sellSwapData, sellUnwrapData]);
|
|
@@ -349,13 +133,13 @@ export async function xlayerQuickBatchSwapMerkle(params) {
|
|
|
349
133
|
gasLimit: finalGasLimit,
|
|
350
134
|
gasPrice,
|
|
351
135
|
chainId: XLAYER_CHAIN_ID,
|
|
352
|
-
type: txType
|
|
136
|
+
type: txType,
|
|
353
137
|
});
|
|
354
138
|
// 3. 转账交易
|
|
355
139
|
const buyerGasCost = gasPrice * finalGasLimit;
|
|
356
|
-
const hopPaths = generateDisperseHopPaths(buyers.map(b => b.address), disperseHopCount, context.provider);
|
|
140
|
+
const hopPaths = generateDisperseHopPaths(buyers.map((b) => b.address), disperseHopCount, context.provider);
|
|
357
141
|
const allHopWallets = [];
|
|
358
|
-
hopPaths.forEach(path => allHopWallets.push(...path.hopWalletsInfo));
|
|
142
|
+
hopPaths.forEach((path) => allHopWallets.push(...path.hopWalletsInfo));
|
|
359
143
|
let transferTxs;
|
|
360
144
|
if (disperseHopCount === 0) {
|
|
361
145
|
const transferNonces = buyers.map((_, i) => sellerNonce + i);
|
|
@@ -369,7 +153,7 @@ export async function xlayerQuickBatchSwapMerkle(params) {
|
|
|
369
153
|
gasPrice,
|
|
370
154
|
gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
|
|
371
155
|
chainId: XLAYER_CHAIN_ID,
|
|
372
|
-
type: txType
|
|
156
|
+
type: txType,
|
|
373
157
|
});
|
|
374
158
|
}));
|
|
375
159
|
}
|
|
@@ -385,7 +169,7 @@ export async function xlayerQuickBatchSwapMerkle(params) {
|
|
|
385
169
|
// 4. 买入交易
|
|
386
170
|
const buyerNonces = startNonces && startNonces.length > 1
|
|
387
171
|
? startNonces.slice(1)
|
|
388
|
-
: await Promise.all(buyers.map(buyer => nonceManager.getNextNonce(buyer)));
|
|
172
|
+
: await Promise.all(buyers.map((buyer) => nonceManager.getNextNonce(buyer)));
|
|
389
173
|
const signedBuys = await Promise.all(buyers.map(async (buyer, i) => {
|
|
390
174
|
const buyAmount = transferAmountsWei[i];
|
|
391
175
|
const buyValue = useNativeToken ? buyAmount : 0n;
|
|
@@ -404,15 +188,17 @@ export async function xlayerQuickBatchSwapMerkle(params) {
|
|
|
404
188
|
else if (routeParams.routeType === 'v3-single') {
|
|
405
189
|
const { v3TokenIn, v3TokenOut, v3Fee } = routeParams;
|
|
406
190
|
const v3RouterBuyer = new Contract(POTATO_V3_ROUTER, V3_ROUTER02_ABI, buyer);
|
|
407
|
-
const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
191
|
+
const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
192
|
+
{
|
|
408
193
|
tokenIn: v3TokenOut,
|
|
409
194
|
tokenOut: v3TokenIn,
|
|
410
195
|
fee: v3Fee,
|
|
411
196
|
recipient: buyer.address,
|
|
412
197
|
amountIn: buyAmount,
|
|
413
198
|
amountOutMinimum: 0n,
|
|
414
|
-
sqrtPriceLimitX96: 0n
|
|
415
|
-
}
|
|
199
|
+
sqrtPriceLimitX96: 0n,
|
|
200
|
+
},
|
|
201
|
+
]);
|
|
416
202
|
buyUnsigned = await v3RouterBuyer.multicall.populateTransaction(deadline, [buySwapData], { value: buyValue });
|
|
417
203
|
}
|
|
418
204
|
else {
|
|
@@ -425,7 +211,7 @@ export async function xlayerQuickBatchSwapMerkle(params) {
|
|
|
425
211
|
gasLimit: finalGasLimit,
|
|
426
212
|
gasPrice,
|
|
427
213
|
chainId: XLAYER_CHAIN_ID,
|
|
428
|
-
type: txType
|
|
214
|
+
type: txType,
|
|
429
215
|
});
|
|
430
216
|
}));
|
|
431
217
|
nonceManager.clearTemp();
|
|
@@ -443,12 +229,12 @@ export async function xlayerQuickBatchSwapMerkle(params) {
|
|
|
443
229
|
provider: context.provider,
|
|
444
230
|
payerWallet: seller,
|
|
445
231
|
profitAmount,
|
|
446
|
-
profitRecipient:
|
|
232
|
+
profitRecipient: getProfitRecipient(),
|
|
447
233
|
hopCount: PROFIT_HOP_COUNT,
|
|
448
234
|
gasPrice,
|
|
449
235
|
chainId: XLAYER_CHAIN_ID,
|
|
450
236
|
txType,
|
|
451
|
-
startNonce: sellerNonce
|
|
237
|
+
startNonce: sellerNonce++,
|
|
452
238
|
});
|
|
453
239
|
signedTransactions.push(...profitHopResult.signedTransactions);
|
|
454
240
|
profitHopWallets = profitHopResult.hopWallets;
|
|
@@ -459,19 +245,19 @@ export async function xlayerQuickBatchSwapMerkle(params) {
|
|
|
459
245
|
profitHopWallets,
|
|
460
246
|
metadata: {
|
|
461
247
|
sellerAddress: seller.address,
|
|
462
|
-
buyerAddresses: buyers.map(b => b.address),
|
|
248
|
+
buyerAddresses: buyers.map((b) => b.address),
|
|
463
249
|
sellAmount: ethers.formatUnits(sellAmountWei, decimals),
|
|
464
250
|
estimatedOutput: ethers.formatEther(estimatedOutput),
|
|
465
|
-
transferAmounts: transferAmountsWei.map(amt => ethers.formatEther(amt)),
|
|
251
|
+
transferAmounts: transferAmountsWei.map((amt) => ethers.formatEther(amt)),
|
|
466
252
|
profitAmount: profitAmount > 0n ? ethers.formatEther(profitAmount) : undefined,
|
|
467
253
|
useNativeToken,
|
|
468
|
-
disperseHopCount: disperseHopCount > 0 ? disperseHopCount : undefined
|
|
469
|
-
}
|
|
254
|
+
disperseHopCount: disperseHopCount > 0 ? disperseHopCount : undefined,
|
|
255
|
+
},
|
|
470
256
|
};
|
|
471
257
|
}
|
|
472
258
|
// ==================== XLayer 交叉换手 ====================
|
|
473
259
|
export async function xlayerCrossSwapMerkle(params) {
|
|
474
|
-
const { sellerPrivateKeys, sellAmounts, buyerPrivateKeys, tokenAddress, routeParams, config, quoteToken, quoteTokenDecimals = 18, buyersPerSell, disperseHopCount = 0, startNonces: inputNonces } = params;
|
|
260
|
+
const { sellerPrivateKeys, sellAmounts, buyerPrivateKeys, tokenAddress, routeParams, config, quoteToken, quoteTokenDecimals = 18, buyersPerSell, disperseHopCount = 0, startNonces: inputNonces, } = params;
|
|
475
261
|
if (sellerPrivateKeys.length === 0)
|
|
476
262
|
throw new Error('至少需要一个卖方');
|
|
477
263
|
if (sellerPrivateKeys.length !== sellAmounts.length)
|
|
@@ -480,8 +266,8 @@ export async function xlayerCrossSwapMerkle(params) {
|
|
|
480
266
|
throw new Error('至少需要一个买方');
|
|
481
267
|
const context = createXLayerContext(config);
|
|
482
268
|
const nonceManager = new NonceManager(context.provider);
|
|
483
|
-
const allSellerWallets = sellerPrivateKeys.map(pk => new Wallet(pk, context.provider));
|
|
484
|
-
const allBuyerWallets = buyerPrivateKeys.map(pk => new Wallet(pk, context.provider));
|
|
269
|
+
const allSellerWallets = sellerPrivateKeys.map((pk) => new Wallet(pk, context.provider));
|
|
270
|
+
const allBuyerWallets = buyerPrivateKeys.map((pk) => new Wallet(pk, context.provider));
|
|
485
271
|
// ✅ 优先使用前端传入的 nonce,避免 nonce 不同步
|
|
486
272
|
const addressToNonce = new Map();
|
|
487
273
|
for (const wallet of allSellerWallets) {
|
|
@@ -512,9 +298,7 @@ export async function xlayerCrossSwapMerkle(params) {
|
|
|
512
298
|
const rounds = [];
|
|
513
299
|
let buyerCursor = 0;
|
|
514
300
|
const buyerBatchSize = Math.max(1, buyersPerSell ?? buyerPrivateKeys.length);
|
|
515
|
-
const bribeAmount = config.bribeAmount && config.bribeAmount > 0
|
|
516
|
-
? ethers.parseEther(String(config.bribeAmount))
|
|
517
|
-
: 0n;
|
|
301
|
+
const bribeAmount = config.bribeAmount && config.bribeAmount > 0 ? ethers.parseEther(String(config.bribeAmount)) : 0n;
|
|
518
302
|
const hasBribe = bribeAmount > 0n;
|
|
519
303
|
for (let i = 0; i < sellerPrivateKeys.length; i++) {
|
|
520
304
|
const sellerPk = sellerPrivateKeys[i];
|
|
@@ -529,7 +313,7 @@ export async function xlayerCrossSwapMerkle(params) {
|
|
|
529
313
|
buyerCursor++;
|
|
530
314
|
}
|
|
531
315
|
const sellerNonce = addressToNonce.get(sellerWallet.address);
|
|
532
|
-
const roundBuyerNonces = roundBuyerWallets.map(w => {
|
|
316
|
+
const roundBuyerNonces = roundBuyerWallets.map((w) => {
|
|
533
317
|
const nonce = addressToNonce.get(w.address);
|
|
534
318
|
addressToNonce.set(w.address, nonce + 1);
|
|
535
319
|
return nonce;
|
|
@@ -555,7 +339,7 @@ export async function xlayerCrossSwapMerkle(params) {
|
|
|
555
339
|
quoteToken,
|
|
556
340
|
quoteTokenDecimals,
|
|
557
341
|
disperseHopCount,
|
|
558
|
-
startNonces
|
|
342
|
+
startNonces,
|
|
559
343
|
});
|
|
560
344
|
addressToNonce.set(sellerWallet.address, sellerNonce + sellerNonceConsumed);
|
|
561
345
|
allSigned.push(...res.signedTransactions);
|
|
@@ -567,7 +351,7 @@ export async function xlayerCrossSwapMerkle(params) {
|
|
|
567
351
|
sellerAddress: res.metadata?.sellerAddress || '',
|
|
568
352
|
buyerAddresses: res.metadata?.buyerAddresses || [],
|
|
569
353
|
sellAmount,
|
|
570
|
-
bundleHash: undefined
|
|
354
|
+
bundleHash: undefined,
|
|
571
355
|
});
|
|
572
356
|
}
|
|
573
357
|
nonceManager.clearTemp();
|
|
@@ -575,7 +359,7 @@ export async function xlayerCrossSwapMerkle(params) {
|
|
|
575
359
|
signedTransactions: allSigned,
|
|
576
360
|
rounds,
|
|
577
361
|
disperseHopWallets: allDisperse.length > 0 ? allDisperse : undefined,
|
|
578
|
-
profitHopWallets: allProfit.length > 0 ? allProfit : undefined
|
|
362
|
+
profitHopWallets: allProfit.length > 0 ? allProfit : undefined,
|
|
579
363
|
};
|
|
580
364
|
}
|
|
581
365
|
/**
|
|
@@ -589,7 +373,7 @@ export async function xlayerCrossSwapMerkle(params) {
|
|
|
589
373
|
* 交易顺序:卖1 → 买1 → 卖2 → 买2 → ... (交替执行)
|
|
590
374
|
*/
|
|
591
375
|
export async function xlayerPureCrossSwapMerkle(params) {
|
|
592
|
-
const { sellerPrivateKeys, sellAmounts, buyerPrivateKeys, buyAmounts, tokenAddress, routeParams, config, quoteToken, startNonces: inputNonces } = params;
|
|
376
|
+
const { sellerPrivateKeys, sellAmounts, buyerPrivateKeys, buyAmounts, tokenAddress, routeParams, config, quoteToken, startNonces: inputNonces, } = params;
|
|
593
377
|
if (sellerPrivateKeys.length === 0)
|
|
594
378
|
throw new Error('至少需要一个卖方');
|
|
595
379
|
if (sellerPrivateKeys.length !== sellAmounts.length)
|
|
@@ -601,8 +385,8 @@ export async function xlayerPureCrossSwapMerkle(params) {
|
|
|
601
385
|
const context = createXLayerContext(config);
|
|
602
386
|
const nonceManager = new NonceManager(context.provider);
|
|
603
387
|
const useNativeToken = !quoteToken || quoteToken === ZERO_ADDRESS;
|
|
604
|
-
const sellers = sellerPrivateKeys.map(pk => new Wallet(pk, context.provider));
|
|
605
|
-
const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, context.provider));
|
|
388
|
+
const sellers = sellerPrivateKeys.map((pk) => new Wallet(pk, context.provider));
|
|
389
|
+
const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, context.provider));
|
|
606
390
|
// 获取 nonce
|
|
607
391
|
const addressToNonce = new Map();
|
|
608
392
|
for (const wallet of [...sellers, ...buyers]) {
|
|
@@ -618,7 +402,7 @@ export async function xlayerPureCrossSwapMerkle(params) {
|
|
|
618
402
|
}
|
|
619
403
|
const [gasPrice, finalGasLimit] = await Promise.all([
|
|
620
404
|
getGasPrice(context.provider, config),
|
|
621
|
-
Promise.resolve(getGasLimit(config))
|
|
405
|
+
Promise.resolve(getGasLimit(config)),
|
|
622
406
|
]);
|
|
623
407
|
const txType = config.txType ?? 0;
|
|
624
408
|
const deadline = getDeadline();
|
|
@@ -646,15 +430,17 @@ export async function xlayerPureCrossSwapMerkle(params) {
|
|
|
646
430
|
else if (routeParams.routeType === 'v3-single') {
|
|
647
431
|
const { v3TokenIn, v3TokenOut, v3Fee } = routeParams;
|
|
648
432
|
const v3Router = new Contract(POTATO_V3_ROUTER, V3_ROUTER02_ABI, seller);
|
|
649
|
-
const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
433
|
+
const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
434
|
+
{
|
|
650
435
|
tokenIn: v3TokenIn,
|
|
651
436
|
tokenOut: v3TokenOut,
|
|
652
437
|
fee: v3Fee,
|
|
653
438
|
recipient: useNativeToken ? POTATO_V3_ROUTER : seller.address,
|
|
654
439
|
amountIn: sellAmountWei,
|
|
655
440
|
amountOutMinimum: 0n,
|
|
656
|
-
sqrtPriceLimitX96: 0n
|
|
657
|
-
}
|
|
441
|
+
sqrtPriceLimitX96: 0n,
|
|
442
|
+
},
|
|
443
|
+
]);
|
|
658
444
|
if (useNativeToken) {
|
|
659
445
|
const sellUnwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
|
|
660
446
|
sellUnsigned = await v3Router.multicall.populateTransaction(deadline, [sellSwapData, sellUnwrapData]);
|
|
@@ -673,7 +459,7 @@ export async function xlayerPureCrossSwapMerkle(params) {
|
|
|
673
459
|
gasLimit: finalGasLimit,
|
|
674
460
|
gasPrice,
|
|
675
461
|
chainId: XLAYER_CHAIN_ID,
|
|
676
|
-
type: txType
|
|
462
|
+
type: txType,
|
|
677
463
|
});
|
|
678
464
|
signedTransactions.push(signedSell);
|
|
679
465
|
}
|
|
@@ -700,15 +486,17 @@ export async function xlayerPureCrossSwapMerkle(params) {
|
|
|
700
486
|
else if (routeParams.routeType === 'v3-single') {
|
|
701
487
|
const { v3TokenIn, v3TokenOut, v3Fee } = routeParams;
|
|
702
488
|
const v3Router = new Contract(POTATO_V3_ROUTER, V3_ROUTER02_ABI, buyer);
|
|
703
|
-
const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
489
|
+
const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
|
|
490
|
+
{
|
|
704
491
|
tokenIn: v3TokenOut, // 买入时反过来
|
|
705
492
|
tokenOut: v3TokenIn,
|
|
706
493
|
fee: v3Fee,
|
|
707
494
|
recipient: buyer.address,
|
|
708
495
|
amountIn: buyAmountWei,
|
|
709
496
|
amountOutMinimum: 0n,
|
|
710
|
-
sqrtPriceLimitX96: 0n
|
|
711
|
-
}
|
|
497
|
+
sqrtPriceLimitX96: 0n,
|
|
498
|
+
},
|
|
499
|
+
]);
|
|
712
500
|
buyUnsigned = await v3Router.multicall.populateTransaction(deadline, [buySwapData], { value: buyValue });
|
|
713
501
|
}
|
|
714
502
|
else {
|
|
@@ -721,17 +509,17 @@ export async function xlayerPureCrossSwapMerkle(params) {
|
|
|
721
509
|
gasLimit: finalGasLimit,
|
|
722
510
|
gasPrice,
|
|
723
511
|
chainId: XLAYER_CHAIN_ID,
|
|
724
|
-
type: txType
|
|
512
|
+
type: txType,
|
|
725
513
|
});
|
|
726
514
|
signedTransactions.push(signedBuy);
|
|
727
515
|
}
|
|
728
516
|
return {
|
|
729
517
|
signedTransactions,
|
|
730
518
|
metadata: {
|
|
731
|
-
sellerAddresses: sellers.map(s => s.address),
|
|
732
|
-
buyerAddresses: buyers.map(b => b.address),
|
|
519
|
+
sellerAddresses: sellers.map((s) => s.address),
|
|
520
|
+
buyerAddresses: buyers.map((b) => b.address),
|
|
733
521
|
sellAmounts,
|
|
734
|
-
buyAmounts
|
|
735
|
-
}
|
|
522
|
+
buyAmounts,
|
|
523
|
+
},
|
|
736
524
|
};
|
|
737
525
|
}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* 支持池子类型:V2, V3
|
|
12
12
|
*/
|
|
13
13
|
import { Wallet } from 'ethers';
|
|
14
|
-
import type { DirectRouterSignConfig } from '../../../dex/
|
|
14
|
+
import type { DirectRouterSignConfig } from '../../../dex/types.js';
|
|
15
15
|
export type EoaWashPoolType = 'V2' | 'V3';
|
|
16
16
|
export interface EoaWashVolumeParams {
|
|
17
17
|
/** 代币地址 */
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
* 支持池子类型:V2, V3
|
|
12
12
|
*/
|
|
13
13
|
import { ethers, Wallet, Contract } from 'ethers';
|
|
14
|
-
import {
|
|
14
|
+
import { createXLayerProvider } from '../../../utils/provider-factory.js';
|
|
15
|
+
import { directV2BatchBuy, directV2BatchSell, directV3BatchBuy, directV3BatchSell, } from '../../../dex/direct-router.js';
|
|
15
16
|
import { getProfitRecipient } from '../../../shared/constants/index.js';
|
|
16
17
|
// ============================================================================
|
|
17
18
|
// 辅助函数
|
|
@@ -54,8 +55,8 @@ export async function signEoaWashBuyTransactions(params) {
|
|
|
54
55
|
throw new Error('[signEoaWashBuyTransactions] 私钥数量与买入金额数量不一致');
|
|
55
56
|
}
|
|
56
57
|
// 创建钱包
|
|
57
|
-
const provider =
|
|
58
|
-
const wallets = privateKeys.map(pk => new Wallet(pk, provider));
|
|
58
|
+
const provider = createXLayerProvider(config.rpcUrl);
|
|
59
|
+
const wallets = privateKeys.map((pk) => new Wallet(pk, provider));
|
|
59
60
|
let result;
|
|
60
61
|
if (poolType === 'V2') {
|
|
61
62
|
result = await directV2BatchBuy({
|
|
@@ -69,7 +70,7 @@ export async function signEoaWashBuyTransactions(params) {
|
|
|
69
70
|
config: {
|
|
70
71
|
...config,
|
|
71
72
|
skipProfit: true, // 买入时不刮取利润(卖出时刮取)
|
|
72
|
-
}
|
|
73
|
+
},
|
|
73
74
|
});
|
|
74
75
|
}
|
|
75
76
|
else {
|
|
@@ -86,7 +87,7 @@ export async function signEoaWashBuyTransactions(params) {
|
|
|
86
87
|
config: {
|
|
87
88
|
...config,
|
|
88
89
|
skipProfit: true, // 买入时不刮取利润(卖出时刮取)
|
|
89
|
-
}
|
|
90
|
+
},
|
|
90
91
|
});
|
|
91
92
|
}
|
|
92
93
|
return {
|
|
@@ -106,13 +107,13 @@ export async function signEoaWashBuyTransactions(params) {
|
|
|
106
107
|
*/
|
|
107
108
|
export async function signEoaWashSellTransactions(params, wallets, tokenDecimals) {
|
|
108
109
|
const { tokenAddress, poolType, routerAddress, quoteToken, config } = params;
|
|
109
|
-
const provider =
|
|
110
|
+
const provider = createXLayerProvider(config.rpcUrl);
|
|
110
111
|
// 获取代币精度
|
|
111
|
-
const decimals = tokenDecimals ?? await getTokenDecimals(provider, tokenAddress);
|
|
112
|
+
const decimals = tokenDecimals ?? (await getTokenDecimals(provider, tokenAddress));
|
|
112
113
|
// 查询所有钱包的代币余额
|
|
113
|
-
const balancesWei = await Promise.all(wallets.map(w => getTokenBalance(provider, tokenAddress, w.address)));
|
|
114
|
+
const balancesWei = await Promise.all(wallets.map((w) => getTokenBalance(provider, tokenAddress, w.address)));
|
|
114
115
|
// 转换为格式化金额
|
|
115
|
-
const sellAmounts = balancesWei.map(balance => {
|
|
116
|
+
const sellAmounts = balancesWei.map((balance) => {
|
|
116
117
|
if (balance <= 0n)
|
|
117
118
|
return '0';
|
|
118
119
|
return ethers.formatUnits(balance, decimals);
|
|
@@ -123,7 +124,6 @@ export async function signEoaWashSellTransactions(params, wallets, tokenDecimals
|
|
|
123
124
|
.filter(({ amt }) => parseFloat(amt) > 0)
|
|
124
125
|
.map(({ i }) => i);
|
|
125
126
|
if (validIndices.length === 0) {
|
|
126
|
-
console.warn('[signEoaWashSellTransactions] 所有钱包余额为 0,无法卖出');
|
|
127
127
|
return {
|
|
128
128
|
signedTransactions: [],
|
|
129
129
|
profitHopWallets: [],
|
|
@@ -131,8 +131,8 @@ export async function signEoaWashSellTransactions(params, wallets, tokenDecimals
|
|
|
131
131
|
profitRecipient: getProfitRecipient(),
|
|
132
132
|
};
|
|
133
133
|
}
|
|
134
|
-
const validPrivateKeys = validIndices.map(i => wallets[i].privateKey);
|
|
135
|
-
const validSellAmounts = validIndices.map(i => sellAmounts[i]);
|
|
134
|
+
const validPrivateKeys = validIndices.map((i) => wallets[i].privateKey);
|
|
135
|
+
const validSellAmounts = validIndices.map((i) => sellAmounts[i]);
|
|
136
136
|
let result;
|
|
137
137
|
if (poolType === 'V2') {
|
|
138
138
|
result = await directV2BatchSell({
|
|
@@ -145,7 +145,7 @@ export async function signEoaWashSellTransactions(params, wallets, tokenDecimals
|
|
|
145
145
|
config: {
|
|
146
146
|
...config,
|
|
147
147
|
// ✅ 卖出时正常刮取利润(XLayer 不使用多跳,直接转账)
|
|
148
|
-
}
|
|
148
|
+
},
|
|
149
149
|
});
|
|
150
150
|
}
|
|
151
151
|
else {
|
|
@@ -161,7 +161,7 @@ export async function signEoaWashSellTransactions(params, wallets, tokenDecimals
|
|
|
161
161
|
config: {
|
|
162
162
|
...config,
|
|
163
163
|
// ✅ 卖出时正常刮取利润(XLayer 不使用多跳,直接转账)
|
|
164
|
-
}
|
|
164
|
+
},
|
|
165
165
|
});
|
|
166
166
|
}
|
|
167
167
|
return {
|