@morpho-org/blue-sdk 2.0.0-next.18 → 2.0.0-next.19
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/addresses.js +62 -57
- package/lib/chain.js +9 -6
- package/lib/constants.js +12 -9
- package/lib/errors.js +19 -9
- package/lib/holding/AssetBalances.js +5 -1
- package/lib/holding/Holding.js +9 -5
- package/lib/holding/index.js +18 -2
- package/lib/index.js +28 -12
- package/lib/market/Market.js +51 -47
- package/lib/market/MarketParams.js +14 -10
- package/lib/market/MarketUtils.js +45 -42
- package/lib/market/index.js +19 -3
- package/lib/math/AdaptiveCurveIrmLib.js +25 -22
- package/lib/math/MathLib.js +11 -8
- package/lib/math/SharesMath.js +8 -5
- package/lib/math/index.js +19 -3
- package/lib/position/Position.js +17 -12
- package/lib/position/index.js +17 -1
- package/lib/token/ConstantWrappedToken.js +9 -5
- package/lib/token/ExchangeRateWrappedToken.js +9 -5
- package/lib/token/Token.js +12 -8
- package/lib/token/VaultToken.js +9 -5
- package/lib/token/WrappedToken.js +11 -7
- package/lib/token/index.js +21 -5
- package/lib/types.js +9 -4
- package/lib/user/User.js +5 -1
- package/lib/user/index.js +17 -1
- package/lib/vault/Vault.js +23 -18
- package/lib/vault/VaultConfig.js +7 -3
- package/lib/vault/VaultMarketAllocation.js +8 -4
- package/lib/vault/VaultMarketConfig.js +5 -1
- package/lib/vault/VaultMarketPublicAllocatorConfig.js +5 -1
- package/lib/vault/VaultUser.js +5 -1
- package/lib/vault/VaultUtils.js +9 -6
- package/lib/vault/index.js +23 -7
- package/package.json +5 -12
package/lib/market/index.js
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./MarketUtils.js"), exports);
|
|
18
|
+
__exportStar(require("./MarketParams.js"), exports);
|
|
19
|
+
__exportStar(require("./Market.js"), exports);
|
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdaptiveCurveIrmLib = void 0;
|
|
4
|
+
const constants_js_1 = require("../constants.js");
|
|
5
|
+
const MathLib_js_1 = require("./MathLib.js");
|
|
3
6
|
/**
|
|
4
7
|
* JS implementation of {@link https://github.com/morpho-org/morpho-blue-irm/blob/main/src/libraries/adaptive-curve/ExpLib.sol ExpLib} used by the Adaptive Curve IRM.
|
|
5
8
|
*/
|
|
6
|
-
|
|
9
|
+
var AdaptiveCurveIrmLib;
|
|
7
10
|
(function (AdaptiveCurveIrmLib) {
|
|
8
11
|
AdaptiveCurveIrmLib.CURVE_STEEPNESS = 4000000000000000000n;
|
|
9
12
|
AdaptiveCurveIrmLib.TARGET_UTILIZATION = 900000000000000000n;
|
|
10
|
-
AdaptiveCurveIrmLib.INITIAL_RATE_AT_TARGET = 40000000000000000n / SECONDS_PER_YEAR;
|
|
11
|
-
AdaptiveCurveIrmLib.ADJUSTMENT_SPEED = 50000000000000000000n / SECONDS_PER_YEAR;
|
|
12
|
-
AdaptiveCurveIrmLib.MIN_RATE_AT_TARGET = 1000000000000000n / SECONDS_PER_YEAR;
|
|
13
|
-
AdaptiveCurveIrmLib.MAX_RATE_AT_TARGET = 2000000000000000000n / SECONDS_PER_YEAR;
|
|
13
|
+
AdaptiveCurveIrmLib.INITIAL_RATE_AT_TARGET = 40000000000000000n / constants_js_1.SECONDS_PER_YEAR;
|
|
14
|
+
AdaptiveCurveIrmLib.ADJUSTMENT_SPEED = 50000000000000000000n / constants_js_1.SECONDS_PER_YEAR;
|
|
15
|
+
AdaptiveCurveIrmLib.MIN_RATE_AT_TARGET = 1000000000000000n / constants_js_1.SECONDS_PER_YEAR;
|
|
16
|
+
AdaptiveCurveIrmLib.MAX_RATE_AT_TARGET = 2000000000000000000n / constants_js_1.SECONDS_PER_YEAR;
|
|
14
17
|
/**
|
|
15
18
|
* ln(2), scaled by WAD.
|
|
16
19
|
*/
|
|
@@ -46,7 +49,7 @@ export var AdaptiveCurveIrmLib;
|
|
|
46
49
|
const q = (x + roundingAdjustment) / AdaptiveCurveIrmLib.LN_2_INT;
|
|
47
50
|
const r = x - q * AdaptiveCurveIrmLib.LN_2_INT;
|
|
48
51
|
// Compute e^r with a 2nd-order Taylor polynomial.
|
|
49
|
-
const expR = MathLib.WAD + r + (r * r) / MathLib.WAD / 2n;
|
|
52
|
+
const expR = MathLib_js_1.MathLib.WAD + r + (r * r) / MathLib_js_1.MathLib.WAD / 2n;
|
|
50
53
|
// Return e^x = 2^q * e^r.
|
|
51
54
|
if (q === 0n)
|
|
52
55
|
return expR << q;
|
|
@@ -58,9 +61,9 @@ export var AdaptiveCurveIrmLib;
|
|
|
58
61
|
startRateAtTarget = BigInt(startRateAtTarget);
|
|
59
62
|
elapsed = BigInt(elapsed);
|
|
60
63
|
const errNormFactor = startUtilization > AdaptiveCurveIrmLib.TARGET_UTILIZATION
|
|
61
|
-
? MathLib.WAD - AdaptiveCurveIrmLib.TARGET_UTILIZATION
|
|
64
|
+
? MathLib_js_1.MathLib.WAD - AdaptiveCurveIrmLib.TARGET_UTILIZATION
|
|
62
65
|
: AdaptiveCurveIrmLib.TARGET_UTILIZATION;
|
|
63
|
-
const err = MathLib.wDivDown(startUtilization - AdaptiveCurveIrmLib.TARGET_UTILIZATION, errNormFactor);
|
|
66
|
+
const err = MathLib_js_1.MathLib.wDivDown(startUtilization - AdaptiveCurveIrmLib.TARGET_UTILIZATION, errNormFactor);
|
|
64
67
|
let avgRateAtTarget;
|
|
65
68
|
let endRateAtTarget;
|
|
66
69
|
if (startRateAtTarget === 0n) {
|
|
@@ -71,7 +74,7 @@ export var AdaptiveCurveIrmLib;
|
|
|
71
74
|
else {
|
|
72
75
|
// The speed is assumed constant between two updates, but it is in fact not constant because of interest.
|
|
73
76
|
// So the rate is always underestimated.
|
|
74
|
-
const speed = MathLib.wMulDown(AdaptiveCurveIrmLib.ADJUSTMENT_SPEED, err);
|
|
77
|
+
const speed = MathLib_js_1.MathLib.wMulDown(AdaptiveCurveIrmLib.ADJUSTMENT_SPEED, err);
|
|
75
78
|
const linearAdaptation = speed * elapsed;
|
|
76
79
|
if (linearAdaptation === 0n) {
|
|
77
80
|
// If linearAdaptation == 0, avgRateAtTarget = endRateAtTarget = startRateAtTarget;
|
|
@@ -80,7 +83,7 @@ export var AdaptiveCurveIrmLib;
|
|
|
80
83
|
}
|
|
81
84
|
else {
|
|
82
85
|
// Non negative because MIN_RATE_AT_TARGET > 0.
|
|
83
|
-
const _newRateAtTarget = (linearAdaptation) => MathLib.min(MathLib.max(MathLib.wMulDown(startRateAtTarget, wExp(linearAdaptation)), AdaptiveCurveIrmLib.MIN_RATE_AT_TARGET), AdaptiveCurveIrmLib.MAX_RATE_AT_TARGET);
|
|
86
|
+
const _newRateAtTarget = (linearAdaptation) => MathLib_js_1.MathLib.min(MathLib_js_1.MathLib.max(MathLib_js_1.MathLib.wMulDown(startRateAtTarget, wExp(linearAdaptation)), AdaptiveCurveIrmLib.MIN_RATE_AT_TARGET), AdaptiveCurveIrmLib.MAX_RATE_AT_TARGET);
|
|
84
87
|
// Formula of the average rate that should be returned to Morpho Blue:
|
|
85
88
|
// avg = 1/T * ∫_0^T curve(startRateAtTarget*exp(speed*x), err) dx
|
|
86
89
|
// The integral is approximated with the trapezoidal rule:
|
|
@@ -104,11 +107,11 @@ export var AdaptiveCurveIrmLib;
|
|
|
104
107
|
}
|
|
105
108
|
// Non negative because 1 - 1/C >= 0, C - 1 >= 0.
|
|
106
109
|
const coeff = err < 0
|
|
107
|
-
? MathLib.WAD - MathLib.wDivDown(MathLib.WAD, AdaptiveCurveIrmLib.CURVE_STEEPNESS)
|
|
108
|
-
: AdaptiveCurveIrmLib.CURVE_STEEPNESS - MathLib.WAD;
|
|
110
|
+
? MathLib_js_1.MathLib.WAD - MathLib_js_1.MathLib.wDivDown(MathLib_js_1.MathLib.WAD, AdaptiveCurveIrmLib.CURVE_STEEPNESS)
|
|
111
|
+
: AdaptiveCurveIrmLib.CURVE_STEEPNESS - MathLib_js_1.MathLib.WAD;
|
|
109
112
|
// Non negative if avgRateAtTarget >= 0 because if err < 0, coeff <= 1.
|
|
110
113
|
return {
|
|
111
|
-
avgBorrowRate: MathLib.wMulDown(MathLib.wMulDown(coeff, err) + MathLib.WAD, avgRateAtTarget),
|
|
114
|
+
avgBorrowRate: MathLib_js_1.MathLib.wMulDown(MathLib_js_1.MathLib.wMulDown(coeff, err) + MathLib_js_1.MathLib.WAD, avgRateAtTarget),
|
|
112
115
|
endRateAtTarget,
|
|
113
116
|
};
|
|
114
117
|
}
|
|
@@ -117,15 +120,15 @@ export var AdaptiveCurveIrmLib;
|
|
|
117
120
|
borrowRate = BigInt(borrowRate);
|
|
118
121
|
rateAtTarget = BigInt(rateAtTarget);
|
|
119
122
|
if (borrowRate >= rateAtTarget) {
|
|
120
|
-
const maxBorrowRate = MathLib.wMulDown(rateAtTarget, AdaptiveCurveIrmLib.CURVE_STEEPNESS);
|
|
123
|
+
const maxBorrowRate = MathLib_js_1.MathLib.wMulDown(rateAtTarget, AdaptiveCurveIrmLib.CURVE_STEEPNESS);
|
|
121
124
|
const diffToMaxBorrowRate = maxBorrowRate - rateAtTarget;
|
|
122
125
|
if (diffToMaxBorrowRate === 0n)
|
|
123
|
-
return MathLib.WAD;
|
|
124
|
-
return MathLib.min(MathLib.WAD, AdaptiveCurveIrmLib.TARGET_UTILIZATION +
|
|
125
|
-
MathLib.mulDivDown(MathLib.WAD - AdaptiveCurveIrmLib.TARGET_UTILIZATION, borrowRate - rateAtTarget, diffToMaxBorrowRate));
|
|
126
|
+
return MathLib_js_1.MathLib.WAD;
|
|
127
|
+
return MathLib_js_1.MathLib.min(MathLib_js_1.MathLib.WAD, AdaptiveCurveIrmLib.TARGET_UTILIZATION +
|
|
128
|
+
MathLib_js_1.MathLib.mulDivDown(MathLib_js_1.MathLib.WAD - AdaptiveCurveIrmLib.TARGET_UTILIZATION, borrowRate - rateAtTarget, diffToMaxBorrowRate));
|
|
126
129
|
}
|
|
127
|
-
const minBorrowRate = MathLib.wDivDown(rateAtTarget, AdaptiveCurveIrmLib.CURVE_STEEPNESS);
|
|
128
|
-
return MathLib.max(0n, MathLib.mulDivDown(AdaptiveCurveIrmLib.TARGET_UTILIZATION, borrowRate - minBorrowRate, rateAtTarget - minBorrowRate));
|
|
130
|
+
const minBorrowRate = MathLib_js_1.MathLib.wDivDown(rateAtTarget, AdaptiveCurveIrmLib.CURVE_STEEPNESS);
|
|
131
|
+
return MathLib_js_1.MathLib.max(0n, MathLib_js_1.MathLib.mulDivDown(AdaptiveCurveIrmLib.TARGET_UTILIZATION, borrowRate - minBorrowRate, rateAtTarget - minBorrowRate));
|
|
129
132
|
}
|
|
130
133
|
AdaptiveCurveIrmLib.getUtilizationAtBorrowRate = getUtilizationAtBorrowRate;
|
|
131
|
-
})(AdaptiveCurveIrmLib || (AdaptiveCurveIrmLib = {}));
|
|
134
|
+
})(AdaptiveCurveIrmLib || (exports.AdaptiveCurveIrmLib = AdaptiveCurveIrmLib = {}));
|
package/lib/math/MathLib.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MathLib = void 0;
|
|
4
|
+
const morpho_ts_1 = require("@morpho-org/morpho-ts");
|
|
2
5
|
/**
|
|
3
6
|
* Library to manage fixed-point arithmetic.
|
|
4
7
|
* https://github.com/morpho-org/morpho-blue/blob/main/src/libraries/MathLib.sol
|
|
5
8
|
*/
|
|
6
|
-
|
|
9
|
+
var MathLib;
|
|
7
10
|
(function (MathLib) {
|
|
8
11
|
MathLib.WAD = 1000000000000000000n;
|
|
9
12
|
MathLib.MAX_UINT_256 = maxUint(256);
|
|
@@ -164,9 +167,9 @@ export var MathLib;
|
|
|
164
167
|
* @param period The compounding basis
|
|
165
168
|
*/
|
|
166
169
|
function rateToApy(rate, period) {
|
|
167
|
-
const { unit, duration } = Time.toPeriod(period);
|
|
168
|
-
const factor = Time[unit].from.y(1) / duration;
|
|
169
|
-
return ((1 + Number(format.number.locale("en").of(BigInt(rate), 18))) ** factor -
|
|
170
|
+
const { unit, duration } = morpho_ts_1.Time.toPeriod(period);
|
|
171
|
+
const factor = morpho_ts_1.Time[unit].from.y(1) / duration;
|
|
172
|
+
return ((1 + Number(morpho_ts_1.format.number.locale("en").of(BigInt(rate), 18))) ** factor -
|
|
170
173
|
1);
|
|
171
174
|
}
|
|
172
175
|
MathLib.rateToApy = rateToApy;
|
|
@@ -177,9 +180,9 @@ export var MathLib;
|
|
|
177
180
|
* @param compounding The compounding basis
|
|
178
181
|
*/
|
|
179
182
|
function aprToApy(apr, compounding) {
|
|
180
|
-
const { unit, duration } = Time.toPeriod(compounding);
|
|
181
|
-
const rate = (BigInt(apr) * BigInt(duration)) / Time[unit].from.y(1n);
|
|
183
|
+
const { unit, duration } = morpho_ts_1.Time.toPeriod(compounding);
|
|
184
|
+
const rate = (BigInt(apr) * BigInt(duration)) / morpho_ts_1.Time[unit].from.y(1n);
|
|
182
185
|
return rateToApy(rate, compounding);
|
|
183
186
|
}
|
|
184
187
|
MathLib.aprToApy = aprToApy;
|
|
185
|
-
})(MathLib || (MathLib = {}));
|
|
188
|
+
})(MathLib || (exports.MathLib = MathLib = {}));
|
package/lib/math/SharesMath.js
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SharesMath = void 0;
|
|
4
|
+
const MathLib_js_1 = require("./MathLib.js");
|
|
2
5
|
/**
|
|
3
6
|
* JS implementation of {@link https://github.com/morpho-org/morpho-blue/blob/main/src/libraries/SharesMathLib.sol SharesMathLib} used by Morpho Blue
|
|
4
7
|
* & MetaMorpho (via {@link https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/ERC4626.sol ERC4626}).
|
|
5
8
|
*/
|
|
6
|
-
|
|
9
|
+
var SharesMath;
|
|
7
10
|
(function (SharesMath) {
|
|
8
11
|
SharesMath.VIRTUAL_SHARES = 1000000n;
|
|
9
12
|
SharesMath.VIRTUAL_ASSETS = 1n;
|
|
10
13
|
function toAssets(shares, totalAssets, totalShares, rounding) {
|
|
11
|
-
return MathLib.mulDiv(shares, BigInt(totalAssets) + SharesMath.VIRTUAL_ASSETS, BigInt(totalShares) + SharesMath.VIRTUAL_SHARES, rounding);
|
|
14
|
+
return MathLib_js_1.MathLib.mulDiv(shares, BigInt(totalAssets) + SharesMath.VIRTUAL_ASSETS, BigInt(totalShares) + SharesMath.VIRTUAL_SHARES, rounding);
|
|
12
15
|
}
|
|
13
16
|
SharesMath.toAssets = toAssets;
|
|
14
17
|
function toShares(assets, totalAssets, totalShares, rounding) {
|
|
15
|
-
return MathLib.mulDiv(assets, BigInt(totalShares) + SharesMath.VIRTUAL_SHARES, BigInt(totalAssets) + SharesMath.VIRTUAL_ASSETS, rounding);
|
|
18
|
+
return MathLib_js_1.MathLib.mulDiv(assets, BigInt(totalShares) + SharesMath.VIRTUAL_SHARES, BigInt(totalAssets) + SharesMath.VIRTUAL_ASSETS, rounding);
|
|
16
19
|
}
|
|
17
20
|
SharesMath.toShares = toShares;
|
|
18
|
-
})(SharesMath || (SharesMath = {}));
|
|
21
|
+
})(SharesMath || (exports.SharesMath = SharesMath = {}));
|
package/lib/math/index.js
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./MathLib.js"), exports);
|
|
18
|
+
__exportStar(require("./SharesMath.js"), exports);
|
|
19
|
+
__exportStar(require("./AdaptiveCurveIrmLib.js"), exports);
|
package/lib/position/Position.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AccrualPosition = exports.Position = void 0;
|
|
4
|
+
const errors_js_1 = require("../errors.js");
|
|
5
|
+
const index_js_1 = require("../market/index.js");
|
|
6
|
+
class Position {
|
|
4
7
|
/**
|
|
5
8
|
* The user holding this position.
|
|
6
9
|
*/
|
|
@@ -29,7 +32,8 @@ export class Position {
|
|
|
29
32
|
this.collateral = collateral;
|
|
30
33
|
}
|
|
31
34
|
}
|
|
32
|
-
|
|
35
|
+
exports.Position = Position;
|
|
36
|
+
class AccrualPosition extends Position {
|
|
33
37
|
/**
|
|
34
38
|
* The market on which this position is held.
|
|
35
39
|
*/
|
|
@@ -153,33 +157,33 @@ export class AccrualPosition extends Position {
|
|
|
153
157
|
const position = new AccrualPosition(this, market);
|
|
154
158
|
position.supplyShares -= shares;
|
|
155
159
|
if (position.supplyShares < 0n)
|
|
156
|
-
throw new BlueErrors.InsufficientPosition(position.user, position.marketId);
|
|
160
|
+
throw new errors_js_1.BlueErrors.InsufficientPosition(position.user, position.marketId);
|
|
157
161
|
return { position, assets, shares };
|
|
158
162
|
}
|
|
159
163
|
supplyCollateral(assets) {
|
|
160
164
|
this.collateral += assets;
|
|
161
|
-
return new AccrualPosition(this, new Market(this.market));
|
|
165
|
+
return new AccrualPosition(this, new index_js_1.Market(this.market));
|
|
162
166
|
}
|
|
163
167
|
withdrawCollateral(assets, timestamp) {
|
|
164
168
|
if (this.market.price == null)
|
|
165
|
-
throw new BlueErrors.UnknownOraclePrice(this.marketId);
|
|
169
|
+
throw new errors_js_1.BlueErrors.UnknownOraclePrice(this.marketId);
|
|
166
170
|
const position = this.accrueInterest(timestamp);
|
|
167
171
|
position.collateral -= assets;
|
|
168
172
|
if (position.collateral < 0n)
|
|
169
|
-
throw new BlueErrors.InsufficientPosition(position.user, position.marketId);
|
|
173
|
+
throw new errors_js_1.BlueErrors.InsufficientPosition(position.user, position.marketId);
|
|
170
174
|
if (!position.isHealthy)
|
|
171
|
-
throw new BlueErrors.InsufficientCollateral(position.user, position.marketId);
|
|
175
|
+
throw new errors_js_1.BlueErrors.InsufficientCollateral(position.user, position.marketId);
|
|
172
176
|
return position;
|
|
173
177
|
}
|
|
174
178
|
borrow(assets, shares, timestamp) {
|
|
175
179
|
let { market } = this;
|
|
176
180
|
if (market.price == null)
|
|
177
|
-
throw new BlueErrors.UnknownOraclePrice(market.id);
|
|
181
|
+
throw new errors_js_1.BlueErrors.UnknownOraclePrice(market.id);
|
|
178
182
|
({ market, assets, shares } = market.borrow(assets, shares, timestamp));
|
|
179
183
|
const position = new AccrualPosition(this, market);
|
|
180
184
|
position.borrowShares += shares;
|
|
181
185
|
if (!position.isHealthy)
|
|
182
|
-
throw new BlueErrors.InsufficientCollateral(this.user, this.marketId);
|
|
186
|
+
throw new errors_js_1.BlueErrors.InsufficientCollateral(this.user, this.marketId);
|
|
183
187
|
return { position, assets, shares };
|
|
184
188
|
}
|
|
185
189
|
repay(assets, shares, timestamp) {
|
|
@@ -188,7 +192,7 @@ export class AccrualPosition extends Position {
|
|
|
188
192
|
const position = new AccrualPosition(this, market);
|
|
189
193
|
position.borrowShares -= shares;
|
|
190
194
|
if (position.borrowShares < 0n)
|
|
191
|
-
throw new BlueErrors.InsufficientPosition(position.user, position.marketId);
|
|
195
|
+
throw new errors_js_1.BlueErrors.InsufficientPosition(position.user, position.marketId);
|
|
192
196
|
return { position, assets, shares };
|
|
193
197
|
}
|
|
194
198
|
getRepayCapacityLimit(loanTokenBalance) {
|
|
@@ -198,3 +202,4 @@ export class AccrualPosition extends Position {
|
|
|
198
202
|
return this.market.getMaxCapacities(this, loanTokenBalance, collateralTokenBalance, options);
|
|
199
203
|
}
|
|
200
204
|
}
|
|
205
|
+
exports.AccrualPosition = AccrualPosition;
|
package/lib/position/index.js
CHANGED
|
@@ -1 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./Position.js"), exports);
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConstantWrappedToken = void 0;
|
|
4
|
+
const index_js_1 = require("../math/index.js");
|
|
5
|
+
const WrappedToken_js_1 = require("./WrappedToken.js");
|
|
6
|
+
class ConstantWrappedToken extends WrappedToken_js_1.WrappedToken {
|
|
4
7
|
underlyingDecimals;
|
|
5
8
|
constructor(token, underlying, underlyingDecimals = 0) {
|
|
6
9
|
super(token, underlying);
|
|
@@ -22,9 +25,10 @@ export class ConstantWrappedToken extends WrappedToken {
|
|
|
22
25
|
return super.toUnwrappedExactAmountOut(unwrappedAmount, 0n, rounding);
|
|
23
26
|
}
|
|
24
27
|
_wrap(amount) {
|
|
25
|
-
return MathLib.mulDivDown(amount, 10n ** BigInt(this.decimals), 10n ** this.underlyingDecimals);
|
|
28
|
+
return index_js_1.MathLib.mulDivDown(amount, 10n ** BigInt(this.decimals), 10n ** this.underlyingDecimals);
|
|
26
29
|
}
|
|
27
30
|
_unwrap(amount) {
|
|
28
|
-
return MathLib.mulDivDown(amount, 10n ** this.underlyingDecimals, 10n ** BigInt(this.decimals));
|
|
31
|
+
return index_js_1.MathLib.mulDivDown(amount, 10n ** this.underlyingDecimals, 10n ** BigInt(this.decimals));
|
|
29
32
|
}
|
|
30
33
|
}
|
|
34
|
+
exports.ConstantWrappedToken = ConstantWrappedToken;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExchangeRateWrappedToken = void 0;
|
|
4
|
+
const index_js_1 = require("../math/index.js");
|
|
5
|
+
const WrappedToken_js_1 = require("./WrappedToken.js");
|
|
6
|
+
class ExchangeRateWrappedToken extends WrappedToken_js_1.WrappedToken {
|
|
4
7
|
underlying;
|
|
5
8
|
wrappedTokenExchangeRate;
|
|
6
9
|
constructor(token, underlying, wrappedTokenExchangeRate) {
|
|
@@ -9,9 +12,10 @@ export class ExchangeRateWrappedToken extends WrappedToken {
|
|
|
9
12
|
this.wrappedTokenExchangeRate = wrappedTokenExchangeRate;
|
|
10
13
|
}
|
|
11
14
|
_wrap(amount, rounding) {
|
|
12
|
-
return MathLib.wDiv(amount, this.wrappedTokenExchangeRate, rounding);
|
|
15
|
+
return index_js_1.MathLib.wDiv(amount, this.wrappedTokenExchangeRate, rounding);
|
|
13
16
|
}
|
|
14
17
|
_unwrap(amount, rounding) {
|
|
15
|
-
return MathLib.wMul(amount, this.wrappedTokenExchangeRate, rounding);
|
|
18
|
+
return index_js_1.MathLib.wMul(amount, this.wrappedTokenExchangeRate, rounding);
|
|
16
19
|
}
|
|
17
20
|
}
|
|
21
|
+
exports.ExchangeRateWrappedToken = ExchangeRateWrappedToken;
|
package/lib/token/Token.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Token = void 0;
|
|
4
|
+
const addresses_js_1 = require("../addresses.js");
|
|
5
|
+
const chain_js_1 = require("../chain.js");
|
|
6
|
+
const index_js_1 = require("../math/index.js");
|
|
7
|
+
class Token {
|
|
5
8
|
static native(chainId) {
|
|
6
|
-
const currency = ChainUtils.CHAIN_METADATA[chainId].nativeCurrency;
|
|
7
|
-
return new Token({ ...currency, address: NATIVE_ADDRESS });
|
|
9
|
+
const currency = chain_js_1.ChainUtils.CHAIN_METADATA[chainId].nativeCurrency;
|
|
10
|
+
return new Token({ ...currency, address: addresses_js_1.NATIVE_ADDRESS });
|
|
8
11
|
}
|
|
9
12
|
/**
|
|
10
13
|
* The token's address.
|
|
@@ -42,7 +45,7 @@ export class Token {
|
|
|
42
45
|
fromUsd(amount, rounding = "Down") {
|
|
43
46
|
if (this.price == null)
|
|
44
47
|
return;
|
|
45
|
-
return MathLib.mulDiv(amount, 10n ** BigInt(this.decimals), this.price, rounding);
|
|
48
|
+
return index_js_1.MathLib.mulDiv(amount, 10n ** BigInt(this.decimals), this.price, rounding);
|
|
46
49
|
}
|
|
47
50
|
/**
|
|
48
51
|
* Quotes an amount of tokens in USD (scaled by WAD).
|
|
@@ -52,6 +55,7 @@ export class Token {
|
|
|
52
55
|
toUsd(amount, rounding = "Down") {
|
|
53
56
|
if (this.price == null)
|
|
54
57
|
return;
|
|
55
|
-
return MathLib.mulDiv(amount, this.price, 10n ** BigInt(this.decimals), rounding);
|
|
58
|
+
return index_js_1.MathLib.mulDiv(amount, this.price, 10n ** BigInt(this.decimals), rounding);
|
|
56
59
|
}
|
|
57
60
|
}
|
|
61
|
+
exports.Token = Token;
|
package/lib/token/VaultToken.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VaultToken = void 0;
|
|
4
|
+
const VaultUtils_js_1 = require("../vault/VaultUtils.js");
|
|
5
|
+
const WrappedToken_js_1 = require("./WrappedToken.js");
|
|
6
|
+
class VaultToken extends WrappedToken_js_1.WrappedToken {
|
|
4
7
|
asset;
|
|
5
8
|
decimalsOffset;
|
|
6
9
|
/**
|
|
@@ -19,9 +22,10 @@ export class VaultToken extends WrappedToken {
|
|
|
19
22
|
this.decimalsOffset = BigInt(config.decimalsOffset);
|
|
20
23
|
}
|
|
21
24
|
_wrap(amount, rounding) {
|
|
22
|
-
return VaultUtils.toShares(amount, this, rounding);
|
|
25
|
+
return VaultUtils_js_1.VaultUtils.toShares(amount, this, rounding);
|
|
23
26
|
}
|
|
24
27
|
_unwrap(amount, rounding) {
|
|
25
|
-
return VaultUtils.toAssets(amount, this, rounding);
|
|
28
|
+
return VaultUtils_js_1.VaultUtils.toAssets(amount, this, rounding);
|
|
26
29
|
}
|
|
27
30
|
}
|
|
31
|
+
exports.VaultToken = VaultToken;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WrappedToken = void 0;
|
|
4
|
+
const index_js_1 = require("../math/index.js");
|
|
5
|
+
const Token_js_1 = require("./Token.js");
|
|
6
|
+
class WrappedToken extends Token_js_1.Token {
|
|
4
7
|
underlying;
|
|
5
8
|
constructor(token, underlying) {
|
|
6
9
|
super(token);
|
|
@@ -9,21 +12,22 @@ export class WrappedToken extends Token {
|
|
|
9
12
|
/** The expected amount when wrapping `unwrappedAmount` */
|
|
10
13
|
toWrappedExactAmountIn(unwrappedAmount, slippage = 0n, rounding = "Down") {
|
|
11
14
|
const wrappedAmount = this._wrap(unwrappedAmount, rounding);
|
|
12
|
-
return MathLib.wMul(wrappedAmount, MathLib.WAD - slippage, "Down");
|
|
15
|
+
return index_js_1.MathLib.wMul(wrappedAmount, index_js_1.MathLib.WAD - slippage, "Down");
|
|
13
16
|
}
|
|
14
17
|
/** The amount of unwrappedTokens that should be wrapped to receive `wrappedAmount` */
|
|
15
18
|
toWrappedExactAmountOut(wrappedAmount, slippage = 0n, rounding = "Up") {
|
|
16
|
-
const wAmountTarget = MathLib.wDiv(wrappedAmount, MathLib.WAD - slippage, rounding);
|
|
19
|
+
const wAmountTarget = index_js_1.MathLib.wDiv(wrappedAmount, index_js_1.MathLib.WAD - slippage, rounding);
|
|
17
20
|
return this._unwrap(wAmountTarget, rounding);
|
|
18
21
|
}
|
|
19
22
|
/** The expected amount when unwrapping `wrappedAmount` */
|
|
20
23
|
toUnwrappedExactAmountIn(wrappedAmount, slippage = 0n, rounding = "Down") {
|
|
21
24
|
const unwrappedAmount = this._unwrap(wrappedAmount, rounding);
|
|
22
|
-
return MathLib.wMul(unwrappedAmount, MathLib.WAD - slippage, "Up");
|
|
25
|
+
return index_js_1.MathLib.wMul(unwrappedAmount, index_js_1.MathLib.WAD - slippage, "Up");
|
|
23
26
|
}
|
|
24
27
|
/** The amount of wrappedTokens that should be unwrapped to receive `unwrappedAmount` */
|
|
25
28
|
toUnwrappedExactAmountOut(unwrappedAmount, slippage = 0n, rounding = "Up") {
|
|
26
|
-
const unwrappedAmountToTarget = MathLib.wDiv(unwrappedAmount, MathLib.WAD - slippage, rounding);
|
|
29
|
+
const unwrappedAmountToTarget = index_js_1.MathLib.wDiv(unwrappedAmount, index_js_1.MathLib.WAD - slippage, rounding);
|
|
27
30
|
return this._wrap(unwrappedAmountToTarget, rounding);
|
|
28
31
|
}
|
|
29
32
|
}
|
|
33
|
+
exports.WrappedToken = WrappedToken;
|
package/lib/token/index.js
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./Token.js"), exports);
|
|
18
|
+
__exportStar(require("./WrappedToken.js"), exports);
|
|
19
|
+
__exportStar(require("./ConstantWrappedToken.js"), exports);
|
|
20
|
+
__exportStar(require("./ExchangeRateWrappedToken.js"), exports);
|
|
21
|
+
__exportStar(require("./VaultToken.js"), exports);
|
package/lib/types.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isMarketId = exports.TransactionType = void 0;
|
|
4
|
+
exports.isFetched = isFetched;
|
|
1
5
|
/**
|
|
2
6
|
* The possible transaction type on the Blue contract
|
|
3
7
|
*/
|
|
4
|
-
|
|
8
|
+
var TransactionType;
|
|
5
9
|
(function (TransactionType) {
|
|
6
10
|
TransactionType["Supply"] = "Supply";
|
|
7
11
|
TransactionType["SupplyCollateral"] = "Supply Collateral";
|
|
@@ -9,9 +13,10 @@ export var TransactionType;
|
|
|
9
13
|
TransactionType["WithdrawCollateral"] = "Withdraw Collateral";
|
|
10
14
|
TransactionType["Borrow"] = "Borrow";
|
|
11
15
|
TransactionType["Repay"] = "Repay";
|
|
12
|
-
})(TransactionType || (TransactionType = {}));
|
|
16
|
+
})(TransactionType || (exports.TransactionType = TransactionType = {}));
|
|
13
17
|
// TODO: replace with isDefined
|
|
14
|
-
|
|
18
|
+
function isFetched(v) {
|
|
15
19
|
return v !== undefined && v !== null;
|
|
16
20
|
}
|
|
17
|
-
|
|
21
|
+
const isMarketId = (value) => typeof value === "string" && /^0x[0-9A-Fa-f]{64}$/.test(value);
|
|
22
|
+
exports.isMarketId = isMarketId;
|
package/lib/user/User.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.User = void 0;
|
|
4
|
+
class User {
|
|
2
5
|
/**
|
|
3
6
|
* The user's address.
|
|
4
7
|
*/
|
|
@@ -17,3 +20,4 @@ export class User {
|
|
|
17
20
|
this.morphoNonce = morphoNonce;
|
|
18
21
|
}
|
|
19
22
|
}
|
|
23
|
+
exports.User = User;
|
package/lib/user/index.js
CHANGED
|
@@ -1 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./User.js"), exports);
|