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.
- package/dist/miniwallet.css +725 -1
- package/dist/miniwallet.js +283 -220
- package/package.json +1 -1
package/dist/miniwallet.js
CHANGED
|
@@ -1,26 +1,32 @@
|
|
|
1
1
|
import "./miniwallet.css";
|
|
2
|
-
import { createContext
|
|
3
|
-
import { jsx
|
|
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
|
|
5
|
+
var MiniWalletContext = createContext(null);
|
|
6
6
|
//#endregion
|
|
7
7
|
//#region src/utils/formatUnits.ts
|
|
8
|
-
function
|
|
9
|
-
if (typeof
|
|
10
|
-
|
|
11
|
-
if (!
|
|
12
|
-
return BigInt(
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
|
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
|
-
]
|
|
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
|
-
}
|
|
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
|
|
73
|
-
|
|
74
|
-
|
|
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("
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
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
|
-
}, [
|
|
137
|
+
}, []);
|
|
138
|
+
const disconnect = useCallback(async () => {
|
|
97
139
|
try {
|
|
98
|
-
if (!
|
|
140
|
+
if (!curWalletProvider || !selectedWalletId) {
|
|
99
141
|
alert("请安装钱包");
|
|
100
142
|
return;
|
|
101
143
|
}
|
|
102
|
-
|
|
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
|
-
|
|
151
|
+
setAccount("");
|
|
152
|
+
setSelectedWalletId("");
|
|
153
|
+
setSelectedChainId(0);
|
|
154
|
+
localStorage.removeItem("miniwallet:lastWalletId");
|
|
110
155
|
}
|
|
111
|
-
}, [
|
|
112
|
-
|
|
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
|
|
163
|
+
await curWalletProvider.request({
|
|
118
164
|
method: "wallet_switchEthereumChain",
|
|
119
|
-
params: [{ chainId: `0x${
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
}, [
|
|
175
|
+
}, [curWalletProvider]);
|
|
176
|
+
const getBalance = useCallback(async () => {
|
|
127
177
|
try {
|
|
128
|
-
if (!
|
|
129
|
-
|
|
178
|
+
if (!account || !curWalletProvider) return;
|
|
179
|
+
const balanceRes = await curWalletProvider.request({
|
|
130
180
|
method: "eth_getBalance",
|
|
131
|
-
params: [
|
|
181
|
+
params: [account, "latest"]
|
|
132
182
|
});
|
|
133
|
-
|
|
183
|
+
setBalanceValue(BigInt(balanceRes).toString());
|
|
134
184
|
} catch (e) {
|
|
135
185
|
console.error("getBalance error: ", e);
|
|
136
186
|
}
|
|
137
|
-
}, [
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
200
|
+
account,
|
|
201
|
+
balance,
|
|
202
|
+
isConnected,
|
|
203
|
+
connectingWallet,
|
|
204
|
+
selectedChain,
|
|
205
|
+
wallet,
|
|
206
|
+
chainsList,
|
|
207
|
+
connect,
|
|
208
|
+
switchChain,
|
|
209
|
+
disconnect
|
|
159
210
|
]);
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
|
|
169
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
181
|
-
|
|
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
|
-
}, [
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
if (!
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
-
|
|
269
|
+
setAccount(accounts[0]);
|
|
270
|
+
setSelectedWalletId(lastWalletId);
|
|
271
|
+
setSelectedChainId(parseInt(String(provider.chainId ?? "0x0"), 16));
|
|
272
|
+
})();
|
|
273
|
+
return () => {
|
|
274
|
+
cancelled = true;
|
|
204
275
|
};
|
|
205
|
-
}, [
|
|
206
|
-
|
|
207
|
-
|
|
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
|
|
213
|
-
|
|
214
|
-
if (!
|
|
215
|
-
return
|
|
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
|
|
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
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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(
|
|
230
|
-
|
|
311
|
+
await navigator.clipboard.writeText(account);
|
|
312
|
+
setCopyLabel("已复制!");
|
|
313
|
+
setTimeout(() => {
|
|
314
|
+
setCopyLabel("复制地址");
|
|
231
315
|
}, 1e3);
|
|
232
|
-
} catch (
|
|
233
|
-
console.error("copy",
|
|
316
|
+
} catch (err) {
|
|
317
|
+
console.error("copy", err);
|
|
234
318
|
}
|
|
235
|
-
}, [
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
}, [
|
|
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__ */
|
|
242
|
-
value:
|
|
243
|
-
onChange: (e) =>
|
|
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:
|
|
246
|
-
value:
|
|
247
|
-
children:
|
|
248
|
-
},
|
|
330
|
+
children: chains.map((chain) => /* @__PURE__ */ jsx("option", {
|
|
331
|
+
value: chain.id,
|
|
332
|
+
children: chain.name
|
|
333
|
+
}, chain.id))
|
|
249
334
|
}),
|
|
250
|
-
/* @__PURE__ */
|
|
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__ */
|
|
337
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
253
338
|
onClick: () => {
|
|
254
|
-
|
|
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
|
-
|
|
259
|
-
src:
|
|
260
|
-
alt:
|
|
343
|
+
wallet && /* @__PURE__ */ jsx("img", {
|
|
344
|
+
src: wallet.icon,
|
|
345
|
+
alt: wallet.name,
|
|
261
346
|
className: "h-6 w-6"
|
|
262
347
|
}),
|
|
263
|
-
/* @__PURE__ */
|
|
348
|
+
/* @__PURE__ */ jsx("div", {
|
|
264
349
|
className: "mr-1",
|
|
265
|
-
children:
|
|
350
|
+
children: accountText
|
|
266
351
|
}),
|
|
267
|
-
/* @__PURE__ */
|
|
352
|
+
/* @__PURE__ */ jsxs("span", {
|
|
268
353
|
className: "text-sm text-gray-400",
|
|
269
354
|
children: [
|
|
270
355
|
"(",
|
|
271
|
-
|
|
356
|
+
balance,
|
|
272
357
|
" ",
|
|
273
|
-
|
|
358
|
+
selectedChain?.symbol ?? "",
|
|
274
359
|
")"
|
|
275
360
|
]
|
|
276
361
|
})
|
|
277
362
|
]
|
|
278
|
-
}), /* @__PURE__ */
|
|
363
|
+
}), /* @__PURE__ */ jsx("button", {
|
|
279
364
|
className: "ml-1 h-6 w-6 cursor-pointer rounded-full",
|
|
280
|
-
onClick:
|
|
281
|
-
children: /* @__PURE__ */
|
|
282
|
-
src:
|
|
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
|
-
|
|
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__ */
|
|
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__ */
|
|
378
|
+
/* @__PURE__ */ jsx("div", {
|
|
294
379
|
className: "mb-[-12px] w-full text-right",
|
|
295
|
-
children: /* @__PURE__ */
|
|
380
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
296
381
|
className: "mr-[-20px] cursor-pointer rounded-full p-1 hover:bg-gray-100",
|
|
297
382
|
onClick: () => {
|
|
298
|
-
|
|
383
|
+
setAccountModalOpen(false);
|
|
299
384
|
},
|
|
300
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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
|
-
|
|
312
|
-
src:
|
|
313
|
-
alt:
|
|
396
|
+
wallet && /* @__PURE__ */ jsx("img", {
|
|
397
|
+
src: wallet.icon,
|
|
398
|
+
alt: wallet.name,
|
|
314
399
|
className: "h-16 w-16"
|
|
315
400
|
}),
|
|
316
|
-
/* @__PURE__ */
|
|
317
|
-
/* @__PURE__ */
|
|
401
|
+
/* @__PURE__ */ jsx("p", { children: accountText }),
|
|
402
|
+
/* @__PURE__ */ jsxs("div", {
|
|
318
403
|
className: "mt-2 w-full space-x-10",
|
|
319
|
-
children: [/* @__PURE__ */
|
|
320
|
-
onClick:
|
|
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:
|
|
323
|
-
}), /* @__PURE__ */
|
|
407
|
+
children: copyLabel
|
|
408
|
+
}), /* @__PURE__ */ jsx("button", {
|
|
324
409
|
type: "button",
|
|
325
|
-
onClick:
|
|
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__ */
|
|
419
|
+
}) : /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("button", {
|
|
335
420
|
type: "button",
|
|
336
|
-
onClick:
|
|
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:
|
|
339
|
-
}),
|
|
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__ */
|
|
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__ */
|
|
428
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
344
429
|
className: "mb-2 flex items-center justify-between",
|
|
345
|
-
children: [/* @__PURE__ */
|
|
430
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
346
431
|
className: "text-2xl font-bold",
|
|
347
432
|
children: "Connect Wallet"
|
|
348
|
-
}), /* @__PURE__ */
|
|
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
|
-
|
|
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__ */
|
|
445
|
+
children: [/* @__PURE__ */ jsx("path", { d: "M18 6 6 18" }), /* @__PURE__ */ jsx("path", { d: "m6 6 12 12" })]
|
|
363
446
|
})
|
|
364
447
|
})]
|
|
365
|
-
}), /* @__PURE__ */
|
|
448
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
366
449
|
className: "relative w-full space-y-4",
|
|
367
|
-
children:
|
|
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__ */
|
|
392
|
-
src:
|
|
393
|
-
alt:
|
|
454
|
+
children: [/* @__PURE__ */ jsx("img", {
|
|
455
|
+
src: w.icon,
|
|
456
|
+
alt: w.name,
|
|
394
457
|
className: "h-8 w-8"
|
|
395
|
-
}), /* @__PURE__ */
|
|
458
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
396
459
|
className: "flex flex-col justify-between text-left",
|
|
397
|
-
children: [/* @__PURE__ */
|
|
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
|
-
|
|
464
|
+
w.name,
|
|
402
465
|
" wallet"
|
|
403
466
|
]
|
|
404
467
|
})]
|
|
405
468
|
})]
|
|
406
|
-
},
|
|
469
|
+
}, w.id))
|
|
407
470
|
})]
|
|
408
471
|
})
|
|
409
472
|
})] });
|
|
410
473
|
}
|
|
411
474
|
//#endregion
|
|
412
|
-
export {
|
|
475
|
+
export { MiniWalletButton, MiniWalletProvider, useMiniWallet };
|