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
package/dist/utils/erc20.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Contract, Wallet, JsonRpcProvider, Interface, parseUnits } from 'ethers';
|
|
2
|
-
import { ADDRESSES, ZERO_ADDRESS, getMulticall3Address } from '
|
|
2
|
+
import { ADDRESSES, ZERO_ADDRESS, getMulticall3Address } from '../shared/constants/index.js';
|
|
3
3
|
import { NonceManager } from './bundle-helpers.js';
|
|
4
|
-
import { ERC20_ABI, MULTICALL3_ABI } from '../
|
|
4
|
+
import { ERC20_ABI, MULTICALL3_ABI } from '../abis/common.js';
|
|
5
|
+
import { getErrorMessageFromUnknown } from '../shared/foundation/index.js';
|
|
5
6
|
// ============================================================================
|
|
6
7
|
// ✅ Max approval(与 BSC 策略一致:阈值判断,避免频繁重复授权)
|
|
7
8
|
// ============================================================================
|
|
@@ -22,20 +23,15 @@ async function validateContractAddress(provider, address, label) {
|
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
25
|
catch (error) {
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
const msg = getErrorMessageFromUnknown(error);
|
|
27
|
+
if (msg.includes('无效或未部署')) {
|
|
28
|
+
throw error instanceof Error ? error : new Error(msg);
|
|
27
29
|
}
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (errMsg.includes('bad address checksum') || errCode === 'INVALID_ARGUMENT') {
|
|
32
|
-
const formatErr = new Error(`❌ ${label} 地址格式错误,请使用正确的 checksum 格式: ${address}`);
|
|
33
|
-
Object.assign(formatErr, { cause: error });
|
|
34
|
-
throw formatErr;
|
|
30
|
+
const code = error !== null && typeof error === 'object' && 'code' in error ? error.code : undefined;
|
|
31
|
+
if (msg.includes('bad address checksum') || code === 'INVALID_ARGUMENT') {
|
|
32
|
+
throw new Error(`❌ ${label} 地址格式错误,请使用正确的 checksum 格式: ${address}`);
|
|
35
33
|
}
|
|
36
|
-
|
|
37
|
-
Object.assign(verifyErr, { cause: error });
|
|
38
|
-
throw verifyErr;
|
|
34
|
+
throw new Error(`❌ 无法验证 ${label} 地址 ${address}: ${msg}`);
|
|
39
35
|
}
|
|
40
36
|
}
|
|
41
37
|
/**
|
|
@@ -55,10 +51,7 @@ async function ensureAllowance(rpcUrl, privateKey, token, owner, spender, requir
|
|
|
55
51
|
current = await erc20.allowance(owner, spender);
|
|
56
52
|
}
|
|
57
53
|
catch (error) {
|
|
58
|
-
|
|
59
|
-
const allowErr = new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${msg2}`);
|
|
60
|
-
Object.assign(allowErr, { cause: error });
|
|
61
|
-
throw allowErr;
|
|
54
|
+
throw new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${getErrorMessageFromUnknown(error)}`);
|
|
62
55
|
}
|
|
63
56
|
if (current >= required) {
|
|
64
57
|
return {
|
|
@@ -76,30 +69,17 @@ async function ensureAllowance(rpcUrl, privateKey, token, owner, spender, requir
|
|
|
76
69
|
txReceipt: receipt,
|
|
77
70
|
};
|
|
78
71
|
}
|
|
79
|
-
|
|
80
|
-
* 检查代币授权状态 - Four.meme V1(只读,不发送交易)
|
|
81
|
-
* @returns 是否已授权足够的额度
|
|
82
|
-
*/
|
|
83
|
-
export async function checkSellApprovalV1(chain, rpcUrl, token, owner, amount) {
|
|
84
|
-
const proxyAddresses = {
|
|
85
|
-
BSC: ADDRESSES.BSC.TokenManagerV1, // FourMeme 代理合约 V1 (BSC)
|
|
86
|
-
BASE: ADDRESSES.BASE.TokenManagerHelper3, // FourMeme 代理合约 (BASE)
|
|
87
|
-
ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3, // FourMeme 代理合约 (ARBITRUM)
|
|
88
|
-
};
|
|
72
|
+
async function checkAllowanceForSpender(rpcUrl, token, owner, amount, spender, spenderLabel) {
|
|
89
73
|
const provider = new JsonRpcProvider(rpcUrl);
|
|
90
|
-
// ✅ 验证 token 和代理合约地址
|
|
91
74
|
await validateContractAddress(provider, token, 'Token');
|
|
92
|
-
await validateContractAddress(provider,
|
|
75
|
+
await validateContractAddress(provider, spender, spenderLabel);
|
|
93
76
|
const erc20 = new Contract(token, ERC20_ABI, provider);
|
|
94
77
|
let current;
|
|
95
78
|
try {
|
|
96
|
-
current = await erc20.allowance(owner,
|
|
79
|
+
current = await erc20.allowance(owner, spender);
|
|
97
80
|
}
|
|
98
81
|
catch (error) {
|
|
99
|
-
|
|
100
|
-
const e = new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${msg}`);
|
|
101
|
-
Object.assign(e, { cause: error });
|
|
102
|
-
throw e;
|
|
82
|
+
throw new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${getErrorMessageFromUnknown(error)}`);
|
|
103
83
|
}
|
|
104
84
|
return {
|
|
105
85
|
isApproved: current >= amount,
|
|
@@ -107,64 +87,42 @@ export async function checkSellApprovalV1(chain, rpcUrl, token, owner, amount) {
|
|
|
107
87
|
requiredAllowance: amount,
|
|
108
88
|
};
|
|
109
89
|
}
|
|
90
|
+
async function checkSellApprovalForProxy(_chain, rpcUrl, token, owner, amount, proxyAddress, proxyLabel) {
|
|
91
|
+
return checkAllowanceForSpender(rpcUrl, token, owner, amount, proxyAddress, proxyLabel);
|
|
92
|
+
}
|
|
93
|
+
const FOUR_MEME_V1_PROXY = {
|
|
94
|
+
BSC: ADDRESSES.BSC.TokenManagerV1,
|
|
95
|
+
BASE: ADDRESSES.BASE.TokenManagerHelper3,
|
|
96
|
+
ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3,
|
|
97
|
+
};
|
|
98
|
+
const FOUR_MEME_V2_PROXY = {
|
|
99
|
+
BSC: ADDRESSES.BSC.TokenManagerV2,
|
|
100
|
+
BASE: ADDRESSES.BASE.TokenManagerHelper3,
|
|
101
|
+
ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3,
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* 检查代币授权状态 - Four.meme V1(只读,不发送交易)
|
|
105
|
+
*/
|
|
106
|
+
export async function checkSellApprovalV1(chain, rpcUrl, token, owner, amount) {
|
|
107
|
+
return checkSellApprovalForProxy(chain, rpcUrl, token, owner, amount, FOUR_MEME_V1_PROXY[chain], `Four.meme V1 Proxy (${chain})`);
|
|
108
|
+
}
|
|
110
109
|
/**
|
|
111
110
|
* 确保代币已授权给 Four.meme V1 代理合约
|
|
112
|
-
* 用于 Four.meme V1 代币的卖出操作
|
|
113
|
-
* @returns 授权结果,包含是否已授权、当前额度、交易回执等信息
|
|
114
111
|
*/
|
|
115
112
|
export async function ensureSellApprovalV1(chain, rpcUrl, privateKey, token, owner, amount) {
|
|
116
|
-
|
|
117
|
-
const proxyAddresses = {
|
|
118
|
-
BSC: ADDRESSES.BSC.TokenManagerV1, // FourMeme 代理合约 V1 (BSC)
|
|
119
|
-
BASE: ADDRESSES.BASE.TokenManagerHelper3, // FourMeme 代理合约 (BASE)
|
|
120
|
-
ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3, // FourMeme 代理合约 (ARBITRUM)
|
|
121
|
-
};
|
|
122
|
-
return await ensureAllowance(rpcUrl, privateKey, token, owner, proxyAddresses[chain], amount);
|
|
113
|
+
return ensureAllowance(rpcUrl, privateKey, token, owner, FOUR_MEME_V1_PROXY[chain], amount);
|
|
123
114
|
}
|
|
124
115
|
/**
|
|
125
116
|
* 检查代币授权状态 - Four.meme V2(只读,不发送交易)
|
|
126
|
-
* @returns 是否已授权足够的额度
|
|
127
117
|
*/
|
|
128
118
|
export async function checkSellApprovalV2(chain, rpcUrl, token, owner, amount) {
|
|
129
|
-
|
|
130
|
-
BSC: ADDRESSES.BSC.TokenManagerV2, // FourMeme 代理合约 V2 (BSC)
|
|
131
|
-
BASE: ADDRESSES.BASE.TokenManagerHelper3, // FourMeme 代理合约 (BASE)
|
|
132
|
-
ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3, // FourMeme 代理合约 (ARBITRUM)
|
|
133
|
-
};
|
|
134
|
-
const provider = new JsonRpcProvider(rpcUrl);
|
|
135
|
-
// ✅ 验证 token 和代理合约地址
|
|
136
|
-
await validateContractAddress(provider, token, 'Token');
|
|
137
|
-
await validateContractAddress(provider, proxyAddresses[chain], `Four.meme V2 Proxy (${chain})`);
|
|
138
|
-
const erc20 = new Contract(token, ERC20_ABI, provider);
|
|
139
|
-
let current;
|
|
140
|
-
try {
|
|
141
|
-
current = await erc20.allowance(owner, proxyAddresses[chain]);
|
|
142
|
-
}
|
|
143
|
-
catch (error) {
|
|
144
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
145
|
-
const e = new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${msg}`);
|
|
146
|
-
Object.assign(e, { cause: error });
|
|
147
|
-
throw e;
|
|
148
|
-
}
|
|
149
|
-
return {
|
|
150
|
-
isApproved: current >= amount,
|
|
151
|
-
currentAllowance: current,
|
|
152
|
-
requiredAllowance: amount,
|
|
153
|
-
};
|
|
119
|
+
return checkSellApprovalForProxy(chain, rpcUrl, token, owner, amount, FOUR_MEME_V2_PROXY[chain], `Four.meme V2 Proxy (${chain})`);
|
|
154
120
|
}
|
|
155
121
|
/**
|
|
156
122
|
* 确保代币已授权给 Four.meme V2 代理合约
|
|
157
|
-
* 用于 Four.meme V2 代币的卖出操作
|
|
158
|
-
* @returns 授权结果,包含是否已授权、当前额度、交易回执等信息
|
|
159
123
|
*/
|
|
160
124
|
export async function ensureSellApprovalV2(chain, rpcUrl, privateKey, token, owner, amount) {
|
|
161
|
-
|
|
162
|
-
const proxyAddresses = {
|
|
163
|
-
BSC: ADDRESSES.BSC.TokenManagerV2, // FourMeme 代理合约 V2 (BSC)
|
|
164
|
-
BASE: ADDRESSES.BASE.TokenManagerHelper3, // FourMeme 代理合约 (BASE)
|
|
165
|
-
ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3, // FourMeme 代理合约 (ARBITRUM)
|
|
166
|
-
};
|
|
167
|
-
return await ensureAllowance(rpcUrl, privateKey, token, owner, proxyAddresses[chain], amount);
|
|
125
|
+
return ensureAllowance(rpcUrl, privateKey, token, owner, FOUR_MEME_V2_PROXY[chain], amount);
|
|
168
126
|
}
|
|
169
127
|
/**
|
|
170
128
|
* 检查代币授权状态 - Four.meme(通用,默认使用 V2)
|
|
@@ -186,32 +144,13 @@ export async function ensureSellApproval(chain, rpcUrl, privateKey, token, owner
|
|
|
186
144
|
*/
|
|
187
145
|
export async function checkFlapSellApproval(chain, rpcUrl, token, owner, amount) {
|
|
188
146
|
const proxyAddresses = {
|
|
189
|
-
BSC: ADDRESSES.BSC.FlapPortal,
|
|
190
|
-
BASE: ADDRESSES.BASE.FlapPortal,
|
|
191
|
-
XLAYER: ADDRESSES.XLAYER.FlapPortal,
|
|
192
|
-
MORPH: ADDRESSES.MORPH.FlapPortal,
|
|
193
|
-
MONAD: ADDRESSES.MONAD.FlapPortal,
|
|
194
|
-
};
|
|
195
|
-
const provider = new JsonRpcProvider(rpcUrl);
|
|
196
|
-
// ✅ 验证 token 和代理合约地址
|
|
197
|
-
await validateContractAddress(provider, token, 'Token');
|
|
198
|
-
await validateContractAddress(provider, proxyAddresses[chain], `Flap Portal (${chain})`);
|
|
199
|
-
const erc20 = new Contract(token, ERC20_ABI, provider);
|
|
200
|
-
let current;
|
|
201
|
-
try {
|
|
202
|
-
current = await erc20.allowance(owner, proxyAddresses[chain]);
|
|
203
|
-
}
|
|
204
|
-
catch (error) {
|
|
205
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
206
|
-
const e = new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${msg}`);
|
|
207
|
-
Object.assign(e, { cause: error });
|
|
208
|
-
throw e;
|
|
209
|
-
}
|
|
210
|
-
return {
|
|
211
|
-
isApproved: current >= amount,
|
|
212
|
-
currentAllowance: current,
|
|
213
|
-
requiredAllowance: amount,
|
|
147
|
+
BSC: ADDRESSES.BSC.FlapPortal,
|
|
148
|
+
BASE: ADDRESSES.BASE.FlapPortal,
|
|
149
|
+
XLAYER: ADDRESSES.XLAYER.FlapPortal,
|
|
150
|
+
MORPH: ADDRESSES.MORPH.FlapPortal,
|
|
151
|
+
MONAD: ADDRESSES.MONAD.FlapPortal,
|
|
214
152
|
};
|
|
153
|
+
return checkAllowanceForSpender(rpcUrl, token, owner, amount, proxyAddresses[chain], `Flap Portal (${chain})`);
|
|
215
154
|
}
|
|
216
155
|
/**
|
|
217
156
|
* 确保代币已授权给 Flap Protocol 代理合约
|
|
@@ -263,7 +202,7 @@ export async function checkFlapSellApprovalBatch(chain, rpcUrl, token, owners, r
|
|
|
263
202
|
// ✅ 并行验证 token 和代理合约地址
|
|
264
203
|
await Promise.all([
|
|
265
204
|
validateContractAddress(provider, token, 'Token'),
|
|
266
|
-
validateContractAddress(provider, proxyAddresses[chain], `Flap Portal (${chain})`)
|
|
205
|
+
validateContractAddress(provider, proxyAddresses[chain], `Flap Portal (${chain})`),
|
|
267
206
|
]);
|
|
268
207
|
// ✅ 使用 batchCheckAllowances 批量查询(Multicall3)
|
|
269
208
|
const allowances = await batchCheckAllowances(provider, token, owners, proxyAddresses[chain]);
|
|
@@ -271,7 +210,7 @@ export async function checkFlapSellApprovalBatch(chain, rpcUrl, token, owners, r
|
|
|
271
210
|
owner,
|
|
272
211
|
isApproved: allowances[i] >= required,
|
|
273
212
|
currentAllowance: allowances[i],
|
|
274
|
-
requiredAllowance: required
|
|
213
|
+
requiredAllowance: required,
|
|
275
214
|
}));
|
|
276
215
|
}
|
|
277
216
|
/**
|
|
@@ -288,15 +227,15 @@ export async function batchCheckAllowances(provider, tokenAddress, owners, spend
|
|
|
288
227
|
const multicall3 = new Contract(multicall3Address, MULTICALL3_ABI, provider);
|
|
289
228
|
// 编码 allowance(owner, spender) 调用数据
|
|
290
229
|
const erc20Interface = new Contract(tokenAddress, ERC20_ABI, provider).interface;
|
|
291
|
-
const calls = owners.map(owner => ({
|
|
230
|
+
const calls = owners.map((owner) => ({
|
|
292
231
|
target: tokenAddress,
|
|
293
232
|
allowFailure: true,
|
|
294
|
-
callData: erc20Interface.encodeFunctionData('allowance', [owner, spender])
|
|
233
|
+
callData: erc20Interface.encodeFunctionData('allowance', [owner, spender]),
|
|
295
234
|
}));
|
|
296
235
|
// 批量调用
|
|
297
236
|
const results = await multicall3.aggregate3(calls);
|
|
298
237
|
// 解析结果
|
|
299
|
-
return results.map((result
|
|
238
|
+
return results.map((result) => {
|
|
300
239
|
if (!result.success) {
|
|
301
240
|
return 0n;
|
|
302
241
|
}
|
|
@@ -408,10 +347,7 @@ export async function checkAllowanceRaw(rpcUrl, tokenAddress, ownerAddress, spen
|
|
|
408
347
|
return allowance;
|
|
409
348
|
}
|
|
410
349
|
catch (error) {
|
|
411
|
-
|
|
412
|
-
const qErr = new Error(`❌ 查询授权额度失败: ${qMsg}`);
|
|
413
|
-
Object.assign(qErr, { cause: error });
|
|
414
|
-
throw qErr;
|
|
350
|
+
throw new Error(`❌ 查询授权额度失败: ${getErrorMessageFromUnknown(error)}`);
|
|
415
351
|
}
|
|
416
352
|
}
|
|
417
353
|
/**
|
|
@@ -459,18 +395,15 @@ export async function approveTokenRaw(rpcUrl, privateKey, tokenAddress, spenderA
|
|
|
459
395
|
currentAllowance = await erc20.allowance(ownerAddress, normalizedSpender);
|
|
460
396
|
}
|
|
461
397
|
catch (error) {
|
|
462
|
-
|
|
463
|
-
const qErr = new Error(`❌ 查询授权额度失败: ${qMsg}`);
|
|
464
|
-
Object.assign(qErr, { cause: error });
|
|
465
|
-
throw qErr;
|
|
398
|
+
throw new Error(`❌ 查询授权额度失败: ${getErrorMessageFromUnknown(error)}`);
|
|
466
399
|
}
|
|
467
400
|
// 如果已经授权足够,直接返回
|
|
468
401
|
// ✅ max 授权:使用阈值判断,避免每次消耗一点 allowance 都重新授权
|
|
469
|
-
if (isMax ?
|
|
402
|
+
if (isMax ? currentAllowance >= MAX_APPROVAL_THRESHOLD : currentAllowance >= requiredAmount) {
|
|
470
403
|
return {
|
|
471
404
|
alreadyApproved: true,
|
|
472
405
|
currentAllowance,
|
|
473
|
-
requiredAllowance: requiredAmount
|
|
406
|
+
requiredAllowance: requiredAmount,
|
|
474
407
|
};
|
|
475
408
|
}
|
|
476
409
|
// 发送授权交易
|
|
@@ -481,14 +414,11 @@ export async function approveTokenRaw(rpcUrl, privateKey, tokenAddress, spenderA
|
|
|
481
414
|
alreadyApproved: false,
|
|
482
415
|
currentAllowance,
|
|
483
416
|
requiredAllowance: requiredAmount,
|
|
484
|
-
txReceipt: receipt
|
|
417
|
+
txReceipt: receipt,
|
|
485
418
|
};
|
|
486
419
|
}
|
|
487
420
|
catch (error) {
|
|
488
|
-
|
|
489
|
-
const aErr = new Error(`❌ 授权交易失败: ${aMsg}`);
|
|
490
|
-
Object.assign(aErr, { cause: error });
|
|
491
|
-
throw aErr;
|
|
421
|
+
throw new Error(`❌ 授权交易失败: ${getErrorMessageFromUnknown(error)}`);
|
|
492
422
|
}
|
|
493
423
|
}
|
|
494
424
|
/**
|
|
@@ -519,7 +449,7 @@ export async function checkAllowanceBatchRaw(rpcUrl, tokenAddress, ownerAddresse
|
|
|
519
449
|
const provider = new JsonRpcProvider(rpcUrl);
|
|
520
450
|
// ✅ 规范化地址(转为小写,避免 checksum 错误)
|
|
521
451
|
const normalizedToken = tokenAddress.toLowerCase();
|
|
522
|
-
const normalizedOwners = ownerAddresses.map(addr => addr.toLowerCase());
|
|
452
|
+
const normalizedOwners = ownerAddresses.map((addr) => addr.toLowerCase());
|
|
523
453
|
const normalizedSpender = spenderAddress.toLowerCase();
|
|
524
454
|
// 验证地址
|
|
525
455
|
await validateContractAddress(provider, normalizedToken, 'Token');
|
|
@@ -527,12 +457,26 @@ export async function checkAllowanceBatchRaw(rpcUrl, tokenAddress, ownerAddresse
|
|
|
527
457
|
return batchCheckAllowances(provider, normalizedToken, normalizedOwners, normalizedSpender);
|
|
528
458
|
}
|
|
529
459
|
export async function approveTokenBatch(params) {
|
|
530
|
-
const { chain, platform, rpcUrl, privateKeys, tokenAddress, amounts, signOnly, gasPriceGwei, gasLimit, chainId, skipValidation } = params;
|
|
460
|
+
const { chain, platform, rpcUrl, privateKeys, tokenAddress, amounts, signOnly, gasPriceGwei, gasLimit, chainId, skipValidation, } = params;
|
|
531
461
|
const spenderAddress = resolveSpenderAddress(chain, platform);
|
|
532
|
-
|
|
462
|
+
const rawParams = {
|
|
463
|
+
rpcUrl,
|
|
464
|
+
privateKeys,
|
|
465
|
+
tokenAddress,
|
|
466
|
+
spenderAddress,
|
|
467
|
+
amounts,
|
|
468
|
+
gasPriceGwei,
|
|
469
|
+
gasLimit,
|
|
470
|
+
chainId,
|
|
471
|
+
skipValidation,
|
|
472
|
+
};
|
|
473
|
+
if (signOnly === true) {
|
|
474
|
+
return approveTokenBatchRaw({ ...rawParams, signOnly: true });
|
|
475
|
+
}
|
|
476
|
+
return approveTokenBatchRaw({ ...rawParams, signOnly: false });
|
|
533
477
|
}
|
|
534
478
|
export async function approveTokenBatchRaw(params) {
|
|
535
|
-
const { rpcUrl, privateKeys, tokenAddress, spenderAddress, amounts, signOnly, gasPriceGwei, gasLimit, chainId = 56, nonceManager: externalNonceManager, skipValidation } = params;
|
|
479
|
+
const { rpcUrl, privateKeys, tokenAddress, spenderAddress, amounts, signOnly, gasPriceGwei, gasLimit, chainId = 56, nonceManager: externalNonceManager, skipValidation, } = params;
|
|
536
480
|
if (privateKeys.length === 0 || amounts.length !== privateKeys.length) {
|
|
537
481
|
throw new Error('❌ 私钥数量和授权数量必须匹配');
|
|
538
482
|
}
|
|
@@ -546,12 +490,10 @@ export async function approveTokenBatchRaw(params) {
|
|
|
546
490
|
await validateContractAddress(provider, normalizedSpender, 'Spender');
|
|
547
491
|
}
|
|
548
492
|
// ✅ 优化:批量创建钱包和合约实例
|
|
549
|
-
const wallets = privateKeys.map(key => new Wallet(key, provider));
|
|
550
|
-
const ownerAddresses = wallets.map(w => w.address);
|
|
551
|
-
const isMaxApprovals = amounts.map(a => a === 'max');
|
|
552
|
-
const requiredAmounts = amounts.map(amount => amount === 'max'
|
|
553
|
-
? MAX_UINT256
|
|
554
|
-
: amount);
|
|
493
|
+
const wallets = privateKeys.map((key) => new Wallet(key, provider));
|
|
494
|
+
const ownerAddresses = wallets.map((w) => w.address);
|
|
495
|
+
const isMaxApprovals = amounts.map((a) => a === 'max');
|
|
496
|
+
const requiredAmounts = amounts.map((amount) => (amount === 'max' ? MAX_UINT256 : amount));
|
|
555
497
|
// ==================== signOnly=true:只签名不提交 ====================
|
|
556
498
|
if (signOnly) {
|
|
557
499
|
// ✅ 使用 NonceManager 管理 nonce(和买卖交易一样)
|
|
@@ -560,7 +502,9 @@ export async function approveTokenBatchRaw(params) {
|
|
|
560
502
|
const [currentAllowances, nonces, fetchedGasPrice] = await Promise.all([
|
|
561
503
|
batchCheckAllowances(provider, normalizedToken, ownerAddresses, normalizedSpender),
|
|
562
504
|
nonceManager.getNextNoncesForWallets(wallets), // ✅ 使用 NonceManager 批量获取 nonce
|
|
563
|
-
gasPriceGwei
|
|
505
|
+
gasPriceGwei
|
|
506
|
+
? Promise.resolve(parseUnits(gasPriceGwei.toString(), 'gwei'))
|
|
507
|
+
: provider.getFeeData().then((fee) => fee.gasPrice || parseUnits('3', 'gwei')),
|
|
564
508
|
]);
|
|
565
509
|
const finalGasPrice = fetchedGasPrice;
|
|
566
510
|
const finalGasLimit = BigInt(gasLimit || 100000);
|
|
@@ -574,13 +518,13 @@ export async function approveTokenBatchRaw(params) {
|
|
|
574
518
|
const isMax = isMaxApprovals[i];
|
|
575
519
|
// 如果已经授权足够,跳过
|
|
576
520
|
// ✅ max 授权:使用阈值判断(与 BSC 一致)
|
|
577
|
-
if (isMax ?
|
|
521
|
+
if (isMax ? currentAllowance >= MAX_APPROVAL_THRESHOLD : currentAllowance >= requiredAmount) {
|
|
578
522
|
return {
|
|
579
523
|
owner: ownerAddress,
|
|
580
524
|
alreadyApproved: true,
|
|
581
525
|
currentAllowance,
|
|
582
526
|
requiredAllowance: requiredAmount,
|
|
583
|
-
signedTx: undefined
|
|
527
|
+
signedTx: undefined,
|
|
584
528
|
};
|
|
585
529
|
}
|
|
586
530
|
// 构建并签名交易
|
|
@@ -592,28 +536,26 @@ export async function approveTokenBatchRaw(params) {
|
|
|
592
536
|
gasLimit: finalGasLimit,
|
|
593
537
|
gasPrice: finalGasPrice,
|
|
594
538
|
chainId,
|
|
595
|
-
type: 0 // Legacy 交易
|
|
539
|
+
type: 0, // Legacy 交易
|
|
596
540
|
});
|
|
597
541
|
return {
|
|
598
542
|
owner: ownerAddress,
|
|
599
543
|
alreadyApproved: false,
|
|
600
544
|
currentAllowance,
|
|
601
545
|
requiredAllowance: requiredAmount,
|
|
602
|
-
signedTx
|
|
546
|
+
signedTx,
|
|
603
547
|
};
|
|
604
548
|
});
|
|
605
549
|
const results = await Promise.all(signPromises);
|
|
606
550
|
// ✅ 提取所有签名交易(过滤掉已授权的)
|
|
607
|
-
const signedTransactions = results
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
const alreadyApprovedCount = results.filter(r => r.alreadyApproved).length;
|
|
611
|
-
const needApproveCount = results.filter(r => !r.alreadyApproved).length;
|
|
551
|
+
const signedTransactions = results.filter((r) => !r.alreadyApproved && r.signedTx).map((r) => r.signedTx);
|
|
552
|
+
const alreadyApprovedCount = results.filter((r) => r.alreadyApproved).length;
|
|
553
|
+
const needApproveCount = results.filter((r) => !r.alreadyApproved).length;
|
|
612
554
|
return {
|
|
613
555
|
signedTransactions,
|
|
614
556
|
results,
|
|
615
557
|
needApproveCount,
|
|
616
|
-
alreadyApprovedCount
|
|
558
|
+
alreadyApprovedCount,
|
|
617
559
|
};
|
|
618
560
|
}
|
|
619
561
|
// ==================== signOnly=false(默认):直接发送交易 ====================
|
|
@@ -628,12 +570,12 @@ export async function approveTokenBatchRaw(params) {
|
|
|
628
570
|
try {
|
|
629
571
|
// 如果已经授权足够,跳过
|
|
630
572
|
// ✅ max 授权:使用阈值判断(与 BSC 一致)
|
|
631
|
-
if (isMax ?
|
|
573
|
+
if (isMax ? currentAllowance >= MAX_APPROVAL_THRESHOLD : currentAllowance >= requiredAmount) {
|
|
632
574
|
return {
|
|
633
575
|
owner: ownerAddress,
|
|
634
576
|
alreadyApproved: true,
|
|
635
577
|
currentAllowance,
|
|
636
|
-
requiredAllowance: requiredAmount
|
|
578
|
+
requiredAllowance: requiredAmount,
|
|
637
579
|
};
|
|
638
580
|
}
|
|
639
581
|
// 发送授权交易
|
|
@@ -645,29 +587,28 @@ export async function approveTokenBatchRaw(params) {
|
|
|
645
587
|
alreadyApproved: false,
|
|
646
588
|
currentAllowance,
|
|
647
589
|
requiredAllowance: requiredAmount,
|
|
648
|
-
txHash: receipt.hash
|
|
590
|
+
txHash: receipt.hash,
|
|
649
591
|
};
|
|
650
592
|
}
|
|
651
593
|
catch (error) {
|
|
652
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
653
594
|
return {
|
|
654
595
|
owner: ownerAddress,
|
|
655
596
|
alreadyApproved: false,
|
|
656
597
|
currentAllowance,
|
|
657
598
|
requiredAllowance: requiredAmount,
|
|
658
|
-
error:
|
|
599
|
+
error: getErrorMessageFromUnknown(error),
|
|
659
600
|
};
|
|
660
601
|
}
|
|
661
602
|
});
|
|
662
603
|
// ✅ 优化:并行等待所有授权交易完成
|
|
663
604
|
const results = await Promise.all(approvalPromises);
|
|
664
605
|
// 统计结果
|
|
665
|
-
const approvedCount = results.filter(r => !r.alreadyApproved && !r.error).length;
|
|
666
|
-
const errorCount = results.filter(r => r.error).length;
|
|
606
|
+
const approvedCount = results.filter((r) => !r.alreadyApproved && !r.error).length;
|
|
607
|
+
const errorCount = results.filter((r) => r.error).length;
|
|
667
608
|
// ✅ 只要没有错误,就算成功(包括所有钱包都已授权的情况)
|
|
668
609
|
return {
|
|
669
610
|
success: errorCount === 0,
|
|
670
611
|
approvedCount,
|
|
671
|
-
results
|
|
612
|
+
results,
|
|
672
613
|
};
|
|
673
614
|
}
|
package/dist/utils/errors.d.ts
CHANGED
|
@@ -1,28 +1,16 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 统一 SDK 错误处理
|
|
3
|
-
*
|
|
4
|
-
* 提供 SdkError 类和 parseSdkError 函数,作为所有错误类型的统一入口。
|
|
5
|
-
* parseFourError 作为向后兼容的包装器。
|
|
6
|
-
*/
|
|
7
1
|
import { SdkErrorCode } from '../types/errors.js';
|
|
2
|
+
import type { FourErrorCode } from './types/errors.js';
|
|
8
3
|
export { SdkErrorCode } from '../types/errors.js';
|
|
9
|
-
|
|
10
|
-
* SDK 统一错误类
|
|
11
|
-
*/
|
|
12
|
-
export declare class SdkError extends Error {
|
|
13
|
-
readonly code: SdkErrorCode;
|
|
14
|
-
readonly cause?: unknown | undefined;
|
|
15
|
-
constructor(code: SdkErrorCode, message: string, cause?: unknown | undefined);
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* 统一错误解析入口
|
|
19
|
-
*/
|
|
20
|
-
export declare function parseSdkError(error: unknown): SdkError;
|
|
21
|
-
export type FourErrorCode = 'GW' | 'ZA' | 'TO' | 'Slippage' | 'More BNB' | 'FR' | 'SO';
|
|
22
|
-
/**
|
|
23
|
-
* @deprecated 使用 parseSdkError 替代
|
|
24
|
-
*/
|
|
4
|
+
export type { FourErrorCode } from './types/errors.js';
|
|
25
5
|
export declare function parseFourError(err: unknown): {
|
|
26
6
|
code?: FourErrorCode;
|
|
27
7
|
message: string;
|
|
28
8
|
};
|
|
9
|
+
/** 统一结构化错误(含错误码,便于上层分支处理) */
|
|
10
|
+
export declare class SdkError extends Error {
|
|
11
|
+
readonly code: SdkErrorCode;
|
|
12
|
+
cause?: unknown;
|
|
13
|
+
constructor(code: SdkErrorCode, message: string, cause?: unknown);
|
|
14
|
+
}
|
|
15
|
+
/** 将任意异常归一为 SdkError */
|
|
16
|
+
export declare function parseSdkError(err: unknown): SdkError;
|
package/dist/utils/errors.js
CHANGED
|
@@ -1,78 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
* 统一 SDK 错误处理
|
|
3
|
-
*
|
|
4
|
-
* 提供 SdkError 类和 parseSdkError 函数,作为所有错误类型的统一入口。
|
|
5
|
-
* parseFourError 作为向后兼容的包装器。
|
|
6
|
-
*/
|
|
1
|
+
import { getErrorMessageFromUnknown } from '../shared/foundation/normalize-unknown.js';
|
|
7
2
|
import { SdkErrorCode } from '../types/errors.js';
|
|
8
3
|
export { SdkErrorCode } from '../types/errors.js';
|
|
9
|
-
|
|
10
|
-
* SDK 统一错误类
|
|
11
|
-
*/
|
|
12
|
-
export class SdkError extends Error {
|
|
13
|
-
constructor(code, message, cause) {
|
|
14
|
-
super(message);
|
|
15
|
-
this.code = code;
|
|
16
|
-
this.cause = cause;
|
|
17
|
-
this.name = 'SdkError';
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* 统一错误解析入口
|
|
22
|
-
*/
|
|
23
|
-
export function parseSdkError(error) {
|
|
24
|
-
if (error instanceof SdkError)
|
|
25
|
-
return error;
|
|
26
|
-
const errObj = error;
|
|
27
|
-
const rawMsg = errObj?.reason ||
|
|
28
|
-
errObj?.message ||
|
|
29
|
-
errObj?.data?.message ||
|
|
30
|
-
String(error ?? '');
|
|
31
|
-
const msg = String(rawMsg);
|
|
32
|
-
const msgLower = msg.toLowerCase();
|
|
33
|
-
// ---- Four.meme 错误模式 ----
|
|
34
|
-
if (msg.includes('GW'))
|
|
35
|
-
return new SdkError(SdkErrorCode.FOUR_GWEI_PRECISION, 'Amount precision is not aligned to GWEI', error);
|
|
36
|
-
if (msg.includes('ZA'))
|
|
37
|
-
return new SdkError(SdkErrorCode.FOUR_ZERO_ADDRESS, "The 'to' address should not be address(0)", error);
|
|
38
|
-
if (msg.includes('TO'))
|
|
39
|
-
return new SdkError(SdkErrorCode.INVALID_TOKEN, 'The to address should not be set to the PancakePair address', error);
|
|
40
|
-
if (msg.includes('Slippage'))
|
|
41
|
-
return new SdkError(SdkErrorCode.FOUR_SLIPPAGE, 'Slippage exceeded limit', error);
|
|
42
|
-
if (msg.includes('More BNB'))
|
|
43
|
-
return new SdkError(SdkErrorCode.FOUR_INSUFFICIENT_FUNDS, 'Insufficient BNB sent in msg.value', error);
|
|
44
|
-
if (msg.includes('FR'))
|
|
45
|
-
return new SdkError(SdkErrorCode.FOUR_FEE_TOO_HIGH, 'Fee rate exceeds 5%', error);
|
|
46
|
-
if (msg.includes('SO'))
|
|
47
|
-
return new SdkError(SdkErrorCode.FOUR_ORDER_TOO_SMALL, 'Order amount is too small', error);
|
|
48
|
-
// ---- Flap Protocol 错误模式 ----
|
|
49
|
-
if (msgLower.includes('token already exists') || msgLower.includes('already created'))
|
|
50
|
-
return new SdkError(SdkErrorCode.TOKEN_ALREADY_EXISTS, 'Token already exists', error);
|
|
51
|
-
if (msgLower.includes('token not found') || msgLower.includes('invalid token'))
|
|
52
|
-
return new SdkError(SdkErrorCode.TOKEN_NOT_FOUND, 'Token not found', error);
|
|
53
|
-
if (msgLower.includes('not tradable') || msgLower.includes('trading disabled'))
|
|
54
|
-
return new SdkError(SdkErrorCode.TOKEN_NOT_TRADABLE, 'Token is not tradable', error);
|
|
55
|
-
if (msgLower.includes('already on dex') || msgLower.includes('already migrated'))
|
|
56
|
-
return new SdkError(SdkErrorCode.ALREADY_ON_DEX, 'Token already on DEX', error);
|
|
57
|
-
if (msgLower.includes('insufficient balance') || msgLower.includes('insufficient funds'))
|
|
58
|
-
return new SdkError(SdkErrorCode.INSUFFICIENT_BALANCE, 'Insufficient balance', error);
|
|
59
|
-
if (msgLower.includes('slippage') || msgLower.includes('min output'))
|
|
60
|
-
return new SdkError(SdkErrorCode.SLIPPAGE_EXCEEDED, 'Slippage exceeded', error);
|
|
61
|
-
if (msgLower.includes('invalid amount') || msgLower.includes('amount too small'))
|
|
62
|
-
return new SdkError(SdkErrorCode.INVALID_AMOUNT, 'Invalid amount', error);
|
|
63
|
-
if (msgLower.includes('invalid quote token') || msgLower.includes('quote token not supported'))
|
|
64
|
-
return new SdkError(SdkErrorCode.INVALID_QUOTE_TOKEN, 'Invalid quote token', error);
|
|
65
|
-
if (msgLower.includes('tax rate') && msgLower.includes('too high'))
|
|
66
|
-
return new SdkError(SdkErrorCode.TAX_RATE_TOO_HIGH, 'Tax rate too high', error);
|
|
67
|
-
if (msgLower.includes('permit expired') || msgLower.includes('deadline'))
|
|
68
|
-
return new SdkError(SdkErrorCode.PERMIT_EXPIRED, 'Permit expired', error);
|
|
69
|
-
if (msgLower.includes('permit') && (msgLower.includes('invalid') || msgLower.includes('signature')))
|
|
70
|
-
return new SdkError(SdkErrorCode.PERMIT_INVALID, 'Invalid permit signature', error);
|
|
71
|
-
if (msgLower.includes('user rejected') || msgLower.includes('user denied'))
|
|
72
|
-
return new SdkError(SdkErrorCode.TRANSACTION_FAILED, 'Transaction was rejected by user', error);
|
|
73
|
-
return new SdkError(SdkErrorCode.UNKNOWN_ERROR, msg.slice(0, 300), error);
|
|
74
|
-
}
|
|
75
|
-
const FOUR_MESSAGES = {
|
|
4
|
+
const MESSAGES = {
|
|
76
5
|
GW: 'Amount precision is not aligned to GWEI',
|
|
77
6
|
ZA: "The 'to' address should not be address(0)",
|
|
78
7
|
TO: 'The to address should not be set to the PancakePair address',
|
|
@@ -81,13 +10,66 @@ const FOUR_MESSAGES = {
|
|
|
81
10
|
FR: 'Fee rate exceeds 5%',
|
|
82
11
|
SO: 'Order amount is too small',
|
|
83
12
|
};
|
|
84
|
-
/**
|
|
85
|
-
* @deprecated 使用 parseSdkError 替代
|
|
86
|
-
*/
|
|
87
13
|
export function parseFourError(err) {
|
|
88
|
-
const raw =
|
|
89
|
-
const found = Object.keys(
|
|
14
|
+
const raw = getErrorMessageFromUnknown(err);
|
|
15
|
+
const found = Object.keys(MESSAGES).find((k) => raw.includes(k));
|
|
90
16
|
if (found)
|
|
91
|
-
return { code: found, message:
|
|
17
|
+
return { code: found, message: MESSAGES[found] };
|
|
92
18
|
return { message: raw };
|
|
93
19
|
}
|
|
20
|
+
function mapFourCodeToSdk(code) {
|
|
21
|
+
switch (code) {
|
|
22
|
+
case 'GW':
|
|
23
|
+
return SdkErrorCode.FOUR_GWEI_PRECISION;
|
|
24
|
+
case 'ZA':
|
|
25
|
+
return SdkErrorCode.FOUR_ZERO_ADDRESS;
|
|
26
|
+
case 'TO':
|
|
27
|
+
return SdkErrorCode.FOUR_ZERO_ADDRESS;
|
|
28
|
+
case 'Slippage':
|
|
29
|
+
return SdkErrorCode.FOUR_SLIPPAGE;
|
|
30
|
+
case 'More BNB':
|
|
31
|
+
return SdkErrorCode.FOUR_INSUFFICIENT_FUNDS;
|
|
32
|
+
case 'FR':
|
|
33
|
+
return SdkErrorCode.FOUR_FEE_TOO_HIGH;
|
|
34
|
+
case 'SO':
|
|
35
|
+
return SdkErrorCode.FOUR_ORDER_TOO_SMALL;
|
|
36
|
+
default:
|
|
37
|
+
return SdkErrorCode.UNKNOWN_ERROR;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** 统一结构化错误(含错误码,便于上层分支处理) */
|
|
41
|
+
export class SdkError extends Error {
|
|
42
|
+
code;
|
|
43
|
+
constructor(code, message, cause) {
|
|
44
|
+
super(message, cause !== undefined ? { cause } : undefined);
|
|
45
|
+
this.name = 'SdkError';
|
|
46
|
+
this.code = code;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** 将任意异常归一为 SdkError */
|
|
50
|
+
export function parseSdkError(err) {
|
|
51
|
+
if (err instanceof SdkError)
|
|
52
|
+
return err;
|
|
53
|
+
if (err === null || err === undefined) {
|
|
54
|
+
return new SdkError(SdkErrorCode.UNKNOWN_ERROR, 'Unknown error');
|
|
55
|
+
}
|
|
56
|
+
const raw = getErrorMessageFromUnknown(err);
|
|
57
|
+
const rawLower = raw.toLowerCase();
|
|
58
|
+
const four = parseFourError(err);
|
|
59
|
+
if (four.code) {
|
|
60
|
+
return new SdkError(mapFourCodeToSdk(four.code), four.message);
|
|
61
|
+
}
|
|
62
|
+
if (rawLower.includes('token already exists')) {
|
|
63
|
+
return new SdkError(SdkErrorCode.TOKEN_ALREADY_EXISTS, raw);
|
|
64
|
+
}
|
|
65
|
+
if (rawLower.includes('slippage')) {
|
|
66
|
+
return new SdkError(SdkErrorCode.SLIPPAGE_EXCEEDED, raw);
|
|
67
|
+
}
|
|
68
|
+
if (rawLower.includes('insufficient funds') || rawLower.includes('insufficient balance')) {
|
|
69
|
+
return new SdkError(SdkErrorCode.INSUFFICIENT_BALANCE, raw);
|
|
70
|
+
}
|
|
71
|
+
if (rawLower.includes('permit expired')) {
|
|
72
|
+
return new SdkError(SdkErrorCode.PERMIT_EXPIRED, raw);
|
|
73
|
+
}
|
|
74
|
+
return new SdkError(SdkErrorCode.UNKNOWN_ERROR, raw);
|
|
75
|
+
}
|