0xtrails 0.2.5 → 0.3.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 (267) hide show
  1. package/dist/aave.d.ts +2 -0
  2. package/dist/aave.d.ts.map +1 -1
  3. package/dist/abortController.d.ts +8 -0
  4. package/dist/abortController.d.ts.map +1 -0
  5. package/dist/{ccip-CXlshvBY.js → ccip-BMB3uDZt.js} +1 -1
  6. package/dist/config.d.ts +0 -5
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/constants.d.ts +4 -4
  9. package/dist/constants.d.ts.map +1 -1
  10. package/dist/error.d.ts +4 -1
  11. package/dist/error.d.ts.map +1 -1
  12. package/dist/fees.d.ts +19 -0
  13. package/dist/fees.d.ts.map +1 -0
  14. package/dist/{index-_QuyGrjU.js → index-QXPUrZVv.js} +48719 -50852
  15. package/dist/index.d.ts +9 -8
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +811 -784
  18. package/dist/intentReceiptMonitor.d.ts +24 -0
  19. package/dist/intentReceiptMonitor.d.ts.map +1 -0
  20. package/dist/intentReceiptPoller.d.ts +69 -0
  21. package/dist/intentReceiptPoller.d.ts.map +1 -0
  22. package/dist/intents.d.ts +15 -11
  23. package/dist/intents.d.ts.map +1 -1
  24. package/dist/morpho.d.ts +6 -5
  25. package/dist/morpho.d.ts.map +1 -1
  26. package/dist/mutations.d.ts +16 -0
  27. package/dist/mutations.d.ts.map +1 -0
  28. package/dist/preconditions.d.ts +5 -4
  29. package/dist/preconditions.d.ts.map +1 -1
  30. package/dist/prepareSend.d.ts +7 -258
  31. package/dist/prepareSend.d.ts.map +1 -1
  32. package/dist/prices.d.ts +9 -6
  33. package/dist/prices.d.ts.map +1 -1
  34. package/dist/sequenceWallet.d.ts +3 -16
  35. package/dist/sequenceWallet.d.ts.map +1 -1
  36. package/dist/tokenBalances.d.ts +17 -13
  37. package/dist/tokenBalances.d.ts.map +1 -1
  38. package/dist/trails.d.ts +24 -40
  39. package/dist/trails.d.ts.map +1 -1
  40. package/dist/transactionIntent/constants.d.ts +7 -0
  41. package/dist/transactionIntent/constants.d.ts.map +1 -0
  42. package/dist/transactionIntent/deposits/depositOrchestrator.d.ts +44 -0
  43. package/dist/transactionIntent/deposits/depositOrchestrator.d.ts.map +1 -0
  44. package/dist/transactionIntent/deposits/gaslessDeposit.d.ts +30 -0
  45. package/dist/transactionIntent/deposits/gaslessDeposit.d.ts.map +1 -0
  46. package/dist/transactionIntent/deposits/index.d.ts +4 -0
  47. package/dist/transactionIntent/deposits/index.d.ts.map +1 -0
  48. package/dist/transactionIntent/deposits/standardDeposit.d.ts +30 -0
  49. package/dist/transactionIntent/deposits/standardDeposit.d.ts.map +1 -0
  50. package/dist/transactionIntent/execution/index.d.ts +2 -0
  51. package/dist/transactionIntent/execution/index.d.ts.map +1 -0
  52. package/dist/transactionIntent/execution/transactionState.d.ts +5 -0
  53. package/dist/transactionIntent/execution/transactionState.d.ts.map +1 -0
  54. package/dist/transactionIntent/handlers/crossChain.d.ts +82 -0
  55. package/dist/transactionIntent/handlers/crossChain.d.ts.map +1 -0
  56. package/dist/transactionIntent/handlers/index.d.ts +4 -0
  57. package/dist/transactionIntent/handlers/index.d.ts.map +1 -0
  58. package/dist/transactionIntent/handlers/sameChainDifferentToken.d.ts +62 -0
  59. package/dist/transactionIntent/handlers/sameChainDifferentToken.d.ts.map +1 -0
  60. package/dist/transactionIntent/handlers/sameChainSameToken.d.ts +72 -0
  61. package/dist/transactionIntent/handlers/sameChainSameToken.d.ts.map +1 -0
  62. package/dist/transactionIntent/index.d.ts +9 -0
  63. package/dist/transactionIntent/index.d.ts.map +1 -0
  64. package/dist/transactionIntent/quote/feeExtractors.d.ts +17 -0
  65. package/dist/transactionIntent/quote/feeExtractors.d.ts.map +1 -0
  66. package/dist/transactionIntent/quote/index.d.ts +4 -0
  67. package/dist/transactionIntent/quote/index.d.ts.map +1 -0
  68. package/dist/transactionIntent/quote/normalizeQuote.d.ts +34 -0
  69. package/dist/transactionIntent/quote/normalizeQuote.d.ts.map +1 -0
  70. package/dist/transactionIntent/quote/quoteHelpers.d.ts +5 -0
  71. package/dist/transactionIntent/quote/quoteHelpers.d.ts.map +1 -0
  72. package/dist/transactionIntent/types.d.ts +131 -0
  73. package/dist/transactionIntent/types.d.ts.map +1 -0
  74. package/dist/transactionIntent/utils/balanceChecker.d.ts +18 -0
  75. package/dist/transactionIntent/utils/balanceChecker.d.ts.map +1 -0
  76. package/dist/transactionIntent/utils/index.d.ts +4 -0
  77. package/dist/transactionIntent/utils/index.d.ts.map +1 -0
  78. package/dist/transactionIntent/utils/lifiHelpers.d.ts +10 -0
  79. package/dist/transactionIntent/utils/lifiHelpers.d.ts.map +1 -0
  80. package/dist/transactionIntent/utils/testnetHelpers.d.ts +3 -0
  81. package/dist/transactionIntent/utils/testnetHelpers.d.ts.map +1 -0
  82. package/dist/transactionIntent/validators.d.ts +6 -0
  83. package/dist/transactionIntent/validators.d.ts.map +1 -0
  84. package/dist/transactions.d.ts +6 -3
  85. package/dist/transactions.d.ts.map +1 -1
  86. package/dist/widget/components/AccountIntentTransactionHistoryButton.d.ts +4 -0
  87. package/dist/widget/components/AccountIntentTransactionHistoryButton.d.ts.map +1 -0
  88. package/dist/widget/components/AccountSettings.d.ts.map +1 -1
  89. package/dist/widget/components/ChainFilterDropdown.d.ts.map +1 -1
  90. package/dist/widget/components/ClassicSwap.d.ts +2 -3
  91. package/dist/widget/components/ClassicSwap.d.ts.map +1 -1
  92. package/dist/widget/components/ConfigDisplay.d.ts.map +1 -1
  93. package/dist/widget/components/ConnectWallet.d.ts.map +1 -1
  94. package/dist/widget/components/ConnectedWallets.d.ts.map +1 -1
  95. package/dist/widget/components/DynamicInputStyles.d.ts +18 -0
  96. package/dist/widget/components/DynamicInputStyles.d.ts.map +1 -0
  97. package/dist/widget/components/DynamicSizeInputField.d.ts +13 -0
  98. package/dist/widget/components/DynamicSizeInputField.d.ts.map +1 -0
  99. package/dist/widget/components/Earn.d.ts +2 -3
  100. package/dist/widget/components/Earn.d.ts.map +1 -1
  101. package/dist/widget/components/ErrorAnimationIcon.d.ts +2 -0
  102. package/dist/widget/components/ErrorAnimationIcon.d.ts.map +1 -0
  103. package/dist/widget/components/FeeBreakdown.d.ts +9 -0
  104. package/dist/widget/components/FeeBreakdown.d.ts.map +1 -0
  105. package/dist/widget/components/FeeOptions.d.ts +5 -13
  106. package/dist/widget/components/FeeOptions.d.ts.map +1 -1
  107. package/dist/widget/components/Fund.d.ts +2 -3
  108. package/dist/widget/components/Fund.d.ts.map +1 -1
  109. package/dist/widget/components/FundMethods.d.ts.map +1 -1
  110. package/dist/widget/components/FundSwap.d.ts +2 -3
  111. package/dist/widget/components/FundSwap.d.ts.map +1 -1
  112. package/dist/widget/components/FundingMethodSelectorButton.d.ts.map +1 -1
  113. package/dist/widget/components/Identicon.d.ts.map +1 -1
  114. package/dist/widget/components/MeshConnectExchanges.d.ts +0 -3
  115. package/dist/widget/components/MeshConnectExchanges.d.ts.map +1 -1
  116. package/dist/widget/components/Modal.d.ts.map +1 -1
  117. package/dist/widget/components/Pay.d.ts +2 -3
  118. package/dist/widget/components/Pay.d.ts.map +1 -1
  119. package/dist/widget/components/PoolDeposit.d.ts +3 -3
  120. package/dist/widget/components/PoolDeposit.d.ts.map +1 -1
  121. package/dist/widget/components/PoolWithdraw.d.ts +3 -20
  122. package/dist/widget/components/PoolWithdraw.d.ts.map +1 -1
  123. package/dist/widget/components/QuoteDetails.d.ts +2 -0
  124. package/dist/widget/components/QuoteDetails.d.ts.map +1 -1
  125. package/dist/widget/components/Receipt.d.ts.map +1 -1
  126. package/dist/widget/components/RecipientSelectorButton.d.ts.map +1 -1
  127. package/dist/widget/components/ScreenHeader.d.ts.map +1 -1
  128. package/dist/widget/components/Swap.d.ts +2 -3
  129. package/dist/widget/components/Swap.d.ts.map +1 -1
  130. package/dist/widget/components/ThemeProvider.d.ts.map +1 -1
  131. package/dist/widget/components/TokenDisplayNonSelectable.d.ts +11 -0
  132. package/dist/widget/components/TokenDisplayNonSelectable.d.ts.map +1 -0
  133. package/dist/widget/components/TokenSelector.d.ts.map +1 -1
  134. package/dist/widget/components/TokenSelectorButton.d.ts.map +1 -1
  135. package/dist/widget/components/Tooltip.d.ts +9 -0
  136. package/dist/widget/components/Tooltip.d.ts.map +1 -0
  137. package/dist/widget/components/TransferPendingVertical.d.ts.map +1 -1
  138. package/dist/widget/components/WaasFeeOptions.d.ts +1 -0
  139. package/dist/widget/components/WaasFeeOptions.d.ts.map +1 -1
  140. package/dist/widget/components/WalletConfirmation.d.ts.map +1 -1
  141. package/dist/widget/components/WalletConnect.d.ts.map +1 -1
  142. package/dist/widget/css/compiled.css +2 -2
  143. package/dist/widget/hooks/useCheckout.d.ts +17 -4
  144. package/dist/widget/hooks/useCheckout.d.ts.map +1 -1
  145. package/dist/widget/hooks/useDefaultTokenSelection.d.ts.map +1 -1
  146. package/dist/widget/hooks/useQuote.d.ts +82 -0
  147. package/dist/widget/hooks/useQuote.d.ts.map +1 -0
  148. package/dist/widget/hooks/useSelectedFeeToken.d.ts +1 -0
  149. package/dist/widget/hooks/useSelectedFeeToken.d.ts.map +1 -1
  150. package/dist/widget/hooks/useSendForm.d.ts +5 -6
  151. package/dist/widget/hooks/useSendForm.d.ts.map +1 -1
  152. package/dist/widget/hooks/useTokenList.d.ts.map +1 -1
  153. package/dist/widget/hooks/useWalletConnectionContext.d.ts +25 -0
  154. package/dist/widget/hooks/useWalletConnectionContext.d.ts.map +1 -0
  155. package/dist/widget/index.js +2 -2
  156. package/dist/widget/widget.d.ts +17 -7
  157. package/dist/widget/widget.d.ts.map +1 -1
  158. package/package.json +19 -21
  159. package/src/aave.ts +54 -1
  160. package/src/abortController.ts +35 -0
  161. package/src/config.ts +57 -58
  162. package/src/constants.ts +11 -9
  163. package/src/error.ts +21 -3
  164. package/src/fees.ts +210 -0
  165. package/src/index.ts +35 -13
  166. package/src/intentReceiptMonitor.ts +102 -0
  167. package/src/intentReceiptPoller.ts +299 -0
  168. package/src/intents.ts +205 -171
  169. package/src/morpho.ts +58 -9
  170. package/src/mutations.ts +129 -0
  171. package/src/preconditions.ts +16 -21
  172. package/src/prepareSend.ts +92 -4699
  173. package/src/prices.ts +26 -22
  174. package/src/relaySdk.ts +2 -2
  175. package/src/sequenceWallet.ts +6 -73
  176. package/src/tokenBalances.ts +175 -69
  177. package/src/trails.ts +230 -722
  178. package/src/transactionIntent/constants.ts +11 -0
  179. package/src/transactionIntent/deposits/depositOrchestrator.ts +210 -0
  180. package/src/transactionIntent/deposits/gaslessDeposit.ts +588 -0
  181. package/src/transactionIntent/deposits/index.ts +3 -0
  182. package/src/transactionIntent/deposits/standardDeposit.ts +379 -0
  183. package/src/transactionIntent/execution/index.ts +1 -0
  184. package/src/transactionIntent/execution/transactionState.ts +35 -0
  185. package/src/transactionIntent/handlers/crossChain.ts +1707 -0
  186. package/src/transactionIntent/handlers/index.ts +3 -0
  187. package/src/transactionIntent/handlers/sameChainDifferentToken.ts +323 -0
  188. package/src/transactionIntent/handlers/sameChainSameToken.ts +712 -0
  189. package/src/transactionIntent/index.ts +9 -0
  190. package/src/transactionIntent/quote/feeExtractors.ts +81 -0
  191. package/src/transactionIntent/quote/index.ts +3 -0
  192. package/src/transactionIntent/quote/normalizeQuote.ts +367 -0
  193. package/src/transactionIntent/quote/quoteHelpers.ts +53 -0
  194. package/src/transactionIntent/types.ts +157 -0
  195. package/src/transactionIntent/utils/balanceChecker.ts +96 -0
  196. package/src/transactionIntent/utils/index.ts +3 -0
  197. package/src/transactionIntent/utils/lifiHelpers.ts +68 -0
  198. package/src/transactionIntent/utils/testnetHelpers.ts +10 -0
  199. package/src/transactionIntent/validators.ts +57 -0
  200. package/src/transactions.ts +98 -71
  201. package/src/widget/compiled.css +2 -2
  202. package/src/widget/components/AccountIntentTransactionHistory.tsx +36 -36
  203. package/src/widget/components/AccountIntentTransactionHistoryButton.tsx +22 -0
  204. package/src/widget/components/AccountSettings.tsx +70 -41
  205. package/src/widget/components/ChainFilterDropdown.tsx +24 -3
  206. package/src/widget/components/ClassicSwap.tsx +44 -107
  207. package/src/widget/components/ConfigDisplay.tsx +0 -11
  208. package/src/widget/components/ConnectWallet.tsx +4 -1
  209. package/src/widget/components/ConnectedWallets.tsx +51 -25
  210. package/src/widget/components/DynamicInputStyles.tsx +76 -0
  211. package/src/widget/components/DynamicSizeInputField.tsx +109 -0
  212. package/src/widget/components/Earn.tsx +34 -45
  213. package/src/widget/components/ErrorAnimationIcon.tsx +130 -0
  214. package/src/widget/components/FeeBreakdown.tsx +155 -0
  215. package/src/widget/components/FeeOption.tsx +2 -2
  216. package/src/widget/components/FeeOptions.tsx +151 -112
  217. package/src/widget/components/Fund.tsx +10 -29
  218. package/src/widget/components/FundMethods.tsx +4 -3
  219. package/src/widget/components/FundSwap.tsx +2 -3
  220. package/src/widget/components/FundingMethodSelectorButton.tsx +24 -14
  221. package/src/widget/components/Identicon.tsx +164 -95
  222. package/src/widget/components/MeshConnectExchanges.tsx +2 -15
  223. package/src/widget/components/Modal.tsx +0 -12
  224. package/src/widget/components/Pay.tsx +72 -75
  225. package/src/widget/components/PoolDeposit.tsx +221 -242
  226. package/src/widget/components/PoolWithdraw.tsx +347 -469
  227. package/src/widget/components/PriceImpactWarning.tsx +1 -1
  228. package/src/widget/components/QuoteDetails.tsx +906 -484
  229. package/src/widget/components/Receipt.tsx +16 -2
  230. package/src/widget/components/RecipientSelectorButton.tsx +7 -5
  231. package/src/widget/components/Recipients.tsx +1 -1
  232. package/src/widget/components/ScreenHeader.tsx +60 -36
  233. package/src/widget/components/Swap.tsx +2 -3
  234. package/src/widget/components/ThemeProvider.tsx +2 -1
  235. package/src/widget/components/TokenDisplayNonSelectable.tsx +40 -0
  236. package/src/widget/components/TokenImage.tsx +1 -1
  237. package/src/widget/components/TokenSelector.tsx +62 -53
  238. package/src/widget/components/TokenSelectorButton.tsx +38 -15
  239. package/src/widget/components/Tooltip.tsx +51 -0
  240. package/src/widget/components/TransferPendingVertical.tsx +12 -8
  241. package/src/widget/components/WaasFeeOptions.tsx +139 -4
  242. package/src/widget/components/WalletConfirmation.tsx +23 -13
  243. package/src/widget/components/WalletConnect.tsx +93 -29
  244. package/src/widget/hooks/useAmountUsd.ts +9 -9
  245. package/src/widget/hooks/useCheckout.ts +97 -9
  246. package/src/widget/hooks/useDefaultTokenSelection.tsx +27 -21
  247. package/src/widget/hooks/useQuote.ts +466 -0
  248. package/src/widget/hooks/useSelectedFeeToken.tsx +32 -37
  249. package/src/widget/hooks/useSendForm.ts +45 -51
  250. package/src/widget/hooks/useTokenList.ts +34 -26
  251. package/src/widget/hooks/useWalletConnectionContext.tsx +128 -0
  252. package/src/widget/widget.tsx +365 -390
  253. package/dist/apiClient.d.ts +0 -9
  254. package/dist/apiClient.d.ts.map +0 -1
  255. package/dist/intentEntrypoint.d.ts +0 -114
  256. package/dist/intentEntrypoint.d.ts.map +0 -1
  257. package/dist/metaTxnMonitor.d.ts +0 -15
  258. package/dist/metaTxnMonitor.d.ts.map +0 -1
  259. package/dist/metaTxns.d.ts +0 -11
  260. package/dist/metaTxns.d.ts.map +0 -1
  261. package/dist/relayer.d.ts +0 -43
  262. package/dist/relayer.d.ts.map +0 -1
  263. package/src/apiClient.ts +0 -35
  264. package/src/intentEntrypoint.ts +0 -203
  265. package/src/metaTxnMonitor.ts +0 -171
  266. package/src/metaTxns.ts +0 -45
  267. package/src/relayer.ts +0 -289
@@ -0,0 +1,379 @@
1
+ import type {
2
+ Account,
3
+ Chain,
4
+ PublicClient,
5
+ WalletClient,
6
+ TransactionReceipt,
7
+ } from "viem"
8
+ import { parseUnits } from "viem"
9
+ import type { TransactionState } from "../../transactions.js"
10
+ import type { CheckoutOnHandlers } from "../../widget/hooks/useCheckout.js"
11
+ import { logger } from "../../logger.js"
12
+ import { getNeedsLifiNativeFee } from "../utils/lifiHelpers.js"
13
+ import {
14
+ buildCrossChainDepositParams,
15
+ buildSameChainSameTokenTransactionParams,
16
+ sendOriginTransaction,
17
+ } from "../../intents.js"
18
+ import { estimateGasLimit } from "../../estimate.js"
19
+ import { attemptSwitchChain } from "../../chainSwitch.js"
20
+ import { requestWithTimeout } from "../../utils.js"
21
+ import { updatePersistentToast } from "../../toast.js"
22
+ import { getChainInfo } from "../../chains.js"
23
+ import { trackTransactionConfirmed } from "../../analytics.js"
24
+
25
+ export async function attemptStandardDeposit({
26
+ originTokenAddress,
27
+ firstPreconditionMin,
28
+ onOriginSend,
29
+ publicClient,
30
+ walletClient,
31
+ originChainId,
32
+ chain,
33
+ account,
34
+ fee,
35
+ dryMode,
36
+ sourceTokenPriceUsd,
37
+ destinationTokenPriceUsd,
38
+ swapAmount,
39
+ destinationTokenDecimals,
40
+ sourceTokenDecimals,
41
+ originIntentAddress,
42
+ onTransactionStateChange,
43
+ transactionStates,
44
+ originTokenSymbol,
45
+ destinationTokenSymbol,
46
+ depositAmountUsd,
47
+ checkoutOnHandlers,
48
+ isSameChainSameToken,
49
+ recipient,
50
+ }: {
51
+ originTokenAddress: string
52
+ firstPreconditionMin: string
53
+ onOriginSend?: () => void
54
+ publicClient: PublicClient
55
+ walletClient: WalletClient
56
+ originChainId: number
57
+ chain: Chain
58
+ account: Account
59
+ fee: string
60
+ dryMode: boolean
61
+ sourceTokenPriceUsd?: number | null
62
+ destinationTokenPriceUsd?: number | null
63
+ swapAmount: string
64
+ destinationTokenDecimals: number
65
+ sourceTokenDecimals: number
66
+ originIntentAddress: string
67
+ onTransactionStateChange: (transactionStates: TransactionState[]) => void
68
+ transactionStates: TransactionState[]
69
+ originTokenSymbol: string
70
+ destinationTokenSymbol: string
71
+ depositAmountUsd: number
72
+ checkoutOnHandlers?: CheckoutOnHandlers
73
+ isSameChainSameToken?: boolean
74
+ recipient?: string
75
+ }): Promise<TransactionReceipt | null> {
76
+ let depositUserTxnReceipt: TransactionReceipt | null = null
77
+ const usingLIfi = false
78
+ let needsNativeFee = false
79
+
80
+ if (usingLIfi) {
81
+ needsNativeFee = getNeedsLifiNativeFee({
82
+ originTokenAddress,
83
+ destinationTokenAmount: swapAmount,
84
+ destinationTokenDecimals,
85
+ sourceTokenDecimals,
86
+ sourceTokenPriceUsd: sourceTokenPriceUsd ?? null,
87
+ destinationTokenPriceUsd: destinationTokenPriceUsd ?? null,
88
+ depositAmount: firstPreconditionMin,
89
+ })
90
+ }
91
+ let nativeFee = parseUnits("0.00005", 18).toString()
92
+ if (originChainId === 137) {
93
+ nativeFee = parseUnits("1.5", 18).toString()
94
+ }
95
+
96
+ logger.console.log("[trails-sdk] needsNativeFee", needsNativeFee)
97
+
98
+ // Build origin call params
99
+ // For same-chain deposits, send directly to recipient (not intent address)
100
+ // For cross-chain deposits, send to intent address for backend processing
101
+ const originCallParamsBase = isSameChainSameToken
102
+ ? buildSameChainSameTokenTransactionParams({
103
+ hasCustomCalldata: false,
104
+ recipient: recipient || originIntentAddress,
105
+ effectiveOriginTokenAddress: originTokenAddress,
106
+ swapAmount: firstPreconditionMin,
107
+ effectiveOriginChainId: originChainId,
108
+ effectiveOriginChain: chain,
109
+ })
110
+ : buildCrossChainDepositParams({
111
+ originTokenAddress,
112
+ originIntentAddress,
113
+ depositAmount: firstPreconditionMin,
114
+ fee,
115
+ originChainId,
116
+ chain,
117
+ })
118
+
119
+ // Estimate gas limit for consistency with actual transaction
120
+ const gasLimit = await estimateGasLimit(
121
+ publicClient,
122
+ {
123
+ account: account.address,
124
+ to: originCallParamsBase.to,
125
+ data: originCallParamsBase.data,
126
+ value: BigInt(originCallParamsBase.value),
127
+ },
128
+ "deposit",
129
+ )
130
+
131
+ const originCallParams = {
132
+ ...originCallParamsBase,
133
+ gasLimit,
134
+ }
135
+
136
+ await attemptSwitchChain({
137
+ walletClient,
138
+ desiredChainId: originChainId,
139
+ })
140
+
141
+ let useSendCalls = false
142
+ const moreThan1Tx = needsNativeFee
143
+
144
+ if (moreThan1Tx) {
145
+ try {
146
+ // the reason for the timeout is some users experience this call to hang indefinitely on metamask on all chains.
147
+ // not sure why this is happening, but it happens.
148
+ const capabilities = await requestWithTimeout<Record<string, any>>(
149
+ walletClient,
150
+ [
151
+ {
152
+ method: "wallet_getCapabilities",
153
+ params: [account.address],
154
+ },
155
+ ],
156
+ 10000,
157
+ )
158
+
159
+ logger.console.log("[trails-sdk] capabilities", capabilities)
160
+
161
+ // Check if the chain supports atomic transactions
162
+ const chainHex = `0x${originChainId.toString(16)}` as const
163
+ const chainCapabilities = capabilities[chainHex]
164
+ useSendCalls = chainCapabilities?.atomic?.status === "supported"
165
+ } catch (error) {
166
+ logger.console.error("[trails-sdk] Error getting capabilities", error)
167
+ }
168
+ }
169
+
170
+ if (dryMode) {
171
+ logger.console.log("[trails-sdk] dry mode, skipping send calls")
172
+ }
173
+
174
+ if (useSendCalls) {
175
+ logger.console.log("[trails-sdk] using sendCalls")
176
+ } else {
177
+ logger.console.log("[trails-sdk] using sendTransaction")
178
+ }
179
+
180
+ if (useSendCalls) {
181
+ if (!dryMode) {
182
+ const calls: Array<{
183
+ to: `0x${string}`
184
+ data: `0x${string}`
185
+ value?: `0x${string}`
186
+ }> = []
187
+ if (needsNativeFee) {
188
+ calls.push({
189
+ to: originIntentAddress as `0x${string}`,
190
+ data: "0x00",
191
+ value: `0x${BigInt(nativeFee).toString(16)}` as `0x${string}`,
192
+ })
193
+ }
194
+
195
+ // Add the origin call
196
+ calls.push({
197
+ to: originCallParams.to as `0x${string}`,
198
+ data: originCallParams.data as `0x${string}`,
199
+ value: originCallParams.value
200
+ ? `0x${BigInt(originCallParams.value).toString(16)}`
201
+ : "0x0",
202
+ })
203
+
204
+ // Update persistent toast before wallet interaction
205
+ updatePersistentToast(
206
+ "Waiting for Confirmation",
207
+ "Please confirm the transaction in your wallet...",
208
+ "info",
209
+ )
210
+
211
+ // Send the batched call via EIP-7702
212
+ const result = (await walletClient.request({
213
+ method: "wallet_sendCalls",
214
+ params: [
215
+ {
216
+ version: "2.0.0",
217
+ chainId: `0x${originChainId.toString(16)}`,
218
+ atomicRequired: true,
219
+ calls,
220
+ },
221
+ ],
222
+ })) as { requestId: `0x${string}` }
223
+
224
+ logger.console.log("[trails-sdk] sendCalls result", result)
225
+ const requestId = result.requestId || (result as any).id
226
+
227
+ // Poll to check if the tx has been submitted
228
+ let txHash: `0x${string}` | undefined
229
+ while (!txHash) {
230
+ const status = (await walletClient.request({
231
+ method: "wallet_getCallsStatus",
232
+ params: [requestId],
233
+ })) as {
234
+ status: "pending" | "submitted" | "failed"
235
+ transactionHash?: `0x${string}`
236
+ error?: string
237
+ }
238
+
239
+ logger.console.log("[trails-sdk] getCallsStatus result", status)
240
+ const receipt = (status as any)?.receipts?.[0]
241
+
242
+ if ((status as any).status === 200 && receipt?.transactionHash) {
243
+ txHash = receipt.transactionHash
244
+ break
245
+ } else if ((status as any).status === 500) {
246
+ throw new Error(`Transaction failed: ${status.error}`)
247
+ }
248
+
249
+ // wait a bit before polling again
250
+ await new Promise((r) => setTimeout(r, 2000))
251
+ }
252
+
253
+ if (onOriginSend) {
254
+ onOriginSend()
255
+ }
256
+
257
+ // Update persistent toast after transaction sent
258
+ const chainInfo = getChainInfo(originChainId)
259
+ updatePersistentToast(
260
+ "Transaction Submitted",
261
+ `Waiting for confirmation on ${chainInfo?.name || "chain"}...`,
262
+ "info",
263
+ )
264
+
265
+ const receipt = await publicClient.waitForTransactionReceipt({
266
+ hash: txHash as `0x${string}`,
267
+ })
268
+ logger.console.log("[trails-sdk] receipt", receipt)
269
+ depositUserTxnReceipt = receipt
270
+ }
271
+ } else {
272
+ if (!dryMode) {
273
+ if (needsNativeFee) {
274
+ // Trigger signature request callback before prompting wallet
275
+ if (checkoutOnHandlers?.triggerCheckoutSignatureRequest) {
276
+ checkoutOnHandlers.triggerCheckoutSignatureRequest()
277
+ }
278
+
279
+ const txHashNativeFee = await sendOriginTransaction(
280
+ account,
281
+ walletClient,
282
+ {
283
+ to: originIntentAddress,
284
+ data: "0x00",
285
+ value: nativeFee,
286
+ chainId: originChainId,
287
+ chain,
288
+ } as any,
289
+ {
290
+ depositTokenAmountUsd: depositAmountUsd?.toString(),
291
+ },
292
+ ) // TODO: Add proper type
293
+ logger.console.log("[trails-sdk] origin tx native fee", txHashNativeFee)
294
+
295
+ // Trigger signature confirmed callback after successful signing
296
+ if (checkoutOnHandlers?.triggerCheckoutSignatureConfirmed) {
297
+ checkoutOnHandlers.triggerCheckoutSignatureConfirmed()
298
+ }
299
+ // Wait for transaction receipt
300
+ const feeReceipt = await publicClient.waitForTransactionReceipt({
301
+ hash: txHashNativeFee,
302
+ })
303
+ logger.console.log("[trails-sdk] nativeFeeReceipt", feeReceipt)
304
+ }
305
+
306
+ // Show persistent toast for checkout flow
307
+ updatePersistentToast(
308
+ "Payment Started",
309
+ "Waiting for wallet confirmation...",
310
+ "info",
311
+ )
312
+
313
+ // Trigger signature request callback before prompting wallet
314
+ if (checkoutOnHandlers?.triggerCheckoutSignatureRequest) {
315
+ checkoutOnHandlers.triggerCheckoutSignatureRequest()
316
+ }
317
+
318
+ const txHash = await sendOriginTransaction(
319
+ account,
320
+ walletClient,
321
+ originCallParams as any,
322
+ {
323
+ depositTokenAmountUsd: depositAmountUsd?.toString(),
324
+ },
325
+ ) // TODO: Add proper type
326
+ logger.console.log("[trails-sdk] origin tx", txHash)
327
+
328
+ // Trigger signature confirmed callback after successful signing
329
+ if (checkoutOnHandlers?.triggerCheckoutSignatureConfirmed) {
330
+ checkoutOnHandlers.triggerCheckoutSignatureConfirmed()
331
+ }
332
+
333
+ if (onOriginSend) {
334
+ onOriginSend()
335
+ }
336
+
337
+ if (transactionStates[0]) {
338
+ transactionStates[0].state = "pending"
339
+
340
+ try {
341
+ onTransactionStateChange(transactionStates)
342
+ } catch (error) {
343
+ logger.console.error(
344
+ "[trails-sdk] Error calling onTransactionStateChange:",
345
+ error,
346
+ )
347
+ }
348
+ }
349
+
350
+ // Wait for transaction receipt
351
+ const receipt = await publicClient.waitForTransactionReceipt({
352
+ hash: txHash,
353
+ })
354
+
355
+ const chainInfo = getChainInfo(originChainId)
356
+ updatePersistentToast(
357
+ "Transfer Confirmed",
358
+ `Your transaction on ${chainInfo?.name || "chain"} has been confirmed`,
359
+ "info",
360
+ )
361
+
362
+ trackTransactionConfirmed({
363
+ transactionHash: txHash,
364
+ chainId: originChainId,
365
+ userAddress: account.address,
366
+ blockNumber: Number(receipt.blockNumber),
367
+ originIntentAddress,
368
+ originTokenSymbol,
369
+ destinationTokenSymbol,
370
+ depositTokenAmountUsd: depositAmountUsd?.toString(),
371
+ })
372
+
373
+ logger.console.log("[trails-sdk] receipt", receipt)
374
+ depositUserTxnReceipt = receipt
375
+ }
376
+ }
377
+
378
+ return depositUserTxnReceipt
379
+ }
@@ -0,0 +1 @@
1
+ export * from "./transactionState.js"
@@ -0,0 +1,35 @@
1
+ import type { TransactionReceipt } from "viem"
2
+ import type { MetaTxnReceipt } from "../types.js"
3
+ import type {
4
+ TransactionState,
5
+ TransactionStateStatus,
6
+ } from "../../transactions.js"
7
+ import { getExplorerUrl } from "../../explorer.js"
8
+
9
+ export function getTransactionStateFromReceipt(
10
+ receipt: TransactionReceipt | MetaTxnReceipt,
11
+ chainId: number,
12
+ label: string = "Transaction",
13
+ ): TransactionState {
14
+ let txHash: string = ""
15
+ let state: TransactionStateStatus = "pending"
16
+ let blockNumber: number = 0
17
+ if ("transactionHash" in receipt) {
18
+ txHash = receipt.transactionHash
19
+ state = receipt.status === "success" ? "confirmed" : "failed"
20
+ blockNumber = Number(receipt.blockNumber)
21
+ } else if ("txnHash" in receipt) {
22
+ txHash = receipt.txnHash || ""
23
+ state = receipt.status === "SUCCEEDED" ? "confirmed" : "failed"
24
+ blockNumber = 0 // IntentTransaction doesn't have blockNumber
25
+ }
26
+
27
+ return {
28
+ transactionHash: txHash,
29
+ explorerUrl: getExplorerUrl({ txHash, chainId }),
30
+ chainId,
31
+ blockNumber,
32
+ state,
33
+ label,
34
+ }
35
+ }