@gearbox-protocol/sdk 0.0.55 → 0.0.56
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/lib/core/pathfinder.d.ts +35 -5
- package/lib/core/pathfinder.js +547 -67
- package/lib/core/token.d.ts +5 -0
- package/lib/core/token.js +8 -1
- package/lib/core/tradeTypes.d.ts +2 -0
- package/lib/pathfinder/connectorPathAsset.d.ts +7 -0
- package/lib/pathfinder/connectorPathAsset.js +144 -0
- package/lib/pathfinder/convexLPTokenPathAsset.d.ts +5 -0
- package/lib/pathfinder/convexLPTokenPathAsset.js +77 -0
- package/lib/pathfinder/curveLPPathAsset.d.ts +5 -0
- package/lib/pathfinder/curveLPPathAsset.js +72 -0
- package/lib/pathfinder/metaCurveLPPathAsset.d.ts +5 -0
- package/lib/pathfinder/metaCurveLPPathAsset.js +72 -0
- package/lib/pathfinder/normalTokenPathAsset.d.ts +5 -0
- package/lib/pathfinder/normalTokenPathAsset.js +136 -0
- package/lib/pathfinder/path.d.ts +41 -0
- package/lib/pathfinder/path.js +302 -0
- package/lib/pathfinder/pathfinder.d.ts +28 -0
- package/lib/pathfinder/pathfinder.js +519 -0
- package/lib/pathfinder/yearnVaultOfCurveLPPathAsset.d.ts +5 -0
- package/lib/pathfinder/yearnVaultOfCurveLPPathAsset.js +87 -0
- package/lib/pathfinder/yearnVaultOfMetaCurveLPPathAsset.d.ts +5 -0
- package/lib/pathfinder/yearnVaultOfMetaCurveLPPathAsset.js +87 -0
- package/lib/pathfinder/yearnVaultPathAsset.d.ts +5 -0
- package/lib/pathfinder/yearnVaultPathAsset.js +87 -0
- package/lib/utils/types.d.ts +3 -0
- package/lib/utils/types.js +2 -0
- package/package.json +1 -1
- package/src/core/contracts.ts +11 -1
- package/src/core/token.ts +12 -0
- package/src/core/tradeTypes.ts +2 -0
- package/src/pathfinder/connectorPathAsset.ts +69 -0
- package/src/pathfinder/convexLPTokenPathAsset.ts +33 -0
- package/src/pathfinder/curveLPPathAsset.ts +10 -0
- package/src/pathfinder/metaCurveLPPathAsset.ts +12 -0
- package/src/pathfinder/normalTokenPathAsset.ts +68 -0
- package/src/pathfinder/path.ts +259 -0
- package/src/pathfinder/yearnVaultOfCurveLPPathAsset.ts +22 -0
- package/src/pathfinder/yearnVaultOfMetaCurveLPPathAsset.ts +22 -0
- package/src/pathfinder/yearnVaultPathAsset.ts +27 -0
- package/src/utils/types.ts +3 -0
- package/src/core/pathfinder.ts +0 -115
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
20
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
21
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
22
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
23
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
27
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
28
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
29
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
30
|
+
function step(op) {
|
|
31
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
32
|
+
while (_) try {
|
|
33
|
+
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;
|
|
34
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
35
|
+
switch (op[0]) {
|
|
36
|
+
case 0: case 1: t = op; break;
|
|
37
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
38
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
39
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
40
|
+
default:
|
|
41
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
42
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
43
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
44
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
45
|
+
if (t[2]) _.ops.pop();
|
|
46
|
+
_.trys.pop(); continue;
|
|
47
|
+
}
|
|
48
|
+
op = body.call(thisArg, _);
|
|
49
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
50
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
exports.YearnVaultOfMetaCurveLPPathAsset = void 0;
|
|
55
|
+
var token_1 = require("../core/token");
|
|
56
|
+
var path_1 = require("./path");
|
|
57
|
+
var ethers_1 = require("ethers");
|
|
58
|
+
var YearnVaultOfMetaCurveLPPathAsset = /** @class */ (function (_super) {
|
|
59
|
+
__extends(YearnVaultOfMetaCurveLPPathAsset, _super);
|
|
60
|
+
function YearnVaultOfMetaCurveLPPathAsset() {
|
|
61
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
62
|
+
}
|
|
63
|
+
YearnVaultOfMetaCurveLPPathAsset.prototype.getBestPath = function (currentToken, p) {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
65
|
+
var currentBalance, currentTokenData, outputToken, yearnActionData;
|
|
66
|
+
return __generator(this, function (_a) {
|
|
67
|
+
switch (_a.label) {
|
|
68
|
+
case 0:
|
|
69
|
+
currentBalance = p.balances[currentToken].sub(1);
|
|
70
|
+
currentTokenData = token_1.supportedTokens[currentToken];
|
|
71
|
+
outputToken = currentTokenData.lpActions[0].tokenOut;
|
|
72
|
+
return [4 /*yield*/, this.getYearnActionData(currentTokenData.lpActions[0], currentBalance, p)];
|
|
73
|
+
case 1:
|
|
74
|
+
yearnActionData = _a.sent();
|
|
75
|
+
p.balances[outputToken].add(yearnActionData.amountOut);
|
|
76
|
+
p.balances[currentToken] = ethers_1.BigNumber.from(1);
|
|
77
|
+
p.totalGasLimit.add(yearnActionData.gasLimit);
|
|
78
|
+
p.calls.push(yearnActionData.callData);
|
|
79
|
+
return [4 /*yield*/, p.getBestPath()];
|
|
80
|
+
case 2: return [2 /*return*/, _a.sent()];
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
return YearnVaultOfMetaCurveLPPathAsset;
|
|
86
|
+
}(path_1.PathAsset));
|
|
87
|
+
exports.YearnVaultOfMetaCurveLPPathAsset = YearnVaultOfMetaCurveLPPathAsset;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
20
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
21
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
22
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
23
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
27
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
28
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
29
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
30
|
+
function step(op) {
|
|
31
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
32
|
+
while (_) try {
|
|
33
|
+
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;
|
|
34
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
35
|
+
switch (op[0]) {
|
|
36
|
+
case 0: case 1: t = op; break;
|
|
37
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
38
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
39
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
40
|
+
default:
|
|
41
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
42
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
43
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
44
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
45
|
+
if (t[2]) _.ops.pop();
|
|
46
|
+
_.trys.pop(); continue;
|
|
47
|
+
}
|
|
48
|
+
op = body.call(thisArg, _);
|
|
49
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
50
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
exports.YearnVaultPathAsset = void 0;
|
|
55
|
+
var ethers_1 = require("ethers");
|
|
56
|
+
var token_1 = require("../core/token");
|
|
57
|
+
var path_1 = require("./path");
|
|
58
|
+
var YearnVaultPathAsset = /** @class */ (function (_super) {
|
|
59
|
+
__extends(YearnVaultPathAsset, _super);
|
|
60
|
+
function YearnVaultPathAsset() {
|
|
61
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
62
|
+
}
|
|
63
|
+
YearnVaultPathAsset.prototype.getBestPath = function (currentToken, p) {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
65
|
+
var currentBalance, currentTokenData, outputToken, yearnActionData;
|
|
66
|
+
return __generator(this, function (_a) {
|
|
67
|
+
switch (_a.label) {
|
|
68
|
+
case 0:
|
|
69
|
+
currentBalance = p.balances[currentToken].sub(1);
|
|
70
|
+
currentTokenData = token_1.supportedTokens[currentToken];
|
|
71
|
+
outputToken = currentTokenData.lpActions[0].tokenOut;
|
|
72
|
+
return [4 /*yield*/, this.getYearnActionData(currentTokenData.lpActions[0], currentBalance, p)];
|
|
73
|
+
case 1:
|
|
74
|
+
yearnActionData = _a.sent();
|
|
75
|
+
p.balances[outputToken].add(yearnActionData.amountOut);
|
|
76
|
+
p.balances[currentToken] = ethers_1.BigNumber.from(1);
|
|
77
|
+
p.totalGasLimit.add(yearnActionData.gasLimit);
|
|
78
|
+
p.calls.push(yearnActionData.callData);
|
|
79
|
+
return [4 /*yield*/, p.getBestPath()];
|
|
80
|
+
case 2: return [2 /*return*/, _a.sent()];
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
return YearnVaultPathAsset;
|
|
86
|
+
}(path_1.PathAsset));
|
|
87
|
+
exports.YearnVaultPathAsset = YearnVaultPathAsset;
|
package/package.json
CHANGED
package/src/core/contracts.ts
CHANGED
|
@@ -22,6 +22,7 @@ export type CurvePoolContract =
|
|
|
22
22
|
| "CURVE_FRAX_POOL"
|
|
23
23
|
| "CURVE_LUSD_POOL"
|
|
24
24
|
| "CURVE_GUSD_POOL"
|
|
25
|
+
| "CURVE_SUSD_DEPOSIT"
|
|
25
26
|
| "CURVE_SUSD_POOL";
|
|
26
27
|
|
|
27
28
|
export type YearnVaultContract =
|
|
@@ -64,6 +65,7 @@ export const contractsByNetwork: Record<
|
|
|
64
65
|
CURVE_FRAX_POOL: tokenDataByNetwork.Mainnet.FRAX3CRV,
|
|
65
66
|
CURVE_LUSD_POOL: tokenDataByNetwork.Mainnet.LUSD3CRV,
|
|
66
67
|
CURVE_SUSD_POOL: "0xA5407eAE9Ba41422680e2e00537571bcC53efBfD", // SEPARATE TOKEN
|
|
68
|
+
CURVE_SUSD_DEPOSIT: "0xFCBa3E75865d2d561BE8D220616520c171F12851",
|
|
67
69
|
CURVE_GUSD_POOL: "0x4f062658EaAF2C1ccf8C8e36D6824CDf41167956", // SEPARATE TOKEN
|
|
68
70
|
|
|
69
71
|
// YEARN
|
|
@@ -97,6 +99,7 @@ export const contractsByNetwork: Record<
|
|
|
97
99
|
CURVE_FRAX_POOL: "",
|
|
98
100
|
CURVE_LUSD_POOL: tokenDataByNetwork.Kovan.LUSD3CRV,
|
|
99
101
|
CURVE_SUSD_POOL: "0x032f1cE00865F3499C0052ceBA5F2348842416DB", // SEPARATE TOKEN
|
|
102
|
+
CURVE_SUSD_DEPOSIT: "",
|
|
100
103
|
CURVE_GUSD_POOL: "",
|
|
101
104
|
|
|
102
105
|
// YEARN
|
|
@@ -247,12 +250,19 @@ export const contractParams: Record<SupportedContract, ContractParams> = {
|
|
|
247
250
|
lpToken: "crvPlain3andSUSD",
|
|
248
251
|
tokens: ["DAI", "USDC", "USDT", "sUSD"]
|
|
249
252
|
},
|
|
253
|
+
CURVE_SUSD_DEPOSIT: {
|
|
254
|
+
name: "Curve SUSD Deposit",
|
|
255
|
+
protocol: Protocols.Curve,
|
|
256
|
+
type: AdapterInterface.CURVE_V1_4ASSETS,
|
|
257
|
+
lpToken: "crvPlain3andSUSD",
|
|
258
|
+
tokens: ["DAI", "USDC", "USDT", "sUSD"]
|
|
259
|
+
},
|
|
250
260
|
CURVE_GUSD_POOL: {
|
|
251
261
|
name: "Curve GUSD",
|
|
252
262
|
protocol: Protocols.Curve,
|
|
253
263
|
type: AdapterInterface.CURVE_V1_2ASSETS,
|
|
254
264
|
lpToken: "gusd3CRV",
|
|
255
|
-
tokens: ["3Crv", "
|
|
265
|
+
tokens: ["3Crv", "GUSD"]
|
|
256
266
|
},
|
|
257
267
|
|
|
258
268
|
YEARN_DAI_VAULT: {
|
package/src/core/token.ts
CHANGED
|
@@ -2,6 +2,8 @@ import { objectEntries, keyToLowercase, swapKeyValue } from "../utils/mappers";
|
|
|
2
2
|
import { NetworkType } from "./constants";
|
|
3
3
|
import { ConvexPoolContract } from "./contracts";
|
|
4
4
|
import { TradeAction, TradeType } from "./tradeTypes";
|
|
5
|
+
import { PartialRecord } from "../utils/types";
|
|
6
|
+
import { BigNumber } from "ethers";
|
|
5
7
|
|
|
6
8
|
export enum TokenType {
|
|
7
9
|
CONNECTOR,
|
|
@@ -29,6 +31,14 @@ export const priority: Record<TokenType, number> = {
|
|
|
29
31
|
[TokenType.DIESEL_LP_TOKEN]: 6
|
|
30
32
|
};
|
|
31
33
|
|
|
34
|
+
export const Curve3CrvUnderlyingTokenIndex: PartialRecord<SupportedToken, BigNumber> = {
|
|
35
|
+
DAI: BigNumber.from(0),
|
|
36
|
+
USDC: BigNumber.from(1),
|
|
37
|
+
USDT: BigNumber.from(2)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const ConnectorTokens: Array<SupportedToken> = ["DAI", "USDC", "WETH", "WBTC"];
|
|
41
|
+
|
|
32
42
|
export type NormalToken =
|
|
33
43
|
| "1INCH"
|
|
34
44
|
| "AAVE"
|
|
@@ -182,6 +192,7 @@ type DieselTokenData = {
|
|
|
182
192
|
|
|
183
193
|
type GearboxTokenData = {
|
|
184
194
|
symbol: GearboxToken;
|
|
195
|
+
swapActions?: Array<TradeAction>;
|
|
185
196
|
type: TokenType.NORMAL_TOKEN;
|
|
186
197
|
} & TokenBase;
|
|
187
198
|
|
|
@@ -199,6 +210,7 @@ export type TokenDataI =
|
|
|
199
210
|
| GearboxTokenData;
|
|
200
211
|
|
|
201
212
|
export const supportedTokens: Record<SupportedToken, TokenDataI> = {
|
|
213
|
+
|
|
202
214
|
"1INCH": {
|
|
203
215
|
name: "1INCH",
|
|
204
216
|
decimals: 18,
|
package/src/core/tradeTypes.ts
CHANGED
|
@@ -34,10 +34,12 @@ export type TradeAction =
|
|
|
34
34
|
| {
|
|
35
35
|
type: TradeType.UniswapV2Swap;
|
|
36
36
|
contract: UniswapV2Contract;
|
|
37
|
+
tokenOut?: NormalToken;
|
|
37
38
|
}
|
|
38
39
|
| {
|
|
39
40
|
type: TradeType.UniswapV3Swap;
|
|
40
41
|
contract: "UNISWAP_V3_ROUTER";
|
|
42
|
+
tokenOut?: NormalToken;
|
|
41
43
|
}
|
|
42
44
|
| {
|
|
43
45
|
type: TradeType.CurveExchange;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import {BigNumber} from "ethers";
|
|
2
|
+
import {
|
|
3
|
+
SupportedToken,
|
|
4
|
+
supportedTokens,
|
|
5
|
+
tokenDataByNetwork,
|
|
6
|
+
TokenDataI,
|
|
7
|
+
TokenType
|
|
8
|
+
} from "../core/token";
|
|
9
|
+
import {Path, PathAsset, ActionData} from "./path";
|
|
10
|
+
|
|
11
|
+
export class ConnectorPathAsset extends PathAsset {
|
|
12
|
+
async getBestPath(currentToken: SupportedToken, p: Path): Promise<Path> {
|
|
13
|
+
type ConnectorDataI = Extract<TokenDataI, { type: TokenType.CONNECTOR }>;
|
|
14
|
+
|
|
15
|
+
const currentBalance: BigNumber = p.balances[currentToken].sub(1);
|
|
16
|
+
const currentTokenAddress: string = tokenDataByNetwork[p.networkType][currentToken];
|
|
17
|
+
const currentTokenData: TokenDataI = supportedTokens[currentToken] as ConnectorDataI;
|
|
18
|
+
// connector token will only swap to pool
|
|
19
|
+
const nextToken: SupportedToken = p.pool;
|
|
20
|
+
const nextTokenAddress: string = tokenDataByNetwork[p.networkType][nextToken];
|
|
21
|
+
|
|
22
|
+
let actionData: ActionData = {
|
|
23
|
+
callData: {
|
|
24
|
+
targetContract: "",
|
|
25
|
+
callData: ""
|
|
26
|
+
},
|
|
27
|
+
amountOut: BigNumber.from(0),
|
|
28
|
+
gasLimit: BigNumber.from(0),
|
|
29
|
+
};
|
|
30
|
+
for (let swapAction of currentTokenData.swapActions) {
|
|
31
|
+
const tmpActionData: ActionData = await this.getActionData(swapAction, currentTokenAddress, currentToken, currentBalance, nextTokenAddress, nextToken, p);
|
|
32
|
+
|
|
33
|
+
if (tmpActionData.amountOut > actionData.amountOut) {
|
|
34
|
+
actionData = tmpActionData;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (actionData.callData.targetContract != "") {
|
|
39
|
+
p.balances[nextToken].add(actionData.amountOut);
|
|
40
|
+
p.balances[currentToken] = BigNumber.from(1);
|
|
41
|
+
p.totalGasLimit.add(actionData.gasLimit);
|
|
42
|
+
p.calls.push(actionData.callData);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return await p.getBestPath();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Only compute the maximum amount of pool token output, will not modify path.
|
|
49
|
+
async getMaxPoolAmount(currentToken: SupportedToken, currentBalance: BigNumber, p: Path): Promise<BigNumber> {
|
|
50
|
+
type ConnectorDataI = Extract<TokenDataI, { type: TokenType.CONNECTOR }>;
|
|
51
|
+
|
|
52
|
+
const currentTokenAddress: string = tokenDataByNetwork[p.networkType][currentToken];
|
|
53
|
+
const currentTokenData: TokenDataI = supportedTokens[currentToken] as ConnectorDataI;
|
|
54
|
+
// connector token will only swap to pool
|
|
55
|
+
const nextToken: SupportedToken = p.pool;
|
|
56
|
+
const nextTokenAddress: string = tokenDataByNetwork[p.networkType][nextToken];
|
|
57
|
+
|
|
58
|
+
let maxAmountOut: BigNumber = BigNumber.from(0);
|
|
59
|
+
for (let swapAction of currentTokenData.swapActions) {
|
|
60
|
+
const actionData: ActionData = await this.getActionData(swapAction, currentTokenAddress, currentToken, currentBalance, nextTokenAddress, nextToken, p);
|
|
61
|
+
|
|
62
|
+
if (actionData.amountOut > maxAmountOut) {
|
|
63
|
+
maxAmountOut = actionData.amountOut;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return maxAmountOut;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {BigNumber} from "ethers";
|
|
2
|
+
import {
|
|
3
|
+
SupportedToken,
|
|
4
|
+
supportedTokens,
|
|
5
|
+
TokenDataI,
|
|
6
|
+
TokenType
|
|
7
|
+
} from "../core/token";
|
|
8
|
+
import {contractsByNetwork} from "../core/contracts";
|
|
9
|
+
import {TradeType} from "../core/tradeTypes";
|
|
10
|
+
import {Path, PathAsset} from "./path";
|
|
11
|
+
|
|
12
|
+
export class ConvexLPTokenPathAsset extends PathAsset {
|
|
13
|
+
async getBestPath(currentToken: SupportedToken, p: Path): Promise<Path> {
|
|
14
|
+
throw Error("Implementation not finished!");
|
|
15
|
+
const currentBalance: BigNumber = p.balances[currentToken].sub(1);
|
|
16
|
+
type ConvexLPTokenDataI = Extract<TokenDataI, { type: TokenType.CONVEX_LP_TOKEN }>;
|
|
17
|
+
const currentTokenData: ConvexLPTokenDataI = supportedTokens[currentToken] as ConvexLPTokenDataI;
|
|
18
|
+
|
|
19
|
+
for (let lpAction of currentTokenData.lpActions) {
|
|
20
|
+
if (lpAction.type == TradeType.ConvexWithdrawLP) {
|
|
21
|
+
const actionContractAddress: string = contractsByNetwork[p.networkType][lpAction.contract];
|
|
22
|
+
const adapterAddress: string = p.creditManager.adapters[actionContractAddress];
|
|
23
|
+
const outputToken: SupportedToken = lpAction.tokenOut as SupportedToken;
|
|
24
|
+
console.log(currentBalance);
|
|
25
|
+
console.log(adapterAddress);
|
|
26
|
+
console.log(outputToken);
|
|
27
|
+
// TODO(byli) wait convex adapter types
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return await p.getBestPath();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import {SupportedToken} from "../core/token";
|
|
2
|
+
import {Path, PathAsset} from "./path";
|
|
3
|
+
|
|
4
|
+
export class CurveLPPathAsset extends PathAsset {
|
|
5
|
+
async getBestPath(currentToken: SupportedToken, p: Path): Promise<Path> {
|
|
6
|
+
console.log(currentToken);
|
|
7
|
+
console.log(p);
|
|
8
|
+
throw Error("Not implemented yet.");
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SupportedToken,
|
|
3
|
+
} from "../core/token";
|
|
4
|
+
import {Path, PathAsset} from "./path";
|
|
5
|
+
|
|
6
|
+
export class MetaCurveLPPathAsset extends PathAsset {
|
|
7
|
+
async getBestPath(currentToken: SupportedToken, p: Path): Promise<Path> {
|
|
8
|
+
console.log(currentToken);
|
|
9
|
+
console.log(p);
|
|
10
|
+
throw Error("Not implemented yet.");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import {BigNumber} from "ethers";
|
|
2
|
+
import {
|
|
3
|
+
ConnectorTokens,
|
|
4
|
+
SupportedToken,
|
|
5
|
+
supportedTokens,
|
|
6
|
+
tokenDataByNetwork,
|
|
7
|
+
TokenDataI,
|
|
8
|
+
TokenType
|
|
9
|
+
} from "../core/token";
|
|
10
|
+
import {ActionData, Path, PathAsset} from "./path";
|
|
11
|
+
import {ConnectorPathAsset} from "./connectorPathAsset";
|
|
12
|
+
|
|
13
|
+
export class NormalTokenPathAsset extends PathAsset {
|
|
14
|
+
async getBestPath(currentToken: SupportedToken, p: Path): Promise<Path> {
|
|
15
|
+
type ConnectorDataI = Extract<TokenDataI, { type: TokenType.NORMAL_TOKEN }>;
|
|
16
|
+
|
|
17
|
+
const currentBalance: BigNumber = p.balances[currentToken].sub(1);
|
|
18
|
+
const currentTokenAddress: string = tokenDataByNetwork[p.networkType][currentToken];
|
|
19
|
+
const currentTokenData: TokenDataI = supportedTokens[currentToken] as ConnectorDataI;
|
|
20
|
+
|
|
21
|
+
let actionData: ActionData = {
|
|
22
|
+
callData: {
|
|
23
|
+
targetContract: "",
|
|
24
|
+
callData: ""
|
|
25
|
+
},
|
|
26
|
+
amountOut: BigNumber.from(0),
|
|
27
|
+
gasLimit: BigNumber.from(0),
|
|
28
|
+
};
|
|
29
|
+
let nextToken: SupportedToken = p.pool;
|
|
30
|
+
let maxPoolAmountOut: BigNumber = BigNumber.from(0);
|
|
31
|
+
|
|
32
|
+
// enumerate connector token and find a best one
|
|
33
|
+
for (let connToken of ConnectorTokens) {
|
|
34
|
+
const connTokenAddress: string = tokenDataByNetwork[p.networkType][connToken];
|
|
35
|
+
|
|
36
|
+
for (let swapAction of currentTokenData.swapActions!) {
|
|
37
|
+
const tmpActionData: ActionData = await this.getActionData(swapAction, currentTokenAddress, currentToken, currentBalance, connTokenAddress, connToken, p);
|
|
38
|
+
|
|
39
|
+
// compute connToken to pool token
|
|
40
|
+
if (connToken != p.pool) {
|
|
41
|
+
const connectorPathAsset = new ConnectorPathAsset();
|
|
42
|
+
const poolAmountOut: BigNumber = await connectorPathAsset.getMaxPoolAmount(connToken, actionData.amountOut, p);
|
|
43
|
+
if (poolAmountOut > maxPoolAmountOut) {
|
|
44
|
+
maxPoolAmountOut = poolAmountOut;
|
|
45
|
+
|
|
46
|
+
actionData = tmpActionData;
|
|
47
|
+
nextToken = connToken;
|
|
48
|
+
}
|
|
49
|
+
} else {
|
|
50
|
+
if (actionData.amountOut > maxPoolAmountOut) {
|
|
51
|
+
maxPoolAmountOut = actionData.amountOut;
|
|
52
|
+
|
|
53
|
+
actionData = tmpActionData;
|
|
54
|
+
nextToken = p.pool;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (actionData.callData.targetContract != "") {
|
|
61
|
+
p.balances[nextToken].add(actionData.amountOut);
|
|
62
|
+
p.balances[currentToken] = BigNumber.from(1);
|
|
63
|
+
p.totalGasLimit.add(actionData.gasLimit);
|
|
64
|
+
p.calls.push(actionData.callData);
|
|
65
|
+
}
|
|
66
|
+
return await p.getBestPath();
|
|
67
|
+
}
|
|
68
|
+
}
|