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,10 +1,10 @@
|
|
|
1
|
-
import { ethers, Wallet } from 'ethers';
|
|
1
|
+
import { ethers, Wallet, JsonRpcProvider } from 'ethers';
|
|
2
2
|
import { MerkleClient } from '../../clients/merkle.js';
|
|
3
3
|
import { getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
|
|
4
4
|
import { FLAP_PORTAL_ADDRESSES } from '../constants.js';
|
|
5
|
-
import { ZERO_ADDRESS } from '../../../
|
|
5
|
+
import { ZERO_ADDRESS } from '../../../shared/constants/index.js';
|
|
6
6
|
import { GAS_LIMITS, CHAINS } from '../../constants/index.js';
|
|
7
|
-
import { CHAIN_ID_MAP, PORTAL_ABI, getTxType, getGasPriceConfig, shouldExtractProfit, calculateProfit, calculateBatchProfit, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA } from './config.js';
|
|
7
|
+
import { CHAIN_ID_MAP, PORTAL_ABI, getTxType, getGasPriceConfig, shouldExtractProfit, calculateProfit, calculateBatchProfit, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA, } from './config.js';
|
|
8
8
|
const DEFAULT_GAS_LIMIT = 800000;
|
|
9
9
|
/**
|
|
10
10
|
* 私有购买(单笔)(Merkle 版本)
|
|
@@ -16,8 +16,8 @@ export async function flapPrivateBuyMerkle(params) {
|
|
|
16
16
|
const portalAddr = FLAP_PORTAL_ADDRESSES[chain];
|
|
17
17
|
const originalAmountWei = ethers.parseEther(amountIn);
|
|
18
18
|
// ✅ 利润提取配置
|
|
19
|
-
const extractProfit = shouldExtractProfit(
|
|
20
|
-
const { actualAmountWei, profitWei } = splitBuyAmount(originalAmountWei, extractProfit
|
|
19
|
+
const extractProfit = shouldExtractProfit();
|
|
20
|
+
const { actualAmountWei, profitWei } = splitBuyAmount(originalAmountWei, extractProfit);
|
|
21
21
|
const minAmountOut = parseMinOutput(minOutputAmount);
|
|
22
22
|
const portal = new ethers.Contract(portalAddr, PORTAL_ABI, wallet);
|
|
23
23
|
// ✅ 并行获取 gasPrice、nonce 和构建未签名交易
|
|
@@ -31,7 +31,7 @@ export async function flapPrivateBuyMerkle(params) {
|
|
|
31
31
|
inputAmount: actualAmountWei,
|
|
32
32
|
minOutputAmount: minAmountOut,
|
|
33
33
|
permitData: '0x',
|
|
34
|
-
}, { value: actualAmountWei })
|
|
34
|
+
}, { value: actualAmountWei }),
|
|
35
35
|
]);
|
|
36
36
|
const gasLimit = resolveGasLimit(config.gasLimitMultiplier);
|
|
37
37
|
// ✅ 获取贿赂金额
|
|
@@ -55,7 +55,7 @@ export async function flapPrivateBuyMerkle(params) {
|
|
|
55
55
|
gasPrice,
|
|
56
56
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
57
57
|
chainId,
|
|
58
|
-
type: txType
|
|
58
|
+
type: txType,
|
|
59
59
|
}));
|
|
60
60
|
}
|
|
61
61
|
// 买入交易
|
|
@@ -67,7 +67,7 @@ export async function flapPrivateBuyMerkle(params) {
|
|
|
67
67
|
gasPrice,
|
|
68
68
|
chainId,
|
|
69
69
|
type: txType,
|
|
70
|
-
value: actualAmountWei
|
|
70
|
+
value: actualAmountWei,
|
|
71
71
|
}));
|
|
72
72
|
// ✅ 并行签名完成后按顺序返回
|
|
73
73
|
const signedTxs = await Promise.all(signPromises);
|
|
@@ -83,7 +83,7 @@ export async function flapPrivateBuyMerkle(params) {
|
|
|
83
83
|
gasPrice,
|
|
84
84
|
chainId,
|
|
85
85
|
txType,
|
|
86
|
-
startNonce: profitNonce
|
|
86
|
+
startNonce: profitNonce,
|
|
87
87
|
});
|
|
88
88
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
89
89
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -112,7 +112,7 @@ export async function flapPrivateSellMerkle(params) {
|
|
|
112
112
|
inputAmount: amountWei,
|
|
113
113
|
minOutputAmount: 0n, // ✅ 已移除滑点保护
|
|
114
114
|
permitData: '0x',
|
|
115
|
-
})
|
|
115
|
+
}),
|
|
116
116
|
]);
|
|
117
117
|
const gasLimit = resolveGasLimit(config.gasLimitMultiplier);
|
|
118
118
|
const txType = getTxType(config);
|
|
@@ -120,10 +120,8 @@ export async function flapPrivateSellMerkle(params) {
|
|
|
120
120
|
const bribeAmount = getBribeAmount(config);
|
|
121
121
|
const needBribeTx = bribeAmount > 0n;
|
|
122
122
|
// ✅ 利润计算
|
|
123
|
-
const extractProfit = shouldExtractProfit(
|
|
124
|
-
const { profit: profitWei } = extractProfit && quotedOutput > 0n
|
|
125
|
-
? calculateProfit(quotedOutput, config)
|
|
126
|
-
: { profit: 0n };
|
|
123
|
+
const extractProfit = shouldExtractProfit();
|
|
124
|
+
const { profit: profitWei } = extractProfit && quotedOutput > 0n ? calculateProfit(quotedOutput) : { profit: 0n };
|
|
127
125
|
const needProfitTx = extractProfit && profitWei > 0n;
|
|
128
126
|
// ✅ 分配 nonces:贿赂 → 卖出 → 利润
|
|
129
127
|
let nonceIdx = 0;
|
|
@@ -141,7 +139,7 @@ export async function flapPrivateSellMerkle(params) {
|
|
|
141
139
|
gasPrice,
|
|
142
140
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
143
141
|
chainId,
|
|
144
|
-
type: txType
|
|
142
|
+
type: txType,
|
|
145
143
|
}));
|
|
146
144
|
}
|
|
147
145
|
// 卖出交易
|
|
@@ -152,7 +150,7 @@ export async function flapPrivateSellMerkle(params) {
|
|
|
152
150
|
gasLimit,
|
|
153
151
|
gasPrice,
|
|
154
152
|
chainId,
|
|
155
|
-
type: txType
|
|
153
|
+
type: txType,
|
|
156
154
|
}));
|
|
157
155
|
// ✅ 并行签名完成后按顺序返回
|
|
158
156
|
const signedTxs = await Promise.all(signPromises);
|
|
@@ -168,7 +166,7 @@ export async function flapPrivateSellMerkle(params) {
|
|
|
168
166
|
gasPrice,
|
|
169
167
|
chainId,
|
|
170
168
|
txType,
|
|
171
|
-
startNonce: profitNonce
|
|
169
|
+
startNonce: profitNonce,
|
|
172
170
|
});
|
|
173
171
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
174
172
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -185,15 +183,15 @@ export async function flapBatchPrivateBuyMerkle(params) {
|
|
|
185
183
|
}
|
|
186
184
|
const { chainId, provider } = createMerkleContext(chain, config);
|
|
187
185
|
const portalAddr = FLAP_PORTAL_ADDRESSES[chain];
|
|
188
|
-
const wallets = privateKeys.map(k => new Wallet(k, provider));
|
|
189
|
-
const originalAmountsWei = amountsIn.map(a => ethers.parseEther(a));
|
|
186
|
+
const wallets = privateKeys.map((k) => new Wallet(k, provider));
|
|
187
|
+
const originalAmountsWei = amountsIn.map((a) => ethers.parseEther(a));
|
|
190
188
|
// ✅ 利润提取配置
|
|
191
|
-
const extractProfit = shouldExtractProfit(
|
|
192
|
-
const { totalProfit, remainingAmounts } = calculateBatchProfit(originalAmountsWei
|
|
189
|
+
const extractProfit = shouldExtractProfit();
|
|
190
|
+
const { totalProfit, remainingAmounts } = calculateBatchProfit(originalAmountsWei);
|
|
193
191
|
const actualAmountsWei = remainingAmounts;
|
|
194
192
|
const maxFundsIndex = findMaxIndex(originalAmountsWei);
|
|
195
193
|
const minOuts = resolveBatchMinOutputs(minOutputAmounts, wallets.length);
|
|
196
|
-
const portals = wallets.map(w => new ethers.Contract(portalAddr, PORTAL_ABI, w));
|
|
194
|
+
const portals = wallets.map((w) => new ethers.Contract(portalAddr, PORTAL_ABI, w));
|
|
197
195
|
// ✅ 获取贿赂金额
|
|
198
196
|
const bribeAmount = getBribeAmount(config);
|
|
199
197
|
const needBribeTx = bribeAmount > 0n;
|
|
@@ -202,14 +200,14 @@ export async function flapBatchPrivateBuyMerkle(params) {
|
|
|
202
200
|
const [gasPrice, initialNonces, unsignedList] = await Promise.all([
|
|
203
201
|
getOptimizedGasPrice(provider, getGasPriceConfig(config)),
|
|
204
202
|
// ✅ 使用 pending nonce,避免 xLayer 等链上“已有 pending 交易”导致 nonce too low
|
|
205
|
-
Promise.all(wallets.map(w => provider.getTransactionCount(w.address, 'pending'))),
|
|
203
|
+
Promise.all(wallets.map((w) => provider.getTransactionCount(w.address, 'pending'))),
|
|
206
204
|
Promise.all(portals.map((portal, i) => portal.swapExactInput.populateTransaction({
|
|
207
205
|
inputToken: ZERO_ADDRESS,
|
|
208
206
|
outputToken: tokenAddress,
|
|
209
207
|
inputAmount: actualAmountsWei[i],
|
|
210
208
|
minOutputAmount: minOuts[i],
|
|
211
209
|
permitData: '0x',
|
|
212
|
-
}, { value: actualAmountsWei[i] })))
|
|
210
|
+
}, { value: actualAmountsWei[i] }))),
|
|
213
211
|
]);
|
|
214
212
|
// ✅ 分配 nonces:贿赂(可选) → 买入 → 利润(可选)
|
|
215
213
|
let payerNonceOffset = 0;
|
|
@@ -224,9 +222,7 @@ export async function flapBatchPrivateBuyMerkle(params) {
|
|
|
224
222
|
}
|
|
225
223
|
return n;
|
|
226
224
|
});
|
|
227
|
-
const profitNonce = needProfitTx && maxFundsIndex >= 0
|
|
228
|
-
? initialNonces[maxFundsIndex] + payerNonceOffset + 1
|
|
229
|
-
: undefined;
|
|
225
|
+
const profitNonce = needProfitTx && maxFundsIndex >= 0 ? initialNonces[maxFundsIndex] + payerNonceOffset + 1 : undefined;
|
|
230
226
|
const gasLimit = resolveGasLimit(config.gasLimitMultiplier);
|
|
231
227
|
const gasLimits = new Array(wallets.length).fill(gasLimit);
|
|
232
228
|
const signedTxs = [];
|
|
@@ -239,7 +235,7 @@ export async function flapBatchPrivateBuyMerkle(params) {
|
|
|
239
235
|
gasPrice,
|
|
240
236
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
241
237
|
chainId,
|
|
242
|
-
type: getTxType(config)
|
|
238
|
+
type: getTxType(config),
|
|
243
239
|
});
|
|
244
240
|
signedTxs.push(bribeTx);
|
|
245
241
|
}
|
|
@@ -252,7 +248,7 @@ export async function flapBatchPrivateBuyMerkle(params) {
|
|
|
252
248
|
gasPrice,
|
|
253
249
|
chainId,
|
|
254
250
|
config,
|
|
255
|
-
values: actualAmountsWei
|
|
251
|
+
values: actualAmountsWei,
|
|
256
252
|
});
|
|
257
253
|
signedTxs.push(...signedList);
|
|
258
254
|
// ✅ 利润多跳转账(强制 2 跳中转)
|
|
@@ -267,7 +263,7 @@ export async function flapBatchPrivateBuyMerkle(params) {
|
|
|
267
263
|
gasPrice,
|
|
268
264
|
chainId,
|
|
269
265
|
txType: getTxType(config),
|
|
270
|
-
startNonce: profitNonce
|
|
266
|
+
startNonce: profitNonce,
|
|
271
267
|
});
|
|
272
268
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
273
269
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -278,37 +274,39 @@ export async function flapBatchPrivateBuyMerkle(params) {
|
|
|
278
274
|
* 批量私有卖出(Merkle 版本)
|
|
279
275
|
*/
|
|
280
276
|
export async function flapBatchPrivateSellMerkle(params) {
|
|
281
|
-
const { chain, privateKeys, amounts, tokenAddress,
|
|
277
|
+
const { chain, privateKeys, amounts, tokenAddress, config } = params;
|
|
282
278
|
if (privateKeys.length !== amounts.length) {
|
|
283
279
|
throw new Error('privateKeys and amounts length mismatch');
|
|
284
280
|
}
|
|
285
281
|
const { chainId, provider } = createMerkleContext(chain, config);
|
|
286
282
|
const portalAddr = FLAP_PORTAL_ADDRESSES[chain];
|
|
287
|
-
const wallets = privateKeys.map(k => new Wallet(k, provider));
|
|
288
|
-
const amountsWei = amounts.map(a => ethers.parseUnits(a, 18));
|
|
283
|
+
const wallets = privateKeys.map((k) => new Wallet(k, provider));
|
|
284
|
+
const amountsWei = amounts.map((a) => ethers.parseUnits(a, 18));
|
|
289
285
|
const portal = new ethers.Contract(portalAddr, PORTAL_ABI, provider);
|
|
290
|
-
const portals = wallets.map(w => new ethers.Contract(portalAddr, PORTAL_ABI, w));
|
|
286
|
+
const portals = wallets.map((w) => new ethers.Contract(portalAddr, PORTAL_ABI, w));
|
|
291
287
|
// ✅ 并行获取 gasPrice、所有 nonces、所有报价和构建未签名交易
|
|
292
288
|
const [gasPrice, initialNonces, quotedOutputs, unsignedList] = await Promise.all([
|
|
293
289
|
getOptimizedGasPrice(provider, getGasPriceConfig(config)),
|
|
294
290
|
// ✅ 使用 pending nonce,避免 xLayer 等链上“已有 pending 交易”导致 nonce too low
|
|
295
|
-
Promise.all(wallets.map(w => provider.getTransactionCount(w.address, 'pending'))),
|
|
296
|
-
Promise.all(amountsWei.map(amount => portal.quoteExactInput
|
|
291
|
+
Promise.all(wallets.map((w) => provider.getTransactionCount(w.address, 'pending'))),
|
|
292
|
+
Promise.all(amountsWei.map((amount) => portal.quoteExactInput
|
|
293
|
+
.staticCall({
|
|
297
294
|
inputToken: tokenAddress,
|
|
298
295
|
outputToken: ZERO_ADDRESS,
|
|
299
|
-
inputAmount: amount
|
|
300
|
-
})
|
|
296
|
+
inputAmount: amount,
|
|
297
|
+
})
|
|
298
|
+
.catch(() => 0n))),
|
|
301
299
|
// ✅ 并行构建未签名交易(已移除滑点保护:minOuts 固定为 0)
|
|
302
300
|
Promise.all(portals.map((p, i) => p.swapExactInput.populateTransaction({
|
|
303
301
|
inputToken: tokenAddress,
|
|
304
302
|
outputToken: ZERO_ADDRESS,
|
|
305
303
|
inputAmount: amountsWei[i],
|
|
306
304
|
minOutputAmount: 0n,
|
|
307
|
-
permitData: '0x'
|
|
308
|
-
})))
|
|
305
|
+
permitData: '0x',
|
|
306
|
+
}))),
|
|
309
307
|
]);
|
|
310
|
-
const extractProfit = shouldExtractProfit(
|
|
311
|
-
const { totalProfit, maxRevenueIndex } = summarizeSellProfits(quotedOutputs, extractProfit
|
|
308
|
+
const extractProfit = shouldExtractProfit();
|
|
309
|
+
const { totalProfit, maxRevenueIndex } = summarizeSellProfits(quotedOutputs, extractProfit);
|
|
312
310
|
// ✅ 获取贿赂金额
|
|
313
311
|
const bribeAmount = getBribeAmount(config);
|
|
314
312
|
const needBribeTx = bribeAmount > 0n;
|
|
@@ -326,9 +324,7 @@ export async function flapBatchPrivateSellMerkle(params) {
|
|
|
326
324
|
}
|
|
327
325
|
return n;
|
|
328
326
|
});
|
|
329
|
-
const profitNonce = needProfitTx && maxRevenueIndex >= 0
|
|
330
|
-
? initialNonces[maxRevenueIndex] + payerNonceOffset + 1
|
|
331
|
-
: undefined;
|
|
327
|
+
const profitNonce = needProfitTx && maxRevenueIndex >= 0 ? initialNonces[maxRevenueIndex] + payerNonceOffset + 1 : undefined;
|
|
332
328
|
const gasLimit = resolveGasLimit(config.gasLimitMultiplier);
|
|
333
329
|
const gasLimits = new Array(wallets.length).fill(gasLimit);
|
|
334
330
|
const signedTxs = [];
|
|
@@ -341,7 +337,7 @@ export async function flapBatchPrivateSellMerkle(params) {
|
|
|
341
337
|
gasPrice,
|
|
342
338
|
gasLimit: GAS_LIMITS.BRIBE,
|
|
343
339
|
chainId,
|
|
344
|
-
type: getTxType(config)
|
|
340
|
+
type: getTxType(config),
|
|
345
341
|
});
|
|
346
342
|
signedTxs.push(bribeTx);
|
|
347
343
|
}
|
|
@@ -353,7 +349,7 @@ export async function flapBatchPrivateSellMerkle(params) {
|
|
|
353
349
|
gasLimits,
|
|
354
350
|
gasPrice,
|
|
355
351
|
chainId,
|
|
356
|
-
config
|
|
352
|
+
config,
|
|
357
353
|
});
|
|
358
354
|
signedTxs.push(...signedList);
|
|
359
355
|
// ✅ 利润多跳转账(强制 2 跳中转)
|
|
@@ -368,7 +364,7 @@ export async function flapBatchPrivateSellMerkle(params) {
|
|
|
368
364
|
gasPrice,
|
|
369
365
|
chainId,
|
|
370
366
|
txType: getTxType(config),
|
|
371
|
-
startNonce: profitNonce
|
|
367
|
+
startNonce: profitNonce,
|
|
372
368
|
});
|
|
373
369
|
signedTxs.push(...profitHopResult.signedTransactions);
|
|
374
370
|
profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
|
|
@@ -385,28 +381,27 @@ function createMerkleContext(chain, config) {
|
|
|
385
381
|
if (!config.customRpcUrl) {
|
|
386
382
|
throw new Error(`Chain ${chain} (chainId: ${chainId}) does not support Merkle bundle service. Please provide customRpcUrl.`);
|
|
387
383
|
}
|
|
388
|
-
const { JsonRpcProvider } = require('ethers');
|
|
389
|
-
// ✅ 禁用 ENS: 避免 "network does not support ENS" 错误
|
|
390
384
|
return {
|
|
391
385
|
chainId,
|
|
392
|
-
|
|
386
|
+
// ✅ 禁用 ENS: 避免 "network does not support ENS" 错误
|
|
387
|
+
provider: new JsonRpcProvider(config.customRpcUrl, { chainId, name: chain.toLowerCase(), ensAddress: undefined }),
|
|
393
388
|
};
|
|
394
389
|
}
|
|
395
390
|
const merkle = new MerkleClient({
|
|
396
391
|
apiKey: config.apiKey,
|
|
397
392
|
chainId: chainId, // 类型断言为 Merkle 支持的 chainId
|
|
398
|
-
customRpcUrl: config.customRpcUrl
|
|
393
|
+
customRpcUrl: config.customRpcUrl,
|
|
399
394
|
});
|
|
400
395
|
return {
|
|
401
396
|
chainId,
|
|
402
|
-
provider: merkle.getProvider()
|
|
397
|
+
provider: merkle.getProvider(),
|
|
403
398
|
};
|
|
404
399
|
}
|
|
405
|
-
function splitBuyAmount(amount, extractProfit
|
|
400
|
+
function splitBuyAmount(amount, extractProfit) {
|
|
406
401
|
if (!extractProfit) {
|
|
407
402
|
return { actualAmountWei: amount, profitWei: 0n };
|
|
408
403
|
}
|
|
409
|
-
const { remaining, profit } = calculateProfit(amount
|
|
404
|
+
const { remaining, profit } = calculateProfit(amount);
|
|
410
405
|
return { actualAmountWei: remaining, profitWei: profit };
|
|
411
406
|
}
|
|
412
407
|
function parseMinOutput(value) {
|
|
@@ -419,83 +414,35 @@ function resolveGasLimit(multiplier, defaultGas = DEFAULT_GAS_LIMIT) {
|
|
|
419
414
|
const factor = multiplier ?? 1.0;
|
|
420
415
|
return BigInt(Math.ceil(defaultGas * factor));
|
|
421
416
|
}
|
|
422
|
-
/**
|
|
423
|
-
* 追加利润多跳转账交易(强制 2 跳中转)
|
|
424
|
-
*/
|
|
425
|
-
async function appendSingleProfitTransfer({ extractProfit, profitWei, wallet, baseNonce, provider, gasPrice, chainId, config, signedTxs }) {
|
|
426
|
-
if (!extractProfit || profitWei === 0n) {
|
|
427
|
-
return undefined;
|
|
428
|
-
}
|
|
429
|
-
const profitHopResult = await buildProfitHopTransactions({
|
|
430
|
-
provider,
|
|
431
|
-
payerWallet: wallet,
|
|
432
|
-
profitAmount: profitWei,
|
|
433
|
-
profitRecipient: getProfitRecipient(),
|
|
434
|
-
hopCount: PROFIT_HOP_COUNT,
|
|
435
|
-
gasPrice,
|
|
436
|
-
chainId,
|
|
437
|
-
txType: getTxType(config),
|
|
438
|
-
startNonce: baseNonce + 1
|
|
439
|
-
});
|
|
440
|
-
signedTxs.push(...profitHopResult.signedTransactions);
|
|
441
|
-
return profitHopResult.hopWallets; // ✅ 返回利润多跳钱包
|
|
442
|
-
}
|
|
443
417
|
async function resolveSingleSellOutputs(portal, tokenAddress, amountWei, minOutputAmount) {
|
|
444
418
|
if (minOutputAmount !== undefined) {
|
|
445
|
-
const minOut = typeof minOutputAmount === 'string'
|
|
446
|
-
? ethers.parseEther(minOutputAmount)
|
|
447
|
-
: minOutputAmount;
|
|
419
|
+
const minOut = typeof minOutputAmount === 'string' ? ethers.parseEther(minOutputAmount) : minOutputAmount;
|
|
448
420
|
return {
|
|
449
421
|
quotedOutput: minOut,
|
|
450
|
-
minOut
|
|
422
|
+
minOut,
|
|
451
423
|
};
|
|
452
424
|
}
|
|
453
425
|
try {
|
|
454
426
|
const quotedOutput = await portal.quoteExactInput.staticCall({
|
|
455
427
|
inputToken: tokenAddress,
|
|
456
428
|
outputToken: ZERO_ADDRESS,
|
|
457
|
-
inputAmount: amountWei
|
|
429
|
+
inputAmount: amountWei,
|
|
458
430
|
});
|
|
459
431
|
return {
|
|
460
432
|
quotedOutput,
|
|
461
|
-
minOut: 0n // ✅ 已移除滑点保护:minOut 固定为 0
|
|
433
|
+
minOut: 0n, // ✅ 已移除滑点保护:minOut 固定为 0
|
|
462
434
|
};
|
|
463
435
|
}
|
|
464
436
|
catch {
|
|
465
437
|
return {
|
|
466
438
|
quotedOutput: 0n,
|
|
467
|
-
minOut: 0n
|
|
439
|
+
minOut: 0n,
|
|
468
440
|
};
|
|
469
441
|
}
|
|
470
442
|
}
|
|
471
|
-
/**
|
|
472
|
-
* 追加卖出利润多跳转账交易(强制 2 跳中转)
|
|
473
|
-
*/
|
|
474
|
-
async function appendSingleSellProfitTransfer({ extractProfit, quotedOutput, wallet, baseNonce, provider, gasPrice, chainId, config, signedTxs }) {
|
|
475
|
-
if (!extractProfit || quotedOutput <= 0n) {
|
|
476
|
-
return undefined;
|
|
477
|
-
}
|
|
478
|
-
const { profit } = calculateProfit(quotedOutput, config);
|
|
479
|
-
if (profit === 0n) {
|
|
480
|
-
return undefined;
|
|
481
|
-
}
|
|
482
|
-
const profitHopResult = await buildProfitHopTransactions({
|
|
483
|
-
provider,
|
|
484
|
-
payerWallet: wallet,
|
|
485
|
-
profitAmount: profit,
|
|
486
|
-
profitRecipient: getProfitRecipient(),
|
|
487
|
-
hopCount: PROFIT_HOP_COUNT,
|
|
488
|
-
gasPrice,
|
|
489
|
-
chainId,
|
|
490
|
-
txType: getTxType(config),
|
|
491
|
-
startNonce: baseNonce + 1
|
|
492
|
-
});
|
|
493
|
-
signedTxs.push(...profitHopResult.signedTransactions);
|
|
494
|
-
return profitHopResult.hopWallets; // ✅ 返回利润多跳钱包
|
|
495
|
-
}
|
|
496
443
|
function resolveBatchMinOutputs(minOutputAmounts, walletCount) {
|
|
497
444
|
if (minOutputAmounts && minOutputAmounts.length === walletCount) {
|
|
498
|
-
return minOutputAmounts.map(m => typeof m === 'string' ? ethers.parseUnits(m, 18) : m);
|
|
445
|
+
return minOutputAmounts.map((m) => (typeof m === 'string' ? ethers.parseUnits(m, 18) : m));
|
|
499
446
|
}
|
|
500
447
|
return new Array(walletCount).fill(0n);
|
|
501
448
|
}
|
|
@@ -513,9 +460,9 @@ function findMaxIndex(values) {
|
|
|
513
460
|
}
|
|
514
461
|
return maxIndex;
|
|
515
462
|
}
|
|
516
|
-
async function signBatchTransactions({ unsignedList, wallets, nonces, gasLimits, gasPrice, chainId, config, values }) {
|
|
463
|
+
async function signBatchTransactions({ unsignedList, wallets, nonces, gasLimits, gasPrice, chainId, config, values, }) {
|
|
517
464
|
return await Promise.all(unsignedList.map((unsigned, i) => {
|
|
518
|
-
const value = values ? values[i] : unsigned.value;
|
|
465
|
+
const value = values ? values[i] : (unsigned.value ?? 0n);
|
|
519
466
|
return wallets[i].signTransaction({
|
|
520
467
|
...unsigned,
|
|
521
468
|
from: wallets[i].address,
|
|
@@ -524,11 +471,11 @@ async function signBatchTransactions({ unsignedList, wallets, nonces, gasLimits,
|
|
|
524
471
|
gasPrice,
|
|
525
472
|
chainId,
|
|
526
473
|
type: getTxType(config),
|
|
527
|
-
value
|
|
474
|
+
value,
|
|
528
475
|
});
|
|
529
476
|
}));
|
|
530
477
|
}
|
|
531
|
-
function summarizeSellProfits(quotedOutputs, extractProfit
|
|
478
|
+
function summarizeSellProfits(quotedOutputs, extractProfit) {
|
|
532
479
|
let totalProfit = 0n;
|
|
533
480
|
let maxRevenueIndex = -1;
|
|
534
481
|
let maxRevenue = 0n;
|
|
@@ -536,7 +483,7 @@ function summarizeSellProfits(quotedOutputs, extractProfit, config) {
|
|
|
536
483
|
for (let i = 0; i < quotedOutputs.length; i++) {
|
|
537
484
|
const quoted = quotedOutputs[i];
|
|
538
485
|
if (quoted > 0n) {
|
|
539
|
-
const { profit } = calculateProfit(quoted
|
|
486
|
+
const { profit } = calculateProfit(quoted);
|
|
540
487
|
totalProfit += profit;
|
|
541
488
|
if (quoted > maxRevenue) {
|
|
542
489
|
maxRevenue = quoted;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flap Protocol 内盘捆绑换手(Merkle Bundle)- 先买后卖
|
|
3
|
+
*
|
|
4
|
+
* 功能:钱包B先买入代币 → 钱包A卖出相同数量 → 原子执行
|
|
5
|
+
*/
|
|
6
|
+
import { ethers } from 'ethers';
|
|
7
|
+
import { CommonBundleConfig } from '../../../utils/bundle-helpers.js';
|
|
8
|
+
import { FlapSignConfig } from './config.js';
|
|
9
|
+
import type { GeneratedWallet } from '../../../utils/wallet.js';
|
|
10
|
+
export declare const BSC_PANCAKE_V2_ROUTER: "0x10ED43C718714eb63d5aA57B78B54704E256024E";
|
|
11
|
+
export declare const BSC_WBNB: "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c";
|
|
12
|
+
export declare const MONAD_PANCAKE_V2_ROUTER = "0xb1bc24c34e88f7d43d5923034e3a14b24daacff9";
|
|
13
|
+
export declare const MONAD_WMON: "0x3bd359c1119da7da1d913d1c4d2b7c461115433a";
|
|
14
|
+
export declare const ROUTER_ABI: string[];
|
|
15
|
+
/**
|
|
16
|
+
* 获取 ERC20 代币 → 原生代币的报价
|
|
17
|
+
* @param provider - Provider 实例
|
|
18
|
+
* @param tokenAddress - ERC20 代币地址
|
|
19
|
+
* @param tokenAmount - 代币数量(wei)
|
|
20
|
+
* @param chainId - 链 ID(56=BSC, 143=Monad)
|
|
21
|
+
* @returns 等值的原生代币数量(wei),失败返回 0n
|
|
22
|
+
*/
|
|
23
|
+
export declare function getTokenToNativeQuote(provider: ethers.JsonRpcProvider, tokenAddress: string, tokenAmount: bigint, chainId: number): Promise<bigint>;
|
|
24
|
+
export type FlapChain = 'bsc' | 'xlayer' | 'base';
|
|
25
|
+
/**
|
|
26
|
+
* 获取 Gas Limit(支持 FlapAnyConfig)
|
|
27
|
+
*/
|
|
28
|
+
export declare function getGasLimit(config: FlapSignConfig | CommonBundleConfig, defaultGas?: number): bigint;
|
|
29
|
+
/** 最大 Bundle 签名数 */
|
|
30
|
+
export declare const MAX_BUNDLE_SIGNATURES = 50;
|
|
31
|
+
/** 贿赂交易数 */
|
|
32
|
+
export declare const BRIBE_TX_COUNT = 1;
|
|
33
|
+
/** 利润中转交易数(支付者 1 笔 + 中转钱包 PROFIT_HOP_COUNT 笔 + 最终接收 1 笔) */
|
|
34
|
+
export declare const PROFIT_TX_COUNT: number;
|
|
35
|
+
/** 最大买卖交易数 */
|
|
36
|
+
export declare const MAX_SWAP_TX_COUNT: number;
|
|
37
|
+
export type UserType = 'v0' | 'v1';
|
|
38
|
+
/**
|
|
39
|
+
* 根据 userType 获取每笔交易的利润率
|
|
40
|
+
*/
|
|
41
|
+
export declare function getProfitRatePerTxBps(userType?: UserType): number;
|
|
42
|
+
export interface FlapBuyFirstSignConfig extends FlapSignConfig {
|
|
43
|
+
reserveGasETH?: number;
|
|
44
|
+
skipQuoteOnError?: boolean;
|
|
45
|
+
userType?: UserType;
|
|
46
|
+
}
|
|
47
|
+
export interface FlapBuyFirstConfig extends CommonBundleConfig {
|
|
48
|
+
apiKey: string;
|
|
49
|
+
customRpcUrl?: string;
|
|
50
|
+
bundleBlockOffset?: number;
|
|
51
|
+
reserveGasETH?: number;
|
|
52
|
+
skipQuoteOnError?: boolean;
|
|
53
|
+
waitForConfirmation?: boolean;
|
|
54
|
+
waitTimeoutMs?: number;
|
|
55
|
+
}
|
|
56
|
+
export interface FlapBundleBuyFirstSignParams {
|
|
57
|
+
chain: FlapChain;
|
|
58
|
+
buyerPrivateKey?: string;
|
|
59
|
+
buyerPrivateKeys?: string[];
|
|
60
|
+
sellerPrivateKey?: string;
|
|
61
|
+
sellerPrivateKeys?: string[];
|
|
62
|
+
tokenAddress: string;
|
|
63
|
+
buyerFunds?: string;
|
|
64
|
+
buyerFundsPercentage?: number;
|
|
65
|
+
config: FlapBuyFirstSignConfig;
|
|
66
|
+
quoteToken?: string;
|
|
67
|
+
quoteTokenDecimals?: number;
|
|
68
|
+
buyCount?: number;
|
|
69
|
+
sellCount?: number;
|
|
70
|
+
}
|
|
71
|
+
export interface FlapBundleBuyFirstParams {
|
|
72
|
+
chain: FlapChain;
|
|
73
|
+
buyerPrivateKey: string;
|
|
74
|
+
sellerPrivateKey: string;
|
|
75
|
+
tokenAddress: string;
|
|
76
|
+
buyerFunds?: string;
|
|
77
|
+
buyerFundsPercentage?: number;
|
|
78
|
+
config: FlapBuyFirstConfig;
|
|
79
|
+
}
|
|
80
|
+
/** ✅ Flap BuyFirst 结果(简化版) */
|
|
81
|
+
export type FlapBuyFirstResult = {
|
|
82
|
+
signedTransactions: string[];
|
|
83
|
+
profitHopWallets?: GeneratedWallet[];
|
|
84
|
+
metadata?: {
|
|
85
|
+
buyerAddress: string;
|
|
86
|
+
sellerAddress: string;
|
|
87
|
+
buyAmount: string;
|
|
88
|
+
sellAmount: string;
|
|
89
|
+
profitAmount?: string;
|
|
90
|
+
buyCount?: number;
|
|
91
|
+
sellCount?: number;
|
|
92
|
+
buyAmounts?: string[];
|
|
93
|
+
sellAmounts?: string[];
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
export type ChainContext = {
|
|
97
|
+
chainId: number;
|
|
98
|
+
nativeToken: string;
|
|
99
|
+
portalAddress: string;
|
|
100
|
+
provider: ethers.JsonRpcProvider;
|
|
101
|
+
};
|
|
102
|
+
export type BuyerFundsResult = {
|
|
103
|
+
buyerFundsWei: bigint;
|
|
104
|
+
buyerBalance: bigint;
|
|
105
|
+
};
|
|
106
|
+
export type QuoteResult = {
|
|
107
|
+
quotedToken: bigint;
|
|
108
|
+
sellAmountWei: bigint;
|
|
109
|
+
};
|
|
110
|
+
export type SellerInfo = {
|
|
111
|
+
decimals: number;
|
|
112
|
+
};
|
|
113
|
+
/** ✅ 多笔买卖 nonce 规划 */
|
|
114
|
+
export type MultiNoncePlan = {
|
|
115
|
+
buyerNonces: number[];
|
|
116
|
+
sellerNonces: number[];
|
|
117
|
+
bribeNonce?: number;
|
|
118
|
+
profitNonce?: number;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* 验证买卖笔数
|
|
122
|
+
*/
|
|
123
|
+
export declare function validateSwapCounts(buyCount: number, sellCount: number): void;
|
|
124
|
+
export declare function getChainId(chain: FlapChain): number;
|
|
125
|
+
export declare function getNativeTokenName(chain: FlapChain): string;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flap Protocol 内盘捆绑换手(Merkle Bundle)- 先买后卖
|
|
3
|
+
*
|
|
4
|
+
* 功能:钱包B先买入代币 → 钱包A卖出相同数量 → 原子执行
|
|
5
|
+
*/
|
|
6
|
+
import { Contract } from 'ethers';
|
|
7
|
+
import { PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
|
|
8
|
+
import { ADDRESSES } from '../../../shared/constants/index.js';
|
|
9
|
+
import { CHAINS, getProfitRateBps } from '../../constants/index.js';
|
|
10
|
+
import { V2_ROUTER_QUOTE_ABI } from '../../abis/common.js';
|
|
11
|
+
// ==================== 链常量 ====================
|
|
12
|
+
export const BSC_PANCAKE_V2_ROUTER = ADDRESSES.BSC.PancakeV2Router;
|
|
13
|
+
export const BSC_WBNB = ADDRESSES.BSC.WBNB;
|
|
14
|
+
export const MONAD_PANCAKE_V2_ROUTER = '0xb1bc24c34e88f7d43d5923034e3a14b24daacff9';
|
|
15
|
+
export const MONAD_WMON = ADDRESSES.MONAD.WMON;
|
|
16
|
+
export const ROUTER_ABI = V2_ROUTER_QUOTE_ABI;
|
|
17
|
+
/**
|
|
18
|
+
* 获取 ERC20 代币 → 原生代币的报价
|
|
19
|
+
* @param provider - Provider 实例
|
|
20
|
+
* @param tokenAddress - ERC20 代币地址
|
|
21
|
+
* @param tokenAmount - 代币数量(wei)
|
|
22
|
+
* @param chainId - 链 ID(56=BSC, 143=Monad)
|
|
23
|
+
* @returns 等值的原生代币数量(wei),失败返回 0n
|
|
24
|
+
*/
|
|
25
|
+
export async function getTokenToNativeQuote(provider, tokenAddress, tokenAmount, chainId) {
|
|
26
|
+
if (tokenAmount <= 0n)
|
|
27
|
+
return 0n;
|
|
28
|
+
try {
|
|
29
|
+
if (chainId === CHAINS.BSC.chainId) {
|
|
30
|
+
// BSC: 使用 PancakeSwap V2 Router
|
|
31
|
+
const router = new Contract(BSC_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
|
|
32
|
+
const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, BSC_WBNB]);
|
|
33
|
+
return amounts[1];
|
|
34
|
+
}
|
|
35
|
+
if (chainId === CHAINS.MONAD.chainId) {
|
|
36
|
+
// ✅ Monad: 使用 PancakeSwap V2 Router
|
|
37
|
+
const router = new Contract(MONAD_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
|
|
38
|
+
const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, MONAD_WMON]);
|
|
39
|
+
return amounts[1];
|
|
40
|
+
}
|
|
41
|
+
// ✅ Base (8453) / XLayer (196) 等链暂不支持 V2 报价,返回 0
|
|
42
|
+
return 0n;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// 报价失败返回 0(可能是流动性不足或路径不存在)
|
|
46
|
+
return 0n;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 获取 Gas Limit(支持 FlapAnyConfig)
|
|
51
|
+
*/
|
|
52
|
+
export function getGasLimit(config, defaultGas = 800000) {
|
|
53
|
+
if (config.gasLimit !== undefined) {
|
|
54
|
+
return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
|
|
55
|
+
}
|
|
56
|
+
const multiplier = config.gasLimitMultiplier ?? 1.0;
|
|
57
|
+
return BigInt(Math.ceil(defaultGas * multiplier));
|
|
58
|
+
}
|
|
59
|
+
// ==================== 多笔买卖常量 ====================
|
|
60
|
+
/** 最大 Bundle 签名数 */
|
|
61
|
+
export const MAX_BUNDLE_SIGNATURES = 50;
|
|
62
|
+
/** 贿赂交易数 */
|
|
63
|
+
export const BRIBE_TX_COUNT = 1;
|
|
64
|
+
/** 利润中转交易数(支付者 1 笔 + 中转钱包 PROFIT_HOP_COUNT 笔 + 最终接收 1 笔) */
|
|
65
|
+
export const PROFIT_TX_COUNT = PROFIT_HOP_COUNT + 2; // 2 + 2 = 4
|
|
66
|
+
/** 最大买卖交易数 */
|
|
67
|
+
export const MAX_SWAP_TX_COUNT = MAX_BUNDLE_SIGNATURES - BRIBE_TX_COUNT - PROFIT_TX_COUNT; // 50 - 1 - 4 = 45
|
|
68
|
+
/**
|
|
69
|
+
* 根据 userType 获取每笔交易的利润率
|
|
70
|
+
*/
|
|
71
|
+
export function getProfitRatePerTxBps(userType) {
|
|
72
|
+
if (userType === 'v1') {
|
|
73
|
+
return getProfitRateBps('v1Double');
|
|
74
|
+
}
|
|
75
|
+
return getProfitRateBps('v0Double'); // v0 或默认
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 验证买卖笔数
|
|
79
|
+
*/
|
|
80
|
+
export function validateSwapCounts(buyCount, sellCount) {
|
|
81
|
+
if (buyCount < 1) {
|
|
82
|
+
throw new Error(`买入笔数必须至少为 1,当前为 ${buyCount}`);
|
|
83
|
+
}
|
|
84
|
+
if (sellCount < 1) {
|
|
85
|
+
throw new Error(`卖出笔数必须至少为 1,当前为 ${sellCount}`);
|
|
86
|
+
}
|
|
87
|
+
const totalSwaps = buyCount + sellCount;
|
|
88
|
+
if (totalSwaps > MAX_SWAP_TX_COUNT) {
|
|
89
|
+
throw new Error(`买卖笔数总和 (${totalSwaps}) 超出限制 (${MAX_SWAP_TX_COUNT}),` +
|
|
90
|
+
`最大签名数为 ${MAX_BUNDLE_SIGNATURES}(${BRIBE_TX_COUNT} 贿赂 + ${PROFIT_TX_COUNT} 利润 + ${MAX_SWAP_TX_COUNT} 买卖)`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function getChainId(chain) {
|
|
94
|
+
switch (chain) {
|
|
95
|
+
case 'bsc':
|
|
96
|
+
return 56;
|
|
97
|
+
case 'xlayer':
|
|
98
|
+
return 196;
|
|
99
|
+
case 'base':
|
|
100
|
+
return 8453;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export function getNativeTokenName(chain) {
|
|
104
|
+
switch (chain) {
|
|
105
|
+
case 'bsc':
|
|
106
|
+
return 'BNB';
|
|
107
|
+
case 'xlayer':
|
|
108
|
+
return 'OKB';
|
|
109
|
+
case 'base':
|
|
110
|
+
return 'ETH';
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// 使用公共工具的 getGasLimit,移除本地重复实现
|