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.
Files changed (115) hide show
  1. package/README.md +65 -10
  2. package/dist/abis/OptimizerReader.json +43 -45
  3. package/dist/abis/ProtocolReader.json +279 -55
  4. package/dist/chains/arbitrum.js +3 -3
  5. package/dist/chains/arbitrum.js.map +1 -1
  6. package/dist/classes/Api.d.ts +2 -2
  7. package/dist/classes/Api.d.ts.map +1 -1
  8. package/dist/classes/Api.js +87 -14
  9. package/dist/classes/Api.js.map +1 -1
  10. package/dist/classes/BorrowableCToken.d.ts +9 -1
  11. package/dist/classes/BorrowableCToken.d.ts.map +1 -1
  12. package/dist/classes/BorrowableCToken.js +67 -12
  13. package/dist/classes/BorrowableCToken.js.map +1 -1
  14. package/dist/classes/CToken.d.ts +210 -21
  15. package/dist/classes/CToken.d.ts.map +1 -1
  16. package/dist/classes/CToken.js +692 -284
  17. package/dist/classes/CToken.js.map +1 -1
  18. package/dist/classes/Calldata.d.ts +2 -2
  19. package/dist/classes/Calldata.d.ts.map +1 -1
  20. package/dist/classes/Calldata.js +6 -2
  21. package/dist/classes/Calldata.js.map +1 -1
  22. package/dist/classes/DexAggregators/IDexAgg.d.ts +1 -1
  23. package/dist/classes/DexAggregators/Kuru.js +1 -1
  24. package/dist/classes/DexAggregators/Kuru.js.map +1 -1
  25. package/dist/classes/DexAggregators/KyberSwap.d.ts.map +1 -1
  26. package/dist/classes/DexAggregators/KyberSwap.js +112 -61
  27. package/dist/classes/DexAggregators/KyberSwap.js.map +1 -1
  28. package/dist/classes/DexAggregators/MultiDexAgg.d.ts +2 -2
  29. package/dist/classes/DexAggregators/MultiDexAgg.d.ts.map +1 -1
  30. package/dist/classes/DexAggregators/MultiDexAgg.js +30 -18
  31. package/dist/classes/DexAggregators/MultiDexAgg.js.map +1 -1
  32. package/dist/classes/DexAggregators/UnsupportedDexAgg.d.ts +19 -0
  33. package/dist/classes/DexAggregators/UnsupportedDexAgg.d.ts.map +1 -0
  34. package/dist/classes/DexAggregators/UnsupportedDexAgg.js +29 -0
  35. package/dist/classes/DexAggregators/UnsupportedDexAgg.js.map +1 -0
  36. package/dist/classes/DexAggregators/helpers.d.ts +30 -0
  37. package/dist/classes/DexAggregators/helpers.d.ts.map +1 -0
  38. package/dist/classes/DexAggregators/helpers.js +57 -0
  39. package/dist/classes/DexAggregators/helpers.js.map +1 -0
  40. package/dist/classes/DexAggregators/index.d.ts +2 -0
  41. package/dist/classes/DexAggregators/index.d.ts.map +1 -1
  42. package/dist/classes/DexAggregators/index.js +1 -0
  43. package/dist/classes/DexAggregators/index.js.map +1 -1
  44. package/dist/classes/ERC20.d.ts +3 -3
  45. package/dist/classes/ERC20.d.ts.map +1 -1
  46. package/dist/classes/ERC20.js +26 -10
  47. package/dist/classes/ERC20.js.map +1 -1
  48. package/dist/classes/FormatConverter.d.ts.map +1 -1
  49. package/dist/classes/FormatConverter.js +4 -1
  50. package/dist/classes/FormatConverter.js.map +1 -1
  51. package/dist/classes/Market.d.ts +46 -8
  52. package/dist/classes/Market.d.ts.map +1 -1
  53. package/dist/classes/Market.js +342 -111
  54. package/dist/classes/Market.js.map +1 -1
  55. package/dist/classes/NativeToken.d.ts +2 -2
  56. package/dist/classes/NativeToken.d.ts.map +1 -1
  57. package/dist/classes/NativeToken.js +21 -7
  58. package/dist/classes/NativeToken.js.map +1 -1
  59. package/dist/classes/OptimizerReader.d.ts +15 -7
  60. package/dist/classes/OptimizerReader.d.ts.map +1 -1
  61. package/dist/classes/OptimizerReader.js +108 -30
  62. package/dist/classes/OptimizerReader.js.map +1 -1
  63. package/dist/classes/OracleManager.d.ts.map +1 -1
  64. package/dist/classes/OracleManager.js +11 -4
  65. package/dist/classes/OracleManager.js.map +1 -1
  66. package/dist/classes/PositionManager.d.ts.map +1 -1
  67. package/dist/classes/PositionManager.js +1 -3
  68. package/dist/classes/PositionManager.js.map +1 -1
  69. package/dist/classes/ProtocolReader.d.ts +30 -9
  70. package/dist/classes/ProtocolReader.d.ts.map +1 -1
  71. package/dist/classes/ProtocolReader.js +158 -138
  72. package/dist/classes/ProtocolReader.js.map +1 -1
  73. package/dist/classes/Zapper.d.ts +5 -5
  74. package/dist/classes/Zapper.d.ts.map +1 -1
  75. package/dist/classes/Zapper.js +21 -18
  76. package/dist/classes/Zapper.js.map +1 -1
  77. package/dist/contracts/monad-mainnet.json +1 -1
  78. package/dist/feePolicy.d.ts +2 -0
  79. package/dist/feePolicy.d.ts.map +1 -1
  80. package/dist/feePolicy.js +19 -0
  81. package/dist/feePolicy.js.map +1 -1
  82. package/dist/format/borrow.d.ts.map +1 -1
  83. package/dist/format/borrow.js +7 -1
  84. package/dist/format/borrow.js.map +1 -1
  85. package/dist/format/health.d.ts +3 -2
  86. package/dist/format/health.d.ts.map +1 -1
  87. package/dist/format/health.js +10 -9
  88. package/dist/format/health.js.map +1 -1
  89. package/dist/format/leverage.js +5 -4
  90. package/dist/format/leverage.js.map +1 -1
  91. package/dist/helpers.d.ts +14 -11
  92. package/dist/helpers.d.ts.map +1 -1
  93. package/dist/helpers.js +171 -52
  94. package/dist/helpers.js.map +1 -1
  95. package/dist/integrations/merkl.d.ts +2 -1
  96. package/dist/integrations/merkl.d.ts.map +1 -1
  97. package/dist/integrations/merkl.js +199 -4
  98. package/dist/integrations/merkl.js.map +1 -1
  99. package/dist/integrations/snapshot.d.ts +28 -24
  100. package/dist/integrations/snapshot.d.ts.map +1 -1
  101. package/dist/integrations/snapshot.js +106 -42
  102. package/dist/integrations/snapshot.js.map +1 -1
  103. package/dist/retry-provider.d.ts +6 -0
  104. package/dist/retry-provider.d.ts.map +1 -1
  105. package/dist/retry-provider.js +103 -11
  106. package/dist/retry-provider.js.map +1 -1
  107. package/dist/setup.d.ts +8 -6
  108. package/dist/setup.d.ts.map +1 -1
  109. package/dist/setup.js +125 -45
  110. package/dist/setup.js.map +1 -1
  111. package/dist/validation.d.ts +1 -1
  112. package/dist/validation.d.ts.map +1 -1
  113. package/dist/validation.js +13 -7
  114. package/dist/validation.js.map +1 -1
  115. 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: number;
8
- depositTokens: number;
9
- collateralUSD: number;
10
- collateralTokens: number;
11
- debtUSD: number;
12
- debtTokens: number;
13
- assetPriceUSD: number;
14
- supplyAPY: number;
15
- borrowRate: number;
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: number;
21
- totalDebtUSD: number;
22
- netUSD: number;
23
- positionHealth: number | null;
24
- dailyEarnings: number;
25
- dailyCost: number;
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: number;
33
- totalDebtUSD: number;
34
- netUSD: number;
35
- dailyEarnings: number;
36
- dailyCost: number;
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 plain numbers for JSON serialization.
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;AAInC,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,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;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAqC7D;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAChC,OAAO,CAAC,iBAAiB,CAAC,CAwC5B"}
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 plain numbers for JSON serialization.
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).toNumber(),
19
- depositTokens: token.getUserAssetBalance(false).toNumber(),
20
- collateralUSD: token.getUserCollateral(true).toNumber(),
21
- collateralTokens: token.getUserCollateral(false).toNumber(),
22
- debtUSD: token.getUserDebt(true).toNumber(),
23
- debtTokens: token.getUserDebt(false).toNumber(),
24
- assetPriceUSD: token.getPrice(true).toNumber(),
25
- supplyAPY: token.getApy().toNumber(),
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).toNumber()
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.toNumber(),
36
- totalDebtUSD: market.userDebt.toNumber(),
37
- netUSD: market.userNet.toNumber(),
38
- positionHealth: health !== null ? health.toNumber() : null,
39
- dailyEarnings: market.getUserDepositsChange("day").toNumber(),
40
- dailyCost: market.getUserDebtChange("day").toNumber(),
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
- if (options?.refresh && setup_1.all_markets.length > 0) {
53
- // Fetch all dynamic + user data in 1 combined ProtocolReader call.
54
- const reader = setup_1.all_markets[0].reader;
55
- const { dynamicMarket, userData } = await reader.getAllDynamicState(account);
56
- for (const market of setup_1.all_markets) {
57
- const dynamic = dynamicMarket.find((m) => m.address === market.address);
58
- const user = userData.markets.find((m) => m.address === market.address);
59
- if (!dynamic || !user)
60
- continue;
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 setup_1.all_markets) {
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 += snap.totalDepositsUSD;
73
- totalDebtUSD += snap.totalDebtUSD;
74
- dailyEarnings += snap.dailyEarnings;
75
- dailyCost += snap.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: setup_1.setup_config.chain,
143
+ chain: options.chain ?? inferSnapshotChain(markets),
80
144
  timestamp: Date.now(),
81
- totalDepositsUSD,
82
- totalDebtUSD,
83
- netUSD: totalDepositsUSD - totalDebtUSD,
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":"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"}
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/integrations/snapshot.ts"],"names":[],"mappings":";;AAgHA,wCAwCC;AASD,sDAyEC;AA1OD,8CAA2C;AAE3C,oCAAqD;AAErD,2CAAqC;AAkDrC,SAAS,kBAAkB,CAAC,OAAiB;IACzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,oBAAY,EAAE,KAAK,IAAI,SAAS,CAAC;IAC5C,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;AACjE,CAAC;AAED,SAAS,8BAA8B,CAAC,OAAiB;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8E,CAAC;IAErG,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,QAAQ,EAAE,CAAC;YACX,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,8BAA8B,CAAC,MAAc;IAClD,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO;IACX,CAAC;IAED,MAAM,IAAI,KAAK,CACX,oDAAoD,MAAM,CAAC,OAAO,IAAI;QACtE,yEAAyE;QACzE,mGAAmG,CACtG,CAAC;AACN,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAc,EAAE,OAAgB;IAC3D,IAAI,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1D,OAAO;IACX,CAAC;IAED,MAAM,IAAI,KAAK,CACX,yCAAyC,MAAM,CAAC,OAAO,QAAQ,OAAO,GAAG;QACzE,wCAAwC,MAAM,CAAC,OAAO,IAAI,YAAY,IAAI;QAC1E,qGAAqG,CACxG,CAAC;AACN,CAAC;AAED,gFAAgF;AAEhF,SAAS,eAAe,CAAC,KAAc;IACnC,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,MAAc;IACzC,8BAA8B,CAAC,MAAM,CAAC,CAAC;IAEvC,MAAM,SAAS,GAAuB,EAAE,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QAExC,SAAS,CAAC,IAAI,CAAC;YACX,YAAY,EAAE,KAAK,CAAC,OAAO;YAC3B,WAAW,EAAE,KAAK,CAAC,MAAM;YACzB,YAAY;YACZ,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC5D,aAAa,EAAE,eAAe,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAChE,aAAa,EAAE,eAAe,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC7D,gBAAgB,EAAE,eAAe,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC;YAClE,gBAAgB,EAAE,eAAe,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACjE,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACjD,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACrD,aAAa,EAAE,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpD,SAAS,EAAE,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1C,UAAU,EAAE,YAAY;gBACpB,CAAC,CAAC,eAAe,CAAE,KAA0B,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAClE,CAAC,CAAC,GAAG;SACZ,CAAC,CAAC;IACP,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;IAErC,OAAO;QACH,aAAa,EAAE,MAAM,CAAC,OAAO;QAC7B,UAAU,EAAE,MAAM,CAAC,IAAI;QACvB,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC;QACtD,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC9C,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;QACvC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;QAChE,aAAa,EAAE,eAAe,CAAC,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACnE,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC3D,SAAS;KACZ,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,qBAAqB,CACvC,OAAgB,EAChB,UAAoC,EAAE;IAEtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,mBAAW,CAAC;IAE/C,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,8BAA8B,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,KAAK,GAIN,EAAE,CAAC;QAER,KAAK,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,8BAA8B,CAAC,OAAO,CAAC,EAAE,CAAC;YACxF,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC7E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACxG,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAExG,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;gBACnE,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC7D,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;oBACpB,MAAM,IAAI,KAAK,CACX,mDAAmD,MAAM,CAAC,OAAO,GAAG,CACvE,CAAC;gBACN,CAAC;gBACD,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;QAED,KAAK,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;YAC5C,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACjC,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC;QAC5F,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,eAAM,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;IAED,MAAM,eAAe,GAAqB,EAAE,CAAC;IAC7C,IAAI,gBAAgB,GAAG,IAAA,oBAAO,EAAC,CAAC,CAAC,CAAC;IAClC,IAAI,YAAY,GAAG,IAAA,oBAAO,EAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,aAAa,GAAG,IAAA,oBAAO,EAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,SAAS,GAAG,IAAA,oBAAO,EAAC,CAAC,CAAC,CAAC;IAE3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,gBAAgB,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAChE,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpD,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACvD,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACH,OAAO;QACP,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,kBAAkB,CAAC,OAAO,CAAC;QACnD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,gBAAgB,EAAE,eAAe,CAAC,gBAAgB,CAAC;QACnD,YAAY,EAAE,eAAe,CAAC,YAAY,CAAC;QAC3C,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3D,aAAa,EAAE,eAAe,CAAC,aAAa,CAAC;QAC7C,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC;QACrC,OAAO,EAAE,eAAe;KAC3B,CAAC;AACN,CAAC"}
@@ -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":"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"}
1
+ {"version":3,"file":"retry-provider.d.ts","sourceRoot":"","sources":["../src/retry-provider.ts"],"names":[],"mappings":"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"}
@@ -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, `RPC ${method}`, primaryState);
682
+ return this.executeWithReadFallback(primaryOp, fallbackOps, context, primaryState);
602
683
  }
603
- return this.executeWithRetry(primaryOp, `RPC ${method}`, primaryState);
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 method = payload.method || 'unknown';
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, `RPC ${method}`, primaryState);
701
+ return this.executeWithReadFallback(primaryOp, fallbackOps, context, primaryState);
617
702
  }
618
- return this.executeWithRetry(primaryOp, `RPC ${method}`, primaryState);
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 hasFallback = Array.isArray(readFallback) ? readFallback.length > 0 : readFallback != null;
707
- if (hasFallback) {
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(), readFallback);
711
- return retryProvider.wrapProvider(provider);
802
+ const retryProvider = new RetryableProvider(getGlobalRetryProvider().getConfig(), normalizedFallbacks);
803
+ return retryProvider.wrapProvider(unwrappedProvider);
712
804
  }
713
- return getGlobalRetryProvider().wrapProvider(provider);
805
+ return getGlobalRetryProvider().wrapProvider(unwrappedProvider);
714
806
  }
715
807
  /**
716
808
  * Utility function to check if a provider is already wrapped with retries