thirdweb 5.105.48 → 5.106.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 (535) hide show
  1. package/dist/cjs/exports/react.js +3 -1
  2. package/dist/cjs/exports/react.js.map +1 -1
  3. package/dist/cjs/pay/convert/type.js +26 -43
  4. package/dist/cjs/pay/convert/type.js.map +1 -1
  5. package/dist/cjs/react/core/design-system/index.js +3 -1
  6. package/dist/cjs/react/core/design-system/index.js.map +1 -1
  7. package/dist/cjs/react/core/hooks/usePaymentMethods.js +4 -1
  8. package/dist/cjs/react/core/hooks/usePaymentMethods.js.map +1 -1
  9. package/dist/cjs/react/core/hooks/wallets/useAutoConnect.js +1 -2
  10. package/dist/cjs/react/core/hooks/wallets/useAutoConnect.js.map +1 -1
  11. package/dist/cjs/react/core/machines/paymentMachine.js.map +1 -1
  12. package/dist/cjs/react/native/ui/connect/ExternalWalletsList.js +2 -1
  13. package/dist/cjs/react/native/ui/connect/ExternalWalletsList.js.map +1 -1
  14. package/dist/cjs/react/web/hooks/wallets/useAutoConnect.js +1 -9
  15. package/dist/cjs/react/web/hooks/wallets/useAutoConnect.js.map +1 -1
  16. package/dist/cjs/react/web/ui/Bridge/BridgeOrchestrator.js +7 -5
  17. package/dist/cjs/react/web/ui/Bridge/BridgeOrchestrator.js.map +1 -1
  18. package/dist/cjs/react/web/ui/Bridge/DirectPayment.js +2 -2
  19. package/dist/cjs/react/web/ui/Bridge/ErrorBanner.js +1 -1
  20. package/dist/cjs/react/web/ui/Bridge/FundWallet.js +7 -6
  21. package/dist/cjs/react/web/ui/Bridge/FundWallet.js.map +1 -1
  22. package/dist/cjs/react/web/ui/Bridge/QuoteLoader.js +5 -3
  23. package/dist/cjs/react/web/ui/Bridge/QuoteLoader.js.map +1 -1
  24. package/dist/cjs/react/web/ui/Bridge/StepRunner.js +3 -3
  25. package/dist/cjs/react/web/ui/Bridge/StepRunner.js.map +1 -1
  26. package/dist/cjs/react/web/ui/Bridge/TransactionPayment.js +2 -2
  27. package/dist/cjs/react/web/ui/Bridge/UnsupportedTokenScreen.js +2 -2
  28. package/dist/cjs/react/web/ui/Bridge/UnsupportedTokenScreen.js.map +1 -1
  29. package/dist/cjs/react/web/ui/Bridge/common/TokenAndChain.js +3 -3
  30. package/dist/cjs/react/web/ui/Bridge/common/TokenAndChain.js.map +1 -1
  31. package/dist/cjs/react/web/ui/Bridge/common/WithHeader.js +2 -1
  32. package/dist/cjs/react/web/ui/Bridge/common/WithHeader.js.map +1 -1
  33. package/dist/cjs/react/web/ui/Bridge/payment-details/PaymentDetails.js +28 -3
  34. package/dist/cjs/react/web/ui/Bridge/payment-details/PaymentDetails.js.map +1 -1
  35. package/dist/cjs/react/web/ui/Bridge/payment-selection/FiatProviderSelection.js +16 -22
  36. package/dist/cjs/react/web/ui/Bridge/payment-selection/FiatProviderSelection.js.map +1 -1
  37. package/dist/cjs/react/web/ui/Bridge/payment-selection/PaymentSelection.js +12 -4
  38. package/dist/cjs/react/web/ui/Bridge/payment-selection/PaymentSelection.js.map +1 -1
  39. package/dist/cjs/react/web/ui/Bridge/payment-selection/WalletFiatSelection.js +2 -2
  40. package/dist/cjs/react/web/ui/Bridge/payment-selection/WalletFiatSelection.js.map +1 -1
  41. package/dist/cjs/react/web/ui/Bridge/payment-success/PaymentReceipt.js +1 -1
  42. package/dist/cjs/react/web/ui/Bridge/payment-success/PaymentReceipt.js.map +1 -1
  43. package/dist/cjs/react/web/ui/Bridge/payment-success/SuccessScreen.js +8 -7
  44. package/dist/cjs/react/web/ui/Bridge/payment-success/SuccessScreen.js.map +1 -1
  45. package/dist/cjs/react/web/ui/Bridge/swap-widget/SearchInput.js +22 -0
  46. package/dist/cjs/react/web/ui/Bridge/swap-widget/SearchInput.js.map +1 -0
  47. package/dist/cjs/react/web/ui/Bridge/swap-widget/SelectChainButton.js +20 -0
  48. package/dist/cjs/react/web/ui/Bridge/swap-widget/SelectChainButton.js.map +1 -0
  49. package/dist/cjs/react/web/ui/Bridge/swap-widget/SwapWidget.js +251 -0
  50. package/dist/cjs/react/web/ui/Bridge/swap-widget/SwapWidget.js.map +1 -0
  51. package/dist/cjs/react/web/ui/Bridge/swap-widget/common.js +17 -0
  52. package/dist/cjs/react/web/ui/Bridge/swap-widget/common.js.map +1 -0
  53. package/dist/cjs/react/web/ui/Bridge/swap-widget/hooks.js +22 -0
  54. package/dist/cjs/react/web/ui/Bridge/swap-widget/hooks.js.map +1 -0
  55. package/dist/cjs/react/web/ui/Bridge/swap-widget/select-chain.js +66 -0
  56. package/dist/cjs/react/web/ui/Bridge/swap-widget/select-chain.js.map +1 -0
  57. package/dist/cjs/react/web/ui/Bridge/swap-widget/select-token-ui.js +208 -0
  58. package/dist/cjs/react/web/ui/Bridge/swap-widget/select-token-ui.js.map +1 -0
  59. package/dist/cjs/react/web/ui/Bridge/swap-widget/storage.js +53 -0
  60. package/dist/cjs/react/web/ui/Bridge/swap-widget/storage.js.map +1 -0
  61. package/dist/cjs/react/web/ui/Bridge/swap-widget/swap-ui.js +450 -0
  62. package/dist/cjs/react/web/ui/Bridge/swap-widget/swap-ui.js.map +1 -0
  63. package/dist/cjs/react/web/ui/Bridge/swap-widget/types.js +3 -0
  64. package/dist/cjs/react/web/ui/Bridge/swap-widget/types.js.map +1 -0
  65. package/dist/cjs/react/web/ui/Bridge/swap-widget/use-bridge-chains.js +16 -0
  66. package/dist/cjs/react/web/ui/Bridge/swap-widget/use-bridge-chains.js.map +1 -0
  67. package/dist/cjs/react/web/ui/Bridge/swap-widget/use-tokens.js +68 -0
  68. package/dist/cjs/react/web/ui/Bridge/swap-widget/use-tokens.js.map +1 -0
  69. package/dist/cjs/react/web/ui/Bridge/swap-widget/utils.js +7 -0
  70. package/dist/cjs/react/web/ui/Bridge/swap-widget/utils.js.map +1 -0
  71. package/dist/cjs/react/web/ui/ConnectWallet/ConnectButton.js +14 -1
  72. package/dist/cjs/react/web/ui/ConnectWallet/ConnectButton.js.map +1 -1
  73. package/dist/cjs/react/web/ui/ConnectWallet/Details.js +11 -11
  74. package/dist/cjs/react/web/ui/ConnectWallet/Details.js.map +1 -1
  75. package/dist/cjs/react/web/ui/ConnectWallet/Modal/AllWalletsUI.js +4 -3
  76. package/dist/cjs/react/web/ui/ConnectWallet/Modal/AllWalletsUI.js.map +1 -1
  77. package/dist/cjs/react/web/ui/ConnectWallet/Modal/ConnectEmbed.js +15 -1
  78. package/dist/cjs/react/web/ui/ConnectWallet/Modal/ConnectEmbed.js.map +1 -1
  79. package/dist/cjs/react/web/ui/ConnectWallet/Modal/ConnectModal.js +1 -1
  80. package/dist/cjs/react/web/ui/ConnectWallet/Modal/ConnectModal.js.map +1 -1
  81. package/dist/cjs/react/web/ui/ConnectWallet/NetworkSelector.js +2 -2
  82. package/dist/cjs/react/web/ui/ConnectWallet/NetworkSelector.js.map +1 -1
  83. package/dist/cjs/react/web/ui/ConnectWallet/WalletEntryButton.js +1 -1
  84. package/dist/cjs/react/web/ui/ConnectWallet/WalletEntryButton.js.map +1 -1
  85. package/dist/cjs/react/web/ui/ConnectWallet/WalletSelector.js +7 -8
  86. package/dist/cjs/react/web/ui/ConnectWallet/WalletSelector.js.map +1 -1
  87. package/dist/cjs/react/web/ui/ConnectWallet/WalletTypeRowButton.js +1 -1
  88. package/dist/cjs/react/web/ui/ConnectWallet/WalletTypeRowButton.js.map +1 -1
  89. package/dist/cjs/react/web/ui/ConnectWallet/icons/ArrowUpDownIcon.js +9 -0
  90. package/dist/cjs/react/web/ui/ConnectWallet/icons/ArrowUpDownIcon.js.map +1 -0
  91. package/dist/cjs/react/web/ui/ConnectWallet/icons/WalletDotIcon.js +12 -0
  92. package/dist/cjs/react/web/ui/ConnectWallet/icons/WalletDotIcon.js.map +1 -0
  93. package/dist/cjs/react/web/ui/ConnectWallet/screens/ReceiveFunds.js +1 -1
  94. package/dist/cjs/react/web/ui/ConnectWallet/screens/ReceiveFunds.js.map +1 -1
  95. package/dist/cjs/react/web/ui/ConnectWallet/screens/SendFunds.js +7 -7
  96. package/dist/cjs/react/web/ui/ConnectWallet/screens/SendFunds.js.map +1 -1
  97. package/dist/cjs/react/web/ui/ConnectWallet/screens/SignatureScreen.js +3 -3
  98. package/dist/cjs/react/web/ui/ConnectWallet/screens/SignatureScreen.js.map +1 -1
  99. package/dist/cjs/react/web/ui/ConnectWallet/screens/TokenSelector.js +2 -2
  100. package/dist/cjs/react/web/ui/ConnectWallet/screens/TokenSelector.js.map +1 -1
  101. package/dist/cjs/react/web/ui/TransactionButton/TransactionModal.js +1 -1
  102. package/dist/cjs/react/web/ui/TransactionButton/TransactionModal.js.map +1 -1
  103. package/dist/cjs/react/web/ui/components/DynamicHeight.js +1 -1
  104. package/dist/cjs/react/web/ui/components/DynamicHeight.js.map +1 -1
  105. package/dist/cjs/react/web/ui/components/Img.js +42 -7
  106. package/dist/cjs/react/web/ui/components/Img.js.map +1 -1
  107. package/dist/cjs/react/web/ui/components/Modal.js +10 -10
  108. package/dist/cjs/react/web/ui/components/Modal.js.map +1 -1
  109. package/dist/cjs/react/web/ui/components/OTPInput.js +1 -1
  110. package/dist/cjs/react/web/ui/components/OTPInput.js.map +1 -1
  111. package/dist/cjs/react/web/ui/components/Skeleton.js +1 -0
  112. package/dist/cjs/react/web/ui/components/Skeleton.js.map +1 -1
  113. package/dist/cjs/react/web/ui/components/Spinner.js +2 -1
  114. package/dist/cjs/react/web/ui/components/Spinner.js.map +1 -1
  115. package/dist/cjs/react/web/ui/components/basic.js +11 -5
  116. package/dist/cjs/react/web/ui/components/basic.js.map +1 -1
  117. package/dist/cjs/react/web/ui/components/buttons.js +9 -0
  118. package/dist/cjs/react/web/ui/components/buttons.js.map +1 -1
  119. package/dist/cjs/react/web/ui/components/formElements.js +1 -1
  120. package/dist/cjs/react/web/ui/components/formElements.js.map +1 -1
  121. package/dist/cjs/react/web/ui/components/modalElements.js +1 -1
  122. package/dist/cjs/react/web/ui/components/modalElements.js.map +1 -1
  123. package/dist/cjs/react/web/ui/components/text.js +2 -1
  124. package/dist/cjs/react/web/ui/components/text.js.map +1 -1
  125. package/dist/cjs/react/web/utils/cls.js +17 -0
  126. package/dist/cjs/react/web/utils/cls.js.map +1 -0
  127. package/dist/cjs/react/web/wallets/in-app/InputSelectionUI.js +1 -1
  128. package/dist/cjs/react/web/wallets/in-app/InputSelectionUI.js.map +1 -1
  129. package/dist/cjs/react/web/wallets/shared/ConnectWalletSocialOptions.js +9 -9
  130. package/dist/cjs/react/web/wallets/shared/ConnectWalletSocialOptions.js.map +1 -1
  131. package/dist/cjs/react/web/wallets/shared/ConnectingScreen.js +3 -3
  132. package/dist/cjs/react/web/wallets/shared/ConnectingScreen.js.map +1 -1
  133. package/dist/cjs/react/web/wallets/shared/GuestLogin.js +1 -1
  134. package/dist/cjs/react/web/wallets/shared/GuestLogin.js.map +1 -1
  135. package/dist/cjs/react/web/wallets/shared/OTPLoginUI.js +5 -5
  136. package/dist/cjs/react/web/wallets/shared/OTPLoginUI.js.map +1 -1
  137. package/dist/cjs/react/web/wallets/shared/ScanScreen.js +5 -5
  138. package/dist/cjs/react/web/wallets/shared/ScanScreen.js.map +1 -1
  139. package/dist/cjs/react/web/wallets/shared/SocialLogin.js +1 -1
  140. package/dist/cjs/react/web/wallets/shared/SocialLogin.js.map +1 -1
  141. package/dist/cjs/stories/Bridge/Swap/SelectChain.stories.js +25 -0
  142. package/dist/cjs/stories/Bridge/Swap/SelectChain.stories.js.map +1 -0
  143. package/dist/cjs/stories/Bridge/Swap/SwapWidget.Prefill.stories.js +83 -0
  144. package/dist/cjs/stories/Bridge/Swap/SwapWidget.Prefill.stories.js.map +1 -0
  145. package/dist/cjs/stories/Bridge/Swap/SwapWidget.stories.js +52 -0
  146. package/dist/cjs/stories/Bridge/Swap/SwapWidget.stories.js.map +1 -0
  147. package/dist/cjs/stories/BuyWidget.stories.js +36 -0
  148. package/dist/cjs/stories/BuyWidget.stories.js.map +1 -0
  149. package/dist/cjs/stories/ConnectEmbed.stories.js +90 -0
  150. package/dist/cjs/stories/ConnectEmbed.stories.js.map +1 -0
  151. package/dist/cjs/stories/ConnectWallet/useWalletDetailsModal.stories.js +1 -1
  152. package/dist/cjs/version.js +1 -1
  153. package/dist/cjs/version.js.map +1 -1
  154. package/dist/cjs/wallets/connection/autoConnect.js +0 -9
  155. package/dist/cjs/wallets/connection/autoConnect.js.map +1 -1
  156. package/dist/cjs/wallets/connection/autoConnectCore.js +8 -2
  157. package/dist/cjs/wallets/connection/autoConnectCore.js.map +1 -1
  158. package/dist/cjs/wallets/constants.js +8 -1
  159. package/dist/cjs/wallets/constants.js.map +1 -1
  160. package/dist/cjs/wallets/manager/index.js +1 -2
  161. package/dist/cjs/wallets/manager/index.js.map +1 -1
  162. package/dist/esm/exports/react.js +1 -0
  163. package/dist/esm/exports/react.js.map +1 -1
  164. package/dist/esm/pay/convert/type.js +26 -43
  165. package/dist/esm/pay/convert/type.js.map +1 -1
  166. package/dist/esm/react/core/design-system/index.js +3 -1
  167. package/dist/esm/react/core/design-system/index.js.map +1 -1
  168. package/dist/esm/react/core/hooks/usePaymentMethods.js +4 -1
  169. package/dist/esm/react/core/hooks/usePaymentMethods.js.map +1 -1
  170. package/dist/esm/react/core/hooks/wallets/useAutoConnect.js +1 -2
  171. package/dist/esm/react/core/hooks/wallets/useAutoConnect.js.map +1 -1
  172. package/dist/esm/react/core/machines/paymentMachine.js.map +1 -1
  173. package/dist/esm/react/native/ui/connect/ExternalWalletsList.js +2 -1
  174. package/dist/esm/react/native/ui/connect/ExternalWalletsList.js.map +1 -1
  175. package/dist/esm/react/web/hooks/wallets/useAutoConnect.js +1 -9
  176. package/dist/esm/react/web/hooks/wallets/useAutoConnect.js.map +1 -1
  177. package/dist/esm/react/web/ui/Bridge/BridgeOrchestrator.js +7 -5
  178. package/dist/esm/react/web/ui/Bridge/BridgeOrchestrator.js.map +1 -1
  179. package/dist/esm/react/web/ui/Bridge/DirectPayment.js +2 -2
  180. package/dist/esm/react/web/ui/Bridge/ErrorBanner.js +1 -1
  181. package/dist/esm/react/web/ui/Bridge/FundWallet.js +7 -6
  182. package/dist/esm/react/web/ui/Bridge/FundWallet.js.map +1 -1
  183. package/dist/esm/react/web/ui/Bridge/QuoteLoader.js +5 -3
  184. package/dist/esm/react/web/ui/Bridge/QuoteLoader.js.map +1 -1
  185. package/dist/esm/react/web/ui/Bridge/StepRunner.js +3 -3
  186. package/dist/esm/react/web/ui/Bridge/StepRunner.js.map +1 -1
  187. package/dist/esm/react/web/ui/Bridge/TransactionPayment.js +2 -2
  188. package/dist/esm/react/web/ui/Bridge/UnsupportedTokenScreen.js +2 -2
  189. package/dist/esm/react/web/ui/Bridge/UnsupportedTokenScreen.js.map +1 -1
  190. package/dist/esm/react/web/ui/Bridge/common/TokenAndChain.js +3 -3
  191. package/dist/esm/react/web/ui/Bridge/common/TokenAndChain.js.map +1 -1
  192. package/dist/esm/react/web/ui/Bridge/common/WithHeader.js +2 -1
  193. package/dist/esm/react/web/ui/Bridge/common/WithHeader.js.map +1 -1
  194. package/dist/esm/react/web/ui/Bridge/payment-details/PaymentDetails.js +28 -3
  195. package/dist/esm/react/web/ui/Bridge/payment-details/PaymentDetails.js.map +1 -1
  196. package/dist/esm/react/web/ui/Bridge/payment-selection/FiatProviderSelection.js +16 -22
  197. package/dist/esm/react/web/ui/Bridge/payment-selection/FiatProviderSelection.js.map +1 -1
  198. package/dist/esm/react/web/ui/Bridge/payment-selection/PaymentSelection.js +12 -4
  199. package/dist/esm/react/web/ui/Bridge/payment-selection/PaymentSelection.js.map +1 -1
  200. package/dist/esm/react/web/ui/Bridge/payment-selection/WalletFiatSelection.js +3 -3
  201. package/dist/esm/react/web/ui/Bridge/payment-selection/WalletFiatSelection.js.map +1 -1
  202. package/dist/esm/react/web/ui/Bridge/payment-success/PaymentReceipt.js +1 -1
  203. package/dist/esm/react/web/ui/Bridge/payment-success/PaymentReceipt.js.map +1 -1
  204. package/dist/esm/react/web/ui/Bridge/payment-success/SuccessScreen.js +9 -8
  205. package/dist/esm/react/web/ui/Bridge/payment-success/SuccessScreen.js.map +1 -1
  206. package/dist/esm/react/web/ui/Bridge/swap-widget/SearchInput.js +19 -0
  207. package/dist/esm/react/web/ui/Bridge/swap-widget/SearchInput.js.map +1 -0
  208. package/dist/esm/react/web/ui/Bridge/swap-widget/SelectChainButton.js +17 -0
  209. package/dist/esm/react/web/ui/Bridge/swap-widget/SelectChainButton.js.map +1 -0
  210. package/dist/esm/react/web/ui/Bridge/swap-widget/SwapWidget.js +247 -0
  211. package/dist/esm/react/web/ui/Bridge/swap-widget/SwapWidget.js.map +1 -0
  212. package/dist/esm/react/web/ui/Bridge/swap-widget/common.js +14 -0
  213. package/dist/esm/react/web/ui/Bridge/swap-widget/common.js.map +1 -0
  214. package/dist/esm/react/web/ui/Bridge/swap-widget/hooks.js +19 -0
  215. package/dist/esm/react/web/ui/Bridge/swap-widget/hooks.js.map +1 -0
  216. package/dist/esm/react/web/ui/Bridge/swap-widget/select-chain.js +62 -0
  217. package/dist/esm/react/web/ui/Bridge/swap-widget/select-chain.js.map +1 -0
  218. package/dist/esm/react/web/ui/Bridge/swap-widget/select-token-ui.js +205 -0
  219. package/dist/esm/react/web/ui/Bridge/swap-widget/select-token-ui.js.map +1 -0
  220. package/dist/esm/react/web/ui/Bridge/swap-widget/storage.js +49 -0
  221. package/dist/esm/react/web/ui/Bridge/swap-widget/storage.js.map +1 -0
  222. package/dist/esm/react/web/ui/Bridge/swap-widget/swap-ui.js +447 -0
  223. package/dist/esm/react/web/ui/Bridge/swap-widget/swap-ui.js.map +1 -0
  224. package/dist/esm/react/web/ui/Bridge/swap-widget/types.js +2 -0
  225. package/dist/esm/react/web/ui/Bridge/swap-widget/types.js.map +1 -0
  226. package/dist/esm/react/web/ui/Bridge/swap-widget/use-bridge-chains.js +13 -0
  227. package/dist/esm/react/web/ui/Bridge/swap-widget/use-bridge-chains.js.map +1 -0
  228. package/dist/esm/react/web/ui/Bridge/swap-widget/use-tokens.js +64 -0
  229. package/dist/esm/react/web/ui/Bridge/swap-widget/use-tokens.js.map +1 -0
  230. package/dist/esm/react/web/ui/Bridge/swap-widget/utils.js +4 -0
  231. package/dist/esm/react/web/ui/Bridge/swap-widget/utils.js.map +1 -0
  232. package/dist/esm/react/web/ui/ConnectWallet/ConnectButton.js +14 -1
  233. package/dist/esm/react/web/ui/ConnectWallet/ConnectButton.js.map +1 -1
  234. package/dist/esm/react/web/ui/ConnectWallet/Details.js +11 -11
  235. package/dist/esm/react/web/ui/ConnectWallet/Details.js.map +1 -1
  236. package/dist/esm/react/web/ui/ConnectWallet/Modal/AllWalletsUI.js +4 -3
  237. package/dist/esm/react/web/ui/ConnectWallet/Modal/AllWalletsUI.js.map +1 -1
  238. package/dist/esm/react/web/ui/ConnectWallet/Modal/ConnectEmbed.js +15 -1
  239. package/dist/esm/react/web/ui/ConnectWallet/Modal/ConnectEmbed.js.map +1 -1
  240. package/dist/esm/react/web/ui/ConnectWallet/Modal/ConnectModal.js +1 -1
  241. package/dist/esm/react/web/ui/ConnectWallet/Modal/ConnectModal.js.map +1 -1
  242. package/dist/esm/react/web/ui/ConnectWallet/NetworkSelector.js +2 -2
  243. package/dist/esm/react/web/ui/ConnectWallet/NetworkSelector.js.map +1 -1
  244. package/dist/esm/react/web/ui/ConnectWallet/WalletEntryButton.js +1 -1
  245. package/dist/esm/react/web/ui/ConnectWallet/WalletEntryButton.js.map +1 -1
  246. package/dist/esm/react/web/ui/ConnectWallet/WalletSelector.js +8 -9
  247. package/dist/esm/react/web/ui/ConnectWallet/WalletSelector.js.map +1 -1
  248. package/dist/esm/react/web/ui/ConnectWallet/WalletTypeRowButton.js +1 -1
  249. package/dist/esm/react/web/ui/ConnectWallet/WalletTypeRowButton.js.map +1 -1
  250. package/dist/esm/react/web/ui/ConnectWallet/icons/ArrowUpDownIcon.js +5 -0
  251. package/dist/esm/react/web/ui/ConnectWallet/icons/ArrowUpDownIcon.js.map +1 -0
  252. package/dist/esm/react/web/ui/ConnectWallet/icons/WalletDotIcon.js +8 -0
  253. package/dist/esm/react/web/ui/ConnectWallet/icons/WalletDotIcon.js.map +1 -0
  254. package/dist/esm/react/web/ui/ConnectWallet/screens/ReceiveFunds.js +1 -1
  255. package/dist/esm/react/web/ui/ConnectWallet/screens/ReceiveFunds.js.map +1 -1
  256. package/dist/esm/react/web/ui/ConnectWallet/screens/SendFunds.js +7 -7
  257. package/dist/esm/react/web/ui/ConnectWallet/screens/SendFunds.js.map +1 -1
  258. package/dist/esm/react/web/ui/ConnectWallet/screens/SignatureScreen.js +3 -3
  259. package/dist/esm/react/web/ui/ConnectWallet/screens/SignatureScreen.js.map +1 -1
  260. package/dist/esm/react/web/ui/ConnectWallet/screens/TokenSelector.js +2 -2
  261. package/dist/esm/react/web/ui/ConnectWallet/screens/TokenSelector.js.map +1 -1
  262. package/dist/esm/react/web/ui/TransactionButton/TransactionModal.js +1 -1
  263. package/dist/esm/react/web/ui/TransactionButton/TransactionModal.js.map +1 -1
  264. package/dist/esm/react/web/ui/components/DynamicHeight.js +1 -1
  265. package/dist/esm/react/web/ui/components/DynamicHeight.js.map +1 -1
  266. package/dist/esm/react/web/ui/components/Img.js +43 -8
  267. package/dist/esm/react/web/ui/components/Img.js.map +1 -1
  268. package/dist/esm/react/web/ui/components/Modal.js +10 -10
  269. package/dist/esm/react/web/ui/components/Modal.js.map +1 -1
  270. package/dist/esm/react/web/ui/components/OTPInput.js +1 -1
  271. package/dist/esm/react/web/ui/components/OTPInput.js.map +1 -1
  272. package/dist/esm/react/web/ui/components/Skeleton.js +1 -0
  273. package/dist/esm/react/web/ui/components/Skeleton.js.map +1 -1
  274. package/dist/esm/react/web/ui/components/Spinner.js +2 -1
  275. package/dist/esm/react/web/ui/components/Spinner.js.map +1 -1
  276. package/dist/esm/react/web/ui/components/basic.js +11 -5
  277. package/dist/esm/react/web/ui/components/basic.js.map +1 -1
  278. package/dist/esm/react/web/ui/components/buttons.js +9 -0
  279. package/dist/esm/react/web/ui/components/buttons.js.map +1 -1
  280. package/dist/esm/react/web/ui/components/formElements.js +1 -1
  281. package/dist/esm/react/web/ui/components/formElements.js.map +1 -1
  282. package/dist/esm/react/web/ui/components/modalElements.js +1 -1
  283. package/dist/esm/react/web/ui/components/modalElements.js.map +1 -1
  284. package/dist/esm/react/web/ui/components/text.js +2 -1
  285. package/dist/esm/react/web/ui/components/text.js.map +1 -1
  286. package/dist/esm/react/web/utils/cls.js +14 -0
  287. package/dist/esm/react/web/utils/cls.js.map +1 -0
  288. package/dist/esm/react/web/wallets/in-app/InputSelectionUI.js +1 -1
  289. package/dist/esm/react/web/wallets/in-app/InputSelectionUI.js.map +1 -1
  290. package/dist/esm/react/web/wallets/shared/ConnectWalletSocialOptions.js +9 -9
  291. package/dist/esm/react/web/wallets/shared/ConnectWalletSocialOptions.js.map +1 -1
  292. package/dist/esm/react/web/wallets/shared/ConnectingScreen.js +3 -3
  293. package/dist/esm/react/web/wallets/shared/ConnectingScreen.js.map +1 -1
  294. package/dist/esm/react/web/wallets/shared/GuestLogin.js +1 -1
  295. package/dist/esm/react/web/wallets/shared/GuestLogin.js.map +1 -1
  296. package/dist/esm/react/web/wallets/shared/OTPLoginUI.js +5 -5
  297. package/dist/esm/react/web/wallets/shared/OTPLoginUI.js.map +1 -1
  298. package/dist/esm/react/web/wallets/shared/ScanScreen.js +5 -5
  299. package/dist/esm/react/web/wallets/shared/ScanScreen.js.map +1 -1
  300. package/dist/esm/react/web/wallets/shared/SocialLogin.js +1 -1
  301. package/dist/esm/react/web/wallets/shared/SocialLogin.js.map +1 -1
  302. package/dist/esm/stories/Bridge/Swap/SelectChain.stories.js +21 -0
  303. package/dist/esm/stories/Bridge/Swap/SelectChain.stories.js.map +1 -0
  304. package/dist/esm/stories/Bridge/Swap/SwapWidget.Prefill.stories.js +74 -0
  305. package/dist/esm/stories/Bridge/Swap/SwapWidget.Prefill.stories.js.map +1 -0
  306. package/dist/esm/stories/Bridge/Swap/SwapWidget.stories.js +45 -0
  307. package/dist/esm/stories/Bridge/Swap/SwapWidget.stories.js.map +1 -0
  308. package/dist/esm/stories/BuyWidget.stories.js +29 -0
  309. package/dist/esm/stories/BuyWidget.stories.js.map +1 -0
  310. package/dist/esm/stories/ConnectEmbed.stories.js +81 -0
  311. package/dist/esm/stories/ConnectEmbed.stories.js.map +1 -0
  312. package/dist/esm/stories/ConnectWallet/useWalletDetailsModal.stories.js +1 -1
  313. package/dist/esm/version.js +1 -1
  314. package/dist/esm/version.js.map +1 -1
  315. package/dist/esm/wallets/connection/autoConnect.js +0 -9
  316. package/dist/esm/wallets/connection/autoConnect.js.map +1 -1
  317. package/dist/esm/wallets/connection/autoConnectCore.js +8 -2
  318. package/dist/esm/wallets/connection/autoConnectCore.js.map +1 -1
  319. package/dist/esm/wallets/constants.js +7 -0
  320. package/dist/esm/wallets/constants.js.map +1 -1
  321. package/dist/esm/wallets/manager/index.js +1 -2
  322. package/dist/esm/wallets/manager/index.js.map +1 -1
  323. package/dist/types/bridge/types/Chain.d.ts +1 -0
  324. package/dist/types/bridge/types/Chain.d.ts.map +1 -1
  325. package/dist/types/exports/react.d.ts +1 -0
  326. package/dist/types/exports/react.d.ts.map +1 -1
  327. package/dist/types/pay/convert/type.d.ts +27 -3
  328. package/dist/types/pay/convert/type.d.ts.map +1 -1
  329. package/dist/types/react/core/design-system/index.d.ts +2 -0
  330. package/dist/types/react/core/design-system/index.d.ts.map +1 -1
  331. package/dist/types/react/core/hooks/usePaymentMethods.d.ts.map +1 -1
  332. package/dist/types/react/core/hooks/wallets/useAutoConnect.d.ts +1 -1
  333. package/dist/types/react/core/hooks/wallets/useAutoConnect.d.ts.map +1 -1
  334. package/dist/types/react/core/machines/paymentMachine.d.ts +1 -0
  335. package/dist/types/react/core/machines/paymentMachine.d.ts.map +1 -1
  336. package/dist/types/react/native/ui/connect/ExternalWalletsList.d.ts.map +1 -1
  337. package/dist/types/react/web/hooks/wallets/useAutoConnect.d.ts.map +1 -1
  338. package/dist/types/react/web/ui/Bridge/BridgeOrchestrator.d.ts.map +1 -1
  339. package/dist/types/react/web/ui/Bridge/BuyWidget.d.ts +1 -1
  340. package/dist/types/react/web/ui/Bridge/FundWallet.d.ts.map +1 -1
  341. package/dist/types/react/web/ui/Bridge/StepRunner.d.ts +2 -1
  342. package/dist/types/react/web/ui/Bridge/StepRunner.d.ts.map +1 -1
  343. package/dist/types/react/web/ui/Bridge/common/TokenAndChain.d.ts.map +1 -1
  344. package/dist/types/react/web/ui/Bridge/common/WithHeader.d.ts.map +1 -1
  345. package/dist/types/react/web/ui/Bridge/payment-details/PaymentDetails.d.ts +3 -1
  346. package/dist/types/react/web/ui/Bridge/payment-details/PaymentDetails.d.ts.map +1 -1
  347. package/dist/types/react/web/ui/Bridge/payment-selection/FiatProviderSelection.d.ts.map +1 -1
  348. package/dist/types/react/web/ui/Bridge/payment-selection/PaymentSelection.d.ts.map +1 -1
  349. package/dist/types/react/web/ui/Bridge/payment-selection/WalletFiatSelection.d.ts.map +1 -1
  350. package/dist/types/react/web/ui/Bridge/payment-success/PaymentReceipt.d.ts.map +1 -1
  351. package/dist/types/react/web/ui/Bridge/payment-success/SuccessScreen.d.ts.map +1 -1
  352. package/dist/types/react/web/ui/Bridge/swap-widget/SearchInput.d.ts +6 -0
  353. package/dist/types/react/web/ui/Bridge/swap-widget/SearchInput.d.ts.map +1 -0
  354. package/dist/types/react/web/ui/Bridge/swap-widget/SelectChainButton.d.ts +8 -0
  355. package/dist/types/react/web/ui/Bridge/swap-widget/SelectChainButton.d.ts.map +1 -0
  356. package/dist/types/react/web/ui/Bridge/swap-widget/SwapWidget.d.ts +213 -0
  357. package/dist/types/react/web/ui/Bridge/swap-widget/SwapWidget.d.ts.map +1 -0
  358. package/dist/types/react/web/ui/Bridge/swap-widget/common.d.ts +9 -0
  359. package/dist/types/react/web/ui/Bridge/swap-widget/common.d.ts.map +1 -0
  360. package/dist/types/react/web/ui/Bridge/swap-widget/hooks.d.ts +3 -0
  361. package/dist/types/react/web/ui/Bridge/swap-widget/hooks.d.ts.map +1 -0
  362. package/dist/types/react/web/ui/Bridge/swap-widget/select-chain.d.ts +23 -0
  363. package/dist/types/react/web/ui/Bridge/swap-widget/select-chain.d.ts.map +1 -0
  364. package/dist/types/react/web/ui/Bridge/swap-widget/select-token-ui.d.ts +18 -0
  365. package/dist/types/react/web/ui/Bridge/swap-widget/select-token-ui.d.ts.map +1 -0
  366. package/dist/types/react/web/ui/Bridge/swap-widget/storage.d.ts +46 -0
  367. package/dist/types/react/web/ui/Bridge/swap-widget/storage.d.ts.map +1 -0
  368. package/dist/types/react/web/ui/Bridge/swap-widget/swap-ui.d.ts +40 -0
  369. package/dist/types/react/web/ui/Bridge/swap-widget/swap-ui.d.ts.map +1 -0
  370. package/dist/types/react/web/ui/Bridge/swap-widget/types.d.ts +139 -0
  371. package/dist/types/react/web/ui/Bridge/swap-widget/types.d.ts.map +1 -0
  372. package/dist/types/react/web/ui/Bridge/swap-widget/use-bridge-chains.d.ts +4 -0
  373. package/dist/types/react/web/ui/Bridge/swap-widget/use-bridge-chains.d.ts.map +1 -0
  374. package/dist/types/react/web/ui/Bridge/swap-widget/use-tokens.d.ts +44 -0
  375. package/dist/types/react/web/ui/Bridge/swap-widget/use-tokens.d.ts.map +1 -0
  376. package/dist/types/react/web/ui/Bridge/swap-widget/utils.d.ts +2 -0
  377. package/dist/types/react/web/ui/Bridge/swap-widget/utils.d.ts.map +1 -0
  378. package/dist/types/react/web/ui/ConnectWallet/ConnectButton.d.ts +13 -0
  379. package/dist/types/react/web/ui/ConnectWallet/ConnectButton.d.ts.map +1 -1
  380. package/dist/types/react/web/ui/ConnectWallet/Details.d.ts.map +1 -1
  381. package/dist/types/react/web/ui/ConnectWallet/Modal/AllWalletsUI.d.ts.map +1 -1
  382. package/dist/types/react/web/ui/ConnectWallet/Modal/ConnectEmbed.d.ts +13 -0
  383. package/dist/types/react/web/ui/ConnectWallet/Modal/ConnectEmbed.d.ts.map +1 -1
  384. package/dist/types/react/web/ui/ConnectWallet/Modal/ConnectModal.d.ts.map +1 -1
  385. package/dist/types/react/web/ui/ConnectWallet/NetworkSelector.d.ts +1 -0
  386. package/dist/types/react/web/ui/ConnectWallet/NetworkSelector.d.ts.map +1 -1
  387. package/dist/types/react/web/ui/ConnectWallet/WalletEntryButton.d.ts +1 -0
  388. package/dist/types/react/web/ui/ConnectWallet/WalletEntryButton.d.ts.map +1 -1
  389. package/dist/types/react/web/ui/ConnectWallet/WalletSelector.d.ts.map +1 -1
  390. package/dist/types/react/web/ui/ConnectWallet/WalletTypeRowButton.d.ts +1 -0
  391. package/dist/types/react/web/ui/ConnectWallet/WalletTypeRowButton.d.ts.map +1 -1
  392. package/dist/types/react/web/ui/ConnectWallet/icons/ArrowUpDownIcon.d.ts +3 -0
  393. package/dist/types/react/web/ui/ConnectWallet/icons/ArrowUpDownIcon.d.ts.map +1 -0
  394. package/dist/types/react/web/ui/ConnectWallet/icons/WalletDotIcon.d.ts +6 -0
  395. package/dist/types/react/web/ui/ConnectWallet/icons/WalletDotIcon.d.ts.map +1 -0
  396. package/dist/types/react/web/ui/ConnectWallet/screens/ReceiveFunds.d.ts.map +1 -1
  397. package/dist/types/react/web/ui/ConnectWallet/screens/SendFunds.d.ts.map +1 -1
  398. package/dist/types/react/web/ui/ConnectWallet/screens/SignatureScreen.d.ts.map +1 -1
  399. package/dist/types/react/web/ui/ConnectWallet/screens/TokenSelector.d.ts.map +1 -1
  400. package/dist/types/react/web/ui/TransactionButton/TransactionModal.d.ts.map +1 -1
  401. package/dist/types/react/web/ui/components/Img.d.ts +3 -0
  402. package/dist/types/react/web/ui/components/Img.d.ts.map +1 -1
  403. package/dist/types/react/web/ui/components/Modal.d.ts +3 -0
  404. package/dist/types/react/web/ui/components/Modal.d.ts.map +1 -1
  405. package/dist/types/react/web/ui/components/Skeleton.d.ts +1 -0
  406. package/dist/types/react/web/ui/components/Skeleton.d.ts.map +1 -1
  407. package/dist/types/react/web/ui/components/Spinner.d.ts +1 -0
  408. package/dist/types/react/web/ui/components/Spinner.d.ts.map +1 -1
  409. package/dist/types/react/web/ui/components/basic.d.ts +6 -0
  410. package/dist/types/react/web/ui/components/basic.d.ts.map +1 -1
  411. package/dist/types/react/web/ui/components/buttons.d.ts +1 -1
  412. package/dist/types/react/web/ui/components/buttons.d.ts.map +1 -1
  413. package/dist/types/react/web/ui/components/formElements.d.ts +1 -0
  414. package/dist/types/react/web/ui/components/formElements.d.ts.map +1 -1
  415. package/dist/types/react/web/ui/components/modalElements.d.ts.map +1 -1
  416. package/dist/types/react/web/ui/components/text.d.ts +1 -0
  417. package/dist/types/react/web/ui/components/text.d.ts.map +1 -1
  418. package/dist/types/react/web/utils/cls.d.ts +12 -0
  419. package/dist/types/react/web/utils/cls.d.ts.map +1 -0
  420. package/dist/types/react/web/wallets/in-app/InputSelectionUI.d.ts +1 -0
  421. package/dist/types/react/web/wallets/in-app/InputSelectionUI.d.ts.map +1 -1
  422. package/dist/types/react/web/wallets/shared/ConnectWalletSocialOptions.d.ts.map +1 -1
  423. package/dist/types/react/web/wallets/shared/ConnectingScreen.d.ts.map +1 -1
  424. package/dist/types/react/web/wallets/shared/GuestLogin.d.ts.map +1 -1
  425. package/dist/types/react/web/wallets/shared/OTPLoginUI.d.ts.map +1 -1
  426. package/dist/types/react/web/wallets/shared/ScanScreen.d.ts.map +1 -1
  427. package/dist/types/react/web/wallets/shared/SocialLogin.d.ts.map +1 -1
  428. package/dist/types/stories/Bridge/Swap/SelectChain.stories.d.ts +10 -0
  429. package/dist/types/stories/Bridge/Swap/SelectChain.stories.d.ts.map +1 -0
  430. package/dist/types/stories/Bridge/Swap/SwapWidget.Prefill.stories.d.ts +15 -0
  431. package/dist/types/stories/Bridge/Swap/SwapWidget.Prefill.stories.d.ts.map +1 -0
  432. package/dist/types/stories/Bridge/Swap/SwapWidget.stories.d.ts +10 -0
  433. package/dist/types/stories/Bridge/Swap/SwapWidget.stories.d.ts.map +1 -0
  434. package/dist/types/stories/BuyWidget.stories.d.ts +13 -0
  435. package/dist/types/stories/BuyWidget.stories.d.ts.map +1 -0
  436. package/dist/types/stories/ConnectEmbed.stories.d.ts +12 -0
  437. package/dist/types/stories/ConnectEmbed.stories.d.ts.map +1 -0
  438. package/dist/types/version.d.ts +1 -1
  439. package/dist/types/version.d.ts.map +1 -1
  440. package/dist/types/wallets/connection/autoConnect.d.ts.map +1 -1
  441. package/dist/types/wallets/connection/autoConnectCore.d.ts +0 -1
  442. package/dist/types/wallets/connection/autoConnectCore.d.ts.map +1 -1
  443. package/dist/types/wallets/constants.d.ts +2 -0
  444. package/dist/types/wallets/constants.d.ts.map +1 -1
  445. package/dist/types/wallets/manager/index.d.ts.map +1 -1
  446. package/package.json +2 -1
  447. package/src/bridge/types/Chain.ts +2 -0
  448. package/src/exports/react.ts +4 -0
  449. package/src/pay/convert/type.ts +27 -44
  450. package/src/react/core/design-system/index.ts +3 -1
  451. package/src/react/core/hooks/usePaymentMethods.ts +4 -1
  452. package/src/react/core/hooks/wallets/useAutoConnect.ts +0 -2
  453. package/src/react/core/machines/paymentMachine.ts +1 -0
  454. package/src/react/native/ui/connect/ExternalWalletsList.tsx +2 -4
  455. package/src/react/web/hooks/wallets/useAutoConnect.ts +0 -11
  456. package/src/react/web/ui/Bridge/BridgeOrchestrator.tsx +7 -5
  457. package/src/react/web/ui/Bridge/BuyWidget.tsx +1 -1
  458. package/src/react/web/ui/Bridge/DirectPayment.tsx +2 -2
  459. package/src/react/web/ui/Bridge/ErrorBanner.tsx +1 -1
  460. package/src/react/web/ui/Bridge/FundWallet.tsx +9 -8
  461. package/src/react/web/ui/Bridge/QuoteLoader.tsx +6 -3
  462. package/src/react/web/ui/Bridge/StepRunner.tsx +5 -3
  463. package/src/react/web/ui/Bridge/TransactionPayment.tsx +2 -2
  464. package/src/react/web/ui/Bridge/UnsupportedTokenScreen.tsx +2 -2
  465. package/src/react/web/ui/Bridge/common/TokenAndChain.tsx +3 -2
  466. package/src/react/web/ui/Bridge/common/WithHeader.tsx +23 -13
  467. package/src/react/web/ui/Bridge/payment-details/PaymentDetails.tsx +47 -5
  468. package/src/react/web/ui/Bridge/payment-selection/FiatProviderSelection.tsx +89 -83
  469. package/src/react/web/ui/Bridge/payment-selection/PaymentSelection.tsx +16 -7
  470. package/src/react/web/ui/Bridge/payment-selection/WalletFiatSelection.tsx +12 -7
  471. package/src/react/web/ui/Bridge/payment-success/PaymentReceipt.tsx +1 -5
  472. package/src/react/web/ui/Bridge/payment-success/SuccessScreen.tsx +27 -16
  473. package/src/react/web/ui/Bridge/swap-widget/SearchInput.tsx +46 -0
  474. package/src/react/web/ui/Bridge/swap-widget/SelectChainButton.tsx +50 -0
  475. package/src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx +528 -0
  476. package/src/react/web/ui/Bridge/swap-widget/common.tsx +35 -0
  477. package/src/react/web/ui/Bridge/swap-widget/hooks.ts +21 -0
  478. package/src/react/web/ui/Bridge/swap-widget/select-chain.tsx +171 -0
  479. package/src/react/web/ui/Bridge/swap-widget/select-token-ui.tsx +528 -0
  480. package/src/react/web/ui/Bridge/swap-widget/storage.ts +56 -0
  481. package/src/react/web/ui/Bridge/swap-widget/swap-ui.tsx +950 -0
  482. package/src/react/web/ui/Bridge/swap-widget/types.ts +157 -0
  483. package/src/react/web/ui/Bridge/swap-widget/use-bridge-chains.ts +14 -0
  484. package/src/react/web/ui/Bridge/swap-widget/use-tokens.ts +120 -0
  485. package/src/react/web/ui/Bridge/swap-widget/utils.ts +3 -0
  486. package/src/react/web/ui/ConnectWallet/ConnectButton.tsx +15 -0
  487. package/src/react/web/ui/ConnectWallet/Details.test.tsx +1 -1
  488. package/src/react/web/ui/ConnectWallet/Details.tsx +12 -1
  489. package/src/react/web/ui/ConnectWallet/Modal/AllWalletsUI.tsx +9 -3
  490. package/src/react/web/ui/ConnectWallet/Modal/ConnectEmbed.tsx +19 -1
  491. package/src/react/web/ui/ConnectWallet/Modal/ConnectModal.tsx +2 -0
  492. package/src/react/web/ui/ConnectWallet/NetworkSelector.tsx +4 -1
  493. package/src/react/web/ui/ConnectWallet/WalletEntryButton.tsx +2 -0
  494. package/src/react/web/ui/ConnectWallet/WalletSelector.tsx +20 -22
  495. package/src/react/web/ui/ConnectWallet/WalletTypeRowButton.tsx +2 -0
  496. package/src/react/web/ui/ConnectWallet/icons/ArrowUpDownIcon.tsx +23 -0
  497. package/src/react/web/ui/ConnectWallet/icons/WalletDotIcon.tsx +22 -0
  498. package/src/react/web/ui/ConnectWallet/screens/ReceiveFunds.tsx +5 -2
  499. package/src/react/web/ui/ConnectWallet/screens/SendFunds.test.tsx +1 -3
  500. package/src/react/web/ui/ConnectWallet/screens/SendFunds.tsx +19 -4
  501. package/src/react/web/ui/ConnectWallet/screens/SignatureScreen.tsx +13 -3
  502. package/src/react/web/ui/ConnectWallet/screens/TokenSelector.tsx +2 -0
  503. package/src/react/web/ui/TransactionButton/TransactionModal.tsx +2 -0
  504. package/src/react/web/ui/components/DynamicHeight.tsx +1 -1
  505. package/src/react/web/ui/components/Img.tsx +67 -9
  506. package/src/react/web/ui/components/Modal.tsx +17 -12
  507. package/src/react/web/ui/components/OTPInput.tsx +1 -1
  508. package/src/react/web/ui/components/Skeleton.tsx +2 -0
  509. package/src/react/web/ui/components/Spinner.tsx +3 -0
  510. package/src/react/web/ui/components/basic.tsx +17 -3
  511. package/src/react/web/ui/components/buttons.tsx +18 -1
  512. package/src/react/web/ui/components/formElements.tsx +2 -1
  513. package/src/react/web/ui/components/modalElements.tsx +1 -0
  514. package/src/react/web/ui/components/text.tsx +3 -1
  515. package/src/react/web/utils/cls.ts +13 -0
  516. package/src/react/web/wallets/in-app/InputSelectionUI.tsx +2 -0
  517. package/src/react/web/wallets/shared/ConnectWalletSocialOptions.tsx +9 -0
  518. package/src/react/web/wallets/shared/ConnectingScreen.tsx +21 -4
  519. package/src/react/web/wallets/shared/GuestLogin.tsx +6 -1
  520. package/src/react/web/wallets/shared/OTPLoginUI.tsx +35 -6
  521. package/src/react/web/wallets/shared/ScanScreen.tsx +22 -3
  522. package/src/react/web/wallets/shared/SocialLogin.tsx +6 -1
  523. package/src/stories/Bridge/Swap/SelectChain.stories.tsx +51 -0
  524. package/src/stories/Bridge/Swap/SwapWidget.Prefill.stories.tsx +116 -0
  525. package/src/stories/Bridge/Swap/SwapWidget.stories.tsx +71 -0
  526. package/src/stories/BuyWidget.stories.tsx +56 -0
  527. package/src/stories/ConnectEmbed.stories.tsx +128 -0
  528. package/src/stories/ConnectWallet/useWalletDetailsModal.stories.tsx +1 -1
  529. package/src/transaction/prepare-transaction.test.ts +2 -2
  530. package/src/version.ts +1 -1
  531. package/src/wallets/connection/autoConnect.test.ts +0 -3
  532. package/src/wallets/connection/autoConnect.ts +0 -11
  533. package/src/wallets/connection/autoConnectCore.ts +7 -3
  534. package/src/wallets/constants.ts +10 -0
  535. package/src/wallets/manager/index.ts +1 -2
@@ -0,0 +1,950 @@
1
+ import styled from "@emotion/styled";
2
+ import {
3
+ ChevronDownIcon,
4
+ ChevronRightIcon,
5
+ DiscIcon,
6
+ } from "@radix-ui/react-icons";
7
+ import { useQuery } from "@tanstack/react-query";
8
+ import { useState } from "react";
9
+ import type { prepare as BuyPrepare } from "../../../../../bridge/Buy.js";
10
+ import { Buy, Sell } from "../../../../../bridge/index.js";
11
+ import type { prepare as SellPrepare } from "../../../../../bridge/Sell.js";
12
+ import type { BridgeChain } from "../../../../../bridge/types/Chain.js";
13
+ import type { TokenWithPrices } from "../../../../../bridge/types/Token.js";
14
+ import { defineChain } from "../../../../../chains/utils.js";
15
+ import type { ThirdwebClient } from "../../../../../client/client.js";
16
+ import { NATIVE_TOKEN_ADDRESS } from "../../../../../constants/addresses.js";
17
+ import { getToken } from "../../../../../pay/convert/get-token.js";
18
+ import {
19
+ getFiatSymbol,
20
+ type SupportedFiatCurrency,
21
+ } from "../../../../../pay/convert/type.js";
22
+ import { getAddress } from "../../../../../utils/address.js";
23
+ import { toTokens, toUnits } from "../../../../../utils/units.js";
24
+ import { useCustomTheme } from "../../../../core/design-system/CustomThemeProvider.js";
25
+ import {
26
+ fontSize,
27
+ iconSize,
28
+ radius,
29
+ spacing,
30
+ type Theme,
31
+ } from "../../../../core/design-system/index.js";
32
+ import { useWalletBalance } from "../../../../core/hooks/others/useWalletBalance.js";
33
+ import type { BridgePrepareRequest } from "../../../../core/hooks/useBridgePrepare.js";
34
+ import { ConnectButton } from "../../ConnectWallet/ConnectButton.js";
35
+ import { ArrowUpDownIcon } from "../../ConnectWallet/icons/ArrowUpDownIcon.js";
36
+ import { WalletDotIcon } from "../../ConnectWallet/icons/WalletDotIcon.js";
37
+ import { PoweredByThirdweb } from "../../ConnectWallet/PoweredByTW.js";
38
+ import { formatTokenAmount } from "../../ConnectWallet/screens/formatTokenBalance.js";
39
+ import { Container } from "../../components/basic.js";
40
+ import { Button } from "../../components/buttons.js";
41
+ import { Input } from "../../components/formElements.js";
42
+ import { Img } from "../../components/Img.js";
43
+ import { Modal } from "../../components/Modal.js";
44
+ import { Skeleton } from "../../components/Skeleton.js";
45
+ import { Spacer } from "../../components/Spacer.js";
46
+ import { Text } from "../../components/text.js";
47
+ import { DecimalRenderer } from "./common.js";
48
+ import { SelectToken } from "./select-token-ui.js";
49
+ import type {
50
+ ActiveWalletInfo,
51
+ SwapPreparedQuote,
52
+ SwapWidgetConnectOptions,
53
+ TokenSelection,
54
+ } from "./types.js";
55
+ import { useBridgeChains } from "./use-bridge-chains.js";
56
+ import { cleanedChainName } from "./utils.js";
57
+
58
+ type SwapUIProps = {
59
+ activeWalletInfo: ActiveWalletInfo | undefined;
60
+ client: ThirdwebClient;
61
+ theme: Theme | "light" | "dark";
62
+ connectOptions: SwapWidgetConnectOptions | undefined;
63
+ currency: SupportedFiatCurrency;
64
+ showThirdwebBranding: boolean;
65
+ onSwap: (data: {
66
+ result: SwapPreparedQuote;
67
+ request: BridgePrepareRequest;
68
+ buyToken: TokenWithPrices;
69
+ sellTokenBalance: bigint;
70
+ sellToken: TokenWithPrices;
71
+ mode: "buy" | "sell";
72
+ }) => void;
73
+ buyToken: TokenSelection | undefined;
74
+ sellToken: TokenSelection | undefined;
75
+ setBuyToken: (token: TokenSelection | undefined) => void;
76
+ setSellToken: (token: TokenSelection | undefined) => void;
77
+ amountSelection: {
78
+ type: "buy" | "sell";
79
+ amount: string;
80
+ };
81
+ setAmountSelection: (amountSelection: {
82
+ type: "buy" | "sell";
83
+ amount: string;
84
+ }) => void;
85
+ };
86
+
87
+ function useTokenPrice(options: {
88
+ token: TokenSelection | undefined;
89
+ client: ThirdwebClient;
90
+ }) {
91
+ return useQuery({
92
+ queryKey: ["token-price", options.token],
93
+ enabled: !!options.token,
94
+ queryFn: () => {
95
+ if (!options.token) {
96
+ throw new Error("Token is required");
97
+ }
98
+ return getToken(
99
+ options.client,
100
+ options.token.tokenAddress,
101
+ options.token.chainId,
102
+ );
103
+ },
104
+ refetchOnMount: false,
105
+ refetchOnWindowFocus: false,
106
+ });
107
+ }
108
+
109
+ /**
110
+ * @internal
111
+ */
112
+ export function SwapUI(props: SwapUIProps) {
113
+ const [modalState, setModalState] = useState<
114
+ "select-buy-token" | "select-sell-token" | undefined
115
+ >(undefined);
116
+
117
+ // Token Prices ----------------------------------------------------------------------------
118
+ const buyTokenQuery = useTokenPrice({
119
+ token: props.buyToken,
120
+ client: props.client,
121
+ });
122
+ const sellTokenQuery = useTokenPrice({
123
+ token: props.sellToken,
124
+ client: props.client,
125
+ });
126
+
127
+ const buyTokenWithPrices = buyTokenQuery.data;
128
+ const sellTokenWithPrices = sellTokenQuery.data;
129
+
130
+ // Swap Quote ----------------------------------------------------------------------------
131
+ const preparedResultQuery = useSwapQuote({
132
+ amountSelection: props.amountSelection,
133
+ buyTokenWithPrices: buyTokenWithPrices,
134
+ sellTokenWithPrices: sellTokenWithPrices,
135
+ activeWalletInfo: props.activeWalletInfo,
136
+ client: props.client,
137
+ });
138
+
139
+ // Amount and Amount.fetching ------------------------------------------------------------
140
+
141
+ const sellTokenAmount =
142
+ props.amountSelection.type === "sell"
143
+ ? props.amountSelection.amount
144
+ : preparedResultQuery.data &&
145
+ props.amountSelection.type === "buy" &&
146
+ sellTokenWithPrices
147
+ ? toTokens(
148
+ preparedResultQuery.data.result.originAmount,
149
+ sellTokenWithPrices.decimals,
150
+ )
151
+ : "";
152
+
153
+ const buyTokenAmount =
154
+ props.amountSelection.type === "buy"
155
+ ? props.amountSelection.amount
156
+ : preparedResultQuery.data &&
157
+ props.amountSelection.type === "sell" &&
158
+ buyTokenWithPrices
159
+ ? toTokens(
160
+ preparedResultQuery.data.result.destinationAmount,
161
+ buyTokenWithPrices.decimals,
162
+ )
163
+ : "";
164
+
165
+ // when buy amount is set, the sell amount is fetched
166
+ const isBuyAmountFetching =
167
+ props.amountSelection.type === "sell" && preparedResultQuery.isFetching;
168
+ const isSellAmountFetching =
169
+ props.amountSelection.type === "buy" && preparedResultQuery.isFetching;
170
+
171
+ // token balances ------------------------------------------------------------
172
+ const sellTokenBalanceQuery = useTokenBalance({
173
+ chainId: sellTokenWithPrices?.chainId,
174
+ tokenAddress: sellTokenWithPrices?.address,
175
+ client: props.client,
176
+ walletAddress: props.activeWalletInfo?.activeAccount.address,
177
+ });
178
+
179
+ const buyTokenBalanceQuery = useTokenBalance({
180
+ chainId: buyTokenWithPrices?.chainId,
181
+ tokenAddress: buyTokenWithPrices?.address,
182
+ client: props.client,
183
+ walletAddress: props.activeWalletInfo?.activeAccount.address,
184
+ });
185
+
186
+ const notEnoughBalance = !!(
187
+ sellTokenBalanceQuery.data &&
188
+ sellTokenWithPrices &&
189
+ props.amountSelection.amount &&
190
+ !!sellTokenAmount &&
191
+ sellTokenBalanceQuery.data.value <
192
+ Number(toUnits(sellTokenAmount, sellTokenWithPrices.decimals))
193
+ );
194
+
195
+ // ----------------------------------------------------------------------------
196
+
197
+ return (
198
+ <Container p="md">
199
+ <Modal
200
+ className="tw-modal__swap-widget"
201
+ size="compact"
202
+ title="Select Token"
203
+ open={!!modalState}
204
+ crossContainerStyles={{
205
+ right: spacing.md,
206
+ top: spacing["md+"],
207
+ transform: "none",
208
+ }}
209
+ setOpen={(v) => {
210
+ if (!v) {
211
+ setModalState(undefined);
212
+ }
213
+ }}
214
+ >
215
+ {modalState === "select-buy-token" && (
216
+ <SelectToken
217
+ activeWalletInfo={props.activeWalletInfo}
218
+ onBack={() => setModalState(undefined)}
219
+ client={props.client}
220
+ selectedToken={props.buyToken}
221
+ setSelectedToken={(token) => {
222
+ props.setBuyToken(token);
223
+ setModalState(undefined);
224
+ // if buy token is same as sell token, unset sell token
225
+ if (
226
+ props.sellToken &&
227
+ token.tokenAddress.toLowerCase() ===
228
+ props.sellToken.tokenAddress.toLowerCase() &&
229
+ token.chainId === props.sellToken.chainId
230
+ ) {
231
+ props.setSellToken(undefined);
232
+ }
233
+ }}
234
+ />
235
+ )}
236
+
237
+ {modalState === "select-sell-token" && (
238
+ <SelectToken
239
+ onBack={() => setModalState(undefined)}
240
+ client={props.client}
241
+ selectedToken={props.sellToken}
242
+ setSelectedToken={(token) => {
243
+ props.setSellToken(token);
244
+ setModalState(undefined);
245
+ // if sell token is same as buy token, unset buy token
246
+ if (
247
+ props.buyToken &&
248
+ token.tokenAddress.toLowerCase() ===
249
+ props.buyToken.tokenAddress.toLowerCase() &&
250
+ token.chainId === props.buyToken.chainId
251
+ ) {
252
+ props.setBuyToken(undefined);
253
+ }
254
+ }}
255
+ activeWalletInfo={props.activeWalletInfo}
256
+ />
257
+ )}
258
+ </Modal>
259
+
260
+ {/* Sell */}
261
+ <TokenSection
262
+ isConnected={!!props.activeWalletInfo}
263
+ notEnoughBalance={notEnoughBalance}
264
+ balance={{
265
+ data: sellTokenBalanceQuery.data?.value,
266
+ isFetching: sellTokenBalanceQuery.isFetching,
267
+ }}
268
+ amount={{
269
+ data: sellTokenAmount,
270
+ isFetching: isSellAmountFetching,
271
+ }}
272
+ label="Sell"
273
+ setAmount={(value) => {
274
+ props.setAmountSelection({ type: "sell", amount: value });
275
+ }}
276
+ selectedToken={
277
+ props.sellToken
278
+ ? {
279
+ data: sellTokenQuery.data,
280
+ isFetching: sellTokenQuery.isFetching,
281
+ }
282
+ : undefined
283
+ }
284
+ client={props.client}
285
+ currency={props.currency}
286
+ onSelectToken={() => setModalState("select-sell-token")}
287
+ />
288
+
289
+ {/* Switch */}
290
+ <SwitchButton
291
+ onClick={() => {
292
+ // switch tokens
293
+ const temp = props.sellToken;
294
+ props.setSellToken(props.buyToken);
295
+ props.setBuyToken(temp);
296
+ props.setAmountSelection({
297
+ type: props.amountSelection.type === "buy" ? "sell" : "buy",
298
+ amount: props.amountSelection.amount,
299
+ });
300
+ }}
301
+ />
302
+
303
+ {/* Buy */}
304
+ <TokenSection
305
+ isConnected={!!props.activeWalletInfo}
306
+ notEnoughBalance={false}
307
+ balance={{
308
+ data: buyTokenBalanceQuery.data?.value,
309
+ isFetching: buyTokenBalanceQuery.isFetching,
310
+ }}
311
+ amount={{
312
+ data: buyTokenAmount,
313
+ isFetching: isBuyAmountFetching,
314
+ }}
315
+ label="Buy"
316
+ selectedToken={
317
+ props.buyToken
318
+ ? {
319
+ data: buyTokenQuery.data,
320
+ isFetching: buyTokenQuery.isFetching,
321
+ }
322
+ : undefined
323
+ }
324
+ setAmount={(value) => {
325
+ props.setAmountSelection({ type: "buy", amount: value });
326
+ }}
327
+ client={props.client}
328
+ currency={props.currency}
329
+ onSelectToken={() => setModalState("select-buy-token")}
330
+ />
331
+
332
+ {/* error message */}
333
+ {preparedResultQuery.error ? (
334
+ <Text
335
+ size="sm"
336
+ color="danger"
337
+ center
338
+ style={{
339
+ paddingBlock: spacing.md,
340
+ }}
341
+ >
342
+ Failed to get a quote
343
+ </Text>
344
+ ) : (
345
+ <Spacer y="lg" />
346
+ )}
347
+
348
+ {/* Button */}
349
+ {!props.activeWalletInfo ? (
350
+ <ConnectButton
351
+ client={props.client}
352
+ connectButton={{
353
+ label: "Swap",
354
+ style: {
355
+ width: "100%",
356
+ borderRadius: radius.lg,
357
+ },
358
+ }}
359
+ theme={props.theme}
360
+ {...props.connectOptions}
361
+ />
362
+ ) : (
363
+ <Button
364
+ disabled={
365
+ !preparedResultQuery.data ||
366
+ preparedResultQuery.isFetching ||
367
+ notEnoughBalance
368
+ }
369
+ fullWidth
370
+ onClick={() => {
371
+ if (
372
+ preparedResultQuery.data &&
373
+ buyTokenWithPrices &&
374
+ sellTokenWithPrices &&
375
+ sellTokenBalanceQuery.data &&
376
+ preparedResultQuery.data.type === "preparedResult"
377
+ ) {
378
+ props.onSwap({
379
+ result: preparedResultQuery.data.result,
380
+ request: preparedResultQuery.data.request,
381
+ buyToken: buyTokenWithPrices,
382
+ sellToken: sellTokenWithPrices,
383
+ sellTokenBalance: sellTokenBalanceQuery.data.value,
384
+ mode: props.amountSelection.type,
385
+ });
386
+ }
387
+ }}
388
+ style={{
389
+ fontSize: fontSize.md,
390
+ padding: `${spacing.sm} ${spacing.md}`,
391
+ borderRadius: radius.lg,
392
+ }}
393
+ variant="primary"
394
+ >
395
+ Swap
396
+ </Button>
397
+ )}
398
+
399
+ {props.showThirdwebBranding ? (
400
+ <div>
401
+ <Spacer y="md" />
402
+ <PoweredByThirdweb link="https://thirdweb.com/monetize/bridge" />
403
+ </div>
404
+ ) : null}
405
+ </Container>
406
+ );
407
+ }
408
+
409
+ function useSwapQuote(params: {
410
+ amountSelection: {
411
+ type: "buy" | "sell";
412
+ amount: string;
413
+ };
414
+ buyTokenWithPrices: TokenWithPrices | undefined;
415
+ sellTokenWithPrices: TokenWithPrices | undefined;
416
+ activeWalletInfo: ActiveWalletInfo | undefined;
417
+ client: ThirdwebClient;
418
+ }) {
419
+ const {
420
+ amountSelection,
421
+ buyTokenWithPrices,
422
+ sellTokenWithPrices,
423
+ activeWalletInfo,
424
+ client,
425
+ } = params;
426
+
427
+ return useQuery({
428
+ queryKey: [
429
+ "swap-quote",
430
+ amountSelection,
431
+ buyTokenWithPrices,
432
+ sellTokenWithPrices,
433
+ activeWalletInfo?.activeAccount.address,
434
+ ],
435
+ retry: false,
436
+ enabled:
437
+ !!buyTokenWithPrices && !!sellTokenWithPrices && !!amountSelection.amount,
438
+ queryFn: async (): Promise<
439
+ | {
440
+ type: "preparedResult";
441
+ result: SwapPreparedQuote;
442
+ request: Extract<BridgePrepareRequest, { type: "buy" | "sell" }>;
443
+ }
444
+ | {
445
+ type: "quote";
446
+ result: Buy.quote.Result | Sell.quote.Result;
447
+ }
448
+ > => {
449
+ if (
450
+ !buyTokenWithPrices ||
451
+ !sellTokenWithPrices ||
452
+ !amountSelection.amount
453
+ ) {
454
+ throw new Error("Invalid state");
455
+ }
456
+
457
+ if (!activeWalletInfo) {
458
+ if (amountSelection.type === "buy") {
459
+ const res = await Buy.quote({
460
+ amount: toUnits(
461
+ amountSelection.amount,
462
+ buyTokenWithPrices.decimals,
463
+ ),
464
+ // origin = sell
465
+ originChainId: sellTokenWithPrices.chainId,
466
+ originTokenAddress: sellTokenWithPrices.address,
467
+ // destination = buy
468
+ destinationChainId: buyTokenWithPrices.chainId,
469
+ destinationTokenAddress: buyTokenWithPrices.address,
470
+ client: client,
471
+ });
472
+
473
+ return {
474
+ type: "quote",
475
+ result: res,
476
+ };
477
+ }
478
+
479
+ const res = await Sell.quote({
480
+ amount: toUnits(amountSelection.amount, sellTokenWithPrices.decimals),
481
+ // origin = sell
482
+ originChainId: sellTokenWithPrices.chainId,
483
+ originTokenAddress: sellTokenWithPrices.address,
484
+ // destination = buy
485
+ destinationChainId: buyTokenWithPrices.chainId,
486
+ destinationTokenAddress: buyTokenWithPrices.address,
487
+ client: client,
488
+ });
489
+
490
+ return {
491
+ type: "quote",
492
+ result: res,
493
+ };
494
+ }
495
+
496
+ if (amountSelection.type === "buy") {
497
+ const buyRequestOptions: BuyPrepare.Options = {
498
+ amount: toUnits(amountSelection.amount, buyTokenWithPrices.decimals),
499
+ // origin = sell
500
+ originChainId: sellTokenWithPrices.chainId,
501
+ originTokenAddress: sellTokenWithPrices.address,
502
+ // destination = buy
503
+ destinationChainId: buyTokenWithPrices.chainId,
504
+ destinationTokenAddress: buyTokenWithPrices.address,
505
+ client: client,
506
+ receiver: activeWalletInfo.activeAccount.address,
507
+ sender: activeWalletInfo.activeAccount.address,
508
+ };
509
+
510
+ const buyRequest: BridgePrepareRequest = {
511
+ type: "buy",
512
+ ...buyRequestOptions,
513
+ };
514
+
515
+ const res = await Buy.prepare(buyRequest);
516
+
517
+ return {
518
+ type: "preparedResult",
519
+ result: { type: "buy", ...res },
520
+ request: buyRequest,
521
+ };
522
+ } else if (amountSelection.type === "sell") {
523
+ const sellRequestOptions: SellPrepare.Options = {
524
+ amount: toUnits(amountSelection.amount, sellTokenWithPrices.decimals),
525
+ // origin = sell
526
+ originChainId: sellTokenWithPrices.chainId,
527
+ originTokenAddress: sellTokenWithPrices.address,
528
+ // destination = buy
529
+ destinationChainId: buyTokenWithPrices.chainId,
530
+ destinationTokenAddress: buyTokenWithPrices.address,
531
+ client: client,
532
+ receiver: activeWalletInfo.activeAccount.address,
533
+ sender: activeWalletInfo.activeAccount.address,
534
+ };
535
+
536
+ const res = await Sell.prepare(sellRequestOptions);
537
+
538
+ const sellRequest: BridgePrepareRequest = {
539
+ type: "sell",
540
+ ...sellRequestOptions,
541
+ };
542
+
543
+ return {
544
+ type: "preparedResult",
545
+ result: { type: "sell", ...res },
546
+ request: sellRequest,
547
+ };
548
+ }
549
+
550
+ throw new Error("Invalid amount selection type");
551
+ },
552
+ refetchInterval: 20000,
553
+ });
554
+ }
555
+
556
+ function DecimalInput(props: {
557
+ value: string;
558
+ setValue: (value: string) => void;
559
+ }) {
560
+ const handleAmountChange = (inputValue: string) => {
561
+ let processedValue = inputValue;
562
+
563
+ // Replace comma with period if it exists
564
+ processedValue = processedValue.replace(",", ".");
565
+
566
+ if (processedValue.startsWith(".")) {
567
+ processedValue = `0${processedValue}`;
568
+ }
569
+
570
+ const numValue = Number(processedValue);
571
+ if (Number.isNaN(numValue)) {
572
+ return;
573
+ }
574
+
575
+ if (processedValue.startsWith("0") && !processedValue.startsWith("0.")) {
576
+ props.setValue(processedValue.slice(1));
577
+ } else {
578
+ props.setValue(processedValue);
579
+ }
580
+ };
581
+
582
+ return (
583
+ <Input
584
+ inputMode="decimal"
585
+ onChange={(e) => {
586
+ handleAmountChange(e.target.value);
587
+ }}
588
+ onClick={(e) => {
589
+ // put cursor at the end of the input
590
+ if (props.value === "") {
591
+ e.currentTarget.setSelectionRange(
592
+ e.currentTarget.value.length,
593
+ e.currentTarget.value.length,
594
+ );
595
+ }
596
+ }}
597
+ pattern="^[0-9]*[.,]?[0-9]*$"
598
+ placeholder="0.0"
599
+ style={{
600
+ border: "none",
601
+ boxShadow: "none",
602
+ fontSize: fontSize.xxl,
603
+ fontWeight: 500,
604
+ paddingInline: 0,
605
+ paddingBlock: 0,
606
+ }}
607
+ type="text"
608
+ value={props.value}
609
+ variant="transparent"
610
+ />
611
+ );
612
+ }
613
+
614
+ function TokenSection(props: {
615
+ label: string;
616
+ notEnoughBalance: boolean;
617
+ amount: {
618
+ data: string;
619
+ isFetching: boolean;
620
+ };
621
+ setAmount: (amount: string) => void;
622
+ selectedToken:
623
+ | {
624
+ data: TokenWithPrices | undefined;
625
+ isFetching: boolean;
626
+ }
627
+ | undefined;
628
+ currency: SupportedFiatCurrency;
629
+ onSelectToken: () => void;
630
+ client: ThirdwebClient;
631
+ isConnected: boolean;
632
+ balance: {
633
+ data: bigint | undefined;
634
+ isFetching: boolean;
635
+ };
636
+ }) {
637
+ const chainQuery = useBridgeChains(props.client);
638
+ const chain = chainQuery.data?.find(
639
+ (chain) => chain.chainId === props.selectedToken?.data?.chainId,
640
+ );
641
+
642
+ const fiatPricePerToken = props.selectedToken?.data?.prices[props.currency];
643
+ const totalFiatValue = !props.amount.data
644
+ ? undefined
645
+ : fiatPricePerToken
646
+ ? fiatPricePerToken * Number(props.amount.data)
647
+ : undefined;
648
+
649
+ return (
650
+ <Container
651
+ p="sm"
652
+ borderColor="borderColor"
653
+ bg="tertiaryBg"
654
+ style={{ borderRadius: radius.lg, borderWidth: 1, borderStyle: "solid" }}
655
+ >
656
+ {/* row1 : label */}
657
+ <Text size="md" color="primaryText" weight={500}>
658
+ {props.label}
659
+ </Text>
660
+
661
+ {/* row2 : amount and select token */}
662
+ <div
663
+ style={{
664
+ display: "flex",
665
+ alignItems: "center",
666
+ justifyContent: "space-between",
667
+ gap: spacing.sm,
668
+ paddingBottom: spacing.sm,
669
+ paddingTop: spacing.sm,
670
+ }}
671
+ >
672
+ {props.amount.isFetching ? (
673
+ <Skeleton
674
+ height={fontSize.xxl}
675
+ width="140px"
676
+ style={{
677
+ borderRadius: radius.lg,
678
+ }}
679
+ />
680
+ ) : (
681
+ <DecimalInput value={props.amount.data} setValue={props.setAmount} />
682
+ )}
683
+
684
+ {!props.selectedToken ? (
685
+ <Button
686
+ variant="accent"
687
+ style={{
688
+ borderRadius: radius.full,
689
+ gap: spacing.xxs,
690
+ paddingBlock: spacing.sm,
691
+ paddingInline: spacing.sm,
692
+ }}
693
+ onClick={props.onSelectToken}
694
+ >
695
+ {" "}
696
+ Select Token
697
+ <ChevronDownIcon width={iconSize.sm} height={iconSize.sm} />
698
+ </Button>
699
+ ) : (
700
+ <SelectedTokenButton
701
+ selectedToken={props.selectedToken}
702
+ client={props.client}
703
+ onSelectToken={props.onSelectToken}
704
+ chain={chain}
705
+ />
706
+ )}
707
+ </div>
708
+
709
+ {/* row3 : fiat value/error and balance */}
710
+ <div
711
+ style={{
712
+ display: "flex",
713
+ alignItems: "center",
714
+ gap: "4px",
715
+ justifyContent: "space-between",
716
+ }}
717
+ >
718
+ {/* Exceeds Balance / Fiat Value */}
719
+ {props.notEnoughBalance ? (
720
+ <Text size="md" color="danger" weight={500}>
721
+ {" "}
722
+ Exceeds Balance{" "}
723
+ </Text>
724
+ ) : (
725
+ <div
726
+ style={{
727
+ display: "flex",
728
+ alignItems: "center",
729
+ gap: "4px",
730
+ }}
731
+ >
732
+ <Text size="md" color="secondaryText" weight={500}>
733
+ {getFiatSymbol(props.currency)}
734
+ </Text>
735
+ {props.amount.isFetching ? (
736
+ <Skeleton height={fontSize.md} width="50px" />
737
+ ) : (
738
+ <div>
739
+ <DecimalRenderer
740
+ integerSize="md"
741
+ fractionSize="sm"
742
+ value={totalFiatValue?.toFixed(5) || "0.00"}
743
+ color="secondaryText"
744
+ weight={500}
745
+ />
746
+ </div>
747
+ )}
748
+ </div>
749
+ )}
750
+
751
+ {/* Balance */}
752
+ {props.isConnected && props.selectedToken && (
753
+ <div>
754
+ {props.balance.data === undefined ||
755
+ props.selectedToken.data === undefined ? (
756
+ <Skeleton height={fontSize.md} width="50px" />
757
+ ) : (
758
+ <Text
759
+ size="md"
760
+ color="secondaryText"
761
+ weight={500}
762
+ style={{
763
+ display: "flex",
764
+ alignItems: "center",
765
+ gap: spacing.xxs,
766
+ }}
767
+ >
768
+ <WalletDotIcon size={fontSize.xs} />
769
+ <DecimalRenderer
770
+ integerSize="md"
771
+ fractionSize="sm"
772
+ color="secondaryText"
773
+ weight={500}
774
+ value={formatTokenAmount(
775
+ props.balance.data,
776
+ props.selectedToken.data.decimals,
777
+ 5,
778
+ )}
779
+ />
780
+ </Text>
781
+ )}
782
+ </div>
783
+ )}
784
+ </div>
785
+ </Container>
786
+ );
787
+ }
788
+
789
+ function SelectedTokenButton(props: {
790
+ selectedToken:
791
+ | {
792
+ data: TokenWithPrices | undefined;
793
+ isFetching: boolean;
794
+ }
795
+ | undefined;
796
+ client: ThirdwebClient;
797
+ onSelectToken: () => void;
798
+ chain: BridgeChain | undefined;
799
+ }) {
800
+ return (
801
+ <Button
802
+ variant="outline"
803
+ bg="secondaryButtonBg"
804
+ onClick={props.onSelectToken}
805
+ gap="xs"
806
+ style={{
807
+ borderRadius: radius.full,
808
+ paddingBlock: spacing.xxs,
809
+ paddingInline: spacing.xs,
810
+ }}
811
+ >
812
+ {/* icons */}
813
+ <Container relative color="secondaryText">
814
+ {/* token icon */}
815
+ <Img
816
+ key={props.selectedToken?.data?.iconUri}
817
+ src={
818
+ props.selectedToken?.data === undefined
819
+ ? undefined
820
+ : props.selectedToken.data.iconUri || ""
821
+ }
822
+ client={props.client}
823
+ width={iconSize.lg}
824
+ height={iconSize.lg}
825
+ skeletonColor="modalBg"
826
+ fallback={<DiscIcon width={iconSize.lg} height={iconSize.lg} />}
827
+ style={{
828
+ borderRadius: radius.full,
829
+ }}
830
+ />
831
+
832
+ {/* chain icon */}
833
+ <Container
834
+ bg="modalBg"
835
+ style={{
836
+ padding: "2px",
837
+ position: "absolute",
838
+ bottom: -2,
839
+ right: -2,
840
+ display: "flex",
841
+ borderRadius: radius.full,
842
+ }}
843
+ >
844
+ <Img
845
+ src={props.chain?.icon}
846
+ client={props.client}
847
+ width={iconSize.sm}
848
+ height={iconSize.sm}
849
+ style={{
850
+ borderRadius: radius.full,
851
+ }}
852
+ />
853
+ </Container>
854
+ </Container>
855
+
856
+ {/* token symbol and chain name */}
857
+ <Container flex="column" style={{ gap: "2px" }}>
858
+ {props.selectedToken?.isFetching ? (
859
+ <Skeleton width="40px" height={fontSize.sm} color="modalBg" />
860
+ ) : (
861
+ <Text size="sm" color="primaryText" weight={500}>
862
+ {props.selectedToken?.data?.symbol}
863
+ </Text>
864
+ )}
865
+
866
+ {props.chain ? (
867
+ <Text
868
+ size="xs"
869
+ color="secondaryText"
870
+ weight={500}
871
+ style={{
872
+ maxWidth: "100px",
873
+ overflow: "hidden",
874
+ textOverflow: "ellipsis",
875
+ whiteSpace: "nowrap",
876
+ }}
877
+ >
878
+ {cleanedChainName(props.chain.name)}
879
+ </Text>
880
+ ) : (
881
+ <Skeleton width="70px" height={fontSize.xs} color="modalBg" />
882
+ )}
883
+ </Container>
884
+ <Container color="secondaryText">
885
+ <ChevronRightIcon width={iconSize.xs} height={iconSize.xs} />
886
+ </Container>
887
+ </Button>
888
+ );
889
+ }
890
+
891
+ function SwitchButton(props: { onClick: () => void }) {
892
+ return (
893
+ <div
894
+ style={{
895
+ display: "flex",
896
+ justifyContent: "center",
897
+ marginBlock: `-14px`,
898
+ }}
899
+ >
900
+ <SwitchButtonInner
901
+ variant="outline"
902
+ onClick={(e) => {
903
+ props.onClick();
904
+ const node = e.currentTarget.querySelector("svg");
905
+ if (node) {
906
+ node.style.transform = "rotate(180deg)";
907
+ node.style.transition = "transform 300ms ease";
908
+ setTimeout(() => {
909
+ node.style.transition = "";
910
+ node.style.transform = "rotate(0deg)";
911
+ }, 300);
912
+ }
913
+ }}
914
+ >
915
+ <ArrowUpDownIcon size={iconSize.md} />
916
+ </SwitchButtonInner>
917
+ </div>
918
+ );
919
+ }
920
+
921
+ const SwitchButtonInner = /* @__PURE__ */ styled(Button)(() => {
922
+ const theme = useCustomTheme();
923
+ return {
924
+ "&:hover": {
925
+ background: theme.colors.modalBg,
926
+ },
927
+ borderRadius: radius.lg,
928
+ padding: spacing.xs,
929
+ background: theme.colors.modalBg,
930
+ border: `1px solid ${theme.colors.borderColor}`,
931
+ };
932
+ });
933
+
934
+ function useTokenBalance(props: {
935
+ chainId: number | undefined;
936
+ tokenAddress: string | undefined;
937
+ client: ThirdwebClient;
938
+ walletAddress: string | undefined;
939
+ }) {
940
+ return useWalletBalance({
941
+ address: props.walletAddress,
942
+ chain: props.chainId ? defineChain(props.chainId) : undefined,
943
+ client: props.client,
944
+ tokenAddress: props.tokenAddress
945
+ ? getAddress(props.tokenAddress) === getAddress(NATIVE_TOKEN_ADDRESS)
946
+ ? undefined
947
+ : getAddress(props.tokenAddress)
948
+ : undefined,
949
+ });
950
+ }