morpho-contracts-helper 0.0.20 → 0.0.21

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 (91) hide show
  1. package/contracts/MorphoMarketDataFetcher.sol +36 -77
  2. package/contracts/OracleFactory.sol +301 -63
  3. package/dist/typechain-types/contracts/{MorphoMarketDataFetcher.sol/MorphoMarketDataFetcher.d.ts → MorphoMarketDataFetcher.d.ts} +7 -7
  4. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.d.ts.map +1 -0
  5. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.js.map +1 -0
  6. package/dist/typechain-types/contracts/OracleFactory.sol/ManualChainlinkMockFeed.d.ts +132 -6
  7. package/dist/typechain-types/contracts/OracleFactory.sol/ManualChainlinkMockFeed.d.ts.map +1 -1
  8. package/dist/typechain-types/contracts/OracleFactory.sol/ManualChainlinkMockFeedFactory.d.ts +11 -21
  9. package/dist/typechain-types/contracts/OracleFactory.sol/ManualChainlinkMockFeedFactory.d.ts.map +1 -1
  10. package/dist/typechain-types/contracts/OracleFactory.sol/index.d.ts +0 -1
  11. package/dist/typechain-types/contracts/OracleFactory.sol/index.d.ts.map +1 -1
  12. package/dist/typechain-types/contracts/index.d.ts +1 -2
  13. package/dist/typechain-types/contracts/index.d.ts.map +1 -1
  14. package/dist/typechain-types/factories/contracts/{MorphoMarketDataFetcher.sol/MorphoMarketDataFetcher__factory.d.ts → MorphoMarketDataFetcher__factory.d.ts} +13 -13
  15. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher__factory.d.ts.map +1 -0
  16. package/dist/typechain-types/factories/contracts/{MorphoMarketDataFetcher.sol/MorphoMarketDataFetcher__factory.js → MorphoMarketDataFetcher__factory.js} +11 -11
  17. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher__factory.js.map +1 -0
  18. package/dist/typechain-types/factories/contracts/OracleFactory.sol/ManualChainlinkMockFeedFactory__factory.d.ts +7 -37
  19. package/dist/typechain-types/factories/contracts/OracleFactory.sol/ManualChainlinkMockFeedFactory__factory.d.ts.map +1 -1
  20. package/dist/typechain-types/factories/contracts/OracleFactory.sol/ManualChainlinkMockFeedFactory__factory.js +8 -48
  21. package/dist/typechain-types/factories/contracts/OracleFactory.sol/ManualChainlinkMockFeedFactory__factory.js.map +1 -1
  22. package/dist/typechain-types/factories/contracts/OracleFactory.sol/ManualChainlinkMockFeed__factory.d.ts +191 -7
  23. package/dist/typechain-types/factories/contracts/OracleFactory.sol/ManualChainlinkMockFeed__factory.d.ts.map +1 -1
  24. package/dist/typechain-types/factories/contracts/OracleFactory.sol/ManualChainlinkMockFeed__factory.js +246 -9
  25. package/dist/typechain-types/factories/contracts/OracleFactory.sol/ManualChainlinkMockFeed__factory.js.map +1 -1
  26. package/dist/typechain-types/factories/contracts/OracleFactory.sol/index.d.ts +0 -1
  27. package/dist/typechain-types/factories/contracts/OracleFactory.sol/index.d.ts.map +1 -1
  28. package/dist/typechain-types/factories/contracts/OracleFactory.sol/index.js +1 -3
  29. package/dist/typechain-types/factories/contracts/OracleFactory.sol/index.js.map +1 -1
  30. package/dist/typechain-types/factories/contracts/index.d.ts +1 -1
  31. package/dist/typechain-types/factories/contracts/index.d.ts.map +1 -1
  32. package/dist/typechain-types/factories/contracts/index.js +3 -2
  33. package/dist/typechain-types/factories/contracts/index.js.map +1 -1
  34. package/dist/typechain-types/index.d.ts +2 -4
  35. package/dist/typechain-types/index.d.ts.map +1 -1
  36. package/dist/typechain-types/index.js +3 -5
  37. package/dist/typechain-types/index.js.map +1 -1
  38. package/package.json +1 -1
  39. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IChainlinkAggregator.d.ts +0 -60
  40. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IChainlinkAggregator.d.ts.map +0 -1
  41. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IChainlinkAggregator.js +0 -3
  42. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IChainlinkAggregator.js.map +0 -1
  43. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IERC20Metadata.d.ts +0 -48
  44. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IERC20Metadata.d.ts.map +0 -1
  45. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IERC20Metadata.js +0 -3
  46. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IERC20Metadata.js.map +0 -1
  47. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IMorpho.d.ts +0 -84
  48. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IMorpho.d.ts.map +0 -1
  49. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IMorpho.js +0 -3
  50. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IMorpho.js.map +0 -1
  51. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IMorphoChainlinkOracleV2.d.ts +0 -62
  52. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IMorphoChainlinkOracleV2.d.ts.map +0 -1
  53. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IMorphoChainlinkOracleV2.js +0 -3
  54. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/IMorphoChainlinkOracleV2.js.map +0 -1
  55. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/MorphoMarketDataFetcher.d.ts.map +0 -1
  56. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/MorphoMarketDataFetcher.js.map +0 -1
  57. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/index.d.ts +0 -6
  58. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/index.d.ts.map +0 -1
  59. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/index.js +0 -3
  60. package/dist/typechain-types/contracts/MorphoMarketDataFetcher.sol/index.js.map +0 -1
  61. package/dist/typechain-types/contracts/OracleFactory.sol/IChainlinkAggregator.d.ts +0 -60
  62. package/dist/typechain-types/contracts/OracleFactory.sol/IChainlinkAggregator.d.ts.map +0 -1
  63. package/dist/typechain-types/contracts/OracleFactory.sol/IChainlinkAggregator.js +0 -3
  64. package/dist/typechain-types/contracts/OracleFactory.sol/IChainlinkAggregator.js.map +0 -1
  65. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IChainlinkAggregator__factory.d.ts +0 -44
  66. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IChainlinkAggregator__factory.d.ts.map +0 -1
  67. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IChainlinkAggregator__factory.js +0 -67
  68. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IChainlinkAggregator__factory.js.map +0 -1
  69. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IERC20Metadata__factory.d.ts +0 -56
  70. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IERC20Metadata__factory.d.ts.map +0 -1
  71. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IERC20Metadata__factory.js +0 -84
  72. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IERC20Metadata__factory.js.map +0 -1
  73. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IMorphoChainlinkOracleV2__factory.d.ts +0 -108
  74. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IMorphoChainlinkOracleV2__factory.d.ts.map +0 -1
  75. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IMorphoChainlinkOracleV2__factory.js +0 -151
  76. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IMorphoChainlinkOracleV2__factory.js.map +0 -1
  77. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IMorpho__factory.d.ts +0 -69
  78. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IMorpho__factory.d.ts.map +0 -1
  79. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IMorpho__factory.js +0 -101
  80. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/IMorpho__factory.js.map +0 -1
  81. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/MorphoMarketDataFetcher__factory.d.ts.map +0 -1
  82. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/MorphoMarketDataFetcher__factory.js.map +0 -1
  83. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/index.d.ts +0 -6
  84. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/index.d.ts.map +0 -1
  85. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/index.js +0 -18
  86. package/dist/typechain-types/factories/contracts/MorphoMarketDataFetcher.sol/index.js.map +0 -1
  87. package/dist/typechain-types/factories/contracts/OracleFactory.sol/IChainlinkAggregator__factory.d.ts +0 -44
  88. package/dist/typechain-types/factories/contracts/OracleFactory.sol/IChainlinkAggregator__factory.d.ts.map +0 -1
  89. package/dist/typechain-types/factories/contracts/OracleFactory.sol/IChainlinkAggregator__factory.js +0 -67
  90. package/dist/typechain-types/factories/contracts/OracleFactory.sol/IChainlinkAggregator__factory.js.map +0 -1
  91. /package/dist/typechain-types/contracts/{MorphoMarketDataFetcher.sol/MorphoMarketDataFetcher.js → MorphoMarketDataFetcher.js} +0 -0
@@ -1,53 +1,12 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
  pragma solidity ^0.8.20;
3
3
 
4
- struct MarketParams {
5
- address loanToken;
6
- address collateralToken;
7
- address oracle;
8
- address irm;
9
- uint256 lltv;
10
- }
11
-
12
- interface IChainlinkAggregator {
13
- function decimals() external view returns (uint8);
14
-
15
- function latestRoundData()
16
- external
17
- view
18
- returns (
19
- uint80 roundId,
20
- int256 answer,
21
- uint256 startedAt,
22
- uint256 updatedAt,
23
- uint80 answeredInRound
24
- );
25
- }
26
-
27
- interface IERC20Metadata {
28
- function name() external view returns (string memory);
29
- function symbol() external view returns (string memory);
30
- function decimals() external view returns (uint8);
31
- function allowance(address owner, address spender) external view returns (uint256);
32
- }
33
-
34
- interface IMorphoChainlinkOracleV2 {
35
- function BASE_FEED_1() external view returns (address);
36
- function BASE_FEED_2() external view returns (address);
37
- function BASE_VAULT() external view returns (address);
38
- function BASE_VAULT_CONVERSION_SAMPLE() external view returns (address);
39
- function QUOTE_FEED_1() external view returns (address);
40
- function QUOTE_FEED_2() external view returns (address);
41
- function QUOTE_VAULT() external view returns (address);
42
- function QUOTE_VAULT_CONVERSION_SAMPLE() external view returns (address);
43
- function SCALE_FACTOR() external view returns (uint256);
44
- function price() external view returns (uint256);
45
- }
46
-
47
- interface IMorpho {
48
- function position(bytes32 marketId, address account) external view returns (uint128 supplyShares, uint128 borrowShares, uint128 collateral);
49
- function idToMarketParams(bytes32 marketId) external view returns (MarketParams memory);
50
- }
4
+ import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
5
+
6
+ import {AggregatorV3Interface} from "./external/morpho/interfaces/AggregatorV3Interface.sol";
7
+ import {IMorpho, MarketParams, Market, Id, Position} from "./external/morpho/interfaces/IMorpho.sol";
8
+ import {IMorphoChainlinkOracleV2} from "./external/morpho/interfaces/IMorphoChainlinkOracleV2.sol";
9
+ import {IERC4626} from "./external/morpho/interfaces/IERC4626.sol";
51
10
 
52
11
  contract MorphoMarketDataFetcher {
53
12
 
@@ -74,14 +33,14 @@ contract MorphoMarketDataFetcher {
74
33
 
75
34
  struct OracleInfo {
76
35
  address oracleAddress;
77
- address baseFeed1;
78
- address baseFeed2;
79
- address baseVault;
80
- address baseVaultConversionSample;
81
- address quoteFeed1;
82
- address quoteFeed2;
83
- address quoteVault;
84
- address quoteVaultConversionSample;
36
+ AggregatorV3Interface baseFeed1;
37
+ AggregatorV3Interface baseFeed2;
38
+ IERC4626 baseVault;
39
+ uint256 baseVaultConversionSample;
40
+ AggregatorV3Interface quoteFeed1;
41
+ AggregatorV3Interface quoteFeed2;
42
+ IERC4626 quoteVault;
43
+ uint256 quoteVaultConversionSample;
85
44
  uint256 scaleFactor;
86
45
  uint256 currentPrice;
87
46
  MockOracleInfo baseFeed;
@@ -101,7 +60,7 @@ contract MorphoMarketDataFetcher {
101
60
  address user
102
61
  ) external view returns (MarketData memory data) {
103
62
 
104
- MarketParams memory params = IMorpho(morphoAddress).idToMarketParams(marketId);
63
+ MarketParams memory params = IMorpho(morphoAddress).idToMarketParams(Id.wrap(marketId));
105
64
 
106
65
  data.marketParams = params;
107
66
 
@@ -123,49 +82,49 @@ contract MorphoMarketDataFetcher {
123
82
 
124
83
  if (params.oracle != address(0)) {
125
84
  data.oracle.oracleAddress = params.oracle;
126
- try IMorphoChainlinkOracleV2(params.oracle).BASE_FEED_1() returns (address a) { data.oracle.baseFeed1 = a; } catch {}
127
- try IMorphoChainlinkOracleV2(params.oracle).BASE_FEED_2() returns (address a) { data.oracle.baseFeed2 = a; } catch {}
128
- try IMorphoChainlinkOracleV2(params.oracle).BASE_VAULT() returns (address a) { data.oracle.baseVault = a; } catch {}
129
- try IMorphoChainlinkOracleV2(params.oracle).BASE_VAULT_CONVERSION_SAMPLE() returns (address a) { data.oracle.baseVaultConversionSample = a; } catch {}
130
- try IMorphoChainlinkOracleV2(params.oracle).QUOTE_FEED_1() returns (address a) { data.oracle.quoteFeed1 = a; } catch {}
131
- try IMorphoChainlinkOracleV2(params.oracle).QUOTE_FEED_2() returns (address a) { data.oracle.quoteFeed2 = a; } catch {}
132
- try IMorphoChainlinkOracleV2(params.oracle).QUOTE_VAULT() returns (address a) { data.oracle.quoteVault = a; } catch {}
133
- try IMorphoChainlinkOracleV2(params.oracle).QUOTE_VAULT_CONVERSION_SAMPLE() returns (address a) { data.oracle.quoteVaultConversionSample = a; } catch {}
85
+ try IMorphoChainlinkOracleV2(params.oracle).BASE_FEED_1() returns (AggregatorV3Interface a) { data.oracle.baseFeed1 = a; } catch {}
86
+ try IMorphoChainlinkOracleV2(params.oracle).BASE_FEED_2() returns (AggregatorV3Interface a) { data.oracle.baseFeed2 = a; } catch {}
87
+ try IMorphoChainlinkOracleV2(params.oracle).BASE_VAULT() returns (IERC4626 a) { data.oracle.baseVault = a; } catch {}
88
+ try IMorphoChainlinkOracleV2(params.oracle).BASE_VAULT_CONVERSION_SAMPLE() returns (uint256 a) { data.oracle.baseVaultConversionSample = a; } catch {}
89
+ try IMorphoChainlinkOracleV2(params.oracle).QUOTE_FEED_1() returns (AggregatorV3Interface a) { data.oracle.quoteFeed1 = a; } catch {}
90
+ try IMorphoChainlinkOracleV2(params.oracle).QUOTE_FEED_2() returns (AggregatorV3Interface a) { data.oracle.quoteFeed2 = a; } catch {}
91
+ try IMorphoChainlinkOracleV2(params.oracle).QUOTE_VAULT() returns (IERC4626 a) { data.oracle.quoteVault = a; } catch {}
92
+ try IMorphoChainlinkOracleV2(params.oracle).QUOTE_VAULT_CONVERSION_SAMPLE() returns (uint256 a) { data.oracle.quoteVaultConversionSample = a; } catch {}
134
93
  try IMorphoChainlinkOracleV2(params.oracle).SCALE_FACTOR() returns (uint256 s) { data.oracle.scaleFactor = s; } catch {}
135
94
  try IMorphoChainlinkOracleV2(params.oracle).price() returns (uint256 p) { data.oracle.currentPrice = p; } catch {}
136
95
  }
137
96
 
138
- if (data.oracle.baseFeed1 != address(0)) {
139
- data.oracle.baseFeed.oracleAddress = data.oracle.baseFeed1;
97
+ if (address(data.oracle.baseFeed1) != address(0)) {
98
+ data.oracle.baseFeed.oracleAddress = address(data.oracle.baseFeed1);
140
99
 
141
- try IChainlinkAggregator(data.oracle.baseFeed1).latestRoundData() returns (
100
+ try data.oracle.baseFeed1.latestRoundData() returns (
142
101
  uint80, int256 answer, uint256, uint256, uint80
143
102
  ) {
144
103
  data.oracle.baseFeed.price = answer > 0 ? uint256(answer) : 0;
145
104
  } catch {}
146
105
 
147
- try IChainlinkAggregator(data.oracle.baseFeed1).decimals() returns (uint8 _dec) { data.oracle.baseFeed.decimals = _dec; } catch {}
148
- try IERC20Metadata(data.oracle.baseFeed1).symbol() returns (string memory _sym) { data.oracle.baseFeed.symbol = _sym; } catch {}
106
+ try data.oracle.baseFeed1.decimals() returns (uint8 _dec) { data.oracle.baseFeed.decimals = _dec; } catch {}
107
+ try data.oracle.baseFeed1.description() returns (string memory _sym) { data.oracle.baseFeed.symbol = _sym; } catch {}
149
108
  }
150
109
 
151
- if (data.oracle.quoteFeed1 != address(0)) {
152
- data.oracle.quoteFeed.oracleAddress = data.oracle.quoteFeed1;
110
+ if (address(data.oracle.quoteFeed1) != address(0)) {
111
+ data.oracle.quoteFeed.oracleAddress = address(data.oracle.quoteFeed1);
153
112
 
154
- try IChainlinkAggregator(data.oracle.quoteFeed1).latestRoundData() returns (
113
+ try data.oracle.quoteFeed1.latestRoundData() returns (
155
114
  uint80, int256 answer, uint256, uint256, uint80
156
115
  ) {
157
116
  data.oracle.quoteFeed.price = answer > 0 ? uint256(answer) : 0;
158
117
  } catch {}
159
118
 
160
- try IChainlinkAggregator(data.oracle.quoteFeed1).decimals() returns (uint8 _dec) { data.oracle.quoteFeed.decimals = _dec; } catch {}
161
- try IERC20Metadata(data.oracle.quoteFeed1).symbol() returns (string memory _sym) { data.oracle.quoteFeed.symbol = _sym; } catch {}
119
+ try data.oracle.quoteFeed1.decimals() returns (uint8 _dec) { data.oracle.quoteFeed.decimals = _dec; } catch {}
120
+ try data.oracle.quoteFeed1.description() returns (string memory _sym) { data.oracle.quoteFeed.symbol = _sym; } catch {}
162
121
  }
163
122
 
164
123
  if (morphoAddress != address(0) && marketId != bytes32(0)) {
165
124
  address deadAddress = 0x000000000000000000000000000000000000dEaD;
166
- try IMorpho(morphoAddress).position(marketId, deadAddress) returns (uint128 supplyShares, uint128, uint128) {
167
- data.deadAddressSupply = uint256(supplyShares);
168
- } catch {}
125
+
126
+ Position memory deadPosition = IMorpho(morphoAddress).position(Id.wrap(marketId), deadAddress);
127
+ data.deadAddressSupply = deadPosition.supplyShares;
169
128
  }
170
129
  }
171
130
  }
@@ -1,141 +1,379 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
  pragma solidity ^0.8.20;
3
3
 
4
- interface IChainlinkAggregator {
5
- function decimals() external view returns (uint8);
4
+ import {AggregatorV3Interface} from "./external/morpho/interfaces/AggregatorV3Interface.sol";
6
5
 
7
- function latestRoundData()
8
- external
9
- view
10
- returns (
11
- uint80 roundId,
12
- int256 answer,
13
- uint256 startedAt,
14
- uint256 updatedAt,
15
- uint80 answeredInRound
16
- );
17
- }
18
6
 
19
7
  /**
20
8
  * @title ManualChainlinkMockFeed
21
- * @notice Mock Chainlink feed with manual price updates
9
+ * @notice Mock Chainlink feed with manual price updates and automated simulation modes.
10
+ *
11
+ * SIMULATION MODES:
12
+ * ─────────────────────────────────────────────────────────────────────
13
+ * 0 = MANUAL → Price is manually updated via setPrice()
14
+ * 1 = TRENDING_UP → Price compounds by `basisPoints` every 5 minutes (STEP)
15
+ * 2 = TRENDING_DOWN → Price compounds down by `basisPoints` every 5 minutes (STEP)
16
+ * 3 = CRASH_AND_RECOVER → Hourly-based custom curve:
17
+ * [0h – 23h) : Gradual compound growth (+basisPoints per hour)
18
+ * [23h – 24h) : Sharp linear crash down to 75% of the initial base price
19
+ * [24h – 25h) : Linear recovery from the crashed price back to the initial base price
20
+ * ≥ 25h : Remains flat at the initial base price
21
+ * ─────────────────────────────────────────────────────────────────────
22
+ *
23
+ * simStartTime: Timestamp of t=0 for the simulation (automatically set on setMode() or deployment)
24
+ * basisPoints : Rate of change (1 bp = 0.01%, e.g., 50 = 0.5% per STEP/HOUR)
22
25
  */
23
- contract ManualChainlinkMockFeed is IChainlinkAggregator {
26
+ contract ManualChainlinkMockFeed is AggregatorV3Interface {
27
+
28
+ // ── Enums & Constants ────────────────────────────────────────────
29
+ uint8 public constant MODE_MANUAL = 0;
30
+ uint8 public constant MODE_TRENDING_UP = 1;
31
+ uint8 public constant MODE_TRENDING_DOWN = 2;
32
+ uint8 public constant MODE_CRASH_AND_RECOVER = 3;
33
+
34
+ uint256 private constant STEP = 300; // 5 minutes step for trending modes
35
+ uint256 private constant HOUR = 3600; // 1 hour step for crash & recover mode
36
+ uint256 private constant BPS_DENOM = 10_000;
37
+
38
+ // ── Storage ──────────────────────────────────────────────────────
24
39
  mapping(address => bool) public isOwner;
25
40
 
26
- int256 private _price;
27
- uint8 private immutable _decimals;
41
+ int256 private _price;
42
+ uint8 private immutable _decimals;
43
+ string public description;
28
44
 
29
- string public symbol;
45
+ uint8 public simMode;
46
+ uint256 public simStartTime;
47
+ uint256 public basisPoints;
30
48
 
49
+ // ── Events ───────────────────────────────────────────────────────
31
50
  event PriceUpdated(int256 newPrice, address indexed updatedBy);
51
+ event ModeChanged(uint8 newMode, uint256 startTime, uint256 basisPoints);
32
52
  event OwnerAdded(address indexed newOwner);
33
53
 
54
+ // ── Modifiers ────────────────────────────────────────────────────
34
55
  modifier onlyOwner() {
35
56
  require(isOwner[msg.sender], "Unauthorized");
36
57
  _;
37
58
  }
38
59
 
60
+ // ── Constructor ──────────────────────────────────────────────────
39
61
  constructor(
40
62
  int256 initialPrice,
41
- uint8 decimals_,
42
- string memory symbol_,
43
- address[] memory owners_
63
+ uint8 decimals_,
64
+ string memory description_,
65
+ address[] memory owners_,
66
+ uint8 simMode_
44
67
  ) {
45
68
  require(owners_.length > 0, "No owners provided");
46
-
47
69
  for (uint256 i = 0; i < owners_.length; i++) {
48
70
  require(owners_[i] != address(0), "Zero address");
49
-
50
71
  isOwner[owners_[i]] = true;
51
-
52
72
  emit OwnerAdded(owners_[i]);
53
73
  }
74
+ _price = initialPrice;
75
+ _decimals = decimals_;
76
+ description = description_;
77
+ simMode = simMode_;
78
+ basisPoints = 50; // default: 0.5%
54
79
 
55
- _price = initialPrice;
56
- _decimals = decimals_;
57
- symbol = symbol_;
80
+ if (simMode_ != MODE_MANUAL) {
81
+ simStartTime = block.timestamp;
82
+ }
58
83
  }
59
84
 
85
+ // ── IChainlinkAggregator ─────────────────────────────────────────
86
+
60
87
  function latestRoundData()
61
88
  external
62
89
  view
63
90
  override
64
91
  returns (
65
- uint80 roundId,
66
- int256 answer,
92
+ uint80 roundId,
93
+ int256 answer,
67
94
  uint256 startedAt,
68
95
  uint256 updatedAt,
69
- uint80 answeredInRound
96
+ uint80 answeredInRound
70
97
  )
71
98
  {
72
- return (1, _price, block.timestamp, block.timestamp, 1);
99
+ answer = _computePrice();
100
+
101
+ // Default roundId for MANUAL mode
102
+ uint256 dynamicRoundId = 1;
103
+
104
+ // For simulation modes, generate a realistic incrementing roundId
105
+ if (simMode != MODE_MANUAL) {
106
+ uint256 elapsed = block.timestamp - simStartTime;
107
+ uint256 currentStep = (simMode == MODE_CRASH_AND_RECOVER) ? HOUR : STEP;
108
+ dynamicRoundId = (elapsed / currentStep) + 1;
109
+ }
110
+
111
+ // Explicitly cast uint256 to uint80 to prevent compilation errors
112
+ uint80 castedRoundId = uint80(dynamicRoundId);
113
+
114
+ return (
115
+ castedRoundId,
116
+ answer,
117
+ block.timestamp,
118
+ block.timestamp,
119
+ castedRoundId
120
+ );
73
121
  }
74
122
 
75
123
  function decimals() external view override returns (uint8) {
76
124
  return _decimals;
77
125
  }
78
126
 
127
+ // ── Price Computation ────────────────────────────────────────────
128
+
129
+ /**
130
+ * @dev Dynamically computes the current price based on the active simulation mode.
131
+ * All calculations happen inside this view function without modifying the state.
132
+ */
133
+ function _computePrice() internal view returns (int256) {
134
+ if (simMode == MODE_MANUAL) {
135
+ return _price;
136
+ }
137
+
138
+ int256 base = _price;
139
+ uint256 elapsed = block.timestamp - simStartTime;
140
+
141
+ if (simMode == MODE_TRENDING_UP) {
142
+ // compound: base * (1 + bp/10000)^steps (every 5 mins)
143
+ uint256 stepsElapsed = elapsed / STEP;
144
+ return _compoundGrow(base, basisPoints, stepsElapsed);
145
+ }
146
+
147
+ if (simMode == MODE_TRENDING_DOWN) {
148
+ // compound: base * (1 - bp/10000)^steps (every 5 mins)
149
+ uint256 stepsElapsed = elapsed / STEP;
150
+ return _compoundDecay(base, basisPoints, stepsElapsed);
151
+ }
152
+
153
+ if (simMode == MODE_CRASH_AND_RECOVER) {
154
+ return _crashAndRecover(base, elapsed);
155
+ }
156
+
157
+ return base;
158
+ }
159
+
160
+ /**
161
+ * @dev CRASH_AND_RECOVER price curve (Hourly based):
162
+ *
163
+ * Phase A [0 – 23h) : Compound growth (+basisPoints per hour)
164
+ * Phase B [23h – 24h) : Starts at Phase A peak, linear drop to base * 0.75 within 1 hour
165
+ * Phase C [24h – 25h) : Linear recovery from base * 0.75 back to the original base price
166
+ * Phase D ≥ 25h : Stays flat at the original base price
167
+ */
168
+ function _crashAndRecover(int256 base, uint256 elapsed)
169
+ internal
170
+ view
171
+ returns (int256)
172
+ {
173
+ if (base == 0) return 0;
174
+
175
+ uint256 PHASE_A_END = 23 * HOUR;
176
+ uint256 PHASE_B_END = 24 * HOUR;
177
+ uint256 PHASE_C_END = 25 * HOUR;
178
+
179
+ // Peak price calculation strictly uses 23 hourly intervals
180
+ int256 peakPrice = _compoundGrow(base, basisPoints, 23);
181
+ int256 crashPrice = (base * 75) / 100;
182
+
183
+ if (elapsed < PHASE_A_END) {
184
+ uint256 h = elapsed / HOUR;
185
+ return _compoundGrow(base, basisPoints, h);
186
+ }
187
+
188
+ if (elapsed < PHASE_B_END) {
189
+ uint256 phaseElapsed = elapsed - PHASE_A_END;
190
+ return _lerp(peakPrice, crashPrice, phaseElapsed, HOUR);
191
+ }
192
+
193
+ if (elapsed < PHASE_C_END) {
194
+ uint256 phaseElapsed = elapsed - PHASE_B_END;
195
+ return _lerp(crashPrice, base, phaseElapsed, HOUR);
196
+ }
197
+
198
+ return base;
199
+ }
200
+
201
+ // ── Math Helpers ─────────────────────────────────────────────────
202
+
203
+ /**
204
+ * @dev Integer linear interpolation:
205
+ * result = from + (to - from) * t / duration
206
+ */
207
+ function _lerp(
208
+ int256 from,
209
+ int256 to,
210
+ uint256 t,
211
+ uint256 duration
212
+ ) internal pure returns (int256) {
213
+ if (t >= duration) return to;
214
+ int256 delta = to - from;
215
+ return from + (delta * int256(t)) / int256(duration);
216
+ }
217
+
218
+ /**
219
+ * @dev Compound Growth: value * ((10000 + bp) / 10000)^n
220
+ * Iterative approach used to manage precision and avoid overflow.
221
+ */
222
+ function _compoundGrow(
223
+ int256 value,
224
+ uint256 bp,
225
+ uint256 n
226
+ ) internal pure returns (int256) {
227
+ if (n == 0 || value == 0) return value;
228
+
229
+ uint256 baseRate = BPS_DENOM + bp;
230
+ uint256 multiplier = BPS_DENOM;
231
+
232
+ // Exponentiation by squaring
233
+ while (n > 0) {
234
+ if (n % 2 == 1) {
235
+ multiplier = (multiplier * baseRate) / BPS_DENOM;
236
+ }
237
+ baseRate = (baseRate * baseRate) / BPS_DENOM;
238
+ n /= 2;
239
+ }
240
+
241
+ return (value * int256(multiplier)) / int256(BPS_DENOM);
242
+ }
243
+
244
+ /**
245
+ * @dev Compound Decay: value * ((10000 - bp) / 10000)^n
246
+ */
247
+ function _compoundDecay(
248
+ int256 value,
249
+ uint256 bp,
250
+ uint256 n
251
+ ) internal pure returns (int256) {
252
+ if (n == 0 || value == 0) return value;
253
+
254
+ uint256 baseRate = BPS_DENOM - bp;
255
+ uint256 multiplier = BPS_DENOM;
256
+
257
+ while (n > 0) {
258
+ if (n % 2 == 1) {
259
+ multiplier = (multiplier * baseRate) / BPS_DENOM;
260
+ }
261
+ baseRate = (baseRate * baseRate) / BPS_DENOM;
262
+ n /= 2;
263
+ }
264
+
265
+ return (value * int256(multiplier)) / int256(BPS_DENOM);
266
+ }
267
+
268
+ // ── Owner Functions ──────────────────────────────────────────────
269
+
270
+ /**
271
+ * @notice Updates the simulation mode and resets the timer to current timestamp.
272
+ * @param mode_ New mode (0-3)
273
+ * @param basisPoints_ Rate of change (bp). Ignored in MANUAL mode.
274
+ */
275
+ function setMode(uint8 mode_, uint256 basisPoints_) external onlyOwner {
276
+ require(mode_ <= MODE_CRASH_AND_RECOVER, "Invalid mode");
277
+ simMode = mode_;
278
+ simStartTime = block.timestamp;
279
+ basisPoints = basisPoints_;
280
+ emit ModeChanged(mode_, block.timestamp, basisPoints_);
281
+ }
282
+
283
+ /**
284
+ * @notice Updates the static price. Only allowed in MANUAL mode.
285
+ */
79
286
  function setPrice(int256 newPrice) external onlyOwner {
287
+ require(simMode == MODE_MANUAL, "Not in MANUAL mode");
80
288
  _price = newPrice;
81
-
82
289
  emit PriceUpdated(newPrice, msg.sender);
83
290
  }
84
291
 
292
+ /**
293
+ * @notice Updates the initial base price for automated simulation modes without resetting the timer.
294
+ */
295
+ function setBasePrice(int256 newBasePrice) external onlyOwner {
296
+ _price = newBasePrice;
297
+
298
+ if (simMode != MODE_MANUAL) {
299
+ simStartTime = block.timestamp;
300
+ }
301
+
302
+ emit PriceUpdated(newBasePrice, msg.sender);
303
+ }
304
+
305
+ /**
306
+ * @notice Restarts the simulation from the current timestamp (mode remains unchanged).
307
+ */
308
+ function restartSimulation() external onlyOwner {
309
+ require(simMode != MODE_MANUAL, "Use setPrice for MANUAL mode");
310
+ simStartTime = block.timestamp;
311
+ emit ModeChanged(simMode, block.timestamp, basisPoints);
312
+ }
313
+
85
314
  function addOwner(address newOwner) external onlyOwner {
86
315
  require(newOwner != address(0), "Zero address");
87
-
88
316
  isOwner[newOwner] = true;
89
-
90
317
  emit OwnerAdded(newOwner);
91
318
  }
319
+
320
+ // ── View Helpers ─────────────────────────────────────────────────
321
+
322
+ /// @notice Returns the dynamically computed current price (matches latestRoundData().answer)
323
+ function currentPrice() external view returns (int256) {
324
+ return _computePrice();
325
+ }
326
+
327
+ /// @notice Returns the seconds elapsed since the start of the current simulation
328
+ function elapsedSeconds() external view returns (uint256) {
329
+ if (simMode == MODE_MANUAL) return 0;
330
+ return block.timestamp - simStartTime;
331
+ }
332
+
333
+ function version() external pure returns (uint256) {
334
+ return 1;
335
+ }
336
+
337
+ function getRoundData(uint80 _roundId)
338
+ external
339
+ view
340
+ returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) {
341
+ return (_roundId, _price, block.timestamp, block.timestamp, 1);
342
+ }
92
343
  }
93
344
 
345
+ // ─────────────────────────────────────────────────────────────────────────────
346
+
94
347
  /**
95
348
  * @title ManualChainlinkMockFeedFactory
96
349
  */
97
350
  contract ManualChainlinkMockFeedFactory {
98
- address[] public allFeeds;
99
351
 
100
352
  event FeedCreated(
101
353
  address indexed feed,
102
- string symbol,
103
- int256 initialPrice,
104
- uint8 decimals,
354
+ string description,
355
+ int256 initialPrice,
356
+ uint8 decimals,
105
357
  address[] owners
106
358
  );
107
359
 
108
360
  function createFeed(
109
- int256 initialPrice,
110
- uint8 decimals_,
111
- string memory symbol_,
112
- address[] memory owners_
361
+ int256 initialPrice,
362
+ uint8 decimals_,
363
+ string memory description_,
364
+ address[] memory owners_,
365
+ uint8 simMode_
113
366
  ) external returns (address feedAddress) {
367
+ require(simMode_ < 4, "Please enter a valid simulation mode. Enter 0 for manual.");
368
+
114
369
  ManualChainlinkMockFeed feed = new ManualChainlinkMockFeed(
115
370
  initialPrice,
116
371
  decimals_,
117
- symbol_,
118
- owners_
372
+ description_,
373
+ owners_,
374
+ simMode_
119
375
  );
120
-
121
376
  feedAddress = address(feed);
122
-
123
- allFeeds.push(feedAddress);
124
-
125
- emit FeedCreated(
126
- feedAddress,
127
- symbol_,
128
- initialPrice,
129
- decimals_,
130
- owners_
131
- );
132
- }
133
-
134
- function getAllFeeds() external view returns (address[] memory) {
135
- return allFeeds;
136
- }
137
-
138
- function totalFeeds() external view returns (uint256) {
139
- return allFeeds.length;
377
+ emit FeedCreated(feedAddress, description_, initialPrice, decimals_, owners_);
140
378
  }
141
379
  }
@@ -1,5 +1,5 @@
1
1
  import type { BaseContract, BigNumberish, BytesLike, FunctionFragment, Result, Interface, AddressLike, ContractRunner, ContractMethod, Listener } from "ethers";
2
- import type { TypedContractEvent, TypedDeferredTopicFilter, TypedEventLog, TypedListener, TypedContractMethod } from "../../common";
2
+ import type { TypedContractEvent, TypedDeferredTopicFilter, TypedEventLog, TypedListener, TypedContractMethod } from "../common";
3
3
  export type MarketParamsStruct = {
4
4
  loanToken: AddressLike;
5
5
  collateralToken: AddressLike;
@@ -63,11 +63,11 @@ export declare namespace MorphoMarketDataFetcher {
63
63
  baseFeed1: AddressLike;
64
64
  baseFeed2: AddressLike;
65
65
  baseVault: AddressLike;
66
- baseVaultConversionSample: AddressLike;
66
+ baseVaultConversionSample: BigNumberish;
67
67
  quoteFeed1: AddressLike;
68
68
  quoteFeed2: AddressLike;
69
69
  quoteVault: AddressLike;
70
- quoteVaultConversionSample: AddressLike;
70
+ quoteVaultConversionSample: BigNumberish;
71
71
  scaleFactor: BigNumberish;
72
72
  currentPrice: BigNumberish;
73
73
  baseFeed: MorphoMarketDataFetcher.MockOracleInfoStruct;
@@ -78,11 +78,11 @@ export declare namespace MorphoMarketDataFetcher {
78
78
  baseFeed1: string,
79
79
  baseFeed2: string,
80
80
  baseVault: string,
81
- baseVaultConversionSample: string,
81
+ baseVaultConversionSample: bigint,
82
82
  quoteFeed1: string,
83
83
  quoteFeed2: string,
84
84
  quoteVault: string,
85
- quoteVaultConversionSample: string,
85
+ quoteVaultConversionSample: bigint,
86
86
  scaleFactor: bigint,
87
87
  currentPrice: bigint,
88
88
  baseFeed: MorphoMarketDataFetcher.MockOracleInfoStructOutput,
@@ -92,11 +92,11 @@ export declare namespace MorphoMarketDataFetcher {
92
92
  baseFeed1: string;
93
93
  baseFeed2: string;
94
94
  baseVault: string;
95
- baseVaultConversionSample: string;
95
+ baseVaultConversionSample: bigint;
96
96
  quoteFeed1: string;
97
97
  quoteFeed2: string;
98
98
  quoteVault: string;
99
- quoteVaultConversionSample: string;
99
+ quoteVaultConversionSample: bigint;
100
100
  scaleFactor: bigint;
101
101
  currentPrice: bigint;
102
102
  baseFeed: MorphoMarketDataFetcher.MockOracleInfoStructOutput;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MorphoMarketDataFetcher.d.ts","sourceRoot":"","sources":["../../../typechain-types/contracts/MorphoMarketDataFetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MorphoMarketDataFetcher.js","sourceRoot":"","sources":["../../../typechain-types/contracts/MorphoMarketDataFetcher.ts"],"names":[],"mappings":""}