@lifi/sdk 2.0.0-beta.8 → 2.0.0-beta.9

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.
@@ -1,4 +1,3 @@
1
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
2
1
  import BigNumber from 'bignumber.js';
3
2
  import { constants } from 'ethers';
4
3
  import { getApproved, setApproval } from '../allowance/utils';
@@ -17,7 +16,22 @@ export const checkAllowance = async (signer, step, statusManager, settings, chai
17
16
  allowanceProcess = statusManager.updateProcess(step, allowanceProcess.type, 'DONE');
18
17
  }
19
18
  else {
20
- const approved = await getApproved(signer, step.action.fromToken.address, step.estimate.approvalAddress);
19
+ const approvalRequest = {
20
+ from: step.action.fromToken.address,
21
+ to: step.estimate.approvalAddress,
22
+ };
23
+ if (settings.updateTransactionRequest) {
24
+ const config = await settings.updateTransactionRequest(approvalRequest);
25
+ approvalRequest.gasLimit = config.gasLimit;
26
+ approvalRequest.gasPrice = config.gasPrice;
27
+ }
28
+ if (!approvalRequest.from) {
29
+ throw new Error('Missing Signer address');
30
+ }
31
+ if (!approvalRequest.to) {
32
+ throw new Error('Missing ERC20 contract address');
33
+ }
34
+ const approved = await getApproved(signer, approvalRequest.from, approvalRequest.to, approvalRequest);
21
35
  if (new BigNumber(step.action.fromAmount).gt(approved)) {
22
36
  if (!allowUserInteraction) {
23
37
  return;
@@ -1,8 +1,9 @@
1
+ import { TransactionRequest } from '@ethersproject/abstract-provider';
1
2
  import { ChainId, Token } from '@lifi/types';
2
3
  import BigNumber from 'bignumber.js';
3
4
  import { ContractTransaction, Signer } from 'ethers';
4
5
  import { RevokeTokenData } from '../types';
5
- export declare const getApproved: (signer: Signer, tokenAddress: string, contractAddress: string) => Promise<BigNumber>;
6
+ export declare const getApproved: (signer: Signer, tokenAddress: string, contractAddress: string, transactionRequest?: TransactionRequest) => Promise<BigNumber>;
6
7
  export declare const setApproval: (signer: Signer, tokenAddress: string, contractAddress: string, amount: string) => Promise<ContractTransaction>;
7
8
  export declare const getAllowanceViaMulticall: (signer: Signer, chainId: ChainId, tokenData: RevokeTokenData[]) => Promise<{
8
9
  token: Token;
@@ -4,11 +4,16 @@ import ChainsService from '../services/ChainsService';
4
4
  import { ERC20_ABI } from '../types';
5
5
  import { ServerError } from '../utils/errors';
6
6
  import { fetchDataUsingMulticall } from '../utils/multicall';
7
- export const getApproved = async (signer, tokenAddress, contractAddress) => {
7
+ export const getApproved = async (signer, tokenAddress, contractAddress, transactionRequest) => {
8
8
  const signerAddress = await signer.getAddress();
9
9
  const erc20 = new Contract(tokenAddress, ERC20_ABI, signer);
10
10
  try {
11
- const approved = await erc20.allowance(signerAddress, contractAddress);
11
+ const approved = await erc20.allowance(signerAddress, contractAddress, {
12
+ gasLimit: transactionRequest?.gasLimit,
13
+ gasPrice: transactionRequest?.gasPrice,
14
+ maxFeePerGas: transactionRequest?.maxFeePerGas,
15
+ maxPriorityFeePerGas: transactionRequest?.maxPriorityFeePerGas,
16
+ });
12
17
  return new BigNumber(approved.toString());
13
18
  }
14
19
  catch (e) {
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.checkAllowance = void 0;
7
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
8
7
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
9
8
  const ethers_1 = require("ethers");
10
9
  const utils_1 = require("../allowance/utils");
@@ -23,7 +22,22 @@ const checkAllowance = async (signer, step, statusManager, settings, chain, allo
23
22
  allowanceProcess = statusManager.updateProcess(step, allowanceProcess.type, 'DONE');
24
23
  }
25
24
  else {
26
- const approved = await (0, utils_1.getApproved)(signer, step.action.fromToken.address, step.estimate.approvalAddress);
25
+ const approvalRequest = {
26
+ from: step.action.fromToken.address,
27
+ to: step.estimate.approvalAddress,
28
+ };
29
+ if (settings.updateTransactionRequest) {
30
+ const config = await settings.updateTransactionRequest(approvalRequest);
31
+ approvalRequest.gasLimit = config.gasLimit;
32
+ approvalRequest.gasPrice = config.gasPrice;
33
+ }
34
+ if (!approvalRequest.from) {
35
+ throw new Error('Missing Signer address');
36
+ }
37
+ if (!approvalRequest.to) {
38
+ throw new Error('Missing ERC20 contract address');
39
+ }
40
+ const approved = await (0, utils_1.getApproved)(signer, approvalRequest.from, approvalRequest.to, approvalRequest);
27
41
  if (new bignumber_js_1.default(step.action.fromAmount).gt(approved)) {
28
42
  if (!allowUserInteraction) {
29
43
  return;
@@ -1,8 +1,9 @@
1
+ import { TransactionRequest } from '@ethersproject/abstract-provider';
1
2
  import { ChainId, Token } from '@lifi/types';
2
3
  import BigNumber from 'bignumber.js';
3
4
  import { ContractTransaction, Signer } from 'ethers';
4
5
  import { RevokeTokenData } from '../types';
5
- export declare const getApproved: (signer: Signer, tokenAddress: string, contractAddress: string) => Promise<BigNumber>;
6
+ export declare const getApproved: (signer: Signer, tokenAddress: string, contractAddress: string, transactionRequest?: TransactionRequest) => Promise<BigNumber>;
6
7
  export declare const setApproval: (signer: Signer, tokenAddress: string, contractAddress: string, amount: string) => Promise<ContractTransaction>;
7
8
  export declare const getAllowanceViaMulticall: (signer: Signer, chainId: ChainId, tokenData: RevokeTokenData[]) => Promise<{
8
9
  token: Token;
@@ -10,11 +10,16 @@ const ChainsService_1 = __importDefault(require("../services/ChainsService"));
10
10
  const types_1 = require("../types");
11
11
  const errors_1 = require("../utils/errors");
12
12
  const multicall_1 = require("../utils/multicall");
13
- const getApproved = async (signer, tokenAddress, contractAddress) => {
13
+ const getApproved = async (signer, tokenAddress, contractAddress, transactionRequest) => {
14
14
  const signerAddress = await signer.getAddress();
15
15
  const erc20 = new ethers_1.Contract(tokenAddress, types_1.ERC20_ABI, signer);
16
16
  try {
17
- const approved = await erc20.allowance(signerAddress, contractAddress);
17
+ const approved = await erc20.allowance(signerAddress, contractAddress, {
18
+ gasLimit: transactionRequest?.gasLimit,
19
+ gasPrice: transactionRequest?.gasPrice,
20
+ maxFeePerGas: transactionRequest?.maxFeePerGas,
21
+ maxPriorityFeePerGas: transactionRequest?.maxPriorityFeePerGas,
22
+ });
18
23
  return new bignumber_js_1.default(approved.toString());
19
24
  }
20
25
  catch (e) {
@@ -81,6 +81,14 @@ class StepExecutionManager {
81
81
  if (!this.allowUserInteraction) {
82
82
  return step.execution;
83
83
  }
84
+ if (settings.updateTransactionRequest) {
85
+ const customConfig = await settings.updateTransactionRequest(transactionRequest);
86
+ transactionRequest.gasLimit = customConfig.gasLimit;
87
+ transactionRequest.gasPrice = customConfig.gasPrice;
88
+ transactionRequest.maxPriorityFeePerGas =
89
+ customConfig.maxPriorityFeePerGas;
90
+ transactionRequest.maxFeePerGas = customConfig.maxFeePerGas;
91
+ }
84
92
  // Submit the transaction
85
93
  transaction = await signer.sendTransaction(transactionRequest);
86
94
  // STEP 4: Wait for the transaction
@@ -1,3 +1,4 @@
1
+ import { TransactionRequest } from '@ethersproject/abstract-provider';
1
2
  import { LifiStep, Route, RouteOptions, Token } from '@lifi/types';
2
3
  import BigNumber from 'bignumber.js';
3
4
  import { Signer } from 'ethers';
@@ -23,6 +24,7 @@ export interface ExecutionParams {
23
24
  settings: InternalExecutionSettings;
24
25
  }
25
26
  export type CallbackFunction = (updatedRoute: Route) => void;
27
+ export type TxRequestCallbackFunction = (updatedTxRequest: TransactionRequest) => Promise<TransactionRequest>;
26
28
  export type Config = {
27
29
  apiUrl: string;
28
30
  rpcs: Record<ChainId, string[]>;
@@ -73,6 +75,7 @@ export interface InternalExecutionSettings {
73
75
  acceptExchangeRateUpdateHook: AcceptExchangeRateUpdateHook;
74
76
  infiniteApproval: boolean;
75
77
  executeInBackground: boolean;
78
+ updateTransactionRequest?: TxRequestCallbackFunction;
76
79
  }
77
80
  export type EnforcedObjectProperties<T> = T & {
78
81
  [P in keyof T]-?: T[P];
@@ -88,3 +91,43 @@ export interface InteractionSettings {
88
91
  allowUpdates?: boolean;
89
92
  stopExecution?: boolean;
90
93
  }
94
+ export interface TenderlyResponse {
95
+ hash: string;
96
+ block_hash: string;
97
+ block_number: number;
98
+ from: string;
99
+ gas: number;
100
+ gas_price: number;
101
+ gas_fee_cap: number;
102
+ gas_tip_cap: number;
103
+ cumulative_gas_used: number;
104
+ gas_used: number;
105
+ effective_gas_price: number;
106
+ input: string;
107
+ nonce: number;
108
+ to: string;
109
+ index: number;
110
+ value: string;
111
+ access_list: any;
112
+ status: boolean;
113
+ addresses: string[];
114
+ contract_ids: string[];
115
+ network_id: string;
116
+ timestamp: string;
117
+ function_selector: string;
118
+ l1_block_number: number;
119
+ l1_timestamp: number;
120
+ deposit_tx: boolean;
121
+ system_tx: boolean;
122
+ mint: number;
123
+ sig: Signature;
124
+ error_message: string;
125
+ method: string;
126
+ decoded_input: any;
127
+ call_trace: any;
128
+ }
129
+ export interface Signature {
130
+ v: string;
131
+ r: string;
132
+ s: string;
133
+ }
@@ -22,7 +22,26 @@ export declare enum LifiErrorCode {
22
22
  TransactionCanceled = 1010,
23
23
  SlippageError = 1011,
24
24
  TransactionRejected = 1012,
25
- BalanceError = 1013
25
+ BalanceError = 1013,
26
+ AllowanceRequired = 1014
27
+ }
28
+ export declare enum EthersErrorType {
29
+ CallExecption = "CALL_EXCEPTION",
30
+ ActionRejected = "ACTION_REJECTED"
31
+ }
32
+ export declare enum EthersErrorMessage {
33
+ ERC20Allowance = "ERC20: transfer amount exceeds allowance",
34
+ LowGas = "intrinsic gas too low",
35
+ OutOfGas = "out of gas",
36
+ Underpriced = "underpriced",
37
+ LowReplacementFee = "replacement fee too low"
38
+ }
39
+ export declare enum ErrorMessage {
40
+ UnknownError = "Unknown error occurred.",
41
+ SlippageError = "The slippage is larger than the defined threshold. Please request a new route to get a fresh quote.",
42
+ GasLimitLow = "Gas limit is too low.",
43
+ TransactionUnderpriced = "Transaction is underpriced.",
44
+ Default = "Something went wrong."
26
45
  }
27
46
  export declare enum MetaMaskRPCErrorCode {
28
47
  invalidInput = -32000,
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HTTPError = exports.UnknownError = exports.NotFoundError = exports.BalanceError = exports.SlippageError = exports.TransactionError = exports.ValidationError = exports.ServerError = exports.ProviderError = exports.RPCError = exports.LifiError = exports.MetaMaskProviderErrorCode = exports.MetaMaskRPCErrorCode = exports.LifiErrorCode = void 0;
3
+ exports.HTTPError = exports.UnknownError = exports.NotFoundError = exports.BalanceError = exports.SlippageError = exports.TransactionError = exports.ValidationError = exports.ServerError = exports.ProviderError = exports.RPCError = exports.LifiError = exports.MetaMaskProviderErrorCode = exports.MetaMaskRPCErrorCode = exports.ErrorMessage = exports.EthersErrorMessage = exports.EthersErrorType = exports.LifiErrorCode = void 0;
4
4
  var ErrorType;
5
5
  (function (ErrorType) {
6
6
  ErrorType["RPCError"] = "RPCError";
@@ -28,7 +28,29 @@ var LifiErrorCode;
28
28
  LifiErrorCode[LifiErrorCode["SlippageError"] = 1011] = "SlippageError";
29
29
  LifiErrorCode[LifiErrorCode["TransactionRejected"] = 1012] = "TransactionRejected";
30
30
  LifiErrorCode[LifiErrorCode["BalanceError"] = 1013] = "BalanceError";
31
+ LifiErrorCode[LifiErrorCode["AllowanceRequired"] = 1014] = "AllowanceRequired";
31
32
  })(LifiErrorCode = exports.LifiErrorCode || (exports.LifiErrorCode = {}));
33
+ var EthersErrorType;
34
+ (function (EthersErrorType) {
35
+ EthersErrorType["CallExecption"] = "CALL_EXCEPTION";
36
+ EthersErrorType["ActionRejected"] = "ACTION_REJECTED";
37
+ })(EthersErrorType = exports.EthersErrorType || (exports.EthersErrorType = {}));
38
+ var EthersErrorMessage;
39
+ (function (EthersErrorMessage) {
40
+ EthersErrorMessage["ERC20Allowance"] = "ERC20: transfer amount exceeds allowance";
41
+ EthersErrorMessage["LowGas"] = "intrinsic gas too low";
42
+ EthersErrorMessage["OutOfGas"] = "out of gas";
43
+ EthersErrorMessage["Underpriced"] = "underpriced";
44
+ EthersErrorMessage["LowReplacementFee"] = "replacement fee too low";
45
+ })(EthersErrorMessage = exports.EthersErrorMessage || (exports.EthersErrorMessage = {}));
46
+ var ErrorMessage;
47
+ (function (ErrorMessage) {
48
+ ErrorMessage["UnknownError"] = "Unknown error occurred.";
49
+ ErrorMessage["SlippageError"] = "The slippage is larger than the defined threshold. Please request a new route to get a fresh quote.";
50
+ ErrorMessage["GasLimitLow"] = "Gas limit is too low.";
51
+ ErrorMessage["TransactionUnderpriced"] = "Transaction is underpriced.";
52
+ ErrorMessage["Default"] = "Something went wrong.";
53
+ })(ErrorMessage = exports.ErrorMessage || (exports.ErrorMessage = {}));
32
54
  var MetaMaskRPCErrorCode;
33
55
  (function (MetaMaskRPCErrorCode) {
34
56
  MetaMaskRPCErrorCode[MetaMaskRPCErrorCode["invalidInput"] = -32000] = "invalidInput";
@@ -79,13 +79,13 @@ const parseError = async (e, step, process) => {
79
79
  // rpc errors
80
80
  // underpriced errors are sent as internal errors, so we need to parse the message manually
81
81
  if (e.code === eth_rpc_errors_1.errorCodes.rpc.internal &&
82
- (e.message?.includes('underpriced') ||
83
- e.message?.includes('replacement fee too low'))) {
84
- return new errors_1.RPCError(errors_1.LifiErrorCode.TransactionUnderpriced, 'Transaction is underpriced.', await (0, exports.getTransactionNotSentMessage)(step, process), e.stack);
82
+ (e.message?.includes(errors_1.EthersErrorMessage.Underpriced) ||
83
+ e.message?.includes(errors_1.EthersErrorMessage.LowReplacementFee))) {
84
+ return new errors_1.RPCError(errors_1.LifiErrorCode.TransactionUnderpriced, errors_1.ErrorMessage.TransactionUnderpriced, await (0, exports.getTransactionNotSentMessage)(step, process), e.stack);
85
85
  }
86
- if (e.message?.includes('intrinsic gas too low') ||
87
- e.message?.includes('out of gas')) {
88
- return new errors_1.TransactionError(errors_1.LifiErrorCode.GasLimitError, 'Gas limit is too low.', await (0, exports.getTransactionNotSentMessage)(step, process), e.stack);
86
+ if (e.message?.includes(errors_1.EthersErrorMessage.LowGas) ||
87
+ e.message?.includes(errors_1.EthersErrorMessage.OutOfGas)) {
88
+ return new errors_1.TransactionError(errors_1.LifiErrorCode.GasLimitError, errors_1.ErrorMessage.GasLimitLow, await (0, exports.getTransactionNotSentMessage)(step, process), e.stack);
89
89
  }
90
90
  return new errors_1.RPCError(e.code, (0, eth_rpc_errors_1.getMessageFromCode)(e.code), await (0, exports.getTransactionNotSentMessage)(step, process), e.stack);
91
91
  }
@@ -96,9 +96,12 @@ const parseError = async (e, step, process) => {
96
96
  }
97
97
  }
98
98
  switch (e.code) {
99
- case 'CALL_EXCEPTION':
99
+ case errors_1.EthersErrorType.CallExecption:
100
+ if (e.reason?.includes?.includes(errors_1.EthersErrorMessage.ERC20Allowance)) {
101
+ return new errors_1.TransactionError(errors_1.LifiErrorCode.AllowanceRequired, e.reason, await (0, exports.getTransactionNotSentMessage)(step, process), e.stack);
102
+ }
100
103
  return new errors_1.ProviderError(errors_1.LifiErrorCode.TransactionFailed, e.reason, await (0, exports.getTransactionNotSentMessage)(step, process), e.stack);
101
- case 'ACTION_REJECTED':
104
+ case errors_1.EthersErrorType.ActionRejected:
102
105
  case errors_1.MetaMaskProviderErrorCode.userRejectedRequest:
103
106
  return new errors_1.TransactionError(errors_1.LifiErrorCode.TransactionRejected, e.message, await (0, exports.getTransactionNotSentMessage)(step, process), e.stack);
104
107
  case errors_1.LifiErrorCode.TransactionUnprepared:
@@ -106,7 +109,7 @@ const parseError = async (e, step, process) => {
106
109
  case errors_1.LifiErrorCode.ValidationError:
107
110
  return new errors_1.TransactionError(errors_1.LifiErrorCode.ValidationError, e.message, e.htmlMessage);
108
111
  default:
109
- return new errors_1.UnknownError(errors_1.LifiErrorCode.InternalError, e.message || 'Unknown error occurred.', undefined, e.stack);
112
+ return new errors_1.UnknownError(errors_1.LifiErrorCode.InternalError, e.message || errors_1.ErrorMessage.UnknownError, undefined, e.stack);
110
113
  }
111
114
  };
112
115
  exports.parseError = parseError;
@@ -125,11 +128,19 @@ const parseBackendError = async (e) => {
125
128
  return new errors_1.NotFoundError(data?.message || e.response?.statusText, undefined, e.stack);
126
129
  }
127
130
  if (e.response?.status === 409) {
128
- return new errors_1.SlippageError(data?.message || e.response?.statusText, 'The slippage is larger than the defined threshold. Please request a new route to get a fresh quote.', e.stack);
131
+ return new errors_1.SlippageError(data?.message || e.response?.statusText, errors_1.ErrorMessage.SlippageError, e.stack);
129
132
  }
130
133
  if (e.response?.status === 500) {
131
134
  return new errors_1.ServerError(data?.message || e.response?.statusText, undefined, e.stack);
132
135
  }
133
- return new errors_1.ServerError('Something went wrong.', undefined, e.stack);
136
+ return new errors_1.ServerError(errors_1.ErrorMessage.Default, undefined, e.stack);
134
137
  };
135
138
  exports.parseBackendError = parseBackendError;
139
+ // const fetchTxErrorDetails = async (txHash: string, chainId: number) => {
140
+ // const response = await request<TenderlyResponse>(
141
+ // `https://api.tenderly.co/api/v1/public-contract/${chainId}/tx/${txHash}`,
142
+ // undefined,
143
+ // 0
144
+ // )
145
+ // return response
146
+ // }
@@ -1,2 +1,2 @@
1
1
  export declare const name = "@lifi/sdk";
2
- export declare const version = "2.0.0-beta.8";
2
+ export declare const version = "2.0.0-beta.9";
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.version = exports.name = void 0;
4
4
  exports.name = '@lifi/sdk';
5
- exports.version = '2.0.0-beta.8';
5
+ exports.version = '2.0.0-beta.9';
@@ -75,6 +75,14 @@ export class StepExecutionManager {
75
75
  if (!this.allowUserInteraction) {
76
76
  return step.execution;
77
77
  }
78
+ if (settings.updateTransactionRequest) {
79
+ const customConfig = await settings.updateTransactionRequest(transactionRequest);
80
+ transactionRequest.gasLimit = customConfig.gasLimit;
81
+ transactionRequest.gasPrice = customConfig.gasPrice;
82
+ transactionRequest.maxPriorityFeePerGas =
83
+ customConfig.maxPriorityFeePerGas;
84
+ transactionRequest.maxFeePerGas = customConfig.maxFeePerGas;
85
+ }
78
86
  // Submit the transaction
79
87
  transaction = await signer.sendTransaction(transactionRequest);
80
88
  // STEP 4: Wait for the transaction
@@ -1,3 +1,4 @@
1
+ import { TransactionRequest } from '@ethersproject/abstract-provider';
1
2
  import { LifiStep, Route, RouteOptions, Token } from '@lifi/types';
2
3
  import BigNumber from 'bignumber.js';
3
4
  import { Signer } from 'ethers';
@@ -23,6 +24,7 @@ export interface ExecutionParams {
23
24
  settings: InternalExecutionSettings;
24
25
  }
25
26
  export type CallbackFunction = (updatedRoute: Route) => void;
27
+ export type TxRequestCallbackFunction = (updatedTxRequest: TransactionRequest) => Promise<TransactionRequest>;
26
28
  export type Config = {
27
29
  apiUrl: string;
28
30
  rpcs: Record<ChainId, string[]>;
@@ -73,6 +75,7 @@ export interface InternalExecutionSettings {
73
75
  acceptExchangeRateUpdateHook: AcceptExchangeRateUpdateHook;
74
76
  infiniteApproval: boolean;
75
77
  executeInBackground: boolean;
78
+ updateTransactionRequest?: TxRequestCallbackFunction;
76
79
  }
77
80
  export type EnforcedObjectProperties<T> = T & {
78
81
  [P in keyof T]-?: T[P];
@@ -88,3 +91,43 @@ export interface InteractionSettings {
88
91
  allowUpdates?: boolean;
89
92
  stopExecution?: boolean;
90
93
  }
94
+ export interface TenderlyResponse {
95
+ hash: string;
96
+ block_hash: string;
97
+ block_number: number;
98
+ from: string;
99
+ gas: number;
100
+ gas_price: number;
101
+ gas_fee_cap: number;
102
+ gas_tip_cap: number;
103
+ cumulative_gas_used: number;
104
+ gas_used: number;
105
+ effective_gas_price: number;
106
+ input: string;
107
+ nonce: number;
108
+ to: string;
109
+ index: number;
110
+ value: string;
111
+ access_list: any;
112
+ status: boolean;
113
+ addresses: string[];
114
+ contract_ids: string[];
115
+ network_id: string;
116
+ timestamp: string;
117
+ function_selector: string;
118
+ l1_block_number: number;
119
+ l1_timestamp: number;
120
+ deposit_tx: boolean;
121
+ system_tx: boolean;
122
+ mint: number;
123
+ sig: Signature;
124
+ error_message: string;
125
+ method: string;
126
+ decoded_input: any;
127
+ call_trace: any;
128
+ }
129
+ export interface Signature {
130
+ v: string;
131
+ r: string;
132
+ s: string;
133
+ }
@@ -22,7 +22,26 @@ export declare enum LifiErrorCode {
22
22
  TransactionCanceled = 1010,
23
23
  SlippageError = 1011,
24
24
  TransactionRejected = 1012,
25
- BalanceError = 1013
25
+ BalanceError = 1013,
26
+ AllowanceRequired = 1014
27
+ }
28
+ export declare enum EthersErrorType {
29
+ CallExecption = "CALL_EXCEPTION",
30
+ ActionRejected = "ACTION_REJECTED"
31
+ }
32
+ export declare enum EthersErrorMessage {
33
+ ERC20Allowance = "ERC20: transfer amount exceeds allowance",
34
+ LowGas = "intrinsic gas too low",
35
+ OutOfGas = "out of gas",
36
+ Underpriced = "underpriced",
37
+ LowReplacementFee = "replacement fee too low"
38
+ }
39
+ export declare enum ErrorMessage {
40
+ UnknownError = "Unknown error occurred.",
41
+ SlippageError = "The slippage is larger than the defined threshold. Please request a new route to get a fresh quote.",
42
+ GasLimitLow = "Gas limit is too low.",
43
+ TransactionUnderpriced = "Transaction is underpriced.",
44
+ Default = "Something went wrong."
26
45
  }
27
46
  export declare enum MetaMaskRPCErrorCode {
28
47
  invalidInput = -32000,
@@ -25,7 +25,29 @@ export var LifiErrorCode;
25
25
  LifiErrorCode[LifiErrorCode["SlippageError"] = 1011] = "SlippageError";
26
26
  LifiErrorCode[LifiErrorCode["TransactionRejected"] = 1012] = "TransactionRejected";
27
27
  LifiErrorCode[LifiErrorCode["BalanceError"] = 1013] = "BalanceError";
28
+ LifiErrorCode[LifiErrorCode["AllowanceRequired"] = 1014] = "AllowanceRequired";
28
29
  })(LifiErrorCode || (LifiErrorCode = {}));
30
+ export var EthersErrorType;
31
+ (function (EthersErrorType) {
32
+ EthersErrorType["CallExecption"] = "CALL_EXCEPTION";
33
+ EthersErrorType["ActionRejected"] = "ACTION_REJECTED";
34
+ })(EthersErrorType || (EthersErrorType = {}));
35
+ export var EthersErrorMessage;
36
+ (function (EthersErrorMessage) {
37
+ EthersErrorMessage["ERC20Allowance"] = "ERC20: transfer amount exceeds allowance";
38
+ EthersErrorMessage["LowGas"] = "intrinsic gas too low";
39
+ EthersErrorMessage["OutOfGas"] = "out of gas";
40
+ EthersErrorMessage["Underpriced"] = "underpriced";
41
+ EthersErrorMessage["LowReplacementFee"] = "replacement fee too low";
42
+ })(EthersErrorMessage || (EthersErrorMessage = {}));
43
+ export var ErrorMessage;
44
+ (function (ErrorMessage) {
45
+ ErrorMessage["UnknownError"] = "Unknown error occurred.";
46
+ ErrorMessage["SlippageError"] = "The slippage is larger than the defined threshold. Please request a new route to get a fresh quote.";
47
+ ErrorMessage["GasLimitLow"] = "Gas limit is too low.";
48
+ ErrorMessage["TransactionUnderpriced"] = "Transaction is underpriced.";
49
+ ErrorMessage["Default"] = "Something went wrong.";
50
+ })(ErrorMessage || (ErrorMessage = {}));
29
51
  export var MetaMaskRPCErrorCode;
30
52
  (function (MetaMaskRPCErrorCode) {
31
53
  MetaMaskRPCErrorCode[MetaMaskRPCErrorCode["invalidInput"] = -32000] = "invalidInput";
@@ -1,6 +1,6 @@
1
1
  import { errorCodes as MetaMaskErrorCodes, getMessageFromCode, } from 'eth-rpc-errors';
2
2
  import ChainsService from '../services/ChainsService';
3
- import { LifiError, LifiErrorCode, MetaMaskProviderErrorCode, NotFoundError, ProviderError, RPCError, ServerError, SlippageError, TransactionError, UnknownError, ValidationError, } from './errors';
3
+ import { ErrorMessage, EthersErrorType, EthersErrorMessage, LifiError, LifiErrorCode, MetaMaskProviderErrorCode, NotFoundError, ProviderError, RPCError, ServerError, SlippageError, TransactionError, UnknownError, ValidationError, } from './errors';
4
4
  import { formatTokenAmountOnly } from './utils';
5
5
  /**
6
6
  * Available MetaMask error codes:
@@ -71,13 +71,13 @@ export const parseError = async (e, step, process) => {
71
71
  // rpc errors
72
72
  // underpriced errors are sent as internal errors, so we need to parse the message manually
73
73
  if (e.code === MetaMaskErrorCodes.rpc.internal &&
74
- (e.message?.includes('underpriced') ||
75
- e.message?.includes('replacement fee too low'))) {
76
- return new RPCError(LifiErrorCode.TransactionUnderpriced, 'Transaction is underpriced.', await getTransactionNotSentMessage(step, process), e.stack);
74
+ (e.message?.includes(EthersErrorMessage.Underpriced) ||
75
+ e.message?.includes(EthersErrorMessage.LowReplacementFee))) {
76
+ return new RPCError(LifiErrorCode.TransactionUnderpriced, ErrorMessage.TransactionUnderpriced, await getTransactionNotSentMessage(step, process), e.stack);
77
77
  }
78
- if (e.message?.includes('intrinsic gas too low') ||
79
- e.message?.includes('out of gas')) {
80
- return new TransactionError(LifiErrorCode.GasLimitError, 'Gas limit is too low.', await getTransactionNotSentMessage(step, process), e.stack);
78
+ if (e.message?.includes(EthersErrorMessage.LowGas) ||
79
+ e.message?.includes(EthersErrorMessage.OutOfGas)) {
80
+ return new TransactionError(LifiErrorCode.GasLimitError, ErrorMessage.GasLimitLow, await getTransactionNotSentMessage(step, process), e.stack);
81
81
  }
82
82
  return new RPCError(e.code, getMessageFromCode(e.code), await getTransactionNotSentMessage(step, process), e.stack);
83
83
  }
@@ -88,9 +88,12 @@ export const parseError = async (e, step, process) => {
88
88
  }
89
89
  }
90
90
  switch (e.code) {
91
- case 'CALL_EXCEPTION':
91
+ case EthersErrorType.CallExecption:
92
+ if (e.reason?.includes?.includes(EthersErrorMessage.ERC20Allowance)) {
93
+ return new TransactionError(LifiErrorCode.AllowanceRequired, e.reason, await getTransactionNotSentMessage(step, process), e.stack);
94
+ }
92
95
  return new ProviderError(LifiErrorCode.TransactionFailed, e.reason, await getTransactionNotSentMessage(step, process), e.stack);
93
- case 'ACTION_REJECTED':
96
+ case EthersErrorType.ActionRejected:
94
97
  case MetaMaskProviderErrorCode.userRejectedRequest:
95
98
  return new TransactionError(LifiErrorCode.TransactionRejected, e.message, await getTransactionNotSentMessage(step, process), e.stack);
96
99
  case LifiErrorCode.TransactionUnprepared:
@@ -98,7 +101,7 @@ export const parseError = async (e, step, process) => {
98
101
  case LifiErrorCode.ValidationError:
99
102
  return new TransactionError(LifiErrorCode.ValidationError, e.message, e.htmlMessage);
100
103
  default:
101
- return new UnknownError(LifiErrorCode.InternalError, e.message || 'Unknown error occurred.', undefined, e.stack);
104
+ return new UnknownError(LifiErrorCode.InternalError, e.message || ErrorMessage.UnknownError, undefined, e.stack);
102
105
  }
103
106
  };
104
107
  export const parseBackendError = async (e) => {
@@ -116,10 +119,18 @@ export const parseBackendError = async (e) => {
116
119
  return new NotFoundError(data?.message || e.response?.statusText, undefined, e.stack);
117
120
  }
118
121
  if (e.response?.status === 409) {
119
- return new SlippageError(data?.message || e.response?.statusText, 'The slippage is larger than the defined threshold. Please request a new route to get a fresh quote.', e.stack);
122
+ return new SlippageError(data?.message || e.response?.statusText, ErrorMessage.SlippageError, e.stack);
120
123
  }
121
124
  if (e.response?.status === 500) {
122
125
  return new ServerError(data?.message || e.response?.statusText, undefined, e.stack);
123
126
  }
124
- return new ServerError('Something went wrong.', undefined, e.stack);
127
+ return new ServerError(ErrorMessage.Default, undefined, e.stack);
125
128
  };
129
+ // const fetchTxErrorDetails = async (txHash: string, chainId: number) => {
130
+ // const response = await request<TenderlyResponse>(
131
+ // `https://api.tenderly.co/api/v1/public-contract/${chainId}/tx/${txHash}`,
132
+ // undefined,
133
+ // 0
134
+ // )
135
+ // return response
136
+ // }
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export declare const name = "@lifi/sdk";
2
- export declare const version = "2.0.0-beta.8";
2
+ export declare const version = "2.0.0-beta.9";
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  export const name = '@lifi/sdk';
2
- export const version = '2.0.0-beta.8';
2
+ export const version = '2.0.0-beta.9';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifi/sdk",
3
- "version": "2.0.0-beta.8",
3
+ "version": "2.0.0-beta.9",
4
4
  "description": "LI.FI Any-to-Any Cross-Chain-Swap SDK",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/index.js",
@@ -76,17 +76,17 @@
76
76
  "dependencies": {
77
77
  "@ethersproject/abi": "^5.7.0",
78
78
  "@ethersproject/contracts": "^5.7.0",
79
- "@lifi/types": "^3.2.1",
79
+ "@lifi/types": "^3.2.7",
80
80
  "bignumber.js": "^9.1.1",
81
81
  "eth-rpc-errors": "^4.0.3",
82
82
  "ethers": "^5.7.2"
83
83
  },
84
84
  "devDependencies": {
85
- "@commitlint/cli": "^17.5.1",
86
- "@commitlint/config-conventional": "^17.4.4",
87
- "@typescript-eslint/eslint-plugin": "^5.58.0",
88
- "@typescript-eslint/parser": "^5.58.0",
89
- "@vitest/coverage-c8": "^0.30.0",
85
+ "@commitlint/cli": "^17.6.1",
86
+ "@commitlint/config-conventional": "^17.6.1",
87
+ "@typescript-eslint/eslint-plugin": "^5.59.0",
88
+ "@typescript-eslint/parser": "^5.59.0",
89
+ "@vitest/coverage-c8": "^0.30.1",
90
90
  "cross-fetch": "^3.1.5",
91
91
  "eslint": "^8.38.0",
92
92
  "eslint-config-prettier": "^8.8.0",
@@ -100,7 +100,7 @@
100
100
  "standard-version": "^9.5.0",
101
101
  "ts-loader": "^9.4.2",
102
102
  "typescript": "^5.0.4",
103
- "vitest": "^0.30.0"
103
+ "vitest": "^0.30.1"
104
104
  },
105
105
  "directories": {
106
106
  "test": "test"