@lifi/sdk 4.0.0-alpha.9 → 4.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/dist/cjs/actions/getQuote.js +2 -1
  2. package/dist/cjs/actions/getQuote.js.map +1 -1
  3. package/dist/cjs/actions/getRelayedTransactionStatus.js +1 -1
  4. package/dist/cjs/actions/getRelayedTransactionStatus.js.map +1 -1
  5. package/dist/cjs/actions/getRelayerQuote.js +2 -1
  6. package/dist/cjs/actions/getRelayerQuote.js.map +1 -1
  7. package/dist/cjs/actions/getStepTransaction.js +18 -1
  8. package/dist/cjs/actions/getStepTransaction.js.map +1 -1
  9. package/dist/cjs/actions/getTokens.js +1 -1
  10. package/dist/cjs/actions/getTokens.js.map +1 -1
  11. package/dist/cjs/core/BaseStepExecutionTask.d.ts +5 -0
  12. package/dist/cjs/core/BaseStepExecutionTask.js +10 -0
  13. package/dist/cjs/core/BaseStepExecutionTask.js.map +1 -0
  14. package/dist/cjs/core/BaseStepExecutor.d.ts +10 -3
  15. package/dist/cjs/core/BaseStepExecutor.js +51 -0
  16. package/dist/cjs/core/BaseStepExecutor.js.map +1 -1
  17. package/dist/cjs/core/StatusManager.d.ts +12 -10
  18. package/dist/cjs/core/StatusManager.js +32 -33
  19. package/dist/cjs/core/StatusManager.js.map +1 -1
  20. package/dist/cjs/core/TaskPipeline.d.ts +7 -0
  21. package/dist/cjs/core/TaskPipeline.js +27 -0
  22. package/dist/cjs/core/TaskPipeline.js.map +1 -0
  23. package/dist/cjs/core/actionMessages.js +19 -3
  24. package/dist/cjs/core/actionMessages.js.map +1 -1
  25. package/dist/cjs/core/execution.js +13 -1
  26. package/dist/cjs/core/execution.js.map +1 -1
  27. package/dist/cjs/core/prepareRestart.js +2 -3
  28. package/dist/cjs/core/prepareRestart.js.map +1 -1
  29. package/dist/cjs/core/storage.d.ts +17 -0
  30. package/dist/cjs/core/storage.js +36 -0
  31. package/dist/cjs/core/storage.js.map +1 -0
  32. package/dist/cjs/core/tasks/CheckBalanceTask.d.ts +5 -0
  33. package/dist/cjs/core/tasks/CheckBalanceTask.js +26 -0
  34. package/dist/cjs/core/tasks/CheckBalanceTask.js.map +1 -0
  35. package/dist/cjs/core/tasks/PrepareTransactionTask.d.ts +5 -0
  36. package/dist/cjs/core/tasks/PrepareTransactionTask.js +36 -0
  37. package/dist/cjs/core/tasks/PrepareTransactionTask.js.map +1 -0
  38. package/dist/cjs/core/tasks/WaitForTransactionStatusTask.d.ts +8 -0
  39. package/dist/cjs/core/tasks/WaitForTransactionStatusTask.js +73 -0
  40. package/dist/cjs/core/tasks/WaitForTransactionStatusTask.js.map +1 -0
  41. package/dist/cjs/core/{checkBalance.d.ts → tasks/helpers/checkBalance.d.ts} +1 -1
  42. package/dist/cjs/core/{checkBalance.js → tasks/helpers/checkBalance.js} +4 -4
  43. package/dist/cjs/core/tasks/helpers/checkBalance.js.map +1 -0
  44. package/dist/cjs/core/tasks/helpers/getTransactionRequestData.d.ts +2 -0
  45. package/dist/cjs/core/tasks/helpers/getTransactionRequestData.js +30 -0
  46. package/dist/cjs/core/tasks/helpers/getTransactionRequestData.js.map +1 -0
  47. package/dist/cjs/core/{stepComparison.d.ts → tasks/helpers/stepComparison.d.ts} +2 -2
  48. package/dist/cjs/core/{stepComparison.js → tasks/helpers/stepComparison.js} +3 -3
  49. package/dist/cjs/core/tasks/helpers/stepComparison.js.map +1 -0
  50. package/dist/cjs/core/{waitForTransactionStatus.d.ts → tasks/helpers/waitForTransactionStatus.d.ts} +2 -2
  51. package/dist/cjs/core/{waitForTransactionStatus.js → tasks/helpers/waitForTransactionStatus.js} +7 -5
  52. package/dist/cjs/core/tasks/helpers/waitForTransactionStatus.js.map +1 -0
  53. package/dist/cjs/core/utils.d.ts +6 -1
  54. package/dist/cjs/errors/constants.d.ts +2 -1
  55. package/dist/cjs/errors/constants.js +1 -0
  56. package/dist/cjs/errors/constants.js.map +1 -1
  57. package/dist/cjs/errors/errors.d.ts +5 -0
  58. package/dist/cjs/errors/errors.js +9 -1
  59. package/dist/cjs/errors/errors.js.map +1 -1
  60. package/dist/cjs/errors/httpError.js +3 -3
  61. package/dist/cjs/errors/httpError.js.map +1 -1
  62. package/dist/cjs/index.d.ts +15 -6
  63. package/dist/cjs/index.js +26 -7
  64. package/dist/cjs/index.js.map +1 -1
  65. package/dist/cjs/types/core.d.ts +14 -6
  66. package/dist/cjs/types/execution.d.ts +22 -0
  67. package/dist/cjs/types/execution.js +3 -0
  68. package/dist/cjs/types/execution.js.map +1 -0
  69. package/dist/cjs/utils/waitForResult.d.ts +1 -1
  70. package/dist/cjs/utils/waitForResult.js +6 -2
  71. package/dist/cjs/utils/waitForResult.js.map +1 -1
  72. package/dist/cjs/utils/withDedupe.d.ts +5 -0
  73. package/dist/cjs/utils/withDedupe.js +2 -0
  74. package/dist/cjs/utils/withDedupe.js.map +1 -1
  75. package/dist/cjs/version.d.ts +1 -1
  76. package/dist/cjs/version.js +1 -1
  77. package/dist/cjs/version.js.map +1 -1
  78. package/dist/esm/actions/getQuote.js +2 -1
  79. package/dist/esm/actions/getQuote.js.map +1 -1
  80. package/dist/esm/actions/getRelayedTransactionStatus.js +1 -1
  81. package/dist/esm/actions/getRelayedTransactionStatus.js.map +1 -1
  82. package/dist/esm/actions/getRelayerQuote.js +2 -1
  83. package/dist/esm/actions/getRelayerQuote.js.map +1 -1
  84. package/dist/esm/actions/getStepTransaction.js +18 -1
  85. package/dist/esm/actions/getStepTransaction.js.map +1 -1
  86. package/dist/esm/actions/getTokens.js +1 -1
  87. package/dist/esm/actions/getTokens.js.map +1 -1
  88. package/dist/esm/core/BaseStepExecutionTask.d.ts +5 -0
  89. package/dist/esm/core/BaseStepExecutionTask.js +6 -0
  90. package/dist/esm/core/BaseStepExecutionTask.js.map +1 -0
  91. package/dist/esm/core/BaseStepExecutor.d.ts +10 -3
  92. package/dist/esm/core/BaseStepExecutor.js +52 -0
  93. package/dist/esm/core/BaseStepExecutor.js.map +1 -1
  94. package/dist/esm/core/StatusManager.d.ts +29 -27
  95. package/dist/esm/core/StatusManager.js +49 -50
  96. package/dist/esm/core/StatusManager.js.map +1 -1
  97. package/dist/esm/core/TaskPipeline.d.ts +7 -0
  98. package/dist/esm/core/TaskPipeline.js +23 -0
  99. package/dist/esm/core/TaskPipeline.js.map +1 -0
  100. package/dist/esm/core/actionMessages.js +19 -3
  101. package/dist/esm/core/actionMessages.js.map +1 -1
  102. package/dist/esm/core/execution.js +14 -3
  103. package/dist/esm/core/execution.js.map +1 -1
  104. package/dist/esm/core/prepareRestart.js +2 -3
  105. package/dist/esm/core/prepareRestart.js.map +1 -1
  106. package/dist/esm/core/storage.d.ts +17 -0
  107. package/dist/esm/core/storage.js +30 -0
  108. package/dist/esm/core/storage.js.map +1 -0
  109. package/dist/esm/core/tasks/CheckBalanceTask.d.ts +5 -0
  110. package/dist/esm/core/tasks/CheckBalanceTask.js +22 -0
  111. package/dist/esm/core/tasks/CheckBalanceTask.js.map +1 -0
  112. package/dist/esm/core/tasks/PrepareTransactionTask.d.ts +5 -0
  113. package/dist/esm/core/tasks/PrepareTransactionTask.js +32 -0
  114. package/dist/esm/core/tasks/PrepareTransactionTask.js.map +1 -0
  115. package/dist/esm/core/tasks/WaitForTransactionStatusTask.d.ts +8 -0
  116. package/dist/esm/core/tasks/WaitForTransactionStatusTask.js +74 -0
  117. package/dist/esm/core/tasks/WaitForTransactionStatusTask.js.map +1 -0
  118. package/dist/esm/core/{checkBalance.d.ts → tasks/helpers/checkBalance.d.ts} +1 -1
  119. package/dist/esm/core/{checkBalance.js → tasks/helpers/checkBalance.js} +4 -4
  120. package/dist/esm/core/tasks/helpers/checkBalance.js.map +1 -0
  121. package/dist/esm/core/tasks/helpers/getTransactionRequestData.d.ts +2 -0
  122. package/dist/esm/core/tasks/helpers/getTransactionRequestData.js +26 -0
  123. package/dist/esm/core/tasks/helpers/getTransactionRequestData.js.map +1 -0
  124. package/dist/esm/core/{stepComparison.d.ts → tasks/helpers/stepComparison.d.ts} +2 -2
  125. package/dist/esm/core/{stepComparison.js → tasks/helpers/stepComparison.js} +3 -3
  126. package/dist/esm/core/tasks/helpers/stepComparison.js.map +1 -0
  127. package/dist/esm/core/{waitForTransactionStatus.d.ts → tasks/helpers/waitForTransactionStatus.d.ts} +2 -2
  128. package/dist/esm/core/{waitForTransactionStatus.js → tasks/helpers/waitForTransactionStatus.js} +7 -5
  129. package/dist/esm/core/tasks/helpers/waitForTransactionStatus.js.map +1 -0
  130. package/dist/esm/core/utils.d.ts +6 -1
  131. package/dist/esm/errors/constants.d.ts +2 -1
  132. package/dist/esm/errors/constants.js +1 -0
  133. package/dist/esm/errors/constants.js.map +1 -1
  134. package/dist/esm/errors/errors.d.ts +10 -0
  135. package/dist/esm/errors/errors.js +12 -0
  136. package/dist/esm/errors/errors.js.map +1 -1
  137. package/dist/esm/errors/httpError.js +3 -3
  138. package/dist/esm/errors/httpError.js.map +1 -1
  139. package/dist/esm/index.d.ts +15 -6
  140. package/dist/esm/index.js +12 -5
  141. package/dist/esm/index.js.map +1 -1
  142. package/dist/esm/types/core.d.ts +18 -6
  143. package/dist/esm/types/execution.d.ts +23 -0
  144. package/dist/esm/types/execution.js +2 -0
  145. package/dist/esm/types/execution.js.map +1 -0
  146. package/dist/esm/utils/waitForResult.d.ts +2 -2
  147. package/dist/esm/utils/waitForResult.js +7 -3
  148. package/dist/esm/utils/waitForResult.js.map +1 -1
  149. package/dist/esm/utils/withDedupe.d.ts +10 -0
  150. package/dist/esm/utils/withDedupe.js +1 -1
  151. package/dist/esm/utils/withDedupe.js.map +1 -1
  152. package/dist/esm/version.d.ts +1 -1
  153. package/dist/esm/version.js +1 -1
  154. package/dist/esm/version.js.map +1 -1
  155. package/dist/types/actions/getRelayerQuote.d.ts.map +1 -1
  156. package/dist/types/actions/getStepTransaction.d.ts.map +1 -1
  157. package/dist/types/core/BaseStepExecutionTask.d.ts +6 -0
  158. package/dist/types/core/BaseStepExecutionTask.d.ts.map +1 -0
  159. package/dist/types/core/BaseStepExecutor.d.ts +10 -3
  160. package/dist/types/core/BaseStepExecutor.d.ts.map +1 -1
  161. package/dist/types/core/StatusManager.d.ts +29 -27
  162. package/dist/types/core/StatusManager.d.ts.map +1 -1
  163. package/dist/types/core/TaskPipeline.d.ts +8 -0
  164. package/dist/types/core/TaskPipeline.d.ts.map +1 -0
  165. package/dist/types/core/actionMessages.d.ts.map +1 -1
  166. package/dist/types/core/execution.d.ts.map +1 -1
  167. package/dist/types/core/prepareRestart.d.ts.map +1 -1
  168. package/dist/types/core/storage.d.ts +18 -0
  169. package/dist/types/core/storage.d.ts.map +1 -0
  170. package/dist/types/core/tasks/CheckBalanceTask.d.ts +6 -0
  171. package/dist/types/core/tasks/CheckBalanceTask.d.ts.map +1 -0
  172. package/dist/types/core/tasks/PrepareTransactionTask.d.ts +6 -0
  173. package/dist/types/core/tasks/PrepareTransactionTask.d.ts.map +1 -0
  174. package/dist/types/core/tasks/WaitForTransactionStatusTask.d.ts +9 -0
  175. package/dist/types/core/tasks/WaitForTransactionStatusTask.d.ts.map +1 -0
  176. package/dist/types/core/{checkBalance.d.ts → tasks/helpers/checkBalance.d.ts} +1 -1
  177. package/dist/types/core/tasks/helpers/checkBalance.d.ts.map +1 -0
  178. package/dist/types/core/tasks/helpers/getTransactionRequestData.d.ts +3 -0
  179. package/dist/types/core/tasks/helpers/getTransactionRequestData.d.ts.map +1 -0
  180. package/dist/types/core/{stepComparison.d.ts → tasks/helpers/stepComparison.d.ts} +2 -2
  181. package/dist/types/core/tasks/helpers/stepComparison.d.ts.map +1 -0
  182. package/dist/types/core/{waitForTransactionStatus.d.ts → tasks/helpers/waitForTransactionStatus.d.ts} +2 -2
  183. package/dist/types/core/tasks/helpers/waitForTransactionStatus.d.ts.map +1 -0
  184. package/dist/types/core/utils.d.ts +6 -1
  185. package/dist/types/core/utils.d.ts.map +1 -1
  186. package/dist/types/errors/constants.d.ts +2 -1
  187. package/dist/types/errors/constants.d.ts.map +1 -1
  188. package/dist/types/errors/errors.d.ts +10 -0
  189. package/dist/types/errors/errors.d.ts.map +1 -1
  190. package/dist/types/index.d.ts +15 -6
  191. package/dist/types/index.d.ts.map +1 -1
  192. package/dist/types/types/core.d.ts +18 -6
  193. package/dist/types/types/core.d.ts.map +1 -1
  194. package/dist/types/types/execution.d.ts +24 -0
  195. package/dist/types/types/execution.d.ts.map +1 -0
  196. package/dist/types/utils/waitForResult.d.ts +2 -2
  197. package/dist/types/utils/waitForResult.d.ts.map +1 -1
  198. package/dist/types/utils/withDedupe.d.ts +10 -0
  199. package/dist/types/utils/withDedupe.d.ts.map +1 -1
  200. package/dist/types/version.d.ts +1 -1
  201. package/dist/types/version.d.ts.map +1 -1
  202. package/package.json +2 -2
  203. package/src/actions/getQuote.ts +4 -1
  204. package/src/actions/getRelayedTransactionStatus.ts +1 -1
  205. package/src/actions/getRelayerQuote.ts +4 -1
  206. package/src/actions/getStepTransaction.ts +27 -11
  207. package/src/actions/getTokens.ts +4 -2
  208. package/src/core/BaseStepExecutionTask.ts +9 -0
  209. package/src/core/BaseStepExecutor.ts +90 -2
  210. package/src/core/StatusManager.ts +62 -61
  211. package/src/core/TaskPipeline.ts +28 -0
  212. package/src/core/actionMessages.ts +20 -3
  213. package/src/core/execution.ts +17 -3
  214. package/src/core/prepareRestart.ts +2 -3
  215. package/src/core/storage.ts +42 -0
  216. package/src/core/tasks/CheckBalanceTask.ts +29 -0
  217. package/src/core/tasks/PrepareTransactionTask.ts +62 -0
  218. package/src/core/tasks/WaitForTransactionStatusTask.ts +114 -0
  219. package/src/core/{checkBalance.ts → tasks/helpers/checkBalance.ts} +5 -5
  220. package/src/core/tasks/helpers/getTransactionRequestData.ts +47 -0
  221. package/src/core/{stepComparison.ts → tasks/helpers/stepComparison.ts} +5 -5
  222. package/src/core/{waitForTransactionStatus.ts → tasks/helpers/waitForTransactionStatus.ts} +9 -7
  223. package/src/errors/constants.ts +1 -0
  224. package/src/errors/errors.ts +24 -0
  225. package/src/errors/httpError.ts +3 -3
  226. package/src/index.ts +24 -4
  227. package/src/types/core.ts +22 -13
  228. package/src/types/execution.ts +32 -0
  229. package/src/utils/waitForResult.ts +9 -4
  230. package/src/utils/withDedupe.ts +1 -1
  231. package/src/version.ts +1 -1
  232. package/dist/cjs/core/checkBalance.js.map +0 -1
  233. package/dist/cjs/core/stepComparison.js.map +0 -1
  234. package/dist/cjs/core/waitForDestinationChainTransaction.d.ts +0 -4
  235. package/dist/cjs/core/waitForDestinationChainTransaction.js +0 -71
  236. package/dist/cjs/core/waitForDestinationChainTransaction.js.map +0 -1
  237. package/dist/cjs/core/waitForTransactionStatus.js.map +0 -1
  238. package/dist/esm/core/checkBalance.js.map +0 -1
  239. package/dist/esm/core/stepComparison.js.map +0 -1
  240. package/dist/esm/core/waitForDestinationChainTransaction.d.ts +0 -4
  241. package/dist/esm/core/waitForDestinationChainTransaction.js +0 -74
  242. package/dist/esm/core/waitForDestinationChainTransaction.js.map +0 -1
  243. package/dist/esm/core/waitForTransactionStatus.js.map +0 -1
  244. package/dist/types/core/checkBalance.d.ts.map +0 -1
  245. package/dist/types/core/stepComparison.d.ts.map +0 -1
  246. package/dist/types/core/waitForDestinationChainTransaction.d.ts +0 -5
  247. package/dist/types/core/waitForDestinationChainTransaction.d.ts.map +0 -1
  248. package/dist/types/core/waitForTransactionStatus.d.ts.map +0 -1
  249. package/src/core/waitForDestinationChainTransaction.ts +0 -112
@@ -1,8 +1,9 @@
1
1
  import type { Route } from '@lifi/types'
2
2
  import { LiFiErrorCode } from '../errors/constants.js'
3
- import { ProviderError } from '../errors/errors.js'
3
+ import { ExecuteStepRetryError, ProviderError } from '../errors/errors.js'
4
4
  import type {
5
5
  ExecutionOptions,
6
+ LiFiStepExtended,
6
7
  RouteExtended,
7
8
  SDKClient,
8
9
  SDKProvider,
@@ -94,7 +95,6 @@ const executeSteps = async (
94
95
  const step = route.steps[index]
95
96
  const previousStep = route.steps[index - 1]
96
97
  // Check if the step is already done
97
- //
98
98
  if (step.execution?.status === 'DONE') {
99
99
  continue
100
100
  }
@@ -136,7 +136,21 @@ const executeSteps = async (
136
136
  updateRouteExecution(route, execution.executionOptions)
137
137
  }
138
138
 
139
- const executedStep = await stepExecutor.executeStep(client, step)
139
+ let executedStep: LiFiStepExtended
140
+ try {
141
+ executedStep = await stepExecutor.executeStep(client, step)
142
+ } catch (e) {
143
+ if (e instanceof ExecuteStepRetryError) {
144
+ step.execution = undefined
145
+ executedStep = await stepExecutor.executeStep(
146
+ client,
147
+ step,
148
+ e.retryParams
149
+ )
150
+ } else {
151
+ throw e
152
+ }
153
+ }
140
154
 
141
155
  // We may reach this point if user interaction isn't allowed. We want to stop execution until we resume it
142
156
  if (executedStep.execution?.status !== 'DONE') {
@@ -7,9 +7,8 @@ export const prepareRestart = (route: RouteExtended) => {
7
7
  // Find the index of the last action that has tx hash, taskId, or signed messages
8
8
  const lastValidIndex = step.execution.actions.findLastIndex(
9
9
  (action) =>
10
- (!!action.txHash ||
11
- !!action.taskId ||
12
- !!action.signedTypedData?.length) &&
10
+ ['SWAP', 'CROSS_CHAIN', 'RECEIVING_CHAIN'].includes(action.type) &&
11
+ (!!action.txHash || !!action.taskId) &&
13
12
  action.status !== 'FAILED'
14
13
  )
15
14
 
@@ -0,0 +1,42 @@
1
+ export interface SDKStorage {
2
+ get(key: string): string | null | Promise<string | null>
3
+ set(key: string, value: string): void | Promise<void>
4
+ remove(key: string): void | Promise<void>
5
+ }
6
+
7
+ export class LocalStorageAdapter implements SDKStorage {
8
+ get(key: string): string | null {
9
+ return window.localStorage.getItem(key)
10
+ }
11
+
12
+ set(key: string, value: string): void {
13
+ window.localStorage.setItem(key, value)
14
+ }
15
+
16
+ remove(key: string): void {
17
+ window.localStorage.removeItem(key)
18
+ }
19
+ }
20
+
21
+ export class InMemoryStorage implements SDKStorage {
22
+ private store = new Map<string, string>()
23
+
24
+ get(key: string): string | null {
25
+ return this.store.get(key) ?? null
26
+ }
27
+
28
+ set(key: string, value: string): void {
29
+ this.store.set(key, value)
30
+ }
31
+
32
+ remove(key: string): void {
33
+ this.store.delete(key)
34
+ }
35
+ }
36
+
37
+ export function createDefaultStorage(): SDKStorage {
38
+ if (typeof window !== 'undefined' && window.localStorage) {
39
+ return new LocalStorageAdapter()
40
+ }
41
+ return new InMemoryStorage()
42
+ }
@@ -0,0 +1,29 @@
1
+ import { LiFiErrorCode } from '../../errors/constants.js'
2
+ import { TransactionError } from '../../errors/errors.js'
3
+ import type { StepExecutorContext, TaskResult } from '../../types/execution.js'
4
+ import { BaseStepExecutionTask } from '../BaseStepExecutionTask.js'
5
+ import { checkBalance } from './helpers/checkBalance.js'
6
+
7
+ export class CheckBalanceTask extends BaseStepExecutionTask {
8
+ async run(context: StepExecutorContext): Promise<TaskResult> {
9
+ const { client, step, statusManager, isBridgeExecution } = context
10
+
11
+ statusManager.initializeAction({
12
+ step,
13
+ type: isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP',
14
+ chainId: step.action.fromChainId,
15
+ status: 'STARTED',
16
+ })
17
+
18
+ const walletAddress = step.action.fromAddress
19
+ if (!walletAddress) {
20
+ throw new TransactionError(
21
+ LiFiErrorCode.InternalError,
22
+ 'The wallet address is undefined.'
23
+ )
24
+ }
25
+
26
+ await checkBalance(client, walletAddress, step)
27
+ return { status: 'COMPLETED' }
28
+ }
29
+ }
@@ -0,0 +1,62 @@
1
+ import { getStepTransaction } from '../../actions/getStepTransaction.js'
2
+ import { LiFiErrorCode } from '../../errors/constants.js'
3
+ import { TransactionError } from '../../errors/errors.js'
4
+ import type { StepExecutorContext, TaskResult } from '../../types/execution.js'
5
+ import { BaseStepExecutionTask } from '../BaseStepExecutionTask.js'
6
+ import { stepComparison } from './helpers/stepComparison.js'
7
+
8
+ export class PrepareTransactionTask extends BaseStepExecutionTask {
9
+ async run(context: StepExecutorContext): Promise<TaskResult> {
10
+ const {
11
+ client,
12
+ step,
13
+ statusManager,
14
+ allowUserInteraction,
15
+ executionOptions,
16
+ isBridgeExecution,
17
+ } = context
18
+
19
+ const action = statusManager.findAction(
20
+ step,
21
+ isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'
22
+ )
23
+
24
+ if (!action) {
25
+ throw new TransactionError(
26
+ LiFiErrorCode.TransactionUnprepared,
27
+ 'Unable to prepare transaction. Action not found.'
28
+ )
29
+ }
30
+
31
+ if (!step.transactionRequest) {
32
+ const { execution, ...stepBase } = step
33
+ const updatedStep = await getStepTransaction(client, stepBase)
34
+ const comparedStep = await stepComparison(
35
+ statusManager,
36
+ step,
37
+ updatedStep,
38
+ allowUserInteraction,
39
+ executionOptions
40
+ )
41
+ Object.assign(step, {
42
+ ...comparedStep,
43
+ execution: step.execution,
44
+ })
45
+ }
46
+
47
+ if (!step.transactionRequest?.data) {
48
+ throw new TransactionError(
49
+ LiFiErrorCode.TransactionUnprepared,
50
+ 'Unable to prepare transaction. Transaction request data is not found.'
51
+ )
52
+ }
53
+
54
+ statusManager.updateAction(step, action.type, 'ACTION_REQUIRED')
55
+
56
+ if (!allowUserInteraction) {
57
+ return { status: 'PAUSED' }
58
+ }
59
+
60
+ return { status: 'COMPLETED' }
61
+ }
62
+ }
@@ -0,0 +1,114 @@
1
+ import type { ExtendedTransactionInfo, FullStatusData } from '@lifi/types'
2
+ import { LiFiErrorCode } from '../../errors/constants.js'
3
+ import { TransactionError } from '../../errors/errors.js'
4
+ import type { ExecutionActionType } from '../../types/core.js'
5
+ import type { StepExecutorContext, TaskResult } from '../../types/execution.js'
6
+ import { getTransactionFailedMessage } from '../../utils/getTransactionMessage.js'
7
+ import { BaseStepExecutionTask } from '../BaseStepExecutionTask.js'
8
+ import { waitForTransactionStatus } from './helpers/waitForTransactionStatus.js'
9
+
10
+ export class WaitForTransactionStatusTask extends BaseStepExecutionTask {
11
+ readonly actionType: ExecutionActionType
12
+
13
+ constructor(actionType: ExecutionActionType) {
14
+ super()
15
+ this.actionType = actionType
16
+ }
17
+
18
+ async run(context: StepExecutorContext): Promise<TaskResult> {
19
+ const {
20
+ client,
21
+ step,
22
+ statusManager,
23
+ pollingIntervalMs,
24
+ toChain,
25
+ isBridgeExecution,
26
+ } = context
27
+
28
+ // At this point, we should have a txHash or taskId
29
+ // taskId is used for custom integrations that don't use the standard transaction hash
30
+ let transactionHash: string | undefined
31
+ try {
32
+ const swapOrBridgeAction = statusManager.findAction(
33
+ step,
34
+ isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'
35
+ )
36
+ transactionHash = swapOrBridgeAction?.txHash || swapOrBridgeAction?.taskId
37
+
38
+ // Wait for the transaction status on the destination chain
39
+ if (!transactionHash) {
40
+ throw new Error('Transaction hash is undefined.')
41
+ }
42
+
43
+ const action = statusManager.initializeAction({
44
+ step,
45
+ type: this.actionType,
46
+ chainId:
47
+ this.actionType === 'RECEIVING_CHAIN'
48
+ ? step.action.toChainId
49
+ : step.action.fromChainId,
50
+ status: 'PENDING',
51
+ })
52
+
53
+ const statusResponse = (await waitForTransactionStatus(
54
+ client,
55
+ statusManager,
56
+ transactionHash,
57
+ step,
58
+ action.type,
59
+ pollingIntervalMs
60
+ )) as FullStatusData
61
+
62
+ const statusReceiving =
63
+ statusResponse.receiving as ExtendedTransactionInfo
64
+
65
+ // Update action status
66
+ statusManager.updateAction(step, action.type, 'DONE', {
67
+ chainId: statusReceiving?.chainId || toChain.id,
68
+ substatus: statusResponse.substatus,
69
+ substatusMessage: statusResponse.substatusMessage,
70
+ txHash: statusReceiving?.txHash,
71
+ txLink:
72
+ statusReceiving?.txLink ||
73
+ `${toChain.metamask.blockExplorerUrls[0]}tx/${statusReceiving?.txHash}`,
74
+ })
75
+
76
+ // Update execution status
77
+ statusManager.updateExecution(step, {
78
+ status: 'DONE',
79
+ ...(statusResponse.sending.amount && {
80
+ fromAmount: statusResponse.sending.amount,
81
+ }),
82
+ ...(statusReceiving?.amount && { toAmount: statusReceiving.amount }),
83
+ ...(statusReceiving?.token && { toToken: statusReceiving.token }),
84
+ internalTxLink: statusResponse?.lifiExplorerLink,
85
+ externalTxLink: statusResponse?.bridgeExplorerLink,
86
+ gasCosts: [
87
+ {
88
+ amount: statusResponse.sending.gasAmount,
89
+ amountUSD: statusResponse.sending.gasAmountUSD,
90
+ token: statusResponse.sending.gasToken,
91
+ estimate: statusResponse.sending.gasUsed,
92
+ limit: statusResponse.sending.gasUsed,
93
+ price: statusResponse.sending.gasPrice,
94
+ type: 'SEND',
95
+ },
96
+ ],
97
+ })
98
+
99
+ return { status: 'COMPLETED' }
100
+ } catch (e: any) {
101
+ const htmlMessage = await getTransactionFailedMessage(
102
+ client,
103
+ step,
104
+ `${toChain.metamask.blockExplorerUrls[0]}tx/${transactionHash}`
105
+ )
106
+ throw new TransactionError(
107
+ LiFiErrorCode.TransactionFailed,
108
+ htmlMessage ??
109
+ 'Failed while waiting for status of destination chain transaction.',
110
+ e
111
+ )
112
+ }
113
+ }
114
+ }
@@ -1,9 +1,9 @@
1
1
  import type { LiFiStep } from '@lifi/types'
2
- import { getTokenBalance } from '../actions/getTokenBalance.js'
3
- import { BalanceError } from '../errors/errors.js'
4
- import type { SDKClient } from '../types/core.js'
5
- import { formatUnits } from '../utils/formatUnits.js'
6
- import { sleep } from '../utils/sleep.js'
2
+ import { getTokenBalance } from '../../../actions/getTokenBalance.js'
3
+ import { BalanceError } from '../../../errors/errors.js'
4
+ import type { SDKClient } from '../../../types/core.js'
5
+ import { formatUnits } from '../../../utils/formatUnits.js'
6
+ import { sleep } from '../../../utils/sleep.js'
7
7
 
8
8
  export const checkBalance = async (
9
9
  client: SDKClient,
@@ -0,0 +1,47 @@
1
+ import { LiFiErrorCode } from '../../../errors/constants.js'
2
+ import { TransactionError } from '../../../errors/errors.js'
3
+ import type {
4
+ ExecutionOptions,
5
+ LiFiStepExtended,
6
+ TransactionParameters,
7
+ } from '../../../types/core.js'
8
+
9
+ export const getTransactionRequestData = async (
10
+ step: LiFiStepExtended,
11
+ executionOptions?: ExecutionOptions
12
+ ): Promise<string> => {
13
+ if (!step.transactionRequest?.data) {
14
+ throw new TransactionError(
15
+ LiFiErrorCode.TransactionUnprepared,
16
+ 'Unable to prepare transaction. Transaction request data is not found.'
17
+ )
18
+ }
19
+
20
+ let transactionRequest: TransactionParameters = {
21
+ data: step.transactionRequest.data,
22
+ }
23
+
24
+ if (executionOptions?.updateTransactionRequestHook) {
25
+ const customizedTransactionRequest: TransactionParameters =
26
+ await executionOptions.updateTransactionRequestHook({
27
+ requestType: 'transaction',
28
+ ...transactionRequest,
29
+ })
30
+
31
+ transactionRequest = {
32
+ ...transactionRequest,
33
+ ...customizedTransactionRequest,
34
+ }
35
+ }
36
+
37
+ const transactionRequestData = transactionRequest.data
38
+
39
+ if (!transactionRequestData) {
40
+ throw new TransactionError(
41
+ LiFiErrorCode.TransactionUnprepared,
42
+ 'Unable to prepare transaction. Transaction request data is not found.'
43
+ )
44
+ }
45
+
46
+ return transactionRequestData
47
+ }
@@ -1,9 +1,9 @@
1
1
  import type { LiFiStep } from '@lifi/types'
2
- import { LiFiErrorCode } from '../errors/constants.js'
3
- import { TransactionError } from '../errors/errors.js'
4
- import type { ExecutionOptions } from '../types/core.js'
5
- import type { StatusManager } from './StatusManager.js'
6
- import { checkStepSlippageThreshold } from './utils.js'
2
+ import type { StatusManager } from '../../../core/StatusManager.js'
3
+ import { checkStepSlippageThreshold } from '../../../core/utils.js'
4
+ import { LiFiErrorCode } from '../../../errors/constants.js'
5
+ import { TransactionError } from '../../../errors/errors.js'
6
+ import type { ExecutionOptions } from '../../../types/core.js'
7
7
 
8
8
  /**
9
9
  * This method checks whether the new and updated Step meets the required exchange rate conditions.
@@ -1,10 +1,10 @@
1
1
  import type { FullStatusData, LiFiStep, StatusResponse } from '@lifi/types'
2
- import { getStatus } from '../actions/getStatus.js'
3
- import { ServerError } from '../errors/errors.js'
4
- import type { ExecutionActionType, SDKClient } from '../types/core.js'
5
- import { waitForResult } from '../utils/waitForResult.js'
6
- import { getSubstatusMessage } from './actionMessages.js'
7
- import type { StatusManager } from './StatusManager.js'
2
+ import { getStatus } from '../../../actions/getStatus.js'
3
+ import { ServerError } from '../../../errors/errors.js'
4
+ import type { ExecutionActionType, SDKClient } from '../../../types/core.js'
5
+ import { waitForResult } from '../../../utils/waitForResult.js'
6
+ import { getSubstatusMessage } from '../../actionMessages.js'
7
+ import type { StatusManager } from '../../StatusManager.js'
8
8
 
9
9
  const TRANSACTION_HASH_OBSERVERS: Record<string, Promise<StatusResponse>> = {}
10
10
 
@@ -57,7 +57,9 @@ export async function waitForTransactionStatus(
57
57
  let status = TRANSACTION_HASH_OBSERVERS[txHash]
58
58
 
59
59
  if (!status) {
60
- status = waitForResult(_getStatus, interval)
60
+ status = waitForResult(_getStatus, interval).finally(() => {
61
+ delete TRANSACTION_HASH_OBSERVERS[txHash]
62
+ })
61
63
  TRANSACTION_HASH_OBSERVERS[txHash] = status
62
64
  }
63
65
 
@@ -10,6 +10,7 @@ export enum ErrorName {
10
10
  SlippageError = 'SlippageError',
11
11
  HTTPError = 'HTTPError',
12
12
  ConfigError = 'ConfigError',
13
+ ExecuteStepRetryError = 'ExecuteStepRetryError',
13
14
  }
14
15
 
15
16
  export type ErrorCode = LiFiErrorCode
@@ -1,3 +1,4 @@
1
+ import type { ExecuteStepRetryParams } from '../types/core.js'
1
2
  import { BaseError } from './baseError.js'
2
3
  import { ErrorName, LiFiErrorCode } from './constants.js'
3
4
 
@@ -42,3 +43,26 @@ export class ValidationError extends BaseError {
42
43
  super(ErrorName.ValidationError, LiFiErrorCode.ValidationError, message)
43
44
  }
44
45
  }
46
+
47
+ /**
48
+ * Thrown by a step executor when executeStep should be retried with the given params
49
+ * (e.g. wallet rejected 7702 upgrade → retry with atomicityNotReady).
50
+ * The execution layer catches this and retries executeStep(client, step, retryParams).
51
+ */
52
+ export class ExecuteStepRetryError extends BaseError {
53
+ readonly retryParams: ExecuteStepRetryParams
54
+
55
+ constructor(
56
+ message: string,
57
+ retryParams: ExecuteStepRetryParams,
58
+ cause?: Error
59
+ ) {
60
+ super(
61
+ ErrorName.ExecuteStepRetryError,
62
+ LiFiErrorCode.InternalError,
63
+ message,
64
+ cause
65
+ )
66
+ this.retryParams = retryParams
67
+ }
68
+ }
@@ -82,10 +82,10 @@ export class HTTPError extends BaseError {
82
82
  try {
83
83
  this.responseBody = await this.response.json()
84
84
 
85
- if (this.responseBody) {
85
+ if (this.responseBody?.message) {
86
86
  this.message += this.message.endsWith('.')
87
- ? ` ${this.responseBody?.message.toString()}`
88
- : `. ${this.responseBody?.message.toString()}`
87
+ ? ` ${this.responseBody.message.toString()}`
88
+ : `. ${this.responseBody.message.toString()}`
89
89
  }
90
90
  } catch {}
91
91
 
package/src/index.ts CHANGED
@@ -24,8 +24,9 @@ export { actions } from './actions/index.js'
24
24
  export { patchContractCalls } from './actions/patchContractCalls.js'
25
25
  export { relayTransaction } from './actions/relayTransaction.js'
26
26
  export { createClient } from './client/createClient.js'
27
+ export { getActionMessage, getSubstatusMessage } from './core/actionMessages.js'
28
+ export { BaseStepExecutionTask } from './core/BaseStepExecutionTask.js'
27
29
  export { BaseStepExecutor } from './core/BaseStepExecutor.js'
28
- export { checkBalance } from './core/checkBalance.js'
29
30
  export {
30
31
  executeRoute,
31
32
  getActiveRoute,
@@ -35,13 +36,25 @@ export {
35
36
  updateRouteExecution,
36
37
  } from './core/execution.js'
37
38
  export { StatusManager } from './core/StatusManager.js'
38
- export { stepComparison } from './core/stepComparison.js'
39
- export { waitForDestinationChainTransaction } from './core/waitForDestinationChainTransaction.js'
39
+ export type { SDKStorage } from './core/storage.js'
40
+ export {
41
+ createDefaultStorage,
42
+ InMemoryStorage,
43
+ LocalStorageAdapter,
44
+ } from './core/storage.js'
45
+ export { TaskPipeline } from './core/TaskPipeline.js'
46
+ export { CheckBalanceTask } from './core/tasks/CheckBalanceTask.js'
47
+ export { checkBalance } from './core/tasks/helpers/checkBalance.js'
48
+ export { getTransactionRequestData } from './core/tasks/helpers/getTransactionRequestData.js'
49
+ export { stepComparison } from './core/tasks/helpers/stepComparison.js'
50
+ export { PrepareTransactionTask } from './core/tasks/PrepareTransactionTask.js'
51
+ export { WaitForTransactionStatusTask } from './core/tasks/WaitForTransactionStatusTask.js'
40
52
  export { BaseError } from './errors/baseError.js'
41
53
  export type { ErrorCode } from './errors/constants.js'
42
54
  export { ErrorMessage, ErrorName, LiFiErrorCode } from './errors/constants.js'
43
55
  export {
44
56
  BalanceError,
57
+ ExecuteStepRetryError,
45
58
  ProviderError,
46
59
  RPCError,
47
60
  ServerError,
@@ -58,6 +71,7 @@ export type {
58
71
  ContractCallParams,
59
72
  ContractTool,
60
73
  ExchangeRateUpdateParams,
74
+ ExecuteStepRetryParams,
61
75
  Execution,
62
76
  ExecutionAction,
63
77
  ExecutionActionStatus,
@@ -87,6 +101,12 @@ export type {
87
101
  TransactionRequestUpdateHook,
88
102
  UpdateRouteHook,
89
103
  } from './types/core.js'
104
+ export type {
105
+ StepExecutorBaseContext,
106
+ StepExecutorContext,
107
+ TaskResult,
108
+ TaskStatus,
109
+ } from './types/execution.js'
90
110
  export { checkPackageUpdates } from './utils/checkPackageUpdates.js'
91
111
  export { convertQuoteToRoute } from './utils/convertQuoteToRoute.js'
92
112
  export { fetchTxErrorDetails } from './utils/fetchTxErrorDetails.js'
@@ -95,4 +115,4 @@ export { isHex } from './utils/isHex.js'
95
115
  export { parseUnits } from './utils/parseUnits.js'
96
116
  export { sleep } from './utils/sleep.js'
97
117
  export { waitForResult } from './utils/waitForResult.js'
98
- export { withDedupe } from './utils/withDedupe.js'
118
+ export { LruMap, withDedupe } from './utils/withDedupe.js'
package/src/types/core.ts CHANGED
@@ -14,6 +14,7 @@ import type {
14
14
  Token,
15
15
  TokenAmount,
16
16
  } from '@lifi/types'
17
+ import type { SDKStorage } from '../core/storage.js'
17
18
  import type { ExtendedRequestInit } from './request.js'
18
19
 
19
20
  export type RequestInterceptor = (
@@ -34,6 +35,7 @@ export interface SDKBaseConfig {
34
35
  preloadChains?: boolean
35
36
  chainsRefetchInterval?: number
36
37
  requestInterceptor?: RequestInterceptor
38
+ storage?: SDKStorage
37
39
  }
38
40
 
39
41
  export interface SDKConfig extends Partial<Omit<SDKBaseConfig, 'integrator'>> {
@@ -82,13 +84,20 @@ export interface InteractionSettings {
82
84
  allowExecution?: boolean
83
85
  }
84
86
 
87
+ /**
88
+ * Params passed when retrying executeStep after an ExecuteStepRetryError.
89
+ * Providers can use this to pass strategy-specific retry options (e.g. atomicityNotReady for Ethereum 7702).
90
+ */
91
+ export type ExecuteStepRetryParams = Record<string, unknown>
92
+
85
93
  export interface StepExecutor {
86
94
  allowUserInteraction: boolean
87
95
  allowExecution: boolean
88
96
  setInteraction(settings?: InteractionSettings): void
89
97
  executeStep(
90
98
  client: SDKClient,
91
- step: LiFiStepExtended
99
+ step: LiFiStepExtended,
100
+ retryParams?: ExecuteStepRetryParams
92
101
  ): Promise<LiFiStepExtended>
93
102
  }
94
103
 
@@ -195,7 +204,6 @@ export interface ExecutionOptions {
195
204
  getContractCalls?: GetContractCallsHook
196
205
  adjustZeroOutputFromPreviousStep?: boolean
197
206
  executeInBackground?: boolean
198
- disableMessageSigning?: boolean
199
207
  /**
200
208
  * @deprecated
201
209
  */
@@ -215,8 +223,11 @@ export type ExecutionActionStatus =
215
223
  | 'CANCELLED'
216
224
 
217
225
  export type ExecutionActionType =
218
- | 'TOKEN_ALLOWANCE'
219
226
  | 'PERMIT'
227
+ | 'CHECK_ALLOWANCE'
228
+ | 'NATIVE_PERMIT'
229
+ | 'RESET_ALLOWANCE'
230
+ | 'SET_ALLOWANCE'
220
231
  | 'SWAP'
221
232
  | 'CROSS_CHAIN'
222
233
  | 'RECEIVING_CHAIN'
@@ -224,21 +235,17 @@ export type ExecutionActionType =
224
235
  export type ExecutionAction = {
225
236
  type: ExecutionActionType
226
237
  status: ExecutionActionStatus
238
+ message?: string
227
239
  substatus?: Substatus
240
+ substatusMessage?: string
228
241
  chainId?: number
229
242
  txHash?: string
230
- taskId?: string
231
243
  txLink?: string
244
+ taskId?: string
232
245
  txType?: TransactionMethodType
233
- message?: string
234
- error?: {
235
- code: string | number
236
- message: string
237
- htmlMessage?: string
238
- }
239
-
240
- // additional information
241
- [key: string]: any
246
+ txHex?: string
247
+ // Errors occured during the action execution (within tasks)
248
+ error?: { code: string | number; message: string; htmlMessage?: string }
242
249
  }
243
250
 
244
251
  export interface Execution {
@@ -253,6 +260,8 @@ export interface Execution {
253
260
  gasCosts?: GasCost[]
254
261
  internalTxLink?: string
255
262
  externalTxLink?: string
263
+ // Errors occured outside of actions (e.g. during context creation)
264
+ error?: { code: string | number; message: string; htmlMessage?: string }
256
265
  }
257
266
 
258
267
  export type TransactionMethodType = 'standard' | 'relayed' | 'batched'
@@ -0,0 +1,32 @@
1
+ import type { ExtendedChain } from '@lifi/types'
2
+ import type { StatusManager } from '../core/StatusManager.js'
3
+ import type {
4
+ ExecuteStepRetryParams,
5
+ ExecutionOptions,
6
+ LiFiStepExtended,
7
+ SDKClient,
8
+ } from './core.js'
9
+
10
+ export interface StepExecutorBaseContext {
11
+ statusManager: StatusManager
12
+ executionOptions?: ExecutionOptions
13
+ fromChain: ExtendedChain
14
+ toChain: ExtendedChain
15
+ isBridgeExecution: boolean
16
+ client: SDKClient
17
+ step: LiFiStepExtended
18
+ allowUserInteraction: boolean
19
+ retryParams?: ExecuteStepRetryParams
20
+ }
21
+
22
+ export interface StepExecutorContext extends StepExecutorBaseContext {
23
+ pollingIntervalMs?: number
24
+ }
25
+
26
+ export interface TaskResult<TContext = Record<string, unknown>> {
27
+ status: TaskStatus
28
+ /** Optional: data produced for downstream tasks. Pipeline merges into the executor context. */
29
+ context?: TContext
30
+ }
31
+
32
+ export type TaskStatus = 'COMPLETED' | 'PAUSED'