@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.
- package/package.json +1 -1
- package/src/_cjs/constants.js +2 -1
- package/src/_cjs/constants.js.map +1 -1
- package/src/_cjs/core/EVM/EVMStepExecutor.js +81 -10
- package/src/_cjs/core/EVM/EVMStepExecutor.js.map +1 -1
- package/src/_cjs/core/EVM/typeguards.js +4 -0
- package/src/_cjs/core/EVM/typeguards.js.map +1 -1
- package/src/_cjs/index.js +11 -6
- package/src/_cjs/index.js.map +1 -1
- package/src/_cjs/services/api.js +12 -1
- package/src/_cjs/services/api.js.map +1 -1
- package/src/_cjs/utils/convertQuoteToRoute.js +73 -5
- package/src/_cjs/utils/convertQuoteToRoute.js.map +1 -1
- package/src/_cjs/version.js +1 -1
- package/src/_cjs/version.js.map +1 -1
- package/src/_esm/constants.js +1 -0
- package/src/_esm/constants.js.map +1 -1
- package/src/_esm/core/EVM/EVMStepExecutor.js +86 -7
- package/src/_esm/core/EVM/EVMStepExecutor.js.map +1 -1
- package/src/_esm/core/EVM/typeguards.js +3 -0
- package/src/_esm/core/EVM/typeguards.js.map +1 -1
- package/src/_esm/index.js +3 -1
- package/src/_esm/index.js.map +1 -1
- package/src/_esm/services/api.js +10 -0
- package/src/_esm/services/api.js.map +1 -1
- package/src/_esm/utils/convertQuoteToRoute.js +76 -7
- package/src/_esm/utils/convertQuoteToRoute.js.map +1 -1
- package/src/_esm/version.js +1 -1
- package/src/_esm/version.js.map +1 -1
- package/src/_types/constants.d.ts +1 -0
- package/src/_types/constants.d.ts.map +1 -1
- package/src/_types/core/EVM/EVMStepExecutor.d.ts.map +1 -1
- package/src/_types/core/EVM/typeguards.d.ts +1 -0
- package/src/_types/core/EVM/typeguards.d.ts.map +1 -1
- package/src/_types/core/types.d.ts +24 -1
- package/src/_types/core/types.d.ts.map +1 -1
- package/src/_types/index.d.ts +4 -2
- package/src/_types/index.d.ts.map +1 -1
- package/src/_types/services/api.d.ts +19 -0
- package/src/_types/services/api.d.ts.map +1 -1
- package/src/_types/utils/convertQuoteToRoute.d.ts +11 -3
- package/src/_types/utils/convertQuoteToRoute.d.ts.map +1 -1
- package/src/_types/version.d.ts +1 -1
- package/src/_types/version.d.ts.map +1 -1
- package/src/constants.ts +2 -0
- package/src/core/EVM/EVMStepExecutor.ts +111 -7
- package/src/core/EVM/typeguards.ts +4 -0
- package/src/core/types.ts +30 -0
- package/src/index.ts +7 -0
- package/src/services/api.ts +37 -0
- package/src/utils/convertQuoteToRoute.ts +117 -8
- package/src/version.ts +1 -1
package/src/_types/index.d.ts
CHANGED
|
@@ -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":"AAEA,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,OAAO,EACL,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAA;AACvE,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,GAClB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,aAAa,EACb,aAAa,GACd,MAAM,0BAA0B,CAAA;AACjC,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EACL,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,YAAY,EACV,cAAc,EACd,qBAAqB,GACtB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,YAAY,EACV,4BAA4B,EAC5B,wBAAwB,EACxB,8BAA8B,EAC9B,kBAAkB,EAClB,YAAY,EACZ,wBAAwB,EACxB,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EACP,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,4BAA4B,EAC5B,wBAAwB,EACxB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,4BAA4B,EAC5B,4BAA4B,EAC5B,eAAe,GAChB,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EACL,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,QAAQ,EACR,2BAA2B,EAC3B,eAAe,EACf,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAA;AAC3E,YAAY,EACV,wBAAwB,EACxB,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EACV,kBAAkB,EAClB,OAAO,EACP,aAAa,EACb,SAAS,GACV,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA"}
|
|
@@ -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":"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"}
|
|
@@ -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
|
|
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,
|
|
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"}
|
package/src/_types/version.d.ts
CHANGED
|
@@ -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,
|
|
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 {
|
|
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 (
|
|
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
|
-
|
|
534
|
-
|
|
535
|
-
|
|
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,
|
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'
|
package/src/services/api.ts
CHANGED
|
@@ -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
|
|
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 = (
|
|
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 (!
|
|
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
|
|
36
|
-
toAmountMin
|
|
37
|
-
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.
|
|
2
|
+
export const version = '3.15.0-beta.0'
|