miniwallet 0.1.7 → 0.1.9

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.
@@ -1,26 +1,32 @@
1
1
  import "./miniwallet.css";
2
- import { createContext as e, useCallback as t, useContext as n, useEffect as r, useMemo as i, useState as a } from "react";
3
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
4
  //#region src/MiniWalletContext.tsx
5
- var c = e(null);
5
+ var MiniWalletContext = createContext(null);
6
6
  //#endregion
7
7
  //#region src/utils/formatUnits.ts
8
- function l(e) {
9
- if (typeof e == "bigint") return e;
10
- let t = e.trim();
11
- if (!t) throw Error("value must not be empty");
12
- return BigInt(t);
8
+ function parseUnitValue(value) {
9
+ if (typeof value === "bigint") return value;
10
+ const trimmed = value.trim();
11
+ if (!trimmed) throw new Error("value must not be empty");
12
+ return BigInt(trimmed);
13
13
  }
14
- function u(e, t) {
15
- if (!Number.isInteger(t) || t < 0) throw Error("decimals must be a non-negative integer");
16
- let n = l(e);
17
- if (t === 0) return n.toString();
18
- let r = 10n ** BigInt(t), i = n / r, a = n % r;
19
- return a === 0n ? i.toString() : `${i}.${a.toString().padStart(t, "0").replace(/0+$/, "")}`;
14
+ /**
15
+ * Convert smallest-unit amount (e.g. wei) to a human-readable decimal string.
16
+ */
17
+ function formatUnits(value, decimals) {
18
+ if (!Number.isInteger(decimals) || decimals < 0) throw new Error("decimals must be a non-negative integer");
19
+ const amount = parseUnitValue(value);
20
+ if (decimals === 0) return amount.toString();
21
+ const divisor = 10n ** BigInt(decimals);
22
+ const integer = amount / divisor;
23
+ const fraction = amount % divisor;
24
+ if (fraction === 0n) return integer.toString();
25
+ return `${integer}.${fraction.toString().padStart(decimals, "0").replace(/0+$/, "")}`;
20
26
  }
21
27
  //#endregion
22
28
  //#region src/constants.ts
23
- var d = [
29
+ var WALLETS = [
24
30
  {
25
31
  id: "metamask",
26
32
  name: "MetaMask",
@@ -41,13 +47,16 @@ var d = [
41
47
  name: "Coinbase",
42
48
  icon: "data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1783439807758'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='13209'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='32'%20height='32'%3e%3cpath%20d='M1024%20186.181818a186.181818%20186.181818%200%200%200-186.181818-186.181818H186.181818a186.181818%20186.181818%200%200%200-186.181818%20186.181818v651.636364a186.181818%20186.181818%200%200%200%20186.181818%20186.181818h651.636364a186.181818%20186.181818%200%200%200%20186.181818-186.181818V186.181818z'%20fill='%232C5FF6'%20p-id='13210'%3e%3c/path%3e%3cpath%20d='M512%20870.4a358.4%20358.4%200%201%200%200-716.8%20358.4%20358.4%200%200%200%200%20716.8zM422.4%20394.984727h179.2a27.461818%2027.461818%200%200%201%2027.461818%2027.415273v179.2a27.461818%2027.461818%200%200%201-27.461818%2027.461818h-179.2a27.461818%2027.461818%200%200%201-27.461818-27.461818v-179.2a27.461818%2027.461818%200%200%201%2027.461818-27.461818z'%20fill='%23FFFFFF'%20p-id='13211'%3e%3c/path%3e%3c/svg%3e"
43
49
  }
44
- ], f = {
50
+ ];
51
+ /** EIP-6963 rdns → wallet id */
52
+ var RDNS_TO_WALLET_ID = {
45
53
  "io.metamask": "metamask",
46
54
  "com.okex.wallet": "okx",
47
55
  "com.okx.wallet": "okx",
48
56
  "app.phantom": "phantom",
49
57
  "com.coinbase.wallet": "coinbase"
50
- }, p = [
58
+ };
59
+ var DEFAULT_CHAINS = [
51
60
  {
52
61
  id: 1,
53
62
  name: "Ethereum",
@@ -69,260 +78,336 @@ var d = [
69
78
  ];
70
79
  //#endregion
71
80
  //#region src/MiniWalletProvider.tsx
72
- function m({ children: e, chains: n = [] }) {
73
- let [s, l] = a(""), [m, h] = a(""), [g, _] = a(0), [v, y] = a(""), [b, x] = a(null), [S, C] = a({}), w = i(() => n.length > 0 ? n : p, [n]), T = i(() => S[m] ?? null, [S, m]), E = i(() => d.find((e) => e.id === m), [m]), D = i(() => !!s, [s]), O = i(() => w.find((e) => e.id === g) || null, [w, g]), k = i(() => !O || !v || !O?.decimals ? "0" : Number(u(v, O.decimals)).toFixed(3), [v, O]), A = t(async (e) => {
74
- let { id: t } = e;
81
+ function MiniWalletProvider({ children, chains = [] }) {
82
+ const [account, setAccount] = useState("");
83
+ const [selectedWalletId, setSelectedWalletId] = useState("");
84
+ const [selectedChainId, setSelectedChainId] = useState(0);
85
+ const [balanceValue, setBalanceValue] = useState("");
86
+ const [connectingWallet] = useState(null);
87
+ const eip6963ProvidersRef = useRef({});
88
+ const [providersVersion, setProvidersVersion] = useState(0);
89
+ const chainsList = useMemo(() => {
90
+ return chains.length > 0 ? chains : DEFAULT_CHAINS;
91
+ }, [chains]);
92
+ const curWalletProvider = useMemo(() => {
93
+ return eip6963ProvidersRef.current[selectedWalletId] ?? null;
94
+ }, [providersVersion, selectedWalletId]);
95
+ const wallet = useMemo(() => {
96
+ return WALLETS.find((w) => w.id === selectedWalletId);
97
+ }, [selectedWalletId]);
98
+ const isConnected = useMemo(() => {
99
+ return !!account;
100
+ }, [account]);
101
+ const selectedChain = useMemo(() => {
102
+ return chainsList.find((c) => c.id === selectedChainId) || null;
103
+ }, [chainsList, selectedChainId]);
104
+ const balance = useMemo(() => {
105
+ if (!selectedChain || !balanceValue || !selectedChain?.decimals) return "0";
106
+ return Number(formatUnits(balanceValue, selectedChain.decimals)).toFixed(3);
107
+ }, [balanceValue, selectedChain]);
108
+ const connect = useCallback(async (w) => {
109
+ const { id } = w;
110
+ console.log("eip6963Providers: ", eip6963ProvidersRef.current);
111
+ const provider = eip6963ProvidersRef.current[id];
112
+ if (!provider || typeof provider.request !== "function") {
113
+ alert("请安装钱包");
114
+ return;
115
+ }
75
116
  try {
76
- console.log("eip6963Providers: ", S);
77
- let e = S[t];
78
- if (!e) {
79
- alert("请安装钱包");
117
+ console.log("provider: ", provider);
118
+ const accounts = await provider.request({ method: "eth_requestAccounts" });
119
+ console.log("accounts: ", accounts);
120
+ console.log("provider.chainId: ", provider.chainId);
121
+ const chainId = parseInt(String(provider.chainId ?? "0x0"), 16);
122
+ setAccount(accounts[0]);
123
+ setSelectedWalletId(id);
124
+ setSelectedChainId(chainId);
125
+ localStorage.setItem("miniwallet:lastWalletId", id);
126
+ } catch (error) {
127
+ console.log("error: ", error);
128
+ const e = error;
129
+ const errCode = e?.code ?? "";
130
+ const errMsg = e?.message ?? "";
131
+ if (errCode === -32002) {
132
+ alert(`连接已发起,请在扩展中确认连接`);
80
133
  return;
81
134
  }
82
- console.log("provider: ", e);
83
- let n = await e.request({ method: "eth_requestAccounts" });
84
- console.log("accounts: ", n), console.log("provider.chainId: ", e.chainId);
85
- let r = parseInt(e.chainId, 16);
86
- l(n[0]), h(t), _(r), localStorage.setItem("miniwallet:lastWalletId", t);
87
- } catch (e) {
88
- console.log("error: ", e);
89
- let t = e, n = t?.code ?? "", r = t?.message ?? "";
90
- if (n === -32002) {
91
- alert("连接已发起,请在扩展中确认连接");
92
- return;
93
- }
94
- alert(`Connect failed${n && `\n${n}`}${r && `\n${r}`}`), x(null);
135
+ alert(`Connect failed${errCode && `\n${errCode}`}${errMsg && `\n${errMsg}`}`);
95
136
  }
96
- }, [S]), j = t(async () => {
137
+ }, []);
138
+ const disconnect = useCallback(async () => {
97
139
  try {
98
- if (!T || !m) {
140
+ if (!curWalletProvider || !selectedWalletId) {
99
141
  alert("请安装钱包");
100
142
  return;
101
143
  }
102
- m !== "okx" && await T.request({
144
+ if (selectedWalletId !== "okx") await curWalletProvider.request({
103
145
  method: "wallet_revokePermissions",
104
146
  params: [{ eth_accounts: {} }]
105
147
  });
106
148
  } catch (e) {
107
149
  console.error("disconnect error: ", e);
108
150
  } finally {
109
- l(""), h(""), _(0), localStorage.removeItem("miniwallet:lastWalletId");
151
+ setAccount("");
152
+ setSelectedWalletId("");
153
+ setSelectedChainId(0);
154
+ localStorage.removeItem("miniwallet:lastWalletId");
110
155
  }
111
- }, [T, m]), M = t(async (e) => {
112
- if (!T) {
156
+ }, [curWalletProvider, selectedWalletId]);
157
+ const switchChain = useCallback(async (chain) => {
158
+ if (!curWalletProvider) {
113
159
  alert("钱包不存在");
114
160
  return;
115
161
  }
116
162
  try {
117
- await T.request({
163
+ await curWalletProvider.request({
118
164
  method: "wallet_switchEthereumChain",
119
- params: [{ chainId: `0x${e.id.toString(16)}` }]
120
- }), _(e.id);
121
- } catch (e) {
122
- console.log("switchError: ", e);
123
- let t = e, n = t?.code ?? "", r = t?.message ?? "";
124
- alert(`Switch failed${n && `\n${n}`}${r && `\n${r}`}`);
165
+ params: [{ chainId: `0x${chain.id.toString(16)}` }]
166
+ });
167
+ setSelectedChainId(chain.id);
168
+ } catch (switchError) {
169
+ console.log("switchError: ", switchError);
170
+ const e = switchError;
171
+ const errCode = e?.code ?? "";
172
+ const errMsg = e?.message ?? "";
173
+ alert(`Switch failed${errCode && `\n${errCode}`}${errMsg && `\n${errMsg}`}`);
125
174
  }
126
- }, [T]), N = t(async () => {
175
+ }, [curWalletProvider]);
176
+ const getBalance = useCallback(async () => {
127
177
  try {
128
- if (!s || !T) return;
129
- let e = await T.request({
178
+ if (!account || !curWalletProvider) return;
179
+ const balanceRes = await curWalletProvider.request({
130
180
  method: "eth_getBalance",
131
- params: [s, "latest"]
181
+ params: [account, "latest"]
132
182
  });
133
- y(BigInt(e).toString());
183
+ setBalanceValue(BigInt(balanceRes).toString());
134
184
  } catch (e) {
135
185
  console.error("getBalance error: ", e);
136
186
  }
137
- }, [s, T]), P = i(() => ({
138
- account: s,
139
- balance: k,
140
- isConnected: D,
141
- connectingWallet: b,
142
- selectedChain: O,
143
- wallet: E,
144
- chains: w,
145
- connect: A,
146
- switchChain: M,
147
- disconnect: j
187
+ }, [account, curWalletProvider]);
188
+ const value = useMemo(() => ({
189
+ account,
190
+ balance,
191
+ isConnected,
192
+ connectingWallet,
193
+ selectedChain,
194
+ wallet,
195
+ chains: chainsList,
196
+ connect,
197
+ switchChain,
198
+ disconnect
148
199
  }), [
149
- s,
150
- k,
151
- D,
152
- b,
153
- O,
154
- E,
155
- w,
156
- A,
157
- M,
158
- j
200
+ account,
201
+ balance,
202
+ isConnected,
203
+ connectingWallet,
204
+ selectedChain,
205
+ wallet,
206
+ chainsList,
207
+ connect,
208
+ switchChain,
209
+ disconnect
159
210
  ]);
160
- return r(() => {
161
- let e = ((e) => {
162
- let { info: t, provider: n } = e.detail ?? {}, r = f[t?.rdns];
163
- !r || !n?.request || C((e) => e[r] === n ? e : {
164
- ...e,
165
- [r]: n
166
- });
211
+ useEffect(() => {
212
+ const handler = ((event) => {
213
+ const { info, provider } = event.detail ?? {};
214
+ const walletId = RDNS_TO_WALLET_ID[info?.rdns];
215
+ if (!walletId || typeof provider?.request !== "function") return;
216
+ if (eip6963ProvidersRef.current[walletId] === provider) return;
217
+ eip6963ProvidersRef.current = {
218
+ ...eip6963ProvidersRef.current,
219
+ [walletId]: provider
220
+ };
221
+ setProvidersVersion((v) => v + 1);
167
222
  });
168
- return window.addEventListener("eip6963:announceProvider", e), window.dispatchEvent(new Event("eip6963:requestProvider")), () => {
169
- window.removeEventListener("eip6963:announceProvider", e), C({});
223
+ window.addEventListener("eip6963:announceProvider", handler);
224
+ window.dispatchEvent(new Event("eip6963:requestProvider"));
225
+ return () => {
226
+ window.removeEventListener("eip6963:announceProvider", handler);
227
+ };
228
+ }, []);
229
+ useEffect(() => {
230
+ if (selectedChainId) getBalance();
231
+ }, [getBalance, selectedChainId]);
232
+ useEffect(() => {
233
+ if (!isConnected || !curWalletProvider?.on) return;
234
+ const handleChainChanged = (chainId) => {
235
+ console.log("ChainChanged chainId: ", chainId);
236
+ setSelectedChainId(parseInt(chainId, 16));
170
237
  };
171
- }, []), r(() => {
172
- g && N();
173
- }, [N, g]), r(() => {
174
- if (!D || !T?.on) return;
175
- let e = (e) => {
176
- console.log("ChainChanged chainId: ", e), _(parseInt(e, 16));
177
- }, t = (e) => {
178
- console.log("AccountsChanged accounts: ", e), l(e[0]);
238
+ const handleAccountsChanged = (accounts) => {
239
+ console.log("AccountsChanged accounts: ", accounts);
240
+ setAccount(accounts[0] ?? "");
179
241
  };
180
- return console.log("Listen chainChanged and accountsChanged"), T.on("chainChanged", e), T.on("accountsChanged", t), () => {
181
- console.log("RemoveListener chainChanged and accountsChanged"), T.removeListener("chainChanged", e), T.removeListener("accountsChanged", t);
242
+ console.log("Listen chainChanged and accountsChanged");
243
+ curWalletProvider.on("chainChanged", handleChainChanged);
244
+ curWalletProvider.on("accountsChanged", handleAccountsChanged);
245
+ return () => {
246
+ console.log("RemoveListener chainChanged and accountsChanged");
247
+ curWalletProvider.removeListener?.("chainChanged", handleChainChanged);
248
+ curWalletProvider.removeListener?.("accountsChanged", handleAccountsChanged);
182
249
  };
183
- }, [T, D]), r(() => {
184
- if (!s) return;
185
- let e = setInterval(N, 1e4);
186
- return () => clearInterval(e);
187
- }, [s, N]), r(() => {
188
- let e = localStorage.getItem("miniwallet:lastWalletId");
189
- if (!e) return;
190
- let t = S[e];
191
- if (!t) return;
192
- let n = !1;
193
- return (async () => {
194
- let r = await t.request({ method: "eth_accounts" });
195
- if (!n) {
196
- if (!r?.length) {
197
- localStorage.removeItem("miniwallet:lastWalletId");
198
- return;
199
- }
200
- l(r[0]), h(e), _(parseInt(t.chainId, 16));
250
+ }, [curWalletProvider, isConnected]);
251
+ useEffect(() => {
252
+ if (!account) return;
253
+ const timer = setInterval(getBalance, 1e4);
254
+ return () => clearInterval(timer);
255
+ }, [account, getBalance]);
256
+ useEffect(() => {
257
+ const lastWalletId = localStorage.getItem("miniwallet:lastWalletId");
258
+ if (!lastWalletId) return;
259
+ const provider = eip6963ProvidersRef.current[lastWalletId];
260
+ if (!provider) return;
261
+ let cancelled = false;
262
+ (async () => {
263
+ const accounts = await provider.request({ method: "eth_accounts" });
264
+ if (cancelled) return;
265
+ if (!accounts?.length) {
266
+ localStorage.removeItem("miniwallet:lastWalletId");
267
+ return;
201
268
  }
202
- })(), () => {
203
- n = !0;
269
+ setAccount(accounts[0]);
270
+ setSelectedWalletId(lastWalletId);
271
+ setSelectedChainId(parseInt(String(provider.chainId ?? "0x0"), 16));
272
+ })();
273
+ return () => {
274
+ cancelled = true;
204
275
  };
205
- }, [S]), /* @__PURE__ */ o(c.Provider, {
206
- value: P,
207
- children: e
276
+ }, [providersVersion]);
277
+ return /* @__PURE__ */ jsx(MiniWalletContext.Provider, {
278
+ value,
279
+ children
208
280
  });
209
281
  }
210
282
  //#endregion
211
283
  //#region src/useMiniWallet.ts
212
- function h() {
213
- let e = n(c);
214
- if (!e) throw Error("useMiniWallet 必须在 MiniWalletProvider 内使用");
215
- return e;
284
+ function useMiniWallet() {
285
+ const ctx = useContext(MiniWalletContext);
286
+ if (!ctx) throw new Error("useMiniWallet 必须在 MiniWalletProvider 内使用");
287
+ return ctx;
216
288
  }
217
289
  //#endregion
218
290
  //#region src/icons/disconnect.svg
219
- var g = "data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1783575961451'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='5071'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='32'%20height='32'%3e%3cpath%20d='M512.922%2063.583c248.335%200%20449.712%20201.384%20449.712%20449.71%200%20248.333-201.377%20449.702-449.712%20449.702-248.333%200-449.71-201.369-449.71-449.702%200-248.326%20201.377-449.71%20449.71-449.71z%20m148.683%20213.634l-35.351%2061.247a206.8%20206.8%200%200%201%2034.37%2027.739c37.359%2037.351%2060.475%2088.96%2060.475%20145.955%200%2057.004-23.117%20108.607-60.475%20145.965-37.344%2037.352-88.945%2060.469-145.949%2060.469-56.987%200-108.606-23.117-145.965-60.469-37.359-37.359-60.461-88.962-60.461-145.965%200-56.995%2023.117-108.605%2060.461-145.955a209.04%20209.04%200%200%201%2027.762-23.286l-35.43-61.359a278.69%20278.69%200%200%200-42.279%2034.69c-50.156%2050.148-81.18%20119.417-81.18%20195.91%200%2076.504%2031.041%20145.773%2081.18%20195.929%2050.139%2050.139%20119.408%2081.166%20195.912%2081.166%2076.502%200%20145.771-31.026%20195.91-81.166%2050.156-50.156%2081.182-119.425%2081.182-195.929%200-76.494-31.026-145.763-81.182-195.91a277.704%20277.704%200%200%200-48.98-39.031zM473.618%20128.865v337.849h75.458V128.865h-75.458z'%20fill='%23e6523f'%20p-id='5072'%3e%3c/path%3e%3c/svg%3e";
291
+ var disconnect_default = "data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1783575961451'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='5071'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='32'%20height='32'%3e%3cpath%20d='M512.922%2063.583c248.335%200%20449.712%20201.384%20449.712%20449.71%200%20248.333-201.377%20449.702-449.712%20449.702-248.333%200-449.71-201.369-449.71-449.702%200-248.326%20201.377-449.71%20449.71-449.71z%20m148.683%20213.634l-35.351%2061.247a206.8%20206.8%200%200%201%2034.37%2027.739c37.359%2037.351%2060.475%2088.96%2060.475%20145.955%200%2057.004-23.117%20108.607-60.475%20145.965-37.344%2037.352-88.945%2060.469-145.949%2060.469-56.987%200-108.606-23.117-145.965-60.469-37.359-37.359-60.461-88.962-60.461-145.965%200-56.995%2023.117-108.605%2060.461-145.955a209.04%20209.04%200%200%201%2027.762-23.286l-35.43-61.359a278.69%20278.69%200%200%200-42.279%2034.69c-50.156%2050.148-81.18%20119.417-81.18%20195.91%200%2076.504%2031.041%20145.773%2081.18%20195.929%2050.139%2050.139%20119.408%2081.166%20195.912%2081.166%2076.502%200%20145.771-31.026%20195.91-81.166%2050.156-50.156%2081.182-119.425%2081.182-195.929%200-76.494-31.026-145.763-81.182-195.91a277.704%20277.704%200%200%200-48.98-39.031zM473.618%20128.865v337.849h75.458V128.865h-75.458z'%20fill='%23e6523f'%20p-id='5072'%3e%3c/path%3e%3c/svg%3e";
220
292
  //#endregion
221
293
  //#region src/MiniWalletButton.tsx
222
- function _({ label: e = "Connect Wallet" }) {
223
- let { account: n, balance: c, isConnected: l, connectingWallet: u, selectedChain: f, wallet: p, switchChain: m, chains: _, connect: v, disconnect: y } = h(), [b, x] = a(!1), [S, C] = a(!1), [w, T] = a(!1), [E, D] = a("复制地址"), O = i(() => n ? `${n.slice(0, 6)}...${n.slice(-4)}` : "", [n]), k = t(() => {
224
- x(!0);
225
- }, []), A = t(() => {
226
- x(!1);
227
- }, []), j = t(async () => {
294
+ function MiniWalletButton({ label = "Connect Wallet" }) {
295
+ const { account, balance, isConnected, selectedChain, wallet, switchChain, chains, connect, disconnect } = useMiniWallet();
296
+ const [modalOpen, setModalOpen] = useState(false);
297
+ const [accountModalOpen, setAccountModalOpen] = useState(false);
298
+ const [copyLabel, setCopyLabel] = useState("复制地址");
299
+ const accountText = useMemo(() => {
300
+ if (account) return `${account.slice(0, 6)}...${account.slice(-4)}`;
301
+ return "";
302
+ }, [account]);
303
+ const openModal = useCallback(() => {
304
+ setModalOpen(true);
305
+ }, []);
306
+ const closeModal = useCallback(() => {
307
+ setModalOpen(false);
308
+ }, []);
309
+ const copyAddress = useCallback(async () => {
228
310
  try {
229
- await navigator.clipboard.writeText(n), D("已复制!"), setTimeout(() => {
230
- D("复制地址");
311
+ await navigator.clipboard.writeText(account);
312
+ setCopyLabel("已复制!");
313
+ setTimeout(() => {
314
+ setCopyLabel("复制地址");
231
315
  }, 1e3);
232
- } catch (e) {
233
- console.error("copy", e);
316
+ } catch (err) {
317
+ console.error("copy", err);
234
318
  }
235
- }, [n]);
236
- return r(() => {
237
- u || (x(!1), T(!1));
238
- }, [u]), l ? /* @__PURE__ */ s("section", {
319
+ }, [account]);
320
+ useEffect(() => {
321
+ if (isConnected) setModalOpen(false);
322
+ }, [isConnected]);
323
+ return isConnected ? /* @__PURE__ */ jsxs("section", {
239
324
  className: "inline-flex items-center justify-center text-center",
240
325
  children: [
241
- /* @__PURE__ */ o("select", {
242
- value: f?.id,
243
- onChange: (e) => m(_.find((t) => t.id === Number(e.target.value))),
326
+ /* @__PURE__ */ jsx("select", {
327
+ value: selectedChain?.id,
328
+ onChange: (e) => switchChain(chains.find((c) => c.id === Number(e.target.value))),
244
329
  className: "bg-transparent1 mr-4 cursor-pointer rounded-sm border-none p-1 text-gray-600 outline-none hover:bg-gray-100",
245
- children: _.map((e) => /* @__PURE__ */ o("option", {
246
- value: e.id,
247
- children: e.name
248
- }, e.id))
330
+ children: chains.map((chain) => /* @__PURE__ */ jsx("option", {
331
+ value: chain.id,
332
+ children: chain.name
333
+ }, chain.id))
249
334
  }),
250
- /* @__PURE__ */ s("div", {
335
+ /* @__PURE__ */ jsxs("div", {
251
336
  className: "flex items-center justify-center rounded-2xl bg-white pr-3 shadow-lg inset-ring-1 shadow-gray-200 inset-ring-gray-100",
252
- children: [/* @__PURE__ */ s("div", {
337
+ children: [/* @__PURE__ */ jsxs("div", {
253
338
  onClick: () => {
254
- T(!0);
339
+ setAccountModalOpen(true);
255
340
  },
256
341
  className: "flex cursor-pointer items-center justify-center space-x-2 rounded-l-2xl py-2.5 pr-1 pl-3 hover:bg-gray-50",
257
342
  children: [
258
- p && /* @__PURE__ */ o("img", {
259
- src: p.icon,
260
- alt: p.name,
343
+ wallet && /* @__PURE__ */ jsx("img", {
344
+ src: wallet.icon,
345
+ alt: wallet.name,
261
346
  className: "h-6 w-6"
262
347
  }),
263
- /* @__PURE__ */ o("div", {
348
+ /* @__PURE__ */ jsx("div", {
264
349
  className: "mr-1",
265
- children: O
350
+ children: accountText
266
351
  }),
267
- /* @__PURE__ */ s("span", {
352
+ /* @__PURE__ */ jsxs("span", {
268
353
  className: "text-sm text-gray-400",
269
354
  children: [
270
355
  "(",
271
- c,
356
+ balance,
272
357
  " ",
273
- f?.symbol ?? "",
358
+ selectedChain?.symbol ?? "",
274
359
  ")"
275
360
  ]
276
361
  })
277
362
  ]
278
- }), /* @__PURE__ */ o("button", {
363
+ }), /* @__PURE__ */ jsx("button", {
279
364
  className: "ml-1 h-6 w-6 cursor-pointer rounded-full",
280
- onClick: y,
281
- children: /* @__PURE__ */ o("img", {
282
- src: g,
365
+ onClick: disconnect,
366
+ children: /* @__PURE__ */ jsx("img", {
367
+ src: disconnect_default,
283
368
  alt: "disconnect",
284
369
  className: "h-[22px] w-6"
285
370
  })
286
371
  })]
287
372
  }),
288
- w && /* @__PURE__ */ o("div", {
373
+ accountModalOpen && /* @__PURE__ */ jsx("div", {
289
374
  className: "z-index-10 fixed top-0 right-0 bottom-0 left-0 bg-[rgba(0,0,0,0.5)]",
290
- children: /* @__PURE__ */ s("div", {
375
+ children: /* @__PURE__ */ jsxs("div", {
291
376
  className: "absolute top-1/2 left-1/2 flex h-auto w-[380px] -translate-x-1/2 -translate-y-1/2 flex-col items-center gap-3 rounded-3xl bg-white p-10 pt-5 text-center",
292
377
  children: [
293
- /* @__PURE__ */ o("div", {
378
+ /* @__PURE__ */ jsx("div", {
294
379
  className: "mb-[-12px] w-full text-right",
295
- children: /* @__PURE__ */ o("button", {
380
+ children: /* @__PURE__ */ jsx("button", {
296
381
  className: "mr-[-20px] cursor-pointer rounded-full p-1 hover:bg-gray-100",
297
382
  onClick: () => {
298
- T(!1);
383
+ setAccountModalOpen(false);
299
384
  },
300
- children: /* @__PURE__ */ s("svg", {
385
+ children: /* @__PURE__ */ jsxs("svg", {
301
386
  xmlns: "http://www.w3.org/2000/svg",
302
387
  viewBox: "0 0 24 24",
303
388
  fill: "none",
304
389
  stroke: "currentColor",
305
390
  strokeWidth: "2",
306
391
  className: "h-8 w-8",
307
- children: [/* @__PURE__ */ o("path", { d: "M18 6 6 18" }), /* @__PURE__ */ o("path", { d: "m6 6 12 12" })]
392
+ children: [/* @__PURE__ */ jsx("path", { d: "M18 6 6 18" }), /* @__PURE__ */ jsx("path", { d: "m6 6 12 12" })]
308
393
  })
309
394
  })
310
395
  }),
311
- p && /* @__PURE__ */ o("img", {
312
- src: p.icon,
313
- alt: p.name,
396
+ wallet && /* @__PURE__ */ jsx("img", {
397
+ src: wallet.icon,
398
+ alt: wallet.name,
314
399
  className: "h-16 w-16"
315
400
  }),
316
- /* @__PURE__ */ o("p", { children: O }),
317
- /* @__PURE__ */ s("div", {
401
+ /* @__PURE__ */ jsx("p", { children: accountText }),
402
+ /* @__PURE__ */ jsxs("div", {
318
403
  className: "mt-2 w-full space-x-10",
319
- children: [/* @__PURE__ */ o("button", {
320
- onClick: j,
404
+ children: [/* @__PURE__ */ jsx("button", {
405
+ onClick: copyAddress,
321
406
  className: "w-[112px] cursor-pointer rounded-xl bg-gray-700 py-2 text-white shadow-md shadow-gray-500/50 outline-none",
322
- children: E
323
- }), /* @__PURE__ */ o("button", {
407
+ children: copyLabel
408
+ }), /* @__PURE__ */ jsx("button", {
324
409
  type: "button",
325
- onClick: y,
410
+ onClick: disconnect,
326
411
  className: "w-[112px] cursor-pointer rounded-xl bg-red-400 py-2 text-white shadow-md shadow-red-500/50 outline-none",
327
412
  children: "断开连接"
328
413
  })]
@@ -331,82 +416,60 @@ function _({ label: e = "Connect Wallet" }) {
331
416
  })
332
417
  })
333
418
  ]
334
- }) : /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("button", {
419
+ }) : /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("button", {
335
420
  type: "button",
336
- onClick: k,
421
+ onClick: openModal,
337
422
  className: "cursor-pointer rounded-xl bg-blue-500 px-4 py-2 text-white shadow-lg shadow-blue-500/50",
338
- children: e
339
- }), b && /* @__PURE__ */ o("div", {
423
+ children: label
424
+ }), modalOpen && /* @__PURE__ */ jsx("div", {
340
425
  className: "z-index-10 fixed top-0 right-0 bottom-0 left-0 bg-[rgba(0,0,0,0.5)]",
341
- children: /* @__PURE__ */ s("div", {
426
+ children: /* @__PURE__ */ jsxs("div", {
342
427
  className: "absolute top-1/2 left-1/2 flex h-auto w-[380px] -translate-x-1/2 -translate-y-1/2 flex-col gap-3 rounded-3xl bg-white p-6",
343
- children: [/* @__PURE__ */ s("div", {
428
+ children: [/* @__PURE__ */ jsxs("div", {
344
429
  className: "mb-2 flex items-center justify-between",
345
- children: [/* @__PURE__ */ o("span", {
430
+ children: [/* @__PURE__ */ jsx("span", {
346
431
  className: "text-2xl font-bold",
347
432
  children: "Connect Wallet"
348
- }), /* @__PURE__ */ o("button", {
433
+ }), /* @__PURE__ */ jsx("button", {
349
434
  type: "button",
350
435
  "aria-label": "Close",
351
436
  className: "cursor-pointer rounded-full p-1 hover:bg-gray-100",
352
- onClick: () => {
353
- C(!1), A();
354
- },
355
- children: /* @__PURE__ */ s("svg", {
437
+ onClick: closeModal,
438
+ children: /* @__PURE__ */ jsxs("svg", {
356
439
  xmlns: "http://www.w3.org/2000/svg",
357
440
  viewBox: "0 0 24 24",
358
441
  fill: "none",
359
442
  stroke: "currentColor",
360
443
  strokeWidth: "2",
361
444
  className: "h-8 w-8",
362
- children: [/* @__PURE__ */ o("path", { d: "M18 6 6 18" }), /* @__PURE__ */ o("path", { d: "m6 6 12 12" })]
445
+ children: [/* @__PURE__ */ jsx("path", { d: "M18 6 6 18" }), /* @__PURE__ */ jsx("path", { d: "m6 6 12 12" })]
363
446
  })
364
447
  })]
365
- }), /* @__PURE__ */ s("div", {
448
+ }), /* @__PURE__ */ jsx("div", {
366
449
  className: "relative w-full space-y-4",
367
- children: [S && u && /* @__PURE__ */ s("div", {
368
- className: "absolute inset-0 mb-0 flex flex-col items-center justify-center rounded-xl bg-[rgba(255,255,255,0.9)] text-black",
369
- children: [
370
- /* @__PURE__ */ s("div", { children: [
371
- "正在连接",
372
- u.name,
373
- "..."
374
- ] }),
375
- /* @__PURE__ */ o("div", {
376
- className: "my-1.5 text-xs",
377
- children: "请在扩展中确认连接"
378
- }),
379
- /* @__PURE__ */ o("img", {
380
- src: "data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1783646544006'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='78324'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='32'%20height='32'%3e%3cpath%20d='M512%20907c-24.852%200-45-20.148-45-45s20.148-45%2045-45c168.446%200%20305-136.554%20305-305S680.446%20207%20512%20207%20207%20343.554%20207%20512c0%2024.852-20.148%2045-45%2045S117%20536.852%20117%20512c0-218.152%20176.848-395%20395-395S907%20293.848%20907%20512%20730.152%20907%20512%20907z'%20fill='%23444444'%20p-id='78325'%3e%3c/path%3e%3c/svg%3e",
381
- alt: "spin",
382
- className: "h-8 w-8 animate-[spin_2s_linear_infinite]"
383
- })
384
- ]
385
- }), d.map((e) => /* @__PURE__ */ s("button", {
450
+ children: WALLETS.map((w) => /* @__PURE__ */ jsxs("button", {
386
451
  type: "button",
387
- onClick: () => {
388
- C(!0), v(e);
389
- },
452
+ onClick: () => connect(w),
390
453
  className: "flex w-full cursor-pointer items-center gap-2 rounded-xl border border-gray-300 px-4 py-2 hover:bg-gray-100",
391
- children: [/* @__PURE__ */ o("img", {
392
- src: e.icon,
393
- alt: e.name,
454
+ children: [/* @__PURE__ */ jsx("img", {
455
+ src: w.icon,
456
+ alt: w.name,
394
457
  className: "h-8 w-8"
395
- }), /* @__PURE__ */ s("div", {
458
+ }), /* @__PURE__ */ jsxs("div", {
396
459
  className: "flex flex-col justify-between text-left",
397
- children: [/* @__PURE__ */ o("p", { children: e.name }), /* @__PURE__ */ s("span", {
460
+ children: [/* @__PURE__ */ jsx("p", { children: w.name }), /* @__PURE__ */ jsxs("span", {
398
461
  className: "text-xs text-gray-500",
399
462
  children: [
400
463
  "Connect your ",
401
- e.name,
464
+ w.name,
402
465
  " wallet"
403
466
  ]
404
467
  })]
405
468
  })]
406
- }, e.id))]
469
+ }, w.id))
407
470
  })]
408
471
  })
409
472
  })] });
410
473
  }
411
474
  //#endregion
412
- export { _ as MiniWalletButton, m as MiniWalletProvider, h as useMiniWallet };
475
+ export { MiniWalletButton, MiniWalletProvider, useMiniWallet };