@morpho-org/blue-sdk 4.8.1 → 4.9.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/lib/addresses.d.ts +639 -5
- package/lib/addresses.js +322 -9
- package/lib/chain.d.ts +233 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/market/Market.js +3 -3
- package/lib/market/MarketUtils.d.ts +7 -1
- package/lib/market/MarketUtils.js +13 -1
- package/lib/utils.d.ts +2 -0
- package/lib/utils.js +67 -0
- package/package.json +2 -2
|
@@ -3,8 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.MarketUtils = void 0;
|
|
4
4
|
const sha3_1 = require("@noble/hashes/sha3");
|
|
5
5
|
const utils_1 = require("@noble/hashes/utils");
|
|
6
|
+
const viem_1 = require("viem");
|
|
6
7
|
const constants_js_1 = require("../constants.js");
|
|
7
8
|
const index_js_1 = require("../math/index.js");
|
|
9
|
+
const utils_js_1 = require("../utils.js");
|
|
8
10
|
/**
|
|
9
11
|
* Namespace of utility functions to ease market-related calculations.
|
|
10
12
|
*/
|
|
@@ -63,14 +65,24 @@ var MarketUtils;
|
|
|
63
65
|
MarketUtils.getSupplyRate = getSupplyRate;
|
|
64
66
|
/**
|
|
65
67
|
* Returns the per-second rate continuously compounded over the given period, as calculated in Morpho Blue (scaled by WAD).
|
|
66
|
-
* If the period is 1 year, the compounded rate correspond to the Annual Percentage Yield (APY)
|
|
67
68
|
* @param rate The per-second rate to compound (scaled by WAD).
|
|
68
69
|
* @param period The period to compound the rate over (in seconds). Defaults to 1 year.
|
|
70
|
+
* @deprecated The compounded rate is inaccurate if rate * period >> 0. If interested in the APY, use `rateToApy` instead.
|
|
69
71
|
*/
|
|
70
72
|
function compoundRate(rate, period = constants_js_1.SECONDS_PER_YEAR) {
|
|
71
73
|
return index_js_1.MathLib.wTaylorCompounded(rate, period);
|
|
72
74
|
}
|
|
73
75
|
MarketUtils.compoundRate = compoundRate;
|
|
76
|
+
/**
|
|
77
|
+
* Returns the per-second rate continuously compounded over a year (scaled by WAD),
|
|
78
|
+
* as calculated in Morpho Blue assuming the market is frequently accrued onchain.
|
|
79
|
+
* @param rate The per-second rate to compound annually (scaled by WAD).
|
|
80
|
+
*/
|
|
81
|
+
// TODO: return a Number for APYs.
|
|
82
|
+
function rateToApy(rate) {
|
|
83
|
+
return (0, utils_js_1.safeParseNumber)(Math.expm1(+(0, viem_1.formatEther)(BigInt(rate) * constants_js_1.SECONDS_PER_YEAR)));
|
|
84
|
+
}
|
|
85
|
+
MarketUtils.rateToApy = rateToApy;
|
|
74
86
|
/**
|
|
75
87
|
* Returns the interest accrued on both sides of the given market
|
|
76
88
|
* as well as the supply shares minted to the fee recipient.
|
package/lib/utils.d.ts
ADDED
package/lib/utils.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.safeParseUnits = exports.safeParseNumber = void 0;
|
|
4
|
+
// Alternative to Number.toFixed that doesn't use scientific notation for excessively small or large numbers.
|
|
5
|
+
const toFixed = (x, decimals) => new Intl.NumberFormat("en-US", {
|
|
6
|
+
style: "decimal",
|
|
7
|
+
useGrouping: false,
|
|
8
|
+
maximumFractionDigits: decimals,
|
|
9
|
+
minimumFractionDigits: decimals,
|
|
10
|
+
}).format(x);
|
|
11
|
+
const safeParseNumber = (value, decimals = 18) => (0, exports.safeParseUnits)(toFixed(value, decimals), decimals);
|
|
12
|
+
exports.safeParseNumber = safeParseNumber;
|
|
13
|
+
const safeParseUnits = (strValue, decimals = 18) => {
|
|
14
|
+
if (!/[-+]?[0-9]*\.?[0-9]+/.test(strValue))
|
|
15
|
+
throw Error(`invalid number: ${strValue}`);
|
|
16
|
+
let [whole, dec = ""] = strValue.split(".");
|
|
17
|
+
dec = dec.slice(0, decimals);
|
|
18
|
+
return parseUnits([whole || "0", dec].filter((v) => v.length > 0).join("."), decimals);
|
|
19
|
+
};
|
|
20
|
+
exports.safeParseUnits = safeParseUnits;
|
|
21
|
+
/**
|
|
22
|
+
* Multiplies a string representation of a number by a given exponent of base 10 (10exponent).
|
|
23
|
+
*
|
|
24
|
+
* - Docs: https://viem.sh/docs/utilities/parseUnits
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* import { parseUnits } from 'viem'
|
|
28
|
+
*
|
|
29
|
+
* parseUnits('420', 9)
|
|
30
|
+
* // 420000000000n
|
|
31
|
+
*/
|
|
32
|
+
// TODO: get rid of this copy.
|
|
33
|
+
function parseUnits(value, decimals) {
|
|
34
|
+
let [integer, fraction = "0"] = value.split(".");
|
|
35
|
+
const negative = integer.startsWith("-");
|
|
36
|
+
if (negative)
|
|
37
|
+
integer = integer.slice(1);
|
|
38
|
+
// trim trailing zeros.
|
|
39
|
+
fraction = fraction.replace(/(0+)$/, "");
|
|
40
|
+
// round off if the fraction is larger than the number of decimals.
|
|
41
|
+
if (decimals === 0) {
|
|
42
|
+
if (Math.round(Number(`.${fraction}`)) === 1)
|
|
43
|
+
integer = `${BigInt(integer) + 1n}`;
|
|
44
|
+
fraction = "";
|
|
45
|
+
}
|
|
46
|
+
else if (fraction.length > decimals) {
|
|
47
|
+
const [left, unit, right] = [
|
|
48
|
+
fraction.slice(0, decimals - 1),
|
|
49
|
+
fraction.slice(decimals - 1, decimals),
|
|
50
|
+
fraction.slice(decimals),
|
|
51
|
+
];
|
|
52
|
+
const rounded = Math.round(Number(`${unit}.${right}`));
|
|
53
|
+
if (rounded > 9)
|
|
54
|
+
fraction = `${BigInt(left) + BigInt(1)}0`.padStart(left.length + 1, "0");
|
|
55
|
+
else
|
|
56
|
+
fraction = `${left}${rounded}`;
|
|
57
|
+
if (fraction.length > decimals) {
|
|
58
|
+
fraction = fraction.slice(1);
|
|
59
|
+
integer = `${BigInt(integer) + 1n}`;
|
|
60
|
+
}
|
|
61
|
+
fraction = fraction.slice(0, decimals);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
fraction = fraction.padEnd(decimals, "0");
|
|
65
|
+
}
|
|
66
|
+
return BigInt(`${negative ? "-" : ""}${integer}${fraction}`);
|
|
67
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@morpho-org/blue-sdk",
|
|
3
3
|
"description": "Framework-agnostic package that defines Morpho-related entity classes (such as `Market`, `Token`, `Vault`).",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.9.1",
|
|
5
5
|
"author": "Morpho Association <contact@morpho.org>",
|
|
6
6
|
"contributors": [
|
|
7
7
|
"Rubilmax <rmilon@gmail.com>"
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"viem": "^2.23.0",
|
|
33
33
|
"vitest": "^3.0.5",
|
|
34
34
|
"@morpho-org/morpho-ts": "^2.4.1",
|
|
35
|
-
"@morpho-org/test": "^2.1.
|
|
35
|
+
"@morpho-org/test": "^2.1.5"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"prepublish": "$npm_execpath build",
|