0xtrails 0.5.0 → 0.6.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 (189) hide show
  1. package/dist/analytics.d.ts +8 -3
  2. package/dist/analytics.d.ts.map +1 -1
  3. package/dist/{ccip-DhEkQ6QC.js → ccip-Dw5AN7oU.js} +1 -1
  4. package/dist/cctp.d.ts +0 -149
  5. package/dist/cctp.d.ts.map +1 -1
  6. package/dist/chains.d.ts +28 -3
  7. package/dist/chains.d.ts.map +1 -1
  8. package/dist/config.d.ts +11 -0
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/constants.d.ts +1 -1
  11. package/dist/constants.d.ts.map +1 -1
  12. package/dist/contractUtils.d.ts.map +1 -1
  13. package/dist/estimate.d.ts.map +1 -1
  14. package/dist/fees.d.ts.map +1 -1
  15. package/dist/gasless.d.ts +12 -0
  16. package/dist/gasless.d.ts.map +1 -1
  17. package/dist/{index-MhD2DA7_.js → index-BtVUTbEZ.js} +30984 -38945
  18. package/dist/index.d.ts +7 -5
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +108 -107
  21. package/dist/indexerClient.d.ts +2 -2
  22. package/dist/intents.d.ts +0 -17
  23. package/dist/intents.d.ts.map +1 -1
  24. package/dist/mutations.d.ts.map +1 -1
  25. package/dist/paymasterSend.d.ts.map +1 -1
  26. package/dist/prepareSend.d.ts +1 -1
  27. package/dist/prepareSend.d.ts.map +1 -1
  28. package/dist/sendUserOp.d.ts +0 -18
  29. package/dist/sendUserOp.d.ts.map +1 -1
  30. package/dist/tokenBalances.d.ts.map +1 -1
  31. package/dist/tokens.d.ts +10 -8
  32. package/dist/tokens.d.ts.map +1 -1
  33. package/dist/transactionIntent/deposits/depositOrchestrator.d.ts +4 -5
  34. package/dist/transactionIntent/deposits/depositOrchestrator.d.ts.map +1 -1
  35. package/dist/transactionIntent/deposits/gaslessDeposit.d.ts +4 -5
  36. package/dist/transactionIntent/deposits/gaslessDeposit.d.ts.map +1 -1
  37. package/dist/transactionIntent/deposits/standardDeposit.d.ts +2 -2
  38. package/dist/transactionIntent/deposits/standardDeposit.d.ts.map +1 -1
  39. package/dist/transactionIntent/execution/transactionState.d.ts +2 -2
  40. package/dist/transactionIntent/execution/transactionState.d.ts.map +1 -1
  41. package/dist/transactionIntent/handlers/crossChain.d.ts +4 -4
  42. package/dist/transactionIntent/handlers/crossChain.d.ts.map +1 -1
  43. package/dist/transactionIntent/handlers/index.d.ts +0 -1
  44. package/dist/transactionIntent/handlers/index.d.ts.map +1 -1
  45. package/dist/transactionIntent/handlers/sameChainSameToken.d.ts +4 -34
  46. package/dist/transactionIntent/handlers/sameChainSameToken.d.ts.map +1 -1
  47. package/dist/transactionIntent/quote/normalizeQuote.d.ts.map +1 -1
  48. package/dist/transactionIntent/quote/quoteHelpers.d.ts +2 -1
  49. package/dist/transactionIntent/quote/quoteHelpers.d.ts.map +1 -1
  50. package/dist/transactionIntent/types.d.ts +6 -19
  51. package/dist/transactionIntent/types.d.ts.map +1 -1
  52. package/dist/transactionIntent/utils/index.d.ts +0 -1
  53. package/dist/transactionIntent/utils/index.d.ts.map +1 -1
  54. package/dist/transactions.d.ts +2 -20
  55. package/dist/transactions.d.ts.map +1 -1
  56. package/dist/utils.d.ts +8 -2
  57. package/dist/utils.d.ts.map +1 -1
  58. package/dist/walletUtils.d.ts +21 -0
  59. package/dist/walletUtils.d.ts.map +1 -0
  60. package/dist/wallets.d.ts +33 -240
  61. package/dist/wallets.d.ts.map +1 -1
  62. package/dist/widget/components/AccountIntentTransactionHistory.d.ts.map +1 -1
  63. package/dist/widget/components/ClassicSwap.d.ts.map +1 -1
  64. package/dist/widget/components/FeeOption.d.ts +8 -13
  65. package/dist/widget/components/FeeOption.d.ts.map +1 -1
  66. package/dist/widget/components/FeeOptions.d.ts +11 -5
  67. package/dist/widget/components/FeeOptions.d.ts.map +1 -1
  68. package/dist/widget/components/NativeGasOption.d.ts.map +1 -1
  69. package/dist/widget/components/Pay.d.ts.map +1 -1
  70. package/dist/widget/components/PoolDeposit.d.ts.map +1 -1
  71. package/dist/widget/components/QRCodeDeposit.d.ts +5 -0
  72. package/dist/widget/components/QRCodeDeposit.d.ts.map +1 -1
  73. package/dist/widget/components/QRCodeWalletSelect.d.ts +13 -0
  74. package/dist/widget/components/QRCodeWalletSelect.d.ts.map +1 -0
  75. package/dist/widget/components/QrCode.d.ts.map +1 -1
  76. package/dist/widget/components/QuoteDetails.d.ts.map +1 -1
  77. package/dist/widget/components/Receipt.d.ts.map +1 -1
  78. package/dist/widget/components/ScreenHeader.d.ts +1 -1
  79. package/dist/widget/components/ScreenHeader.d.ts.map +1 -1
  80. package/dist/widget/components/Toast.d.ts.map +1 -1
  81. package/dist/widget/components/TokenImage.d.ts.map +1 -1
  82. package/dist/widget/css/compiled.css +1 -1
  83. package/dist/widget/hooks/useCheckout.d.ts +15 -1
  84. package/dist/widget/hooks/useCheckout.d.ts.map +1 -1
  85. package/dist/widget/hooks/useCurrentScreen.d.ts +1 -1
  86. package/dist/widget/hooks/useCurrentScreen.d.ts.map +1 -1
  87. package/dist/widget/hooks/useDebugScreens.d.ts +1 -1
  88. package/dist/widget/hooks/useDebugScreens.d.ts.map +1 -1
  89. package/dist/widget/hooks/useIntentTransactionHistory.d.ts.map +1 -1
  90. package/dist/widget/hooks/useIsConnectedWalletSmartContract.d.ts +7 -0
  91. package/dist/widget/hooks/useIsConnectedWalletSmartContract.d.ts.map +1 -0
  92. package/dist/widget/hooks/useIsSequenceWallet.d.ts +6 -0
  93. package/dist/widget/hooks/useIsSequenceWallet.d.ts.map +1 -0
  94. package/dist/widget/hooks/useQuote.d.ts +5 -8
  95. package/dist/widget/hooks/useQuote.d.ts.map +1 -1
  96. package/dist/widget/hooks/useRecentTokens.d.ts.map +1 -1
  97. package/dist/widget/hooks/useSelectedFeeOption.d.ts +30 -0
  98. package/dist/widget/hooks/useSelectedFeeOption.d.ts.map +1 -0
  99. package/dist/widget/hooks/useSendForm.d.ts +6 -15
  100. package/dist/widget/hooks/useSendForm.d.ts.map +1 -1
  101. package/dist/widget/hooks/useTokenList.d.ts.map +1 -1
  102. package/dist/widget/index.js +1 -1
  103. package/dist/widget/providers/TrailsProvider.d.ts +23 -12
  104. package/dist/widget/providers/TrailsProvider.d.ts.map +1 -1
  105. package/dist/widget/widget.d.ts +11 -0
  106. package/dist/widget/widget.d.ts.map +1 -1
  107. package/package.json +8 -8
  108. package/src/analytics.ts +53 -21
  109. package/src/cctp.ts +0 -1016
  110. package/src/chains.ts +93 -39
  111. package/src/config.ts +24 -6
  112. package/src/constants.ts +1 -4
  113. package/src/contractUtils.ts +6 -6
  114. package/src/estimate.ts +3 -6
  115. package/src/fees.ts +5 -10
  116. package/src/gasless.ts +45 -0
  117. package/src/index.ts +7 -6
  118. package/src/indexerClient.ts +2 -2
  119. package/src/intents.ts +52 -206
  120. package/src/mutations.ts +3 -2
  121. package/src/paymasterSend.ts +2 -5
  122. package/src/prepareSend.ts +9 -12
  123. package/src/sendUserOp.ts +3 -64
  124. package/src/tokenBalances.ts +2 -1
  125. package/src/tokens.ts +62 -133
  126. package/src/trailsClient.ts +1 -1
  127. package/src/transactionIntent/deposits/depositOrchestrator.ts +14 -15
  128. package/src/transactionIntent/deposits/gaslessDeposit.ts +70 -100
  129. package/src/transactionIntent/deposits/standardDeposit.ts +22 -28
  130. package/src/transactionIntent/execution/transactionState.ts +2 -2
  131. package/src/transactionIntent/handlers/crossChain.ts +165 -385
  132. package/src/transactionIntent/handlers/index.ts +0 -1
  133. package/src/transactionIntent/handlers/sameChainSameToken.ts +228 -94
  134. package/src/transactionIntent/quote/normalizeQuote.ts +4 -6
  135. package/src/transactionIntent/quote/quoteHelpers.ts +35 -3
  136. package/src/transactionIntent/types.ts +6 -27
  137. package/src/transactionIntent/utils/index.ts +0 -1
  138. package/src/transactions.ts +6 -203
  139. package/src/umd.tsx +1 -3
  140. package/src/utils.ts +28 -8
  141. package/src/walletUtils.ts +42 -0
  142. package/src/wallets.ts +361 -203
  143. package/src/widget/compiled.css +1 -1
  144. package/src/widget/components/AccountIntentTransactionHistory.tsx +73 -4
  145. package/src/widget/components/AccountSettings.tsx +17 -17
  146. package/src/widget/components/ChainList.tsx +3 -3
  147. package/src/widget/components/ClassicSwap.tsx +19 -10
  148. package/src/widget/components/ConfigDisplay.tsx +1 -1
  149. package/src/widget/components/FeeOption.tsx +63 -20
  150. package/src/widget/components/FeeOptions.tsx +54 -123
  151. package/src/widget/components/NativeGasOption.tsx +3 -1
  152. package/src/widget/components/Pay.tsx +18 -11
  153. package/src/widget/components/PoolDeposit.tsx +23 -10
  154. package/src/widget/components/QRCodeDeposit.tsx +50 -30
  155. package/src/widget/components/QRCodeWalletSelect.tsx +77 -0
  156. package/src/widget/components/QrCode.tsx +188 -233
  157. package/src/widget/components/QuoteDetails.tsx +48 -2
  158. package/src/widget/components/Receipt.tsx +5 -2
  159. package/src/widget/components/ScreenHeader.tsx +10 -8
  160. package/src/widget/components/Toast.tsx +10 -0
  161. package/src/widget/components/TokenImage.tsx +56 -13
  162. package/src/widget/hooks/useCheckout.ts +71 -0
  163. package/src/widget/hooks/useCurrentScreen.tsx +1 -0
  164. package/src/widget/hooks/useDebugScreens.ts +5 -0
  165. package/src/widget/hooks/useIntentTransactionHistory.ts +788 -418
  166. package/src/widget/hooks/useIsConnectedWalletSmartContract.ts +43 -0
  167. package/src/widget/hooks/useIsSequenceWallet.ts +17 -0
  168. package/src/widget/hooks/useQuote.ts +16 -17
  169. package/src/widget/hooks/useRecentTokens.ts +2 -1
  170. package/src/widget/hooks/useSelectedFeeOption.tsx +257 -0
  171. package/src/widget/hooks/useSendForm.ts +172 -47
  172. package/src/widget/hooks/useTokenList.ts +15 -2
  173. package/src/widget/providers/TrailsProvider.tsx +53 -25
  174. package/src/widget/widget.tsx +119 -48
  175. package/dist/cctpqueue.d.ts +0 -18
  176. package/dist/cctpqueue.d.ts.map +0 -1
  177. package/dist/preconditions.d.ts +0 -12
  178. package/dist/preconditions.d.ts.map +0 -1
  179. package/dist/transactionIntent/handlers/sameChainDifferentToken.d.ts +0 -62
  180. package/dist/transactionIntent/handlers/sameChainDifferentToken.d.ts.map +0 -1
  181. package/dist/transactionIntent/utils/lifiHelpers.d.ts +0 -10
  182. package/dist/transactionIntent/utils/lifiHelpers.d.ts.map +0 -1
  183. package/dist/widget/hooks/useSelectedFeeToken.d.ts +0 -33
  184. package/dist/widget/hooks/useSelectedFeeToken.d.ts.map +0 -1
  185. package/src/cctpqueue.ts +0 -69
  186. package/src/preconditions.ts +0 -47
  187. package/src/transactionIntent/handlers/sameChainDifferentToken.ts +0 -323
  188. package/src/transactionIntent/utils/lifiHelpers.ts +0 -68
  189. package/src/widget/hooks/useSelectedFeeToken.tsx +0 -288
@@ -1,16 +1,18 @@
1
- import React, { useMemo } from "react"
1
+ import { useMemo, useState, useEffect, useRef } from "react"
2
+ import type React from "react"
2
3
  import { ChainImage } from "./ChainImage.js"
3
4
  import { getCommonTokenImageUrl } from "../../tokens.js"
4
5
  import { logger } from "../../logger.js"
6
+ import { commonTokenImages } from "../../tokens.js"
5
7
 
6
8
  function normalizeImageUrl(
7
9
  imageUrl?: string | null,
8
10
  symbol?: string | null,
9
11
  chainId?: number | null,
10
12
  contractAddress?: string | null,
11
- ) {
13
+ ): string | null {
12
14
  if (symbol === "ETH") {
13
- return "https://assets.sequence.info/images/tokens/large/1/0x0000000000000000000000000000000000000000.webp"
15
+ return commonTokenImages.ETH!
14
16
  }
15
17
  const commonImageUrl = getCommonTokenImageUrl({
16
18
  symbol,
@@ -43,24 +45,64 @@ export const TokenImage: React.FC<TokenImageProps> = ({
43
45
  contractAddress,
44
46
  size = 24,
45
47
  }) => {
46
- const [imageError, setImageError] = React.useState(false)
47
- const effectiveImageUrl = useMemo(() => {
48
- logger.console.log("[TokenImage] normalizeImageUrl", {
49
- imageUrl,
50
- symbol,
51
- chainId,
52
- contractAddress,
53
- })
48
+ const [imageError, setImageError] = useState(false)
49
+ const [imageSize, setImageSize] = useState<{
50
+ width: number
51
+ height: number
52
+ } | null>(null)
53
+ const previousUrlRef = useRef<string | null>(null)
54
+
55
+ const effectiveImageUrl = useMemo<string | null>(() => {
54
56
  return normalizeImageUrl(imageUrl, symbol, chainId, contractAddress)
55
57
  }, [imageUrl, symbol, chainId, contractAddress])
56
58
 
59
+ // Reset image size and error when URL changes
60
+ useEffect(() => {
61
+ if (previousUrlRef.current !== effectiveImageUrl) {
62
+ setImageSize(null)
63
+ setImageError(false)
64
+ previousUrlRef.current = effectiveImageUrl
65
+ }
66
+ }, [effectiveImageUrl])
67
+
57
68
  const displaySymbol = symbol?.[0]?.toUpperCase() || "?"
58
69
 
70
+ const handleImageLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {
71
+ const img = e.currentTarget
72
+ const size = {
73
+ width: img.naturalWidth,
74
+ height: img.naturalHeight,
75
+ }
76
+ setImageSize(size)
77
+ logger.console.log("[TokenImage] Image loaded", {
78
+ effectiveImageUrl,
79
+ naturalWidth: img.naturalWidth,
80
+ naturalHeight: img.naturalHeight,
81
+ symbol,
82
+ chainId,
83
+ contractAddress,
84
+ })
85
+ }
86
+
59
87
  const handleImageError = () => {
60
- setImageError(true)
88
+ // Only set error if we haven't already determined it's invalid
89
+ // This prevents unnecessary state updates
90
+ if (!imageError) {
91
+ logger.console.error("[TokenImage] Image load error", {
92
+ effectiveImageUrl,
93
+ imageUrl,
94
+ symbol,
95
+ chainId,
96
+ contractAddress,
97
+ })
98
+ setImageError(true)
99
+ }
61
100
  }
62
101
 
63
- const shouldShowText = !effectiveImageUrl || imageError
102
+ // Show text if no URL, error, or image is 1x1 or less (transparent pixel)
103
+ const isTransparentPixel =
104
+ imageSize !== null && imageSize.width <= 1 && imageSize.height <= 1
105
+ const shouldShowText = !effectiveImageUrl || imageError || isTransparentPixel
64
106
 
65
107
  return (
66
108
  <div
@@ -92,6 +134,7 @@ export const TokenImage: React.FC<TokenImageProps> = ({
92
134
  src={effectiveImageUrl}
93
135
  alt={symbol || "Token"}
94
136
  className="absolute w-full h-full rounded-full object-contain"
137
+ onLoad={handleImageLoad}
95
138
  onError={handleImageError}
96
139
  title={`Token: ${symbol}`}
97
140
  style={{
@@ -19,6 +19,15 @@ export type CheckoutCallbacks = {
19
19
  sessionId: string
20
20
  error: unknown
21
21
  }) => void
22
+ onCheckoutApprovalRequest?: (data: { sessionId: string }) => void
23
+ onCheckoutApprovalConfirmed?: (data: {
24
+ sessionId: string
25
+ transactionHash: `0x${string}`
26
+ }) => void
27
+ onCheckoutApprovalRejected?: (data: {
28
+ sessionId: string
29
+ error: unknown
30
+ }) => void
22
31
  onCheckoutComplete?: (data: { sessionId: string }) => void
23
32
  onCheckoutError?: (data: { sessionId: string; error: unknown }) => void
24
33
  onCheckoutStatusUpdate?: (data: {
@@ -33,6 +42,9 @@ export type CheckoutOnHandlers = {
33
42
  triggerCheckoutSignatureRequest: () => void
34
43
  triggerCheckoutSignatureConfirmed: () => void
35
44
  triggerCheckoutSignatureRejected: (error: unknown) => void
45
+ triggerCheckoutApprovalRequest: () => void
46
+ triggerCheckoutApprovalConfirmed: (transactionHash: `0x${string}`) => void
47
+ triggerCheckoutApprovalRejected: (error: unknown) => void
36
48
  triggerCheckoutComplete: (
37
49
  txStatus: "success" | "fail",
38
50
  accountAddress?: string,
@@ -59,6 +71,9 @@ export function useCheckout({
59
71
  onCheckoutSignatureRequest,
60
72
  onCheckoutSignatureConfirmed,
61
73
  onCheckoutSignatureRejected,
74
+ onCheckoutApprovalRequest,
75
+ onCheckoutApprovalConfirmed,
76
+ onCheckoutApprovalRejected,
62
77
  onCheckoutComplete,
63
78
  onCheckoutError,
64
79
  onCheckoutStatusUpdate,
@@ -152,6 +167,59 @@ export function useCheckout({
152
167
  [onCheckoutSignatureRejected],
153
168
  )
154
169
 
170
+ const triggerCheckoutApprovalRequest = useCallback(() => {
171
+ if (onCheckoutApprovalRequest && sessionIdRef.current) {
172
+ try {
173
+ onCheckoutApprovalRequest({
174
+ sessionId: sessionIdRef.current,
175
+ })
176
+ } catch (error) {
177
+ logger.console.error(
178
+ "[trails-sdk] Error calling onCheckoutApprovalRequest:",
179
+ error,
180
+ )
181
+ }
182
+ }
183
+ }, [onCheckoutApprovalRequest])
184
+
185
+ const triggerCheckoutApprovalConfirmed = useCallback(
186
+ (transactionHash: `0x${string}`) => {
187
+ if (onCheckoutApprovalConfirmed && sessionIdRef.current) {
188
+ try {
189
+ onCheckoutApprovalConfirmed({
190
+ sessionId: sessionIdRef.current,
191
+ transactionHash,
192
+ })
193
+ } catch (error) {
194
+ logger.console.error(
195
+ "[trails-sdk] Error calling onCheckoutApprovalConfirmed:",
196
+ error,
197
+ )
198
+ }
199
+ }
200
+ },
201
+ [onCheckoutApprovalConfirmed],
202
+ )
203
+
204
+ const triggerCheckoutApprovalRejected = useCallback(
205
+ (error: unknown) => {
206
+ if (onCheckoutApprovalRejected && sessionIdRef.current) {
207
+ try {
208
+ onCheckoutApprovalRejected({
209
+ sessionId: sessionIdRef.current,
210
+ error,
211
+ })
212
+ } catch (callbackError) {
213
+ logger.console.error(
214
+ "[trails-sdk] Error calling onCheckoutApprovalRejected:",
215
+ callbackError,
216
+ )
217
+ }
218
+ }
219
+ },
220
+ [onCheckoutApprovalRejected],
221
+ )
222
+
155
223
  const triggerCheckoutComplete = useCallback(
156
224
  (txStatus: "success" | "fail", accountAddress?: string) => {
157
225
  if (onCheckoutComplete && sessionIdRef.current) {
@@ -256,6 +324,9 @@ export function useCheckout({
256
324
  triggerCheckoutSignatureRequest,
257
325
  triggerCheckoutSignatureConfirmed,
258
326
  triggerCheckoutSignatureRejected,
327
+ triggerCheckoutApprovalRequest,
328
+ triggerCheckoutApprovalConfirmed,
329
+ triggerCheckoutApprovalRejected,
259
330
  triggerCheckoutComplete,
260
331
  triggerCheckoutError,
261
332
  triggerCheckoutStatusUpdate,
@@ -12,6 +12,7 @@ export type Screen =
12
12
  | "swap"
13
13
  | "receive"
14
14
  | "wallet-confirmation"
15
+ | "qr-code-wallet-select"
15
16
  | "qr-code-deposit"
16
17
  | "pending"
17
18
  | "receipt"
@@ -16,6 +16,7 @@ type Screen =
16
16
  | "swap"
17
17
  | "receive"
18
18
  | "wallet-confirmation"
19
+ | "qr-code-wallet-select"
19
20
  | "qr-code-deposit"
20
21
  | "pending"
21
22
  | "receipt"
@@ -132,6 +133,10 @@ export const useDebugScreens = ({
132
133
  setShowWalletConfirmRetry(false)
133
134
  setCurrentScreen("wallet-confirmation")
134
135
  break
136
+ case "qr-code-wallet-select":
137
+ setPrepareSendQuote(dummyQuote)
138
+ setCurrentScreen("qr-code-wallet-select")
139
+ break
135
140
  case "wallet-confirmation-retry":
136
141
  // Set dummy USDC token for debug mode
137
142
  setSelectedToken(dummySelectedToken)