@defisaver/positions-sdk 2.1.169-custom-fetching-dev → 2.1.169-custom-fetching-3-dev

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 (145) hide show
  1. package/cjs/aaveV2/index.d.ts +4 -4
  2. package/cjs/aaveV2/index.js +7 -7
  3. package/cjs/aaveV3/index.d.ts +4 -3
  4. package/cjs/aaveV3/index.js +14 -10
  5. package/cjs/aaveV3/merkl.d.ts +5 -1
  6. package/cjs/aaveV3/merkl.js +8 -3
  7. package/cjs/aaveV4/index.d.ts +4 -3
  8. package/cjs/aaveV4/index.js +19 -16
  9. package/cjs/aaveV4/merkl.d.ts +10 -2
  10. package/cjs/aaveV4/merkl.js +15 -6
  11. package/cjs/claiming/aaveV3.d.ts +2 -2
  12. package/cjs/claiming/aaveV3.js +5 -4
  13. package/cjs/claiming/king.d.ts +2 -2
  14. package/cjs/claiming/king.js +3 -2
  15. package/cjs/claiming/spark.d.ts +3 -3
  16. package/cjs/claiming/spark.js +8 -7
  17. package/cjs/claiming/uniswap.d.ts +2 -2
  18. package/cjs/claiming/uniswap.js +3 -2
  19. package/cjs/compoundV2/index.d.ts +4 -4
  20. package/cjs/compoundV2/index.js +9 -9
  21. package/cjs/compoundV3/index.d.ts +5 -4
  22. package/cjs/compoundV3/index.js +17 -13
  23. package/cjs/compoundV3/merkl.d.ts +1 -1
  24. package/cjs/compoundV3/merkl.js +2 -5
  25. package/cjs/curveUsd/index.d.ts +5 -5
  26. package/cjs/curveUsd/index.js +17 -17
  27. package/cjs/fluid/index.d.ts +23 -22
  28. package/cjs/fluid/index.js +75 -72
  29. package/cjs/fluid/merkl.d.ts +5 -3
  30. package/cjs/fluid/merkl.js +11 -6
  31. package/cjs/liquity/index.d.ts +4 -4
  32. package/cjs/liquity/index.js +23 -23
  33. package/cjs/liquityV2/index.d.ts +10 -10
  34. package/cjs/liquityV2/index.js +59 -59
  35. package/cjs/llamaLend/index.d.ts +5 -5
  36. package/cjs/llamaLend/index.js +13 -13
  37. package/cjs/maker/index.d.ts +6 -6
  38. package/cjs/maker/index.js +16 -16
  39. package/cjs/morphoBlue/index.d.ts +7 -7
  40. package/cjs/morphoBlue/index.js +28 -26
  41. package/cjs/morphoBlue/merkl.d.ts +5 -3
  42. package/cjs/morphoBlue/merkl.js +6 -8
  43. package/cjs/morphoMidnight/index.d.ts +5 -5
  44. package/cjs/morphoMidnight/index.js +18 -18
  45. package/cjs/portfolio/customDeFiData.js +45 -40
  46. package/cjs/services/merkl.d.ts +36 -2
  47. package/cjs/services/merkl.js +142 -19
  48. package/cjs/services/priceService.d.ts +12 -12
  49. package/cjs/services/priceService.js +30 -29
  50. package/cjs/services/viem.d.ts +10 -2
  51. package/cjs/services/viem.js +27 -1
  52. package/cjs/spark/index.d.ts +4 -4
  53. package/cjs/spark/index.js +9 -9
  54. package/cjs/types/merkl.d.ts +18 -0
  55. package/cjs/types/portfolio.d.ts +2 -0
  56. package/cjs/umbrella/index.d.ts +2 -2
  57. package/cjs/umbrella/index.js +5 -4
  58. package/esm/aaveV2/index.d.ts +4 -4
  59. package/esm/aaveV2/index.js +8 -8
  60. package/esm/aaveV3/index.d.ts +4 -3
  61. package/esm/aaveV3/index.js +15 -11
  62. package/esm/aaveV3/merkl.d.ts +5 -1
  63. package/esm/aaveV3/merkl.js +9 -4
  64. package/esm/aaveV4/index.d.ts +4 -3
  65. package/esm/aaveV4/index.js +20 -17
  66. package/esm/aaveV4/merkl.d.ts +10 -2
  67. package/esm/aaveV4/merkl.js +16 -7
  68. package/esm/claiming/aaveV3.d.ts +2 -2
  69. package/esm/claiming/aaveV3.js +5 -4
  70. package/esm/claiming/king.d.ts +2 -2
  71. package/esm/claiming/king.js +3 -2
  72. package/esm/claiming/spark.d.ts +3 -3
  73. package/esm/claiming/spark.js +8 -7
  74. package/esm/claiming/uniswap.d.ts +2 -2
  75. package/esm/claiming/uniswap.js +3 -2
  76. package/esm/compoundV2/index.d.ts +4 -4
  77. package/esm/compoundV2/index.js +9 -9
  78. package/esm/compoundV3/index.d.ts +5 -4
  79. package/esm/compoundV3/index.js +19 -15
  80. package/esm/compoundV3/merkl.d.ts +1 -1
  81. package/esm/compoundV3/merkl.js +3 -6
  82. package/esm/curveUsd/index.d.ts +5 -5
  83. package/esm/curveUsd/index.js +17 -17
  84. package/esm/fluid/index.d.ts +23 -22
  85. package/esm/fluid/index.js +76 -73
  86. package/esm/fluid/merkl.d.ts +5 -3
  87. package/esm/fluid/merkl.js +12 -7
  88. package/esm/liquity/index.d.ts +4 -4
  89. package/esm/liquity/index.js +23 -23
  90. package/esm/liquityV2/index.d.ts +10 -10
  91. package/esm/liquityV2/index.js +60 -60
  92. package/esm/llamaLend/index.d.ts +5 -5
  93. package/esm/llamaLend/index.js +13 -13
  94. package/esm/maker/index.d.ts +6 -6
  95. package/esm/maker/index.js +16 -16
  96. package/esm/morphoBlue/index.d.ts +7 -7
  97. package/esm/morphoBlue/index.js +29 -27
  98. package/esm/morphoBlue/merkl.d.ts +5 -3
  99. package/esm/morphoBlue/merkl.js +7 -9
  100. package/esm/morphoMidnight/index.d.ts +5 -5
  101. package/esm/morphoMidnight/index.js +18 -18
  102. package/esm/portfolio/customDeFiData.js +47 -42
  103. package/esm/services/merkl.d.ts +36 -2
  104. package/esm/services/merkl.js +136 -18
  105. package/esm/services/priceService.d.ts +12 -12
  106. package/esm/services/priceService.js +31 -30
  107. package/esm/services/viem.d.ts +10 -2
  108. package/esm/services/viem.js +25 -0
  109. package/esm/spark/index.d.ts +4 -4
  110. package/esm/spark/index.js +10 -10
  111. package/esm/types/merkl.d.ts +18 -0
  112. package/esm/types/portfolio.d.ts +2 -0
  113. package/esm/umbrella/index.d.ts +2 -2
  114. package/esm/umbrella/index.js +5 -4
  115. package/package.json +1 -1
  116. package/src/aaveV2/index.ts +7 -7
  117. package/src/aaveV3/index.ts +15 -11
  118. package/src/aaveV3/merkl.ts +9 -4
  119. package/src/aaveV4/index.ts +19 -16
  120. package/src/aaveV4/merkl.ts +16 -7
  121. package/src/claiming/aaveV3.ts +5 -3
  122. package/src/claiming/king.ts +6 -3
  123. package/src/claiming/spark.ts +9 -6
  124. package/src/claiming/uniswap.ts +4 -3
  125. package/src/compoundV2/index.ts +10 -9
  126. package/src/compoundV3/index.ts +20 -14
  127. package/src/compoundV3/merkl.ts +5 -4
  128. package/src/curveUsd/index.ts +19 -17
  129. package/src/fluid/index.ts +88 -70
  130. package/src/fluid/merkl.ts +12 -7
  131. package/src/liquity/index.ts +23 -23
  132. package/src/liquityV2/index.ts +64 -56
  133. package/src/llamaLend/index.ts +15 -13
  134. package/src/maker/index.ts +19 -16
  135. package/src/morphoBlue/index.ts +23 -20
  136. package/src/morphoBlue/merkl.ts +9 -6
  137. package/src/morphoMidnight/index.ts +13 -13
  138. package/src/portfolio/customDeFiData.ts +48 -41
  139. package/src/services/merkl.ts +152 -19
  140. package/src/services/priceService.ts +33 -30
  141. package/src/services/viem.ts +16 -0
  142. package/src/spark/index.ts +11 -8
  143. package/src/types/merkl.ts +20 -0
  144. package/src/types/portfolio.ts +2 -0
  145. package/src/umbrella/index.ts +6 -5
@@ -19,7 +19,7 @@ import { getFluidMarketInfoById, getFluidVersionsDataForNetwork, getFTokenAddres
19
19
  import { USD_QUOTE, ZERO_ADDRESS } from '../constants';
20
20
  import { getChainlinkAssetAddress, getSyrupUSDTChainLinkPriceCalls, getSyrupUSDTPrice, getWeETHChainLinkPriceCalls, getWeETHPrice, getWsrETHChainLinkPriceCalls, getWsrETHPrice, getWstETHChainLinkPriceCalls, getWstETHPrice, getWstETHPriceFluid, getWstUSRChainLinkPriceCalls, getWstUSRPrice, parseSyrupUSDTPriceCalls, parseWeETHPriceCalls, parseWrsETHPriceCalls, parseWstETHPriceCalls, parseWstUSRPriceCalls, } from '../services/priceService';
21
21
  import { getStakingApy, STAKING_ASSETS } from '../staking';
22
- import { getViemProvider } from '../services/viem';
22
+ import { getBlockTimestamp, getViemProvider, setViemBlockNumber } from '../services/viem';
23
23
  import { attachFluidMerklIncentives, getFluidMerklCampaigns } from './merkl';
24
24
  export { FluidMerklOpportunityType, buildFluidMerklRewardMap, getFluidMerklCampaigns, attachFluidMerklIncentives, } from './merkl';
25
25
  export const EMPTY_USED_ASSET = {
@@ -41,7 +41,7 @@ const parseVaultType = (vaultType) => {
41
41
  default: return FluidVaultType.Unknown;
42
42
  }
43
43
  };
44
- const getChainLinkPricesForTokens = (tokens, network, client) => __awaiter(void 0, void 0, void 0, function* () {
44
+ const getChainLinkPricesForTokens = (tokens_1, network_1, client_1, ...args_1) => __awaiter(void 0, [tokens_1, network_1, client_1, ...args_1], void 0, function* (tokens, network, client, blockNumber = 'latest') {
45
45
  const isMainnet = isMainnetNetwork(network);
46
46
  const noDuplicateTokens = new Array(...new Set(tokens));
47
47
  const btcFeedContract = BTCPriceFeedContractViem(client, network);
@@ -96,7 +96,7 @@ const getChainLinkPricesForTokens = (tokens, network, client) => __awaiter(void
96
96
  });
97
97
  const calls = [...staticCalls, ..._calls].filter((call) => call);
98
98
  // @ts-ignore
99
- const results = yield client.multicall({ contracts: calls });
99
+ const results = yield client.multicall(Object.assign({ contracts: calls }, setViemBlockNumber(blockNumber)));
100
100
  const ethPriceChainlink = new Dec(results[0].result).div(1e8).toString();
101
101
  const btcPriceChainlink = new Dec(results[1].result).div(1e8).toString();
102
102
  let offset = 2; // wstETH and weETH has 3 calls, while others have only 1, so we need to keep track. First 2 are static calls for eth and btc prices
@@ -205,7 +205,7 @@ const getChainLinkPricesForTokens = (tokens, network, client) => __awaiter(void
205
205
  return acc;
206
206
  }, {});
207
207
  });
208
- const getTokenPriceFromChainlink = (asset, network, provider) => __awaiter(void 0, void 0, void 0, function* () {
208
+ const getTokenPriceFromChainlink = (asset_1, network_1, provider_1, ...args_1) => __awaiter(void 0, [asset_1, network_1, provider_1, ...args_1], void 0, function* (asset, network, provider, blockNumber = 'latest') {
209
209
  if (asset.symbol === 'sUSDS') {
210
210
  return new Dec('105276929').div(1e8).toString();
211
211
  }
@@ -215,17 +215,17 @@ const getTokenPriceFromChainlink = (asset, network, provider) => __awaiter(void
215
215
  let loanTokenPrice;
216
216
  if (asset.symbol === 'wstETH') {
217
217
  // need to handle wstETH for l2s inside getWstETHPrice
218
- loanTokenPrice = yield getWstETHPriceFluid(provider, network);
218
+ loanTokenPrice = yield getWstETHPriceFluid(provider, network, blockNumber);
219
219
  }
220
220
  else if (isMainnet) {
221
221
  const feedRegistryContract = FeedRegistryContractViem(provider, NetworkNumber.Eth);
222
- loanTokenPrice = isTokenUSDA ? '100000000' : yield feedRegistryContract.read.latestAnswer([loanTokenFeedAddress, USD_QUOTE]);
222
+ loanTokenPrice = isTokenUSDA ? '100000000' : yield feedRegistryContract.read.latestAnswer([loanTokenFeedAddress, USD_QUOTE], setViemBlockNumber(blockNumber));
223
223
  }
224
224
  else {
225
225
  // Currently only base network is supported
226
226
  const feedRegistryContract = DFSFeedRegistryContractViem(provider, network);
227
227
  try {
228
- const roundPriceData = isTokenUSDA ? [0, '100000000'] : yield feedRegistryContract.read.latestRoundData([loanTokenFeedAddress, USD_QUOTE]);
228
+ const roundPriceData = isTokenUSDA ? [0, '100000000'] : yield feedRegistryContract.read.latestRoundData([loanTokenFeedAddress, USD_QUOTE], setViemBlockNumber(blockNumber));
229
229
  loanTokenPrice = roundPriceData[1].toString();
230
230
  }
231
231
  catch (err) {
@@ -266,7 +266,7 @@ const getTradingApy = (poolAddress) => __awaiter(void 0, void 0, void 0, functio
266
266
  const data = yield res.json();
267
267
  return new Dec(data.tradingApy).div(100).toString();
268
268
  });
269
- const parseT1MarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, data_1, network_1, ...args_1], void 0, function* (provider, data, network, tokenPrices = null) {
269
+ const parseT1MarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, data_1, network_1, ...args_1], void 0, function* (provider, data, network, tokenPrices = null, blockNumber = 'latest') {
270
270
  var _a, _b;
271
271
  const collAssetContract = getAssetInfoByAddress(data.supplyToken0, network);
272
272
  const collAsset = getAssetInfo(getNativeAssetFromWrapped(collAssetContract.symbol), network);
@@ -282,7 +282,7 @@ const parseT1MarketData = (provider_1, data_1, network_1, ...args_1) => __awaite
282
282
  debtPriceParsed = tokenPrices[debtAsset.symbol] || '0';
283
283
  }
284
284
  else {
285
- debtPriceParsed = yield getTokenPriceFromChainlink(debtAssetContract, network, provider);
285
+ debtPriceParsed = yield getTokenPriceFromChainlink(debtAssetContract, network, provider, blockNumber);
286
286
  }
287
287
  const collAssetData = {
288
288
  symbol: collAsset.symbol,
@@ -378,7 +378,7 @@ const parseT1MarketData = (provider_1, data_1, network_1, ...args_1) => __awaite
378
378
  marketData,
379
379
  };
380
380
  });
381
- const parseT2MarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, data_1, network_1, ...args_1], void 0, function* (provider, data, network, tokenPrices = null) {
381
+ const parseT2MarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, data_1, network_1, ...args_1], void 0, function* (provider, data, network, tokenPrices = null, blockNumber = 'latest') {
382
382
  var _a, _b, _c;
383
383
  const collAsset0Contract = getAssetInfoByAddress(data.supplyToken0, network);
384
384
  const collAsset0 = getAssetInfo(getNativeAssetFromWrapped(collAsset0Contract.symbol), network);
@@ -395,7 +395,7 @@ const parseT2MarketData = (provider_1, data_1, network_1, ...args_1) => __awaite
395
395
  prices = tokenPrices;
396
396
  }
397
397
  else {
398
- prices = yield getChainLinkPricesForTokens([collAsset0Contract.address, collAsset1Contract.address, debtAssetContract.address], network, provider);
398
+ prices = yield getChainLinkPricesForTokens([collAsset0Contract.address, collAsset1Contract.address, debtAssetContract.address], network, provider, blockNumber);
399
399
  }
400
400
  const { supplyDexFee, totalSupplyShares, supplyRate1, totalSupplyToken1, token0PerSupplyShare, token1PerSupplyShare, totalSupplyToken0, maxSupplyShares, withdrawableToken0, withdrawable0, withdrawableToken1, withdrawable1, supplyRate0, utilizationSupply0, utilizationSupply1, withdrawableShares, reservesSupplyToken0, reservesSupplyToken1, } = parseDexSupplyData(data.dexSupplyData, collAsset0.symbol, collAsset1.symbol);
401
401
  const collFirstAssetData = {
@@ -534,7 +534,7 @@ const parseT2MarketData = (provider_1, data_1, network_1, ...args_1) => __awaite
534
534
  marketData,
535
535
  };
536
536
  });
537
- const parseT3MarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, data_1, network_1, ...args_1], void 0, function* (provider, data, network, tokenPrices = null) {
537
+ const parseT3MarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, data_1, network_1, ...args_1], void 0, function* (provider, data, network, tokenPrices = null, blockNumber = 'latest') {
538
538
  var _a, _b, _c, _d;
539
539
  const collAssetContract = getAssetInfoByAddress(data.supplyToken0, network);
540
540
  const collAsset = getAssetInfo(getNativeAssetFromWrapped(collAssetContract.symbol), network);
@@ -552,7 +552,7 @@ const parseT3MarketData = (provider_1, data_1, network_1, ...args_1) => __awaite
552
552
  prices = tokenPrices;
553
553
  }
554
554
  else {
555
- prices = yield getChainLinkPricesForTokens([collAssetContract.address, debtAsset0Contract.address, debtAsset1Contract.address], network, provider);
555
+ prices = yield getChainLinkPricesForTokens([collAssetContract.address, debtAsset0Contract.address, debtAsset1Contract.address], network, provider, blockNumber);
556
556
  }
557
557
  const supplyRate = new Dec(data.supplyRateVault).div(100).toString();
558
558
  const collAssetData = {
@@ -686,7 +686,7 @@ const parseT3MarketData = (provider_1, data_1, network_1, ...args_1) => __awaite
686
686
  marketData,
687
687
  };
688
688
  });
689
- const parseT4MarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, data_1, network_1, ...args_1], void 0, function* (provider, data, network, tokenPrices = null) {
689
+ const parseT4MarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, data_1, network_1, ...args_1], void 0, function* (provider, data, network, tokenPrices = null, blockNumber = 'latest') {
690
690
  var _a, _b, _c, _d;
691
691
  const collAsset0Contract = getAssetInfoByAddress(data.supplyToken0, network);
692
692
  const collAsset0 = getAssetInfo(getNativeAssetFromWrapped(collAsset0Contract.symbol), network);
@@ -706,7 +706,7 @@ const parseT4MarketData = (provider_1, data_1, network_1, ...args_1) => __awaite
706
706
  prices = tokenPrices;
707
707
  }
708
708
  else {
709
- prices = yield getChainLinkPricesForTokens([collAsset0Contract.address, collAsset1Contract.address, debtAsset0Contract.address, debtAsset1Contract.address], network, provider);
709
+ prices = yield getChainLinkPricesForTokens([collAsset0Contract.address, collAsset1Contract.address, debtAsset0Contract.address, debtAsset1Contract.address], network, provider, blockNumber);
710
710
  }
711
711
  const { supplyDexFee, totalSupplyShares, supplyRate1, token0PerSupplyShare, token1PerSupplyShare, totalSupplyToken0, totalSupplyToken1, maxSupplyShares, withdrawableToken0, withdrawable0, withdrawableToken1, withdrawable1, supplyRate0, utilizationSupply0, utilizationSupply1, withdrawableShares, reservesSupplyToken0, reservesSupplyToken1, } = parseDexSupplyData(data.dexSupplyData, collAsset0.symbol, collAsset1.symbol);
712
712
  const { borrowableShares, maxBorrowShares, borrowDexFee, utilizationBorrow0, utilizationBorrow1, borrowable0, borrowable1, borrowRate0, borrowRate1, totalBorrowShares, token0PerBorrowShare, token1PerBorrowShare, borrowableToken0, borrowableToken1, totalBorrowToken0, totalBorrowToken1, quoteTokensPerShare, reservesBorrowToken0, reservesBorrowToken1, } = parseDexBorrowData(data.dexBorrowData, debtAsset0.symbol, debtAsset1.symbol);
@@ -883,7 +883,7 @@ const parseT4MarketData = (provider_1, data_1, network_1, ...args_1) => __awaite
883
883
  marketData,
884
884
  };
885
885
  });
886
- const parseMarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, data_1, network_1, ...args_1], void 0, function* (provider, data, network, tokenPrices = null) {
886
+ const parseMarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, data_1, network_1, ...args_1], void 0, function* (provider, data, network, tokenPrices = null, blockNumber = 'latest') {
887
887
  const marketInfo = getFluidMarketInfoById(+(data.vaultId.toString()), network);
888
888
  if (!marketInfo) {
889
889
  console.error(`Fluid market with address ${data.vault} not supported.`);
@@ -892,13 +892,13 @@ const parseMarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(
892
892
  const vaultType = parseVaultType(+(data.vaultType.toString()));
893
893
  switch (vaultType) {
894
894
  case FluidVaultType.T1:
895
- return parseT1MarketData(provider, data, network, tokenPrices);
895
+ return parseT1MarketData(provider, data, network, tokenPrices, blockNumber);
896
896
  case FluidVaultType.T2:
897
- return parseT2MarketData(provider, data, network, tokenPrices);
897
+ return parseT2MarketData(provider, data, network, tokenPrices, blockNumber);
898
898
  case FluidVaultType.T3:
899
- return parseT3MarketData(provider, data, network, tokenPrices);
899
+ return parseT3MarketData(provider, data, network, tokenPrices, blockNumber);
900
900
  case FluidVaultType.T4:
901
- return parseT4MarketData(provider, data, network, tokenPrices);
901
+ return parseT4MarketData(provider, data, network, tokenPrices, blockNumber);
902
902
  default:
903
903
  throw new Error(`Unknown vault type: ${vaultType}`);
904
904
  }
@@ -1103,35 +1103,35 @@ const parseUserData = (userPositionData, vaultData) => {
1103
1103
  throw new Error(`Unknown vault type: ${vaultType}`);
1104
1104
  }
1105
1105
  };
1106
- export const _getFluidMarketData = (provider, network, market) => __awaiter(void 0, void 0, void 0, function* () {
1106
+ export const _getFluidMarketData = (provider_1, network_1, market_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, market_1, ...args_1], void 0, function* (provider, network, market, blockNumber = 'latest') {
1107
1107
  const view = FluidViewContractViem(provider, network);
1108
1108
  const [data, merklCampaigns] = yield Promise.all([
1109
- view.read.getVaultData([market.marketAddress]),
1109
+ view.read.getVaultData([market.marketAddress], setViemBlockNumber(blockNumber)),
1110
1110
  getFluidMerklCampaigns(network),
1111
1111
  ]);
1112
- const marketData = yield parseMarketData(provider, data, network);
1112
+ const marketData = yield parseMarketData(provider, data, network, null, blockNumber);
1113
1113
  return marketData ? attachFluidMerklIncentives(marketData, merklCampaigns) : marketData;
1114
1114
  });
1115
- export const getFluidMarketData = (provider, network, market) => __awaiter(void 0, void 0, void 0, function* () { return _getFluidMarketData(getViemProvider(provider, network), network, market); });
1116
- export const _getFluidVaultIdsForUser = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () {
1115
+ export const getFluidMarketData = (provider_1, network_1, market_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, market_1, ...args_1], void 0, function* (provider, network, market, blockNumber = 'latest') { return _getFluidMarketData(getViemProvider(provider, network), network, market, blockNumber); });
1116
+ export const _getFluidVaultIdsForUser = (provider_1, network_1, user_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, user_1, ...args_1], void 0, function* (provider, network, user, blockNumber = 'latest') {
1117
1117
  const view = FluidViewContractViem(provider, network);
1118
- return (yield view.read.getUserNftIds([user])).map((item) => item.toString());
1118
+ return (yield view.read.getUserNftIds([user], setViemBlockNumber(blockNumber))).map((item) => item.toString());
1119
1119
  });
1120
- export const getFluidVaultIdsForUser = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () { return _getFluidVaultIdsForUser(getViemProvider(provider, network), network, user); });
1121
- export const _getFluidPosition = (provider, network, vaultId, extractedState) => __awaiter(void 0, void 0, void 0, function* () {
1120
+ export const getFluidVaultIdsForUser = (provider_1, network_1, user_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, user_1, ...args_1], void 0, function* (provider, network, user, blockNumber = 'latest') { return _getFluidVaultIdsForUser(getViemProvider(provider, network), network, user, blockNumber); });
1121
+ export const _getFluidPosition = (provider_1, network_1, vaultId_1, extractedState_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, vaultId_1, extractedState_1, ...args_1], void 0, function* (provider, network, vaultId, extractedState, blockNumber = 'latest') {
1122
1122
  const view = FluidViewContractViem(provider, network);
1123
- const data = yield view.read.getPositionByNftId([BigInt(vaultId)]);
1123
+ const data = yield view.read.getPositionByNftId([BigInt(vaultId)], setViemBlockNumber(blockNumber));
1124
1124
  const userPositionData = data[0];
1125
1125
  return parseUserData(userPositionData, extractedState);
1126
1126
  });
1127
- export const getFluidPosition = (provider, network, vaultId, extractedState) => __awaiter(void 0, void 0, void 0, function* () { return _getFluidPosition(getViemProvider(provider, network), network, vaultId, extractedState); });
1128
- export const _getFluidPositionWithMarket = (provider, network, vaultId) => __awaiter(void 0, void 0, void 0, function* () {
1127
+ export const getFluidPosition = (provider_1, network_1, vaultId_1, extractedState_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, vaultId_1, extractedState_1, ...args_1], void 0, function* (provider, network, vaultId, extractedState, blockNumber = 'latest') { return _getFluidPosition(getViemProvider(provider, network), network, vaultId, extractedState, blockNumber); });
1128
+ export const _getFluidPositionWithMarket = (provider_1, network_1, vaultId_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, vaultId_1, ...args_1], void 0, function* (provider, network, vaultId, blockNumber = 'latest') {
1129
1129
  const view = FluidViewContractViem(provider, network);
1130
1130
  const [data, merklCampaigns] = yield Promise.all([
1131
- view.read.getPositionByNftId([BigInt(vaultId)]),
1131
+ view.read.getPositionByNftId([BigInt(vaultId)], setViemBlockNumber(blockNumber)),
1132
1132
  getFluidMerklCampaigns(network),
1133
1133
  ]);
1134
- const parsedMarketData = yield parseMarketData(provider, data[1], network);
1134
+ const parsedMarketData = yield parseMarketData(provider, data[1], network, null, blockNumber);
1135
1135
  if (!parsedMarketData) {
1136
1136
  return;
1137
1137
  }
@@ -1142,26 +1142,26 @@ export const _getFluidPositionWithMarket = (provider, network, vaultId) => __awa
1142
1142
  marketData,
1143
1143
  };
1144
1144
  });
1145
- export const getFluidPositionWithMarket = (provider, network, vaultId) => __awaiter(void 0, void 0, void 0, function* () { return _getFluidPositionWithMarket(getViemProvider(provider, network), network, vaultId); });
1146
- export const _getAllFluidMarketDataChunked = (network, provider) => __awaiter(void 0, void 0, void 0, function* () {
1145
+ export const getFluidPositionWithMarket = (provider_1, network_1, vaultId_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, vaultId_1, ...args_1], void 0, function* (provider, network, vaultId, blockNumber = 'latest') { return _getFluidPositionWithMarket(getViemProvider(provider, network), network, vaultId, blockNumber); });
1146
+ export const _getAllFluidMarketDataChunked = (network_1, provider_1, ...args_1) => __awaiter(void 0, [network_1, provider_1, ...args_1], void 0, function* (network, provider, blockNumber = 'latest') {
1147
1147
  const versions = getFluidVersionsDataForNetwork(network);
1148
1148
  const view = FluidViewContractViem(provider, network);
1149
1149
  const [data, merklCampaigns] = yield Promise.all([
1150
- Promise.all(versions.map((version) => view.read.getVaultData([version.marketAddress]))),
1150
+ Promise.all(versions.map((version) => view.read.getVaultData([version.marketAddress], setViemBlockNumber(blockNumber)))),
1151
1151
  getFluidMerklCampaigns(network),
1152
1152
  ]);
1153
1153
  return Promise.all(data.map((item) => __awaiter(void 0, void 0, void 0, function* () {
1154
- const marketData = yield parseMarketData(provider, item, network);
1154
+ const marketData = yield parseMarketData(provider, item, network, null, blockNumber);
1155
1155
  return marketData ? attachFluidMerklIncentives(marketData, merklCampaigns) : marketData;
1156
1156
  })));
1157
1157
  });
1158
- export const getAllFluidMarketDataChunked = (network, provider) => __awaiter(void 0, void 0, void 0, function* () { return _getAllFluidMarketDataChunked(network, getViemProvider(provider, network, { batch: { multicall: true } })); });
1159
- export const _getFluidTokenData = (provider, network, token) => __awaiter(void 0, void 0, void 0, function* () {
1158
+ export const getAllFluidMarketDataChunked = (network_1, provider_1, ...args_1) => __awaiter(void 0, [network_1, provider_1, ...args_1], void 0, function* (network, provider, blockNumber = 'latest') { return _getAllFluidMarketDataChunked(network, getViemProvider(provider, network, { batch: { multicall: true } }), blockNumber); });
1159
+ export const _getFluidTokenData = (provider_1, network_1, token_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, token_1, ...args_1], void 0, function* (provider, network, token, blockNumber = 'latest') {
1160
1160
  var _a, _b;
1161
1161
  const view = FluidViewContractViem(provider, network);
1162
1162
  const fTokenAddress = getFTokenAddress(token, network);
1163
1163
  const [data, rewardsApiResponse,] = yield Promise.all([
1164
- yield view.read.getFTokenData([fTokenAddress]),
1164
+ yield view.read.getFTokenData([fTokenAddress], setViemBlockNumber(blockNumber)),
1165
1165
  fetch(`https://api.fluid.instadapp.io/v2/lending/${network}/tokens/${fTokenAddress}`),
1166
1166
  ]);
1167
1167
  let rewardsData = { rewards: [] };
@@ -1188,7 +1188,7 @@ export const _getFluidTokenData = (provider, network, token) => __awaiter(void 0
1188
1188
  withdrawRate,
1189
1189
  };
1190
1190
  });
1191
- export const getFluidTokenData = (provider, network, token) => __awaiter(void 0, void 0, void 0, function* () { return _getFluidTokenData(getViemProvider(provider, network), network, token); });
1191
+ export const getFluidTokenData = (provider_1, network_1, token_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, token_1, ...args_1], void 0, function* (provider, network, token, blockNumber = 'latest') { return _getFluidTokenData(getViemProvider(provider, network), network, token, blockNumber); });
1192
1192
  const parseFDepositTokenData = (fTokenData, userPosition, apiData, fTokenAddress) => {
1193
1193
  var _a, _b;
1194
1194
  const decimals = fTokenData.decimals.toString();
@@ -1210,11 +1210,11 @@ const parseFDepositTokenData = (fTokenData, userPosition, apiData, fTokenAddress
1210
1210
  depositedShares: getEthAmountForDecimals(userPosition.fTokenShares.toString(), decimals),
1211
1211
  };
1212
1212
  };
1213
- export const _getFluidDepositData = (provider, network, token, address) => __awaiter(void 0, void 0, void 0, function* () {
1213
+ export const _getFluidDepositData = (provider_1, network_1, token_1, address_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, token_1, address_1, ...args_1], void 0, function* (provider, network, token, address, blockNumber = 'latest') {
1214
1214
  const view = FluidViewContractViem(provider, network);
1215
1215
  const fTokenAddress = getFTokenAddress(token, network);
1216
1216
  const [[userPosition, fTokenData], rewardsApiResponse,] = yield Promise.all([
1217
- view.read.getUserEarnPositionWithFToken([fTokenAddress, address]),
1217
+ view.read.getUserEarnPositionWithFToken([fTokenAddress, address], setViemBlockNumber(blockNumber)),
1218
1218
  fetch(`https://api.fluid.instadapp.io/v2/lending/${network}/tokens/${fTokenAddress}`),
1219
1219
  ]);
1220
1220
  let rewardsData = { rewards: [] };
@@ -1226,11 +1226,11 @@ export const _getFluidDepositData = (provider, network, token, address) => __awa
1226
1226
  }
1227
1227
  return parseFDepositTokenData(fTokenData, userPosition, rewardsData, fTokenAddress);
1228
1228
  });
1229
- export const getFluidDepositData = (provider, network, token, address) => __awaiter(void 0, void 0, void 0, function* () { return _getFluidDepositData(getViemProvider(provider, network), network, token, address); });
1230
- export const _getAllUserEarnPositionsWithFTokens = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () {
1229
+ export const getFluidDepositData = (provider_1, network_1, token_1, address_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, token_1, address_1, ...args_1], void 0, function* (provider, network, token, address, blockNumber = 'latest') { return _getFluidDepositData(getViemProvider(provider, network), network, token, address, blockNumber); });
1230
+ export const _getAllUserEarnPositionsWithFTokens = (provider_1, network_1, user_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, user_1, ...args_1], void 0, function* (provider, network, user, blockNumber = 'latest') {
1231
1231
  const view = FluidViewContractViem(provider, network);
1232
1232
  const [[userPositions, fTokensData], rewardsApiResponse,] = yield Promise.all([
1233
- view.read.getAllUserEarnPositionsWithFTokens([user]),
1233
+ view.read.getAllUserEarnPositionsWithFTokens([user], setViemBlockNumber(blockNumber)),
1234
1234
  fetch(`https://api.fluid.instadapp.io/v2/lending/${network}/tokens`),
1235
1235
  ]);
1236
1236
  let rewardsData = {
@@ -1254,14 +1254,14 @@ export const _getAllUserEarnPositionsWithFTokens = (provider, network, user) =>
1254
1254
  }, []);
1255
1255
  return parsedRes;
1256
1256
  });
1257
- export const getAllUserEarnPositionsWithFTokens = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () { return _getAllUserEarnPositionsWithFTokens(getViemProvider(provider, network), network, user); });
1258
- export const _getUserPositions = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () {
1257
+ export const getAllUserEarnPositionsWithFTokens = (provider_1, network_1, user_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, user_1, ...args_1], void 0, function* (provider, network, user, blockNumber = 'latest') { return _getAllUserEarnPositionsWithFTokens(getViemProvider(provider, network), network, user, blockNumber); });
1258
+ export const _getUserPositions = (provider_1, network_1, user_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, user_1, ...args_1], void 0, function* (provider, network, user, blockNumber = 'latest') {
1259
1259
  const view = FluidViewContractViem(provider, network);
1260
1260
  const [data, merklCampaigns] = yield Promise.all([
1261
- view.read.getUserPositions([user]),
1261
+ view.read.getUserPositions([user], setViemBlockNumber(blockNumber)),
1262
1262
  getFluidMerklCampaigns(network),
1263
1263
  ]);
1264
- const parsedMarketData = (yield Promise.all(data[1].map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network); }))))
1264
+ const parsedMarketData = (yield Promise.all(data[1].map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network, null, blockNumber); }))))
1265
1265
  .map(marketData => (marketData ? attachFluidMerklIncentives(marketData, merklCampaigns) : marketData));
1266
1266
  const userData = data[0].map((position, i) => (parsedMarketData[i] && Object.assign({}, parseUserData(position, parsedMarketData[i]))));
1267
1267
  return parsedMarketData.map((market, i) => ({
@@ -1269,39 +1269,39 @@ export const _getUserPositions = (provider, network, user) => __awaiter(void 0,
1269
1269
  userData: userData[i],
1270
1270
  })).filter(md => md.marketData !== undefined);
1271
1271
  });
1272
- export const getUserPositions = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () { return _getUserPositions(getViemProvider(provider, network), network, user); });
1273
- const getTokenPricePortfolio = (token, provider, network) => __awaiter(void 0, void 0, void 0, function* () {
1272
+ export const getUserPositions = (provider_1, network_1, user_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, user_1, ...args_1], void 0, function* (provider, network, user, blockNumber = 'latest') { return _getUserPositions(getViemProvider(provider, network), network, user, blockNumber); });
1273
+ const getTokenPricePortfolio = (token_1, provider_1, network_1, ...args_1) => __awaiter(void 0, [token_1, provider_1, network_1, ...args_1], void 0, function* (token, provider, network, blockNumber = 'latest') {
1274
1274
  if (token === 'ETH') {
1275
1275
  const ethFeedContract = ETHPriceFeedContractViem(provider, network);
1276
- return ethFeedContract.read.latestAnswer();
1276
+ return ethFeedContract.read.latestAnswer(setViemBlockNumber(blockNumber));
1277
1277
  }
1278
1278
  if (token === 'WBTC') {
1279
1279
  const wbtcFeedContract = BTCPriceFeedContractViem(provider, network);
1280
- return wbtcFeedContract.read.latestAnswer();
1280
+ return wbtcFeedContract.read.latestAnswer(setViemBlockNumber(blockNumber));
1281
1281
  }
1282
1282
  if (token === 'wstETH') {
1283
- return getWstETHPrice(provider, network);
1283
+ return getWstETHPrice(provider, network, blockNumber);
1284
1284
  }
1285
1285
  if (token === 'weETH' && network !== NetworkNumber.Plasma) {
1286
- return getWeETHPrice(provider, network);
1286
+ return getWeETHPrice(provider, network, blockNumber);
1287
1287
  }
1288
1288
  if (token === 'wrsETH') {
1289
- return getWsrETHPrice(provider, network);
1289
+ return getWsrETHPrice(provider, network, blockNumber);
1290
1290
  }
1291
1291
  if (token === 'syrupUSDT') {
1292
- return getSyrupUSDTPrice(provider, network);
1292
+ return getSyrupUSDTPrice(provider, network, blockNumber);
1293
1293
  }
1294
1294
  if (token === 'wstUSR') {
1295
- return getWstUSRPrice(provider, network);
1295
+ return getWstUSRPrice(provider, network, blockNumber);
1296
1296
  }
1297
1297
  const isMainnet = isMainnetNetwork(network);
1298
1298
  const chainLinkFeedAddress = getChainlinkAssetAddress(token, network);
1299
1299
  if (isMainnet) {
1300
1300
  const feedRegistryContract = FeedRegistryContractViem(provider, NetworkNumber.Eth);
1301
- return feedRegistryContract.read.latestAnswer([chainLinkFeedAddress, USD_QUOTE]);
1301
+ return feedRegistryContract.read.latestAnswer([chainLinkFeedAddress, USD_QUOTE], setViemBlockNumber(blockNumber));
1302
1302
  }
1303
1303
  const feedRegistryContract = DFSFeedRegistryContractViem(provider, network);
1304
- return feedRegistryContract.read.latestRoundData([chainLinkFeedAddress, USD_QUOTE]);
1304
+ return feedRegistryContract.read.latestRoundData([chainLinkFeedAddress, USD_QUOTE], setViemBlockNumber(blockNumber));
1305
1305
  });
1306
1306
  const tokensWithoutChainlinkPrices = ['sUSDS', 'USDA', 'ezETH', 'rsETH', 'weETHs', 'LBTC'];
1307
1307
  const handleTokenWithoutChainlinkPrice = (token, prices) => {
@@ -1328,12 +1328,12 @@ const handleTokenWithoutChainlinkPrice = (token, prices) => {
1328
1328
  }
1329
1329
  return '0';
1330
1330
  };
1331
- const getTokensPricesForPortfolio = (tokens, provider, network) => __awaiter(void 0, void 0, void 0, function* () {
1331
+ const getTokensPricesForPortfolio = (tokens_1, provider_1, network_1, ...args_1) => __awaiter(void 0, [tokens_1, provider_1, network_1, ...args_1], void 0, function* (tokens, provider, network, blockNumber = 'latest') {
1332
1332
  const tokensWithChainlinkPrices = tokens.filter((token) => !tokensWithoutChainlinkPrices.includes(token));
1333
1333
  const pricesFromChainlink = {};
1334
1334
  yield Promise.all(tokensWithChainlinkPrices.map((token) => __awaiter(void 0, void 0, void 0, function* () {
1335
1335
  try {
1336
- const price = yield getTokenPricePortfolio(token, provider, network);
1336
+ const price = yield getTokenPricePortfolio(token, provider, network, blockNumber);
1337
1337
  if (typeof price === 'string')
1338
1338
  pricesFromChainlink[token] = price;
1339
1339
  else if (typeof price === 'bigint')
@@ -1352,9 +1352,9 @@ const getTokensPricesForPortfolio = (tokens, provider, network) => __awaiter(voi
1352
1352
  });
1353
1353
  return pricesFromChainlink;
1354
1354
  });
1355
- export const _getUserPositionsPortfolio = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () {
1355
+ export const _getUserPositionsPortfolio = (provider_1, network_1, user_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, user_1, ...args_1], void 0, function* (provider, network, user, blockNumber = 'latest') {
1356
1356
  const view = FluidViewContractViem(provider, network);
1357
- const data = yield view.read.getUserPositions([user]);
1357
+ const data = yield view.read.getUserPositions([user], setViemBlockNumber(blockNumber));
1358
1358
  const tokens = Array.from(new Set(data[1].map((vaultData) => {
1359
1359
  const vaultTokens = [getAssetInfoByAddress(vaultData.supplyToken0, network).symbol, getAssetInfoByAddress(vaultData.borrowToken0, network).symbol];
1360
1360
  if (vaultData.supplyToken1 && !compareAddresses(ZERO_ADDRESS, vaultData.supplyToken1))
@@ -1371,10 +1371,10 @@ export const _getUserPositionsPortfolio = (provider, network, user) => __awaiter
1371
1371
  if (!tokens.includes('WBTC'))
1372
1372
  tokens.push('WBTC');
1373
1373
  const [tokenPrices, merklCampaigns] = yield Promise.all([
1374
- getTokensPricesForPortfolio(tokens, provider, network),
1374
+ getTokensPricesForPortfolio(tokens, provider, network, blockNumber),
1375
1375
  getFluidMerklCampaigns(network),
1376
1376
  ]);
1377
- const parsedMarketData = (yield Promise.all(data[1].map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network, tokenPrices); }))))
1377
+ const parsedMarketData = (yield Promise.all(data[1].map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network, tokenPrices, blockNumber); }))))
1378
1378
  .map(marketData => (marketData ? attachFluidMerklIncentives(marketData, merklCampaigns) : marketData));
1379
1379
  const userData = data[0].map((position, i) => (parsedMarketData[i] && Object.assign({}, parseUserData(position, parsedMarketData[i]))));
1380
1380
  return parsedMarketData.map((market, i) => ({
@@ -1382,12 +1382,13 @@ export const _getUserPositionsPortfolio = (provider, network, user) => __awaiter
1382
1382
  userData: userData[i],
1383
1383
  })).filter(md => md.marketData !== undefined);
1384
1384
  });
1385
- export const _getAllFluidMarketDataPortfolio = (provider, network) => __awaiter(void 0, void 0, void 0, function* () {
1385
+ /** `blockTimestamp` (unix seconds) is the historical block's timestamp when already known; otherwise it is read from the block. */
1386
+ export const _getAllFluidMarketDataPortfolio = (provider_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, ...args_1], void 0, function* (provider, network, blockNumber = 'latest', blockTimestamp) {
1386
1387
  const versions = getFluidVersionsDataForNetwork(network);
1387
1388
  if (versions.length === 0)
1388
1389
  return {};
1389
1390
  const view = FluidViewContractViem(provider, network);
1390
- const vaultsData = yield Promise.all(versions.map((version) => view.read.getVaultData([version.marketAddress])));
1391
+ const vaultsData = yield Promise.all(versions.map((version) => view.read.getVaultData([version.marketAddress], setViemBlockNumber(blockNumber))));
1391
1392
  const tokens = Array.from(new Set(vaultsData.map((vaultData) => {
1392
1393
  const vaultTokens = [getAssetInfoByAddress(vaultData.supplyToken0, network).symbol, getAssetInfoByAddress(vaultData.borrowToken0, network).symbol];
1393
1394
  if (vaultData.supplyToken1 && !compareAddresses(ZERO_ADDRESS, vaultData.supplyToken1))
@@ -1402,10 +1403,12 @@ export const _getAllFluidMarketDataPortfolio = (provider, network) => __awaiter(
1402
1403
  if (!tokens.includes('WBTC'))
1403
1404
  tokens.push('WBTC');
1404
1405
  const [tokenPrices, merklCampaigns] = yield Promise.all([
1405
- getTokensPricesForPortfolio(tokens, provider, network),
1406
- getFluidMerklCampaigns(network),
1406
+ getTokensPricesForPortfolio(tokens, provider, network, blockNumber),
1407
+ // Merkl rewards are keyed by time: a historical block resolves to its timestamp first (one RPC
1408
+ // call unless given, none for 'latest') so the rewards in force at that moment are attached.
1409
+ getBlockTimestamp(provider, blockNumber, blockTimestamp).then((asOfTimestamp) => getFluidMerklCampaigns(network, asOfTimestamp)),
1407
1410
  ]);
1408
- const parsedMarketsData = yield Promise.all(vaultsData.map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network, tokenPrices); })));
1411
+ const parsedMarketsData = yield Promise.all(vaultsData.map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network, tokenPrices, blockNumber); })));
1409
1412
  const marketsData = {};
1410
1413
  parsedMarketsData.forEach((marketData, i) => {
1411
1414
  if (!marketData)
@@ -1414,4 +1417,4 @@ export const _getAllFluidMarketDataPortfolio = (provider, network) => __awaiter(
1414
1417
  });
1415
1418
  return marketsData;
1416
1419
  });
1417
- export const getAllFluidMarketDataPortfolio = (provider, network) => __awaiter(void 0, void 0, void 0, function* () { return _getAllFluidMarketDataPortfolio(getViemProvider(provider, network, { batch: { multicall: true } }), network); });
1420
+ export const getAllFluidMarketDataPortfolio = (provider_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, ...args_1], void 0, function* (provider, network, blockNumber = 'latest', blockTimestamp) { return _getAllFluidMarketDataPortfolio(getViemProvider(provider, network, { batch: { multicall: true } }), network, blockNumber, blockTimestamp); });
@@ -20,10 +20,12 @@ export declare enum FluidMerklOpportunityType {
20
20
  }
21
21
  export declare const buildFluidMerklRewardMap: (opportunities: MerklOpportunity[], chainId: NetworkNumber) => FluidMerklRewardMap;
22
22
  /**
23
- * Fetches live vault-scoped Fluid campaigns for the chain, keyed by vault address. Never throws —
24
- * on any failure it returns an empty map, so Merkl being down can't break market data.
23
+ * Fetches live vault-scoped Fluid campaigns for the chain, keyed by vault address. With
24
+ * `asOfTimestamp` (unix seconds) the campaigns and APRs are the ones Merkl had at that moment
25
+ * instead. Never throws — on any failure it returns an empty map, so Merkl being down can't break
26
+ * market data.
25
27
  */
26
- export declare const getFluidMerklCampaigns: ((chainId: NetworkNumber) => Promise<FluidMerklRewardMap>) & memoize.Memoized<(chainId: NetworkNumber) => Promise<FluidMerklRewardMap>>;
28
+ export declare const getFluidMerklCampaigns: ((chainId: NetworkNumber, asOfTimestamp?: number) => Promise<FluidMerklRewardMap>) & memoize.Memoized<(chainId: NetworkNumber, asOfTimestamp?: number) => Promise<FluidMerklRewardMap>>;
27
29
  /**
28
30
  * Appends the vault's Merkl campaigns to its assets' incentive arrays — supply rewards on every
29
31
  * suppliable asset and borrow rewards on every borrowable one. Smart collateral/debt vaults hold
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import memoize from 'memoizee';
11
11
  import { aprToApy } from '../moneymarket';
12
- import { fetchAllMerklOpportunities } from '../services/merkl';
12
+ import { fetchMerklOpportunities } from '../services/merkl';
13
13
  import { IncentiveKind, IncentiveSource, OpportunityStatus, } from '../types';
14
14
  /**
15
15
  * Merkl tags Fluid vault-scoped reward campaigns via the opportunity `type` field:
@@ -63,23 +63,28 @@ export const buildFluidMerklRewardMap = (opportunities, chainId) => {
63
63
  return result;
64
64
  };
65
65
  /**
66
- * Fetches live vault-scoped Fluid campaigns for the chain, keyed by vault address. Never throws —
67
- * on any failure it returns an empty map, so Merkl being down can't break market data.
66
+ * Fetches live vault-scoped Fluid campaigns for the chain, keyed by vault address. With
67
+ * `asOfTimestamp` (unix seconds) the campaigns and APRs are the ones Merkl had at that moment
68
+ * instead. Never throws — on any failure it returns an empty map, so Merkl being down can't break
69
+ * market data.
68
70
  */
69
- export const getFluidMerklCampaigns = memoize((chainId) => __awaiter(void 0, void 0, void 0, function* () {
71
+ export const getFluidMerklCampaigns = memoize((chainId, asOfTimestamp) => __awaiter(void 0, void 0, void 0, function* () {
70
72
  try {
71
- const opportunities = yield fetchAllMerklOpportunities({
73
+ const opportunities = yield fetchMerklOpportunities({
72
74
  mainProtocolId: 'fluid',
75
+ chainId: chainId.toString(),
73
76
  type: Object.values(FluidMerklOpportunityType).join(','),
74
77
  status: OpportunityStatus.LIVE,
75
- });
78
+ }, asOfTimestamp);
76
79
  return buildFluidMerklRewardMap(opportunities, chainId);
77
80
  }
78
81
  catch (e) {
79
82
  console.error('Failed to fetch Fluid Merkl campaigns', e);
80
83
  return {};
81
84
  }
82
- }), { promise: true, maxAge: 60 * 1000 });
85
+ // memoizee keys on the declared arity, which excludes optional params — `length: 2` keeps the
86
+ // timestamp in the cache key so a historical lookup never serves (or is served by) the live one
87
+ }), { promise: true, maxAge: 60 * 1000, length: 2 });
83
88
  /**
84
89
  * Appends the vault's Merkl campaigns to its assets' incentive arrays — supply rewards on every
85
90
  * suppliable asset and borrow rewards on every borrowable one. Smart collateral/debt vaults hold
@@ -5,10 +5,10 @@ export declare const LIQUITY_NORMAL_MODE_RATIO = 110;
5
5
  export declare const LIQUITY_RECOVERY_MODE_RATIO = 150;
6
6
  export declare const _getLiquityAccountBalances: (provider: Client, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress) => Promise<PositionBalances>;
7
7
  export declare const getLiquityAccountBalances: (provider: EthereumProvider, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress) => Promise<PositionBalances>;
8
- export declare const getDebtInFront: (provider: EthereumProvider, address: EthAddress) => Promise<string>;
9
- export declare const _getLiquityTroveInfo: (provider: Client, network: NetworkNumber, address: EthAddress) => Promise<LiquityTroveInfo>;
10
- export declare const getLiquityTroveInfo: (provider: EthereumProvider, network: NetworkNumber, address: EthAddress) => Promise<LiquityTroveInfo>;
11
- export declare const getLiquityStakingData: (provider: Client, network: NetworkNumber, address: EthAddress) => Promise<{
8
+ export declare const getDebtInFront: (provider: EthereumProvider, address: EthAddress, blockNumber?: Blockish) => Promise<string>;
9
+ export declare const _getLiquityTroveInfo: (provider: Client, network: NetworkNumber, address: EthAddress, blockNumber?: Blockish) => Promise<LiquityTroveInfo>;
10
+ export declare const getLiquityTroveInfo: (provider: EthereumProvider, network: NetworkNumber, address: EthAddress, blockNumber?: Blockish) => Promise<LiquityTroveInfo>;
11
+ export declare const getLiquityStakingData: (provider: Client, network: NetworkNumber, address: EthAddress, blockNumber?: Blockish) => Promise<{
12
12
  totalLUSDDeposited: string;
13
13
  totalLQTYStaked: string;
14
14
  stakedLQTY: string;
@@ -40,33 +40,33 @@ export const _getLiquityAccountBalances = (provider, network, block, addressMapp
40
40
  return balances;
41
41
  });
42
42
  export const getLiquityAccountBalances = (provider, network, block, addressMapping, address) => __awaiter(void 0, void 0, void 0, function* () { return _getLiquityAccountBalances(getViemProvider(provider, network), network, block, addressMapping, address); });
43
- const _getDebtInFront = (viewContract_1, address_1, ...args_1) => __awaiter(void 0, [viewContract_1, address_1, ...args_1], void 0, function* (viewContract, address, accumulatedSum = '0', iterations = 2000) {
44
- const res = yield viewContract.read.getDebtInFront([address, accumulatedSum, iterations]);
43
+ const _getDebtInFront = (viewContract_1, address_1, ...args_1) => __awaiter(void 0, [viewContract_1, address_1, ...args_1], void 0, function* (viewContract, address, accumulatedSum = '0', iterations = 2000, blockNumber = 'latest') {
44
+ const res = yield viewContract.read.getDebtInFront([address, accumulatedSum, iterations], setViemBlockNumber(blockNumber));
45
45
  const debt = res[1].toString();
46
46
  const next = res[0];
47
47
  if (next === ZERO_ADDRESS)
48
48
  return assetAmountInEth(debt, 'LUSD');
49
- return _getDebtInFront(viewContract, next, debt, iterations);
49
+ return _getDebtInFront(viewContract, next, debt, iterations, blockNumber);
50
50
  });
51
- export const getDebtInFront = (provider, address) => __awaiter(void 0, void 0, void 0, function* () {
51
+ export const getDebtInFront = (provider_1, address_1, ...args_1) => __awaiter(void 0, [provider_1, address_1, ...args_1], void 0, function* (provider, address, blockNumber = 'latest') {
52
52
  const client = getViemProvider(provider, NetworkNumber.Eth);
53
53
  const viewContract = LiquityViewContractViem(client, NetworkNumber.Eth);
54
- return _getDebtInFront(viewContract, address);
54
+ return _getDebtInFront(viewContract, address, '0', 2000, blockNumber);
55
55
  });
56
- export const _getLiquityTroveInfo = (provider, network, address) => __awaiter(void 0, void 0, void 0, function* () {
56
+ export const _getLiquityTroveInfo = (provider_1, network_1, address_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, address_1, ...args_1], void 0, function* (provider, network, address, blockNumber = 'latest') {
57
57
  const viewContract = LiquityViewContractViem(provider, network);
58
58
  const collSurplusPoolContract = LiquityCollSurplusPoolContractViem(provider, network);
59
59
  const troveManagerContract = LiquityTroveManagerContractViem(provider, network);
60
60
  const priceFeedContract = LiquityPriceFeedContractViem(provider, network);
61
61
  const activePoolContract = LiquityActivePoolContractViem(provider, network);
62
62
  const [troveInfo, collSurplusInfo, borrowingRateWithDecay, assetPrice, totalETH, totalLUSD, debtInFront,] = yield Promise.all([
63
- viewContract.read.getTroveInfo([address]),
64
- collSurplusPoolContract.read.getCollateral([address]),
65
- troveManagerContract.read.getBorrowingRateWithDecay(),
66
- priceFeedContract.read.fetchPrice(),
67
- activePoolContract.read.getETH(),
68
- activePoolContract.read.getLUSDDebt(),
69
- _getDebtInFront(viewContract, address),
63
+ viewContract.read.getTroveInfo([address], setViemBlockNumber(blockNumber)),
64
+ collSurplusPoolContract.read.getCollateral([address], setViemBlockNumber(blockNumber)),
65
+ troveManagerContract.read.getBorrowingRateWithDecay(setViemBlockNumber(blockNumber)),
66
+ priceFeedContract.read.fetchPrice(setViemBlockNumber(blockNumber)),
67
+ activePoolContract.read.getETH(setViemBlockNumber(blockNumber)),
68
+ activePoolContract.read.getLUSDDebt(setViemBlockNumber(blockNumber)),
69
+ _getDebtInFront(viewContract, address, '0', 2000, blockNumber),
70
70
  ]);
71
71
  const recoveryMode = troveInfo[6];
72
72
  const minCollateralRatio = recoveryMode ? LIQUITY_RECOVERY_MODE_RATIO : LIQUITY_NORMAL_MODE_RATIO;
@@ -100,19 +100,19 @@ export const _getLiquityTroveInfo = (provider, network, address) => __awaiter(vo
100
100
  };
101
101
  return payload;
102
102
  });
103
- export const getLiquityTroveInfo = (provider, network, address) => __awaiter(void 0, void 0, void 0, function* () { return _getLiquityTroveInfo(getViemProvider(provider, network, { batch: { multicall: true } }), network, address); });
104
- export const getLiquityStakingData = (provider, network, address) => __awaiter(void 0, void 0, void 0, function* () {
103
+ export const getLiquityTroveInfo = (provider_1, network_1, address_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, address_1, ...args_1], void 0, function* (provider, network, address, blockNumber = 'latest') { return _getLiquityTroveInfo(getViemProvider(provider, network, { batch: { multicall: true } }), network, address, blockNumber); });
104
+ export const getLiquityStakingData = (provider_1, network_1, address_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, address_1, ...args_1], void 0, function* (provider, network, address, blockNumber = 'latest') {
105
105
  const lqtyStakingView = LiquityLQTYStakingViem(provider, network);
106
106
  const stabilityPoolView = LiquityStabilityPoolViem(provider, network);
107
107
  const [stakes, pendingETHGain, pendingLUSDGain, totalLQTYStakes, stabilityPoolETHGain, stabilityPoolLQTYGain, compoundedLUSDDeposit, totalLUSDDeposits,] = yield Promise.all([
108
- lqtyStakingView.read.stakes([address]),
109
- lqtyStakingView.read.getPendingETHGain([address]),
110
- lqtyStakingView.read.getPendingLUSDGain([address]),
111
- lqtyStakingView.read.totalLQTYStaked(),
112
- stabilityPoolView.read.getDepositorETHGain([address]),
113
- stabilityPoolView.read.getDepositorLQTYGain([address]),
114
- stabilityPoolView.read.getCompoundedLUSDDeposit([address]),
115
- stabilityPoolView.read.getTotalLUSDDeposits(),
108
+ lqtyStakingView.read.stakes([address], setViemBlockNumber(blockNumber)),
109
+ lqtyStakingView.read.getPendingETHGain([address], setViemBlockNumber(blockNumber)),
110
+ lqtyStakingView.read.getPendingLUSDGain([address], setViemBlockNumber(blockNumber)),
111
+ lqtyStakingView.read.totalLQTYStaked(setViemBlockNumber(blockNumber)),
112
+ stabilityPoolView.read.getDepositorETHGain([address], setViemBlockNumber(blockNumber)),
113
+ stabilityPoolView.read.getDepositorLQTYGain([address], setViemBlockNumber(blockNumber)),
114
+ stabilityPoolView.read.getCompoundedLUSDDeposit([address], setViemBlockNumber(blockNumber)),
115
+ stabilityPoolView.read.getTotalLUSDDeposits(setViemBlockNumber(blockNumber)),
116
116
  ]);
117
117
  const totalLUSDDeposited = getEthAmountForDecimals(totalLUSDDeposits, 18);
118
118
  const totalLQTYStaked = getEthAmountForDecimals(totalLQTYStakes, 18);