@curvefi/llamalend-api 1.1.10 → 2.0.1
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/docs/MIGRATION.md +325 -0
- package/docs/SUPPORT_LLv2.md +409 -0
- package/lib/constants/abis/OneWayLendingFactoryV2ABI.json +543 -0
- package/lib/constants/aliases.d.ts +0 -11
- package/lib/constants/aliases.js +1 -86
- package/lib/constants/coins.d.ts +0 -11
- package/lib/constants/coins.js +0 -14
- package/lib/constants/utils.d.ts +2 -0
- package/lib/constants/utils.js +2 -0
- package/lib/index.d.ts +10 -4
- package/lib/interfaces.d.ts +3 -2
- package/lib/lendMarkets/LendMarketTemplate.d.ts +13 -502
- package/lib/lendMarkets/LendMarketTemplate.js +245 -2860
- package/lib/lendMarkets/fetch/fetchFactoryData.d.ts +13 -0
- package/lib/lendMarkets/fetch/fetchFactoryData.js +101 -0
- package/lib/lendMarkets/fetch/fetchLendMarkets.d.ts +3 -0
- package/lib/lendMarkets/fetch/fetchLendMarkets.js +94 -0
- package/lib/lendMarkets/interfaces/common/amm.d.ts +10 -0
- package/lib/lendMarkets/interfaces/common/amm.js +1 -0
- package/lib/lendMarkets/interfaces/common/index.d.ts +5 -0
- package/lib/lendMarkets/interfaces/common/index.js +5 -0
- package/lib/lendMarkets/interfaces/common/prices.d.ts +13 -0
- package/lib/lendMarkets/interfaces/common/prices.js +1 -0
- package/lib/lendMarkets/interfaces/common/userPosition.d.ts +39 -0
- package/lib/lendMarkets/interfaces/common/userPosition.js +1 -0
- package/lib/lendMarkets/interfaces/common/vault.d.ts +55 -0
- package/lib/lendMarkets/interfaces/common/vault.js +1 -0
- package/lib/lendMarkets/interfaces/common/wallet.d.ts +8 -0
- package/lib/lendMarkets/interfaces/common/wallet.js +1 -0
- package/lib/lendMarkets/interfaces/v1/index.d.ts +4 -0
- package/lib/lendMarkets/interfaces/v1/index.js +4 -0
- package/lib/lendMarkets/interfaces/v1/leverageV1.d.ts +90 -0
- package/lib/lendMarkets/interfaces/v1/leverageV1.js +1 -0
- package/lib/lendMarkets/interfaces/v1/loanV1.d.ts +81 -0
- package/lib/lendMarkets/interfaces/v1/loanV1.js +1 -0
- package/lib/lendMarkets/interfaces/v1/statsV1.d.ts +49 -0
- package/lib/lendMarkets/interfaces/v1/statsV1.js +1 -0
- package/lib/lendMarkets/interfaces/v2/index.d.ts +3 -0
- package/lib/lendMarkets/interfaces/v2/index.js +3 -0
- package/lib/lendMarkets/interfaces/v2/leverageV2.d.ts +90 -0
- package/lib/lendMarkets/interfaces/v2/leverageV2.js +1 -0
- package/lib/lendMarkets/interfaces/v2/loanV2.d.ts +81 -0
- package/lib/lendMarkets/interfaces/v2/loanV2.js +1 -0
- package/lib/lendMarkets/interfaces/v2/statsV2.d.ts +49 -0
- package/lib/lendMarkets/interfaces/v2/statsV2.js +1 -0
- package/lib/lendMarkets/lendMarketConstructor.js +1 -1
- package/lib/lendMarkets/modules/common/amm.d.ts +19 -0
- package/lib/lendMarkets/modules/common/amm.js +137 -0
- package/lib/lendMarkets/modules/common/index.d.ts +9 -0
- package/lib/lendMarkets/modules/common/index.js +9 -0
- package/lib/lendMarkets/modules/common/leverageZapV1Base.d.ts +118 -0
- package/lib/lendMarkets/modules/common/leverageZapV1Base.js +770 -0
- package/lib/lendMarkets/modules/{leverageZapV2.d.ts → common/leverageZapV2Base.d.ts} +10 -5
- package/lib/lendMarkets/modules/{leverageZapV2.js → common/leverageZapV2Base.js} +36 -32
- package/lib/lendMarkets/modules/common/loanBase.d.ts +123 -0
- package/lib/lendMarkets/modules/common/loanBase.js +801 -0
- package/lib/lendMarkets/modules/common/prices.d.ts +19 -0
- package/lib/lendMarkets/modules/common/prices.js +104 -0
- package/lib/lendMarkets/modules/common/statsBase.d.ts +69 -0
- package/lib/lendMarkets/modules/common/statsBase.js +291 -0
- package/lib/lendMarkets/modules/common/userPosition.d.ts +46 -0
- package/lib/lendMarkets/modules/common/userPosition.js +223 -0
- package/lib/lendMarkets/modules/common/vault.d.ts +69 -0
- package/lib/lendMarkets/modules/common/vault.js +535 -0
- package/lib/lendMarkets/modules/common/wallet.d.ts +13 -0
- package/lib/lendMarkets/modules/common/wallet.js +28 -0
- package/lib/lendMarkets/modules/index.d.ts +1 -1
- package/lib/lendMarkets/modules/index.js +1 -1
- package/lib/lendMarkets/modules/v1/index.d.ts +4 -0
- package/lib/lendMarkets/modules/v1/index.js +4 -0
- package/lib/lendMarkets/modules/v1/leverageV1ZapV1.d.ts +3 -0
- package/lib/lendMarkets/modules/v1/leverageV1ZapV1.js +3 -0
- package/lib/lendMarkets/modules/v1/leverageV1ZapV2.d.ts +3 -0
- package/lib/lendMarkets/modules/v1/leverageV1ZapV2.js +3 -0
- package/lib/lendMarkets/modules/v1/loanV1.d.ts +4 -0
- package/lib/lendMarkets/modules/v1/loanV1.js +3 -0
- package/lib/lendMarkets/modules/v1/statsV1.d.ts +3 -0
- package/lib/lendMarkets/modules/v1/statsV1.js +3 -0
- package/lib/lendMarkets/modules/v2/index.d.ts +4 -0
- package/lib/lendMarkets/modules/v2/index.js +4 -0
- package/lib/lendMarkets/modules/v2/leverageV2ZapV1.d.ts +3 -0
- package/lib/lendMarkets/modules/v2/leverageV2ZapV1.js +3 -0
- package/lib/lendMarkets/modules/v2/leverageV2ZapV2.d.ts +3 -0
- package/lib/lendMarkets/modules/v2/leverageV2ZapV2.js +3 -0
- package/lib/lendMarkets/modules/v2/loanV2.d.ts +4 -0
- package/lib/lendMarkets/modules/v2/loanV2.js +3 -0
- package/lib/lendMarkets/modules/v2/statsV2.d.ts +3 -0
- package/lib/lendMarkets/modules/v2/statsV2.js +3 -0
- package/lib/llamalend.d.ts +6 -6
- package/lib/llamalend.js +46 -210
- package/lib/utils.js +2 -33
- package/package.json +1 -1
- package/src/constants/abis/OneWayLendingFactoryV2ABI.json +543 -0
- package/src/constants/aliases.ts +1 -97
- package/src/constants/coins.ts +0 -25
- package/src/constants/utils.ts +4 -0
- package/src/interfaces.ts +3 -2
- package/src/lendMarkets/LendMarketTemplate.ts +327 -3223
- package/src/lendMarkets/fetch/fetchFactoryData.ts +113 -0
- package/src/lendMarkets/fetch/fetchLendMarkets.ts +108 -0
- package/src/lendMarkets/interfaces/common/amm.ts +11 -0
- package/src/lendMarkets/interfaces/common/index.ts +5 -0
- package/src/lendMarkets/interfaces/common/prices.ts +13 -0
- package/src/lendMarkets/interfaces/common/userPosition.ts +24 -0
- package/src/lendMarkets/interfaces/common/vault.ts +48 -0
- package/src/lendMarkets/interfaces/common/wallet.ts +3 -0
- package/src/lendMarkets/interfaces/v1/index.ts +4 -0
- package/src/lendMarkets/interfaces/v1/leverageV1.ts +84 -0
- package/src/lendMarkets/interfaces/v1/loanV1.ts +85 -0
- package/src/lendMarkets/interfaces/v1/statsV1.ts +21 -0
- package/src/lendMarkets/interfaces/v2/index.ts +3 -0
- package/src/lendMarkets/interfaces/v2/leverageV2.ts +84 -0
- package/src/lendMarkets/interfaces/v2/loanV2.ts +85 -0
- package/src/lendMarkets/interfaces/v2/statsV2.ts +21 -0
- package/src/lendMarkets/lendMarketConstructor.ts +1 -1
- package/src/lendMarkets/modules/common/amm.ts +132 -0
- package/src/lendMarkets/modules/common/index.ts +9 -0
- package/src/lendMarkets/modules/common/leverageZapV1Base.ts +912 -0
- package/src/lendMarkets/modules/{leverageZapV2.ts → common/leverageZapV2Base.ts} +41 -37
- package/src/lendMarkets/modules/common/loanBase.ts +781 -0
- package/src/lendMarkets/modules/common/prices.ts +111 -0
- package/src/lendMarkets/modules/common/statsBase.ts +313 -0
- package/src/lendMarkets/modules/common/userPosition.ts +243 -0
- package/src/lendMarkets/modules/common/vault.ts +551 -0
- package/src/lendMarkets/modules/common/wallet.ts +29 -0
- package/src/lendMarkets/modules/index.ts +1 -1
- package/src/lendMarkets/modules/v1/index.ts +4 -0
- package/src/lendMarkets/modules/v1/leverageV1ZapV1.ts +3 -0
- package/src/lendMarkets/modules/v1/leverageV1ZapV2.ts +3 -0
- package/src/lendMarkets/modules/v1/loanV1.ts +4 -0
- package/src/lendMarkets/modules/v1/statsV1.ts +3 -0
- package/src/lendMarkets/modules/v2/index.ts +4 -0
- package/src/lendMarkets/modules/v2/leverageV2ZapV1.ts +3 -0
- package/src/lendMarkets/modules/v2/leverageV2ZapV2.ts +3 -0
- package/src/lendMarkets/modules/v2/loanV2.ts +4 -0
- package/src/lendMarkets/modules/v2/statsV2.ts +3 -0
- package/src/llamalend.ts +47 -244
- package/src/utils.ts +2 -35
|
@@ -0,0 +1,801 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import memoize from "memoizee";
|
|
11
|
+
import { _getAddress, parseUnits, BN, ensureAllowance, hasAllowance, ensureAllowanceEstimateGas, formatUnits, smartNumber, _mulBy1_3, DIGas, calculateFutureLeverage, MAX_ACTIVE_BAND, fromBN, } from "../../../utils";
|
|
12
|
+
import { _getUserCollateral } from "../../../external-api";
|
|
13
|
+
export class LoanBaseModule {
|
|
14
|
+
constructor(market) {
|
|
15
|
+
this.createLoanMaxRecvAllRanges = memoize((collateral) => __awaiter(this, void 0, void 0, function* () {
|
|
16
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
17
|
+
const calls = [];
|
|
18
|
+
for (let N = this.market.minBands; N <= this.market.maxBands; N++) {
|
|
19
|
+
// TODO: currentDebt is no longer passed - now we pass user address or zero address, currentDebt is calculated under the hood
|
|
20
|
+
calls.push(this.llamalend.contracts[this.market.addresses.controller].multicallContract.max_borrowable(_collateral, N, 0));
|
|
21
|
+
}
|
|
22
|
+
const _amounts = yield this.llamalend.multicallProvider.all(calls);
|
|
23
|
+
const res = {};
|
|
24
|
+
for (let N = this.market.minBands; N <= this.market.maxBands; N++) {
|
|
25
|
+
res[N] = formatUnits(_amounts[N - this.market.minBands], this.market.borrowed_token.decimals);
|
|
26
|
+
}
|
|
27
|
+
return res;
|
|
28
|
+
}), {
|
|
29
|
+
promise: true,
|
|
30
|
+
maxAge: 5 * 60 * 1000, // 5m
|
|
31
|
+
});
|
|
32
|
+
this.estimateGas = {
|
|
33
|
+
createLoanApprove: this.createLoanApproveEstimateGas.bind(this),
|
|
34
|
+
createLoan: this.createLoanEstimateGas.bind(this),
|
|
35
|
+
borrowMoreApprove: this.borrowMoreApproveEstimateGas.bind(this),
|
|
36
|
+
borrowMore: this.borrowMoreEstimateGas.bind(this),
|
|
37
|
+
addCollateralApprove: this.addCollateralApproveEstimateGas.bind(this),
|
|
38
|
+
addCollateral: this.addCollateralEstimateGas.bind(this),
|
|
39
|
+
removeCollateral: this.removeCollateralEstimateGas.bind(this),
|
|
40
|
+
repayApprove: this.repayApproveEstimateGas.bind(this),
|
|
41
|
+
repay: this.repayEstimateGas.bind(this),
|
|
42
|
+
fullRepayApprove: this.fullRepayApproveEstimateGas.bind(this),
|
|
43
|
+
fullRepay: this.fullRepayEstimateGas.bind(this),
|
|
44
|
+
liquidateApprove: this.liquidateApproveEstimateGas.bind(this),
|
|
45
|
+
liquidate: this.liquidateEstimateGas.bind(this),
|
|
46
|
+
selfLiquidateApprove: this.selfLiquidateApproveEstimateGas.bind(this),
|
|
47
|
+
selfLiquidate: this.selfLiquidateEstimateGas.bind(this),
|
|
48
|
+
partialSelfLiquidateApprove: this.partialSelfLiquidateApproveEstimateGas.bind(this),
|
|
49
|
+
partialSelfLiquidate: this.partialSelfLiquidateEstimateGas.bind(this),
|
|
50
|
+
};
|
|
51
|
+
this.market = market;
|
|
52
|
+
this.llamalend = market.getLlamalend();
|
|
53
|
+
}
|
|
54
|
+
_checkRange(range) {
|
|
55
|
+
if (range < this.market.minBands)
|
|
56
|
+
throw Error(`range must be >= ${this.market.minBands}`);
|
|
57
|
+
if (range > this.market.maxBands)
|
|
58
|
+
throw Error(`range must be <= ${this.market.maxBands}`);
|
|
59
|
+
}
|
|
60
|
+
createLoanMaxRecv(collateral, range) {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
this._checkRange(range);
|
|
63
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
64
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
65
|
+
// TODO: currentDebt is no longer passed - now we pass user address or zero address, currentDebt is calculated under the hood
|
|
66
|
+
return formatUnits(yield contract.max_borrowable(_collateral, range, 0, this.llamalend.constantOptions), this.market.borrowed_token.decimals);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
getMaxRange(collateral, debt) {
|
|
70
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
+
const maxRecv = yield this.createLoanMaxRecvAllRanges(collateral);
|
|
72
|
+
for (let N = this.market.minBands; N <= this.market.maxBands; N++) {
|
|
73
|
+
if (BN(debt).gt(BN(maxRecv[N])))
|
|
74
|
+
return N - 1;
|
|
75
|
+
}
|
|
76
|
+
return this.market.maxBands;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
_calcN1(_collateral, _debt, range) {
|
|
80
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
+
this._checkRange(range);
|
|
82
|
+
// TODO: add 4th parameter - user address in calculate_debt_n1
|
|
83
|
+
return yield this.llamalend.contracts[this.market.addresses.controller].contract.calculate_debt_n1(_collateral, _debt, range, this.llamalend.constantOptions);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
_calcN1AllRanges(_collateral, _debt, maxN) {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
const calls = [];
|
|
89
|
+
// TODO: add 4th parameter - user address in calculate_debt_n1
|
|
90
|
+
for (let N = this.market.minBands; N <= maxN; N++) {
|
|
91
|
+
calls.push(this.llamalend.contracts[this.market.addresses.controller].multicallContract.calculate_debt_n1(_collateral, _debt, N));
|
|
92
|
+
}
|
|
93
|
+
return yield this.llamalend.multicallProvider.all(calls);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
_createLoanBands(collateral, debt, range) {
|
|
97
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
+
const _n1 = yield this._calcN1(parseUnits(collateral, this.market.collateral_token.decimals), parseUnits(debt, this.market.borrowed_token.decimals), range);
|
|
99
|
+
const _n2 = _n1 + BigInt(range - 1);
|
|
100
|
+
return [_n2, _n1];
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
_createLoanBandsAllRanges(collateral, debt) {
|
|
104
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
105
|
+
const maxN = yield this.getMaxRange(collateral, debt);
|
|
106
|
+
const _n1_arr = yield this._calcN1AllRanges(parseUnits(collateral, this.market.collateral_token.decimals), parseUnits(debt, this.market.borrowed_token.decimals), maxN);
|
|
107
|
+
const _n2_arr = [];
|
|
108
|
+
for (let N = this.market.minBands; N <= maxN; N++) {
|
|
109
|
+
_n2_arr.push(_n1_arr[N - this.market.minBands] + BigInt(N - 1));
|
|
110
|
+
}
|
|
111
|
+
const res = {};
|
|
112
|
+
for (let N = this.market.minBands; N <= maxN; N++) {
|
|
113
|
+
res[N] = [_n2_arr[N - this.market.minBands], _n1_arr[N - this.market.minBands]];
|
|
114
|
+
}
|
|
115
|
+
return res;
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
createLoanBands(collateral, debt, range) {
|
|
119
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
120
|
+
const [_n2, _n1] = yield this._createLoanBands(collateral, debt, range);
|
|
121
|
+
return [Number(_n2), Number(_n1)];
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
createLoanBandsAllRanges(collateral, debt) {
|
|
125
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
+
const _bandsAllRanges = yield this._createLoanBandsAllRanges(collateral, debt);
|
|
127
|
+
const bandsAllRanges = {};
|
|
128
|
+
for (let N = this.market.minBands; N <= this.market.maxBands; N++) {
|
|
129
|
+
if (_bandsAllRanges[N]) {
|
|
130
|
+
bandsAllRanges[N] = _bandsAllRanges[N].map(Number);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
bandsAllRanges[N] = null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return bandsAllRanges;
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
createLoanPrices(collateral, debt, range) {
|
|
140
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
141
|
+
const [_n2, _n1] = yield this._createLoanBands(collateral, debt, range);
|
|
142
|
+
return yield this.market.prices.getPrices(_n2, _n1);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
createLoanPricesAllRanges(collateral, debt) {
|
|
146
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
147
|
+
const _bandsAllRanges = yield this._createLoanBandsAllRanges(collateral, debt);
|
|
148
|
+
const pricesAllRanges = {};
|
|
149
|
+
for (let N = this.market.minBands; N <= this.market.maxBands; N++) {
|
|
150
|
+
if (_bandsAllRanges[N]) {
|
|
151
|
+
pricesAllRanges[N] = yield this.market.prices.calcPrices(..._bandsAllRanges[N]);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
pricesAllRanges[N] = null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return pricesAllRanges;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
createLoanHealth(collateral_1, debt_1, range_1) {
|
|
161
|
+
return __awaiter(this, arguments, void 0, function* (collateral, debt, range, full = true) {
|
|
162
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
163
|
+
const _debt = parseUnits(debt, this.market.borrowed_token.decimals);
|
|
164
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
165
|
+
// TODO: verify parameters
|
|
166
|
+
let _health = yield contract.health_calculator(this.llamalend.constants.ZERO_ADDRESS, _collateral, _debt, full, range, this.llamalend.constantOptions);
|
|
167
|
+
_health = _health * BigInt(100);
|
|
168
|
+
return formatUnits(_health);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
createLoanIsApproved(collateral) {
|
|
172
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
173
|
+
return yield hasAllowance.call(this.llamalend, [this.market.collateral_token.address], [collateral], this.llamalend.signerAddress, this.market.addresses.controller);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
createLoanApproveEstimateGas(collateral) {
|
|
177
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
178
|
+
return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.market.collateral_token.address], [collateral], this.market.addresses.controller);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
createLoanApprove(collateral) {
|
|
182
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
183
|
+
return yield ensureAllowance.call(this.llamalend, [this.market.collateral_token.address], [collateral], this.market.addresses.controller);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
_createLoan(collateral, debt, range, estimateGas) {
|
|
187
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
188
|
+
if (yield this.market.userPosition.userLoanExists())
|
|
189
|
+
throw Error("Loan already created");
|
|
190
|
+
this._checkRange(range);
|
|
191
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
192
|
+
const _debt = parseUnits(debt, this.market.borrowed_token.decimals);
|
|
193
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
194
|
+
const gas = yield contract.create_loan.estimateGas(_collateral, _debt, range, Object.assign({}, this.llamalend.constantOptions));
|
|
195
|
+
if (estimateGas)
|
|
196
|
+
return smartNumber(gas);
|
|
197
|
+
yield this.llamalend.updateFeeData();
|
|
198
|
+
const gasLimit = _mulBy1_3(DIGas(gas));
|
|
199
|
+
// TODO: ABI has changed (see docs)
|
|
200
|
+
return (yield contract.create_loan(_collateral, _debt, range, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
createLoanEstimateGas(collateral, debt, range) {
|
|
204
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
205
|
+
if (!(yield this.createLoanIsApproved(collateral)))
|
|
206
|
+
throw Error("Approval is needed for gas estimation");
|
|
207
|
+
return yield this._createLoan(collateral, debt, range, true);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
createLoan(collateral, debt, range) {
|
|
211
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
212
|
+
yield this.createLoanApprove(collateral);
|
|
213
|
+
return yield this._createLoan(collateral, debt, range, false);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
// ---------------- BORROW MORE ----------------
|
|
217
|
+
borrowMoreMaxRecv(collateralAmount) {
|
|
218
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
219
|
+
const { _collateral: _currentCollateral, _debt: _currentDebt, _N } = yield this.market.userPosition.userStateBigInt();
|
|
220
|
+
const _collateral = _currentCollateral + parseUnits(collateralAmount, this.market.collateral_token.decimals);
|
|
221
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
222
|
+
const _debt = yield contract.max_borrowable(_collateral, _N, _currentDebt, this.llamalend.constantOptions);
|
|
223
|
+
// TODO: max_borrowable(deltaCollateral, _N, user) - debt is now calculated under the hood, return as is
|
|
224
|
+
return formatUnits(_debt - _currentDebt, this.market.borrowed_token.decimals);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
_borrowMoreBands(collateral, debt) {
|
|
228
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
229
|
+
const { _collateral: _currentCollateral, _debt: _currentDebt, _N } = yield this.market.userPosition.userStateBigInt();
|
|
230
|
+
if (_currentDebt === BigInt(0))
|
|
231
|
+
throw Error(`Loan for ${this.llamalend.signerAddress} does not exist`);
|
|
232
|
+
const _collateral = _currentCollateral + parseUnits(collateral, this.market.collateral_token.decimals);
|
|
233
|
+
const _debt = _currentDebt + parseUnits(debt, this.market.borrowed_token.decimals);
|
|
234
|
+
const _n1 = yield this._calcN1(_collateral, _debt, Number(_N));
|
|
235
|
+
const _n2 = _n1 + _N - BigInt(1);
|
|
236
|
+
return [_n2, _n1];
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
borrowMoreBands(collateral, debt) {
|
|
240
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
241
|
+
const [_n2, _n1] = yield this._borrowMoreBands(collateral, debt);
|
|
242
|
+
return [Number(_n2), Number(_n1)];
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
borrowMorePrices(collateral, debt) {
|
|
246
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
+
const [_n2, _n1] = yield this._borrowMoreBands(collateral, debt);
|
|
248
|
+
return yield this.market.prices.getPrices(_n2, _n1);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
borrowMoreHealth(collateral_1, debt_1) {
|
|
252
|
+
return __awaiter(this, arguments, void 0, function* (collateral, debt, full = true, address = "") {
|
|
253
|
+
address = _getAddress.call(this.llamalend, address);
|
|
254
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
255
|
+
const _debt = parseUnits(debt, this.market.borrowed_token.decimals);
|
|
256
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
257
|
+
let _health = yield contract.health_calculator(address, _collateral, _debt, full, 0, this.llamalend.constantOptions);
|
|
258
|
+
_health = _health * BigInt(100);
|
|
259
|
+
return formatUnits(_health);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
borrowMoreIsApproved(collateral) {
|
|
263
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
264
|
+
return yield hasAllowance.call(this.llamalend, [this.market.addresses.collateral_token], [collateral], this.llamalend.signerAddress, this.market.addresses.controller);
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
borrowMoreApproveEstimateGas(collateral) {
|
|
268
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
269
|
+
return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.market.addresses.collateral_token], [collateral], this.market.addresses.controller);
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
borrowMoreApprove(collateral) {
|
|
273
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
274
|
+
return yield ensureAllowance.call(this.llamalend, [this.market.addresses.collateral_token], [collateral], this.market.addresses.controller);
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
_borrowMore(collateral, debt, estimateGas) {
|
|
278
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
279
|
+
const { borrowed, debt: currentDebt } = yield this.market.userPosition.userState();
|
|
280
|
+
if (Number(currentDebt) === 0)
|
|
281
|
+
throw Error(`Loan for ${this.llamalend.signerAddress} does not exist`);
|
|
282
|
+
if (Number(borrowed) > 0)
|
|
283
|
+
throw Error(`User ${this.llamalend.signerAddress} is already in liquidation mode`);
|
|
284
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
285
|
+
const _debt = parseUnits(debt, this.market.borrowed_token.decimals);
|
|
286
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
287
|
+
const gas = yield contract.borrow_more.estimateGas(_collateral, _debt, Object.assign({}, this.llamalend.constantOptions));
|
|
288
|
+
if (estimateGas)
|
|
289
|
+
return smartNumber(gas);
|
|
290
|
+
yield this.llamalend.updateFeeData();
|
|
291
|
+
const gasLimit = _mulBy1_3(DIGas(gas));
|
|
292
|
+
return (yield contract.borrow_more(_collateral, _debt, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
borrowMoreEstimateGas(collateral, debt) {
|
|
296
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
297
|
+
if (!(yield this.borrowMoreIsApproved(collateral)))
|
|
298
|
+
throw Error("Approval is needed for gas estimation");
|
|
299
|
+
return yield this._borrowMore(collateral, debt, true);
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
borrowMore(collateral, debt) {
|
|
303
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
304
|
+
yield this.borrowMoreApprove(collateral);
|
|
305
|
+
return yield this._borrowMore(collateral, debt, false);
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
borrowMoreFutureLeverage(collateral_1, debt_1) {
|
|
309
|
+
return __awaiter(this, arguments, void 0, function* (collateral, debt, userAddress = '') {
|
|
310
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
311
|
+
const { stateCollateral, totalDepositFromUser } = yield this.market.userPosition.getCurrentLeverageParams(userAddress);
|
|
312
|
+
const collateralFromDebt = yield this.market.amm.swapExpected(0, 1, debt);
|
|
313
|
+
const futureCollateralState = BN(stateCollateral).plus(collateralFromDebt);
|
|
314
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateral);
|
|
315
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
// ---------------- ADD COLLATERAL ----------------
|
|
319
|
+
_addCollateralBands(collateral_1) {
|
|
320
|
+
return __awaiter(this, arguments, void 0, function* (collateral, address = "") {
|
|
321
|
+
address = _getAddress.call(this.llamalend, address);
|
|
322
|
+
const { _collateral: _currentCollateral, _debt: _currentDebt, _N } = yield this.market.userPosition.userStateBigInt(address);
|
|
323
|
+
if (_currentDebt === BigInt(0))
|
|
324
|
+
throw Error(`Loan for ${address} does not exist`);
|
|
325
|
+
const _collateral = _currentCollateral + parseUnits(collateral, this.market.collateral_token.decimals);
|
|
326
|
+
const _n1 = yield this._calcN1(_collateral, _currentDebt, Number(_N));
|
|
327
|
+
const _n2 = _n1 + _N - BigInt(1);
|
|
328
|
+
return [_n2, _n1];
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
addCollateralBands(collateral_1) {
|
|
332
|
+
return __awaiter(this, arguments, void 0, function* (collateral, address = "") {
|
|
333
|
+
const [_n2, _n1] = yield this._addCollateralBands(collateral, address);
|
|
334
|
+
return [Number(_n2), Number(_n1)];
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
addCollateralPrices(collateral_1) {
|
|
338
|
+
return __awaiter(this, arguments, void 0, function* (collateral, address = "") {
|
|
339
|
+
const [_n2, _n1] = yield this._addCollateralBands(collateral, address);
|
|
340
|
+
return yield this.market.prices.getPrices(_n2, _n1);
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
addCollateralHealth(collateral_1) {
|
|
344
|
+
return __awaiter(this, arguments, void 0, function* (collateral, full = true, address = "") {
|
|
345
|
+
address = _getAddress.call(this.llamalend, address);
|
|
346
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
347
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
348
|
+
let _health = yield contract.health_calculator(address, _collateral, 0, full, 0, this.llamalend.constantOptions);
|
|
349
|
+
_health = _health * BigInt(100);
|
|
350
|
+
return formatUnits(_health);
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
addCollateralIsApproved(collateral) {
|
|
354
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
355
|
+
return yield hasAllowance.call(this.llamalend, [this.market.addresses.collateral_token], [collateral], this.llamalend.signerAddress, this.market.addresses.controller);
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
addCollateralApproveEstimateGas(collateral) {
|
|
359
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
360
|
+
return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.market.addresses.collateral_token], [collateral], this.market.addresses.controller);
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
addCollateralApprove(collateral) {
|
|
364
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
365
|
+
return yield ensureAllowance.call(this.llamalend, [this.market.addresses.collateral_token], [collateral], this.market.addresses.controller);
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
_addCollateral(collateral, address, estimateGas) {
|
|
369
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
370
|
+
const { borrowed, debt: currentDebt } = yield this.market.userPosition.userState(address);
|
|
371
|
+
if (Number(currentDebt) === 0)
|
|
372
|
+
throw Error(`Loan for ${address} does not exist`);
|
|
373
|
+
if (Number(borrowed) > 0)
|
|
374
|
+
throw Error(`User ${address} is already in liquidation mode`);
|
|
375
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
376
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
377
|
+
const gas = yield contract.add_collateral.estimateGas(_collateral, address, Object.assign({}, this.llamalend.constantOptions));
|
|
378
|
+
if (estimateGas)
|
|
379
|
+
return smartNumber(gas);
|
|
380
|
+
yield this.llamalend.updateFeeData();
|
|
381
|
+
const gasLimit = _mulBy1_3(DIGas(gas));
|
|
382
|
+
return (yield contract.add_collateral(_collateral, address, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
addCollateralEstimateGas(collateral_1) {
|
|
386
|
+
return __awaiter(this, arguments, void 0, function* (collateral, address = "") {
|
|
387
|
+
address = _getAddress.call(this.llamalend, address);
|
|
388
|
+
if (!(yield this.addCollateralIsApproved(collateral)))
|
|
389
|
+
throw Error("Approval is needed for gas estimation");
|
|
390
|
+
return yield this._addCollateral(collateral, address, true);
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
addCollateral(collateral_1) {
|
|
394
|
+
return __awaiter(this, arguments, void 0, function* (collateral, address = "") {
|
|
395
|
+
address = _getAddress.call(this.llamalend, address);
|
|
396
|
+
yield this.addCollateralApprove(collateral);
|
|
397
|
+
return yield this._addCollateral(collateral, address, false);
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
addCollateralFutureLeverage(collateral_1) {
|
|
401
|
+
return __awaiter(this, arguments, void 0, function* (collateral, userAddress = '') {
|
|
402
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
403
|
+
const [userCollateral, { collateral: currentCollateral }] = yield Promise.all([
|
|
404
|
+
_getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.market.addresses.controller, userAddress),
|
|
405
|
+
this.market.userPosition.userState(userAddress),
|
|
406
|
+
]);
|
|
407
|
+
const total_deposit_from_user = userCollateral.total_deposit_from_user_precise;
|
|
408
|
+
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'add');
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
// ---------------- REMOVE COLLATERAL ----------------
|
|
412
|
+
maxRemovable() {
|
|
413
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
414
|
+
const { _collateral: _currentCollateral, _debt: _currentDebt, _N } = yield this.market.userPosition.userStateBigInt();
|
|
415
|
+
const _requiredCollateral = yield this.llamalend.contracts[this.market.addresses.controller].contract.min_collateral(_currentDebt, _N, this.llamalend.constantOptions);
|
|
416
|
+
return formatUnits(_currentCollateral - _requiredCollateral, this.market.collateral_token.decimals);
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
_removeCollateralBands(collateral) {
|
|
420
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
421
|
+
const { _collateral: _currentCollateral, _debt: _currentDebt, _N } = yield this.market.userPosition.userStateBigInt();
|
|
422
|
+
if (_currentDebt === BigInt(0))
|
|
423
|
+
throw Error(`Loan for ${this.llamalend.signerAddress} does not exist`);
|
|
424
|
+
const _collateral = _currentCollateral - parseUnits(collateral, this.market.collateral_token.decimals);
|
|
425
|
+
const _n1 = yield this._calcN1(_collateral, _currentDebt, Number(_N));
|
|
426
|
+
const _n2 = _n1 + _N - BigInt(1);
|
|
427
|
+
return [_n2, _n1];
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
removeCollateralBands(collateral) {
|
|
431
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
432
|
+
const [_n2, _n1] = yield this._removeCollateralBands(collateral);
|
|
433
|
+
return [Number(_n2), Number(_n1)];
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
removeCollateralPrices(collateral) {
|
|
437
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
438
|
+
const [_n2, _n1] = yield this._removeCollateralBands(collateral);
|
|
439
|
+
return yield this.market.prices.getPrices(_n2, _n1);
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
removeCollateralHealth(collateral_1) {
|
|
443
|
+
return __awaiter(this, arguments, void 0, function* (collateral, full = true, address = "") {
|
|
444
|
+
address = _getAddress.call(this.llamalend, address);
|
|
445
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals) * BigInt(-1);
|
|
446
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
447
|
+
let _health = yield contract.health_calculator(address, _collateral, 0, full, 0, this.llamalend.constantOptions);
|
|
448
|
+
_health = _health * BigInt(100);
|
|
449
|
+
return formatUnits(_health);
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
_removeCollateral(collateral, estimateGas) {
|
|
453
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
454
|
+
const { borrowed, debt: currentDebt } = yield this.market.userPosition.userState();
|
|
455
|
+
if (Number(currentDebt) === 0)
|
|
456
|
+
throw Error(`Loan for ${this.llamalend.signerAddress} does not exist`);
|
|
457
|
+
if (Number(borrowed) > 0)
|
|
458
|
+
throw Error(`User ${this.llamalend.signerAddress} is already in liquidation mode`);
|
|
459
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
460
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
461
|
+
const gas = yield contract.remove_collateral.estimateGas(_collateral, this.llamalend.constantOptions);
|
|
462
|
+
if (estimateGas)
|
|
463
|
+
return smartNumber(gas);
|
|
464
|
+
yield this.llamalend.updateFeeData();
|
|
465
|
+
const gasLimit = _mulBy1_3(DIGas(gas));
|
|
466
|
+
return (yield contract.remove_collateral(_collateral, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
removeCollateralEstimateGas(collateral) {
|
|
470
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
471
|
+
return yield this._removeCollateral(collateral, true);
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
removeCollateral(collateral) {
|
|
475
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
476
|
+
return yield this._removeCollateral(collateral, false);
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
removeCollateralFutureLeverage(collateral_1) {
|
|
480
|
+
return __awaiter(this, arguments, void 0, function* (collateral, userAddress = '') {
|
|
481
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
482
|
+
const [userCollateral, { collateral: currentCollateral }] = yield Promise.all([
|
|
483
|
+
_getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.market.addresses.controller, userAddress),
|
|
484
|
+
this.market.userPosition.userState(userAddress),
|
|
485
|
+
]);
|
|
486
|
+
const total_deposit_from_user = userCollateral.total_deposit_from_user_precise;
|
|
487
|
+
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'remove');
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
// ---------------- REPAY ----------------
|
|
491
|
+
// TODO: add shrink: bool parameter
|
|
492
|
+
// If bool is true, _N = n2 - n1 + 1 -> _N = n2 - activeBand
|
|
493
|
+
_repayBands(debt, address) {
|
|
494
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
495
|
+
const { _collateral: _currentCollateral, _borrowed, _debt: _currentDebt, _N } = yield this.market.userPosition.userStateBigInt(address);
|
|
496
|
+
if (_currentDebt === BigInt(0))
|
|
497
|
+
throw Error(`Loan for ${address} does not exist`);
|
|
498
|
+
// && shrink === false
|
|
499
|
+
if (_borrowed > BigInt(0))
|
|
500
|
+
return yield this.market.userPosition.userBandsBigInt(address);
|
|
501
|
+
// If shrink == true, then _debt = _currentDebt - parseUnits(debt, this.market.borrowed_token.decimals) - _borrowed
|
|
502
|
+
const _debt = _currentDebt - parseUnits(debt, this.market.borrowed_token.decimals);
|
|
503
|
+
const _n1 = yield this._calcN1(_currentCollateral, _debt, Number(_N));
|
|
504
|
+
const _n2 = _n1 + _N - BigInt(1);
|
|
505
|
+
return [_n2, _n1];
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
repayBands(debt_1) {
|
|
509
|
+
return __awaiter(this, arguments, void 0, function* (debt, address = "") {
|
|
510
|
+
const [_n2, _n1] = yield this._repayBands(debt, address);
|
|
511
|
+
return [Number(_n2), Number(_n1)];
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
repayPrices(debt_1) {
|
|
515
|
+
return __awaiter(this, arguments, void 0, function* (debt, address = "") {
|
|
516
|
+
const [_n2, _n1] = yield this._repayBands(debt, address);
|
|
517
|
+
return yield this.market.prices.getPrices(_n2, _n1);
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
repayIsApproved(debt) {
|
|
521
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
522
|
+
return yield hasAllowance.call(this.llamalend, [this.market.borrowed_token.address], [debt], this.llamalend.signerAddress, this.market.addresses.controller);
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
repayApproveEstimateGas(debt) {
|
|
526
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
527
|
+
return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.market.borrowed_token.address], [debt], this.market.addresses.controller);
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
repayApprove(debt) {
|
|
531
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
532
|
+
return yield ensureAllowance.call(this.llamalend, [this.market.borrowed_token.address], [debt], this.market.addresses.controller);
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
repayHealth(debt_1) {
|
|
536
|
+
return __awaiter(this, arguments, void 0, function* (debt, full = true, address = "") {
|
|
537
|
+
address = _getAddress.call(this.llamalend, address);
|
|
538
|
+
const _debt = parseUnits(debt) * BigInt(-1);
|
|
539
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
540
|
+
let _health = yield contract.health_calculator(address, 0, _debt, full, 0, this.llamalend.constantOptions);
|
|
541
|
+
_health = _health * BigInt(100);
|
|
542
|
+
return formatUnits(_health);
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
_repay(debt, address, estimateGas) {
|
|
546
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
547
|
+
address = _getAddress.call(this.llamalend, address);
|
|
548
|
+
const { debt: currentDebt } = yield this.market.userPosition.userState(address);
|
|
549
|
+
if (Number(currentDebt) === 0)
|
|
550
|
+
throw Error(`Loan for ${address} does not exist`);
|
|
551
|
+
const _debt = parseUnits(debt);
|
|
552
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
553
|
+
const [, n1] = yield this.market.userPosition.userBands(address);
|
|
554
|
+
const { borrowed } = yield this.market.userPosition.userState(address);
|
|
555
|
+
const n = (BN(borrowed).gt(0)) ? MAX_ACTIVE_BAND : n1 - 1; // In liquidation mode it doesn't matter if active band moves
|
|
556
|
+
const gas = yield contract.repay.estimateGas(_debt, address, n, this.llamalend.constantOptions);
|
|
557
|
+
if (estimateGas)
|
|
558
|
+
return smartNumber(gas);
|
|
559
|
+
yield this.llamalend.updateFeeData();
|
|
560
|
+
const gasLimit = _mulBy1_3(DIGas(gas));
|
|
561
|
+
// TODO: shrink parameter is added, which changes bands calculation
|
|
562
|
+
return (yield contract.repay(_debt, address, n, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
repayEstimateGas(debt_1) {
|
|
566
|
+
return __awaiter(this, arguments, void 0, function* (debt, address = "") {
|
|
567
|
+
if (!(yield this.repayIsApproved(debt)))
|
|
568
|
+
throw Error("Approval is needed for gas estimation");
|
|
569
|
+
return yield this._repay(debt, address, true);
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
repay(debt_1) {
|
|
573
|
+
return __awaiter(this, arguments, void 0, function* (debt, address = "") {
|
|
574
|
+
yield this.repayApprove(debt);
|
|
575
|
+
return yield this._repay(debt, address, false);
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
repayFutureLeverage(debt_1) {
|
|
579
|
+
return __awaiter(this, arguments, void 0, function* (debt, userAddress = '') {
|
|
580
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
581
|
+
const { stateCollateral, totalDepositFromUser } = yield this.market.userPosition.getCurrentLeverageParams(userAddress);
|
|
582
|
+
const collateralFromDebt = yield this.market.amm.swapExpected(0, 1, debt);
|
|
583
|
+
const futureCollateralState = BN(stateCollateral);
|
|
584
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateralFromDebt);
|
|
585
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
// ---------------- FULL REPAY ----------------
|
|
589
|
+
_fullRepayAmount() {
|
|
590
|
+
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
591
|
+
address = _getAddress.call(this.llamalend, address);
|
|
592
|
+
// TODO: now debt is _borrowed
|
|
593
|
+
const { debt } = yield this.market.userPosition.userState(address);
|
|
594
|
+
return BN(debt).times(1.0001).toString();
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
fullRepayIsApproved() {
|
|
598
|
+
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
599
|
+
address = _getAddress.call(this.llamalend, address);
|
|
600
|
+
const fullRepayAmount = yield this._fullRepayAmount(address);
|
|
601
|
+
return yield this.repayIsApproved(fullRepayAmount);
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
fullRepayApproveEstimateGas() {
|
|
605
|
+
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
606
|
+
address = _getAddress.call(this.llamalend, address);
|
|
607
|
+
const fullRepayAmount = yield this._fullRepayAmount(address);
|
|
608
|
+
return yield this.repayApproveEstimateGas(fullRepayAmount);
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
fullRepayApprove() {
|
|
612
|
+
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
613
|
+
address = _getAddress.call(this.llamalend, address);
|
|
614
|
+
const fullRepayAmount = yield this._fullRepayAmount(address);
|
|
615
|
+
return yield this.repayApprove(fullRepayAmount);
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
fullRepayEstimateGas() {
|
|
619
|
+
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
620
|
+
address = _getAddress.call(this.llamalend, address);
|
|
621
|
+
const fullRepayAmount = yield this._fullRepayAmount(address);
|
|
622
|
+
if (!(yield this.repayIsApproved(fullRepayAmount)))
|
|
623
|
+
throw Error("Approval is needed for gas estimation");
|
|
624
|
+
return yield this._repay(fullRepayAmount, address, true);
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
fullRepay() {
|
|
628
|
+
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
629
|
+
address = _getAddress.call(this.llamalend, address);
|
|
630
|
+
const fullRepayAmount = yield this._fullRepayAmount(address);
|
|
631
|
+
yield this.repayApprove(fullRepayAmount);
|
|
632
|
+
return yield this._repay(fullRepayAmount, address, false);
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
// ---------------- LIQUIDATE ----------------
|
|
636
|
+
tokensToLiquidate() {
|
|
637
|
+
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
638
|
+
address = _getAddress.call(this.llamalend, address);
|
|
639
|
+
const _tokens = yield this.llamalend.contracts[this.market.addresses.controller].contract.tokens_to_liquidate(address, this.llamalend.constantOptions);
|
|
640
|
+
return formatUnits(_tokens, this.market.borrowed_token.decimals);
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
calcPartialFrac(amount_1) {
|
|
644
|
+
return __awaiter(this, arguments, void 0, function* (amount, address = "") {
|
|
645
|
+
address = _getAddress.call(this.llamalend, address);
|
|
646
|
+
const tokensToLiquidate = yield this.tokensToLiquidate(address);
|
|
647
|
+
const amountBN = BN(amount);
|
|
648
|
+
const tokensToLiquidateBN = BN(tokensToLiquidate);
|
|
649
|
+
if (amountBN.gt(tokensToLiquidateBN))
|
|
650
|
+
throw Error("Amount cannot be greater than total tokens to liquidate");
|
|
651
|
+
if (amountBN.lte(0))
|
|
652
|
+
throw Error("Amount must be greater than 0");
|
|
653
|
+
// Calculate frac = amount / tokensToLiquidate * 10**18
|
|
654
|
+
// 100% = 10**18
|
|
655
|
+
const fracDecimalBN = amountBN.div(tokensToLiquidateBN);
|
|
656
|
+
const frac = fromBN(fracDecimalBN);
|
|
657
|
+
return {
|
|
658
|
+
frac: frac.toString(),
|
|
659
|
+
fracDecimal: fracDecimalBN.toString(),
|
|
660
|
+
amount: amountBN.toString(),
|
|
661
|
+
};
|
|
662
|
+
});
|
|
663
|
+
}
|
|
664
|
+
liquidateIsApproved() {
|
|
665
|
+
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
666
|
+
const tokensToLiquidate = yield this.tokensToLiquidate(address);
|
|
667
|
+
return yield hasAllowance.call(this.llamalend, [this.market.addresses.borrowed_token], [tokensToLiquidate], this.llamalend.signerAddress, this.market.addresses.controller);
|
|
668
|
+
});
|
|
669
|
+
}
|
|
670
|
+
liquidateApproveEstimateGas() {
|
|
671
|
+
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
672
|
+
const tokensToLiquidate = yield this.tokensToLiquidate(address);
|
|
673
|
+
return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.market.addresses.borrowed_token], [tokensToLiquidate], this.market.addresses.controller);
|
|
674
|
+
});
|
|
675
|
+
}
|
|
676
|
+
liquidateApprove() {
|
|
677
|
+
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
678
|
+
const tokensToLiquidate = yield this.tokensToLiquidate(address);
|
|
679
|
+
return yield ensureAllowance.call(this.llamalend, [this.market.addresses.borrowed_token], [tokensToLiquidate], this.market.addresses.controller);
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
_liquidate(address, slippage, estimateGas) {
|
|
683
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
684
|
+
const { borrowed, debt: currentDebt } = yield this.market.userPosition.userState(address);
|
|
685
|
+
if (slippage <= 0)
|
|
686
|
+
throw Error("Slippage must be > 0");
|
|
687
|
+
if (slippage > 100)
|
|
688
|
+
throw Error("Slippage must be <= 100");
|
|
689
|
+
if (Number(currentDebt) === 0)
|
|
690
|
+
throw Error(`Loan for ${address} does not exist`);
|
|
691
|
+
if (Number(borrowed) === 0)
|
|
692
|
+
throw Error(`User ${address} is not in liquidation mode`);
|
|
693
|
+
const minAmountBN = BN(borrowed).times(100 - slippage).div(100);
|
|
694
|
+
const _minAmount = fromBN(minAmountBN);
|
|
695
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
696
|
+
const gas = (yield contract.liquidate.estimateGas(address, _minAmount, this.llamalend.constantOptions));
|
|
697
|
+
if (estimateGas)
|
|
698
|
+
return smartNumber(gas);
|
|
699
|
+
yield this.llamalend.updateFeeData();
|
|
700
|
+
const gasLimit = _mulBy1_3(DIGas(gas));
|
|
701
|
+
return (yield contract.liquidate(address, _minAmount, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
|
|
702
|
+
});
|
|
703
|
+
}
|
|
704
|
+
_partialLiquidate(address, partialFrac, slippage, estimateGas) {
|
|
705
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
706
|
+
const { borrowed, debt: currentDebt } = yield this.market.userPosition.userState(address);
|
|
707
|
+
if (slippage <= 0)
|
|
708
|
+
throw Error("Slippage must be > 0");
|
|
709
|
+
if (slippage > 100)
|
|
710
|
+
throw Error("Slippage must be <= 100");
|
|
711
|
+
if (Number(currentDebt) === 0)
|
|
712
|
+
throw Error(`Loan for ${address} does not exist`);
|
|
713
|
+
if (Number(borrowed) === 0)
|
|
714
|
+
throw Error(`User ${address} is not in liquidation mode`);
|
|
715
|
+
const frac = partialFrac.frac;
|
|
716
|
+
const fracBN = BN(partialFrac.fracDecimal);
|
|
717
|
+
const borrowedBN = BN(borrowed);
|
|
718
|
+
const expectedBorrowedBN = borrowedBN.times(fracBN);
|
|
719
|
+
const minAmountBN = expectedBorrowedBN.times(100 - slippage).div(100);
|
|
720
|
+
const _minAmount = fromBN(minAmountBN);
|
|
721
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
722
|
+
const gas = (yield contract.liquidate_extended.estimateGas(address, _minAmount, frac, this.llamalend.constants.ZERO_ADDRESS, [], this.llamalend.constantOptions));
|
|
723
|
+
if (estimateGas)
|
|
724
|
+
return smartNumber(gas);
|
|
725
|
+
yield this.llamalend.updateFeeData();
|
|
726
|
+
const gasLimit = _mulBy1_3(DIGas(gas));
|
|
727
|
+
return (yield contract.liquidate_extended(address, _minAmount, frac, this.llamalend.constants.ZERO_ADDRESS, [], Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
|
|
728
|
+
});
|
|
729
|
+
}
|
|
730
|
+
liquidateEstimateGas(address_1) {
|
|
731
|
+
return __awaiter(this, arguments, void 0, function* (address, slippage = 0.1) {
|
|
732
|
+
if (!(yield this.liquidateIsApproved(address)))
|
|
733
|
+
throw Error("Approval is needed for gas estimation");
|
|
734
|
+
return yield this._liquidate(address, slippage, true);
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
liquidate(address_1) {
|
|
738
|
+
return __awaiter(this, arguments, void 0, function* (address, slippage = 0.1) {
|
|
739
|
+
yield this.liquidateApprove(address);
|
|
740
|
+
return yield this._liquidate(address, slippage, false);
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
// ---------------- SELF-LIQUIDATE ----------------
|
|
744
|
+
selfLiquidateIsApproved() {
|
|
745
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
746
|
+
return yield this.liquidateIsApproved();
|
|
747
|
+
});
|
|
748
|
+
}
|
|
749
|
+
selfLiquidateApproveEstimateGas() {
|
|
750
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
751
|
+
return this.liquidateApproveEstimateGas();
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
selfLiquidateApprove() {
|
|
755
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
756
|
+
return yield this.liquidateApprove();
|
|
757
|
+
});
|
|
758
|
+
}
|
|
759
|
+
selfLiquidateEstimateGas() {
|
|
760
|
+
return __awaiter(this, arguments, void 0, function* (slippage = 0.1) {
|
|
761
|
+
if (!(yield this.selfLiquidateIsApproved()))
|
|
762
|
+
throw Error("Approval is needed for gas estimation");
|
|
763
|
+
return yield this._liquidate(this.llamalend.signerAddress, slippage, true);
|
|
764
|
+
});
|
|
765
|
+
}
|
|
766
|
+
selfLiquidate() {
|
|
767
|
+
return __awaiter(this, arguments, void 0, function* (slippage = 0.1) {
|
|
768
|
+
yield this.selfLiquidateApprove();
|
|
769
|
+
return yield this._liquidate(this.llamalend.signerAddress, slippage, false);
|
|
770
|
+
});
|
|
771
|
+
}
|
|
772
|
+
// ---------------- PARTIAL SELF-LIQUIDATE ----------------
|
|
773
|
+
partialSelfLiquidateIsApproved(partialFrac) {
|
|
774
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
775
|
+
return yield hasAllowance.call(this.llamalend, [this.market.addresses.borrowed_token], [partialFrac.amount], this.llamalend.signerAddress, this.market.addresses.controller);
|
|
776
|
+
});
|
|
777
|
+
}
|
|
778
|
+
partialSelfLiquidateApproveEstimateGas(partialFrac) {
|
|
779
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
780
|
+
return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.market.addresses.borrowed_token], [partialFrac.amount], this.market.addresses.controller);
|
|
781
|
+
});
|
|
782
|
+
}
|
|
783
|
+
partialSelfLiquidateApprove(partialFrac) {
|
|
784
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
785
|
+
return yield ensureAllowance.call(this.llamalend, [this.market.addresses.borrowed_token], [partialFrac.amount], this.market.addresses.controller);
|
|
786
|
+
});
|
|
787
|
+
}
|
|
788
|
+
partialSelfLiquidateEstimateGas(partialFrac_1) {
|
|
789
|
+
return __awaiter(this, arguments, void 0, function* (partialFrac, slippage = 0.1) {
|
|
790
|
+
if (!(yield this.partialSelfLiquidateIsApproved(partialFrac)))
|
|
791
|
+
throw Error("Approval is needed for gas estimation");
|
|
792
|
+
return yield this._partialLiquidate(this.llamalend.signerAddress, partialFrac, slippage, true);
|
|
793
|
+
});
|
|
794
|
+
}
|
|
795
|
+
partialSelfLiquidate(partialFrac_1) {
|
|
796
|
+
return __awaiter(this, arguments, void 0, function* (partialFrac, slippage = 0.1) {
|
|
797
|
+
yield this.partialSelfLiquidateApprove(partialFrac);
|
|
798
|
+
return yield this._partialLiquidate(this.llamalend.signerAddress, partialFrac, slippage, false);
|
|
799
|
+
});
|
|
800
|
+
}
|
|
801
|
+
}
|