@@ -20,6 +20,7 @@ contract HoneyFactoryReader is AccessControlUpgradeable, UUPSUpgradeable, IHoney
20
20
/// @notice The HoneyFactory contract.
21
21
HoneyFactory public honeyFactory;
22
22
23
+ /// @custom:oz-upgrades-unsafe-allow constructor
23
24
constructor () {
24
25
_disableInitializers ();
25
26
}
@@ -41,11 +42,185 @@ contract HoneyFactoryReader is AccessControlUpgradeable, UUPSUpgradeable, IHoney
41
42
42
43
/// @inheritdoc IHoneyFactoryReader
43
44
/// @dev `asset` param is ignored if running in basket mode.
44
- function previewMintCollaterals (address asset , uint256 honey ) public view returns (uint256 [] memory amounts ) {
45
+ function previewMintCollaterals (address asset , uint256 honey ) external view returns (uint256 [] memory amounts ) {
46
+ bool basketMode = honeyFactory.isBasketModeEnabled (true );
47
+
48
+ amounts = _previewMintCollaterals (asset, honey, basketMode);
49
+ }
50
+
51
+ /// @inheritdoc IHoneyFactoryReader
52
+ /// @dev `asset` param is ignored if running in basket mode.
53
+ function previewMintCollateralsWithPrices (
54
+ address asset ,
55
+ uint256 honey ,
56
+ uint256 [] memory prices
57
+ )
58
+ external
59
+ view
60
+ returns (uint256 [] memory amounts )
61
+ {
62
+ bool basketMode = isBasketModeEnabledWithPrices (true , prices);
63
+
64
+ amounts = _previewMintCollaterals (asset, honey, basketMode);
65
+ }
66
+
67
+ /// @inheritdoc IHoneyFactoryReader
68
+ function previewMintHoney (
69
+ address asset ,
70
+ uint256 amount
71
+ )
72
+ external
73
+ view
74
+ returns (uint256 [] memory collaterals , uint256 honey )
75
+ {
76
+ bool basketMode = honeyFactory.isBasketModeEnabled (true );
77
+
78
+ (collaterals, honey) = _previewMintHoney (asset, amount, basketMode);
79
+ }
80
+
81
+ /// @inheritdoc IHoneyFactoryReader
82
+ function previewMintHoneyWithPrices (
83
+ address asset ,
84
+ uint256 amount ,
85
+ uint256 [] memory prices
86
+ )
87
+ external
88
+ view
89
+ returns (uint256 [] memory collaterals , uint256 honey )
90
+ {
91
+ bool basketMode = isBasketModeEnabledWithPrices (true , prices);
92
+
93
+ (collaterals, honey) = _previewMintHoney (asset, amount, basketMode);
94
+ }
95
+
96
+ /// @inheritdoc IHoneyFactoryReader
97
+ /// @dev `asset` param is ignored if running in basket mode.
98
+ function previewRedeemCollaterals (
99
+ address asset ,
100
+ uint256 honey
101
+ )
102
+ external
103
+ view
104
+ returns (uint256 [] memory collaterals )
105
+ {
106
+ bool basketMode = honeyFactory.isBasketModeEnabled (false );
107
+
108
+ collaterals = _previewRedeemCollaterals (asset, honey, basketMode);
109
+ }
110
+
111
+ /// @inheritdoc IHoneyFactoryReader
112
+ /// @dev `asset` param is ignored if running in basket mode.
113
+ function previewRedeemCollateralsWithPrices (
114
+ address asset ,
115
+ uint256 honey ,
116
+ uint256 [] memory prices
117
+ )
118
+ external
119
+ view
120
+ returns (uint256 [] memory collaterals )
121
+ {
122
+ bool basketMode = isBasketModeEnabledWithPrices (false , prices);
123
+
124
+ collaterals = _previewRedeemCollaterals (asset, honey, basketMode);
125
+ }
126
+
127
+ /// @inheritdoc IHoneyFactoryReader
128
+ /// @dev If the basket mode is enabled, the required Honey amount will provide also other collaterals beside
129
+ /// required `amount` of `asset`.
130
+ function previewRedeemHoney (
131
+ address asset ,
132
+ uint256 amount
133
+ )
134
+ external
135
+ view
136
+ returns (uint256 [] memory collaterals , uint256 honey )
137
+ {
138
+ bool basketMode = honeyFactory.isBasketModeEnabled (false );
139
+
140
+ (collaterals, honey) = _previewRedeemHoney (asset, amount, basketMode);
141
+ }
142
+
143
+ /// @inheritdoc IHoneyFactoryReader
144
+ /// @dev If the basket mode is enabled, the required Honey amount will provide also other collaterals beside
145
+ /// required `amount` of `asset`.
146
+ function previewRedeemHoneyWithPrices (
147
+ address asset ,
148
+ uint256 amount ,
149
+ uint256 [] memory prices
150
+ )
151
+ external
152
+ view
153
+ returns (uint256 [] memory collaterals , uint256 honey )
154
+ {
155
+ bool basketMode = isBasketModeEnabledWithPrices (false , prices);
156
+
157
+ (collaterals, honey) = _previewRedeemHoney (asset, amount, basketMode);
158
+ }
159
+
160
+ /// @inheritdoc IHoneyFactoryReader
161
+ /// @dev Implementation is copied 1:1 from HoneyFactory to not edit the original contract.
162
+ function isBasketModeEnabledWithPrices (
163
+ bool isMint ,
164
+ uint256 [] memory prices
165
+ )
166
+ public
167
+ view
168
+ returns (bool basketMode )
169
+ {
170
+ uint256 registeredAssetsLen = honeyFactory.numRegisteredAssets ();
171
+
172
+ if (honeyFactory.forcedBasketMode ()) return true ;
173
+
174
+ for (uint256 i = 0 ; i < registeredAssetsLen; i++ ) {
175
+ address asset = honeyFactory.registeredAssets (i);
176
+ bool isPegged_ = isPeggedWithPrice (asset, prices[i]);
177
+
178
+ if (isMint) {
179
+ if (isPegged_ && ! honeyFactory.isBadCollateralAsset (asset)) {
180
+ // Basket mode should be disabled. It means there is a good collateral.
181
+ return false ;
182
+ }
183
+ } else if (! isPegged_) {
184
+ // If the not pegged asset is a bad collateral and its vault doesn't have shares
185
+ // we can ignore it because it means it has been fully liquidated.
186
+ uint256 sharesWithoutFees = honeyFactory.vaults (asset).balanceOf (address (honeyFactory))
187
+ - honeyFactory.collectedAssetFees (asset);
188
+ bool usedAsCollateral = sharesWithoutFees > 0 ;
189
+
190
+ if (! usedAsCollateral) {
191
+ continue ;
192
+ }
193
+ return true ;
194
+ }
195
+ }
196
+
197
+ // When is mint and there is no asset that disable basket mode, return true.
198
+ // When is redeem and there is no asset that enable basket mode, return false.
199
+ return isMint ? true : false ;
200
+ }
201
+
202
+ /// @inheritdoc IHoneyFactoryReader
203
+ function isPeggedWithPrice (address asset , uint256 price ) public view returns (bool ) {
204
+ return (1e18 - honeyFactory.lowerPegOffsets (asset) <= price)
205
+ && (price <= 1e18 + honeyFactory.upperPegOffsets (asset));
206
+ }
207
+
208
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
209
+ /* INTERNAL FUNCTIONS */
210
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
211
+
212
+ function _previewMintCollaterals (
213
+ address asset ,
214
+ uint256 honey ,
215
+ bool basketMode
216
+ )
217
+ internal
218
+ view
219
+ returns (uint256 [] memory amounts )
220
+ {
45
221
(address [] memory collaterals , uint256 num ) = _getCollaterals ();
46
222
amounts = new uint256 [](num);
47
223
uint256 [] memory weights = honeyFactory.getWeights ();
48
- bool basketMode = honeyFactory.isBasketModeEnabled (true );
49
224
for (uint256 i = 0 ; i < num; i++ ) {
50
225
if (! basketMode && collaterals[i] != asset) {
51
226
continue ;
@@ -66,37 +241,34 @@ contract HoneyFactoryReader is AccessControlUpgradeable, UUPSUpgradeable, IHoney
66
241
}
67
242
}
68
243
69
- /// @inheritdoc IHoneyFactoryReader
70
- function previewMintHoney (
244
+ function _previewMintHoney (
71
245
address asset ,
72
- uint256 amount
246
+ uint256 amount ,
247
+ bool basketMode
73
248
)
74
- external
249
+ internal
75
250
view
76
251
returns (uint256 [] memory collaterals , uint256 honey )
77
252
{
78
- bool basketMode = honeyFactory.isBasketModeEnabled (true );
79
253
collaterals = _getWeightedCollaterals (asset, amount, basketMode);
80
254
(address [] memory assets , uint256 num ) = _getCollaterals ();
81
255
for (uint256 i = 0 ; i < num; i++ ) {
82
256
honey += _previewMint (assets[i], collaterals[i]);
83
257
}
84
258
}
85
259
86
- /// @inheritdoc IHoneyFactoryReader
87
- /// @dev `asset` param is ignored if running in basket mode.
88
- function previewRedeemCollaterals (
260
+ function _previewRedeemCollaterals (
89
261
address asset ,
90
- uint256 honey
262
+ uint256 honey ,
263
+ bool basketMode
91
264
)
92
- external
265
+ internal
93
266
view
94
267
returns (uint256 [] memory collaterals )
95
268
{
96
269
(address [] memory assets , uint256 num ) = _getCollaterals ();
97
270
collaterals = new uint256 [](num);
98
271
99
- bool basketMode = honeyFactory.isBasketModeEnabled (false );
100
272
if (! basketMode) {
101
273
(uint256 refAssetIndex ,) = _getIndexOfAsset (assets, num, asset);
102
274
collaterals[refAssetIndex] = _previewRedeem (asset, honey);
@@ -110,29 +282,22 @@ contract HoneyFactoryReader is AccessControlUpgradeable, UUPSUpgradeable, IHoney
110
282
}
111
283
}
112
284
113
- /// @inheritdoc IHoneyFactoryReader
114
- /// @dev If the basket mode is enabled, the required Honey amount will provide also other collaterals beside
115
- /// required `amount` of `asset`.
116
- function previewRedeemHoney (
285
+ function _previewRedeemHoney (
117
286
address asset ,
118
- uint256 amount
287
+ uint256 amount ,
288
+ bool basketMode
119
289
)
120
- external
290
+ internal
121
291
view
122
292
returns (uint256 [] memory collaterals , uint256 honey )
123
293
{
124
- bool basketMode = honeyFactory.isBasketModeEnabled (false );
125
294
collaterals = _getWeightedCollaterals (asset, amount, basketMode);
126
295
(address [] memory assets , uint256 num ) = _getCollaterals ();
127
296
for (uint256 i = 0 ; i < num; i++ ) {
128
297
honey += _previewHoneyToRedeem (assets[i], collaterals[i]);
129
298
}
130
299
}
131
300
132
- /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
133
- /* INTERNAL FUNCTIONS */
134
- /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
135
-
136
301
/// @notice Get the amount of Honey that can be minted with the given ERC20.
137
302
/// @param asset The ERC20 to mint with.
138
303
/// @param amount The amount of ERC20 to mint with.
0 commit comments