sui.ski 0.1.0

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 (73) hide show
  1. package/AGENTS.md +311 -0
  2. package/CLAUDE.md +292 -0
  3. package/CODEBASE_GUIDE.md +217 -0
  4. package/README.md +77 -0
  5. package/biome.json +28 -0
  6. package/package.json +73 -0
  7. package/scripts/deploy-messaging-mainnet.sh +184 -0
  8. package/scripts/extract-suins-object.ts +180 -0
  9. package/scripts/full-deploy.sh +26 -0
  10. package/scripts/obsidian.ts +243 -0
  11. package/scripts/set-suins-contenthash.ts +130 -0
  12. package/scripts/setup-ika-dwallet.ts +338 -0
  13. package/scripts/transfer-upgrade-cap-from-nft.ts +86 -0
  14. package/src/durable-objects/wallet-session.ts +333 -0
  15. package/src/handlers/app.ts +1430 -0
  16. package/src/handlers/authenticated-events.ts +267 -0
  17. package/src/handlers/dashboard.ts +1659 -0
  18. package/src/handlers/landing.ts +6751 -0
  19. package/src/handlers/mcp.ts +556 -0
  20. package/src/handlers/messaging-sdk.ts +220 -0
  21. package/src/handlers/profile.css.ts +9332 -0
  22. package/src/handlers/profile.ts +12640 -0
  23. package/src/handlers/register2.ts +2811 -0
  24. package/src/handlers/ski-sign.ts +1901 -0
  25. package/src/handlers/ski.ts +314 -0
  26. package/src/handlers/thunder.ts +940 -0
  27. package/src/handlers/vault.ts +284 -0
  28. package/src/handlers/wallet-api.ts +169 -0
  29. package/src/handlers/x402-register.ts +601 -0
  30. package/src/index.test.ts +55 -0
  31. package/src/index.ts +512 -0
  32. package/src/resolvers/content.ts +231 -0
  33. package/src/resolvers/rpc.ts +222 -0
  34. package/src/resolvers/suins.ts +266 -0
  35. package/src/sdk/messaging.ts +279 -0
  36. package/src/types.ts +230 -0
  37. package/src/utils/agent-keypair.ts +40 -0
  38. package/src/utils/authenticated-events.ts +280 -0
  39. package/src/utils/cache.ts +82 -0
  40. package/src/utils/media-pack.ts +27 -0
  41. package/src/utils/mmr.ts +181 -0
  42. package/src/utils/ns-price.ts +529 -0
  43. package/src/utils/og-image.ts +141 -0
  44. package/src/utils/onchain-activity.ts +211 -0
  45. package/src/utils/onchain-listing.ts +39 -0
  46. package/src/utils/premium.ts +29 -0
  47. package/src/utils/pricing.ts +291 -0
  48. package/src/utils/pyth-price-info.ts +63 -0
  49. package/src/utils/response.ts +204 -0
  50. package/src/utils/rpc.ts +25 -0
  51. package/src/utils/shared-wallet-js.ts +166 -0
  52. package/src/utils/social.ts +152 -0
  53. package/src/utils/status.ts +39 -0
  54. package/src/utils/subdomain.ts +116 -0
  55. package/src/utils/surflux-grpc.ts +241 -0
  56. package/src/utils/swap-transactions.ts +1222 -0
  57. package/src/utils/thunder-css.ts +1341 -0
  58. package/src/utils/thunder-js.ts +5046 -0
  59. package/src/utils/transactions.ts +65 -0
  60. package/src/utils/vault.ts +18 -0
  61. package/src/utils/wallet-kit-js.ts +2312 -0
  62. package/src/utils/wallet-session-js.ts +192 -0
  63. package/src/utils/wallet-tx-js.ts +2287 -0
  64. package/src/utils/wallet-ui-js.ts +3057 -0
  65. package/src/utils/x402-middleware.ts +428 -0
  66. package/src/utils/x402-sui.ts +171 -0
  67. package/src/utils/zksend-js.ts +166 -0
  68. package/tsconfig.json +22 -0
  69. package/workers/x402-multichain/src/index.ts +237 -0
  70. package/workers/x402-multichain/src/types.ts +80 -0
  71. package/workers/x402-multichain/tsconfig.json +20 -0
  72. package/workers/x402-multichain/wrangler.toml +11 -0
  73. package/wrangler.toml +84 -0
@@ -0,0 +1,3057 @@
1
+ interface WalletUiConfig {
2
+ showPrimaryName?: boolean
3
+ onConnect?: string
4
+ onDisconnect?: string
5
+ widgetBrandLogoSrc?: string
6
+ keepBrandLogoWhenConnected?: boolean
7
+ primaryProfileHost?: string
8
+ }
9
+
10
+ export function generateWalletUiCss(): string {
11
+ return `
12
+ html.wk-modal-open, body.wk-modal-open { overflow: hidden !important; }
13
+ .wk-modal-overlay {
14
+ display: none;
15
+ position: fixed;
16
+ inset: 0;
17
+ background:
18
+ radial-gradient(circle at 20% 18%, rgba(140,180,220,0.06), transparent 38%),
19
+ radial-gradient(circle at 78% 12%, rgba(160,200,240,0.05), transparent 34%),
20
+ radial-gradient(circle at 52% 74%, rgba(140,180,220,0.04), transparent 44%),
21
+ rgba(4,8,16,0.82);
22
+ backdrop-filter: blur(12px);
23
+ -webkit-backdrop-filter: blur(12px);
24
+ z-index: 13000;
25
+ align-items: center;
26
+ justify-content: center;
27
+ padding: 10px;
28
+ overflow: hidden;
29
+ }
30
+ .wk-modal-overlay.open { display: flex; }
31
+ .wk-modal {
32
+ background: linear-gradient(180deg, #141820 0%, #0e1118 50%, #101520 100%);
33
+ border: 1px solid rgba(160,200,240,0.12);
34
+ border-radius: 12px;
35
+ max-width: 620px;
36
+ width: 100%;
37
+ overflow: hidden;
38
+ position: relative;
39
+ box-shadow: 0 28px 84px rgba(2,6,23,0.82), 0 0 38px rgba(180,210,240,0.1), inset 0 1px 0 rgba(200,220,255,0.06);
40
+ }
41
+ .wk-modal::before {
42
+ content: '';
43
+ position: absolute;
44
+ inset: 0;
45
+ pointer-events: none;
46
+ z-index: 0;
47
+ background:
48
+ radial-gradient(circle at 22% 12%, rgba(180,210,240,0.14), transparent 36%),
49
+ radial-gradient(circle at 82% 4%, rgba(200,220,245,0.1), transparent 32%),
50
+ radial-gradient(circle at 52% 118%, rgba(160,200,235,0.08), transparent 42%);
51
+ }
52
+ .wk-modal::after {
53
+ content: '';
54
+ position: absolute;
55
+ inset: 0;
56
+ pointer-events: none;
57
+ z-index: 0;
58
+ opacity: 0.3;
59
+ background-image:
60
+ radial-gradient(circle at 8% 18%, rgba(200,220,255,0.9) 0 1px, transparent 1.4px),
61
+ radial-gradient(circle at 22% 8%, rgba(200,220,255,0.7) 0 0.8px, transparent 1.2px),
62
+ radial-gradient(circle at 42% 28%, rgba(200,220,255,0.6) 0 0.6px, transparent 1px),
63
+ radial-gradient(circle at 58% 14%, rgba(210,225,255,0.8) 0 1px, transparent 1.4px),
64
+ radial-gradient(circle at 72% 22%, rgba(200,220,255,0.5) 0 0.7px, transparent 1.1px),
65
+ radial-gradient(circle at 88% 10%, rgba(200,220,255,0.7) 0 0.8px, transparent 1.2px),
66
+ radial-gradient(circle at 15% 42%, rgba(200,220,255,0.4) 0 0.6px, transparent 1px),
67
+ radial-gradient(circle at 35% 52%, rgba(200,220,255,0.5) 0 0.7px, transparent 1.1px),
68
+ radial-gradient(circle at 65% 38%, rgba(210,225,255,0.6) 0 0.8px, transparent 1.2px),
69
+ radial-gradient(circle at 82% 48%, rgba(200,220,255,0.4) 0 0.6px, transparent 1px),
70
+ radial-gradient(circle at 48% 62%, rgba(200,220,255,0.3) 0 0.5px, transparent 0.9px),
71
+ radial-gradient(circle at 92% 56%, rgba(200,220,255,0.35) 0 0.6px, transparent 1px);
72
+ animation: wk-snow-drift 8s ease-in-out infinite alternate;
73
+ }
74
+ @keyframes wk-snow-drift {
75
+ 0% { opacity: 0.3; transform: translateY(0); }
76
+ 50% { opacity: 0.2; }
77
+ 100% { opacity: 0.35; transform: translateY(3px); }
78
+ }
79
+ .wk-snow-layer {
80
+ position: absolute;
81
+ inset: 0;
82
+ pointer-events: none;
83
+ z-index: 0;
84
+ overflow: hidden;
85
+ }
86
+ .wk-snow-layer::before, .wk-snow-layer::after {
87
+ content: '';
88
+ position: absolute;
89
+ top: -20%;
90
+ left: 0;
91
+ right: 0;
92
+ height: 140%;
93
+ pointer-events: none;
94
+ }
95
+ .wk-snow-layer::before {
96
+ background-image:
97
+ radial-gradient(circle, rgba(255,255,255,0.7) 0 1px, transparent 1.2px),
98
+ radial-gradient(circle, rgba(220,235,255,0.6) 0 0.8px, transparent 1px),
99
+ radial-gradient(circle, rgba(255,255,255,0.5) 0 1.2px, transparent 1.5px),
100
+ radial-gradient(circle, rgba(220,235,255,0.4) 0 0.6px, transparent 0.9px),
101
+ radial-gradient(circle, rgba(255,255,255,0.6) 0 0.7px, transparent 1px),
102
+ radial-gradient(circle, rgba(220,235,255,0.5) 0 0.9px, transparent 1.2px);
103
+ background-size: 140px 180px, 120px 160px, 160px 200px, 100px 140px, 130px 170px, 150px 190px;
104
+ background-position: 10px 0, 60px 30px, 30px 60px, 90px 20px, 50px 80px, 110px 50px;
105
+ animation: wk-snowfall 12s linear infinite;
106
+ }
107
+ .wk-snow-layer::after {
108
+ background-image:
109
+ radial-gradient(circle, rgba(255,255,255,0.4) 0 0.5px, transparent 0.8px),
110
+ radial-gradient(circle, rgba(220,235,255,0.35) 0 0.6px, transparent 0.9px),
111
+ radial-gradient(circle, rgba(255,255,255,0.3) 0 0.7px, transparent 1px),
112
+ radial-gradient(circle, rgba(220,235,255,0.25) 0 0.5px, transparent 0.8px);
113
+ background-size: 180px 220px, 160px 200px, 200px 240px, 140px 180px;
114
+ background-position: 20px 10px, 80px 40px, 40px 70px, 100px 30px;
115
+ animation: wk-snowfall 18s linear infinite;
116
+ opacity: 0.6;
117
+ }
118
+ @keyframes wk-snowfall {
119
+ from { transform: translateY(-30%); }
120
+ to { transform: translateY(30%); }
121
+ }
122
+ .wk-modal > * {
123
+ position: relative;
124
+ z-index: 1;
125
+ }
126
+ @keyframes wk-modal-in {
127
+ from { opacity: 0; transform: scale(0.95) translateY(10px); }
128
+ to { opacity: 1; transform: scale(1) translateY(0); }
129
+ }
130
+ .wk-modal-header {
131
+ display: flex;
132
+ justify-content: space-between;
133
+ align-items: flex-start;
134
+ padding: 16px 14px 8px;
135
+ max-width: 520px;
136
+ width: 100%;
137
+ margin: 0 auto;
138
+ }
139
+ .wk-modal-header-left {
140
+ display: flex;
141
+ flex-direction: column;
142
+ align-items: flex-start;
143
+ gap: 0;
144
+ flex: 1;
145
+ min-width: 0;
146
+ }
147
+ .wk-modal-brand-row {
148
+ display: grid;
149
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
150
+ align-items: flex-end;
151
+ column-gap: 0;
152
+ width: 100%;
153
+ min-width: 0;
154
+ }
155
+ .wk-modal-title-wrap {
156
+ display: flex;
157
+ flex-direction: column;
158
+ align-items: flex-start;
159
+ justify-content: flex-end;
160
+ gap: 4px;
161
+ min-height: 92px;
162
+ min-width: 0;
163
+ justify-self: start;
164
+ }
165
+ .wk-modal-logo {
166
+ width: 132px;
167
+ height: 92px;
168
+ justify-self: end;
169
+ transform: translateX(4px);
170
+ border-radius: 10px;
171
+ overflow: hidden;
172
+ border: none;
173
+ background: transparent;
174
+ display: inline-flex;
175
+ align-items: center;
176
+ justify-content: center;
177
+ box-shadow: none;
178
+ isolation: isolate;
179
+ }
180
+ .wk-modal-logo-img {
181
+ width: 100%;
182
+ height: 100%;
183
+ object-fit: contain;
184
+ object-position: center bottom;
185
+ display: block;
186
+ filter: none;
187
+ forced-color-adjust: none;
188
+ color-scheme: only light;
189
+ }
190
+ .wk-modal-header h3 {
191
+ font-size: 2.02rem;
192
+ font-weight: 800;
193
+ margin: 0;
194
+ color: #ffffff;
195
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
196
+ letter-spacing: -0.02em;
197
+ line-height: 0.96;
198
+ white-space: nowrap;
199
+ }
200
+ .wk-modal-subtitle {
201
+ padding: 0;
202
+ margin: 0;
203
+ width: auto;
204
+ display: flex;
205
+ flex-direction: column;
206
+ align-items: flex-start;
207
+ gap: 0;
208
+ text-align: left;
209
+ color: #ffffff;
210
+ font-size: 1.16rem;
211
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
212
+ font-weight: 700;
213
+ letter-spacing: 0.01em;
214
+ line-height: 0.95;
215
+ text-shadow: 0 0 14px rgba(226,232,240,0.28);
216
+ pointer-events: none;
217
+ }
218
+ .wk-modal-subtitle span {
219
+ display: block;
220
+ white-space: nowrap;
221
+ }
222
+ .wk-modal-close {
223
+ background: rgba(255,255,255,0.05);
224
+ border: 1px solid rgba(255,255,255,0.06);
225
+ color: #5e5e74;
226
+ font-size: 1.15rem;
227
+ cursor: pointer;
228
+ padding: 0;
229
+ line-height: 1;
230
+ width: 28px;
231
+ height: 28px;
232
+ display: flex;
233
+ align-items: center;
234
+ justify-content: center;
235
+ border-radius: 6px;
236
+ transition: all 0.15s;
237
+ margin-right: 52px;
238
+ }
239
+ .wk-modal-close:hover {
240
+ background: rgba(239,68,68,0.2);
241
+ border-color: rgba(248,113,113,0.55);
242
+ color: #fecaca;
243
+ }
244
+
245
+ .wk-social-section {
246
+ padding: 0 16px;
247
+ max-width: 446px;
248
+ margin: 0 auto;
249
+ }
250
+ .wk-social-grid {
251
+ display: grid;
252
+ grid-template-columns: repeat(3, minmax(116px, 128px));
253
+ justify-content: center;
254
+ gap: 7px;
255
+ }
256
+ .wk-social-btn {
257
+ display: flex;
258
+ flex-direction: column;
259
+ align-items: center;
260
+ justify-content: center;
261
+ gap: 7px;
262
+ padding: 8px 7px 7px;
263
+ background: rgba(255,255,255,0.025);
264
+ border: 1px solid rgba(255,255,255,0.06);
265
+ border-radius: 8px;
266
+ cursor: pointer;
267
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
268
+ color: #8e8ea4;
269
+ font-size: 0.52rem;
270
+ font-weight: 500;
271
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
272
+ letter-spacing: 0.02em;
273
+ min-height: 98px;
274
+ }
275
+ .wk-social-btn:hover {
276
+ background: rgba(255,255,255,0.06);
277
+ border-color: rgba(255,255,255,0.14);
278
+ color: #d8d8ec;
279
+ transform: translateY(-1px);
280
+ box-shadow: 0 6px 18px rgba(0,0,0,0.3);
281
+ }
282
+ .wk-social-btn:active {
283
+ transform: translateY(0);
284
+ transition-duration: 0.05s;
285
+ }
286
+ .wk-social-btn svg {
287
+ width: 40px;
288
+ height: 40px;
289
+ flex-shrink: 0;
290
+ forced-color-adjust: none;
291
+ color-scheme: only light;
292
+ filter: none !important;
293
+ -webkit-filter: none !important;
294
+ }
295
+ .wk-social-btn svg * {
296
+ forced-color-adjust: none;
297
+ }
298
+ .wk-social-btn .wk-social-x-bg {
299
+ fill: #000000 !important;
300
+ }
301
+ .wk-social-btn .wk-social-x-mark {
302
+ fill: none !important;
303
+ stroke: #ffffff !important;
304
+ }
305
+ .wk-social-btn.wk-sep-left {
306
+ border-left: 1px solid rgba(255,255,255,0.06);
307
+ margin-left: 2px;
308
+ padding-left: 8px;
309
+ }
310
+ .wk-modal-wrap {
311
+ display: block;
312
+ max-width: 620px;
313
+ width: 100%;
314
+ max-height: none;
315
+ overflow: visible;
316
+ animation: wk-modal-in 0.22s cubic-bezier(0.16, 1, 0.3, 1);
317
+ }
318
+ .wk-modal-main {
319
+ display: grid;
320
+ grid-template-columns: minmax(244px, 296px) minmax(210px, 236px);
321
+ gap: 12px;
322
+ padding: 8px 14px 14px;
323
+ max-width: 520px;
324
+ width: 100%;
325
+ margin: 0 auto;
326
+ justify-content: center;
327
+ }
328
+ .wk-waap-column {
329
+ grid-column: 2;
330
+ grid-row: 1;
331
+ display: flex;
332
+ flex-direction: column;
333
+ align-items: center;
334
+ justify-content: center;
335
+ gap: 10px;
336
+ padding: 12px 8px;
337
+ background: rgba(8,12,20,0.56);
338
+ border: 1px solid rgba(160,200,240,0.12);
339
+ border-radius: 10px;
340
+ min-height: 236px;
341
+ width: 100%;
342
+ position: relative;
343
+ }
344
+ .wk-qr-link {
345
+ display: block;
346
+ padding: 10px;
347
+ background: rgba(10,14,24,0.9);
348
+ border: 1px solid rgba(160,200,240,0.1);
349
+ border-radius: 8px;
350
+ box-shadow: 0 4px 20px rgba(0,0,0,0.3);
351
+ transition: transform 0.18s, box-shadow 0.18s;
352
+ position: relative;
353
+ }
354
+ .wk-qr-link:hover {
355
+ transform: scale(1.04);
356
+ box-shadow: 0 6px 28px rgba(0,0,0,0.4), 0 0 24px rgba(99,102,241,0.12);
357
+ }
358
+ .wk-qr-link svg {
359
+ width: 100%;
360
+ height: 100%;
361
+ display: block;
362
+ color: #6366f1;
363
+ }
364
+ .wk-qr-link .wk-qr-center-logo {
365
+ position: absolute;
366
+ top: 50%;
367
+ left: 50%;
368
+ transform: translate(-50%, -50%);
369
+ border-radius: 6px;
370
+ background: rgba(10,14,24,0.95);
371
+ padding: 3px;
372
+ box-shadow: 0 0 8px rgba(0,0,0,0.4);
373
+ }
374
+ .wk-qr-link .wk-qr-center-logo img {
375
+ display: block;
376
+ border-radius: 4px;
377
+ }
378
+ .wk-waap-column .wk-qr-link {
379
+ width: 148px;
380
+ height: 148px;
381
+ z-index: 1;
382
+ }
383
+ .wk-waap-column .wk-qr-center-logo { width: 34px; height: 34px; }
384
+ .wk-waap-column .wk-qr-center-logo img { width: 28px; height: 28px; }
385
+ .wk-qr-copy {
386
+ background: none;
387
+ border: none;
388
+ color: rgba(255,255,255,0.45);
389
+ cursor: pointer;
390
+ padding: 4px;
391
+ transition: color 0.15s;
392
+ z-index: 1;
393
+ line-height: 1;
394
+ }
395
+ .wk-qr-copy:hover {
396
+ color: rgba(255,255,255,0.8);
397
+ }
398
+ .wk-qr-copy svg {
399
+ width: 16px;
400
+ height: 16px;
401
+ display: block;
402
+ }
403
+ .wk-trad-column {
404
+ grid-column: 1;
405
+ grid-row: 1;
406
+ min-width: 0;
407
+ background: rgba(8,12,20,0.4);
408
+ border: 1px solid rgba(160,200,240,0.08);
409
+ border-radius: 10px;
410
+ display: flex;
411
+ flex-direction: column;
412
+ }
413
+ .wk-trad-column .wk-divider {
414
+ padding: 10px 14px 6px;
415
+ }
416
+ .wk-trad-column .wk-wallet-list {
417
+ padding: 4px 10px 10px;
418
+ max-height: 250px;
419
+ overflow-x: hidden;
420
+ }
421
+ @media (min-width: 641px) and (max-height: 860px) {
422
+ .wk-modal-overlay {
423
+ padding: 10px;
424
+ }
425
+ .wk-modal-wrap {
426
+ max-height: none;
427
+ }
428
+ .wk-modal-header {
429
+ padding: 10px 10px 4px;
430
+ max-width: 478px;
431
+ }
432
+ .wk-modal-brand-row {
433
+ column-gap: 0;
434
+ }
435
+ .wk-modal-logo {
436
+ width: 104px;
437
+ height: 72px;
438
+ transform: translateX(3px);
439
+ }
440
+ .wk-modal-title-wrap {
441
+ min-height: 72px;
442
+ }
443
+ .wk-modal-header h3 {
444
+ font-size: 1.68rem;
445
+ }
446
+ .wk-modal-subtitle {
447
+ font-size: 0.96rem;
448
+ }
449
+ .wk-modal-close {
450
+ margin-right: 42px;
451
+ }
452
+ .wk-social-section {
453
+ padding: 0 12px;
454
+ max-width: 420px;
455
+ }
456
+ .wk-social-grid {
457
+ grid-template-columns: repeat(3, minmax(104px, 118px));
458
+ gap: 6px;
459
+ }
460
+ .wk-social-btn {
461
+ min-height: 82px;
462
+ gap: 4px;
463
+ padding: 6px;
464
+ }
465
+ .wk-social-btn svg {
466
+ width: 32px;
467
+ height: 32px;
468
+ }
469
+ .wk-powered-pill {
470
+ padding: 3px 10px;
471
+ margin: 2px auto 0;
472
+ font-size: 0.58rem;
473
+ }
474
+ .wk-modal-main {
475
+ grid-template-columns: minmax(228px, 276px) minmax(192px, 220px);
476
+ gap: 10px;
477
+ padding: 6px 12px 10px;
478
+ max-width: 478px;
479
+ }
480
+ .wk-waap-column {
481
+ min-height: 208px;
482
+ gap: 8px;
483
+ padding: 8px 6px;
484
+ }
485
+ .wk-waap-column .wk-qr-link {
486
+ width: 132px;
487
+ height: 132px;
488
+ }
489
+ .wk-trad-column .wk-divider {
490
+ padding: 8px 12px 4px;
491
+ }
492
+ .wk-trad-column .wk-wallet-list {
493
+ max-height: 208px;
494
+ padding: 2px 8px 8px;
495
+ }
496
+ .wk-wallet-item {
497
+ padding: 8px 12px;
498
+ font-size: 0.84rem;
499
+ }
500
+ .wk-wallet-item img {
501
+ width: 24px;
502
+ height: 24px;
503
+ }
504
+ }
505
+ @media (max-width: 640px) {
506
+ .wk-modal-overlay {
507
+ align-items: flex-start;
508
+ padding: 10px 10px 14px;
509
+ overflow-y: auto;
510
+ overflow-x: hidden;
511
+ -webkit-overflow-scrolling: touch;
512
+ }
513
+ .wk-modal-wrap {
514
+ max-width: 100%;
515
+ width: min(100%, 560px);
516
+ margin: 0 auto;
517
+ }
518
+ .wk-social-grid {
519
+ grid-template-columns: repeat(3, minmax(84px, 1fr));
520
+ gap: 5px;
521
+ }
522
+ .wk-social-btn {
523
+ min-height: 84px;
524
+ gap: 5px;
525
+ }
526
+ .wk-social-btn svg {
527
+ width: 30px;
528
+ height: 30px;
529
+ }
530
+ .wk-modal {
531
+ border-radius: 12px !important;
532
+ }
533
+ .wk-modal-header {
534
+ max-width: none;
535
+ padding: 12px 12px 6px;
536
+ }
537
+ .wk-modal-close {
538
+ margin-right: 0;
539
+ }
540
+ .wk-modal-main {
541
+ grid-template-columns: 1fr;
542
+ max-width: none;
543
+ padding: 8px 12px 12px;
544
+ }
545
+ .wk-trad-column {
546
+ grid-column: auto;
547
+ grid-row: auto;
548
+ }
549
+ .wk-waap-column {
550
+ grid-column: auto;
551
+ grid-row: auto;
552
+ min-height: 0;
553
+ padding: 10px 8px;
554
+ }
555
+ .wk-waap-column .wk-qr-link {
556
+ width: 120px;
557
+ height: 120px;
558
+ }
559
+ .wk-modal-header h3 {
560
+ font-size: 1.42rem;
561
+ }
562
+ .wk-modal-subtitle {
563
+ font-size: 0.94rem;
564
+ margin-top: 0;
565
+ width: auto;
566
+ }
567
+ .wk-modal-title-wrap {
568
+ min-height: 82px;
569
+ }
570
+ .wk-modal-logo {
571
+ width: 116px;
572
+ height: 82px;
573
+ transform: translateX(2px);
574
+ }
575
+ }
576
+ .wk-powered-pill {
577
+ display: flex;
578
+ width: max-content;
579
+ align-items: center;
580
+ justify-content: center;
581
+ gap: 5px;
582
+ padding: 4px 12px;
583
+ margin: 4px auto 0;
584
+ background: rgba(255,255,255,0.08);
585
+ border: 1px solid rgba(255,255,255,0.12);
586
+ border-radius: 8px;
587
+ color: rgba(255,255,255,0.8);
588
+ font-size: 0.62rem;
589
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
590
+ letter-spacing: 0.06em;
591
+ text-transform: uppercase;
592
+ text-decoration: none;
593
+ transition: all 0.18s;
594
+ }
595
+ .wk-powered-pill:hover {
596
+ background: rgba(255,255,255,0.14);
597
+ border-color: rgba(255,255,255,0.2);
598
+ color: #fff;
599
+ }
600
+ .wk-powered-pill img {
601
+ width: 14px;
602
+ height: 14px;
603
+ border-radius: 3px;
604
+ opacity: 0.9;
605
+ }
606
+ .wk-divider {
607
+ display: flex;
608
+ align-items: center;
609
+ padding: 10px 24px 6px;
610
+ gap: 14px;
611
+ }
612
+ .wk-divider::before, .wk-divider::after {
613
+ content: '';
614
+ flex: 1;
615
+ height: 1px;
616
+ background: rgba(200,220,240,0.1);
617
+ }
618
+ .wk-divider span {
619
+ color: rgba(255,255,255,0.7);
620
+ font-size: 0.68rem;
621
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
622
+ white-space: nowrap;
623
+ letter-spacing: 0.06em;
624
+ text-transform: uppercase;
625
+ }
626
+
627
+ .wk-wallet-list {
628
+ padding: 4px 14px 18px;
629
+ display: flex;
630
+ flex-direction: column;
631
+ gap: 2px;
632
+ max-height: 270px;
633
+ overflow-y: auto;
634
+ overflow-x: hidden;
635
+ scrollbar-width: thin;
636
+ scrollbar-color: rgba(255,255,255,0.95) rgba(255,255,255,0.12);
637
+ }
638
+ .wk-wallet-list::-webkit-scrollbar { width: 4px; }
639
+ .wk-wallet-list::-webkit-scrollbar-track { background: transparent; }
640
+ .wk-wallet-list::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.95); border-radius: 2px; }
641
+ .wk-wallet-list.wk-wallet-list-no-scroll {
642
+ max-height: none;
643
+ overflow-y: visible;
644
+ }
645
+ .wk-wallet-item {
646
+ display: flex;
647
+ align-items: center;
648
+ gap: 12px;
649
+ padding: 10px 14px;
650
+ background: transparent;
651
+ border: 1px solid transparent;
652
+ border-radius: 8px;
653
+ cursor: pointer;
654
+ transition: all 0.18s;
655
+ color: #b0b0c8;
656
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
657
+ font-size: 0.88rem;
658
+ font-weight: 500;
659
+ width: 100%;
660
+ min-width: 0;
661
+ text-align: left;
662
+ letter-spacing: -0.005em;
663
+ }
664
+ .wk-wallet-item:hover {
665
+ background: rgba(255,255,255,0.04);
666
+ border-color: rgba(255,255,255,0.07);
667
+ color: #e8e8f5;
668
+ }
669
+ .wk-wallet-item:active {
670
+ background: rgba(255,255,255,0.06);
671
+ transform: scale(0.99);
672
+ transition-duration: 0.05s;
673
+ }
674
+ .wk-wallet-item img {
675
+ width: 28px;
676
+ height: 28px;
677
+ border-radius: 8px;
678
+ flex-shrink: 0;
679
+ }
680
+ .wk-wallet-item .wk-wallet-name {
681
+ flex: 1;
682
+ min-width: 0;
683
+ overflow: hidden;
684
+ text-overflow: ellipsis;
685
+ white-space: nowrap;
686
+ }
687
+ .wk-wallet-item .wk-recent-badge {
688
+ flex-shrink: 0;
689
+ font-size: 0.62rem;
690
+ font-weight: 600;
691
+ color: #60a5fa;
692
+ background: rgba(96,165,250,0.1);
693
+ border: 1px solid rgba(96,165,250,0.15);
694
+ padding: 2px 7px;
695
+ border-radius: 6px;
696
+ letter-spacing: 0.04em;
697
+ text-transform: uppercase;
698
+ }
699
+
700
+ .wk-no-wallets {
701
+ text-align: center;
702
+ padding: 24px 20px;
703
+ color: #5a5a6e;
704
+ font-size: 0.85rem;
705
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
706
+ line-height: 1.5;
707
+ }
708
+ .wk-no-wallets a {
709
+ display: inline-block;
710
+ margin-top: 8px;
711
+ color: #60a5fa;
712
+ text-decoration: none;
713
+ font-size: 0.82rem;
714
+ }
715
+ .wk-no-wallets a:hover { text-decoration: underline; }
716
+ .wk-detecting {
717
+ display: flex;
718
+ flex-direction: column;
719
+ align-items: center;
720
+ justify-content: center;
721
+ gap: 10px;
722
+ padding: 28px;
723
+ color: #5a5a6e;
724
+ font-size: 0.85rem;
725
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
726
+ }
727
+ .wk-spinner {
728
+ width: 20px;
729
+ height: 20px;
730
+ border: 2px solid rgba(96,165,250,0.12);
731
+ border-top-color: #60a5fa;
732
+ border-radius: 50%;
733
+ animation: wk-spin 0.8s linear infinite;
734
+ }
735
+ @keyframes wk-spin { to { transform: rotate(360deg); } }
736
+ .wk-retry-btn {
737
+ display: inline-flex;
738
+ align-items: center;
739
+ justify-content: center;
740
+ padding: 10px 24px;
741
+ margin-top: 12px;
742
+ background: rgba(255,255,255,0.05);
743
+ border: 1px solid rgba(255,255,255,0.1);
744
+ border-radius: 10px;
745
+ color: #b0b0c8;
746
+ font-size: 0.82rem;
747
+ font-weight: 500;
748
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
749
+ cursor: pointer;
750
+ transition: all 0.15s;
751
+ }
752
+ .wk-retry-btn:hover {
753
+ background: rgba(255,255,255,0.08);
754
+ border-color: rgba(255,255,255,0.16);
755
+ color: #e0e0f0;
756
+ }
757
+
758
+ .wk-widget {
759
+ position: relative;
760
+ display: inline-block;
761
+ color-scheme: light dark;
762
+ --wk-widget-bg: rgba(248,250,252,0.84);
763
+ --wk-widget-border: rgba(15,23,42,0.18);
764
+ --wk-widget-text: #0f172a;
765
+ --wk-widget-muted: #475569;
766
+ --wk-widget-hover-bg: rgba(241,245,249,0.96);
767
+ --wk-widget-hover-border: rgba(59,130,246,0.38);
768
+ --wk-widget-shadow: 0 8px 20px rgba(15,23,42,0.12);
769
+ --wk-widget-connected-bg: rgba(255,255,255,0.88);
770
+ --wk-widget-connected-border: rgba(15,23,42,0.16);
771
+ --wk-widget-token: #0f172a;
772
+ --wk-widget-usd: #a16207;
773
+ --wk-dropdown-bg: rgba(255,255,255,0.96);
774
+ --wk-dropdown-border: rgba(15,23,42,0.12);
775
+ --wk-dropdown-text: #0f172a;
776
+ --wk-dropdown-item-hover: rgba(59,130,246,0.12);
777
+ --wk-dropdown-item-hover-border: rgba(59,130,246,0.3);
778
+ --wk-dropdown-shadow: 0 14px 36px rgba(15,23,42,0.2);
779
+ --wk-disconnect: #b91c1c;
780
+ --wk-disconnect-hover-bg: rgba(220,38,38,0.14);
781
+ --wk-disconnect-hover-border: rgba(220,38,38,0.3);
782
+ }
783
+ @media (prefers-color-scheme: dark) {
784
+ .wk-widget {
785
+ --wk-widget-bg: rgba(9,14,24,0.9);
786
+ --wk-widget-border: rgba(148,163,184,0.26);
787
+ --wk-widget-text: #e2e8f0;
788
+ --wk-widget-muted: #94a3b8;
789
+ --wk-widget-hover-bg: rgba(15,23,42,0.94);
790
+ --wk-widget-hover-border: rgba(96,165,250,0.5);
791
+ --wk-widget-shadow: 0 10px 24px rgba(2,6,23,0.42);
792
+ --wk-widget-connected-bg: rgba(10,16,28,0.9);
793
+ --wk-widget-connected-border: rgba(148,163,184,0.28);
794
+ --wk-widget-token: #f8fafc;
795
+ --wk-widget-usd: #fde68a;
796
+ --wk-dropdown-bg: rgba(2,6,23,0.97);
797
+ --wk-dropdown-border: rgba(96,165,250,0.3);
798
+ --wk-dropdown-text: #e2e8f0;
799
+ --wk-dropdown-item-hover: rgba(59,130,246,0.2);
800
+ --wk-dropdown-item-hover-border: rgba(96,165,250,0.34);
801
+ --wk-dropdown-shadow: 0 18px 44px rgba(2,6,23,0.62);
802
+ --wk-disconnect: #fca5a5;
803
+ --wk-disconnect-hover-bg: rgba(127,29,29,0.36);
804
+ --wk-disconnect-hover-border: rgba(248,113,113,0.34);
805
+ }
806
+ }
807
+ .wk-widget-btn {
808
+ display: inline-flex;
809
+ align-items: center;
810
+ gap: 6px;
811
+ padding: 8px 12px;
812
+ background: var(--wk-widget-bg);
813
+ border: 1px solid var(--wk-widget-border);
814
+ border-radius: 10px;
815
+ color: var(--wk-widget-text);
816
+ font-size: 0.85rem;
817
+ font-weight: 600;
818
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
819
+ cursor: pointer;
820
+ min-height: 34px;
821
+ backdrop-filter: blur(8px);
822
+ -webkit-backdrop-filter: blur(8px);
823
+ box-shadow: var(--wk-widget-shadow);
824
+ transition: background 0.16s, border-color 0.16s, transform 0.16s, box-shadow 0.16s, color 0.16s;
825
+ }
826
+ .wk-widget-btn:hover {
827
+ background: var(--wk-widget-hover-bg);
828
+ border-color: var(--wk-widget-hover-border);
829
+ transform: translateY(-1px);
830
+ }
831
+ .wk-widget-btn:not(.connected) {
832
+ font-size: 1rem;
833
+ font-weight: 700;
834
+ padding: 5px 10px;
835
+ min-height: 30px;
836
+ letter-spacing: 0;
837
+ line-height: 0;
838
+ }
839
+ .wk-widget-btn .wk-widget-brand-logo {
840
+ width: 80px;
841
+ height: auto;
842
+ display: block;
843
+ max-width: 100%;
844
+ border-radius: 6px;
845
+ filter: none !important;
846
+ -webkit-filter: none !important;
847
+ forced-color-adjust: none;
848
+ color-scheme: only light;
849
+ }
850
+ .wk-widget-btn .wk-widget-brand-wordmark {
851
+ display: inline-flex;
852
+ align-items: center;
853
+ gap: 8px;
854
+ line-height: 1;
855
+ }
856
+ .wk-widget-btn .wk-widget-brand-mark {
857
+ width: 16px;
858
+ height: 16px;
859
+ background: #49da91;
860
+ border: 1.5px solid #ffffff;
861
+ transform: none;
862
+ border-radius: 999px;
863
+ flex-shrink: 0;
864
+ }
865
+ .wallet-widget.has-black-diamond .wk-widget-btn .wk-widget-brand-mark {
866
+ background: #000000;
867
+ transform: rotate(45deg);
868
+ border-radius: 3px;
869
+ }
870
+ .wk-widget-btn .wk-widget-brand-text {
871
+ color: var(--wk-widget-text);
872
+ font-size: 0.84rem;
873
+ font-weight: 800;
874
+ letter-spacing: 0.04em;
875
+ }
876
+ .wk-widget-btn .wk-widget-brand-fallback {
877
+ display: inline-flex;
878
+ align-items: center;
879
+ gap: 8px;
880
+ }
881
+ .wk-widget-btn .wk-widget-brand-fallback svg {
882
+ width: 80px;
883
+ height: 20px;
884
+ display: block;
885
+ forced-color-adjust: none;
886
+ color-scheme: only light;
887
+ }
888
+ .wk-widget-btn.connected {
889
+ background: var(--wk-widget-connected-bg);
890
+ border-color: var(--wk-widget-connected-border);
891
+ color: var(--wk-widget-muted);
892
+ width: auto;
893
+ max-width: 280px;
894
+ gap: 6px;
895
+ padding: 6px 10px;
896
+ justify-content: flex-start;
897
+ }
898
+ .wk-widget-btn.connected .wk-widget-icon {
899
+ width: 18px;
900
+ height: 18px;
901
+ border-radius: 5px;
902
+ flex-shrink: 0;
903
+ filter: none !important;
904
+ -webkit-filter: none !important;
905
+ }
906
+ .wk-widget-btn.connected .wk-waap-badge {
907
+ width: 18px;
908
+ height: 18px;
909
+ border-radius: 5px;
910
+ flex-shrink: 0;
911
+ }
912
+ .wk-widget-btn.connected .wk-waap-badge + .wk-widget-icon,
913
+ .wk-widget-btn.connected .wk-waap-badge + .wk-widget-icon-fallback {
914
+ margin-left: -6px;
915
+ opacity: 0.85;
916
+ }
917
+ .wk-widget-btn.connected .wk-widget-icon-fallback {
918
+ display: inline-flex;
919
+ align-items: center;
920
+ justify-content: center;
921
+ flex-shrink: 0;
922
+ width: 18px;
923
+ height: 18px;
924
+ forced-color-adjust: none;
925
+ color-scheme: only light;
926
+ }
927
+ .wk-widget-btn.connected .wk-widget-icon-fallback svg {
928
+ display: block;
929
+ width: 18px;
930
+ height: 18px;
931
+ forced-color-adjust: none;
932
+ color-scheme: only light;
933
+ filter: none !important;
934
+ -webkit-filter: none !important;
935
+ }
936
+ .wk-widget-btn.connected .wk-widget-icon-fallback svg * {
937
+ forced-color-adjust: none;
938
+ }
939
+ .wk-widget-btn.connected .wk-widget-label-wrap {
940
+ min-width: 0;
941
+ flex: 1;
942
+ display: inline-flex;
943
+ align-items: center;
944
+ }
945
+ .wk-widget-btn.connected .wk-widget-title {
946
+ display: block;
947
+ min-width: 0;
948
+ overflow: hidden;
949
+ text-overflow: ellipsis;
950
+ white-space: nowrap;
951
+ color: var(--wk-widget-text);
952
+ font-weight: 700;
953
+ font-size: 0.78rem;
954
+ }
955
+ .wk-widget-btn.connected .wk-widget-primary-name {
956
+ color: var(--wk-widget-text);
957
+ font-weight: 700;
958
+ }
959
+ .wk-widget-btn.connected .wk-widget-balance-wrap {
960
+ display: inline-flex;
961
+ flex-direction: column;
962
+ align-items: flex-end;
963
+ gap: 1px;
964
+ flex-shrink: 0;
965
+ }
966
+ .wk-widget-btn.connected .wk-widget-token-row {
967
+ font-size: 0.58rem;
968
+ line-height: 1.15;
969
+ color: var(--wk-widget-token);
970
+ white-space: nowrap;
971
+ }
972
+ .wk-widget-btn.connected .wk-widget-usd-row {
973
+ font-size: 0.58rem;
974
+ line-height: 1.1;
975
+ color: var(--wk-widget-usd);
976
+ white-space: nowrap;
977
+ }
978
+ @media (max-width: 640px) {
979
+ .wk-widget-btn.connected {
980
+ max-width: 220px;
981
+ }
982
+ .wk-widget-btn.connected .wk-widget-token-row,
983
+ .wk-widget-btn.connected .wk-widget-usd-row {
984
+ font-size: 0.56rem;
985
+ }
986
+ }
987
+ .wk-widget-btn.session-only {
988
+ border-style: dashed;
989
+ }
990
+ .wk-dropdown {
991
+ display: block;
992
+ visibility: hidden;
993
+ opacity: 0;
994
+ pointer-events: none;
995
+ transform: translateY(-4px) scale(0.985);
996
+ transform-origin: top right;
997
+ transition: opacity 0.16s ease, transform 0.16s ease, visibility 0s linear 0.16s;
998
+ position: absolute;
999
+ right: 0;
1000
+ top: calc(100% + 6px);
1001
+ min-width: 198px;
1002
+ max-width: min(90vw, 320px);
1003
+ padding: 6px;
1004
+ background: var(--wk-dropdown-bg);
1005
+ border: 1px solid var(--wk-dropdown-border);
1006
+ border-radius: 14px;
1007
+ box-shadow: var(--wk-dropdown-shadow);
1008
+ z-index: 9999;
1009
+ }
1010
+ .wk-dropdown.open {
1011
+ visibility: visible;
1012
+ opacity: 1;
1013
+ pointer-events: auto;
1014
+ transform: translateY(0) scale(1);
1015
+ transition-delay: 0s;
1016
+ }
1017
+ .wk-dropdown-item {
1018
+ display: flex;
1019
+ align-items: center;
1020
+ gap: 10px;
1021
+ width: 100%;
1022
+ padding: 9px 10px;
1023
+ background: none;
1024
+ border: 1px solid transparent;
1025
+ border-radius: 10px;
1026
+ color: var(--wk-dropdown-text);
1027
+ font-size: 0.82rem;
1028
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
1029
+ cursor: pointer;
1030
+ transition: background 0.16s, border-color 0.16s, color 0.16s, transform 0.16s;
1031
+ text-decoration: none;
1032
+ text-align: left;
1033
+ }
1034
+ .wk-dropdown-item + .wk-dropdown-item {
1035
+ margin-top: 4px;
1036
+ }
1037
+ .wk-dropdown-item:hover {
1038
+ background: var(--wk-dropdown-item-hover);
1039
+ border-color: var(--wk-dropdown-item-hover-border);
1040
+ transform: translateY(-1px);
1041
+ }
1042
+ .wk-dropdown-item svg {
1043
+ width: 16px;
1044
+ height: 16px;
1045
+ flex-shrink: 0;
1046
+ opacity: 0.82;
1047
+ color: currentColor;
1048
+ }
1049
+ .wk-dropdown-item.disconnect {
1050
+ color: var(--wk-disconnect);
1051
+ }
1052
+ .wk-dropdown-item.disconnect:hover {
1053
+ background: var(--wk-disconnect-hover-bg);
1054
+ border-color: var(--wk-disconnect-hover-border);
1055
+ }
1056
+ .wk-copied-flash {
1057
+ position: absolute;
1058
+ right: 14px;
1059
+ top: 50%;
1060
+ transform: translateY(-50%);
1061
+ color: #34d399;
1062
+ font-size: 0.75rem;
1063
+ font-weight: 600;
1064
+ pointer-events: none;
1065
+ animation: wk-fade 1.5s ease forwards;
1066
+ }
1067
+ @keyframes wk-fade {
1068
+ 0% { opacity: 1; }
1069
+ 70% { opacity: 1; }
1070
+ 100% { opacity: 0; }
1071
+ }
1072
+ #waap-wallet-iframe-container {
1073
+ z-index: 13001 !important;
1074
+ background: rgba(2,6,23,0.45) !important;
1075
+ backdrop-filter: blur(8px) !important;
1076
+ -webkit-backdrop-filter: blur(8px) !important;
1077
+ }
1078
+ #waap-wallet-iframe-wrapper {
1079
+ height: 480px !important;
1080
+ max-height: 80vh !important;
1081
+ background: transparent !important;
1082
+ overflow: hidden !important;
1083
+ border-radius: 16px !important;
1084
+ }
1085
+ #waap-wallet-iframe {
1086
+ height: 480px !important;
1087
+ max-height: 80vh !important;
1088
+ border-radius: 16px !important;
1089
+ border: 1px solid rgba(148,163,184,0.28) !important;
1090
+ background: transparent !important;
1091
+ }
1092
+ @media (prefers-color-scheme: dark) {
1093
+ #waap-wallet-iframe-container {
1094
+ background: rgba(2,6,23,0.66) !important;
1095
+ }
1096
+ #waap-wallet-iframe {
1097
+ border-color: rgba(148,163,184,0.22) !important;
1098
+ }
1099
+ }
1100
+ #waap-wallet-iframe-container div[style*="background"] {
1101
+ background: transparent !important;
1102
+ background-color: transparent !important;
1103
+ }
1104
+ `
1105
+ }
1106
+
1107
+ export function generateWalletUiJs(config?: WalletUiConfig): string {
1108
+ const showPrimaryName = config?.showPrimaryName ?? true
1109
+ const onConnect = config?.onConnect ?? ''
1110
+ const onDisconnect = config?.onDisconnect ?? ''
1111
+ const widgetBrandLogoSrc = config?.widgetBrandLogoSrc ?? ''
1112
+ const keepBrandLogoWhenConnected = config?.keepBrandLogoWhenConnected ?? false
1113
+ const primaryProfileHost = config?.primaryProfileHost ?? 'sui.ski'
1114
+
1115
+ return `
1116
+ function __wkTruncAddr(addr) {
1117
+ return addr ? addr.slice(0, 6) + '...' + addr.slice(-4) : '';
1118
+ }
1119
+
1120
+ function __wkNormalizeSuiAddress(addr) {
1121
+ var value = typeof addr === 'string' ? addr.trim() : '';
1122
+ if (!value) return '';
1123
+ if (value.indexOf('0x') !== 0 && /^[0-9a-fA-F]+$/.test(value)) {
1124
+ return '0x' + value;
1125
+ }
1126
+ return value;
1127
+ }
1128
+
1129
+ function __wkIsValidSuiAddress(addr) {
1130
+ var normalized = __wkNormalizeSuiAddress(addr);
1131
+ return /^0x[0-9a-fA-F]{1,64}$/.test(normalized);
1132
+ }
1133
+
1134
+ function __wkGetPrimaryNameSlug(value) {
1135
+ var slug = typeof value === 'string' ? value.trim().toLowerCase() : '';
1136
+ if (!slug) return '';
1137
+ slug = slug.replace(/^@+/, '').replace(/\\.sui$/i, '');
1138
+ if (!slug) return '';
1139
+ return slug;
1140
+ }
1141
+
1142
+ function __wkGetPrimaryProfileHref(conn) {
1143
+ var slug = __wkGetPrimaryNameSlug(conn && conn.primaryName);
1144
+ if (!slug) return '';
1145
+ return 'https://' + encodeURIComponent(slug) + '.' + __wkPrimaryProfileHost;
1146
+ }
1147
+
1148
+ var __wkModalContainer = null;
1149
+ var __wkWidgetContainer = null;
1150
+ var __wkModalUnsub = null;
1151
+ var __wkModalWalletsUnsub = null;
1152
+ var __wkWidgetUnsub = null;
1153
+ var __wkWidgetDocClickBound = false;
1154
+ var __wkWidgetBtnMarkup = '';
1155
+ var __wkWidgetBtnStateClass = '';
1156
+ var __wkWidgetDropdownMarkup = '';
1157
+ var __wkLastWalletKey = 'sui_ski_last_wallet';
1158
+ var __wkKeepBrandLogoWhenConnected = ${keepBrandLogoWhenConnected ? 'true' : 'false'};
1159
+ var __wkPrimaryProfileHost = ${JSON.stringify(primaryProfileHost)};
1160
+ var __wkWidgetBrandLogoSrc = 'data:image/webp;base64,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';
1161
+ var __wkWidgetBrandFallbackSvg = '<svg class="wk-widget-brand-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 40" fill="none" role="img" aria-label=".SKI"><rect width="160" height="40" rx="9" fill="#05070d"/><rect x="3" y="3" width="34" height="34" rx="8" fill="#177EC7" stroke="#fff" stroke-width="2"/><path d="M51 29V11h12.1c4.1 0 6.9 2.2 6.9 5.5 0 2.5-1.4 4.3-3.8 5.1l4.6 7.4h-6.3l-4-6.5h-3.6V29H51zm5.8-10.8h5.8c1.2 0 1.9-.7 1.9-1.7 0-1-.7-1.7-1.9-1.7h-5.8v3.4zM71.4 29V11h5.8v18h-5.8zm7.9-18h15v4.8h-9.2v2.2h8.3v4.6h-8.3v1.7h9.5V29H79.3V11z" fill="#fff"/></svg>';
1162
+ function __wkWidgetDefaultLogoMarkup() {
1163
+ return '<span class="wk-widget-brand-wordmark"><span class="wk-widget-brand-mark"></span><span class="wk-widget-brand-text">SKI</span></span>';
1164
+ }
1165
+ function __wkWidgetBrandMarkupFromSrc(src) {
1166
+ if (!src) return __wkWidgetDefaultLogoMarkup();
1167
+ var fallback = __wkWidgetBrandFallbackSvg.replace(/"/g, '&quot;');
1168
+ return '<span class="wk-widget-brand-fallback"><img src="' + src + '" class="wk-widget-brand-logo" alt=".SKI" draggable="false" onerror="this.onerror=null;this.outerHTML=\\'' + fallback + '\\'"></span>';
1169
+ }
1170
+ var __wkWidgetDefaultMarkup = __wkWidgetBrandMarkupFromSrc('');
1171
+ if (${JSON.stringify(widgetBrandLogoSrc)}) {
1172
+ __wkWidgetBrandLogoSrc = ${JSON.stringify(widgetBrandLogoSrc)};
1173
+ __wkWidgetDefaultMarkup = __wkWidgetBrandMarkupFromSrc(__wkWidgetBrandLogoSrc);
1174
+ }
1175
+
1176
+ var __wkPortfolioTimer = null;
1177
+ var __wkPortfolioData = null;
1178
+ var __wkExpandedL1 = {};
1179
+ var __wkLocalWalletMap = {};
1180
+ var __wkBridgeWalletCache = {};
1181
+ var __wkBridgeWalletOrder = [];
1182
+ var __wkLastBridgeHintSignature = '';
1183
+ var __wkBridgeHiddenStyle = 'position:fixed;left:-10000px;top:0;width:1px;height:1px;opacity:0;pointer-events:none;border:0;z-index:-1;background:transparent';
1184
+ var __wkDetectedWalletCacheKey = 'sui_ski_detected_wallets_v1';
1185
+ var __wkBridgeDetectedWalletCacheKey = 'sui_ski_bridge_detected_wallets_v1';
1186
+ var __wkDetectedWalletCacheMaxAgeMs = 1000 * 60 * 60 * 24 * 14;
1187
+
1188
+ function __wkResetBridgeWalletCache() {
1189
+ __wkBridgeWalletCache = {};
1190
+ __wkBridgeWalletOrder = [];
1191
+ }
1192
+
1193
+ function __wkGetBridgeWalletSnapshot() {
1194
+ var out = [];
1195
+ for (var i = 0; i < __wkBridgeWalletOrder.length; i++) {
1196
+ var key = __wkBridgeWalletOrder[i];
1197
+ if (__wkBridgeWalletCache[key]) out.push(__wkBridgeWalletCache[key]);
1198
+ }
1199
+ return out;
1200
+ }
1201
+
1202
+ function __wkMergeBridgeWallets(wallets) {
1203
+ var list = Array.isArray(wallets) ? wallets : [];
1204
+ for (var i = 0; i < list.length; i++) {
1205
+ var wallet = list[i];
1206
+ if (!wallet || !wallet.name) continue;
1207
+ var key = __wkWalletNameKey(wallet.name);
1208
+ if (!key) key = 'wallet-' + i;
1209
+ var existing = __wkBridgeWalletCache[key];
1210
+ if (!existing) {
1211
+ __wkBridgeWalletCache[key] = {
1212
+ name: String(wallet.name),
1213
+ icon: wallet.icon ? String(wallet.icon) : '',
1214
+ __isPasskey: !!wallet.__isPasskey,
1215
+ };
1216
+ __wkBridgeWalletOrder.push(key);
1217
+ continue;
1218
+ }
1219
+ if (!existing.icon && wallet.icon) {
1220
+ existing.icon = String(wallet.icon);
1221
+ }
1222
+ if (existing.__isPasskey && !wallet.__isPasskey) {
1223
+ existing.__isPasskey = false;
1224
+ }
1225
+ }
1226
+ return __wkGetBridgeWalletSnapshot();
1227
+ }
1228
+
1229
+ function __wkSerializeWalletForCache(wallet) {
1230
+ if (!wallet || !wallet.name) return null;
1231
+ return {
1232
+ name: String(wallet.name),
1233
+ icon: wallet.icon ? String(wallet.icon) : '',
1234
+ __isPasskey: !!wallet.__isPasskey,
1235
+ };
1236
+ }
1237
+
1238
+ function __wkReadDetectedWalletCache(keyOverride) {
1239
+ try {
1240
+ var cacheKey = keyOverride || __wkDetectedWalletCacheKey;
1241
+ var raw = localStorage.getItem(cacheKey);
1242
+ if (!raw) return [];
1243
+ var parsed = JSON.parse(raw);
1244
+ if (!parsed || typeof parsed !== 'object') return [];
1245
+ var ts = Number(parsed.ts || 0);
1246
+ if (!Number.isFinite(ts) || ts <= 0) return [];
1247
+ if ((Date.now() - ts) > __wkDetectedWalletCacheMaxAgeMs) return [];
1248
+ var wallets = Array.isArray(parsed.wallets) ? parsed.wallets : [];
1249
+ var out = [];
1250
+ for (var i = 0; i < wallets.length; i++) {
1251
+ var serialized = __wkSerializeWalletForCache(wallets[i]);
1252
+ if (serialized) out.push(serialized);
1253
+ }
1254
+ return out;
1255
+ } catch (_e) {
1256
+ return [];
1257
+ }
1258
+ }
1259
+
1260
+ function __wkWriteDetectedWalletCache(wallets, keyOverride) {
1261
+ try {
1262
+ var cacheKey = keyOverride || __wkDetectedWalletCacheKey;
1263
+ var list = Array.isArray(wallets) ? wallets : [];
1264
+ var serialized = [];
1265
+ for (var i = 0; i < list.length; i++) {
1266
+ var item = __wkSerializeWalletForCache(list[i]);
1267
+ if (item) serialized.push(item);
1268
+ }
1269
+ localStorage.setItem(cacheKey, JSON.stringify({
1270
+ ts: Date.now(),
1271
+ wallets: serialized,
1272
+ }));
1273
+ } catch (_e) {}
1274
+ }
1275
+
1276
+ function __wkFormatBalance(sui) {
1277
+ if (sui < 0.01) return '< 0.01';
1278
+ if (sui < 10000) {
1279
+ var snapped = Math.round(sui);
1280
+ if (Math.abs(sui - snapped) <= 0.05) return String(snapped);
1281
+ }
1282
+ if (sui < 100) {
1283
+ return sui.toFixed(2).replace(/\\.?0+$/, '');
1284
+ }
1285
+ if (sui < 10000) return sui.toFixed(1);
1286
+ if (sui < 1000000) return (sui / 1000).toFixed(1) + 'k';
1287
+ return (sui / 1000000).toFixed(1) + 'M';
1288
+ }
1289
+
1290
+ function __wkFormatUsd(usd) {
1291
+ if (usd < 0.01) return '< $0.01';
1292
+ if (usd < 100) return '$' + usd.toFixed(2);
1293
+ if (usd < 10000) return '$' + usd.toFixed(0);
1294
+ if (usd < 1000000) return '$' + (usd / 1000).toFixed(1) + 'k';
1295
+ return '$' + (usd / 1000000).toFixed(1) + 'M';
1296
+ }
1297
+
1298
+ function __wkNormalizeHoldingSymbol(name) {
1299
+ return String(name || '').trim().toUpperCase().replace(/[^A-Z0-9]/g, '');
1300
+ }
1301
+
1302
+ function __wkHoldingBucket(symbol) {
1303
+ if (!symbol) return '';
1304
+ if (symbol === 'SUI' || symbol === 'WSUI') return 'SUI';
1305
+ if (symbol === 'ETH' || symbol === 'WETH') return 'ETH';
1306
+ if (symbol === 'SOL' || symbol === 'WSOL') return 'SOL';
1307
+ return '';
1308
+ }
1309
+
1310
+ function __wkIsStablecoin(symbol) {
1311
+ if (!symbol) return false;
1312
+ var s = symbol.toUpperCase();
1313
+ return s === 'USDC' || s === 'USDT' || s === 'DAI' || s === 'AUSD' || s === 'BUCK' || s === 'FDUSD' || s === 'WUSDC' || s === 'WUSDT';
1314
+ }
1315
+
1316
+ function __wkGetStablecoinTotal(portfolioData) {
1317
+ if (!portfolioData || !Array.isArray(portfolioData.holdings)) return 0;
1318
+ var total = 0;
1319
+ for (var i = 0; i < portfolioData.holdings.length; i++) {
1320
+ var holding = portfolioData.holdings[i];
1321
+ var symbol = __wkNormalizeHoldingSymbol(holding && holding.name);
1322
+ if (!__wkIsStablecoin(symbol)) continue;
1323
+ var amount = Number(holding && holding.balance);
1324
+ if (Number.isFinite(amount) && amount > 0) total += amount;
1325
+ }
1326
+ return total;
1327
+ }
1328
+
1329
+ function __wkFormatTokenAmount(value) {
1330
+ if (!Number.isFinite(value) || value <= 0) return '0';
1331
+ if (value < 0.0001) return '<0.0001';
1332
+ if (value < 1) return value.toFixed(4).replace(/\\.?0+$/, '');
1333
+ if (value < 100) return value.toFixed(3).replace(/\\.?0+$/, '');
1334
+ if (value < 10000) return value.toFixed(2).replace(/\\.?0+$/, '');
1335
+ if (value < 1000000) return (value / 1000).toFixed(1) + 'k';
1336
+ return (value / 1000000).toFixed(1) + 'M';
1337
+ }
1338
+
1339
+ function __wkGetNonL1Holdings(portfolioData) {
1340
+ if (!portfolioData || !Array.isArray(portfolioData.holdings)) return [];
1341
+ var merged = {};
1342
+ for (var i = 0; i < portfolioData.holdings.length; i++) {
1343
+ var holding = portfolioData.holdings[i];
1344
+ var symbol = __wkNormalizeHoldingSymbol(holding && holding.name);
1345
+ if (!symbol || __wkHoldingBucket(symbol)) continue;
1346
+ var amount = Number(holding && holding.balance);
1347
+ if (!Number.isFinite(amount) || amount <= 0) continue;
1348
+ var suiValue = Number(holding && holding.suiValue);
1349
+ if (!merged[symbol]) {
1350
+ merged[symbol] = { name: symbol, balance: 0, suiValue: 0 };
1351
+ }
1352
+ merged[symbol].balance += amount;
1353
+ if (Number.isFinite(suiValue) && suiValue > 0) {
1354
+ merged[symbol].suiValue += suiValue;
1355
+ }
1356
+ }
1357
+ return Object.keys(merged)
1358
+ .map(function(key) { return merged[key]; })
1359
+ .sort(function(a, b) { return b.suiValue - a.suiValue; });
1360
+ }
1361
+
1362
+ var __wkL1Order = ['SUI', 'ETH', 'SOL'];
1363
+
1364
+ var __wkL1Icons = {
1365
+ SUI: '<svg viewBox="0 0 300 384" width="14" height="18" style="display:inline-block;vertical-align:-3px;fill:#4DA2FF;"><path fill-rule="evenodd" clip-rule="evenodd" d="M240.057 159.914C255.698 179.553 265.052 204.39 265.052 231.407C265.052 258.424 255.414 284.019 239.362 303.768L237.971 305.475L237.608 303.31C237.292 301.477 236.929 299.613 236.502 297.749C228.46 262.421 202.265 232.134 159.148 207.597C130.029 191.071 113.361 171.195 108.985 148.586C106.157 133.972 108.258 119.294 112.318 106.717C116.379 94.1569 122.414 83.6187 127.549 77.2831L144.328 56.7754C147.267 53.1731 152.781 53.1731 155.719 56.7754L240.073 159.914H240.057ZM266.584 139.422L154.155 1.96703C152.007 -0.655678 147.993 -0.655678 145.845 1.96703L33.4316 139.422L33.0683 139.881C12.3868 165.555 0 198.181 0 233.698C0 316.408 67.1635 383.461 150 383.461C232.837 383.461 300 316.408 300 233.698C300 198.181 287.613 165.555 266.932 139.896L266.568 139.438L266.584 139.422ZM60.3381 159.472L70.3866 147.164L70.6868 149.439C70.9237 151.24 71.2239 153.041 71.5715 154.858C78.0809 189.001 101.322 217.456 140.173 239.496C173.952 258.724 193.622 280.828 199.278 305.064C201.648 315.176 202.059 325.129 201.032 333.835L200.969 334.372L200.479 334.609C185.233 342.05 168.09 346.237 149.984 346.237C86.4546 346.237 34.9484 294.826 34.9484 231.391C34.9484 204.153 44.4439 179.142 60.3065 159.44L60.3381 159.472Z"></path></svg>',
1366
+ ETH: '<svg viewBox="0 0 256 417" width="10" height="18" style="display:inline-block;vertical-align:-3px;"><path d="M127.961 0l-2.795 9.5v275.668l2.795 2.79 127.962-75.638z" fill="#627EEA"/><path d="M127.962 0L0 212.32l127.962 75.639V154.158z" fill="#8C8FE6"/><path d="M127.961 312.187l-1.575 1.92V414.79l1.575 4.6L256 236.587z" fill="#627EEA"/><path d="M127.962 419.39V312.187L0 236.587z" fill="#8C8FE6"/><path d="M127.961 287.958l127.96-75.637-127.96-58.162z" fill="#3C3C94"/><path d="M0 212.32l127.96 75.639V154.159z" fill="#627EEA"/></svg>',
1367
+ SOL: '<svg viewBox="0 0 398 312" width="16" height="14" style="display:inline-block;vertical-align:-2px;"><defs><linearGradient id="sol-a" x1="360.879" y1="351.455" x2="141.213" y2="-69.294" gradientUnits="userSpaceOnUse"><stop stop-color="#00FFA3"/><stop offset="1" stop-color="#DC1FFF"/></linearGradient><linearGradient id="sol-b" x1="264.829" y1="401.601" x2="45.163" y2="-19.148" gradientUnits="userSpaceOnUse"><stop stop-color="#00FFA3"/><stop offset="1" stop-color="#DC1FFF"/></linearGradient><linearGradient id="sol-c" x1="312.548" y1="376.688" x2="92.882" y2="-44.061" gradientUnits="userSpaceOnUse"><stop stop-color="#00FFA3"/><stop offset="1" stop-color="#DC1FFF"/></linearGradient></defs><path d="M64.6 237.9c2.4-2.4 5.7-3.8 9.2-3.8h317.4c5.8 0 8.7 7 4.6 11.1l-62.7 62.7c-2.4 2.4-5.7 3.8-9.2 3.8H6.5c-5.8 0-8.7-7-4.6-11.1z" fill="url(#sol-a)"/><path d="M64.6 3.8C67.1 1.4 70.4 0 73.8 0h317.4c5.8 0 8.7 7 4.6 11.1l-62.7 62.7c-2.4 2.4-5.7 3.8-9.2 3.8H6.5c-5.8 0-8.7-7-4.6-11.1z" fill="url(#sol-b)"/><path d="M333.1 120.1c-2.4-2.4-5.7-3.8-9.2-3.8H6.5c-5.8 0-8.7 7-4.6 11.1l62.7 62.7c2.4 2.4 5.7 3.8 9.2 3.8h317.4c5.8 0 8.7-7 4.6-11.1z" fill="url(#sol-c)"/></svg>'
1368
+ };
1369
+
1370
+ function __wkGetL1Holdings(portfolioData) {
1371
+ if (!portfolioData || !Array.isArray(portfolioData.holdings)) return [];
1372
+ var buckets = {};
1373
+ for (var i = 0; i < portfolioData.holdings.length; i++) {
1374
+ var holding = portfolioData.holdings[i];
1375
+ var symbol = __wkNormalizeHoldingSymbol(holding && holding.name);
1376
+ var bucket = __wkHoldingBucket(symbol);
1377
+ if (!bucket) continue;
1378
+ var amount = Number(holding && holding.balance);
1379
+ if (!Number.isFinite(amount)) amount = 0;
1380
+ var suiValue = Number(holding && holding.suiValue);
1381
+ if (!Number.isFinite(suiValue)) suiValue = 0;
1382
+ if (!buckets[bucket]) {
1383
+ buckets[bucket] = { name: bucket, balance: 0, suiValue: 0 };
1384
+ }
1385
+ buckets[bucket].balance += amount;
1386
+ buckets[bucket].suiValue += suiValue;
1387
+ }
1388
+ var result = [];
1389
+ for (var o = 0; o < __wkL1Order.length; o++) {
1390
+ var key = __wkL1Order[o];
1391
+ if (buckets[key] && buckets[key].balance > 0) {
1392
+ result.push(buckets[key]);
1393
+ }
1394
+ }
1395
+ return result;
1396
+ }
1397
+
1398
+ function __wkGetL1SubTokens(l1Name, portfolioData) {
1399
+ if (l1Name === 'SUI') return __wkGetNonL1Holdings(portfolioData);
1400
+ if (!portfolioData || !Array.isArray(portfolioData.holdings)) return [];
1401
+ var entries = [];
1402
+ for (var i = 0; i < portfolioData.holdings.length; i++) {
1403
+ var holding = portfolioData.holdings[i];
1404
+ var symbol = __wkNormalizeHoldingSymbol(holding && holding.name);
1405
+ if (__wkHoldingBucket(symbol) !== l1Name || symbol === l1Name) continue;
1406
+ var amount = Number(holding && holding.balance);
1407
+ if (!Number.isFinite(amount) || amount <= 0) continue;
1408
+ var suiValue = Number(holding && holding.suiValue);
1409
+ entries.push({ name: symbol, balance: amount, suiValue: Number.isFinite(suiValue) ? suiValue : 0 });
1410
+ }
1411
+ return entries.sort(function(a, b) { return b.suiValue - a.suiValue; });
1412
+ }
1413
+
1414
+ async function __wkFetchPortfolio(address) {
1415
+ try {
1416
+ var suiClient = typeof getSuiClient === 'function' ? getSuiClient() : null;
1417
+ if (!suiClient) return null;
1418
+
1419
+ var SUI_TYPE = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI';
1420
+ var suiBal = await suiClient.getBalance({ owner: address, coinType: SUI_TYPE }).catch(function() { return { totalBalance: '0' }; });
1421
+ var suiAmount = Number(BigInt(suiBal.totalBalance)) / 1e9;
1422
+ var totalSui = suiAmount;
1423
+ var holdings = [{ name: 'SUI', balance: suiAmount, suiValue: suiAmount }];
1424
+
1425
+ var poolsRaw = await fetch('/api/deepbook-pools').then(function(r) { return r.json(); }).catch(function() { return []; });
1426
+ var pools = [];
1427
+ if (Array.isArray(poolsRaw) && poolsRaw.length) {
1428
+ var poolByCoinType = {};
1429
+ for (var p = 0; p < poolsRaw.length; p++) {
1430
+ var pool = poolsRaw[p];
1431
+ if (!pool || typeof pool.coinType !== 'string' || !pool.coinType) continue;
1432
+ var existing = poolByCoinType[pool.coinType];
1433
+ if (!existing) {
1434
+ poolByCoinType[pool.coinType] = pool;
1435
+ continue;
1436
+ }
1437
+ if (!existing.isDirect && pool.isDirect) {
1438
+ poolByCoinType[pool.coinType] = pool;
1439
+ continue;
1440
+ }
1441
+ var nextRate = Number(pool.suiPerToken || 0);
1442
+ var existingRate = Number(existing.suiPerToken || 0);
1443
+ if (Number.isFinite(nextRate) && nextRate > existingRate) {
1444
+ poolByCoinType[pool.coinType] = pool;
1445
+ }
1446
+ }
1447
+ pools = Object.values(poolByCoinType);
1448
+ }
1449
+ if (pools.length) {
1450
+ var balances = await Promise.all(
1451
+ pools.map(function(p) {
1452
+ return suiClient.getBalance({ owner: address, coinType: p.coinType }).catch(function() { return { totalBalance: '0' }; });
1453
+ })
1454
+ );
1455
+ for (var i = 0; i < pools.length; i++) {
1456
+ var bal = Number(BigInt(balances[i].totalBalance));
1457
+ if (bal <= 0) continue;
1458
+ var tokenAmount = bal / Math.pow(10, pools[i].decimals);
1459
+ var suiValue = tokenAmount * pools[i].suiPerToken * 0.95;
1460
+ totalSui += suiValue;
1461
+ holdings.push({ name: pools[i].name, balance: tokenAmount, suiValue: suiValue });
1462
+ }
1463
+ }
1464
+
1465
+ var usdcData = await fetch('/api/usdc-price').then(function(r) { return r.json(); }).catch(function() { return null; });
1466
+ var usdcPerSui = usdcData && usdcData.usdcPerSui ? usdcData.usdcPerSui : 0;
1467
+
1468
+ return { totalSui: totalSui, usdcPerSui: usdcPerSui, holdings: holdings };
1469
+ } catch (e) {
1470
+ return null;
1471
+ }
1472
+ }
1473
+
1474
+ function __wkStartPortfolioPolling(address) {
1475
+ __wkStopPortfolioPolling();
1476
+ function poll() {
1477
+ __wkFetchPortfolio(address).then(function(data) {
1478
+ if (data) {
1479
+ __wkPortfolioData = data;
1480
+ __wkUpdateWidget(SuiWalletKit.$connection.value);
1481
+ }
1482
+ });
1483
+ }
1484
+ poll();
1485
+ __wkPortfolioTimer = setInterval(poll, 60000);
1486
+ }
1487
+
1488
+ function __wkStopPortfolioPolling() {
1489
+ if (__wkPortfolioTimer) {
1490
+ clearInterval(__wkPortfolioTimer);
1491
+ __wkPortfolioTimer = null;
1492
+ }
1493
+ __wkPortfolioData = null;
1494
+ }
1495
+
1496
+ function __wkDefaultIcon() {
1497
+ return 'data:image/svg+xml,' + encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><circle fill="#818cf8" cx="16" cy="16" r="16"/></svg>');
1498
+ }
1499
+
1500
+ var __wkWaaPIcon = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4Ij48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjNjM2NmYxIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjYTg1NWY3Ii8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3Qgd2lkdGg9IjEyOCIgaGVpZ2h0PSIxMjgiIGZpbGw9InVybCgjZykiIHJ4PSIyNCIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE0LDE0KSBzY2FsZSgxKSI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02Mi4xOCAwQzY3LjYzIDAgNzEuNjUgMy4xIDc0LjQ4IDcuMDljMi41OCAzLjY0IDQuMzcgOC4yNiA1LjY0IDEyLjc3IDQuNTEgMS4yNiA5LjEzIDMuMDQgMTIuNzcgNS42MiAzLjk5IDIuODMgNy4xIDYuODUgNy4xIDEyLjMgMCA1LjAyLTIuNTUgOS4wNy02Ljg4IDEyLjIgNC4zMyAzLjEzIDYuODggNy4xOCA2Ljg5IDEyLjIgMCA1LjQ1LTMuMSA5LjQ3LTcuMDkgMTIuMy0zLjY0IDIuNTgtOC4yNiA0LjM3LTEyLjc3IDUuNjQtMS4yNiA0LjUyLTMuMDQgOS4xNC01LjYyIDEyLjc4LTIuODMgMy45OS02Ljg1IDcuMS0xMi4zIDcuMS01LjAyIDAtOS4wNy0yLjU1LTEyLjItNi44OC0zLjEzIDQuMzMtNy4xOCA2Ljg4LTEyLjIgNi44OS01LjQ1IDAtOS40Ny0zLjEtMTIuMy03LjA5LTIuNTgtMy42NC00LjM3LTguMjYtNS42NC0xMi43Ny00LjUxLTEuMjYtOS4xMy0zLjA1LTEyLjc3LTUuNjJDMy4xMiA3MS42OSAwIDY3LjY3IDAgNjIuMjJjMC01LjAyIDIuNTUtOS4wNyA2Ljg5LTEyLjJDMi41NiA0Ni44OSAwIDQyLjg0IDAgMzcuODIgMCAzMi4zNyAzLjEgMjguMzUgNy4wOSAyNS41MmMzLjY0LTIuNTggOC4yNi00LjM3IDEyLjc3LTUuNjQgMS4yNi00LjUyIDMuMDQtOS4xNCA1LjYyLTEyLjc4QzI4LjMxIDMuMTEgMzIuMzMgMC4wMSAzNy43OCAwLjAxYzUuMDIgMCA5LjA3IDIuNTUgMTIuMiA2Ljg4QzUzLjExIDIuNTYgNTcuMTYgMCA2Mi4xOCAwem0wIDUuNjJjLTMuMjcgMC02LjMyIDEuODQtOS4wMyA2Ljc2LTEuMzcgMi40OC00Ljk1IDIuNDgtNi4zMiAwLTIuNzItNC45Mi01Ljc4LTYuNzYtOS4wNC02Ljc2LTMuMDEgMC01LjUyIDEuNjMtNy43MiA0LjczLTIuMjMgMy4xNC0zLjg5IDcuNS01LjA0IDEyLjEtLjMzIDEuMjUtMS4zIDIuMjItMi41NCAyLjU1LTQuNiAxLjIxLTguOTUgMi44Ny0xMi4xIDUuMUM3LjI0IDMyLjMgNS42MiAzNC44MSA1LjYyIDM3LjgyYzAgMy4yNyAxLjg0IDYuMzIgNi43NiA5LjA0IDIuNDggMS4zNyAyLjQ4IDQuOTUgMCA2LjMyLTQuOTIgMi43Mi02Ljc2IDUuNzgtNi43NiA5LjA0IDAgMy4wMSAxLjYzIDUuNTIgNC43MyA3LjcyIDMuMTQgMi4yMyA3LjUgMy44OSAxMi4xIDUuMDggMS4xNy4zIDIuMSAxLjE4IDIuNDggMi4zMWwuMDcuMjMuMjMuODZjMS4xOSA0LjI4IDIuNzggOC4yOSA0Ljg3IDExLjI0IDIuMiAzLjEgNC43MSA0LjcyIDcuNzIgNC43MiAzLjI3IDAgNi4zMi0xLjg0IDkuMDQtNi43N2wuMTMtLjIyYzEuNDEtMi4xOCA0LjY0LTIuMTggNi4wNSAwbC4xMy4yMi4yNi40NWMyLjY1IDQuNTggNS42MiA2LjMxIDguNzggNi4zMSAzLjAxIDAgNS41Mi0xLjYzIDcuNzItNC43MiAyLjIzLTMuMTQgMy44OS03LjUgNS4wOC0xMi4xLjMzLTEuMjUgMS4zLTIuMjIgMi41NC0yLjU1IDQuNi0xLjIxIDguOTUtMi44NyAxMi4xLTUuMSAzLjEtMi4yIDQuNzItNC43MSA0LjcyLTcuNzIgMC0zLjI3LTEuODQtNi4zMi02Ljc3LTkuMDQtMi40OC0xLjM3LTIuNDgtNC45NSAwLTYuMzJsLjQ1LS4yNmM0LjU4LTIuNjUgNi4zMS01LjYyIDYuMzEtOC43OCAwLTMuMDEtMS42My01LjUyLTQuNzMtNy43Mi0zLjE0LTIuMjMtNy41LTMuODktMTIuMS01LjA0LTEuMjUtLjMyLTIuMjItMS4zLTIuNTQtMi41NC0xLjIxLTQuNi0yLjg3LTguOTUtNS4xLTEyLjEtMi4yLTMuMS00LjcxLTQuNzItNy43Mi00LjcyeiIgZmlsbD0id2hpdGUiLz48cGF0aCBkPSJNNjIuNjcgNjMuMTVjLjk1LTEuMjMgMi43MS0xLjQ2IDMuOTQtLjUxIDEuMjMuOTUgMS40NiAyLjcxLjUxIDMuOTQtMy4xOSA0LjE1LTguOTggNi45Ni0xNS4xNSA3LjQ4LTYuMjcuNTMtMTMuMjYtMS4yNy0xOC44NS02Ljc5LTEuMS0xLjA5LTEuMTEtMi44Ny0uMDItMy45NyAxLjA5LTEuMSAyLjg3LTEuMTEgMy45Ny0uMDIgNC4yNyA0LjIxIDkuNTcgNS42IDE0LjQzIDUuMTkgNC45Ni0uNDIgOS4xNC0yLjY3IDExLjE3LTUuMzJ6IiBmaWxsPSJ3aGl0ZSIvPjxwYXRoIGQ9Ik0zOS42NiAzMC44NGMxLjQ0IDAgMi41NS43MyAzLjI4IDEuNDguNzIuNzQgMS4yNCAxLjY3IDEuNjIgMi41OS43NiAxLjg1IDEuMTcgNC4yMSAxLjE3IDYuNjcgMCAyLjQ2LS40IDQuODMtMS4xNiA2LjY4LS4zOC45Mi0uOSAxLjg1LTEuNjIgMi41OS0uNzMuNzUtMS44NCAxLjQ4LTMuMjggMS40OC0xLjQ0IDAtMi41NS0uNzItMy4yOC0xLjQ3LS43Mi0uNzQtMS4yNC0xLjY3LTEuNjItMi41OS0uNzYtMS44NS0xLjE3LTQuMjEtMS4xNy02LjY3IDAtMi40Ni40LTQuODMgMS4xNi02LjY4LjM4LS45Mi45LTEuODUgMS42Mi0yLjU5LjczLS43NSAxLjg0LTEuNDggMy4yOC0xLjQ4eiIgZmlsbD0id2hpdGUiLz48cGF0aCBkPSJNNjAuMzMgMzAuODRsLjI3LjAxYzEuMzEuMDggMi4zMy43NiAzLjAxIDEuNDcuNzIuNzQgMS4yNCAxLjY3IDEuNjIgMi41OS43NiAxLjg1IDEuMTcgNC4yMSAxLjE3IDYuNjcgMCAyLjQ2LS40IDQuODMtMS4xNiA2LjY4LS4zOC45Mi0uOSAxLjg1LTEuNjIgMi41OS0uNzMuNzUtMS44NCAxLjQ4LTMuMjggMS40OC0xLjQ0IDAtMi41NS0uNzItMy4yOC0xLjQ3LS43Mi0uNzQtMS4yNC0xLjY3LTEuNjItMi41OS0uNzYtMS44NS0xLjE3LTQuMjEtMS4xNy02LjY3IDAtMi40Ni40LTQuODMgMS4xNi02LjY4LjM4LS45Mi45LTEuODUgMS42Mi0yLjU5LjczLS43NSAxLjg0LTEuNDggMy4yOC0xLjQ4eiIgZmlsbD0id2hpdGUiLz48L2c+PC9zdmc+Cg==';
1501
+
1502
+ var __wkSocialIcons = {
1503
+ google: '<svg viewBox="0 0 24 24" width="24" height="24"><path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z" fill="#4285F4"/><path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" fill="#34A853"/><path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" fill="#FBBC05"/><path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" fill="#EA4335"/></svg>',
1504
+ github: '<svg viewBox="0 0 24 24" width="24" height="24" fill="#8e8ea4"><path d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z"/></svg>',
1505
+ email: '<svg viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="#8e8ea4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="3"/><path d="m2 7 10 7 10-7"/></svg>',
1506
+ phone: '<svg viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="#8e8ea4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="2" width="14" height="20" rx="3"/><line x1="12" y1="18" x2="12.01" y2="18" stroke-width="2"/></svg>',
1507
+ x: '<svg viewBox="0 0 24 24" width="20" height="20" fill="none" aria-hidden="true"><rect class="wk-social-x-bg" x="2.4" y="2.4" width="19.2" height="19.2" rx="4.8"/><path class="wk-social-x-mark" d="M7.3 7.3L16.7 16.7M16.7 7.3L7.3 16.7" fill="none" stroke-width="2.4" stroke-linecap="round"/></svg>',
1508
+ discord: '<svg viewBox="0 0 24 24" width="22" height="22" fill="#8e8ea4"><path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128c.126-.094.252-.192.372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/></svg>',
1509
+ coinbase: '<svg viewBox="0 0 24 24" width="22" height="22" fill="none"><circle cx="12" cy="12" r="11" stroke="#8e8ea4" stroke-width="1.5"/><path d="M14.5 10.5h-5v3h5v-3z" fill="#8e8ea4" rx="0.5"/></svg>'
1510
+ };
1511
+
1512
+ function __wkWidgetMethodIconSvg(method) {
1513
+ var key = __wkNormalizeWaaPMethod(method);
1514
+ if (!key) return '';
1515
+ if (key === 'x') {
1516
+ return '<svg viewBox="0 0 24 24" width="18" height="18" fill="none" aria-hidden="true"><rect x="2.4" y="2.4" width="19.2" height="19.2" rx="4.8" fill="#000000"/><path d="M7.3 7.3L16.7 16.7M16.7 7.3L7.3 16.7" fill="none" stroke="#ffffff" stroke-width="2.4" stroke-linecap="round"/></svg>';
1517
+ }
1518
+ return __wkSocialIcons[key]
1519
+ ? __wkSocialIcons[key].replace(/width="\\d+"/, 'width="18"').replace(/height="\\d+"/, 'height="18"').replace(/fill="[^"]*"/, 'fill="#e2e8f0"')
1520
+ : '';
1521
+ }
1522
+
1523
+ var __wkLogoSvg = '<svg class="wk-modal-logo-img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 520 363" fill="none" role="img" aria-label=".SKI"><image href="data:image/webp;base64,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" width="520" height="363" preserveAspectRatio="xMidYMid meet"/></svg>';
1524
+
1525
+ var __wkQrSvg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 29 29"><path d="M0,0h7v1h-7zM9,0h3v1h-3zM15,0h1v1h-1zM18,0h2v1h-2zM22,0h7v1h-7zM0,1h1v1h-1zM6,1h1v1h-1zM8,1h2v1h-2zM11,1h3v1h-3zM15,1h1v1h-1zM17,1h2v1h-2zM22,1h1v1h-1zM28,1h1v1h-1zM0,2h1v1h-1zM2,2h3v1h-3zM6,2h1v1h-1zM8,2h1v1h-1zM10,2h3v1h-3zM15,2h3v1h-3zM19,2h1v1h-1zM22,2h1v1h-1zM24,2h3v1h-3zM28,2h1v1h-1zM0,3h1v1h-1zM2,3h3v1h-3zM6,3h1v1h-1zM9,3h1v1h-1zM11,3h1v1h-1zM14,3h3v1h-3zM18,3h3v1h-3zM22,3h1v1h-1zM24,3h3v1h-3zM28,3h1v1h-1zM0,4h1v1h-1zM2,4h3v1h-3zM6,4h1v1h-1zM8,4h2v1h-2zM11,4h1v1h-1zM13,4h4v1h-4zM18,4h1v1h-1zM22,4h1v1h-1zM24,4h3v1h-3zM28,4h1v1h-1zM0,5h1v1h-1zM6,5h1v1h-1zM8,5h1v1h-1zM10,5h1v1h-1zM14,5h2v1h-2zM17,5h3v1h-3zM22,5h1v1h-1zM28,5h1v1h-1zM0,6h7v1h-7zM8,6h1v1h-1zM10,6h1v1h-1zM12,6h1v1h-1zM14,6h1v1h-1zM16,6h1v1h-1zM18,6h1v1h-1zM20,6h1v1h-1zM22,6h7v1h-7zM8,7h1v1h-1zM10,7h3v1h-3zM14,7h1v1h-1zM17,7h1v1h-1zM19,7h2v1h-2zM0,8h2v1h-2zM3,8h1v1h-1zM6,8h2v1h-2zM11,8h3v1h-3zM16,8h1v1h-1zM18,8h3v1h-3zM22,8h3v1h-3zM26,8h2v1h-2zM1,9h1v1h-1zM3,9h1v1h-1zM5,9h1v1h-1zM8,9h2v1h-2zM12,9h1v1h-1zM14,9h1v1h-1zM18,9h1v1h-1zM21,9h3v1h-3zM25,9h1v1h-1zM28,9h1v1h-1zM0,10h1v1h-1zM3,10h1v1h-1zM5,10h2v1h-2zM13,10h1v1h-1zM19,10h1v1h-1zM21,10h2v1h-2zM24,10h4v1h-4zM4,11h2v1h-2zM7,11h7v1h-7zM16,11h1v1h-1zM18,11h5v1h-5zM26,11h2v1h-2zM0,12h4v1h-4zM5,12h2v1h-2zM10,12h4v1h-4zM15,12h3v1h-3zM19,12h5v1h-5zM25,12h1v1h-1zM27,12h2v1h-2zM1,13h3v1h-3zM5,13h1v1h-1zM8,13h2v1h-2zM12,13h1v1h-1zM14,13h1v1h-1zM17,13h4v1h-4zM0,14h3v1h-3zM4,14h5v1h-5zM10,14h2v1h-2zM13,14h2v1h-2zM18,14h1v1h-1zM20,14h1v1h-1zM22,14h1v1h-1zM24,14h5v1h-5zM2,15h1v1h-1zM4,15h2v1h-2zM7,15h1v1h-1zM9,15h1v1h-1zM11,15h5v1h-5zM17,15h2v1h-2zM22,15h2v1h-2zM25,15h1v1h-1zM27,15h1v1h-1zM2,16h2v1h-2zM5,16h4v1h-4zM10,16h3v1h-3zM15,16h1v1h-1zM17,16h1v1h-1zM20,16h2v1h-2zM27,16h1v1h-1zM1,17h2v1h-2zM7,17h2v1h-2zM10,17h5v1h-5zM16,17h2v1h-2zM22,17h2v1h-2zM25,17h1v1h-1zM28,17h1v1h-1zM0,18h1v1h-1zM3,18h1v1h-1zM6,18h3v1h-3zM10,18h1v1h-1zM14,18h1v1h-1zM17,18h2v1h-2zM21,18h4v1h-4zM27,18h2v1h-2zM5,19h1v1h-1zM10,19h3v1h-3zM14,19h6v1h-6zM22,19h2v1h-2zM27,19h2v1h-2zM0,20h1v1h-1zM2,20h1v1h-1zM4,20h3v1h-3zM8,20h3v1h-3zM12,20h4v1h-4zM20,20h5v1h-5zM26,20h1v1h-1zM8,21h3v1h-3zM16,21h1v1h-1zM20,21h1v1h-1zM24,21h1v1h-1zM26,21h3v1h-3zM0,22h7v1h-7zM8,22h1v1h-1zM12,22h2v1h-2zM16,22h1v1h-1zM18,22h1v1h-1zM20,22h1v1h-1zM22,22h1v1h-1zM24,22h1v1h-1zM27,22h1v1h-1zM0,23h1v1h-1zM6,23h1v1h-1zM10,23h1v1h-1zM12,23h5v1h-5zM18,23h1v1h-1zM20,23h1v1h-1zM24,23h3v1h-3zM28,23h1v1h-1zM0,24h1v1h-1zM2,24h3v1h-3zM6,24h1v1h-1zM9,24h1v1h-1zM13,24h1v1h-1zM16,24h3v1h-3zM20,24h5v1h-5zM28,24h1v1h-1zM0,25h1v1h-1zM2,25h3v1h-3zM6,25h1v1h-1zM8,25h1v1h-1zM12,25h2v1h-2zM20,25h1v1h-1zM22,25h5v1h-5zM0,26h1v1h-1zM2,26h3v1h-3zM6,26h1v1h-1zM11,26h1v1h-1zM14,26h1v1h-1zM17,26h1v1h-1zM19,26h2v1h-2zM24,26h3v1h-3zM28,26h1v1h-1zM0,27h1v1h-1zM6,27h1v1h-1zM8,27h6v1h-6zM17,27h6v1h-6zM24,27h1v1h-1zM27,27h1v1h-1zM0,28h7v1h-7zM8,28h1v1h-1zM12,28h1v1h-1zM15,28h1v1h-1zM17,28h1v1h-1zM19,28h3v1h-3zM23,28h2v1h-2zM27,28h1v1h-1z" fill="currentColor"/></svg>';
1526
+
1527
+ function __wkGetLastWallet() {
1528
+ try { return localStorage.getItem(__wkLastWalletKey) || ''; } catch (_e) { return ''; }
1529
+ }
1530
+
1531
+ function __wkSetLastWallet(name) {
1532
+ try { localStorage.setItem(__wkLastWalletKey, name); } catch (_e) {}
1533
+ }
1534
+
1535
+ function __wkWalletNameKey(name) {
1536
+ var normalized = String(name || '').trim().toLowerCase();
1537
+ if (!normalized) return '';
1538
+ normalized = normalized.replace(/[^a-z0-9]+/g, ' ').trim();
1539
+ if (!normalized) return '';
1540
+ if (normalized.slice(-7) === ' wallet') {
1541
+ normalized = normalized.slice(0, -7).trim();
1542
+ }
1543
+ return normalized.replace(/\s+/g, '');
1544
+ }
1545
+
1546
+ var __wkKnownAliasGroups = [
1547
+ ['slush', 'sui', 'suiwallet', 'slushwallet', 'mystenwallet'],
1548
+ ['suiet', 'suietwallet'],
1549
+ ['phantom', 'phantomwallet'],
1550
+ ['backpack', 'backpackwallet'],
1551
+ ];
1552
+
1553
+ function __wkWalletKeysRelated(a, b) {
1554
+ if (!a || !b) return false;
1555
+ if (a === b) return true;
1556
+ for (var g = 0; g < __wkKnownAliasGroups.length; g++) {
1557
+ var group = __wkKnownAliasGroups[g];
1558
+ var hasA = false, hasB = false;
1559
+ for (var i = 0; i < group.length; i++) {
1560
+ if (group[i] === a) hasA = true;
1561
+ if (group[i] === b) hasB = true;
1562
+ }
1563
+ if (hasA && hasB) return true;
1564
+ }
1565
+ if (a.length >= 5 && b.length >= 5) {
1566
+ return a.indexOf(b) !== -1 || b.indexOf(a) !== -1;
1567
+ }
1568
+ return false;
1569
+ }
1570
+
1571
+ var __wkWaaPMethodByAddressKey = 'sui_ski_waap_method_by_address_v1';
1572
+ var __wkPendingWaaPMethod = '';
1573
+ var __wkWaaPMethodLabels = {
1574
+ x: 'X',
1575
+ phone: 'Phone',
1576
+ email: 'Email',
1577
+ google: 'Google',
1578
+ coinbase: 'Coinbase',
1579
+ discord: 'Discord',
1580
+ };
1581
+
1582
+ function __wkNormalizeWaaPMethod(method) {
1583
+ var key = String(method || '').trim().toLowerCase();
1584
+ return __wkWaaPMethodLabels[key] ? key : '';
1585
+ }
1586
+
1587
+ function __wkRememberPendingWaaPMethod(method) {
1588
+ __wkPendingWaaPMethod = __wkNormalizeWaaPMethod(method);
1589
+ }
1590
+
1591
+ function __wkReadSessionWalletName() {
1592
+ try {
1593
+ if (typeof getWalletSession !== 'function') return '';
1594
+ var session = getWalletSession();
1595
+ return session && session.walletName ? String(session.walletName) : '';
1596
+ } catch (_e) {
1597
+ return '';
1598
+ }
1599
+ }
1600
+
1601
+ function __wkGetConnectionWalletName(conn) {
1602
+ if (conn && conn.wallet && conn.wallet.name) return String(conn.wallet.name);
1603
+ if (SuiWalletKit.__sessionWalletName) return String(SuiWalletKit.__sessionWalletName);
1604
+ return __wkReadSessionWalletName();
1605
+ }
1606
+
1607
+ function __wkGetWaaPMethodMap() {
1608
+ try {
1609
+ var raw = localStorage.getItem(__wkWaaPMethodByAddressKey);
1610
+ if (!raw) return {};
1611
+ var parsed = JSON.parse(raw);
1612
+ return parsed && typeof parsed === 'object' ? parsed : {};
1613
+ } catch (_e) {
1614
+ return {};
1615
+ }
1616
+ }
1617
+
1618
+ function __wkSetWaaPMethodMap(map) {
1619
+ try {
1620
+ localStorage.setItem(__wkWaaPMethodByAddressKey, JSON.stringify(map || {}));
1621
+ } catch (_e) {}
1622
+ }
1623
+
1624
+ function __wkSaveWaaPMethodForAddress(address, method) {
1625
+ var normalizedAddress = __wkNormalizeSuiAddress(address).toLowerCase();
1626
+ var normalizedMethod = __wkNormalizeWaaPMethod(method);
1627
+ if (!normalizedAddress || !normalizedMethod) return;
1628
+ var map = __wkGetWaaPMethodMap();
1629
+ map[normalizedAddress] = normalizedMethod;
1630
+ __wkSetWaaPMethodMap(map);
1631
+ }
1632
+
1633
+ function __wkGetWaaPMethodForAddress(address) {
1634
+ var normalizedAddress = __wkNormalizeSuiAddress(address).toLowerCase();
1635
+ if (!normalizedAddress) return '';
1636
+ var map = __wkGetWaaPMethodMap();
1637
+ return __wkNormalizeWaaPMethod(map[normalizedAddress]);
1638
+ }
1639
+
1640
+ var __wkWaaPLabelByAddressKey = 'sui_ski_waap_label_by_address_v1';
1641
+
1642
+ function __wkGetWaaPLabelMap() {
1643
+ try {
1644
+ var raw = localStorage.getItem(__wkWaaPLabelByAddressKey);
1645
+ if (!raw) return {};
1646
+ var parsed = JSON.parse(raw);
1647
+ return parsed && typeof parsed === 'object' ? parsed : {};
1648
+ } catch (_e) {
1649
+ return {};
1650
+ }
1651
+ }
1652
+
1653
+ function __wkSaveWaaPLabelForAddress(address, label) {
1654
+ var normalizedAddress = __wkNormalizeSuiAddress(address).toLowerCase();
1655
+ if (!normalizedAddress || !label) return;
1656
+ try {
1657
+ var map = __wkGetWaaPLabelMap();
1658
+ map[normalizedAddress] = String(label).trim();
1659
+ localStorage.setItem(__wkWaaPLabelByAddressKey, JSON.stringify(map));
1660
+ } catch (_e) {}
1661
+ }
1662
+
1663
+ function __wkGetWaaPLabelForAddress(address) {
1664
+ var normalizedAddress = __wkNormalizeSuiAddress(address).toLowerCase();
1665
+ if (!normalizedAddress) return '';
1666
+ var map = __wkGetWaaPLabelMap();
1667
+ return typeof map[normalizedAddress] === 'string' ? map[normalizedAddress] : '';
1668
+ }
1669
+
1670
+ function __wkPersistPendingWaaPMethod(address) {
1671
+ if (!__wkPendingWaaPMethod) return;
1672
+ __wkSaveWaaPMethodForAddress(address, __wkPendingWaaPMethod);
1673
+ __wkPendingWaaPMethod = '';
1674
+ }
1675
+
1676
+ function __wkMethodFromWaaPLabel(label) {
1677
+ var raw = String(label || '').trim().toLowerCase();
1678
+ if (!raw) return '';
1679
+ if (raw === 'x' || raw === 'twitter' || raw.indexOf(' x ') !== -1 || raw.indexOf('twitter') !== -1) return 'x';
1680
+ if (raw.indexOf('google') !== -1 || raw.indexOf('gmail') !== -1) return 'google';
1681
+ if (raw.indexOf('discord') !== -1) return 'discord';
1682
+ if (raw.indexOf('coinbase') !== -1) return 'coinbase';
1683
+ if (raw.indexOf('email') !== -1 || raw.indexOf('mail') !== -1) return 'email';
1684
+ if (raw.indexOf('phone') !== -1 || raw.indexOf('sms') !== -1) return 'phone';
1685
+ return '';
1686
+ }
1687
+
1688
+ function __wkResolveWaaPMethod(conn) {
1689
+ if (!conn || !conn.address) return __wkPendingWaaPMethod || '';
1690
+ var method = __wkGetWaaPMethodForAddress(conn.address) || __wkPendingWaaPMethod;
1691
+ if (method) return method;
1692
+ var liveLabel = (conn.account && typeof conn.account.label === 'string') ? conn.account.label : '';
1693
+ method = __wkMethodFromWaaPLabel(liveLabel);
1694
+ if (method) {
1695
+ __wkSaveWaaPMethodForAddress(conn.address, method);
1696
+ return method;
1697
+ }
1698
+ var savedLabel = __wkGetWaaPLabelForAddress(conn.address);
1699
+ method = __wkMethodFromWaaPLabel(savedLabel);
1700
+ if (method) {
1701
+ __wkSaveWaaPMethodForAddress(conn.address, method);
1702
+ return method;
1703
+ }
1704
+ return '';
1705
+ }
1706
+
1707
+ function __wkGetWaaPConnectionHint(conn) {
1708
+ var walletName = __wkGetConnectionWalletName(conn).trim().toLowerCase();
1709
+ if (walletName !== 'waap') return '';
1710
+ var method = __wkResolveWaaPMethod(conn);
1711
+ var methodLabel = method ? (__wkWaaPMethodLabels[method] || '') : '';
1712
+ return methodLabel ? ('WaaP via ' + methodLabel) : 'WaaP connected';
1713
+ }
1714
+
1715
+ function __wkHasPasskeySupport() {
1716
+ try {
1717
+ return typeof window.PublicKeyCredential !== 'undefined'
1718
+ && !!navigator.credentials
1719
+ && typeof navigator.credentials.create === 'function';
1720
+ } catch (e) {
1721
+ return false;
1722
+ }
1723
+ }
1724
+
1725
+ function __wkInstallLinksHtml() {
1726
+ return '<div class="wk-no-wallets">'
1727
+ + 'No wallets detected.'
1728
+ + '</div>';
1729
+ }
1730
+
1731
+ function __wkEnsureSocialSectionStructure(container) {
1732
+ if (!container) return null;
1733
+ var socialEl = container.querySelector('.wk-social-section');
1734
+ if (!socialEl) return null;
1735
+ var grid = socialEl.querySelector('.wk-social-grid');
1736
+ if (!grid) {
1737
+ socialEl.innerHTML = '<div class="wk-social-grid"></div>'
1738
+ + '<a class="wk-powered-pill" href="https://waap.sui.ski" target="_blank" rel="noopener"><img src="' + __wkWaaPIcon + '" alt="WaaP"> powered by WaaP</a>';
1739
+ }
1740
+ return socialEl;
1741
+ }
1742
+
1743
+ function __wkFormatConnectError(err, walletName) {
1744
+ var message = '';
1745
+ if (err && typeof err.message === 'string' && err.message) {
1746
+ message = String(err.message);
1747
+ } else if (typeof err === 'string') {
1748
+ message = err;
1749
+ } else if (err && typeof err.name === 'string' && err.name) {
1750
+ message = err.name;
1751
+ } else {
1752
+ message = 'Connection failed';
1753
+ }
1754
+ var lower = message.toLowerCase();
1755
+ if (
1756
+ lower.indexOf('not been authorized') !== -1
1757
+ || lower.indexOf('not authorized') !== -1
1758
+ || lower.indexOf('unauthorized') !== -1
1759
+ || lower.indexOf('something went wrong') !== -1
1760
+ ) {
1761
+ if (walletName === 'Phantom') {
1762
+ return 'Phantom has not authorized Sui accounts for this site yet. Open Phantom app permissions for this site, allow Sui account access, then retry.';
1763
+ }
1764
+ }
1765
+ if (
1766
+ walletName === 'Passkey Wallet'
1767
+ && (
1768
+ lower.indexOf('unexpected') !== -1
1769
+ || lower.indexOf('notallowederror') !== -1
1770
+ || lower.indexOf('invalidstateerror') !== -1
1771
+ )
1772
+ ) {
1773
+ return 'Passkey setup failed. Use a supported browser profile with passkeys enabled and try again.';
1774
+ }
1775
+ return message;
1776
+ }
1777
+
1778
+ function __wkShowConnectError(containerEl, err, walletName) {
1779
+ containerEl.innerHTML = '<div class="wk-detecting" style="color:#f87171;text-align:center;font-size:0.82rem;line-height:1.5;">'
1780
+ + __wkFormatConnectError(err, walletName)
1781
+ + '<br><button type="button" class="wk-retry-btn">Try Again</button>'
1782
+ + '</div>';
1783
+ var retryBtn = containerEl.querySelector('.wk-retry-btn');
1784
+ if (retryBtn) {
1785
+ retryBtn.addEventListener('click', function() {
1786
+ __wkEnsureSocialSectionStructure(__wkModalContainer);
1787
+ __wkPopulateModal();
1788
+ });
1789
+ }
1790
+ }
1791
+
1792
+ function __wkFindWaaPWallet() {
1793
+ var sources = [SuiWalletKit.$wallets.value || []];
1794
+ try {
1795
+ var api = typeof getWallets === 'function' ? getWallets() : null;
1796
+ if (api) sources.push(api.get());
1797
+ } catch (e) {}
1798
+ for (var s = 0; s < sources.length; s++) {
1799
+ var list = sources[s];
1800
+ for (var i = 0; i < list.length; i++) {
1801
+ var name = list[i].name ? String(list[i].name).toLowerCase() : '';
1802
+ if (name === 'waap') return list[i];
1803
+ }
1804
+ }
1805
+ return null;
1806
+ }
1807
+
1808
+ function __wkConnectWaaPSocial(wallets, waapMethod) {
1809
+ __wkRememberPendingWaaPMethod(waapMethod);
1810
+ if (__wkIsSubdomain()) {
1811
+ __wkConnectWaaPViaBridge(waapMethod);
1812
+ return;
1813
+ }
1814
+ var waapWallet = __wkFindWaaPWallet();
1815
+ if (!waapWallet) {
1816
+ var socialSection = __wkModalContainer && __wkModalContainer.querySelector('.wk-social-section');
1817
+ if (socialSection) {
1818
+ __wkShowConnectError(socialSection, { message: 'WaaP wallet is still loading, please try again' }, 'WaaP');
1819
+ }
1820
+ return;
1821
+ }
1822
+ SuiWalletKit.closeModal();
1823
+ SuiWalletKit.connect(waapWallet).then(function() {
1824
+ var conn = SuiWalletKit.$connection.value || null;
1825
+ if (conn && conn.address) {
1826
+ __wkPersistPendingWaaPMethod(conn.address);
1827
+ if (conn.account && typeof conn.account.label === 'string' && conn.account.label.trim()) {
1828
+ __wkSaveWaaPLabelForAddress(conn.address, conn.account.label.trim());
1829
+ }
1830
+ }
1831
+ __wkSetLastWallet('WaaP');
1832
+ }).catch(function(err) {
1833
+ __wkPendingWaaPMethod = '';
1834
+ SuiWalletKit.openModal();
1835
+ setTimeout(function() {
1836
+ var socialSection = __wkModalContainer && __wkModalContainer.querySelector('.wk-social-section');
1837
+ if (socialSection) {
1838
+ __wkShowConnectError(socialSection, err, 'WaaP');
1839
+ }
1840
+ }, 100);
1841
+ });
1842
+ }
1843
+
1844
+ function __wkConnectWaaPViaBridge(waapMethod) {
1845
+ __wkRememberPendingWaaPMethod(waapMethod);
1846
+ SuiWalletKit.closeModal();
1847
+ var bridge = SuiWalletKit.__skiSignFrame;
1848
+ var bridgeReady = SuiWalletKit.__skiSignReady;
1849
+ if (!bridge) {
1850
+ SuiWalletKit.__initSignBridge();
1851
+ bridge = SuiWalletKit.__skiSignFrame;
1852
+ bridgeReady = SuiWalletKit.__skiSignReady;
1853
+ }
1854
+ var requestId = 'waap-' + Date.now();
1855
+ (bridgeReady || Promise.resolve(true)).then(function(ready) {
1856
+ if (!ready || !bridge || !bridge.contentWindow) {
1857
+ SuiWalletKit.openModal();
1858
+ return;
1859
+ }
1860
+ bridge.style.cssText = 'position:fixed;inset:0;width:100vw;height:100vh;z-index:13001;border:none;background:transparent;';
1861
+ bridge.contentWindow.postMessage({
1862
+ type: 'ski:connect-waap',
1863
+ requestId: requestId
1864
+ }, 'https://sui.ski');
1865
+ var timeout = setTimeout(function() {
1866
+ cleanup();
1867
+ bridge.style.cssText = __wkBridgeHiddenStyle;
1868
+ SuiWalletKit.openModal();
1869
+ }, 120000);
1870
+ function cleanup() {
1871
+ clearTimeout(timeout);
1872
+ window.removeEventListener('message', handleResponse);
1873
+ }
1874
+ function handleResponse(ev) {
1875
+ if (ev.origin !== 'https://sui.ski') return;
1876
+ if (!ev.data || ev.data.requestId !== requestId) return;
1877
+ if (ev.data.type === 'ski:connected') {
1878
+ cleanup();
1879
+ bridge.style.cssText = __wkBridgeHiddenStyle;
1880
+ SuiWalletKit.initFromSession(ev.data.address, 'WaaP');
1881
+ __wkPersistPendingWaaPMethod(ev.data.address);
1882
+ __wkSetLastWallet('WaaP');
1883
+ if (typeof connectWalletSession === 'function') {
1884
+ connectWalletSession('WaaP', ev.data.address);
1885
+ }
1886
+ } else if (ev.data.type === 'ski:connect-error') {
1887
+ __wkPendingWaaPMethod = '';
1888
+ cleanup();
1889
+ bridge.style.cssText = __wkBridgeHiddenStyle;
1890
+ SuiWalletKit.openModal();
1891
+ setTimeout(function() {
1892
+ var socialSection = __wkModalContainer && __wkModalContainer.querySelector('.wk-social-section');
1893
+ if (socialSection) {
1894
+ __wkShowConnectError(socialSection, { message: ev.data.error }, 'WaaP');
1895
+ }
1896
+ }, 100);
1897
+ }
1898
+ }
1899
+ window.addEventListener('message', handleResponse);
1900
+ });
1901
+ }
1902
+
1903
+ function __wkRenderSocialSection(container, wallets) {
1904
+ var dividerEl = container.querySelector('.wk-divider');
1905
+ var socialEl = __wkEnsureSocialSectionStructure(container);
1906
+ if (!socialEl) return;
1907
+
1908
+ socialEl.style.display = '';
1909
+ if (dividerEl) dividerEl.style.display = '';
1910
+
1911
+ var grid = socialEl.querySelector('.wk-social-grid');
1912
+ if (!grid) return;
1913
+
1914
+ var socialOptions = [
1915
+ { key: 'x', label: 'X', sep: false },
1916
+ { key: 'google', label: 'Google', sep: false },
1917
+ { key: 'email', label: 'Email', sep: true },
1918
+ { key: 'discord', label: 'Discord', sep: false },
1919
+ { key: 'coinbase', label: 'Coinbase', sep: false },
1920
+ { key: 'phone', label: 'Phone', sep: true }
1921
+ ];
1922
+
1923
+ grid.innerHTML = '';
1924
+ for (var s = 0; s < socialOptions.length; s++) {
1925
+ (function(opt) {
1926
+ var btn = document.createElement('button');
1927
+ btn.className = 'wk-social-btn' + (opt.sep ? ' wk-sep-left' : '');
1928
+ btn.innerHTML = (__wkSocialIcons[opt.key] || '') + '<span>' + opt.label + '</span>';
1929
+ btn.addEventListener('click', function() {
1930
+ var waapLoading = typeof __wkWaaPLoading !== 'undefined' ? __wkWaaPLoading : (window.__wkWaaPLoading || null);
1931
+ if (waapLoading) {
1932
+ btn.disabled = true;
1933
+ btn.style.opacity = '0.6';
1934
+ waapLoading.then(function() {
1935
+ btn.disabled = false;
1936
+ btn.style.opacity = '';
1937
+ __wkConnectWaaPSocial(SuiWalletKit.$wallets.value || wallets, opt.key);
1938
+ }).catch(function() {
1939
+ btn.disabled = false;
1940
+ btn.style.opacity = '';
1941
+ });
1942
+ } else {
1943
+ __wkConnectWaaPSocial(wallets, opt.key);
1944
+ }
1945
+ });
1946
+ grid.appendChild(btn);
1947
+ })(socialOptions[s]);
1948
+ }
1949
+ }
1950
+
1951
+ function __wkSortWithRecent(wallets) {
1952
+ var lastWalletName = __wkWalletNameKey(__wkGetLastWallet());
1953
+ if (!lastWalletName) return wallets;
1954
+ var recent = [];
1955
+ var rest = [];
1956
+ for (var i = 0; i < wallets.length; i++) {
1957
+ var wName = __wkWalletNameKey(wallets[i].name);
1958
+ if (wName === lastWalletName) {
1959
+ recent.push(wallets[i]);
1960
+ } else {
1961
+ rest.push(wallets[i]);
1962
+ }
1963
+ }
1964
+ return recent.concat(rest);
1965
+ }
1966
+
1967
+ var __wkKnownWalletRows = [
1968
+ {
1969
+ key: 'phantom',
1970
+ name: 'Phantom',
1971
+ installUrl: 'https://phantom.app/download',
1972
+ icon: 'data:image/svg+xml,' + encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40"><defs><linearGradient id="p" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#b6a4ff"/><stop offset="1" stop-color="#7c6dff"/></linearGradient></defs><rect width="40" height="40" rx="12" fill="url(#p)"/><path fill="#fff" d="M9 20c0-4.8 3.9-8.7 8.7-8.7H26c2.8 0 5 2.2 5 5v9.5c0 1.6-1.3 2.9-2.9 2.9H17.7C12.9 28.7 9 24.8 9 20z"/></svg>'),
1973
+ },
1974
+ {
1975
+ key: 'backpack',
1976
+ name: 'Backpack',
1977
+ installUrl: 'https://backpack.app',
1978
+ icon: 'data:image/svg+xml,' + encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40"><rect width="40" height="40" rx="12" fill="#ef4444"/><path fill="#111827" d="M14 14h12a4 4 0 014 4v10H10V18a4 4 0 014-4z"/><rect x="16" y="10" width="8" height="4" rx="2" fill="#111827"/><rect x="14" y="20" width="12" height="2.4" rx="1.2" fill="#9ca3af"/></svg>'),
1979
+ },
1980
+ {
1981
+ key: 'slush',
1982
+ name: 'Slush',
1983
+ installUrl: 'https://slush.app',
1984
+ icon: 'data:image/svg+xml,' + encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40"><rect width="40" height="40" rx="12" fill="#0b1022"/><circle cx="20" cy="20" r="12" fill="#111827" stroke="#9ca3af" stroke-width="1.5"/><path d="M14 23c2.8 3.6 9.2 3.1 12-0.4M14 17.4c2.8-3.6 9.2-3.1 12 0.4" stroke="#fff" stroke-width="2.2" stroke-linecap="round"/></svg>'),
1985
+ },
1986
+ {
1987
+ key: 'slushwallet',
1988
+ name: 'Slush Wallet',
1989
+ installUrl: 'https://slush.app',
1990
+ icon: 'data:image/svg+xml,' + encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40"><rect width="40" height="40" rx="12" fill="#0b1022"/><circle cx="20" cy="20" r="12" fill="#111827" stroke="#9ca3af" stroke-width="1.5"/><path d="M14 23c2.8 3.6 9.2 3.1 12-0.4M14 17.4c2.8-3.6 9.2-3.1 12 0.4" stroke="#fff" stroke-width="2.2" stroke-linecap="round"/></svg>'),
1991
+ },
1992
+ {
1993
+ key: 'suiet',
1994
+ name: 'Suiet',
1995
+ installUrl: 'https://suiet.app',
1996
+ icon: 'data:image/svg+xml,' + encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40"><defs><linearGradient id="s" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#5fb8ff"/><stop offset="1" stop-color="#2b7fff"/></linearGradient></defs><rect width="40" height="40" rx="12" fill="url(#s)"/><circle cx="20" cy="20" r="11" fill="none" stroke="#fff" stroke-width="1.6"/><path d="M12.5 23.5c2-1.3 3.8-1.3 5.8 0 2-1.3 3.8-1.3 5.8 0 2-1.3 3.8-1.3 5.8 0" stroke="#fff" stroke-width="1.7" fill="none" stroke-linecap="round"/></svg>'),
1997
+ },
1998
+ ];
1999
+
2000
+ function __wkKnownWalletIconByName(name) {
2001
+ var key = __wkWalletNameKey(name);
2002
+ if (!key) return '';
2003
+ for (var i = 0; i < __wkKnownWalletRows.length; i++) {
2004
+ if (__wkKnownWalletRows[i].key === key) return __wkKnownWalletRows[i].icon;
2005
+ }
2006
+ return '';
2007
+ }
2008
+
2009
+ function __wkFindDetectedWalletByKey(targetKey) {
2010
+ if (!targetKey) return null;
2011
+ var sources = [
2012
+ SuiWalletKit.$wallets.value || [],
2013
+ __wkReadDetectedWalletCache(__wkDetectedWalletCacheKey),
2014
+ __wkReadDetectedWalletCache(__wkBridgeDetectedWalletCacheKey),
2015
+ __wkGetBridgeWalletSnapshot(),
2016
+ ];
2017
+ var best = null;
2018
+ for (var s = 0; s < sources.length; s++) {
2019
+ var list = Array.isArray(sources[s]) ? sources[s] : [];
2020
+ for (var i = 0; i < list.length; i++) {
2021
+ var wallet = list[i];
2022
+ if (!wallet || !wallet.name) continue;
2023
+ var key = __wkWalletNameKey(wallet.name);
2024
+ if (!key || !__wkWalletKeysRelated(key, targetKey)) continue;
2025
+ var candidate = {
2026
+ name: String(wallet.name),
2027
+ icon: wallet.icon ? String(wallet.icon) : '',
2028
+ };
2029
+ if (key === targetKey && candidate.icon) return candidate;
2030
+ if (!best || (!best.icon && candidate.icon) || (key === targetKey && !best.keyExact)) {
2031
+ best = {
2032
+ name: candidate.name,
2033
+ icon: candidate.icon,
2034
+ keyExact: key === targetKey,
2035
+ };
2036
+ }
2037
+ }
2038
+ }
2039
+ if (!best) return null;
2040
+ return {
2041
+ name: best.name,
2042
+ icon: best.icon,
2043
+ };
2044
+ }
2045
+
2046
+ function __wkResolveWidgetWallet(conn) {
2047
+ var walletName = __wkGetConnectionWalletName(conn);
2048
+ var walletIcon = conn && conn.wallet && conn.wallet.icon ? String(conn.wallet.icon) : '';
2049
+ var walletKey = __wkWalletNameKey(walletName);
2050
+ if (walletKey) {
2051
+ var matched = __wkFindDetectedWalletByKey(walletKey);
2052
+ if (matched) {
2053
+ if (!walletName && matched.name) walletName = matched.name;
2054
+ if (!walletIcon && matched.icon) walletIcon = matched.icon;
2055
+ }
2056
+ } else {
2057
+ var remembered = __wkGetLastWallet();
2058
+ var rememberedKey = __wkWalletNameKey(remembered);
2059
+ if (rememberedKey) {
2060
+ var rememberedMatch = __wkFindDetectedWalletByKey(rememberedKey);
2061
+ if (rememberedMatch) {
2062
+ walletName = rememberedMatch.name || remembered;
2063
+ if (!walletIcon && rememberedMatch.icon) walletIcon = rememberedMatch.icon;
2064
+ } else {
2065
+ walletName = remembered;
2066
+ }
2067
+ }
2068
+ }
2069
+ if (!walletIcon && walletName) {
2070
+ walletIcon = __wkKnownWalletIconByName(walletName);
2071
+ }
2072
+ return {
2073
+ name: walletName,
2074
+ icon: walletIcon,
2075
+ };
2076
+ }
2077
+
2078
+ function __wkResolveWalletIcon(wallet) {
2079
+ var name = wallet && wallet.name ? String(wallet.name) : '';
2080
+ var knownIcon = __wkKnownWalletIconByName(name);
2081
+ var walletIcon = wallet && wallet.icon ? String(wallet.icon) : '';
2082
+ return walletIcon || knownIcon || __wkDefaultIcon();
2083
+ }
2084
+
2085
+ function __wkBuildWalletDisplayList(wallets) {
2086
+ var input = Array.isArray(wallets) ? wallets : [];
2087
+ var byKey = {};
2088
+ var order = [];
2089
+ for (var i = 0; i < input.length; i++) {
2090
+ var wallet = input[i];
2091
+ if (!wallet || !wallet.name) continue;
2092
+ var key = __wkWalletNameKey(wallet.name);
2093
+ if (!key) key = 'wallet-' + i;
2094
+ var existing = byKey[key];
2095
+ if (!existing) {
2096
+ byKey[key] = wallet;
2097
+ order.push(key);
2098
+ continue;
2099
+ }
2100
+ if ((!existing.icon || String(existing.icon).trim() === '') && wallet.icon) {
2101
+ existing.icon = wallet.icon;
2102
+ }
2103
+ }
2104
+ var rows = [];
2105
+ for (var o = 0; o < order.length; o++) {
2106
+ if (byKey[order[o]]) rows.push(byKey[order[o]]);
2107
+ }
2108
+ return rows;
2109
+ }
2110
+
2111
+ function __wkCombineWalletSources(localWallets, bridgeWallets) {
2112
+ var local = Array.isArray(localWallets) ? localWallets : [];
2113
+ var bridge = Array.isArray(bridgeWallets) ? bridgeWallets : [];
2114
+ if (local.length === 0) return __wkBuildWalletDisplayList(bridge);
2115
+ if (bridge.length === 0) return __wkBuildWalletDisplayList(local);
2116
+ return __wkBuildWalletDisplayList(local.concat(bridge));
2117
+ }
2118
+
2119
+ function __wkRememberDetectedWallets(wallets, bridgeOnly) {
2120
+ var current = Array.isArray(wallets) ? wallets : [];
2121
+ if (current.length === 0) return;
2122
+ var cacheKey = bridgeOnly ? __wkBridgeDetectedWalletCacheKey : __wkDetectedWalletCacheKey;
2123
+ var cached = __wkReadDetectedWalletCache(cacheKey);
2124
+ var merged = __wkCombineWalletSources(current, cached);
2125
+ __wkWriteDetectedWalletCache(merged, cacheKey);
2126
+ }
2127
+
2128
+ function __wkCollectBridgeWalletHints(walletsInput) {
2129
+ var out = [];
2130
+ var byKey = {};
2131
+ var sources = [];
2132
+ if (Array.isArray(walletsInput)) sources.push(walletsInput);
2133
+ sources.push(SuiWalletKit.$wallets.value || []);
2134
+ sources.push(__wkReadDetectedWalletCache(__wkDetectedWalletCacheKey));
2135
+ for (var s = 0; s < sources.length; s++) {
2136
+ var list = Array.isArray(sources[s]) ? sources[s] : [];
2137
+ for (var i = 0; i < list.length; i++) {
2138
+ var wallet = list[i];
2139
+ if (!wallet || !wallet.name) continue;
2140
+ var name = String(wallet.name);
2141
+ var key = __wkWalletNameKey(name);
2142
+ if (!key) key = 'wallet-' + s + '-' + i;
2143
+ var icon = wallet.icon ? String(wallet.icon) : '';
2144
+ if (!icon) icon = __wkKnownWalletIconByName(name);
2145
+ var existing = byKey[key];
2146
+ if (!existing) {
2147
+ existing = {
2148
+ name: name,
2149
+ icon: icon,
2150
+ __isPasskey: !!wallet.__isPasskey,
2151
+ };
2152
+ byKey[key] = existing;
2153
+ out.push(existing);
2154
+ continue;
2155
+ }
2156
+ if (!existing.icon && icon) existing.icon = icon;
2157
+ if (existing.__isPasskey && !wallet.__isPasskey) existing.__isPasskey = false;
2158
+ }
2159
+ }
2160
+ return out;
2161
+ }
2162
+
2163
+ function __wkBridgeWalletHintSignature(wallets) {
2164
+ var list = Array.isArray(wallets) ? wallets : [];
2165
+ var parts = [];
2166
+ for (var i = 0; i < list.length; i++) {
2167
+ var wallet = list[i];
2168
+ if (!wallet || !wallet.name) continue;
2169
+ parts.push(
2170
+ __wkWalletNameKey(wallet.name)
2171
+ + '|' + String(wallet.icon || '')
2172
+ + '|' + (wallet.__isPasskey ? '1' : '0')
2173
+ );
2174
+ }
2175
+ return parts.join(',');
2176
+ }
2177
+
2178
+ function __wkSendBridgeWalletHints(walletsInput, force) {
2179
+ if (!__wkIsSubdomain()) return [];
2180
+ var hints = __wkCollectBridgeWalletHints(walletsInput);
2181
+ if (hints.length === 0) return [];
2182
+ var signature = __wkBridgeWalletHintSignature(hints);
2183
+ if (!force && signature && signature === __wkLastBridgeHintSignature) return hints;
2184
+ var bridge = SuiWalletKit.__skiSignFrame;
2185
+ var bridgeReady = SuiWalletKit.__skiSignReady;
2186
+ if (!bridge) {
2187
+ SuiWalletKit.__initSignBridge();
2188
+ bridge = SuiWalletKit.__skiSignFrame;
2189
+ bridgeReady = SuiWalletKit.__skiSignReady;
2190
+ }
2191
+ (bridgeReady || Promise.resolve(true)).then(function(ready) {
2192
+ if (!ready || !bridge || !bridge.contentWindow) return;
2193
+ __wkLastBridgeHintSignature = signature;
2194
+ bridge.contentWindow.postMessage({
2195
+ type: 'ski:wallet-hints',
2196
+ wallets: hints,
2197
+ }, 'https://sui.ski');
2198
+ }).catch(function() {});
2199
+ return hints;
2200
+ }
2201
+
2202
+ function __wkFetchWalletsViaBridge() {
2203
+ var bridge = SuiWalletKit.__skiSignFrame;
2204
+ var bridgeReady = SuiWalletKit.__skiSignReady;
2205
+ if (!bridge) {
2206
+ SuiWalletKit.__initSignBridge();
2207
+ bridge = SuiWalletKit.__skiSignFrame;
2208
+ bridgeReady = SuiWalletKit.__skiSignReady;
2209
+ }
2210
+ var walletHints = __wkSendBridgeWalletHints();
2211
+ var requestId = 'wallets-' + Date.now() + '-' + Math.random().toString(36).slice(2);
2212
+ return new Promise(function(resolve, reject) {
2213
+ (bridgeReady || Promise.resolve(true)).then(function(ready) {
2214
+ if (!ready || !bridge || !bridge.contentWindow) {
2215
+ reject(new Error('Bridge not available'));
2216
+ return;
2217
+ }
2218
+ var timeout = setTimeout(function() {
2219
+ cleanup();
2220
+ reject(new Error('Wallet discovery timed out'));
2221
+ }, 12000);
2222
+ function cleanup() {
2223
+ clearTimeout(timeout);
2224
+ window.removeEventListener('message', handleResponse);
2225
+ }
2226
+ function handleResponse(ev) {
2227
+ if (ev.origin !== 'https://sui.ski') return;
2228
+ if (!ev.data || ev.data.requestId !== requestId) return;
2229
+ if (ev.data.type === 'ski:wallets-result') {
2230
+ cleanup();
2231
+ resolve(Array.isArray(ev.data.wallets) ? ev.data.wallets : []);
2232
+ } else if (ev.data.type === 'ski:wallets-error') {
2233
+ cleanup();
2234
+ reject(new Error(ev.data.error || 'Wallet discovery failed'));
2235
+ }
2236
+ }
2237
+ window.addEventListener('message', handleResponse);
2238
+ bridge.contentWindow.postMessage({
2239
+ type: 'ski:wallets',
2240
+ requestId: requestId,
2241
+ walletHints: walletHints,
2242
+ }, 'https://sui.ski');
2243
+ }).catch(reject);
2244
+ });
2245
+ }
2246
+
2247
+ function __wkConnectViaBridge(walletName, listEl) {
2248
+ var bridge = SuiWalletKit.__skiSignFrame;
2249
+ var bridgeReady = SuiWalletKit.__skiSignReady;
2250
+ if (!bridge) {
2251
+ SuiWalletKit.__initSignBridge();
2252
+ bridge = SuiWalletKit.__skiSignFrame;
2253
+ bridgeReady = SuiWalletKit.__skiSignReady;
2254
+ }
2255
+ var walletHints = __wkSendBridgeWalletHints();
2256
+ var requestId = 'connect-' + Date.now();
2257
+ (bridgeReady || Promise.resolve(true)).then(function(ready) {
2258
+ if (!ready || !bridge || !bridge.contentWindow) {
2259
+ __wkShowConnectError(listEl, { message: 'Bridge not available' }, walletName);
2260
+ return;
2261
+ }
2262
+ bridge.contentWindow.postMessage({
2263
+ type: 'ski:connect',
2264
+ requestId: requestId,
2265
+ walletName: walletName,
2266
+ walletHints: walletHints,
2267
+ }, 'https://sui.ski');
2268
+ var timeout = setTimeout(function() {
2269
+ cleanup();
2270
+ __wkShowConnectError(listEl, { message: 'Connection timed out' }, walletName);
2271
+ }, 120000);
2272
+ function cleanup() {
2273
+ clearTimeout(timeout);
2274
+ window.removeEventListener('message', handleResponse);
2275
+ }
2276
+ function handleResponse(ev) {
2277
+ if (ev.origin !== 'https://sui.ski') return;
2278
+ if (!ev.data || ev.data.requestId !== requestId) return;
2279
+ if (ev.data.type === 'ski:connected') {
2280
+ cleanup();
2281
+ SuiWalletKit.initFromSession(ev.data.address, ev.data.walletName || walletName);
2282
+ __wkSetLastWallet(ev.data.walletName || walletName);
2283
+ if (typeof connectWalletSession === 'function') {
2284
+ connectWalletSession(ev.data.walletName || walletName, ev.data.address);
2285
+ }
2286
+ } else if (ev.data.type === 'ski:connect-error') {
2287
+ cleanup();
2288
+ var errMessage = ev.data && ev.data.error ? String(ev.data.error) : '';
2289
+ var errLower = errMessage.toLowerCase();
2290
+ var walletKey = __wkWalletNameKey(walletName);
2291
+ var isSlushFamily = __wkWalletKeysRelated(walletKey, 'slush');
2292
+ if (
2293
+ __wkIsSubdomain()
2294
+ && !isSlushFamily
2295
+ && (
2296
+ errLower.indexOf('selected wallet not available') !== -1
2297
+ || errLower.indexOf('preferred wallet not available') !== -1
2298
+ )
2299
+ ) {
2300
+ __wkFetchWalletsViaBridge().then(function(remoteWallets) {
2301
+ var merged = __wkMergeBridgeWallets(remoteWallets);
2302
+ var refreshed = __wkBuildWalletDisplayList(merged);
2303
+ if (refreshed.length > 0) {
2304
+ __wkRenderSplit(refreshed, { bridgeOnly: true });
2305
+ return;
2306
+ }
2307
+ __wkShowConnectError(listEl, { message: errMessage }, walletName);
2308
+ }).catch(function() {
2309
+ __wkShowConnectError(listEl, { message: errMessage }, walletName);
2310
+ });
2311
+ return;
2312
+ }
2313
+ __wkShowConnectError(listEl, { message: errMessage }, walletName);
2314
+ }
2315
+ }
2316
+ window.addEventListener('message', handleResponse);
2317
+ });
2318
+ }
2319
+
2320
+ function __wkRenderWalletItems(listEl, wallets) {
2321
+ if (!wallets || wallets.length === 0) {
2322
+ try {
2323
+ listEl.classList.add('wk-wallet-list-no-scroll');
2324
+ listEl.classList.remove('wk-wallet-list-scroll');
2325
+ } catch (_e) {}
2326
+ listEl.innerHTML = __wkInstallLinksHtml();
2327
+ return;
2328
+ }
2329
+ var lastWalletName = __wkWalletNameKey(__wkGetLastWallet());
2330
+ var sorted = __wkBuildWalletDisplayList(__wkSortWithRecent(wallets));
2331
+ var shouldScrollWallets = sorted.length >= 5;
2332
+ try {
2333
+ listEl.classList.toggle('wk-wallet-list-no-scroll', !shouldScrollWallets);
2334
+ listEl.classList.toggle('wk-wallet-list-scroll', shouldScrollWallets);
2335
+ } catch (_e) {}
2336
+ var isSubdomain = __wkIsSubdomain();
2337
+ listEl.innerHTML = '';
2338
+ for (var i = 0; i < sorted.length; i++) {
2339
+ (function(wallet) {
2340
+ var item = document.createElement('button');
2341
+ item.className = 'wk-wallet-item';
2342
+ var name = wallet.name || 'Unknown';
2343
+ var iconSrc = __wkResolveWalletIcon(wallet);
2344
+ var fallbackIcon = __wkKnownWalletIconByName(name) || __wkDefaultIcon();
2345
+ var isRecent = lastWalletName && __wkWalletNameKey(name) === lastWalletName;
2346
+ item.innerHTML = '<img alt="">'
2347
+ + '<span class="wk-wallet-name">' + name + '</span>'
2348
+ + (isRecent ? '<span class="wk-recent-badge">Recent</span>' : '');
2349
+ var iconEl = item.querySelector('img');
2350
+ if (iconEl) {
2351
+ iconEl.src = iconSrc;
2352
+ iconEl.addEventListener('error', function() {
2353
+ if (iconEl.getAttribute('data-fallback') === '1') {
2354
+ iconEl.style.display = 'none';
2355
+ return;
2356
+ }
2357
+ iconEl.setAttribute('data-fallback', '1');
2358
+ iconEl.src = fallbackIcon;
2359
+ });
2360
+ }
2361
+ item.addEventListener('click', function() {
2362
+ listEl.innerHTML = '<div class="wk-detecting"><div class="wk-spinner"></div> Connecting...</div>';
2363
+ var targetKey = __wkWalletNameKey(name);
2364
+ var isSlushFamily = __wkWalletKeysRelated(targetKey, 'slush');
2365
+ var connectWithTarget = function(targetWallet) {
2366
+ SuiWalletKit.connect(targetWallet).then(function() {
2367
+ __wkSetLastWallet(name);
2368
+ }).catch(function(err) {
2369
+ __wkShowConnectError(listEl, err, name);
2370
+ });
2371
+ };
2372
+ var pickTargetFromCurrentWallets = function() {
2373
+ var target = wallet;
2374
+ var currentWallets = SuiWalletKit.$wallets.value || [];
2375
+ for (var cw = 0; cw < currentWallets.length; cw++) {
2376
+ var cwKey = __wkWalletNameKey(currentWallets[cw].name);
2377
+ if (cwKey && targetKey && __wkWalletKeysRelated(cwKey, targetKey)) {
2378
+ target = currentWallets[cw];
2379
+ break;
2380
+ }
2381
+ }
2382
+ return target;
2383
+ };
2384
+ if (!isSlushFamily) {
2385
+ connectWithTarget(pickTargetFromCurrentWallets());
2386
+ return;
2387
+ }
2388
+ Promise.resolve().then(function() {
2389
+ return typeof SuiWalletKit.detectWallets === 'function'
2390
+ ? SuiWalletKit.detectWallets().catch(function() { return []; })
2391
+ : [];
2392
+ }).then(function() {
2393
+ var localTarget = pickTargetFromCurrentWallets();
2394
+ var localTargetKey = __wkWalletNameKey(localTarget && localTarget.name ? localTarget.name : '');
2395
+ if (localTargetKey && __wkWalletKeysRelated(localTargetKey, 'slush')) {
2396
+ connectWithTarget(localTarget);
2397
+ return;
2398
+ }
2399
+ var provider = (window.slush && (window.slush.sui || window.slush.wallet || window.slush))
2400
+ || ((window.sui && !window.sui.isPhantom) ? window.sui : null);
2401
+ if (!provider || typeof provider !== 'object') {
2402
+ throw new Error('Slush extension not detected in this page context');
2403
+ }
2404
+ var source = provider.sui && typeof provider.sui === 'object' ? provider.sui : provider;
2405
+ var connectFeature = source.features && source.features['standard:connect']
2406
+ ? source.features['standard:connect']
2407
+ : (typeof source.connect === 'function'
2408
+ ? { connect: source.connect.bind(source) }
2409
+ : (typeof source.requestAccounts === 'function'
2410
+ ? { connect: source.requestAccounts.bind(source) }
2411
+ : (typeof source.requestAccount === 'function'
2412
+ ? { connect: source.requestAccount.bind(source) }
2413
+ : undefined)));
2414
+ if (!connectFeature) {
2415
+ throw new Error('Slush extension detected but no connect method is available');
2416
+ }
2417
+ connectWithTarget({
2418
+ name: name,
2419
+ icon: source.icon || iconSrc || fallbackIcon,
2420
+ chains: ['sui:mainnet', 'sui:testnet', 'sui:devnet'],
2421
+ features: {
2422
+ 'standard:connect': connectFeature,
2423
+ 'standard:disconnect': typeof source.disconnect === 'function'
2424
+ ? { disconnect: source.disconnect.bind(source) }
2425
+ : undefined,
2426
+ 'sui:signAndExecuteTransaction': typeof source.signAndExecuteTransaction === 'function'
2427
+ ? { signAndExecuteTransaction: source.signAndExecuteTransaction.bind(source) }
2428
+ : undefined,
2429
+ 'sui:signAndExecuteTransactionBlock': typeof source.signAndExecuteTransactionBlock === 'function'
2430
+ ? { signAndExecuteTransactionBlock: source.signAndExecuteTransactionBlock.bind(source) }
2431
+ : undefined,
2432
+ 'sui:signTransaction': typeof source.signTransaction === 'function'
2433
+ ? { signTransaction: source.signTransaction.bind(source) }
2434
+ : undefined,
2435
+ 'sui:signPersonalMessage': typeof source.signPersonalMessage === 'function'
2436
+ ? { signPersonalMessage: source.signPersonalMessage.bind(source) }
2437
+ : undefined,
2438
+ },
2439
+ get accounts() {
2440
+ return Array.isArray(source.accounts) ? source.accounts : [];
2441
+ },
2442
+ _raw: source,
2443
+ });
2444
+ }).catch(function(err) {
2445
+ __wkShowConnectError(listEl, err, name);
2446
+ });
2447
+ });
2448
+ listEl.appendChild(item);
2449
+ })(sorted[i]);
2450
+ }
2451
+ }
2452
+
2453
+ function __wkRenderSplit(wallets, options) {
2454
+ if (!__wkModalContainer) return;
2455
+ var listEl = __wkModalContainer.querySelector('.wk-wallet-list');
2456
+ if (!listEl) return;
2457
+ var bridgeOnly = !!(options && options.bridgeOnly);
2458
+ if (Array.isArray(wallets) && wallets.length > 0) {
2459
+ __wkRememberDetectedWallets(wallets, bridgeOnly);
2460
+ }
2461
+
2462
+ var nonWaaPWallets = [];
2463
+ for (var i = 0; i < wallets.length; i++) {
2464
+ var name = wallets[i].name ? String(wallets[i].name).toLowerCase() : '';
2465
+ if (name !== 'waap') {
2466
+ nonWaaPWallets.push(wallets[i]);
2467
+ }
2468
+ }
2469
+
2470
+ __wkRenderSocialSection(__wkModalContainer, wallets);
2471
+ __wkRenderWalletItems(listEl, nonWaaPWallets);
2472
+ }
2473
+
2474
+ function __wkIsModalOpen() {
2475
+ if (!__wkModalContainer) return false;
2476
+ var overlayEl = __wkModalContainer.querySelector('.wk-modal-overlay');
2477
+ return !!(overlayEl && overlayEl.classList.contains('open'));
2478
+ }
2479
+
2480
+ function __wkPopulateModal() {
2481
+ if (!__wkModalContainer) return;
2482
+ var listEl = __wkModalContainer.querySelector('.wk-wallet-list');
2483
+ if (!listEl) return;
2484
+ listEl.innerHTML = '<div class="wk-detecting"><div class="wk-spinner"></div> Detecting wallets...</div>';
2485
+ var isSubdomain = __wkIsSubdomain();
2486
+ var immediate = SuiWalletKit.$wallets.value;
2487
+ if (isSubdomain) {
2488
+ __wkSendBridgeWalletHints(Array.isArray(immediate) ? immediate : [], true);
2489
+ }
2490
+ var cached = isSubdomain
2491
+ ? __wkReadDetectedWalletCache(__wkBridgeDetectedWalletCacheKey)
2492
+ : __wkReadDetectedWalletCache();
2493
+ var warmWallets = isSubdomain
2494
+ ? __wkBuildWalletDisplayList(cached)
2495
+ : __wkCombineWalletSources(Array.isArray(immediate) ? immediate : [], cached);
2496
+ __wkRenderSocialSection(__wkModalContainer, Array.isArray(immediate) ? immediate : []);
2497
+ if (isSubdomain && typeof SuiWalletKit.__initSignBridge === 'function') {
2498
+ try { SuiWalletKit.__initSignBridge(); } catch (_e) {}
2499
+ }
2500
+ if (isSubdomain && typeof SuiWalletKit.detectWallets === 'function') {
2501
+ SuiWalletKit.detectWallets().then(function(localWallets) {
2502
+ var hints = __wkSendBridgeWalletHints(localWallets, true);
2503
+ if (!__wkIsModalOpen()) return;
2504
+ if (hints.length > 0) {
2505
+ var hintMerged = __wkMergeBridgeWallets(hints);
2506
+ var hintAvailable = __wkBuildWalletDisplayList(hintMerged);
2507
+ if (hintAvailable.length > 0) {
2508
+ __wkRenderSplit(hintAvailable, { bridgeOnly: true });
2509
+ }
2510
+ }
2511
+ }).catch(function() {});
2512
+ }
2513
+
2514
+ if (warmWallets.length > 0 && !isSubdomain) {
2515
+ __wkRenderSplit(warmWallets);
2516
+ }
2517
+ if (isSubdomain) {
2518
+ __wkResetBridgeWalletCache();
2519
+ var bridgeAttempts = 0;
2520
+ function __wkPollBridge(initialAttempt) {
2521
+ if (!__wkIsModalOpen()) return;
2522
+ __wkFetchWalletsViaBridge().then(function(wallets) {
2523
+ if (!__wkIsModalOpen()) return;
2524
+ var merged = __wkMergeBridgeWallets(wallets);
2525
+ var available = __wkBuildWalletDisplayList(merged);
2526
+ if (available.length > 0) {
2527
+ __wkRenderSplit(available, { bridgeOnly: true });
2528
+ } else if (initialAttempt) {
2529
+ listEl.innerHTML = __wkInstallLinksHtml();
2530
+ }
2531
+ }).catch(function() {
2532
+ if (!__wkIsModalOpen()) return;
2533
+ var snapshot = __wkGetBridgeWalletSnapshot();
2534
+ var available = __wkBuildWalletDisplayList(snapshot);
2535
+ if (available.length > 0) {
2536
+ __wkRenderSplit(available, { bridgeOnly: true });
2537
+ } else if (initialAttempt) {
2538
+ listEl.innerHTML = __wkInstallLinksHtml();
2539
+ }
2540
+ }).finally(function() {
2541
+ bridgeAttempts++;
2542
+ if (bridgeAttempts < 6 && __wkIsModalOpen()) {
2543
+ setTimeout(function() {
2544
+ __wkPollBridge(false);
2545
+ }, 500);
2546
+ }
2547
+ });
2548
+ }
2549
+ __wkPollBridge(true);
2550
+ return;
2551
+ }
2552
+ SuiWalletKit.detectWallets().then(function(wallets) {
2553
+ if (wallets && wallets.length > 0) {
2554
+ __wkRenderSplit(wallets);
2555
+ } else if (warmWallets.length === 0) {
2556
+ listEl.innerHTML = __wkInstallLinksHtml();
2557
+ }
2558
+ }).catch(function() {
2559
+ if (warmWallets.length === 0) {
2560
+ listEl.innerHTML = __wkInstallLinksHtml();
2561
+ }
2562
+ });
2563
+ }
2564
+
2565
+ SuiWalletKit.renderModal = function renderModal(containerId) {
2566
+ var container = document.getElementById(containerId);
2567
+ if (!container) throw new Error('Modal container not found: ' + containerId);
2568
+ __wkModalContainer = container;
2569
+
2570
+ var __wkQrUrl = 'https://waap.sui.ski?ref=ski-keyin&src=wallet-modal';
2571
+ container.innerHTML = '<div class="wk-modal-overlay" id="__wk-overlay">'
2572
+ + '<div class="wk-modal-wrap">'
2573
+ + '<div class="wk-modal">'
2574
+ + '<div class="wk-snow-layer"></div>'
2575
+ + '<div class="wk-modal-header">'
2576
+ + '<div class="wk-modal-header-left">'
2577
+ + '<div class="wk-modal-brand-row">'
2578
+ + '<span class="wk-modal-logo">' + __wkLogoSvg + '</span>'
2579
+ + '<div class="wk-modal-title-wrap">'
2580
+ + '<h3>.Sui Key-In</h3>'
2581
+ + '<div class="wk-modal-subtitle"><span>once,</span><span>everywhere</span></div>'
2582
+ + '</div>'
2583
+ + '</div>'
2584
+ + '</div>'
2585
+ + '<button class="wk-modal-close" id="__wk-close">\\u00D7</button>'
2586
+ + '</div>'
2587
+ + '<div class="wk-social-section" style="display:none">'
2588
+ + '<div class="wk-social-grid"></div>'
2589
+ + '<a class="wk-powered-pill" href="https://waap.sui.ski" target="_blank" rel="noopener"><img src="' + __wkWaaPIcon + '" alt="WaaP"> powered by WaaP</a>'
2590
+ + '</div>'
2591
+ + '<div class="wk-modal-main">'
2592
+ + '<div class="wk-waap-column">'
2593
+ + '<a class="wk-qr-link" href="' + __wkQrUrl + '" target="_blank" rel="noopener">'
2594
+ + __wkQrSvg
2595
+ + '<div class="wk-qr-center-logo"><img src="' + __wkWaaPIcon + '" alt="WaaP"></div>'
2596
+ + '</a>'
2597
+ + '<button class="wk-qr-copy" id="__wk-qr-copy" title="Copy WaaP link"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg></button>'
2598
+ + '</div>'
2599
+ + '<div class="wk-trad-column">'
2600
+ + '<div class="wk-divider" style="display:none"><span>Trad Wallet</span></div>'
2601
+ + '<div class="wk-wallet-list"></div>'
2602
+ + '</div>'
2603
+ + '</div>'
2604
+ + '</div>'
2605
+ + '</div>'
2606
+ + '</div>';
2607
+
2608
+ var overlay = document.getElementById('__wk-overlay');
2609
+ var closeBtn = document.getElementById('__wk-close');
2610
+
2611
+ overlay.addEventListener('click', function(e) {
2612
+ if (e.target === overlay) SuiWalletKit.closeModal();
2613
+ });
2614
+ closeBtn.addEventListener('click', function() {
2615
+ SuiWalletKit.closeModal();
2616
+ });
2617
+ document.addEventListener('keydown', function(e) {
2618
+ if (e.key === 'Escape' && document.body.classList.contains('wk-modal-open')) {
2619
+ SuiWalletKit.closeModal();
2620
+ }
2621
+ });
2622
+
2623
+ var __wkCopyIcon = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>';
2624
+ var __wkCheckIcon = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>';
2625
+ function __wkBindCopy(btn) {
2626
+ if (!btn) return;
2627
+ btn.addEventListener('click', function() {
2628
+ navigator.clipboard.writeText(__wkQrUrl).then(function() {
2629
+ btn.innerHTML = __wkCheckIcon;
2630
+ btn.style.color = '#4ade80';
2631
+ setTimeout(function() { btn.innerHTML = __wkCopyIcon; btn.style.color = ''; }, 1500);
2632
+ }).catch(function() {});
2633
+ });
2634
+ }
2635
+ __wkBindCopy(document.getElementById('__wk-qr-copy'));
2636
+
2637
+ if (__wkModalUnsub) __wkModalUnsub();
2638
+ __wkModalUnsub = SuiWalletKit.subscribe(SuiWalletKit.$connection, function(conn) {
2639
+ if (conn && (conn.status === 'connected' || conn.status === 'session')) {
2640
+ SuiWalletKit.closeModal();
2641
+ ${onConnect ? `if (typeof window['${onConnect}'] === 'function') window['${onConnect}']();` : ''}
2642
+ }
2643
+ if (conn && conn.status === 'disconnected') {
2644
+ ${onDisconnect ? `if (typeof window['${onDisconnect}'] === 'function') window['${onDisconnect}']();` : ''}
2645
+ }
2646
+ });
2647
+ if (__wkModalWalletsUnsub) __wkModalWalletsUnsub();
2648
+ __wkModalWalletsUnsub = SuiWalletKit.subscribe(SuiWalletKit.$wallets, function(wallets) {
2649
+ if (!__wkModalContainer) return;
2650
+ if (!__wkIsModalOpen()) return;
2651
+ var connState = SuiWalletKit.$connection.value;
2652
+ if (connState && connState.status === 'connecting') return;
2653
+ if (__wkIsSubdomain()) {
2654
+ __wkSendBridgeWalletHints(Array.isArray(wallets) ? wallets : [], true);
2655
+ __wkFetchWalletsViaBridge().then(function(remoteWallets) {
2656
+ if (!__wkIsModalOpen()) return;
2657
+ var merged = __wkMergeBridgeWallets(remoteWallets);
2658
+ var available = __wkBuildWalletDisplayList(merged);
2659
+ if (available.length > 0) {
2660
+ __wkRenderSplit(available, { bridgeOnly: true });
2661
+ return;
2662
+ }
2663
+ var snapshot = __wkGetBridgeWalletSnapshot();
2664
+ if (snapshot.length > 0) {
2665
+ __wkRenderSplit(__wkBuildWalletDisplayList(snapshot), { bridgeOnly: true });
2666
+ }
2667
+ }).catch(function() {
2668
+ if (!__wkIsModalOpen()) return;
2669
+ var snapshot = __wkGetBridgeWalletSnapshot();
2670
+ if (snapshot.length > 0) {
2671
+ __wkRenderSplit(__wkBuildWalletDisplayList(snapshot), { bridgeOnly: true });
2672
+ }
2673
+ });
2674
+ return;
2675
+ }
2676
+ __wkRenderSplit(Array.isArray(wallets) ? wallets : []);
2677
+ });
2678
+ };
2679
+
2680
+ function __wkIsSubdomain() {
2681
+ var host = window.location.hostname;
2682
+ return host !== 'sui.ski' && host.endsWith('.sui.ski');
2683
+ }
2684
+
2685
+ SuiWalletKit.openModal = function openModal() {
2686
+ if (!__wkModalContainer) return;
2687
+ var overlay = __wkModalContainer.querySelector('.wk-modal-overlay');
2688
+ if (overlay) {
2689
+ overlay.classList.add('open');
2690
+ try { document.body.classList.add('wk-modal-open'); } catch (_e) {}
2691
+ try { document.documentElement.classList.add('wk-modal-open'); } catch (_e) {}
2692
+ __wkPopulateModal();
2693
+ }
2694
+ };
2695
+
2696
+ SuiWalletKit.closeModal = function closeModal() {
2697
+ if (!__wkModalContainer) return;
2698
+ var overlay = __wkModalContainer.querySelector('.wk-modal-overlay');
2699
+ if (overlay) overlay.classList.remove('open');
2700
+ try { document.body.classList.remove('wk-modal-open'); } catch (_e) {}
2701
+ try { document.documentElement.classList.remove('wk-modal-open'); } catch (_e) {}
2702
+ };
2703
+
2704
+ function __wkBuildDropdownHtml(conn) {
2705
+ var rawAddr = conn && conn.address ? conn.address : '';
2706
+ var normalizedAddr = __wkNormalizeSuiAddress(rawAddr);
2707
+ var addr = normalizedAddr || rawAddr;
2708
+ var primaryName = ${showPrimaryName} ? (conn && conn.primaryName ? conn.primaryName : null) : null;
2709
+ var connectionHint = __wkGetWaaPConnectionHint(conn);
2710
+ var html = '';
2711
+
2712
+ if (addr) {
2713
+ html += '<div style="padding:6px 10px 6px;border-bottom:1px solid rgba(255,255,255,0.06);margin-bottom:4px;cursor:pointer;" id="__wk-dd-addr-display" title="Click to copy full address">';
2714
+ html += '<div style="font-size:0.65rem;color:#e2e8f0;text-transform:uppercase;letter-spacing:0.06em;margin-bottom:3px">Your Address</div>';
2715
+ html += '<div style="font-size:0.68rem;color:#94a3b8;word-break:break-all;line-height:1.35;font-family:SF Mono,Fira Code,monospace">' + __wkEscapeHtml(addr) + '</div>';
2716
+ if (connectionHint) {
2717
+ html += '<div style="font-size:0.62rem;margin-top:4px;color:#cbd5e1;">' + __wkEscapeHtml(connectionHint) + '</div>';
2718
+ }
2719
+ html += '</div>';
2720
+ }
2721
+
2722
+ if (__wkPortfolioData && __wkPortfolioData.holdings && __wkPortfolioData.holdings.length > 0) {
2723
+ var l1Holdings = __wkGetL1Holdings(__wkPortfolioData);
2724
+ if (l1Holdings.length > 0) {
2725
+ html += '<div style="padding:4px 4px 2px;border-bottom:1px solid rgba(255,255,255,0.06);margin-bottom:4px;">';
2726
+ for (var l = 0; l < l1Holdings.length; l++) {
2727
+ var l1 = l1Holdings[l];
2728
+ var l1BalFmt = __wkFormatTokenAmount(l1.balance);
2729
+ var l1UsdVal = __wkPortfolioData.usdcPerSui > 0 ? __wkFormatUsd(l1.suiValue * __wkPortfolioData.usdcPerSui) : '';
2730
+ var l1Icon = __wkL1Icons[l1.name] || '';
2731
+ var subTokens = __wkGetL1SubTokens(l1.name, __wkPortfolioData);
2732
+ var hasSubTokens = subTokens.length > 0;
2733
+ var isExpanded = !!__wkExpandedL1[l1.name];
2734
+ html += '<button class="wk-dropdown-item' + (hasSubTokens ? ' __wk-dd-l1-toggle' : '') + '" data-l1="' + __wkEscapeHtml(l1.name) + '" style="padding:6px 8px;font-size:0.76rem;justify-content:space-between;' + (hasSubTokens ? 'cursor:pointer;' : 'cursor:default;') + '">';
2735
+ html += '<span style="display:flex;align-items:center;gap:8px;">';
2736
+ html += '<span style="width:18px;text-align:center;flex-shrink:0;">' + l1Icon + '</span>';
2737
+ html += '<span style="color:#e2e8f0;font-weight:700;">' + __wkEscapeHtml(l1.name) + '</span>';
2738
+ if (hasSubTokens) {
2739
+ html += '<span style="opacity:0.5;font-size:0.6rem;margin-left:2px;">' + (isExpanded ? '\\u25B2' : '\\u25BC') + '</span>';
2740
+ }
2741
+ html += '</span>';
2742
+ html += '<span style="display:flex;flex-direction:column;align-items:flex-end;gap:1px;">';
2743
+ html += '<span style="color:#e2e8f0;font-weight:600;">' + __wkEscapeHtml(l1BalFmt) + '</span>';
2744
+ if (l1UsdVal) {
2745
+ html += '<span style="font-size:0.58rem;color:#94a3b8;">~' + __wkEscapeHtml(l1UsdVal) + '</span>';
2746
+ }
2747
+ html += '</span>';
2748
+ html += '</button>';
2749
+ if (hasSubTokens && isExpanded) {
2750
+ html += '<div style="margin:0 0 2px 28px;display:flex;flex-direction:column;gap:1px;">';
2751
+ for (var s = 0; s < subTokens.length; s++) {
2752
+ var sub = subTokens[s];
2753
+ var subBalFmt = __wkFormatTokenAmount(sub.balance);
2754
+ var subSuiVal = __wkFormatBalance(sub.suiValue);
2755
+ html += '<div style="display:flex;justify-content:space-between;align-items:center;padding:3px 8px 3px 0;font-size:0.7rem;color:#9fb0c7;">';
2756
+ html += '<span>' + __wkEscapeHtml(sub.name) + '</span>';
2757
+ html += '<span style="color:#cbd5e1;">' + __wkEscapeHtml(subBalFmt) + ' <span style="opacity:0.5;">(' + __wkEscapeHtml(subSuiVal) + __wkSuiIconSvg + ')</span></span>';
2758
+ html += '</div>';
2759
+ }
2760
+ html += '</div>';
2761
+ }
2762
+ }
2763
+ html += '</div>';
2764
+ }
2765
+ }
2766
+
2767
+ html += '<button class="wk-dropdown-item" id="__wk-dd-copy" style="position:relative;">'
2768
+ + '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>'
2769
+ + 'Copy Address</button>';
2770
+
2771
+ html += '<button class="wk-dropdown-item" id="__wk-dd-switch">'
2772
+ + '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="8.5" cy="7" r="4"/><polyline points="17 11 19 13 23 9"/></svg>'
2773
+ + 'Switch Wallet</button>';
2774
+
2775
+ html += '<button class="wk-dropdown-item disconnect" id="__wk-dd-disconnect">'
2776
+ + '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><polyline points="16 17 21 12 16 7"/><line x1="21" y1="12" x2="9" y2="12"/></svg>'
2777
+ + 'Disconnect</button>';
2778
+
2779
+ return html;
2780
+ }
2781
+
2782
+ function __wkEscapeHtml(value) {
2783
+ var text = String(value || '');
2784
+ return text
2785
+ .replace(/&/g, '&amp;')
2786
+ .replace(/</g, '&lt;')
2787
+ .replace(/>/g, '&gt;')
2788
+ .replace(/"/g, '&quot;')
2789
+ .replace(/'/g, '&#39;');
2790
+ }
2791
+
2792
+ var __wkSuiIconSvg = '<svg viewBox="0 0 300 384" width="10" height="13" aria-hidden="true" focusable="false" style="display:inline-block;vertical-align:-2px;margin-left:4px;fill:#4DA2FF;"><path fill-rule="evenodd" clip-rule="evenodd" d="M240.057 159.914C255.698 179.553 265.052 204.39 265.052 231.407C265.052 258.424 255.414 284.019 239.362 303.768L237.971 305.475L237.608 303.31C237.292 301.477 236.929 299.613 236.502 297.749C228.46 262.421 202.265 232.134 159.148 207.597C130.029 191.071 113.361 171.195 108.985 148.586C106.157 133.972 108.258 119.294 112.318 106.717C116.379 94.1569 122.414 83.6187 127.549 77.2831L144.328 56.7754C147.267 53.1731 152.781 53.1731 155.719 56.7754L240.073 159.914H240.057ZM266.584 139.422L154.155 1.96703C152.007 -0.655678 147.993 -0.655678 145.845 1.96703L33.4316 139.422L33.0683 139.881C12.3868 165.555 0 198.181 0 233.698C0 316.408 67.1635 383.461 150 383.461C232.837 383.461 300 316.408 300 233.698C300 198.181 287.613 165.555 266.932 139.896L266.568 139.438L266.584 139.422ZM60.3381 159.472L70.3866 147.164L70.6868 149.439C70.9237 151.24 71.2239 153.041 71.5715 154.858C78.0809 189.001 101.322 217.456 140.173 239.496C173.952 258.724 193.622 280.828 199.278 305.064C201.648 315.176 202.059 325.129 201.032 333.835L200.969 334.372L200.479 334.609C185.233 342.05 168.09 346.237 149.984 346.237C86.4546 346.237 34.9484 294.826 34.9484 231.391C34.9484 204.153 44.4439 179.142 60.3065 159.44L60.3381 159.472Z"></path></svg>';
2793
+
2794
+ function __wkBindDropdownEvents(conn) {
2795
+ var copyBtn = document.getElementById('__wk-dd-copy');
2796
+ var addrDisplay = document.getElementById('__wk-dd-addr-display');
2797
+ var l1Toggles = document.querySelectorAll('.__wk-dd-l1-toggle');
2798
+ var switchBtn = document.getElementById('__wk-dd-switch');
2799
+ var disconnectBtn = document.getElementById('__wk-dd-disconnect');
2800
+
2801
+ function __wkCopyAddress(targetEl) {
2802
+ var rawAddr = conn && conn.address ? conn.address : '';
2803
+ var normalizedAddr = __wkNormalizeSuiAddress(rawAddr);
2804
+ var addr = __wkIsValidSuiAddress(normalizedAddr) ? normalizedAddr : rawAddr;
2805
+ if (!addr) return;
2806
+ navigator.clipboard.writeText(addr).then(function() {
2807
+ var flash = document.createElement('span');
2808
+ flash.className = 'wk-copied-flash';
2809
+ flash.textContent = 'Copied!';
2810
+ targetEl.appendChild(flash);
2811
+ setTimeout(function() { flash.remove(); }, 1500);
2812
+ });
2813
+ }
2814
+ if (copyBtn) {
2815
+ copyBtn.addEventListener('click', function() { __wkCopyAddress(copyBtn); });
2816
+ }
2817
+ if (addrDisplay) {
2818
+ addrDisplay.addEventListener('click', function() { __wkCopyAddress(addrDisplay); });
2819
+ }
2820
+ for (var t = 0; t < l1Toggles.length; t++) {
2821
+ (function(btn) {
2822
+ btn.addEventListener('click', function(e) {
2823
+ e.preventDefault();
2824
+ e.stopPropagation();
2825
+ var l1Name = btn.getAttribute('data-l1');
2826
+ if (!l1Name) return;
2827
+ var wasOpen = false;
2828
+ var dropdown = __wkWidgetContainer && __wkWidgetContainer.querySelector('.wk-dropdown');
2829
+ if (dropdown && dropdown.classList.contains('open')) wasOpen = true;
2830
+ __wkExpandedL1[l1Name] = !__wkExpandedL1[l1Name];
2831
+ __wkUpdateWidget(SuiWalletKit.$connection.value);
2832
+ if (wasOpen) {
2833
+ var nextDropdown = __wkWidgetContainer && __wkWidgetContainer.querySelector('.wk-dropdown');
2834
+ if (nextDropdown) nextDropdown.classList.add('open');
2835
+ }
2836
+ });
2837
+ })(l1Toggles[t]);
2838
+ }
2839
+ if (switchBtn) {
2840
+ switchBtn.addEventListener('click', function() {
2841
+ var dropdown = __wkWidgetContainer && __wkWidgetContainer.querySelector('.wk-dropdown');
2842
+ if (dropdown) dropdown.classList.remove('open');
2843
+ var bridge = SuiWalletKit.__skiSignFrame;
2844
+ if (bridge && bridge.contentWindow) {
2845
+ bridge.contentWindow.postMessage({ type: 'ski:disconnect' }, 'https://sui.ski');
2846
+ }
2847
+ SuiWalletKit.disconnect();
2848
+ setTimeout(function() { SuiWalletKit.openModal(); }, 120);
2849
+ });
2850
+ }
2851
+ if (disconnectBtn) {
2852
+ disconnectBtn.addEventListener('click', function() {
2853
+ var dropdown = __wkWidgetContainer && __wkWidgetContainer.querySelector('.wk-dropdown');
2854
+ if (dropdown) dropdown.classList.remove('open');
2855
+ var bridge = SuiWalletKit.__skiSignFrame;
2856
+ if (bridge && bridge.contentWindow) {
2857
+ bridge.contentWindow.postMessage({ type: 'ski:disconnect' }, 'https://sui.ski');
2858
+ }
2859
+ SuiWalletKit.disconnect();
2860
+ });
2861
+ }
2862
+ }
2863
+
2864
+ function __wkUpdateWidget(conn) {
2865
+ if (!__wkWidgetContainer) return;
2866
+ var widget = __wkWidgetContainer.querySelector('.wk-widget');
2867
+ if (!widget) return;
2868
+ var btn = widget.querySelector('.wk-widget-btn');
2869
+ var dropdown = widget.querySelector('.wk-dropdown');
2870
+ if (!btn || !dropdown) return;
2871
+
2872
+ var isActive = conn && (conn.status === 'connected' || conn.status === 'session') && conn.address;
2873
+ if (isActive) {
2874
+ if (__wkKeepBrandLogoWhenConnected) {
2875
+ if (__wkWidgetBtnMarkup !== __wkWidgetDefaultMarkup) {
2876
+ btn.innerHTML = __wkWidgetDefaultMarkup;
2877
+ __wkWidgetBtnMarkup = __wkWidgetDefaultMarkup;
2878
+ }
2879
+ if (__wkWidgetBtnStateClass) {
2880
+ btn.classList.remove('connected', 'session-only');
2881
+ __wkWidgetBtnStateClass = '';
2882
+ }
2883
+ if (__wkWidgetDropdownMarkup) {
2884
+ dropdown.innerHTML = '';
2885
+ __wkWidgetDropdownMarkup = '';
2886
+ }
2887
+ dropdown.classList.remove('open');
2888
+ return;
2889
+ }
2890
+ var normalizedAddress = __wkNormalizeSuiAddress(conn.address);
2891
+ var hasValidAddress = __wkIsValidSuiAddress(normalizedAddress);
2892
+ var addressForLabel = hasValidAddress ? normalizedAddress : String(conn.address || '');
2893
+ var isPrimaryName = ${showPrimaryName} && conn.primaryName;
2894
+ var label = isPrimaryName ? conn.primaryName : __wkTruncAddr(addressForLabel);
2895
+ var safeLabel = isPrimaryName
2896
+ ? '<span class="wk-widget-primary-name">' + __wkEscapeHtml(label) + '</span>'
2897
+ : __wkEscapeHtml(label);
2898
+ var widgetWallet = __wkResolveWidgetWallet(conn);
2899
+ var walletIcon = widgetWallet.icon;
2900
+ var connectionHint = __wkGetWaaPConnectionHint(conn);
2901
+ var waapMethod = connectionHint ? __wkResolveWaaPMethod(conn) : '';
2902
+ var methodSvg = (connectionHint && waapMethod) ? __wkWidgetMethodIconSvg(waapMethod) : '';
2903
+ var balanceLine = '';
2904
+ if (__wkPortfolioData) {
2905
+ var suiSummary = __wkFormatBalance(__wkPortfolioData.totalSui);
2906
+ var stableTotal = __wkGetStablecoinTotal(__wkPortfolioData);
2907
+ var stableSummary = stableTotal >= 0.01 ? __wkFormatUsd(stableTotal) : '';
2908
+ if (suiSummary || stableSummary) {
2909
+ balanceLine = '<span class="wk-widget-balance-wrap">';
2910
+ if (suiSummary) {
2911
+ balanceLine += '<span class="wk-widget-token-row">' + __wkEscapeHtml(suiSummary) + __wkSuiIconSvg + '</span>';
2912
+ }
2913
+ if (stableSummary) {
2914
+ balanceLine += '<span class="wk-widget-usd-row">' + __wkEscapeHtml(stableSummary) + '</span>';
2915
+ }
2916
+ balanceLine += '</span>';
2917
+ }
2918
+ }
2919
+ var labelMarkup = '<span class="wk-widget-label-wrap"><span class="wk-widget-title">' + safeLabel + '</span></span>';
2920
+ var nextBtnMarkup = '';
2921
+ var waapBadge = connectionHint ? '<img src="' + __wkWaaPIcon + '" class="wk-widget-icon wk-waap-badge" alt="WaaP" onerror="this.style.display=\\'none\\'">' : '';
2922
+ if (connectionHint) {
2923
+ if (methodSvg) {
2924
+ nextBtnMarkup = waapBadge + '<span class="wk-widget-icon-fallback">' + methodSvg + '</span>' + labelMarkup + balanceLine;
2925
+ } else {
2926
+ nextBtnMarkup = waapBadge + labelMarkup + balanceLine;
2927
+ }
2928
+ } else if (walletIcon) {
2929
+ nextBtnMarkup = '<img src="' + walletIcon + '" class="wk-widget-icon" alt="" onerror="this.style.display=\\'none\\'">' + labelMarkup + balanceLine;
2930
+ } else if (conn.status === 'session') {
2931
+ nextBtnMarkup = '<span class="wk-widget-icon-fallback"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="opacity:0.6"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg></span>' + labelMarkup + balanceLine;
2932
+ } else {
2933
+ nextBtnMarkup = labelMarkup + balanceLine;
2934
+ }
2935
+ if (__wkWidgetBtnMarkup !== nextBtnMarkup) {
2936
+ btn.innerHTML = nextBtnMarkup;
2937
+ __wkWidgetBtnMarkup = nextBtnMarkup;
2938
+ }
2939
+ var nextBtnStateClass = 'connected';
2940
+ if (__wkWidgetBtnStateClass !== nextBtnStateClass) {
2941
+ btn.classList.remove('connected', 'session-only');
2942
+ btn.classList.add(nextBtnStateClass);
2943
+ __wkWidgetBtnStateClass = nextBtnStateClass;
2944
+ }
2945
+ var nextDropdownMarkup = __wkBuildDropdownHtml(conn);
2946
+ if (__wkWidgetDropdownMarkup !== nextDropdownMarkup) {
2947
+ dropdown.innerHTML = nextDropdownMarkup;
2948
+ __wkWidgetDropdownMarkup = nextDropdownMarkup;
2949
+ __wkBindDropdownEvents(conn);
2950
+ }
2951
+ } else {
2952
+ __wkStopPortfolioPolling();
2953
+ if (__wkWidgetBtnMarkup !== __wkWidgetDefaultMarkup) {
2954
+ btn.innerHTML = __wkWidgetDefaultMarkup;
2955
+ __wkWidgetBtnMarkup = __wkWidgetDefaultMarkup;
2956
+ }
2957
+ if (__wkWidgetBtnStateClass) {
2958
+ btn.classList.remove('connected', 'session-only');
2959
+ __wkWidgetBtnStateClass = '';
2960
+ }
2961
+ if (__wkWidgetDropdownMarkup) {
2962
+ dropdown.innerHTML = '';
2963
+ __wkWidgetDropdownMarkup = '';
2964
+ }
2965
+ dropdown.classList.remove('open');
2966
+ }
2967
+ }
2968
+
2969
+ SuiWalletKit.renderWidget = function renderWidget(containerId) {
2970
+ var container = document.getElementById(containerId);
2971
+ if (!container) throw new Error('Widget container not found: ' + containerId);
2972
+ __wkWidgetContainer = container;
2973
+
2974
+ var widget = container.querySelector('.wk-widget');
2975
+ if (!widget) {
2976
+ container.innerHTML = '<div class="wk-widget">'
2977
+ + '<button class="wk-widget-btn" data-wk-role="toggle">' + __wkWidgetDefaultMarkup + '</button>'
2978
+ + '<div class="wk-dropdown"></div>'
2979
+ + '</div>';
2980
+ widget = container.querySelector('.wk-widget');
2981
+ __wkWidgetBtnMarkup = '';
2982
+ __wkWidgetBtnStateClass = '';
2983
+ __wkWidgetDropdownMarkup = '';
2984
+ }
2985
+
2986
+ var btn = container.querySelector('.wk-widget-btn');
2987
+ if (btn && container.dataset.wkWidgetBound !== '1') {
2988
+ container.dataset.wkWidgetBound = '1';
2989
+ btn.addEventListener('click', function() {
2990
+ var activeWidget = __wkWidgetContainer && __wkWidgetContainer.querySelector('.wk-widget');
2991
+ var dropdown = __wkWidgetContainer && __wkWidgetContainer.querySelector('.wk-dropdown');
2992
+ if (!activeWidget || !dropdown) return;
2993
+ var conn = SuiWalletKit.$connection.value;
2994
+ if (conn && (conn.status === 'connected' || conn.status === 'session')) {
2995
+ if (__wkKeepBrandLogoWhenConnected) {
2996
+ var profileHref = __wkGetPrimaryProfileHref(conn);
2997
+ window.location.href = profileHref || ('https://' + __wkPrimaryProfileHost);
2998
+ return;
2999
+ }
3000
+ dropdown.classList.toggle('open');
3001
+ } else {
3002
+ var modalOpen = document.body && document.body.classList.contains('wk-modal-open');
3003
+ if (modalOpen) { SuiWalletKit.closeModal(); } else { SuiWalletKit.openModal(); }
3004
+ }
3005
+ });
3006
+ }
3007
+ if (btn) {
3008
+ try { window.__wkWidgetButton = btn; } catch (_) {}
3009
+ try {
3010
+ window.getWalletWidgetButton = window.getWalletWidgetButton || function() {
3011
+ return document.querySelector('#wk-widget > div > button') || document.querySelector('#wk-widget .wk-widget-btn');
3012
+ };
3013
+ } catch (_) {}
3014
+ try { window.dispatchEvent(new CustomEvent('wk-widget-ready')); } catch (_) {}
3015
+ }
3016
+
3017
+ if (!__wkWidgetDocClickBound) {
3018
+ __wkWidgetDocClickBound = true;
3019
+ document.addEventListener('click', function(e) {
3020
+ var activeContainer = __wkWidgetContainer;
3021
+ if (!activeContainer) return;
3022
+ var activeWidget = activeContainer.querySelector('.wk-widget');
3023
+ var dropdown = activeContainer.querySelector('.wk-dropdown');
3024
+ if (activeWidget && dropdown && !activeWidget.contains(e.target)) {
3025
+ dropdown.classList.remove('open');
3026
+ }
3027
+ });
3028
+ }
3029
+
3030
+ if (__wkWidgetUnsub) __wkWidgetUnsub();
3031
+ var __wkLastPollingAddr = null;
3032
+ __wkWidgetUnsub = SuiWalletKit.subscribe(SuiWalletKit.$connection, function(conn) {
3033
+ var rawAddr = conn && (conn.status === 'connected' || conn.status === 'session') ? conn.address : null;
3034
+ var normalizedAddr = __wkNormalizeSuiAddress(rawAddr || '');
3035
+ var addr = __wkIsValidSuiAddress(normalizedAddr) ? normalizedAddr : null;
3036
+ if (addr && addr !== __wkLastPollingAddr) {
3037
+ __wkLastPollingAddr = addr;
3038
+ __wkStartPortfolioPolling(addr);
3039
+ } else if (!addr && __wkLastPollingAddr) {
3040
+ __wkLastPollingAddr = null;
3041
+ __wkStopPortfolioPolling();
3042
+ }
3043
+ __wkUpdateWidget(conn);
3044
+ });
3045
+
3046
+ var initConn = SuiWalletKit.$connection.value;
3047
+ if (initConn && (initConn.status === 'connected' || initConn.status === 'session') && initConn.address) {
3048
+ var initAddr = __wkNormalizeSuiAddress(initConn.address || '');
3049
+ if (__wkIsValidSuiAddress(initAddr)) {
3050
+ __wkLastPollingAddr = initAddr;
3051
+ __wkStartPortfolioPolling(initAddr);
3052
+ }
3053
+ }
3054
+ __wkUpdateWidget(initConn);
3055
+ };
3056
+ `
3057
+ }