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
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
*
|
|
7
7
|
* 只生成签名,由调用方决定如何提交
|
|
8
8
|
*/
|
|
9
|
-
import { ethers, Contract
|
|
9
|
+
import { ethers, Contract } from 'ethers';
|
|
10
10
|
import { getCachedProvider, createWallet, signAuthorizationsWithNonces, batchGetNonces, buildEIP7702TransactionSync, calculateProfitAmountByUserType, getProfitRecipient, } from './utils.js';
|
|
11
|
-
import { UNIFIED_DELEGATE_ADDRESS, POTATOSWAP_V2_ROUTER, POTATOSWAP_V3_ROUTER, FLAP_PORTAL_ADDRESS, WOKB_ADDRESS, V3_FEE_TIERS, UNIFIED_DELEGATE_ABI, FLAP_PORTAL_ABI, ERC20_ABI, XLAYER_RPC_URL,
|
|
11
|
+
import { UNIFIED_DELEGATE_ADDRESS, POTATOSWAP_V2_ROUTER, POTATOSWAP_V3_ROUTER, FLAP_PORTAL_ADDRESS, WOKB_ADDRESS, V3_FEE_TIERS, UNIFIED_DELEGATE_ABI, FLAP_PORTAL_ABI, ERC20_ABI, XLAYER_RPC_URL, } from './constants.js';
|
|
12
12
|
import { quoteV2, quoteV3 } from '../../../utils/quote-helpers.js';
|
|
13
13
|
// ========================================
|
|
14
14
|
// 路由地址获取
|
|
@@ -39,7 +39,7 @@ function getDefaultRouter(tradeType) {
|
|
|
39
39
|
async function quoteSellOutput(totalSellAmount, tokenAddress, tradeType, fee, rpcUrl) {
|
|
40
40
|
if (totalSellAmount <= 0n)
|
|
41
41
|
return 0n;
|
|
42
|
-
const provider =
|
|
42
|
+
const provider = getCachedProvider(rpcUrl || XLAYER_RPC_URL);
|
|
43
43
|
try {
|
|
44
44
|
switch (tradeType) {
|
|
45
45
|
case 'FLAP': {
|
|
@@ -51,7 +51,7 @@ async function quoteSellOutput(totalSellAmount, tokenAddress, tradeType, fee, rp
|
|
|
51
51
|
return BigInt(okbOut.toString());
|
|
52
52
|
}
|
|
53
53
|
catch {
|
|
54
|
-
|
|
54
|
+
// fallback to quoteExactInput
|
|
55
55
|
}
|
|
56
56
|
// 再尝试 quoteExactInput
|
|
57
57
|
try {
|
|
@@ -63,7 +63,7 @@ async function quoteSellOutput(totalSellAmount, tokenAddress, tradeType, fee, rp
|
|
|
63
63
|
return BigInt(okbOut.toString());
|
|
64
64
|
}
|
|
65
65
|
catch {
|
|
66
|
-
|
|
66
|
+
// fallback to V2
|
|
67
67
|
}
|
|
68
68
|
// 回退到 V2
|
|
69
69
|
const v2Result = await quoteV2(provider, tokenAddress, WOKB_ADDRESS, totalSellAmount, 'XLAYER');
|
|
@@ -93,10 +93,9 @@ async function quoteSellOutput(totalSellAmount, tokenAddress, tradeType, fee, rp
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
|
-
catch
|
|
97
|
-
|
|
96
|
+
catch {
|
|
97
|
+
// quote failed, return 0
|
|
98
98
|
}
|
|
99
|
-
console.warn(`[Bundle Sell] 无法获取报价,利润计算可能不准确`);
|
|
100
99
|
return 0n;
|
|
101
100
|
}
|
|
102
101
|
// ========================================
|
|
@@ -107,8 +106,8 @@ async function getTokenBalances(wallets, tokenAddress) {
|
|
|
107
106
|
if (!provider)
|
|
108
107
|
throw new Error('Wallet has no provider');
|
|
109
108
|
const tokenContract = new Contract(tokenAddress, ERC20_ABI, provider);
|
|
110
|
-
const balances = await Promise.all(wallets.map(w => tokenContract.balanceOf(w.address)));
|
|
111
|
-
return balances.map(b => BigInt(b.toString()));
|
|
109
|
+
const balances = await Promise.all(wallets.map((w) => tokenContract.balanceOf(w.address)));
|
|
110
|
+
return balances.map((b) => BigInt(b.toString()));
|
|
112
111
|
}
|
|
113
112
|
// ========================================
|
|
114
113
|
// FLAP 内盘卖出
|
|
@@ -124,18 +123,22 @@ function buildFlapSellCalls(wallets, sellAmounts, tokenAddress) {
|
|
|
124
123
|
continue;
|
|
125
124
|
// ✅ 使用 swapExactInput 卖出(与 AA 模式保持一致)
|
|
126
125
|
// outputToken = 0x0 表示卖出换取原生代币 (OKB)
|
|
127
|
-
const portalCallData = portalInterface.encodeFunctionData('swapExactInput', [
|
|
126
|
+
const portalCallData = portalInterface.encodeFunctionData('swapExactInput', [
|
|
127
|
+
{
|
|
128
128
|
inputToken: tokenAddress,
|
|
129
129
|
outputToken: ethers.ZeroAddress, // 0x0 = OKB
|
|
130
130
|
inputAmount: amount,
|
|
131
131
|
minOutputAmount: 0n, // 无滑点保护
|
|
132
132
|
permitData: '0x', // 无 permit
|
|
133
|
-
}
|
|
134
|
-
|
|
133
|
+
},
|
|
134
|
+
]);
|
|
135
|
+
const batchCalls = [
|
|
136
|
+
{
|
|
135
137
|
target: FLAP_PORTAL_ADDRESS,
|
|
136
138
|
value: 0n,
|
|
137
139
|
data: portalCallData,
|
|
138
|
-
}
|
|
140
|
+
},
|
|
141
|
+
];
|
|
139
142
|
const callData = delegateInterface.encodeFunctionData('executeBatch', [batchCalls]);
|
|
140
143
|
calls.push({
|
|
141
144
|
target: wallet.address, // 以钱包身份调用,OKB 收益会到钱包
|
|
@@ -160,11 +163,7 @@ function buildV2SellCalls(wallets, sellAmounts, tokenAddress, routerAddress) {
|
|
|
160
163
|
if (amount <= 0n)
|
|
161
164
|
continue;
|
|
162
165
|
// 使用 UnifiedDelegate 的 executeSellV2 函数
|
|
163
|
-
const callData = delegateInterface.encodeFunctionData('executeSellV2', [
|
|
164
|
-
routerAddress,
|
|
165
|
-
path,
|
|
166
|
-
amount,
|
|
167
|
-
]);
|
|
166
|
+
const callData = delegateInterface.encodeFunctionData('executeSellV2', [routerAddress, path, amount]);
|
|
168
167
|
calls.push({
|
|
169
168
|
target: wallet.address,
|
|
170
169
|
allowFailure: false,
|
|
@@ -215,46 +214,6 @@ function buildSellCalls(wallets, sellAmounts, tokenAddress, tradeType, routerAdd
|
|
|
215
214
|
return buildV3SellCalls(wallets, sellAmounts, tokenAddress, routerAddress, fee);
|
|
216
215
|
}
|
|
217
216
|
}
|
|
218
|
-
// ========================================
|
|
219
|
-
// 批量卖出主函数
|
|
220
|
-
// ========================================
|
|
221
|
-
/**
|
|
222
|
-
* 批量卖出 - 生成签名后的交易
|
|
223
|
-
*
|
|
224
|
-
* @param params 卖出参数
|
|
225
|
-
* @returns 签名后的交易和元数据
|
|
226
|
-
*
|
|
227
|
-
* @example
|
|
228
|
-
* // FLAP 内盘卖出
|
|
229
|
-
* const result = await bundleSell({
|
|
230
|
-
* mainPrivateKey: '0x...',
|
|
231
|
-
* privateKeys: ['0x...', '0x...'],
|
|
232
|
-
* sellPercent: 100, // 卖出 100%
|
|
233
|
-
* tokenAddress: '0x...',
|
|
234
|
-
* tradeType: 'FLAP',
|
|
235
|
-
* });
|
|
236
|
-
*
|
|
237
|
-
* @example
|
|
238
|
-
* // V2 卖出
|
|
239
|
-
* const result = await bundleSell({
|
|
240
|
-
* mainPrivateKey: '0x...',
|
|
241
|
-
* privateKeys: ['0x...', '0x...'],
|
|
242
|
-
* sellPercent: 50, // 卖出 50%
|
|
243
|
-
* tokenAddress: '0x...',
|
|
244
|
-
* tradeType: 'V2',
|
|
245
|
-
* });
|
|
246
|
-
*
|
|
247
|
-
* @example
|
|
248
|
-
* // V3 卖出(默认)
|
|
249
|
-
* const result = await bundleSell({
|
|
250
|
-
* mainPrivateKey: '0x...',
|
|
251
|
-
* privateKeys: ['0x...', '0x...'],
|
|
252
|
-
* sellAmounts: ['100', '200'], // 指定数量
|
|
253
|
-
* tokenAddress: '0x...',
|
|
254
|
-
* tradeType: 'V3',
|
|
255
|
-
* fee: 2500,
|
|
256
|
-
* });
|
|
257
|
-
*/
|
|
258
217
|
export async function bundleSell(params) {
|
|
259
218
|
const { mainPrivateKey, privateKeys, sellAmounts, sellPercent, tokenAddress, tokenDecimals = 18, tradeType = 'V3', routerAddress, fee = V3_FEE_TIERS.MEDIUM, userType = 'v0', // ✅ 用户类型(影响利润率)
|
|
260
219
|
config, } = params;
|
|
@@ -266,17 +225,15 @@ export async function bundleSell(params) {
|
|
|
266
225
|
// 同步操作 - 批量创建钱包
|
|
267
226
|
// ========================================
|
|
268
227
|
const mainWallet = createWallet(mainPrivateKey, provider);
|
|
269
|
-
const wallets = privateKeys.map(pk => createWallet(pk, provider));
|
|
228
|
+
const wallets = privateKeys.map((pk) => createWallet(pk, provider));
|
|
270
229
|
const profitRecipient = getProfitRecipient(config);
|
|
271
230
|
// 确定需要授权的钱包
|
|
272
|
-
const mainWalletIndex = wallets.findIndex(w => w.address.toLowerCase() === mainWallet.address.toLowerCase());
|
|
273
|
-
const allWallets = mainWalletIndex === -1
|
|
274
|
-
? [mainWallet, ...wallets]
|
|
275
|
-
: wallets;
|
|
231
|
+
const mainWalletIndex = wallets.findIndex((w) => w.address.toLowerCase() === mainWallet.address.toLowerCase());
|
|
232
|
+
const allWallets = mainWalletIndex === -1 ? [mainWallet, ...wallets] : wallets;
|
|
276
233
|
// ========================================
|
|
277
234
|
// 并行获取所有异步数据
|
|
278
235
|
// ========================================
|
|
279
|
-
const allAddresses = allWallets.map(w => w.address);
|
|
236
|
+
const allAddresses = allWallets.map((w) => w.address);
|
|
280
237
|
// 判断是否需要查询代币余额
|
|
281
238
|
const needBalanceQuery = !sellAmounts || sellAmounts.length !== wallets.length;
|
|
282
239
|
// 构建并行请求
|
|
@@ -303,13 +260,13 @@ export async function bundleSell(params) {
|
|
|
303
260
|
let sellAmountsWei;
|
|
304
261
|
if (sellAmounts && sellAmounts.length === wallets.length) {
|
|
305
262
|
// 直接解析指定的卖出数量
|
|
306
|
-
sellAmountsWei = sellAmounts.map(amt => ethers.parseUnits(amt, tokenDecimals));
|
|
263
|
+
sellAmountsWei = sellAmounts.map((amt) => ethers.parseUnits(amt, tokenDecimals));
|
|
307
264
|
}
|
|
308
265
|
else if (tokenBalances) {
|
|
309
266
|
// 使用查询到的余额
|
|
310
267
|
if (sellPercent !== undefined && sellPercent > 0) {
|
|
311
268
|
const percent = Math.min(100, Math.max(0, sellPercent));
|
|
312
|
-
sellAmountsWei = tokenBalances.map(b => (b * BigInt(percent)) / 100n);
|
|
269
|
+
sellAmountsWei = tokenBalances.map((b) => (b * BigInt(percent)) / 100n);
|
|
313
270
|
}
|
|
314
271
|
else {
|
|
315
272
|
sellAmountsWei = tokenBalances;
|
|
@@ -324,9 +281,7 @@ export async function bundleSell(params) {
|
|
|
324
281
|
// 1. 先获取报价:卖出 totalSellAmount 代币能得到多少 OKB
|
|
325
282
|
const estimatedOkbOut = await quoteSellOutput(totalSellAmount, tokenAddress, tradeType, fee, config?.rpcUrl);
|
|
326
283
|
// 2. 基于预估的 OKB 输出计算利润(单边模式,isDoubleMode = false)
|
|
327
|
-
const profitAmount = estimatedOkbOut > 0n
|
|
328
|
-
? calculateProfitAmountByUserType(estimatedOkbOut, userType, false)
|
|
329
|
-
: 0n;
|
|
284
|
+
const profitAmount = estimatedOkbOut > 0n ? calculateProfitAmountByUserType(estimatedOkbOut, userType, false) : 0n;
|
|
330
285
|
// ========================================
|
|
331
286
|
// 同步构建授权和调用
|
|
332
287
|
// ========================================
|
|
@@ -365,10 +320,7 @@ export async function bundleSell(params) {
|
|
|
365
320
|
target: wallets[i].address,
|
|
366
321
|
allowFailure: false,
|
|
367
322
|
value: 0n,
|
|
368
|
-
callData: delegateInterface.encodeFunctionData('transferAmount', [
|
|
369
|
-
profitRecipient,
|
|
370
|
-
walletProfit,
|
|
371
|
-
]),
|
|
323
|
+
callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, walletProfit]),
|
|
372
324
|
});
|
|
373
325
|
}
|
|
374
326
|
}
|
|
@@ -9,28 +9,7 @@
|
|
|
9
9
|
* 支持 FLAP 内盘、V2 和 V3 三种交易类型
|
|
10
10
|
* 只生成签名,由调用方决定如何提交
|
|
11
11
|
*/
|
|
12
|
-
import type {
|
|
13
|
-
export interface BundleSwapParams extends BaseBundleSwapParams {
|
|
14
|
-
/** 用户类型(影响利润率) */
|
|
15
|
-
userType?: UserType;
|
|
16
|
-
/**
|
|
17
|
-
* 是否使用资金利用率模式(默认 false)
|
|
18
|
-
* - false(普通模式): 卖家卖出 OKB 留在卖家账户,买家用自己预存的 OKB 买入
|
|
19
|
-
* - true(资金利用率模式): 卖家卖出的 OKB 通过多跳转账给买家,买家用收到的 OKB 买入
|
|
20
|
-
*/
|
|
21
|
-
useFundUtilization?: boolean;
|
|
22
|
-
}
|
|
23
|
-
export interface BundleBatchSwapParams extends BaseBundleBatchSwapParams {
|
|
24
|
-
/** 用户类型(影响利润率) */
|
|
25
|
-
userType?: UserType;
|
|
26
|
-
/**
|
|
27
|
-
* 是否使用资金利用率模式(默认 false)
|
|
28
|
-
* - false(普通模式): 卖家卖出 OKB 留在卖家账户,买家用自己预存的 OKB 买入
|
|
29
|
-
* - true(资金利用率模式): 卖家卖出的 OKB 通过多跳转账给买家,买家用收到的 OKB 买入
|
|
30
|
-
*/
|
|
31
|
-
useFundUtilization?: boolean;
|
|
32
|
-
}
|
|
33
|
-
import { type UserType } from './utils.js';
|
|
12
|
+
import type { BundleBatchSwapParams, BundleMultiSwapParams, BundleMultiSwapResult, BundleSwapParams, BundleSwapResult } from './types.js';
|
|
34
13
|
/**
|
|
35
14
|
* 捆绑换手 - 生成签名后的交易
|
|
36
15
|
*
|
|
@@ -48,6 +27,7 @@ import { type UserType } from './utils.js';
|
|
|
48
27
|
* hopCount: 2,
|
|
49
28
|
* });
|
|
50
29
|
*/
|
|
30
|
+
export type { BundleSwapParams, BundleBatchSwapParams } from './types.js';
|
|
51
31
|
export declare function bundleSwap(params: BundleSwapParams): Promise<BundleSwapResult>;
|
|
52
32
|
/**
|
|
53
33
|
* 批量换手(一卖多买)- 生成签名后的交易
|
|
@@ -66,49 +46,7 @@ export declare function bundleSwap(params: BundleSwapParams): Promise<BundleSwap
|
|
|
66
46
|
* });
|
|
67
47
|
*/
|
|
68
48
|
export declare function bundleBatchSwap(params: BundleBatchSwapParams): Promise<BundleSwapResult>;
|
|
69
|
-
export
|
|
70
|
-
/** Payer 钱包私钥(支付 Gas 费) */
|
|
71
|
-
mainPrivateKey: string;
|
|
72
|
-
/** 卖出钱包私钥列表 */
|
|
73
|
-
sellerPrivateKeys: string[];
|
|
74
|
-
/** 买入钱包私钥列表 */
|
|
75
|
-
buyerPrivateKeys: string[];
|
|
76
|
-
/** 买入总金额 (OKB) */
|
|
77
|
-
totalBuyAmount: string;
|
|
78
|
-
/** 代币地址 */
|
|
79
|
-
tokenAddress: string;
|
|
80
|
-
/** 代币精度 */
|
|
81
|
-
tokenDecimals?: number;
|
|
82
|
-
/** 卖出百分比(1-100,默认 100) */
|
|
83
|
-
sellPercent?: number;
|
|
84
|
-
/** 交易类型:FLAP 内盘 / V2 / V3(默认 V3) */
|
|
85
|
-
tradeType?: TradeType;
|
|
86
|
-
/** 路由地址(可选,根据 tradeType 自动选择) */
|
|
87
|
-
routerAddress?: string;
|
|
88
|
-
/** V3 费率(可选,默认 2500,仅 V3 使用) */
|
|
89
|
-
fee?: number;
|
|
90
|
-
/** 用户类型(影响利润率) */
|
|
91
|
-
userType?: UserType;
|
|
92
|
-
/** 配置 */
|
|
93
|
-
config?: EIP7702Config;
|
|
94
|
-
}
|
|
95
|
-
export interface BundleMultiSwapResult {
|
|
96
|
-
/** 签名后的交易 */
|
|
97
|
-
signedTransaction: string;
|
|
98
|
-
/** 元数据 */
|
|
99
|
-
metadata: {
|
|
100
|
-
payerAddress: string;
|
|
101
|
-
sellerAddresses: string[];
|
|
102
|
-
buyerAddresses: string[];
|
|
103
|
-
sellerCount: number;
|
|
104
|
-
buyerCount: number;
|
|
105
|
-
totalBuyAmount: string;
|
|
106
|
-
totalSellAmount: string;
|
|
107
|
-
profitAmount: string;
|
|
108
|
-
profitRecipient: string;
|
|
109
|
-
userType: string;
|
|
110
|
-
};
|
|
111
|
-
}
|
|
49
|
+
export type { BundleMultiSwapParams, BundleMultiSwapResult } from './types.js';
|
|
112
50
|
/**
|
|
113
51
|
* 多对多换手 - 多个卖家 + 多个买家
|
|
114
52
|
*
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
* 支持 FLAP 内盘、V2 和 V3 三种交易类型
|
|
10
10
|
* 只生成签名,由调用方决定如何提交
|
|
11
11
|
*/
|
|
12
|
-
import { ethers, Contract
|
|
12
|
+
import { ethers, Contract } from 'ethers';
|
|
13
13
|
import { quoteV2, quoteV3 } from '../../../utils/quote-helpers.js';
|
|
14
14
|
import { getCachedProvider, createWallet, signAuthorization, signAuthorizationsWithNonces, batchGetNonces, buildEIP7702TransactionSync, calculateProfitAmountByUserType, calculateProfitAmountByTxCount, getProfitRecipient, generateRandomWallets, } from './utils.js';
|
|
15
|
-
import { UNIFIED_DELEGATE_ADDRESS, POTATOSWAP_V2_ROUTER, POTATOSWAP_V3_ROUTER, FLAP_PORTAL_ADDRESS, WOKB_ADDRESS, V3_FEE_TIERS, UNIFIED_DELEGATE_ABI, FLAP_PORTAL_ABI, ERC20_ABI, XLAYER_RPC_URL,
|
|
15
|
+
import { UNIFIED_DELEGATE_ADDRESS, POTATOSWAP_V2_ROUTER, POTATOSWAP_V3_ROUTER, FLAP_PORTAL_ADDRESS, WOKB_ADDRESS, V3_FEE_TIERS, UNIFIED_DELEGATE_ABI, FLAP_PORTAL_ABI, ERC20_ABI, XLAYER_RPC_URL, } from './constants.js';
|
|
16
16
|
// ========================================
|
|
17
17
|
// 路由地址获取
|
|
18
18
|
// ========================================
|
|
@@ -50,7 +50,7 @@ function truncateDecimals(value, decimals = 18) {
|
|
|
50
50
|
async function quoteSellOutput(sellAmount, tokenAddress, tradeType, fee, rpcUrl) {
|
|
51
51
|
if (sellAmount <= 0n)
|
|
52
52
|
return 0n;
|
|
53
|
-
const provider =
|
|
53
|
+
const provider = getCachedProvider(rpcUrl || XLAYER_RPC_URL);
|
|
54
54
|
try {
|
|
55
55
|
switch (tradeType) {
|
|
56
56
|
case 'FLAP': {
|
|
@@ -65,8 +65,8 @@ async function quoteSellOutput(sellAmount, tokenAddress, tradeType, fee, rpcUrl)
|
|
|
65
65
|
});
|
|
66
66
|
return BigInt(okbOut.toString());
|
|
67
67
|
}
|
|
68
|
-
catch
|
|
69
|
-
|
|
68
|
+
catch {
|
|
69
|
+
// fallback to previewSell
|
|
70
70
|
}
|
|
71
71
|
// 回退到 previewSell
|
|
72
72
|
try {
|
|
@@ -74,7 +74,7 @@ async function quoteSellOutput(sellAmount, tokenAddress, tradeType, fee, rpcUrl)
|
|
|
74
74
|
return BigInt(okbOut.toString());
|
|
75
75
|
}
|
|
76
76
|
catch {
|
|
77
|
-
|
|
77
|
+
// fallback to V2
|
|
78
78
|
}
|
|
79
79
|
// 回退到 V2
|
|
80
80
|
const v2Result = await quoteV2(provider, tokenAddress, WOKB_ADDRESS, sellAmount, 'XLAYER');
|
|
@@ -104,32 +104,11 @@ async function quoteSellOutput(sellAmount, tokenAddress, tradeType, fee, rpcUrl)
|
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
|
-
catch
|
|
108
|
-
|
|
107
|
+
catch {
|
|
108
|
+
// quote failed, return 0
|
|
109
109
|
}
|
|
110
|
-
console.warn(`[Bundle Swap] 无法获取报价,利润计算可能不准确`);
|
|
111
110
|
return 0n;
|
|
112
111
|
}
|
|
113
|
-
// ========================================
|
|
114
|
-
// 构建买入调用
|
|
115
|
-
// ========================================
|
|
116
|
-
/**
|
|
117
|
-
* 捆绑换手 - 生成签名后的交易
|
|
118
|
-
*
|
|
119
|
-
* @param params 换手参数
|
|
120
|
-
* @returns 签名后的交易和元数据
|
|
121
|
-
*
|
|
122
|
-
* @example
|
|
123
|
-
* // FLAP 内盘换手
|
|
124
|
-
* const result = await bundleSwap({
|
|
125
|
-
* sellerPrivateKey: '0x...',
|
|
126
|
-
* buyerPrivateKey: '0x...',
|
|
127
|
-
* tokenAddress: '0x...',
|
|
128
|
-
* sellAmount: '100',
|
|
129
|
-
* tradeType: 'FLAP',
|
|
130
|
-
* hopCount: 2,
|
|
131
|
-
* });
|
|
132
|
-
*/
|
|
133
112
|
export async function bundleSwap(params) {
|
|
134
113
|
const { sellerPrivateKey, buyerPrivateKey, tokenAddress, tokenDecimals = 18, sellAmount, hopCount = 0, tradeType = 'V3', routerAddress, fee = V3_FEE_TIERS.MEDIUM, userType = 'v0', useFundUtilization = false, // ✅ 默认普通模式
|
|
135
114
|
config, } = params;
|
|
@@ -146,19 +125,15 @@ export async function bundleSwap(params) {
|
|
|
146
125
|
// 资金利用率模式才需要中间钱包
|
|
147
126
|
const actualHopCount = useFundUtilization ? hopCount : 0;
|
|
148
127
|
const hopWalletInfos = actualHopCount > 0 ? generateRandomWallets(actualHopCount) : [];
|
|
149
|
-
const hopWallets = hopWalletInfos.map(info => createWallet(info.privateKey, provider));
|
|
128
|
+
const hopWallets = hopWalletInfos.map((info) => createWallet(info.privateKey, provider));
|
|
150
129
|
const sellAmountWei = ethers.parseUnits(truncateDecimals(sellAmount, tokenDecimals), tokenDecimals);
|
|
151
130
|
// 获取卖出报价
|
|
152
131
|
const estimatedOkbOut = await quoteSellOutput(sellAmountWei, tokenAddress, tradeType, fee, config?.rpcUrl);
|
|
153
132
|
// 使用双边费率计算利润(换手 = 卖 + 买)
|
|
154
|
-
const profitAmount = estimatedOkbOut > 0n
|
|
155
|
-
? calculateProfitAmountByUserType(estimatedOkbOut, userType, true)
|
|
156
|
-
: 0n;
|
|
133
|
+
const profitAmount = estimatedOkbOut > 0n ? calculateProfitAmountByUserType(estimatedOkbOut, userType, true) : 0n;
|
|
157
134
|
const profitRecipient = getProfitRecipient(config);
|
|
158
135
|
// 计算买入金额
|
|
159
|
-
const buyAmountAfterProfit = estimatedOkbOut > profitAmount
|
|
160
|
-
? estimatedOkbOut - profitAmount
|
|
161
|
-
: 0n;
|
|
136
|
+
const buyAmountAfterProfit = estimatedOkbOut > profitAmount ? estimatedOkbOut - profitAmount : 0n;
|
|
162
137
|
// ========================================
|
|
163
138
|
// 并行获取数据
|
|
164
139
|
// ========================================
|
|
@@ -324,22 +299,18 @@ export async function bundleBatchSwap(params) {
|
|
|
324
299
|
// 创建钱包
|
|
325
300
|
// ========================================
|
|
326
301
|
const sellerWallet = createWallet(sellerPrivateKey, provider);
|
|
327
|
-
const buyerWallets = buyerPrivateKeys.map(pk => createWallet(pk, provider));
|
|
302
|
+
const buyerWallets = buyerPrivateKeys.map((pk) => createWallet(pk, provider));
|
|
328
303
|
// 资金利用率模式才需要中间钱包
|
|
329
304
|
const actualHopCount = useFundUtilization ? hopCount : 0;
|
|
330
305
|
const hopWalletInfos = actualHopCount > 0 ? generateRandomWallets(actualHopCount) : [];
|
|
331
|
-
const hopWallets = hopWalletInfos.map(info => createWallet(info.privateKey, provider));
|
|
306
|
+
const hopWallets = hopWalletInfos.map((info) => createWallet(info.privateKey, provider));
|
|
332
307
|
const sellAmountWei = ethers.parseUnits(truncateDecimals(sellAmount, tokenDecimals), tokenDecimals);
|
|
333
308
|
// 获取卖出报价
|
|
334
309
|
const estimatedOkbOut = await quoteSellOutput(sellAmountWei, tokenAddress, tradeType, fee, config?.rpcUrl);
|
|
335
310
|
// 计算利润和买入金额
|
|
336
|
-
const profitAmount = estimatedOkbOut > 0n
|
|
337
|
-
? calculateProfitAmountByUserType(estimatedOkbOut, userType, true)
|
|
338
|
-
: 0n;
|
|
311
|
+
const profitAmount = estimatedOkbOut > 0n ? calculateProfitAmountByUserType(estimatedOkbOut, userType, true) : 0n;
|
|
339
312
|
const profitRecipient = getProfitRecipient(config);
|
|
340
|
-
const totalBuyAmountAfterProfit = estimatedOkbOut > profitAmount
|
|
341
|
-
? estimatedOkbOut - profitAmount
|
|
342
|
-
: 0n;
|
|
313
|
+
const totalBuyAmountAfterProfit = estimatedOkbOut > profitAmount ? estimatedOkbOut - profitAmount : 0n;
|
|
343
314
|
// 验证报价
|
|
344
315
|
if (tradeType === 'FLAP' && totalBuyAmountAfterProfit <= 0n) {
|
|
345
316
|
throw new Error('FLAP 内盘模式需要有效的报价,请检查代币地址或稍后重试');
|
|
@@ -347,11 +318,11 @@ export async function bundleBatchSwap(params) {
|
|
|
347
318
|
// ========================================
|
|
348
319
|
// 并行获取数据
|
|
349
320
|
// ========================================
|
|
350
|
-
const addressesToQuery = [sellerWallet.address, ...buyerWallets.map(w => w.address)];
|
|
321
|
+
const addressesToQuery = [sellerWallet.address, ...buyerWallets.map((w) => w.address)];
|
|
351
322
|
const [nonces, feeData, ...buyerBalances] = await Promise.all([
|
|
352
323
|
batchGetNonces(addressesToQuery, provider),
|
|
353
324
|
provider.getFeeData(),
|
|
354
|
-
...buyerWallets.map(w => provider.getBalance(w.address)),
|
|
325
|
+
...buyerWallets.map((w) => provider.getBalance(w.address)),
|
|
355
326
|
]);
|
|
356
327
|
const sellerNonce = nonces[0];
|
|
357
328
|
const buyerNonces = nonces.slice(1);
|
|
@@ -434,7 +405,10 @@ export async function bundleBatchSwap(params) {
|
|
|
434
405
|
target: sellerWallet.address,
|
|
435
406
|
allowFailure: false,
|
|
436
407
|
value: 0n,
|
|
437
|
-
callData: delegateInterface.encodeFunctionData('transferAmount', [
|
|
408
|
+
callData: delegateInterface.encodeFunctionData('transferAmount', [
|
|
409
|
+
hopWallets[0].address,
|
|
410
|
+
totalBuyAmountAfterProfit,
|
|
411
|
+
]),
|
|
438
412
|
});
|
|
439
413
|
// 中间钱包之间转账(到最后一个 hop):使用 transferTo(全部余额)
|
|
440
414
|
for (let i = 0; i < hopWallets.length - 1; i++) {
|
|
@@ -502,7 +476,7 @@ export async function bundleBatchSwap(params) {
|
|
|
502
476
|
hopWallets: hopWalletInfos,
|
|
503
477
|
metadata: {
|
|
504
478
|
sellerAddress: sellerWallet.address,
|
|
505
|
-
buyerAddresses: buyerWallets.map(w => w.address),
|
|
479
|
+
buyerAddresses: buyerWallets.map((w) => w.address),
|
|
506
480
|
sellAmount: ethers.formatUnits(sellAmountWei, tokenDecimals),
|
|
507
481
|
estimatedOkbOut: ethers.formatEther(estimatedOkbOut),
|
|
508
482
|
estimatedBuyAmount: ethers.formatEther(totalBuyAmountAfterProfit),
|
|
@@ -546,18 +520,15 @@ export async function bundleMultiSwap(params) {
|
|
|
546
520
|
throw new Error('必须提供有效的 mainPrivateKey(Payer 钱包私钥)');
|
|
547
521
|
}
|
|
548
522
|
// ✅ 验证卖家私钥
|
|
549
|
-
const validSellerPrivateKeys = sellerPrivateKeys.filter(pk => isValidPrivateKey(pk));
|
|
523
|
+
const validSellerPrivateKeys = sellerPrivateKeys.filter((pk) => isValidPrivateKey(pk));
|
|
550
524
|
if (validSellerPrivateKeys.length === 0) {
|
|
551
525
|
throw new Error('没有有效的卖家私钥');
|
|
552
526
|
}
|
|
553
527
|
// ✅ 验证买家私钥
|
|
554
|
-
const validBuyerPrivateKeys = buyerPrivateKeys.filter(pk => isValidPrivateKey(pk));
|
|
528
|
+
const validBuyerPrivateKeys = buyerPrivateKeys.filter((pk) => isValidPrivateKey(pk));
|
|
555
529
|
if (validBuyerPrivateKeys.length === 0) {
|
|
556
530
|
throw new Error('没有有效的买家私钥');
|
|
557
531
|
}
|
|
558
|
-
if (validSellerPrivateKeys.length !== sellerPrivateKeys.length || validBuyerPrivateKeys.length !== buyerPrivateKeys.length) {
|
|
559
|
-
console.warn(`[bundleMultiSwap] 跳过无效私钥: 卖家 ${sellerPrivateKeys.length - validSellerPrivateKeys.length} 个, 买家 ${buyerPrivateKeys.length - validBuyerPrivateKeys.length} 个`);
|
|
560
|
-
}
|
|
561
532
|
const provider = getCachedProvider(config?.rpcUrl);
|
|
562
533
|
// ✅ 空字符串也使用默认值
|
|
563
534
|
const delegateAddress = (config?.delegateAddress && config.delegateAddress.trim()) || UNIFIED_DELEGATE_ADDRESS;
|
|
@@ -567,16 +538,16 @@ export async function bundleMultiSwap(params) {
|
|
|
567
538
|
// ✅ 创建 Payer 钱包(支付 Gas 费)
|
|
568
539
|
const mainWallet = createWallet(mainPrivateKey, provider);
|
|
569
540
|
// 创建钱包
|
|
570
|
-
const sellerWallets = validSellerPrivateKeys.map(pk => createWallet(pk, provider));
|
|
571
|
-
const buyerWallets = validBuyerPrivateKeys.map(pk => createWallet(pk, provider));
|
|
541
|
+
const sellerWallets = validSellerPrivateKeys.map((pk) => createWallet(pk, provider));
|
|
542
|
+
const buyerWallets = validBuyerPrivateKeys.map((pk) => createWallet(pk, provider));
|
|
572
543
|
// 合并所有钱包(去重,包括 mainWallet)
|
|
573
544
|
const allWalletsMap = new Map();
|
|
574
545
|
allWalletsMap.set(mainWallet.address.toLowerCase(), mainWallet);
|
|
575
|
-
sellerWallets.forEach(w => allWalletsMap.set(w.address.toLowerCase(), w));
|
|
576
|
-
buyerWallets.forEach(w => allWalletsMap.set(w.address.toLowerCase(), w));
|
|
546
|
+
sellerWallets.forEach((w) => allWalletsMap.set(w.address.toLowerCase(), w));
|
|
547
|
+
buyerWallets.forEach((w) => allWalletsMap.set(w.address.toLowerCase(), w));
|
|
577
548
|
const allWallets = Array.from(allWalletsMap.values());
|
|
578
549
|
// 找出 mainWallet 在 allWallets 中的索引
|
|
579
|
-
const mainWalletIndex = allWallets.findIndex(w => w.address.toLowerCase() === mainWallet.address.toLowerCase());
|
|
550
|
+
const mainWalletIndex = allWallets.findIndex((w) => w.address.toLowerCase() === mainWallet.address.toLowerCase());
|
|
580
551
|
// 计算买入金额
|
|
581
552
|
const totalBuyAmountWei = ethers.parseEther(truncateDecimals(totalBuyAmount));
|
|
582
553
|
const buyAmountPerWallet = totalBuyAmountWei / BigInt(buyerWallets.length);
|
|
@@ -587,13 +558,13 @@ export async function bundleMultiSwap(params) {
|
|
|
587
558
|
// ========================================
|
|
588
559
|
// 并行获取数据
|
|
589
560
|
// ========================================
|
|
590
|
-
const allAddresses = allWallets.map(w => w.address);
|
|
561
|
+
const allAddresses = allWallets.map((w) => w.address);
|
|
591
562
|
// 获取卖出钱包的代币余额
|
|
592
563
|
const tokenContract = new ethers.Contract(tokenAddress, ERC20_ABI, provider);
|
|
593
564
|
const [nonces, feeData, sellerBalances] = await Promise.all([
|
|
594
565
|
batchGetNonces(allAddresses, provider),
|
|
595
566
|
provider.getFeeData(),
|
|
596
|
-
Promise.all(sellerWallets.map(w => tokenContract.balanceOf(w.address))),
|
|
567
|
+
Promise.all(sellerWallets.map((w) => tokenContract.balanceOf(w.address))),
|
|
597
568
|
]);
|
|
598
569
|
// 计算每个卖家的卖出金额(按百分比)
|
|
599
570
|
const percentBigInt = BigInt(Math.min(100, Math.max(1, sellPercent)));
|
|
@@ -638,8 +609,8 @@ export async function bundleMultiSwap(params) {
|
|
|
638
609
|
signedTransaction,
|
|
639
610
|
metadata: {
|
|
640
611
|
payerAddress: mainWallet.address,
|
|
641
|
-
sellerAddresses: sellerWallets.map(w => w.address),
|
|
642
|
-
buyerAddresses: buyerWallets.map(w => w.address),
|
|
612
|
+
sellerAddresses: sellerWallets.map((w) => w.address),
|
|
613
|
+
buyerAddresses: buyerWallets.map((w) => w.address),
|
|
643
614
|
sellerCount: sellerWallets.filter((_, i) => sellAmountsWei[i] > 0n).length,
|
|
644
615
|
buyerCount: buyerWallets.length,
|
|
645
616
|
totalBuyAmount: ethers.formatEther(totalBuyAmountWei),
|
|
@@ -658,13 +629,15 @@ function buildBuyCallInternal(wallet, amount, tokenAddress, tradeType, routerAdd
|
|
|
658
629
|
case 'FLAP': {
|
|
659
630
|
// ✅ FLAP: 使用 swapExactInput 买入(与 AA 模式保持一致)
|
|
660
631
|
// 原 buy(address token) ABI 与 Portal 不匹配,改用 swapExactInput
|
|
661
|
-
const portalCallData = portalInterface.encodeFunctionData('swapExactInput', [
|
|
632
|
+
const portalCallData = portalInterface.encodeFunctionData('swapExactInput', [
|
|
633
|
+
{
|
|
662
634
|
inputToken: ethers.ZeroAddress, // 0x0 = OKB (原生代币)
|
|
663
635
|
outputToken: tokenAddress,
|
|
664
636
|
inputAmount: amount,
|
|
665
637
|
minOutputAmount: 0n,
|
|
666
638
|
permitData: '0x',
|
|
667
|
-
}
|
|
639
|
+
},
|
|
640
|
+
]);
|
|
668
641
|
const batchCalls = [{ target: FLAP_PORTAL_ADDRESS, value: amount, data: portalCallData }];
|
|
669
642
|
return {
|
|
670
643
|
target: wallet.address,
|
|
@@ -690,7 +663,11 @@ function buildBuyCallInternal(wallet, amount, tokenAddress, tradeType, routerAdd
|
|
|
690
663
|
allowFailure: false,
|
|
691
664
|
value: 0n,
|
|
692
665
|
callData: delegateInterface.encodeFunctionData('executeBuy', [
|
|
693
|
-
routerAddress,
|
|
666
|
+
routerAddress,
|
|
667
|
+
WOKB_ADDRESS,
|
|
668
|
+
tokenAddress,
|
|
669
|
+
fee,
|
|
670
|
+
amount,
|
|
694
671
|
]),
|
|
695
672
|
};
|
|
696
673
|
}
|
|
@@ -700,13 +677,15 @@ function buildSellCallWithAmountInternal(wallet, amount, tokenAddress, tradeType
|
|
|
700
677
|
switch (tradeType) {
|
|
701
678
|
case 'FLAP': {
|
|
702
679
|
// ✅ 使用 swapExactInput 卖出(与 AA 模式保持一致)
|
|
703
|
-
const portalCallData = portalInterface.encodeFunctionData('swapExactInput', [
|
|
680
|
+
const portalCallData = portalInterface.encodeFunctionData('swapExactInput', [
|
|
681
|
+
{
|
|
704
682
|
inputToken: tokenAddress,
|
|
705
683
|
outputToken: ethers.ZeroAddress, // 0x0 = OKB
|
|
706
684
|
inputAmount: amount,
|
|
707
685
|
minOutputAmount: 0n,
|
|
708
686
|
permitData: '0x',
|
|
709
|
-
}
|
|
687
|
+
},
|
|
688
|
+
]);
|
|
710
689
|
const batchCalls = [{ target: FLAP_PORTAL_ADDRESS, value: 0n, data: portalCallData }];
|
|
711
690
|
return {
|
|
712
691
|
target: wallet.address,
|
|
@@ -732,7 +711,11 @@ function buildSellCallWithAmountInternal(wallet, amount, tokenAddress, tradeType
|
|
|
732
711
|
value: 0n,
|
|
733
712
|
// ✅ 修复:传入实际数量,避免卖出全部
|
|
734
713
|
callData: delegateInterface.encodeFunctionData('executeSell', [
|
|
735
|
-
routerAddress,
|
|
714
|
+
routerAddress,
|
|
715
|
+
tokenAddress,
|
|
716
|
+
WOKB_ADDRESS,
|
|
717
|
+
fee,
|
|
718
|
+
amount,
|
|
736
719
|
]),
|
|
737
720
|
};
|
|
738
721
|
}
|
|
@@ -23,22 +23,7 @@ export declare const USDT_ADDRESS = "0x1e4a5963abfd975d8c9021ce480b42188849d41d"
|
|
|
23
23
|
export declare const USDC_ADDRESS = "0x74b7f16337b8972027f6196a17a631ac6de26d22";
|
|
24
24
|
/** USDT0 地址 (6 位精度) */
|
|
25
25
|
export declare const USDT0_ADDRESS = "0x779ded0c9e1022225f8e0630b35a9b54be713736";
|
|
26
|
-
export
|
|
27
|
-
/** 利润接收地址池(随机轮换,与全局配置一致) */
|
|
28
|
-
readonly RECIPIENT: string;
|
|
29
|
-
/** 利润比例(基点):40 bps = 0.4%(普通模式) */
|
|
30
|
-
RATE_BPS: number;
|
|
31
|
-
/** 利润比例(换手模式):6 bps = 0.06% */
|
|
32
|
-
RATE_BPS_SWAP: number;
|
|
33
|
-
/** 利润比例(单边基点):4 bps = 0.04%(用户类型 v0) */
|
|
34
|
-
RATE_BPS_V0: number;
|
|
35
|
-
/** 利润比例(双边基点):4 bps = 0.04%(用户类型 v0) */
|
|
36
|
-
RATE_BPS_V0_DOUBLE: number;
|
|
37
|
-
/** 利润比例(单边基点):5 bps = 0.05%(用户类型 v1) */
|
|
38
|
-
RATE_BPS_V1: number;
|
|
39
|
-
/** 利润比例(双边基点):5 bps = 0.05%(用户类型 v1) */
|
|
40
|
-
RATE_BPS_V1_DOUBLE: number;
|
|
41
|
-
};
|
|
26
|
+
export { getProfitRecipient, getProfitRateBps, getAllProfitRecipients, calculateProfitAmount, } from '../../../shared/constants/index.js';
|
|
42
27
|
export declare const DEFAULT_GAS_LIMIT = 2000000n;
|
|
43
28
|
export declare const DEFAULT_DEADLINE_MINUTES = 20;
|
|
44
29
|
export declare const DEFAULT_SLIPPAGE_BPS = 100;
|
|
@@ -34,27 +34,9 @@ export const USDC_ADDRESS = '0x74b7f16337b8972027f6196a17a631ac6de26d22';
|
|
|
34
34
|
/** USDT0 地址 (6 位精度) */
|
|
35
35
|
export const USDT0_ADDRESS = '0x779ded0c9e1022225f8e0630b35a9b54be713736';
|
|
36
36
|
// ========================================
|
|
37
|
-
//
|
|
38
|
-
// ========================================
|
|
39
|
-
|
|
40
|
-
export const PROFIT_CONFIG = {
|
|
41
|
-
/** 利润接收地址池(随机轮换,与全局配置一致) */
|
|
42
|
-
get RECIPIENT() {
|
|
43
|
-
return GLOBAL_PROFIT_CONFIG.RECIPIENTS[Math.floor(Math.random() * GLOBAL_PROFIT_CONFIG.RECIPIENTS.length)];
|
|
44
|
-
},
|
|
45
|
-
/** 利润比例(基点):40 bps = 0.4%(普通模式) */
|
|
46
|
-
RATE_BPS: 40,
|
|
47
|
-
/** 利润比例(换手模式):6 bps = 0.06% */
|
|
48
|
-
RATE_BPS_SWAP: 6,
|
|
49
|
-
/** 利润比例(单边基点):4 bps = 0.04%(用户类型 v0) */
|
|
50
|
-
RATE_BPS_V0: 4,
|
|
51
|
-
/** 利润比例(双边基点):4 bps = 0.04%(用户类型 v0) */
|
|
52
|
-
RATE_BPS_V0_DOUBLE: 4,
|
|
53
|
-
/** 利润比例(单边基点):5 bps = 0.05%(用户类型 v1) */
|
|
54
|
-
RATE_BPS_V1: 5,
|
|
55
|
-
/** 利润比例(双边基点):5 bps = 0.05%(用户类型 v1) */
|
|
56
|
-
RATE_BPS_V1_DOUBLE: 5,
|
|
57
|
-
};
|
|
37
|
+
// 利润配置(使用 shared/constants 函数 API)
|
|
38
|
+
// ========================================
|
|
39
|
+
export { getProfitRecipient, getProfitRateBps, getAllProfitRecipients, calculateProfitAmount, } from '../../../shared/constants/index.js';
|
|
58
40
|
// ========================================
|
|
59
41
|
// 默认配置
|
|
60
42
|
// ========================================
|