@shapeshiftoss/swap-widget 0.0.2 → 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 (159) hide show
  1. package/dist/index.d.ts +233 -0
  2. package/dist/index.js +63612 -0
  3. package/dist/style.css +1 -0
  4. package/package.json +69 -18
  5. package/Dockerfile +0 -87
  6. package/dist/assets/PhArrowCircleDown-B305t-Sh.js +0 -14
  7. package/dist/assets/PhArrowClockwise-CJPxQhr_.js +0 -14
  8. package/dist/assets/PhArrowDown-C4hT9BVu.js +0 -14
  9. package/dist/assets/PhArrowLeft-Way4Cu-r.js +0 -14
  10. package/dist/assets/PhArrowRight-Cp5ZME0F.js +0 -14
  11. package/dist/assets/PhArrowSquareOut-NnrK69c5.js +0 -14
  12. package/dist/assets/PhArrowUp-Dph6j8rm.js +0 -14
  13. package/dist/assets/PhArrowUpRight-BpJjRRRh.js +0 -14
  14. package/dist/assets/PhArrowsClockwise-CFUT8X7R.js +0 -14
  15. package/dist/assets/PhArrowsDownUp-BjBI4ckC.js +0 -14
  16. package/dist/assets/PhArrowsLeftRight-CuLpbKRk.js +0 -14
  17. package/dist/assets/PhBank-Dchr4XQJ.js +0 -14
  18. package/dist/assets/PhBrowser-dUu2TrC1.js +0 -14
  19. package/dist/assets/PhCaretDown-78IuKU3V.js +0 -14
  20. package/dist/assets/PhCaretLeft-_aiyH7n1.js +0 -14
  21. package/dist/assets/PhCaretRight-8zJQEuDX.js +0 -14
  22. package/dist/assets/PhCaretUp-CiCxKWwN.js +0 -14
  23. package/dist/assets/PhCheck-CcADx8br.js +0 -14
  24. package/dist/assets/PhCircleHalf-BYzSzd2h.js +0 -14
  25. package/dist/assets/PhClock-UItiXeJq.js +0 -14
  26. package/dist/assets/PhCompass-CUy3uA7t.js +0 -14
  27. package/dist/assets/PhCopy-C-PDgSlZ.js +0 -14
  28. package/dist/assets/PhCreditCard-CWRaUT6F.js +0 -14
  29. package/dist/assets/PhCurrencyDollar-Cqla3AXT.js +0 -14
  30. package/dist/assets/PhDesktop-BBIPrYLl.js +0 -14
  31. package/dist/assets/PhDeviceMobile-BdsPaATg.js +0 -14
  32. package/dist/assets/PhDotsThree-BMXCQl-0.js +0 -14
  33. package/dist/assets/PhEnvelope-yUsis6yU.js +0 -14
  34. package/dist/assets/PhFunnelSimple-Ba7BbWTp.js +0 -14
  35. package/dist/assets/PhGlobe-DgLxBk5U.js +0 -14
  36. package/dist/assets/PhIdentificationCard-Czjmq9Z3.js +0 -14
  37. package/dist/assets/PhImage-BAJ_erz6.js +0 -14
  38. package/dist/assets/PhInfo-Cr4DhVUE.js +0 -14
  39. package/dist/assets/PhLightbulb-BX_7duTr.js +0 -14
  40. package/dist/assets/PhMagnifyingGlass-Mygfryvz.js +0 -14
  41. package/dist/assets/PhPaperPlaneRight-BeuCA660.js +0 -14
  42. package/dist/assets/PhPlus-BMjcHjsT.js +0 -14
  43. package/dist/assets/PhPower-CGffGmdb.js +0 -14
  44. package/dist/assets/PhPuzzlePiece-wm_GpVSi.js +0 -14
  45. package/dist/assets/PhQrCode-DRwRzXCH.js +0 -14
  46. package/dist/assets/PhQuestion-M09j2U0T.js +0 -14
  47. package/dist/assets/PhQuestionMark-BP9EMB6h.js +0 -14
  48. package/dist/assets/PhSealCheck-BfG80yKn.js +0 -14
  49. package/dist/assets/PhSignOut-C5YOWlPT.js +0 -14
  50. package/dist/assets/PhSpinner-BXooDYzU.js +0 -14
  51. package/dist/assets/PhTrash-Biq6rmmL.js +0 -14
  52. package/dist/assets/PhUser-CAgZSpGe.js +0 -14
  53. package/dist/assets/PhVault-l2PHF38a.js +0 -14
  54. package/dist/assets/PhWallet-w25D16It.js +0 -14
  55. package/dist/assets/PhWarning-DPEydIPw.js +0 -14
  56. package/dist/assets/PhWarningCircle-BqjT745H.js +0 -14
  57. package/dist/assets/PhX-s-SmVExa.js +0 -14
  58. package/dist/assets/SwapController-If0bFrNc.js +0 -1
  59. package/dist/assets/ccip-BBB7uCdL.js +0 -1
  60. package/dist/assets/ccip-CkkdfKKI.js +0 -1
  61. package/dist/assets/data-capture-D4gAy-Yc.js +0 -242
  62. package/dist/assets/email-B1AJehis.js +0 -90
  63. package/dist/assets/embedded-wallet-Q6DQopDk.js +0 -410
  64. package/dist/assets/features-B6JAPAFb.js +0 -5
  65. package/dist/assets/index-5jd8RPN9.js +0 -7428
  66. package/dist/assets/index-B4kNtSTk.js +0 -1080
  67. package/dist/assets/index-B753eAob.js +0 -1
  68. package/dist/assets/index-BZoLTv77.js +0 -3
  69. package/dist/assets/index-Bcw9UURX.js +0 -3
  70. package/dist/assets/index-BkrV-ahK.js +0 -2
  71. package/dist/assets/index-CRQzQ_up.js +0 -9
  72. package/dist/assets/index-CSW0Gt5y.js +0 -132
  73. package/dist/assets/index-CZ4jTIsk.js +0 -138
  74. package/dist/assets/index-Cwa8SB3h.js +0 -61
  75. package/dist/assets/index-DEwQgT4r.js +0 -78
  76. package/dist/assets/index-DVfQiQ1d.js +0 -1
  77. package/dist/assets/index-cV3UdaMs.css +0 -1
  78. package/dist/assets/index-hAmu622O.js +0 -43
  79. package/dist/assets/onramp-XcPNCLRU.js +0 -422
  80. package/dist/assets/pay-with-exchange-BeHt4OF4.js +0 -280
  81. package/dist/assets/property-C9JG5tag.js +0 -27
  82. package/dist/assets/receive-7ff4he2S.js +0 -131
  83. package/dist/assets/send-CkMBIRXT.js +0 -554
  84. package/dist/assets/socials-DmmxuLrP.js +0 -250
  85. package/dist/assets/swaps-IHAYRQ0x.js +0 -1050
  86. package/dist/assets/transactions-9Cxdk7o9.js +0 -16
  87. package/dist/assets/v4-BOvFkHkt.js +0 -1
  88. package/dist/assets/w3m-modal-kJzFnBfB.js +0 -891
  89. package/dist/assets/wallet-standard-Dv8LMoUB.js +0 -1
  90. package/dist/favicon.png +0 -0
  91. package/dist/favicon.svg +0 -11
  92. package/dist/icon-192x192.png +0 -0
  93. package/dist/icon-512x512.png +0 -0
  94. package/dist/index.html +0 -33
  95. package/index.html +0 -32
  96. package/public/favicon.png +0 -0
  97. package/public/favicon.svg +0 -11
  98. package/public/icon-192x192.png +0 -0
  99. package/public/icon-512x512.png +0 -0
  100. package/railway.toml +0 -10
  101. package/src/api/client.ts +0 -95
  102. package/src/components/AddressInputModal.css +0 -173
  103. package/src/components/AddressInputModal.tsx +0 -250
  104. package/src/components/ApprovalStep.tsx +0 -92
  105. package/src/components/ExecutionStep.tsx +0 -27
  106. package/src/components/InputStep.tsx +0 -431
  107. package/src/components/QuoteSelector.css +0 -146
  108. package/src/components/QuoteSelector.tsx +0 -137
  109. package/src/components/QuotesModal.css +0 -250
  110. package/src/components/QuotesModal.tsx +0 -182
  111. package/src/components/SettingsModal.css +0 -145
  112. package/src/components/SettingsModal.tsx +0 -180
  113. package/src/components/StatusStep.tsx +0 -139
  114. package/src/components/SwapWidget.css +0 -713
  115. package/src/components/SwapWidget.tsx +0 -607
  116. package/src/components/TokenSelectModal.css +0 -438
  117. package/src/components/TokenSelectModal.tsx +0 -487
  118. package/src/components/WalletProvider.tsx +0 -92
  119. package/src/config/appkit.ts +0 -104
  120. package/src/config/wagmi.ts +0 -27
  121. package/src/constants/chains.ts +0 -72
  122. package/src/constants/defaults.ts +0 -28
  123. package/src/constants/swappers.ts +0 -48
  124. package/src/constants/viemChains.ts +0 -69
  125. package/src/contexts/SwapWalletContext.tsx +0 -25
  126. package/src/demo/App.css +0 -458
  127. package/src/demo/App.tsx +0 -481
  128. package/src/demo/main.tsx +0 -25
  129. package/src/hooks/useAssets.ts +0 -180
  130. package/src/hooks/useBalances.ts +0 -822
  131. package/src/hooks/useBitcoinSigning.ts +0 -276
  132. package/src/hooks/useMarketData.ts +0 -169
  133. package/src/hooks/useSolanaSigning.ts +0 -275
  134. package/src/hooks/useStatusPolling.ts +0 -137
  135. package/src/hooks/useSwapApproval.ts +0 -106
  136. package/src/hooks/useSwapDisplayValues.ts +0 -157
  137. package/src/hooks/useSwapExecution.ts +0 -199
  138. package/src/hooks/useSwapHandlers.ts +0 -119
  139. package/src/hooks/useSwapQuote.ts +0 -71
  140. package/src/hooks/useSwapQuoting.ts +0 -102
  141. package/src/hooks/useSwapRates.ts +0 -61
  142. package/src/index.ts +0 -43
  143. package/src/machines/SwapMachineContext.ts +0 -5
  144. package/src/machines/__tests__/guards.test.ts +0 -228
  145. package/src/machines/__tests__/setup.test.ts +0 -7
  146. package/src/machines/__tests__/swapMachine.test.ts +0 -544
  147. package/src/machines/__tests__/types.test.ts +0 -124
  148. package/src/machines/guards.ts +0 -33
  149. package/src/machines/swapMachine.ts +0 -288
  150. package/src/machines/types.ts +0 -54
  151. package/src/services/transactionStatus.ts +0 -322
  152. package/src/types/index.ts +0 -361
  153. package/src/utils/addressValidation.ts +0 -201
  154. package/src/utils/redirect.ts +0 -45
  155. package/src/vite-env.d.ts +0 -10
  156. package/tsconfig.json +0 -23
  157. package/tsconfig.node.json +0 -10
  158. package/vite.config.ts +0 -101
  159. package/vitest.config.ts +0 -18
@@ -1,180 +0,0 @@
1
- import './SettingsModal.css'
2
-
3
- import { useCallback, useEffect, useState } from 'react'
4
-
5
- const SLIPPAGE_PRESETS = ['0.1', '0.5', '1.0']
6
-
7
- const useLockBodyScroll = (isLocked: boolean) => {
8
- useEffect(() => {
9
- if (!isLocked) return
10
- const originalOverflow = document.body.style.overflow
11
- document.body.style.overflow = 'hidden'
12
- return () => {
13
- document.body.style.overflow = originalOverflow
14
- }
15
- }, [isLocked])
16
- }
17
-
18
- type SettingsModalProps = {
19
- isOpen: boolean
20
- onClose: () => void
21
- slippage: string
22
- onSlippageChange: (slippage: string) => void
23
- }
24
-
25
- export const SettingsModal = ({
26
- isOpen,
27
- onClose,
28
- slippage,
29
- onSlippageChange,
30
- }: SettingsModalProps) => {
31
- useLockBodyScroll(isOpen)
32
- const [customSlippage, setCustomSlippage] = useState('')
33
- const [isCustom, setIsCustom] = useState(!SLIPPAGE_PRESETS.includes(slippage))
34
-
35
- const handlePresetClick = useCallback(
36
- (preset: string) => {
37
- setIsCustom(false)
38
- setCustomSlippage('')
39
- onSlippageChange(preset)
40
- },
41
- [onSlippageChange],
42
- )
43
-
44
- const handleCustomChange = useCallback(
45
- (value: string) => {
46
- const sanitized = value.replace(/[^0-9.]/g, '')
47
- const parts = sanitized.split('.')
48
- const formatted = parts.length > 2 ? `${parts[0]}.${parts.slice(1).join('')}` : sanitized
49
-
50
- setCustomSlippage(formatted)
51
- setIsCustom(true)
52
-
53
- const numValue = parseFloat(formatted)
54
- if (!isNaN(numValue) && numValue > 0 && numValue <= 50) {
55
- onSlippageChange(formatted)
56
- }
57
- },
58
- [onSlippageChange],
59
- )
60
-
61
- const handleBackdropClick = useCallback(
62
- (e: React.MouseEvent) => {
63
- if (e.target === e.currentTarget) {
64
- onClose()
65
- }
66
- },
67
- [onClose],
68
- )
69
-
70
- if (!isOpen) return null
71
-
72
- const currentSlippageNum = parseFloat(slippage)
73
- const isHighSlippage = currentSlippageNum > 1
74
- const isVeryHighSlippage = currentSlippageNum > 5
75
-
76
- return (
77
- // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
78
- <div
79
- className='ssw-modal-backdrop'
80
- onClick={handleBackdropClick}
81
- onKeyDown={e => e.key === 'Escape' && onClose()}
82
- role='dialog'
83
- aria-modal='true'
84
- aria-labelledby='settings-modal-title'
85
- >
86
- <div className='ssw-settings-modal'>
87
- <div className='ssw-modal-header'>
88
- <h2 id='settings-modal-title' className='ssw-modal-title'>
89
- Settings
90
- </h2>
91
- <button className='ssw-modal-close' onClick={onClose} type='button'>
92
- <svg
93
- width='20'
94
- height='20'
95
- viewBox='0 0 24 24'
96
- fill='none'
97
- stroke='currentColor'
98
- strokeWidth='2'
99
- >
100
- <path d='M18 6L6 18M6 6l12 12' />
101
- </svg>
102
- </button>
103
- </div>
104
-
105
- <div className='ssw-settings-content'>
106
- <div className='ssw-settings-section'>
107
- <div className='ssw-settings-label'>
108
- <span>Slippage Tolerance</span>
109
- <button
110
- className='ssw-info-btn'
111
- type='button'
112
- title="Maximum price difference you're willing to accept"
113
- >
114
- <svg
115
- width='14'
116
- height='14'
117
- viewBox='0 0 24 24'
118
- fill='none'
119
- stroke='currentColor'
120
- strokeWidth='2'
121
- >
122
- <circle cx='12' cy='12' r='10' />
123
- <path d='M12 16v-4M12 8h.01' />
124
- </svg>
125
- </button>
126
- </div>
127
-
128
- <div className='ssw-slippage-options'>
129
- {SLIPPAGE_PRESETS.map(preset => (
130
- <button
131
- key={preset}
132
- className={`ssw-slippage-btn ${
133
- !isCustom && slippage === preset ? 'ssw-selected' : ''
134
- }`}
135
- onClick={() => handlePresetClick(preset)}
136
- type='button'
137
- >
138
- {preset}%
139
- </button>
140
- ))}
141
- <div className={`ssw-slippage-custom ${isCustom ? 'ssw-selected' : ''}`}>
142
- <input
143
- type='text'
144
- placeholder='Custom'
145
- value={isCustom ? customSlippage || slippage : ''}
146
- onChange={e => handleCustomChange(e.target.value)}
147
- onFocus={() => {
148
- setIsCustom(true)
149
- if (!customSlippage) setCustomSlippage(slippage)
150
- }}
151
- />
152
- <span className='ssw-slippage-suffix'>%</span>
153
- </div>
154
- </div>
155
-
156
- {isHighSlippage && (
157
- <div className={`ssw-slippage-warning ${isVeryHighSlippage ? 'ssw-error' : ''}`}>
158
- <svg
159
- width='16'
160
- height='16'
161
- viewBox='0 0 24 24'
162
- fill='none'
163
- stroke='currentColor'
164
- strokeWidth='2'
165
- >
166
- <path d='M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0zM12 9v4M12 17h.01' />
167
- </svg>
168
- <span>
169
- {isVeryHighSlippage
170
- ? 'Very high slippage. Your transaction may be frontrun.'
171
- : 'High slippage may result in unfavorable rates.'}
172
- </span>
173
- </div>
174
- )}
175
- </div>
176
- </div>
177
- </div>
178
- </div>
179
- )
180
- }
@@ -1,139 +0,0 @@
1
- import { useMemo } from 'react'
2
-
3
- import type { SwapMachineContext, SwapMachineEvent } from '../machines/types'
4
-
5
- type StatusStepProps = {
6
- context: SwapMachineContext
7
- send: (event: SwapMachineEvent) => void
8
- isPolling: boolean
9
- isComplete: boolean
10
- isError: boolean
11
- }
12
-
13
- const ExplorerLink = ({ url }: { url: string }) => (
14
- <a href={url} target='_blank' rel='noopener noreferrer' className='ssw-step-explorer-link'>
15
- View on Explorer
16
- <svg
17
- width='12'
18
- height='12'
19
- viewBox='0 0 24 24'
20
- fill='none'
21
- stroke='currentColor'
22
- strokeWidth='2'
23
- >
24
- <path d='M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6M15 3h6v6M10 14L21 3' />
25
- </svg>
26
- </a>
27
- )
28
-
29
- export const StatusStep = ({ context, send, isPolling, isComplete, isError }: StatusStepProps) => {
30
- const { sellAsset, buyAsset, txHash, error, retryCount, isSellAssetUtxo, isSellAssetSolana } =
31
- context
32
-
33
- const explorerUrl = useMemo(() => {
34
- if (!txHash) return undefined
35
- if (isSellAssetUtxo) return `https://mempool.space/tx/${txHash}`
36
- if (isSellAssetSolana) return `https://solscan.io/tx/${txHash}`
37
- return `${sellAsset.explorerTxLink ?? 'https://etherscan.io/tx/'}${txHash}`
38
- }, [txHash, isSellAssetUtxo, isSellAssetSolana, sellAsset.explorerTxLink])
39
-
40
- const truncatedError = useMemo(
41
- () => (error && error.length > 100 ? `${error.slice(0, 100)}…` : error),
42
- [error],
43
- )
44
-
45
- return (
46
- <div className='ssw-step-screen'>
47
- {isPolling && (
48
- <>
49
- <div className='ssw-step-icon-circle ssw-ic-accent'>
50
- <svg
51
- className='ssw-spinner'
52
- width='32'
53
- height='32'
54
- viewBox='0 0 24 24'
55
- fill='none'
56
- stroke='currentColor'
57
- strokeWidth='2'
58
- >
59
- <circle cx='12' cy='12' r='10' opacity='0.25' />
60
- <path d='M12 2a10 10 0 0 1 10 10' />
61
- </svg>
62
- </div>
63
- <div className='ssw-step-title'>Confirming Transaction</div>
64
- <div className='ssw-step-subtitle'>Your swap is being processed…</div>
65
- {explorerUrl && <ExplorerLink url={explorerUrl} />}
66
- </>
67
- )}
68
-
69
- {isComplete && (
70
- <>
71
- <div className='ssw-step-icon-circle ssw-ic-success'>
72
- <svg
73
- width='32'
74
- height='32'
75
- viewBox='0 0 24 24'
76
- fill='none'
77
- stroke='currentColor'
78
- strokeWidth='2.5'
79
- >
80
- <path d='M20 6L9 17l-5-5' />
81
- </svg>
82
- </div>
83
- <div className='ssw-step-title'>Swap Complete!</div>
84
- <div className='ssw-step-subtitle'>
85
- Swapped {sellAsset.symbol} for {buyAsset.symbol}
86
- </div>
87
- {explorerUrl && <ExplorerLink url={explorerUrl} />}
88
- <div className='ssw-step-actions'>
89
- <button
90
- className='ssw-action-btn'
91
- onClick={() => send({ type: 'RESET' })}
92
- type='button'
93
- >
94
- New Swap
95
- </button>
96
- </div>
97
- </>
98
- )}
99
-
100
- {isError && (
101
- <>
102
- <div className='ssw-step-icon-circle ssw-ic-error'>
103
- <svg
104
- width='32'
105
- height='32'
106
- viewBox='0 0 24 24'
107
- fill='none'
108
- stroke='currentColor'
109
- strokeWidth='2'
110
- >
111
- <circle cx='12' cy='12' r='10' />
112
- <path d='M15 9l-6 6M9 9l6 6' />
113
- </svg>
114
- </div>
115
- <div className='ssw-step-title'>Transaction Failed</div>
116
- <div className='ssw-step-subtitle'>{truncatedError ?? 'Something went wrong'}</div>
117
- <div className='ssw-step-actions'>
118
- {retryCount < 3 && (
119
- <button
120
- className='ssw-action-btn'
121
- onClick={() => send({ type: 'RETRY' })}
122
- type='button'
123
- >
124
- Retry
125
- </button>
126
- )}
127
- <button
128
- className='ssw-action-btn ssw-secondary'
129
- onClick={() => send({ type: 'RESET' })}
130
- type='button'
131
- >
132
- Start Over
133
- </button>
134
- </div>
135
- </>
136
- )}
137
- </div>
138
- )
139
- }