0xtrails 0.13.1 → 0.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/dist/{ccip-DStzFCYT.js → ccip-CT_An6eM.js} +28 -28
  2. package/dist/chains.d.ts +1 -1
  3. package/dist/chains.d.ts.map +1 -1
  4. package/dist/constants.d.ts +1 -0
  5. package/dist/constants.d.ts.map +1 -1
  6. package/dist/customTokens.d.ts.map +1 -1
  7. package/dist/{index-HY9_ppit.js → index-RfqL5Foz.js} +56523 -43196
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +383 -332
  11. package/dist/intents.d.ts +8 -2
  12. package/dist/intents.d.ts.map +1 -1
  13. package/dist/keyMachineClient.d.ts +9 -0
  14. package/dist/keyMachineClient.d.ts.map +1 -0
  15. package/dist/keymachine/index.d.ts +14 -0
  16. package/dist/keymachine/index.d.ts.map +1 -0
  17. package/dist/keymachine/key-machine.gen.d.ts +461 -0
  18. package/dist/keymachine/key-machine.gen.d.ts.map +1 -0
  19. package/dist/onramp/MeshConnectFlow.d.ts +18 -0
  20. package/dist/onramp/MeshConnectFlow.d.ts.map +1 -0
  21. package/dist/onramp/MeshConnectIframe.d.ts +13 -0
  22. package/dist/onramp/MeshConnectIframe.d.ts.map +1 -0
  23. package/dist/onramp/SendFromExchangeButton.d.ts +16 -0
  24. package/dist/onramp/SendFromExchangeButton.d.ts.map +1 -0
  25. package/dist/onramp/TrailsOnRampProvider.d.ts +31 -0
  26. package/dist/onramp/TrailsOnRampProvider.d.ts.map +1 -0
  27. package/dist/onramp/index.d.ts +13 -0
  28. package/dist/onramp/index.d.ts.map +1 -0
  29. package/dist/onramp/meshconnect.d.ts +30 -0
  30. package/dist/onramp/meshconnect.d.ts.map +1 -0
  31. package/dist/onramp/trailsOnramp.d.ts +24 -0
  32. package/dist/onramp/trailsOnramp.d.ts.map +1 -0
  33. package/dist/onramp-client/index.d.ts +3 -3
  34. package/dist/onramp-client/index.d.ts.map +1 -1
  35. package/dist/prepareSend.d.ts.map +1 -1
  36. package/dist/query/balance.fetchers.d.ts +27 -0
  37. package/dist/query/balance.fetchers.d.ts.map +1 -1
  38. package/dist/query/balance.hooks.d.ts +19 -0
  39. package/dist/query/balance.hooks.d.ts.map +1 -1
  40. package/dist/query/balance.queries.d.ts +18 -1
  41. package/dist/query/balance.queries.d.ts.map +1 -1
  42. package/dist/query/chains.queries.d.ts.map +1 -1
  43. package/dist/query/meld.fetchers.d.ts +1 -1
  44. package/dist/query/meld.fetchers.d.ts.map +1 -1
  45. package/dist/query/meld.hooks.d.ts +3 -3
  46. package/dist/query/meld.hooks.d.ts.map +1 -1
  47. package/dist/query/meld.queries.d.ts +1 -1
  48. package/dist/query/meld.queries.d.ts.map +1 -1
  49. package/dist/query/tokenList.queries.d.ts +54 -0
  50. package/dist/query/tokenList.queries.d.ts.map +1 -0
  51. package/dist/recover.d.ts +3 -1
  52. package/dist/recover.d.ts.map +1 -1
  53. package/dist/tokens.d.ts +13 -0
  54. package/dist/tokens.d.ts.map +1 -1
  55. package/dist/transactionIntent/deposits/depositOrchestrator.d.ts +2 -2
  56. package/dist/transactionIntent/deposits/depositOrchestrator.d.ts.map +1 -1
  57. package/dist/transactionIntent/deposits/gaslessDeposit.d.ts +2 -2
  58. package/dist/transactionIntent/deposits/gaslessDeposit.d.ts.map +1 -1
  59. package/dist/transactionIntent/deposits/standardDeposit.d.ts +1 -1
  60. package/dist/transactionIntent/deposits/standardDeposit.d.ts.map +1 -1
  61. package/dist/transactionIntent/handlers/intentHandler.d.ts.map +1 -1
  62. package/dist/transactionIntent/helpers/transactionStateHelpers.d.ts.map +1 -1
  63. package/dist/transactionIntent/quote/normalizeQuote.d.ts.map +1 -1
  64. package/dist/transactionIntent/types.d.ts +1 -1
  65. package/dist/transactionIntent/types.d.ts.map +1 -1
  66. package/dist/transactions.d.ts +3 -0
  67. package/dist/transactions.d.ts.map +1 -1
  68. package/dist/umd/trails.min.js +291 -202
  69. package/dist/walletUtils.d.ts +2 -1
  70. package/dist/walletUtils.d.ts.map +1 -1
  71. package/dist/wallets.d.ts +13 -54
  72. package/dist/wallets.d.ts.map +1 -1
  73. package/dist/widget/components/ClassicSwap.d.ts.map +1 -1
  74. package/dist/widget/components/ConnectWallet.d.ts.map +1 -1
  75. package/dist/widget/components/ConnectedWallets.d.ts.map +1 -1
  76. package/dist/widget/components/DirectTransfer.d.ts +1 -1
  77. package/dist/widget/components/DirectTransfer.d.ts.map +1 -1
  78. package/dist/widget/components/Fund.d.ts.map +1 -1
  79. package/dist/widget/components/FundMethods.d.ts.map +1 -1
  80. package/dist/widget/components/MeshExchangeSelection.d.ts +11 -0
  81. package/dist/widget/components/MeshExchangeSelection.d.ts.map +1 -0
  82. package/dist/widget/components/OnrampHistoryRow.d.ts +1 -1
  83. package/dist/widget/components/OnrampHistoryRow.d.ts.map +1 -1
  84. package/dist/widget/components/Pay.d.ts.map +1 -1
  85. package/dist/widget/components/PoolDeposit.d.ts.map +1 -1
  86. package/dist/widget/components/QRCodeWalletSelect.d.ts +1 -1
  87. package/dist/widget/components/QRCodeWalletSelect.d.ts.map +1 -1
  88. package/dist/widget/components/QuoteDetails.d.ts.map +1 -1
  89. package/dist/widget/components/Recipients.d.ts.map +1 -1
  90. package/dist/widget/components/RefundWarning.d.ts.map +1 -1
  91. package/dist/widget/components/TokenSelector.d.ts.map +1 -1
  92. package/dist/widget/components/TransactionDetails.d.ts.map +1 -1
  93. package/dist/widget/components/TransferPendingVertical.d.ts +1 -0
  94. package/dist/widget/components/TransferPendingVertical.d.ts.map +1 -1
  95. package/dist/widget/components/WalletConnect.d.ts.map +1 -1
  96. package/dist/widget/components/WalletImage.d.ts.map +1 -1
  97. package/dist/widget/components/WalletList.d.ts.map +1 -1
  98. package/dist/widget/components/Withdraw.d.ts.map +1 -1
  99. package/dist/widget/css/compiled.css +1 -1
  100. package/dist/widget/hooks/useAddressWalletIcon.d.ts.map +1 -1
  101. package/dist/widget/hooks/useCustomTokenSearch.d.ts +6 -1
  102. package/dist/widget/hooks/useCustomTokenSearch.d.ts.map +1 -1
  103. package/dist/widget/hooks/useDefaultDestinationToken.d.ts.map +1 -1
  104. package/dist/widget/hooks/useDefaultOriginToken.d.ts.map +1 -1
  105. package/dist/widget/hooks/useFiatOnRampCurrencies.d.ts +1 -1
  106. package/dist/widget/hooks/useFiatOnRampCurrencies.d.ts.map +1 -1
  107. package/dist/widget/hooks/useIntentTransactionHistory.d.ts.map +1 -1
  108. package/dist/widget/hooks/useQuote.d.ts +1 -1
  109. package/dist/widget/hooks/useQuote.d.ts.map +1 -1
  110. package/dist/widget/hooks/useSelectedFundMethod.d.ts +7 -0
  111. package/dist/widget/hooks/useSelectedFundMethod.d.ts.map +1 -1
  112. package/dist/widget/hooks/useSendForm.d.ts.map +1 -1
  113. package/dist/widget/hooks/useTokenList.d.ts +7 -1
  114. package/dist/widget/hooks/useTokenList.d.ts.map +1 -1
  115. package/dist/widget/hooks/useViewManager.d.ts +1 -1
  116. package/dist/widget/hooks/useViewManager.d.ts.map +1 -1
  117. package/dist/widget/index.js +1 -1
  118. package/dist/widget/providers/TrailsProvider.d.ts +2 -0
  119. package/dist/widget/providers/TrailsProvider.d.ts.map +1 -1
  120. package/dist/widget/utils/createWagmiConfig.d.ts +2 -2
  121. package/dist/widget/utils/createWagmiConfig.d.ts.map +1 -1
  122. package/dist/widget/utils/fundMethodSwitchState.d.ts +1 -0
  123. package/dist/widget/utils/fundMethodSwitchState.d.ts.map +1 -1
  124. package/dist/widget/utils/meldProviderUtils.d.ts +1 -1
  125. package/dist/widget/utils/meldProviderUtils.d.ts.map +1 -1
  126. package/dist/widget/utils/meshSupportedTokens.d.ts +4 -0
  127. package/dist/widget/utils/meshSupportedTokens.d.ts.map +1 -0
  128. package/dist/widget/utils/onrampConfig.d.ts +11 -0
  129. package/dist/widget/utils/onrampConfig.d.ts.map +1 -0
  130. package/dist/widget/utils/trailsOnrampConfig.d.ts +18 -0
  131. package/dist/widget/utils/trailsOnrampConfig.d.ts.map +1 -0
  132. package/dist/widget/widget.d.ts +24 -8
  133. package/dist/widget/widget.d.ts.map +1 -1
  134. package/package.json +9 -7
  135. package/src/chains.ts +9 -4
  136. package/src/constants.ts +2 -0
  137. package/src/customTokens.ts +21 -0
  138. package/src/index.ts +1 -0
  139. package/src/intents.ts +49 -41
  140. package/src/keyMachineClient.ts +29 -0
  141. package/src/keymachine/index.ts +175 -0
  142. package/src/keymachine/key-machine.gen.ts +993 -0
  143. package/src/onramp/MeshConnectFlow.tsx +86 -0
  144. package/src/onramp/MeshConnectIframe.tsx +661 -0
  145. package/src/onramp/SendFromExchangeButton.tsx +81 -0
  146. package/src/onramp/TrailsOnRampProvider.tsx +59 -0
  147. package/src/onramp/index.ts +31 -0
  148. package/src/onramp/meshconnect.ts +277 -0
  149. package/src/onramp/trailsOnramp.tsx +130 -0
  150. package/src/onramp-client/index.ts +4 -6
  151. package/src/prepareSend.ts +45 -44
  152. package/src/query/balance.fetchers.ts +134 -4
  153. package/src/query/balance.hooks.ts +61 -2
  154. package/src/query/balance.queries.ts +63 -0
  155. package/src/query/chains.queries.ts +1 -6
  156. package/src/query/meld.fetchers.ts +1 -1
  157. package/src/query/meld.hooks.ts +1 -1
  158. package/src/query/meld.queries.ts +1 -1
  159. package/src/query/tokenList.queries.ts +118 -0
  160. package/src/recover.ts +86 -23
  161. package/src/tokens.ts +108 -26
  162. package/src/transactionIntent/deposits/depositOrchestrator.ts +11 -11
  163. package/src/transactionIntent/deposits/gaslessDeposit.ts +38 -38
  164. package/src/transactionIntent/deposits/standardDeposit.ts +0 -4
  165. package/src/transactionIntent/handlers/intentHandler.ts +28 -11
  166. package/src/transactionIntent/helpers/transactionStateHelpers.ts +5 -2
  167. package/src/transactionIntent/quote/normalizeQuote.ts +11 -5
  168. package/src/transactionIntent/types.ts +1 -1
  169. package/src/transactions.ts +3 -0
  170. package/src/walletUtils.ts +2 -1
  171. package/src/wallets.ts +184 -380
  172. package/src/widget/compiled.css +1 -1
  173. package/src/widget/components/ClassicSwap.tsx +22 -5
  174. package/src/widget/components/ConnectWallet.tsx +4 -2
  175. package/src/widget/components/ConnectedWallets.tsx +2 -5
  176. package/src/widget/components/DirectTransfer.tsx +5 -2
  177. package/src/widget/components/Fund.tsx +144 -12
  178. package/src/widget/components/FundMethods.tsx +5 -9
  179. package/src/widget/components/MeldHistory.tsx +1 -1
  180. package/src/widget/components/MeshExchangeSelection.tsx +218 -0
  181. package/src/widget/components/OnrampHistoryRow.tsx +1 -1
  182. package/src/widget/components/Pay.tsx +20 -36
  183. package/src/widget/components/PoolDeposit.tsx +13 -22
  184. package/src/widget/components/QRCodeWalletSelect.tsx +5 -2
  185. package/src/widget/components/QuoteDetails.tsx +77 -68
  186. package/src/widget/components/Recipients.tsx +2 -1
  187. package/src/widget/components/RefundWarning.tsx +5 -10
  188. package/src/widget/components/TokenSelector.tsx +85 -16
  189. package/src/widget/components/TransactionDetails.tsx +46 -0
  190. package/src/widget/components/TransferPendingVertical.tsx +27 -19
  191. package/src/widget/components/WalletConnect.tsx +2 -5
  192. package/src/widget/components/WalletImage.tsx +6 -18
  193. package/src/widget/components/WalletList.tsx +1 -1
  194. package/src/widget/components/Withdraw.tsx +22 -4
  195. package/src/widget/hooks/useAddressWalletIcon.ts +2 -1
  196. package/src/widget/hooks/useCustomTokenSearch.tsx +63 -33
  197. package/src/widget/hooks/useDefaultDestinationToken.tsx +2 -5
  198. package/src/widget/hooks/useDefaultOriginToken.tsx +2 -5
  199. package/src/widget/hooks/useFiatOnRampCurrencies.ts +1 -1
  200. package/src/widget/hooks/useIntentTransactionHistory.ts +5 -0
  201. package/src/widget/hooks/useMeldTransactionStatus.ts +1 -1
  202. package/src/widget/hooks/useQuote.ts +51 -45
  203. package/src/widget/hooks/useSelectedFundMethod.tsx +14 -1
  204. package/src/widget/hooks/useSendForm.ts +26 -10
  205. package/src/widget/hooks/useTokenList.ts +208 -139
  206. package/src/widget/hooks/useViewManager.tsx +1 -0
  207. package/src/widget/providers/TrailsProvider.tsx +5 -0
  208. package/src/widget/styles.ts +1 -1
  209. package/src/widget/utils/createWagmiConfig.ts +7 -2
  210. package/src/widget/utils/fundMethodSwitchState.ts +2 -0
  211. package/src/widget/utils/meldProviderUtils.ts +8 -2
  212. package/src/widget/utils/meshSupportedTokens.ts +28 -0
  213. package/src/widget/utils/onrampConfig.ts +15 -0
  214. package/src/widget/utils/trailsOnrampConfig.ts +39 -0
  215. package/src/widget/widget.tsx +164 -98
  216. package/dist/onramp-client/trails-onramp.gen.d.ts +0 -570
  217. package/dist/onramp-client/trails-onramp.gen.d.ts.map +0 -1
  218. package/dist/widget/hooks/useCustomTokenFetch.d.ts +0 -19
  219. package/dist/widget/hooks/useCustomTokenFetch.d.ts.map +0 -1
  220. package/dist/widget/hooks/useTokenWithFreshBalance.d.ts +0 -18
  221. package/dist/widget/hooks/useTokenWithFreshBalance.d.ts.map +0 -1
  222. package/src/onramp-client/trails-onramp.gen.ts +0 -1320
  223. package/src/widget/assets/Binance_Icon_Logo.svg +0 -14
  224. package/src/widget/assets/Bitfinex_Icon_Logo.svg +0 -5
  225. package/src/widget/assets/Coinbase_Icon_Logo.svg +0 -1
  226. package/src/widget/assets/WalletConnect-logo-blue-bg.svg +0 -11
  227. package/src/widget/assets/sequence-logo.svg +0 -15
  228. package/src/widget/hooks/useCustomTokenFetch.tsx +0 -74
  229. package/src/widget/hooks/useTokenWithFreshBalance.ts +0 -246
@@ -18,6 +18,7 @@ import {
18
18
  } from "./providers/WidgetProviderTree.js"
19
19
  import { createWagmiConfig } from "./utils/createWagmiConfig.js"
20
20
  import { ShadowPortal } from "./components/ShadowPortal.js"
21
+ import { QuoteDetails } from "./components/QuoteDetails.js"
21
22
  import type { Chain, WalletClient, EIP1193Provider } from "viem"
22
23
  import {
23
24
  createWalletClient,
@@ -85,14 +86,18 @@ import type { Theme } from "../theme.js"
85
86
  import type { Token } from "../tokens.js"
86
87
  import { getWethAddress } from "../tokens.js"
87
88
  import type { IntentTransaction } from "@0xtrails/api"
89
+ import {
90
+ getQRCodeWallets,
91
+ getWalletIdFromRdns,
92
+ wagmiConnectorToWalletId,
93
+ } from "@0xtrails/wallet-registry"
88
94
  import type { TransactionState } from "../transactions.js"
95
+ import { useOnrampClient } from "../onrampClient.js"
89
96
  import {
90
- useQRCodeWallets,
91
97
  useWallets,
92
98
  getWalletConnectConnector,
93
99
  getConnectorsInternal,
94
- wagmiConnectorToWalletId,
95
- WALLET_RDNS_MAP,
100
+ type WalletConnector,
96
101
  } from "../wallets.js"
97
102
  // import { useOpenConnectModal } from "@0xsequence/connect"
98
103
  import {
@@ -113,6 +118,7 @@ import Footer from "./components/Footer.js"
113
118
  import { Fund } from "./components/Fund.js"
114
119
  import { Withdraw } from "./components/Withdraw.js"
115
120
  import FundMethods from "./components/FundMethods.js"
121
+ import { MeshExchangeSelection } from "./components/MeshExchangeSelection.js"
116
122
  import OnrampPaymentMethods from "./components/OnrampPaymentMethods.js"
117
123
  import Modal from "./components/Modal.js"
118
124
  import { Pay } from "./components/Pay.js"
@@ -137,6 +143,9 @@ import { WalletList } from "./components/WalletList.js"
137
143
  import { useCheckout } from "./hooks/useCheckout.js"
138
144
  import { useDebugScreens } from "./hooks/useDebugScreens.js"
139
145
  import { useExternalFundingReceiptSync } from "./hooks/useExternalFundingReceiptSync.js"
146
+ import { getWidgetOnrampConfig } from "./utils/trailsOnrampConfig.js"
147
+ import type { TrailsOnRampConfig } from "../onramp/TrailsOnRampProvider.js"
148
+ import { trailsOnramp, type OnrampFactory } from "../onramp/trailsOnramp.js"
140
149
  import { useScreenTracking } from "./hooks/useScreenTracking.js"
141
150
  import { useEarnPool } from "./hooks/useEarnPool.js"
142
151
 
@@ -203,6 +212,7 @@ export type FundMethodListOption =
203
212
  | "connected-wallet"
204
213
  | "crypto-transfer"
205
214
  | "cc-onramp"
215
+ | "exchange"
206
216
  | "exchange-onramp"
207
217
 
208
218
  export const WidgetFundMethod = {
@@ -220,6 +230,7 @@ export type TrailsWidgetProps = {
220
230
  trailsApiUrl?: string
221
231
  trailsAppUrl?: string
222
232
  sequenceNodeGatewayUrl?: string
233
+ sequenceMetadataUrl?: string
223
234
  sequenceApiUrl?: string
224
235
  toAddress?: string | null
225
236
  toAmount?: string | null
@@ -323,7 +334,10 @@ export type TrailsWidgetProps = {
323
334
  * - "connected-wallet"
324
335
  * - "crypto-transfer"
325
336
  * - "cc-onramp"
326
- * - "exchange-onramp"
337
+ * - "exchange"
338
+ *
339
+ * Preferred values: "connected-wallet", "crypto-transfer", "exchange", "cc-onramp".
340
+ * Legacy alias "exchange-onramp" is still accepted.
327
341
  *
328
342
  * @example ["connected-wallet", "crypto-transfer"]
329
343
  */
@@ -349,27 +363,40 @@ export type TrailsWidgetProps = {
349
363
  payMessage?: string
350
364
  isSmartWallet?: boolean
351
365
  /**
352
- * Optional onramp factory function (e.g., trailsOnramp from @0xtrails/onramp)
353
- * If provided, enables exchange funding options in the widget
366
+ * Optional onramp configuration or factory.
367
+ * If provided, enables exchange funding options in the widget.
354
368
  *
355
369
  * @example
356
370
  * ```tsx
357
- * import { trailsOnramp } from "@0xtrails/onramp"
358
- * <TrailsWidget onramp={trailsOnramp({ config: { exchanges: ['coinbase'] } })} />
371
+ * <TrailsWidget
372
+ * onramp={{
373
+ * mesh: {
374
+ * environment: "production",
375
+ * },
376
+ * }}
377
+ * />
359
378
  * ```
360
379
  */
361
- onramp?: (handlers: {
362
- setCurrentScreen: (screen: Screen) => void
363
- onComplete?: (transferData: OnrampTransferResult) => void
364
- onError?: (error: unknown) => void
365
- onBack?: () => void
366
- toTokenSymbol?: string
367
- toTokenAmount?: string
368
- toChainId?: number
369
- toRecipientAddress?: string
370
- toAmountUsd?: number
371
- apiKey?: string
372
- }) => React.ReactElement
380
+ onramp?:
381
+ | TrailsOnRampConfig
382
+ | ((handlers: {
383
+ setCurrentScreen: (screen: Screen) => void
384
+ onComplete?: (transferData: OnrampTransferResult) => void
385
+ onError?: (error: unknown) => void
386
+ onBack?: () => void
387
+ toTokenSymbol?: string
388
+ toTokenAmount?: string
389
+ toChainId?: number
390
+ toRecipientAddress?: string
391
+ toAmountUsd?: number
392
+ selectedExchange?: {
393
+ integrationId: string
394
+ exchangeKey: string
395
+ exchangeName: string
396
+ }
397
+ apiKey?: string
398
+ hostname?: string
399
+ }) => React.ReactElement)
373
400
  }
374
401
 
375
402
  export interface TrailsWidgetRef {
@@ -658,8 +685,9 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
658
685
  } = useWidgetProps()
659
686
  const { address, chainId, connector } = useAccount()
660
687
  const connectors = useConnectors()
661
- const { trailsApiKey } = useTrails()
662
- const qrCodeWallets = useQRCodeWallets()
688
+ const { trailsApiKey, trailsApiUrl } = useTrails()
689
+ const onrampClient = useOnrampClient()
690
+ const qrCodeWallets = useMemo(() => getQRCodeWallets(), [])
663
691
  // const { setOpenConnectModal } = useOpenConnectModal()
664
692
 
665
693
  // Check if the current connector is a Sequence wallet
@@ -674,7 +702,15 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
674
702
  const { wallets: allWallets } = useWallets()
675
703
  const { selectedToken, setSelectedToken, clearSelectedToken } =
676
704
  useSelectedToken()
677
- const { onramp: onrampFactory } = useWidgetProps()
705
+ const { onramp } = useWidgetProps()
706
+ const meshOnrampConfig = getWidgetOnrampConfig(onramp)
707
+ const onrampFactory: OnrampFactory | undefined =
708
+ typeof onramp === "function"
709
+ ? (onramp as OnrampFactory)
710
+ : meshOnrampConfig
711
+ ? trailsOnramp({ config: meshOnrampConfig })
712
+ : undefined
713
+ const meshEnvironment = meshOnrampConfig?.mesh?.environment ?? "production"
678
714
 
679
715
  // Modal state is managed by TrailsModalProvider
680
716
  const {
@@ -811,7 +847,12 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
811
847
  const [previousAddress, setPreviousAddress] = useState<string | undefined>(
812
848
  address,
813
849
  )
814
- const { selectedFundMethod, setSelectedFundMethod } = useSelectedFundMethod()
850
+ const {
851
+ selectedFundMethod,
852
+ selectedMeshExchange,
853
+ setSelectedFundMethod,
854
+ setSelectedMeshExchange,
855
+ } = useSelectedFundMethod()
815
856
  const fundMethodSelectionStartRef = useRef(selectedFundMethod)
816
857
  const clearStateForFundMethodSwitch = useCallback(
817
858
  (nextMethod: typeof selectedFundMethod) => {
@@ -824,6 +865,7 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
824
865
  setSellAmount,
825
866
  setBuyAmount,
826
867
  setPrepareSendQuote,
868
+ setSelectedMeshExchange,
827
869
  },
828
870
  )
829
871
 
@@ -831,7 +873,7 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
831
873
  fundMethodSelectionStartRef.current = nextMethod
832
874
  }
833
875
  },
834
- [clearSelectedToken, setSellAmount, setBuyAmount],
876
+ [clearSelectedToken, setSellAmount, setBuyAmount, setSelectedMeshExchange],
835
877
  )
836
878
  const { selectedPool, setSelectedPool } = useEarnPool()
837
879
  const [selectedWalletId, setSelectedWalletId] = useState<string | null>(
@@ -1426,7 +1468,7 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
1426
1468
 
1427
1469
  const handleConnectWallet = async (
1428
1470
  walletId: string,
1429
- providedConnector?: Connector,
1471
+ providedConnector?: WalletConnector,
1430
1472
  ) => {
1431
1473
  try {
1432
1474
  setError(null)
@@ -1441,7 +1483,7 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
1441
1483
  const eip6963Connector = connectors.find((c) => {
1442
1484
  if (c.type !== "injected") return false
1443
1485
  const rdns = (c as EIP6963Connector).info?.rdns
1444
- if (rdns && WALLET_RDNS_MAP[rdns] === walletId) {
1486
+ if (getWalletIdFromRdns(rdns) === walletId) {
1445
1487
  logger.console.log(
1446
1488
  `[trails-sdk] Found EIP-6963 connector for ${walletId} with rdns ${rdns}`,
1447
1489
  )
@@ -2213,59 +2255,6 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
2213
2255
  }
2214
2256
  }
2215
2257
 
2216
- const _handleNavigateToOnramp = (
2217
- props: {
2218
- toTokenSymbol: string
2219
- toTokenAmount: string
2220
- toChainId: number
2221
- toRecipientAddress: string
2222
- toAmountUsd?: number
2223
- },
2224
- onRampMethod?: string,
2225
- quote?: PrepareSendQuote | null,
2226
- continueSend?: () => Promise<void>,
2227
- ) => {
2228
- setPrepareSendQuote(quote ?? null)
2229
- setOnrampProps(props)
2230
- setOnrampContinueSend(() => continueSend || null)
2231
-
2232
- // Render onramp component directly - it manages its own routing
2233
- const targetScreen =
2234
- onRampMethod && onRampMethod === "onramp-meld"
2235
- ? "onramp-meld"
2236
- : "onramp-mesh"
2237
- navigate(targetScreen)
2238
-
2239
- if (
2240
- targetScreen === "onramp-meld" &&
2241
- continueSend &&
2242
- !onrampContinueSendInProgress
2243
- ) {
2244
- logger.console.log(
2245
- "[trails-sdk] Starting intent execution after navigating to onramp-meld screen",
2246
- )
2247
- setOnrampContinueSendInProgress(true)
2248
- // Call asynchronously to avoid blocking navigation
2249
- Promise.resolve()
2250
- .then(() => continueSend())
2251
- .then(() => {
2252
- logger.console.log(
2253
- "[trails-sdk] onrampContinueSend completed successfully",
2254
- )
2255
- })
2256
- .catch((error) => {
2257
- logger.console.error(
2258
- "[trails-sdk] Error executing intent after onramp deposit:",
2259
- error,
2260
- )
2261
- handleSendError(error as Error)
2262
- })
2263
- .finally(() => {
2264
- setOnrampContinueSendInProgress(false)
2265
- })
2266
- }
2267
- }
2268
-
2269
2258
  const handleSendError = (error: Error | string | null) => {
2270
2259
  if (error) {
2271
2260
  logger.console.error("[trails-sdk] Error sending transaction", error)
@@ -2329,6 +2318,11 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
2329
2318
  })()
2330
2319
  return
2331
2320
  }
2321
+
2322
+ if (selectedFundMethod === "onramp-mesh") {
2323
+ return
2324
+ }
2325
+
2332
2326
  navigate("wallet-confirmation")
2333
2327
  }
2334
2328
 
@@ -2495,15 +2489,69 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
2495
2489
  }
2496
2490
  }}
2497
2491
  onSelectOnrampExchange={() => {
2492
+ clearSelectedToken()
2493
+ setSellAmount("")
2494
+ setBuyAmount("")
2495
+ setPrepareSendQuote(null)
2496
+ setSelectedMeshExchange(null)
2498
2497
  clearStateForFundMethodSwitch("onramp-mesh")
2499
2498
  if (currentMode === "fund") {
2500
- navigate("fund-form")
2499
+ navigate("mesh-exchanges")
2501
2500
  } else {
2502
2501
  goHome()
2503
2502
  }
2504
2503
  }}
2505
2504
  />
2506
2505
  )
2506
+ case "mesh-exchanges":
2507
+ return (
2508
+ <MeshExchangeSelection
2509
+ onBack={() => navigate("fund-methods")}
2510
+ onSelectExchange={async (exchange) => {
2511
+ if (
2512
+ selectedToken &&
2513
+ selectedToken.chainId !== undefined &&
2514
+ trailsApiKey &&
2515
+ trailsApiUrl
2516
+ ) {
2517
+ try {
2518
+ const response = await onrampClient.getMeshSupportedTokens({
2519
+ environment: meshEnvironment,
2520
+ integrationId: exchange.integrationId,
2521
+ chainIds: [selectedToken.chainId.toString()],
2522
+ })
2523
+
2524
+ const isSupported = (response.tokens || []).some(
2525
+ (token) =>
2526
+ Number(token.chainId) === selectedToken.chainId &&
2527
+ token.symbol?.toUpperCase() ===
2528
+ selectedToken.symbol?.toUpperCase(),
2529
+ )
2530
+
2531
+ if (!isSupported) {
2532
+ clearSelectedToken()
2533
+ setSellAmount("")
2534
+ setBuyAmount("")
2535
+ setPrepareSendQuote(null)
2536
+ }
2537
+ } catch (error) {
2538
+ logger.console.warn(
2539
+ "[trails-sdk] Failed to validate Mesh exchange token support, clearing selected token:",
2540
+ error,
2541
+ )
2542
+ clearSelectedToken()
2543
+ setSellAmount("")
2544
+ setBuyAmount("")
2545
+ setPrepareSendQuote(null)
2546
+ }
2547
+ }
2548
+
2549
+ setSelectedFundMethod("onramp-mesh")
2550
+ setSelectedMeshExchange(exchange)
2551
+ navigate("fund-form", { backTarget: "mesh-exchanges" })
2552
+ }}
2553
+ />
2554
+ )
2507
2555
  case "payment-methods":
2508
2556
  return (
2509
2557
  <PaymentMethods
@@ -2772,6 +2820,7 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
2772
2820
  transactionStates={effectiveTransactionStates}
2773
2821
  quote={effectivePrepareSendQuote}
2774
2822
  onRampQuote={onrampProviderQuote}
2823
+ fundMethod={selectedFundMethod}
2775
2824
  timestamp={hostTransactionTimestamp ?? undefined}
2776
2825
  onContinue={() => {
2777
2826
  logger.console.log("[trails-sdk] onContinue called")
@@ -2846,22 +2895,39 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
2846
2895
  try {
2847
2896
  return (
2848
2897
  <div className="flex flex-col h-full">
2849
- {onrampFactory({
2850
- setCurrentScreen: (screen) => {
2851
- navigate(screen)
2852
- },
2853
- onComplete: handleOnrampComplete,
2854
- onError: (error) => {
2855
- logger.console.error("[trails-sdk] Onramp error:", error)
2856
- },
2857
- onBack: handleBack,
2858
- toTokenSymbol: onrampProps?.toTokenSymbol,
2859
- toTokenAmount: onrampProps?.toTokenAmount,
2860
- toChainId: onrampProps?.toChainId,
2861
- toRecipientAddress: onrampProps?.toRecipientAddress,
2862
- toAmountUsd: onrampProps?.toAmountUsd,
2863
- apiKey: trailsApiKey,
2864
- })}
2898
+ <div className="flex-1 min-h-0">
2899
+ {onrampFactory({
2900
+ setCurrentScreen: (screen) => {
2901
+ navigate(screen as Screen)
2902
+ },
2903
+ onComplete: (transferData) => {
2904
+ void handleOnrampComplete(
2905
+ transferData as OnrampTransferResult,
2906
+ )
2907
+ },
2908
+ onError: (error) => {
2909
+ logger.console.error("[trails-sdk] Onramp error:", error)
2910
+ },
2911
+ onBack: handleBack,
2912
+ toTokenSymbol: onrampProps?.toTokenSymbol,
2913
+ toTokenAmount: onrampProps?.toTokenAmount,
2914
+ toChainId: onrampProps?.toChainId,
2915
+ toRecipientAddress: onrampProps?.toRecipientAddress,
2916
+ toAmountUsd: onrampProps?.toAmountUsd,
2917
+ selectedExchange: selectedMeshExchange || undefined,
2918
+ apiKey: trailsApiKey,
2919
+ hostname: trailsApiUrl,
2920
+ })}
2921
+ </div>
2922
+ {effectivePrepareSendQuote && (
2923
+ <div className="mt-4">
2924
+ <QuoteDetails
2925
+ quote={effectivePrepareSendQuote}
2926
+ showContent={true}
2927
+ compact={true}
2928
+ />
2929
+ </div>
2930
+ )}
2865
2931
  </div>
2866
2932
  )
2867
2933
  } catch (error) {
@@ -2952,7 +3018,6 @@ const WidgetContent = forwardRef<TrailsWidgetRef>((_, ref) => {
2952
3018
  id: wallet.id,
2953
3019
  name: wallet.name,
2954
3020
  icon: wallet.icon,
2955
- connector: wallet.connector,
2956
3021
  }))}
2957
3022
  />
2958
3023
  )
@@ -3278,6 +3343,7 @@ export const TrailsWidget = forwardRef<TrailsWidgetRef, TrailsWidgetProps>(
3278
3343
  sequenceApiUrl: props.sequenceApiUrl,
3279
3344
  sequenceIndexerUrl: props.sequenceIndexerUrl,
3280
3345
  sequenceNodeGatewayUrl: props.sequenceNodeGatewayUrl,
3346
+ sequenceMetadataUrl: props.sequenceMetadataUrl,
3281
3347
  walletConnectProjectId: props.walletConnectProjectId,
3282
3348
  slippageTolerance: props.slippageTolerance
3283
3349
  ? String(props.slippageTolerance)