curvance 4.1.2 → 5.1.0
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 +65 -10
- package/dist/abis/OptimizerReader.json +43 -45
- package/dist/abis/ProtocolReader.json +279 -55
- package/dist/chains/arbitrum.js +3 -3
- package/dist/chains/arbitrum.js.map +1 -1
- package/dist/classes/Api.d.ts +2 -2
- package/dist/classes/Api.d.ts.map +1 -1
- package/dist/classes/Api.js +87 -14
- package/dist/classes/Api.js.map +1 -1
- package/dist/classes/BorrowableCToken.d.ts +9 -1
- package/dist/classes/BorrowableCToken.d.ts.map +1 -1
- package/dist/classes/BorrowableCToken.js +67 -12
- package/dist/classes/BorrowableCToken.js.map +1 -1
- package/dist/classes/CToken.d.ts +210 -21
- package/dist/classes/CToken.d.ts.map +1 -1
- package/dist/classes/CToken.js +692 -284
- package/dist/classes/CToken.js.map +1 -1
- package/dist/classes/Calldata.d.ts +2 -2
- package/dist/classes/Calldata.d.ts.map +1 -1
- package/dist/classes/Calldata.js +6 -2
- package/dist/classes/Calldata.js.map +1 -1
- package/dist/classes/DexAggregators/IDexAgg.d.ts +1 -1
- package/dist/classes/DexAggregators/Kuru.js +1 -1
- package/dist/classes/DexAggregators/Kuru.js.map +1 -1
- package/dist/classes/DexAggregators/KyberSwap.d.ts.map +1 -1
- package/dist/classes/DexAggregators/KyberSwap.js +112 -61
- package/dist/classes/DexAggregators/KyberSwap.js.map +1 -1
- package/dist/classes/DexAggregators/MultiDexAgg.d.ts +2 -2
- package/dist/classes/DexAggregators/MultiDexAgg.d.ts.map +1 -1
- package/dist/classes/DexAggregators/MultiDexAgg.js +30 -18
- package/dist/classes/DexAggregators/MultiDexAgg.js.map +1 -1
- package/dist/classes/DexAggregators/UnsupportedDexAgg.d.ts +19 -0
- package/dist/classes/DexAggregators/UnsupportedDexAgg.d.ts.map +1 -0
- package/dist/classes/DexAggregators/UnsupportedDexAgg.js +29 -0
- package/dist/classes/DexAggregators/UnsupportedDexAgg.js.map +1 -0
- package/dist/classes/DexAggregators/helpers.d.ts +30 -0
- package/dist/classes/DexAggregators/helpers.d.ts.map +1 -0
- package/dist/classes/DexAggregators/helpers.js +57 -0
- package/dist/classes/DexAggregators/helpers.js.map +1 -0
- package/dist/classes/DexAggregators/index.d.ts +2 -0
- package/dist/classes/DexAggregators/index.d.ts.map +1 -1
- package/dist/classes/DexAggregators/index.js +1 -0
- package/dist/classes/DexAggregators/index.js.map +1 -1
- package/dist/classes/ERC20.d.ts +3 -3
- package/dist/classes/ERC20.d.ts.map +1 -1
- package/dist/classes/ERC20.js +26 -10
- package/dist/classes/ERC20.js.map +1 -1
- package/dist/classes/FormatConverter.d.ts.map +1 -1
- package/dist/classes/FormatConverter.js +4 -1
- package/dist/classes/FormatConverter.js.map +1 -1
- package/dist/classes/Market.d.ts +46 -8
- package/dist/classes/Market.d.ts.map +1 -1
- package/dist/classes/Market.js +342 -111
- package/dist/classes/Market.js.map +1 -1
- package/dist/classes/NativeToken.d.ts +2 -2
- package/dist/classes/NativeToken.d.ts.map +1 -1
- package/dist/classes/NativeToken.js +21 -7
- package/dist/classes/NativeToken.js.map +1 -1
- package/dist/classes/OptimizerReader.d.ts +15 -7
- package/dist/classes/OptimizerReader.d.ts.map +1 -1
- package/dist/classes/OptimizerReader.js +108 -30
- package/dist/classes/OptimizerReader.js.map +1 -1
- package/dist/classes/OracleManager.d.ts.map +1 -1
- package/dist/classes/OracleManager.js +11 -4
- package/dist/classes/OracleManager.js.map +1 -1
- package/dist/classes/PositionManager.d.ts.map +1 -1
- package/dist/classes/PositionManager.js +1 -3
- package/dist/classes/PositionManager.js.map +1 -1
- package/dist/classes/ProtocolReader.d.ts +30 -9
- package/dist/classes/ProtocolReader.d.ts.map +1 -1
- package/dist/classes/ProtocolReader.js +158 -138
- package/dist/classes/ProtocolReader.js.map +1 -1
- package/dist/classes/Zapper.d.ts +5 -5
- package/dist/classes/Zapper.d.ts.map +1 -1
- package/dist/classes/Zapper.js +21 -18
- package/dist/classes/Zapper.js.map +1 -1
- package/dist/contracts/monad-mainnet.json +1 -1
- package/dist/feePolicy.d.ts +2 -0
- package/dist/feePolicy.d.ts.map +1 -1
- package/dist/feePolicy.js +19 -0
- package/dist/feePolicy.js.map +1 -1
- package/dist/format/borrow.d.ts.map +1 -1
- package/dist/format/borrow.js +7 -1
- package/dist/format/borrow.js.map +1 -1
- package/dist/format/health.d.ts +3 -2
- package/dist/format/health.d.ts.map +1 -1
- package/dist/format/health.js +10 -9
- package/dist/format/health.js.map +1 -1
- package/dist/format/leverage.js +5 -4
- package/dist/format/leverage.js.map +1 -1
- package/dist/helpers.d.ts +14 -11
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +171 -52
- package/dist/helpers.js.map +1 -1
- package/dist/integrations/merkl.d.ts +2 -1
- package/dist/integrations/merkl.d.ts.map +1 -1
- package/dist/integrations/merkl.js +199 -4
- package/dist/integrations/merkl.js.map +1 -1
- package/dist/integrations/snapshot.d.ts +28 -24
- package/dist/integrations/snapshot.d.ts.map +1 -1
- package/dist/integrations/snapshot.js +106 -42
- package/dist/integrations/snapshot.js.map +1 -1
- package/dist/retry-provider.d.ts +6 -0
- package/dist/retry-provider.d.ts.map +1 -1
- package/dist/retry-provider.js +103 -11
- package/dist/retry-provider.js.map +1 -1
- package/dist/setup.d.ts +8 -6
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +125 -45
- package/dist/setup.js.map +1 -1
- package/dist/validation.d.ts +1 -1
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +13 -7
- package/dist/validation.js.map +1 -1
- package/package.json +6 -3
|
@@ -4,40 +4,46 @@ export interface PositionSnapshot {
|
|
|
4
4
|
tokenAddress: string;
|
|
5
5
|
tokenSymbol: string;
|
|
6
6
|
isBorrowable: boolean;
|
|
7
|
-
depositUSD:
|
|
8
|
-
depositTokens:
|
|
9
|
-
collateralUSD:
|
|
10
|
-
collateralTokens:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
7
|
+
depositUSD: string;
|
|
8
|
+
depositTokens: string;
|
|
9
|
+
collateralUSD: string;
|
|
10
|
+
collateralTokens: string;
|
|
11
|
+
collateralShares: string;
|
|
12
|
+
debtUSD: string;
|
|
13
|
+
debtTokens: string;
|
|
14
|
+
assetPriceUSD: string;
|
|
15
|
+
supplyAPY: string;
|
|
16
|
+
borrowRate: string;
|
|
16
17
|
}
|
|
17
18
|
export interface MarketSnapshot {
|
|
18
19
|
marketAddress: string;
|
|
19
20
|
marketName: string;
|
|
20
|
-
totalDepositsUSD:
|
|
21
|
-
totalDebtUSD:
|
|
22
|
-
netUSD:
|
|
23
|
-
positionHealth:
|
|
24
|
-
dailyEarnings:
|
|
25
|
-
dailyCost:
|
|
21
|
+
totalDepositsUSD: string;
|
|
22
|
+
totalDebtUSD: string;
|
|
23
|
+
netUSD: string;
|
|
24
|
+
positionHealth: string | null;
|
|
25
|
+
dailyEarnings: string;
|
|
26
|
+
dailyCost: string;
|
|
26
27
|
positions: PositionSnapshot[];
|
|
27
28
|
}
|
|
28
29
|
export interface PortfolioSnapshot {
|
|
29
30
|
account: string;
|
|
30
31
|
chain: string;
|
|
31
32
|
timestamp: number;
|
|
32
|
-
totalDepositsUSD:
|
|
33
|
-
totalDebtUSD:
|
|
34
|
-
netUSD:
|
|
35
|
-
dailyEarnings:
|
|
36
|
-
dailyCost:
|
|
33
|
+
totalDepositsUSD: string;
|
|
34
|
+
totalDebtUSD: string;
|
|
35
|
+
netUSD: string;
|
|
36
|
+
dailyEarnings: string;
|
|
37
|
+
dailyCost: string;
|
|
37
38
|
markets: MarketSnapshot[];
|
|
38
39
|
}
|
|
40
|
+
export interface PortfolioSnapshotOptions {
|
|
41
|
+
refresh?: boolean;
|
|
42
|
+
markets?: Market[];
|
|
43
|
+
chain?: string;
|
|
44
|
+
}
|
|
39
45
|
/**
|
|
40
|
-
* Snapshot a single market's user positions into
|
|
46
|
+
* Snapshot a single market's user positions into decimal strings for JSON serialization.
|
|
41
47
|
*/
|
|
42
48
|
export declare function snapshotMarket(market: Market): MarketSnapshot;
|
|
43
49
|
/**
|
|
@@ -47,7 +53,5 @@ export declare function snapshotMarket(market: Market): MarketSnapshot;
|
|
|
47
53
|
* @param options.refresh - When true, reloads on-chain market + user data before reading cache.
|
|
48
54
|
* Use this for indexer/cron jobs that need fresh data.
|
|
49
55
|
*/
|
|
50
|
-
export declare function takePortfolioSnapshot(account: address, options?:
|
|
51
|
-
refresh?: boolean;
|
|
52
|
-
}): Promise<PortfolioSnapshot>;
|
|
56
|
+
export declare function takePortfolioSnapshot(account: address, options?: PortfolioSnapshotOptions): Promise<PortfolioSnapshot>;
|
|
53
57
|
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/integrations/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/integrations/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAKnC,MAAM,WAAW,gBAAgB;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAyDD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAwC7D;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,wBAA6B,GACvC,OAAO,CAAC,iBAAiB,CAAC,CAsE5B"}
|
|
@@ -2,12 +2,55 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.snapshotMarket = snapshotMarket;
|
|
4
4
|
exports.takePortfolioSnapshot = takePortfolioSnapshot;
|
|
5
|
+
const Market_1 = require("../classes/Market");
|
|
5
6
|
const setup_1 = require("../setup");
|
|
7
|
+
const decimal_js_1 = require("decimal.js");
|
|
8
|
+
function inferSnapshotChain(markets) {
|
|
9
|
+
if (markets.length === 0) {
|
|
10
|
+
return setup_1.setup_config?.chain ?? "unknown";
|
|
11
|
+
}
|
|
12
|
+
const chains = new Set(markets.map((market) => market.setup.chain));
|
|
13
|
+
return chains.size === 1 ? markets[0].setup.chain : "multi";
|
|
14
|
+
}
|
|
15
|
+
function groupMarketsByReaderDeployment(markets) {
|
|
16
|
+
const groups = new Map();
|
|
17
|
+
for (const market of markets) {
|
|
18
|
+
const key = market.reader.batchKey ?? market.reader;
|
|
19
|
+
const existing = groups.get(key);
|
|
20
|
+
if (existing) {
|
|
21
|
+
existing.markets.push(market);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
groups.set(key, { reader: market.reader, markets: [market] });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return groups.values();
|
|
28
|
+
}
|
|
29
|
+
function assertSnapshotCompatibleMarket(market) {
|
|
30
|
+
if (market.userDataScope !== "summary") {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
throw new Error(`snapshotMarket requires full user token data for ${market.address}. ` +
|
|
34
|
+
`Call market.reloadUserData(account), Market.reloadUserMarkets(...), or ` +
|
|
35
|
+
`takePortfolioSnapshot(account, { refresh: true }) before snapshotting a summary-refreshed market.`);
|
|
36
|
+
}
|
|
37
|
+
function assertSnapshotAccount(market, account) {
|
|
38
|
+
if (market.account?.toLowerCase() === account.toLowerCase()) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`takePortfolioSnapshot cannot snapshot ${market.address} for ${account} ` +
|
|
42
|
+
`because the market cache is bound to ${market.account ?? "no account"}. ` +
|
|
43
|
+
`Call takePortfolioSnapshot(account, { refresh: true }) or reload the market for this account first.`);
|
|
44
|
+
}
|
|
6
45
|
// ── Functions ────────────────────────────────────────────────────────────────
|
|
46
|
+
function decimalSnapshot(value) {
|
|
47
|
+
return value.toString();
|
|
48
|
+
}
|
|
7
49
|
/**
|
|
8
|
-
* Snapshot a single market's user positions into
|
|
50
|
+
* Snapshot a single market's user positions into decimal strings for JSON serialization.
|
|
9
51
|
*/
|
|
10
52
|
function snapshotMarket(market) {
|
|
53
|
+
assertSnapshotCompatibleMarket(market);
|
|
11
54
|
const positions = [];
|
|
12
55
|
for (const token of market.tokens) {
|
|
13
56
|
const isBorrowable = token.isBorrowable;
|
|
@@ -15,29 +58,30 @@ function snapshotMarket(market) {
|
|
|
15
58
|
tokenAddress: token.address,
|
|
16
59
|
tokenSymbol: token.symbol,
|
|
17
60
|
isBorrowable,
|
|
18
|
-
depositUSD: token.getUserAssetBalance(true)
|
|
19
|
-
depositTokens: token.getUserAssetBalance(false)
|
|
20
|
-
collateralUSD: token.getUserCollateral(true)
|
|
21
|
-
collateralTokens: token.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
61
|
+
depositUSD: decimalSnapshot(token.getUserAssetBalance(true)),
|
|
62
|
+
depositTokens: decimalSnapshot(token.getUserAssetBalance(false)),
|
|
63
|
+
collateralUSD: decimalSnapshot(token.getUserCollateral(true)),
|
|
64
|
+
collateralTokens: decimalSnapshot(token.getUserCollateralAssets()),
|
|
65
|
+
collateralShares: decimalSnapshot(token.getUserCollateral(false)),
|
|
66
|
+
debtUSD: decimalSnapshot(token.getUserDebt(true)),
|
|
67
|
+
debtTokens: decimalSnapshot(token.getUserDebt(false)),
|
|
68
|
+
assetPriceUSD: decimalSnapshot(token.getPrice(true)),
|
|
69
|
+
supplyAPY: decimalSnapshot(token.getApy()),
|
|
26
70
|
borrowRate: isBorrowable
|
|
27
|
-
? token.getBorrowRate(true)
|
|
28
|
-
: 0,
|
|
71
|
+
? decimalSnapshot(token.getBorrowRate(true))
|
|
72
|
+
: "0",
|
|
29
73
|
});
|
|
30
74
|
}
|
|
31
75
|
const health = market.positionHealth;
|
|
32
76
|
return {
|
|
33
77
|
marketAddress: market.address,
|
|
34
78
|
marketName: market.name,
|
|
35
|
-
totalDepositsUSD: market.userDeposits
|
|
36
|
-
totalDebtUSD: market.userDebt
|
|
37
|
-
netUSD: market.userNet
|
|
38
|
-
positionHealth: health !== null ? health
|
|
39
|
-
dailyEarnings: market.getUserDepositsChange("day")
|
|
40
|
-
dailyCost: market.getUserDebtChange("day")
|
|
79
|
+
totalDepositsUSD: decimalSnapshot(market.userDeposits),
|
|
80
|
+
totalDebtUSD: decimalSnapshot(market.userDebt),
|
|
81
|
+
netUSD: decimalSnapshot(market.userNet),
|
|
82
|
+
positionHealth: health !== null ? decimalSnapshot(health) : null,
|
|
83
|
+
dailyEarnings: decimalSnapshot(market.getUserDepositsChange("day")),
|
|
84
|
+
dailyCost: decimalSnapshot(market.getUserDebtChange("day")),
|
|
41
85
|
positions,
|
|
42
86
|
};
|
|
43
87
|
}
|
|
@@ -48,41 +92,61 @@ function snapshotMarket(market) {
|
|
|
48
92
|
* @param options.refresh - When true, reloads on-chain market + user data before reading cache.
|
|
49
93
|
* Use this for indexer/cron jobs that need fresh data.
|
|
50
94
|
*/
|
|
51
|
-
async function takePortfolioSnapshot(account, options) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
95
|
+
async function takePortfolioSnapshot(account, options = {}) {
|
|
96
|
+
const markets = options.markets ?? setup_1.all_markets;
|
|
97
|
+
if (options.refresh && markets.length > 0) {
|
|
98
|
+
for (const market of markets) {
|
|
99
|
+
market.assertRefreshAccountCompatible(account);
|
|
100
|
+
}
|
|
101
|
+
const plans = [];
|
|
102
|
+
for (const { reader, markets: groupedMarkets } of groupMarketsByReaderDeployment(markets)) {
|
|
103
|
+
const { dynamicMarket, userData } = await reader.getAllDynamicState(account);
|
|
104
|
+
const dynamicByAddress = new Map(dynamicMarket.map((market) => [market.address.toLowerCase(), market]));
|
|
105
|
+
const userByAddress = new Map(userData.markets.map((market) => [market.address.toLowerCase(), market]));
|
|
106
|
+
for (const market of groupedMarkets) {
|
|
107
|
+
const dynamic = dynamicByAddress.get(market.address.toLowerCase());
|
|
108
|
+
const user = userByAddress.get(market.address.toLowerCase());
|
|
109
|
+
if (!dynamic || !user) {
|
|
110
|
+
throw new Error(`Fresh snapshot refresh missing market state for ${market.address}.`);
|
|
111
|
+
}
|
|
112
|
+
market.validateRefreshState(dynamic, user);
|
|
113
|
+
plans.push({ market, dynamic, user });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const { market, dynamic, user } of plans) {
|
|
61
117
|
market.applyState(dynamic, user);
|
|
118
|
+
market.bindRefreshedAccount(account);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const summaryScopedMarkets = markets.filter((market) => market.userDataScope === "summary");
|
|
123
|
+
if (summaryScopedMarkets.length > 0) {
|
|
124
|
+
await Market_1.Market.reloadUserMarkets(summaryScopedMarkets, account);
|
|
62
125
|
}
|
|
63
126
|
}
|
|
64
127
|
const marketSnapshots = [];
|
|
65
|
-
let totalDepositsUSD = 0;
|
|
66
|
-
let totalDebtUSD = 0;
|
|
67
|
-
let dailyEarnings = 0;
|
|
68
|
-
let dailyCost = 0;
|
|
69
|
-
for (const market of
|
|
128
|
+
let totalDepositsUSD = (0, decimal_js_1.Decimal)(0);
|
|
129
|
+
let totalDebtUSD = (0, decimal_js_1.Decimal)(0);
|
|
130
|
+
let dailyEarnings = (0, decimal_js_1.Decimal)(0);
|
|
131
|
+
let dailyCost = (0, decimal_js_1.Decimal)(0);
|
|
132
|
+
for (const market of markets) {
|
|
133
|
+
assertSnapshotAccount(market, account);
|
|
70
134
|
const snap = snapshotMarket(market);
|
|
71
135
|
marketSnapshots.push(snap);
|
|
72
|
-
totalDepositsUSD
|
|
73
|
-
totalDebtUSD
|
|
74
|
-
dailyEarnings
|
|
75
|
-
dailyCost
|
|
136
|
+
totalDepositsUSD = totalDepositsUSD.plus(snap.totalDepositsUSD);
|
|
137
|
+
totalDebtUSD = totalDebtUSD.plus(snap.totalDebtUSD);
|
|
138
|
+
dailyEarnings = dailyEarnings.plus(snap.dailyEarnings);
|
|
139
|
+
dailyCost = dailyCost.plus(snap.dailyCost);
|
|
76
140
|
}
|
|
77
141
|
return {
|
|
78
142
|
account,
|
|
79
|
-
chain:
|
|
143
|
+
chain: options.chain ?? inferSnapshotChain(markets),
|
|
80
144
|
timestamp: Date.now(),
|
|
81
|
-
totalDepositsUSD,
|
|
82
|
-
totalDebtUSD,
|
|
83
|
-
netUSD: totalDepositsUSD
|
|
84
|
-
dailyEarnings,
|
|
85
|
-
dailyCost,
|
|
145
|
+
totalDepositsUSD: decimalSnapshot(totalDepositsUSD),
|
|
146
|
+
totalDebtUSD: decimalSnapshot(totalDebtUSD),
|
|
147
|
+
netUSD: decimalSnapshot(totalDepositsUSD.sub(totalDebtUSD)),
|
|
148
|
+
dailyEarnings: decimalSnapshot(dailyEarnings),
|
|
149
|
+
dailyCost: decimalSnapshot(dailyCost),
|
|
86
150
|
markets: marketSnapshots,
|
|
87
151
|
};
|
|
88
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/integrations/snapshot.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/integrations/snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/retry-provider.d.ts
CHANGED
|
@@ -43,6 +43,7 @@ export interface RpcDebugSnapshot {
|
|
|
43
43
|
endpoints: RpcEndpointDebugState[];
|
|
44
44
|
}
|
|
45
45
|
type RpcDebugListener = (snapshot: RpcDebugSnapshot) => void;
|
|
46
|
+
export declare function getRetryableProviderTarget(provider: curvance_read_provider): curvance_read_provider;
|
|
46
47
|
export declare function getRpcDebugSnapshot(): RpcDebugSnapshot;
|
|
47
48
|
export declare function subscribeToRpcDebug(listener: RpcDebugListener): () => void;
|
|
48
49
|
export declare function resetRpcDebugState(): void;
|
|
@@ -86,6 +87,10 @@ declare class RetryableProvider {
|
|
|
86
87
|
*/
|
|
87
88
|
private executeFallbackChain;
|
|
88
89
|
private executeWithReadFallback;
|
|
90
|
+
private isReadRpcMethod;
|
|
91
|
+
private getPayloadMethods;
|
|
92
|
+
private isReadRpcPayload;
|
|
93
|
+
private getRpcContext;
|
|
89
94
|
wrapProvider(provider: curvance_read_provider): curvance_read_provider;
|
|
90
95
|
private isRpcMethod;
|
|
91
96
|
updateConfig(newConfig: Partial<RetryConfig>): void;
|
|
@@ -99,6 +104,7 @@ export declare function configureRetries(config?: Partial<RetryConfig>): void;
|
|
|
99
104
|
* Create a provider with retry capabilities
|
|
100
105
|
*/
|
|
101
106
|
export declare function createRetryableProvider(provider: curvance_read_provider, config?: Partial<RetryConfig>, readFallback?: JsonRpcProvider | JsonRpcProvider[] | null): curvance_read_provider;
|
|
107
|
+
export declare function getActiveRetryConfig(): RetryConfig;
|
|
102
108
|
/**
|
|
103
109
|
* Wrap a provider with the global retry configuration.
|
|
104
110
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-provider.d.ts","sourceRoot":"","sources":["../src/retry-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"retry-provider.d.ts","sourceRoot":"","sources":["../src/retry-provider.ts"],"names":[],"mappings":"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"}
|
package/dist/retry-provider.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RetryableProvider = exports.DEFAULT_RETRY_CONFIG = void 0;
|
|
4
|
+
exports.getRetryableProviderTarget = getRetryableProviderTarget;
|
|
4
5
|
exports.getRpcDebugSnapshot = getRpcDebugSnapshot;
|
|
5
6
|
exports.subscribeToRpcDebug = subscribeToRpcDebug;
|
|
6
7
|
exports.resetRpcDebugState = resetRpcDebugState;
|
|
7
8
|
exports.configureRetries = configureRetries;
|
|
8
9
|
exports.createRetryableProvider = createRetryableProvider;
|
|
10
|
+
exports.getActiveRetryConfig = getActiveRetryConfig;
|
|
9
11
|
exports.wrapProviderWithRetries = wrapProviderWithRetries;
|
|
10
12
|
exports.isRetryableProvider = isRetryableProvider;
|
|
11
13
|
exports.isRetryableReadProvider = isRetryableReadProvider;
|
|
@@ -29,6 +31,27 @@ const RPC_PROVIDER_METHODS = new Set([
|
|
|
29
31
|
'call',
|
|
30
32
|
'estimateGas',
|
|
31
33
|
]);
|
|
34
|
+
/** Raw JSON-RPC methods that are safe to route through read fallbacks. */
|
|
35
|
+
const READ_RPC_METHODS = new Set([
|
|
36
|
+
'eth_call',
|
|
37
|
+
'eth_estimateGas',
|
|
38
|
+
'eth_getBalance',
|
|
39
|
+
'eth_getCode',
|
|
40
|
+
'eth_getStorageAt',
|
|
41
|
+
'eth_getTransactionCount',
|
|
42
|
+
'eth_blockNumber',
|
|
43
|
+
'eth_gasPrice',
|
|
44
|
+
'eth_feeHistory',
|
|
45
|
+
'eth_maxPriorityFeePerGas',
|
|
46
|
+
'eth_getBlockByNumber',
|
|
47
|
+
'eth_getBlockByHash',
|
|
48
|
+
'eth_getTransactionByHash',
|
|
49
|
+
'eth_getTransactionReceipt',
|
|
50
|
+
'eth_getLogs',
|
|
51
|
+
'eth_chainId',
|
|
52
|
+
'net_version',
|
|
53
|
+
'web3_clientVersion',
|
|
54
|
+
]);
|
|
32
55
|
exports.DEFAULT_RETRY_CONFIG = {
|
|
33
56
|
maxRetries: rpc_1.DEFAULT_CHAIN_RPC_POLICY.retryCount,
|
|
34
57
|
baseDelay: rpc_1.DEFAULT_CHAIN_RPC_POLICY.retryDelayMs,
|
|
@@ -82,6 +105,7 @@ exports.DEFAULT_RETRY_CONFIG = {
|
|
|
82
105
|
};
|
|
83
106
|
const rpcDebugListeners = new Set();
|
|
84
107
|
const rpcDebugStates = new Map();
|
|
108
|
+
const activeRetryProviders = new Set();
|
|
85
109
|
function normalizeRpcUrl(url) {
|
|
86
110
|
if (!url) {
|
|
87
111
|
return null;
|
|
@@ -92,6 +116,41 @@ function getProviderUrl(provider) {
|
|
|
92
116
|
const connection = provider._getConnection?.() ?? provider.connection ?? null;
|
|
93
117
|
return normalizeRpcUrl(connection?.url);
|
|
94
118
|
}
|
|
119
|
+
function getRetryableProviderTarget(provider) {
|
|
120
|
+
return provider._isRetryable
|
|
121
|
+
? provider._retryableTarget ?? provider
|
|
122
|
+
: provider;
|
|
123
|
+
}
|
|
124
|
+
function normalizeReadFallbacks(provider, readFallback) {
|
|
125
|
+
const fallbackProviders = Array.isArray(readFallback)
|
|
126
|
+
? readFallback
|
|
127
|
+
: readFallback
|
|
128
|
+
? [readFallback]
|
|
129
|
+
: [];
|
|
130
|
+
const primaryUrl = getProviderUrl(provider);
|
|
131
|
+
const seenUrls = new Set();
|
|
132
|
+
const seenProviders = new Set([provider]);
|
|
133
|
+
if (primaryUrl != null) {
|
|
134
|
+
seenUrls.add(primaryUrl);
|
|
135
|
+
}
|
|
136
|
+
const normalized = [];
|
|
137
|
+
for (const fallback of fallbackProviders) {
|
|
138
|
+
const unwrappedFallback = getRetryableProviderTarget(fallback);
|
|
139
|
+
const fallbackUrl = getProviderUrl(unwrappedFallback);
|
|
140
|
+
if (seenProviders.has(unwrappedFallback)) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (fallbackUrl != null) {
|
|
144
|
+
if (seenUrls.has(fallbackUrl)) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
seenUrls.add(fallbackUrl);
|
|
148
|
+
}
|
|
149
|
+
seenProviders.add(unwrappedFallback);
|
|
150
|
+
normalized.push(unwrappedFallback);
|
|
151
|
+
}
|
|
152
|
+
return normalized;
|
|
153
|
+
}
|
|
95
154
|
function getEndpointId(url, label) {
|
|
96
155
|
return url ?? label;
|
|
97
156
|
}
|
|
@@ -145,6 +204,7 @@ class RetryableProvider {
|
|
|
145
204
|
? [fallbackProviders]
|
|
146
205
|
: [];
|
|
147
206
|
this.fallbackProviderStates = this.fallbackProviders.map((provider, index) => this.createProviderState(provider, 'fallback', `fallback-${index + 1}`, index));
|
|
207
|
+
activeRetryProviders.add(this);
|
|
148
208
|
}
|
|
149
209
|
async sleep(ms) {
|
|
150
210
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
@@ -575,6 +635,20 @@ class RetryableProvider {
|
|
|
575
635
|
return this.executeFallbackChain(orderedFallbackOps, context, primaryError);
|
|
576
636
|
}
|
|
577
637
|
}
|
|
638
|
+
isReadRpcMethod(method) {
|
|
639
|
+
return typeof method === 'string' && READ_RPC_METHODS.has(method);
|
|
640
|
+
}
|
|
641
|
+
getPayloadMethods(payload) {
|
|
642
|
+
const payloads = Array.isArray(payload) ? payload : [payload];
|
|
643
|
+
return payloads.map((entry) => typeof entry?.method === 'string' ? entry.method : 'unknown');
|
|
644
|
+
}
|
|
645
|
+
isReadRpcPayload(payload) {
|
|
646
|
+
const methods = this.getPayloadMethods(payload);
|
|
647
|
+
return methods.length > 0 && methods.every((method) => this.isReadRpcMethod(method));
|
|
648
|
+
}
|
|
649
|
+
getRpcContext(methods) {
|
|
650
|
+
return methods.length === 1 ? `RPC ${methods[0]}` : `RPC batch ${methods.join(',')}`;
|
|
651
|
+
}
|
|
578
652
|
wrapProvider(provider) {
|
|
579
653
|
// If it's already wrapped, return as-is
|
|
580
654
|
if (provider._isRetryable) {
|
|
@@ -589,33 +663,44 @@ class RetryableProvider {
|
|
|
589
663
|
if (prop === '_isRetryable') {
|
|
590
664
|
return true;
|
|
591
665
|
}
|
|
666
|
+
if (prop === '_retryableTarget') {
|
|
667
|
+
return target;
|
|
668
|
+
}
|
|
592
669
|
// Wrap the main RPC send method
|
|
593
670
|
if (prop === 'send' && typeof original === 'function') {
|
|
594
671
|
return async (method, params) => {
|
|
595
672
|
const primaryOp = () => original.apply(target, [method, params]);
|
|
673
|
+
const context = `RPC ${method}`;
|
|
674
|
+
if (!this.isReadRpcMethod(method)) {
|
|
675
|
+
return primaryOp();
|
|
676
|
+
}
|
|
596
677
|
if (hasFallback) {
|
|
597
678
|
const fallbackOps = this.fallbackProviderStates.map((state) => ({
|
|
598
679
|
state,
|
|
599
680
|
operation: () => state.provider.send(method, params),
|
|
600
681
|
}));
|
|
601
|
-
return this.executeWithReadFallback(primaryOp, fallbackOps,
|
|
682
|
+
return this.executeWithReadFallback(primaryOp, fallbackOps, context, primaryState);
|
|
602
683
|
}
|
|
603
|
-
return this.executeWithRetry(primaryOp,
|
|
684
|
+
return this.executeWithRetry(this.withReadTimeout(primaryOp, context), context, primaryState);
|
|
604
685
|
};
|
|
605
686
|
}
|
|
606
687
|
// For JsonRpcProvider, also wrap _send if it exists
|
|
607
688
|
if (prop === '_send' && typeof original === 'function') {
|
|
608
689
|
return async (payload, callback) => {
|
|
609
|
-
const
|
|
690
|
+
const methods = this.getPayloadMethods(payload);
|
|
691
|
+
const context = this.getRpcContext(methods);
|
|
610
692
|
const primaryOp = () => original.apply(target, [payload, callback]);
|
|
693
|
+
if (!this.isReadRpcPayload(payload)) {
|
|
694
|
+
return primaryOp();
|
|
695
|
+
}
|
|
611
696
|
if (hasFallback) {
|
|
612
697
|
const fallbackOps = this.fallbackProviderStates.map((state) => ({
|
|
613
698
|
state,
|
|
614
699
|
operation: () => state.provider._send(payload, callback),
|
|
615
700
|
}));
|
|
616
|
-
return this.executeWithReadFallback(primaryOp, fallbackOps,
|
|
701
|
+
return this.executeWithReadFallback(primaryOp, fallbackOps, context, primaryState);
|
|
617
702
|
}
|
|
618
|
-
return this.executeWithRetry(primaryOp,
|
|
703
|
+
return this.executeWithRetry(this.withReadTimeout(primaryOp, context), context, primaryState);
|
|
619
704
|
};
|
|
620
705
|
}
|
|
621
706
|
// Wrap other async methods that might make RPC calls
|
|
@@ -639,7 +724,7 @@ class RetryableProvider {
|
|
|
639
724
|
return this.executeWithReadFallback(primaryOp, fallbackOps, `Provider method ${String(prop)}`, primaryState);
|
|
640
725
|
}
|
|
641
726
|
}
|
|
642
|
-
return this.executeWithRetry(primaryOp, `Provider method ${String(prop)}`, primaryState);
|
|
727
|
+
return this.executeWithRetry(this.withReadTimeout(primaryOp, `Provider method ${String(prop)}`), `Provider method ${String(prop)}`, primaryState);
|
|
643
728
|
};
|
|
644
729
|
}
|
|
645
730
|
// If it's a function, bind it to the target
|
|
@@ -677,6 +762,9 @@ function configureRetries(config = {}) {
|
|
|
677
762
|
else {
|
|
678
763
|
globalRetryProvider.updateConfig(config);
|
|
679
764
|
}
|
|
765
|
+
for (const retryProvider of activeRetryProviders) {
|
|
766
|
+
retryProvider.updateConfig(config);
|
|
767
|
+
}
|
|
680
768
|
}
|
|
681
769
|
/**
|
|
682
770
|
* Create a provider with retry capabilities
|
|
@@ -694,6 +782,9 @@ function getGlobalRetryProvider() {
|
|
|
694
782
|
}
|
|
695
783
|
return globalRetryProvider;
|
|
696
784
|
}
|
|
785
|
+
function getActiveRetryConfig() {
|
|
786
|
+
return getGlobalRetryProvider().getConfig();
|
|
787
|
+
}
|
|
697
788
|
/**
|
|
698
789
|
* Wrap a provider with the global retry configuration.
|
|
699
790
|
*
|
|
@@ -703,14 +794,15 @@ function getGlobalRetryProvider() {
|
|
|
703
794
|
* the fallback because only the primary (wallet) provider can sign.
|
|
704
795
|
*/
|
|
705
796
|
function wrapProviderWithRetries(provider, readFallback = null) {
|
|
706
|
-
const
|
|
707
|
-
|
|
797
|
+
const unwrappedProvider = getRetryableProviderTarget(provider);
|
|
798
|
+
const normalizedFallbacks = normalizeReadFallbacks(unwrappedProvider, readFallback);
|
|
799
|
+
if (normalizedFallbacks.length > 0) {
|
|
708
800
|
// Fallback is per-invocation — create a dedicated instance so the
|
|
709
801
|
// fallback providers aren't shared across setupChain calls.
|
|
710
|
-
const retryProvider = new RetryableProvider(getGlobalRetryProvider().getConfig(),
|
|
711
|
-
return retryProvider.wrapProvider(
|
|
802
|
+
const retryProvider = new RetryableProvider(getGlobalRetryProvider().getConfig(), normalizedFallbacks);
|
|
803
|
+
return retryProvider.wrapProvider(unwrappedProvider);
|
|
712
804
|
}
|
|
713
|
-
return getGlobalRetryProvider().wrapProvider(
|
|
805
|
+
return getGlobalRetryProvider().wrapProvider(unwrappedProvider);
|
|
714
806
|
}
|
|
715
807
|
/**
|
|
716
808
|
* Utility function to check if a provider is already wrapped with retries
|