@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/README.md +12 -3
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +29 -2
- package/dist/index.mjs +633 -244
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +3 -1
package/dist/index.mjs
CHANGED
|
@@ -1,131 +1,226 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { jsx as
|
|
5
|
-
import { createContext as
|
|
6
|
-
class
|
|
7
|
-
constructor
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
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
|
|
27
|
-
var
|
|
28
|
-
if (!((
|
|
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
|
|
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 =
|
|
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((
|
|
43
|
-
throw new
|
|
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
|
|
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
|
|
98
|
+
throw new l("JWT_REFRESH_FAILED", "JWT refresh failed.", n);
|
|
68
99
|
}
|
|
69
100
|
}
|
|
70
|
-
function
|
|
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
|
|
112
|
+
function re() {
|
|
79
113
|
return typeof navigator > "u" ? !1 : /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);
|
|
80
114
|
}
|
|
81
|
-
function
|
|
115
|
+
function x(e) {
|
|
82
116
|
return e != null && e.dappUrl ? e.dappUrl : typeof window > "u" ? "" : window.location.href;
|
|
83
117
|
}
|
|
84
|
-
function
|
|
118
|
+
function j(e, t, n) {
|
|
85
119
|
const a = encodeURIComponent(t);
|
|
86
|
-
return e === "metamask" ? `${(n == null ? void 0 : n.metamask) ??
|
|
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
|
|
122
|
+
class ce {
|
|
89
123
|
constructor() {
|
|
90
|
-
|
|
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((
|
|
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
|
|
109
|
-
var n;
|
|
110
|
-
if (e instanceof
|
|
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
|
|
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
|
|
153
|
+
function ie(e, t, n) {
|
|
115
154
|
let a;
|
|
116
|
-
const
|
|
117
|
-
a = setTimeout(() =>
|
|
155
|
+
const o = new Promise((g, d) => {
|
|
156
|
+
a = setTimeout(() => d(new l("CONNECT_TIMEOUT", n)), t);
|
|
118
157
|
});
|
|
119
|
-
return Promise.race([e,
|
|
158
|
+
return Promise.race([e, o]).finally(() => {
|
|
120
159
|
a && clearTimeout(a);
|
|
121
160
|
});
|
|
122
161
|
}
|
|
123
|
-
const
|
|
124
|
-
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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(
|
|
137
|
-
var
|
|
138
|
-
((
|
|
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
|
-
|
|
260
|
+
const ue = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK4AAACsCAYAAADixJflAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAArqADAAQAAAABAAAArAAAAAAjOAweAAAUyElEQVR4Ae1dX4xdRRmfdunF1guFSrQkAk3rLhGBxqRYE0GNSSVaEn2RxEhiDA9SDBgeTMQHhScxJhYlEZ5MjBgivlIN1gcRTCgtkApi6NKmiGGLkS24NyzcsuD53bvfdvbsnHPmm39n5tyZZDtzz5n5/s3vfPd3Zs49XbewMHhf5JIjkFgE1idmbzY3R2AUgQzcDIQkI5CBm+S0ZaOtgHv80BM5gjkCrUTACrgnnnpCnHzw3lYMz0rTiMDU7BHxyg+/IR64aa9Tg9fZrCp8b3rzyJg7dm0V2266Qwz33uLUuCws7Qj0DjxQJLb9Yv+RUyNHfjr7pjOHjDOuTBNgGAzs37pTwNhcJjsCyLIb7715FWgRERkzthEyBi5oglwA3mOn3y6Ae38GrxyYCWoTYDfuv3kEUsq0FIIyZui4SW0M3OOHHl+jTwZvzr5rwtPpA/imBWCnjh0ZJbAyaOG8CjOmQTHmuMRvVYrBeWcu/MDKqeHefZn/rkSjWw1kWXzLArBU9h08Sc01tSuea5Rxm7jKgeNvrDI404dV4ejEB5kWyKBVZVrZ4SbsyH3r2kbAbeIq4LplBwDeTB/qpiKdczItkK0mqigfK7ebsFPuX/XZCLg6XEUFXhiRAVw1FfEfpyyLOSwXHdBijA52yrJVn404bh2/LSsB1wXnVRVw36WZXWJpepfqdD4WSQRUPFY2TRe0NMYFz2Vn3IP33UP6teqqzIvBuHJxJ5rXfrVC2UqnKlpAxnBBi3EueC4buGQwp64DL+Rk+sCJZpi+yLLje5K1tIAsMAEtxh6878ckwrg+hzvSlKMAvAdOvCH2br+gUiVxp0wfKkPk/UQTLSADMJeY07YKm+Ny+K3KqRt2XFALXhqT134pEuFq0AJKHnVaAdpHSkuedf1V52x5LosqcPmtymA4DMebSqYPTRFydx6AbaIFpM0FaCHLlueygEvG29a64IUeABgPbOQbONuorx1ft7y1trcYJRzbTEtybXkui+Oa8lsyVq4pAHWcl/pjZ4Z2Z/KjkxQVuxrJgGKqI8lVptXRpdOHxXFt+a3KIF3OK4/N/FeOBq+ty2Nlqb5Aa8NztTOuC34rB4PanMxLY0AfpmYPFxsX1+SHdygoDbXuakFZjC/QQg947o7d15ZVan3WBq6WNMNOJuDN9EEv2KaAhXSfoIV88Nwduw+gyS7aN2cu+a3KSoAXgeKWvPpQHTHQAnpGtrqX+oxv0Kq16h/V5rg++K3KTBPOK8vJ/FcUNGrtM7JyjJraIUF7y4MHjOiCFlXwxW9VATShDbIcZGCUSVx9sAUs4hYStNBnWrSpgqkCk3EAr8124iTSBxtaQHOEmFPioGO+a9P1XC3g/ukX9g9FcANg+gCHrGcSAIwsO96gqX4YRo5JVRugRcxTKVrAbcsZF+CF7QBw13beCLCmN1/ynLYJWiyJmWz/NgI3JL+Vg0ltl+Dtyk+HXNACim+boCUbTOpG4JoIdT3GFXhhV8r0gbIsfHBRYgGtCc9tXFVog9+qJgXgLf/sXdVP9xhNfgqrDy5WC8pxiQW0Zbt0PyeRccmZ8s/e6bhpnUL2dUkL5Di5jqUsm9s24bm1wG2b35YD4CtLxAhg17RAjqVL6iXLDdlupAohjdHRReCt+uWwjoyqPkQfRH/z6NfHVf18H+/97h7WI4cce2IFLfe5hdot31DbvJzAU9+6n71TH+N6eqcAeFspg+JVnLNHvaiOFbTkLOcxx0qqYLK2RgaEqCnzetHVFmi9ODMWGjtoYSUHc5XAdfWqHI9zUflWQJ86vcv2cNGkAFpuXCuByxXUVn9kXpPHIduyN7RexAYxSqFw1nMrgRvL+q1OwE2f5VXK7le/90HZ38dBRzak8qQXhdCaKnAEkNK2a6fgbdsZB/pTAy25rIs9ZcZNgd+So3LtBLzntbSaIDti2U4VtBy3lcDlCIitrxPwtu2UxcWTOmh1ea4SuCnxWxXGOgFelWMNx1IHLdyzogqmPxluiGvQ00mD1+DmrAugBUC+ePudWjhRZtw9t+kN1tLQYicj8BqApkUXR6q7AlpOHJXA5QiIva8ReGN3SrKva6Ddc9v3Je+qm0rggip0gS6Q2yzweti5Iju0a00bugZaDuaUwEWAu0IXCCws8NKgiOuugRah3rH7Ou2IVwJXW0JCHQHeVLY/RQ3Xhg/wpWtFlybA70rgdo0u0CTXPnBSAxYa33YN0MKHrhUOTYDvlcDtWmBkf2rBK3eMrN1V0CLMHJqA/rXA7RrPhcNUlOC12LEiuc7qki1dBi1itv1TvNeN1gK3q3SBwKUEL52MqO46aBHqTBWYgIsWvMt8exJAq7tbJk9tbcZFxy7TBQrEyk+1I7w5W7GNjO1gzaUJCEEjcLkpPMW4xprVov02cDzJJhhrBC5sNBHs2Dev4vCL4b3FfxwYW4FNsK3LxYQmIB5awO0yXcAb0Fde7TSIaFG/sIV+gg8bc1kdAa0XgnQx41KWXZXRFop3GmxdHaAYPtH/BTfpu2XyXGhlXAzoEnhXZVk5GjG1cRFJBeC9f8820aXsa0oTEBZt4HaFLoAWUAaTcDFuRkYV1thXHIDtXQKvykedY7WvYCoLiPmVTGVby5+JL5aPr/n8yc+uOdTKgWf/2qg29SfEOK9cKgdDO+NiYKp0AVlW+yV5eHdX20XThpSzrw1NwPSwgJsaXaAsu+oGrG1Q6uhnUJYucl+dEGmtKpCglDIueGAllyWHVDVAo/kLBNXwto6Rr6msPHCevVXFlJVxISB28FKWpYlUOV17rHQ3X9vX10lDG1LJvi4wxAZuzHQhiWUuX2CX5ALAMa88cJ+9lVxbabKowsqoyBrIss62Rxn80lsYHNgA8E4XccFDOngWI6ZiSxPgCzvjIs27SPWuAukly2re1bvyYZUch7qJNsWUfV1hhw1cBDkGukCTYsxlV6Gl2x9iog4uaAJmK0mqgAziFbBtriw4oAmqyxDxwl/bmxYmz96q/DHKuG3RhWBZ1vCuXhXg2I61nX1dUYVkMi6BNjYgOLcnwEXTVva13S2TY22UcSEgJM9lbdnK3pm2PX1da5kTUHfo7OuKJiCOxsANQReQZfEoH+pc/EQA4A31uKQrmoBIWFGFmUu2iqk5P09ez2x42+8NWBMOsCwVeuvX4VJYk3vl8wAwyrEzfpLEtq9+q6zS6rMVcPd+ZqeY2r7JyoDKwRqP9VWOTfVEQJqgCtGI+3p6rHPp4k1iUaXU8JgxVYC+qblZQ7UJDGsZRAlEiGWia6wYA9e1IawohOgc4O5+jRtt6FxjhL8DLjFjAdyX/HmYJXcyAr2n/+jML3PgvtphmoDwtkEV2tDpDEphBZkDt8v8luYg5F1+SF3kX+C6darQe8Zdyg8cu3jVTUi2dQVe44wbLwIcWjYhYHIYsUZRrniuEXB7T/+h0cBOdOj4XX7Kc2S1ARGL44O3hmLw1jvOzekt9cQW51LVAuf/PSeGpxfUJy2O9jedK/qbehYS3A4FVcDf0sXTVoLZGTc2fusLtIjq8PTrVsHlDPalCxc0YtS1wgZuTAHwCdqY/LS1JTbwuuC5bODGwm9DgdZXJpTBGEJHTOB1sbLAAq4LhfKEmbZDgdbUPu644el57hCj/l0CLxO47W/zzr/5lpcbsSokhAJVlX7XxwFexLDtMjVnhyUecFve5kXAh2eWgsZ8OO//Bi2EDjloiGHb4J2yxBIPuC1u87YBWnmyfbZDcNyy/W2D15Z2aq/jtrkMZgrak4Mz5flSft7W36A8joNtgKpsjAs/yjJHvi1n3i2bPf0YQKVUOmaznqsNXElfsCayAjiZCT349ez/BGfCvzl9fqVfAG/vwg9Vnrc50XRhPHZqUfxlTo+T4gKs80NlJ2J76r8LAuDtbZhSdfF2DMtiizeYbURoUwVbTsL1nr7KfIMWdukCnOuDTv+mmz9d0JIfuGBNium3mokuF2P0gRuY3w4v+qjo75hh+8jJtLLwOvA2gUuW47KNbMst8IMLXnybjL5Rpq/mqrPqD6pgynW1qEIb/La/ffwVQvXgxPjB9cHxY5XBMgUtBD42tyi2Tau57uiuf9meSuURnSDwVtEGoj39HeMY0+eIXGg0RQu4jVICdCAAU01ABqjAE21AC/Mx2firu1Hz4WbdUhiHJpRtgy93P/v6iPPiNQIoMQLVlOdqATeWbV55cgjAYjkTXrnpqLiy6HDsldfEsX+dkrtat5tuoGwUVMk2oQlkx8ylY6Di9QEzl3yEDneqbgSuKQcJHSVMEsreZcUH/nZ01OIAuY4uiMAvCOFk25SBSjyX+5ijBnDttuaWcRS8MgFyHV0YnnlXuH6q1TTbpgxUV0BoBK4rRW3L0QVybdZ17ITuakXXgWrCcxuBGyO/dYGfMpCfP/qCeLm4oQG1EGLtjtvg+KzYssvPJkTZn1c3nC9mLj1fwMauclTZZxM6WgtcE4GyQSm1r9x5xejmDhx5/siTQbZ6VSsKWLu+Y4/ZblJK8S7bCqxxeG7tBoTto2dl41L5TMtGvu1VcdzehaF+5ebbO558LtbqgWv56BnP9Hh6r+wkSSapQCaddtZMcTPAhfPcRwrqgRt4m9dFAFzJUGVdl+BVyTLZ4nblb9tyuLS0ErhtbPO2HTxZv+/Mp1pRWNlUkQ2ZoDYHvJXAnaB4VbpaBq8KbJWDmScmOdtSqDi//q0EbleXwShIOnWZLqhWAXTk5D7uI1AJXPeq0pOouklz5UX5Iph0moC4giro0gUlcCed38rg7G05u+mguqGS+3LasqxMEziRG/dVApcvprsjyuuqMuBceZ2z7dlI6vJc9c7Zn38jUnvbVPlG6mwo7FpEF1wCVpblO9vKuuwiEWg03td2w+2NypTAfbP4xcjSP55sHBxTh61XFU/jbr3Mi0m4SZs/svx+BTzeaPnDSZ+rE6sCMPt3MX/ylVWHYv8w9YlPi40aRiqpwtQVuzWGRtZl7mUh8H+jnSpqx0XO5oPX/uNUuheagIsLsUjwxdS62FMDt0B9sgUA9gxe29jQioIXmgDfZ8cP0dva2cZ4ZFydogZukXF1BegoCd7HA3hX1nQdZDHineUbP+s4FdRAwPeEi27GVXLchP0+azomEH8XF7zXAfd1fZNG8s4abNECNUg4y5Lnva99l5qNtTLjYhRHSKOWNjs4zL6UdSljmrhFY+X1YRM5K2MSpwYrfjAblRlXN2Uz9bXTnb4+LTOvfJNm6gitKDi5KQM1cEBdTH1xPY6TLCszLoxKmueWowrwju60i69ViwLwEvhMxVjflI2oweSCFnGvBS7nCjCdxODjwAUtVh1AF2hVILjtUEjUoEOZ1iSOtcA1EZjEGAveO7qpkp5f4PoL0BvThA6sGlTFi5ska4ELntspuiBHzRF1kEXqtI1uyjpIDeRYmWCsFriy8M62DagD1l9pdYAbF3a2nQBqYLIQULmqQBOCFL6Y2HMLZLt2zVx1AF3A+xdmX+DvUNH7HLRsA2jJNq0BaXYyybiNwDW5GpIMHwCC/7sXGxb9zbUu4L1kjyy/m6y2Y8XJRvCCGsCeCbkBM8GYFlUwuSIq5izuwwBKA3WwBS0ATy/kUwZjAqiB7Df3pozGagHXVDgpSa5GtgOASsUWtCSuErwTQg0oDja1FnBNUrmNUVGMBXhHO1PF13ZRXIGWfAN4x+8pK47QqgF0TlgxTYpawEUsJ4YuyMBZpg7DD37YitPKIuX2/oceFc8Pi//tB/RkQvis7L8paCFDG7g2SmRjU2kPP3aNmP/Or8Spnz0nnrnkC97MHlz95ZGOwfW3CvzloheBxlUFPTHp9wJQUQbX7xPDHeM2ebXtmusE/k4efpwOOashFwV6qe4/ev+o3X/0l6O6q//YJENt4ILngi6k9lu0ukkHWAkwZbDWjXN17vO3/kApimyiGkDuHT8sei8dVvafxIPawO1KcAisXKB+bt+dXjKuTlzHAB5n5K5kY5tsi5itW1gYvK8TPPRZeuGQWLzr67rdg/bbetF5Sn11FEA5oObg3VepddQMqT31o+cWas83nRxn4SO12Rj/3WmMZeNdDwmb1SpWxrVRFDJ4lFWhk5tZ6+x0yXOJ29bpazoH38b+pZeNbbHEAi4CGSvPJbC6BGoTcGzOuwBuWT9xYtREKcRvf1Lu1vpnW5oAB9jAhdIYHrrBBUQ3jKhHb955d50Q7/qbF5c897Jd1/oztJC8+KV9onfO+6L/lW+PKB5uqkH1unJzzeK4FOnBjdupGbQGWOlqrfqqGRbgxZ+vcvLgw05Eb9tzoxM5ZSFTxco8ADu1vvrWZfj7n4+GUV2W4ftz/+ET1irYGRcaQ9EF6EEBWKuAOuog/YNJw58vAL9z6VWStria5HuTVXTxoybwUt001vY8zamtHCPgwmFfdEEnq+o4TZPoC8A6NoTqo5Nlq2yRQUxUguqqMTbHdRNQkw4j4DYJ5Z4nsLpyStYPAKP4pA+yvpBtG8Cq7ET85TmgLEy1agz3GF0o3HHl/kbAHTlosYtGXxdwQg5U2ThXn7uYfcknVzFSySGQoaYs7BLEKp26x4yAqytc7kdZFcdCgFXWTW2a7JTpg+ssS7FpqkfJqsjIBGYAmMDcNJbO01j6bFMbAxdGNPFcAmtbQK0KTIr0oS3AVsawmH8qlIWppuM+a6PlMDKovCwWmgKQHTY1N/u++OI/bdStjL388o+vtJsa9E3R1C+G85SFqZZtcrEMRvKMMy4EyEAdfS6+SlIrBAougEP4iSzbf/kpsTS9K4Q6JzqIUpAwX1nYKuOScV2pAd6l9/BX7VGIjBsbLaiORntnrDJue2b70Tzmvv42L3Sspm8Anb6T3CcDVzH7BJ6Q9AFZdmOvJtUr7JzkQxm4NbM/zsDFc8gN9KFGROOpTAsaQ6TskIGrDMvZgz7pA2X2s9pySzcCGbiakQLIzln/nrj83EXNEfXdNvWWxPr1/p5iq9ee/tm8qpD+HE6kB8UtQS45AulFIAM3vTnLFhcRyMDNMEgyAhm4SU5bNjoDN2MgyQhk4CY5bdnoDNyMgSQjkIGb5LRlozNwMwaSjEAGbpLTlo3OwM0YSDICGbhJTls2+v+dzdeSiQrGmQAAAABJRU5ErkJggg==", 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 =
|
|
264
|
+
const t = me(e), n = t.flatMap((u) => u.providers ?? []), a = v([...t, ...n]);
|
|
166
265
|
if (e === "okx") {
|
|
167
|
-
const
|
|
168
|
-
if (
|
|
169
|
-
if ((
|
|
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
|
|
173
|
-
if (
|
|
271
|
+
const u = n.find((E) => e === "metamask" ? E.isMetaMask && !E.isOkxWallet : b(E));
|
|
272
|
+
if (u) return u;
|
|
174
273
|
}
|
|
175
|
-
const
|
|
176
|
-
if (e === "metamask" && (
|
|
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
|
|
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
|
|
287
|
+
return v(e === "metamask" ? [window.ethereum, ...((a = window.ethereum) == null ? void 0 : a.providers) ?? []] : t);
|
|
186
288
|
}
|
|
187
|
-
function
|
|
289
|
+
function v(e) {
|
|
188
290
|
return e.filter((t, n, a) => !!(t != null && t.request) && a.indexOf(t) === n);
|
|
189
291
|
}
|
|
190
|
-
function
|
|
292
|
+
function b(e) {
|
|
191
293
|
return !!(e != null && e.isOkxWallet || e != null && e.isOKExWallet || e != null && e.isOKXWallet);
|
|
192
294
|
}
|
|
193
|
-
function
|
|
295
|
+
function X(e) {
|
|
194
296
|
if (e)
|
|
195
297
|
return Number.parseInt(e, 16);
|
|
196
298
|
}
|
|
197
|
-
function
|
|
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
|
|
339
|
+
// installed 通过能否找到 provider 判断钱包插件是否安装。
|
|
340
|
+
installed: () => !!O(e.id),
|
|
341
|
+
// connect 是真正发起钱包连接的方法。
|
|
204
342
|
connect: async () => {
|
|
205
|
-
const t =
|
|
343
|
+
const t = O(e.id);
|
|
206
344
|
if (!t)
|
|
207
|
-
throw new
|
|
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
|
-
}),
|
|
210
|
-
if (!
|
|
347
|
+
}), o = n[0];
|
|
348
|
+
if (!o) throw new l("PROVIDER_NOT_FOUND", `${e.name} did not return an address.`);
|
|
211
349
|
return {
|
|
212
|
-
|
|
350
|
+
// 保存钱包地址。
|
|
351
|
+
address: o,
|
|
352
|
+
// 标记这是 EVM 钱包。
|
|
213
353
|
chainType: "evm",
|
|
214
|
-
chainId
|
|
354
|
+
// 把十六进制 chainId 转成数字保存。
|
|
355
|
+
chainId: X(a)
|
|
215
356
|
};
|
|
216
357
|
},
|
|
358
|
+
// signMessage 负责让 EVM 钱包签名一段文本。
|
|
217
359
|
signMessage: async (t, n) => {
|
|
218
|
-
const a =
|
|
219
|
-
if (!a) throw new
|
|
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
|
-
|
|
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
|
|
229
|
-
var
|
|
230
|
-
if (
|
|
231
|
-
|
|
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
|
|
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
|
|
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
|
|
245
|
-
|
|
428
|
+
// icon 是简化版展示字符。
|
|
429
|
+
icon: t,
|
|
430
|
+
// installed 通过是否找到 Phantom provider 判断是否安装。
|
|
431
|
+
installed: () => !!J(),
|
|
432
|
+
// connect 负责调用 Phantom 扩展发起连接。
|
|
246
433
|
connect: async () => {
|
|
247
|
-
const
|
|
248
|
-
if (!
|
|
249
|
-
const
|
|
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
|
|
252
|
-
|
|
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
|
|
259
|
-
await ((
|
|
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
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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
|
|
464
|
+
// getDeepLink 生成移动端打开 Phantom App 的链接。
|
|
465
|
+
getDeepLink: (n) => j("phantom", n, e)
|
|
268
466
|
};
|
|
269
467
|
}
|
|
270
|
-
function
|
|
468
|
+
function ke(e) {
|
|
271
469
|
return [
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
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
|
|
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
|
-
},
|
|
281
|
-
function
|
|
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
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
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
|
|
291
|
-
var
|
|
292
|
-
|
|
293
|
-
}, []),
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
if (
|
|
298
|
-
|
|
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 (!
|
|
302
|
-
const
|
|
303
|
-
throw
|
|
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
|
-
|
|
306
|
-
|
|
521
|
+
// 记录这次尝试连接的钱包。
|
|
522
|
+
wallet: c,
|
|
523
|
+
// 保存错误对象。
|
|
524
|
+
error: C,
|
|
525
|
+
// 更新时间戳。
|
|
307
526
|
updatedAt: Date.now()
|
|
308
|
-
}),
|
|
527
|
+
}), E.current.emit("error", C), C;
|
|
309
528
|
}
|
|
310
|
-
const
|
|
529
|
+
const s = {
|
|
530
|
+
// 保留原状态里的其它字段。
|
|
311
531
|
...r,
|
|
532
|
+
// 状态改成 connecting。
|
|
312
533
|
status: "connecting",
|
|
313
|
-
|
|
534
|
+
// 记录当前要连接的钱包。
|
|
535
|
+
wallet: c,
|
|
536
|
+
// 清除上一次错误。
|
|
314
537
|
error: void 0,
|
|
538
|
+
// 更新时间戳。
|
|
315
539
|
updatedAt: Date.now()
|
|
316
540
|
};
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
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
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
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
|
-
|
|
362
|
-
}, [
|
|
363
|
-
|
|
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
|
-
|
|
644
|
+
c && r.status === "connected" && h({
|
|
645
|
+
// 保留原钱包状态。
|
|
370
646
|
...r,
|
|
371
|
-
auth
|
|
647
|
+
// 覆盖 auth 为新 session。
|
|
648
|
+
auth: c,
|
|
649
|
+
// 更新时间戳。
|
|
372
650
|
updatedAt: Date.now()
|
|
373
651
|
});
|
|
374
|
-
}, [t,
|
|
375
|
-
|
|
376
|
-
const
|
|
377
|
-
|
|
378
|
-
const
|
|
379
|
-
|
|
380
|
-
const
|
|
381
|
-
|
|
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
|
-
|
|
662
|
+
A(), c.destroy();
|
|
385
663
|
};
|
|
386
|
-
}, [
|
|
387
|
-
|
|
664
|
+
}, [o]), W(() => {
|
|
665
|
+
d && g && f(g).catch(() => {
|
|
388
666
|
});
|
|
389
|
-
}, [
|
|
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
|
|
392
|
-
|
|
393
|
-
const
|
|
394
|
-
|
|
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
|
-
},
|
|
397
|
-
return () => window.clearTimeout(
|
|
398
|
-
}, [t == null ? void 0 : t.renewalWindowMs,
|
|
399
|
-
const
|
|
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
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
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
|
-
|
|
734
|
+
// 这些依赖变化时才重新生成 value。
|
|
735
|
+
[f, k, y, M, U, r, H, S]
|
|
409
736
|
);
|
|
410
|
-
return /* @__PURE__ */
|
|
737
|
+
return /* @__PURE__ */ i(Z.Provider, { value: K, children: e });
|
|
411
738
|
}
|
|
412
|
-
function
|
|
413
|
-
const e =
|
|
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
|
|
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
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
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__ */
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
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-
|
|
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__ */
|
|
459
|
-
|
|
460
|
-
|
|
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
|
-
|
|
464
|
-
)
|
|
465
|
-
|
|
466
|
-
|
|
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
|
|
857
|
+
function L(e) {
|
|
470
858
|
return e.length <= 12 ? e : `${e.slice(0, 6)}...${e.slice(-4)}`;
|
|
471
859
|
}
|
|
472
860
|
export {
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
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
|