@shapeshiftoss/swap-widget 0.0.2

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 (157) hide show
  1. package/Dockerfile +87 -0
  2. package/README.md +519 -0
  3. package/dist/assets/PhArrowCircleDown-B305t-Sh.js +14 -0
  4. package/dist/assets/PhArrowClockwise-CJPxQhr_.js +14 -0
  5. package/dist/assets/PhArrowDown-C4hT9BVu.js +14 -0
  6. package/dist/assets/PhArrowLeft-Way4Cu-r.js +14 -0
  7. package/dist/assets/PhArrowRight-Cp5ZME0F.js +14 -0
  8. package/dist/assets/PhArrowSquareOut-NnrK69c5.js +14 -0
  9. package/dist/assets/PhArrowUp-Dph6j8rm.js +14 -0
  10. package/dist/assets/PhArrowUpRight-BpJjRRRh.js +14 -0
  11. package/dist/assets/PhArrowsClockwise-CFUT8X7R.js +14 -0
  12. package/dist/assets/PhArrowsDownUp-BjBI4ckC.js +14 -0
  13. package/dist/assets/PhArrowsLeftRight-CuLpbKRk.js +14 -0
  14. package/dist/assets/PhBank-Dchr4XQJ.js +14 -0
  15. package/dist/assets/PhBrowser-dUu2TrC1.js +14 -0
  16. package/dist/assets/PhCaretDown-78IuKU3V.js +14 -0
  17. package/dist/assets/PhCaretLeft-_aiyH7n1.js +14 -0
  18. package/dist/assets/PhCaretRight-8zJQEuDX.js +14 -0
  19. package/dist/assets/PhCaretUp-CiCxKWwN.js +14 -0
  20. package/dist/assets/PhCheck-CcADx8br.js +14 -0
  21. package/dist/assets/PhCircleHalf-BYzSzd2h.js +14 -0
  22. package/dist/assets/PhClock-UItiXeJq.js +14 -0
  23. package/dist/assets/PhCompass-CUy3uA7t.js +14 -0
  24. package/dist/assets/PhCopy-C-PDgSlZ.js +14 -0
  25. package/dist/assets/PhCreditCard-CWRaUT6F.js +14 -0
  26. package/dist/assets/PhCurrencyDollar-Cqla3AXT.js +14 -0
  27. package/dist/assets/PhDesktop-BBIPrYLl.js +14 -0
  28. package/dist/assets/PhDeviceMobile-BdsPaATg.js +14 -0
  29. package/dist/assets/PhDotsThree-BMXCQl-0.js +14 -0
  30. package/dist/assets/PhEnvelope-yUsis6yU.js +14 -0
  31. package/dist/assets/PhFunnelSimple-Ba7BbWTp.js +14 -0
  32. package/dist/assets/PhGlobe-DgLxBk5U.js +14 -0
  33. package/dist/assets/PhIdentificationCard-Czjmq9Z3.js +14 -0
  34. package/dist/assets/PhImage-BAJ_erz6.js +14 -0
  35. package/dist/assets/PhInfo-Cr4DhVUE.js +14 -0
  36. package/dist/assets/PhLightbulb-BX_7duTr.js +14 -0
  37. package/dist/assets/PhMagnifyingGlass-Mygfryvz.js +14 -0
  38. package/dist/assets/PhPaperPlaneRight-BeuCA660.js +14 -0
  39. package/dist/assets/PhPlus-BMjcHjsT.js +14 -0
  40. package/dist/assets/PhPower-CGffGmdb.js +14 -0
  41. package/dist/assets/PhPuzzlePiece-wm_GpVSi.js +14 -0
  42. package/dist/assets/PhQrCode-DRwRzXCH.js +14 -0
  43. package/dist/assets/PhQuestion-M09j2U0T.js +14 -0
  44. package/dist/assets/PhQuestionMark-BP9EMB6h.js +14 -0
  45. package/dist/assets/PhSealCheck-BfG80yKn.js +14 -0
  46. package/dist/assets/PhSignOut-C5YOWlPT.js +14 -0
  47. package/dist/assets/PhSpinner-BXooDYzU.js +14 -0
  48. package/dist/assets/PhTrash-Biq6rmmL.js +14 -0
  49. package/dist/assets/PhUser-CAgZSpGe.js +14 -0
  50. package/dist/assets/PhVault-l2PHF38a.js +14 -0
  51. package/dist/assets/PhWallet-w25D16It.js +14 -0
  52. package/dist/assets/PhWarning-DPEydIPw.js +14 -0
  53. package/dist/assets/PhWarningCircle-BqjT745H.js +14 -0
  54. package/dist/assets/PhX-s-SmVExa.js +14 -0
  55. package/dist/assets/SwapController-If0bFrNc.js +1 -0
  56. package/dist/assets/ccip-BBB7uCdL.js +1 -0
  57. package/dist/assets/ccip-CkkdfKKI.js +1 -0
  58. package/dist/assets/data-capture-D4gAy-Yc.js +242 -0
  59. package/dist/assets/email-B1AJehis.js +90 -0
  60. package/dist/assets/embedded-wallet-Q6DQopDk.js +410 -0
  61. package/dist/assets/features-B6JAPAFb.js +5 -0
  62. package/dist/assets/index-5jd8RPN9.js +7428 -0
  63. package/dist/assets/index-B4kNtSTk.js +1080 -0
  64. package/dist/assets/index-B753eAob.js +1 -0
  65. package/dist/assets/index-BZoLTv77.js +3 -0
  66. package/dist/assets/index-Bcw9UURX.js +3 -0
  67. package/dist/assets/index-BkrV-ahK.js +2 -0
  68. package/dist/assets/index-CRQzQ_up.js +9 -0
  69. package/dist/assets/index-CSW0Gt5y.js +132 -0
  70. package/dist/assets/index-CZ4jTIsk.js +138 -0
  71. package/dist/assets/index-Cwa8SB3h.js +61 -0
  72. package/dist/assets/index-DEwQgT4r.js +78 -0
  73. package/dist/assets/index-DVfQiQ1d.js +1 -0
  74. package/dist/assets/index-cV3UdaMs.css +1 -0
  75. package/dist/assets/index-hAmu622O.js +43 -0
  76. package/dist/assets/onramp-XcPNCLRU.js +422 -0
  77. package/dist/assets/pay-with-exchange-BeHt4OF4.js +280 -0
  78. package/dist/assets/property-C9JG5tag.js +27 -0
  79. package/dist/assets/receive-7ff4he2S.js +131 -0
  80. package/dist/assets/send-CkMBIRXT.js +554 -0
  81. package/dist/assets/socials-DmmxuLrP.js +250 -0
  82. package/dist/assets/swaps-IHAYRQ0x.js +1050 -0
  83. package/dist/assets/transactions-9Cxdk7o9.js +16 -0
  84. package/dist/assets/v4-BOvFkHkt.js +1 -0
  85. package/dist/assets/w3m-modal-kJzFnBfB.js +891 -0
  86. package/dist/assets/wallet-standard-Dv8LMoUB.js +1 -0
  87. package/dist/favicon.png +0 -0
  88. package/dist/favicon.svg +11 -0
  89. package/dist/icon-192x192.png +0 -0
  90. package/dist/icon-512x512.png +0 -0
  91. package/dist/index.html +33 -0
  92. package/index.html +32 -0
  93. package/package.json +59 -0
  94. package/public/favicon.png +0 -0
  95. package/public/favicon.svg +11 -0
  96. package/public/icon-192x192.png +0 -0
  97. package/public/icon-512x512.png +0 -0
  98. package/railway.toml +10 -0
  99. package/src/api/client.ts +95 -0
  100. package/src/components/AddressInputModal.css +173 -0
  101. package/src/components/AddressInputModal.tsx +250 -0
  102. package/src/components/ApprovalStep.tsx +92 -0
  103. package/src/components/ExecutionStep.tsx +27 -0
  104. package/src/components/InputStep.tsx +431 -0
  105. package/src/components/QuoteSelector.css +146 -0
  106. package/src/components/QuoteSelector.tsx +137 -0
  107. package/src/components/QuotesModal.css +250 -0
  108. package/src/components/QuotesModal.tsx +182 -0
  109. package/src/components/SettingsModal.css +145 -0
  110. package/src/components/SettingsModal.tsx +180 -0
  111. package/src/components/StatusStep.tsx +139 -0
  112. package/src/components/SwapWidget.css +713 -0
  113. package/src/components/SwapWidget.tsx +607 -0
  114. package/src/components/TokenSelectModal.css +438 -0
  115. package/src/components/TokenSelectModal.tsx +487 -0
  116. package/src/components/WalletProvider.tsx +92 -0
  117. package/src/config/appkit.ts +104 -0
  118. package/src/config/wagmi.ts +27 -0
  119. package/src/constants/chains.ts +72 -0
  120. package/src/constants/defaults.ts +28 -0
  121. package/src/constants/swappers.ts +48 -0
  122. package/src/constants/viemChains.ts +69 -0
  123. package/src/contexts/SwapWalletContext.tsx +25 -0
  124. package/src/demo/App.css +458 -0
  125. package/src/demo/App.tsx +481 -0
  126. package/src/demo/main.tsx +25 -0
  127. package/src/hooks/useAssets.ts +180 -0
  128. package/src/hooks/useBalances.ts +822 -0
  129. package/src/hooks/useBitcoinSigning.ts +276 -0
  130. package/src/hooks/useMarketData.ts +169 -0
  131. package/src/hooks/useSolanaSigning.ts +275 -0
  132. package/src/hooks/useStatusPolling.ts +137 -0
  133. package/src/hooks/useSwapApproval.ts +106 -0
  134. package/src/hooks/useSwapDisplayValues.ts +157 -0
  135. package/src/hooks/useSwapExecution.ts +199 -0
  136. package/src/hooks/useSwapHandlers.ts +119 -0
  137. package/src/hooks/useSwapQuote.ts +71 -0
  138. package/src/hooks/useSwapQuoting.ts +102 -0
  139. package/src/hooks/useSwapRates.ts +61 -0
  140. package/src/index.ts +43 -0
  141. package/src/machines/SwapMachineContext.ts +5 -0
  142. package/src/machines/__tests__/guards.test.ts +228 -0
  143. package/src/machines/__tests__/setup.test.ts +7 -0
  144. package/src/machines/__tests__/swapMachine.test.ts +544 -0
  145. package/src/machines/__tests__/types.test.ts +124 -0
  146. package/src/machines/guards.ts +33 -0
  147. package/src/machines/swapMachine.ts +288 -0
  148. package/src/machines/types.ts +54 -0
  149. package/src/services/transactionStatus.ts +322 -0
  150. package/src/types/index.ts +361 -0
  151. package/src/utils/addressValidation.ts +201 -0
  152. package/src/utils/redirect.ts +45 -0
  153. package/src/vite-env.d.ts +10 -0
  154. package/tsconfig.json +23 -0
  155. package/tsconfig.node.json +10 -0
  156. package/vite.config.ts +101 -0
  157. package/vitest.config.ts +18 -0
@@ -0,0 +1,438 @@
1
+ .ssw-modal-backdrop {
2
+ position: fixed;
3
+ inset: 0;
4
+ background: rgba(0, 0, 0, 0.6);
5
+ backdrop-filter: blur(4px);
6
+ display: flex;
7
+ align-items: center;
8
+ justify-content: center;
9
+ z-index: 1000;
10
+ padding: 16px;
11
+ animation: ssw-fade-in 0.15s ease;
12
+ }
13
+
14
+ @keyframes ssw-fade-in {
15
+ from {
16
+ opacity: 0;
17
+ }
18
+ to {
19
+ opacity: 1;
20
+ }
21
+ }
22
+
23
+ .ssw-modal {
24
+ background: var(--ssw-bg-secondary);
25
+ border-radius: var(--ssw-radius-lg);
26
+ width: 100%;
27
+ max-width: 680px;
28
+ max-height: 80vh;
29
+ display: flex;
30
+ flex-direction: column;
31
+ overflow: hidden;
32
+ box-shadow: 0 24px 48px rgba(0, 0, 0, 0.2);
33
+ animation: ssw-slide-up 0.2s ease;
34
+ }
35
+
36
+ @keyframes ssw-slide-up {
37
+ from {
38
+ opacity: 0;
39
+ transform: translateY(10px);
40
+ }
41
+ to {
42
+ opacity: 1;
43
+ transform: translateY(0);
44
+ }
45
+ }
46
+
47
+ .ssw-modal-header {
48
+ display: flex;
49
+ align-items: center;
50
+ justify-content: space-between;
51
+ padding: 20px 24px;
52
+ border-bottom: 1px solid var(--ssw-border);
53
+ }
54
+
55
+ .ssw-modal-title {
56
+ font-size: 18px;
57
+ font-weight: 600;
58
+ color: var(--ssw-text-primary);
59
+ margin: 0;
60
+ }
61
+
62
+ .ssw-modal-close {
63
+ background: none;
64
+ border: none;
65
+ padding: 8px;
66
+ cursor: pointer;
67
+ color: var(--ssw-text-secondary);
68
+ border-radius: var(--ssw-radius-xs);
69
+ transition: all 0.15s ease;
70
+ }
71
+
72
+ .ssw-modal-close:hover {
73
+ background: var(--ssw-bg-hover);
74
+ color: var(--ssw-text-primary);
75
+ }
76
+
77
+ .ssw-modal-content {
78
+ display: flex;
79
+ flex: 1;
80
+ min-height: 0;
81
+ }
82
+
83
+ .ssw-chain-sidebar {
84
+ width: 200px;
85
+ border-right: 1px solid var(--ssw-border);
86
+ display: flex;
87
+ flex-direction: column;
88
+ background: var(--ssw-bg-tertiary);
89
+ }
90
+
91
+ .ssw-search-wrapper {
92
+ position: relative;
93
+ padding: 16px;
94
+ }
95
+
96
+ .ssw-search-icon {
97
+ position: absolute;
98
+ left: 28px;
99
+ top: 50%;
100
+ transform: translateY(-50%);
101
+ color: var(--ssw-text-muted);
102
+ pointer-events: none;
103
+ }
104
+
105
+ .ssw-chain-search,
106
+ .ssw-token-search {
107
+ width: 100%;
108
+ padding: 10px 12px 10px 36px;
109
+ border: 1px solid var(--ssw-border);
110
+ border-radius: var(--ssw-radius-sm);
111
+ background: var(--ssw-bg-input);
112
+ color: var(--ssw-text-primary);
113
+ font-size: 14px;
114
+ outline: none;
115
+ transition: border-color 0.15s ease;
116
+ }
117
+
118
+ .ssw-chain-search:focus,
119
+ .ssw-token-search:focus {
120
+ border-color: var(--ssw-accent);
121
+ }
122
+
123
+ .ssw-chain-search::placeholder,
124
+ .ssw-token-search::placeholder {
125
+ color: var(--ssw-text-muted);
126
+ }
127
+
128
+ .ssw-chain-list {
129
+ flex: 1;
130
+ overflow-y: auto;
131
+ padding: 0 8px 16px;
132
+ scrollbar-width: thin;
133
+ scrollbar-color: var(--ssw-border) transparent;
134
+ min-height: 300px;
135
+ }
136
+
137
+ .ssw-chain-list::-webkit-scrollbar {
138
+ width: 6px;
139
+ }
140
+
141
+ .ssw-chain-list::-webkit-scrollbar-track {
142
+ background: transparent;
143
+ }
144
+
145
+ .ssw-chain-list::-webkit-scrollbar-thumb {
146
+ background: var(--ssw-border);
147
+ border-radius: 3px;
148
+ }
149
+
150
+ .ssw-chain-list::-webkit-scrollbar-thumb:hover {
151
+ background: var(--ssw-border-hover);
152
+ }
153
+
154
+ .ssw-chain-item {
155
+ display: flex;
156
+ align-items: center;
157
+ gap: 10px;
158
+ width: 100%;
159
+ padding: 10px 12px;
160
+ border: none;
161
+ background: none;
162
+ border-radius: var(--ssw-radius-sm);
163
+ cursor: pointer;
164
+ transition: background 0.15s ease;
165
+ text-align: left;
166
+ }
167
+
168
+ .ssw-chain-item:hover {
169
+ background: var(--ssw-bg-hover);
170
+ }
171
+
172
+ .ssw-chain-item.ssw-selected {
173
+ background: var(--ssw-accent-light);
174
+ }
175
+
176
+ .ssw-chain-icon,
177
+ .ssw-chain-icon-placeholder,
178
+ .ssw-chain-icon-multi {
179
+ width: 28px;
180
+ height: 28px;
181
+ border-radius: var(--ssw-radius-xs);
182
+ flex-shrink: 0;
183
+ }
184
+
185
+ .ssw-chain-icon {
186
+ object-fit: contain;
187
+ }
188
+
189
+ .ssw-chain-icon-placeholder {
190
+ display: flex;
191
+ align-items: center;
192
+ justify-content: center;
193
+ font-size: 12px;
194
+ font-weight: 600;
195
+ color: white;
196
+ }
197
+
198
+ .ssw-chain-icon-multi {
199
+ display: flex;
200
+ align-items: center;
201
+ justify-content: center;
202
+ background: var(--ssw-bg-hover);
203
+ font-size: 14px;
204
+ }
205
+
206
+ .ssw-chain-name {
207
+ font-size: 14px;
208
+ font-weight: 500;
209
+ color: var(--ssw-text-primary);
210
+ white-space: nowrap;
211
+ overflow: hidden;
212
+ text-overflow: ellipsis;
213
+ }
214
+
215
+ .ssw-token-panel {
216
+ flex: 1;
217
+ display: flex;
218
+ flex-direction: column;
219
+ min-width: 0;
220
+ }
221
+
222
+ .ssw-token-list {
223
+ flex: 1;
224
+ overflow-y: auto;
225
+ padding: 0 16px 16px;
226
+ scrollbar-width: thin;
227
+ scrollbar-color: var(--ssw-border) transparent;
228
+ }
229
+
230
+ .ssw-token-list::-webkit-scrollbar {
231
+ width: 6px;
232
+ }
233
+
234
+ .ssw-token-list::-webkit-scrollbar-track {
235
+ background: transparent;
236
+ }
237
+
238
+ .ssw-token-list::-webkit-scrollbar-thumb {
239
+ background: var(--ssw-border);
240
+ border-radius: 3px;
241
+ }
242
+
243
+ .ssw-token-list::-webkit-scrollbar-thumb:hover {
244
+ background: var(--ssw-border-hover);
245
+ }
246
+
247
+ .ssw-token-item {
248
+ display: flex;
249
+ align-items: center;
250
+ gap: 12px;
251
+ width: 100%;
252
+ padding: 12px;
253
+ border: none;
254
+ background: none;
255
+ border-radius: var(--ssw-radius-sm);
256
+ cursor: pointer;
257
+ transition: background 0.15s ease;
258
+ text-align: left;
259
+ animation: ssw-token-fade-in 0.2s ease backwards;
260
+ }
261
+
262
+ @keyframes ssw-token-fade-in {
263
+ from {
264
+ opacity: 0;
265
+ transform: translateY(4px);
266
+ }
267
+ to {
268
+ opacity: 1;
269
+ transform: translateY(0);
270
+ }
271
+ }
272
+
273
+ .ssw-token-item:hover {
274
+ background: var(--ssw-bg-hover);
275
+ }
276
+
277
+ .ssw-token-icon-wrapper {
278
+ position: relative;
279
+ width: 40px;
280
+ height: 40px;
281
+ flex-shrink: 0;
282
+ }
283
+
284
+ .ssw-token-icon,
285
+ .ssw-token-icon-placeholder {
286
+ width: 40px;
287
+ height: 40px;
288
+ border-radius: 50%;
289
+ }
290
+
291
+ .ssw-token-icon {
292
+ object-fit: contain;
293
+ }
294
+
295
+ .ssw-token-icon-placeholder {
296
+ display: flex;
297
+ align-items: center;
298
+ justify-content: center;
299
+ font-size: 16px;
300
+ font-weight: 600;
301
+ color: white;
302
+ }
303
+
304
+ .ssw-token-chain-badge {
305
+ position: absolute;
306
+ bottom: -2px;
307
+ right: -2px;
308
+ width: 16px;
309
+ height: 16px;
310
+ border-radius: var(--ssw-radius-2xs);
311
+ border: 2px solid var(--ssw-bg-secondary);
312
+ background: var(--ssw-bg-secondary);
313
+ }
314
+
315
+ .ssw-token-info {
316
+ display: flex;
317
+ flex-direction: column;
318
+ gap: 2px;
319
+ min-width: 0;
320
+ }
321
+
322
+ .ssw-token-symbol {
323
+ font-size: 15px;
324
+ font-weight: 600;
325
+ color: var(--ssw-text-primary);
326
+ }
327
+
328
+ .ssw-token-name {
329
+ font-size: 13px;
330
+ color: var(--ssw-text-secondary);
331
+ white-space: nowrap;
332
+ overflow: hidden;
333
+ text-overflow: ellipsis;
334
+ }
335
+
336
+ .ssw-token-right {
337
+ margin-left: auto;
338
+ display: flex;
339
+ flex-direction: column;
340
+ align-items: flex-end;
341
+ gap: 2px;
342
+ flex-shrink: 0;
343
+ }
344
+
345
+ .ssw-token-fiat-value {
346
+ font-size: 14px;
347
+ font-weight: 500;
348
+ color: var(--ssw-text-primary);
349
+ }
350
+
351
+ .ssw-token-balance {
352
+ font-size: 13px;
353
+ font-weight: 400;
354
+ color: var(--ssw-text-secondary);
355
+ }
356
+
357
+ .ssw-token-balance-skeleton {
358
+ width: 60px;
359
+ height: 14px;
360
+ border-radius: var(--ssw-radius-2xs);
361
+ background: linear-gradient(
362
+ 90deg,
363
+ var(--ssw-bg-hover) 25%,
364
+ var(--ssw-border) 50%,
365
+ var(--ssw-bg-hover) 75%
366
+ );
367
+ background-size: 200% 100%;
368
+ animation: ssw-skeleton-shimmer 1.5s infinite;
369
+ flex-shrink: 0;
370
+ }
371
+
372
+ @keyframes ssw-skeleton-shimmer {
373
+ 0% {
374
+ background-position: 200% 0;
375
+ }
376
+ 100% {
377
+ background-position: -200% 0;
378
+ }
379
+ }
380
+
381
+ .ssw-loading,
382
+ .ssw-empty {
383
+ display: flex;
384
+ flex-direction: column;
385
+ align-items: center;
386
+ justify-content: center;
387
+ gap: 12px;
388
+ padding: 48px 24px;
389
+ color: var(--ssw-text-secondary);
390
+ font-size: 14px;
391
+ }
392
+
393
+ .ssw-spinner {
394
+ width: 24px;
395
+ height: 24px;
396
+ border: 2px solid var(--ssw-border);
397
+ border-top-color: var(--ssw-accent);
398
+ border-radius: 50%;
399
+ animation: ssw-spin 0.8s linear infinite;
400
+ }
401
+
402
+ @keyframes ssw-spin {
403
+ to {
404
+ transform: rotate(360deg);
405
+ }
406
+ }
407
+
408
+ @media (max-width: 600px) {
409
+ .ssw-modal {
410
+ max-height: 90vh;
411
+ }
412
+
413
+ .ssw-modal-content {
414
+ flex-direction: column;
415
+ }
416
+
417
+ .ssw-chain-sidebar {
418
+ width: 100%;
419
+ border-right: none;
420
+ border-bottom: 1px solid var(--ssw-border);
421
+ max-height: 200px;
422
+ }
423
+
424
+ .ssw-chain-list {
425
+ display: flex;
426
+ flex-wrap: wrap;
427
+ gap: 8px;
428
+ padding: 0 16px 16px;
429
+ }
430
+
431
+ .ssw-chain-item {
432
+ padding: 8px 12px;
433
+ }
434
+
435
+ .ssw-chain-name {
436
+ font-size: 13px;
437
+ }
438
+ }