@earthworm/wallet-sdk 0.1.0 → 0.2.1
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 +3 -16
- package/dist/index.d.ts +291 -56
- package/dist/index.js +36 -39
- package/package.json +12 -5
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @earthworm/wallet-sdk
|
|
2
2
|
|
|
3
|
-
Browser EVM wallet SDK for DApps (MetaMask, Coinbase, TronLink,
|
|
3
|
+
Browser EVM wallet SDK for DApps (MetaMask, Coinbase, TronLink, TokenPocket, contract reads).
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
@@ -11,10 +11,10 @@ pnpm add @earthworm/wallet-sdk ethers
|
|
|
11
11
|
## Usage
|
|
12
12
|
|
|
13
13
|
```ts
|
|
14
|
-
import { initWalletSdk,
|
|
14
|
+
import { initWalletSdk, walletEvents } from "@earthworm/wallet-sdk";
|
|
15
15
|
|
|
16
16
|
initWalletSdk({
|
|
17
|
-
isMainnet: true,
|
|
17
|
+
isMainnet: true, // Set to true for mainnet, false for testnet
|
|
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
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
/**
|
|
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
|
-
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
372
|
+
/**
|
|
373
|
+
* 是否检测到 MetaMask(injected 或 EIP-6963)。
|
|
374
|
+
* @returns 浏览器中检测到 MetaMask 为 `true`;非浏览器或未检测到为 `false`。
|
|
375
|
+
*/
|
|
185
376
|
declare function isEthereumProvider(): boolean;
|
|
186
|
-
/**
|
|
377
|
+
/**
|
|
378
|
+
* 是否检测到 Coinbase Wallet。
|
|
379
|
+
* @returns 浏览器中检测到 Coinbase 为 `true`;非浏览器或未检测到为 `false`。
|
|
380
|
+
*/
|
|
187
381
|
declare function isCoinbaseProvider(): boolean;
|
|
188
|
-
/**
|
|
382
|
+
/**
|
|
383
|
+
* 是否检测到通用 injected 以太坊钱包(含多钱包聚合器)。
|
|
384
|
+
* @returns 浏览器中存在可用 injected provider 为 `true`;否则 `false`。
|
|
385
|
+
*/
|
|
189
386
|
declare function isInjectedProvider(): boolean;
|
|
190
|
-
/**
|
|
387
|
+
/**
|
|
388
|
+
* 是否检测到 TronLink。
|
|
389
|
+
* @returns 浏览器中 `window.tron` 或 `window.tronLink` 可用为 `true`;否则 `false`。
|
|
390
|
+
*/
|
|
191
391
|
declare function isTronLinkProvider(): boolean;
|
|
192
392
|
|
|
193
|
-
/**
|
|
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
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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,
|
|
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
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
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
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
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,
|
|
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,9 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@earthworm/wallet-sdk",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "EVM wallet utilities for browser DApps",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=20.0.0"
|
|
9
|
+
},
|
|
7
10
|
"publishConfig": {
|
|
8
11
|
"access": "public"
|
|
9
12
|
},
|
|
@@ -21,10 +24,10 @@
|
|
|
21
24
|
},
|
|
22
25
|
"keywords": [
|
|
23
26
|
"ethereum",
|
|
24
|
-
"wallet",
|
|
25
|
-
"eip6963",
|
|
26
27
|
"ethers",
|
|
27
|
-
"dapp"
|
|
28
|
+
"dapp",
|
|
29
|
+
"wallets",
|
|
30
|
+
"bsc"
|
|
28
31
|
],
|
|
29
32
|
"license": "MIT",
|
|
30
33
|
"author": "Alex",
|
|
@@ -38,6 +41,10 @@
|
|
|
38
41
|
},
|
|
39
42
|
"scripts": {
|
|
40
43
|
"build": "tsup",
|
|
41
|
-
"dev": "tsup --watch"
|
|
44
|
+
"dev": "tsup --watch",
|
|
45
|
+
"release": "pnpm publish --access public",
|
|
46
|
+
"release:patch": "npm version patch && pnpm run release",
|
|
47
|
+
"release:minor": "npm version minor && pnpm run release",
|
|
48
|
+
"release:major": "npm version major && pnpm run release"
|
|
42
49
|
}
|
|
43
50
|
}
|