@earthworm/wallet-sdk 0.1.0 → 0.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/README.md CHANGED
@@ -14,7 +14,7 @@ pnpm add @earthworm/wallet-sdk ethers
14
14
  import { initWalletSdk, getWalletSdkConfig, walletEvents } from "@earthworm/wallet-sdk";
15
15
 
16
16
  initWalletSdk({
17
- isMainnet: true,
17
+ isMainnet: true, //是否使用测试环境bsc
18
18
  contract: { address: "0x...", abi: [] },
19
19
  });
20
20
 
@@ -22,16 +22,3 @@ walletEvents.on("accountsChanged", (accounts) => {
22
22
  console.log(accounts);
23
23
  });
24
24
  ```
25
-
26
- ## Develop
27
-
28
- ```bash
29
- pnpm install
30
- pnpm run build
31
- ```
32
-
33
- ## Publish
34
-
35
- ```bash
36
- pnpm publish
37
- ```
package/dist/index.d.ts CHANGED
@@ -2,8 +2,11 @@ import * as ethers from 'ethers';
2
2
  import { InterfaceAbi, Eip1193Provider, BrowserProvider, JsonRpcProvider, JsonRpcSigner } from 'ethers';
3
3
 
4
4
  /**
5
- * 将 EVM 十六进制 chainId(如 0x61)转换为十进制 chainId(如 97)。
6
- * 钱包 `chainChanged` / `eth_chainId` 返回的通常是 0x 前缀 hex 字符串。
5
+ * 将 EVM 十六进制 chainId 转换为十进制 chainId
6
+ * 钱包 `chainChanged` / `eth_chainId` 返回的通常是 `0x` 前缀 hex 字符串。
7
+ * @param chainId - 十六进制 chainId,如 `"0x38"`(56)或 `"0x61"`(97)。
8
+ * @param fallback - 解析失败时的回退值;未传则返回 `NaN`。
9
+ * @returns 十进制 chainId 数值,或 `fallback` / `NaN`。
7
10
  */
8
11
  declare function toChainIdDecimal(chainId: string, fallback?: number): number;
9
12
 
@@ -27,14 +30,17 @@ type MutableRef<T> = {
27
30
  value: T;
28
31
  };
29
32
  type EthereumRequestParams = unknown[] | Record<string, unknown>;
33
+ type ChainNativeCurrency = {
34
+ name: string;
35
+ symbol: string;
36
+ decimals: number;
37
+ };
30
38
  type ChainConfig = {
31
39
  chainId: string;
32
40
  chainName: string;
33
- nativeCurrencyName: string;
34
- nativeCurrencySymbol: string;
35
- nativeCurrencyDecimals: string | number;
36
- rpcUrl: string;
37
- blockExplorerUrl: string;
41
+ nativeCurrency: ChainNativeCurrency;
42
+ rpcUrls: string[];
43
+ blockExplorerUrls: string[];
38
44
  };
39
45
  type Eip6963ProviderInfo = {
40
46
  uuid: string;
@@ -69,57 +75,172 @@ type WalletSdkConfig = {
69
75
  };
70
76
  };
71
77
 
78
+ /**
79
+ * 通过 EIP-6963 发现并收集浏览器中的钱包 provider。
80
+ * 非浏览器环境直接返回空数组;多次调用共享同一次发现结果。
81
+ * @param timeoutMs - 等待 `eip6963:announceProvider` 的超时毫秒数,默认 `500`。
82
+ * @returns 已发现的 {@link Eip6963ProviderDetail} 列表。
83
+ */
72
84
  declare function discoverWalletProviders(timeoutMs?: number): Promise<Eip6963ProviderDetail[]>;
85
+ /**
86
+ * 从已发现的 EIP-6963 provider 中按条件查找。
87
+ * @param match - 匹配函数,入参为 {@link Eip6963ProviderDetail}。
88
+ * @returns 匹配到的 EIP-1193 provider;未找到为 `undefined`。
89
+ */
73
90
  declare function findDiscoveredProvider(match: (detail: Eip6963ProviderDetail) => boolean): ethers.Eip1193Provider | undefined;
91
+ /**
92
+ * 查找 MetaMask 的 EIP-6963 provider。
93
+ * @returns MetaMask EIP-1193 provider;未找到为 `undefined`。
94
+ */
74
95
  declare function findMetaMaskEip6963Provider(): ethers.Eip1193Provider | undefined;
96
+ /**
97
+ * 查找 Coinbase Wallet 的 EIP-6963 provider。
98
+ * @returns Coinbase EIP-1193 provider;未找到为 `undefined`。
99
+ */
75
100
  declare function findCoinbaseEip6963Provider(): ethers.Eip1193Provider | undefined;
101
+ /**
102
+ * 是否通过 EIP-6963 检测到 MetaMask。
103
+ * @returns 检测到为 `true`,否则 `false`。
104
+ */
76
105
  declare function hasMetaMaskEip6963Provider(): boolean;
106
+ /**
107
+ * 是否通过 EIP-6963 检测到 Coinbase Wallet。
108
+ * @returns 检测到为 `true`,否则 `false`。
109
+ */
77
110
  declare function hasCoinbaseEip6963Provider(): boolean;
78
111
 
112
+ /**
113
+ * 获取与 EIP-1193 provider 绑定的共享 BrowserProvider(同一实例复用)。
114
+ * @param ethereum - EIP-1193 provider,如 MetaMask 的 `window.ethereum`。
115
+ * @returns ethers `BrowserProvider`。
116
+ */
79
117
  declare function getSharedBrowserProvider(ethereum: Eip1193Provider): BrowserProvider;
80
118
 
119
+ /**
120
+ * 获取浏览器中所有 injected 以太坊 provider。
121
+ * @returns {@link InjectedEthereumProvider} 数组;无 `window.ethereum` 时返回 `[]`。
122
+ */
81
123
  declare function getInjectedEthereumProviders(): InjectedEthereumProvider[];
124
+ /**
125
+ * 解析 MetaMask injected provider(EIP-6963 → providerMap → providers 数组 → 根 ethereum)。
126
+ * @returns MetaMask {@link WalletEventProvider};未找到为 `undefined`。
127
+ */
82
128
  declare function resolveMetaMaskInjectedProvider(): WalletEventProvider | undefined;
129
+ /**
130
+ * 解析 Coinbase Wallet injected provider(扩展 → EIP-6963 → providerMap → providers 数组 → 根 ethereum)。
131
+ * @returns Coinbase {@link WalletEventProvider};未找到为 `undefined`。
132
+ */
83
133
  declare function resolveCoinbaseInjectedProvider(): WalletEventProvider | undefined;
134
+ /**
135
+ * 是否检测到 MetaMask injected provider。
136
+ * @returns 检测到为 `true`,否则 `false`。
137
+ */
84
138
  declare function hasMetaMaskInjectedProvider(): boolean;
139
+ /**
140
+ * 是否检测到 Coinbase Wallet(扩展、request provider 或 injected)。
141
+ * @returns 检测到为 `true`,否则 `false`。
142
+ */
85
143
  declare function hasCoinbaseInjectedProvider(): boolean;
144
+ /**
145
+ * 缓存当前可用的多钱包聚合根 provider(`ethereum.providers.length > 1`)。
146
+ * 非浏览器环境无操作。
147
+ */
86
148
  declare function rememberAggregatorProvider(): void;
149
+ /**
150
+ * 是否存在可恢复的多钱包聚合 provider(当前页面或历史缓存)。
151
+ * @returns 存在为 `true`,否则 `false`。
152
+ */
87
153
  declare function hasRecoverableAggregatorProvider(): boolean;
154
+ /**
155
+ * 获取聚合 injected provider(多钱包根节点或 TronLink + Coinbase 组合场景)。
156
+ * @returns {@link InjectedEthereumProvider};未找到为 `undefined`。
157
+ */
88
158
  declare function getAggregatedInjectedProvider(): WalletEventProvider | undefined;
159
+ /**
160
+ * 是否存在可用的聚合 injected 以太坊 provider。
161
+ * @returns 存在为 `true`;非浏览器为 `false`。
162
+ */
89
163
  declare function hasAggregatedInjectedProvider(): boolean;
90
164
 
91
165
  declare const ERC20_DECIMALS_ABI: readonly ["function decimals() view returns (uint8)"];
92
- /** 检查地址在链上是否已部署合约(有 bytecode 才算合约地址) */
166
+ /**
167
+ * 检查地址在链上是否已部署合约(有 bytecode 才算合约地址)。
168
+ * @param readProvider - 只读 provider,ethers `BrowserProvider` 或 `JsonRpcProvider`。
169
+ * @param address - 待检查的地址,如 `"0x..."`。
170
+ * @returns 已部署为 `true`,无 bytecode 为 `false`。
171
+ */
93
172
  declare function hasDeployedContract(readProvider: EvmReadProvider, address: string): Promise<boolean>;
94
- /** 读取 ERC20 代币 decimals;合约未部署直接报错,调用失败时返回 fallback */
173
+ /**
174
+ * 读取 ERC20 代币 decimals。
175
+ * @param readProvider - 只读 provider,ethers `BrowserProvider` 或 `JsonRpcProvider`。
176
+ * @param tokenAddress - ERC20 合约地址。
177
+ * @param erc20Abi - 合约 ABI,默认 {@link ERC20_DECIMALS_ABI}。
178
+ * @param fallback - `decimals()` 调用失败时的回退值,默认 {@link ERC20_DECIMALS}(18)。
179
+ * @returns token decimals 数值。
180
+ * @throws 合约未部署时抛错。
181
+ */
95
182
  declare function readErc20Decimals(readProvider: EvmReadProvider, tokenAddress: string, erc20Abi?: InterfaceAbi, fallback?: 18): Promise<number>;
96
183
 
184
+ /**
185
+ * 合约只读调用选项。
186
+ * @property abi - 合约 ABI(`InterfaceAbi`),需包含目标读方法。
187
+ * @property method - 要 `staticCall` 的合约方法名,如 `"decimals"`、`"getPrice"`。
188
+ */
97
189
  type GetContractReadOptions = {
98
190
  abi: InterfaceAbi;
99
191
  method: string;
100
192
  };
101
- /** 设置钱包 BrowserProvider,链上读取优先走钱包 */
193
+ /**
194
+ * 设置用于链上只读调用的钱包 BrowserProvider。
195
+ * 设置后 `getConfiguredReadProvider` 会优先走钱包,否则回退到 init 配置中的 RPC。
196
+ * @param provider - ethers `BrowserProvider`;传 `null` 则清除并回退到 RPC。
197
+ */
102
198
  declare function setWalletReadProvider(provider: BrowserProvider | null): void;
199
+ /**
200
+ * 获取当前配置的只读 provider。
201
+ * 需先调用 `initWalletSdk`;优先返回已设置的钱包 BrowserProvider,否则使用 RPC fallback。
202
+ * @returns ethers `BrowserProvider` 或 `JsonRpcProvider`。
203
+ * @throws 未初始化 SDK,或 RPC 配置缺失时抛错。
204
+ */
103
205
  declare function getConfiguredReadProvider(): EvmReadProvider;
104
- /** 检查合约是否已部署 */
206
+ /**
207
+ * 检查指定地址在当前链上是否已部署合约(是否存在 bytecode)。
208
+ * @param contractAddress - 合约地址,如 `"0x55d398326f99059fF775485246999027B3197955"`。
209
+ * @returns 已部署为 `true`,无 bytecode 为 `false`。
210
+ */
105
211
  declare function isContractDeployed(contractAddress: string): Promise<boolean>;
106
- /** 读取合约 decimals */
212
+ /**
213
+ * 读取 token 合约的 decimals。
214
+ * @param contractAddress - 代币合约地址。
215
+ * @param options - 读调用选项,见 {@link GetContractReadOptions}。
216
+ * @param options.abi - 合约 ABI,需包含 `options.method` 对应的方法。
217
+ * @param options.method - decimals 方法名,通常为 `"decimals"`。
218
+ * @returns token decimals 数值,如 `18`。
219
+ * @throws 合约未部署时抛错。
220
+ */
107
221
  declare function getContractDecimals(contractAddress: string, options: GetContractReadOptions): Promise<number>;
108
- /** 读取合约价格 */
222
+ /**
223
+ * 读取合约价格,并按 token decimals 格式化为人类可读字符串。
224
+ * 内部会额外调用 `decimals()` 做 `formatUnits` 换算。
225
+ * @param contractAddress - 价格合约地址。
226
+ * @param options - 读调用选项,见 {@link GetContractReadOptions}。
227
+ * @param options.abi - 合约 ABI,需包含价格读方法与 `decimals` 方法。
228
+ * @param options.method - 价格读方法名,如 `"getPrice"`。
229
+ * @returns 格式化后的价格字符串(ethers `formatUnits` 结果)。
230
+ * @throws 合约未部署时抛错。
231
+ */
109
232
  declare function getContractPrice(contractAddress: string, options: GetContractReadOptions): Promise<string>;
110
233
 
111
- declare function buildEthereumChainParams(config: ChainConfig): {
112
- chainId: string;
113
- chainName: string;
114
- nativeCurrency: {
115
- name: string;
116
- symbol: string;
117
- decimals: number;
118
- };
119
- rpcUrls: string[];
120
- blockExplorerUrls: string[];
121
- };
122
- /** 确保钱包切换到目标网络(不存在时自动 addEthereumChain) */
234
+ /**
235
+ * 确保钱包切换到目标网络;链未添加时自动调用 `wallet_addEthereumChain`。
236
+ * @param options - 切链选项。
237
+ * @param options.targetChainId - 目标十六进制 chainId,如 `"0x38"`。
238
+ * @param options.getCurrentChainId - 获取当前 chainId 的异步函数(通常 `eth_chainId`)。
239
+ * @param options.switchChain - 切换链的异步函数(通常 `wallet_switchEthereumChain`)。
240
+ * @param options.addChain - 添加链的异步函数(通常 `wallet_addEthereumChain`);参数为 {@link ChainConfig} 兼容对象。
241
+ * @param options.chainParams - 传给 `addChain` 的链参数,可直接使用 `getWalletSdkConfig().chain`。
242
+ * @returns 已在目标链上或切链成功时 resolve;非 4902 错误会向上抛出。
243
+ */
123
244
  declare function ensureTargetNetwork(options: {
124
245
  targetChainId: string;
125
246
  getCurrentChainId: () => Promise<string>;
@@ -128,27 +249,80 @@ declare function ensureTargetNetwork(options: {
128
249
  chainParams: Record<string, unknown>;
129
250
  }): Promise<void>;
130
251
 
252
+ /**
253
+ * 创建并缓存 JsonRpc 只读 provider。
254
+ * @param rpcUrl - RPC 节点 URL,如 `"https://bsc-dataseed.binance.org/"`。
255
+ * @param chainIdHex - 十六进制 chainId,如 `"0x38"`(BSC 主网)或 `"0x61"`(测试网)。
256
+ * @param cache - 可选缓存对象;传入后复用同一 `JsonRpcProvider` 实例。
257
+ * @returns ethers `JsonRpcProvider`。
258
+ */
131
259
  declare function createJsonRpcReadProvider(rpcUrl: string, chainIdHex: string, cache?: {
132
260
  current: JsonRpcProvider | null;
133
261
  }): JsonRpcProvider;
134
- /** 优先使用钱包 BrowserProvider,否则回退到 JsonRpcProvider */
262
+ /**
263
+ * 获取只读 provider:优先使用钱包 BrowserProvider,否则回退到 JsonRpcProvider。
264
+ * @param walletProvider - 钱包 BrowserProvider;为 `null` 时使用 RPC fallback。
265
+ * @param rpcConfig - RPC 配置。
266
+ * @param rpcConfig.rpcUrls - RPC 节点 URL 列表,取第一个作为 fallback。
267
+ * @param rpcConfig.chainId - 十六进制 chainId,如 `"0x38"`。
268
+ * @param fallbackCache - 可选 JsonRpc provider 缓存。
269
+ * @returns ethers `BrowserProvider` 或 `JsonRpcProvider`。
270
+ * @throws `rpcUrls[0]` 或 `chainId` 缺失时抛错。
271
+ */
135
272
  declare function getReadProviderWithFallback(walletProvider: BrowserProvider | null, rpcConfig: {
136
- rpcUrl: string;
273
+ rpcUrls: string[];
137
274
  chainId: string;
138
275
  }, fallbackCache?: {
139
276
  current: JsonRpcProvider | null;
140
277
  }): EvmReadProvider;
141
278
 
279
+ /**
280
+ * 将 EIP-1193 provider 绑定为 BrowserProvider 并写入缓存。
281
+ * @param eip1193 - 钱包 EIP-1193 provider。
282
+ * @param cache - BrowserProvider 缓存引用 `{ value: BrowserProvider | null }`。
283
+ * @returns ethers `BrowserProvider`。
284
+ */
142
285
  declare function bindBrowserProvider(eip1193: WalletEventProvider, cache: MutableRef<BrowserProvider | null>): BrowserProvider;
286
+ /**
287
+ * 向钱包发起 JSON-RPC 请求。
288
+ * @param eip1193 - 钱包 EIP-1193 provider。
289
+ * @param method - JSON-RPC 方法名,如 `"eth_requestAccounts"`。
290
+ * @param params - 可选请求参数,数组或对象。
291
+ * @returns provider `request` 的原始返回值。
292
+ */
143
293
  declare function requestWallet(eip1193: WalletEventProvider, method: string, params?: EthereumRequestParams): Promise<any>;
294
+ /**
295
+ * 连接钱包账户并初始化 signer。
296
+ * @param requestAccounts - 请求账户的函数,通常调用 `eth_requestAccounts`。
297
+ * @param getProvider - 获取当前 BrowserProvider 的函数。
298
+ * @param setSigner - 设置 signer 的回调。
299
+ * @param markConnected - 标记已连接的回调。
300
+ * @returns 连接结果 `{ address: string; signer: JsonRpcSigner }`。
301
+ * @throws 钱包未返回账户时抛错。
302
+ */
144
303
  declare function connectWalletAccount(requestAccounts: () => Promise<unknown>, getProvider: () => BrowserProvider, setSigner: (signer: JsonRpcSigner) => void, markConnected: () => void): Promise<{
145
304
  address: string;
146
305
  signer: JsonRpcSigner;
147
306
  }>;
307
+ /**
308
+ * 同步当前钱包账户地址与 signer(不触发授权弹窗)。
309
+ * @param getProvider - 获取当前 BrowserProvider 的函数。
310
+ * @param setSigner - 设置 signer 的回调。
311
+ * @param markConnected - 标记已连接的回调。
312
+ * @param nextAddress - 可选指定账户地址;未传则使用 provider 默认账户。
313
+ * @returns 同步结果 `{ address: string; signer: JsonRpcSigner }`。
314
+ */
148
315
  declare function syncWalletAccountAddress(getProvider: () => BrowserProvider, setSigner: (signer: JsonRpcSigner) => void, markConnected: () => void, nextAddress?: string): Promise<{
149
316
  address: string;
150
317
  signer: JsonRpcSigner;
151
318
  }>;
319
+ /**
320
+ * 清除钱包运行时缓存(provider、signer、可选 selectedProvider)。
321
+ * @param cache - 运行时缓存对象。
322
+ * @param cache.provider - BrowserProvider 缓存引用。
323
+ * @param cache.signer - Signer 缓存引用。
324
+ * @param cache.selectedProvider - 可选,当前选中的 EIP-1193 provider 缓存引用。
325
+ */
152
326
  declare function clearWalletRuntime(cache: {
153
327
  provider: MutableRef<BrowserProvider | null>;
154
328
  signer: MutableRef<JsonRpcSigner | null>;
@@ -161,8 +335,16 @@ type WalletProviderEventMap = {
161
335
  };
162
336
  type WalletProviderEventName = keyof WalletProviderEventMap;
163
337
  type WalletProviderEventListener<K extends WalletProviderEventName = WalletProviderEventName> = (payload: WalletProviderEventMap[K]) => void | Promise<void>;
164
- /** 设置当前钱包 EIP-1193 provider,供事件监听使用 */
338
+ /**
339
+ * 设置当前钱包 EIP-1193 provider,供 `walletEvents` 事件监听使用。
340
+ * @param provider - 钱包 EIP-1193 provider;传 `null` 则解除绑定。
341
+ */
165
342
  declare function setWalletEventProvider(provider: WalletEventProvider | null): void;
343
+ /**
344
+ * 获取当前已设置的钱包 EIP-1193 provider。
345
+ * @returns {@link WalletEventProvider}。
346
+ * @throws 未调用 `setWalletEventProvider` 时抛错。
347
+ */
166
348
  declare function getWalletEventProvider(): WalletEventProvider;
167
349
  declare class WalletEventsEmitter {
168
350
  on(event: "accountsChanged", listener: WalletProviderEventListener<"accountsChanged">): void;
@@ -174,64 +356,117 @@ declare class WalletEventsEmitter {
174
356
  clear(): void;
175
357
  }
176
358
  type WalletEvents = WalletEventsEmitter;
359
+ /** 钱包事件总线,支持 `accountsChanged` / `chainChanged` 监听。需先 `setWalletEventProvider`。 */
177
360
  declare const walletEvents: WalletEventsEmitter;
178
361
 
179
- /** 是否在浏览器环境(模块加载时判定一次) */
362
+ /** 是否在浏览器环境(模块加载时判定一次)。 */
180
363
  declare const isBrowser: boolean;
181
- /** 仅浏览器可用的操作入口;检测类 API 请用 isBrowser 后 return false */
364
+ /**
365
+ * 断言当前为浏览器环境;非浏览器时抛错。
366
+ * 检测类 API 请先用 {@link isBrowser} 判断后返回,而非调用此函数。
367
+ * @param apiName - 调用方 API 名称,用于错误信息,如 `"walletEvents.on"`。
368
+ * @throws 非浏览器环境时抛错。
369
+ */
182
370
  declare function assertBrowser(apiName: string): void;
183
371
 
184
- /** 是否检测到 MetaMask */
372
+ /**
373
+ * 是否检测到 MetaMask(injected 或 EIP-6963)。
374
+ * @returns 浏览器中检测到 MetaMask 为 `true`;非浏览器或未检测到为 `false`。
375
+ */
185
376
  declare function isEthereumProvider(): boolean;
186
- /** 是否检测到 Coinbase Wallet */
377
+ /**
378
+ * 是否检测到 Coinbase Wallet。
379
+ * @returns 浏览器中检测到 Coinbase 为 `true`;非浏览器或未检测到为 `false`。
380
+ */
187
381
  declare function isCoinbaseProvider(): boolean;
188
- /** 是否检测到通用 Injected 钱包 */
382
+ /**
383
+ * 是否检测到通用 injected 以太坊钱包(含多钱包聚合器)。
384
+ * @returns 浏览器中存在可用 injected provider 为 `true`;否则 `false`。
385
+ */
189
386
  declare function isInjectedProvider(): boolean;
190
- /** 是否检测到 TronLink */
387
+ /**
388
+ * 是否检测到 TronLink。
389
+ * @returns 浏览器中 `window.tron` 或 `window.tronLink` 可用为 `true`;否则 `false`。
390
+ */
191
391
  declare function isTronLinkProvider(): boolean;
192
392
 
193
- /** 初始化并持久化配置,任意模块均可通过 getWalletSdkConfig 读取 */
393
+ /**
394
+ * 初始化 SDK 并将配置持久化到 `globalThis`,供各模块通过 `getWalletSdkConfig` 读取。
395
+ * @param options - 初始化选项,见 {@link WalletSdkInitOptions}。
396
+ * @param options.isMainnet - `true` 使用 BSC 主网,`false` 使用 BSC 测试网。
397
+ * @param options.contract - 业务合约配置(`address` + `abi`)。
398
+ * @returns 完整 SDK 配置 {@link WalletSdkConfig}。
399
+ */
194
400
  declare function initWalletSdk(options: WalletSdkInitOptions): WalletSdkConfig;
401
+ /**
402
+ * 读取已初始化的 SDK 配置。
403
+ * @returns 当前 {@link WalletSdkConfig}。
404
+ * @throws 未调用 `initWalletSdk` 时抛错。
405
+ */
195
406
  declare function getWalletSdkConfig(): WalletSdkConfig;
407
+ /**
408
+ * 判断 SDK 是否已完成初始化。
409
+ * @returns 已调用 `initWalletSdk` 为 `true`,否则 `false`。
410
+ */
196
411
  declare function isWalletSdkInitialized(): boolean;
412
+ /**
413
+ * 清除已持久化的 SDK 配置(主要用于测试或热重载)。
414
+ */
197
415
  declare function resetWalletSdkConfig(): void;
198
416
 
199
417
  declare const BSC_NETWORK: {
200
418
  chainId: string;
201
419
  chainName: string;
202
- nativeCurrencyName: string;
203
- nativeCurrencySymbol: string;
204
- nativeCurrencyDecimals: string;
205
- rpcUrl: string;
206
- blockExplorerUrl: string;
420
+ nativeCurrency: {
421
+ name: string;
422
+ symbol: string;
423
+ decimals: number;
424
+ };
425
+ rpcUrls: string[];
426
+ blockExplorerUrls: string[];
207
427
  };
208
428
  declare const BSC_TESTNET_NETWORK: {
209
429
  chainId: string;
210
430
  chainName: string;
211
- nativeCurrencyName: string;
212
- nativeCurrencySymbol: string;
213
- nativeCurrencyDecimals: string;
214
- rpcUrl: string;
215
- blockExplorerUrl: string;
216
- };
217
- declare function getDefaultBscConfig(isProd?: boolean): {
218
- chainId: string;
219
- chainName: string;
220
- nativeCurrencyName: string;
221
- nativeCurrencySymbol: string;
222
- nativeCurrencyDecimals: string;
223
- rpcUrl: string;
224
- blockExplorerUrl: string;
431
+ nativeCurrency: {
432
+ name: string;
433
+ symbol: string;
434
+ decimals: number;
435
+ };
436
+ rpcUrls: string[];
437
+ blockExplorerUrls: string[];
225
438
  };
226
439
 
227
- /** BSC USDT 合约地址 */
440
+ /** BSC 主网 / 测试网 USDT 合约地址,key 为十六进制 chainId。 */
228
441
  declare const USDT_CONTRACT_ADDRESSES: {
229
442
  readonly [BSC_NETWORK.chainId]: "0x55d398326f99059fF775485246999027B3197955";
230
443
  readonly [BSC_TESTNET_NETWORK.chainId]: "0x66E972502A34A625828C544a1914E8D8cc2A9dE5";
231
444
  };
445
+ /**
446
+ * 根据 chainId 解析 BSC USDT 合约地址。
447
+ * @param chainId - 十六进制 chainId,如 `"0x38"` 或 `"0x61"`。
448
+ * @returns USDT 合约地址字符串。
449
+ * @throws 不支持的 chainId 时抛错。
450
+ */
232
451
  declare function resolveUsdtContractAddress(chainId: string): "0x55d398326f99059fF775485246999027B3197955" | "0x66E972502A34A625828C544a1914E8D8cc2A9dE5";
452
+ /**
453
+ * 根据是否主网解析 BSC 链配置。
454
+ * @param isMainnet - `true` 返回 BSC 主网,`false` 返回 BSC 测试网。
455
+ * @returns {@link ChainConfig}。
456
+ */
233
457
  declare function resolveChainByMainnet(isMainnet: boolean): ChainConfig;
458
+ /**
459
+ * 根据是否主网解析 BSC USDT 合约地址。
460
+ * @param isMainnet - `true` 主网 USDT,`false` 测试网 USDT。
461
+ * @returns USDT 合约地址字符串。
462
+ */
234
463
  declare function resolveUsdtByMainnet(isMainnet: boolean): "0x55d398326f99059fF775485246999027B3197955" | "0x66E972502A34A625828C544a1914E8D8cc2A9dE5";
464
+ /**
465
+ * 根据 chainId 解析 BSC 链配置。
466
+ * @param chainId - 十六进制 chainId,如 `"0x38"` 或 `"0x61"`。
467
+ * @returns {@link ChainConfig}。
468
+ * @throws 不支持的 chainId 时抛错。
469
+ */
235
470
  declare function resolveChainConfig(chainId: string): ChainConfig;
236
471
 
237
472
  declare const USDT_CONFIG: {
@@ -325,4 +560,4 @@ declare const ERC20_ABI: ({
325
560
  stateMutability?: undefined;
326
561
  })[];
327
562
 
328
- export { BSC_NETWORK, BSC_TESTNET_NETWORK, type ChainConfig, type ContractConfig, ERC20_ABI, ERC20_DECIMALS, ERC20_DECIMALS_ABI, type Eip6963ProviderDetail, type Eip6963ProviderInfo, type EthereumRequestParams, type EvmReadProvider, type GetContractReadOptions, type InjectedEthereumProvider, type MutableRef, USDT_CONFIG, USDT_CONTRACT_ADDRESSES, type WalletEventProvider, type WalletEvents, type WalletProviderEventListener, type WalletProviderEventMap, type WalletProviderEventName, type WalletSdkConfig, type WalletSdkInitOptions, assertBrowser, bindBrowserProvider, buildEthereumChainParams, clearWalletRuntime, connectWalletAccount, createJsonRpcReadProvider, discoverWalletProviders, ensureTargetNetwork, findCoinbaseEip6963Provider, findDiscoveredProvider, findMetaMaskEip6963Provider, getAggregatedInjectedProvider, getConfiguredReadProvider, getContractDecimals, getContractPrice, getDefaultBscConfig, getInjectedEthereumProviders, getReadProviderWithFallback, getSharedBrowserProvider, getWalletEventProvider, getWalletSdkConfig, hasAggregatedInjectedProvider, hasCoinbaseEip6963Provider, hasCoinbaseInjectedProvider, hasDeployedContract, hasMetaMaskEip6963Provider, hasMetaMaskInjectedProvider, hasRecoverableAggregatorProvider, initWalletSdk, isBrowser, isCoinbaseProvider, isContractDeployed, isEthereumProvider, isInjectedProvider, isTronLinkProvider, isWalletSdkInitialized, readErc20Decimals, rememberAggregatorProvider, requestWallet, resetWalletSdkConfig, resolveChainByMainnet, resolveChainConfig, resolveCoinbaseInjectedProvider, resolveMetaMaskInjectedProvider, resolveUsdtByMainnet, resolveUsdtContractAddress, setWalletEventProvider, setWalletReadProvider, syncWalletAccountAddress, toChainIdDecimal, walletEvents };
563
+ export { BSC_NETWORK, BSC_TESTNET_NETWORK, type ChainConfig, type ChainNativeCurrency, type ContractConfig, ERC20_ABI, ERC20_DECIMALS, ERC20_DECIMALS_ABI, type Eip6963ProviderDetail, type Eip6963ProviderInfo, type EthereumRequestParams, type EvmReadProvider, type GetContractReadOptions, type InjectedEthereumProvider, type MutableRef, USDT_CONFIG, USDT_CONTRACT_ADDRESSES, type WalletEventProvider, type WalletEvents, type WalletProviderEventListener, type WalletProviderEventMap, type WalletProviderEventName, type WalletSdkConfig, type WalletSdkInitOptions, assertBrowser, bindBrowserProvider, clearWalletRuntime, connectWalletAccount, createJsonRpcReadProvider, discoverWalletProviders, ensureTargetNetwork, findCoinbaseEip6963Provider, findDiscoveredProvider, findMetaMaskEip6963Provider, getAggregatedInjectedProvider, getConfiguredReadProvider, getContractDecimals, getContractPrice, getInjectedEthereumProviders, getReadProviderWithFallback, getSharedBrowserProvider, getWalletEventProvider, getWalletSdkConfig, hasAggregatedInjectedProvider, hasCoinbaseEip6963Provider, hasCoinbaseInjectedProvider, hasDeployedContract, hasMetaMaskEip6963Provider, hasMetaMaskInjectedProvider, hasRecoverableAggregatorProvider, initWalletSdk, isBrowser, isCoinbaseProvider, isContractDeployed, isEthereumProvider, isInjectedProvider, isTronLinkProvider, isWalletSdkInitialized, readErc20Decimals, rememberAggregatorProvider, requestWallet, resetWalletSdkConfig, resolveChainByMainnet, resolveChainConfig, resolveCoinbaseInjectedProvider, resolveMetaMaskInjectedProvider, resolveUsdtByMainnet, resolveUsdtContractAddress, setWalletEventProvider, setWalletReadProvider, syncWalletAccountAddress, toChainIdDecimal, walletEvents };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { BrowserProvider, Contract, JsonRpcProvider, formatUnits } from 'ethers';
2
2
 
3
- // src/chain.ts
3
+ // src/utils/chain.ts
4
4
  function toChainIdDecimal(chainId, fallback) {
5
5
  const decimal = Number.parseInt(chainId, 16);
6
6
  if (Number.isFinite(decimal)) return decimal;
@@ -8,7 +8,7 @@ function toChainIdDecimal(chainId, fallback) {
8
8
  return Number.NaN;
9
9
  }
10
10
 
11
- // src/env.ts
11
+ // src/utils/env.ts
12
12
  var isBrowser = typeof window !== "undefined";
13
13
  function assertBrowser(apiName) {
14
14
  if (!isBrowser) {
@@ -16,7 +16,7 @@ function assertBrowser(apiName) {
16
16
  }
17
17
  }
18
18
 
19
- // src/eip6963.ts
19
+ // src/wallet/eip6963.ts
20
20
  var METAMASK_RDNS = "io.metamask";
21
21
  var COINBASE_RDNS = "com.coinbase.wallet";
22
22
  var discoveredProviders = [];
@@ -76,7 +76,7 @@ function getSharedBrowserProvider(ethereum) {
76
76
  return provider;
77
77
  }
78
78
 
79
- // src/injected-providers.ts
79
+ // src/wallet/injected-providers.ts
80
80
  var isRequestableProvider = (provider) => {
81
81
  return Boolean(provider && typeof provider.request === "function");
82
82
  };
@@ -528,24 +528,33 @@ var ERC20_ABI = [
528
528
  var BSC_NETWORK = {
529
529
  chainId: "0x38",
530
530
  chainName: "BNB Smart Chain",
531
- nativeCurrencyName: "BNB",
532
- nativeCurrencySymbol: "BNB",
533
- nativeCurrencyDecimals: "18",
534
- rpcUrl: "https://bsc-dataseed.binance.org/",
535
- blockExplorerUrl: "https://bscscan.com"
531
+ nativeCurrency: {
532
+ name: "BNB",
533
+ symbol: "BNB",
534
+ decimals: 18
535
+ },
536
+ rpcUrls: [
537
+ "https://bsc-dataseed.binance.org/",
538
+ "https://bsc-dataseed1.binance.org/",
539
+ "https://bsc-dataseed2.binance.org/"
540
+ ],
541
+ blockExplorerUrls: ["https://bscscan.com"]
536
542
  };
537
543
  var BSC_TESTNET_NETWORK = {
538
544
  chainId: "0x61",
539
545
  chainName: "BNB Smart Chain Testnet",
540
- nativeCurrencyName: "tBNB",
541
- nativeCurrencySymbol: "tBNB",
542
- nativeCurrencyDecimals: "18",
543
- rpcUrl: "https://data-seed-prebsc-1-s1.bnbchain.org:8545/",
544
- blockExplorerUrl: "https://testnet.bscscan.com"
546
+ nativeCurrency: {
547
+ name: "tBNB",
548
+ symbol: "tBNB",
549
+ decimals: 18
550
+ },
551
+ rpcUrls: [
552
+ "https://data-seed-prebsc-1-s1.bnbchain.org:8545/",
553
+ "https://data-seed-prebsc-2-s1.bnbchain.org:8545/",
554
+ "https://data-seed-prebsc-1-s2.bnbchain.org:8545/"
555
+ ],
556
+ blockExplorerUrls: ["https://testnet.bscscan.com"]
545
557
  };
546
- function getDefaultBscConfig(isProd = typeof process !== "undefined" && process.env.NODE_ENV === "production") {
547
- return isProd ? BSC_NETWORK : BSC_TESTNET_NETWORK;
548
- }
549
558
 
550
559
  // src/config/resolve-chain.ts
551
560
  var USDT_CONTRACT_ADDRESSES = {
@@ -584,7 +593,7 @@ var USDT_CONFIG = {
584
593
  };
585
594
  var ERC20_DECIMALS = USDT_CONFIG.decimals;
586
595
 
587
- // src/contract.ts
596
+ // src/core/contract.ts
588
597
  var ERC20_DECIMALS_ABI = ["function decimals() view returns (uint8)"];
589
598
  async function hasDeployedContract(readProvider, address) {
590
599
  const code = await readProvider.getCode(address);
@@ -603,7 +612,7 @@ async function readErc20Decimals(readProvider, tokenAddress, erc20Abi = ERC20_DE
603
612
  }
604
613
  }
605
614
 
606
- // src/init.ts
615
+ // src/core/init.ts
607
616
  var CONFIG_KEY = "__WALLET_SDK_CONFIG__";
608
617
  function getStoredConfig() {
609
618
  return globalThis[CONFIG_KEY] ?? null;
@@ -660,13 +669,14 @@ function createJsonRpcReadProvider(rpcUrl, chainIdHex, cache) {
660
669
  }
661
670
  function getReadProviderWithFallback(walletProvider, rpcConfig, fallbackCache) {
662
671
  if (walletProvider) return walletProvider;
663
- if (!rpcConfig.rpcUrl || !rpcConfig.chainId) {
672
+ const rpcUrl = rpcConfig.rpcUrls[0];
673
+ if (!rpcUrl || !rpcConfig.chainId) {
664
674
  throw new Error("RPC config is missing");
665
675
  }
666
- return createJsonRpcReadProvider(rpcConfig.rpcUrl, rpcConfig.chainId, fallbackCache);
676
+ return createJsonRpcReadProvider(rpcUrl, rpcConfig.chainId, fallbackCache);
667
677
  }
668
678
 
669
- // src/contract-read.ts
679
+ // src/core/contract-read.ts
670
680
  var readProviderCache = { current: null };
671
681
  var walletReadProvider = null;
672
682
  function setWalletReadProvider(provider) {
@@ -699,20 +709,7 @@ async function getContractPrice(contractAddress, options) {
699
709
  return formatUnits(price, decimals);
700
710
  }
701
711
 
702
- // src/network.ts
703
- function buildEthereumChainParams(config) {
704
- return {
705
- chainId: config.chainId,
706
- chainName: config.chainName,
707
- nativeCurrency: {
708
- name: config.nativeCurrencyName,
709
- symbol: config.nativeCurrencySymbol,
710
- decimals: Number(config.nativeCurrencyDecimals) || 18
711
- },
712
- rpcUrls: [config.rpcUrl],
713
- blockExplorerUrls: [config.blockExplorerUrl]
714
- };
715
- }
712
+ // src/core/network.ts
716
713
  async function ensureTargetNetwork(options) {
717
714
  const currentChainId = await options.getCurrentChainId();
718
715
  if (currentChainId.toLowerCase() === options.targetChainId.toLowerCase()) return;
@@ -770,7 +767,7 @@ function clearWalletRuntime(cache) {
770
767
  }
771
768
  }
772
769
 
773
- // src/wallet-events.ts
770
+ // src/wallet/events.ts
774
771
  var eventHandlers = {};
775
772
  var providerBridges = /* @__PURE__ */ new WeakMap();
776
773
  var walletEventProvider = null;
@@ -866,7 +863,7 @@ var WalletEventsEmitter = class {
866
863
  };
867
864
  var walletEvents = new WalletEventsEmitter();
868
865
 
869
- // src/wallet-detection.ts
866
+ // src/wallet/detection.ts
870
867
  function isEthereumProvider() {
871
868
  if (!isBrowser) return false;
872
869
  return hasMetaMaskInjectedProvider() || hasMetaMaskEip6963Provider();
@@ -884,4 +881,4 @@ function isTronLinkProvider() {
884
881
  return Boolean(window.tron?.request || window.tronLink);
885
882
  }
886
883
 
887
- export { BSC_NETWORK, BSC_TESTNET_NETWORK, ERC20_ABI, ERC20_DECIMALS, ERC20_DECIMALS_ABI, USDT_CONFIG, USDT_CONTRACT_ADDRESSES, assertBrowser, bindBrowserProvider, buildEthereumChainParams, clearWalletRuntime, connectWalletAccount, createJsonRpcReadProvider, discoverWalletProviders, ensureTargetNetwork, findCoinbaseEip6963Provider, findDiscoveredProvider, findMetaMaskEip6963Provider, getAggregatedInjectedProvider, getConfiguredReadProvider, getContractDecimals, getContractPrice, getDefaultBscConfig, getInjectedEthereumProviders, getReadProviderWithFallback, getSharedBrowserProvider, getWalletEventProvider, getWalletSdkConfig, hasAggregatedInjectedProvider, hasCoinbaseEip6963Provider, hasCoinbaseInjectedProvider, hasDeployedContract, hasMetaMaskEip6963Provider, hasMetaMaskInjectedProvider, hasRecoverableAggregatorProvider, initWalletSdk, isBrowser, isCoinbaseProvider, isContractDeployed, isEthereumProvider, isInjectedProvider, isTronLinkProvider, isWalletSdkInitialized, readErc20Decimals, rememberAggregatorProvider, requestWallet, resetWalletSdkConfig, resolveChainByMainnet, resolveChainConfig, resolveCoinbaseInjectedProvider, resolveMetaMaskInjectedProvider, resolveUsdtByMainnet, resolveUsdtContractAddress, setWalletEventProvider, setWalletReadProvider, syncWalletAccountAddress, toChainIdDecimal, walletEvents };
884
+ export { BSC_NETWORK, BSC_TESTNET_NETWORK, ERC20_ABI, ERC20_DECIMALS, ERC20_DECIMALS_ABI, USDT_CONFIG, USDT_CONTRACT_ADDRESSES, assertBrowser, bindBrowserProvider, clearWalletRuntime, connectWalletAccount, createJsonRpcReadProvider, discoverWalletProviders, ensureTargetNetwork, findCoinbaseEip6963Provider, findDiscoveredProvider, findMetaMaskEip6963Provider, getAggregatedInjectedProvider, getConfiguredReadProvider, getContractDecimals, getContractPrice, getInjectedEthereumProviders, getReadProviderWithFallback, getSharedBrowserProvider, getWalletEventProvider, getWalletSdkConfig, hasAggregatedInjectedProvider, hasCoinbaseEip6963Provider, hasCoinbaseInjectedProvider, hasDeployedContract, hasMetaMaskEip6963Provider, hasMetaMaskInjectedProvider, hasRecoverableAggregatorProvider, initWalletSdk, isBrowser, isCoinbaseProvider, isContractDeployed, isEthereumProvider, isInjectedProvider, isTronLinkProvider, isWalletSdkInitialized, readErc20Decimals, rememberAggregatorProvider, requestWallet, resetWalletSdkConfig, resolveChainByMainnet, resolveChainConfig, resolveCoinbaseInjectedProvider, resolveMetaMaskInjectedProvider, resolveUsdtByMainnet, resolveUsdtContractAddress, setWalletEventProvider, setWalletReadProvider, syncWalletAccountAddress, toChainIdDecimal, walletEvents };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@earthworm/wallet-sdk",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "EVM wallet utilities for browser DApps",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -38,6 +38,10 @@
38
38
  },
39
39
  "scripts": {
40
40
  "build": "tsup",
41
- "dev": "tsup --watch"
41
+ "dev": "tsup --watch",
42
+ "release": "pnpm publish --access public",
43
+ "release:patch": "npm version patch && pnpm run release",
44
+ "release:minor": "npm version minor && pnpm run release",
45
+ "release:major": "npm version major && pnpm run release"
42
46
  }
43
47
  }