@lifi/sdk 1.0.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/CHANGELOG.md +354 -0
- package/LICENSE +1 -0
- package/README.md +16 -0
- package/dist/Lifi.d.ts +186 -0
- package/dist/Lifi.js +461 -0
- package/dist/allowance/index.d.ts +22 -0
- package/dist/allowance/index.js +160 -0
- package/dist/allowance/utils.d.ts +14 -0
- package/dist/allowance/utils.js +137 -0
- package/dist/balances/index.d.ts +11 -0
- package/dist/balances/index.js +104 -0
- package/dist/balances/utils.d.ts +5 -0
- package/dist/balances/utils.js +255 -0
- package/dist/connectors.d.ts +6 -0
- package/dist/connectors.js +150 -0
- package/dist/execution/StatusManager.d.ts +63 -0
- package/dist/execution/StatusManager.js +150 -0
- package/dist/execution/StepExecutor.d.ts +15 -0
- package/dist/execution/StepExecutor.js +139 -0
- package/dist/execution/allowance.execute.d.ts +4 -0
- package/dist/execution/allowance.execute.js +156 -0
- package/dist/execution/balanceCheck.execute.d.ts +3 -0
- package/dist/execution/balanceCheck.execute.js +86 -0
- package/dist/execution/bridges/bridge.execute.d.ts +7 -0
- package/dist/execution/bridges/bridge.execute.js +218 -0
- package/dist/execution/exchanges/swap.execute.d.ts +7 -0
- package/dist/execution/exchanges/swap.execute.js +222 -0
- package/dist/execution/index.d.ts +1 -0
- package/dist/execution/index.js +17 -0
- package/dist/execution/switchChain.d.ts +16 -0
- package/dist/execution/switchChain.js +102 -0
- package/dist/execution/utils.d.ts +5 -0
- package/dist/execution/utils.js +175 -0
- package/dist/helpers.d.ts +18 -0
- package/dist/helpers.js +85 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +27 -0
- package/dist/services/ApiService.d.ts +14 -0
- package/dist/services/ApiService.js +350 -0
- package/dist/services/ChainsService.d.ts +11 -0
- package/dist/services/ChainsService.js +108 -0
- package/dist/services/ConfigService.d.ts +23 -0
- package/dist/services/ConfigService.js +133 -0
- package/dist/typeguards.d.ts +4 -0
- package/dist/typeguards.js +55 -0
- package/dist/types/ERC20.d.ts +22 -0
- package/dist/types/ERC20.js +53 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.js +22 -0
- package/dist/types/internal.types.d.ts +75 -0
- package/dist/types/internal.types.js +2 -0
- package/dist/utils/errors.d.ts +73 -0
- package/dist/utils/errors.js +147 -0
- package/dist/utils/getProvider.d.ts +3 -0
- package/dist/utils/getProvider.js +11 -0
- package/dist/utils/multicall.d.ts +10 -0
- package/dist/utils/multicall.js +111 -0
- package/dist/utils/multicallAbi.json +313 -0
- package/dist/utils/parseError.d.ts +37 -0
- package/dist/utils/parseError.js +184 -0
- package/dist/utils/utils.d.ts +26 -0
- package/dist/utils/utils.js +188 -0
- package/package.json +90 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.BridgeExecutionManager = void 0;
|
|
43
|
+
var ethers_1 = require("ethers");
|
|
44
|
+
var ApiService_1 = __importDefault(require("../../services/ApiService"));
|
|
45
|
+
var ChainsService_1 = __importDefault(require("../../services/ChainsService"));
|
|
46
|
+
var errors_1 = require("../../utils/errors");
|
|
47
|
+
var getProvider_1 = require("../../utils/getProvider");
|
|
48
|
+
var parseError_1 = require("../../utils/parseError");
|
|
49
|
+
var utils_1 = require("../../utils/utils");
|
|
50
|
+
var allowance_execute_1 = require("../allowance.execute");
|
|
51
|
+
var balanceCheck_execute_1 = require("../balanceCheck.execute");
|
|
52
|
+
var switchChain_1 = require("../switchChain");
|
|
53
|
+
var utils_2 = require("../utils");
|
|
54
|
+
var BridgeExecutionManager = /** @class */ (function () {
|
|
55
|
+
function BridgeExecutionManager() {
|
|
56
|
+
var _this = this;
|
|
57
|
+
this.shouldContinue = true;
|
|
58
|
+
this.setShouldContinue = function (val) {
|
|
59
|
+
_this.shouldContinue = val;
|
|
60
|
+
};
|
|
61
|
+
this.execute = function (_a) {
|
|
62
|
+
var signer = _a.signer, step = _a.step, statusManager = _a.statusManager, settings = _a.settings;
|
|
63
|
+
return __awaiter(_this, void 0, void 0, function () {
|
|
64
|
+
var action, estimate, chainsService, fromChain, toChain, oldCrossProcess, crossChainProcess, tx, personalizedStep, transactionRequest, updatedSigner, e_1, error, receivingChainProcess, statusResponse, e_2;
|
|
65
|
+
var _b, _c, _d, _e;
|
|
66
|
+
return __generator(this, function (_f) {
|
|
67
|
+
switch (_f.label) {
|
|
68
|
+
case 0:
|
|
69
|
+
action = step.action, estimate = step.estimate;
|
|
70
|
+
step.execution = statusManager.initExecutionObject(step);
|
|
71
|
+
chainsService = ChainsService_1.default.getInstance();
|
|
72
|
+
return [4 /*yield*/, chainsService.getChainById(action.fromChainId)];
|
|
73
|
+
case 1:
|
|
74
|
+
fromChain = _f.sent();
|
|
75
|
+
return [4 /*yield*/, chainsService.getChainById(action.toChainId)
|
|
76
|
+
// STEP 1: Check Allowance ////////////////////////////////////////////////
|
|
77
|
+
// approval still needed?
|
|
78
|
+
];
|
|
79
|
+
case 2:
|
|
80
|
+
toChain = _f.sent();
|
|
81
|
+
oldCrossProcess = step.execution.process.find(function (p) { return p.type === 'CROSS_CHAIN'; });
|
|
82
|
+
if (!!(oldCrossProcess === null || oldCrossProcess === void 0 ? void 0 : oldCrossProcess.txHash)) return [3 /*break*/, 4];
|
|
83
|
+
if (!(action.fromToken.address !== ethers_1.constants.AddressZero)) return [3 /*break*/, 4];
|
|
84
|
+
// Check Token Approval only if fromToken is not the native token => no approval needed in that case
|
|
85
|
+
return [4 /*yield*/, (0, allowance_execute_1.checkAllowance)(signer, step, fromChain, action.fromToken, action.fromAmount, estimate.approvalAddress, statusManager, settings.infiniteApproval, this.shouldContinue)];
|
|
86
|
+
case 3:
|
|
87
|
+
// Check Token Approval only if fromToken is not the native token => no approval needed in that case
|
|
88
|
+
_f.sent();
|
|
89
|
+
_f.label = 4;
|
|
90
|
+
case 4:
|
|
91
|
+
crossChainProcess = statusManager.findOrCreateProcess('CROSS_CHAIN', step);
|
|
92
|
+
_f.label = 5;
|
|
93
|
+
case 5:
|
|
94
|
+
_f.trys.push([5, 15, , 19]);
|
|
95
|
+
tx = void 0;
|
|
96
|
+
if (!crossChainProcess.txHash) return [3 /*break*/, 7];
|
|
97
|
+
return [4 /*yield*/, (0, getProvider_1.getProvider)(signer).getTransaction(crossChainProcess.txHash)];
|
|
98
|
+
case 6:
|
|
99
|
+
// load exiting transaction
|
|
100
|
+
tx = _f.sent();
|
|
101
|
+
return [3 /*break*/, 13];
|
|
102
|
+
case 7:
|
|
103
|
+
// check balance
|
|
104
|
+
return [4 /*yield*/, (0, balanceCheck_execute_1.balanceCheck)(signer, step)
|
|
105
|
+
// create new transaction
|
|
106
|
+
];
|
|
107
|
+
case 8:
|
|
108
|
+
// check balance
|
|
109
|
+
_f.sent();
|
|
110
|
+
return [4 /*yield*/, (0, utils_1.personalizeStep)(signer, step)];
|
|
111
|
+
case 9:
|
|
112
|
+
personalizedStep = _f.sent();
|
|
113
|
+
return [4 /*yield*/, ApiService_1.default.getStepTransaction(personalizedStep)];
|
|
114
|
+
case 10:
|
|
115
|
+
transactionRequest = (_f.sent()).transactionRequest;
|
|
116
|
+
if (!transactionRequest) {
|
|
117
|
+
throw new errors_1.TransactionError(errors_1.LifiErrorCode.TransactionUnprepared, 'Unable to prepare transaction.');
|
|
118
|
+
}
|
|
119
|
+
return [4 /*yield*/, (0, switchChain_1.switchChain)(signer, statusManager, step, settings.switchChainHook, this.shouldContinue)];
|
|
120
|
+
case 11:
|
|
121
|
+
updatedSigner = _f.sent();
|
|
122
|
+
if (!updatedSigner) {
|
|
123
|
+
// chain switch was not successful, stop execution here
|
|
124
|
+
return [2 /*return*/, step.execution];
|
|
125
|
+
}
|
|
126
|
+
signer = updatedSigner;
|
|
127
|
+
statusManager.updateProcess(step, crossChainProcess.type, 'ACTION_REQUIRED');
|
|
128
|
+
if (!this.shouldContinue) {
|
|
129
|
+
return [2 /*return*/, step.execution];
|
|
130
|
+
}
|
|
131
|
+
return [4 /*yield*/, signer.sendTransaction(transactionRequest)
|
|
132
|
+
// STEP 4: Wait for Transaction ///////////////////////////////////////////
|
|
133
|
+
];
|
|
134
|
+
case 12:
|
|
135
|
+
tx = _f.sent();
|
|
136
|
+
// STEP 4: Wait for Transaction ///////////////////////////////////////////
|
|
137
|
+
statusManager.updateProcess(step, crossChainProcess.type, 'PENDING', {
|
|
138
|
+
txHash: tx.hash,
|
|
139
|
+
txLink: fromChain.metamask.blockExplorerUrls[0] + 'tx/' + tx.hash,
|
|
140
|
+
});
|
|
141
|
+
_f.label = 13;
|
|
142
|
+
case 13: return [4 /*yield*/, tx.wait()];
|
|
143
|
+
case 14:
|
|
144
|
+
_f.sent();
|
|
145
|
+
return [3 /*break*/, 19];
|
|
146
|
+
case 15:
|
|
147
|
+
e_1 = _f.sent();
|
|
148
|
+
if (!(e_1.code === 'TRANSACTION_REPLACED' && e_1.replacement)) return [3 /*break*/, 16];
|
|
149
|
+
statusManager.updateProcess(step, crossChainProcess.type, 'PENDING', {
|
|
150
|
+
txHash: e_1.replacement.hash,
|
|
151
|
+
txLink: fromChain.metamask.blockExplorerUrls[0] +
|
|
152
|
+
'tx/' +
|
|
153
|
+
e_1.replacement.hash,
|
|
154
|
+
});
|
|
155
|
+
return [3 /*break*/, 18];
|
|
156
|
+
case 16: return [4 /*yield*/, (0, parseError_1.parseError)(e_1, step, crossChainProcess)];
|
|
157
|
+
case 17:
|
|
158
|
+
error = _f.sent();
|
|
159
|
+
statusManager.updateProcess(step, crossChainProcess.type, 'FAILED', {
|
|
160
|
+
error: {
|
|
161
|
+
message: error.message,
|
|
162
|
+
htmlMessage: error.htmlMessage,
|
|
163
|
+
code: error.code,
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
statusManager.updateExecution(step, 'FAILED');
|
|
167
|
+
throw error;
|
|
168
|
+
case 18: return [3 /*break*/, 19];
|
|
169
|
+
case 19:
|
|
170
|
+
statusManager.updateProcess(step, crossChainProcess.type, 'DONE');
|
|
171
|
+
receivingChainProcess = statusManager.findOrCreateProcess('RECEIVING_CHAIN', step, 'PENDING');
|
|
172
|
+
_f.label = 20;
|
|
173
|
+
case 20:
|
|
174
|
+
_f.trys.push([20, 22, , 23]);
|
|
175
|
+
if (!crossChainProcess.txHash) {
|
|
176
|
+
throw new Error('Transaction hash is undefined.');
|
|
177
|
+
}
|
|
178
|
+
return [4 /*yield*/, (0, utils_2.waitForReceivingTransaction)(crossChainProcess.txHash, statusManager, receivingChainProcess.type, step)];
|
|
179
|
+
case 21:
|
|
180
|
+
statusResponse = _f.sent();
|
|
181
|
+
return [3 /*break*/, 23];
|
|
182
|
+
case 22:
|
|
183
|
+
e_2 = _f.sent();
|
|
184
|
+
statusManager.updateProcess(step, receivingChainProcess.type, 'FAILED', {
|
|
185
|
+
error: {
|
|
186
|
+
code: errors_1.LifiErrorCode.TransactionFailed,
|
|
187
|
+
message: 'Failed while waiting for receiving chain.',
|
|
188
|
+
htmlMessage: (0, parseError_1.getTransactionFailedMessage)(step, crossChainProcess.txLink),
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
statusManager.updateExecution(step, 'FAILED');
|
|
192
|
+
throw e_2;
|
|
193
|
+
case 23:
|
|
194
|
+
statusManager.updateProcess(step, receivingChainProcess.type, 'DONE', {
|
|
195
|
+
substatus: statusResponse.substatus,
|
|
196
|
+
substatusMessage: statusResponse.substatusMessage ||
|
|
197
|
+
(0, utils_2.getSubstatusMessage)(statusResponse.status, statusResponse.substatus),
|
|
198
|
+
txHash: (_b = statusResponse.receiving) === null || _b === void 0 ? void 0 : _b.txHash,
|
|
199
|
+
txLink: toChain.metamask.blockExplorerUrls[0] +
|
|
200
|
+
'tx/' +
|
|
201
|
+
((_c = statusResponse.receiving) === null || _c === void 0 ? void 0 : _c.txHash),
|
|
202
|
+
});
|
|
203
|
+
statusManager.updateExecution(step, 'DONE', {
|
|
204
|
+
fromAmount: statusResponse.sending.amount,
|
|
205
|
+
toAmount: (_d = statusResponse.receiving) === null || _d === void 0 ? void 0 : _d.amount,
|
|
206
|
+
toToken: (_e = statusResponse.receiving) === null || _e === void 0 ? void 0 : _e.token,
|
|
207
|
+
// gasUsed: statusResponse.gasUsed,
|
|
208
|
+
});
|
|
209
|
+
// DONE
|
|
210
|
+
return [2 /*return*/, step.execution];
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
return BridgeExecutionManager;
|
|
217
|
+
}());
|
|
218
|
+
exports.BridgeExecutionManager = BridgeExecutionManager;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Execution } from '@lifi/types';
|
|
2
|
+
import { ExecuteSwapParams } from '../../types';
|
|
3
|
+
export declare class SwapExecutionManager {
|
|
4
|
+
shouldContinue: boolean;
|
|
5
|
+
setShouldContinue: (val: boolean) => void;
|
|
6
|
+
execute: ({ signer, step, statusManager, settings, }: ExecuteSwapParams) => Promise<Execution>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.SwapExecutionManager = void 0;
|
|
43
|
+
var ethers_1 = require("ethers");
|
|
44
|
+
var ApiService_1 = __importDefault(require("../../services/ApiService"));
|
|
45
|
+
var ChainsService_1 = __importDefault(require("../../services/ChainsService"));
|
|
46
|
+
var errors_1 = require("../../utils/errors");
|
|
47
|
+
var getProvider_1 = require("../../utils/getProvider");
|
|
48
|
+
var parseError_1 = require("../../utils/parseError");
|
|
49
|
+
var utils_1 = require("../../utils/utils");
|
|
50
|
+
var allowance_execute_1 = require("../allowance.execute");
|
|
51
|
+
var balanceCheck_execute_1 = require("../balanceCheck.execute");
|
|
52
|
+
var switchChain_1 = require("../switchChain");
|
|
53
|
+
var utils_2 = require("../utils");
|
|
54
|
+
var SwapExecutionManager = /** @class */ (function () {
|
|
55
|
+
function SwapExecutionManager() {
|
|
56
|
+
var _this = this;
|
|
57
|
+
this.shouldContinue = true;
|
|
58
|
+
this.setShouldContinue = function (val) {
|
|
59
|
+
_this.shouldContinue = val;
|
|
60
|
+
};
|
|
61
|
+
this.execute = function (_a) {
|
|
62
|
+
var signer = _a.signer, step = _a.step, statusManager = _a.statusManager, settings = _a.settings;
|
|
63
|
+
return __awaiter(_this, void 0, void 0, function () {
|
|
64
|
+
var action, estimate, chainsService, fromChain, swapProcess, tx, personalizedStep, transactionRequest, updatedSigner, e_1, error, receipt, e_2, error, statusResponse, e_3;
|
|
65
|
+
var _b, _c, _d, _e;
|
|
66
|
+
return __generator(this, function (_f) {
|
|
67
|
+
switch (_f.label) {
|
|
68
|
+
case 0:
|
|
69
|
+
action = step.action, estimate = step.estimate;
|
|
70
|
+
step.execution = statusManager.initExecutionObject(step);
|
|
71
|
+
chainsService = ChainsService_1.default.getInstance();
|
|
72
|
+
return [4 /*yield*/, chainsService.getChainById(action.fromChainId)
|
|
73
|
+
// Approval
|
|
74
|
+
];
|
|
75
|
+
case 1:
|
|
76
|
+
fromChain = _f.sent();
|
|
77
|
+
if (!(action.fromToken.address !== ethers_1.constants.AddressZero)) return [3 /*break*/, 3];
|
|
78
|
+
return [4 /*yield*/, (0, allowance_execute_1.checkAllowance)(signer, step, fromChain, action.fromToken, action.fromAmount, estimate.approvalAddress, statusManager, settings.infiniteApproval, this.shouldContinue)];
|
|
79
|
+
case 2:
|
|
80
|
+
_f.sent();
|
|
81
|
+
_f.label = 3;
|
|
82
|
+
case 3:
|
|
83
|
+
swapProcess = statusManager.findOrCreateProcess('SWAP', step);
|
|
84
|
+
_f.label = 4;
|
|
85
|
+
case 4:
|
|
86
|
+
_f.trys.push([4, 13, , 15]);
|
|
87
|
+
if (!swapProcess.txHash) return [3 /*break*/, 6];
|
|
88
|
+
return [4 /*yield*/, (0, getProvider_1.getProvider)(signer).getTransaction(swapProcess.txHash)];
|
|
89
|
+
case 5:
|
|
90
|
+
// -> restore existing tx
|
|
91
|
+
tx = _f.sent();
|
|
92
|
+
return [3 /*break*/, 12];
|
|
93
|
+
case 6:
|
|
94
|
+
// -> check balance
|
|
95
|
+
return [4 /*yield*/, (0, balanceCheck_execute_1.balanceCheck)(signer, step)
|
|
96
|
+
// -> get tx from backend
|
|
97
|
+
];
|
|
98
|
+
case 7:
|
|
99
|
+
// -> check balance
|
|
100
|
+
_f.sent();
|
|
101
|
+
return [4 /*yield*/, (0, utils_1.personalizeStep)(signer, step)];
|
|
102
|
+
case 8:
|
|
103
|
+
personalizedStep = _f.sent();
|
|
104
|
+
return [4 /*yield*/, ApiService_1.default.getStepTransaction(personalizedStep)];
|
|
105
|
+
case 9:
|
|
106
|
+
transactionRequest = (_f.sent()).transactionRequest;
|
|
107
|
+
if (!transactionRequest) {
|
|
108
|
+
throw new errors_1.TransactionError(errors_1.LifiErrorCode.TransactionUnprepared, 'Unable to prepare transaction.');
|
|
109
|
+
}
|
|
110
|
+
return [4 /*yield*/, (0, switchChain_1.switchChain)(signer, statusManager, step, settings.switchChainHook, this.shouldContinue)];
|
|
111
|
+
case 10:
|
|
112
|
+
updatedSigner = _f.sent();
|
|
113
|
+
if (!updatedSigner) {
|
|
114
|
+
// chain switch was not successful, stop execution here
|
|
115
|
+
return [2 /*return*/, step.execution];
|
|
116
|
+
}
|
|
117
|
+
signer = updatedSigner;
|
|
118
|
+
// -> set step.execution
|
|
119
|
+
statusManager.updateProcess(step, swapProcess.type, 'ACTION_REQUIRED');
|
|
120
|
+
if (!this.shouldContinue) {
|
|
121
|
+
return [2 /*return*/, step.execution]; // stop before user interaction is needed
|
|
122
|
+
}
|
|
123
|
+
return [4 /*yield*/, signer.sendTransaction(transactionRequest)];
|
|
124
|
+
case 11:
|
|
125
|
+
// -> submit tx
|
|
126
|
+
tx = _f.sent();
|
|
127
|
+
_f.label = 12;
|
|
128
|
+
case 12: return [3 /*break*/, 15];
|
|
129
|
+
case 13:
|
|
130
|
+
e_1 = _f.sent();
|
|
131
|
+
return [4 /*yield*/, (0, parseError_1.parseError)(e_1, step, swapProcess)];
|
|
132
|
+
case 14:
|
|
133
|
+
error = _f.sent();
|
|
134
|
+
statusManager.updateProcess(step, swapProcess.type, 'FAILED', {
|
|
135
|
+
error: {
|
|
136
|
+
message: error.message,
|
|
137
|
+
htmlMessage: error.htmlMessage,
|
|
138
|
+
code: error.code,
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
statusManager.updateExecution(step, 'FAILED');
|
|
142
|
+
throw error;
|
|
143
|
+
case 15:
|
|
144
|
+
// Wait for Transaction
|
|
145
|
+
statusManager.updateProcess(step, swapProcess.type, 'PENDING', {
|
|
146
|
+
txLink: fromChain.metamask.blockExplorerUrls[0] + 'tx/' + tx.hash,
|
|
147
|
+
txHash: tx.hash,
|
|
148
|
+
});
|
|
149
|
+
_f.label = 16;
|
|
150
|
+
case 16:
|
|
151
|
+
_f.trys.push([16, 18, , 22]);
|
|
152
|
+
return [4 /*yield*/, tx.wait()];
|
|
153
|
+
case 17:
|
|
154
|
+
receipt = _f.sent();
|
|
155
|
+
return [3 /*break*/, 22];
|
|
156
|
+
case 18:
|
|
157
|
+
e_2 = _f.sent();
|
|
158
|
+
if (!(e_2.code === 'TRANSACTION_REPLACED' && e_2.replacement)) return [3 /*break*/, 19];
|
|
159
|
+
receipt = e_2.replacement;
|
|
160
|
+
statusManager.updateProcess(step, swapProcess.type, 'PENDING', {
|
|
161
|
+
txHash: e_2.replacement.hash,
|
|
162
|
+
txLink: fromChain.metamask.blockExplorerUrls[0] +
|
|
163
|
+
'tx/' +
|
|
164
|
+
e_2.replacement.hash,
|
|
165
|
+
});
|
|
166
|
+
return [3 /*break*/, 21];
|
|
167
|
+
case 19: return [4 /*yield*/, (0, parseError_1.parseError)(e_2)];
|
|
168
|
+
case 20:
|
|
169
|
+
error = _f.sent();
|
|
170
|
+
statusManager.updateProcess(step, swapProcess.type, 'FAILED', {
|
|
171
|
+
error: {
|
|
172
|
+
message: error.message,
|
|
173
|
+
htmlMessage: error.htmlMessage,
|
|
174
|
+
code: error.code,
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
statusManager.updateExecution(step, 'FAILED');
|
|
178
|
+
throw error;
|
|
179
|
+
case 21: return [3 /*break*/, 22];
|
|
180
|
+
case 22:
|
|
181
|
+
_f.trys.push([22, 24, , 25]);
|
|
182
|
+
if (!swapProcess.txHash) {
|
|
183
|
+
throw new Error('Transaction hash is undefined.');
|
|
184
|
+
}
|
|
185
|
+
return [4 /*yield*/, (0, utils_2.waitForReceivingTransaction)(swapProcess.txHash, statusManager, swapProcess.type, step)];
|
|
186
|
+
case 23:
|
|
187
|
+
statusResponse = _f.sent();
|
|
188
|
+
return [3 /*break*/, 25];
|
|
189
|
+
case 24:
|
|
190
|
+
e_3 = _f.sent();
|
|
191
|
+
statusManager.updateProcess(step, swapProcess.type, 'FAILED', {
|
|
192
|
+
error: {
|
|
193
|
+
code: errors_1.LifiErrorCode.TransactionFailed,
|
|
194
|
+
message: 'Failed while waiting for receiving chain.',
|
|
195
|
+
htmlMessage: (0, parseError_1.getTransactionFailedMessage)(step, swapProcess.txLink),
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
statusManager.updateExecution(step, 'FAILED');
|
|
199
|
+
throw e_3;
|
|
200
|
+
case 25:
|
|
201
|
+
statusManager.updateProcess(step, swapProcess.type, 'DONE', {
|
|
202
|
+
txHash: (_b = statusResponse.receiving) === null || _b === void 0 ? void 0 : _b.txHash,
|
|
203
|
+
txLink: fromChain.metamask.blockExplorerUrls[0] +
|
|
204
|
+
'tx/' +
|
|
205
|
+
((_c = statusResponse.receiving) === null || _c === void 0 ? void 0 : _c.txHash),
|
|
206
|
+
});
|
|
207
|
+
statusManager.updateExecution(step, 'DONE', {
|
|
208
|
+
fromAmount: statusResponse.sending.amount,
|
|
209
|
+
toAmount: (_d = statusResponse.receiving) === null || _d === void 0 ? void 0 : _d.amount,
|
|
210
|
+
toToken: (_e = statusResponse.receiving) === null || _e === void 0 ? void 0 : _e.token,
|
|
211
|
+
// gasUsed: statusResponse.gasUsed,
|
|
212
|
+
});
|
|
213
|
+
// DONE
|
|
214
|
+
return [2 /*return*/, step.execution];
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
return SwapExecutionManager;
|
|
221
|
+
}());
|
|
222
|
+
exports.SwapExecutionManager = SwapExecutionManager;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './StatusManager';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./StatusManager"), exports);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Step } from '@lifi/types';
|
|
2
|
+
import { Signer } from 'ethers';
|
|
3
|
+
import { SwitchChainHook } from '../types';
|
|
4
|
+
import { StatusManager } from './StatusManager';
|
|
5
|
+
/**
|
|
6
|
+
* This method checks whether the signer is configured for the correct chain.
|
|
7
|
+
* If yes it returns the signer.
|
|
8
|
+
* If no and if user interaction is allowed it triggers the switchChainHook. If no user interaction is allowed it aborts.
|
|
9
|
+
*
|
|
10
|
+
* @param signer
|
|
11
|
+
* @param statusManager
|
|
12
|
+
* @param step
|
|
13
|
+
* @param switchChainHook
|
|
14
|
+
* @param allowUserInteraction
|
|
15
|
+
*/
|
|
16
|
+
export declare const switchChain: (signer: Signer, statusManager: StatusManager, step: Step, switchChainHook: SwitchChainHook, allowUserInteraction: boolean) => Promise<Signer | undefined>;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.switchChain = void 0;
|
|
40
|
+
var errors_1 = require("../utils/errors");
|
|
41
|
+
/**
|
|
42
|
+
* This method checks whether the signer is configured for the correct chain.
|
|
43
|
+
* If yes it returns the signer.
|
|
44
|
+
* If no and if user interaction is allowed it triggers the switchChainHook. If no user interaction is allowed it aborts.
|
|
45
|
+
*
|
|
46
|
+
* @param signer
|
|
47
|
+
* @param statusManager
|
|
48
|
+
* @param step
|
|
49
|
+
* @param switchChainHook
|
|
50
|
+
* @param allowUserInteraction
|
|
51
|
+
*/
|
|
52
|
+
var switchChain = function (signer, statusManager, step, switchChainHook, allowUserInteraction) { return __awaiter(void 0, void 0, void 0, function () {
|
|
53
|
+
var switchProcess, updatedSigner, _a, error_1;
|
|
54
|
+
return __generator(this, function (_b) {
|
|
55
|
+
switch (_b.label) {
|
|
56
|
+
case 0: return [4 /*yield*/, signer.getChainId()];
|
|
57
|
+
case 1:
|
|
58
|
+
// if we are already on the correct chain we can proceed directly
|
|
59
|
+
if ((_b.sent()) === step.action.fromChainId) {
|
|
60
|
+
return [2 /*return*/, signer];
|
|
61
|
+
}
|
|
62
|
+
// -> set status message
|
|
63
|
+
step.execution = statusManager.initExecutionObject(step);
|
|
64
|
+
statusManager.updateExecution(step, 'CHAIN_SWITCH_REQUIRED');
|
|
65
|
+
switchProcess = statusManager.findOrCreateProcess('SWITCH_CHAIN', step, 'PENDING');
|
|
66
|
+
if (!allowUserInteraction) {
|
|
67
|
+
return [2 /*return*/];
|
|
68
|
+
}
|
|
69
|
+
_b.label = 2;
|
|
70
|
+
case 2:
|
|
71
|
+
_b.trys.push([2, 6, , 7]);
|
|
72
|
+
return [4 /*yield*/, switchChainHook(step.action.fromChainId)];
|
|
73
|
+
case 3:
|
|
74
|
+
updatedSigner = _b.sent();
|
|
75
|
+
_a = !updatedSigner;
|
|
76
|
+
if (_a) return [3 /*break*/, 5];
|
|
77
|
+
return [4 /*yield*/, updatedSigner.getChainId()];
|
|
78
|
+
case 4:
|
|
79
|
+
_a = (_b.sent()) !== step.action.fromChainId;
|
|
80
|
+
_b.label = 5;
|
|
81
|
+
case 5:
|
|
82
|
+
if (_a) {
|
|
83
|
+
throw new errors_1.ProviderError(errors_1.LifiErrorCode.ChainSwitchError, 'Chain switch required.');
|
|
84
|
+
}
|
|
85
|
+
statusManager.updateProcess(step, switchProcess.type, 'DONE');
|
|
86
|
+
statusManager.updateExecution(step, 'PENDING');
|
|
87
|
+
return [2 /*return*/, updatedSigner];
|
|
88
|
+
case 6:
|
|
89
|
+
error_1 = _b.sent();
|
|
90
|
+
statusManager.updateProcess(step, switchProcess.type, 'FAILED', {
|
|
91
|
+
error: {
|
|
92
|
+
message: error_1.message,
|
|
93
|
+
code: error_1.code,
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
statusManager.updateExecution(step, 'FAILED');
|
|
97
|
+
throw error_1;
|
|
98
|
+
case 7: return [2 /*return*/];
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}); };
|
|
102
|
+
exports.switchChain = switchChain;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ProcessType, Status, StatusMessage, StatusResponse, Step, Substatus } from '@lifi/types';
|
|
2
|
+
import { StatusManager } from '..';
|
|
3
|
+
export declare function waitForReceivingTransaction(txHash: string, statusManager: StatusManager, processType: ProcessType, step: Step): Promise<StatusResponse>;
|
|
4
|
+
export declare function getProcessMessage(type: ProcessType, status: Status): string | undefined;
|
|
5
|
+
export declare function getSubstatusMessage(status: StatusMessage, substatus?: Substatus): string | undefined;
|