@matchain/matchid-sdk-react 0.1.47 → 0.1.48-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/assets/icon/index.d.mts +4 -2
  2. package/dist/assets/icon/index.d.ts +4 -2
  3. package/dist/assets/icon/index.js +27 -0
  4. package/dist/assets/icon/index.js.map +1 -1
  5. package/dist/assets/icon/index.mjs +3 -1
  6. package/dist/chunk-A477SJHT.mjs +4549 -0
  7. package/dist/chunk-A477SJHT.mjs.map +1 -0
  8. package/dist/{chunk-DPXMCLYK.mjs → chunk-A5D3NKTK.mjs} +29 -3
  9. package/dist/chunk-A5D3NKTK.mjs.map +1 -0
  10. package/dist/{chunk-A3XSTHEE.mjs → chunk-AFZSANRV.mjs} +8 -4
  11. package/dist/chunk-AFZSANRV.mjs.map +1 -0
  12. package/dist/chunk-HBOS3RBL.mjs +19 -0
  13. package/dist/chunk-HBOS3RBL.mjs.map +1 -0
  14. package/dist/{chunk-TOUC33US.mjs → chunk-LNSJ3ZXG.mjs} +294 -4680
  15. package/dist/chunk-LNSJ3ZXG.mjs.map +1 -0
  16. package/dist/{chunk-SQIJR7RA.mjs → chunk-UA6XHZHX.mjs} +2 -14
  17. package/dist/chunk-UA6XHZHX.mjs.map +1 -0
  18. package/dist/components/index.d.mts +3 -3
  19. package/dist/components/index.d.ts +3 -3
  20. package/dist/components/index.js +450 -841
  21. package/dist/components/index.js.map +1 -1
  22. package/dist/components/index.mjs +12 -12
  23. package/dist/hooks/api/index.d.mts +2 -2
  24. package/dist/hooks/api/index.d.ts +2 -2
  25. package/dist/hooks/api/index.js +410 -256
  26. package/dist/hooks/api/index.js.map +1 -1
  27. package/dist/hooks/api/index.mjs +11 -5
  28. package/dist/hooks/index.d.mts +2 -2
  29. package/dist/hooks/index.d.ts +2 -2
  30. package/dist/hooks/index.js +659 -495
  31. package/dist/hooks/index.js.map +1 -1
  32. package/dist/hooks/index.mjs +14 -4
  33. package/dist/index-BIgM4fy0.d.mts +122 -0
  34. package/dist/{index-DR2JTaoi.d.mts → index-BVatQlwF.d.mts} +10 -2
  35. package/dist/index-Bb7IkjUW.d.mts +26 -0
  36. package/dist/index-BwD1ij0H.d.ts +122 -0
  37. package/dist/index-C2-M-aBb.d.ts +57 -0
  38. package/dist/{index-DVlCrOjr.d.ts → index-CGs_yTFg.d.ts} +5 -33
  39. package/dist/index-CKiK4KHj.d.ts +26 -0
  40. package/dist/{index-D2pNP7Bz.d.mts → index-DO5x10pN.d.mts} +46 -26
  41. package/dist/index-DamklTOJ.d.mts +57 -0
  42. package/dist/{index-B0VpxAI2.d.mts → index-M7ZB3yR5.d.mts} +5 -33
  43. package/dist/{index-CFWR1boZ.d.ts → index-Pssz41An.d.ts} +46 -26
  44. package/dist/{index-CTSg5TRS.d.ts → index-RfA22r-Z.d.ts} +10 -2
  45. package/dist/index.css +241 -3
  46. package/dist/index.d.mts +8 -6
  47. package/dist/index.d.ts +8 -6
  48. package/dist/index.js +2808 -2672
  49. package/dist/index.js.map +1 -1
  50. package/dist/index.mjs +10 -5
  51. package/dist/types/index.d.mts +1 -1
  52. package/dist/types/index.d.ts +1 -1
  53. package/dist/types/index.mjs +2 -1
  54. package/dist/{types-CRumDe2M.d.mts → types-DQq17lf4.d.mts} +116 -1
  55. package/dist/{types-CRumDe2M.d.ts → types-DQq17lf4.d.ts} +116 -1
  56. package/dist/ui/index.d.mts +6 -0
  57. package/dist/ui/index.d.ts +6 -0
  58. package/dist/ui/index.js +724 -0
  59. package/dist/ui/index.js.map +1 -0
  60. package/dist/ui/index.mjs +33 -0
  61. package/dist/ui/index.mjs.map +1 -0
  62. package/example/src/App.tsx +7 -0
  63. package/example/src/config/chains/matchMain.ts +2 -3
  64. package/example/src/pages/UI/components/AlphaAvatar.tsx +11 -0
  65. package/example/src/pages/UI/components/Radio.tsx +15 -0
  66. package/example/src/pages/UI/components/Switch.tsx +13 -0
  67. package/example/src/pages/UI/index.tsx +11 -0
  68. package/example/src/pages/User/components/BindListModal.tsx +1 -1
  69. package/example/src/pages/User/components/PohListModal.tsx +1 -1
  70. package/example/src/pages/User/index.tsx +1 -13
  71. package/example/src/pages/Wallet/components/AssetListModal.tsx +15 -0
  72. package/example/src/pages/Wallet/components/ChainListModal.tsx +11 -0
  73. package/example/src/pages/Wallet/components/ImportTokenListModal.tsx +15 -0
  74. package/example/src/pages/Wallet/components/MatchWallet.tsx +20 -0
  75. package/example/src/pages/Wallet/components/WalletChainListModal.tsx +11 -0
  76. package/example/src/pages/{Wallet.tsx → Wallet/index.tsx} +33 -2
  77. package/package.json +6 -1
  78. package/dist/chunk-A3XSTHEE.mjs.map +0 -1
  79. package/dist/chunk-DPXMCLYK.mjs.map +0 -1
  80. package/dist/chunk-SQIJR7RA.mjs.map +0 -1
  81. package/dist/chunk-TOUC33US.mjs.map +0 -1
  82. package/dist/index-CWYElOA2.d.mts +0 -65
  83. package/dist/index-CoTirILQ.d.ts +0 -65
  84. /package/example/src/{pages/User/components → components}/QueryDisplay.tsx +0 -0
@@ -0,0 +1,4549 @@
1
+ import {
2
+ Button,
3
+ Field,
4
+ HashPanel_default,
5
+ Input,
6
+ Modal,
7
+ ModalDrawer,
8
+ ModalWithHeader,
9
+ Overlay,
10
+ Popover,
11
+ Radio,
12
+ matchlog_default,
13
+ useDownMd,
14
+ useLayout_exports
15
+ } from "./chunk-LNSJ3ZXG.mjs";
16
+ import {
17
+ ArrowDownIcon,
18
+ ArrowRightIcon,
19
+ BTCDarkIcon,
20
+ BTCLightIcon,
21
+ BitgetIcon,
22
+ CheckIcon,
23
+ CheckRoundIcon,
24
+ CloseRoundIcon,
25
+ CopyIcon,
26
+ DiscordIcon,
27
+ EVMDarkIcon,
28
+ EVMLightIcon,
29
+ EmailIcon,
30
+ EmailLineIcon,
31
+ ErrorRoundIcon,
32
+ FacebookIcon,
33
+ GithubIcon,
34
+ GoogleIcon,
35
+ LeatherIcon,
36
+ LinkedinIcon,
37
+ LoginIcon_default,
38
+ OKXIcon,
39
+ SOLDarkIcon,
40
+ SOLLightIcon,
41
+ TRXDarkIcon,
42
+ TRXLightIcon,
43
+ TelegramIcon,
44
+ TonLightIcon,
45
+ TonLightIcon2,
46
+ TronLinkIcon,
47
+ UnLoginIcon_default,
48
+ UnisatIcon,
49
+ WalletIcon,
50
+ XIcon,
51
+ XverseIcon,
52
+ YoutubeIcon
53
+ } from "./chunk-A5D3NKTK.mjs";
54
+ import {
55
+ __export
56
+ } from "./chunk-J5LGTIGS.mjs";
57
+
58
+ // src/components/index.tsx
59
+ var components_exports = {};
60
+ __export(components_exports, {
61
+ BTCModal: () => BTCModal,
62
+ Button: () => Button,
63
+ EmailModal: () => EmailModal,
64
+ Field: () => Field,
65
+ Input: () => Input,
66
+ LoginBox: () => LoginBox,
67
+ LoginButton: () => LoginButton,
68
+ LoginModal: () => LoginModal,
69
+ LoginPanel: () => LoginPanel,
70
+ Modal: () => Modal,
71
+ ModalWithHeader: () => ModalWithHeader,
72
+ Overlay: () => Overlay,
73
+ Popover: () => Popover,
74
+ SOLModal: () => SOLModal,
75
+ TONModal: () => TONModal,
76
+ TRONModal: () => TRONModal,
77
+ UsernameModal: () => UsernameModal,
78
+ WalletModal: () => WalletModal
79
+ });
80
+
81
+ // src/components/EmailModal/index.tsx
82
+ import { useEffect as useEffect11, useState as useState10 } from "react";
83
+
84
+ // src/components/EmailModal/StepEmail.tsx
85
+ import { useEffect, useMemo, useState } from "react";
86
+
87
+ // src/utils/index.ts
88
+ var getVersion = () => {
89
+ return "0.0.2";
90
+ };
91
+ function encodeBase64(input) {
92
+ return btoa(unescape(encodeURIComponent(input)));
93
+ }
94
+ var isValidEmail = (email) => {
95
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
96
+ };
97
+ var isValidUsername = (username) => {
98
+ return /^[a-zA-Z0-9_-]+$/.test(username);
99
+ };
100
+ function truncateAddress(address) {
101
+ if (address.length <= 6) {
102
+ return address;
103
+ }
104
+ const start = address.slice(0, 4);
105
+ const end = address.slice(-2);
106
+ return `${start}...${end}`;
107
+ }
108
+ function getAppClientId() {
109
+ return "react-sdk-" + getVersion();
110
+ }
111
+
112
+ // src/components/EmailModal/StepEmail.tsx
113
+ import { FormattedMessage, useIntl } from "react-intl";
114
+ import { jsx, jsxs } from "react/jsx-runtime";
115
+ function StepEmail(props) {
116
+ const intl = useIntl();
117
+ const [emailVal, setEmailVal] = useState("");
118
+ useEffect(() => {
119
+ if (props.email) {
120
+ setEmailVal(props.email);
121
+ }
122
+ }, []);
123
+ const canContinue = useMemo(() => {
124
+ return isValidEmail(emailVal);
125
+ }, [emailVal]);
126
+ const onContinue = async () => {
127
+ props.onContinue(emailVal);
128
+ };
129
+ return /* @__PURE__ */ jsxs("div", { className: "matchid-email-email-box", children: [
130
+ /* @__PURE__ */ jsx(Field, { label: intl.formatMessage({
131
+ id: "emailAddress"
132
+ }), children: /* @__PURE__ */ jsx(
133
+ Input,
134
+ {
135
+ placeholder: intl.formatMessage({
136
+ id: "emailAddressPlaceholder"
137
+ }),
138
+ onChange: (e) => setEmailVal(e.target.value),
139
+ value: emailVal
140
+ }
141
+ ) }),
142
+ /* @__PURE__ */ jsx(Button, { disabled: !canContinue, style: {
143
+ marginTop: "64px"
144
+ }, onClick: onContinue, size: "lg", block: true, highlight: true, children: /* @__PURE__ */ jsx(FormattedMessage, { id: "continue" }) })
145
+ ] });
146
+ }
147
+
148
+ // src/store/useLocalStore.ts
149
+ import { create } from "zustand";
150
+ import { devtools, persist } from "zustand/middleware";
151
+
152
+ // src/api/request.ts
153
+ import axios from "axios";
154
+
155
+ // src/config/env/index.ts
156
+ var env_default = {
157
+ endpoints: {
158
+ back: "https://api.matchid.ai/",
159
+ auth: "https://auth.matchid.ai/"
160
+ }
161
+ };
162
+
163
+ // src/store/index.ts
164
+ var getEndpoints = () => {
165
+ try {
166
+ const store = localStore.getState();
167
+ const env = store?.endpoints;
168
+ if (env) {
169
+ return env;
170
+ } else {
171
+ return env_default.endpoints;
172
+ }
173
+ } catch (e) {
174
+ return env_default.endpoints;
175
+ }
176
+ };
177
+ var getAppid = () => {
178
+ try {
179
+ const store = localStore.getState();
180
+ const appid = store?.appid;
181
+ if (appid) {
182
+ return appid;
183
+ } else {
184
+ return "";
185
+ }
186
+ } catch (e) {
187
+ return "";
188
+ }
189
+ };
190
+ var getLocale = () => {
191
+ try {
192
+ const store = localStore.getState();
193
+ const locale = store?.locale;
194
+ if (locale) {
195
+ return locale;
196
+ } else {
197
+ return "en";
198
+ }
199
+ } catch (e) {
200
+ return "en";
201
+ }
202
+ };
203
+ var getToken = () => {
204
+ try {
205
+ const store = localStore.getState();
206
+ const token = store?.token;
207
+ if (token) {
208
+ return token;
209
+ } else {
210
+ return "";
211
+ }
212
+ } catch (e) {
213
+ return "";
214
+ }
215
+ };
216
+
217
+ // src/api/request.ts
218
+ import axiosRetry from "axios-retry";
219
+ var SUCCESS_CODE = 0;
220
+ var isSuccess = (res) => {
221
+ return res.code === SUCCESS_CODE;
222
+ };
223
+ var instance = axios.create({
224
+ timeout: 6e4,
225
+ validateStatus(status) {
226
+ return status >= 200 && status <= 500;
227
+ }
228
+ });
229
+ var request = async (config) => {
230
+ try {
231
+ const endpoints = getEndpoints();
232
+ const token = getToken();
233
+ instance.defaults.baseURL = `${endpoints.back}`;
234
+ instance.defaults.headers.common["Appid"] = getAppid();
235
+ if (token) {
236
+ instance.defaults.headers.common["Authorization"] = token;
237
+ }
238
+ instance.defaults.headers.common["Accept-Language"] = getLocale();
239
+ const { data } = await instance.request(config);
240
+ matchlog_default.log("api", data);
241
+ if (data.code == 401001) {
242
+ localStore.getState().logout();
243
+ throw new Error("Your session has expired, please log in again");
244
+ }
245
+ return data;
246
+ } catch (err) {
247
+ console.error("qwe-err", err);
248
+ const message = "Request Error";
249
+ console.error(message);
250
+ return {
251
+ code: -1,
252
+ data: null,
253
+ message,
254
+ success: false,
255
+ fail: true,
256
+ result: null
257
+ };
258
+ }
259
+ };
260
+ var retryInstance = axios.create({
261
+ timeout: 6e4,
262
+ validateStatus(status) {
263
+ return status >= 200 && status <= 500;
264
+ }
265
+ });
266
+ axiosRetry(retryInstance, {
267
+ retries: 3,
268
+ retryDelay: (retryCount) => retryCount * 1e3,
269
+ shouldResetTimeout: true,
270
+ retryCondition: (error) => {
271
+ return error.response.status >= 500 && error.response.status < 600 || error.code === "ECONNABORTED";
272
+ }
273
+ });
274
+ var retryRequest = async (config) => {
275
+ try {
276
+ const endpoints = getEndpoints();
277
+ const token = getToken();
278
+ retryInstance.defaults.baseURL = `${endpoints.back}`;
279
+ retryInstance.defaults.headers.common["Appid"] = getAppid();
280
+ if (token) {
281
+ retryInstance.defaults.headers.common["Authorization"] = token;
282
+ }
283
+ retryInstance.defaults.headers.common["Accept-Language"] = getLocale();
284
+ const { data } = await retryInstance.request(config);
285
+ matchlog_default.log("api", data);
286
+ if (data.code == 401001) {
287
+ localStore.getState().logout();
288
+ throw new Error("Your session has expired, please log in again");
289
+ }
290
+ return data;
291
+ } catch (err) {
292
+ console.error("qwe-err", err);
293
+ const message = "Request Error";
294
+ console.error(message);
295
+ return {
296
+ code: -1,
297
+ data: null,
298
+ message,
299
+ success: false,
300
+ fail: true,
301
+ result: null
302
+ };
303
+ }
304
+ };
305
+ var request_default = request;
306
+
307
+ // src/api/index.ts
308
+ var getEmailCodeApi = (email) => {
309
+ return request_default({
310
+ url: `/api/v1/email/code`,
311
+ method: "POST",
312
+ data: { email }
313
+ });
314
+ };
315
+ var verifyEmailCodeApi = ({ email, verification_key, verification_code }) => {
316
+ return request_default({
317
+ url: `/api/v1/user/email/login`,
318
+ method: "POST",
319
+ data: { email, verification_key, verification_code }
320
+ });
321
+ };
322
+ var getOverviewInfoApi = () => {
323
+ return retryRequest({
324
+ url: `/api/v1/user/overview`,
325
+ method: "GET"
326
+ });
327
+ };
328
+ var toLogoutApi = () => {
329
+ return retryRequest({
330
+ url: `/api/v1/user/logout`,
331
+ method: "POST"
332
+ });
333
+ };
334
+ var setUserNameApi = (data) => {
335
+ return request_default({
336
+ url: `/api/v1/user/name`,
337
+ method: "POSt",
338
+ data
339
+ });
340
+ };
341
+ var getBindListApi = () => {
342
+ return retryRequest({
343
+ url: `/api/v1/bind/list`,
344
+ method: "GET"
345
+ });
346
+ };
347
+ var getPohListApi = () => {
348
+ return retryRequest({
349
+ url: `/api/v1/poh/list`,
350
+ method: "GET"
351
+ });
352
+ };
353
+ var getBindInfoApi = () => {
354
+ return retryRequest({
355
+ url: `/api/v1/bind`,
356
+ method: "GET"
357
+ });
358
+ };
359
+ var bindCexApi = (data) => {
360
+ return request_default({
361
+ url: `/api/v1/cex/subscribe`,
362
+ method: "POST",
363
+ data
364
+ });
365
+ };
366
+ var unBindApi = ({ type }) => {
367
+ return request_default({
368
+ url: `/api/v1/unbind`,
369
+ method: "POST",
370
+ data: { type }
371
+ });
372
+ };
373
+ var unBindWalletApi = ({ address }) => {
374
+ return request_default({
375
+ url: `/api/v1/wallet/unbind`,
376
+ method: "POST",
377
+ data: { address }
378
+ });
379
+ };
380
+ var verifyPohApi = ({
381
+ taskId,
382
+ schemaId,
383
+ publicFields,
384
+ allocatorAddress,
385
+ publicFieldsHash,
386
+ allocatorSignature,
387
+ uHash,
388
+ validatorAddress,
389
+ validatorSignature
390
+ }) => {
391
+ return request_default({
392
+ url: `/api/v1/poh/zkpass`,
393
+ method: "POST",
394
+ data: {
395
+ taskId,
396
+ schemaId,
397
+ publicFields,
398
+ allocatorAddress,
399
+ publicFieldsHash,
400
+ allocatorSignature,
401
+ uHash,
402
+ validatorAddress,
403
+ validatorSignature
404
+ }
405
+ });
406
+ };
407
+ var chooseIdentityApi = ({ identity }) => {
408
+ return request_default({
409
+ url: `/api/v1/user/choose/identity`,
410
+ method: "POST",
411
+ data: { identity }
412
+ });
413
+ };
414
+ var mintPassportNftApi = () => {
415
+ return request_default({
416
+ url: `/api/v1/mint/passport/nft`,
417
+ method: "POST"
418
+ });
419
+ };
420
+ var getAuthInfoApi = () => {
421
+ return retryRequest({
422
+ url: `/api/v1/user/auth`,
423
+ method: "GET"
424
+ });
425
+ };
426
+ var getWalletNonceApi = (data) => {
427
+ return retryRequest({
428
+ url: `/api/v1/login/wallet/init`,
429
+ method: "POST",
430
+ data
431
+ });
432
+ };
433
+ var loginByWalletApi = ({
434
+ type,
435
+ address,
436
+ signature,
437
+ message,
438
+ connector_type,
439
+ wallet_client_type
440
+ }) => {
441
+ return request_default({
442
+ url: `/api/v1/login/wallet`,
443
+ method: "POST",
444
+ data: { type, address, signature, message, connector_type, wallet_client_type }
445
+ });
446
+ };
447
+ var getWalletInitApi = (data) => {
448
+ return retryRequest({
449
+ url: `/api/v1/wallet/init`,
450
+ method: "POST",
451
+ data
452
+ });
453
+ };
454
+ var toBindWalletApi = ({
455
+ type,
456
+ address,
457
+ signature,
458
+ message,
459
+ connector_type,
460
+ wallet_client_type
461
+ }) => {
462
+ return request_default({
463
+ url: `/api/v1/wallet/bind`,
464
+ method: "POST",
465
+ data: { type, address, signature, message, connector_type, wallet_client_type }
466
+ });
467
+ };
468
+ var getAppConfigApi = () => {
469
+ return retryRequest({
470
+ url: `/api/v1/app/config`,
471
+ method: "GET"
472
+ });
473
+ };
474
+ var getUserChainListApi = () => {
475
+ return request_default({
476
+ url: `/api/v1/user/chain/list`,
477
+ method: "GET"
478
+ });
479
+ };
480
+ var userImportTokenApi = (data) => {
481
+ return request_default({
482
+ url: `/api/v1/user/import/token`,
483
+ method: "POST",
484
+ data
485
+ });
486
+ };
487
+ var getUserImportTokenListApi = (data) => {
488
+ return request_default({
489
+ url: `/api/v1/user/import/token/list`,
490
+ method: "POST",
491
+ data
492
+ });
493
+ };
494
+ var getUserWalletAssetApi = (data) => {
495
+ return request_default({
496
+ url: `/api/v1/user/wallet/asset`,
497
+ method: "POST",
498
+ data
499
+ });
500
+ };
501
+ var getUserWalletTransactionsApi = (data) => {
502
+ return request_default({
503
+ url: `/api/v1/user/wallet/transactions`,
504
+ method: "POST",
505
+ data
506
+ });
507
+ };
508
+ var getWalletAssetListApi = (data) => {
509
+ return request_default({
510
+ url: `/api/v1/wallet/asset`,
511
+ method: "POST",
512
+ data
513
+ });
514
+ };
515
+ var getWalletListApi = (data) => {
516
+ return request_default({
517
+ url: `/api/v1/wallet/list`,
518
+ method: "POST",
519
+ data
520
+ });
521
+ };
522
+ var getWalletChainListApi = () => {
523
+ return request_default({
524
+ url: `/api/v1/wallet/chain`,
525
+ method: "POST"
526
+ });
527
+ };
528
+
529
+ // src/store/useLocalStore.ts
530
+ var persistedState = persist(
531
+ (set) => ({
532
+ appid: "",
533
+ token: "",
534
+ did: "",
535
+ mid: "",
536
+ overview: null,
537
+ theme: "light",
538
+ setOverview: (overview) => set({
539
+ overview,
540
+ address: overview.address,
541
+ did: overview.did,
542
+ mid: overview.mid
543
+ }),
544
+ refreshOverview: async () => {
545
+ const res = await getOverviewInfoApi();
546
+ if (res.data) {
547
+ set({ overview: res.data });
548
+ set({ address: res.data.address });
549
+ set({ did: res.data.did });
550
+ set({ mid: res.data.mid });
551
+ }
552
+ },
553
+ endpoints: {
554
+ back: "https://api.matchid.ai/",
555
+ auth: "https://auth.matchid.ai/"
556
+ },
557
+ setDid: (did) => set({ did }),
558
+ setToken: (token) => set({ token }),
559
+ setAppid: (appid) => set({ appid }),
560
+ setMid: (mid) => set({ mid }),
561
+ logout: () => set({ token: "", did: "", mid: "", address: "", overview: null }),
562
+ setTheme: (theme) => set({ theme }),
563
+ setEndpoints: (endpoints) => set({ endpoints }),
564
+ address: "",
565
+ setAddress: (address) => set({ address }),
566
+ locale: "en",
567
+ setLocale: (locale) => set({ locale }),
568
+ wallet: {
569
+ type: "UserPasscode"
570
+ },
571
+ setWallet: (wallet) => set({ wallet }),
572
+ chainId: 698,
573
+ setChainId: (chainId) => set({ chainId })
574
+ }),
575
+ { name: "match-local" }
576
+ );
577
+ var useLocalStore = create(devtools(persistedState));
578
+ var localStore = useLocalStore;
579
+ var useLocalStore_default = useLocalStore;
580
+
581
+ // src/hooks/useUserInfo.tsx
582
+ import { useMemo as useMemo5 } from "react";
583
+
584
+ // src/MatchContext.tsx
585
+ import { createContext as createContext3, useContext as useContext3 } from "react";
586
+
587
+ // src/hooks/index.tsx
588
+ var hooks_exports = {};
589
+ __export(hooks_exports, {
590
+ useCopyClipboard: () => useCopyClipboard,
591
+ useLayout: () => useLayout_exports,
592
+ useMatchChain: () => useMatchChain,
593
+ useMatchEvents: () => useMatchEvents,
594
+ useMatchWallet: () => useMatchWallet,
595
+ useModal: () => useModal,
596
+ useToast: () => useToast,
597
+ useUserInfo: () => useUserInfo,
598
+ useWallet: () => useWallet
599
+ });
600
+
601
+ // src/hooks/useMatchEvents.ts
602
+ import { useEffect as useEffect2 } from "react";
603
+
604
+ // src/hooks/eventManager.ts
605
+ var EventManager = class {
606
+ constructor() {
607
+ this.listeners = {};
608
+ }
609
+ on(event, callback) {
610
+ if (!this.listeners[event]) {
611
+ this.listeners[event] = /* @__PURE__ */ new Set();
612
+ }
613
+ this.listeners[event].add(callback);
614
+ }
615
+ off(event, callback) {
616
+ if (this.listeners[event]) {
617
+ this.listeners[event].delete(callback);
618
+ if (this.listeners[event].size === 0) {
619
+ delete this.listeners[event];
620
+ }
621
+ }
622
+ }
623
+ emit(event, ...args) {
624
+ if (this.listeners[event]) {
625
+ this.listeners[event].forEach((callback) => callback(...args));
626
+ }
627
+ }
628
+ };
629
+ var eventManager = new EventManager();
630
+ var eventManager_default = eventManager;
631
+
632
+ // src/hooks/useMatchEvents.ts
633
+ function useMatchEvents(handlers) {
634
+ useEffect2(() => {
635
+ Object.entries(handlers).forEach(([event, handler]) => {
636
+ if (handler) {
637
+ eventManager_default.on(event, handler);
638
+ }
639
+ });
640
+ return () => {
641
+ Object.entries(handlers).forEach(([event, handler]) => {
642
+ if (handler) {
643
+ eventManager_default.off(event, handler);
644
+ }
645
+ });
646
+ };
647
+ }, [handlers]);
648
+ }
649
+
650
+ // src/hooks/useWallet.tsx
651
+ import {
652
+ encodeFunctionData
653
+ } from "viem";
654
+
655
+ // src/store/useStore.ts
656
+ import { create as create2 } from "zustand";
657
+ var useStore = create2((set) => ({
658
+ walletReady: false,
659
+ setWalletReady: (inited) => set({ walletReady: inited })
660
+ }));
661
+ var useStore_default = useStore;
662
+
663
+ // src/hooks/useWallet.tsx
664
+ import { toAccount } from "viem/accounts";
665
+ import { createWalletClient } from "viem";
666
+ import { useEffect as useEffect3, useMemo as useMemo2 } from "react";
667
+ import { encodeDeployData } from "viem";
668
+
669
+ // src/store/useModalStore.ts
670
+ import { create as create3 } from "zustand";
671
+
672
+ // src/hooks/useConfig.tsx
673
+ import { jsx as jsx2 } from "react/jsx-runtime";
674
+ var DEFAULT_WALLET_METHODS = ["evm", "sol", "btc", "tron", "ton"];
675
+ var WALLET_METHODS = ["evm", "sol", "btc", "tron", "ton"];
676
+ function useWalletConfig() {
677
+ const isDownMd = useDownMd();
678
+ const walletMap = {
679
+ evm: {
680
+ icon: /* @__PURE__ */ jsx2(EVMDarkIcon, { size: isDownMd ? 36 : 40 }),
681
+ activeIcon: /* @__PURE__ */ jsx2(EVMLightIcon, { size: isDownMd ? 36 : 40 }),
682
+ name: "EVM",
683
+ method: "evm"
684
+ },
685
+ sol: {
686
+ icon: /* @__PURE__ */ jsx2(SOLDarkIcon, { size: isDownMd ? 36 : 40 }),
687
+ activeIcon: /* @__PURE__ */ jsx2(SOLLightIcon, { size: isDownMd ? 36 : 40 }),
688
+ name: "SOL",
689
+ method: "sol"
690
+ },
691
+ btc: {
692
+ icon: /* @__PURE__ */ jsx2(BTCDarkIcon, { size: isDownMd ? 36 : 40 }),
693
+ activeIcon: /* @__PURE__ */ jsx2(BTCLightIcon, { size: isDownMd ? 36 : 40 }),
694
+ name: "BTC",
695
+ method: "btc"
696
+ },
697
+ tron: {
698
+ icon: /* @__PURE__ */ jsx2(TRXDarkIcon, { size: isDownMd ? 36 : 40 }),
699
+ activeIcon: /* @__PURE__ */ jsx2(TRXLightIcon, { size: isDownMd ? 36 : 40 }),
700
+ name: "TRON",
701
+ method: "tron"
702
+ },
703
+ ton: {
704
+ icon: /* @__PURE__ */ jsx2(TonLightIcon, { size: isDownMd ? 36 : 40 }),
705
+ activeIcon: /* @__PURE__ */ jsx2(TonLightIcon2, { size: isDownMd ? 36 : 40 }),
706
+ name: "TON",
707
+ method: "ton"
708
+ }
709
+ };
710
+ return {
711
+ walletMap
712
+ };
713
+ }
714
+
715
+ // src/store/useModalStore.ts
716
+ var useSOLModalStore = create3((set) => ({
717
+ isOpen: false,
718
+ type: "",
719
+ open: (type) => set({ isOpen: true, type }),
720
+ close: () => set({ isOpen: false })
721
+ }));
722
+ var useTRONModalStore = create3((set) => ({
723
+ isOpen: false,
724
+ type: "",
725
+ open: (type) => set({ isOpen: true, type }),
726
+ close: () => set({ isOpen: false })
727
+ }));
728
+ var useTONModalStore = create3((set) => ({
729
+ isOpen: false,
730
+ type: "",
731
+ open: (type) => set({ isOpen: true, type }),
732
+ close: () => set({ isOpen: false })
733
+ }));
734
+ var useBTCModalStore = create3((set) => ({
735
+ isOpen: false,
736
+ type: "",
737
+ open: (type) => set({ isOpen: true, type }),
738
+ close: () => set({ isOpen: false })
739
+ }));
740
+ var useCEXBindModalStore = create3((set) => ({
741
+ type: "",
742
+ isOpen: false,
743
+ open: (type) => set({ isOpen: true, type }),
744
+ close: () => set({ isOpen: false })
745
+ }));
746
+ var useHashPanelStore = create3((set) => ({
747
+ isOpen: false,
748
+ hash: null,
749
+ chain: null,
750
+ open: (params) => set({
751
+ isOpen: true,
752
+ hash: params?.hash || null,
753
+ chain: params?.chain || null
754
+ }),
755
+ close: () => set({ isOpen: false })
756
+ }));
757
+ var useWalletModalStore = create3((set) => ({
758
+ isOpen: false,
759
+ type: "",
760
+ methods: [],
761
+ open: (type, methods = DEFAULT_WALLET_METHODS) => set({ isOpen: true, type, methods }),
762
+ close: () => set({ isOpen: false })
763
+ }));
764
+
765
+ // src/hooks/useWallet.tsx
766
+ var AppClientId = "react-sdk-" + getVersion();
767
+ function useWallet() {
768
+ const { address, wallet: walletConfig } = useLocalStore_default();
769
+ const { walletReady } = useStore_default();
770
+ const { open: openHashPanel } = useHashPanelStore();
771
+ const isRecovered = async () => {
772
+ const res = await window.matchProvider.waitUntilWalletMessage({
773
+ method: "isRecovered"
774
+ });
775
+ return res.isRecovered;
776
+ };
777
+ const signMessage2 = async ({
778
+ message,
779
+ chainType = "ethereum" /* Ethereum */
780
+ }) => {
781
+ try {
782
+ const res = await window.matchProvider.waitUntilWalletMessage({
783
+ method: "signMessage",
784
+ data: {
785
+ message,
786
+ chainType
787
+ }
788
+ });
789
+ return res.message;
790
+ } catch (error) {
791
+ console.error("sdk.wallet.message", error);
792
+ throw error;
793
+ }
794
+ };
795
+ const signTransaction = async ({
796
+ transaction,
797
+ chainType = "ethereum" /* Ethereum */,
798
+ chain
799
+ }) => {
800
+ try {
801
+ const res = await window.matchProvider.waitUntilWalletMessage({
802
+ method: "signTransaction",
803
+ data: {
804
+ transaction,
805
+ chainType,
806
+ chain
807
+ }
808
+ });
809
+ return res.message;
810
+ } catch (error) {
811
+ console.error("sdk.wallet.transaction", error);
812
+ throw error;
813
+ }
814
+ };
815
+ const evmAccount = useMemo2(() => {
816
+ return address ? toAccount({
817
+ address,
818
+ async signMessage({ message }) {
819
+ return await signMessage2({
820
+ message,
821
+ chainType: "ethereum" /* Ethereum */
822
+ });
823
+ },
824
+ async signTransaction(transaction, options) {
825
+ const { account, chain, ...restTransaction } = transaction;
826
+ console.log("qwe-sign-transaction", restTransaction, options);
827
+ return await signTransaction({
828
+ transaction: {
829
+ ...restTransaction
830
+ },
831
+ chainType: "ethereum" /* Ethereum */,
832
+ chain: {
833
+ id: chain?.id || restTransaction.chainId,
834
+ name: chain?.name,
835
+ nativeCurrency: {
836
+ name: chain?.nativeCurrency?.name || "ETH",
837
+ symbol: chain?.nativeCurrency?.symbol || "ETH",
838
+ decimals: chain?.nativeCurrency?.decimals || 18
839
+ },
840
+ rpcUrls: chain?.rpcUrls
841
+ }
842
+ });
843
+ },
844
+ async signTypedData(typedData) {
845
+ return "0x";
846
+ }
847
+ }) : void 0;
848
+ }, [address]);
849
+ useEffect3(() => {
850
+ matchlog_default.log("qwe-evmAccount", evmAccount);
851
+ }, [evmAccount]);
852
+ const realCreateWalletClient = (parameters) => {
853
+ if (!evmAccount) {
854
+ return;
855
+ }
856
+ const obj = createWalletClient({
857
+ ...parameters,
858
+ account: evmAccount
859
+ });
860
+ const sendTransaction = async (transaction) => {
861
+ const { chain, ...restTransaction } = transaction;
862
+ const chainId = chain ? chain.id : await obj.getChainId();
863
+ const _chain = chain || obj.chain;
864
+ const transactionId = Date.now().toString() + Math.random().toString().slice(6);
865
+ window.matchProvider.transactionMessageIntervalMap[transactionId] = {
866
+ transaction,
867
+ func: async () => {
868
+ try {
869
+ const {
870
+ chain: chain2,
871
+ account,
872
+ ...prepareTransactionRequest
873
+ // @ts-ignore
874
+ } = await obj.prepareTransactionRequest(window.matchProvider.transactionMessageIntervalMap[transactionId].transaction);
875
+ window.matchProvider.sendWalletMessage({
876
+ method: "prepareTransactionRequest",
877
+ data: {
878
+ prepareTransactionRequest,
879
+ transactionId
880
+ }
881
+ });
882
+ } catch (error) {
883
+ console.error(error);
884
+ }
885
+ },
886
+ interval: setInterval(() => {
887
+ window.matchProvider.transactionMessageIntervalMap[transactionId].func();
888
+ }, 1e4)
889
+ };
890
+ try {
891
+ const {
892
+ chain: chain2,
893
+ account,
894
+ ...prepareTransactionRequest
895
+ // @ts-ignore
896
+ } = await obj.prepareTransactionRequest(transaction);
897
+ const { serializedTransaction } = await window.matchProvider.waitUntilWalletMessage({
898
+ method: "sendTransaction",
899
+ data: {
900
+ transactionId,
901
+ transaction: {
902
+ ...restTransaction
903
+ },
904
+ chainType: "ethereum" /* Ethereum */,
905
+ chain: {
906
+ id: chainId,
907
+ name: _chain?.name,
908
+ nativeCurrency: _chain?.nativeCurrency,
909
+ rpcUrls: _chain?.rpcUrls
910
+ },
911
+ prepareTransactionRequest
912
+ }
913
+ });
914
+ openHashPanel();
915
+ const txHash = await obj.sendRawTransaction({
916
+ serializedTransaction
917
+ });
918
+ openHashPanel({
919
+ hash: txHash,
920
+ chain: _chain
921
+ });
922
+ clearInterval(window.matchProvider.transactionMessageIntervalMap[transactionId].interval);
923
+ delete window.matchProvider.transactionMessageIntervalMap[transactionId];
924
+ return txHash;
925
+ } catch (error) {
926
+ console.error("qwe-sign-error", error);
927
+ clearInterval(window.matchProvider.transactionMessageIntervalMap[transactionId].interval);
928
+ delete window.matchProvider.transactionMessageIntervalMap[transactionId];
929
+ throw error;
930
+ }
931
+ };
932
+ const deployContract = async (parameters2) => {
933
+ const { abi, args, bytecode, ...request3 } = parameters2;
934
+ const calldata = encodeDeployData({ abi, args, bytecode });
935
+ return await sendTransaction({
936
+ ...request3,
937
+ data: calldata
938
+ });
939
+ };
940
+ const writeContract = async (parameters2) => {
941
+ const { abi, address: address2, args, dataSuffix, functionName, ...request3 } = parameters2;
942
+ const data = encodeFunctionData({
943
+ abi,
944
+ args,
945
+ functionName
946
+ });
947
+ return await sendTransaction({
948
+ data: `${data}${dataSuffix ? dataSuffix.replace("0x", "") : ""}`,
949
+ to: address2,
950
+ ...request3
951
+ });
952
+ };
953
+ return {
954
+ ...obj,
955
+ sendTransaction,
956
+ deployContract,
957
+ writeContract
958
+ };
959
+ };
960
+ return {
961
+ walletReady,
962
+ evmAccount,
963
+ address,
964
+ signMessage: signMessage2,
965
+ signTransaction,
966
+ isRecovered,
967
+ createWalletClient: realCreateWalletClient
968
+ };
969
+ }
970
+
971
+ // src/hooks/useCopyClipboard.ts
972
+ import copy from "copy-to-clipboard";
973
+ import { useCallback, useEffect as useEffect4, useState as useState3 } from "react";
974
+ function useCopyClipboard(timeout = 500) {
975
+ const [isCopied, setIsCopied] = useState3(false);
976
+ const staticCopy = useCallback((text) => {
977
+ const didCopy = copy(text);
978
+ setIsCopied(didCopy);
979
+ }, []);
980
+ useEffect4(() => {
981
+ if (isCopied) {
982
+ const hide = setTimeout(() => {
983
+ setIsCopied(false);
984
+ }, timeout);
985
+ return () => {
986
+ clearTimeout(hide);
987
+ };
988
+ }
989
+ return void 0;
990
+ }, [isCopied, setIsCopied, timeout]);
991
+ return [isCopied, staticCopy];
992
+ }
993
+
994
+ // src/context/ModalContext.tsx
995
+ import { useState as useState4, useCallback as useCallback2, createContext, useContext } from "react";
996
+ import { createPortal } from "react-dom";
997
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
998
+ var ModalContext = createContext(null);
999
+ function ModalProvider({ children }) {
1000
+ const [showModalState, setShowModalState] = useState4({
1001
+ visible: false,
1002
+ content: null
1003
+ });
1004
+ const closeShowModal = useCallback2(() => {
1005
+ setShowModalState({ visible: false, content: null });
1006
+ }, []);
1007
+ const show = useCallback2((content) => {
1008
+ setShowModalState({
1009
+ visible: true,
1010
+ content: content({ close: closeShowModal })
1011
+ });
1012
+ }, [closeShowModal]);
1013
+ const open = useCallback2((props) => {
1014
+ setShowModalState({
1015
+ visible: true,
1016
+ content: /* @__PURE__ */ jsx3(ModalDrawer, { showClose: true, isOpen: true, onClose: closeShowModal, title: props.title, children: /* @__PURE__ */ jsx3(props.content, { close: closeShowModal }) })
1017
+ });
1018
+ }, [closeShowModal]);
1019
+ const ShowModalComponent = showModalState.visible ? createPortal(
1020
+ showModalState.content,
1021
+ document.body
1022
+ ) : null;
1023
+ return /* @__PURE__ */ jsxs2(ModalContext.Provider, { value: { show, open }, children: [
1024
+ children,
1025
+ ShowModalComponent
1026
+ ] });
1027
+ }
1028
+ function useModal() {
1029
+ const context = useContext(ModalContext);
1030
+ if (!context) {
1031
+ throw new Error("useModal must be used within a ModalProvider");
1032
+ }
1033
+ return context;
1034
+ }
1035
+
1036
+ // src/context/ToastContext.tsx
1037
+ import { useState as useState5, useCallback as useCallback3, createContext as createContext2, useContext as useContext2 } from "react";
1038
+ import { createPortal as createPortal2 } from "react-dom";
1039
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
1040
+ var ToastContext = createContext2(null);
1041
+ function ToastProvider({ children, zIndex = 299 }) {
1042
+ const [toasts, setToasts] = useState5([]);
1043
+ const removeToast = useCallback3((id) => {
1044
+ setToasts((prev) => prev.filter((toast) => toast.id !== id));
1045
+ }, []);
1046
+ const show = useCallback3(({ icon, timeout = 3e3, text }) => {
1047
+ const id = Date.now() + Math.random();
1048
+ setToasts((prev) => [...prev, { id, icon, text }]);
1049
+ setTimeout(() => removeToast(id), timeout);
1050
+ }, [removeToast]);
1051
+ const success = useCallback3((text, timeout) => {
1052
+ show({ icon: /* @__PURE__ */ jsx4(CheckRoundIcon, { color: "#2FCC00", size: 24 }), text, timeout });
1053
+ }, [show]);
1054
+ const error = useCallback3((text, timeout) => {
1055
+ show({ icon: /* @__PURE__ */ jsx4(ErrorRoundIcon, { size: 24 }), text, timeout });
1056
+ }, [show]);
1057
+ const ToastComponent = createPortal2(
1058
+ /* @__PURE__ */ jsx4("div", { className: "matchid-toast-box", style: {
1059
+ zIndex
1060
+ }, children: toasts.reverse().map(({ id, icon, text }) => /* @__PURE__ */ jsxs3(
1061
+ "div",
1062
+ {
1063
+ className: "matchid-toast",
1064
+ children: [
1065
+ icon && /* @__PURE__ */ jsx4("span", { children: icon }),
1066
+ /* @__PURE__ */ jsx4("span", { children: text })
1067
+ ]
1068
+ },
1069
+ id
1070
+ )) }),
1071
+ document.body
1072
+ );
1073
+ return /* @__PURE__ */ jsxs3(ToastContext.Provider, { value: { show, success, error }, children: [
1074
+ children,
1075
+ ToastComponent
1076
+ ] });
1077
+ }
1078
+ function useToast() {
1079
+ const context = useContext2(ToastContext);
1080
+ if (!context) {
1081
+ throw new Error("useToast must be used within a ToastProvider");
1082
+ }
1083
+ return context;
1084
+ }
1085
+
1086
+ // src/hooks/api/wallet.ts
1087
+ var wallet_exports = {};
1088
+ __export(wallet_exports, {
1089
+ getUserWalletTransactionsApi: () => getUserWalletTransactionsApi,
1090
+ getWalletAssetListApi: () => getWalletAssetListApi,
1091
+ getWalletListApi: () => getWalletListApi,
1092
+ useAssetListQuery: () => useAssetListQuery,
1093
+ useChainListQuery: () => useChainListQuery,
1094
+ useImportTokenListQuery: () => useImportTokenListQuery,
1095
+ useWalletChainListQuery: () => useWalletChainListQuery,
1096
+ userImportTokenApi: () => userImportTokenApi
1097
+ });
1098
+ import { useQuery } from "@tanstack/react-query";
1099
+ function useChainListQuery(options) {
1100
+ const { isLogin, token } = useUserInfo();
1101
+ return useQuery({
1102
+ queryKey: ["match-chain-list", token],
1103
+ queryFn: async () => {
1104
+ const res = await getUserChainListApi();
1105
+ if (!isSuccess(res)) {
1106
+ return [];
1107
+ }
1108
+ return res.data;
1109
+ },
1110
+ enabled: isLogin,
1111
+ ...options
1112
+ });
1113
+ }
1114
+ function useAssetListQuery({
1115
+ chainId,
1116
+ ...options
1117
+ }) {
1118
+ const { isLogin, token } = useUserInfo();
1119
+ return useQuery({
1120
+ queryKey: ["match-wallet-asset-list", token, chainId],
1121
+ queryFn: async () => {
1122
+ const res = await getUserWalletAssetApi({ chain_id: chainId.toString() });
1123
+ if (!isSuccess(res)) {
1124
+ return [];
1125
+ }
1126
+ return res.data || [];
1127
+ },
1128
+ enabled: isLogin,
1129
+ ...options
1130
+ });
1131
+ }
1132
+ function useImportTokenListQuery({
1133
+ chainId,
1134
+ ...options
1135
+ }) {
1136
+ const { isLogin, token } = useUserInfo();
1137
+ return useQuery({
1138
+ queryKey: ["match-wallet-import-token-list", token, chainId],
1139
+ queryFn: async () => {
1140
+ const res = await getUserImportTokenListApi({ chain_id: chainId.toString() });
1141
+ if (!isSuccess(res)) {
1142
+ return [];
1143
+ }
1144
+ return res.data || [];
1145
+ },
1146
+ enabled: isLogin,
1147
+ ...options
1148
+ });
1149
+ }
1150
+ function useWalletChainListQuery(options) {
1151
+ const { isLogin, token } = useUserInfo();
1152
+ return useQuery({
1153
+ queryKey: ["match-wallet-chain-list", token],
1154
+ queryFn: async () => {
1155
+ const res = await getWalletChainListApi();
1156
+ if (!isSuccess(res)) {
1157
+ return [];
1158
+ }
1159
+ return res.data;
1160
+ },
1161
+ enabled: isLogin,
1162
+ ...options
1163
+ });
1164
+ }
1165
+
1166
+ // src/hooks/useMatchChain.tsx
1167
+ import { useMemo as useMemo3, useState as useState6 } from "react";
1168
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
1169
+ function useMatchChain() {
1170
+ const chainListQuery = useChainListQuery();
1171
+ const modal = useModal();
1172
+ const { chainId: storeChainId, setChainId } = useLocalStore_default();
1173
+ const chainId = useMemo3(() => {
1174
+ if (!chainListQuery.data || !chainListQuery.data.length) {
1175
+ return null;
1176
+ }
1177
+ if (chainListQuery.data.find((item) => item.id === storeChainId)) {
1178
+ return storeChainId;
1179
+ }
1180
+ return chainListQuery.data[0].id;
1181
+ }, [storeChainId, chainListQuery.data]);
1182
+ const chain = useMemo3(() => {
1183
+ if (!chainListQuery.data || !chainListQuery.data.length) {
1184
+ return null;
1185
+ }
1186
+ return chainListQuery.data.find((item) => item.id === chainId);
1187
+ }, [chainId, chainListQuery.data]);
1188
+ const explorerLink = (url) => {
1189
+ const explorer = chain?.blockExplorers.default.url;
1190
+ return explorer.lastIndexOf("/") === explorer.length - 1 ? explorer + url : explorer + "/" + url;
1191
+ };
1192
+ function ChangeNetwork({
1193
+ close
1194
+ }) {
1195
+ const { chainId: storeChainId2, setChainId: setChainId2 } = useLocalStore_default();
1196
+ const [selectedChainId, setSelectedChainId] = useState6(storeChainId2);
1197
+ return /* @__PURE__ */ jsxs4("div", { className: `matchid-change-network-box`, children: [
1198
+ /* @__PURE__ */ jsx5("div", { className: `matchid-change-network-list`, children: chainListQuery.data?.map((item, index) => {
1199
+ return /* @__PURE__ */ jsxs4(
1200
+ "div",
1201
+ {
1202
+ onClick: () => setSelectedChainId(item.id),
1203
+ className: `matchid-change-network-item ${selectedChainId == item.id ? "matchid-change-network-selected" : ""}`,
1204
+ children: [
1205
+ /* @__PURE__ */ jsxs4("div", { className: `matchid-change-network-item-content`, children: [
1206
+ /* @__PURE__ */ jsx5("img", { src: item.iconUrl, className: `matchid-change-network-item-icon` }),
1207
+ /* @__PURE__ */ jsx5("span", { className: "matchid-change-network-item-name", children: item.name })
1208
+ ] }),
1209
+ /* @__PURE__ */ jsx5(Radio, { checked: selectedChainId === item.id })
1210
+ ]
1211
+ },
1212
+ index
1213
+ );
1214
+ }) }),
1215
+ /* @__PURE__ */ jsx5(Button, { size: "lg", highlight: true, onClick: () => {
1216
+ setChainId2(selectedChainId || 0);
1217
+ close();
1218
+ }, block: true, children: "Confirm" })
1219
+ ] });
1220
+ }
1221
+ const showChangeNetwork = () => {
1222
+ modal.open({
1223
+ title: "Change Network",
1224
+ content: ChangeNetwork
1225
+ });
1226
+ };
1227
+ return {
1228
+ list: chainListQuery.data,
1229
+ chainId,
1230
+ setChainId,
1231
+ chain,
1232
+ explorerLink,
1233
+ showChangeNetwork
1234
+ };
1235
+ }
1236
+
1237
+ // src/hooks/useMatchWallet.tsx
1238
+ import { QRCode } from "react-qrcode";
1239
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
1240
+ function useMatchWallet() {
1241
+ const modal = useModal();
1242
+ const { address } = useWallet();
1243
+ const chain = useMatchChain();
1244
+ const [copied, setCopied] = useCopyClipboard();
1245
+ const toast = useToast();
1246
+ const onCopy = () => {
1247
+ setCopied(address);
1248
+ toast.success("Copied!");
1249
+ };
1250
+ const showReceiveModal = () => {
1251
+ const chainLink = chain.explorerLink("address/" + address);
1252
+ const ReceiveModal = () => {
1253
+ return /* @__PURE__ */ jsxs5("div", { className: `matchid-receive-modal`, children: [
1254
+ /* @__PURE__ */ jsxs5("div", { className: "matchid-receive-container", children: [
1255
+ /* @__PURE__ */ jsx6("div", { className: `matchid-receive-text`, children: "Receive by scanning the QR code" }),
1256
+ /* @__PURE__ */ jsx6("div", { className: `matchid-qr-container`, children: /* @__PURE__ */ jsx6(
1257
+ QRCode,
1258
+ {
1259
+ margin: "0",
1260
+ className: `matchid-qr-code`,
1261
+ value: address
1262
+ }
1263
+ ) }),
1264
+ /* @__PURE__ */ jsx6(
1265
+ "a",
1266
+ {
1267
+ href: chainLink,
1268
+ target: "_blank",
1269
+ className: `matchid-receive-link`,
1270
+ children: address
1271
+ }
1272
+ )
1273
+ ] }),
1274
+ /* @__PURE__ */ jsx6(Button, { size: "lg", onClick: onCopy, block: true, highlight: true, disabled: copied, children: "Copy Address" })
1275
+ ] });
1276
+ };
1277
+ modal.open({
1278
+ title: "Receive",
1279
+ content: ReceiveModal
1280
+ });
1281
+ };
1282
+ return {
1283
+ showReceiveModal
1284
+ };
1285
+ }
1286
+
1287
+ // src/components/CEXBindModal/index.tsx
1288
+ import { useEffect as useEffect6, useMemo as useMemo4, useState as useState7 } from "react";
1289
+ import { FormattedMessage as FormattedMessage2, useIntl as useIntl2 } from "react-intl";
1290
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
1291
+ function CEXBindModal({
1292
+ onClose,
1293
+ type,
1294
+ isOpen = false,
1295
+ ...props
1296
+ }) {
1297
+ const intl = useIntl2();
1298
+ const { events } = useMatch();
1299
+ const [APIPassphrase, setAPIPassphrase] = useState7("");
1300
+ const { refreshOverview } = useUserInfo();
1301
+ const [loading, setLoading] = useState7(false);
1302
+ const [key, setKey] = useState7("");
1303
+ const [secret, setSecret] = useState7("");
1304
+ const [error, setError] = useState7("");
1305
+ const needPassphrase = useMemo4(() => {
1306
+ return ["bitget", "okx"].includes(type.toLowerCase());
1307
+ }, [type]);
1308
+ useEffect6(() => {
1309
+ if (isOpen) {
1310
+ setSecret("");
1311
+ setKey("");
1312
+ setAPIPassphrase("");
1313
+ setError("");
1314
+ setLoading(false);
1315
+ }
1316
+ }, [isOpen]);
1317
+ const SubmitApi = async () => {
1318
+ try {
1319
+ setLoading(true);
1320
+ const res = await bindCexApi({
1321
+ cex: type,
1322
+ api_key: key,
1323
+ api_secret: secret,
1324
+ ...needPassphrase ? { api_passphrase: APIPassphrase } : {}
1325
+ });
1326
+ if (isSuccess(res)) {
1327
+ await refreshOverview();
1328
+ events.onBind && events.onBind({
1329
+ type: "cex_" + type
1330
+ });
1331
+ eventManager_default.emit("onBind", {
1332
+ type: "cex_" + type
1333
+ });
1334
+ onClose();
1335
+ } else {
1336
+ throw new Error(res.message);
1337
+ }
1338
+ } catch (error2) {
1339
+ console.error(error2);
1340
+ setError(error2.message);
1341
+ } finally {
1342
+ setLoading(false);
1343
+ }
1344
+ };
1345
+ return /* @__PURE__ */ jsx7(ModalWithHeader, { showClose: true, isOpen, onClose, title: intl.formatMessage({
1346
+ id: "CEXBindTitle"
1347
+ }, {
1348
+ type
1349
+ }), ...props, children: /* @__PURE__ */ jsxs6("div", { className: "matchid-cex-modal", children: [
1350
+ /* @__PURE__ */ jsxs6("div", { children: [
1351
+ /* @__PURE__ */ jsx7("p", { children: /* @__PURE__ */ jsx7(FormattedMessage2, { id: "CEXBindAttention" }) }),
1352
+ /* @__PURE__ */ jsx7("p", { children: /* @__PURE__ */ jsx7(FormattedMessage2, { id: "CEXBindTips1" }) }),
1353
+ /* @__PURE__ */ jsx7("p", { children: /* @__PURE__ */ jsx7(FormattedMessage2, { id: "CEXBindTips2" }) }),
1354
+ /* @__PURE__ */ jsx7("p", { children: /* @__PURE__ */ jsx7(FormattedMessage2, { id: "CEXBindTips3" }) })
1355
+ ] }),
1356
+ /* @__PURE__ */ jsx7(Field, { label: intl.formatMessage({
1357
+ id: "CEXBindApiKey"
1358
+ }), children: /* @__PURE__ */ jsx7(
1359
+ Input,
1360
+ {
1361
+ value: key,
1362
+ onChange: (e) => setKey(e.target.value),
1363
+ placeholder: "**** **** ****"
1364
+ }
1365
+ ) }),
1366
+ /* @__PURE__ */ jsx7(Field, { label: intl.formatMessage({
1367
+ id: "CEXBindApiSecretKey"
1368
+ }), error: !needPassphrase && error, children: /* @__PURE__ */ jsx7(
1369
+ Input,
1370
+ {
1371
+ value: secret,
1372
+ onChange: (e) => setSecret(e.target.value),
1373
+ placeholder: "**** **** ****"
1374
+ }
1375
+ ) }),
1376
+ needPassphrase && /* @__PURE__ */ jsx7(Field, { error, label: intl.formatMessage({
1377
+ id: "CEXBindApiPassphrase"
1378
+ }), children: /* @__PURE__ */ jsx7(
1379
+ Input,
1380
+ {
1381
+ value: APIPassphrase,
1382
+ onChange: (e) => setAPIPassphrase(e.target.value),
1383
+ placeholder: "**** **** ****"
1384
+ }
1385
+ ) }),
1386
+ /* @__PURE__ */ jsx7(
1387
+ Button,
1388
+ {
1389
+ onClick: SubmitApi,
1390
+ size: "lg",
1391
+ block: true,
1392
+ loading,
1393
+ disabled: !key || !secret,
1394
+ children: /* @__PURE__ */ jsx7(FormattedMessage2, { id: "continue" })
1395
+ }
1396
+ )
1397
+ ] }) });
1398
+ }
1399
+
1400
+ // src/context/BusinessProvider.tsx
1401
+ import { Fragment, jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
1402
+ function BusinessProvider({ children }) {
1403
+ const { overview, token } = useUserInfo();
1404
+ const { type: SOLType, isOpen: SOLIsOpen, close: SOLClose } = useSOLModalStore();
1405
+ const { type: TONType, isOpen: TONIsOpen, close: TONClose } = useTONModalStore();
1406
+ const { type: TRONType, isOpen: TRONIsOpen, close: TRONClose } = useTRONModalStore();
1407
+ const { type: BTCType, isOpen: BTCIsOpen, close: BTCClose } = useBTCModalStore();
1408
+ const { type: CEXType, isOpen: CEXIsOpen, close: CEXClose } = useCEXBindModalStore();
1409
+ const WalletModalStore = useWalletModalStore();
1410
+ const { close: HashPanelClose, ...hashPanelProps } = useHashPanelStore();
1411
+ const walletModalClose = (func) => {
1412
+ WalletModalStore.close();
1413
+ func();
1414
+ };
1415
+ return /* @__PURE__ */ jsxs7(Fragment, { children: [
1416
+ /* @__PURE__ */ jsx8(
1417
+ SOLModal,
1418
+ {
1419
+ isOpen: SOLIsOpen && (SOLType == "login" && !overview && !token || SOLType == "bind" && !!token && !!overview),
1420
+ onClose: SOLClose,
1421
+ type: SOLType,
1422
+ onSuccess: () => walletModalClose(SOLClose),
1423
+ zIndex: 199
1424
+ }
1425
+ ),
1426
+ /* @__PURE__ */ jsx8(
1427
+ TRONModal,
1428
+ {
1429
+ isOpen: TRONIsOpen && (TRONType == "login" && !overview && !token || TRONType == "bind" && !!token && !!overview),
1430
+ onClose: TRONClose,
1431
+ type: TRONType,
1432
+ onSuccess: () => walletModalClose(TRONClose),
1433
+ zIndex: 199
1434
+ }
1435
+ ),
1436
+ /* @__PURE__ */ jsx8(
1437
+ TONModal,
1438
+ {
1439
+ isOpen: TONIsOpen && (TONType == "login" && !overview && !token || TONType == "bind" && !!token && !!overview),
1440
+ onClose: TONClose,
1441
+ type: TONType,
1442
+ onSuccess: () => walletModalClose(TONClose),
1443
+ zIndex: 199
1444
+ }
1445
+ ),
1446
+ /* @__PURE__ */ jsx8(
1447
+ BTCModal,
1448
+ {
1449
+ isOpen: BTCIsOpen && (BTCType == "login" && !overview && !token || BTCType == "bind" && !!token && !!overview),
1450
+ onClose: BTCClose,
1451
+ type: BTCType,
1452
+ onSuccess: () => walletModalClose(BTCClose),
1453
+ zIndex: 199
1454
+ }
1455
+ ),
1456
+ /* @__PURE__ */ jsx8(
1457
+ CEXBindModal,
1458
+ {
1459
+ isOpen: CEXIsOpen && (!!token && !!overview),
1460
+ onClose: CEXClose,
1461
+ type: CEXType,
1462
+ zIndex: 199
1463
+ }
1464
+ ),
1465
+ /* @__PURE__ */ jsx8(HashPanel_default, { onClose: HashPanelClose, ...hashPanelProps }),
1466
+ /* @__PURE__ */ jsx8(
1467
+ WalletModal,
1468
+ {
1469
+ isOpen: WalletModalStore.isOpen && (WalletModalStore.type == "login" && !overview && !token || WalletModalStore.type == "bind" && !!token && !!overview),
1470
+ onClose: WalletModalStore.close,
1471
+ type: WalletModalStore.type,
1472
+ methods: WalletModalStore.methods,
1473
+ zIndex: 150
1474
+ }
1475
+ ),
1476
+ children
1477
+ ] });
1478
+ }
1479
+
1480
+ // src/context/index.tsx
1481
+ import { jsx as jsx9 } from "react/jsx-runtime";
1482
+ var Providers = ({ children }) => {
1483
+ return /* @__PURE__ */ jsx9(ToastProvider, { children: /* @__PURE__ */ jsx9(ModalProvider, { children: /* @__PURE__ */ jsx9(BusinessProvider, { children }) }) });
1484
+ };
1485
+ var context_default = Providers;
1486
+
1487
+ // src/hooks/useWalletInit.ts
1488
+ import { useEffect as useEffect7, useRef } from "react";
1489
+
1490
+ // src/utils/wallet.ts
1491
+ var sendMessage = ({ method, data, resolve, reject, timeout }) => {
1492
+ const messageId = window.matchProvider.sendWalletMessage({
1493
+ method,
1494
+ data
1495
+ });
1496
+ window.matchProvider.walletMessageMap[messageId] = {
1497
+ resolve,
1498
+ reject
1499
+ };
1500
+ window.matchProvider.walletMessageMap[messageId].timeout = setTimeout(() => {
1501
+ console.error("Get wallet result timeout", {
1502
+ messageId,
1503
+ method,
1504
+ data
1505
+ });
1506
+ delete window.matchProvider.walletMessageMap[messageId];
1507
+ reject(new Error("Get wallet result timeout"));
1508
+ }, timeout);
1509
+ };
1510
+
1511
+ // src/hooks/useWalletInit.ts
1512
+ var getWalletIframe = () => {
1513
+ return document.getElementById("match-wallet");
1514
+ };
1515
+ var AppClientId2 = getAppClientId();
1516
+ function useWalletInit({
1517
+ config
1518
+ }) {
1519
+ const { endpoints, token, overview, setWallet, wallet, appid, locale, refreshOverview } = useLocalStore_default();
1520
+ const { setWalletReady, walletReady } = useStore_default();
1521
+ const iframeReadyRef = useRef(walletReady);
1522
+ useEffect7(() => {
1523
+ setWallet(config);
1524
+ }, [config]);
1525
+ useEffect7(() => {
1526
+ matchlog_default.log("sdk.mpc.status", walletReady, iframeReadyRef.current);
1527
+ iframeReadyRef.current = walletReady;
1528
+ if (iframeReadyRef.current) {
1529
+ const onReady = async () => {
1530
+ if (window.matchProvider.walletMessageStack.length > 0) {
1531
+ const stack = window.matchProvider.walletMessageStack;
1532
+ window.matchProvider.walletMessageStack = [];
1533
+ for (let i = 0; i < stack.length; i++) {
1534
+ const item = stack[i];
1535
+ sendMessage(item);
1536
+ }
1537
+ }
1538
+ };
1539
+ onReady();
1540
+ }
1541
+ }, [walletReady]);
1542
+ useEffect7(() => {
1543
+ if (!endpoints.auth || !appid || !token || !config) {
1544
+ const existingIframe = getWalletIframe();
1545
+ if (existingIframe) {
1546
+ existingIframe.remove();
1547
+ }
1548
+ return;
1549
+ }
1550
+ if (endpoints.auth) {
1551
+ const existingIframe = getWalletIframe();
1552
+ const query = {
1553
+ appid,
1554
+ locale,
1555
+ appClientId: AppClientId2,
1556
+ initParams: encodeBase64(JSON.stringify({
1557
+ access_token: token,
1558
+ type: config.type
1559
+ }))
1560
+ };
1561
+ const url = endpoints.auth + "wallet/2?" + new URLSearchParams(query).toString();
1562
+ if (!existingIframe) {
1563
+ const createIframe = () => {
1564
+ const iframe = document.createElement("iframe");
1565
+ iframe.id = "match-wallet";
1566
+ iframe.src = url;
1567
+ iframe.style.display = "none";
1568
+ iframe.style.width = "0";
1569
+ iframe.style.height = "0";
1570
+ iframe.style.position = "fixed";
1571
+ iframe.style.zIndex = "200";
1572
+ iframe.onerror = (e) => {
1573
+ console.error("sdk.mpc.error", e);
1574
+ };
1575
+ document.body.insertBefore(iframe, document.body.firstChild);
1576
+ };
1577
+ createIframe();
1578
+ if (!window.matchProvider) {
1579
+ window.matchProvider = {
1580
+ transactionMessageIntervalMap: {},
1581
+ walletMessageMap: {},
1582
+ walletMessageStack: [],
1583
+ sendWalletMessage: ({
1584
+ method,
1585
+ data = {}
1586
+ }) => {
1587
+ const messageId = Date.now().toString() + Math.random().toString().slice(6);
1588
+ const message = {
1589
+ method,
1590
+ data,
1591
+ messageId,
1592
+ source: "matchid",
1593
+ version: 1
1594
+ };
1595
+ try {
1596
+ matchlog_default.log("sdk.mpc.send", message, endpoints.auth);
1597
+ getWalletIframe()?.contentWindow?.postMessage(message, endpoints.auth);
1598
+ } catch (error) {
1599
+ console.error("sdk.mpc.sendError", error);
1600
+ }
1601
+ return messageId;
1602
+ },
1603
+ waitUntilWalletMessage: async ({
1604
+ method,
1605
+ data = {},
1606
+ timeout = 3e4
1607
+ }) => {
1608
+ return new Promise((resolve, reject) => {
1609
+ try {
1610
+ if (iframeReadyRef.current && window.matchProvider.walletMessageStack.length == 0) {
1611
+ sendMessage({
1612
+ method,
1613
+ data,
1614
+ resolve,
1615
+ reject,
1616
+ timeout
1617
+ });
1618
+ return;
1619
+ }
1620
+ window.matchProvider.walletMessageStack.push({
1621
+ method,
1622
+ data,
1623
+ timeout,
1624
+ resolve,
1625
+ reject
1626
+ });
1627
+ } catch (error) {
1628
+ reject(error);
1629
+ }
1630
+ });
1631
+ }
1632
+ };
1633
+ }
1634
+ } else {
1635
+ if (existingIframe.src !== url) {
1636
+ setWalletReady(false);
1637
+ existingIframe.src = url;
1638
+ }
1639
+ }
1640
+ }
1641
+ }, [endpoints.auth, appid, token, config]);
1642
+ useEffect7(() => {
1643
+ const messageHandle = async (e) => {
1644
+ if (e.origin !== endpoints.auth.substring(0, endpoints.auth.length - 1)) {
1645
+ return;
1646
+ }
1647
+ const res = e.data;
1648
+ if (res.source != "match-wallet") {
1649
+ return;
1650
+ }
1651
+ matchlog_default.log("sdk.mpc.receive", e);
1652
+ const messageId = res.messageId;
1653
+ if (messageId == "ready") {
1654
+ matchlog_default.log("sdk.mpc.ready");
1655
+ setWalletReady(true);
1656
+ window.matchProvider.sendWalletMessage({
1657
+ method: "readied"
1658
+ });
1659
+ return;
1660
+ }
1661
+ if (messageId == "openIframe") {
1662
+ const iframe = getWalletIframe();
1663
+ if (iframe) {
1664
+ iframe.style.display = "block";
1665
+ iframe.style.width = "100vw";
1666
+ iframe.style.height = "100vh";
1667
+ iframe.style.right = "0";
1668
+ iframe.style.top = "0";
1669
+ }
1670
+ return;
1671
+ }
1672
+ if (messageId == "closeIframe") {
1673
+ const iframe = getWalletIframe();
1674
+ if (iframe) {
1675
+ iframe.style.display = "none";
1676
+ iframe.style.width = "0";
1677
+ iframe.style.height = "0";
1678
+ iframe.style.right = "0";
1679
+ iframe.style.top = "0";
1680
+ }
1681
+ return;
1682
+ }
1683
+ if (messageId == "refreshOverview") {
1684
+ refreshOverview();
1685
+ return;
1686
+ }
1687
+ if (messageId == "updateTransactionData") {
1688
+ const { data, rootData, transactionId } = res.data;
1689
+ if (window.matchProvider.transactionMessageIntervalMap[transactionId] && window.matchProvider.transactionMessageIntervalMap[transactionId].transaction.data == rootData) {
1690
+ window.matchProvider.transactionMessageIntervalMap[transactionId].transaction.data = data;
1691
+ const { func } = window.matchProvider.transactionMessageIntervalMap[transactionId];
1692
+ func();
1693
+ }
1694
+ return;
1695
+ }
1696
+ if (messageId && window.matchProvider.walletMessageMap[messageId]) {
1697
+ const { resolve, reject, timeout } = window.matchProvider.walletMessageMap[messageId];
1698
+ clearTimeout(timeout);
1699
+ if (res.method == "ping") {
1700
+ delete window.matchProvider.walletMessageMap[messageId].timeout;
1701
+ return;
1702
+ }
1703
+ delete window.matchProvider.walletMessageMap[messageId];
1704
+ if (res.status == "success") {
1705
+ resolve(res.data);
1706
+ } else {
1707
+ console.error("sdk.mpc.fail", res);
1708
+ reject(new Error(res.data.message));
1709
+ }
1710
+ }
1711
+ };
1712
+ window.addEventListener("message", messageHandle);
1713
+ return () => {
1714
+ window.removeEventListener("message", messageHandle);
1715
+ };
1716
+ }, []);
1717
+ return {
1718
+ walletReady
1719
+ };
1720
+ }
1721
+
1722
+ // src/hooks/useInit.tsx
1723
+ import { useEffect as useEffect8, useRef as useRef2 } from "react";
1724
+ function useInit({
1725
+ theme,
1726
+ appid,
1727
+ events,
1728
+ endpoints,
1729
+ locale
1730
+ }) {
1731
+ const {
1732
+ setAppid,
1733
+ setEndpoints,
1734
+ setToken,
1735
+ setMid,
1736
+ token,
1737
+ setOverview,
1738
+ setTheme,
1739
+ setLocale,
1740
+ locale: realLocale
1741
+ } = useLocalStore_default();
1742
+ const walletModalStore = useWalletModalStore();
1743
+ const overviewLoadingRef = useRef2(false);
1744
+ const searchParams = new URLSearchParams(window.location.search);
1745
+ const matchToken = searchParams.get("matchToken");
1746
+ const realEndpoints = endpoints || env_default.endpoints;
1747
+ useEffect8(() => {
1748
+ setTheme(theme);
1749
+ }, [theme]);
1750
+ useEffect8(() => {
1751
+ setAppid(appid);
1752
+ }, [appid]);
1753
+ useEffect8(() => {
1754
+ setEndpoints(realEndpoints);
1755
+ }, [realEndpoints]);
1756
+ useEffect8(() => {
1757
+ setLocale(locale || "en");
1758
+ }, [locale]);
1759
+ useEffect8(() => {
1760
+ if (matchToken) {
1761
+ const tokenData = JSON.parse(atob(matchToken));
1762
+ if (tokenData && tokenData.mid && tokenData.token) {
1763
+ login({
1764
+ mid: tokenData.mid,
1765
+ token: "Bearer " + tokenData.token
1766
+ });
1767
+ }
1768
+ }
1769
+ }, [matchToken]);
1770
+ useEffect8(() => {
1771
+ const onLoginMessage = (event) => {
1772
+ const res = event.data;
1773
+ if (res.event === "login" && res.data && (res.data.token || res.data.token_type && res.data.access_token)) {
1774
+ login({
1775
+ mid: res.data.mid,
1776
+ token: res.data.token || `${res.data.token_type} ${res.data.access_token}`
1777
+ });
1778
+ } else if (res.event == "bind") {
1779
+ walletModalStore.close();
1780
+ eventManager_default.emit("onBind", res.data);
1781
+ if (events && events.onBind) {
1782
+ events.onBind(res.data);
1783
+ }
1784
+ }
1785
+ };
1786
+ window.addEventListener("message", onLoginMessage);
1787
+ return () => {
1788
+ window.removeEventListener("message", onLoginMessage);
1789
+ };
1790
+ }, []);
1791
+ const loadOverview = async () => {
1792
+ matchlog_default.log("loadOverview");
1793
+ if (overviewLoadingRef.current) {
1794
+ return;
1795
+ }
1796
+ overviewLoadingRef.current = true;
1797
+ try {
1798
+ const res = await getOverviewInfoApi();
1799
+ setOverview(res.data);
1800
+ return res.data;
1801
+ } catch (err) {
1802
+ console.error("overview error", err);
1803
+ } finally {
1804
+ overviewLoadingRef.current = false;
1805
+ }
1806
+ };
1807
+ useEffect8(() => {
1808
+ if (token) {
1809
+ loadOverview();
1810
+ }
1811
+ }, [token]);
1812
+ const login = async ({ mid, token: token2 }) => {
1813
+ setMid(mid);
1814
+ setToken(token2);
1815
+ const overview = await loadOverview();
1816
+ eventManager_default.emit("onLogin", {
1817
+ mid,
1818
+ token: token2,
1819
+ did: overview?.did
1820
+ });
1821
+ if (events && events?.onLogin) {
1822
+ events.onLogin({
1823
+ mid,
1824
+ token: token2,
1825
+ did: overview?.did
1826
+ });
1827
+ }
1828
+ };
1829
+ return {
1830
+ loadOverview,
1831
+ login,
1832
+ endpoints: realEndpoints,
1833
+ locale: realLocale
1834
+ };
1835
+ }
1836
+
1837
+ // src/MatchContext.tsx
1838
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
1839
+ import { IntlProvider } from "react-intl";
1840
+
1841
+ // src/i18n/en.json
1842
+ var en_default = {
1843
+ email: "Email",
1844
+ emailAddress: "Email Address",
1845
+ emailAddressPlaceholder: "Enter Your Email Address",
1846
+ continue: "Continue",
1847
+ send: "Send",
1848
+ resend: "Resend",
1849
+ sendCodeErrorTip: "Failed to send code: {error}",
1850
+ sendEmailTips: "We have sent a verification code to your email",
1851
+ verificationCode: "Verification Code",
1852
+ codePlaceholder: "Enter the code",
1853
+ wallet: "Wallet",
1854
+ otherLoginMethods: "Other login methods",
1855
+ login: "Login",
1856
+ user: "User",
1857
+ loginTitle: "Log in / Sign up",
1858
+ loginTips: "You can use the following methods",
1859
+ passwordMinError: "Password must be at least {length} characters",
1860
+ passwordMatchError: "The password you entered twice do not match",
1861
+ passwordTitle: "Set Password",
1862
+ passwordTips: "Please set the wallet password that will be used to recover the wallet",
1863
+ password: "Password",
1864
+ passwordPlaceholder: "Enter Your Password",
1865
+ rePassword: "Re Password",
1866
+ rePasswordPlaceholder: "Re Enter the Password",
1867
+ recoverTitle: "Recover Wallet",
1868
+ recoverTips: "Please enter your password to recover your wallet",
1869
+ bindWith: "Bind with {name} Wallet",
1870
+ loginWith: "Login with {name} Wallet",
1871
+ editUsernameTitle: "Edit User Name",
1872
+ setUsernameTitle: "Set User Name",
1873
+ username: "User Name",
1874
+ usernamePlaceholder: "Enter Your User Name",
1875
+ usernameValidError: "Name can be composed of numbers and letters as well as characters",
1876
+ usernameLengthError: "No less than 2 characters",
1877
+ confirm: "Confirm",
1878
+ nextTime: "Next time",
1879
+ setUsername: "Set a User Name",
1880
+ disconnect: "Disconnect",
1881
+ CEXBindTitle: "Bind {type} API",
1882
+ CEXBindAttention: "Attention:",
1883
+ CEXBindTips1: "1. Please bind the API for read-only permissions.",
1884
+ CEXBindTips2: "2. Your API may be out of date, it is better to use a long term API.",
1885
+ CEXBindTips3: "3. Only one API can be bound to the same exchange at the same time.",
1886
+ CEXBindApiKey: "API Key",
1887
+ CEXBindApiSecretKey: "API Secret Key",
1888
+ CEXBindApiPassphrase: "API Passphrase",
1889
+ cancel: "Cancel",
1890
+ walletLoading: "Wallet service is loading"
1891
+ };
1892
+
1893
+ // src/i18n/zh.json
1894
+ var zh_default = {
1895
+ email: "\u90AE\u7BB1",
1896
+ emailAddress: "\u90AE\u7BB1\u5730\u5740",
1897
+ emailAddressPlaceholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u90AE\u7BB1\u5730\u5740",
1898
+ continue: "\u7EE7\u7EED",
1899
+ send: "\u53D1\u9001",
1900
+ resend: "\u91CD\u65B0\u53D1\u9001",
1901
+ sendCodeErrorTip: "\u53D1\u9001\u9A8C\u8BC1\u7801\u5931\u8D25\uFF1A{error}",
1902
+ sendEmailTips: "\u6211\u4EEC\u5DF2\u5411\u60A8\u7684\u90AE\u7BB1\u53D1\u9001\u9A8C\u8BC1\u7801",
1903
+ verificationCode: "\u9A8C\u8BC1\u7801",
1904
+ codePlaceholder: "\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801",
1905
+ wallet: "\u94B1\u5305",
1906
+ otherLoginMethods: "\u5176\u4ED6\u767B\u5F55\u65B9\u5F0F",
1907
+ login: "\u767B\u5F55",
1908
+ user: "\u7528\u6237",
1909
+ loginTitle: "\u767B\u5F55 / \u6CE8\u518C",
1910
+ loginTips: "\u60A8\u53EF\u4EE5\u4F7F\u7528\u4EE5\u4E0B\u65B9\u5F0F\u767B\u5F55",
1911
+ passwordMinError: "\u5BC6\u7801\u5FC5\u987B\u81F3\u5C11\u5305\u542B {length} \u4E2A\u5B57\u7B26",
1912
+ passwordMatchError: "\u4E24\u6B21\u8F93\u5165\u7684\u5BC6\u7801\u4E0D\u4E00\u81F4",
1913
+ passwordTitle: "\u8BBE\u7F6E\u5BC6\u7801",
1914
+ passwordTips: "\u8BF7\u8BBE\u7F6E\u7528\u4E8E\u6062\u590D\u94B1\u5305\u7684\u94B1\u5305\u5BC6\u7801",
1915
+ password: "\u5BC6\u7801",
1916
+ passwordPlaceholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u5BC6\u7801",
1917
+ rePassword: "\u786E\u8BA4\u5BC6\u7801",
1918
+ rePasswordPlaceholder: "\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801",
1919
+ recoverTitle: "\u6062\u590D\u94B1\u5305",
1920
+ recoverTips: "\u8BF7\u8F93\u5165\u60A8\u7684\u5BC6\u7801\u4EE5\u6062\u590D\u94B1\u5305",
1921
+ bindWith: "\u7ED1\u5B9A {name} \u94B1\u5305",
1922
+ loginWith: "\u4F7F\u7528 {name} \u94B1\u5305\u767B\u5F55",
1923
+ editUsernameTitle: "\u4FEE\u6539\u7528\u6237\u540D",
1924
+ setUsernameTitle: "\u8BBE\u7F6E\u7528\u6237\u540D",
1925
+ username: "\u7528\u6237\u540D",
1926
+ usernamePlaceholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u7528\u6237\u540D",
1927
+ usernameValidError: "\u7528\u6237\u540D\u53EF\u4EE5\u7531\u6570\u5B57\u3001\u5B57\u6BCD\u548C\u5B57\u7B26\u7EC4\u6210",
1928
+ usernameLengthError: "\u7528\u6237\u540D\u4E0D\u5F97\u5C11\u4E8E 2 \u4E2A\u5B57\u7B26",
1929
+ confirm: "\u786E\u8BA4",
1930
+ nextTime: "\u4E0B\u6B21\u518D\u8BF4",
1931
+ setUsername: "\u8BBE\u7F6E\u7528\u6237\u540D",
1932
+ disconnect: "\u65AD\u5F00\u8FDE\u63A5",
1933
+ CEXBindTitle: "\u7ED1\u5B9A {type} API",
1934
+ CEXBindAttention: "\u6CE8\u610F\uFF1A",
1935
+ CEXBindTips1: "1. \u8BF7\u7ED1\u5B9A\u5177\u6709\u53EA\u8BFB\u6743\u9650\u7684 API\u3002",
1936
+ CEXBindTips2: "2. \u60A8\u7684 API \u53EF\u80FD\u5DF2\u8FC7\u671F\uFF0C\u5EFA\u8BAE\u4F7F\u7528\u957F\u671F\u6709\u6548\u7684 API\u3002",
1937
+ CEXBindTips3: "3. \u540C\u4E00\u65F6\u95F4\u53EA\u80FD\u7ED1\u5B9A\u4E00\u4E2A API \u5230\u76F8\u540C\u7684\u4EA4\u6613\u6240\u3002",
1938
+ CEXBindApiKey: "API \u5BC6\u94A5",
1939
+ CEXBindApiSecretKey: "API \u79D8\u94A5",
1940
+ CEXBindApiPassphrase: "API \u5BC6\u7801\u77ED\u8BED",
1941
+ cancel: "\u53D6\u6D88",
1942
+ walletLoading: "\u94B1\u5305\u670D\u52A1\u6B63\u5728\u52A0\u8F7D"
1943
+ };
1944
+
1945
+ // src/i18n/tw.json
1946
+ var tw_default = {
1947
+ email: "\u90F5\u7BB1",
1948
+ emailAddress: "\u90F5\u7BB1\u5730\u5740",
1949
+ emailAddressPlaceholder: "\u8ACB\u8F38\u5165\u60A8\u7684\u90F5\u7BB1\u5730\u5740",
1950
+ continue: "\u7E7C\u7E8C",
1951
+ send: "\u767C\u9001",
1952
+ resend: "\u91CD\u65B0\u767C\u9001",
1953
+ sendCodeErrorTip: "\u767C\u9001\u9A57\u8B49\u78BC\u5931\u6557\uFF1A{error}",
1954
+ sendEmailTips: "\u6211\u5011\u5DF2\u5411\u60A8\u7684\u90F5\u7BB1\u767C\u9001\u9A57\u8B49\u78BC",
1955
+ verificationCode: "\u9A57\u8B49\u78BC",
1956
+ codePlaceholder: "\u8ACB\u8F38\u5165\u9A57\u8B49\u78BC",
1957
+ wallet: "\u9322\u5305",
1958
+ otherLoginMethods: "\u5176\u4ED6\u767B\u5165\u65B9\u5F0F",
1959
+ login: "\u767B\u5165",
1960
+ user: "\u7528\u6236",
1961
+ loginTitle: "\u767B\u5165 / \u8A3B\u518A",
1962
+ loginTips: "\u60A8\u53EF\u4EE5\u4F7F\u7528\u4EE5\u4E0B\u65B9\u5F0F\u767B\u5165",
1963
+ passwordMinError: "\u5BC6\u78BC\u5FC5\u9808\u81F3\u5C11\u5305\u542B {length} \u500B\u5B57\u7B26",
1964
+ passwordMatchError: "\u5169\u6B21\u8F38\u5165\u7684\u5BC6\u78BC\u4E0D\u4E00\u81F4",
1965
+ passwordTitle: "\u8A2D\u7F6E\u5BC6\u78BC",
1966
+ passwordTips: "\u8ACB\u8A2D\u7F6E\u7528\u65BC\u6062\u5FA9\u9322\u5305\u7684\u5BC6\u78BC",
1967
+ password: "\u5BC6\u78BC",
1968
+ passwordPlaceholder: "\u8ACB\u8F38\u5165\u60A8\u7684\u5BC6\u78BC",
1969
+ rePassword: "\u78BA\u8A8D\u5BC6\u78BC",
1970
+ rePasswordPlaceholder: "\u8ACB\u518D\u6B21\u8F38\u5165\u5BC6\u78BC",
1971
+ recoverTitle: "\u6062\u5FA9\u9322\u5305",
1972
+ recoverTips: "\u8ACB\u8F38\u5165\u60A8\u7684\u5BC6\u78BC\u4EE5\u6062\u5FA9\u9322\u5305",
1973
+ bindWith: "\u7D81\u5B9A {name} \u9322\u5305",
1974
+ loginWith: "\u4F7F\u7528 {name} \u9322\u5305\u767B\u5165",
1975
+ editUsernameTitle: "\u4FEE\u6539\u7528\u6236\u540D",
1976
+ setUsernameTitle: "\u8A2D\u7F6E\u7528\u6236\u540D",
1977
+ username: "\u7528\u6236\u540D",
1978
+ usernamePlaceholder: "\u8ACB\u8F38\u5165\u60A8\u7684\u7528\u6236\u540D",
1979
+ usernameValidError: "\u7528\u6236\u540D\u53EF\u4EE5\u7531\u6578\u5B57\u3001\u5B57\u6BCD\u548C\u5B57\u7B26\u7D44\u6210",
1980
+ usernameLengthError: "\u7528\u6236\u540D\u4E0D\u5F97\u5C11\u65BC 2 \u500B\u5B57\u7B26",
1981
+ confirm: "\u78BA\u8A8D",
1982
+ nextTime: "\u4E0B\u6B21\u518D\u8AAA",
1983
+ setUsername: "\u8A2D\u7F6E\u7528\u6236\u540D",
1984
+ disconnect: "\u65B7\u958B\u9023\u63A5",
1985
+ CEXBindTitle: "\u7D81\u5B9A {type} API",
1986
+ CEXBindAttention: "\u6CE8\u610F\uFF1A",
1987
+ CEXBindTips1: "1. \u8ACB\u7D81\u5B9A\u5177\u6709\u53EA\u8B80\u6B0A\u9650\u7684 API\u3002",
1988
+ CEXBindTips2: "2. \u60A8\u7684 API \u53EF\u80FD\u5DF2\u904E\u671F\uFF0C\u5EFA\u8B70\u4F7F\u7528\u9577\u671F\u6709\u6548\u7684 API\u3002",
1989
+ CEXBindTips3: "3. \u540C\u4E00\u6642\u9593\u53EA\u80FD\u7D81\u5B9A\u4E00\u500B API \u5230\u76F8\u540C\u7684\u4EA4\u6613\u6240\u3002",
1990
+ CEXBindApiKey: "API \u91D1\u9470",
1991
+ CEXBindApiSecretKey: "API \u5BC6\u9470",
1992
+ CEXBindApiPassphrase: "API \u5BC6\u78BC\u77ED\u8A9E",
1993
+ cancel: "\u53D6\u6D88",
1994
+ walletLoading: "\u9322\u5305\u670D\u52D9\u6B63\u5728\u52A0\u8F09"
1995
+ };
1996
+
1997
+ // src/i18n/fr.json
1998
+ var fr_default = {
1999
+ email: "Email",
2000
+ emailAddress: "Adresse Email",
2001
+ emailAddressPlaceholder: "Entrez votre adresse email",
2002
+ continue: "Continuer",
2003
+ send: "Envoyer",
2004
+ resend: "Renvoyer",
2005
+ sendCodeErrorTip: "\xC9chec de l'envoi du code : {error}",
2006
+ sendEmailTips: "Un code de v\xE9rification a \xE9t\xE9 envoy\xE9 \xE0 votre email",
2007
+ verificationCode: "Code de v\xE9rification",
2008
+ codePlaceholder: "Entrez le code",
2009
+ wallet: "Portefeuille",
2010
+ otherLoginMethods: "Autres m\xE9thodes de connexion",
2011
+ login: "Connexion",
2012
+ user: "Utilisateur",
2013
+ loginTitle: "Connexion / Inscription",
2014
+ loginTips: "Vous pouvez utiliser les m\xE9thodes suivantes",
2015
+ passwordMinError: "Le mot de passe doit contenir au moins {length} caract\xE8res",
2016
+ passwordMatchError: "Les mots de passe ne correspondent pas",
2017
+ passwordTitle: "D\xE9finir un mot de passe",
2018
+ passwordTips: "Veuillez d\xE9finir le mot de passe pour restaurer le portefeuille",
2019
+ password: "Mot de passe",
2020
+ passwordPlaceholder: "Entrez votre mot de passe",
2021
+ rePassword: "Confirmer le mot de passe",
2022
+ rePasswordPlaceholder: "Ressaisissez le mot de passe",
2023
+ recoverTitle: "Restaurer le portefeuille",
2024
+ recoverTips: "Entrez votre mot de passe pour restaurer le portefeuille",
2025
+ bindWith: "Lier avec le portefeuille {name}",
2026
+ loginWith: "Connexion avec le portefeuille {name}",
2027
+ editUsernameTitle: "Modifier le nom d'utilisateur",
2028
+ setUsernameTitle: "D\xE9finir un nom d'utilisateur",
2029
+ username: "Nom d'utilisateur",
2030
+ usernamePlaceholder: "Entrez votre nom d'utilisateur",
2031
+ usernameValidError: "Le nom peut contenir des lettres, chiffres et caract\xE8res",
2032
+ usernameLengthError: "Le nom doit comporter au moins 2 caract\xE8res",
2033
+ confirm: "Confirmer",
2034
+ nextTime: "La prochaine fois",
2035
+ setUsername: "D\xE9finir un nom d'utilisateur",
2036
+ disconnect: "D\xE9connecter",
2037
+ CEXBindTitle: "Lier l'API {type}",
2038
+ CEXBindAttention: "Attention :",
2039
+ CEXBindTips1: "1. Veuillez lier l'API avec des permissions en lecture seule.",
2040
+ CEXBindTips2: "2. Votre API peut \xEAtre obsol\xE8te, il est pr\xE9f\xE9rable d'utiliser une API \xE0 long terme.",
2041
+ CEXBindTips3: "3. Une seule API peut \xEAtre li\xE9e au m\xEAme \xE9change \xE0 la fois.",
2042
+ CEXBindApiKey: "Cl\xE9 API",
2043
+ CEXBindApiSecretKey: "Cl\xE9 Secr\xE8te API",
2044
+ CEXBindApiPassphrase: "Phrase secr\xE8te API",
2045
+ cancel: "Annuler",
2046
+ walletLoading: "Le service de portefeuille est en cours de chargement"
2047
+ };
2048
+
2049
+ // src/i18n/ja.json
2050
+ var ja_default = {
2051
+ email: "\u30E1\u30FC\u30EB",
2052
+ emailAddress: "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9",
2053
+ emailAddressPlaceholder: "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044",
2054
+ continue: "\u7D9A\u3051\u308B",
2055
+ send: "\u9001\u4FE1",
2056
+ resend: "\u518D\u9001\u4FE1",
2057
+ sendCodeErrorTip: "\u30B3\u30FC\u30C9\u9001\u4FE1\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {error}",
2058
+ sendEmailTips: "\u78BA\u8A8D\u30B3\u30FC\u30C9\u3092\u30E1\u30FC\u30EB\u306B\u9001\u4FE1\u3057\u307E\u3057\u305F",
2059
+ verificationCode: "\u78BA\u8A8D\u30B3\u30FC\u30C9",
2060
+ codePlaceholder: "\u30B3\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044",
2061
+ wallet: "\u30A6\u30A9\u30EC\u30C3\u30C8",
2062
+ otherLoginMethods: "\u305D\u306E\u4ED6\u306E\u30ED\u30B0\u30A4\u30F3\u65B9\u6CD5",
2063
+ login: "\u30ED\u30B0\u30A4\u30F3",
2064
+ user: "\u30E6\u30FC\u30B6\u30FC",
2065
+ loginTitle: "\u30ED\u30B0\u30A4\u30F3 / \u767B\u9332",
2066
+ loginTips: "\u4EE5\u4E0B\u306E\u65B9\u6CD5\u3067\u30ED\u30B0\u30A4\u30F3\u3067\u304D\u307E\u3059",
2067
+ passwordMinError: "\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u6700\u4F4E {length} \u6587\u5B57\u5FC5\u8981\u3067\u3059",
2068
+ passwordMatchError: "\u5165\u529B\u3055\u308C\u305F\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u4E00\u81F4\u3057\u307E\u305B\u3093",
2069
+ passwordTitle: "\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u8A2D\u5B9A",
2070
+ passwordTips: "\u30A6\u30A9\u30EC\u30C3\u30C8\u5FA9\u5143\u7528\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",
2071
+ password: "\u30D1\u30B9\u30EF\u30FC\u30C9",
2072
+ passwordPlaceholder: "\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044",
2073
+ rePassword: "\u30D1\u30B9\u30EF\u30FC\u30C9\u78BA\u8A8D",
2074
+ rePasswordPlaceholder: "\u518D\u5EA6\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044",
2075
+ recoverTitle: "\u30A6\u30A9\u30EC\u30C3\u30C8\u3092\u5FA9\u5143",
2076
+ recoverTips: "\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u30A6\u30A9\u30EC\u30C3\u30C8\u3092\u5FA9\u5143\u3057\u3066\u304F\u3060\u3055\u3044",
2077
+ bindWith: "{name}\u30A6\u30A9\u30EC\u30C3\u30C8\u3068\u9023\u643A",
2078
+ loginWith: "{name}\u30A6\u30A9\u30EC\u30C3\u30C8\u3067\u30ED\u30B0\u30A4\u30F3",
2079
+ editUsernameTitle: "\u30E6\u30FC\u30B6\u30FC\u540D\u3092\u7DE8\u96C6",
2080
+ setUsernameTitle: "\u30E6\u30FC\u30B6\u30FC\u540D\u3092\u8A2D\u5B9A",
2081
+ username: "\u30E6\u30FC\u30B6\u30FC\u540D",
2082
+ usernamePlaceholder: "\u30E6\u30FC\u30B6\u30FC\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044",
2083
+ usernameValidError: "\u540D\u524D\u306F\u6587\u5B57\u3001\u6570\u5B57\u3001\u8A18\u53F7\u3067\u69CB\u6210\u3067\u304D\u307E\u3059",
2084
+ usernameLengthError: "2\u6587\u5B57\u4EE5\u4E0A\u3067\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044",
2085
+ confirm: "\u78BA\u8A8D",
2086
+ nextTime: "\u6B21\u56DE",
2087
+ setUsername: "\u30E6\u30FC\u30B6\u30FC\u540D\u3092\u8A2D\u5B9A",
2088
+ disconnect: "\u5207\u65AD",
2089
+ CEXBindTitle: "{type} API \u3092\u30D0\u30A4\u30F3\u30C9",
2090
+ CEXBindAttention: "\u6CE8\u610F\uFF1A",
2091
+ CEXBindTips1: "1. \u8AAD\u307F\u53D6\u308A\u5C02\u7528\u306E\u6A29\u9650\u3067 API \u3092\u30D0\u30A4\u30F3\u30C9\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
2092
+ CEXBindTips2: "2. API \u304C\u53E4\u3044\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u9577\u671F\u9593\u4F7F\u7528\u53EF\u80FD\u306A API \u3092\u4F7F\u7528\u3059\u308B\u3053\u3068\u3092\u304A\u52E7\u3081\u3057\u307E\u3059\u3002",
2093
+ CEXBindTips3: "3. \u540C\u3058\u53D6\u5F15\u6240\u306B\u540C\u6642\u306B\u30D0\u30A4\u30F3\u30C9\u3067\u304D\u308B API \u306F1\u3064\u3060\u3051\u3067\u3059\u3002",
2094
+ CEXBindApiKey: "API \u30AD\u30FC",
2095
+ CEXBindApiSecretKey: "API \u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u30AD\u30FC",
2096
+ CEXBindApiPassphrase: "API \u30D1\u30B9\u30D5\u30EC\u30FC\u30BA",
2097
+ cancel: "\u30AD\u30E3\u30F3\u30BB\u30EB",
2098
+ walletLoading: "\u30A6\u30A9\u30EC\u30C3\u30C8\u30B5\u30FC\u30D3\u30B9\u3092\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059"
2099
+ };
2100
+
2101
+ // src/i18n/ko.json
2102
+ var ko_default = {
2103
+ email: "\uC774\uBA54\uC77C",
2104
+ emailAddress: "\uC774\uBA54\uC77C \uC8FC\uC18C",
2105
+ emailAddressPlaceholder: "\uC774\uBA54\uC77C \uC8FC\uC18C\uB97C \uC785\uB825\uD558\uC138\uC694",
2106
+ continue: "\uACC4\uC18D\uD558\uAE30",
2107
+ send: "\uBCF4\uB0B4\uAE30",
2108
+ resend: "\uC7AC\uC804\uC1A1",
2109
+ sendCodeErrorTip: "\uCF54\uB4DC \uC804\uC1A1 \uC2E4\uD328: {error}",
2110
+ sendEmailTips: "\uC778\uC99D \uCF54\uB4DC\uB97C \uC774\uBA54\uC77C\uB85C \uBCF4\uB0C8\uC2B5\uB2C8\uB2E4",
2111
+ verificationCode: "\uC778\uC99D \uCF54\uB4DC",
2112
+ codePlaceholder: "\uCF54\uB4DC\uB97C \uC785\uB825\uD558\uC138\uC694",
2113
+ wallet: "\uC9C0\uAC11",
2114
+ otherLoginMethods: "\uB2E4\uB978 \uB85C\uADF8\uC778 \uBC29\uBC95",
2115
+ login: "\uB85C\uADF8\uC778",
2116
+ user: "\uC0AC\uC6A9\uC790",
2117
+ loginTitle: "\uB85C\uADF8\uC778 / \uD68C\uC6D0\uAC00\uC785",
2118
+ loginTips: "\uB2E4\uC74C \uBC29\uBC95\uC73C\uB85C \uB85C\uADF8\uC778\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4",
2119
+ passwordMinError: "\uBE44\uBC00\uBC88\uD638\uB294 \uCD5C\uC18C {length}\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4",
2120
+ passwordMatchError: "\uB450 \uBE44\uBC00\uBC88\uD638\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
2121
+ passwordTitle: "\uBE44\uBC00\uBC88\uD638 \uC124\uC815",
2122
+ passwordTips: "\uC9C0\uAC11 \uBCF5\uAD6C\uC5D0 \uC0AC\uC6A9\uD560 \uBE44\uBC00\uBC88\uD638\uB97C \uC124\uC815\uD558\uC138\uC694",
2123
+ password: "\uBE44\uBC00\uBC88\uD638",
2124
+ passwordPlaceholder: "\uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD558\uC138\uC694",
2125
+ rePassword: "\uBE44\uBC00\uBC88\uD638 \uD655\uC778",
2126
+ rePasswordPlaceholder: "\uBE44\uBC00\uBC88\uD638\uB97C \uB2E4\uC2DC \uC785\uB825\uD558\uC138\uC694",
2127
+ recoverTitle: "\uC9C0\uAC11 \uBCF5\uAD6C",
2128
+ recoverTips: "\uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD574 \uC9C0\uAC11\uC744 \uBCF5\uAD6C\uD558\uC138\uC694",
2129
+ bindWith: "{name} \uC9C0\uAC11\uACFC \uC5F0\uACB0",
2130
+ loginWith: "{name} \uC9C0\uAC11\uC73C\uB85C \uB85C\uADF8\uC778",
2131
+ editUsernameTitle: "\uC0AC\uC6A9\uC790 \uC774\uB984 \uC218\uC815",
2132
+ setUsernameTitle: "\uC0AC\uC6A9\uC790 \uC774\uB984 \uC124\uC815",
2133
+ username: "\uC0AC\uC6A9\uC790 \uC774\uB984",
2134
+ usernamePlaceholder: "\uC0AC\uC6A9\uC790 \uC774\uB984\uC744 \uC785\uB825\uD558\uC138\uC694",
2135
+ usernameValidError: "\uC774\uB984\uC740 \uBB38\uC790, \uC22B\uC790 \uBC0F \uD2B9\uC218\uBB38\uC790\uB85C \uAD6C\uC131\uB420 \uC218 \uC788\uC2B5\uB2C8\uB2E4",
2136
+ usernameLengthError: "\uC774\uB984\uC740 \uCD5C\uC18C 2\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4",
2137
+ confirm: "\uD655\uC778",
2138
+ nextTime: "\uB2E4\uC74C\uC5D0",
2139
+ setUsername: "\uC0AC\uC6A9\uC790 \uC774\uB984 \uC124\uC815",
2140
+ disconnect: "\uC5F0\uACB0 \uB04A\uAE30",
2141
+ CEXBindTitle: "{type} API \uC5F0\uACB0",
2142
+ CEXBindAttention: "\uC8FC\uC758:",
2143
+ CEXBindTips1: "1. \uC77D\uAE30 \uC804\uC6A9 \uAD8C\uD55C\uC73C\uB85C API\uB97C \uC5F0\uACB0\uD574\uC8FC\uC138\uC694.",
2144
+ CEXBindTips2: "2. API\uAC00 \uC624\uB798\uB418\uC5C8\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC7A5\uAE30\uC801\uC778 API\uB97C \uC0AC\uC6A9\uD558\uB294 \uAC83\uC774 \uC88B\uC2B5\uB2C8\uB2E4.",
2145
+ CEXBindTips3: "3. \uB3D9\uC77C\uD55C \uAC70\uB798\uC18C\uC5D0 \uB3D9\uC2DC\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC788\uB294 API\uB294 \uD558\uB098\uBFD0\uC785\uB2C8\uB2E4.",
2146
+ CEXBindApiKey: "API \uD0A4",
2147
+ CEXBindApiSecretKey: "API \uBE44\uBC00 \uD0A4",
2148
+ CEXBindApiPassphrase: "API \uC554\uD638 \uAD6C\uBB38",
2149
+ cancel: "\uCDE8\uC18C",
2150
+ walletLoading: "\uC9C0\uAC11 \uC11C\uBE44\uC2A4\uB97C \uBD88\uB7EC\uC624\uB294 \uC911"
2151
+ };
2152
+
2153
+ // src/i18n/vi.json
2154
+ var vi_default = {
2155
+ email: "Email",
2156
+ emailAddress: "\u0110\u1ECBa ch\u1EC9 Email",
2157
+ emailAddressPlaceholder: "Nh\u1EADp \u0111\u1ECBa ch\u1EC9 Email c\u1EE7a b\u1EA1n",
2158
+ continue: "Ti\u1EBFp t\u1EE5c",
2159
+ send: "G\u1EEDi",
2160
+ resend: "G\u1EEDi l\u1EA1i",
2161
+ sendCodeErrorTip: "G\u1EEDi m\xE3 th\u1EA5t b\u1EA1i: {error}",
2162
+ sendEmailTips: "Ch\xFAng t\xF4i \u0111\xE3 g\u1EEDi m\xE3 x\xE1c minh \u0111\u1EBFn email c\u1EE7a b\u1EA1n",
2163
+ verificationCode: "M\xE3 x\xE1c minh",
2164
+ codePlaceholder: "Nh\u1EADp m\xE3",
2165
+ wallet: "V\xED",
2166
+ otherLoginMethods: "Ph\u01B0\u01A1ng th\u1EE9c \u0111\u0103ng nh\u1EADp kh\xE1c",
2167
+ login: "\u0110\u0103ng nh\u1EADp",
2168
+ user: "Ng\u01B0\u1EDDi d\xF9ng",
2169
+ loginTitle: "\u0110\u0103ng nh\u1EADp / \u0110\u0103ng k\xFD",
2170
+ loginTips: "B\u1EA1n c\xF3 th\u1EC3 s\u1EED d\u1EE5ng c\xE1c ph\u01B0\u01A1ng th\u1EE9c sau",
2171
+ passwordMinError: "M\u1EADt kh\u1EA9u ph\u1EA3i c\xF3 \xEDt nh\u1EA5t {length} k\xFD t\u1EF1",
2172
+ passwordMatchError: "Hai m\u1EADt kh\u1EA9u kh\xF4ng kh\u1EDBp",
2173
+ passwordTitle: "T\u1EA1o m\u1EADt kh\u1EA9u",
2174
+ passwordTips: "Vui l\xF2ng \u0111\u1EB7t m\u1EADt kh\u1EA9u \u0111\u1EC3 kh\xF4i ph\u1EE5c v\xED",
2175
+ password: "M\u1EADt kh\u1EA9u",
2176
+ passwordPlaceholder: "Nh\u1EADp m\u1EADt kh\u1EA9u c\u1EE7a b\u1EA1n",
2177
+ rePassword: "X\xE1c nh\u1EADn m\u1EADt kh\u1EA9u",
2178
+ rePasswordPlaceholder: "Nh\u1EADp l\u1EA1i m\u1EADt kh\u1EA9u",
2179
+ recoverTitle: "Kh\xF4i ph\u1EE5c v\xED",
2180
+ recoverTips: "Nh\u1EADp m\u1EADt kh\u1EA9u \u0111\u1EC3 kh\xF4i ph\u1EE5c v\xED",
2181
+ bindWith: "Li\xEAn k\u1EBFt v\u1EDBi v\xED {name}",
2182
+ loginWith: "\u0110\u0103ng nh\u1EADp b\u1EB1ng v\xED {name}",
2183
+ editUsernameTitle: "Ch\u1EC9nh s\u1EEDa t\xEAn ng\u01B0\u1EDDi d\xF9ng",
2184
+ setUsernameTitle: "\u0110\u1EB7t t\xEAn ng\u01B0\u1EDDi d\xF9ng",
2185
+ username: "T\xEAn ng\u01B0\u1EDDi d\xF9ng",
2186
+ usernamePlaceholder: "Nh\u1EADp t\xEAn ng\u01B0\u1EDDi d\xF9ng c\u1EE7a b\u1EA1n",
2187
+ usernameValidError: "T\xEAn ch\u1EC9 \u0111\u01B0\u1EE3c ch\u1EE9a ch\u1EEF, s\u1ED1 v\xE0 k\xFD t\u1EF1",
2188
+ usernameLengthError: "T\xEAn ph\u1EA3i d\xE0i \xEDt nh\u1EA5t 2 k\xFD t\u1EF1",
2189
+ confirm: "X\xE1c nh\u1EADn",
2190
+ nextTime: "L\u1EA7n sau",
2191
+ setUsername: "\u0110\u1EB7t t\xEAn ng\u01B0\u1EDDi d\xF9ng",
2192
+ disconnect: "Ng\u1EAFt k\u1EBFt n\u1ED1i",
2193
+ CEXBindTitle: "Li\xEAn k\u1EBFt API {type}",
2194
+ CEXBindAttention: "L\u01B0u \xFD:",
2195
+ CEXBindTips1: "1. Vui l\xF2ng li\xEAn k\u1EBFt API v\u1EDBi quy\u1EC1n ch\u1EC9 \u0111\u1ECDc.",
2196
+ CEXBindTips2: "2. API c\u1EE7a b\u1EA1n c\xF3 th\u1EC3 \u0111\xE3 l\u1ED7i th\u1EDDi. T\u1ED1t h\u01A1n l\xE0 s\u1EED d\u1EE5ng API d\xE0i h\u1EA1n.",
2197
+ CEXBindTips3: "3. Ch\u1EC9 c\xF3 th\u1EC3 li\xEAn k\u1EBFt m\u1ED9t API v\u1EDBi c\xF9ng m\u1ED9t s\xE0n giao d\u1ECBch t\u1EA1i m\u1ED9t th\u1EDDi \u0111i\u1EC3m.",
2198
+ CEXBindApiKey: "Kh\xF3a API",
2199
+ CEXBindApiSecretKey: "Kh\xF3a b\xED m\u1EADt API",
2200
+ CEXBindApiPassphrase: "C\u1EE5m m\u1EADt kh\u1EA9u API",
2201
+ cancel: "H\u1EE7y",
2202
+ walletLoading: "D\u1ECBch v\u1EE5 v\xED \u0111ang t\u1EA3i"
2203
+ };
2204
+
2205
+ // src/i18n/es.json
2206
+ var es_default = {
2207
+ email: "Correo",
2208
+ emailAddress: "Direcci\xF3n de correo",
2209
+ emailAddressPlaceholder: "Introduce tu direcci\xF3n de correo",
2210
+ continue: "Continuar",
2211
+ send: "Enviar",
2212
+ resend: "Reenviar",
2213
+ sendCodeErrorTip: "Error al enviar el c\xF3digo: {error}",
2214
+ sendEmailTips: "Hemos enviado un c\xF3digo de verificaci\xF3n a tu correo",
2215
+ verificationCode: "C\xF3digo de verificaci\xF3n",
2216
+ codePlaceholder: "Introduce el c\xF3digo",
2217
+ wallet: "Cartera",
2218
+ otherLoginMethods: "Otros m\xE9todos de inicio de sesi\xF3n",
2219
+ login: "Iniciar sesi\xF3n",
2220
+ user: "Usuario",
2221
+ loginTitle: "Iniciar sesi\xF3n / Registrarse",
2222
+ loginTips: "Puedes usar los siguientes m\xE9todos",
2223
+ passwordMinError: "La contrase\xF1a debe tener al menos {length} caracteres",
2224
+ passwordMatchError: "Las contrase\xF1as no coinciden",
2225
+ passwordTitle: "Establecer contrase\xF1a",
2226
+ passwordTips: "Configura la contrase\xF1a para recuperar tu cartera",
2227
+ password: "Contrase\xF1a",
2228
+ passwordPlaceholder: "Introduce tu contrase\xF1a",
2229
+ rePassword: "Confirmar contrase\xF1a",
2230
+ rePasswordPlaceholder: "Repite la contrase\xF1a",
2231
+ recoverTitle: "Recuperar cartera",
2232
+ recoverTips: "Introduce tu contrase\xF1a para recuperar la cartera",
2233
+ bindWith: "Vincular con la cartera {name}",
2234
+ loginWith: "Iniciar sesi\xF3n con la cartera {name}",
2235
+ editUsernameTitle: "Editar nombre de usuario",
2236
+ setUsernameTitle: "Establecer nombre de usuario",
2237
+ username: "Nombre de usuario",
2238
+ usernamePlaceholder: "Introduce tu nombre de usuario",
2239
+ usernameValidError: "El nombre puede contener letras, n\xFAmeros y caracteres",
2240
+ usernameLengthError: "El nombre debe tener al menos 2 caracteres",
2241
+ confirm: "Confirmar",
2242
+ nextTime: "La pr\xF3xima vez",
2243
+ setUsername: "Establecer nombre de usuario",
2244
+ disconnect: "Desconectar",
2245
+ CEXBindTitle: "Vincular API de {type}",
2246
+ CEXBindAttention: "Atenci\xF3n:",
2247
+ CEXBindTips1: "1. Por favor, vincula la API con permisos de solo lectura.",
2248
+ CEXBindTips2: "2. Tu API puede estar desactualizada, es mejor usar una API a largo plazo.",
2249
+ CEXBindTips3: "3. Solo se puede vincular una API al mismo intercambio a la vez.",
2250
+ CEXBindApiKey: "Clave API",
2251
+ CEXBindApiSecretKey: "Clave Secreta API",
2252
+ CEXBindApiPassphrase: "Frase de contrase\xF1a API",
2253
+ cancel: "Cancelar",
2254
+ walletLoading: "El servicio de cartera se est\xE1 cargando"
2255
+ };
2256
+
2257
+ // src/i18n/pt.json
2258
+ var pt_default = {
2259
+ email: "Email",
2260
+ emailAddress: "Endere\xE7o de Email",
2261
+ emailAddressPlaceholder: "Digite seu endere\xE7o de email",
2262
+ continue: "Continuar",
2263
+ send: "Enviar",
2264
+ resend: "Reenviar",
2265
+ sendCodeErrorTip: "Falha ao enviar c\xF3digo: {error}",
2266
+ sendEmailTips: "Enviamos um c\xF3digo de verifica\xE7\xE3o para seu email",
2267
+ verificationCode: "C\xF3digo de Verifica\xE7\xE3o",
2268
+ codePlaceholder: "Digite o c\xF3digo",
2269
+ wallet: "Carteira",
2270
+ otherLoginMethods: "Outros m\xE9todos de login",
2271
+ login: "Entrar",
2272
+ user: "Usu\xE1rio",
2273
+ loginTitle: "Entrar / Registrar",
2274
+ loginTips: "Voc\xEA pode usar os m\xE9todos abaixo",
2275
+ passwordMinError: "A senha deve ter pelo menos {length} caracteres",
2276
+ passwordMatchError: "As senhas digitadas n\xE3o coincidem",
2277
+ passwordTitle: "Definir Senha",
2278
+ passwordTips: "Configure uma senha para recuperar sua carteira",
2279
+ password: "Senha",
2280
+ passwordPlaceholder: "Digite sua senha",
2281
+ rePassword: "Confirmar Senha",
2282
+ rePasswordPlaceholder: "Digite a senha novamente",
2283
+ recoverTitle: "Recuperar Carteira",
2284
+ recoverTips: "Digite sua senha para recuperar a carteira",
2285
+ bindWith: "Vincular com Carteira {name}",
2286
+ loginWith: "Entrar com Carteira {name}",
2287
+ editUsernameTitle: "Editar Nome de Usu\xE1rio",
2288
+ setUsernameTitle: "Definir Nome de Usu\xE1rio",
2289
+ username: "Nome de Usu\xE1rio",
2290
+ usernamePlaceholder: "Digite seu nome de usu\xE1rio",
2291
+ usernameValidError: "O nome pode conter letras, n\xFAmeros e caracteres",
2292
+ usernameLengthError: "Deve ter no m\xEDnimo 2 caracteres",
2293
+ confirm: "Confirmar",
2294
+ nextTime: "Pr\xF3xima vez",
2295
+ setUsername: "Definir Nome de Usu\xE1rio",
2296
+ disconnect: "Desconectar",
2297
+ CEXBindTitle: "Vincular API {type}",
2298
+ CEXBindAttention: "Aten\xE7\xE3o:",
2299
+ CEXBindTips1: "1. Por favor, vincule a API com permiss\xF5es de leitura apenas.",
2300
+ CEXBindTips2: "2. Sua API pode estar desatualizada. \xC9 melhor usar uma API de longo prazo.",
2301
+ CEXBindTips3: "3. Apenas uma API pode ser vinculada ao mesmo c\xE2mbio ao mesmo tempo.",
2302
+ CEXBindApiKey: "Chave API",
2303
+ CEXBindApiSecretKey: "Chave Secreta API",
2304
+ CEXBindApiPassphrase: "Senha de API",
2305
+ cancel: "Cancelar",
2306
+ walletLoading: "O servi\xE7o de carteira est\xE1 carregando"
2307
+ };
2308
+
2309
+ // src/i18n/index.ts
2310
+ var messages = {
2311
+ en: en_default,
2312
+ zh: zh_default,
2313
+ tw: tw_default,
2314
+ fr: fr_default,
2315
+ ja: ja_default,
2316
+ ko: ko_default,
2317
+ vi: vi_default,
2318
+ es: es_default,
2319
+ pt: pt_default
2320
+ };
2321
+
2322
+ // src/MatchContext.tsx
2323
+ import { jsx as jsx10 } from "react/jsx-runtime";
2324
+ var queryClient = new QueryClient();
2325
+ var MatchContext = createContext3(void 0);
2326
+ var MatchProvider = ({
2327
+ children,
2328
+ appid,
2329
+ events,
2330
+ theme = "light",
2331
+ endpoints,
2332
+ locale,
2333
+ wallet
2334
+ }) => {
2335
+ const { login, endpoints: realEndPoints, locale: realLocale } = useInit({
2336
+ theme,
2337
+ appid,
2338
+ events,
2339
+ endpoints,
2340
+ locale
2341
+ });
2342
+ useWalletInit({
2343
+ config: wallet
2344
+ });
2345
+ return /* @__PURE__ */ jsx10(IntlProvider, { locale: realLocale, messages: messages[realLocale], children: /* @__PURE__ */ jsx10(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx10(
2346
+ MatchContext.Provider,
2347
+ {
2348
+ value: {
2349
+ appid,
2350
+ endpoints: realEndPoints,
2351
+ events,
2352
+ login,
2353
+ theme,
2354
+ locale: realLocale
2355
+ },
2356
+ children: /* @__PURE__ */ jsx10(context_default, { children })
2357
+ }
2358
+ ) }) });
2359
+ };
2360
+ var useMatch = () => {
2361
+ const context = useContext3(MatchContext);
2362
+ if (context === void 0) {
2363
+ throw new Error("useMatch must be used within a MatchProvider");
2364
+ }
2365
+ return context;
2366
+ };
2367
+
2368
+ // src/hooks/useUserInfo.tsx
2369
+ function useUserInfo() {
2370
+ const {
2371
+ appid,
2372
+ token,
2373
+ mid,
2374
+ did,
2375
+ logout: logoutStore,
2376
+ setOverview,
2377
+ overview,
2378
+ address,
2379
+ endpoints,
2380
+ locale,
2381
+ refreshOverview
2382
+ } = useLocalStore_default();
2383
+ const { events, login } = useMatch();
2384
+ const { open: SOLOpen } = useSOLModalStore();
2385
+ const { open: TRONOpen } = useTRONModalStore();
2386
+ const { open: TONOpen } = useTONModalStore();
2387
+ const { open: BTCOpen } = useBTCModalStore();
2388
+ const { open: CEXBindOpen } = useCEXBindModalStore();
2389
+ const walletModalStore = useWalletModalStore();
2390
+ const isLogin = useMemo5(() => !!token && !!overview, [token, overview]);
2391
+ const logout = async () => {
2392
+ try {
2393
+ await toLogoutApi();
2394
+ } catch (err) {
2395
+ console.error("logout", err);
2396
+ }
2397
+ logoutStore();
2398
+ events && events.onLogout && events.onLogout();
2399
+ eventManager_default.emit("onLogout");
2400
+ };
2401
+ const loginByMethod = async (method) => {
2402
+ const link = `${endpoints.back}api/v1/auth/${method == "youtube" ? "google" : method}?appid=${appid}&provider=${method == "youtube" ? "google" : method}&redirect=${encodeURIComponent(endpoints.auth + "login/" + method)}&authorization=${(/* @__PURE__ */ new Date()).getTime()}${method == "youtube" ? "&auth_type=youtube" : ""}`;
2403
+ matchlog_default.log("link", link);
2404
+ return window.open(
2405
+ link,
2406
+ // Replace with the actual authorization URL
2407
+ "authWindow",
2408
+ "width=800,height=600"
2409
+ );
2410
+ };
2411
+ const loginByTwitter = () => {
2412
+ return loginByMethod("twitter");
2413
+ };
2414
+ const loginByGoogle = () => {
2415
+ return loginByMethod("google");
2416
+ };
2417
+ const loginByWallet = async () => {
2418
+ return window.open(`${endpoints.auth}login/wallet?appid=${appid}`);
2419
+ };
2420
+ const loginByTelegram = async () => {
2421
+ return window.open(
2422
+ `${endpoints.auth}login/telegram?appid=${appid}`,
2423
+ // Replace with the actual authorization URL
2424
+ "authWindow",
2425
+ "width=800,height=600"
2426
+ );
2427
+ };
2428
+ const loginMethod = async (method, extra) => {
2429
+ switch (method) {
2430
+ case "wallet":
2431
+ return walletModalStore.open("login", extra?.methods);
2432
+ case "evm":
2433
+ return window.open(`${endpoints.auth}login/wallet?appid=${appid}`);
2434
+ case "sol":
2435
+ return SOLOpen("login");
2436
+ case "tron":
2437
+ return TRONOpen("login");
2438
+ case "ton":
2439
+ return TONOpen("login");
2440
+ case "btc":
2441
+ return BTCOpen("login");
2442
+ case "telegram":
2443
+ return await loginByTelegram();
2444
+ case "youtube":
2445
+ case "twitter":
2446
+ case "google":
2447
+ case "discord":
2448
+ case "github":
2449
+ case "linkedin":
2450
+ case "facebook":
2451
+ return await loginByMethod(method);
2452
+ default:
2453
+ throw new Error("unsupported method");
2454
+ }
2455
+ };
2456
+ const getLoginEmailCode = async (email) => {
2457
+ const res = await getEmailCodeApi(email);
2458
+ if (res && res.data && isSuccess(res)) {
2459
+ window.sessionStorage.setItem("loginkey", res.data.key);
2460
+ return res.data.key;
2461
+ }
2462
+ return "";
2463
+ };
2464
+ const loginByEmail = async ({
2465
+ email,
2466
+ code
2467
+ }) => {
2468
+ try {
2469
+ const obj = {
2470
+ email,
2471
+ verification_key: window.sessionStorage.getItem("loginkey"),
2472
+ verification_code: code
2473
+ };
2474
+ const res = await verifyEmailCodeApi(obj);
2475
+ if (res && res.data && isSuccess(res)) {
2476
+ await login({
2477
+ mid: res.data.mid,
2478
+ token: `${res.data.token_type} ${res.data.access_token}`
2479
+ });
2480
+ return true;
2481
+ } else {
2482
+ throw new Error(res.message);
2483
+ }
2484
+ } catch (error) {
2485
+ console.error("loginByEmail", error);
2486
+ throw error;
2487
+ }
2488
+ return false;
2489
+ };
2490
+ const bindWallet = async () => {
2491
+ if (!token) {
2492
+ throw new Error("You must login first");
2493
+ }
2494
+ return window.open(`${endpoints.auth}bind/wallet?appid=${appid}&st=` + encodeURIComponent(encodeBase64(token)));
2495
+ };
2496
+ const bindTelegram = async () => {
2497
+ if (!token) {
2498
+ throw new Error("You must login first");
2499
+ }
2500
+ const authWindow = window.open(
2501
+ `${endpoints.auth}bind/telegram?appid=${appid}&st=` + encodeURIComponent(encodeBase64(token)),
2502
+ // Replace with the actual authorization URL
2503
+ "authWindow",
2504
+ "width=800,height=600"
2505
+ );
2506
+ };
2507
+ const auth = async () => {
2508
+ const res = await getAuthInfoApi();
2509
+ if (isSuccess(res)) {
2510
+ return res.data;
2511
+ }
2512
+ throw new Error(res.message);
2513
+ };
2514
+ const bind = async (method, extra) => {
2515
+ if (!token) {
2516
+ throw new Error("You must login first");
2517
+ }
2518
+ switch (method) {
2519
+ case "wallet":
2520
+ return walletModalStore.open("bind", extra?.methods);
2521
+ case "evm":
2522
+ return window.open(`${endpoints.auth}bind/wallet?appid=${appid}&st=` + encodeURIComponent(encodeBase64(token)));
2523
+ case "sol":
2524
+ return SOLOpen("bind");
2525
+ case "tron":
2526
+ return TRONOpen("bind");
2527
+ case "ton":
2528
+ return TONOpen("bind");
2529
+ case "btc":
2530
+ return BTCOpen("bind");
2531
+ case "telegram":
2532
+ return await bindTelegram();
2533
+ case "twitter":
2534
+ case "google":
2535
+ case "discord":
2536
+ case "github":
2537
+ case "linkedin":
2538
+ case "facebook":
2539
+ case "youtube":
2540
+ const link = `${endpoints.back}api/v1/auth/${method == "youtube" ? "google" : method}?appid=${appid}&provider=${method == "youtube" ? "google" : method}&redirect=${encodeURIComponent(endpoints.auth + "bind/" + method)}&authorization=${token.includes("Bearer ") ? token.split(" ")[1] : token}${method == "youtube" ? "&auth_type=youtube" : ""}`;
2541
+ matchlog_default.log("link", link);
2542
+ return window.open(
2543
+ link,
2544
+ "authWindow",
2545
+ "width=800,height=600"
2546
+ );
2547
+ default:
2548
+ throw new Error("unsupported method");
2549
+ }
2550
+ };
2551
+ const bindCex = (type) => {
2552
+ return CEXBindOpen(type);
2553
+ };
2554
+ const getAuthInfo = async (method) => {
2555
+ const element_id = "auth_iframe";
2556
+ if (document.getElementById(element_id)) {
2557
+ document.getElementById(element_id).remove();
2558
+ }
2559
+ const iframe = document.createElement("iframe");
2560
+ iframe.id = element_id;
2561
+ iframe.src = `${endpoints.auth}auth?appid=${appid}&method=${method}&locale=${locale}&token=${encodeURIComponent(encodeBase64(token))}`;
2562
+ iframe.style.width = "100vw";
2563
+ iframe.style.height = "100vh";
2564
+ iframe.style.position = "fixed";
2565
+ iframe.style.top = "0";
2566
+ iframe.style.left = "0";
2567
+ iframe.style.zIndex = "9999";
2568
+ iframe.style.border = "none";
2569
+ iframe.allowTransparency = "true";
2570
+ document.body.appendChild(iframe);
2571
+ return new Promise((resolve, reject) => {
2572
+ const authMessageHandle = (event) => {
2573
+ if (endpoints.auth.includes(event.origin)) {
2574
+ const res = event.data;
2575
+ if (res.source == "match-auth") {
2576
+ window.removeEventListener("message", authMessageHandle);
2577
+ if (res.status == "success") {
2578
+ resolve({
2579
+ ...res.data,
2580
+ method: res.method,
2581
+ appid: res.appid,
2582
+ did
2583
+ });
2584
+ } else {
2585
+ reject(new Error(res.message));
2586
+ }
2587
+ iframe.remove();
2588
+ }
2589
+ }
2590
+ };
2591
+ window.addEventListener("message", authMessageHandle);
2592
+ });
2593
+ };
2594
+ return {
2595
+ loginByMethod,
2596
+ loginByTelegram,
2597
+ loginByTwitter,
2598
+ loginByGoogle,
2599
+ loginByWallet,
2600
+ loginByEmail,
2601
+ bindWallet,
2602
+ bindTelegram,
2603
+ token,
2604
+ mid,
2605
+ did,
2606
+ address,
2607
+ isLogin,
2608
+ logout,
2609
+ getLoginEmailCode,
2610
+ refreshOverview,
2611
+ overview,
2612
+ bindCex,
2613
+ username: overview?.username || "",
2614
+ auth,
2615
+ login: loginMethod,
2616
+ bind,
2617
+ getAuthInfo
2618
+ };
2619
+ }
2620
+
2621
+ // src/components/EmailModal/StepVerify.tsx
2622
+ import { useEffect as useEffect10, useMemo as useMemo6, useRef as useRef3, useState as useState9 } from "react";
2623
+
2624
+ // src/config/index.tsx
2625
+ var EMAIL_INTERVAL = 60;
2626
+ var EMAIL_CODE_LENGTH = 6;
2627
+
2628
+ // src/components/EmailModal/StepVerify.tsx
2629
+ import { FormattedMessage as FormattedMessage3, useIntl as useIntl3 } from "react-intl";
2630
+ import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
2631
+ function StepVerify(props) {
2632
+ const intl = useIntl3();
2633
+ const { getLoginEmailCode, loginByEmail } = useUserInfo();
2634
+ const [error, setError] = useState9("");
2635
+ const [code, setCode] = useState9("");
2636
+ const [sending, setSending] = useState9(false);
2637
+ const [submitting, setSubmitting] = useState9(false);
2638
+ const sendTimeRef = useRef3(0);
2639
+ const [sendBtnText, setSendBtnText] = useState9(intl.formatMessage({
2640
+ id: "send"
2641
+ }));
2642
+ const intervalTime = EMAIL_INTERVAL;
2643
+ const codeLength = EMAIL_CODE_LENGTH;
2644
+ const intervalRef = useRef3(null);
2645
+ const isDownMd = useDownMd();
2646
+ const onSend = async () => {
2647
+ if (sendTimeRef.current > 0) {
2648
+ return;
2649
+ }
2650
+ try {
2651
+ setError("");
2652
+ setSending(true);
2653
+ sendTimeRef.current = intervalTime;
2654
+ await getLoginEmailCode(props.email);
2655
+ setSendBtnText(`${sendTimeRef.current}s`);
2656
+ intervalRef.current = setInterval(() => {
2657
+ sendTimeRef.current--;
2658
+ setSendBtnText(`${sendTimeRef.current}s`);
2659
+ if (sendTimeRef.current <= 0) {
2660
+ setSendBtnText(intl.formatMessage({
2661
+ id: "Resend"
2662
+ }));
2663
+ clearInterval(intervalRef.current);
2664
+ setSending(false);
2665
+ }
2666
+ }, 1e3);
2667
+ } catch (err) {
2668
+ console.error("Send email error", err);
2669
+ setError(intl.formatMessage({
2670
+ id: "sendCodeErrorTip"
2671
+ }, { error: err.message }));
2672
+ setSending(false);
2673
+ }
2674
+ };
2675
+ useEffect10(() => {
2676
+ onSend();
2677
+ return () => {
2678
+ if (intervalRef.current) {
2679
+ clearInterval(intervalRef.current);
2680
+ }
2681
+ };
2682
+ }, []);
2683
+ const canContinue = useMemo6(() => {
2684
+ return code.length === codeLength;
2685
+ }, [code]);
2686
+ const onContinue = async () => {
2687
+ if (submitting) {
2688
+ return;
2689
+ }
2690
+ try {
2691
+ setError("");
2692
+ setSubmitting(true);
2693
+ const res = await loginByEmail({
2694
+ email: props.email,
2695
+ code
2696
+ });
2697
+ if (res) {
2698
+ props.onSuccess && props.onSuccess();
2699
+ }
2700
+ setSubmitting(false);
2701
+ } catch (err) {
2702
+ console.error("Verify email code error", err);
2703
+ setError(err.message);
2704
+ setSubmitting(false);
2705
+ }
2706
+ };
2707
+ return /* @__PURE__ */ jsxs8("div", { className: "matchid-email-verify-box", children: [
2708
+ /* @__PURE__ */ jsxs8("div", { className: "matchid-email-verify-header", children: [
2709
+ /* @__PURE__ */ jsx11("div", { className: "matchid-email-verify-header-icon", children: /* @__PURE__ */ jsx11(EmailLineIcon, { size: isDownMd ? 19 : 24 }) }),
2710
+ /* @__PURE__ */ jsxs8("div", { className: "matchid-email-verify-header-content", children: [
2711
+ /* @__PURE__ */ jsx11("div", { className: "matchid-email-verify-header-value", children: props.email }),
2712
+ /* @__PURE__ */ jsx11("div", { className: "matchid-email-verify-header-tips", children: /* @__PURE__ */ jsx11(FormattedMessage3, { id: "sendEmailTips" }) })
2713
+ ] })
2714
+ ] }),
2715
+ /* @__PURE__ */ jsx11(Field, { label: intl.formatMessage({
2716
+ id: "verificationCode"
2717
+ }), error, children: /* @__PURE__ */ jsx11(
2718
+ Input,
2719
+ {
2720
+ placeholder: intl.formatMessage({
2721
+ id: "codePlaceholder"
2722
+ }),
2723
+ className: "matchid-email-verify-field",
2724
+ maxLength: codeLength,
2725
+ onChange: (e) => setCode(e.target.value),
2726
+ value: code,
2727
+ after: /* @__PURE__ */ jsx11(
2728
+ Button,
2729
+ {
2730
+ highlight: true,
2731
+ disabled: sending,
2732
+ style: {
2733
+ height: "100%",
2734
+ borderTopLeftRadius: 0,
2735
+ borderBottomLeftRadius: 0,
2736
+ borderTopRightRadius: "inherit",
2737
+ borderBottomRightRadius: "inherit",
2738
+ width: "80px"
2739
+ },
2740
+ onClick: onSend,
2741
+ children: sendBtnText
2742
+ }
2743
+ )
2744
+ }
2745
+ ) }),
2746
+ /* @__PURE__ */ jsx11(Button, { disabled: !canContinue, highlight: true, block: true, size: "lg", onClick: onContinue, children: /* @__PURE__ */ jsx11(FormattedMessage3, { id: "continue" }) })
2747
+ ] });
2748
+ }
2749
+
2750
+ // src/components/EmailModal/index.tsx
2751
+ import { useIntl as useIntl4 } from "react-intl";
2752
+ import { jsx as jsx12 } from "react/jsx-runtime";
2753
+ function EmailModal({
2754
+ isOpen = false,
2755
+ width = 480,
2756
+ onClose,
2757
+ onBack,
2758
+ onLogin
2759
+ }) {
2760
+ const [step, setStep] = useState10("input");
2761
+ const [emailVal, setEmailVal] = useState10("");
2762
+ const intl = useIntl4();
2763
+ useEffect11(() => {
2764
+ if (!isOpen) {
2765
+ setStep("input");
2766
+ setEmailVal("");
2767
+ }
2768
+ }, [isOpen]);
2769
+ return /* @__PURE__ */ jsx12(
2770
+ ModalWithHeader,
2771
+ {
2772
+ isOpen,
2773
+ width,
2774
+ onClose,
2775
+ title: intl.formatMessage({
2776
+ id: "email"
2777
+ }),
2778
+ onBack: step == "verify" ? () => setStep("input") : onBack,
2779
+ children: step === "input" ? /* @__PURE__ */ jsx12(StepEmail, { email: emailVal, onContinue: (email) => {
2780
+ setEmailVal(email);
2781
+ setStep("verify");
2782
+ } }) : /* @__PURE__ */ jsx12(StepVerify, { email: emailVal, onSuccess: onLogin })
2783
+ }
2784
+ );
2785
+ }
2786
+
2787
+ // src/components/LoginBox/index.tsx
2788
+ import { useMemo as useMemo7, useState as useState11 } from "react";
2789
+ import { FormattedMessage as FormattedMessage4, useIntl as useIntl5 } from "react-intl";
2790
+
2791
+ // src/hooks/useAppConfig.ts
2792
+ import { useQuery as useQuery2 } from "@tanstack/react-query";
2793
+ function useAppConfig() {
2794
+ const query = useQuery2({
2795
+ queryKey: ["appConfig"],
2796
+ queryFn: async () => {
2797
+ const res = await getAppConfigApi();
2798
+ if (!isSuccess(res)) {
2799
+ return null;
2800
+ }
2801
+ return res.data;
2802
+ }
2803
+ });
2804
+ return {
2805
+ isFetched: query.isFetched,
2806
+ isLoading: query.isLoading,
2807
+ ...query.data
2808
+ };
2809
+ }
2810
+
2811
+ // src/components/LoginBox/index.tsx
2812
+ import { Fragment as Fragment2, jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
2813
+ var RecommendItem = ({
2814
+ icon,
2815
+ name,
2816
+ onClick,
2817
+ showChildren = false,
2818
+ children,
2819
+ footer
2820
+ }) => {
2821
+ return /* @__PURE__ */ jsxs9("div", { className: "matchid-login-recommend-method", children: [
2822
+ /* @__PURE__ */ jsxs9("div", { className: "matchid-login-recommend-method-item", onClick, children: [
2823
+ /* @__PURE__ */ jsxs9("div", { className: "matchid-login-recommend-method-content", children: [
2824
+ /* @__PURE__ */ jsx13("div", { className: "matchid-login-recommend-method-icon", children: icon }),
2825
+ /* @__PURE__ */ jsx13("span", { className: "matchid-login-recommend-method-name", children: name })
2826
+ ] }),
2827
+ footer ? footer : children ? /* @__PURE__ */ jsx13(
2828
+ ArrowDownIcon,
2829
+ {
2830
+ className: `matchid-login-recommend-method-arrow ${showChildren ? "matchid-login-recommend-method-arrow-active" : ""}`,
2831
+ size: 20,
2832
+ color: "var(--matchid-arrow-color)"
2833
+ }
2834
+ ) : /* @__PURE__ */ jsx13(
2835
+ ArrowRightIcon,
2836
+ {
2837
+ className: "matchid-login-recommend-method-arrow",
2838
+ size: 20,
2839
+ color: "var(--matchid-arrow-color)"
2840
+ }
2841
+ )
2842
+ ] }),
2843
+ children && /* @__PURE__ */ jsx13(
2844
+ "div",
2845
+ {
2846
+ className: `matchid-login-recommend-method-popover ${showChildren ? "matchid-login-recommend-method-popover-active" : ""}`,
2847
+ children
2848
+ }
2849
+ )
2850
+ ] });
2851
+ };
2852
+ function LoginBox({
2853
+ recommendMethods,
2854
+ methods,
2855
+ walletMethods,
2856
+ inModal = false
2857
+ }) {
2858
+ const config = useAppConfig();
2859
+ const methodConfig = useMemo7(() => {
2860
+ if (recommendMethods || methods || walletMethods) {
2861
+ return {
2862
+ recommendMethods: recommendMethods ? recommendMethods : walletMethods ? ["wallet"] : [],
2863
+ methods: methods || [],
2864
+ walletMethods: walletMethods || []
2865
+ };
2866
+ }
2867
+ if (!config.platform) {
2868
+ return {
2869
+ recommendMethods: [],
2870
+ methods: [],
2871
+ walletMethods: []
2872
+ };
2873
+ }
2874
+ const platform = config.platform.map((p) => {
2875
+ if (p == "x" || p == "X") {
2876
+ return "twitter";
2877
+ }
2878
+ return p.toLowerCase();
2879
+ });
2880
+ console.log("platform", platform);
2881
+ const walletMethodList = WALLET_METHODS.filter((m) => platform.includes(m));
2882
+ let recommendMethodList = walletMethodList.length > 0 ? ["wallet"] : [];
2883
+ let methodList = [];
2884
+ const otherMethodList = platform.filter((m) => !walletMethodList.includes(m));
2885
+ if (otherMethodList.length > 0) {
2886
+ const recommendMethodListLength = recommendMethodList.length;
2887
+ const maxRecommendMethodListLength = 3;
2888
+ if (recommendMethodListLength < maxRecommendMethodListLength) {
2889
+ recommendMethodList = recommendMethodList.concat(otherMethodList.slice(0, Math.min(maxRecommendMethodListLength - recommendMethodListLength, otherMethodList.length)));
2890
+ methodList = otherMethodList.slice(maxRecommendMethodListLength - recommendMethodListLength);
2891
+ } else {
2892
+ methodList = otherMethodList;
2893
+ }
2894
+ }
2895
+ return {
2896
+ recommendMethods: recommendMethodList,
2897
+ methods: methodList,
2898
+ walletMethods: walletMethodList
2899
+ };
2900
+ }, [config.platform, recommendMethods, methods, walletMethods]);
2901
+ const [emailOpen, setEmailOpen] = useState11(false);
2902
+ const { login } = useUserInfo();
2903
+ const [showWallet, setShowWallet] = useState11(false);
2904
+ const intl = useIntl5();
2905
+ const isDownMd = useDownMd();
2906
+ const methodMap = {
2907
+ wallet: {
2908
+ icon: /* @__PURE__ */ jsx13(WalletIcon, { size: isDownMd ? 36 : 40 }),
2909
+ name: intl.formatMessage({ id: "wallet" }),
2910
+ onClick: () => setShowWallet(!showWallet),
2911
+ type: "wallet"
2912
+ },
2913
+ email: {
2914
+ icon: /* @__PURE__ */ jsx13(EmailIcon, { size: isDownMd ? 36 : 40 }),
2915
+ name: intl.formatMessage({ id: "email" }),
2916
+ onClick: () => {
2917
+ setEmailOpen(true);
2918
+ }
2919
+ },
2920
+ google: {
2921
+ icon: /* @__PURE__ */ jsx13(GoogleIcon, { size: isDownMd ? 36 : 40 }),
2922
+ name: "Google",
2923
+ onClick: () => login("google")
2924
+ },
2925
+ twitter: {
2926
+ icon: /* @__PURE__ */ jsx13(XIcon, { size: isDownMd ? 36 : 40 }),
2927
+ name: "X",
2928
+ onClick: () => login("twitter")
2929
+ },
2930
+ telegram: {
2931
+ icon: /* @__PURE__ */ jsx13(TelegramIcon, { size: isDownMd ? 36 : 40 }),
2932
+ name: "Telegram",
2933
+ onClick: () => login("telegram")
2934
+ },
2935
+ github: {
2936
+ icon: /* @__PURE__ */ jsx13(GithubIcon, { size: isDownMd ? 36 : 40 }),
2937
+ name: "Github",
2938
+ onClick: () => login("github")
2939
+ },
2940
+ discord: {
2941
+ icon: /* @__PURE__ */ jsx13(DiscordIcon, { size: isDownMd ? 36 : 40 }),
2942
+ name: "Discord",
2943
+ onClick: () => login("discord")
2944
+ },
2945
+ linkedin: {
2946
+ icon: /* @__PURE__ */ jsx13(LinkedinIcon, { size: isDownMd ? 36 : 40 }),
2947
+ name: "LinkedIn",
2948
+ onClick: () => login("linkedin")
2949
+ },
2950
+ facebook: {
2951
+ icon: /* @__PURE__ */ jsx13(FacebookIcon, { size: isDownMd ? 36 : 40 }),
2952
+ name: "Facebook",
2953
+ onClick: () => login("facebook")
2954
+ },
2955
+ youtube: {
2956
+ icon: /* @__PURE__ */ jsx13(YoutubeIcon, { size: isDownMd ? 36 : 40 }),
2957
+ name: "Youtube",
2958
+ onClick: () => login("youtube")
2959
+ }
2960
+ };
2961
+ const { walletMap } = useWalletConfig();
2962
+ return /* @__PURE__ */ jsxs9(Fragment2, { children: [
2963
+ (!inModal || !emailOpen) && /* @__PURE__ */ jsxs9("div", { className: "matchid-login-box", children: [
2964
+ /* @__PURE__ */ jsx13("div", { className: "matchid-login-recommend-list", children: methodConfig.recommendMethods.map((m) => {
2965
+ return /* @__PURE__ */ jsx13(
2966
+ RecommendItem,
2967
+ {
2968
+ icon: methodMap[m]?.icon,
2969
+ name: methodMap[m]?.name,
2970
+ onClick: methodMap[m]?.onClick,
2971
+ showChildren: m == "wallet" && showWallet,
2972
+ children: m == "wallet" && /* @__PURE__ */ jsxs9(Fragment2, { children: [
2973
+ /* @__PURE__ */ jsx13("div", { className: "matchid-login-recommend-wallet-divider" }),
2974
+ /* @__PURE__ */ jsx13("div", { className: "matchid-login-recommend-wallet-list", children: methodConfig.walletMethods.map((n) => {
2975
+ const m2 = walletMap[n];
2976
+ return /* @__PURE__ */ jsxs9(
2977
+ "div",
2978
+ {
2979
+ className: "matchid-login-recommend-wallet-item",
2980
+ onClick: () => {
2981
+ login(m2.method);
2982
+ },
2983
+ children: [
2984
+ /* @__PURE__ */ jsxs9("div", { className: "matchid-login-recommend-wallet-item-content", children: [
2985
+ /* @__PURE__ */ jsx13("div", { className: "matchid-login-recommend-wallet-item-icon", children: m2.icon }),
2986
+ /* @__PURE__ */ jsx13(
2987
+ "div",
2988
+ {
2989
+ className: "matchid-login-recommend-wallet-item-hover-icon",
2990
+ children: m2.activeIcon
2991
+ }
2992
+ ),
2993
+ /* @__PURE__ */ jsx13(
2994
+ "span",
2995
+ {
2996
+ className: "matchid-login-recommend-wallet-item-name",
2997
+ children: m2.name
2998
+ }
2999
+ )
3000
+ ] }),
3001
+ /* @__PURE__ */ jsx13(
3002
+ ArrowRightIcon,
3003
+ {
3004
+ className: "matchid-login-recommend-wallet-item-arrow",
3005
+ size: 20,
3006
+ color: "var(--matchid-arrow-color)"
3007
+ }
3008
+ )
3009
+ ]
3010
+ },
3011
+ m2.name
3012
+ );
3013
+ }) })
3014
+ ] })
3015
+ },
3016
+ m
3017
+ );
3018
+ }) }),
3019
+ methodConfig.methods.length > 0 && /* @__PURE__ */ jsxs9("div", { className: "matchid-login-other", children: [
3020
+ /* @__PURE__ */ jsx13("div", { className: "matchid-login-other-text", children: /* @__PURE__ */ jsx13(FormattedMessage4, { id: "otherLoginMethods" }) }),
3021
+ /* @__PURE__ */ jsx13("div", { className: "matchid-login-method-box", children: methodConfig.methods.map((m) => {
3022
+ return /* @__PURE__ */ jsx13(
3023
+ "div",
3024
+ {
3025
+ className: "matchid-login-method-item",
3026
+ onClick: methodMap[m]?.onClick,
3027
+ title: methodMap[m]?.name,
3028
+ children: methodMap[m]?.icon
3029
+ },
3030
+ m
3031
+ );
3032
+ }) })
3033
+ ] })
3034
+ ] }),
3035
+ /* @__PURE__ */ jsx13(
3036
+ EmailModal,
3037
+ {
3038
+ isOpen: emailOpen,
3039
+ onClose: () => {
3040
+ setEmailOpen(false);
3041
+ },
3042
+ onBack: inModal ? () => {
3043
+ setEmailOpen(false);
3044
+ } : void 0
3045
+ }
3046
+ )
3047
+ ] });
3048
+ }
3049
+
3050
+ // src/components/LoginButton/index.tsx
3051
+ import { useState as useState13 } from "react";
3052
+
3053
+ // src/components/LoginPanel/index.tsx
3054
+ import { FormattedMessage as FormattedMessage5 } from "react-intl";
3055
+ import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
3056
+ function LoginPanel({
3057
+ header,
3058
+ onClose,
3059
+ ...props
3060
+ }) {
3061
+ const isDownMd = useDownMd();
3062
+ return /* @__PURE__ */ jsxs10("div", { className: "matchid-login-panel", children: [
3063
+ header ? header : /* @__PURE__ */ jsxs10("div", { className: "matchid-login-panel-header", children: [
3064
+ /* @__PURE__ */ jsxs10("div", { className: "matchid-login-panel-header-content", children: [
3065
+ /* @__PURE__ */ jsx14("div", { className: "matchid-login-panel-header-title", children: /* @__PURE__ */ jsx14(FormattedMessage5, { id: "loginTitle" }) }),
3066
+ /* @__PURE__ */ jsx14("div", { className: "matchid-login-panel-header-subtilte", children: /* @__PURE__ */ jsx14(FormattedMessage5, { id: "loginTips" }) })
3067
+ ] }),
3068
+ onClose && /* @__PURE__ */ jsx14("div", { className: "matchid-login-panel-header-close", onClick: onClose, children: /* @__PURE__ */ jsx14(CloseRoundIcon, { size: isDownMd ? 24 : 30 }) })
3069
+ ] }),
3070
+ /* @__PURE__ */ jsx14("div", { className: "matchid-login-panel-divide" }),
3071
+ /* @__PURE__ */ jsx14("div", { className: "matchid-login-panel-box", children: /* @__PURE__ */ jsx14(LoginBox, { ...props }) })
3072
+ ] });
3073
+ }
3074
+
3075
+ // src/components/LoginModal/index.tsx
3076
+ import { jsx as jsx15 } from "react/jsx-runtime";
3077
+ function LoginModal({
3078
+ isOpen = false,
3079
+ width = 480,
3080
+ ...props
3081
+ }) {
3082
+ const { isLogin } = useUserInfo();
3083
+ return /* @__PURE__ */ jsx15(
3084
+ Modal,
3085
+ {
3086
+ isOpen: isOpen && !isLogin,
3087
+ width,
3088
+ children: /* @__PURE__ */ jsx15(LoginPanel, { ...props, inModal: true })
3089
+ }
3090
+ );
3091
+ }
3092
+
3093
+ // src/components/UserPopover/index.tsx
3094
+ import { useState as useState12 } from "react";
3095
+
3096
+ // src/assets/icon/ProfileIcon.tsx
3097
+ import { jsx as jsx16, jsxs as jsxs11 } from "react/jsx-runtime";
3098
+ function ProfileIcon({ size = 24, color = "black", ...props }) {
3099
+ return /* @__PURE__ */ jsxs11("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
3100
+ /* @__PURE__ */ jsx16(
3101
+ "path",
3102
+ {
3103
+ fillRule: "evenodd",
3104
+ clipRule: "evenodd",
3105
+ d: "M7.5 6.75C7.5 4.95507 8.95507 3.5 10.75 3.5C12.5449 3.5 14 4.95507 14 6.75C14 8.54493 12.5449 10 10.75 10C8.95507 10 7.5 8.54493 7.5 6.75ZM10.75 2C8.12665 2 6 4.12665 6 6.75C6 9.37335 8.12665 11.5 10.75 11.5C13.3734 11.5 15.5 9.37335 15.5 6.75C15.5 4.12665 13.3734 2 10.75 2ZM8.75 13C5.57436 13 3 15.5744 3 18.75V19.75C3 20.7165 3.7835 21.5 4.75 21.5H13.6646L13.0292 20.8646C12.7764 20.6118 12.5733 20.3185 12.4263 20H4.75C4.61193 20 4.5 19.8881 4.5 19.75V18.75C4.5 16.4028 6.40279 14.5 8.75 14.5H12.6452C13.0508 13.8858 13.676 13.4295 14.4091 13.243C13.8838 13.0849 13.3268 13 12.75 13H8.75Z",
3106
+ fill: color
3107
+ }
3108
+ ),
3109
+ /* @__PURE__ */ jsx16(
3110
+ "path",
3111
+ {
3112
+ fillRule: "evenodd",
3113
+ clipRule: "evenodd",
3114
+ d: "M19.0677 22.4771L21.4771 20.0677C21.841 19.7038 21.841 19.1139 21.4771 18.75L17.75 15.0229C17.5753 14.8482 17.3383 14.75 17.0911 14.75H14.6818C14.1672 14.75 13.75 15.1672 13.75 15.6818V18.0911C13.75 18.3383 13.8482 18.5753 14.0229 18.75L17.75 22.4771C18.1139 22.841 18.7038 22.841 19.0677 22.4771ZM15.6135 17.3124C15.9995 17.3124 16.3124 16.9995 16.3124 16.6135C16.3124 16.2276 15.9995 15.9147 15.6135 15.9147C15.2276 15.9147 14.9147 16.2276 14.9147 16.6135C14.9147 16.9995 15.2276 17.3124 15.6135 17.3124Z",
3115
+ fill: color
3116
+ }
3117
+ )
3118
+ ] });
3119
+ }
3120
+
3121
+ // src/components/UserPopover/index.tsx
3122
+ import { FormattedMessage as FormattedMessage6, useIntl as useIntl6 } from "react-intl";
3123
+ import { jsx as jsx17, jsxs as jsxs12 } from "react/jsx-runtime";
3124
+ function UserContent() {
3125
+ const { logout, address, username } = useUserInfo();
3126
+ const [logouting, setLogouting] = useState12(false);
3127
+ const onLogout = async () => {
3128
+ if (logouting) return;
3129
+ try {
3130
+ setLogouting(true);
3131
+ await logout();
3132
+ } catch (error) {
3133
+ console.error(error);
3134
+ } finally {
3135
+ setLogouting(false);
3136
+ }
3137
+ };
3138
+ const UserItem = ({
3139
+ children,
3140
+ icon,
3141
+ rightIcon,
3142
+ onClick
3143
+ }) => {
3144
+ return /* @__PURE__ */ jsxs12("div", { className: "matchid-user-popover-item", onClick, children: [
3145
+ /* @__PURE__ */ jsxs12("div", { className: `matchid-user-popover-item-content`, children: [
3146
+ icon,
3147
+ /* @__PURE__ */ jsx17("div", { className: "matchid-user-popover-item-text", children })
3148
+ ] }),
3149
+ rightIcon
3150
+ ] });
3151
+ };
3152
+ const UserDivider = () => {
3153
+ return /* @__PURE__ */ jsx17("div", { className: `matchid-user-popover-divider` });
3154
+ };
3155
+ const [usernameOpen, setUsernameOpen] = useState12(false);
3156
+ const [copied, setCopied] = useCopyClipboard();
3157
+ const intl = useIntl6();
3158
+ return /* @__PURE__ */ jsxs12("div", { className: "matchid-user-popover-content", children: [
3159
+ /* @__PURE__ */ jsxs12("div", { className: "matchid-user-popover-list", children: [
3160
+ /* @__PURE__ */ jsx17(UserItem, { onClick: () => {
3161
+ setCopied(address);
3162
+ }, icon: copied ? /* @__PURE__ */ jsx17(CheckIcon, { size: 20, color: "#0ecb81" }) : /* @__PURE__ */ jsx17(CopyIcon, { size: 20, color: "var(--icon-color)" }), rightIcon: /* @__PURE__ */ jsx17(CheckIcon, { size: 20, color: "var(--icon-color)" }), children: truncateAddress(address) }),
3163
+ /* @__PURE__ */ jsx17(UserDivider, {}),
3164
+ /* @__PURE__ */ jsx17(UserItem, { onClick: () => {
3165
+ setUsernameOpen(true);
3166
+ }, icon: /* @__PURE__ */ jsx17(ProfileIcon, { size: 20, color: "var(--icon-color)" }), rightIcon: /* @__PURE__ */ jsx17(ArrowRightIcon, { size: 20, color: "var(--icon-color)" }), children: username || intl.formatMessage({
3167
+ id: "setUsername"
3168
+ }) })
3169
+ ] }),
3170
+ /* @__PURE__ */ jsx17(Button, { onClick: onLogout, loading: logouting, children: /* @__PURE__ */ jsx17(FormattedMessage6, { id: "disconnect" }) }),
3171
+ /* @__PURE__ */ jsx17(UsernameModal, { isOpen: usernameOpen, onClose: () => {
3172
+ setUsernameOpen(false);
3173
+ }, onSuccess: () => {
3174
+ setUsernameOpen(false);
3175
+ } })
3176
+ ] });
3177
+ }
3178
+ function UserPopover({
3179
+ children,
3180
+ ...props
3181
+ }) {
3182
+ return /* @__PURE__ */ jsx17(Popover, { ...props, content: /* @__PURE__ */ jsx17(UserContent, {}), children });
3183
+ }
3184
+
3185
+ // src/components/LoginButton/index.tsx
3186
+ import { FormattedMessage as FormattedMessage7, useIntl as useIntl7 } from "react-intl";
3187
+ import { Fragment as Fragment3, jsx as jsx18, jsxs as jsxs13 } from "react/jsx-runtime";
3188
+ function LoginButton({
3189
+ loginRender,
3190
+ methods,
3191
+ recommendMethods,
3192
+ onLoginClick,
3193
+ popoverPosition = "right",
3194
+ popoverType = "hover",
3195
+ popoverGap = 20,
3196
+ walletMethods,
3197
+ ...props
3198
+ }) {
3199
+ const intl = useIntl7();
3200
+ const { isLogin, username } = useUserInfo();
3201
+ const [loginOpen, setLoginOpen] = useState13(false);
3202
+ if (!isLogin) {
3203
+ return /* @__PURE__ */ jsxs13(Fragment3, { children: [
3204
+ /* @__PURE__ */ jsx18(
3205
+ LoginModal,
3206
+ {
3207
+ methods,
3208
+ walletMethods,
3209
+ recommendMethods,
3210
+ isOpen: loginOpen,
3211
+ onClose: () => setLoginOpen(false)
3212
+ }
3213
+ ),
3214
+ /* @__PURE__ */ jsxs13(Button, { className: "matchid-unlogin-btn", ...props, highlight: true, onClick: () => setLoginOpen(true), children: [
3215
+ /* @__PURE__ */ jsx18(UnLoginIcon_default, {}),
3216
+ /* @__PURE__ */ jsx18("span", { children: /* @__PURE__ */ jsx18(FormattedMessage7, { id: "login" }) })
3217
+ ] })
3218
+ ] });
3219
+ }
3220
+ return loginRender ? /* @__PURE__ */ jsx18(Fragment3, { children: loginRender }) : /* @__PURE__ */ jsx18(UserPopover, { position: popoverPosition, type: popoverType, gap: popoverGap, children: /* @__PURE__ */ jsxs13(Button, { onClick: onLoginClick, className: "matchid-login-btn", ...props, children: [
3221
+ /* @__PURE__ */ jsx18(LoginIcon_default, {}),
3222
+ /* @__PURE__ */ jsx18("span", { children: username ? truncateAddress(username) : "MatchID " + intl.formatMessage({
3223
+ id: "user"
3224
+ }) })
3225
+ ] }) });
3226
+ }
3227
+
3228
+ // src/components/UsernameModal/index.tsx
3229
+ import { useEffect as useEffect12, useMemo as useMemo8, useState as useState14 } from "react";
3230
+
3231
+ // src/assets/icon/InfoRoundIcon.tsx
3232
+ import { jsx as jsx19, jsxs as jsxs14 } from "react/jsx-runtime";
3233
+ function InfoRoundIcon({
3234
+ size,
3235
+ color = "#6E6E6E",
3236
+ ...props
3237
+ }) {
3238
+ return /* @__PURE__ */ jsxs14("svg", { width: size, height: size, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: [
3239
+ /* @__PURE__ */ jsx19("g", { clipPath: "url(#clip0_418_7746)", children: /* @__PURE__ */ jsx19(
3240
+ "path",
3241
+ {
3242
+ fillRule: "evenodd",
3243
+ clipRule: "evenodd",
3244
+ d: "M7.99984 0.666504C3.94975 0.666504 0.666504 3.94975 0.666504 7.99984C0.666504 12.0499 3.94975 15.3332 7.99984 15.3332C12.0499 15.3332 15.3332 12.0499 15.3332 7.99984C15.3332 3.94975 12.0499 0.666504 7.99984 0.666504ZM1.99984 7.99984C1.99984 4.68613 4.68613 1.99984 7.99984 1.99984C11.3135 1.99984 13.9998 4.68613 13.9998 7.99984C13.9998 11.3135 11.3135 13.9998 7.99984 13.9998C4.68613 13.9998 1.99984 11.3135 1.99984 7.99984ZM8.6665 7.33317C8.6665 6.96498 8.36803 6.6665 7.99984 6.6665C7.63165 6.6665 7.33317 6.96498 7.33317 7.33317V11.3332C7.33317 11.7014 7.63165 11.9998 7.99984 11.9998C8.36803 11.9998 8.6665 11.7014 8.6665 11.3332V7.33317ZM7.99984 5.33317C8.36803 5.33317 8.6665 5.03469 8.6665 4.6665C8.6665 4.29831 8.36803 3.99984 7.99984 3.99984C7.63165 3.99984 7.33317 4.29831 7.33317 4.6665C7.33317 5.03469 7.63165 5.33317 7.99984 5.33317Z",
3245
+ fill: color
3246
+ }
3247
+ ) }),
3248
+ /* @__PURE__ */ jsx19("defs", { children: /* @__PURE__ */ jsx19("clipPath", { id: "clip0_418_7746", children: /* @__PURE__ */ jsx19("rect", { width: "16", height: "16", fill: "white" }) }) })
3249
+ ] });
3250
+ }
3251
+
3252
+ // src/components/UsernameModal/index.tsx
3253
+ import { FormattedMessage as FormattedMessage8, useIntl as useIntl8 } from "react-intl";
3254
+ import { jsx as jsx20, jsxs as jsxs15 } from "react/jsx-runtime";
3255
+ var ValidItem = ({
3256
+ success = false,
3257
+ text
3258
+ }) => {
3259
+ const isDownMd = useDownMd();
3260
+ return /* @__PURE__ */ jsxs15("div", { className: `matchid-valid-status-item matchid-valid-status-${success ? "success" : "error"}`, children: [
3261
+ success ? /* @__PURE__ */ jsx20(CheckRoundIcon, { size: isDownMd ? 12 : 16 }) : /* @__PURE__ */ jsx20(InfoRoundIcon, { size: isDownMd ? 12 : 16 }),
3262
+ /* @__PURE__ */ jsx20("span", { children: text })
3263
+ ] });
3264
+ };
3265
+ function UsernameModal({
3266
+ title,
3267
+ isOpen,
3268
+ onSuccess,
3269
+ ...props
3270
+ }) {
3271
+ const { username, refreshOverview } = useUserInfo();
3272
+ const { isLogin } = useUserInfo();
3273
+ const [val, setVal] = useState14(username);
3274
+ const [error, setError] = useState14("");
3275
+ const isDownMd = useDownMd();
3276
+ useEffect12(() => {
3277
+ if (isOpen) {
3278
+ setVal(username);
3279
+ setError("");
3280
+ }
3281
+ }, [isOpen]);
3282
+ const isValid = useMemo8(() => {
3283
+ return isValidUsername(val);
3284
+ }, [val]);
3285
+ const isLength = useMemo8(() => {
3286
+ return val.length >= 2 && val.length <= 32;
3287
+ }, [val]);
3288
+ const isSafe = isValid && isLength;
3289
+ const [isSubmitting, setIsSubmitting] = useState14(false);
3290
+ const onSubmit = async () => {
3291
+ if (isSubmitting) return;
3292
+ try {
3293
+ setIsSubmitting(true);
3294
+ const res = await setUserNameApi({
3295
+ username: val
3296
+ });
3297
+ if (isSuccess(res)) {
3298
+ await refreshOverview();
3299
+ onSuccess && onSuccess();
3300
+ } else {
3301
+ setError(res.message);
3302
+ }
3303
+ } catch (error2) {
3304
+ setError(error2.message);
3305
+ } finally {
3306
+ setIsSubmitting(false);
3307
+ }
3308
+ };
3309
+ const intl = useIntl8();
3310
+ return /* @__PURE__ */ jsx20(ModalWithHeader, { isOpen: isOpen && isLogin, ...props, title: title || intl.formatMessage({
3311
+ id: username ? "editUsernameTitle" : "setUsernameTitle"
3312
+ }), children: /* @__PURE__ */ jsxs15("div", { className: "matchid-username-box", children: [
3313
+ /* @__PURE__ */ jsx20(Field, { label: intl.formatMessage({
3314
+ id: "username"
3315
+ }), error, children: /* @__PURE__ */ jsx20(
3316
+ Input,
3317
+ {
3318
+ placeholder: intl.formatMessage({
3319
+ id: "usernamePlaceholder"
3320
+ }),
3321
+ onChange: (e) => {
3322
+ setVal(e.target.value);
3323
+ setError("");
3324
+ },
3325
+ value: val
3326
+ }
3327
+ ) }),
3328
+ /* @__PURE__ */ jsxs15("div", { className: "matchid-valid", children: [
3329
+ /* @__PURE__ */ jsx20(
3330
+ ValidItem,
3331
+ {
3332
+ success: isValid,
3333
+ text: intl.formatMessage({
3334
+ id: "usernameValidError"
3335
+ })
3336
+ }
3337
+ ),
3338
+ /* @__PURE__ */ jsx20(ValidItem, { success: isLength, text: intl.formatMessage({
3339
+ id: "usernameLengthError"
3340
+ }) })
3341
+ ] }),
3342
+ /* @__PURE__ */ jsx20(Button, { disabled: !isSafe, loading: isSubmitting, style: {
3343
+ marginTop: isDownMd ? "36px" : "64px"
3344
+ }, onClick: onSubmit, size: "lg", block: true, highlight: true, children: /* @__PURE__ */ jsx20(FormattedMessage8, { id: "confirm" }) }),
3345
+ /* @__PURE__ */ jsx20(Button, { style: {
3346
+ marginTop: isDownMd ? "12px" : "24px"
3347
+ }, onClick: props.onClose, size: "lg", block: true, children: /* @__PURE__ */ jsx20(FormattedMessage8, { id: "cancel" }) })
3348
+ ] }) });
3349
+ }
3350
+
3351
+ // src/components/SOLModal/index.tsx
3352
+ import React7, { useEffect as useEffect13, useState as useState15 } from "react";
3353
+ import { clusterApiUrl } from "@solana/web3.js";
3354
+ import { useWallet as useWallet2, WalletProvider, ConnectionProvider } from "@solana/wallet-adapter-react";
3355
+ import { WalletModalProvider, useWalletModal } from "@solana/wallet-adapter-react-ui";
3356
+
3357
+ // node_modules/@solana/wallet-adapter-base/lib/esm/types.js
3358
+ var WalletAdapterNetwork;
3359
+ (function(WalletAdapterNetwork2) {
3360
+ WalletAdapterNetwork2["Mainnet"] = "mainnet-beta";
3361
+ WalletAdapterNetwork2["Testnet"] = "testnet";
3362
+ WalletAdapterNetwork2["Devnet"] = "devnet";
3363
+ })(WalletAdapterNetwork || (WalletAdapterNetwork = {}));
3364
+
3365
+ // src/components/SOLModal/index.tsx
3366
+ import {
3367
+ PhantomWalletAdapter,
3368
+ SolflareWalletAdapter,
3369
+ WalletConnectWalletAdapter,
3370
+ AlphaWalletAdapter,
3371
+ AvanaWalletAdapter,
3372
+ BitgetWalletAdapter,
3373
+ BitpieWalletAdapter,
3374
+ CloverWalletAdapter,
3375
+ Coin98WalletAdapter,
3376
+ CoinbaseWalletAdapter,
3377
+ CoinhubWalletAdapter,
3378
+ FractalWalletAdapter,
3379
+ HuobiWalletAdapter,
3380
+ HyperPayWalletAdapter,
3381
+ KeystoneWalletAdapter,
3382
+ KrystalWalletAdapter,
3383
+ LedgerWalletAdapter,
3384
+ MathWalletAdapter,
3385
+ NekoWalletAdapter,
3386
+ NightlyWalletAdapter,
3387
+ NufiWalletAdapter,
3388
+ OntoWalletAdapter,
3389
+ ParticleAdapter,
3390
+ SafePalWalletAdapter,
3391
+ SaifuWalletAdapter,
3392
+ SalmonWalletAdapter,
3393
+ SkyWalletAdapter,
3394
+ SolongWalletAdapter,
3395
+ SpotWalletAdapter,
3396
+ TokenaryWalletAdapter,
3397
+ TokenPocketWalletAdapter,
3398
+ TorusWalletAdapter,
3399
+ TrustWalletAdapter,
3400
+ XDEFIWalletAdapter
3401
+ } from "@solana/wallet-adapter-wallets";
3402
+ import "@solana/wallet-adapter-react-ui/styles.css";
3403
+ import { useIntl as useIntl9 } from "react-intl";
3404
+
3405
+ // src/components/WalletModalContent/index.tsx
3406
+ import { useMemo as useMemo9 } from "react";
3407
+
3408
+ // src/assets/wallet.ts
3409
+ var walletErrorImage = "data:image/png;base64,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";
3410
+ var walletConnectedImage = "data:image/png;base64,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";
3411
+ var walletConnectingImage = "data:image/png;base64,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";
3412
+ var walletConnectImage = "data:image/png;base64,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";
3413
+ var walletSigningImage = "data:image/png;base64,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";
3414
+
3415
+ // src/components/WalletModalContent/index.tsx
3416
+ import { jsx as jsx21, jsxs as jsxs16 } from "react/jsx-runtime";
3417
+ function WalletModalContent({
3418
+ status,
3419
+ error,
3420
+ disconnect,
3421
+ setError,
3422
+ setVisible,
3423
+ visible,
3424
+ address,
3425
+ connected
3426
+ }) {
3427
+ const pageData = useMemo9(() => {
3428
+ if (status == "success") {
3429
+ return {
3430
+ btnText: "Disconnect Wallet",
3431
+ btnClick: async () => {
3432
+ await disconnect();
3433
+ },
3434
+ text: "Wallet connection successful!",
3435
+ statusImage: walletConnectedImage
3436
+ };
3437
+ }
3438
+ if (status == "error") {
3439
+ return {
3440
+ text: error,
3441
+ btnText: "Reconnect Wallet",
3442
+ btnClick: async () => {
3443
+ console.log("click error");
3444
+ setError("");
3445
+ try {
3446
+ await disconnect();
3447
+ } catch (error2) {
3448
+ console.error(error2);
3449
+ }
3450
+ setVisible(true);
3451
+ },
3452
+ statusImage: walletErrorImage,
3453
+ isError: true
3454
+ };
3455
+ }
3456
+ if (status == "nonce") {
3457
+ return {
3458
+ btnLoading: true,
3459
+ text: "Connecting",
3460
+ statusImage: walletConnectingImage
3461
+ };
3462
+ }
3463
+ if (status == "signer") {
3464
+ return {
3465
+ btnLoading: true,
3466
+ text: "Signing",
3467
+ statusImage: walletSigningImage
3468
+ };
3469
+ }
3470
+ if (visible) {
3471
+ return {
3472
+ btnLoading: true,
3473
+ text: "Connecting",
3474
+ statusImage: walletConnectingImage
3475
+ };
3476
+ }
3477
+ return {
3478
+ btnText: "Connect Wallet",
3479
+ btnClick: () => {
3480
+ setVisible(true);
3481
+ },
3482
+ text: "Please Connect your wallet",
3483
+ statusImage: walletConnectImage
3484
+ };
3485
+ }, [visible, connected, status, error, address]);
3486
+ return /* @__PURE__ */ jsx21("div", { className: "matchid-wallet-container", children: /* @__PURE__ */ jsxs16("div", { className: `matchid-wallet-box`, children: [
3487
+ /* @__PURE__ */ jsxs16("div", { className: `matchid-wallet-content`, children: [
3488
+ /* @__PURE__ */ jsx21("img", { src: pageData.statusImage }),
3489
+ /* @__PURE__ */ jsx21("div", { className: pageData.isError ? "text-[#F7585E]" : "", children: pageData.text })
3490
+ ] }),
3491
+ /* @__PURE__ */ jsx21(
3492
+ Button,
3493
+ {
3494
+ block: true,
3495
+ size: "lg",
3496
+ onClick: pageData.btnClick,
3497
+ loading: pageData.btnLoading,
3498
+ disabled: pageData.btnDisabled,
3499
+ children: pageData.btnText
3500
+ }
3501
+ )
3502
+ ] }) });
3503
+ }
3504
+
3505
+ // src/components/SOLModal/index.tsx
3506
+ import { jsx as jsx22 } from "react/jsx-runtime";
3507
+ function WalletContent({
3508
+ onSuccess,
3509
+ type
3510
+ }) {
3511
+ const { setVisible, visible } = useWalletModal();
3512
+ const wallet = useWallet2();
3513
+ const { events, login } = useMatch();
3514
+ const [status, setStatus] = useState15("");
3515
+ const statusRef = React7.useRef(status);
3516
+ const [error, setError] = useState15("");
3517
+ useEffect13(() => {
3518
+ const init = async () => {
3519
+ await wallet.disconnect();
3520
+ setVisible(true);
3521
+ };
3522
+ init();
3523
+ }, []);
3524
+ useEffect13(() => {
3525
+ if (wallet.connected) {
3526
+ console.log("wallet.connected", wallet.connected);
3527
+ toLoginInWallet();
3528
+ }
3529
+ }, [wallet.connected]);
3530
+ const toLoginInWallet = async () => {
3531
+ if (statusRef.current) return;
3532
+ const address = wallet.publicKey?.toBase58() || "";
3533
+ try {
3534
+ setStatus("nonce");
3535
+ statusRef.current = "nonce";
3536
+ const res = type == "bind" ? await getWalletInitApi({
3537
+ address,
3538
+ type: "SOL"
3539
+ }) : await getWalletNonceApi({ address, type: "SOL" });
3540
+ if (!isSuccess(res)) {
3541
+ throw new Error(res.message);
3542
+ }
3543
+ const nonce = res.code >= 0 ? res.data.nonce : null;
3544
+ if (nonce) {
3545
+ setStatus("signer");
3546
+ statusRef.current = "signer";
3547
+ const message = "By signing, you are proving you own this wallet and logging in. This does not initiate a transaction or cost any fees.Nonce:" + res.data.nonce;
3548
+ const encodedMessage = new TextEncoder().encode(message);
3549
+ const signedMessage = await wallet.signMessage(encodedMessage);
3550
+ let obj = {
3551
+ type: "SOL",
3552
+ address,
3553
+ signature: Buffer.from(signedMessage).toString("base64"),
3554
+ message,
3555
+ connector_type: "SOL",
3556
+ wallet_client_type: wallet.wallet?.adapter.name || ""
3557
+ };
3558
+ const res1 = type == "bind" ? await toBindWalletApi(obj) : await loginByWalletApi(obj);
3559
+ if (res1) {
3560
+ if (!isSuccess(res1)) {
3561
+ throw new Error(res1.message);
3562
+ }
3563
+ matchlog_default.log(res1);
3564
+ setStatus("success");
3565
+ statusRef.current = "success";
3566
+ if (type == "bind") {
3567
+ events.onBind && events.onBind({
3568
+ type: "sol"
3569
+ });
3570
+ eventManager_default.emit("onBind", {
3571
+ type: "sol"
3572
+ });
3573
+ } else {
3574
+ await login({
3575
+ mid: res1.data.mid,
3576
+ token: `${res1.data.token_type} ${res1.data.access_token}`
3577
+ });
3578
+ }
3579
+ onSuccess && onSuccess();
3580
+ }
3581
+ }
3582
+ } catch (error2) {
3583
+ setStatus("error");
3584
+ setError(error2.message);
3585
+ statusRef.current = "";
3586
+ }
3587
+ };
3588
+ return /* @__PURE__ */ jsx22(
3589
+ WalletModalContent,
3590
+ {
3591
+ connected: wallet.connected,
3592
+ disconnect: wallet.disconnect,
3593
+ address: wallet.publicKey?.toBase58(),
3594
+ visible,
3595
+ setVisible,
3596
+ error,
3597
+ setError,
3598
+ status
3599
+ }
3600
+ );
3601
+ }
3602
+ var wallets = [
3603
+ new PhantomWalletAdapter(),
3604
+ new SolflareWalletAdapter(),
3605
+ new WalletConnectWalletAdapter({
3606
+ network: WalletAdapterNetwork.Mainnet,
3607
+ options: {
3608
+ relayUrl: "wss://relay.walletconnect.com"
3609
+ }
3610
+ }),
3611
+ new AlphaWalletAdapter(),
3612
+ new AvanaWalletAdapter(),
3613
+ new BitgetWalletAdapter(),
3614
+ new BitpieWalletAdapter(),
3615
+ new CloverWalletAdapter(),
3616
+ new Coin98WalletAdapter(),
3617
+ new CoinbaseWalletAdapter(),
3618
+ new CoinhubWalletAdapter(),
3619
+ new FractalWalletAdapter(),
3620
+ new HuobiWalletAdapter(),
3621
+ new HyperPayWalletAdapter(),
3622
+ new KeystoneWalletAdapter(),
3623
+ new KrystalWalletAdapter(),
3624
+ new LedgerWalletAdapter(),
3625
+ new MathWalletAdapter(),
3626
+ new NekoWalletAdapter(),
3627
+ new NightlyWalletAdapter(),
3628
+ new NufiWalletAdapter(),
3629
+ new OntoWalletAdapter(),
3630
+ new ParticleAdapter(),
3631
+ new SafePalWalletAdapter(),
3632
+ new SaifuWalletAdapter(),
3633
+ new SalmonWalletAdapter(),
3634
+ new SkyWalletAdapter(),
3635
+ new SolongWalletAdapter(),
3636
+ new SpotWalletAdapter(),
3637
+ new TokenaryWalletAdapter(),
3638
+ new TokenPocketWalletAdapter(),
3639
+ new TorusWalletAdapter(),
3640
+ new TrustWalletAdapter(),
3641
+ new XDEFIWalletAdapter()
3642
+ ];
3643
+ function SOLConnectModal({
3644
+ type = "login",
3645
+ onSuccess,
3646
+ ...props
3647
+ }) {
3648
+ const intl = useIntl9();
3649
+ return /* @__PURE__ */ jsx22(ModalWithHeader, { ...props, title: props.title || intl.formatMessage({
3650
+ id: type == "bind" ? "bindWith" : "loginWith"
3651
+ }, {
3652
+ name: "SOL"
3653
+ }), children: /* @__PURE__ */ jsx22(ConnectionProvider, { endpoint: clusterApiUrl("devnet"), children: /* @__PURE__ */ jsx22(WalletProvider, { wallets, autoConnect: true, children: /* @__PURE__ */ jsx22(WalletModalProvider, { children: /* @__PURE__ */ jsx22(WalletContent, { onSuccess, type }) }) }) }) });
3654
+ }
3655
+ function SOLModal(props) {
3656
+ return props.isOpen && /* @__PURE__ */ jsx22(SOLConnectModal, { ...props });
3657
+ }
3658
+
3659
+ // src/components/TRONModal/index.tsx
3660
+ import React8, { useEffect as useEffect15, useMemo as useMemo10, useState as useState17 } from "react";
3661
+ import { useIntl as useIntl10 } from "react-intl";
3662
+
3663
+ // src/lib/tron/TronLinkAdapter.ts
3664
+ var TronLinkAdapter = class {
3665
+ constructor() {
3666
+ this.name = "TronLink Wallet";
3667
+ this.website = "https://www.tronlink.org/";
3668
+ this.walletKey = "tronlink";
3669
+ }
3670
+ async isInstalled() {
3671
+ return typeof window.tronWeb !== "undefined" && typeof window.tronLink !== "undefined";
3672
+ }
3673
+ async connect() {
3674
+ if (!await this.isInstalled()) throw new Error("TronLink Wallet is not installed");
3675
+ if (!window.tronWeb.defaultAddress.base58) {
3676
+ await window.tronWeb.request(
3677
+ {
3678
+ method: "tron_requestAccounts",
3679
+ params: window.tronLink.tronlinkParams
3680
+ }
3681
+ );
3682
+ }
3683
+ if (!window.tronWeb.defaultAddress.base58) {
3684
+ throw new Error("Your should unlink your wallet and try again");
3685
+ }
3686
+ return window.tronWeb.defaultAddress.base58;
3687
+ }
3688
+ async signMessage(message) {
3689
+ return await window.tronWeb.trx.signMessageV2(message);
3690
+ }
3691
+ };
3692
+
3693
+ // src/hooks/useTRONWallet.ts
3694
+ import { useEffect as useEffect14, useState as useState16 } from "react";
3695
+
3696
+ // src/lib/tron/BitgetAdapter.ts
3697
+ var BitgetAdapter = class {
3698
+ constructor() {
3699
+ this.name = "Bitget Wallet";
3700
+ this.website = "https://web3.bitget.com/zh-CN/wallet-download";
3701
+ this.walletKey = "bitget";
3702
+ }
3703
+ async isInstalled() {
3704
+ return typeof window.bitkeep !== "undefined" && typeof window.bitkeep.tronWeb !== "undefined" && typeof window.bitkeep.tronLink !== "undefined";
3705
+ }
3706
+ async connect() {
3707
+ if (!await this.isInstalled()) throw new Error("Bitkeep Wallet is not installed");
3708
+ await window.bitkeep.tronLink.request({ method: "tron_requestAccounts" });
3709
+ return window.bitkeep.tronWeb.defaultAddress.base58;
3710
+ }
3711
+ async signMessage(message) {
3712
+ return await window.bitkeep.tronWeb.trx.signMessageV2(message);
3713
+ }
3714
+ };
3715
+
3716
+ // src/lib/tron/OKXAdapter.ts
3717
+ var OKXAdapter = class {
3718
+ constructor() {
3719
+ this.name = "OKX Wallet";
3720
+ this.website = "https://www.okx.com/zh-hans/download";
3721
+ this.walletKey = "okx";
3722
+ }
3723
+ async isInstalled() {
3724
+ return typeof window.okxwallet !== "undefined" && typeof window.okxwallet.tronWeb !== "undefined" && typeof window.okxwallet.tronLink !== "undefined";
3725
+ }
3726
+ async connect() {
3727
+ if (!await this.isInstalled()) throw new Error("OKX Wallet is not installed");
3728
+ await window.okxwallet.tronLink.request({ method: "tron_requestAccounts" });
3729
+ return window.okxwallet.tronWeb.defaultAddress.base58;
3730
+ }
3731
+ async signMessage(message) {
3732
+ return await window.okxwallet.tronWeb.trx.signMessageV2(message);
3733
+ }
3734
+ };
3735
+
3736
+ // src/hooks/useTRONWallet.ts
3737
+ var useTRONWallet = () => {
3738
+ const wallets2 = [new TronLinkAdapter(), new BitgetAdapter(), new OKXAdapter()];
3739
+ const [installedWallets, setInstalledWallets] = useState16([]);
3740
+ const [address, setAddress] = useState16(null);
3741
+ useEffect14(() => {
3742
+ const getInstalled = async () => {
3743
+ const installed = await Promise.all(wallets2.map((wallet2) => wallet2.isInstalled().then((isInstalled) => ({
3744
+ wallet: wallet2,
3745
+ isInstalled
3746
+ }))));
3747
+ setInstalledWallets(installed.filter(({ isInstalled }) => isInstalled).map(({ wallet: wallet2 }) => wallet2));
3748
+ };
3749
+ getInstalled();
3750
+ }, []);
3751
+ const [wallet, chooseWallet] = useState16(null);
3752
+ const onConnect = async () => {
3753
+ setAddress(await wallet.connect());
3754
+ };
3755
+ useEffect14(() => {
3756
+ if (!wallet) {
3757
+ setAddress(null);
3758
+ }
3759
+ }, [wallet]);
3760
+ return {
3761
+ installedWallets,
3762
+ wallets: wallets2,
3763
+ chooseWallet,
3764
+ wallet,
3765
+ address,
3766
+ onConnect
3767
+ };
3768
+ };
3769
+
3770
+ // src/components/TRONModal/index.tsx
3771
+ import { jsx as jsx23, jsxs as jsxs17 } from "react/jsx-runtime";
3772
+ function TRONConnectModal({
3773
+ type = "login",
3774
+ onSuccess,
3775
+ ...props
3776
+ }) {
3777
+ const isDownMd = useDownMd();
3778
+ const intl = useIntl10();
3779
+ const { wallets: wallets2, installedWallets, chooseWallet, wallet, address, onConnect } = useTRONWallet();
3780
+ const iconMaps = {
3781
+ tronlink: /* @__PURE__ */ jsx23(TronLinkIcon, { size: isDownMd ? 36 : 40 }),
3782
+ bitget: /* @__PURE__ */ jsx23(BitgetIcon, { size: isDownMd ? 36 : 40 }),
3783
+ okx: /* @__PURE__ */ jsx23(OKXIcon, { size: isDownMd ? 36 : 40 })
3784
+ };
3785
+ const { events, login } = useMatch();
3786
+ const [status, setStatus] = useState17("");
3787
+ const statusRef = React8.useRef(status);
3788
+ const [error, setError] = useState17("");
3789
+ const connected = useMemo10(() => {
3790
+ return !!address;
3791
+ }, [address]);
3792
+ const disconnect = async () => {
3793
+ setStatus("");
3794
+ chooseWallet(null);
3795
+ statusRef.current = "";
3796
+ setError("");
3797
+ };
3798
+ const onBack = () => {
3799
+ setStatus("");
3800
+ chooseWallet(null);
3801
+ statusRef.current = "";
3802
+ setError("");
3803
+ };
3804
+ const toLoginInWallet = async () => {
3805
+ if (statusRef.current || !address || !wallet) return;
3806
+ try {
3807
+ setStatus("nonce");
3808
+ statusRef.current = "nonce";
3809
+ const res = type == "bind" ? await getWalletInitApi({ address, type: "TRON" }) : await getWalletNonceApi({ address, type: "TRON" });
3810
+ if (!isSuccess(res)) {
3811
+ throw new Error(res.message);
3812
+ }
3813
+ const nonce = res.code >= 0 ? res.data.nonce : null;
3814
+ if (nonce) {
3815
+ setStatus("signer");
3816
+ statusRef.current = "signer";
3817
+ const message = "By signing, you are proving you own this wallet and logging in. This does not initiate a transaction or cost any fees.Nonce:" + res.data.nonce;
3818
+ const signedMessage = await wallet.signMessage(message);
3819
+ let obj = {
3820
+ type: "TRON",
3821
+ address,
3822
+ signature: signedMessage,
3823
+ message,
3824
+ connector_type: "TRON",
3825
+ wallet_client_type: wallet.walletKey
3826
+ };
3827
+ const res1 = type == "bind" ? await toBindWalletApi(obj) : await loginByWalletApi(obj);
3828
+ if (res1) {
3829
+ if (!isSuccess(res1)) {
3830
+ throw new Error(res1.message);
3831
+ }
3832
+ matchlog_default.log(res1);
3833
+ setStatus("success");
3834
+ statusRef.current = "success";
3835
+ if (type == "bind") {
3836
+ events.onBind && events.onBind({
3837
+ type: "tron"
3838
+ });
3839
+ eventManager_default.emit("onBind", {
3840
+ type: "tron"
3841
+ });
3842
+ } else {
3843
+ await login({
3844
+ mid: res1.data.mid,
3845
+ token: `${res1.data.token_type} ${res1.data.access_token}`
3846
+ });
3847
+ }
3848
+ onSuccess && onSuccess();
3849
+ }
3850
+ }
3851
+ } catch (error2) {
3852
+ setStatus("error");
3853
+ setError(error2.message);
3854
+ statusRef.current = "";
3855
+ }
3856
+ };
3857
+ useEffect15(() => {
3858
+ if (wallet) {
3859
+ console.log("onConnect");
3860
+ onConnect();
3861
+ } else {
3862
+ setStatus("");
3863
+ }
3864
+ }, [wallet]);
3865
+ useEffect15(() => {
3866
+ if (address) {
3867
+ toLoginInWallet();
3868
+ }
3869
+ }, [address]);
3870
+ useEffect15(() => {
3871
+ if (!props.isOpen) {
3872
+ disconnect();
3873
+ }
3874
+ }, [props.isOpen]);
3875
+ return /* @__PURE__ */ jsx23(ModalWithHeader, { ...props, title: props.title || intl.formatMessage({
3876
+ id: type == "bind" ? "bindWith" : "loginWith"
3877
+ }, {
3878
+ name: "TRON"
3879
+ }), onBack: wallet ? onBack : void 0, children: wallet ? /* @__PURE__ */ jsx23(
3880
+ WalletModalContent,
3881
+ {
3882
+ error,
3883
+ setError,
3884
+ status,
3885
+ disconnect,
3886
+ address: address || "",
3887
+ connected,
3888
+ visible: true,
3889
+ setVisible: () => {
3890
+ }
3891
+ }
3892
+ ) : /* @__PURE__ */ jsx23("div", { className: "matchid-login-box", children: /* @__PURE__ */ jsxs17("div", { className: "matchid-login-recommend-list", children: [
3893
+ installedWallets.map((wallet2) => {
3894
+ return /* @__PURE__ */ jsx23(
3895
+ RecommendItem,
3896
+ {
3897
+ icon: iconMaps[wallet2.walletKey],
3898
+ name: wallet2.name,
3899
+ onClick: () => {
3900
+ chooseWallet(wallet2);
3901
+ }
3902
+ },
3903
+ wallet2.walletKey
3904
+ );
3905
+ }),
3906
+ wallets2.filter((wallet2) => !installedWallets.find((installedWallet) => installedWallet.walletKey == wallet2.walletKey)).map((wallet2) => {
3907
+ return /* @__PURE__ */ jsx23(
3908
+ RecommendItem,
3909
+ {
3910
+ icon: iconMaps[wallet2.walletKey],
3911
+ name: wallet2.name,
3912
+ onClick: () => {
3913
+ },
3914
+ footer: /* @__PURE__ */ jsx23(Button, { size: "sm", onClick: () => {
3915
+ window.open(wallet2.website);
3916
+ }, children: "Install" })
3917
+ },
3918
+ wallet2.walletKey
3919
+ );
3920
+ })
3921
+ ] }) }) });
3922
+ }
3923
+ function TRONModal(props) {
3924
+ return props.isOpen && /* @__PURE__ */ jsx23(TRONConnectModal, { ...props, type: props.type });
3925
+ }
3926
+
3927
+ // src/components/TONModal/index.tsx
3928
+ import React9, { useEffect as useEffect16, useState as useState18 } from "react";
3929
+ import { useIntl as useIntl11 } from "react-intl";
3930
+ import {
3931
+ TonConnectUIProvider,
3932
+ useTonAddress,
3933
+ useTonConnectModal,
3934
+ useTonConnectUI,
3935
+ useTonWallet
3936
+ } from "@tonconnect/ui-react";
3937
+ import { jsx as jsx24 } from "react/jsx-runtime";
3938
+ function WalletContent2({
3939
+ onSuccess,
3940
+ type
3941
+ }) {
3942
+ const { events, login } = useMatch();
3943
+ const [connected, setConnected] = useState18(false);
3944
+ const wallet = useTonWallet();
3945
+ const userFriendlyAddress = useTonAddress();
3946
+ const [tonConnectUI] = useTonConnectUI();
3947
+ const { state, open, close } = useTonConnectModal();
3948
+ const [status, setStatus] = useState18("");
3949
+ const statusRef = React9.useRef(status);
3950
+ const [error, setError] = useState18("");
3951
+ useEffect16(() => {
3952
+ const init = async () => {
3953
+ if (wallet) {
3954
+ await tonConnectUI.disconnect();
3955
+ }
3956
+ open();
3957
+ };
3958
+ init();
3959
+ tonConnectUI.onStatusChange((wallet2) => {
3960
+ matchlog_default.log("onStatusChange:", wallet2, wallet2?.connectItems?.tonProof, JSON.stringify(wallet2?.connectItems?.tonProof));
3961
+ if (wallet2?.connectItems?.tonProof && "proof" in wallet2.connectItems.tonProof) {
3962
+ matchlog_default.log(wallet2?.connectItems.tonProof.proof, wallet2?.account);
3963
+ const toLoginInWallet = async () => {
3964
+ if (statusRef.current || !wallet2) return;
3965
+ setStatus("signer");
3966
+ statusRef.current = "signer";
3967
+ try {
3968
+ const signature = {
3969
+ "address": wallet2?.account?.address,
3970
+ "network": wallet2?.account?.chain,
3971
+ "public_key": wallet2?.account?.publicKey,
3972
+ "proof": {
3973
+ //@ts-ignore
3974
+ ...wallet2?.connectItems?.tonProof?.proof,
3975
+ "state_init": wallet2?.account?.walletStateInit
3976
+ }
3977
+ };
3978
+ let obj = {
3979
+ type: "TON",
3980
+ address: wallet2?.account?.publicKey,
3981
+ signature: JSON.stringify(signature),
3982
+ //@ts-ignore
3983
+ message: wallet2?.connectItems?.tonProof?.proof.payload,
3984
+ connector_type: "TON",
3985
+ wallet_client_type: wallet2?.name
3986
+ };
3987
+ console.log("signature", {
3988
+ signature,
3989
+ obj
3990
+ });
3991
+ const res1 = type == "bind" ? await toBindWalletApi(obj) : await loginByWalletApi(obj);
3992
+ if (res1) {
3993
+ if (!isSuccess(res1)) {
3994
+ throw new Error(res1.message);
3995
+ }
3996
+ matchlog_default.log(res1);
3997
+ setStatus("success");
3998
+ statusRef.current = "success";
3999
+ if (type == "bind") {
4000
+ events.onBind && events.onBind({
4001
+ type: "ton"
4002
+ });
4003
+ eventManager_default.emit("onBind", {
4004
+ type: "ton"
4005
+ });
4006
+ } else {
4007
+ await login({
4008
+ mid: res1.data.mid,
4009
+ token: `${res1.data.token_type} ${res1.data.access_token}`
4010
+ });
4011
+ }
4012
+ onSuccess && onSuccess();
4013
+ }
4014
+ } catch (error2) {
4015
+ setStatus("error");
4016
+ setError(error2.message);
4017
+ statusRef.current = "";
4018
+ }
4019
+ };
4020
+ toLoginInWallet();
4021
+ }
4022
+ });
4023
+ }, []);
4024
+ useEffect16(() => {
4025
+ if (wallet) {
4026
+ setConnected(true);
4027
+ console.log("Wallet connected:", wallet);
4028
+ } else {
4029
+ setConnected(false);
4030
+ open();
4031
+ statusRef.current = "";
4032
+ setStatus("");
4033
+ }
4034
+ }, [wallet]);
4035
+ useEffect16(() => {
4036
+ console.log({
4037
+ state,
4038
+ wallet
4039
+ });
4040
+ if (state.status == "opened") {
4041
+ const init = async () => {
4042
+ tonConnectUI.setConnectRequestParameters({ state: "loading" });
4043
+ const res = type == "bind" ? await getWalletInitApi({
4044
+ address: "tonconnect",
4045
+ type: "TON"
4046
+ }) : await getWalletNonceApi({ address: "tonconnect", type: "TON" });
4047
+ if (!isSuccess(res)) {
4048
+ tonConnectUI.setConnectRequestParameters(null);
4049
+ throw new Error(res.message);
4050
+ }
4051
+ tonConnectUI.setConnectRequestParameters({
4052
+ state: "ready",
4053
+ value: { tonProof: res.data.nonce }
4054
+ });
4055
+ };
4056
+ init();
4057
+ } else {
4058
+ if (!wallet) {
4059
+ setStatus("");
4060
+ statusRef.current = "";
4061
+ }
4062
+ }
4063
+ }, [state]);
4064
+ return /* @__PURE__ */ jsx24(
4065
+ WalletModalContent,
4066
+ {
4067
+ connected,
4068
+ disconnect: tonConnectUI.disconnect,
4069
+ address: userFriendlyAddress,
4070
+ visible: state.status == "opened",
4071
+ setVisible: async (v) => {
4072
+ console.log("setVisible", v);
4073
+ if (v) {
4074
+ if (wallet) {
4075
+ await tonConnectUI.disconnect();
4076
+ }
4077
+ setStatus("");
4078
+ statusRef.current = "";
4079
+ open();
4080
+ } else {
4081
+ close();
4082
+ }
4083
+ },
4084
+ error,
4085
+ setError,
4086
+ status
4087
+ }
4088
+ );
4089
+ }
4090
+ function TONConnectModal({
4091
+ type = "login",
4092
+ onSuccess,
4093
+ ...props
4094
+ }) {
4095
+ const intl = useIntl11();
4096
+ const { endpoints, appid } = useLocalStore_default();
4097
+ const manifestUrl = `${endpoints.back}api/v1/wallet/ton?appid=${appid}&url=` + encodeURIComponent(window.location.origin);
4098
+ return /* @__PURE__ */ jsx24(ModalWithHeader, { ...props, title: props.title || intl.formatMessage({
4099
+ id: type == "bind" ? "bindWith" : "loginWith"
4100
+ }, {
4101
+ name: "TON"
4102
+ }), children: /* @__PURE__ */ jsx24(
4103
+ TonConnectUIProvider,
4104
+ {
4105
+ manifestUrl,
4106
+ children: /* @__PURE__ */ jsx24(WalletContent2, { onSuccess, type })
4107
+ }
4108
+ ) });
4109
+ }
4110
+ function TONModal(props) {
4111
+ return props.isOpen && /* @__PURE__ */ jsx24(TONConnectModal, { ...props });
4112
+ }
4113
+
4114
+ // src/components/BTCModal/index.tsx
4115
+ import React10, { useEffect as useEffect18, useMemo as useMemo11, useState as useState20 } from "react";
4116
+ import { useIntl as useIntl12 } from "react-intl";
4117
+
4118
+ // src/lib/btc/UnisatAdapter.ts
4119
+ var UnisatAdapter = class {
4120
+ constructor() {
4121
+ this.name = "Unisat Wallet";
4122
+ this.website = "https://unisat.io/";
4123
+ this.walletKey = "unisat";
4124
+ }
4125
+ async isInstalled() {
4126
+ return typeof window.unisat !== "undefined";
4127
+ }
4128
+ async checkChain() {
4129
+ const chain = await window.unisat.getChain();
4130
+ if (chain.enum != "BITCOIN_MAINNET") {
4131
+ await window.unisat.switchChain("BITCOIN_MAINNET");
4132
+ }
4133
+ }
4134
+ async connect() {
4135
+ if (!await this.isInstalled()) throw new Error("Unisat Wallet is not installed");
4136
+ window.unisat.disconnect();
4137
+ await this.checkChain();
4138
+ const accounts = await window.unisat.getAccounts();
4139
+ matchlog_default.log("accounts", accounts);
4140
+ if (accounts.length === 0) {
4141
+ const accounts2 = await window.unisat.requestAccounts();
4142
+ matchlog_default.log("accounts", accounts2);
4143
+ if (!accounts2 || accounts2.length === 0) throw new Error("No accounts found in Unisat Wallet");
4144
+ return accounts2[0];
4145
+ }
4146
+ return accounts[0];
4147
+ }
4148
+ async signMessage(message) {
4149
+ if (!await this.isInstalled()) throw new Error("Unisat Wallet is not installed");
4150
+ return window.unisat.signMessage(message, "bip322-simple");
4151
+ }
4152
+ async disconnet() {
4153
+ if (!await this.isInstalled()) throw new Error("Unisat Wallet is not installed");
4154
+ return window.unisat.disconnect();
4155
+ }
4156
+ };
4157
+
4158
+ // src/lib/btc/XverseAdapter.ts
4159
+ import {
4160
+ AddressPurpose,
4161
+ BitcoinNetworkType,
4162
+ getCapabilities,
4163
+ signMessage,
4164
+ request as request2
4165
+ } from "sats-connect";
4166
+ var XverseAdapter = class {
4167
+ constructor() {
4168
+ this.name = "Xverse Wallet";
4169
+ this.website = "https://www.xverse.app/";
4170
+ this.capabilities = null;
4171
+ this.address = "";
4172
+ this.network = BitcoinNetworkType.Mainnet;
4173
+ this.walletKey = "xverse";
4174
+ }
4175
+ async isInstalled() {
4176
+ return new Promise(async (resolve) => {
4177
+ try {
4178
+ await getCapabilities({
4179
+ onFinish: (response) => {
4180
+ matchlog_default.log(response);
4181
+ this.capabilities = new Set(response);
4182
+ resolve(true);
4183
+ },
4184
+ onCancel() {
4185
+ },
4186
+ payload: {
4187
+ network: {
4188
+ type: this.network
4189
+ }
4190
+ }
4191
+ });
4192
+ } catch (err) {
4193
+ matchlog_default.error(err);
4194
+ resolve(false);
4195
+ }
4196
+ });
4197
+ }
4198
+ async connect() {
4199
+ if (!await this.isInstalled()) throw new Error("Xverse Wallet is not installed");
4200
+ const response = await request2("getAccounts", {
4201
+ purposes: [AddressPurpose.Ordinals],
4202
+ message: "SATS Connect Demo"
4203
+ });
4204
+ matchlog_default.log("getAccounts ~ response:", response);
4205
+ if (response.status === "success") {
4206
+ const ordinalsAddressItem = response.result.find(
4207
+ (address) => address.purpose === AddressPurpose.Ordinals
4208
+ );
4209
+ this.address = ordinalsAddressItem?.address || "";
4210
+ return ordinalsAddressItem?.address || "";
4211
+ } else {
4212
+ if (response.error) {
4213
+ console.error(response.error);
4214
+ throw new Error("Error getting accounts. Check console for error logs");
4215
+ }
4216
+ throw new Error("Error getting accounts");
4217
+ }
4218
+ }
4219
+ async signMessage(message) {
4220
+ if (!await this.isInstalled()) throw new Error("Xverse Wallet is not installed");
4221
+ return new Promise(async (resolve, reject) => {
4222
+ await signMessage({
4223
+ payload: {
4224
+ network: {
4225
+ type: this.network
4226
+ },
4227
+ address: this.address,
4228
+ message
4229
+ },
4230
+ onFinish: (response) => {
4231
+ resolve(response);
4232
+ },
4233
+ onCancel: () => {
4234
+ reject("User cancelled");
4235
+ }
4236
+ });
4237
+ });
4238
+ }
4239
+ async disconnet() {
4240
+ if (!await this.isInstalled()) throw new Error("Xverse Wallet is not installed");
4241
+ await request2("wallet_disconnect", null);
4242
+ }
4243
+ };
4244
+
4245
+ // src/lib/btc/LeatherAdapter.ts
4246
+ var LeatherAdapter = class {
4247
+ constructor() {
4248
+ this.name = "Leather Wallet";
4249
+ this.website = "https://leather.io/";
4250
+ this.walletKey = "leather";
4251
+ }
4252
+ async isInstalled() {
4253
+ return typeof window.LeatherProvider !== "undefined";
4254
+ }
4255
+ async connect() {
4256
+ if (!await this.isInstalled()) throw new Error("Leather Wallet is not installed");
4257
+ const response = await window.LeatherProvider?.request("getAddresses");
4258
+ matchlog_default.log("Addresses:", response.result.addresses);
4259
+ return response.result.addresses[0].address;
4260
+ }
4261
+ async signMessage(message) {
4262
+ if (!await this.isInstalled()) throw new Error("Hiro Wallet is not installed");
4263
+ const response = await window.LeatherProvider?.request("signMessage", { message });
4264
+ matchlog_default.log("response", response);
4265
+ return response.result.signature;
4266
+ }
4267
+ };
4268
+
4269
+ // src/hooks/useBTCWallet.ts
4270
+ import { useEffect as useEffect17, useState as useState19 } from "react";
4271
+ var useBTCWallet = () => {
4272
+ const wallets2 = [new UnisatAdapter(), new XverseAdapter(), new LeatherAdapter()];
4273
+ const [installedWallets, setInstalledWallets] = useState19([]);
4274
+ const [address, setAddress] = useState19(null);
4275
+ useEffect17(() => {
4276
+ const getInstalled = async () => {
4277
+ const installed = await Promise.all(wallets2.map((wallet2) => wallet2.isInstalled().then((isInstalled) => ({
4278
+ wallet: wallet2,
4279
+ isInstalled
4280
+ }))));
4281
+ setInstalledWallets(installed.filter(({ isInstalled }) => isInstalled).map(({ wallet: wallet2 }) => wallet2));
4282
+ };
4283
+ getInstalled();
4284
+ }, []);
4285
+ const [wallet, chooseWallet] = useState19(null);
4286
+ const onConnect = async () => {
4287
+ setAddress(await wallet.connect());
4288
+ };
4289
+ useEffect17(() => {
4290
+ if (!wallet) {
4291
+ setAddress(null);
4292
+ }
4293
+ }, [wallet]);
4294
+ return {
4295
+ installedWallets,
4296
+ wallets: wallets2,
4297
+ chooseWallet,
4298
+ wallet,
4299
+ address,
4300
+ onConnect
4301
+ };
4302
+ };
4303
+
4304
+ // src/components/BTCModal/index.tsx
4305
+ import { jsx as jsx25, jsxs as jsxs18 } from "react/jsx-runtime";
4306
+ function BTCConnectModal({
4307
+ type = "login",
4308
+ onSuccess,
4309
+ ...props
4310
+ }) {
4311
+ const isDownMd = useDownMd();
4312
+ const intl = useIntl12();
4313
+ const { wallets: wallets2, installedWallets, chooseWallet, wallet, address, onConnect } = useBTCWallet();
4314
+ const iconMaps = {
4315
+ leather: /* @__PURE__ */ jsx25(LeatherIcon, { size: isDownMd ? 36 : 40 }),
4316
+ unisat: /* @__PURE__ */ jsx25(UnisatIcon, { size: isDownMd ? 36 : 40 }),
4317
+ xverse: /* @__PURE__ */ jsx25(XverseIcon, { size: isDownMd ? 36 : 40 })
4318
+ };
4319
+ const { events, login } = useMatch();
4320
+ const [status, setStatus] = useState20("");
4321
+ const statusRef = React10.useRef(status);
4322
+ const [error, setError] = useState20("");
4323
+ const connected = useMemo11(() => {
4324
+ return !!address;
4325
+ }, [address]);
4326
+ const disconnect = async () => {
4327
+ wallet && wallet.disconnet && wallet.disconnet();
4328
+ setStatus("");
4329
+ chooseWallet(null);
4330
+ statusRef.current = "";
4331
+ setError("");
4332
+ };
4333
+ const toLoginInWallet = async () => {
4334
+ if (statusRef.current || !address || !wallet) return;
4335
+ try {
4336
+ setStatus("nonce");
4337
+ statusRef.current = "nonce";
4338
+ const res = type == "bind" ? await getWalletInitApi({ address, type: "BTC" }) : await getWalletNonceApi({ address, type: "BTC" });
4339
+ if (!isSuccess(res)) {
4340
+ throw new Error(res.message);
4341
+ }
4342
+ const nonce = res.code >= 0 ? res.data.nonce : null;
4343
+ if (nonce) {
4344
+ setStatus("signer");
4345
+ statusRef.current = "signer";
4346
+ const message = "By signing, you are proving you own this wallet and logging in. This does not initiate a transaction or cost any fees.Nonce:" + res.data.nonce;
4347
+ const signedMessage = await wallet.signMessage(message);
4348
+ let obj = {
4349
+ type: "BTC",
4350
+ address,
4351
+ signature: signedMessage,
4352
+ message,
4353
+ connector_type: "BTC",
4354
+ wallet_client_type: wallet.walletKey
4355
+ };
4356
+ const res1 = type == "bind" ? await toBindWalletApi(obj) : await loginByWalletApi(obj);
4357
+ if (res1) {
4358
+ if (!isSuccess(res1)) {
4359
+ throw new Error(res1.message);
4360
+ }
4361
+ matchlog_default.log(res1);
4362
+ setStatus("success");
4363
+ statusRef.current = "success";
4364
+ if (type == "bind") {
4365
+ events.onBind && events.onBind({
4366
+ type: "btc"
4367
+ });
4368
+ eventManager_default.emit("onBind", {
4369
+ type: "btc"
4370
+ });
4371
+ } else {
4372
+ await login({
4373
+ mid: res1.data.mid,
4374
+ token: `${res1.data.token_type} ${res1.data.access_token}`
4375
+ });
4376
+ }
4377
+ onSuccess && onSuccess();
4378
+ }
4379
+ }
4380
+ } catch (error2) {
4381
+ console.error("btc error", error2);
4382
+ setStatus("error");
4383
+ setError(error2.message);
4384
+ statusRef.current = "";
4385
+ }
4386
+ };
4387
+ useEffect18(() => {
4388
+ if (wallet) {
4389
+ console.log("onConnect");
4390
+ try {
4391
+ onConnect();
4392
+ } catch (err) {
4393
+ setStatus("error");
4394
+ setError(err.message);
4395
+ }
4396
+ } else {
4397
+ setStatus("");
4398
+ }
4399
+ }, [wallet]);
4400
+ useEffect18(() => {
4401
+ if (address) {
4402
+ toLoginInWallet();
4403
+ }
4404
+ }, [address]);
4405
+ useEffect18(() => {
4406
+ if (!props.isOpen) {
4407
+ disconnect();
4408
+ }
4409
+ }, [props.isOpen]);
4410
+ const onBack = () => {
4411
+ wallet && wallet.disconnet && wallet.disconnet();
4412
+ setStatus("");
4413
+ chooseWallet(null);
4414
+ statusRef.current = "";
4415
+ setError("");
4416
+ };
4417
+ return /* @__PURE__ */ jsx25(ModalWithHeader, { ...props, title: props.title || intl.formatMessage({
4418
+ id: type == "bind" ? "bindWith" : "loginWith"
4419
+ }, {
4420
+ name: "BTC"
4421
+ }), onBack: wallet ? onBack : void 0, children: wallet ? /* @__PURE__ */ jsx25(
4422
+ WalletModalContent,
4423
+ {
4424
+ error,
4425
+ setError,
4426
+ status,
4427
+ disconnect,
4428
+ address: address || "",
4429
+ connected,
4430
+ visible: true,
4431
+ setVisible: () => {
4432
+ }
4433
+ }
4434
+ ) : /* @__PURE__ */ jsx25("div", { className: "matchid-login-box", children: /* @__PURE__ */ jsxs18("div", { className: "matchid-login-recommend-list", children: [
4435
+ installedWallets.map((wallet2) => {
4436
+ return /* @__PURE__ */ jsx25(
4437
+ RecommendItem,
4438
+ {
4439
+ icon: iconMaps[wallet2.walletKey],
4440
+ name: wallet2.name,
4441
+ onClick: () => {
4442
+ chooseWallet(wallet2);
4443
+ }
4444
+ },
4445
+ wallet2.walletKey
4446
+ );
4447
+ }),
4448
+ wallets2.filter((wallet2) => !installedWallets.find((installedWallet) => installedWallet.walletKey == wallet2.walletKey)).map((wallet2) => {
4449
+ return /* @__PURE__ */ jsx25(
4450
+ RecommendItem,
4451
+ {
4452
+ icon: iconMaps[wallet2.walletKey],
4453
+ name: wallet2.name,
4454
+ onClick: () => {
4455
+ },
4456
+ footer: /* @__PURE__ */ jsx25(Button, { size: "sm", onClick: () => {
4457
+ window.open(wallet2.website);
4458
+ }, children: "Install" })
4459
+ },
4460
+ wallet2.walletKey
4461
+ );
4462
+ })
4463
+ ] }) }) });
4464
+ }
4465
+ function BTCModal(props) {
4466
+ return props.isOpen && /* @__PURE__ */ jsx25(BTCConnectModal, { ...props });
4467
+ }
4468
+
4469
+ // src/components/WalletModal/index.tsx
4470
+ import { useMemo as useMemo12 } from "react";
4471
+ import { useIntl as useIntl13 } from "react-intl";
4472
+ import { jsx as jsx26 } from "react/jsx-runtime";
4473
+ function WalletConnectModal({
4474
+ type,
4475
+ methods: _methods,
4476
+ ...props
4477
+ }) {
4478
+ const intl = useIntl13();
4479
+ const { walletMap } = useWalletConfig();
4480
+ const { bind, login } = useUserInfo();
4481
+ const config = useAppConfig();
4482
+ const methods = useMemo12(() => {
4483
+ if (_methods) return _methods;
4484
+ if (!config.platform) {
4485
+ return [];
4486
+ }
4487
+ const platform = config.platform.map((p) => p.toLowerCase());
4488
+ return WALLET_METHODS.filter((m) => platform.includes(m));
4489
+ }, [config.platform, _methods]);
4490
+ return /* @__PURE__ */ jsx26(ModalWithHeader, { ...props, title: props.title || intl.formatMessage({
4491
+ id: type == "bind" ? "bindWith" : "loginWith"
4492
+ }, {
4493
+ name: ""
4494
+ }), children: /* @__PURE__ */ jsx26("div", { className: "matchid-login-box", children: /* @__PURE__ */ jsx26("div", { className: "matchid-login-recommend-list", children: methods.map((method, index) => {
4495
+ const m = walletMap[method];
4496
+ return /* @__PURE__ */ jsx26(
4497
+ RecommendItem,
4498
+ {
4499
+ icon: m?.icon,
4500
+ name: m?.name,
4501
+ onClick: () => {
4502
+ type == "bind" ? bind(method) : login(method);
4503
+ }
4504
+ },
4505
+ method
4506
+ );
4507
+ }) }) }) });
4508
+ }
4509
+ function WalletModal(props) {
4510
+ return props.isOpen && /* @__PURE__ */ jsx26(WalletConnectModal, { ...props });
4511
+ }
4512
+
4513
+ export {
4514
+ isSuccess,
4515
+ getBindListApi,
4516
+ getPohListApi,
4517
+ getBindInfoApi,
4518
+ bindCexApi,
4519
+ unBindApi,
4520
+ unBindWalletApi,
4521
+ verifyPohApi,
4522
+ chooseIdentityApi,
4523
+ mintPassportNftApi,
4524
+ useUserInfo,
4525
+ useMatchEvents,
4526
+ useWallet,
4527
+ useCopyClipboard,
4528
+ useModal,
4529
+ useToast,
4530
+ wallet_exports,
4531
+ useMatchChain,
4532
+ EmailModal,
4533
+ LoginBox,
4534
+ LoginPanel,
4535
+ LoginModal,
4536
+ LoginButton,
4537
+ UsernameModal,
4538
+ SOLModal,
4539
+ TRONModal,
4540
+ TONModal,
4541
+ BTCModal,
4542
+ WalletModal,
4543
+ components_exports,
4544
+ useMatchWallet,
4545
+ hooks_exports,
4546
+ MatchProvider,
4547
+ useMatch
4548
+ };
4549
+ //# sourceMappingURL=chunk-A477SJHT.mjs.map