four-flap-meme-sdk 2.0.0 → 2.2.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/dist/__tests__/subpath-exports.test.js +64 -0
- package/dist/chains/bsc/iro.d.ts +5 -0
- package/dist/chains/bsc/iro.js +4 -0
- package/dist/chains/eni/flat-aliases.d.ts +10 -0
- package/dist/chains/eni/flat-aliases.js +8 -0
- package/dist/chains/eni/index.d.ts +1 -0
- package/dist/chains/eni/index.js +1 -0
- package/dist/chains/index.d.ts +13 -0
- package/dist/chains/index.js +13 -0
- package/dist/chains/xlayer/eip7702/flat-aliases.d.ts +13 -0
- package/dist/chains/xlayer/eip7702/flat-aliases.js +10 -0
- package/dist/chains/xlayer/eip7702/index.d.ts +1 -0
- package/dist/chains/xlayer/eip7702/index.js +1 -0
- package/dist/chains/xlayer/index.d.ts +3 -2
- package/dist/chains/xlayer/index.js +4 -7
- package/dist/flap/index.d.ts +10 -0
- package/dist/flap/index.js +8 -0
- package/dist/merkle/index.d.ts +12 -0
- package/dist/merkle/index.js +11 -0
- package/dist/shared/constants/index.d.ts +2 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/vanity/index.d.ts +5 -0
- package/dist/vanity/index.js +5 -0
- package/package.json +93 -2
- package/dist/chains/bsc/four/disperse.d.ts +0 -12
- package/dist/chains/bsc/four/disperse.js +0 -470
- package/dist/chains/bsc/four/pairwise.d.ts +0 -7
- package/dist/chains/bsc/four/pairwise.js +0 -308
- package/dist/chains/bsc/four/submit/blockrazor.d.ts +0 -18
- package/dist/chains/bsc/four/submit/blockrazor.js +0 -86
- package/dist/chains/bsc/four/submit/direct.d.ts +0 -66
- package/dist/chains/bsc/four/submit/direct.js +0 -452
- package/dist/chains/bsc/four/submit/helpers.d.ts +0 -18
- package/dist/chains/bsc/four/submit/helpers.js +0 -57
- package/dist/chains/bsc/four/submit/index.d.ts +0 -12
- package/dist/chains/bsc/four/submit/index.js +0 -11
- package/dist/chains/bsc/four/submit/merkle.d.ts +0 -18
- package/dist/chains/bsc/four/submit/merkle.js +0 -74
- package/dist/chains/bsc/four/submit/types.d.ts +0 -143
- package/dist/chains/bsc/four/swap/index.d.ts +0 -32
- package/dist/chains/bsc/four/swap/index.js +0 -829
- package/dist/chains/bsc/four/swap/types.d.ts +0 -70
- package/dist/chains/bsc/four/swap/types.js +0 -1
- package/dist/chains/bsc/four/sweep.d.ts +0 -13
- package/dist/chains/bsc/four/sweep.js +0 -788
- package/dist/chains/bsc/four/utils/index.d.ts +0 -20
- package/dist/chains/bsc/four/utils/index.js +0 -1558
- package/dist/chains/bsc/four/utils/types.d.ts +0 -1
- package/dist/chains/bsc/four/utils/types.js +0 -1
- package/dist/chains/bsc/pancake/bundle-buy-first/index.d.ts +0 -8
- package/dist/chains/bsc/pancake/bundle-buy-first/index.js +0 -907
- package/dist/chains/bsc/pancake/bundle-buy-first/types.d.ts +0 -73
- package/dist/chains/bsc/pancake/bundle-buy-first/types.js +0 -1
- package/dist/chains/bsc/pancake/bundle-swap/helpers.d.ts +0 -102
- package/dist/chains/bsc/pancake/bundle-swap/helpers.js +0 -572
- package/dist/chains/bsc/pancake/bundle-swap/index.d.ts +0 -50
- package/dist/chains/bsc/pancake/bundle-swap/index.js +0 -1066
- package/dist/chains/bsc/pancake/bundle-swap/types.d.ts +0 -202
- package/dist/chains/bsc/pancake/bundle-swap/types.js +0 -3
- package/dist/chains/xlayer/eip7702/bundle-swap/index.d.ts +0 -72
- package/dist/chains/xlayer/eip7702/bundle-swap/index.js +0 -921
- package/dist/chains/xlayer/eip7702/bundle-swap/types.d.ts +0 -65
- package/dist/chains/xlayer/eip7702/bundle-swap/types.js +0 -1
- package/dist/chains/xlayer/eip7702/multi-hop-transfer/index.d.ts +0 -128
- package/dist/chains/xlayer/eip7702/multi-hop-transfer/index.js +0 -857
- package/dist/chains/xlayer/eip7702/multi-hop-transfer/types.d.ts +0 -85
- package/dist/chains/xlayer/eip7702/multi-hop-transfer/types.js +0 -1
- package/dist/chains/xlayer/eip7702/volume/index.d.ts +0 -96
- package/dist/chains/xlayer/eip7702/volume/index.js +0 -793
- package/dist/chains/xlayer/eip7702/volume/types.d.ts +0 -124
- package/dist/chains/xlayer/eip7702/volume/types.js +0 -1
- package/dist/chains/xlayer/eoa/types-core.d.ts +0 -363
- package/dist/chains/xlayer/eoa/types-core.js +0 -53
- package/dist/chains/xlayer/eoa/types-create.d.ts +0 -413
- package/dist/chains/xlayer/eoa/types-create.js +0 -9
- package/dist/chains/xlayer/eoa/types-volume.d.ts +0 -209
- package/dist/chains/xlayer/eoa/types-volume.js +0 -13
- package/dist/dex/direct-router/index.d.ts +0 -70
- package/dist/dex/direct-router/index.js +0 -1410
- package/dist/dex/direct-router/types.d.ts +0 -81
- package/dist/dex/direct-router/types.js +0 -1
- package/dist/shared/abis/TaxToken.json +0 -969
- package/dist/shared/abis/TokenManager.json +0 -836
- package/dist/shared/abis/TokenManager2.json +0 -136
- package/dist/shared/abis/TokenManagerHelper3.json +0 -993
- package/dist/shared/abis 2/TaxToken.json +0 -105
- package/dist/shared/abis 2/TokenManager.json +0 -836
- package/dist/shared/abis 2/TokenManager2.json +0 -60
- package/dist/shared/abis 2/TokenManagerHelper3.json +0 -993
- package/dist/shared/abis 2/common.d.ts +0 -85
- package/dist/shared/abis 2/common.js +0 -254
- package/dist/shared/abis 2/index.d.ts +0 -8
- package/dist/shared/abis 2/index.js +0 -8
- package/dist/shared/clients 2/blockrazor.d.ts +0 -314
- package/dist/shared/clients 2/blockrazor.js +0 -596
- package/dist/shared/clients 2/club48.d.ts +0 -154
- package/dist/shared/clients 2/club48.js +0 -331
- package/dist/shared/clients 2/emitservice.d.ts +0 -47
- package/dist/shared/clients 2/emitservice.js +0 -44
- package/dist/shared/clients 2/four.d.ts +0 -132
- package/dist/shared/clients 2/four.js +0 -281
- package/dist/shared/clients 2/merkle.d.ts +0 -210
- package/dist/shared/clients 2/merkle.js +0 -400
- package/dist/shared/flap/__tests__/curve.test.d.ts +0 -1
- package/dist/shared/flap/__tests__/curve.test.js +0 -85
- package/dist/shared/flap/portal/index.d.ts +0 -12
- package/dist/shared/flap/portal/index.js +0 -11
- package/dist/shared/flap/portal/portal.d.ts +0 -47
- package/dist/shared/flap/portal/portal.js +0 -218
- package/dist/shared/flap/portal/types.d.ts +0 -227
- package/dist/shared/flap/portal/types.js +0 -80
- package/dist/shared/flap/portal/writer.d.ts +0 -121
- package/dist/shared/flap/portal/writer.js +0 -265
- package/dist/shared/flap/portal-bundle-merkle/core/index.d.ts +0 -18
- package/dist/shared/flap/portal-bundle-merkle/core/index.js +0 -938
- package/dist/shared/flap/portal-bundle-merkle/core/types.d.ts +0 -1
- package/dist/shared/flap/portal-bundle-merkle/core/types.js +0 -1
- package/dist/shared/flap/portal-bundle-merkle/swap/index.d.ts +0 -42
- package/dist/shared/flap/portal-bundle-merkle/swap/index.js +0 -1448
- package/dist/shared/flap/portal-bundle-merkle/swap/types.d.ts +0 -84
- package/dist/shared/flap/portal-bundle-merkle/swap/types.js +0 -1
- package/dist/shared/flap/portal-bundle-merkle/utils/index.d.ts +0 -17
- package/dist/shared/flap/portal-bundle-merkle/utils/index.js +0 -1024
- package/dist/shared/flap/portal-bundle-merkle/utils/types.d.ts +0 -16
- package/dist/shared/flap/portal-bundle-merkle/utils/types.js +0 -1
- package/dist/shared/flap/portal-bundle-merkle/utils-helpers.d.ts +0 -100
- package/dist/shared/flap/portal-bundle-merkle/utils-helpers.js +0 -133
- package/dist/shared/flap 2/__tests__/curve.test.d.ts +0 -1
- package/dist/shared/flap 2/__tests__/curve.test.js +0 -85
- package/dist/shared/flap 2/abi.d.ts +0 -4
- package/dist/shared/flap 2/abi.js +0 -4
- package/dist/shared/flap 2/constants.d.ts +0 -128
- package/dist/shared/flap 2/constants.js +0 -143
- package/dist/shared/flap 2/curve.d.ts +0 -33
- package/dist/shared/flap 2/curve.js +0 -84
- package/dist/shared/flap 2/errors.d.ts +0 -37
- package/dist/shared/flap 2/errors.js +0 -114
- package/dist/shared/flap 2/index.d.ts +0 -22
- package/dist/shared/flap 2/index.js +0 -33
- package/dist/shared/flap 2/ipfs.d.ts +0 -21
- package/dist/shared/flap 2/ipfs.js +0 -38
- package/dist/shared/flap 2/meta.d.ts +0 -30
- package/dist/shared/flap 2/meta.js +0 -195
- package/dist/shared/flap 2/permit.d.ts +0 -16
- package/dist/shared/flap 2/permit.js +0 -67
- package/dist/shared/flap 2/pinata.d.ts +0 -40
- package/dist/shared/flap 2/pinata.js +0 -106
- package/dist/shared/flap 2/portal-bundle-merkle/config.d.ts +0 -79
- package/dist/shared/flap 2/portal-bundle-merkle/config.js +0 -133
- package/dist/shared/flap 2/portal-bundle-merkle/core.d.ts +0 -18
- package/dist/shared/flap 2/portal-bundle-merkle/core.js +0 -938
- package/dist/shared/flap 2/portal-bundle-merkle/create-to-dex.d.ts +0 -125
- package/dist/shared/flap 2/portal-bundle-merkle/create-to-dex.js +0 -665
- package/dist/shared/flap 2/portal-bundle-merkle/curve-to-dex.d.ts +0 -88
- package/dist/shared/flap 2/portal-bundle-merkle/curve-to-dex.js +0 -446
- package/dist/shared/flap 2/portal-bundle-merkle/index.d.ts +0 -14
- package/dist/shared/flap 2/portal-bundle-merkle/index.js +0 -26
- package/dist/shared/flap 2/portal-bundle-merkle/pancake-proxy.d.ts +0 -28
- package/dist/shared/flap 2/portal-bundle-merkle/pancake-proxy.js +0 -701
- package/dist/shared/flap 2/portal-bundle-merkle/private.d.ts +0 -17
- package/dist/shared/flap 2/portal-bundle-merkle/private.js +0 -549
- package/dist/shared/flap 2/portal-bundle-merkle/swap-buy-first.d.ts +0 -65
- package/dist/shared/flap 2/portal-bundle-merkle/swap-buy-first.js +0 -831
- package/dist/shared/flap 2/portal-bundle-merkle/swap.d.ts +0 -201
- package/dist/shared/flap 2/portal-bundle-merkle/swap.js +0 -1359
- package/dist/shared/flap 2/portal-bundle-merkle/types.d.ts +0 -358
- package/dist/shared/flap 2/portal-bundle-merkle/types.js +0 -1
- package/dist/shared/flap 2/portal-bundle-merkle/utils.d.ts +0 -89
- package/dist/shared/flap 2/portal-bundle-merkle/utils.js +0 -963
- package/dist/shared/flap 2/portal-bundle.d.ts +0 -119
- package/dist/shared/flap 2/portal-bundle.js +0 -584
- package/dist/shared/flap 2/portal.d.ts +0 -392
- package/dist/shared/flap 2/portal.js +0 -559
- package/dist/shared/flap 2/vanity.d.ts +0 -48
- package/dist/shared/flap 2/vanity.js +0 -110
- package/dist/shared/flap 2/vault.d.ts +0 -240
- package/dist/shared/flap 2/vault.js +0 -366
- package/dist/shared/four 2/index.d.ts +0 -7
- package/dist/shared/four 2/index.js +0 -22
- package/dist/shared/four 2/tax-token.d.ts +0 -176
- package/dist/shared/four 2/tax-token.js +0 -302
- package/dist/shared/index 2.js +0 -10
- package/dist/shared/index.d 2.ts +0 -10
- package/dist/types/distribute.d.ts +0 -72
- package/dist/types/distribute.js +0 -1
- package/dist/types 2/errors.d.ts +0 -27
- package/dist/types 2/errors.js +0 -34
- package/dist/utils/__tests__/errors.test.d.ts +0 -1
- package/dist/utils/__tests__/errors.test.js +0 -76
- package/dist/utils/airdrop-sweep-types.d.ts +0 -1
- package/dist/utils/airdrop-sweep-types.js +0 -1
- package/dist/utils/erc20/index.d.ts +0 -242
- package/dist/utils/erc20/index.js +0 -645
- package/dist/utils/erc20/types.d.ts +0 -77
- package/dist/utils/erc20/types.js +0 -1
- package/dist/utils/erc20-types.d.ts +0 -1
- package/dist/utils/erc20-types.js +0 -1
- package/dist/utils/holders-maker/helpers.d.ts +0 -43
- package/dist/utils/holders-maker/helpers.js +0 -371
- package/dist/utils/holders-maker/index.d.ts +0 -26
- package/dist/utils/holders-maker/index.js +0 -218
- package/dist/utils/holders-maker/types.d.ts +0 -72
- package/dist/utils/holders-maker/types.js +0 -4
- package/dist/utils/holders-maker-types.d.ts +0 -1
- package/dist/utils/holders-maker-types.js +0 -1
- package/dist/utils/lp-inspect/index.d.ts +0 -44
- package/dist/utils/lp-inspect/index.js +0 -937
- package/dist/utils/lp-inspect/types.d.ts +0 -100
- package/dist/utils/lp-inspect/types.js +0 -1
- package/dist/utils/lp-inspect-types.d.ts +0 -1
- package/dist/utils/lp-inspect-types.js +0 -1
- package/dist/utils/private-sale-types.d.ts +0 -1
- package/dist/utils/private-sale-types.js +0 -1
- package/dist/utils/quote-helpers/index.d.ts +0 -107
- package/dist/utils/quote-helpers/index.js +0 -346
- package/dist/utils/quote-helpers/types.d.ts +0 -16
- package/dist/utils/quote-helpers/types.js +0 -1
- package/dist/utils/quote-helpers-types.d.ts +0 -1
- package/dist/utils/quote-helpers-types.js +0 -1
- /package/dist/{chains/bsc/four/submit/types.js → __tests__/subpath-exports.test.d.ts} +0 -0
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
export type NetworkCode = 'BSC';
|
|
2
|
-
export type FourConfig = {
|
|
3
|
-
/**
|
|
4
|
-
* Four.meme API 基础 URL
|
|
5
|
-
*
|
|
6
|
-
* 默认使用 Cloudflare Workers 代理(已配置 CORS,可在浏览器中直接使用)
|
|
7
|
-
* 如需自定义,可传入自己的代理地址
|
|
8
|
-
*/
|
|
9
|
-
baseUrl?: string;
|
|
10
|
-
/**
|
|
11
|
-
* 图片上传备用代理 URL 列表
|
|
12
|
-
*
|
|
13
|
-
* 当主 baseUrl 触发 IP 限流(code -1038)时,自动依次尝试备用端点。
|
|
14
|
-
* 每个 URL 格式同 baseUrl,例如 'https://bscfourapi2.emit.tools'
|
|
15
|
-
*/
|
|
16
|
-
uploadFallbackUrls?: string[];
|
|
17
|
-
};
|
|
18
|
-
export type GenerateNonceReq = {
|
|
19
|
-
accountAddress: string;
|
|
20
|
-
verifyType: 'LOGIN';
|
|
21
|
-
networkCode: NetworkCode;
|
|
22
|
-
};
|
|
23
|
-
export type LoginReq = {
|
|
24
|
-
region: 'WEB';
|
|
25
|
-
langType: 'EN' | 'ZH';
|
|
26
|
-
loginIp?: string;
|
|
27
|
-
inviteCode?: string;
|
|
28
|
-
verifyInfo: {
|
|
29
|
-
address: string;
|
|
30
|
-
networkCode: NetworkCode;
|
|
31
|
-
signature: string;
|
|
32
|
-
verifyType: 'LOGIN';
|
|
33
|
-
};
|
|
34
|
-
walletName: 'MetaMask' | string;
|
|
35
|
-
};
|
|
36
|
-
/**
|
|
37
|
-
* Four.meme 税币配置参数
|
|
38
|
-
* - feeRate: 交易费率(固定选项:1, 3, 5, 10,代表 1%, 3%, 5%, 10%)
|
|
39
|
-
* - burnRate: 销毁比例(百分比,如 20 = 20%)
|
|
40
|
-
* - divideRate: 分红比例(百分比,如 30 = 30%)
|
|
41
|
-
* - liquidityRate: 流动性池比例(百分比,如 40 = 40%)
|
|
42
|
-
* - recipientRate: 创始人/接收者比例(百分比,如 10 = 10%)
|
|
43
|
-
* - recipientAddress: 接收者地址(不使用时传空字符串 "")
|
|
44
|
-
* - minSharing: 最低持仓分红门槛(ether 单位,须满足 d × 10^n, n≥5, 1≤d≤9)
|
|
45
|
-
*
|
|
46
|
-
* 约束:burnRate + divideRate + liquidityRate + recipientRate = 100
|
|
47
|
-
*/
|
|
48
|
-
export type FourTokenTaxInfo = {
|
|
49
|
-
feeRate: 1 | 3 | 5 | 10;
|
|
50
|
-
burnRate: number;
|
|
51
|
-
divideRate: number;
|
|
52
|
-
liquidityRate: number;
|
|
53
|
-
recipientRate: number;
|
|
54
|
-
recipientAddress: string;
|
|
55
|
-
minSharing: number;
|
|
56
|
-
};
|
|
57
|
-
export type CreateTokenReq = {
|
|
58
|
-
name: string;
|
|
59
|
-
shortName: string;
|
|
60
|
-
desc: string;
|
|
61
|
-
imgUrl: string;
|
|
62
|
-
launchTime: number;
|
|
63
|
-
label: 'Meme' | 'AI' | 'Defi' | 'Games' | 'Infra' | 'De-Sci' | 'Social' | 'Depin' | 'Charity' | 'Others';
|
|
64
|
-
webUrl?: string;
|
|
65
|
-
twitterUrl?: string;
|
|
66
|
-
telegramUrl?: string;
|
|
67
|
-
preSale: string;
|
|
68
|
-
onlyMPC?: boolean;
|
|
69
|
-
/**
|
|
70
|
-
* AntiSniperFeeMode(开盘高税模式)
|
|
71
|
-
* - true: 启用动态手续费系统(开盘时高税,逐区块自动降低)
|
|
72
|
-
* - false: 不启用(默认)
|
|
73
|
-
*/
|
|
74
|
-
feePlan?: boolean;
|
|
75
|
-
/**
|
|
76
|
-
* 税币配置(Tax Token)
|
|
77
|
-
* - 提供此字段时创建税币(creatorType = 5)
|
|
78
|
-
* - 不提供或为 undefined 时创建普通代币
|
|
79
|
-
*/
|
|
80
|
-
tokenTaxInfo?: FourTokenTaxInfo;
|
|
81
|
-
lpTradingFee: 0.0025;
|
|
82
|
-
symbol: 'BNB';
|
|
83
|
-
totalSupply: 1000000000;
|
|
84
|
-
raisedAmount: 24;
|
|
85
|
-
saleRate: 0.8;
|
|
86
|
-
reserveRate: 0;
|
|
87
|
-
funGroup: false;
|
|
88
|
-
clickFun: false;
|
|
89
|
-
};
|
|
90
|
-
export type CreateTokenResp = {
|
|
91
|
-
createArg: string;
|
|
92
|
-
signature: string;
|
|
93
|
-
tokenAddr?: string;
|
|
94
|
-
address?: string;
|
|
95
|
-
token?: string;
|
|
96
|
-
[key: string]: any;
|
|
97
|
-
};
|
|
98
|
-
export declare class FourClient {
|
|
99
|
-
private baseUrl;
|
|
100
|
-
private uploadUrls;
|
|
101
|
-
constructor(cfg?: FourConfig);
|
|
102
|
-
generateNonce(req: GenerateNonceReq): Promise<string>;
|
|
103
|
-
loginDex(body: LoginReq): Promise<string>;
|
|
104
|
-
/**
|
|
105
|
-
* 上传图片到 Four.meme
|
|
106
|
-
*
|
|
107
|
-
* 优化策略:
|
|
108
|
-
* 1. 图片内容哈希缓存 —— 相同图片不重复上传,直接返回缓存 URL
|
|
109
|
-
* 2. 多端点轮换 —— 当某个代理 IP 触发限流(-1038)时自动切到下一个端点
|
|
110
|
-
*/
|
|
111
|
-
uploadImage(accessToken: string, file: Blob, filename?: string): Promise<string>;
|
|
112
|
-
/**
|
|
113
|
-
* 执行单次上传请求
|
|
114
|
-
*/
|
|
115
|
-
private doUpload;
|
|
116
|
-
/**
|
|
117
|
-
* 判断是否为 IP 限流错误(code: -1038)
|
|
118
|
-
*/
|
|
119
|
-
private isRateLimitError;
|
|
120
|
-
/**
|
|
121
|
-
* 判断是否为 CORS 或网络错误
|
|
122
|
-
* 浏览器直连官方 API 时常见(fetch 会抛出 TypeError: Failed to fetch)
|
|
123
|
-
*/
|
|
124
|
-
private isCorsOrNetworkError;
|
|
125
|
-
private getFilenameFromBlob;
|
|
126
|
-
createToken(accessToken: string, req: CreateTokenReq): Promise<CreateTokenResp>;
|
|
127
|
-
getPublicConfig(): Promise<any>;
|
|
128
|
-
getTokenByAddress(address: string, accessToken?: string): Promise<any>;
|
|
129
|
-
getTokensByAddresses(addresses: string[], accessToken?: string): Promise<any[]>;
|
|
130
|
-
getTokenById(id: string | number, accessToken?: string): Promise<any>;
|
|
131
|
-
}
|
|
132
|
-
export declare function buildLoginMessage(nonce: string): string;
|
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// 图片上传缓存(按内容哈希去重,同一张图片只上传一次)
|
|
3
|
-
// ✅ 使用 localStorage 持久化,刷新页面 / 重启浏览器后缓存仍然有效
|
|
4
|
-
// ============================================================================
|
|
5
|
-
const UPLOAD_CACHE_KEY = '__four_upload_cache__';
|
|
6
|
-
const UPLOAD_CACHE_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000; // 7 天过期
|
|
7
|
-
/** 内存缓存(从 localStorage 懒加载) */
|
|
8
|
-
let _memCache = null;
|
|
9
|
-
/** 加载持久化缓存到内存 */
|
|
10
|
-
function loadCache() {
|
|
11
|
-
if (_memCache)
|
|
12
|
-
return _memCache;
|
|
13
|
-
_memCache = new Map();
|
|
14
|
-
try {
|
|
15
|
-
if (typeof localStorage === 'undefined')
|
|
16
|
-
return _memCache;
|
|
17
|
-
const raw = localStorage.getItem(UPLOAD_CACHE_KEY);
|
|
18
|
-
if (raw) {
|
|
19
|
-
const entries = JSON.parse(raw);
|
|
20
|
-
const now = Date.now();
|
|
21
|
-
for (const [hash, entry] of Object.entries(entries)) {
|
|
22
|
-
// 跳过过期条目
|
|
23
|
-
if (now - entry.ts < UPLOAD_CACHE_MAX_AGE_MS) {
|
|
24
|
-
_memCache.set(hash, entry);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
// localStorage 不可用或数据损坏,忽略
|
|
31
|
-
}
|
|
32
|
-
return _memCache;
|
|
33
|
-
}
|
|
34
|
-
/** 保存内存缓存到 localStorage */
|
|
35
|
-
function saveCache() {
|
|
36
|
-
try {
|
|
37
|
-
if (typeof localStorage === 'undefined')
|
|
38
|
-
return;
|
|
39
|
-
const cache = loadCache();
|
|
40
|
-
const obj = {};
|
|
41
|
-
cache.forEach((v, k) => { obj[k] = v; });
|
|
42
|
-
localStorage.setItem(UPLOAD_CACHE_KEY, JSON.stringify(obj));
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
// localStorage 写满或不可用,忽略
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/** 从缓存获取 URL */
|
|
49
|
-
function getCachedUrl(hash) {
|
|
50
|
-
const cache = loadCache();
|
|
51
|
-
const entry = cache.get(hash);
|
|
52
|
-
if (!entry)
|
|
53
|
-
return null;
|
|
54
|
-
if (Date.now() - entry.ts > UPLOAD_CACHE_MAX_AGE_MS) {
|
|
55
|
-
cache.delete(hash);
|
|
56
|
-
saveCache();
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
return entry.url;
|
|
60
|
-
}
|
|
61
|
-
/** 写入缓存 */
|
|
62
|
-
function setCachedUrl(hash, url) {
|
|
63
|
-
const cache = loadCache();
|
|
64
|
-
cache.set(hash, { url, ts: Date.now() });
|
|
65
|
-
saveCache();
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* 计算 Blob 的 SHA-256 哈希(十六进制)
|
|
69
|
-
* 用于图片去重,避免重复上传消耗 IP 配额
|
|
70
|
-
*/
|
|
71
|
-
async function hashBlob(blob) {
|
|
72
|
-
const buffer = await blob.arrayBuffer();
|
|
73
|
-
const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);
|
|
74
|
-
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
75
|
-
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
76
|
-
}
|
|
77
|
-
/** IP 限流错误码 */
|
|
78
|
-
const RATE_LIMIT_CODE = -1038;
|
|
79
|
-
/**
|
|
80
|
-
* Four.meme 官方 API 地址(作为内置备用端点)
|
|
81
|
-
*
|
|
82
|
-
* - 在 Node.js/服务端环境中:无 CORS 限制,直连走用户自己的 IP,不消耗 Worker 配额
|
|
83
|
-
* - 在浏览器环境中:可能被 CORS 拦截,但作为最后的 fallback 仍值得尝试
|
|
84
|
-
*/
|
|
85
|
-
const FOUR_MEME_OFFICIAL_API = 'https://four.meme/meme-api';
|
|
86
|
-
export class FourClient {
|
|
87
|
-
constructor(cfg) {
|
|
88
|
-
// 默认使用 Cloudflare Workers 代理,已配置 CORS,浏览器可直接使用
|
|
89
|
-
this.baseUrl = cfg?.baseUrl || 'https://bscfourapi.emit.tools';
|
|
90
|
-
// 上传端点列表:主 URL + 用户自定义备用 URL + 官方 API(兜底)
|
|
91
|
-
const fallbacks = cfg?.uploadFallbackUrls || [];
|
|
92
|
-
this.uploadUrls = [
|
|
93
|
-
this.baseUrl,
|
|
94
|
-
...fallbacks,
|
|
95
|
-
// ✅ 官方 API 始终作为最后兜底(Node.js 环境无 CORS 限制,走用户自己 IP)
|
|
96
|
-
FOUR_MEME_OFFICIAL_API,
|
|
97
|
-
];
|
|
98
|
-
// 去重(如果用户 baseUrl 就是官方地址,避免重复请求)
|
|
99
|
-
this.uploadUrls = [...new Set(this.uploadUrls)];
|
|
100
|
-
}
|
|
101
|
-
async generateNonce(req) {
|
|
102
|
-
const r = await fetch(`${this.baseUrl}/v1/private/user/nonce/generate`, {
|
|
103
|
-
method: 'POST',
|
|
104
|
-
headers: { 'Content-Type': 'application/json' },
|
|
105
|
-
body: JSON.stringify(req),
|
|
106
|
-
});
|
|
107
|
-
const j = await r.json();
|
|
108
|
-
// code 可能是字符串 '0' 或数字 0
|
|
109
|
-
if (j.code !== '0' && j.code !== 0) {
|
|
110
|
-
throw new Error(`generateNonce failed: ${JSON.stringify(j)}`);
|
|
111
|
-
}
|
|
112
|
-
return j.data;
|
|
113
|
-
}
|
|
114
|
-
async loginDex(body) {
|
|
115
|
-
const r = await fetch(`${this.baseUrl}/v1/private/user/login/dex`, {
|
|
116
|
-
method: 'POST',
|
|
117
|
-
headers: { 'Content-Type': 'application/json' },
|
|
118
|
-
body: JSON.stringify(body),
|
|
119
|
-
});
|
|
120
|
-
const j = await r.json();
|
|
121
|
-
if (j.code !== '0' && j.code !== 0) {
|
|
122
|
-
throw new Error(`login failed: ${JSON.stringify(j)}`);
|
|
123
|
-
}
|
|
124
|
-
return j.data; // access_token
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* 上传图片到 Four.meme
|
|
128
|
-
*
|
|
129
|
-
* 优化策略:
|
|
130
|
-
* 1. 图片内容哈希缓存 —— 相同图片不重复上传,直接返回缓存 URL
|
|
131
|
-
* 2. 多端点轮换 —— 当某个代理 IP 触发限流(-1038)时自动切到下一个端点
|
|
132
|
-
*/
|
|
133
|
-
async uploadImage(accessToken, file, filename) {
|
|
134
|
-
// ✅ 先查缓存(localStorage 持久化):相同图片直接返回,不消耗上传配额
|
|
135
|
-
const hash = await hashBlob(file);
|
|
136
|
-
const cached = getCachedUrl(hash);
|
|
137
|
-
if (cached) {
|
|
138
|
-
console.log(`[FourClient] 图片命中缓存,跳过上传 (hash: ${hash.slice(0, 12)}...)`);
|
|
139
|
-
return cached;
|
|
140
|
-
}
|
|
141
|
-
const finalFilename = filename || this.getFilenameFromBlob(file);
|
|
142
|
-
let lastError = null;
|
|
143
|
-
// ✅ 依次尝试所有上传端点(代理 → 自定义备用 → 官方直连兜底)
|
|
144
|
-
for (let i = 0; i < this.uploadUrls.length; i++) {
|
|
145
|
-
const baseUrl = this.uploadUrls[i];
|
|
146
|
-
const isOfficial = baseUrl === FOUR_MEME_OFFICIAL_API;
|
|
147
|
-
try {
|
|
148
|
-
const imgUrl = await this.doUpload(baseUrl, accessToken, file, finalFilename);
|
|
149
|
-
// 上传成功,写入持久化缓存(localStorage)
|
|
150
|
-
setCachedUrl(hash, imgUrl);
|
|
151
|
-
if (i > 0) {
|
|
152
|
-
console.log(`[FourClient] 使用${isOfficial ? '官方直连' : '备用'}端点上传成功: ${baseUrl}`);
|
|
153
|
-
}
|
|
154
|
-
return imgUrl;
|
|
155
|
-
}
|
|
156
|
-
catch (e) {
|
|
157
|
-
lastError = e;
|
|
158
|
-
const canRetry = i < this.uploadUrls.length - 1;
|
|
159
|
-
if (this.isRateLimitError(e) && canRetry) {
|
|
160
|
-
// IP 限流 → 切下一个端点
|
|
161
|
-
const nextUrl = this.uploadUrls[i + 1];
|
|
162
|
-
const nextLabel = nextUrl === FOUR_MEME_OFFICIAL_API ? '官方直连' : `备用端点 #${i + 2}`;
|
|
163
|
-
console.warn(`[FourClient] 端点 ${baseUrl} 触发 IP 限流(100次/天),切换到${nextLabel}...`);
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
|
-
if (this.isCorsOrNetworkError(e) && canRetry) {
|
|
167
|
-
// CORS/网络错误(常见于浏览器直连官方 API)→ 跳过,继续尝试下一个
|
|
168
|
-
console.warn(`[FourClient] 端点 ${baseUrl} 请求失败(${isOfficial ? 'CORS限制' : '网络错误'}),跳过`);
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
// 无法重试,跳出
|
|
172
|
-
break;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
// 所有端点都失败
|
|
176
|
-
const isRateLimit = lastError && this.isRateLimitError(lastError);
|
|
177
|
-
if (isRateLimit) {
|
|
178
|
-
throw new Error(`图片上传失败:所有端点均触发 IP 限流(每IP每天100次)。` +
|
|
179
|
-
`请等待次日重置,或在 FourConfig.uploadFallbackUrls 中添加不同 IP 的备用代理。` +
|
|
180
|
-
`\n原始错误: ${lastError.message}`);
|
|
181
|
-
}
|
|
182
|
-
throw lastError || new Error('upload failed: all endpoints exhausted');
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* 执行单次上传请求
|
|
186
|
-
*/
|
|
187
|
-
async doUpload(baseUrl, accessToken, file, filename) {
|
|
188
|
-
const form = new FormData();
|
|
189
|
-
form.append('file', file, filename);
|
|
190
|
-
const r = await fetch(`${baseUrl}/v1/private/token/upload`, {
|
|
191
|
-
method: 'POST',
|
|
192
|
-
headers: { 'meme-web-access': accessToken },
|
|
193
|
-
body: form,
|
|
194
|
-
});
|
|
195
|
-
const j = await r.json();
|
|
196
|
-
if (j.code !== '0' && j.code !== 0) {
|
|
197
|
-
const err = new Error(`upload failed: ${JSON.stringify(j)}`);
|
|
198
|
-
err.apiCode = typeof j.code === 'string' ? parseInt(j.code, 10) : j.code;
|
|
199
|
-
throw err;
|
|
200
|
-
}
|
|
201
|
-
return j.data; // imgUrl
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* 判断是否为 IP 限流错误(code: -1038)
|
|
205
|
-
*/
|
|
206
|
-
isRateLimitError(e) {
|
|
207
|
-
if (e?.apiCode === RATE_LIMIT_CODE)
|
|
208
|
-
return true;
|
|
209
|
-
// 兼容:从 message 中检测
|
|
210
|
-
if (typeof e?.message === 'string' && e.message.includes('-1038'))
|
|
211
|
-
return true;
|
|
212
|
-
return false;
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* 判断是否为 CORS 或网络错误
|
|
216
|
-
* 浏览器直连官方 API 时常见(fetch 会抛出 TypeError: Failed to fetch)
|
|
217
|
-
*/
|
|
218
|
-
isCorsOrNetworkError(e) {
|
|
219
|
-
if (e instanceof TypeError)
|
|
220
|
-
return true; // fetch CORS / network failure
|
|
221
|
-
const msg = e?.message?.toLowerCase?.() || '';
|
|
222
|
-
return msg.includes('failed to fetch') || msg.includes('network') || msg.includes('cors');
|
|
223
|
-
}
|
|
224
|
-
getFilenameFromBlob(blob) {
|
|
225
|
-
const mimeToExt = {
|
|
226
|
-
'image/jpeg': 'jpg',
|
|
227
|
-
'image/jpg': 'jpg',
|
|
228
|
-
'image/png': 'png',
|
|
229
|
-
'image/gif': 'gif',
|
|
230
|
-
'image/bmp': 'bmp',
|
|
231
|
-
'image/webp': 'webp',
|
|
232
|
-
};
|
|
233
|
-
const ext = mimeToExt[blob.type] || 'png';
|
|
234
|
-
return `image-${Date.now()}.${ext}`;
|
|
235
|
-
}
|
|
236
|
-
async createToken(accessToken, req) {
|
|
237
|
-
const r = await fetch(`${this.baseUrl}/v1/private/token/create`, {
|
|
238
|
-
method: 'POST',
|
|
239
|
-
headers: { 'Content-Type': 'application/json', 'meme-web-access': accessToken },
|
|
240
|
-
body: JSON.stringify(req),
|
|
241
|
-
});
|
|
242
|
-
const j = await r.json();
|
|
243
|
-
if (j.code !== '0' && j.code !== 0) {
|
|
244
|
-
throw new Error(`createToken failed: ${JSON.stringify(j)}`);
|
|
245
|
-
}
|
|
246
|
-
return j.data;
|
|
247
|
-
}
|
|
248
|
-
async getPublicConfig() {
|
|
249
|
-
const r = await fetch(`${this.baseUrl}/v1/public/config`);
|
|
250
|
-
return await r.json();
|
|
251
|
-
}
|
|
252
|
-
async getTokenByAddress(address, accessToken) {
|
|
253
|
-
const r = await fetch(`${this.baseUrl}/v1/private/token/get?address=${address}`, {
|
|
254
|
-
headers: accessToken ? { 'meme-web-access': accessToken } : undefined,
|
|
255
|
-
});
|
|
256
|
-
const j = await r.json();
|
|
257
|
-
if (j.code && j.code !== '0' && j.code !== 0) {
|
|
258
|
-
throw new Error(`getTokenByAddress failed: ${JSON.stringify(j)}`);
|
|
259
|
-
}
|
|
260
|
-
return j.data ?? j;
|
|
261
|
-
}
|
|
262
|
-
async getTokensByAddresses(addresses, accessToken) {
|
|
263
|
-
if (!Array.isArray(addresses) || addresses.length === 0)
|
|
264
|
-
return [];
|
|
265
|
-
const tasks = addresses.map((addr) => this.getTokenByAddress(addr, accessToken).catch((e) => ({ address: addr, error: String(e) })));
|
|
266
|
-
return await Promise.all(tasks);
|
|
267
|
-
}
|
|
268
|
-
async getTokenById(id, accessToken) {
|
|
269
|
-
const r = await fetch(`${this.baseUrl}/v1/private/token/getById?id=${id}`, {
|
|
270
|
-
headers: accessToken ? { 'meme-web-access': accessToken } : undefined,
|
|
271
|
-
});
|
|
272
|
-
const j = await r.json();
|
|
273
|
-
if (j.code && j.code !== '0' && j.code !== 0) {
|
|
274
|
-
throw new Error(`getTokenById failed: ${JSON.stringify(j)}`);
|
|
275
|
-
}
|
|
276
|
-
return j.data ?? j;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
export function buildLoginMessage(nonce) {
|
|
280
|
-
return `You are sign in Meme ${nonce}`;
|
|
281
|
-
}
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Merkle.io Bundle Service 客户端
|
|
3
|
-
*
|
|
4
|
-
* 提供基于 Merkle 的 MEV 保护和捆绑交易服务
|
|
5
|
-
*
|
|
6
|
-
* 官方文档: https://docs.merkle.io/
|
|
7
|
-
*
|
|
8
|
-
* 使用示例:
|
|
9
|
-
* ```typescript
|
|
10
|
-
* import { MerkleClient } from 'four-flap-meme-sdk';
|
|
11
|
-
*
|
|
12
|
-
* const merkle = new MerkleClient({
|
|
13
|
-
* apiKey: 'pk_mbs_...',
|
|
14
|
-
* chainId: 56
|
|
15
|
-
* });
|
|
16
|
-
*
|
|
17
|
-
* const bundleHash = await merkle.sendBundle({
|
|
18
|
-
* transactions: [tx1, tx2, tx3],
|
|
19
|
-
* targetBlock: currentBlock + 2
|
|
20
|
-
* });
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
import { JsonRpcProvider, Wallet, TransactionLike } from 'ethers';
|
|
24
|
-
/**
|
|
25
|
-
* Merkle 客户端配置
|
|
26
|
-
*/
|
|
27
|
-
export interface MerkleConfig {
|
|
28
|
-
/** Merkle API Key (例如: pk_mbs_...) */
|
|
29
|
-
apiKey: string;
|
|
30
|
-
/** 链 ID: 56=BSC, 1=Ethereum */
|
|
31
|
-
chainId: 56 | 1;
|
|
32
|
-
/** 自定义 RPC URL(可选,默认使用 Merkle 官方 RPC) */
|
|
33
|
-
customRpcUrl?: string;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Bundle 参数
|
|
37
|
-
*/
|
|
38
|
-
export interface BundleParams {
|
|
39
|
-
/** 已签名的交易数组(原始交易字符串) */
|
|
40
|
-
txs: string[];
|
|
41
|
-
/** 目标区块号(十六进制字符串,例如: "0x123abc") */
|
|
42
|
-
blockNumber: string;
|
|
43
|
-
/** 最小时间戳(可选,0 表示不限制) */
|
|
44
|
-
minTimestamp?: number;
|
|
45
|
-
/** 最大时间戳(可选,0 表示不限制) */
|
|
46
|
-
maxTimestamp?: number;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* 网络状态信息
|
|
50
|
-
*/
|
|
51
|
-
export interface NetworkStatus {
|
|
52
|
-
/** 当前区块号 */
|
|
53
|
-
currentBlock: number;
|
|
54
|
-
/** 当前 Gas Price (wei) */
|
|
55
|
-
gasPrice: bigint;
|
|
56
|
-
/** 建议的最小 Gas Price (wei) */
|
|
57
|
-
suggestedMinGasPrice: bigint;
|
|
58
|
-
/** 平均出块时间(秒) */
|
|
59
|
-
avgBlockTime: number;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* 发送 Bundle 的选项
|
|
63
|
-
*/
|
|
64
|
-
export interface SendBundleOptions {
|
|
65
|
-
/** 已签名的交易数组 */
|
|
66
|
-
transactions: string[];
|
|
67
|
-
/** 目标区块号(十进制数字,会自动转换为十六进制) */
|
|
68
|
-
targetBlock?: number;
|
|
69
|
-
/** 最小时间戳 */
|
|
70
|
-
minTimestamp?: number;
|
|
71
|
-
/** 最大时间戳 */
|
|
72
|
-
maxTimestamp?: number;
|
|
73
|
-
/** 如果不指定 targetBlock,则使用当前区块 + offset(默认3) */
|
|
74
|
-
blockOffset?: number;
|
|
75
|
-
/** 最小区块偏移量,用于确保足够的提交时间窗口(默认3) */
|
|
76
|
-
minBlockOffset?: number;
|
|
77
|
-
/** 是否启用自动重试(默认false) */
|
|
78
|
-
autoRetry?: boolean;
|
|
79
|
-
/** 最大重试次数(默认2) */
|
|
80
|
-
maxRetries?: number;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Bundle 发送结果
|
|
84
|
-
*/
|
|
85
|
-
export interface BundleResult {
|
|
86
|
-
/** Bundle Hash */
|
|
87
|
-
bundleHash: string;
|
|
88
|
-
/** 交易哈希列表 */
|
|
89
|
-
txHashes: string[];
|
|
90
|
-
/** 目标区块号 */
|
|
91
|
-
targetBlock: number;
|
|
92
|
-
/** 交易数量 */
|
|
93
|
-
txCount: number;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* 交易确认结果
|
|
97
|
-
*/
|
|
98
|
-
export interface TransactionResult {
|
|
99
|
-
/** 交易索引 */
|
|
100
|
-
index: number;
|
|
101
|
-
/** 交易哈希 */
|
|
102
|
-
hash: string;
|
|
103
|
-
/** 是否成功 */
|
|
104
|
-
success: boolean;
|
|
105
|
-
/** 区块号 */
|
|
106
|
-
blockNumber?: number;
|
|
107
|
-
/** Gas 使用量 */
|
|
108
|
-
gasUsed?: string;
|
|
109
|
-
/** 有效 Gas Price */
|
|
110
|
-
effectiveGasPrice?: string;
|
|
111
|
-
/** Gas 费用(BNB/ETH) */
|
|
112
|
-
gasCost?: string;
|
|
113
|
-
/** 错误信息 */
|
|
114
|
-
error?: string;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Merkle 客户端
|
|
118
|
-
*/
|
|
119
|
-
export declare class MerkleClient {
|
|
120
|
-
private provider;
|
|
121
|
-
private chainId;
|
|
122
|
-
private chainName;
|
|
123
|
-
private blockNumberCache;
|
|
124
|
-
private static BLOCK_CACHE_TTL_MS;
|
|
125
|
-
constructor(config: MerkleConfig);
|
|
126
|
-
/**
|
|
127
|
-
* 获取 Provider
|
|
128
|
-
*/
|
|
129
|
-
getProvider(): JsonRpcProvider;
|
|
130
|
-
/**
|
|
131
|
-
* 获取当前区块号(带缓存,减少 RPC 调用)
|
|
132
|
-
* @param forceRefresh 是否强制刷新缓存
|
|
133
|
-
*/
|
|
134
|
-
getBlockNumber(forceRefresh?: boolean): Promise<number>;
|
|
135
|
-
/**
|
|
136
|
-
* 获取 Gas 价格信息
|
|
137
|
-
*/
|
|
138
|
-
getFeeData(): Promise<import("ethers").FeeData>;
|
|
139
|
-
/**
|
|
140
|
-
* 获取网络状态(用于 Bundle 参数优化)
|
|
141
|
-
*/
|
|
142
|
-
getNetworkStatus(): Promise<NetworkStatus>;
|
|
143
|
-
/**
|
|
144
|
-
* 发送捆绑交易(底层方法)
|
|
145
|
-
*
|
|
146
|
-
* @param params Bundle 参数
|
|
147
|
-
* @returns Bundle Hash
|
|
148
|
-
*/
|
|
149
|
-
sendBundleRaw(params: BundleParams): Promise<string>;
|
|
150
|
-
/**
|
|
151
|
-
* 发送捆绑交易(高级方法,带智能优化和重试)
|
|
152
|
-
*
|
|
153
|
-
* @param options 发送选项
|
|
154
|
-
* @returns Bundle 结果
|
|
155
|
-
*/
|
|
156
|
-
sendBundle(options: SendBundleOptions): Promise<BundleResult>;
|
|
157
|
-
/**
|
|
158
|
-
* 等待 Bundle 中的交易确认
|
|
159
|
-
*
|
|
160
|
-
* @param txHashes 交易哈希列表
|
|
161
|
-
* @param confirmations 确认数(默认 1)
|
|
162
|
-
* @param timeout 超时时间(毫秒,默认 120000)
|
|
163
|
-
* @returns 交易结果列表
|
|
164
|
-
*/
|
|
165
|
-
waitForBundleConfirmation(txHashes: string[], confirmations?: number, timeout?: number): Promise<TransactionResult[]>;
|
|
166
|
-
/**
|
|
167
|
-
* 准备并签名交易(辅助方法)
|
|
168
|
-
*
|
|
169
|
-
* @param wallet 钱包
|
|
170
|
-
* @param transactions 交易列表
|
|
171
|
-
* @param options 可选参数
|
|
172
|
-
* @returns 已签名的交易数组
|
|
173
|
-
*/
|
|
174
|
-
signTransactions(wallet: Wallet, transactions: TransactionLike[], options?: {
|
|
175
|
-
/** 起始 Nonce(可选,默认从链上获取) */
|
|
176
|
-
startNonce?: number;
|
|
177
|
-
/** Gas Price(可选,默认从链上获取并提高 50%) */
|
|
178
|
-
gasPrice?: bigint;
|
|
179
|
-
/** Gas Price 增幅百分比(默认 50,即提高 50%) */
|
|
180
|
-
gasPriceMultiplier?: number;
|
|
181
|
-
}): Promise<string[]>;
|
|
182
|
-
/**
|
|
183
|
-
* 检查交易是否已包含在区块中
|
|
184
|
-
*
|
|
185
|
-
* @param txHash 交易哈希
|
|
186
|
-
* @returns 是否已包含
|
|
187
|
-
*/
|
|
188
|
-
isTransactionIncluded(txHash: string): Promise<boolean>;
|
|
189
|
-
/**
|
|
190
|
-
* 等待达到目标区块
|
|
191
|
-
*
|
|
192
|
-
* @param targetBlock 目标区块号
|
|
193
|
-
* @param maxAttempts 最大尝试次数(默认 10)
|
|
194
|
-
* @param intervalMs 检查间隔(毫秒,默认 1000)
|
|
195
|
-
* @returns 是否达到目标区块
|
|
196
|
-
*/
|
|
197
|
-
waitForBlock(targetBlock: number, maxAttempts?: number, intervalMs?: number): Promise<boolean>;
|
|
198
|
-
/**
|
|
199
|
-
* 获取当前 Provider 的统计信息(用于调试)
|
|
200
|
-
*/
|
|
201
|
-
getProviderInfo(): {
|
|
202
|
-
chainId: number;
|
|
203
|
-
chainName: string;
|
|
204
|
-
rpcUrl: string;
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* 创建 Merkle 客户端的便捷函数
|
|
209
|
-
*/
|
|
210
|
-
export declare function createMerkleClient(apiKey: string, chainId?: 56 | 1): MerkleClient;
|