@layerswap/widget 1.0.6 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/dist/esm/Models/LayerSwapSettings.js +0 -1
  2. package/dist/esm/Models/Theme.js +39 -0
  3. package/dist/esm/components/Buttons/submitButton.js +2 -1
  4. package/dist/esm/components/Common/ConnectWalletButton.js +9 -3
  5. package/dist/esm/components/Common/CountDownTimer.js +0 -1
  6. package/dist/esm/components/Common/WarningMessage.js +4 -2
  7. package/dist/esm/components/Common/guideLink.js +4 -6
  8. package/dist/esm/components/ErrorFallback.js +12 -12
  9. package/dist/esm/components/HeaderWithMenu.js +1 -1
  10. package/dist/esm/components/Icons/CircularLoader.js +5 -0
  11. package/dist/esm/components/Icons/FailIcon.js +2 -2
  12. package/dist/esm/components/Icons/GlobeIcon.js +3 -0
  13. package/dist/esm/components/Icons/MenuIcon.js +5 -0
  14. package/dist/esm/components/Icons/TokenIcon.js +1 -1
  15. package/dist/esm/components/Icons/Wallets/index.js +0 -1
  16. package/dist/esm/components/Input/Address/AddressNote.js +2 -2
  17. package/dist/esm/components/Input/Address/AddressPicker/AddressWithIcon.js +5 -2
  18. package/dist/esm/components/Input/Address/AddressPicker/index.js +15 -12
  19. package/dist/esm/components/Input/Address/ContractAddressNote.js +17 -0
  20. package/dist/esm/components/Input/Address/UrlAddressNote.js +10 -0
  21. package/dist/esm/components/Input/Amount/Balance.js +1 -1
  22. package/dist/esm/components/Input/Amount/ExchangeReceiveAmount.js +8 -0
  23. package/dist/esm/components/Input/Amount/MinMax.js +1 -1
  24. package/dist/esm/components/Input/Amount/PriceImpact.js +5 -40
  25. package/dist/esm/components/Input/Amount/ReceiveAmount.js +2 -2
  26. package/dist/esm/components/Input/Amount/index.js +3 -3
  27. package/dist/esm/components/Input/DestinationPicker.js +2 -2
  28. package/dist/esm/components/Input/RoutePicker/Content.js +19 -3
  29. package/dist/esm/components/Input/RoutePicker/RouteTokenSwitch.js +4 -4
  30. package/dist/esm/components/Input/RoutePicker/RouterPickerWalletConnect.js +5 -5
  31. package/dist/esm/components/Input/RoutePicker/Routes.js +27 -26
  32. package/dist/esm/components/Input/RoutePicker/Rows/CollapsableHeader.js +2 -2
  33. package/dist/esm/components/Input/RoutePicker/Rows/CollapsibleRow.js +3 -3
  34. package/dist/esm/components/Input/RoutePicker/Rows/StickyHeader.js +2 -2
  35. package/dist/esm/components/Input/RoutePicker/Rows/SuggestionsHeader.js +55 -0
  36. package/dist/esm/components/Input/RoutePicker/Rows/TitleRow.js +11 -0
  37. package/dist/esm/components/Input/RoutePicker/Rows/index.js +5 -6
  38. package/dist/esm/components/Input/RoutePicker/TokenTitleDetails.js +10 -0
  39. package/dist/esm/components/Input/RoutePicker/index.js +2 -2
  40. package/dist/esm/components/Input/SourceWalletPicker.js +6 -4
  41. package/dist/esm/components/Menu/MenuList.js +11 -19
  42. package/dist/esm/components/Menu/index.js +16 -7
  43. package/dist/esm/components/Modal/modalWithoutAnimation.js +3 -3
  44. package/dist/esm/components/Pages/Campaigns/Details/Leaderboard.js +2 -2
  45. package/dist/esm/components/Pages/Campaigns/Details/Rewards.js +2 -2
  46. package/dist/esm/components/Pages/Campaigns/Details/index.js +3 -4
  47. package/dist/esm/components/Pages/Campaigns/index.js +3 -4
  48. package/dist/esm/components/Pages/Swap/Form/ExchangeForm.js +21 -19
  49. package/dist/esm/components/Pages/Swap/Form/FeeDetails/Rate.js +6 -4
  50. package/dist/esm/components/Pages/Swap/Form/FeeDetails/Refuel.js +8 -3
  51. package/dist/esm/components/Pages/Swap/Form/FeeDetails/SwapQuote/DetailedEstimates.js +51 -14
  52. package/dist/esm/components/Pages/Swap/Form/FeeDetails/SwapQuote/SummaryRow.js +1 -1
  53. package/dist/esm/components/Pages/Swap/Form/FeeDetails/SwapQuote/index.js +3 -3
  54. package/dist/esm/components/Pages/Swap/Form/FeeDetails/index.js +10 -11
  55. package/dist/esm/components/Pages/Swap/Form/Form.js +27 -3
  56. package/dist/esm/components/Pages/Swap/Form/FormWrapper.js +35 -10
  57. package/dist/esm/components/Pages/Swap/Form/NetworkForm.js +13 -22
  58. package/dist/esm/components/Pages/Swap/Form/SecondaryComponents/FormButton.js +1 -1
  59. package/dist/esm/components/Pages/Swap/Form/SecondaryComponents/ReserveGasNote.js +8 -6
  60. package/dist/esm/components/Pages/Swap/Form/SecondaryComponents/validationError/ContractAddressValidationCache.js +19 -0
  61. package/dist/esm/components/Pages/Swap/Withdraw/Failed.js +12 -8
  62. package/dist/esm/components/Pages/Swap/Withdraw/ManualWithdraw.js +28 -9
  63. package/dist/esm/components/Pages/Swap/Withdraw/NotFound.js +15 -4
  64. package/dist/esm/components/Pages/Swap/Withdraw/Processing/Processing.js +44 -45
  65. package/dist/esm/components/Pages/Swap/Withdraw/Summary/Summary.js +2 -3
  66. package/dist/esm/components/Pages/Swap/Withdraw/Summary/index.js +2 -2
  67. package/dist/esm/components/Pages/Swap/Withdraw/SwapDetails.js +9 -7
  68. package/dist/esm/components/Pages/Swap/Withdraw/Wallet/Common/actionMessage.js +43 -0
  69. package/dist/esm/components/Pages/Swap/Withdraw/Wallet/Common/buttons.js +125 -71
  70. package/dist/esm/components/Pages/Swap/Withdraw/Wallet/index.js +56 -65
  71. package/dist/esm/components/Pages/Swap/Withdraw/WalletTransferButton.js +2 -2
  72. package/dist/esm/components/Pages/Swap/Withdraw/WalletTransferContent.js +2 -2
  73. package/dist/esm/components/Pages/Swap/Withdraw/Withdraw.js +3 -3
  74. package/dist/esm/components/Pages/Swap/Withdraw/index.js +5 -4
  75. package/dist/esm/components/Pages/Swap/Withdraw/messages/Message.js +4 -4
  76. package/dist/esm/components/Pages/Swap/Withdraw/messages/TransactionMessages.js +14 -15
  77. package/dist/esm/components/Pages/SwapHistory/History.js +2 -2
  78. package/dist/esm/components/Pages/SwapHistory/HistorySummary.js +1 -1
  79. package/dist/esm/components/Pages/SwapHistory/index.js +4 -4
  80. package/dist/esm/components/Select/Selector/SelectItem.js +1 -1
  81. package/dist/esm/components/Wallet/WalletComponents/ConnectedWallets.js +4 -4
  82. package/dist/esm/components/Wallet/WalletComponents/WalletsList.js +1 -1
  83. package/dist/esm/components/Wallet/WalletModal/Connector.js +2 -2
  84. package/dist/esm/components/Wallet/WalletModal/ConnectorsList.js +78 -125
  85. package/dist/esm/components/Wallet/WalletModal/InstalledExtensionNotFound.js +16 -0
  86. package/dist/esm/components/Wallet/WalletModal/LoadingConnect.js +27 -0
  87. package/dist/esm/components/Wallet/WalletModal/MultichainConnectorPicker.js +23 -0
  88. package/dist/esm/components/Wallet/WalletModal/ProviderPicker.js +26 -0
  89. package/dist/esm/components/Wallet/WalletModal/WalletQrCode.js +18 -0
  90. package/dist/esm/components/Wallet/WalletModal/index.js +4 -2
  91. package/dist/esm/components/Wallet/WalletProviders/index.js +4 -2
  92. package/dist/esm/components/Widget/Content.js +2 -2
  93. package/dist/esm/components/Widget/Footer.js +21 -21
  94. package/dist/esm/components/Widget/Index.js +2 -2
  95. package/dist/esm/components/WidgetLoading.js +9 -2
  96. package/dist/esm/components/shadcn/checkbox.js +1 -1
  97. package/dist/esm/context/ErrorProvider.js +14 -0
  98. package/dist/esm/context/LayerswapProvider.js +6 -5
  99. package/dist/esm/context/callbackProvider.js +60 -52
  100. package/dist/esm/context/resolverContext.js +11 -2
  101. package/dist/esm/context/swap.js +10 -13
  102. package/dist/esm/context/{balanceAccounts.js → swapAccounts.js} +17 -17
  103. package/dist/esm/context/validationContext.js +1 -1
  104. package/dist/esm/context/walletProviders.js +7 -1
  105. package/dist/esm/context/withdrawalContext.js +2 -2
  106. package/dist/esm/exports/internal.js +4 -3
  107. package/dist/esm/helpers/filterSourceNetworks.js +23 -0
  108. package/dist/esm/helpers/getSettings/getSettings.js +18 -13
  109. package/dist/esm/helpers/routes.js +4 -1
  110. package/dist/esm/hooks/useAllWithdrawalBalances.js +11 -5
  111. package/dist/esm/hooks/useConnectors.js +72 -0
  112. package/dist/esm/hooks/useFormRoutes.js +16 -8
  113. package/dist/esm/hooks/useFormValidation.js +5 -4
  114. package/dist/esm/hooks/useRouteValidation.js +1 -1
  115. package/dist/esm/hooks/useSwrSwaps.js +1 -1
  116. package/dist/esm/hooks/useTransfer.js +9 -0
  117. package/dist/esm/hooks/useWallet.js +7 -7
  118. package/dist/esm/lib/AppSettings.js +27 -16
  119. package/dist/esm/lib/ErrorHandler.js +6 -0
  120. package/dist/esm/lib/address/contractAddressResolver.js +12 -0
  121. package/dist/esm/lib/apiClients/layerSwapApiClient.js +19 -35
  122. package/dist/esm/lib/balances/balanceResolver.js +57 -11
  123. package/dist/esm/lib/balances/errorUtils.js +13 -0
  124. package/dist/esm/lib/balances/nodeErrorClassifier.js +22 -0
  125. package/dist/esm/lib/fees.js +50 -0
  126. package/dist/esm/lib/generateSwapInitialValues.js +2 -2
  127. package/dist/esm/lib/isNewListed.js +8 -0
  128. package/dist/esm/lib/knownIds.js +1 -0
  129. package/dist/esm/lib/resolvers/resolverService.js +19 -1
  130. package/dist/esm/lib/transfers/index.js +1 -0
  131. package/dist/esm/lib/transfers/transferResolver.js +14 -0
  132. package/dist/esm/stores/balanceStore.js +39 -18
  133. package/dist/esm/stores/contractAddressStore.js +178 -0
  134. package/dist/esm/stores/logStore.js +11 -0
  135. package/dist/esm/types/balance.js +23 -11
  136. package/dist/esm/types/contract.js +1 -0
  137. package/dist/esm/types/index.js +2 -0
  138. package/dist/esm/types/logEvents.js +1 -0
  139. package/dist/index.css +1 -1
  140. package/dist/tsconfig.tsbuildinfo +1 -1
  141. package/dist/types/Models/Balance.d.ts +14 -2
  142. package/dist/types/Models/Balance.d.ts.map +1 -1
  143. package/dist/types/Models/LayerSwapSettings.d.ts +7 -0
  144. package/dist/types/Models/LayerSwapSettings.d.ts.map +1 -1
  145. package/dist/types/Models/Theme.d.ts.map +1 -1
  146. package/dist/types/components/Buttons/submitButton.d.ts +1 -1
  147. package/dist/types/components/Buttons/submitButton.d.ts.map +1 -1
  148. package/dist/types/components/Common/ConnectWalletButton.d.ts +1 -1
  149. package/dist/types/components/Common/ConnectWalletButton.d.ts.map +1 -1
  150. package/dist/types/components/Common/CountDownTimer.d.ts.map +1 -1
  151. package/dist/types/components/Common/WarningMessage.d.ts.map +1 -1
  152. package/dist/types/components/Common/guideLink.d.ts.map +1 -1
  153. package/dist/types/components/ErrorFallback.d.ts.map +1 -1
  154. package/dist/types/components/HeaderWithMenu.d.ts.map +1 -1
  155. package/dist/types/components/Icons/CircularLoader.d.ts +4 -0
  156. package/dist/types/components/Icons/CircularLoader.d.ts.map +1 -0
  157. package/dist/types/components/Icons/FailIcon.d.ts.map +1 -1
  158. package/dist/types/components/Icons/GasIcon.d.ts.map +1 -1
  159. package/dist/types/components/Icons/GlobeIcon.d.ts +4 -0
  160. package/dist/types/components/Icons/GlobeIcon.d.ts.map +1 -0
  161. package/dist/types/components/Icons/MenuIcon.d.ts +4 -0
  162. package/dist/types/components/Icons/MenuIcon.d.ts.map +1 -0
  163. package/dist/types/components/Icons/TokenIcon.d.ts.map +1 -1
  164. package/dist/types/components/Icons/Wallets/index.d.ts +0 -1
  165. package/dist/types/components/Icons/Wallets/index.d.ts.map +1 -1
  166. package/dist/types/components/Input/Address/AddressNote.d.ts +5 -5
  167. package/dist/types/components/Input/Address/AddressNote.d.ts.map +1 -1
  168. package/dist/types/components/Input/Address/AddressPicker/AddressBook.d.ts +3 -3
  169. package/dist/types/components/Input/Address/AddressPicker/AddressButton.d.ts +3 -3
  170. package/dist/types/components/Input/Address/AddressPicker/AddressWithIcon.d.ts +3 -2
  171. package/dist/types/components/Input/Address/AddressPicker/AddressWithIcon.d.ts.map +1 -1
  172. package/dist/types/components/Input/Address/AddressPicker/ConnectedWallets.d.ts +2 -2
  173. package/dist/types/components/Input/Address/AddressPicker/ManualAddressInput.d.ts +4 -4
  174. package/dist/types/components/Input/Address/AddressPicker/index.d.ts +4 -4
  175. package/dist/types/components/Input/Address/AddressPicker/index.d.ts.map +1 -1
  176. package/dist/types/components/Input/Address/ContractAddressNote.d.ts +9 -0
  177. package/dist/types/components/Input/Address/ContractAddressNote.d.ts.map +1 -0
  178. package/dist/types/components/Input/Address/UrlAddressNote.d.ts +10 -0
  179. package/dist/types/components/Input/Address/UrlAddressNote.d.ts.map +1 -0
  180. package/dist/types/components/Input/Address/index.d.ts +1 -1
  181. package/dist/types/components/Input/Amount/Balance.d.ts +1 -1
  182. package/dist/types/components/Input/Amount/Balance.d.ts.map +1 -1
  183. package/dist/types/components/Input/Amount/ExchangeReceiveAmount.d.ts +11 -0
  184. package/dist/types/components/Input/Amount/ExchangeReceiveAmount.d.ts.map +1 -0
  185. package/dist/types/components/Input/Amount/MinMax.d.ts +1 -1
  186. package/dist/types/components/Input/Amount/PriceImpact.d.ts +3 -6
  187. package/dist/types/components/Input/Amount/PriceImpact.d.ts.map +1 -1
  188. package/dist/types/components/Input/Amount/ReceiveAmount.d.ts +2 -3
  189. package/dist/types/components/Input/Amount/ReceiveAmount.d.ts.map +1 -1
  190. package/dist/types/components/Input/Amount/helpers.d.ts +2 -2
  191. package/dist/types/components/Input/Amount/index.d.ts +1 -1
  192. package/dist/types/components/Input/CexPicker.d.ts +1 -1
  193. package/dist/types/components/Input/DestinationPicker.d.ts +1 -1
  194. package/dist/types/components/Input/DestinationPicker.d.ts.map +1 -1
  195. package/dist/types/components/Input/RoutePicker/Content.d.ts +5 -5
  196. package/dist/types/components/Input/RoutePicker/Content.d.ts.map +1 -1
  197. package/dist/types/components/Input/RoutePicker/RouterPickerWalletConnect.d.ts +1 -1
  198. package/dist/types/components/Input/RoutePicker/RouterPickerWalletConnect.d.ts.map +1 -1
  199. package/dist/types/components/Input/RoutePicker/Routes.d.ts +4 -8
  200. package/dist/types/components/Input/RoutePicker/Routes.d.ts.map +1 -1
  201. package/dist/types/components/Input/RoutePicker/Rows/CollapsableHeader.d.ts +3 -4
  202. package/dist/types/components/Input/RoutePicker/Rows/CollapsableHeader.d.ts.map +1 -1
  203. package/dist/types/components/Input/RoutePicker/Rows/CollapsibleRow.d.ts +6 -5
  204. package/dist/types/components/Input/RoutePicker/Rows/CollapsibleRow.d.ts.map +1 -1
  205. package/dist/types/components/Input/RoutePicker/Rows/StickyHeader.d.ts +3 -4
  206. package/dist/types/components/Input/RoutePicker/Rows/StickyHeader.d.ts.map +1 -1
  207. package/dist/types/components/Input/RoutePicker/Rows/SuggestionsHeader.d.ts +7 -0
  208. package/dist/types/components/Input/RoutePicker/Rows/SuggestionsHeader.d.ts.map +1 -0
  209. package/dist/types/components/Input/RoutePicker/Rows/TitleRow.d.ts +7 -0
  210. package/dist/types/components/Input/RoutePicker/Rows/TitleRow.d.ts.map +1 -0
  211. package/dist/types/components/Input/RoutePicker/Rows/index.d.ts +5 -5
  212. package/dist/types/components/Input/RoutePicker/Rows/index.d.ts.map +1 -1
  213. package/dist/types/components/Input/RoutePicker/TokenTitleDetails.d.ts +18 -0
  214. package/dist/types/components/Input/RoutePicker/TokenTitleDetails.d.ts.map +1 -0
  215. package/dist/types/components/Input/RoutePicker/index.d.ts +1 -1
  216. package/dist/types/components/Input/RoutePicker/index.d.ts.map +1 -1
  217. package/dist/types/components/Input/SourcePicker.d.ts +1 -1
  218. package/dist/types/components/Input/SourceWalletPicker.d.ts.map +1 -1
  219. package/dist/types/components/Menu/MenuList.d.ts.map +1 -1
  220. package/dist/types/components/Menu/index.d.ts.map +1 -1
  221. package/dist/types/components/Modal/modalWithoutAnimation.d.ts +4 -2
  222. package/dist/types/components/Modal/modalWithoutAnimation.d.ts.map +1 -1
  223. package/dist/types/components/Pages/Campaigns/Details/Leaderboard.d.ts +1 -1
  224. package/dist/types/components/Pages/Campaigns/Details/Rewards.d.ts +1 -1
  225. package/dist/types/components/Pages/Campaigns/Details/index.d.ts +1 -2
  226. package/dist/types/components/Pages/Campaigns/Details/index.d.ts.map +1 -1
  227. package/dist/types/components/Pages/Campaigns/index.d.ts +2 -3
  228. package/dist/types/components/Pages/Campaigns/index.d.ts.map +1 -1
  229. package/dist/types/components/Pages/Swap/Form/ExchangeForm.d.ts +3 -1
  230. package/dist/types/components/Pages/Swap/Form/ExchangeForm.d.ts.map +1 -1
  231. package/dist/types/components/Pages/Swap/Form/FeeDetails/Rate.d.ts +7 -6
  232. package/dist/types/components/Pages/Swap/Form/FeeDetails/Rate.d.ts.map +1 -1
  233. package/dist/types/components/Pages/Swap/Form/FeeDetails/ReceiveAmounts.d.ts +2 -2
  234. package/dist/types/components/Pages/Swap/Form/FeeDetails/Refuel.d.ts +1 -2
  235. package/dist/types/components/Pages/Swap/Form/FeeDetails/Refuel.d.ts.map +1 -1
  236. package/dist/types/components/Pages/Swap/Form/FeeDetails/RefuelModal.d.ts +1 -1
  237. package/dist/types/components/Pages/Swap/Form/FeeDetails/Slippage.d.ts +1 -1
  238. package/dist/types/components/Pages/Swap/Form/FeeDetails/SwapQuote/DetailedEstimates.d.ts +3 -2
  239. package/dist/types/components/Pages/Swap/Form/FeeDetails/SwapQuote/DetailedEstimates.d.ts.map +1 -1
  240. package/dist/types/components/Pages/Swap/Form/FeeDetails/SwapQuote/SummaryRow.d.ts +4 -4
  241. package/dist/types/components/Pages/Swap/Form/FeeDetails/SwapQuote/index.d.ts +4 -4
  242. package/dist/types/components/Pages/Swap/Form/FeeDetails/SwapQuote/index.d.ts.map +1 -1
  243. package/dist/types/components/Pages/Swap/Form/FeeDetails/SwapQuote/utils.d.ts +2 -2
  244. package/dist/types/components/Pages/Swap/Form/FeeDetails/index.d.ts +7 -4
  245. package/dist/types/components/Pages/Swap/Form/FeeDetails/index.d.ts.map +1 -1
  246. package/dist/types/components/Pages/Swap/Form/Form.d.ts.map +1 -1
  247. package/dist/types/components/Pages/Swap/Form/FormWrapper.d.ts +1 -1
  248. package/dist/types/components/Pages/Swap/Form/FormWrapper.d.ts.map +1 -1
  249. package/dist/types/components/Pages/Swap/Form/NetworkForm.d.ts +1 -1
  250. package/dist/types/components/Pages/Swap/Form/NetworkForm.d.ts.map +1 -1
  251. package/dist/types/components/Pages/Swap/Form/SecondaryComponents/FormButton.d.ts +1 -1
  252. package/dist/types/components/Pages/Swap/Form/SecondaryComponents/FormButton.d.ts.map +1 -1
  253. package/dist/types/components/Pages/Swap/Form/SecondaryComponents/ReserveGasNote.d.ts +2 -2
  254. package/dist/types/components/Pages/Swap/Form/SecondaryComponents/ReserveGasNote.d.ts.map +1 -1
  255. package/dist/types/components/Pages/Swap/Form/SecondaryComponents/validationError/ContractAddressValidationCache.d.ts +10 -0
  256. package/dist/types/components/Pages/Swap/Form/SecondaryComponents/validationError/ContractAddressValidationCache.d.ts.map +1 -0
  257. package/dist/types/components/Pages/Swap/Form/SecondaryComponents/validationError/ErrorDisplay.d.ts +1 -1
  258. package/dist/types/components/Pages/Swap/Form/SwapFormValues.d.ts +2 -2
  259. package/dist/types/components/Pages/Swap/Withdraw/Failed.d.ts.map +1 -1
  260. package/dist/types/components/Pages/Swap/Withdraw/ManualWithdraw.d.ts +4 -3
  261. package/dist/types/components/Pages/Swap/Withdraw/ManualWithdraw.d.ts.map +1 -1
  262. package/dist/types/components/Pages/Swap/Withdraw/NotFound.d.ts.map +1 -1
  263. package/dist/types/components/Pages/Swap/Withdraw/Processing/Processing.d.ts +1 -1
  264. package/dist/types/components/Pages/Swap/Withdraw/Processing/Processing.d.ts.map +1 -1
  265. package/dist/types/components/Pages/Swap/Withdraw/QuoteUpdate.d.ts +1 -1
  266. package/dist/types/components/Pages/Swap/Withdraw/Summary/Summary.d.ts +1 -1
  267. package/dist/types/components/Pages/Swap/Withdraw/Summary/Summary.d.ts.map +1 -1
  268. package/dist/types/components/Pages/Swap/Withdraw/SwapDetails.d.ts +2 -1
  269. package/dist/types/components/Pages/Swap/Withdraw/SwapDetails.d.ts.map +1 -1
  270. package/dist/types/components/Pages/Swap/Withdraw/SwapQuoteDetails.d.ts +3 -3
  271. package/dist/types/components/Pages/Swap/Withdraw/Wallet/Common/actionMessage.d.ts +6 -0
  272. package/dist/types/components/Pages/Swap/Withdraw/Wallet/Common/actionMessage.d.ts.map +1 -0
  273. package/dist/types/components/Pages/Swap/Withdraw/Wallet/Common/buttons.d.ts +4 -3
  274. package/dist/types/components/Pages/Swap/Withdraw/Wallet/Common/buttons.d.ts.map +1 -1
  275. package/dist/types/components/Pages/Swap/Withdraw/Wallet/Common/sharedTypes.d.ts +2 -1
  276. package/dist/types/components/Pages/Swap/Withdraw/Wallet/Common/sharedTypes.d.ts.map +1 -1
  277. package/dist/types/components/Pages/Swap/Withdraw/Wallet/index.d.ts +2 -1
  278. package/dist/types/components/Pages/Swap/Withdraw/Wallet/index.d.ts.map +1 -1
  279. package/dist/types/components/Pages/Swap/Withdraw/WalletTransferButton.d.ts +2 -1
  280. package/dist/types/components/Pages/Swap/Withdraw/WalletTransferButton.d.ts.map +1 -1
  281. package/dist/types/components/Pages/Swap/Withdraw/WalletTransferContent.d.ts +1 -1
  282. package/dist/types/components/Pages/Swap/Withdraw/Withdraw.d.ts +2 -1
  283. package/dist/types/components/Pages/Swap/Withdraw/Withdraw.d.ts.map +1 -1
  284. package/dist/types/components/Pages/Swap/Withdraw/index.d.ts +1 -2
  285. package/dist/types/components/Pages/Swap/Withdraw/index.d.ts.map +1 -1
  286. package/dist/types/components/Pages/Swap/Withdraw/messages/Message.d.ts.map +1 -1
  287. package/dist/types/components/Pages/Swap/Withdraw/messages/TransactionMessages.d.ts +3 -4
  288. package/dist/types/components/Pages/Swap/Withdraw/messages/TransactionMessages.d.ts.map +1 -1
  289. package/dist/types/components/Pages/SwapHistory/HistorySummary.d.ts +2 -2
  290. package/dist/types/components/Pages/SwapHistory/HistorySummary.d.ts.map +1 -1
  291. package/dist/types/components/Pages/SwapHistory/StatusIcons.d.ts +1 -1
  292. package/dist/types/components/Pages/SwapHistory/SwapDetailsComponent.d.ts +1 -1
  293. package/dist/types/components/Pages/SwapHistory/index.d.ts +3 -1
  294. package/dist/types/components/Pages/SwapHistory/index.d.ts.map +1 -1
  295. package/dist/types/components/Select/Command/commandSelect.d.ts.map +1 -1
  296. package/dist/types/components/Select/Selector/SelectItem.d.ts.map +1 -1
  297. package/dist/types/components/Wallet/WalletComponents/WalletsList.d.ts +3 -3
  298. package/dist/types/components/Wallet/WalletComponents/WalletsList.d.ts.map +1 -1
  299. package/dist/types/components/Wallet/WalletModal/Connector.d.ts +2 -1
  300. package/dist/types/components/Wallet/WalletModal/Connector.d.ts.map +1 -1
  301. package/dist/types/components/Wallet/WalletModal/ConnectorsList.d.ts +1 -1
  302. package/dist/types/components/Wallet/WalletModal/ConnectorsList.d.ts.map +1 -1
  303. package/dist/types/components/Wallet/WalletModal/InstalledExtensionNotFound.d.ts +7 -0
  304. package/dist/types/components/Wallet/WalletModal/InstalledExtensionNotFound.d.ts.map +1 -0
  305. package/dist/types/components/Wallet/WalletModal/LoadingConnect.d.ts +8 -0
  306. package/dist/types/components/Wallet/WalletModal/LoadingConnect.d.ts.map +1 -0
  307. package/dist/types/components/Wallet/WalletModal/MultichainConnectorPicker.d.ts +12 -0
  308. package/dist/types/components/Wallet/WalletModal/MultichainConnectorPicker.d.ts.map +1 -0
  309. package/dist/types/components/Wallet/WalletModal/ProviderPicker.d.ts +8 -0
  310. package/dist/types/components/Wallet/WalletModal/ProviderPicker.d.ts.map +1 -0
  311. package/dist/types/components/Wallet/WalletModal/WalletQrCode.d.ts +6 -0
  312. package/dist/types/components/Wallet/WalletModal/WalletQrCode.d.ts.map +1 -0
  313. package/dist/types/components/Wallet/WalletModal/index.d.ts +2 -1
  314. package/dist/types/components/Wallet/WalletModal/index.d.ts.map +1 -1
  315. package/dist/types/components/Wallet/WalletProviders/index.d.ts +3 -1
  316. package/dist/types/components/Wallet/WalletProviders/index.d.ts.map +1 -1
  317. package/dist/types/components/Widget/Content.d.ts +2 -1
  318. package/dist/types/components/Widget/Content.d.ts.map +1 -1
  319. package/dist/types/components/Widget/Footer.d.ts +2 -1
  320. package/dist/types/components/Widget/Footer.d.ts.map +1 -1
  321. package/dist/types/components/Widget/Index.d.ts +3 -2
  322. package/dist/types/components/Widget/Index.d.ts.map +1 -1
  323. package/dist/types/components/WidgetLoading.d.ts.map +1 -1
  324. package/dist/types/components/shadcn/command.d.ts +9 -52
  325. package/dist/types/components/shadcn/command.d.ts.map +1 -1
  326. package/dist/types/context/ErrorProvider.d.ts +3 -0
  327. package/dist/types/context/ErrorProvider.d.ts.map +1 -0
  328. package/dist/types/context/LayerswapProvider.d.ts +22 -4
  329. package/dist/types/context/LayerswapProvider.d.ts.map +1 -1
  330. package/dist/types/context/callbackProvider.d.ts +7 -10
  331. package/dist/types/context/callbackProvider.d.ts.map +1 -1
  332. package/dist/types/context/resolverContext.d.ts.map +1 -1
  333. package/dist/types/context/swap.d.ts +7 -7
  334. package/dist/types/context/swap.d.ts.map +1 -1
  335. package/dist/types/context/{balanceAccounts.d.ts → swapAccounts.d.ts} +9 -9
  336. package/dist/types/context/swapAccounts.d.ts.map +1 -0
  337. package/dist/types/context/walletProviders.d.ts.map +1 -1
  338. package/dist/types/context/withdrawalContext.d.ts +2 -0
  339. package/dist/types/context/withdrawalContext.d.ts.map +1 -1
  340. package/dist/types/exports/internal.d.ts +9 -7
  341. package/dist/types/exports/internal.d.ts.map +1 -1
  342. package/dist/types/helpers/accountSelectHelper.d.ts +1 -1
  343. package/dist/types/helpers/balanceHelper.d.ts +2 -2
  344. package/dist/types/helpers/filterSourceNetworks.d.ts +4 -0
  345. package/dist/types/helpers/filterSourceNetworks.d.ts.map +1 -0
  346. package/dist/types/helpers/getSettings/getSettings.d.ts +1 -1
  347. package/dist/types/helpers/getSettings/getSettings.d.ts.map +1 -1
  348. package/dist/types/helpers/routes.d.ts +1 -1
  349. package/dist/types/helpers/routes.d.ts.map +1 -1
  350. package/dist/types/helpers/tokenHelper.d.ts +2 -2
  351. package/dist/types/hooks/useAllWithdrawalBalances.d.ts +2 -1
  352. package/dist/types/hooks/useAllWithdrawalBalances.d.ts.map +1 -1
  353. package/dist/types/hooks/useConnectors.d.ts +28 -0
  354. package/dist/types/hooks/useConnectors.d.ts.map +1 -0
  355. package/dist/types/hooks/useFee.d.ts +1 -1
  356. package/dist/types/hooks/useFormRoutes.d.ts +2 -3
  357. package/dist/types/hooks/useFormRoutes.d.ts.map +1 -1
  358. package/dist/types/hooks/useFormValidation.d.ts +2 -1
  359. package/dist/types/hooks/useFormValidation.d.ts.map +1 -1
  360. package/dist/types/hooks/useSwapHistoryData.d.ts +2 -2
  361. package/dist/types/hooks/useTransfer.d.ts +5 -0
  362. package/dist/types/hooks/useTransfer.d.ts.map +1 -0
  363. package/dist/types/hooks/useWallet.d.ts +3 -3
  364. package/dist/types/hooks/useWallet.d.ts.map +1 -1
  365. package/dist/types/lib/AppSettings.d.ts +25 -16
  366. package/dist/types/lib/AppSettings.d.ts.map +1 -1
  367. package/dist/types/lib/ErrorHandler.d.ts +3 -0
  368. package/dist/types/lib/ErrorHandler.d.ts.map +1 -0
  369. package/dist/types/lib/address/contractAddressResolver.d.ts +7 -0
  370. package/dist/types/lib/address/contractAddressResolver.d.ts.map +1 -0
  371. package/dist/types/lib/apiClients/layerSwapApiClient.d.ts +1 -9
  372. package/dist/types/lib/apiClients/layerSwapApiClient.d.ts.map +1 -1
  373. package/dist/types/lib/balances/balanceResolver.d.ts +3 -3
  374. package/dist/types/lib/balances/balanceResolver.d.ts.map +1 -1
  375. package/dist/types/lib/balances/errorUtils.d.ts +12 -0
  376. package/dist/types/lib/balances/errorUtils.d.ts.map +1 -0
  377. package/dist/types/lib/balances/helpers.d.ts +1 -1
  378. package/dist/types/lib/balances/nodeErrorClassifier.d.ts +4 -0
  379. package/dist/types/lib/balances/nodeErrorClassifier.d.ts.map +1 -0
  380. package/dist/types/lib/balances/useBalance.d.ts +1 -1
  381. package/dist/types/lib/fees.d.ts +16 -0
  382. package/dist/types/lib/fees.d.ts.map +1 -1
  383. package/dist/types/lib/gases/gasResolver.d.ts +2 -2
  384. package/dist/types/lib/gases/useSWRGas.d.ts +3 -3
  385. package/dist/types/lib/generateSwapInitialValues.d.ts +1 -1
  386. package/dist/types/lib/isNewListed.d.ts +4 -0
  387. package/dist/types/lib/isNewListed.d.ts.map +1 -0
  388. package/dist/types/lib/knownIds.d.ts +1 -0
  389. package/dist/types/lib/knownIds.d.ts.map +1 -1
  390. package/dist/types/lib/nft/nftBalanceResolver.d.ts +1 -1
  391. package/dist/types/lib/resolvers/resolverService.d.ts +11 -5
  392. package/dist/types/lib/resolvers/resolverService.d.ts.map +1 -1
  393. package/dist/types/lib/transfers/index.d.ts +2 -0
  394. package/dist/types/lib/transfers/index.d.ts.map +1 -0
  395. package/dist/types/lib/transfers/transferResolver.d.ts +7 -0
  396. package/dist/types/lib/transfers/transferResolver.d.ts.map +1 -0
  397. package/dist/types/stores/balanceStore.d.ts +3 -0
  398. package/dist/types/stores/balanceStore.d.ts.map +1 -1
  399. package/dist/types/stores/contractAddressStore.d.ts +43 -0
  400. package/dist/types/stores/contractAddressStore.d.ts.map +1 -0
  401. package/dist/types/stores/logStore.d.ts +8 -0
  402. package/dist/types/stores/logStore.d.ts.map +1 -0
  403. package/dist/types/stores/walletStore.d.ts +1 -1
  404. package/dist/types/types/balance.d.ts +2 -2
  405. package/dist/types/types/balance.d.ts.map +1 -1
  406. package/dist/types/types/contract.d.ts +6 -0
  407. package/dist/types/types/contract.d.ts.map +1 -0
  408. package/dist/types/types/gas.d.ts +2 -2
  409. package/dist/types/types/index.d.ts +2 -0
  410. package/dist/types/types/index.d.ts.map +1 -1
  411. package/dist/types/types/logEvents.d.ts +59 -0
  412. package/dist/types/types/logEvents.d.ts.map +1 -0
  413. package/dist/types/types/nft.d.ts +1 -1
  414. package/dist/types/types/transfer.d.ts +7 -2
  415. package/dist/types/types/transfer.d.ts.map +1 -1
  416. package/dist/types/types/wallet.d.ts +29 -8
  417. package/dist/types/types/wallet.d.ts.map +1 -1
  418. package/package.json +3 -3
  419. package/dist/esm/components/Icons/Wallets/Keplr.js +0 -3
  420. package/dist/esm/components/Modal/popover.js +0 -15
  421. package/dist/esm/components/Wallet/WalletModal/utils.js +0 -23
  422. package/dist/esm/helpers/querryHelper.js +0 -13
  423. package/dist/esm/lib/logError.js +0 -17
  424. package/dist/esm/lib/sorting.js +0 -63
  425. package/dist/types/components/Icons/Wallets/Keplr.d.ts +0 -4
  426. package/dist/types/components/Icons/Wallets/Keplr.d.ts.map +0 -1
  427. package/dist/types/components/Modal/popover.d.ts +0 -12
  428. package/dist/types/components/Modal/popover.d.ts.map +0 -1
  429. package/dist/types/components/Wallet/WalletModal/utils.d.ts +0 -2
  430. package/dist/types/components/Wallet/WalletModal/utils.d.ts.map +0 -1
  431. package/dist/types/context/balanceAccounts.d.ts.map +0 -1
  432. package/dist/types/helpers/querryHelper.d.ts +0 -3
  433. package/dist/types/helpers/querryHelper.d.ts.map +0 -1
  434. package/dist/types/lib/logError.d.ts +0 -3
  435. package/dist/types/lib/logError.d.ts.map +0 -1
  436. package/dist/types/lib/sorting.d.ts +0 -22
  437. package/dist/types/lib/sorting.d.ts.map +0 -1
@@ -13,29 +13,28 @@ import ExchangeGasIcon from '../../../../../components/Icons/ExchangeGasIcon';
13
13
  import useSWRNftBalance from '../../../../../lib/nft/useSWRNftBalance';
14
14
  import NumberFlow from '@number-flow/react';
15
15
  import { resolveTokenUsdPrice } from '../../../../../helpers/tokenHelper';
16
- import { useSelectedAccount } from '../../../../../context/balanceAccounts';
16
+ import { useSelectedAccount } from '../../../../../context/swapAccounts';
17
17
  import { CupIcon } from '../../../../../components/Icons/CupIcon';
18
18
  import { DetailedEstimates } from './SwapQuote/DetailedEstimates';
19
- export default function QuoteDetails({ swapValues: values, quote: quoteData, isQuoteLoading }) {
19
+ export default function QuoteDetails({ swapValues: values, quote, isQuoteLoading, reward, variant = 'extended', triggerClassnames }) {
20
20
  const { toAsset, fromAsset: fromCurrency, destination_address } = values || {};
21
21
  const [isAccordionOpen, setIsAccordionOpen] = useState(false);
22
- return (_jsx(_Fragment, { children: quoteData &&
23
- _jsx(Accordion, { type: 'single', collapsible: true, className: 'w-full', value: isAccordionOpen ? 'quote' : '', onValueChange: (value) => { setIsAccordionOpen(value === 'quote'); }, children: _jsxs(AccordionItem, { value: 'quote', className: 'bg-secondary-500 rounded-2xl', children: [_jsxs(AccordionTrigger, { className: clsx('p-3.5 pr-5 w-full rounded-2xl flex items-center justify-between transition-colors duration-200 hover:bg-secondary-400', {
22
+ return (_jsx(_Fragment, { children: quote &&
23
+ _jsx(Accordion, { type: 'single', collapsible: true, className: 'w-full', value: isAccordionOpen ? 'quote' : '', onValueChange: (value) => { setIsAccordionOpen(value === 'quote'); }, children: _jsxs(AccordionItem, { value: 'quote', className: 'bg-secondary-500 rounded-2xl', children: [_jsxs(AccordionTrigger, { className: clsx('p-3.5 pr-5 w-full rounded-2xl flex items-center justify-between transition-colors duration-200 hover:bg-secondary-400 mt-3', triggerClassnames, {
24
24
  'bg-secondary-500': !isAccordionOpen,
25
25
  'bg-secondary-400': isAccordionOpen,
26
26
  'animate-pulse-strong': isQuoteLoading && !isAccordionOpen
27
27
  }), children: [(isAccordionOpen) ?
28
28
  _jsx("p", { className: 'text-sm', children: "Details" })
29
29
  :
30
- _jsx(DetailsButton, { quote: quoteData, isQuoteLoading: isQuoteLoading, swapValues: values, destination: values.to, destinationAddress: destination_address }), _jsx(ChevronDown, { className: 'h-3.5 w-3.5 text-secondary-text' })] }), _jsx(AccordionContent, { className: 'rounded-2xl', children: _jsx(ResizablePanel, { children: (quoteData || isQuoteLoading) && fromCurrency && toAsset &&
31
- _jsx(DetailedEstimates, { swapValues: values, quote: quoteData }) }) })] }) }) }));
30
+ _jsx(DetailsButton, { quote: quote, isQuoteLoading: isQuoteLoading, swapValues: values, destination: values.to, destinationAddress: destination_address, reward: reward }), _jsx(ChevronDown, { className: 'h-3.5 w-3.5 text-secondary-text' })] }), _jsx(AccordionContent, { className: 'rounded-2xl', children: _jsx(ResizablePanel, { children: (quote || isQuoteLoading) && fromCurrency && toAsset &&
31
+ _jsx(DetailedEstimates, { swapValues: values, quote: quote, variant: variant, reward: reward }) }) })] }) }) }));
32
32
  }
33
- export const DetailsButton = ({ quote: quoteData, isQuoteLoading, swapValues: values, destination, destinationAddress }) => {
34
- const { quote, reward } = quoteData || {};
33
+ export const DetailsButton = ({ quote, reward, isQuoteLoading, swapValues: values, destination, destinationAddress }) => {
35
34
  const isCEX = !!values.fromExchange;
36
35
  const sourceAccountNetwork = !isCEX ? values.from : undefined;
37
36
  const selectedSourceAccount = useSelectedAccount("from", sourceAccountNetwork?.name);
38
- const { wallets } = useWallet(quoteData?.quote?.source_network, 'withdrawal');
37
+ const { wallets } = useWallet(quote?.source_network, 'withdrawal');
39
38
  const wallet = wallets.find(w => w.id === selectedSourceAccount?.id);
40
39
  const { gasData: gasData } = useSWRGas(selectedSourceAccount?.address, values.from, values.fromAsset, values.amount, wallet);
41
40
  const gasTokenPriceInUsd = resolveTokenUsdPrice(gasData?.token, quote);
@@ -45,8 +44,8 @@ export const DetailsButton = ({ quote: quoteData, isQuoteLoading, swapValues: va
45
44
  const { balance: nftBalance, isLoading, error } = useSWRNftBalance(destinationAddress || '', destination, reward?.nft_contract_address || '');
46
45
  return (_jsxs("div", { className: 'flex items-center gap-1 space-x-3', children: [gasFeeInUsd ?
47
46
  _jsxs(_Fragment, { children: [_jsxs("div", { className: clsx("inline-flex items-center gap-1", { "animate-pulse-strong": isQuoteLoading }), children: [_jsx("div", { className: 'p-0.5', children: !values.fromExchange ?
48
- _jsx(GasIcon, { className: 'h-4 w-4 text-secondary-text' }) : _jsx(ExchangeGasIcon, { className: 'h-5 w-5 text-secondary-text' }) }), _jsx(NumberFlow, { className: "text-primary-text text-sm leading-6", value: gasFeeInUsd < 0.01 ? '0.01' : gasFeeInUsd, format: { style: 'currency', currency: 'USD' }, prefix: gasFeeInUsd < 0.01 ? '<' : undefined })] }), _jsx("div", { className: "w-px h-3 bg-primary-text-tertiary rounded-2xl" })] }) : null, averageCompletionTime ?
47
+ _jsx(GasIcon, { className: 'h-4 w-4 text-secondary-text' }) : _jsx(ExchangeGasIcon, { className: 'h-5 w-5 text-secondary-text' }) }), _jsx(NumberFlow, { className: "text-primary-text text-sm leading-6", value: gasFeeInUsd < 0.01 ? '0.01' : gasFeeInUsd, prefix: gasFeeInUsd < 0.01 ? '<$' : '$' })] }), _jsx("div", { className: "w-px h-3 bg-primary-text-tertiary rounded-2xl" })] }) : null, averageCompletionTime ?
49
48
  _jsx(_Fragment, { children: _jsxs("div", { className: clsx("text-right inline-flex items-center gap-1 text-sm", { "animate-pulse-strong": isQuoteLoading }), children: [_jsx("div", { className: 'p-0.5', children: _jsx(Clock, { className: 'h-4 w-4 text-secondary-text' }) }), _jsx(AverageCompletionTime, { className: "text-primary-text", avgCompletionTime: quote.avg_completion_time })] }) }) : null, (reward &&
50
49
  (!shouldCheckNFT || (!isLoading && !error && nftBalance !== undefined && nftBalance > 0))) ?
51
- _jsxs(_Fragment, { children: [_jsx("div", { className: "w-px h-3 bg-primary-text-tertiary rounded-2xl" }), _jsxs("div", { className: 'text-right text-primary-text inline-flex items-center gap-1', children: [_jsx(CupIcon, { alt: "Reward", width: 16, height: 16 }), _jsx(NumberFlow, { value: reward?.amount_in_usd < 0.01 ? '0.01' : reward?.amount_in_usd, format: { style: 'currency', currency: 'USD' }, prefix: reward?.amount_in_usd < 0.01 ? '<' : undefined })] })] }) : null] }));
50
+ _jsxs(_Fragment, { children: [_jsx("div", { className: "w-px h-3 bg-primary-text-tertiary rounded-2xl" }), _jsxs("div", { className: 'text-right text-primary-text inline-flex items-center gap-1', children: [_jsx(CupIcon, { alt: "Reward", width: 16, height: 16 }), _jsx(NumberFlow, { value: reward?.amount_in_usd < 0.01 ? '0.01' : reward?.amount_in_usd, prefix: reward?.amount_in_usd < 0.01 ? '<$' : '$' })] })] }) : null] }));
52
51
  };
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { SwapDataProvider } from "../../../../context/swap";
4
- import { useMemo } from "react";
4
+ import { useMemo, useState } from "react";
5
5
  import { NetworkExchangeTabs, Tabs, TabsContent } from "./NetworkExchangeTabs";
6
6
  import NetworkForm from "./NetworkForm";
7
7
  import ExchangeForm from "./ExchangeForm";
@@ -15,15 +15,39 @@ import useSWR from "swr";
15
15
  import AppSettings from "../../../../lib/AppSettings";
16
16
  import clsx from "clsx";
17
17
  export default function Form() {
18
- const { from, appName, defaultTab: defaultTabQueryParam } = useInitialSettings();
18
+ const { from, appName, defaultTab: defaultTabQueryParam, theme: themeName } = useInitialSettings();
19
19
  const { sourceExchanges } = useSettingsState();
20
20
  const defaultTab = useMemo(() => {
21
21
  return defaultTabResolver({ from, sourceExchanges, defaultTabQueryParam });
22
22
  }, [from, sourceExchanges]);
23
+ const [showBanner, setShowBanner] = useState(false);
24
+ // useEffect(() => {
25
+ // if (typeof window === "undefined") return;
26
+ // const sessionCountKey = "exchange_banner_session_count";
27
+ // const closedKey = "exchange_banner_closed";
28
+ // const seenKey = "exchange_banner_seen";
29
+ // if (sessionStorage.getItem(closedKey) === "1") return;
30
+ // if (!sessionStorage.getItem(seenKey)) {
31
+ // sessionStorage.setItem(seenKey, "1");
32
+ // const next =
33
+ // (parseInt(localStorage.getItem(sessionCountKey) || "0") || 0) + 1;
34
+ // localStorage.setItem(sessionCountKey, String(next));
35
+ // if (next <= 3) setShowBanner(true);
36
+ // } else {
37
+ // const count = parseInt(localStorage.getItem(sessionCountKey) || "0") || 0;
38
+ // if (count <= 3) setShowBanner(true);
39
+ // }
40
+ // }, []);
41
+ const dismissBanner = () => {
42
+ setShowBanner(false);
43
+ if (typeof window !== "undefined") {
44
+ sessionStorage.setItem("exchange_banner_closed", "1");
45
+ }
46
+ };
23
47
  const layerswapApiClient = new LayerSwapApiClient();
24
48
  const { data: partnerData } = useSWR(appName && `/internal/apps?name=${appName}`, layerswapApiClient.fetcher);
25
49
  const partner = appName && partnerData?.data?.client_id?.toLowerCase() === appName?.toLowerCase() ? partnerData?.data : undefined;
26
- return _jsxs(Tabs, { defaultValue: defaultTab, children: [_jsx("div", { className: clsx("hidden sm:block", { 'sm:hidden': AppSettings.ThemeData?.enableWideVersion !== true }), children: _jsx(NetworkExchangeTabs, {}) }), _jsx(TabsContent, { value: "cross-chain", children: _jsx(SwapDataProvider, { children: _jsx(FormWrapper, { type: "cross-chain", partner: partner, children: _jsx(Widget, { contextualMenu: _jsx("div", { className: clsx("block w-full", { 'sm:hidden': AppSettings.ThemeData?.enableWideVersion == true }), children: _jsx(NetworkExchangeTabs, {}) }), children: _jsx(ValidationProvider, { children: _jsx(NetworkForm, { partner: partner }) }) }) }) }) }), _jsx(TabsContent, { value: "exchange", children: _jsx(SwapDataProvider, { children: _jsx(FormWrapper, { type: "exchange", partner: partner, children: _jsx(Widget, { contextualMenu: _jsx("div", { className: clsx("block w-full", { 'sm:hidden': AppSettings.ThemeData?.enableWideVersion == true }), children: _jsx(NetworkExchangeTabs, {}) }), children: _jsx(ValidationProvider, { children: _jsx(ExchangeForm, { partner: partner }) }) }) }) }) })] });
50
+ return _jsxs(Tabs, { defaultValue: defaultTab, children: [_jsx("div", { className: clsx("hidden sm:block", { 'sm:hidden': AppSettings.ThemeData?.enableWideVersion !== true }), children: _jsx(NetworkExchangeTabs, {}) }), _jsx(TabsContent, { value: "cross-chain", children: _jsx(SwapDataProvider, { children: _jsx(FormWrapper, { type: "cross-chain", partner: partner, children: _jsx(Widget, { contextualMenu: _jsx("div", { className: clsx("block w-full", { 'sm:hidden': AppSettings.ThemeData?.enableWideVersion == true }), children: _jsx(NetworkExchangeTabs, {}) }), children: _jsx(ValidationProvider, { children: _jsx(NetworkForm, { partner: partner }) }) }) }) }) }), _jsx(TabsContent, { value: "exchange", children: _jsx(SwapDataProvider, { children: _jsx(FormWrapper, { type: "exchange", partner: partner, children: _jsx(Widget, { contextualMenu: _jsx("div", { className: clsx("block w-full", { 'sm:hidden': AppSettings.ThemeData?.enableWideVersion == true }), children: _jsx(NetworkExchangeTabs, {}) }), children: _jsx(ValidationProvider, { children: _jsx(ExchangeForm, { partner: partner, showBanner: showBanner, dismissBanner: dismissBanner }) }) }) }) }) })] });
27
51
  }
28
52
  const defaultTabResolver = ({ from, sourceExchanges, defaultTabQueryParam }) => {
29
53
  if (defaultTabQueryParam) {
@@ -12,15 +12,18 @@ import useWallet from "../../../../hooks/useWallet";
12
12
  import { useAsyncModal } from "../../../../context/asyncModal";
13
13
  import VaulDrawer from "../../../../components/Modal/vaulModal";
14
14
  import { addressFormat } from "../../../../lib/address/formatter";
15
- import AddressNote from "../../../../components/Input/Address/AddressNote";
16
15
  import { useBalance } from "../../../../lib/balances/useBalance";
17
- import { useSelectedAccount } from "../../../../context/balanceAccounts";
16
+ import { useSelectedAccount } from "../../../../context/swapAccounts";
18
17
  import SwapDetails from "../Withdraw/SwapDetails";
19
- import { useSwapCreateCallback, useSwapModalStateChangeCallback } from "../../../../context/callbackProvider";
18
+ import { useCallbacks } from "../../../../context/callbackProvider";
19
+ import ContractAddressNote from "../../../../components/Input/Address/ContractAddressNote";
20
+ import { useContractAddressStore } from "../../../../stores/contractAddressStore";
21
+ import UrlAddressNote from "../../../../components/Input/Address/UrlAddressNote";
20
22
  export default function FormWrapper({ children, type, partner }) {
21
23
  const formikRef = useRef(null);
22
24
  const [showConnectNetworkModal, setShowConnectNetworkModal] = useState(false);
23
25
  const [isAddressFromQueryConfirmed, setIsAddressFromQueryConfirmed] = useState(false);
26
+ const dontShowContractWarningRef = useRef(false);
24
27
  const [networkToConnect, setNetworkToConnect] = useState();
25
28
  const settings = useSettingsState();
26
29
  const { swapBasicData, swapDetails, swapModalOpen } = useSwapDataState();
@@ -29,13 +32,13 @@ export default function FormWrapper({ children, type, partner }) {
29
32
  const [walletWihdrawDone, setWalletWihdrawDone] = useState(false);
30
33
  const selectedSourceAccount = useSelectedAccount("from", swapBasicData?.source_network?.name);
31
34
  const { mutate: mutateBalances } = useBalance(selectedSourceAccount?.address, sourceNetworkWithTokens);
32
- const triggerSwapModalStateChangeCallback = useSwapModalStateChangeCallback();
33
- const triggerSwapCreateCallback = useSwapCreateCallback();
35
+ const { onSwapModalStateChange } = useCallbacks();
34
36
  const { getConfirmation } = useAsyncModal();
35
37
  const initialSettings = useInitialSettings();
36
38
  const { destination_address: destinationAddressFromQuery } = initialSettings;
37
39
  const { createSwap, setSwapId, setSubmitedFormValues, setSwapModalOpen } = useSwapDataUpdate();
38
40
  const { setSwapError } = useSwapDataState();
41
+ const { setConfirmed, isConfirmed, checkContractStatus } = useContractAddressStore();
39
42
  const handleSubmit = useCallback(async (values) => {
40
43
  setSwapError && setSwapError('');
41
44
  const { destination_address, to } = values;
@@ -48,10 +51,10 @@ export default function FormWrapper({ children, type, partner }) {
48
51
  destinationAddressFromQuery &&
49
52
  (addressFormat(destinationAddressFromQuery?.toString(), to) === addressFormat(destination_address, to)) &&
50
53
  !isAddressFromQueryConfirmed) {
51
- const provider = to && getProvider(to, 'autofil');
54
+ const provider = to && getProvider(to, 'autofill');
52
55
  const isDestAddressConnected = destination_address && provider?.connectedWallets?.some((wallet) => addressFormat(wallet.address, to) === addressFormat(destination_address, to));
53
56
  const confirmed = !isDestAddressConnected ? await getConfirmation({
54
- content: _jsx(AddressNote, { partner: partner, values: values }),
57
+ content: _jsx(UrlAddressNote, { partner: partner, values: values }),
55
58
  submitText: 'Confirm address',
56
59
  dismissText: 'Cancel address'
57
60
  }) : true;
@@ -62,6 +65,29 @@ export default function FormWrapper({ children, type, partner }) {
62
65
  return;
63
66
  }
64
67
  }
68
+ if (destination_address && values.from && values.to && values.to.type === 'evm') {
69
+ const alreadyConfirmed = isConfirmed(destination_address, values.to.name);
70
+ if (!alreadyConfirmed) {
71
+ const { isContractInAnyNetwork, destinationIsContract } = await checkContractStatus(destination_address, values.from, values.to);
72
+ if (isContractInAnyNetwork && !destinationIsContract) {
73
+ dontShowContractWarningRef.current = false;
74
+ const handleDontShowAgainChange = (checked) => {
75
+ dontShowContractWarningRef.current = checked;
76
+ };
77
+ const confirmed = await getConfirmation({
78
+ content: _jsx(ContractAddressNote, { values: values, onDontShowAgainChange: handleDontShowAgainChange }),
79
+ submitText: 'Confirm',
80
+ dismissText: 'Cancel'
81
+ });
82
+ if (confirmed && dontShowContractWarningRef.current) {
83
+ setConfirmed(destination_address, values.to.name);
84
+ }
85
+ else if (!confirmed) {
86
+ return;
87
+ }
88
+ }
89
+ }
90
+ }
65
91
  try {
66
92
  await handleCreateSwap({
67
93
  setSwapId,
@@ -71,7 +97,6 @@ export default function FormWrapper({ children, type, partner }) {
71
97
  partner,
72
98
  createSwap: async (...props) => {
73
99
  const response = await createSwap(...props);
74
- triggerSwapCreateCallback(response);
75
100
  return response;
76
101
  },
77
102
  setShowSwapModal: handleShowSwapModal,
@@ -87,7 +112,7 @@ export default function FormWrapper({ children, type, partner }) {
87
112
  : generateSwapInitialValues(settings, initialSettings, type);
88
113
  const handleShowSwapModal = useCallback((value) => {
89
114
  setSwapModalOpen(value);
90
- triggerSwapModalStateChangeCallback(value);
115
+ onSwapModalStateChange(value);
91
116
  if (!value) {
92
117
  if (walletWihdrawDone) {
93
118
  mutateBalances();
@@ -100,7 +125,7 @@ export default function FormWrapper({ children, type, partner }) {
100
125
  setWalletWihdrawDone(true);
101
126
  }, []);
102
127
  return _jsx(_Fragment, { children: _jsx(Formik, { innerRef: formikRef, initialValues: initialValues, validateOnMount: true, onSubmit: handleSubmit, children: _jsxs(_Fragment, { children: [_jsx(VaulDrawer, { show: showConnectNetworkModal, setShow: setShowConnectNetworkModal, header: `${networkToConnect?.DisplayName} connect`, modalId: "showNetwork", children: _jsx(VaulDrawer.Snap, { id: "item-1", children: networkToConnect &&
103
- _jsx(ConnectNetwork, { NetworkDisplayName: networkToConnect?.DisplayName, AppURL: networkToConnect?.AppURL }) }) }), _jsx(VaulDrawer, { show: swapModalOpen, setShow: handleShowSwapModal, header: `Complete the swap`, modalId: "showSwap", className: !swapBasicData?.use_deposit_address ? "expandContainerHeight" : "", children: _jsx(VaulDrawer.Snap, { id: "item-1", children: _jsx(SwapDetails, { type: "contained", onWalletWithdrawalSuccess: handleWalletWithdrawalSuccess, partner: partner }) }) }), children] }) }) });
128
+ _jsx(ConnectNetwork, { NetworkDisplayName: networkToConnect?.DisplayName, AppURL: networkToConnect?.AppURL }) }) }), _jsx(VaulDrawer, { show: swapModalOpen, setShow: handleShowSwapModal, header: `Complete the swap`, modalId: "showSwap", className: !swapBasicData?.use_deposit_address ? "expandContainerHeight" : "", children: _jsx(VaulDrawer.Snap, { id: "item-1", children: _jsx(SwapDetails, { type: "contained", onWalletWithdrawalSuccess: handleWalletWithdrawalSuccess, partner: partner, onCancelWithdrawal: () => handleShowSwapModal(false) }) }) }), children] }) }) });
104
129
  }
105
130
  const handleCreateSwap = async ({ query, values, partner, setShowSwapModal, createSwap, setNetworkToConnect, setShowConnectNetworkModal, setSwapId, setSubmitedFormValues }) => {
106
131
  setSubmitedFormValues(values);
@@ -1,7 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useState } from "react";
3
3
  import { Form, useFormikContext } from "formik";
4
- import ValidationError from "../../../../components/Pages/Swap/Form/SecondaryComponents/validationError";
4
+ import ValidationError from "./SecondaryComponents/validationError";
5
+ import ContractAddressValidationCache from "./SecondaryComponents/validationError/ContractAddressValidationCache";
5
6
  import useWallet from "../../../../hooks/useWallet";
6
7
  import SourcePicker from "../../../../components/Input/SourcePicker";
7
8
  import DestinationPicker from "../../../../components/Input/DestinationPicker";
@@ -18,12 +19,12 @@ import { transformFormValuesToQuoteArgs, useQuoteData } from "../../../../hooks/
18
19
  import { useValidationContext } from "../../../../context/validationContext";
19
20
  import { useSwapDataState } from "../../../../context/swap";
20
21
  import ReserveGasNote from "../../../../components/Pages/Swap/Form/SecondaryComponents/ReserveGasNote";
21
- import { useSelectedAccount } from "../../../../context/balanceAccounts";
22
+ import { useSelectedAccount } from "../../../../context/swapAccounts";
22
23
  import QuoteDetails from "./FeeDetails";
23
24
  import DepositMethodComponent from "./FeeDetails/DepositMethod";
24
25
  import RefuelToggle from "./FeeDetails/Refuel";
25
26
  import RefuelModal from "./FeeDetails/RefuelModal";
26
- import { useFormChangeCallback } from "../../../../context/callbackProvider";
27
+ import { useCallbacks } from "../../../../context/callbackProvider";
27
28
  const NetworkForm = ({ partner }) => {
28
29
  const [openRefuelModal, setOpenRefuelModal] = useState(false);
29
30
  const { values, setValues, isSubmitting, setFieldValue, } = useFormikContext();
@@ -40,10 +41,10 @@ const NetworkForm = ({ partner }) => {
40
41
  const initialSettings = useInitialSettings();
41
42
  const isValid = !formValidation.message;
42
43
  const error = formValidation.message;
43
- const triggerFormChangeCallback = useFormChangeCallback();
44
+ const { onFormChange } = useCallbacks();
44
45
  useEffect(() => {
45
- triggerFormChangeCallback(values);
46
- }, [values, triggerFormChangeCallback]);
46
+ onFormChange(values);
47
+ }, [values, onFormChange]);
47
48
  useEffect(() => {
48
49
  if (!source || !toAsset || !toAsset.refuel) {
49
50
  setFieldValue('refuel', false, true);
@@ -54,22 +55,12 @@ const NetworkForm = ({ partner }) => {
54
55
  setFieldValue('amount', (nativeTokenBalance?.amount - networkGas).toString(), true);
55
56
  }, [setFieldValue]);
56
57
  const shouldConnectWallet = (source && source?.deposit_methods?.includes('wallet') && depositMethod !== 'deposit_address' && !selectedSourceAccount) || (!source && !wallets.length && depositMethod !== 'deposit_address');
57
- // useEffect(() => {
58
- // if (wallets?.length) {
59
- // const allWalletAddresses = wallets.flatMap(w => w.addresses).filter(Boolean);
60
- // posthog.setPersonProperties({
61
- // accounts: allWalletAddresses,
62
- // });
63
- // }
64
- // }, [wallets]);
65
- return (_jsxs(_Fragment, { children: [_jsx(DepositMethodComponent, {}), _jsxs(Form, { className: "h-full grow flex flex-col flex-1 justify-between w-full gap-3", children: [_jsx(Widget.Content, { children: _jsxs("div", { className: "w-full flex flex-col justify-between flex-1 gap-3", children: [_jsxs("div", { className: 'flex-col relative flex justify-between gap-2 w-full leading-4', children: [!(initialSettings?.hideFrom && values?.from) && _jsx(SourcePicker, { minAllowedAmount: minAllowedAmount, maxAllowedAmount: maxAllowedAmount, fee: quote }), !initialSettings?.hideFrom && !initialSettings?.hideTo &&
66
- _jsx(ValueSwapperButton, { values: values, setValues: setValues, providers: providers, query: initialSettings }), !(initialSettings?.hideTo && values?.to) && _jsx(DestinationPicker, { isFeeLoading: isQuoteLoading, fee: quote, partner: partner })] }), Number(values.amount) > 0 ?
67
- _jsx(ReserveGasNote, { maxAllowedAmount: minAllowedAmount, minAllowedAmount: maxAllowedAmount, onSubmit: handleReserveGas })
68
- : null, (values.toAsset?.refuel && !initialSettings.hideRefuel) ?
69
- _jsx(RefuelToggle, { quote: quote, onButtonClick: () => setOpenRefuelModal(true), minAllowedAmount: minAllowedAmount })
70
- : null, routeValidation.message
71
- ? _jsx(ValidationError, {})
72
- : null, _jsx(QuoteDetails, { swapValues: values, quote: quote, isQuoteLoading: isQuoteLoading })] }) }), _jsx(Widget.Footer, { showPoweredBy: true, children: _jsx(FormButton, { shouldConnectWallet: shouldConnectWallet, values: values, disabled: !isValid || isSubmitting || !quote || isQuoteLoading, error: error, isSubmitting: isSubmitting, partner: partner }) }), _jsx(RefuelModal, { openModal: openRefuelModal, setOpenModal: setOpenRefuelModal, fee: quote })] })] }));
58
+ return (_jsxs(_Fragment, { children: [_jsx(DepositMethodComponent, {}), _jsxs(Form, { className: "h-full grow flex flex-col flex-1 justify-between w-full gap-3", children: [_jsx(Widget.Content, { children: _jsxs("div", { className: "w-full flex flex-col justify-between flex-1", children: [_jsxs("div", { className: 'flex-col relative flex justify-between gap-2 w-full leading-4', children: [!(initialSettings?.hideFrom && values?.from) && _jsx(SourcePicker, { minAllowedAmount: minAllowedAmount, maxAllowedAmount: maxAllowedAmount, fee: quote }), !initialSettings?.hideFrom && !initialSettings?.hideTo &&
59
+ _jsx(ValueSwapperButton, { values: values, setValues: setValues, providers: providers, query: initialSettings }), !(initialSettings?.hideTo && values?.to) && _jsx(DestinationPicker, { isFeeLoading: isQuoteLoading, fee: quote, partner: partner })] }), _jsxs("div", { children: [Number(values.amount) > 0 &&
60
+ _jsx(ReserveGasNote, { maxAllowedAmount: maxAllowedAmount, minAllowedAmount: minAllowedAmount, onSubmit: handleReserveGas }), values.toAsset?.refuel && !initialSettings.hideRefuel &&
61
+ _jsx(RefuelToggle, { quote: quote, onButtonClick: () => setOpenRefuelModal(true) }), routeValidation.message
62
+ ? _jsx("div", { className: "mt-3", children: _jsx(ValidationError, {}) })
63
+ : null, _jsx(QuoteDetails, { swapValues: values, quote: quote?.quote, reward: quote?.reward, isQuoteLoading: isQuoteLoading })] })] }) }), _jsx(Widget.Footer, { showPoweredBy: true, children: _jsx(FormButton, { shouldConnectWallet: shouldConnectWallet, values: values, disabled: !isValid || isSubmitting || !quote || isQuoteLoading, error: error, isSubmitting: isSubmitting, partner: partner }) }), _jsx(RefuelModal, { openModal: openRefuelModal, setOpenModal: setOpenRefuelModal, fee: quote }), _jsx(ContractAddressValidationCache, { source_network: source, destination_network: destination, destination_address: values.destination_address })] })] }));
73
64
  };
74
65
  const ValueSwapperButton = ({ values, setValues, providers, query }) => {
75
66
  const [animate, cycle] = useCycle({ rotateX: 0 }, { rotateX: 180 });
@@ -12,6 +12,6 @@ const FormButton = ({ shouldConnectWallet, values, disabled, error, isSubmitting
12
12
  if (values?.to && !values?.destination_address && !error) {
13
13
  return (_jsx(Address, { partner: partner, children: () => (_jsx(SubmitButton, { type: "button", className: "w-full", children: _jsx("span", { className: "grow text-center", children: "Enter destination address" }) })) }));
14
14
  }
15
- return (_jsx(SubmitButton, { className: "plausible-event-name=Swap+initiated", type: "submit", isDisabled: disabled, isSubmitting: isSubmitting, children: actionDisplayName }));
15
+ return (_jsx(SubmitButton, { type: "submit", isDisabled: disabled, isSubmitting: isSubmitting, children: actionDisplayName }));
16
16
  };
17
17
  export default FormButton;
@@ -4,7 +4,7 @@ import { useFormikContext } from "formik";
4
4
  import { truncateDecimals } from "../../../../../components/utils/RoundDecimals";
5
5
  import { useBalance } from "../../../../../lib/balances/useBalance";
6
6
  import useSWRGas from "../../../../../lib/gases/useSWRGas";
7
- import { useSelectedAccount } from "../../../../../context/balanceAccounts";
7
+ import { useSelectedAccount } from "../../../../../context/swapAccounts";
8
8
  const ReserveGasNote = ({ onSubmit, minAllowedAmount, maxAllowedAmount }) => {
9
9
  const { values, } = useFormikContext();
10
10
  const selectedSourceAccount = useSelectedAccount("from", values.from?.name);
@@ -13,14 +13,16 @@ const ReserveGasNote = ({ onSubmit, minAllowedAmount, maxAllowedAmount }) => {
13
13
  const nativeTokenBalance = balances?.find(b => b.token == values?.from?.token?.symbol);
14
14
  const mightBeOutOfGas = !!(nativeTokenBalance?.amount && !!(gasData && nativeTokenBalance?.isNativeCurrency && (Number(values.amount)
15
15
  + gasData.gas) > nativeTokenBalance.amount
16
- && minAllowedAmount
16
+ && minAllowedAmount && maxAllowedAmount && values.amount
17
+ && values.fromAsset?.symbol === values.from?.token?.symbol
17
18
  && nativeTokenBalance.amount > minAllowedAmount
19
+ && !(Number(values.amount) > nativeTokenBalance.amount)
18
20
  && !(maxAllowedAmount && (nativeTokenBalance.amount > (maxAllowedAmount + gasData.gas)))));
19
21
  const gasToReserveFormatted = mightBeOutOfGas ? truncateDecimals(gasData.gas, values?.fromAsset?.precision) : '';
20
22
  return (_jsx(_Fragment, { children: mightBeOutOfGas && gasToReserveFormatted ?
21
- ((Number(nativeTokenBalance.amount) < Number(gasData)) ?
22
- _jsx(WarningMessage, { messageType: "warning", children: _jsx("div", { className: "font-normal text-primary-text", children: "You don't have enough funds to cover gas fees." }) })
23
- :
24
- _jsx(WarningMessage, { messageType: "warning", children: _jsxs("div", { className: "font-normal text-primary-text", children: [_jsx("div", { children: "You might not be able to complete the transaction." }), _jsxs("div", { onClick: () => onSubmit(nativeTokenBalance, gasData.gas), className: "cursor-pointer border-b border-dotted border-primary-text w-fit hover:text-primary hover:border-primary text-primary-text", children: [_jsx("span", { children: "Reserve" }), " ", _jsx("span", { children: gasToReserveFormatted }), " ", _jsx("span", { children: values?.fromAsset?.symbol }), " ", _jsx("span", { children: "for gas." })] })] }) })) : null }));
23
+ (_jsx("div", { className: "mt-3", children: (Number(nativeTokenBalance.amount) < Number(gasData.gas)) ?
24
+ _jsx(WarningMessage, { messageType: "warning", children: _jsx("div", { className: "font-normal text-primary-text", children: "You don't have enough funds to cover gas fees." }) })
25
+ :
26
+ _jsx(WarningMessage, { messageType: "warning", children: _jsxs("div", { className: "font-normal text-primary-text", children: [_jsx("div", { children: "You might not be able to complete the transaction." }), _jsxs("div", { onClick: () => onSubmit(nativeTokenBalance, gasData.gas), className: "cursor-pointer border-b border-dotted border-primary-text w-fit hover:text-primary hover:border-primary text-primary-text", children: [_jsx("span", { children: "Reserve" }), " ", _jsx("span", { children: gasToReserveFormatted }), " ", _jsx("span", { children: nativeTokenBalance?.token }), " ", _jsx("span", { children: "for gas." })] })] }) }) })) : null }));
25
27
  };
26
28
  export default ReserveGasNote;
@@ -0,0 +1,19 @@
1
+ import { useEffect } from 'react';
2
+ import { useContractAddressStore } from '../../../../../../stores/contractAddressStore';
3
+ const ContractAddressValidationCache = ({ source_network, destination_network, destination_address }) => {
4
+ const { isContractInNetwork, } = useContractAddressStore();
5
+ useEffect(() => {
6
+ //perform check for source network
7
+ if (destination_address && source_network && source_network.type === 'evm') {
8
+ isContractInNetwork(destination_address, source_network.name);
9
+ }
10
+ }, [destination_address, source_network?.name, isContractInNetwork]);
11
+ useEffect(() => {
12
+ //perform check for destination network
13
+ if (destination_address && destination_network && destination_network.type === 'evm') {
14
+ isContractInNetwork(destination_address, destination_network.name);
15
+ }
16
+ }, [destination_address, destination_network?.name, isContractInNetwork]);
17
+ return null;
18
+ };
19
+ export default ContractAddressValidationCache;
@@ -1,20 +1,24 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useCallback } from 'react';
2
+ import { useCallback, useEffect } from 'react';
3
3
  import { useSwapDataState } from '../../../../context/swap';
4
4
  import { useIntercom } from 'react-use-intercom';
5
5
  import { SwapStatus } from '../../../../Models/SwapStatus';
6
6
  import QuestionIcon from '../../../../components/Icons/Question';
7
- // import { posthog } from 'posthog-js';
7
+ import { ErrorHandler } from '../../../../lib/ErrorHandler';
8
8
  const Failed = () => {
9
9
  const { swapDetails } = useSwapDataState();
10
10
  const { boot, show, update } = useIntercom();
11
11
  const updateWithProps = () => update({ customAttributes: { swapId: swapDetails?.id } });
12
- // useEffect(() => {
13
- // posthog.capture('Swap failed', {
14
- // swapId: swapDetails?.id ?? null,
15
- // path: typeof window !== 'undefined' ? window.location.pathname : undefined,
16
- // });
17
- // }, []);
12
+ useEffect(() => {
13
+ const error = new Error(`Swap failed: ${swapDetails?.id}`);
14
+ ErrorHandler({
15
+ type: "SwapFailed",
16
+ message: error.message,
17
+ name: error.name,
18
+ stack: error.stack,
19
+ cause: error.cause
20
+ });
21
+ }, [swapDetails?.id]);
18
22
  const startIntercom = useCallback(() => {
19
23
  boot();
20
24
  show();
@@ -23,11 +23,15 @@ import { truncateDecimals } from '../../../../components/utils/RoundDecimals';
23
23
  import { addressFormat } from '../../../../lib/address/formatter';
24
24
  import { isValidAddress } from '../../../../lib/address/validator';
25
25
  import { ExtendedAddress } from '../../../../components/Input/Address/AddressPicker/AddressWithIcon';
26
- const ManualWithdraw = ({ swapBasicData, quote, depositActions, refuel, partner, type }) => {
26
+ import QuoteDetails from '../Form/FeeDetails';
27
+ const ManualWithdraw = ({ swapBasicData, depositActions, refuel, partner, type, quote, isQuoteLoading }) => {
27
28
  const { wallets } = useWallet();
28
29
  const { createSwap, setSwapId } = useSwapDataUpdate();
29
30
  const [isPopoverOpen, setIsPopoverOpen] = useState(false);
30
- const [newNetwork, setNewNetwork] = useState(null);
31
+ const [selectedFrom, setSelectedFrom] = useState({
32
+ network: swapBasicData?.source_network ?? null,
33
+ token: swapBasicData?.source_token ?? null,
34
+ });
31
35
  const [loading, setLoading] = useState(false);
32
36
  const { getConfirmation } = useAsyncModal();
33
37
  const [showQR, setShowQR] = useState(false);
@@ -43,8 +47,23 @@ const ManualWithdraw = ({ swapBasicData, quote, depositActions, refuel, partner,
43
47
  copy(depositAddress);
44
48
  }
45
49
  };
50
+ const swapValues = useMemo(() => {
51
+ const fromNetwork = (selectedFrom.network ?? swapBasicData?.source_network);
52
+ const fromToken = selectedFrom.token ?? swapBasicData?.source_token;
53
+ return {
54
+ amount: swapBasicData?.requested_amount?.toString(),
55
+ from: fromNetwork,
56
+ to: swapBasicData?.destination_network,
57
+ fromAsset: fromToken,
58
+ toAsset: swapBasicData?.destination_token,
59
+ refuel: !!refuel,
60
+ destination_address: swapBasicData?.destination_address,
61
+ fromExchange: swapBasicData?.source_exchange,
62
+ depositMethod: 'deposit_address',
63
+ };
64
+ }, [selectedFrom.network, selectedFrom.token, swapBasicData, refuel]);
46
65
  const handleClick = async (network, token) => {
47
- const swapValues = {
66
+ const nextSwapValues = {
48
67
  amount: swapBasicData?.requested_amount?.toString(),
49
68
  from: network,
50
69
  to: swapBasicData?.destination_network,
@@ -58,17 +77,17 @@ const ManualWithdraw = ({ swapBasicData, quote, depositActions, refuel, partner,
58
77
  try {
59
78
  setLoading(true);
60
79
  await handleLimitsUpdate({
61
- swapValues,
80
+ swapValues: nextSwapValues,
62
81
  network,
63
82
  token,
64
83
  getConfirmation
65
84
  });
66
- const swapData = await createSwap(swapValues, initialSettings);
67
- setNewNetwork(network);
85
+ const swapData = await createSwap(nextSwapValues, initialSettings);
68
86
  const swapId = swapData?.swap?.id;
69
87
  if (!swapId)
70
88
  throw new Error('Swap ID is undefined');
71
89
  setSwapId(swapId);
90
+ setSelectedFrom({ network, token });
72
91
  setIsPopoverOpen(false);
73
92
  }
74
93
  catch (e) {
@@ -86,13 +105,13 @@ const ManualWithdraw = ({ swapBasicData, quote, depositActions, refuel, partner,
86
105
  const { networks: withdrawalNetworks, isLoading: exchangeSourceNetworksLoading } = useExchangeNetworks(exchangeNetworkParams);
87
106
  const requestAmount = (_jsxs("span", { className: 'inline-flex items-center gap-1 px-1.5 mx-1 bg-secondary-300 rounded-lg', children: [_jsx("span", { children: truncateDecimals(Number(swapBasicData?.requested_amount), swapBasicData?.source_token?.precision) }), " ", _jsx("span", { children: swapBasicData?.source_token?.symbol }), _jsx(CopyButton, { toCopy: swapBasicData?.requested_amount, iconClassName: 'text-secondary-text' })] }));
88
107
  const destinationNetwork = (_jsxs("span", { className: 'flex items-center gap-1', children: [destinationLogo && _jsx(ImageWithFallback, { src: destinationLogo, alt: "Project Logo", height: "16", width: "16", loading: "eager", className: "rounded-md object-contain" }), swapBasicData?.destination_network?.display_name] }));
89
- const sourceNetworkPopover = (_jsxs(Popover, { open: isPopoverOpen, onOpenChange: setIsPopoverOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { className: "inline-flex items-center gap-1 px-1.5 mx-1 bg-secondary-300 rounded-lg", children: [_jsx(ImageWithFallback, { src: newNetwork?.logo || swapBasicData?.source_network?.logo, alt: "Project Logo", height: "16", width: "16", loading: "eager", className: "rounded-sm object-contain" }), _jsx("span", { children: newNetwork?.display_name || swapBasicData?.source_network?.display_name }), _jsx("span", { className: "pointer-events-none text-shadow-primary-text-tertiary", children: _jsx(ChevronDown, { className: "h-3.5 w-3.5 text-secondary-text", "aria-hidden": "true" }) })] }) }), _jsx(PopoverContent, { side: 'top', className: "bg-secondary-300! space-y-1 p-1! rounded-lg!", children: _jsx(CommandWrapper, { children: _jsx(CommandList, { children: withdrawalNetworks?.map((item) => {
108
+ const sourceNetworkPopover = (_jsxs(Popover, { open: isPopoverOpen, onOpenChange: setIsPopoverOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { className: "inline-flex items-center gap-1 px-1.5 mx-1 bg-secondary-300 rounded-lg", children: [_jsx(ImageWithFallback, { src: selectedFrom.network?.logo ?? swapBasicData?.source_network?.logo, alt: "Project Logo", height: "16", width: "16", loading: "eager", className: "rounded-sm object-contain" }), _jsx("span", { children: selectedFrom.network?.display_name ?? swapBasicData?.source_network?.display_name }), _jsx("span", { className: "pointer-events-none text-shadow-primary-text-tertiary", children: _jsx(ChevronDown, { className: "h-3.5 w-3.5 text-secondary-text", "aria-hidden": "true" }) })] }) }), _jsx(PopoverContent, { side: 'top', className: "bg-secondary-300! space-y-1 p-1! rounded-lg!", children: _jsx(CommandWrapper, { children: _jsx(CommandList, { children: withdrawalNetworks?.map((item) => {
90
109
  return (_jsx(CommandItem, { className: 'hover:bg-secondary-100 rounded-md p-1! cursor-pointer', value: item.network.name, onSelect: () => handleClick(item.network, item.token), children: _jsx("div", { className: `flex items-center justify-between w-full overflow-hidden`, children: _jsxs("div", { className: `gap-2 relative flex items-center w-full space-y-1`, children: [_jsx("div", { className: `h-6 w-6 shrink-0 mb-0!`, children: item.network.logo && (_jsx(ImageWithFallback, { src: item.network.logo, alt: "Project Logo", height: "24", width: "24", loading: "eager", className: "rounded-md object-contain" })) }), _jsx("div", { className: "flex justify-between w-full items-center", children: _jsx("span", { className: "flex items-center pb-0.5 text-sm font-medium text-primary-text pr-20", children: item.network.display_name }) })] }) }) }, item.network.name));
91
110
  }) }) }) })] }));
92
- return (_jsxs(_Fragment, { children: [_jsx(Widget.Content, { children: _jsx("div", { className: 'flex flex-col flex-1 h-full min-h-0 w-full space-y-3', children: (loading || exchangeSourceNetworksLoading) ? (_jsxs(_Fragment, { children: [_jsx(SkeletonStep, { number: 1 }), _jsx(SkeletonStep, { number: 2 }), _jsx(SkeletonStep, { number: 3 })] })) : (_jsxs(_Fragment, { children: [_jsx(Step, { number: 1, label: _jsxs("div", { className: "flex items-center justify-between gap-2 relative", children: [_jsx("span", { children: "Copy the deposit address" }), _jsx("div", { className: "relative", children: _jsxs(Popover, { open: showQR, onOpenChange: setShowQR, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx("div", { className: "relative", children: _jsx(QRIcon, { className: "bg-secondary-300 p-1 rounded-lg cursor-pointer hover:opacity-80 fill-primary-text text-primary-text" }) }) }), _jsx(PopoverContent, { side: "left", align: "start", className: "bg-secondary-300 p-2 rounded-xl z-50", children: _jsx("div", { className: "bg-white p-2 rounded-xl shadow-lg", children: _jsx(QRCodeSVG, { className: "rounded-lg", value: depositAddress || '', includeMargin: true, size: 160, level: "H" }) }) })] }) })] }), value: _jsx("span", { className: "cursor-pointer hover:underline min-h-5 block", children: depositAddress ? (_jsxs("span", { className: 'flex items-center gap-1', children: [shortenAddress(depositAddress), _jsx(CopyButton, { toCopy: depositAddress || '', className: 'flex' })] })) : (_jsx("span", { className: "inline-block w-28 bg-secondary-400 h-5 rounded animate-pulse" })) }) }), _jsx(Step, { number: 2, label: _jsxs("span", { children: [_jsxs("span", { className: 'inline-flex items-center', children: [_jsx("span", { children: "Send" }), requestAmount] }), _jsx("span", { children: "via" }), swapBasicData?.source_exchange ? (_jsx("span", { className: "inline-flex items-center align-bottom", children: sourceNetworkPopover })) : (_jsxs("span", { className: "inline-flex items-center gap-1 mx-1 h-6 align-bottom", children: [_jsx(ImageWithFallback, { src: swapBasicData?.source_network?.logo, alt: "Project Logo", height: "16", width: "16", loading: "eager", className: "rounded-sm object-contain" }), _jsx("span", { children: swapBasicData?.source_network?.display_name })] })), _jsx("span", { children: "to the deposit address" })] }) }), _jsx(Step, { number: 3, label: _jsxs("span", { className: 'flex items-center gap-1', children: [_jsx("span", { children: "Receive" }), " ", _jsx("span", { children: truncateDecimals(quote?.receive_amount ?? 0, swapBasicData?.destination_token?.precision) }), " ", _jsx("span", { children: swapBasicData?.destination_token?.symbol }), " ", _jsx("span", { children: "at" }), " ", _jsx("span", { children: destinationNetwork })] }), value: _jsxs("span", { className: "cursor-pointer hover:underline flex items-center gap-1", children: [WalletIcon ? (_jsx(WalletIcon, { className: "w-4 h-4 bg-secondary-700 rounded-sm" })) : addressProviderIcon ? (_jsx(ImageWithFallback, { alt: "Partner logo", className: "h-4 w-4 rounded-md object-contain", src: partner.logo, width: "36", height: "36" })) : (_jsx(AddressIcon, { className: "h-4 w-4", address: swapBasicData.destination_address, size: 36, rounded: "4px" })), ((swapBasicData?.destination_network && isValidAddress(swapBasicData?.destination_address, swapBasicData?.destination_network)) ?
111
+ return (_jsxs(_Fragment, { children: [_jsx(Widget.Content, { children: _jsx("div", { className: 'flex flex-col flex-1 h-full min-h-0 w-full space-y-3', children: (loading || exchangeSourceNetworksLoading) ? (_jsxs(_Fragment, { children: [_jsx(SkeletonStep, { number: 1 }), _jsx(SkeletonStep, { number: 2 }), _jsx(SkeletonStep, { number: 3 })] })) : (_jsxs(_Fragment, { children: [_jsx(Step, { number: 1, label: _jsxs("div", { className: "flex items-center justify-between gap-2 relative", children: [_jsx("span", { children: "Copy the deposit address" }), _jsx("div", { className: "relative", children: _jsxs(Popover, { open: showQR, onOpenChange: setShowQR, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx("div", { className: "relative", children: _jsx(QRIcon, { className: "bg-secondary-300 p-1 rounded-lg cursor-pointer hover:opacity-80 fill-primary-text text-primary-text" }) }) }), _jsx(PopoverContent, { side: "left", align: "start", className: "bg-secondary-300 p-2 rounded-xl z-50", children: _jsx("div", { className: "bg-white p-2 rounded-xl shadow-lg", children: _jsx(QRCodeSVG, { className: "rounded-lg", value: depositAddress || '', includeMargin: true, size: 160, level: "H" }) }) })] }) })] }), value: _jsx("span", { className: "cursor-pointer hover:underline min-h-5 block", children: depositAddress ? (_jsxs("span", { className: 'flex items-center gap-1', children: [shortenAddress(depositAddress), _jsx(CopyButton, { toCopy: depositAddress || '', className: 'flex' })] })) : (_jsx("span", { className: "inline-block w-28 bg-secondary-400 h-5 rounded animate-pulse" })) }) }), _jsx(Step, { number: 2, label: _jsxs("span", { children: [_jsxs("span", { className: 'inline-flex items-center', children: [_jsx("span", { children: "Send" }), requestAmount] }), _jsx("span", { children: "via" }), swapBasicData?.source_exchange ? (_jsx("span", { className: "inline-flex items-center align-bottom max-sm:mt-1", children: sourceNetworkPopover })) : (_jsxs("span", { className: "inline-flex items-center gap-1 mx-1 h-6 align-bottom", children: [_jsx(ImageWithFallback, { src: swapBasicData?.source_network?.logo, alt: "Project Logo", height: "16", width: "16", loading: "eager", className: "rounded-sm object-contain" }), _jsx("span", { children: swapBasicData?.source_network?.display_name })] })), _jsx("span", { children: "to the deposit address" })] }) }), _jsx(Step, { number: 3, label: _jsxs("span", { className: 'flex items-center gap-1', children: [_jsx("span", { children: "Receive" }), " ", _jsx("span", { children: truncateDecimals(quote?.receive_amount ?? 0, swapBasicData?.destination_token?.precision) }), " ", _jsx("span", { children: swapBasicData?.destination_token?.symbol }), " ", _jsx("span", { children: "at" }), " ", _jsx("span", { children: destinationNetwork })] }), value: _jsxs("span", { className: "cursor-pointer hover:underline flex items-center gap-1", children: [WalletIcon ? (_jsx(WalletIcon, { className: "w-4 h-4 bg-secondary-700 rounded-sm" })) : addressProviderIcon ? (_jsx(ImageWithFallback, { alt: "Partner logo", className: "h-4 w-4 rounded-md object-contain", src: partner.logo, width: "36", height: "36" })) : (_jsx(AddressIcon, { className: "h-4 w-4", address: swapBasicData.destination_address, size: 36, rounded: "4px" })), ((swapBasicData?.destination_network && isValidAddress(swapBasicData?.destination_address, swapBasicData?.destination_network)) ?
93
112
  _jsx("div", { className: "text-sm group/addressItem text-secondary-text", children: _jsx(ExtendedAddress, { address: addressFormat(swapBasicData?.destination_address, swapBasicData?.destination_network), network: swapBasicData?.destination_network, shouldShowChevron: false }) })
94
113
  :
95
- _jsx("p", { className: "text-sm text-secondary-text", children: shortenAddress(swapBasicData?.destination_address) }))] }) })] })) }) }), _jsx(Widget.Footer, { sticky: type == 'widget', children: _jsx(SubmitButton, { onClick: handleCopy, children: copied ? 'Copied!' : 'Copy deposit address' }) })] }));
114
+ _jsx("p", { className: "text-sm text-secondary-text", children: shortenAddress(swapBasicData?.destination_address) }))] }) }), _jsx(QuoteDetails, { swapValues: swapValues, quote: quote, isQuoteLoading: isQuoteLoading, triggerClassnames: 'mt-0!' })] })) }) }), _jsx(Widget.Footer, { sticky: type == 'widget', children: _jsx(SubmitButton, { onClick: handleCopy, children: copied ? 'Copied!' : 'Copy deposit address' }) })] }));
96
115
  };
97
116
  const Step = ({ number, label, value }) => (_jsxs("div", { className: "flex items-start space-x-3 bg-secondary-500 p-3 rounded-xl", children: [_jsx("div", { className: "w-6 h-6 rounded-md bg-secondary-400 text-primary-text flex items-center justify-center text-base font-normal leading-6", children: number }), _jsxs("div", { className: "flex-1", children: [_jsx("div", { className: "font-normal text-base leading-6", children: label }), _jsx("div", { className: "text-sm text-secondary-text", children: value })] })] }));
98
117
  const SkeletonStep = ({ number }) => (_jsxs("div", { className: "flex items-start space-x-3 bg-secondary-500 p-3 rounded-lg animate-pulse", children: [_jsx("div", { className: "w-6 h-6 rounded-md bg-secondary-400 text-primary-text flex items-center justify-center text-base font-normal leading-6", children: number }), _jsxs("div", { className: "flex-1 space-y-3", children: [_jsx("div", { className: "h-5 bg-secondary-300 rounded w-3/4" }), _jsx("div", { className: "h-4 bg-secondary-300 rounded w-1/2" })] })] }));
@@ -1,19 +1,30 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useCallback } from "react";
2
+ import { useCallback, useEffect } from "react";
3
3
  import { useIntercom } from "react-use-intercom";
4
4
  import { Home } from "lucide-react";
5
- import { useBackClickCallback } from "../../../../context/callbackProvider";
5
+ import { useCallbacks } from "../../../../context/callbackProvider";
6
6
  import MessageComponent from "../../../../components/Common/MessageComponent";
7
7
  import NotFoundIcon from "../../../../components/Icons/NotFoundIcon";
8
+ import { ErrorHandler } from "../../../../lib/ErrorHandler";
8
9
  const NotFound = ({ swapId }) => {
9
10
  const { boot, show, update } = useIntercom();
10
11
  const updateWithProps = () => update({ customAttributes: { swapId: swapId } });
11
- const triggerBackClickCallback = useBackClickCallback();
12
+ const { onBackClick } = useCallbacks();
13
+ useEffect(() => {
14
+ const error = new Error(`Swap not found: ${swapId}`);
15
+ ErrorHandler({
16
+ type: "NotFound",
17
+ message: error.message,
18
+ name: error.name,
19
+ stack: error.stack,
20
+ cause: error.cause
21
+ });
22
+ }, [swapId]);
12
23
  const startIntercom = useCallback(() => {
13
24
  boot();
14
25
  show();
15
26
  updateWithProps();
16
27
  }, [boot, show, updateWithProps]);
17
- return _jsxs(MessageComponent, { children: [_jsxs(MessageComponent.Content, { center: true, children: [_jsxs(MessageComponent.Header, { className: "mb-3", children: [_jsx("div", { className: "mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-red-600/20", children: _jsx(NotFoundIcon, {}) }), _jsx("h1", { className: "text-center text-2xl font-semibold text-primary-text", children: "Swap not found" })] }), _jsx(MessageComponent.Description, { children: _jsxs("p", { className: "mx-auto text-center text-base font-normal leading-5 text-secondary-text px-9", children: [_jsx("span", { children: "We couldn't find a swap with this link. If you believe there's an issue, please" }), _jsx("button", { type: "button", onClick: startIntercom, className: "mx-1 underline decoration-gray-400 underline-offset-2 hover:decoration-gray-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-[#0f1420] focus:ring-gray-400 rounded", children: _jsx("span", { children: "contact our support" }) }), _jsx("span", { children: "and we'll help you fix it." })] }) })] }), _jsx(MessageComponent.Buttons, { children: _jsx("div", { className: "flex w-full text-primary-text text-base space-x-2", children: _jsxs("button", { onClick: triggerBackClickCallback, type: "button", className: "w-full inline-flex items-center justify-center gap-2 rounded-xl bg-secondary-300 px-5 py-4 text-base font-semibold leading-6 hover:bg-secondary-400 focus:outline-none transition", children: [_jsx(Home, { className: "h-5 w-5", "aria-hidden": "true" }), _jsx("span", { children: "Back to app" })] }) }) })] });
28
+ return _jsxs(MessageComponent, { children: [_jsxs(MessageComponent.Content, { center: true, children: [_jsxs(MessageComponent.Header, { className: "mb-3", children: [_jsx("div", { className: "mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-red-600/20", children: _jsx(NotFoundIcon, {}) }), _jsx("h1", { className: "text-center text-2xl font-semibold text-primary-text", children: "Swap not found" })] }), _jsx(MessageComponent.Description, { children: _jsxs("p", { className: "mx-auto text-center text-base font-normal leading-5 text-secondary-text px-9", children: [_jsx("span", { children: "We couldn't find a swap with this link. If you believe there's an issue, please" }), _jsx("button", { type: "button", onClick: startIntercom, className: "mx-1 underline decoration-gray-400 underline-offset-2 hover:decoration-gray-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-[#0f1420] focus:ring-gray-400 rounded", children: _jsx("span", { children: "contact our support" }) }), _jsx("span", { children: "and we'll help you fix it." })] }) })] }), _jsx(MessageComponent.Buttons, { children: _jsx("div", { className: "flex w-full text-primary-text text-base space-x-2", children: _jsxs("button", { onClick: onBackClick, type: "button", className: "w-full inline-flex items-center justify-center gap-2 rounded-xl bg-secondary-300 px-5 py-4 text-base font-semibold leading-6 hover:bg-secondary-400 focus:outline-none transition", children: [_jsx(Home, { className: "h-5 w-5", "aria-hidden": "true" }), _jsx("span", { children: "Back to app" })] }) }) })] });
18
29
  };
19
30
  export default NotFound;