@1delta/margin-fetcher 0.0.232 → 0.0.234
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/dist/abis/silo-v2/InterestRateModelV2.d.ts +52 -0
- package/dist/abis/silo-v2/InterestRateModelV2.d.ts.map +1 -0
- package/dist/index.js +209 -49
- package/dist/index.js.map +1 -1
- package/dist/lending/public-data/fetchLender.d.ts.map +1 -1
- package/dist/lending/public-data/fetchLenderAll.d.ts.map +1 -1
- package/dist/lending/public-data/fetchLenderExt.d.ts.map +1 -1
- package/dist/lending/public-data/silo-v2/irmRates.d.ts +38 -0
- package/dist/lending/public-data/silo-v2/irmRates.d.ts.map +1 -0
- package/dist/lending/public-data/silo-v2/publicCallBuild.d.ts +15 -13
- package/dist/lending/public-data/silo-v2/publicCallBuild.d.ts.map +1 -1
- package/dist/lending/public-data/silo-v2/publicCallParse.d.ts.map +1 -1
- package/dist/lending/public-data/silo-v3/publicCallBuild.d.ts +10 -7
- package/dist/lending/public-data/silo-v3/publicCallBuild.d.ts.map +1 -1
- package/dist/lending/public-data/silo-v3/publicCallParse.d.ts.map +1 -1
- package/dist/prices/oracle-prices/fetchers/compoundV2.d.ts +2 -0
- package/dist/prices/oracle-prices/fetchers/compoundV2.d.ts.map +1 -1
- package/dist/prices/oracle-prices/fetchers/euler.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal ABI for Silo V2 (and V3 — identical shape) InterestRateModelV2.
|
|
3
|
+
*
|
|
4
|
+
* Only `getConfig(silo)` is needed for reserve-data rate derivation.
|
|
5
|
+
* Keeping this local avoids pulling in the full `@1delta/irm-sdk` just
|
|
6
|
+
* for a single ABI entry.
|
|
7
|
+
*/
|
|
8
|
+
export declare const InterestRateModelV2Abi: readonly [{
|
|
9
|
+
readonly type: "function";
|
|
10
|
+
readonly name: "getConfig";
|
|
11
|
+
readonly stateMutability: "view";
|
|
12
|
+
readonly inputs: readonly [{
|
|
13
|
+
readonly name: "_silo";
|
|
14
|
+
readonly type: "address";
|
|
15
|
+
}];
|
|
16
|
+
readonly outputs: readonly [{
|
|
17
|
+
readonly name: "";
|
|
18
|
+
readonly type: "tuple";
|
|
19
|
+
readonly components: readonly [{
|
|
20
|
+
readonly name: "uopt";
|
|
21
|
+
readonly type: "int256";
|
|
22
|
+
}, {
|
|
23
|
+
readonly name: "ucrit";
|
|
24
|
+
readonly type: "int256";
|
|
25
|
+
}, {
|
|
26
|
+
readonly name: "ulow";
|
|
27
|
+
readonly type: "int256";
|
|
28
|
+
}, {
|
|
29
|
+
readonly name: "klin";
|
|
30
|
+
readonly type: "int256";
|
|
31
|
+
}, {
|
|
32
|
+
readonly name: "ki";
|
|
33
|
+
readonly type: "int256";
|
|
34
|
+
}, {
|
|
35
|
+
readonly name: "kcrit";
|
|
36
|
+
readonly type: "int256";
|
|
37
|
+
}, {
|
|
38
|
+
readonly name: "klow";
|
|
39
|
+
readonly type: "int256";
|
|
40
|
+
}, {
|
|
41
|
+
readonly name: "beta";
|
|
42
|
+
readonly type: "int256";
|
|
43
|
+
}, {
|
|
44
|
+
readonly name: "ri";
|
|
45
|
+
readonly type: "int256";
|
|
46
|
+
}, {
|
|
47
|
+
readonly name: "Tcrit";
|
|
48
|
+
readonly type: "int256";
|
|
49
|
+
}];
|
|
50
|
+
}];
|
|
51
|
+
}];
|
|
52
|
+
//# sourceMappingURL=InterestRateModelV2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InterestRateModelV2.d.ts","sourceRoot":"","sources":["../../../src/abis/silo-v2/InterestRateModelV2.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBzB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -18709,8 +18709,36 @@ var SiloLensAbi = [
|
|
|
18709
18709
|
}
|
|
18710
18710
|
];
|
|
18711
18711
|
|
|
18712
|
+
// src/abis/silo-v2/InterestRateModelV2.ts
|
|
18713
|
+
var InterestRateModelV2Abi = [
|
|
18714
|
+
{
|
|
18715
|
+
type: "function",
|
|
18716
|
+
name: "getConfig",
|
|
18717
|
+
stateMutability: "view",
|
|
18718
|
+
inputs: [{ name: "_silo", type: "address" }],
|
|
18719
|
+
outputs: [
|
|
18720
|
+
{
|
|
18721
|
+
name: "",
|
|
18722
|
+
type: "tuple",
|
|
18723
|
+
components: [
|
|
18724
|
+
{ name: "uopt", type: "int256" },
|
|
18725
|
+
{ name: "ucrit", type: "int256" },
|
|
18726
|
+
{ name: "ulow", type: "int256" },
|
|
18727
|
+
{ name: "klin", type: "int256" },
|
|
18728
|
+
{ name: "ki", type: "int256" },
|
|
18729
|
+
{ name: "kcrit", type: "int256" },
|
|
18730
|
+
{ name: "klow", type: "int256" },
|
|
18731
|
+
{ name: "beta", type: "int256" },
|
|
18732
|
+
{ name: "ri", type: "int256" },
|
|
18733
|
+
{ name: "Tcrit", type: "int256" }
|
|
18734
|
+
]
|
|
18735
|
+
}
|
|
18736
|
+
]
|
|
18737
|
+
}
|
|
18738
|
+
];
|
|
18739
|
+
|
|
18712
18740
|
// src/lending/public-data/silo-v2/publicCallBuild.ts
|
|
18713
|
-
var SILO_V2_CALLS_PER_SIDE =
|
|
18741
|
+
var SILO_V2_CALLS_PER_SIDE = 3;
|
|
18714
18742
|
var SILO_V2_CALLS_PER_PAIR = SILO_V2_CALLS_PER_SIDE * 2;
|
|
18715
18743
|
function buildSiloV2LenderReserveCall(_chainId, lender) {
|
|
18716
18744
|
const market = getSiloV2MarketEntry(_chainId, lender);
|
|
@@ -18729,13 +18757,96 @@ function buildSiloV2LenderReserveCall(_chainId, lender) {
|
|
|
18729
18757
|
name: "getDebtAssets",
|
|
18730
18758
|
params: [],
|
|
18731
18759
|
abi: SiloAbi
|
|
18760
|
+
},
|
|
18761
|
+
{
|
|
18762
|
+
address: half.interestRateModel,
|
|
18763
|
+
name: "getConfig",
|
|
18764
|
+
params: [half.silo],
|
|
18765
|
+
abi: InterestRateModelV2Abi
|
|
18732
18766
|
}
|
|
18733
18767
|
);
|
|
18734
18768
|
}
|
|
18735
18769
|
return calls;
|
|
18736
18770
|
}
|
|
18737
18771
|
|
|
18772
|
+
// src/lending/public-data/silo-v2/irmRates.ts
|
|
18773
|
+
var DP = 1e18;
|
|
18774
|
+
var WAD = 1e18;
|
|
18775
|
+
var SECONDS_PER_YEAR4 = 365 * 24 * 3600;
|
|
18776
|
+
function toBigIntSafe(val) {
|
|
18777
|
+
if (typeof val === "bigint") return val;
|
|
18778
|
+
if (val == null || val === "0x") return 0n;
|
|
18779
|
+
try {
|
|
18780
|
+
return BigInt(val);
|
|
18781
|
+
} catch {
|
|
18782
|
+
return 0n;
|
|
18783
|
+
}
|
|
18784
|
+
}
|
|
18785
|
+
function parseIRMConfig(raw, half) {
|
|
18786
|
+
if (!raw || raw === "0x") return null;
|
|
18787
|
+
try {
|
|
18788
|
+
const uopt = toBigIntSafe(raw.uopt ?? raw[0]);
|
|
18789
|
+
const ucrit = toBigIntSafe(raw.ucrit ?? raw[1]);
|
|
18790
|
+
const ulow = toBigIntSafe(raw.ulow ?? raw[2]);
|
|
18791
|
+
const klin = toBigIntSafe(raw.klin ?? raw[3]);
|
|
18792
|
+
const ki = toBigIntSafe(raw.ki ?? raw[4]);
|
|
18793
|
+
const kcrit = toBigIntSafe(raw.kcrit ?? raw[5]);
|
|
18794
|
+
const klow = toBigIntSafe(raw.klow ?? raw[6]);
|
|
18795
|
+
const beta = toBigIntSafe(raw.beta ?? raw[7]);
|
|
18796
|
+
const ri = toBigIntSafe(raw.ri ?? raw[8]);
|
|
18797
|
+
const Tcrit = toBigIntSafe(raw.Tcrit ?? raw[9]);
|
|
18798
|
+
const daoFee = half.daoFee != null ? Number(BigInt(half.daoFee)) / WAD : void 0;
|
|
18799
|
+
const deployerFee = half.deployerFee != null ? Number(BigInt(half.deployerFee)) / WAD : void 0;
|
|
18800
|
+
return {
|
|
18801
|
+
uopt,
|
|
18802
|
+
ucrit,
|
|
18803
|
+
ulow,
|
|
18804
|
+
klin,
|
|
18805
|
+
ki,
|
|
18806
|
+
kcrit,
|
|
18807
|
+
klow,
|
|
18808
|
+
beta,
|
|
18809
|
+
ri,
|
|
18810
|
+
Tcrit,
|
|
18811
|
+
...daoFee != null ? { daoFee } : {},
|
|
18812
|
+
...deployerFee != null ? { deployerFee } : {}
|
|
18813
|
+
};
|
|
18814
|
+
} catch {
|
|
18815
|
+
return null;
|
|
18816
|
+
}
|
|
18817
|
+
}
|
|
18818
|
+
function calculateBorrowRate(utilization, params) {
|
|
18819
|
+
const uopt = Number(params.uopt) / DP;
|
|
18820
|
+
const ucrit = Number(params.ucrit) / DP;
|
|
18821
|
+
const ulow = Number(params.ulow) / DP;
|
|
18822
|
+
const klin = Number(params.klin) / DP;
|
|
18823
|
+
const ki = Number(params.ki) / DP;
|
|
18824
|
+
const kcrit = Number(params.kcrit) / DP;
|
|
18825
|
+
const klow = Number(params.klow) / DP;
|
|
18826
|
+
const ri = Number(params.ri) / DP;
|
|
18827
|
+
const Tcrit = Number(params.Tcrit) / DP;
|
|
18828
|
+
const beta = Number(params.beta) / DP;
|
|
18829
|
+
const u = utilization;
|
|
18830
|
+
const T = 0;
|
|
18831
|
+
const rp = u > ucrit ? kcrit * (1 + Tcrit + beta * T) * (u - ucrit) : Math.min(0, klow * (u - ulow));
|
|
18832
|
+
const rlin = klin * u;
|
|
18833
|
+
let riEff = Math.max(ri, rlin);
|
|
18834
|
+
riEff = Math.max(riEff + ki * (u - uopt) * T, rlin);
|
|
18835
|
+
const rcurPerSecond = Math.max(riEff + rp, rlin);
|
|
18836
|
+
const rcurAnnual = rcurPerSecond * SECONDS_PER_YEAR4;
|
|
18837
|
+
return Math.min(Math.max(rcurAnnual * 100, 0), 1e4);
|
|
18838
|
+
}
|
|
18839
|
+
function calculateSiloRates(utilization, params) {
|
|
18840
|
+
const borrowRate = calculateBorrowRate(utilization, params);
|
|
18841
|
+
const daoFee = params.daoFee ?? 0;
|
|
18842
|
+
const deployerFee = params.deployerFee ?? 0;
|
|
18843
|
+
const totalFee = daoFee + deployerFee;
|
|
18844
|
+
const depositRate = borrowRate / 100 * utilization * (1 - totalFee) * 100;
|
|
18845
|
+
return { borrowRate, depositRate };
|
|
18846
|
+
}
|
|
18847
|
+
|
|
18738
18848
|
// src/lending/public-data/silo-v2/publicCallParse.ts
|
|
18849
|
+
var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
18739
18850
|
var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields, tokenList = {}) => {
|
|
18740
18851
|
const market = getSiloV2MarketEntry(chainId, lender);
|
|
18741
18852
|
if (!market) return [() => void 0, 0];
|
|
@@ -18761,13 +18872,23 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
18761
18872
|
const slot = s * SILO_V2_CALLS_PER_SIDE;
|
|
18762
18873
|
const totalAssetsRaw = toBigInt7(data[slot]);
|
|
18763
18874
|
const debtAssetsRaw = toBigInt7(data[slot + 1]);
|
|
18875
|
+
const irmConfigRaw = data[slot + 2];
|
|
18764
18876
|
const decimals = self.decimals;
|
|
18765
18877
|
const totalDeposits = Number(formatUnits(totalAssetsRaw, decimals));
|
|
18766
18878
|
const totalDebt = Number(formatUnits(debtAssetsRaw, decimals));
|
|
18767
18879
|
const totalLiquidity = totalDeposits - totalDebt;
|
|
18768
18880
|
const utilization = totalDeposits > 0 ? totalDebt / totalDeposits : 0;
|
|
18769
|
-
|
|
18770
|
-
|
|
18881
|
+
let depositRatePct = 0;
|
|
18882
|
+
let variableBorrowRatePct = 0;
|
|
18883
|
+
const irmParams = parseIRMConfig(irmConfigRaw, self);
|
|
18884
|
+
if (irmParams) {
|
|
18885
|
+
try {
|
|
18886
|
+
const rates = calculateSiloRates(utilization, irmParams);
|
|
18887
|
+
variableBorrowRatePct = rates.borrowRate;
|
|
18888
|
+
depositRatePct = rates.depositRate;
|
|
18889
|
+
} catch {
|
|
18890
|
+
}
|
|
18891
|
+
}
|
|
18771
18892
|
const tokenAddrLc = self.token.toLowerCase();
|
|
18772
18893
|
const assetMeta = tokenList[tokenAddrLc];
|
|
18773
18894
|
const oracleKey = toOracleKey(assetMeta?.assetGroup ?? null) || toGenericPriceKey(tokenAddrLc, chainId);
|
|
@@ -18837,8 +18958,8 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
18837
18958
|
silo: self.silo,
|
|
18838
18959
|
counterpartySilo: other.silo,
|
|
18839
18960
|
siloConfig: market.siloConfig,
|
|
18840
|
-
oracle: self.solvencyOracle,
|
|
18841
|
-
irm: self.interestRateModel,
|
|
18961
|
+
oracle: self.solvencyOracle || ZERO_ADDRESS,
|
|
18962
|
+
irm: self.interestRateModel || ZERO_ADDRESS,
|
|
18842
18963
|
shareTokens: {
|
|
18843
18964
|
collateral: self.collateralShareToken,
|
|
18844
18965
|
protected: self.protectedShareToken,
|
|
@@ -18861,7 +18982,7 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
18861
18982
|
};
|
|
18862
18983
|
|
|
18863
18984
|
// src/lending/public-data/silo-v3/publicCallBuild.ts
|
|
18864
|
-
var SILO_V3_CALLS_PER_SIDE =
|
|
18985
|
+
var SILO_V3_CALLS_PER_SIDE = 3;
|
|
18865
18986
|
var SILO_V3_CALLS_PER_PAIR = SILO_V3_CALLS_PER_SIDE * 2;
|
|
18866
18987
|
function buildSiloV3LenderReserveCall(_chainId, lender) {
|
|
18867
18988
|
const market = getSiloV3MarketEntry(_chainId, lender);
|
|
@@ -18880,6 +19001,12 @@ function buildSiloV3LenderReserveCall(_chainId, lender) {
|
|
|
18880
19001
|
name: "getDebtAssets",
|
|
18881
19002
|
params: [],
|
|
18882
19003
|
abi: SiloAbi
|
|
19004
|
+
},
|
|
19005
|
+
{
|
|
19006
|
+
address: half.interestRateModel,
|
|
19007
|
+
name: "getConfig",
|
|
19008
|
+
params: [half.silo],
|
|
19009
|
+
abi: InterestRateModelV2Abi
|
|
18883
19010
|
}
|
|
18884
19011
|
);
|
|
18885
19012
|
}
|
|
@@ -18887,7 +19014,7 @@ function buildSiloV3LenderReserveCall(_chainId, lender) {
|
|
|
18887
19014
|
}
|
|
18888
19015
|
|
|
18889
19016
|
// src/lending/public-data/silo-v3/publicCallParse.ts
|
|
18890
|
-
var
|
|
19017
|
+
var ZERO_ADDRESS2 = "0x0000000000000000000000000000000000000000";
|
|
18891
19018
|
var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields, tokenList = {}) => {
|
|
18892
19019
|
const market = getSiloV3MarketEntry(chainId, lender);
|
|
18893
19020
|
if (!market) return [() => void 0, 0];
|
|
@@ -18913,13 +19040,23 @@ var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
18913
19040
|
const slot = s * SILO_V3_CALLS_PER_SIDE;
|
|
18914
19041
|
const totalAssetsRaw = toBigInt7(data[slot]);
|
|
18915
19042
|
const debtAssetsRaw = toBigInt7(data[slot + 1]);
|
|
19043
|
+
const irmConfigRaw = data[slot + 2];
|
|
18916
19044
|
const decimals = self.decimals;
|
|
18917
19045
|
const totalDeposits = Number(formatUnits(totalAssetsRaw, decimals));
|
|
18918
19046
|
const totalDebt = Number(formatUnits(debtAssetsRaw, decimals));
|
|
18919
19047
|
const totalLiquidity = totalDeposits - totalDebt;
|
|
18920
19048
|
const utilization = totalDeposits > 0 ? totalDebt / totalDeposits : 0;
|
|
18921
|
-
|
|
18922
|
-
|
|
19049
|
+
let depositRatePct = 0;
|
|
19050
|
+
let variableBorrowRatePct = 0;
|
|
19051
|
+
const irmParams = parseIRMConfig(irmConfigRaw, self);
|
|
19052
|
+
if (irmParams) {
|
|
19053
|
+
try {
|
|
19054
|
+
const rates = calculateSiloRates(utilization, irmParams);
|
|
19055
|
+
variableBorrowRatePct = rates.borrowRate;
|
|
19056
|
+
depositRatePct = rates.depositRate;
|
|
19057
|
+
} catch {
|
|
19058
|
+
}
|
|
19059
|
+
}
|
|
18923
19060
|
const tokenAddrLc = self.token.toLowerCase();
|
|
18924
19061
|
const assetMeta = tokenList[tokenAddrLc];
|
|
18925
19062
|
const oracleKey = toOracleKey(assetMeta?.assetGroup ?? null) || toGenericPriceKey(tokenAddrLc, chainId);
|
|
@@ -18981,8 +19118,8 @@ var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
18981
19118
|
silo: self.silo,
|
|
18982
19119
|
counterpartySilo: other.silo,
|
|
18983
19120
|
siloConfig: market.siloConfig,
|
|
18984
|
-
oracle: self.solvencyOracle ||
|
|
18985
|
-
irm: self.interestRateModel ||
|
|
19121
|
+
oracle: self.solvencyOracle || ZERO_ADDRESS2,
|
|
19122
|
+
irm: self.interestRateModel || ZERO_ADDRESS2,
|
|
18986
19123
|
shareTokens: {
|
|
18987
19124
|
collateral: self.collateralShareToken,
|
|
18988
19125
|
protected: self.protectedShareToken,
|
|
@@ -19145,8 +19282,10 @@ var getAbi = (lender) => {
|
|
|
19145
19282
|
if (isMorphoType(lender)) return MorphoLensAbi;
|
|
19146
19283
|
if (isEulerType(lender)) return vaultLensAbi;
|
|
19147
19284
|
if (isAaveV4Type(lender)) return [...AaveV4SpokeAbi, ...AaveV4OracleAbi, ...AaveV4HubAbi];
|
|
19148
|
-
if (isSiloV2Type(lender))
|
|
19149
|
-
|
|
19285
|
+
if (isSiloV2Type(lender))
|
|
19286
|
+
return [...SiloAbi, ...SiloLensAbi, ...InterestRateModelV2Abi];
|
|
19287
|
+
if (isSiloV3Type(lender))
|
|
19288
|
+
return [...SiloAbi, ...SiloLensAbi, ...InterestRateModelV2Abi];
|
|
19150
19289
|
if (isSumerType(lender)) return [...SumerLensAbi, ...SumerComptrollerAbi];
|
|
19151
19290
|
if (lender === Lender.TAKARA) return [...TakaraMarketStateAbi];
|
|
19152
19291
|
if (isCompoundV2Type(lender)) return VenusLensAbi;
|
|
@@ -19200,7 +19339,6 @@ var getLenderPublicData = async (chainId, lenders, prices, additionalYields, mul
|
|
|
19200
19339
|
}
|
|
19201
19340
|
}
|
|
19202
19341
|
} catch {
|
|
19203
|
-
console.log("error for chain/lender", chainId, lender);
|
|
19204
19342
|
}
|
|
19205
19343
|
currentSlice += sliceLength;
|
|
19206
19344
|
}
|
|
@@ -19530,7 +19668,7 @@ function bigintToLtv(v) {
|
|
|
19530
19668
|
}
|
|
19531
19669
|
|
|
19532
19670
|
// src/lending/public-data/silo-v3/convertPublic.ts
|
|
19533
|
-
var
|
|
19671
|
+
var ZERO_ADDRESS3 = "0x0000000000000000000000000000000000000000";
|
|
19534
19672
|
function convertSiloV3MarketsToPublicResponse(apiItems, chainId, prices, additionalYields = {
|
|
19535
19673
|
intrinsicYields: {},
|
|
19536
19674
|
lenderRewards: {},
|
|
@@ -19627,8 +19765,8 @@ function convertSiloV3MarketsToPublicResponse(apiItems, chainId, prices, additio
|
|
|
19627
19765
|
silo: self.silo.toLowerCase(),
|
|
19628
19766
|
counterpartySilo: other.silo.toLowerCase(),
|
|
19629
19767
|
siloConfig: registryEntry.siloConfig.toLowerCase(),
|
|
19630
|
-
oracle: (api.solvencyOracleAddress || self.solvencyOracle ||
|
|
19631
|
-
irm: (api.interestRateModelId || self.interestRateModel ||
|
|
19768
|
+
oracle: (api.solvencyOracleAddress || self.solvencyOracle || ZERO_ADDRESS3).toLowerCase(),
|
|
19769
|
+
irm: (api.interestRateModelId || self.interestRateModel || ZERO_ADDRESS3).toLowerCase(),
|
|
19632
19770
|
shareTokens: {
|
|
19633
19771
|
collateral: self.collateralShareToken,
|
|
19634
19772
|
protected: self.protectedShareToken,
|
|
@@ -19662,8 +19800,8 @@ function bigintToLtv2(v) {
|
|
|
19662
19800
|
return Number.isFinite(n) ? n / 1e18 : 0;
|
|
19663
19801
|
}
|
|
19664
19802
|
}
|
|
19665
|
-
|
|
19666
|
-
|
|
19803
|
+
var warn = (...args) => {
|
|
19804
|
+
};
|
|
19667
19805
|
async function getLenderDataFromApi(lender, chainId, prices, additionalYields, includeUnlisted = false) {
|
|
19668
19806
|
if (isMorphoType(lender))
|
|
19669
19807
|
return await fetchMorphoMarkets(chainId, includeUnlisted);
|
|
@@ -19709,7 +19847,7 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
|
|
|
19709
19847
|
const listResult = settled[0];
|
|
19710
19848
|
const list = listResult.status === "fulfilled" ? listResult.value : {};
|
|
19711
19849
|
if (listResult.status === "rejected") {
|
|
19712
|
-
|
|
19850
|
+
warn(
|
|
19713
19851
|
`[lending] tokenList fetch failed on chain ${chainId}:`,
|
|
19714
19852
|
listResult.reason
|
|
19715
19853
|
);
|
|
@@ -19731,13 +19869,13 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
|
|
|
19731
19869
|
if (converted[lk]) lenderData[lk] = converted[lk];
|
|
19732
19870
|
}
|
|
19733
19871
|
} catch (e) {
|
|
19734
|
-
|
|
19872
|
+
warn(
|
|
19735
19873
|
`[lending] Silo v2 API convert failed on chain ${chainId}:`,
|
|
19736
19874
|
e?.message ?? e
|
|
19737
19875
|
);
|
|
19738
19876
|
}
|
|
19739
19877
|
} else {
|
|
19740
|
-
|
|
19878
|
+
warn(
|
|
19741
19879
|
`[lending] Silo v2 API fetch failed on chain ${chainId}:`,
|
|
19742
19880
|
siloV2Result.reason?.message ?? siloV2Result.reason
|
|
19743
19881
|
);
|
|
@@ -19759,13 +19897,13 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
|
|
|
19759
19897
|
if (converted[lk]) lenderData[lk] = converted[lk];
|
|
19760
19898
|
}
|
|
19761
19899
|
} catch (e) {
|
|
19762
|
-
|
|
19900
|
+
warn(
|
|
19763
19901
|
`[lending] Silo v3 API convert failed on chain ${chainId}:`,
|
|
19764
19902
|
e?.message ?? e
|
|
19765
19903
|
);
|
|
19766
19904
|
}
|
|
19767
19905
|
} else {
|
|
19768
|
-
|
|
19906
|
+
warn(
|
|
19769
19907
|
`[lending] Silo v3 API fetch failed on chain ${chainId}:`,
|
|
19770
19908
|
siloV3Result.reason?.message ?? siloV3Result.reason
|
|
19771
19909
|
);
|
|
@@ -19775,7 +19913,7 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
|
|
|
19775
19913
|
try {
|
|
19776
19914
|
const result = settled[i + 3];
|
|
19777
19915
|
if (result.status === "rejected") {
|
|
19778
|
-
|
|
19916
|
+
warn(
|
|
19779
19917
|
`[lending] API fetch failed for ${otherLenders[i]} on chain ${chainId}:`,
|
|
19780
19918
|
result.reason?.message ?? result.reason
|
|
19781
19919
|
);
|
|
@@ -19804,11 +19942,12 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
|
|
|
19804
19942
|
);
|
|
19805
19943
|
}
|
|
19806
19944
|
} catch (e) {
|
|
19807
|
-
console.log("error fetching from API on", chainId, ":", e);
|
|
19808
19945
|
}
|
|
19809
19946
|
}
|
|
19810
19947
|
return lenderData;
|
|
19811
19948
|
};
|
|
19949
|
+
var warn2 = (...args) => {
|
|
19950
|
+
};
|
|
19812
19951
|
function lenderApiOnly(lender, chainId) {
|
|
19813
19952
|
if (lender === Lender.MORPHO_BLUE) {
|
|
19814
19953
|
if (chainId === Chain.SONEIUM) return false;
|
|
@@ -19842,7 +19981,7 @@ var getLenderPublicDataAll = async (chainId, lenders, prices, additionalYields,
|
|
|
19842
19981
|
includeUnlistedMorphoMarkets
|
|
19843
19982
|
);
|
|
19844
19983
|
} catch (e) {
|
|
19845
|
-
|
|
19984
|
+
warn2(
|
|
19846
19985
|
`[lending] API fetch failed for chain ${chainId}:`,
|
|
19847
19986
|
e?.message ?? e
|
|
19848
19987
|
);
|
|
@@ -19865,7 +20004,7 @@ var getLenderPublicDataAll = async (chainId, lenders, prices, additionalYields,
|
|
|
19865
20004
|
tokenList
|
|
19866
20005
|
);
|
|
19867
20006
|
} catch (e) {
|
|
19868
|
-
|
|
20007
|
+
warn2(
|
|
19869
20008
|
`[lending] on-chain fetch failed for chain ${chainId}:`,
|
|
19870
20009
|
e?.message ?? e
|
|
19871
20010
|
);
|
|
@@ -30176,6 +30315,12 @@ var morphoFetcher = {
|
|
|
30176
30315
|
var SCALING_DECIMALS_OVERRIDES = {
|
|
30177
30316
|
[Lender.SUMER]: 18
|
|
30178
30317
|
};
|
|
30318
|
+
var BASE_ASSET_OVERRIDES = {
|
|
30319
|
+
[Lender.CREAM_FINANCE]: {
|
|
30320
|
+
[Chain.BNB_SMART_CHAIN_MAINNET]: { baseAsset: zeroAddress }
|
|
30321
|
+
// BNB
|
|
30322
|
+
}
|
|
30323
|
+
};
|
|
30179
30324
|
var CompoundV2OracleAbi = [
|
|
30180
30325
|
{
|
|
30181
30326
|
inputs: [{ internalType: "address", name: "cToken", type: "address" }],
|
|
@@ -30195,6 +30340,7 @@ function getCompoundV2Calls(chainId) {
|
|
|
30195
30340
|
if (!oracleAddress || tokens.length === 0) continue;
|
|
30196
30341
|
const calls = [];
|
|
30197
30342
|
const meta = [];
|
|
30343
|
+
const baseAssetOverride = BASE_ASSET_OVERRIDES[lender]?.[chainId]?.baseAsset;
|
|
30198
30344
|
for (const token of tokens) {
|
|
30199
30345
|
calls.push({
|
|
30200
30346
|
address: oracleAddress,
|
|
@@ -30204,7 +30350,8 @@ function getCompoundV2Calls(chainId) {
|
|
|
30204
30350
|
meta.push({
|
|
30205
30351
|
cToken: token.cToken,
|
|
30206
30352
|
underlying: token.underlying,
|
|
30207
|
-
lender
|
|
30353
|
+
lender,
|
|
30354
|
+
baseAssetOverride
|
|
30208
30355
|
});
|
|
30209
30356
|
}
|
|
30210
30357
|
if (calls.length > 0) {
|
|
@@ -30218,7 +30365,7 @@ function getCompoundV2Calls(chainId) {
|
|
|
30218
30365
|
return results;
|
|
30219
30366
|
}
|
|
30220
30367
|
function parseCompoundV2Results(data, meta, context) {
|
|
30221
|
-
const { tokenList } = context;
|
|
30368
|
+
const { chainId, tokenList, usdPrices } = context;
|
|
30222
30369
|
const entries = [];
|
|
30223
30370
|
data.forEach((rawResult, index) => {
|
|
30224
30371
|
const queryMeta = meta[index];
|
|
@@ -30227,14 +30374,25 @@ function parseCompoundV2Results(data, meta, context) {
|
|
|
30227
30374
|
const underlyingLc = queryMeta.underlying.toLowerCase();
|
|
30228
30375
|
const underlyingDecimals = tokenList?.[underlyingLc]?.decimals ?? 18;
|
|
30229
30376
|
const scalingDecimals = SCALING_DECIMALS_OVERRIDES[queryMeta.lender] ?? 36 - underlyingDecimals;
|
|
30230
|
-
const
|
|
30231
|
-
|
|
30377
|
+
const rawPriceNum = Number(
|
|
30378
|
+
formatUnits(BigInt(rawResult.toString()), scalingDecimals)
|
|
30379
|
+
);
|
|
30380
|
+
if (isNaN(rawPriceNum) || rawPriceNum === 0) return;
|
|
30381
|
+
let baseAssetUSD = 1;
|
|
30382
|
+
if (queryMeta.baseAssetOverride) {
|
|
30383
|
+
const baseAssetLc = queryMeta.baseAssetOverride.toLowerCase();
|
|
30384
|
+
const baseOracleKey = tokenList?.[baseAssetLc]?.assetGroup ?? `${chainId}-${baseAssetLc}`;
|
|
30385
|
+
baseAssetUSD = usdPrices[baseOracleKey] ?? usdPrices[baseAssetLc] ?? 1;
|
|
30386
|
+
}
|
|
30387
|
+
const priceUSD = rawPriceNum * baseAssetUSD;
|
|
30388
|
+
const isBaseAsset = queryMeta.baseAssetOverride && underlyingLc === queryMeta.baseAssetOverride.toLowerCase();
|
|
30232
30389
|
entries.push({
|
|
30233
30390
|
asset: underlyingLc,
|
|
30234
|
-
price:
|
|
30235
|
-
// For Compound V2, raw price is already USD denominated
|
|
30391
|
+
price: rawPriceNum,
|
|
30236
30392
|
priceUSD,
|
|
30237
|
-
marketUid: createMarketUid(
|
|
30393
|
+
marketUid: createMarketUid(chainId, queryMeta.lender, queryMeta.cToken),
|
|
30394
|
+
staticBase: isBaseAsset || void 0,
|
|
30395
|
+
baseAsset: queryMeta.baseAssetOverride
|
|
30238
30396
|
});
|
|
30239
30397
|
} catch {
|
|
30240
30398
|
}
|
|
@@ -30493,6 +30651,7 @@ var priceLensAbi = [
|
|
|
30493
30651
|
|
|
30494
30652
|
// src/prices/oracle-prices/fetchers/euler.ts
|
|
30495
30653
|
var MAX_VIRTUAL_ADDRESS = 65535;
|
|
30654
|
+
var MAX_SANE_PRICE_USD = 1e7;
|
|
30496
30655
|
function isUsdUnitOfAccount(addr) {
|
|
30497
30656
|
const numeric = parseInt(addr, 16);
|
|
30498
30657
|
return numeric <= MAX_VIRTUAL_ADDRESS;
|
|
@@ -30599,6 +30758,7 @@ function parseEulerV2Results(data, meta, context) {
|
|
|
30599
30758
|
priceUSD = priceInUoA * uoaUSD;
|
|
30600
30759
|
}
|
|
30601
30760
|
if (isNaN(priceUSD) || priceUSD === 0) return;
|
|
30761
|
+
if (priceUSD > MAX_SANE_PRICE_USD) return;
|
|
30602
30762
|
entries.push({
|
|
30603
30763
|
asset,
|
|
30604
30764
|
price: priceInUoA,
|
|
@@ -30729,7 +30889,7 @@ var SiloOracleAbi = [
|
|
|
30729
30889
|
type: "function"
|
|
30730
30890
|
}
|
|
30731
30891
|
];
|
|
30732
|
-
var
|
|
30892
|
+
var ZERO_ADDRESS4 = "0x0000000000000000000000000000000000000000";
|
|
30733
30893
|
function lookupUSD(context, asset) {
|
|
30734
30894
|
const lc = asset.toLowerCase();
|
|
30735
30895
|
const groupKey = context.tokenList?.[lc]?.assetGroup ?? `${context.chainId}-${lc}`;
|
|
@@ -30741,7 +30901,7 @@ function getSiloV2Calls(chainId) {
|
|
|
30741
30901
|
const tokensWithRealOracle = /* @__PURE__ */ new Set();
|
|
30742
30902
|
for (const market of allMarkets) {
|
|
30743
30903
|
for (const half of [market.silo0, market.silo1]) {
|
|
30744
|
-
if (half.solvencyOracle && half.solvencyOracle !==
|
|
30904
|
+
if (half.solvencyOracle && half.solvencyOracle !== ZERO_ADDRESS4) {
|
|
30745
30905
|
tokensWithRealOracle.add(half.token.toLowerCase());
|
|
30746
30906
|
}
|
|
30747
30907
|
}
|
|
@@ -30754,7 +30914,7 @@ function getSiloV2Calls(chainId) {
|
|
|
30754
30914
|
const lenderKey = siloV2LenderKey(market.siloConfig);
|
|
30755
30915
|
const halves = [market.silo0, market.silo1];
|
|
30756
30916
|
const isStatic = halves.map(
|
|
30757
|
-
(h) => !h.solvencyOracle || h.solvencyOracle ===
|
|
30917
|
+
(h) => !h.solvencyOracle || h.solvencyOracle === ZERO_ADDRESS4
|
|
30758
30918
|
);
|
|
30759
30919
|
if (isStatic[0] && isStatic[1]) {
|
|
30760
30920
|
const t0 = halves[0].token.toLowerCase();
|
|
@@ -30774,7 +30934,7 @@ function getSiloV2Calls(chainId) {
|
|
|
30774
30934
|
decimals: half.decimals,
|
|
30775
30935
|
silo: half.silo.toLowerCase(),
|
|
30776
30936
|
lenderKey,
|
|
30777
|
-
oracle:
|
|
30937
|
+
oracle: ZERO_ADDRESS4,
|
|
30778
30938
|
partnerToken: partnerLc,
|
|
30779
30939
|
isStatic: true
|
|
30780
30940
|
});
|
|
@@ -30900,7 +31060,7 @@ var SiloOracleAbi2 = [
|
|
|
30900
31060
|
type: "function"
|
|
30901
31061
|
}
|
|
30902
31062
|
];
|
|
30903
|
-
var
|
|
31063
|
+
var ZERO_ADDRESS5 = "0x0000000000000000000000000000000000000000";
|
|
30904
31064
|
function lookupUSD2(context, asset) {
|
|
30905
31065
|
const lc = asset.toLowerCase();
|
|
30906
31066
|
const groupKey = context.tokenList?.[lc]?.assetGroup ?? `${context.chainId}-${lc}`;
|
|
@@ -30912,7 +31072,7 @@ function getSiloV3Calls(chainId) {
|
|
|
30912
31072
|
const tokensWithRealOracle = /* @__PURE__ */ new Set();
|
|
30913
31073
|
for (const market of allMarkets) {
|
|
30914
31074
|
for (const half of [market.silo0, market.silo1]) {
|
|
30915
|
-
if (half.solvencyOracle && half.solvencyOracle !==
|
|
31075
|
+
if (half.solvencyOracle && half.solvencyOracle !== ZERO_ADDRESS5) {
|
|
30916
31076
|
tokensWithRealOracle.add(half.token.toLowerCase());
|
|
30917
31077
|
}
|
|
30918
31078
|
}
|
|
@@ -30925,7 +31085,7 @@ function getSiloV3Calls(chainId) {
|
|
|
30925
31085
|
const lenderKey = siloV3LenderKey(market.siloConfig);
|
|
30926
31086
|
const halves = [market.silo0, market.silo1];
|
|
30927
31087
|
const isStatic = halves.map(
|
|
30928
|
-
(h) => !h.solvencyOracle || h.solvencyOracle ===
|
|
31088
|
+
(h) => !h.solvencyOracle || h.solvencyOracle === ZERO_ADDRESS5
|
|
30929
31089
|
);
|
|
30930
31090
|
if (isStatic[0] && isStatic[1]) {
|
|
30931
31091
|
const t0 = halves[0].token.toLowerCase();
|
|
@@ -30945,7 +31105,7 @@ function getSiloV3Calls(chainId) {
|
|
|
30945
31105
|
decimals: half.decimals,
|
|
30946
31106
|
silo: half.silo.toLowerCase(),
|
|
30947
31107
|
lenderKey,
|
|
30948
|
-
oracle:
|
|
31108
|
+
oracle: ZERO_ADDRESS5,
|
|
30949
31109
|
partnerToken: partnerLc,
|
|
30950
31110
|
isStatic: true
|
|
30951
31111
|
});
|
|
@@ -31121,7 +31281,7 @@ function lookupUSD3(context, asset) {
|
|
|
31121
31281
|
return context.usdPrices[groupKey] ?? context.usdPrices[lc] ?? 0;
|
|
31122
31282
|
}
|
|
31123
31283
|
function parseSiloV2GraphQLResults(items, context) {
|
|
31124
|
-
const
|
|
31284
|
+
const ZERO_ADDRESS6 = "0x0000000000000000000000000000000000000000";
|
|
31125
31285
|
const out = [];
|
|
31126
31286
|
const seen = /* @__PURE__ */ new Set();
|
|
31127
31287
|
for (const item of items) {
|
|
@@ -31144,8 +31304,8 @@ function parseSiloV2GraphQLResults(items, context) {
|
|
|
31144
31304
|
const partnerTokenLc = other.token.toLowerCase();
|
|
31145
31305
|
const dedupKey = `${lenderKey}:${tokenLc}`;
|
|
31146
31306
|
if (seen.has(dedupKey)) continue;
|
|
31147
|
-
const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ??
|
|
31148
|
-
const isStatic = !oracleAddr || oracleAddr ===
|
|
31307
|
+
const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ?? ZERO_ADDRESS6).toLowerCase();
|
|
31308
|
+
const isStatic = !oracleAddr || oracleAddr === ZERO_ADDRESS6;
|
|
31149
31309
|
const siloAddrLc = self.silo.toLowerCase();
|
|
31150
31310
|
try {
|
|
31151
31311
|
let priceUSD = 0;
|
|
@@ -31265,7 +31425,7 @@ function lookupUSD4(context, asset) {
|
|
|
31265
31425
|
return context.usdPrices[groupKey] ?? context.usdPrices[lc] ?? 0;
|
|
31266
31426
|
}
|
|
31267
31427
|
function parseSiloV3GraphQLResults(items, context) {
|
|
31268
|
-
const
|
|
31428
|
+
const ZERO_ADDRESS6 = "0x0000000000000000000000000000000000000000";
|
|
31269
31429
|
const out = [];
|
|
31270
31430
|
const seen = /* @__PURE__ */ new Set();
|
|
31271
31431
|
for (const item of items) {
|
|
@@ -31288,8 +31448,8 @@ function parseSiloV3GraphQLResults(items, context) {
|
|
|
31288
31448
|
const partnerTokenLc = other.token.toLowerCase();
|
|
31289
31449
|
const dedupKey = `${lenderKey}:${tokenLc}`;
|
|
31290
31450
|
if (seen.has(dedupKey)) continue;
|
|
31291
|
-
const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ??
|
|
31292
|
-
const isStatic = !oracleAddr || oracleAddr ===
|
|
31451
|
+
const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ?? ZERO_ADDRESS6).toLowerCase();
|
|
31452
|
+
const isStatic = !oracleAddr || oracleAddr === ZERO_ADDRESS6;
|
|
31293
31453
|
const siloAddrLc = self.silo.toLowerCase();
|
|
31294
31454
|
try {
|
|
31295
31455
|
let priceUSD = 0;
|