@qinzhehan/rainbow-wallet-kit 0.1.2 → 0.1.4

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/index.mjs CHANGED
@@ -1,131 +1,226 @@
1
- var B = Object.defineProperty;
2
- var j = (e, t, n) => t in e ? B(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
3
- var E = (e, t, n) => j(e, typeof t != "symbol" ? t + "" : t, n);
4
- import { jsx as f, jsxs as N } from "react/jsx-runtime";
5
- import { createContext as z, useRef as M, useState as K, useMemo as P, useCallback as D, useEffect as v, useContext as H } from "react";
6
- class w extends Error {
7
- constructor(n, a, s) {
1
+ var _ = Object.defineProperty;
2
+ var $ = (e, t, n) => t in e ? _(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
3
+ var B = (e, t, n) => $(e, typeof t != "symbol" ? t + "" : t, n);
4
+ import { jsx as i, jsxs as D, Fragment as P } from "react/jsx-runtime";
5
+ import { createContext as ee, useRef as q, useState as N, useMemo as R, useCallback as F, useEffect as W, useContext as te } from "react";
6
+ class l extends Error {
7
+ // constructor 在创建错误对象时保存错误码、错误消息和原始原因。
8
+ constructor(n, a, o) {
8
9
  super(a);
9
- E(this, "code");
10
- E(this, "cause");
11
- this.name = "WalletKitError", this.code = n, this.cause = s;
10
+ // code 保存机器可读的错误码。
11
+ B(this, "code");
12
+ // cause 保存原始错误,方便调试底层钱包报错。
13
+ B(this, "cause");
14
+ this.name = "WalletKitError", this.code = n, this.cause = o;
12
15
  }
13
16
  }
14
- function G(e) {
17
+ function ne(e) {
15
18
  return [
19
+ // 第一行显示业务名称,如果没有传 audience 就用默认的 Wallet Login。
16
20
  e.audience ?? "Wallet Login",
21
+ // 插入空行,让钱包签名弹窗里显示更易读。
17
22
  "",
23
+ // 写入钱包类型,例如 metamask。
18
24
  `Wallet: ${e.wallet}`,
25
+ // 写入钱包地址,后端验签时会用到。
19
26
  `Address: ${e.address}`,
27
+ // 写入链类型,例如 evm。
20
28
  `Chain: ${e.chainType}`,
29
+ // 写入一次性 nonce,防止旧签名被重复使用。
21
30
  `Nonce: ${e.nonce}`,
31
+ // 写入签发时间,方便后端或用户审计。
22
32
  `Issued At: ${(/* @__PURE__ */ new Date()).toISOString()}`
33
+ // 用换行符把上面的数组拼成一整段签名文本。
23
34
  ].join(`
24
35
  `);
25
36
  }
26
- async function X(e) {
27
- var s;
28
- if (!((s = e.auth) != null && s.enabled)) return;
37
+ async function ae(e) {
38
+ var o;
39
+ if (!((o = e.auth) != null && o.enabled)) return;
29
40
  if (!e.auth.getNonce || !e.auth.verifySignature)
30
- throw new w("AUTH_FAILED", "Wallet auth requires getNonce and verifySignature callbacks.");
41
+ throw new l("AUTH_FAILED", "Wallet auth requires getNonce and verifySignature callbacks.");
31
42
  const t = await e.auth.getNonce({
43
+ // 告诉后端当前使用的钱包类型。
32
44
  wallet: e.wallet,
45
+ // 告诉后端当前钱包地址。
33
46
  address: e.account.address,
47
+ // 告诉后端当前链生态。
34
48
  chainType: e.account.chainType,
49
+ // 透传业务名称。
35
50
  audience: e.auth.audience
36
- }), n = G({
51
+ }), n = ne({
52
+ // 放入一次性 nonce。
37
53
  nonce: t,
54
+ // 放入钱包地址。
38
55
  address: e.account.address,
56
+ // 放入钱包类型。
39
57
  wallet: e.wallet,
58
+ // 放入链生态。
40
59
  chainType: e.account.chainType,
60
+ // 放入业务名称。
41
61
  audience: e.auth.audience
42
- }), a = await e.signMessage(n).catch((h) => {
43
- throw new w("SIGNATURE_REJECTED", "Wallet signature was rejected or failed.", h);
62
+ }), a = await e.signMessage(n).catch((g) => {
63
+ throw new l("SIGNATURE_REJECTED", "Wallet signature was rejected or failed.", g);
44
64
  });
45
65
  return e.auth.verifySignature({
66
+ // 传回钱包类型。
46
67
  wallet: e.wallet,
68
+ // 传回钱包地址。
47
69
  address: e.account.address,
70
+ // 传回链生态。
48
71
  chainType: e.account.chainType,
72
+ // 传回业务名称。
49
73
  audience: e.auth.audience,
74
+ // 传回 nonce,后端要检查它是否有效且未使用。
50
75
  nonce: t,
76
+ // 传回签名原文,后端要验证签名对应的就是这段文本。
51
77
  message: n,
78
+ // 传回钱包签名结果。
52
79
  signature: a
53
80
  });
54
81
  }
55
- async function Y(e) {
82
+ async function oe(e) {
56
83
  var t;
57
84
  if (!((t = e.auth) != null && t.enabled) || !e.auth.refreshJwt || !e.session || !e.wallet || !e.account)
58
85
  return e.session;
59
86
  try {
60
87
  return await e.auth.refreshJwt({
88
+ // 传入当前 JWT。
61
89
  token: e.session.token,
90
+ // 传入可选 refreshToken。
62
91
  refreshToken: e.session.refreshToken,
92
+ // 传入钱包类型。
63
93
  wallet: e.wallet,
94
+ // 传入钱包地址。
64
95
  address: e.account.address
65
96
  });
66
97
  } catch (n) {
67
- throw new w("JWT_REFRESH_FAILED", "JWT refresh failed.", n);
98
+ throw new l("JWT_REFRESH_FAILED", "JWT refresh failed.", n);
68
99
  }
69
100
  }
70
- function Q(e, t = 6e4) {
101
+ function se(e, t = 6e4) {
71
102
  return Math.max(0, e.expiresAt - Date.now() - t);
72
103
  }
73
- const _ = {
104
+ const Y = {
105
+ // MetaMask 的 dapp deep link 前缀。
74
106
  metamask: "https://metamask.app.link/dapp/",
107
+ // OKX Wallet 的 dapp deep link 前缀。
75
108
  okx: "okx://wallet/dapp/url?dappUrl=",
109
+ // Phantom 的浏览 deep link 前缀。
76
110
  phantom: "https://phantom.app/ul/browse/"
77
111
  };
78
- function Z() {
112
+ function re() {
79
113
  return typeof navigator > "u" ? !1 : /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);
80
114
  }
81
- function R(e) {
115
+ function x(e) {
82
116
  return e != null && e.dappUrl ? e.dappUrl : typeof window > "u" ? "" : window.location.href;
83
117
  }
84
- function F(e, t, n) {
118
+ function j(e, t, n) {
85
119
  const a = encodeURIComponent(t);
86
- return e === "metamask" ? `${(n == null ? void 0 : n.metamask) ?? _.metamask}${t.replace(/^https?:\/\//, "")}` : e === "okx" ? `${(n == null ? void 0 : n.okx) ?? _.okx}${a}` : `${(n == null ? void 0 : n.phantom) ?? _.phantom}${a}?ref=${a}`;
120
+ return e === "metamask" ? `${(n == null ? void 0 : n.metamask) ?? Y.metamask}${t.replace(/^https?:\/\//, "")}` : e === "okx" ? `${(n == null ? void 0 : n.okx) ?? Y.okx}${a}` : `${(n == null ? void 0 : n.phantom) ?? Y.phantom}${a}?ref=${a}`;
87
121
  }
88
- class L {
122
+ class ce {
89
123
  constructor() {
90
- E(this, "listeners", /* @__PURE__ */ new Map());
124
+ // listeners 保存所有事件名和对应的监听函数集合。
125
+ B(this, "listeners", /* @__PURE__ */ new Map());
91
126
  }
127
+ // on 用来注册事件监听,并返回一个取消监听的函数。
92
128
  on(t, n) {
93
129
  const a = this.listeners.get(t) ?? /* @__PURE__ */ new Set();
94
130
  return a.add(n), this.listeners.set(t, a), () => this.off(t, n);
95
131
  }
132
+ // off 用来移除某个事件上的某个监听函数。
96
133
  off(t, n) {
97
134
  var a;
98
135
  (a = this.listeners.get(t)) == null || a.delete(n);
99
136
  }
137
+ // emit 用来触发事件,把 payload 发给所有监听者。
100
138
  emit(t, n) {
101
139
  var a;
102
- (a = this.listeners.get(t)) == null || a.forEach((s) => s(n));
140
+ (a = this.listeners.get(t)) == null || a.forEach((o) => o(n));
103
141
  }
142
+ // removeAllListeners 用来清空所有事件监听。
104
143
  removeAllListeners() {
105
144
  this.listeners.clear();
106
145
  }
107
146
  }
108
- function W(e) {
109
- var n;
110
- if (e instanceof w) return e;
147
+ function G(e) {
148
+ var n, a;
149
+ if (e instanceof l) return e;
111
150
  const t = e;
112
- return (t == null ? void 0 : t.code) === 4001 || (t == null ? void 0 : t.code) === "ACTION_REJECTED" ? new w("USER_REJECTED", t.message ?? "User rejected wallet request.", e) : (n = t == null ? void 0 : t.message) != null && n.toLowerCase().includes("timeout") ? new w("CONNECT_TIMEOUT", t.message, e) : new w("UNKNOWN", (t == null ? void 0 : t.message) ?? "Unexpected wallet error.", e);
151
+ return (t == null ? void 0 : t.code) === 4001 || (t == null ? void 0 : t.code) === "ACTION_REJECTED" ? new l("USER_REJECTED", t.message ?? "User rejected wallet request.", e) : (t == null ? void 0 : t.code) === -32002 || (n = t == null ? void 0 : t.message) != null && n.toLowerCase().includes("already pending") ? new l("REQUEST_PENDING", t.message ?? "Wallet request is already pending.", e) : (a = t == null ? void 0 : t.message) != null && a.toLowerCase().includes("timeout") ? new l("CONNECT_TIMEOUT", t.message, e) : new l("UNKNOWN", (t == null ? void 0 : t.message) ?? "Unexpected wallet error.", e);
113
152
  }
114
- function ee(e, t, n) {
153
+ function ie(e, t, n) {
115
154
  let a;
116
- const s = new Promise((h, g) => {
117
- a = setTimeout(() => g(new w("CONNECT_TIMEOUT", n)), t);
155
+ const o = new Promise((g, d) => {
156
+ a = setTimeout(() => d(new l("CONNECT_TIMEOUT", n)), t);
118
157
  });
119
- return Promise.race([e, s]).finally(() => {
158
+ return Promise.race([e, o]).finally(() => {
120
159
  a && clearTimeout(a);
121
160
  });
122
161
  }
123
- const te = "rainbow-wallet-kit:state";
124
- class ne {
162
+ const Ae = [
163
+ {
164
+ id: "ethereum",
165
+ name: "Ethereum",
166
+ chainType: "evm",
167
+ chainId: 1,
168
+ rpcUrls: ["https://rpc.ankr.com/eth"],
169
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
170
+ blockExplorerUrls: ["https://etherscan.io"]
171
+ },
172
+ {
173
+ id: "polygon",
174
+ name: "Polygon",
175
+ chainType: "evm",
176
+ chainId: 137,
177
+ rpcUrls: ["https://polygon-rpc.com"],
178
+ nativeCurrency: { name: "MATIC", symbol: "MATIC", decimals: 18 },
179
+ blockExplorerUrls: ["https://polygonscan.com"]
180
+ },
181
+ {
182
+ id: "bsc",
183
+ name: "BNB Smart Chain",
184
+ chainType: "evm",
185
+ chainId: 56,
186
+ rpcUrls: ["https://bsc-dataseed.binance.org"],
187
+ nativeCurrency: { name: "BNB", symbol: "BNB", decimals: 18 },
188
+ blockExplorerUrls: ["https://bscscan.com"]
189
+ },
190
+ {
191
+ id: "arbitrum",
192
+ name: "Arbitrum One",
193
+ chainType: "evm",
194
+ chainId: 42161,
195
+ rpcUrls: ["https://arb1.arbitrum.io/rpc"],
196
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
197
+ blockExplorerUrls: ["https://arbiscan.io"]
198
+ },
199
+ {
200
+ id: "optimism",
201
+ name: "Optimism",
202
+ chainType: "evm",
203
+ chainId: 10,
204
+ rpcUrls: ["https://mainnet.optimism.io"],
205
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
206
+ blockExplorerUrls: ["https://optimistic.etherscan.io"]
207
+ },
208
+ {
209
+ id: "solana-mainnet",
210
+ name: "Solana Mainnet",
211
+ chainType: "solana",
212
+ chainId: "solana:mainnet"
213
+ }
214
+ ], le = "rainbow-wallet-kit:state";
215
+ class de {
216
+ // constructor 在创建同步器时接收事件总线和 localStorage key。
125
217
  constructor(t, n) {
126
- E(this, "channel");
127
- E(this, "tabId", Math.random().toString(36).slice(2));
128
- E(this, "handleStorage", (t) => {
218
+ // channel 保存 BroadcastChannel 实例,不支持的浏览器里它是 undefined。
219
+ B(this, "channel");
220
+ // tabId 是当前 Tab 的随机 id,用来避免收到自己发出的消息后重复处理。
221
+ B(this, "tabId", Math.random().toString(36).slice(2));
222
+ // handleStorage 是 localStorage 变化时触发的处理函数。
223
+ B(this, "handleStorage", (t) => {
129
224
  if (!(t.key !== this.storageKey || !t.newValue))
130
225
  try {
131
226
  const n = JSON.parse(t.newValue);
@@ -133,17 +228,19 @@ class ne {
133
228
  } catch {
134
229
  }
135
230
  });
136
- this.emitter = t, this.storageKey = n, !(typeof window > "u") && ("BroadcastChannel" in window && (this.channel = new BroadcastChannel(te), this.channel.onmessage = (a) => {
137
- var s;
138
- ((s = a.data) == null ? void 0 : s.tabId) !== this.tabId && this.emitter.emit("state", a.data.state);
231
+ this.emitter = t, this.storageKey = n, !(typeof window > "u") && ("BroadcastChannel" in window && (this.channel = new BroadcastChannel(le), this.channel.onmessage = (a) => {
232
+ var o;
233
+ ((o = a.data) == null ? void 0 : o.tabId) !== this.tabId && this.emitter.emit("state", a.data.state);
139
234
  }), window.addEventListener("storage", this.handleStorage));
140
235
  }
236
+ // publish 用来把当前 Tab 的钱包状态广播出去。
141
237
  publish(t) {
142
238
  var a;
143
239
  if (typeof window > "u") return;
144
240
  const n = { tabId: this.tabId, state: t };
145
241
  localStorage.setItem(this.storageKey, JSON.stringify(n)), (a = this.channel) == null || a.postMessage(n);
146
242
  }
243
+ // read 用来从 localStorage 读取最近一次钱包状态。
147
244
  read() {
148
245
  if (typeof window > "u") return;
149
246
  const t = localStorage.getItem(this.storageKey);
@@ -154,334 +251,626 @@ class ne {
154
251
  return;
155
252
  }
156
253
  }
254
+ // destroy 用来清理事件监听和 BroadcastChannel。
157
255
  destroy() {
158
256
  var t;
159
257
  (t = this.channel) == null || t.close(), typeof window < "u" && window.removeEventListener("storage", this.handleStorage);
160
258
  }
161
259
  }
162
- function S(e) {
163
- var h, g;
260
+ const ue = "data:image/png;base64,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", we = "data:image/png;base64,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", he = "data:image/png;base64,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";
261
+ function O(e) {
262
+ var g, d;
164
263
  if (typeof window > "u") return;
165
- const t = ae(e), n = t.flatMap((l) => l.providers ?? []), a = x([...t, ...n]);
264
+ const t = me(e), n = t.flatMap((u) => u.providers ?? []), a = v([...t, ...n]);
166
265
  if (e === "okx") {
167
- const l = a.find(p);
168
- if (l) return l;
169
- if ((h = window.okxwallet) != null && h.request) return window.okxwallet;
266
+ const u = a.find(b);
267
+ if (u) return u;
268
+ if ((g = window.okxwallet) != null && g.request) return window.okxwallet;
170
269
  }
171
270
  if (n != null && n.length) {
172
- const l = n.find((y) => e === "metamask" ? y.isMetaMask && !y.isOkxWallet : p(y));
173
- if (l) return l;
271
+ const u = n.find((E) => e === "metamask" ? E.isMetaMask && !E.isOkxWallet : b(E));
272
+ if (u) return u;
174
273
  }
175
- const s = e === "metamask" ? window.ethereum : ((g = window.okxwallet) == null ? void 0 : g.ethereum) ?? window.ethereum;
176
- if (e === "metamask" && (s != null && s.isMetaMask) && !p(s) || e === "okx" && s && p(s)) return s;
274
+ const o = e === "metamask" ? window.ethereum : ((d = window.okxwallet) == null ? void 0 : d.ethereum) ?? window.ethereum;
275
+ if (e === "metamask" && (o != null && o.isMetaMask) && !b(o) || e === "okx" && o && b(o)) return o;
177
276
  }
178
- function ae(e) {
277
+ function me(e) {
179
278
  var n, a;
180
279
  const t = [
280
+ // window.ethereum 是 MetaMask 等 EVM 钱包最常见的注入位置。
181
281
  window.ethereum,
282
+ // window.okxwallet 是 OKX 新版本/官方文档常见的注入位置。
182
283
  window.okxwallet,
284
+ // window.okxwallet.ethereum 是 OKX 也可能提供的 EVM 子 provider。
183
285
  (n = window.okxwallet) == null ? void 0 : n.ethereum
184
286
  ];
185
- return x(e === "metamask" ? [window.ethereum, ...((a = window.ethereum) == null ? void 0 : a.providers) ?? []] : t);
287
+ return v(e === "metamask" ? [window.ethereum, ...((a = window.ethereum) == null ? void 0 : a.providers) ?? []] : t);
186
288
  }
187
- function x(e) {
289
+ function v(e) {
188
290
  return e.filter((t, n, a) => !!(t != null && t.request) && a.indexOf(t) === n);
189
291
  }
190
- function p(e) {
292
+ function b(e) {
191
293
  return !!(e != null && e.isOkxWallet || e != null && e.isOKExWallet || e != null && e.isOKXWallet);
192
294
  }
193
- function se(e) {
295
+ function X(e) {
194
296
  if (e)
195
297
  return Number.parseInt(e, 16);
196
298
  }
197
- function U(e) {
299
+ function ge(e) {
300
+ return typeof e == "string" && e.startsWith("0x") ? X(e) ?? e : e;
301
+ }
302
+ function Ce(e) {
303
+ return typeof e == "string" && e.startsWith("0x") ? e : `0x${Number(e).toString(16)}`;
304
+ }
305
+ async function Ee(e, t) {
306
+ const n = Ce(t.chainId);
307
+ try {
308
+ await e.request({
309
+ method: "wallet_switchEthereumChain",
310
+ params: [{ chainId: n }]
311
+ });
312
+ } catch (a) {
313
+ const o = a;
314
+ if ((o == null ? void 0 : o.code) !== 4902) throw a;
315
+ await e.request({
316
+ method: "wallet_addEthereumChain",
317
+ params: [
318
+ {
319
+ chainId: n,
320
+ chainName: t.name,
321
+ nativeCurrency: t.nativeCurrency,
322
+ rpcUrls: t.rpcUrls,
323
+ blockExplorerUrls: t.blockExplorerUrls
324
+ }
325
+ ]
326
+ });
327
+ }
328
+ }
329
+ function V(e) {
198
330
  return {
331
+ // 保存钱包 id。
199
332
  id: e.id,
333
+ // 保存钱包名称。
200
334
  name: e.name,
335
+ // EVM 钱包链类型固定是 evm。
201
336
  chainType: "evm",
337
+ // 保存钱包图标。
202
338
  icon: e.icon,
203
- installed: () => !!S(e.id),
339
+ // installed 通过能否找到 provider 判断钱包插件是否安装。
340
+ installed: () => !!O(e.id),
341
+ // connect 是真正发起钱包连接的方法。
204
342
  connect: async () => {
205
- const t = S(e.id);
343
+ const t = O(e.id);
206
344
  if (!t)
207
- throw new w("PROVIDER_NOT_FOUND", `${e.name} provider was not found.`);
345
+ throw new l("PROVIDER_NOT_FOUND", `${e.name} provider was not found.`);
208
346
  const n = await t.request({ method: "eth_requestAccounts" }), a = await t.request({ method: "eth_chainId" }).catch(() => {
209
- }), s = n[0];
210
- if (!s) throw new w("PROVIDER_NOT_FOUND", `${e.name} did not return an address.`);
347
+ }), o = n[0];
348
+ if (!o) throw new l("PROVIDER_NOT_FOUND", `${e.name} did not return an address.`);
211
349
  return {
212
- address: s,
350
+ // 保存钱包地址。
351
+ address: o,
352
+ // 标记这是 EVM 钱包。
213
353
  chainType: "evm",
214
- chainId: se(a)
354
+ // 把十六进制 chainId 转成数字保存。
355
+ chainId: X(a)
215
356
  };
216
357
  },
358
+ // signMessage 负责让 EVM 钱包签名一段文本。
217
359
  signMessage: async (t, n) => {
218
- const a = S(e.id);
219
- if (!a) throw new w("PROVIDER_NOT_FOUND", `${e.name} provider was not found.`);
360
+ const a = O(e.id);
361
+ if (!a) throw new l("PROVIDER_NOT_FOUND", `${e.name} provider was not found.`);
220
362
  return a.request({
363
+ // 指定调用钱包的 personal_sign 方法。
221
364
  method: "personal_sign",
365
+ // 传入要签名的文本和签名地址。
222
366
  params: [t, n.address]
223
367
  });
224
368
  },
225
- getDeepLink: (t) => F(e.id, t, e.deepLinks)
369
+ // switchNetwork 负责请求 EVM 钱包切换到指定网络。
370
+ switchNetwork: async (t) => {
371
+ if (t.chainType !== "evm")
372
+ throw new l("UNSUPPORTED_CHAIN", `${e.name} only supports EVM networks.`);
373
+ const n = O(e.id);
374
+ if (!n) throw new l("PROVIDER_NOT_FOUND", `${e.name} provider was not found.`);
375
+ await Ee(n, t);
376
+ const o = (await n.request({ method: "eth_accounts" }))[0];
377
+ if (o)
378
+ return {
379
+ address: o,
380
+ chainType: "evm",
381
+ chainId: Number(t.chainId)
382
+ };
383
+ },
384
+ // subscribe 监听钱包扩展主动发出的链切换、账户切换、断开事件。
385
+ subscribe: (t) => {
386
+ const n = O(e.id);
387
+ if (!(n != null && n.on)) return () => {
388
+ };
389
+ const a = (d) => {
390
+ var u;
391
+ (u = t.onChainChanged) == null || u.call(t, ge(d));
392
+ }, o = (d) => {
393
+ var u;
394
+ (u = t.onAccountsChanged) == null || u.call(t, Array.isArray(d) ? d : []);
395
+ }, g = () => {
396
+ var d;
397
+ (d = t.onDisconnect) == null || d.call(t);
398
+ };
399
+ return n.on("chainChanged", a), n.on("accountsChanged", o), n.on("disconnect", g), () => {
400
+ var d, u, E;
401
+ (d = n.removeListener) == null || d.call(n, "chainChanged", a), (u = n.removeListener) == null || u.call(n, "accountsChanged", o), (E = n.removeListener) == null || E.call(n, "disconnect", g);
402
+ };
403
+ },
404
+ // getDeepLink 生成移动端打开当前钱包 App 的链接。
405
+ getDeepLink: (t) => j(e.id, t, e.deepLinks)
226
406
  };
227
407
  }
228
- function A() {
229
- var e, t;
230
- if (!(typeof window > "u"))
231
- return (t = (e = window.phantom) == null ? void 0 : e.solana) != null && t.isPhantom ? window.phantom.solana : void 0;
408
+ function J() {
409
+ var t;
410
+ if (typeof window > "u") return;
411
+ const e = ((t = window.phantom) == null ? void 0 : t.solana) ?? window.solana;
412
+ return e != null && e.isPhantom || e != null && e.connect ? e : void 0;
232
413
  }
233
- function oe(e) {
414
+ function Se(e) {
234
415
  let t = "";
235
416
  return e.forEach((n) => {
236
417
  t += String.fromCharCode(n);
237
418
  }), btoa(t);
238
419
  }
239
- function re(e) {
420
+ function De(e, t = "P") {
240
421
  return {
422
+ // Phantom 的钱包 id 固定是 phantom。
241
423
  id: "phantom",
424
+ // name 是展示给用户看的钱包名称。
242
425
  name: "Phantom",
426
+ // Phantom 这里接的是 Solana 链,所以 chainType 是 solana。
243
427
  chainType: "solana",
244
- icon: "P",
245
- installed: () => !!A(),
428
+ // icon 是简化版展示字符。
429
+ icon: t,
430
+ // installed 通过是否找到 Phantom provider 判断是否安装。
431
+ installed: () => !!J(),
432
+ // connect 负责调用 Phantom 扩展发起连接。
246
433
  connect: async () => {
247
- const t = A();
248
- if (!t) throw new w("PROVIDER_NOT_FOUND", "Phantom provider was not found.");
249
- const a = (await t.connect()).publicKey.toString();
434
+ const n = J();
435
+ if (!n) throw new l("PROVIDER_NOT_FOUND", "Phantom provider was not found.");
436
+ const o = (await n.connect()).publicKey.toString();
250
437
  return {
251
- address: a,
252
- publicKey: a,
438
+ // address 保存 Solana 地址。
439
+ address: o,
440
+ // publicKey 也保存同一个地址,方便 Solana 业务使用。
441
+ publicKey: o,
442
+ // 标记这是 Solana 钱包。
253
443
  chainType: "solana",
444
+ // 这里简单标记主网,实际业务可扩展网络选择。
254
445
  chainId: "solana:mainnet"
255
446
  };
256
447
  },
448
+ // disconnect 负责断开 Phantom 连接。
257
449
  disconnect: async () => {
258
- var t, n;
259
- await ((n = (t = A()) == null ? void 0 : t.disconnect) == null ? void 0 : n.call(t));
450
+ var n, a;
451
+ await ((a = (n = J()) == null ? void 0 : n.disconnect) == null ? void 0 : a.call(n));
452
+ },
453
+ // signMessage 负责让 Phantom 对文本签名。
454
+ signMessage: async (n) => {
455
+ const a = J();
456
+ if (!a) throw new l("PROVIDER_NOT_FOUND", "Phantom provider was not found.");
457
+ const o = new TextEncoder().encode(n), { signature: g } = await a.signMessage(o, "utf8");
458
+ return Se(g);
260
459
  },
261
- signMessage: async (t) => {
262
- const n = A();
263
- if (!n) throw new w("PROVIDER_NOT_FOUND", "Phantom provider was not found.");
264
- const a = new TextEncoder().encode(t), { signature: s } = await n.signMessage(a, "utf8");
265
- return oe(s);
460
+ // Phantom 的浏览器注入 provider 通常不允许 DApp 直接切换 Solana 网络。
461
+ switchNetwork: async () => {
462
+ throw new l("UNSUPPORTED_CHAIN", "Phantom does not support programmatic Solana network switching.");
266
463
  },
267
- getDeepLink: (t) => F("phantom", t, e)
464
+ // getDeepLink 生成移动端打开 Phantom App 的链接。
465
+ getDeepLink: (n) => j("phantom", n, e)
268
466
  };
269
467
  }
270
- function ce(e) {
468
+ function ke(e) {
271
469
  return [
272
- U({ id: "metamask", name: "MetaMask", icon: "M", deepLinks: e }),
273
- U({ id: "okx", name: "OKX Wallet", icon: "O", deepLinks: e }),
274
- re(e)
470
+ // 创建 OKX Wallet 适配器。
471
+ V({ id: "okx", name: "OKX Wallet", icon: we, deepLinks: e }),
472
+ // 创建 MetaMask 适配器。
473
+ V({ id: "metamask", name: "MetaMask", icon: ue, deepLinks: e }),
474
+ // 创建 Phantom 适配器。
475
+ De(e, he)
275
476
  ];
276
477
  }
277
- const ie = 3e4, de = "rainbow-wallet-kit:wallet-state", le = {
478
+ const pe = 3e4, Ie = "rainbow-wallet-kit:wallet-state", ye = {
479
+ // 初始状态是 idle,表示还没有开始连接。
278
480
  status: "idle",
481
+ // 初始化时记录当前时间,方便后续多 Tab 状态比较。
279
482
  updatedAt: Date.now()
280
- }, J = z(void 0);
281
- function me({
483
+ }, Z = ee(void 0);
484
+ function Fe({
485
+ // children 是被 Provider 包裹的业务组件。
282
486
  children: e,
487
+ // auth 是签名登录配置。
283
488
  auth: t,
489
+ // deepLinks 是移动端打开钱包 App 配置。
284
490
  deepLinks: n,
285
- connectTimeoutMs: a = ie,
286
- storageKey: s = de,
287
- initialWallet: h,
288
- autoConnect: g
491
+ // connectTimeoutMs 是连接超时时间,默认 30 秒。
492
+ connectTimeoutMs: a = pe,
493
+ // storageKey 是多 Tab 同步使用的 localStorage key。
494
+ storageKey: o = Ie,
495
+ // initialWallet 是可选默认钱包。
496
+ initialWallet: g,
497
+ // autoConnect 控制是否自动连接 initialWallet。
498
+ autoConnect: d,
499
+ // networks 是业务方传入的网络列表,不传时使用默认列表。
500
+ networks: u
289
501
  }) {
290
- const l = M(new L()), y = M(null), [r, k] = K(le), i = P(() => ce(n), [n]), u = D((o) => {
291
- var c;
292
- k(o), l.current.emit("state", o), (c = y.current) == null || c.publish(o);
293
- }, []), O = D(
294
- async (o) => {
295
- const c = i.find((d) => d.id === o);
296
- if (!c) return;
297
- if (!c.installed() && (n == null ? void 0 : n.enabled) !== !1 && (n != null && n.openOnConnect) && Z()) {
298
- window.location.href = c.getDeepLink(R(n));
502
+ const E = q(new ce()), Q = q(null), p = q(/* @__PURE__ */ new Map()), [r, I] = N(ye), S = R(() => ke(n), [n]), y = R(() => u ?? Ae, [u]), h = F((c) => {
503
+ var w;
504
+ I(c), E.current.emit("state", c), (w = Q.current) == null || w.publish(c);
505
+ }, []), f = F(
506
+ // walletId 表示用户想连接哪个钱包。
507
+ async (c) => {
508
+ const w = p.current.get(c);
509
+ if (w) return w;
510
+ const A = S.find((C) => C.id === c);
511
+ if (!A) return;
512
+ if (!A.installed() && (n == null ? void 0 : n.enabled) !== !1 && (n != null && n.openOnConnect) && re()) {
513
+ window.location.href = A.getDeepLink(x(n));
299
514
  return;
300
515
  }
301
- if (!c.installed()) {
302
- const d = new w("PROVIDER_NOT_FOUND", `${c.name} extension was not found.`);
303
- throw u({
516
+ if (!A.installed()) {
517
+ const C = new l("PROVIDER_NOT_FOUND", `${A.name} extension was not found.`);
518
+ throw h({
519
+ // 标记状态为错误。
304
520
  status: "error",
305
- wallet: o,
306
- error: d,
521
+ // 记录这次尝试连接的钱包。
522
+ wallet: c,
523
+ // 保存错误对象。
524
+ error: C,
525
+ // 更新时间戳。
307
526
  updatedAt: Date.now()
308
- }), l.current.emit("error", d), d;
527
+ }), E.current.emit("error", C), C;
309
528
  }
310
- const m = {
529
+ const s = {
530
+ // 保留原状态里的其它字段。
311
531
  ...r,
532
+ // 状态改成 connecting。
312
533
  status: "connecting",
313
- wallet: o,
534
+ // 记录当前要连接的钱包。
535
+ wallet: c,
536
+ // 清除上一次错误。
314
537
  error: void 0,
538
+ // 更新时间戳。
315
539
  updatedAt: Date.now()
316
540
  };
317
- u(m);
318
- try {
319
- const d = await ee(
320
- c.connect(),
321
- a,
322
- `${c.name} connection timed out.`
323
- ), T = await X({
324
- auth: t,
325
- wallet: o,
326
- account: d,
327
- signMessage: (V) => c.signMessage(V, d)
328
- });
329
- u({
330
- status: "connected",
331
- wallet: o,
332
- account: d,
333
- auth: T,
334
- updatedAt: Date.now()
335
- }), l.current.emit("accountChanged", d);
336
- } catch (d) {
337
- const T = W(d);
338
- throw u({
339
- status: "error",
340
- wallet: o,
341
- error: T,
342
- updatedAt: Date.now()
343
- }), l.current.emit("error", T), T;
344
- }
541
+ h(s);
542
+ const m = (async () => {
543
+ try {
544
+ const C = await ie(
545
+ // wallet.connect 会真正唤起钱包扩展授权弹窗。
546
+ A.connect(),
547
+ // 使用配置的连接超时时间。
548
+ a,
549
+ // 超时时显示的钱包名称错误信息。
550
+ `${A.name} connection timed out.`
551
+ ), T = await ae({
552
+ // 传入认证配置。
553
+ auth: t,
554
+ // 传入当前钱包 id。
555
+ wallet: c,
556
+ // 传入刚连接成功的账户。
557
+ account: C,
558
+ // 告诉认证函数如何让当前钱包签名。
559
+ signMessage: (z) => A.signMessage(z, C)
560
+ });
561
+ h({
562
+ // 标记已经连接。
563
+ status: "connected",
564
+ // 保存当前钱包 id。
565
+ wallet: c,
566
+ // 保存钱包账户。
567
+ account: C,
568
+ // 保存认证会话,未启用 auth 时可能是 undefined。
569
+ auth: T,
570
+ // 更新时间戳。
571
+ updatedAt: Date.now()
572
+ }), E.current.emit("accountChanged", C);
573
+ } catch (C) {
574
+ const T = G(C);
575
+ throw h({
576
+ // 标记状态为 error。
577
+ status: "error",
578
+ // 记录出错的钱包。
579
+ wallet: c,
580
+ // 保存归一化错误。
581
+ error: T,
582
+ // 更新时间戳。
583
+ updatedAt: Date.now()
584
+ }), E.current.emit("error", T), T;
585
+ } finally {
586
+ p.current.delete(c);
587
+ }
588
+ })();
589
+ return p.current.set(c, m), m;
345
590
  },
346
- [t, a, n, u, r, i]
347
- ), C = D(
348
- (o) => {
349
- const c = i.find((m) => m.id === o);
350
- !c || (n == null ? void 0 : n.enabled) === !1 || typeof window > "u" || (window.location.href = c.getDeepLink(R(n)));
591
+ // 这些依赖变化时,connect 函数会重新创建。
592
+ [t, a, n, h, r, S]
593
+ ), M = F(
594
+ // walletId 表示要打开哪个钱包 App。
595
+ (c) => {
596
+ const w = S.find((A) => A.id === c);
597
+ !w || (n == null ? void 0 : n.enabled) === !1 || typeof window > "u" || (window.location.href = w.getDeepLink(x(n)));
351
598
  },
352
- [n, i]
353
- ), I = D(async () => {
354
- var m;
355
- const o = i.find((d) => d.id === r.wallet);
356
- await ((m = o == null ? void 0 : o.disconnect) == null ? void 0 : m.call(o));
357
- const c = {
599
+ // deepLinks 或 wallets 变化时重新创建函数。
600
+ [n, S]
601
+ ), k = F(async () => {
602
+ var A;
603
+ const c = S.find((s) => s.id === r.wallet);
604
+ await ((A = c == null ? void 0 : c.disconnect) == null ? void 0 : A.call(c));
605
+ const w = {
606
+ // 标记为 disconnected。
358
607
  status: "disconnected",
608
+ // 更新时间戳。
359
609
  updatedAt: Date.now()
360
610
  };
361
- u(c), l.current.emit("disconnect", void 0);
362
- }, [u, r.wallet, i]), b = D(async () => {
363
- const o = await Y({
611
+ h(w), E.current.emit("disconnect", void 0);
612
+ }, [h, r.wallet, S]), H = F(
613
+ // networkId 是要切换到的网络 id。
614
+ async (c) => {
615
+ const w = y.find((s) => s.id === c);
616
+ if (!w) throw new l("UNSUPPORTED_CHAIN", `Network ${c} is not configured.`);
617
+ const A = S.find((s) => s.id === r.wallet);
618
+ if (!A) throw new l("PROVIDER_NOT_FOUND", "Connect a wallet before switching networks.");
619
+ if (!A.switchNetwork) throw new l("UNSUPPORTED_CHAIN", `${A.name} does not support network switching.`);
620
+ try {
621
+ const s = await A.switchNetwork(w);
622
+ s && r.status === "connected" && h({
623
+ ...r,
624
+ account: s,
625
+ updatedAt: Date.now()
626
+ });
627
+ } catch (s) {
628
+ const m = s instanceof l && s.code === "UNSUPPORTED_CHAIN" ? s : new l("SWITCH_NETWORK_FAILED", "Failed to switch wallet network.", s);
629
+ throw h({ ...r, error: m, updatedAt: Date.now() }), m;
630
+ }
631
+ },
632
+ [y, h, r, S]
633
+ ), U = F(async () => {
634
+ const c = await oe({
635
+ // 传入认证配置。
364
636
  auth: t,
637
+ // 传入当前登录态。
365
638
  session: r.auth,
639
+ // 传入当前钱包 id。
366
640
  wallet: r.wallet,
641
+ // 传入当前账户。
367
642
  account: r.account
368
643
  });
369
- o && r.status === "connected" && u({
644
+ c && r.status === "connected" && h({
645
+ // 保留原钱包状态。
370
646
  ...r,
371
- auth: o,
647
+ // 覆盖 auth 为新 session。
648
+ auth: c,
649
+ // 更新时间戳。
372
650
  updatedAt: Date.now()
373
651
  });
374
- }, [t, u, r]);
375
- v(() => {
376
- const o = new ne(l.current, s);
377
- y.current = o;
378
- const c = o.read();
379
- c && k(c);
380
- const m = l.current.on("state", (d) => {
381
- k((T) => d.updatedAt >= T.updatedAt ? d : T);
652
+ }, [t, h, r]);
653
+ W(() => {
654
+ const c = new de(E.current, o);
655
+ Q.current = c;
656
+ const w = c.read();
657
+ w && I(w);
658
+ const A = E.current.on("state", (s) => {
659
+ I((m) => s.updatedAt >= m.updatedAt ? s : m);
382
660
  });
383
661
  return () => {
384
- m(), o.destroy();
662
+ A(), c.destroy();
385
663
  };
386
- }, [s]), v(() => {
387
- g && h && O(h).catch(() => {
664
+ }, [o]), W(() => {
665
+ d && g && f(g).catch(() => {
388
666
  });
389
- }, [g, O, h]), v(() => {
667
+ }, [d, f, g]), W(() => {
668
+ if (r.status !== "connected" || !r.wallet || !r.account) return;
669
+ const c = S.find((A) => A.id === r.wallet);
670
+ return c != null && c.subscribe ? c.subscribe({
671
+ // 钱包扩展手动切链时触发。
672
+ onChainChanged: (A) => {
673
+ h({
674
+ ...r,
675
+ account: {
676
+ ...r.account,
677
+ chainId: A
678
+ },
679
+ error: void 0,
680
+ updatedAt: Date.now()
681
+ });
682
+ },
683
+ // 钱包扩展手动切账户或断开账户时触发。
684
+ onAccountsChanged: (A) => {
685
+ if (!A.length) {
686
+ k();
687
+ return;
688
+ }
689
+ h({
690
+ ...r,
691
+ account: {
692
+ ...r.account,
693
+ address: A[0]
694
+ },
695
+ error: void 0,
696
+ updatedAt: Date.now()
697
+ });
698
+ },
699
+ // 钱包扩展主动断开时同步断开组件状态。
700
+ onDisconnect: () => {
701
+ k();
702
+ }
703
+ }) : void 0;
704
+ }, [k, h, r, S]), W(() => {
390
705
  if (!r.auth || r.status !== "connected") return;
391
- const o = Q(r.auth, t == null ? void 0 : t.renewalWindowMs), c = window.setTimeout(() => {
392
- b().catch((m) => {
393
- const d = W(m);
394
- u({ ...r, status: "error", error: d, updatedAt: Date.now() });
706
+ const c = se(r.auth, t == null ? void 0 : t.renewalWindowMs), w = window.setTimeout(() => {
707
+ U().catch((A) => {
708
+ const s = G(A);
709
+ h({ ...r, status: "error", error: s, updatedAt: Date.now() });
395
710
  });
396
- }, o);
397
- return () => window.clearTimeout(c);
398
- }, [t == null ? void 0 : t.renewalWindowMs, u, b, r]);
399
- const q = P(
711
+ }, c);
712
+ return () => window.clearTimeout(w);
713
+ }, [t == null ? void 0 : t.renewalWindowMs, h, U, r]);
714
+ const K = R(
715
+ // 返回所有钱包状态和操作方法。
400
716
  () => ({
717
+ // 当前钱包状态。
401
718
  state: r,
402
- wallets: i,
403
- connect: O,
404
- disconnect: I,
405
- openWalletApp: C,
406
- refreshAuth: b
719
+ // 所有钱包适配器。
720
+ wallets: S,
721
+ // 网络列表。
722
+ networks: y,
723
+ // 连接钱包函数。
724
+ connect: f,
725
+ // 切换网络函数。
726
+ switchNetwork: H,
727
+ // 断开钱包函数。
728
+ disconnect: k,
729
+ // 显式打开钱包 App 函数。
730
+ openWalletApp: M,
731
+ // 刷新认证函数。
732
+ refreshAuth: U
407
733
  }),
408
- [O, I, C, b, r, i]
734
+ // 这些依赖变化时才重新生成 value。
735
+ [f, k, y, M, U, r, H, S]
409
736
  );
410
- return /* @__PURE__ */ f(J.Provider, { value: q, children: e });
737
+ return /* @__PURE__ */ i(Z.Provider, { value: K, children: e });
411
738
  }
412
- function ue() {
413
- const e = H(J);
739
+ function Be() {
740
+ const e = te(Z);
414
741
  if (!e)
415
742
  throw new Error("useWallet must be used inside WalletProvider.");
416
743
  return e;
417
744
  }
418
- function ge({
745
+ function Te({
746
+ // 默认按钮文字。
419
747
  label: e = "Connect Wallet",
748
+ // 默认不追加类名。
420
749
  className: t = "",
750
+ // 钱包展示顺序。
421
751
  preferredWallets: n,
752
+ // 错误回调。
422
753
  onError: a
423
754
  }) {
424
- const { state: s, wallets: h, connect: g, disconnect: l } = ue(), [y, r] = K(!1), k = n != null && n.length ? n.flatMap((i) => h.filter((u) => u.id === i)) : h;
425
- return s.status === "connected" && s.account ? /* @__PURE__ */ N("div", { className: `rwk-root ${t}`, children: [
426
- /* @__PURE__ */ N("button", { className: "rwk-account", type: "button", onClick: () => r((i) => !i), children: [
427
- /* @__PURE__ */ f("span", { className: "rwk-status-dot" }),
428
- /* @__PURE__ */ f("span", { children: $(s.account.address) })
429
- ] }),
430
- y ? /* @__PURE__ */ N("div", { className: "rwk-panel", role: "dialog", "aria-label": "Wallet account", children: [
431
- /* @__PURE__ */ N("div", { className: "rwk-account-row", children: [
432
- /* @__PURE__ */ f("span", { children: s.wallet }),
433
- /* @__PURE__ */ f("strong", { children: $(s.account.address) })
755
+ var A;
756
+ const { state: o, wallets: g, networks: d, connect: u, disconnect: E, switchNetwork: Q } = Be(), [p, r] = N(null), [I, S] = N(), [y, h] = N(), f = n != null && n.length ? n.flatMap((s) => g.filter((m) => m.id === s)) : g, M = R(() => {
757
+ var m;
758
+ const s = (m = o.account) == null ? void 0 : m.chainId;
759
+ if (s !== void 0)
760
+ return d.find((C) => String(C.chainId) === String(s));
761
+ }, [d, (A = o.account) == null ? void 0 : A.chainId]), k = I ? g.find((s) => s.id === I) : void 0, H = (s) => {
762
+ S(s), u(s).then(() => {
763
+ r(null), S(void 0);
764
+ }).catch((m) => {
765
+ a == null || a(m), S(void 0);
766
+ });
767
+ }, U = (s) => {
768
+ h(s), Q(s).then(() => r(null)).catch((m) => a == null ? void 0 : a(m)).finally(() => h(void 0));
769
+ }, K = () => (
770
+ // 遮罩层覆盖页面背景。
771
+ /* @__PURE__ */ i("div", { className: "rwk-overlay", role: "presentation", onMouseDown: () => r(null), children: /* @__PURE__ */ D("div", { className: "rwk-modal rwk-wallet-modal", role: "dialog", "aria-label": "Connect wallet", onMouseDown: (s) => s.stopPropagation(), children: [
772
+ /* @__PURE__ */ D("div", { className: "rwk-modal-sidebar", children: [
773
+ /* @__PURE__ */ i("div", { className: "rwk-modal-title", children: "连接钱包" }),
774
+ /* @__PURE__ */ i("div", { className: "rwk-modal-section-label", children: "可用钱包" }),
775
+ f.map((s) => /* @__PURE__ */ D(
776
+ "button",
777
+ {
778
+ className: `rwk-wallet ${I === s.id ? "rwk-wallet-active" : ""}`,
779
+ type: "button",
780
+ onClick: () => H(s.id),
781
+ children: [
782
+ /* @__PURE__ */ i("img", { className: "rwk-wallet-logo", src: s.icon, alt: `${s.name} logo` }),
783
+ /* @__PURE__ */ i("span", { children: s.name }),
784
+ /* @__PURE__ */ i("small", { children: s.installed() ? "已安装" : "未安装" })
785
+ ]
786
+ },
787
+ s.id
788
+ ))
434
789
  ] }),
435
- /* @__PURE__ */ f("button", { className: "rwk-disconnect", type: "button", onClick: () => void l(), children: "Disconnect" })
436
- ] }) : null
437
- ] }) : /* @__PURE__ */ N("div", { className: `rwk-root ${t}`, children: [
438
- /* @__PURE__ */ f(
439
- "button",
440
- {
441
- className: "rwk-connect",
442
- type: "button",
443
- disabled: s.status === "connecting",
444
- onClick: () => r((i) => !i),
445
- children: s.status === "connecting" ? "Connecting..." : e
446
- }
447
- ),
448
- y ? /* @__PURE__ */ N("div", { className: "rwk-panel", role: "dialog", "aria-label": "Connect wallet", children: [
449
- k.map((i) => /* @__PURE__ */ N(
790
+ /* @__PURE__ */ D("div", { className: "rwk-modal-main", children: [
791
+ /* @__PURE__ */ i("button", { className: "rwk-close", type: "button", "aria-label": "Close", onClick: () => r(null), children: "×" }),
792
+ /* @__PURE__ */ i("div", { className: "rwk-connect-status", children: k ? /* @__PURE__ */ D(P, { children: [
793
+ /* @__PURE__ */ i("img", { className: "rwk-status-logo", src: k.icon, alt: `${k.name} logo` }),
794
+ /* @__PURE__ */ D("strong", { children: [
795
+ "正在打开 ",
796
+ k.name,
797
+ "..."
798
+ ] }),
799
+ /* @__PURE__ */ i("span", { children: "请在钱包扩展中确认连接" }),
800
+ /* @__PURE__ */ i("i", { className: "rwk-spinner" })
801
+ ] }) : /* @__PURE__ */ D(P, { children: [
802
+ /* @__PURE__ */ i("strong", { children: "选择一个钱包" }),
803
+ /* @__PURE__ */ i("span", { children: "点击左侧钱包后会唤起对应扩展" })
804
+ ] }) }),
805
+ o.error ? /* @__PURE__ */ i("p", { className: "rwk-error", children: o.error.message }) : null
806
+ ] })
807
+ ] }) })
808
+ ), c = () => /* @__PURE__ */ i("div", { className: "rwk-overlay", role: "presentation", onMouseDown: () => r(null), children: /* @__PURE__ */ D("div", { className: "rwk-modal rwk-network-modal", role: "dialog", "aria-label": "Switch network", onMouseDown: (s) => s.stopPropagation(), children: [
809
+ /* @__PURE__ */ i("button", { className: "rwk-close", type: "button", "aria-label": "Close", onClick: () => r(null), children: "×" }),
810
+ /* @__PURE__ */ i("div", { className: "rwk-modal-title", children: "切换网络" }),
811
+ /* @__PURE__ */ i("div", { className: "rwk-network-list", children: d.map((s) => {
812
+ var C;
813
+ const m = String(s.chainId) === String((C = o.account) == null ? void 0 : C.chainId);
814
+ return /* @__PURE__ */ D(
450
815
  "button",
451
816
  {
452
- className: "rwk-wallet",
817
+ className: `rwk-network-item ${m ? "rwk-network-active" : ""}`,
818
+ disabled: !!y,
453
819
  type: "button",
454
- onClick: () => {
455
- g(i.id).then(() => r(!1)).catch((u) => a == null ? void 0 : a(u));
456
- },
820
+ onClick: () => U(s.id),
457
821
  children: [
458
- /* @__PURE__ */ f("span", { className: "rwk-wallet-icon", children: i.icon }),
459
- /* @__PURE__ */ f("span", { children: i.name }),
460
- /* @__PURE__ */ f("small", { children: i.installed() ? "Detected" : "Not installed" })
822
+ /* @__PURE__ */ D("span", { children: [
823
+ /* @__PURE__ */ i("strong", { children: s.name }),
824
+ /* @__PURE__ */ i("small", { children: s.chainType === "evm" ? `Chain ID ${s.chainId}` : "Solana 网络" })
825
+ ] }),
826
+ /* @__PURE__ */ i("em", { children: y === s.id ? "切换中" : m ? "当前" : "切换" })
461
827
  ]
462
828
  },
463
- i.id
464
- )),
465
- s.error ? /* @__PURE__ */ f("p", { className: "rwk-error", children: s.error.message }) : null
466
- ] }) : null
829
+ s.id
830
+ );
831
+ }) }),
832
+ o.error ? /* @__PURE__ */ i("p", { className: "rwk-error", children: o.error.message }) : null
833
+ ] }) }), w = () => /* @__PURE__ */ i("div", { className: "rwk-overlay", role: "presentation", onMouseDown: () => r(null), children: /* @__PURE__ */ D("div", { className: "rwk-modal rwk-account-modal", role: "dialog", "aria-label": "Wallet account", onMouseDown: (s) => s.stopPropagation(), children: [
834
+ /* @__PURE__ */ i("button", { className: "rwk-close", type: "button", "aria-label": "Close", onClick: () => r(null), children: "×" }),
835
+ /* @__PURE__ */ i("div", { className: "rwk-modal-title", children: "钱包账户" }),
836
+ /* @__PURE__ */ D("div", { className: "rwk-account-row", children: [
837
+ /* @__PURE__ */ i("span", { children: o.wallet }),
838
+ /* @__PURE__ */ i("strong", { children: o.account ? L(o.account.address) : "-" })
839
+ ] }),
840
+ /* @__PURE__ */ i("button", { className: "rwk-disconnect", type: "button", onClick: () => void E().then(() => r(null)), children: "Disconnect" })
841
+ ] }) });
842
+ return o.status === "connected" && o.account ? /* @__PURE__ */ D("div", { className: `rwk-root ${t}`, children: [
843
+ /* @__PURE__ */ D("div", { className: "rwk-actions", children: [
844
+ /* @__PURE__ */ i("button", { className: "rwk-network-button", type: "button", onClick: () => r("networks"), children: (M == null ? void 0 : M.name) ?? `Chain ${o.account.chainId ?? "-"}` }),
845
+ /* @__PURE__ */ D("button", { className: "rwk-account", type: "button", onClick: () => r("account"), children: [
846
+ /* @__PURE__ */ i("span", { className: "rwk-status-dot" }),
847
+ /* @__PURE__ */ i("span", { children: L(o.account.address) })
848
+ ] })
849
+ ] }),
850
+ p === "networks" ? c() : null,
851
+ p === "account" ? w() : null
852
+ ] }) : /* @__PURE__ */ D("div", { className: `rwk-root ${t}`, children: [
853
+ /* @__PURE__ */ i("button", { className: "rwk-connect", type: "button", disabled: o.status === "connecting", onClick: () => r("wallets"), children: o.status === "connecting" ? "Connecting..." : e }),
854
+ p === "wallets" ? K() : null
467
855
  ] });
468
856
  }
469
- function $(e) {
857
+ function L(e) {
470
858
  return e.length <= 12 ? e : `${e.slice(0, 6)}...${e.slice(-4)}`;
471
859
  }
472
860
  export {
473
- ge as ConnectWalletButton,
474
- L as EventEmitter,
475
- J as WalletContext,
476
- w as WalletKitError,
477
- me as WalletProvider,
478
- ne as WalletStateSync,
479
- X as authenticateWallet,
480
- G as createNonceMessage,
481
- ce as createWalletAdapters,
482
- W as normalizeWalletError,
483
- Y as refreshJwtSession,
484
- ue as useWallet,
485
- ee as withTimeout
861
+ Te as ConnectWalletButton,
862
+ Ae as DEFAULT_NETWORKS,
863
+ ce as EventEmitter,
864
+ Z as WalletContext,
865
+ l as WalletKitError,
866
+ Fe as WalletProvider,
867
+ de as WalletStateSync,
868
+ ae as authenticateWallet,
869
+ ne as createNonceMessage,
870
+ ke as createWalletAdapters,
871
+ G as normalizeWalletError,
872
+ oe as refreshJwtSession,
873
+ Be as useWallet,
874
+ ie as withTimeout
486
875
  };
487
876
  //# sourceMappingURL=index.mjs.map