@lifi/sdk 3.14.1 → 3.15.0-beta.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 (52) hide show
  1. package/package.json +1 -1
  2. package/src/_cjs/constants.js +2 -1
  3. package/src/_cjs/constants.js.map +1 -1
  4. package/src/_cjs/core/EVM/EVMStepExecutor.js +81 -10
  5. package/src/_cjs/core/EVM/EVMStepExecutor.js.map +1 -1
  6. package/src/_cjs/core/EVM/typeguards.js +4 -0
  7. package/src/_cjs/core/EVM/typeguards.js.map +1 -1
  8. package/src/_cjs/index.js +11 -6
  9. package/src/_cjs/index.js.map +1 -1
  10. package/src/_cjs/services/api.js +12 -1
  11. package/src/_cjs/services/api.js.map +1 -1
  12. package/src/_cjs/utils/convertQuoteToRoute.js +73 -5
  13. package/src/_cjs/utils/convertQuoteToRoute.js.map +1 -1
  14. package/src/_cjs/version.js +1 -1
  15. package/src/_cjs/version.js.map +1 -1
  16. package/src/_esm/constants.js +1 -0
  17. package/src/_esm/constants.js.map +1 -1
  18. package/src/_esm/core/EVM/EVMStepExecutor.js +86 -7
  19. package/src/_esm/core/EVM/EVMStepExecutor.js.map +1 -1
  20. package/src/_esm/core/EVM/typeguards.js +3 -0
  21. package/src/_esm/core/EVM/typeguards.js.map +1 -1
  22. package/src/_esm/index.js +3 -1
  23. package/src/_esm/index.js.map +1 -1
  24. package/src/_esm/services/api.js +10 -0
  25. package/src/_esm/services/api.js.map +1 -1
  26. package/src/_esm/utils/convertQuoteToRoute.js +76 -7
  27. package/src/_esm/utils/convertQuoteToRoute.js.map +1 -1
  28. package/src/_esm/version.js +1 -1
  29. package/src/_esm/version.js.map +1 -1
  30. package/src/_types/constants.d.ts +1 -0
  31. package/src/_types/constants.d.ts.map +1 -1
  32. package/src/_types/core/EVM/EVMStepExecutor.d.ts.map +1 -1
  33. package/src/_types/core/EVM/typeguards.d.ts +1 -0
  34. package/src/_types/core/EVM/typeguards.d.ts.map +1 -1
  35. package/src/_types/core/types.d.ts +24 -1
  36. package/src/_types/core/types.d.ts.map +1 -1
  37. package/src/_types/index.d.ts +4 -2
  38. package/src/_types/index.d.ts.map +1 -1
  39. package/src/_types/services/api.d.ts +19 -0
  40. package/src/_types/services/api.d.ts.map +1 -1
  41. package/src/_types/utils/convertQuoteToRoute.d.ts +11 -3
  42. package/src/_types/utils/convertQuoteToRoute.d.ts.map +1 -1
  43. package/src/_types/version.d.ts +1 -1
  44. package/src/_types/version.d.ts.map +1 -1
  45. package/src/constants.ts +2 -0
  46. package/src/core/EVM/EVMStepExecutor.ts +111 -7
  47. package/src/core/EVM/typeguards.ts +4 -0
  48. package/src/core/types.ts +30 -0
  49. package/src/index.ts +7 -0
  50. package/src/services/api.ts +37 -0
  51. package/src/utils/convertQuoteToRoute.ts +117 -8
  52. package/src/version.ts +1 -1
@@ -1,5 +1,6 @@
1
1
  export * from '@lifi/types';
2
2
  export { config } from './config.js';
3
+ export { PatcherMagicNumber } from './constants.js';
3
4
  export { checkPermitSupport } from './core/EVM/checkPermitSupport.js';
4
5
  export { EVM } from './core/EVM/EVM.js';
5
6
  export { getTokenAllowance, getTokenAllowanceMulticall, } from './core/EVM/getAllowance.js';
@@ -20,7 +21,7 @@ export { StatusManager } from './core/StatusManager.js';
20
21
  export { Sui } from './core/Sui/Sui.js';
21
22
  export type { SuiProvider, SuiProviderOptions } from './core/Sui/types.js';
22
23
  export { isSui } from './core/Sui/types.js';
23
- export type { AcceptExchangeRateUpdateHook, AcceptSlippageUpdateHook, AcceptSlippageUpdateHookParams, ExchangeRateUpdateParams, Execution, ExecutionOptions, ExecutionStatus, InteractionSettings, LiFiStepExtended, Process, ProcessStatus, ProcessType, RouteExecutionData, RouteExecutionDataDictionary, RouteExecutionDictionary, RouteExtended, SDKProvider, StepExecutor, StepExecutorOptions, StepExtended, SwitchChainHook, TransactionParameters, TransactionRequestParameters, TransactionRequestUpdateHook, UpdateRouteHook, } from './core/types.js';
24
+ export type { AcceptExchangeRateUpdateHook, AcceptSlippageUpdateHook, AcceptSlippageUpdateHookParams, ContractCallParams, ContractTool, ExchangeRateUpdateParams, Execution, ExecutionOptions, ExecutionStatus, GetContractCallsHook, GetContractCallsResult, InteractionSettings, LiFiStepExtended, Process, ProcessStatus, ProcessType, RouteExecutionData, RouteExecutionDataDictionary, RouteExecutionDictionary, RouteExtended, SDKProvider, StepExecutor, StepExecutorOptions, StepExtended, SwitchChainHook, TransactionParameters, TransactionRequestParameters, TransactionRequestUpdateHook, UpdateRouteHook, } from './core/types.js';
24
25
  export type { UTXOProvider, UTXOProviderOptions } from './core/UTXO/types.js';
25
26
  export { isUTXO } from './core/UTXO/types.js';
26
27
  export { UTXO } from './core/UTXO/UTXO.js';
@@ -31,7 +32,7 @@ export { ErrorMessage, ErrorName, LiFiErrorCode } from './errors/constants.js';
31
32
  export { BalanceError, ProviderError, RPCError, ServerError, TransactionError, UnknownError, ValidationError, } from './errors/errors.js';
32
33
  export { HTTPError } from './errors/httpError.js';
33
34
  export { SDKError } from './errors/SDKError.js';
34
- export { getChains, getConnections, getContractCallsQuote, getGasRecommendation, getQuote, getRelayedTransactionStatus, getRelayerQuote, getRoutes, getStatus, getStepTransaction, getToken, getTokens, getTools, getTransactionHistory, relayTransaction, } from './services/api.js';
35
+ export { getChains, getConnections, getContractCallsQuote, getGasRecommendation, getQuote, getRelayedTransactionStatus, getRelayerQuote, getRoutes, getStatus, getStepTransaction, getToken, getTokens, getTools, getTransactionHistory, patchContractCalls, relayTransaction, } from './services/api.js';
35
36
  export { getTokenBalance, getTokenBalances, getTokenBalancesByChain, getWalletBalances, } from './services/balance.js';
36
37
  export { getNameServiceAddress } from './services/getNameServiceAddress.js';
37
38
  export type { GetStatusRequestExtended, QuoteRequest, QuoteRequestFromAmount, QuoteRequestToAmount, } from './services/types.js';
@@ -39,4 +40,5 @@ export type { RequestInterceptor, RPCUrls, SDKBaseConfig, SDKConfig, } from './t
39
40
  export { checkPackageUpdates } from './utils/checkPackageUpdates.js';
40
41
  export { convertQuoteToRoute } from './utils/convertQuoteToRoute.js';
41
42
  export { fetchTxErrorDetails } from './utils/fetchTxErrorDetails.js';
43
+ export { isZeroAddress } from './utils/isZeroAddress.js';
42
44
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -117,4 +117,23 @@ export declare const getGasRecommendation: (params: GasRecommendationRequest, op
117
117
  */
118
118
  export declare const getConnections: (connectionRequest: ConnectionsRequest, options?: RequestOptions) => Promise<ConnectionsResponse>;
119
119
  export declare const getTransactionHistory: ({ wallet, status, fromTimestamp, toTimestamp }: TransactionAnalyticsRequest, options?: RequestOptions) => Promise<TransactionAnalyticsResponse>;
120
+ export type PatchContractCallsRequest = {
121
+ chainId: ChainId;
122
+ fromTokenAddress: string;
123
+ targetContractAddress: string;
124
+ callDataToPatch: string;
125
+ patches: {
126
+ amountToReplace: string;
127
+ }[];
128
+ value?: string;
129
+ delegateCall?: boolean;
130
+ };
131
+ export interface PatchContractCallsResponse {
132
+ target: string;
133
+ value: bigint;
134
+ callData: string;
135
+ allowFailure: boolean;
136
+ isDelegateCall: boolean;
137
+ }
138
+ export declare const patchContractCalls: (params: PatchContractCallsRequest[], options?: RequestOptions) => Promise<PatchContractCallsResponse[]>;
120
139
  //# sourceMappingURL=api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../services/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../services/api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,KAAK,QAAQ,EACb,KAAK,aAAa,EAElB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAG9B,KAAK,QAAQ,EAEb,KAAK,YAAY,EAEjB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAEvB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EAClC,MAAM,aAAa,CAAA;AAUpB,OAAO,KAAK,EACV,wBAAwB,EAExB,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,YAAY,CAAA;AAEnB;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,sBAAsB,EAC9B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAAA;AACpB,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,oBAAoB,EAC5B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAAA;AAyEpB;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GACpB,QAAQ,aAAa,EACrB,UAAU,cAAc,KACvB,OAAO,CAAC,cAAc,CAoBxB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,yBAAyB,EACjC,UAAU,cAAc,KACvB,OAAO,CAAC,QAAQ,CAmDlB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,QAAQ,GAAG,cAAc,EAC/B,UAAU,cAAc,KACvB,OAAO,CAAC,QAAQ,CAwBlB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GACpB,QAAQ,wBAAwB,EAChC,UAAU,cAAc,KACvB,OAAO,CAAC,cAAc,CAoBxB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,sBAAsB,EAC9B,UAAU,cAAc,KACvB,OAAO,CAAC,QAAQ,CAwDlB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,YAAY,EACpB,UAAU,cAAc,KACvB,OAAO,CAAC,iBAAiB,CA+C3B,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,GACtC,QAAQ,kBAAkB,EAC1B,UAAU,cAAc,KACvB,OAAO,CAAC,uBAAuB,CAqCjC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GACpB,SAAS,aAAa,EACtB,UAAU,cAAc,KACvB,OAAO,CAAC,aAAa,EAAE,CAsBzB,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,MAAM,CAAC,EAAE,aAAa,GAAG;IAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;CAAE,EACzD,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,CAAA;AAC1B,wBAAsB,SAAS,CAC7B,MAAM,EAAE,aAAa,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,EAC1C,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,sBAAsB,CAAC,CAAA;AA4BlC;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GACnB,OAAO,QAAQ,GAAG,OAAO,EACzB,OAAO,MAAM,EACb,UAAU,cAAc,KACvB,OAAO,CAAC,aAAa,CAoBvB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GACnB,SAAS,YAAY,EACrB,UAAU,cAAc,KACvB,OAAO,CAAC,aAAa,CAgBvB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,wBAAwB,EAChC,UAAU,cAAc,KACvB,OAAO,CAAC,yBAAyB,CAkBnC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GACzB,mBAAmB,kBAAkB,EACrC,UAAU,cAAc,KACvB,OAAO,CAAC,mBAAmB,CAmC7B,CAAA;AAED,eAAO,MAAM,qBAAqB,GAChC,gDAAgD,2BAA2B,EAC3E,UAAU,cAAc,KACvB,OAAO,CAAC,4BAA4B,CA2BtC,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,OAAO,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;IACxB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAA;KACxB,EAAE,CAAA;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,OAAO,CAAA;CACxB;AAED,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,yBAAyB,EAAE,EACnC,UAAU,cAAc,KACvB,OAAO,CAAC,0BAA0B,EAAE,CAYtC,CAAA"}
@@ -1,11 +1,19 @@
1
1
  import type { LiFiStep, Route } from '@lifi/types';
2
+ interface ConvertQuoteToRouteOptions {
3
+ /**
4
+ * When true, if the quote has zero output values (toAmount, toAmountMin, toAmountUSD),
5
+ * use the values from the previous included step that has non-zero output.
6
+ */
7
+ adjustZeroOutputFromPreviousStep?: boolean;
8
+ }
9
+ export declare function formatTokenPrice(amount?: string | bigint, price?: string, decimals?: number): number;
2
10
  /**
3
11
  * Converts a quote to Route
4
12
  * @param quote - Step returned from the quote endpoint.
5
- * @param txHash
6
- * @param chainId
13
+ * @param options - Optional configuration for handling edge cases.
7
14
  * @returns - The route to be executed.
8
15
  * @throws {BaseError} Throws a ValidationError if the step has missing values.
9
16
  */
10
- export declare const convertQuoteToRoute: (quote: LiFiStep) => Route;
17
+ export declare const convertQuoteToRoute: (quote: LiFiStep, options?: ConvertQuoteToRouteOptions) => Route;
18
+ export {};
11
19
  //# sourceMappingURL=convertQuoteToRoute.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"convertQuoteToRoute.d.ts","sourceRoot":"","sources":["../../utils/convertQuoteToRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAIlD;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,QAAQ,KAAG,KAgCrD,CAAA"}
1
+ {"version":3,"file":"convertQuoteToRoute.d.ts","sourceRoot":"","sources":["../../utils/convertQuoteToRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAQ,MAAM,aAAa,CAAA;AAKxD,UAAU,0BAA0B;IAClC;;;OAGG;IACH,gCAAgC,CAAC,EAAE,OAAO,CAAA;CAC3C;AAmDD,wBAAgB,gBAAgB,CAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EACxB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,UAelB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,QAAQ,EACf,UAAU,0BAA0B,KACnC,KA6DF,CAAA"}
@@ -1,3 +1,3 @@
1
1
  export declare const name = "@lifi/sdk";
2
- export declare const version = "3.14.1";
2
+ export declare const version = "3.15.0-beta.0";
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,cAAc,CAAA;AAC/B,eAAO,MAAM,OAAO,WAAW,CAAA"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,cAAc,CAAA;AAC/B,eAAO,MAAM,OAAO,kBAAkB,CAAA"}
package/src/constants.ts CHANGED
@@ -8,3 +8,5 @@ export const MaxUint48 = BigInt('0xffffffffffff')
8
8
  export const MaxUint160 = BigInt('0xffffffffffffffffffffffffffffffffffffffff')
9
9
  export const MaxUint256 =
10
10
  BigInt(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn)
11
+
12
+ export const PatcherMagicNumber = 314159265359n
@@ -17,13 +17,17 @@ import {
17
17
  } from 'viem/actions'
18
18
  import { getAction, isHex } from 'viem/utils'
19
19
  import { config } from '../../config.js'
20
+ import { PatcherMagicNumber } from '../../constants.js'
20
21
  import { LiFiErrorCode } from '../../errors/constants.js'
21
22
  import { TransactionError } from '../../errors/errors.js'
22
23
  import {
24
+ getContractCallsQuote,
23
25
  getRelayerQuote,
24
26
  getStepTransaction,
27
+ patchContractCalls,
25
28
  relayTransaction,
26
29
  } from '../../services/api.js'
30
+ import { convertQuoteToRoute } from '../../utils/convertQuoteToRoute.js'
27
31
  import { isZeroAddress } from '../../utils/isZeroAddress.js'
28
32
  import { BaseStepExecutor } from '../BaseStepExecutor.js'
29
33
  import { checkBalance } from '../checkBalance.js'
@@ -48,7 +52,11 @@ import { encodePermit2Data } from './permits/encodePermit2Data.js'
48
52
  import { isNativePermitValid } from './permits/isNativePermitValid.js'
49
53
  import { signPermit2Message } from './permits/signPermit2Message.js'
50
54
  import { switchChain } from './switchChain.js'
51
- import { isGaslessStep, isRelayerStep } from './typeguards.js'
55
+ import {
56
+ isContractCallStep,
57
+ isGaslessStep,
58
+ isRelayerStep,
59
+ } from './typeguards.js'
52
60
  import type { Call, WalletCallReceipt } from './types.js'
53
61
  import {
54
62
  convertExtendedChain,
@@ -229,8 +237,94 @@ export class EVMStepExecutor extends BaseStepExecutor {
229
237
  const { execution, ...stepBase } = step
230
238
  const relayerStep = isRelayerStep(step)
231
239
  const gaslessStep = isGaslessStep(step)
240
+ const contractCallStep = isContractCallStep(step)
232
241
  let updatedStep: LiFiStep
233
- if (relayerStep && gaslessStep) {
242
+ if (contractCallStep) {
243
+ const contractCallsResult =
244
+ await this.executionOptions?.getContractCalls?.({
245
+ fromAddress: stepBase.action.fromAddress!,
246
+ fromAmount: BigInt(stepBase.action.fromAmount),
247
+ fromChainId: stepBase.action.fromChainId,
248
+ fromTokenAddress: stepBase.action.fromToken.address,
249
+ slippage: stepBase.action.slippage,
250
+ toAddress: stepBase.action.toAddress,
251
+ toAmount: BigInt(stepBase.estimate.toAmount),
252
+ toChainId: stepBase.action.toChainId,
253
+ toTokenAddress: stepBase.action.toToken.address,
254
+ })
255
+
256
+ if (!contractCallsResult?.contractCalls?.length) {
257
+ throw new TransactionError(
258
+ LiFiErrorCode.TransactionUnprepared,
259
+ 'Unable to prepare transaction. Contract calls are not found.'
260
+ )
261
+ }
262
+
263
+ const patchedContractCalls = await patchContractCalls(
264
+ contractCallsResult.contractCalls.map((call) => ({
265
+ chainId: stepBase.action.toChainId,
266
+ fromTokenAddress: call.fromTokenAddress,
267
+ targetContractAddress: call.toContractAddress,
268
+ callDataToPatch: call.toContractCallData,
269
+ delegateCall: false,
270
+ patches: [
271
+ {
272
+ amountToReplace: PatcherMagicNumber.toString(),
273
+ },
274
+ ],
275
+ }))
276
+ )
277
+
278
+ contractCallsResult.contractCalls.forEach((call, index) => {
279
+ call.toContractAddress = patchedContractCalls[index].target
280
+ call.toContractCallData = patchedContractCalls[index].callData
281
+ })
282
+
283
+ /**
284
+ * Limitations of the retry logic for contract calls:
285
+ * - denyBridges and denyExchanges are not supported
286
+ * - allowBridges and allowExchanges are not supported
287
+ * - fee is not supported
288
+ * - toAmount is not supported
289
+ */
290
+ const contractCallQuote = await getContractCallsQuote({
291
+ // Contract calls are enabled only when fromAddress is set
292
+ fromAddress: stepBase.action.fromAddress!,
293
+ fromChain: stepBase.action.fromChainId,
294
+ fromToken: stepBase.action.fromToken.address,
295
+ fromAmount: stepBase.action.fromAmount,
296
+ toChain: stepBase.action.toChainId,
297
+ toToken: stepBase.action.toToken.address,
298
+ contractCalls: contractCallsResult.contractCalls,
299
+ toFallbackAddress: stepBase.action.toAddress,
300
+ slippage: stepBase.action.slippage,
301
+ })
302
+
303
+ contractCallQuote.action.toToken = stepBase.action.toToken
304
+
305
+ const customStep = contractCallQuote.includedSteps?.find(
306
+ (step) => step.type === 'custom'
307
+ )
308
+ if (customStep && contractCallsResult?.contractTool) {
309
+ const toolDetails = {
310
+ key: contractCallsResult.contractTool.name,
311
+ name: contractCallsResult.contractTool.name,
312
+ logoURI: contractCallsResult.contractTool.logoURI,
313
+ }
314
+ customStep.toolDetails = toolDetails
315
+ contractCallQuote.toolDetails = toolDetails
316
+ }
317
+
318
+ const route = convertQuoteToRoute(contractCallQuote, {
319
+ adjustZeroOutputFromPreviousStep:
320
+ this.executionOptions?.adjustZeroOutputFromPreviousStep,
321
+ })
322
+
323
+ updatedStep = {
324
+ ...route.steps[0],
325
+ id: stepBase.id,
326
+ }
327
+ } else if (relayerStep && gaslessStep) {
234
328
  const updatedRelayedStep = await getRelayerQuote({
235
329
  fromChain: stepBase.action.fromChainId,
236
330
  fromToken: stepBase.action.fromToken.address,
@@ -425,8 +519,7 @@ export class EVMStepExecutor extends BaseStepExecutor {
425
519
  // Check if message signing is disabled - useful for smart contract wallets
426
520
  // We also disable message signing for custom steps
427
521
  const disableMessageSigning =
428
- this.executionOptions?.disableMessageSigning ||
429
- step.type !== 'lifi'
522
+ this.executionOptions?.disableMessageSigning || step.type !== 'lifi'
430
523
 
431
524
  // Check if chain has Permit2 contract deployed. Permit2 should not be available for atomic batch.
432
525
  const permit2Supported =
@@ -530,9 +623,20 @@ export class EVMStepExecutor extends BaseStepExecutor {
530
623
  return step
531
624
  }
532
625
 
533
- // Try to prepare a new transaction request and update the step with typed data
534
- let { transactionRequest, isRelayerTransaction } =
535
- await this.prepareUpdatedStep(updatedClient, step, signedTypedData)
626
+ let transactionRequest = step.transactionRequest
627
+ ? structuredClone(step.transactionRequest as TransactionParameters)
628
+ : undefined
629
+ let isRelayerTransaction: boolean = false
630
+ if (!transactionRequest) {
631
+ // Try to prepare a new transaction request and update the step with typed data
632
+ const result = await this.prepareUpdatedStep(
633
+ updatedClient,
634
+ step,
635
+ signedTypedData
636
+ )
637
+ transactionRequest = result.transactionRequest
638
+ isRelayerTransaction = result.isRelayerTransaction
639
+ }
536
640
 
537
641
  process = this.statusManager.updateProcess(
538
642
  step,
@@ -24,3 +24,7 @@ export function isGaslessStep(
24
24
  )
25
25
  )
26
26
  }
27
+
28
+ export function isContractCallStep(step: LiFiStepExtended | LiFiStep): boolean {
29
+ return step.includedSteps.some((s) => s.type === 'custom')
30
+ }
package/src/core/types.ts CHANGED
@@ -2,6 +2,7 @@ import type {
2
2
  ChainId,
3
3
  ChainType,
4
4
  CoinKey,
5
+ ContractCall,
5
6
  FeeCost,
6
7
  GasCost,
7
8
  LiFiStep,
@@ -114,11 +115,40 @@ export type AcceptExchangeRateUpdateHook = (
114
115
  params: ExchangeRateUpdateParams
115
116
  ) => Promise<boolean | undefined>
116
117
 
118
+ export interface ContractCallParams {
119
+ fromChainId: number
120
+ toChainId: number
121
+ fromTokenAddress: string
122
+ toTokenAddress: string
123
+ fromAddress: string
124
+ toAddress?: string
125
+ fromAmount: bigint
126
+ toAmount: bigint
127
+ slippage?: number
128
+ }
129
+
130
+ export interface ContractTool {
131
+ name: string
132
+ logoURI: string
133
+ }
134
+
135
+ export interface GetContractCallsResult {
136
+ contractCalls: ContractCall[]
137
+ patcher?: boolean
138
+ contractTool?: ContractTool
139
+ }
140
+
141
+ export type GetContractCallsHook = (
142
+ params: ContractCallParams
143
+ ) => Promise<GetContractCallsResult>
144
+
117
145
  export interface ExecutionOptions {
118
146
  acceptExchangeRateUpdateHook?: AcceptExchangeRateUpdateHook
119
147
  switchChainHook?: SwitchChainHook
120
148
  updateRouteHook?: UpdateRouteHook
121
149
  updateTransactionRequestHook?: TransactionRequestUpdateHook
150
+ getContractCalls?: GetContractCallsHook
151
+ adjustZeroOutputFromPreviousStep?: boolean
122
152
  executeInBackground?: boolean
123
153
  disableMessageSigning?: boolean
124
154
  /**
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  // biome-ignore lint/performance/noReExportAll: types
3
3
  export * from '@lifi/types'
4
4
  export { config } from './config.js'
5
+ export { PatcherMagicNumber } from './constants.js'
5
6
  export { checkPermitSupport } from './core/EVM/checkPermitSupport.js'
6
7
  export { EVM } from './core/EVM/EVM.js'
7
8
  export {
@@ -57,10 +58,14 @@ export type {
57
58
  AcceptExchangeRateUpdateHook,
58
59
  AcceptSlippageUpdateHook,
59
60
  AcceptSlippageUpdateHookParams,
61
+ ContractCallParams,
62
+ ContractTool,
60
63
  ExchangeRateUpdateParams,
61
64
  Execution,
62
65
  ExecutionOptions,
63
66
  ExecutionStatus,
67
+ GetContractCallsHook,
68
+ GetContractCallsResult,
64
69
  InteractionSettings,
65
70
  LiFiStepExtended,
66
71
  Process,
@@ -113,6 +118,7 @@ export {
113
118
  getTokens,
114
119
  getTools,
115
120
  getTransactionHistory,
121
+ patchContractCalls,
116
122
  relayTransaction,
117
123
  } from './services/api.js'
118
124
  export {
@@ -137,3 +143,4 @@ export type {
137
143
  export { checkPackageUpdates } from './utils/checkPackageUpdates.js'
138
144
  export { convertQuoteToRoute } from './utils/convertQuoteToRoute.js'
139
145
  export { fetchTxErrorDetails } from './utils/fetchTxErrorDetails.js'
146
+ export { isZeroAddress } from './utils/isZeroAddress.js'
@@ -718,3 +718,40 @@ export const getTransactionHistory = async (
718
718
 
719
719
  return await request<TransactionAnalyticsResponse>(url, options)
720
720
  }
721
+
722
+ export type PatchContractCallsRequest = {
723
+ chainId: ChainId
724
+ fromTokenAddress: string
725
+ targetContractAddress: string
726
+ callDataToPatch: string
727
+ patches: {
728
+ amountToReplace: string
729
+ }[]
730
+ value?: string
731
+ delegateCall?: boolean
732
+ }
733
+
734
+ export interface PatchContractCallsResponse {
735
+ target: string
736
+ value: bigint
737
+ callData: string
738
+ allowFailure: boolean
739
+ isDelegateCall: boolean
740
+ }
741
+
742
+ export const patchContractCalls = async (
743
+ params: PatchContractCallsRequest[],
744
+ options?: RequestOptions
745
+ ): Promise<PatchContractCallsResponse[]> => {
746
+ return await request<PatchContractCallsResponse[]>(
747
+ `${config.get().apiUrl}/patcher`,
748
+ {
749
+ method: 'POST',
750
+ headers: {
751
+ 'Content-Type': 'application/json',
752
+ },
753
+ body: JSON.stringify(params),
754
+ signal: options?.signal,
755
+ }
756
+ )
757
+ }
@@ -1,23 +1,132 @@
1
- import type { LiFiStep, Route } from '@lifi/types'
1
+ import type { LiFiStep, Route, Step } from '@lifi/types'
2
+ import { formatUnits } from 'viem'
2
3
  import { ValidationError } from '../errors/errors.js'
3
4
  import { SDKError } from '../errors/SDKError.js'
4
5
 
6
+ interface ConvertQuoteToRouteOptions {
7
+ /**
8
+ * When true, if the quote has zero output values (toAmount, toAmountMin, toAmountUSD),
9
+ * use the values from the previous included step that has non-zero output.
10
+ */
11
+ adjustZeroOutputFromPreviousStep?: boolean
12
+ }
13
+
14
+ const parseBigInt = (value: string | undefined): bigint => {
15
+ if (!value) {
16
+ return 0n
17
+ }
18
+ try {
19
+ return BigInt(value)
20
+ } catch {
21
+ return 0n
22
+ }
23
+ }
24
+
25
+ const parseNumber = (value: string | undefined): number => {
26
+ if (!value) {
27
+ return 0
28
+ }
29
+ const parsed = Number(value)
30
+ return Number.isNaN(parsed) ? 0 : parsed
31
+ }
32
+
33
+ const isZeroOutput = (
34
+ toAmount: string,
35
+ toAmountMin: string,
36
+ toAmountUSD?: string
37
+ ): boolean => {
38
+ return (
39
+ !parseBigInt(toAmount) &&
40
+ !parseBigInt(toAmountMin) &&
41
+ !parseNumber(toAmountUSD)
42
+ )
43
+ }
44
+
45
+ const hasNonZeroOutput = (step: Step): boolean => {
46
+ return (
47
+ !!parseBigInt(step.estimate.toAmount) ||
48
+ !!parseBigInt(step.estimate.toAmountMin)
49
+ )
50
+ }
51
+
52
+ const findPreviousNonZeroStep = (steps: Step[]): Step | undefined => {
53
+ // Find the last step that has non-zero output (the step before the zero output step)
54
+ for (let i = steps.length - 1; i >= 0; i--) {
55
+ const step = steps[i]
56
+ if (hasNonZeroOutput(step)) {
57
+ return step
58
+ }
59
+ }
60
+ return undefined
61
+ }
62
+
63
+ export function formatTokenPrice(
64
+ amount?: string | bigint,
65
+ price?: string,
66
+ decimals?: number
67
+ ) {
68
+ if (!amount || !price) {
69
+ return 0
70
+ }
71
+
72
+ const formattedAmount =
73
+ typeof amount === 'bigint' && decimals !== undefined
74
+ ? formatUnits(amount, decimals)
75
+ : amount.toString()
76
+
77
+ if (Number.isNaN(Number(formattedAmount)) || Number.isNaN(Number(price))) {
78
+ return 0
79
+ }
80
+ return Number.parseFloat(formattedAmount) * Number.parseFloat(price)
81
+ }
82
+
5
83
  /**
6
84
  * Converts a quote to Route
7
85
  * @param quote - Step returned from the quote endpoint.
8
- * @param txHash
9
- * @param chainId
86
+ * @param options - Optional configuration for handling edge cases.
10
87
  * @returns - The route to be executed.
11
88
  * @throws {BaseError} Throws a ValidationError if the step has missing values.
12
89
  */
13
- export const convertQuoteToRoute = (quote: LiFiStep): Route => {
90
+ export const convertQuoteToRoute = (
91
+ quote: LiFiStep,
92
+ options?: ConvertQuoteToRouteOptions
93
+ ): Route => {
94
+ let toAmount = quote.estimate.toAmount
95
+ let toAmountMin = quote.estimate.toAmountMin
96
+ let toAmountUSD = quote.estimate.toAmountUSD
97
+
98
+ // Handle zero output values by looking at previous included step
99
+ if (
100
+ options?.adjustZeroOutputFromPreviousStep &&
101
+ quote.includedSteps?.length &&
102
+ isZeroOutput(toAmount, toAmountMin, toAmountUSD)
103
+ ) {
104
+ const previousStep = findPreviousNonZeroStep(quote.includedSteps)
105
+ if (previousStep) {
106
+ toAmount = previousStep.estimate.toAmount
107
+ toAmountMin = previousStep.estimate.toAmountMin
108
+ toAmountUSD = formatTokenPrice(
109
+ parseBigInt(toAmount),
110
+ previousStep.action.toToken.priceUSD,
111
+ previousStep.action.toToken.decimals
112
+ ).toFixed(2)
113
+
114
+ // Update the last included step's estimate with the adjusted values
115
+ const lastStep = quote.includedSteps[quote.includedSteps.length - 1]
116
+ if (lastStep && !hasNonZeroOutput(lastStep)) {
117
+ lastStep.estimate.toAmount = toAmount
118
+ lastStep.estimate.toAmountMin = toAmountMin
119
+ }
120
+ }
121
+ }
122
+
14
123
  if (!quote.estimate.fromAmountUSD) {
15
124
  throw new SDKError(
16
125
  new ValidationError("Missing 'fromAmountUSD' in step estimate.")
17
126
  )
18
127
  }
19
128
 
20
- if (!quote.estimate.toAmountUSD) {
129
+ if (!toAmountUSD) {
21
130
  throw new SDKError(
22
131
  new ValidationError("Missing 'toAmountUSD' in step estimate.")
23
132
  )
@@ -32,9 +141,9 @@ export const convertQuoteToRoute = (quote: LiFiStep): Route => {
32
141
  fromAddress: quote.action.fromAddress,
33
142
  toChainId: quote.action.toToken.chainId,
34
143
  toToken: quote.action.toToken,
35
- toAmount: quote.estimate.toAmount,
36
- toAmountMin: quote.estimate.toAmountMin,
37
- toAmountUSD: quote.estimate.toAmountUSD,
144
+ toAmount,
145
+ toAmountMin,
146
+ toAmountUSD,
38
147
  toAddress: quote.action.toAddress || quote.action.fromAddress,
39
148
  gasCostUSD: quote.estimate.gasCosts?.[0]?.amountUSD || '0',
40
149
  steps: [quote],
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export const name = '@lifi/sdk'
2
- export const version = '3.14.1'
2
+ export const version = '3.15.0-beta.0'