@curvefi/llamalend-api 1.0.24 → 1.0.25
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/README.md
CHANGED
|
@@ -807,6 +807,44 @@ import llamalend from "@curvefi/llamalend-api";
|
|
|
807
807
|
})()
|
|
808
808
|
```
|
|
809
809
|
|
|
810
|
+
### Partial self-liquidation for lendMarket
|
|
811
|
+
```ts
|
|
812
|
+
(async () => {
|
|
813
|
+
await llamalend.init('JsonRpc', {});
|
|
814
|
+
|
|
815
|
+
const lendMarket = llamalend.getLendMarket('one-way-market-0');
|
|
816
|
+
|
|
817
|
+
// Wallet balances: {
|
|
818
|
+
// borrowed: '301.533523886491869218',
|
|
819
|
+
// collateral: '0.860611976623971606'
|
|
820
|
+
// }
|
|
821
|
+
// State: {
|
|
822
|
+
// collateral: '0.139388023376028394',
|
|
823
|
+
// borrowed: '2751.493405530582315609',
|
|
824
|
+
// debt: '3053.026929417074184827'
|
|
825
|
+
// }
|
|
826
|
+
|
|
827
|
+
await lendMarket.tokensToLiquidate();
|
|
828
|
+
// 301.533523886491869218
|
|
829
|
+
|
|
830
|
+
const fraction = await lendMarket.calcPartialFrac(140); // <- 140 - amount (should be less then lendMarket.tokensToLiquidate)
|
|
831
|
+
// {frac: '472880873283878292', fracDecimal: '0.47288087328387829207', amount: 140}
|
|
832
|
+
//
|
|
833
|
+
|
|
834
|
+
|
|
835
|
+
await lendMarket.partialSelfLiquidateIsApproved(fraction);
|
|
836
|
+
// false
|
|
837
|
+
await lendMarket.partialSelfLiquidateApprove(fraction);
|
|
838
|
+
// []
|
|
839
|
+
await lendMarket.partialSelfLiquidateIsApproved(fraction);
|
|
840
|
+
// true
|
|
841
|
+
await lendMarket.partialSelfLiquidate(fraction, 0.1); // slippage = 0.1 %
|
|
842
|
+
|
|
843
|
+
// Wallet balances: { borrowed: '0', collateral: '0.7' }
|
|
844
|
+
// State: { collateral: '0.6', borrowed: '1300', debt: '1500' }
|
|
845
|
+
})()
|
|
846
|
+
```
|
|
847
|
+
|
|
810
848
|
### Liquidation for lendMarket
|
|
811
849
|
```ts
|
|
812
850
|
(async () => {
|
package/lib/interfaces.d.ts
CHANGED
|
@@ -14,6 +14,11 @@ export interface ICurveContract {
|
|
|
14
14
|
}
|
|
15
15
|
export type TAmount = number | string;
|
|
16
16
|
export type TGas = number | number[];
|
|
17
|
+
export interface IPartialFrac {
|
|
18
|
+
frac: string;
|
|
19
|
+
fracDecimal: string;
|
|
20
|
+
amount: string;
|
|
21
|
+
}
|
|
17
22
|
export interface ILlamma {
|
|
18
23
|
amm_address: string;
|
|
19
24
|
controller_address: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import memoize from "memoizee";
|
|
2
2
|
import type { Llamalend } from "../llamalend.js";
|
|
3
|
-
import { IDict, TGas, TAmount, IReward, IQuoteOdos, IOneWayMarket } from "../interfaces.js";
|
|
3
|
+
import { IDict, TGas, TAmount, IReward, IQuoteOdos, IOneWayMarket, IPartialFrac } from "../interfaces.js";
|
|
4
4
|
export declare class LendMarketTemplate {
|
|
5
5
|
private llamalend;
|
|
6
6
|
id: string;
|
|
@@ -50,6 +50,8 @@ export declare class LendMarketTemplate {
|
|
|
50
50
|
liquidate: (address: string, slippage?: number) => Promise<TGas>;
|
|
51
51
|
selfLiquidateApprove: () => Promise<TGas>;
|
|
52
52
|
selfLiquidate: (slippage?: number) => Promise<TGas>;
|
|
53
|
+
partialSelfLiquidateApprove: (partialFrac: IPartialFrac) => Promise<TGas>;
|
|
54
|
+
partialSelfLiquidate: (partialFrac: IPartialFrac, slippage?: number) => Promise<TGas>;
|
|
53
55
|
};
|
|
54
56
|
stats: {
|
|
55
57
|
parameters: () => Promise<{
|
|
@@ -441,10 +443,12 @@ export declare class LendMarketTemplate {
|
|
|
441
443
|
swapEstimateGas(i: number, j: number, amount: number | string, slippage?: number): Promise<TGas>;
|
|
442
444
|
swap(i: number, j: number, amount: number | string, slippage?: number): Promise<string>;
|
|
443
445
|
tokensToLiquidate(address?: string): Promise<string>;
|
|
446
|
+
calcPartialFrac(amount: TAmount, address?: string): Promise<IPartialFrac>;
|
|
444
447
|
liquidateIsApproved(address?: string): Promise<boolean>;
|
|
445
448
|
private liquidateApproveEstimateGas;
|
|
446
449
|
liquidateApprove(address?: string): Promise<string[]>;
|
|
447
450
|
private _liquidate;
|
|
451
|
+
private _partialLiquidate;
|
|
448
452
|
liquidateEstimateGas(address: string, slippage?: number): Promise<TGas>;
|
|
449
453
|
liquidate(address: string, slippage?: number): Promise<string>;
|
|
450
454
|
selfLiquidateIsApproved(): Promise<boolean>;
|
|
@@ -452,6 +456,11 @@ export declare class LendMarketTemplate {
|
|
|
452
456
|
selfLiquidateApprove(): Promise<string[]>;
|
|
453
457
|
selfLiquidateEstimateGas(slippage?: number): Promise<TGas>;
|
|
454
458
|
selfLiquidate(slippage?: number): Promise<string>;
|
|
459
|
+
partialSelfLiquidateIsApproved(partialFrac: IPartialFrac): Promise<boolean>;
|
|
460
|
+
private partialSelfLiquidateApproveEstimateGas;
|
|
461
|
+
partialSelfLiquidateApprove(partialFrac: IPartialFrac): Promise<string[]>;
|
|
462
|
+
partialSelfLiquidateEstimateGas(partialFrac: IPartialFrac, slippage?: number): Promise<TGas>;
|
|
463
|
+
partialSelfLiquidate(partialFrac: IPartialFrac, slippage?: number): Promise<string>;
|
|
455
464
|
private hasLeverage;
|
|
456
465
|
private _checkLeverageZap;
|
|
457
466
|
private _get_k_effective_BN;
|
|
@@ -508,6 +508,8 @@ export class LendMarketTemplate {
|
|
|
508
508
|
liquidate: this.liquidateEstimateGas.bind(this),
|
|
509
509
|
selfLiquidateApprove: this.selfLiquidateApproveEstimateGas.bind(this),
|
|
510
510
|
selfLiquidate: this.selfLiquidateEstimateGas.bind(this),
|
|
511
|
+
partialSelfLiquidateApprove: this.partialSelfLiquidateApproveEstimateGas.bind(this),
|
|
512
|
+
partialSelfLiquidate: this.partialSelfLiquidateEstimateGas.bind(this),
|
|
511
513
|
};
|
|
512
514
|
this.stats = {
|
|
513
515
|
parameters: this.statsParameters.bind(this),
|
|
@@ -2007,6 +2009,27 @@ export class LendMarketTemplate {
|
|
|
2007
2009
|
return formatUnits(_tokens, this.borrowed_token.decimals);
|
|
2008
2010
|
});
|
|
2009
2011
|
}
|
|
2012
|
+
calcPartialFrac(amount_1) {
|
|
2013
|
+
return __awaiter(this, arguments, void 0, function* (amount, address = "") {
|
|
2014
|
+
address = _getAddress.call(this.llamalend, address);
|
|
2015
|
+
const tokensToLiquidate = yield this.tokensToLiquidate(address);
|
|
2016
|
+
const amountBN = BN(amount);
|
|
2017
|
+
const tokensToLiquidateBN = BN(tokensToLiquidate);
|
|
2018
|
+
if (amountBN.gt(tokensToLiquidateBN))
|
|
2019
|
+
throw Error("Amount cannot be greater than total tokens to liquidate");
|
|
2020
|
+
if (amountBN.lte(0))
|
|
2021
|
+
throw Error("Amount must be greater than 0");
|
|
2022
|
+
// Calculate frac = amount / tokensToLiquidate * 10**18
|
|
2023
|
+
// 100% = 10**18
|
|
2024
|
+
const fracDecimalBN = amountBN.div(tokensToLiquidateBN);
|
|
2025
|
+
const frac = fromBN(fracDecimalBN);
|
|
2026
|
+
return {
|
|
2027
|
+
frac: frac.toString(),
|
|
2028
|
+
fracDecimal: fracDecimalBN.toString(),
|
|
2029
|
+
amount: amountBN.toString(),
|
|
2030
|
+
};
|
|
2031
|
+
});
|
|
2032
|
+
}
|
|
2010
2033
|
liquidateIsApproved() {
|
|
2011
2034
|
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
2012
2035
|
const tokensToLiquidate = yield this.tokensToLiquidate(address);
|
|
@@ -2047,6 +2070,32 @@ export class LendMarketTemplate {
|
|
|
2047
2070
|
return (yield contract.liquidate(address, _minAmount, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
|
|
2048
2071
|
});
|
|
2049
2072
|
}
|
|
2073
|
+
_partialLiquidate(address, partialFrac, slippage, estimateGas) {
|
|
2074
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2075
|
+
const { borrowed, debt: currentDebt } = yield this.userState(address);
|
|
2076
|
+
if (slippage <= 0)
|
|
2077
|
+
throw Error("Slippage must be > 0");
|
|
2078
|
+
if (slippage > 100)
|
|
2079
|
+
throw Error("Slippage must be <= 100");
|
|
2080
|
+
if (Number(currentDebt) === 0)
|
|
2081
|
+
throw Error(`Loan for ${address} does not exist`);
|
|
2082
|
+
if (Number(borrowed) === 0)
|
|
2083
|
+
throw Error(`User ${address} is not in liquidation mode`);
|
|
2084
|
+
const frac = partialFrac.frac;
|
|
2085
|
+
const fracBN = BN(partialFrac.fracDecimal);
|
|
2086
|
+
const borrowedBN = BN(borrowed);
|
|
2087
|
+
const expectedBorrowedBN = borrowedBN.times(fracBN);
|
|
2088
|
+
const minAmountBN = expectedBorrowedBN.times(100 - slippage).div(100);
|
|
2089
|
+
const _minAmount = fromBN(minAmountBN);
|
|
2090
|
+
const contract = this.llamalend.contracts[this.addresses.controller].contract;
|
|
2091
|
+
const gas = (yield contract.liquidate_extended.estimateGas(address, _minAmount, frac, this.llamalend.constants.ZERO_ADDRESS, [], this.llamalend.constantOptions));
|
|
2092
|
+
if (estimateGas)
|
|
2093
|
+
return smartNumber(gas);
|
|
2094
|
+
yield this.llamalend.updateFeeData();
|
|
2095
|
+
const gasLimit = _mulBy1_3(DIGas(gas));
|
|
2096
|
+
return (yield contract.liquidate_extended(address, _minAmount, frac, this.llamalend.constants.ZERO_ADDRESS, [], Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
|
|
2097
|
+
});
|
|
2098
|
+
}
|
|
2050
2099
|
liquidateEstimateGas(address_1) {
|
|
2051
2100
|
return __awaiter(this, arguments, void 0, function* (address, slippage = 0.1) {
|
|
2052
2101
|
if (!(yield this.liquidateIsApproved(address)))
|
|
@@ -2089,6 +2138,35 @@ export class LendMarketTemplate {
|
|
|
2089
2138
|
return yield this._liquidate(this.llamalend.signerAddress, slippage, false);
|
|
2090
2139
|
});
|
|
2091
2140
|
}
|
|
2141
|
+
// ---------------- PARTIAL SELF-LIQUIDATE ----------------
|
|
2142
|
+
partialSelfLiquidateIsApproved(partialFrac) {
|
|
2143
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2144
|
+
return yield hasAllowance.call(this.llamalend, [this.addresses.borrowed_token], [partialFrac.amount], this.llamalend.signerAddress, this.addresses.controller);
|
|
2145
|
+
});
|
|
2146
|
+
}
|
|
2147
|
+
partialSelfLiquidateApproveEstimateGas(partialFrac) {
|
|
2148
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2149
|
+
return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.addresses.borrowed_token], [partialFrac.amount], this.addresses.controller);
|
|
2150
|
+
});
|
|
2151
|
+
}
|
|
2152
|
+
partialSelfLiquidateApprove(partialFrac) {
|
|
2153
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2154
|
+
return yield ensureAllowance.call(this.llamalend, [this.addresses.borrowed_token], [partialFrac.amount], this.addresses.controller);
|
|
2155
|
+
});
|
|
2156
|
+
}
|
|
2157
|
+
partialSelfLiquidateEstimateGas(partialFrac_1) {
|
|
2158
|
+
return __awaiter(this, arguments, void 0, function* (partialFrac, slippage = 0.1) {
|
|
2159
|
+
if (!(yield this.partialSelfLiquidateIsApproved(partialFrac)))
|
|
2160
|
+
throw Error("Approval is needed for gas estimation");
|
|
2161
|
+
return yield this._partialLiquidate(this.llamalend.signerAddress, partialFrac, slippage, true);
|
|
2162
|
+
});
|
|
2163
|
+
}
|
|
2164
|
+
partialSelfLiquidate(partialFrac_1) {
|
|
2165
|
+
return __awaiter(this, arguments, void 0, function* (partialFrac, slippage = 0.1) {
|
|
2166
|
+
yield this.partialSelfLiquidateApprove(partialFrac);
|
|
2167
|
+
return yield this._partialLiquidate(this.llamalend.signerAddress, partialFrac, slippage, false);
|
|
2168
|
+
});
|
|
2169
|
+
}
|
|
2092
2170
|
_checkLeverageZap() {
|
|
2093
2171
|
if (!this.hasLeverage()) {
|
|
2094
2172
|
throw Error("This market does not support leverage");
|
package/package.json
CHANGED
package/src/interfaces.ts
CHANGED
|
@@ -18,6 +18,12 @@ export interface ICurveContract {
|
|
|
18
18
|
export type TAmount = number | string
|
|
19
19
|
export type TGas = number | number[]
|
|
20
20
|
|
|
21
|
+
export interface IPartialFrac {
|
|
22
|
+
frac: string;
|
|
23
|
+
fracDecimal: string;
|
|
24
|
+
amount: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
21
27
|
export interface ILlamma {
|
|
22
28
|
amm_address: string,
|
|
23
29
|
controller_address: string,
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
DIGas,
|
|
23
23
|
smartNumber,
|
|
24
24
|
} from "../utils.js";
|
|
25
|
-
import {IDict, TGas, TAmount, IReward, IQuoteOdos, IOneWayMarket} from "../interfaces.js";
|
|
25
|
+
import {IDict, TGas, TAmount, IReward, IQuoteOdos, IOneWayMarket, IPartialFrac} from "../interfaces.js";
|
|
26
26
|
import { _getExpectedOdos, _getQuoteOdos, _assembleTxOdos, _getUserCollateral, _getMarketsData } from "../external-api.js";
|
|
27
27
|
import ERC20Abi from '../constants/abis/ERC20.json' with {type: 'json'};
|
|
28
28
|
import {cacheKey, cacheStats} from "../cache/index.js";
|
|
@@ -82,6 +82,8 @@ export class LendMarketTemplate {
|
|
|
82
82
|
liquidate: (address: string, slippage?: number) => Promise<TGas>,
|
|
83
83
|
selfLiquidateApprove: () => Promise<TGas>,
|
|
84
84
|
selfLiquidate: (slippage?: number) => Promise<TGas>,
|
|
85
|
+
partialSelfLiquidateApprove: (partialFrac: IPartialFrac) => Promise<TGas>,
|
|
86
|
+
partialSelfLiquidate: (partialFrac: IPartialFrac, slippage?: number) => Promise<TGas>,
|
|
85
87
|
};
|
|
86
88
|
stats: {
|
|
87
89
|
parameters: () => Promise<{
|
|
@@ -265,6 +267,8 @@ export class LendMarketTemplate {
|
|
|
265
267
|
liquidate: this.liquidateEstimateGas.bind(this),
|
|
266
268
|
selfLiquidateApprove: this.selfLiquidateApproveEstimateGas.bind(this),
|
|
267
269
|
selfLiquidate: this.selfLiquidateEstimateGas.bind(this),
|
|
270
|
+
partialSelfLiquidateApprove: this.partialSelfLiquidateApproveEstimateGas.bind(this),
|
|
271
|
+
partialSelfLiquidate: this.partialSelfLiquidateEstimateGas.bind(this),
|
|
268
272
|
}
|
|
269
273
|
this.stats = {
|
|
270
274
|
parameters: this.statsParameters.bind(this),
|
|
@@ -2043,10 +2047,31 @@ export class LendMarketTemplate {
|
|
|
2043
2047
|
public async tokensToLiquidate(address = ""): Promise<string> {
|
|
2044
2048
|
address = _getAddress.call(this.llamalend, address);
|
|
2045
2049
|
const _tokens = await this.llamalend.contracts[this.addresses.controller].contract.tokens_to_liquidate(address, this.llamalend.constantOptions) as bigint;
|
|
2046
|
-
|
|
2047
2050
|
return formatUnits(_tokens, this.borrowed_token.decimals)
|
|
2048
2051
|
}
|
|
2049
2052
|
|
|
2053
|
+
public async calcPartialFrac(amount: TAmount, address = ""): Promise<IPartialFrac> {
|
|
2054
|
+
address = _getAddress.call(this.llamalend, address);
|
|
2055
|
+
const tokensToLiquidate = await this.tokensToLiquidate(address);
|
|
2056
|
+
|
|
2057
|
+
const amountBN = BN(amount);
|
|
2058
|
+
const tokensToLiquidateBN = BN(tokensToLiquidate);
|
|
2059
|
+
|
|
2060
|
+
if (amountBN.gt(tokensToLiquidateBN)) throw Error("Amount cannot be greater than total tokens to liquidate");
|
|
2061
|
+
if (amountBN.lte(0)) throw Error("Amount must be greater than 0");
|
|
2062
|
+
|
|
2063
|
+
// Calculate frac = amount / tokensToLiquidate * 10**18
|
|
2064
|
+
// 100% = 10**18
|
|
2065
|
+
const fracDecimalBN = amountBN.div(tokensToLiquidateBN);
|
|
2066
|
+
const frac = fromBN(fracDecimalBN);
|
|
2067
|
+
return {
|
|
2068
|
+
frac: frac.toString(),
|
|
2069
|
+
fracDecimal: fracDecimalBN.toString(),
|
|
2070
|
+
amount: amountBN.toString(),
|
|
2071
|
+
};
|
|
2072
|
+
}
|
|
2073
|
+
|
|
2074
|
+
|
|
2050
2075
|
public async liquidateIsApproved(address = ""): Promise<boolean> {
|
|
2051
2076
|
const tokensToLiquidate = await this.tokensToLiquidate(address);
|
|
2052
2077
|
return await hasAllowance.call(this.llamalend, [this.addresses.borrowed_token], [tokensToLiquidate], this.llamalend.signerAddress, this.addresses.controller);
|
|
@@ -2080,6 +2105,45 @@ export class LendMarketTemplate {
|
|
|
2080
2105
|
return (await contract.liquidate(address, _minAmount, { ...this.llamalend.options, gasLimit })).hash
|
|
2081
2106
|
}
|
|
2082
2107
|
|
|
2108
|
+
private async _partialLiquidate(address: string, partialFrac: IPartialFrac, slippage: number, estimateGas: boolean): Promise<string | TGas> {
|
|
2109
|
+
const { borrowed, debt: currentDebt } = await this.userState(address);
|
|
2110
|
+
if (slippage <= 0) throw Error("Slippage must be > 0");
|
|
2111
|
+
if (slippage > 100) throw Error("Slippage must be <= 100");
|
|
2112
|
+
if (Number(currentDebt) === 0) throw Error(`Loan for ${address} does not exist`);
|
|
2113
|
+
if (Number(borrowed) === 0) throw Error(`User ${address} is not in liquidation mode`);
|
|
2114
|
+
|
|
2115
|
+
const frac = partialFrac.frac;
|
|
2116
|
+
const fracBN = BN(partialFrac.fracDecimal);
|
|
2117
|
+
|
|
2118
|
+
const borrowedBN = BN(borrowed);
|
|
2119
|
+
const expectedBorrowedBN = borrowedBN.times(fracBN);
|
|
2120
|
+
const minAmountBN = expectedBorrowedBN.times(100 - slippage).div(100);
|
|
2121
|
+
const _minAmount = fromBN(minAmountBN);
|
|
2122
|
+
|
|
2123
|
+
const contract = this.llamalend.contracts[this.addresses.controller].contract;
|
|
2124
|
+
const gas = (await contract.liquidate_extended.estimateGas(
|
|
2125
|
+
address,
|
|
2126
|
+
_minAmount,
|
|
2127
|
+
frac,
|
|
2128
|
+
this.llamalend.constants.ZERO_ADDRESS,
|
|
2129
|
+
[],
|
|
2130
|
+
this.llamalend.constantOptions
|
|
2131
|
+
));
|
|
2132
|
+
|
|
2133
|
+
if (estimateGas) return smartNumber(gas);
|
|
2134
|
+
|
|
2135
|
+
await this.llamalend.updateFeeData();
|
|
2136
|
+
const gasLimit = _mulBy1_3(DIGas(gas));
|
|
2137
|
+
return (await contract.liquidate_extended(
|
|
2138
|
+
address,
|
|
2139
|
+
_minAmount,
|
|
2140
|
+
frac,
|
|
2141
|
+
this.llamalend.constants.ZERO_ADDRESS,
|
|
2142
|
+
[],
|
|
2143
|
+
{ ...this.llamalend.options, gasLimit }
|
|
2144
|
+
)).hash;
|
|
2145
|
+
}
|
|
2146
|
+
|
|
2083
2147
|
public async liquidateEstimateGas(address: string, slippage = 0.1): Promise<TGas> {
|
|
2084
2148
|
if (!(await this.liquidateIsApproved(address))) throw Error("Approval is needed for gas estimation");
|
|
2085
2149
|
return await this._liquidate(address, slippage, true) as TGas;
|
|
@@ -2114,6 +2178,30 @@ export class LendMarketTemplate {
|
|
|
2114
2178
|
return await this._liquidate(this.llamalend.signerAddress, slippage, false) as string;
|
|
2115
2179
|
}
|
|
2116
2180
|
|
|
2181
|
+
// ---------------- PARTIAL SELF-LIQUIDATE ----------------
|
|
2182
|
+
|
|
2183
|
+
public async partialSelfLiquidateIsApproved(partialFrac: IPartialFrac): Promise<boolean> {
|
|
2184
|
+
return await hasAllowance.call(this.llamalend, [this.addresses.borrowed_token], [partialFrac.amount], this.llamalend.signerAddress, this.addresses.controller);
|
|
2185
|
+
}
|
|
2186
|
+
|
|
2187
|
+
private async partialSelfLiquidateApproveEstimateGas(partialFrac: IPartialFrac): Promise<TGas> {
|
|
2188
|
+
return await ensureAllowanceEstimateGas.call(this.llamalend, [this.addresses.borrowed_token], [partialFrac.amount], this.addresses.controller);
|
|
2189
|
+
}
|
|
2190
|
+
|
|
2191
|
+
public async partialSelfLiquidateApprove(partialFrac: IPartialFrac): Promise<string[]> {
|
|
2192
|
+
return await ensureAllowance.call(this.llamalend, [this.addresses.borrowed_token], [partialFrac.amount], this.addresses.controller);
|
|
2193
|
+
}
|
|
2194
|
+
|
|
2195
|
+
public async partialSelfLiquidateEstimateGas(partialFrac: IPartialFrac, slippage = 0.1): Promise<TGas> {
|
|
2196
|
+
if (!(await this.partialSelfLiquidateIsApproved(partialFrac))) throw Error("Approval is needed for gas estimation");
|
|
2197
|
+
return await this._partialLiquidate(this.llamalend.signerAddress, partialFrac, slippage, true) as TGas;
|
|
2198
|
+
}
|
|
2199
|
+
|
|
2200
|
+
public async partialSelfLiquidate(partialFrac: IPartialFrac, slippage = 0.1): Promise<string> {
|
|
2201
|
+
await this.partialSelfLiquidateApprove(partialFrac);
|
|
2202
|
+
return await this._partialLiquidate(this.llamalend.signerAddress, partialFrac, slippage, false) as string;
|
|
2203
|
+
}
|
|
2204
|
+
|
|
2117
2205
|
// ---------------- LEVERAGE CREATE LOAN ----------------
|
|
2118
2206
|
|
|
2119
2207
|
private hasLeverage = (): boolean => {
|