@@ -126,222 +126,6 @@ contract OVaultERC4626EquivalenceTest is TestHelperOz5 {
126126 assertEq (assetOFT.balanceOf (alice), alicePreDepositBal);
127127 }
128128
129- function test_ovault_MultipleMintDepositRedeemWithdraw () public {
130- // Scenario:
131- // A = Alice, B = Bob
132- // ________________________________________________________
133- // | Vault shares | A share | A assets | B share | B assets |
134- // |========================================================|
135- // | 1. Alice mints 2000 shares (costs 2000 tokens) |
136- // |--------------|---------|----------|---------|----------|
137- // | 2000 | 2000 | 2000 | 0 | 0 |
138- // |--------------|---------|----------|---------|----------|
139- // | 2. Bob deposits 4000 tokens (mints 4000 shares) |
140- // |--------------|---------|----------|---------|----------|
141- // | 6000 | 2000 | 2000 | 4000 | 4000 |
142- // |--------------|---------|----------|---------|----------|
143- // | 3. Vault mutates by +3000 tokens... |
144- // | (simulated yield returned from strategy)... |
145- // |--------------|---------|----------|---------|----------|
146- // | 6000 | 2000 | 3000 | 4000 | 6000 |
147- // |--------------|---------|----------|---------|----------|
148- // | 4. Alice deposits 2000 tokens (mints 1333 shares) |
149- // |--------------|---------|----------|---------|----------|
150- // | 7333 | 3333 | 4999 | 4000 | 6000 |
151- // |--------------|---------|----------|---------|----------|
152- // | 5. Bob mints 2000 shares (costs 3001 assets) |
153- // | NOTE: Bob's assets spent got rounded up |
154- // | NOTE: Alice's vault assets got rounded up |
155- // |--------------|---------|----------|---------|----------|
156- // | 9333 | 3333 | 5000 | 6000 | 9000 |
157- // |--------------|---------|----------|---------|----------|
158- // | 6. Vault mutates by +3000 tokens... |
159- // | (simulated yield returned from strategy) |
160- // | NOTE: Vault holds 17001 tokens, but sum of |
161- // | assetsOf() is 17000. |
162- // |--------------|---------|----------|---------|----------|
163- // | 9333 | 3333 | 6071 | 6000 | 10929 |
164- // |--------------|---------|----------|---------|----------|
165- // | 7. Alice redeem 1333 shares (2428 assets) |
166- // |--------------|---------|----------|---------|----------|
167- // | 8000 | 2000 | 3643 | 6000 | 10929 |
168- // |--------------|---------|----------|---------|----------|
169- // | 8. Bob withdraws 2928 assets (1608 shares) |
170- // |--------------|---------|----------|---------|----------|
171- // | 6392 | 2000 | 3643 | 4392 | 8000 |
172- // |--------------|---------|----------|---------|----------|
173- // | 9. Alice withdraws 3643 assets (2000 shares) |
174- // | NOTE: Bob's assets have been rounded back up |
175- // |--------------|---------|----------|---------|----------|
176- // | 4392 | 0 | 0 | 4392 | 8001 |
177- // |--------------|---------|----------|---------|----------|
178- // | 10. Bob redeem 4392 shares (8001 tokens) |
179- // |--------------|---------|----------|---------|----------|
180- // | 0 | 0 | 0 | 0 | 0 |
181- // |______________|_________|__________|_________|__________|
182-
183- address alice = address (0xABCD );
184- address bob = address (0xDCBA );
185-
186- uint256 mutationassetAmount = 3000 ;
187-
188- assetOFT.mint (alice, 4000 );
189-
190- vm.prank (alice);
191- assetOFT.approve (address (vault), 4000 );
192-
193- assertEq (assetOFT.allowance (alice, address (vault)), 4000 );
194-
195- assetOFT.mint (bob, 7001 );
196-
197- vm.prank (bob);
198- assetOFT.approve (address (vault), 7001 );
199-
200- assertEq (assetOFT.allowance (bob, address (vault)), 7001 );
201-
202- // 1. Alice mints 2000 shares (costs 2000 tokens)
203- vm.prank (alice);
204- uint256 aliceassetAmount = vault.mint (2000 , alice);
205-
206- uint256 aliceShareAmount = vault.previewDeposit (aliceassetAmount);
207-
208- // Expect to have received the requested mint amount.
209- assertEq (aliceShareAmount, 2000 );
210- assertEq (vault.balanceOf (alice), aliceShareAmount);
211- assertEq (vault.convertToAssets (vault.balanceOf (alice)), aliceassetAmount);
212- assertEq (vault.convertToShares (aliceassetAmount), vault.balanceOf (alice));
213-
214- // Expect a 1:1 ratio before mutation.
215- assertEq (aliceassetAmount, 2000 );
216-
217- // Sanity check.
218- assertEq (vault.totalSupply (), aliceShareAmount);
219- assertEq (vault.totalAssets (), aliceassetAmount);
220-
221- // 2. Bob deposits 4000 tokens (mints 4000 shares)
222- vm.prank (bob);
223- uint256 bobShareAmount = vault.deposit (4000 , bob);
224- uint256 bobassetAmount = vault.previewWithdraw (bobShareAmount);
225-
226- // Expect to have received the requested asset amount.
227- assertEq (bobassetAmount, 4000 );
228- assertEq (vault.balanceOf (bob), bobShareAmount);
229- assertEq (vault.convertToAssets (vault.balanceOf (bob)), bobassetAmount);
230- assertEq (vault.convertToShares (bobassetAmount), vault.balanceOf (bob));
231-
232- // Expect a 1:1 ratio before mutation.
233- assertEq (bobShareAmount, bobassetAmount);
234-
235- // Sanity check.
236- uint256 preMutationShareBal = aliceShareAmount + bobShareAmount;
237- uint256 preMutationBal = aliceassetAmount + bobassetAmount;
238- assertEq (vault.totalSupply (), preMutationShareBal);
239- assertEq (vault.totalAssets (), preMutationBal);
240- assertEq (vault.totalSupply (), 6000 );
241- assertEq (vault.totalAssets (), 6000 );
242-
243- // 3. Vault mutates by +3000 tokens... |
244- // (simulated yield returned from strategy)...
245- // The Vault now contains more tokens than deposited which causes the exchange rate to change.
246- // Alice share is 33.33% of the Vault, Bob 66.66% of the Vault.
247- // Alice's share count stays the same but the asset amount changes from 2000 to 3000.
248- // Bob's share count stays the same but the asset amount changes from 4000 to 6000.
249- assetOFT.mint (address (vault), mutationassetAmount);
250- assertEq (vault.totalSupply (), preMutationShareBal);
251- assertEq (vault.totalAssets (), preMutationBal + mutationassetAmount);
252- assertEq (vault.balanceOf (alice), aliceShareAmount);
253- assertEq (vault.convertToAssets (vault.balanceOf (alice)), aliceassetAmount + (mutationassetAmount / 3 ) * 1 );
254- assertEq (vault.balanceOf (bob), bobShareAmount);
255- assertEq (vault.convertToAssets (vault.balanceOf (bob)), bobassetAmount + (mutationassetAmount / 3 ) * 2 );
256-
257- // 4. Alice deposits 2000 tokens (mints 1333 shares)
258- vm.prank (alice);
259- vault.deposit (2000 , alice);
260-
261- assertEq (vault.totalSupply (), 7333 );
262- assertEq (vault.balanceOf (alice), 3333 );
263- assertEq (vault.convertToAssets (vault.balanceOf (alice)), 4999 );
264- assertEq (vault.balanceOf (bob), 4000 );
265- assertEq (vault.convertToAssets (vault.balanceOf (bob)), 6000 );
266-
267- // 5. Bob mints 2000 shares (costs 3001 assets)
268- // NOTE: Bob's assets spent got rounded up
269- // NOTE: Alices's vault assets got rounded up
270- vm.prank (bob);
271- vault.mint (2000 , bob);
272-
273- assertEq (vault.totalSupply (), 9333 );
274- assertEq (vault.balanceOf (alice), 3333 );
275- assertEq (vault.convertToAssets (vault.balanceOf (alice)), 5000 );
276- assertEq (vault.balanceOf (bob), 6000 );
277- assertEq (vault.convertToAssets (vault.balanceOf (bob)), 9000 );
278-
279- // Sanity checks:
280- // Alice and bob should have spent all their tokens now
281- assertEq (assetOFT.balanceOf (alice), 0 );
282- assertEq (assetOFT.balanceOf (bob), 0 );
283- // Assets in vault: 4k (alice) + 7k (bob) + 3k (yield) + 1 (round up)
284- assertEq (vault.totalAssets (), 14001 );
285-
286- // 6. Vault mutates by +3000 tokens
287- // NOTE: Vault holds 17001 tokens, but sum of assetsOf() is 17000.
288- assetOFT.mint (address (vault), mutationassetAmount);
289- assertEq (vault.totalAssets (), 17001 );
290- assertEq (vault.convertToAssets (vault.balanceOf (alice)), 6071 );
291- assertEq (vault.convertToAssets (vault.balanceOf (bob)), 10929 );
292-
293- // 7. Alice redeem 1333 shares (2428 assets)
294- vm.prank (alice);
295- vault.redeem (1333 , alice, alice);
296-
297- assertEq (assetOFT.balanceOf (alice), 2428 );
298- assertEq (vault.totalSupply (), 8000 );
299- assertEq (vault.totalAssets (), 14573 );
300- assertEq (vault.balanceOf (alice), 2000 );
301- assertEq (vault.convertToAssets (vault.balanceOf (alice)), 3643 );
302- assertEq (vault.balanceOf (bob), 6000 );
303- assertEq (vault.convertToAssets (vault.balanceOf (bob)), 10929 );
304-
305- // 8. Bob withdraws 2929 assets (1608 shares)
306- vm.prank (bob);
307- vault.withdraw (2929 , bob, bob);
308-
309- assertEq (assetOFT.balanceOf (bob), 2929 );
310- assertEq (vault.totalSupply (), 6392 );
311- assertEq (vault.totalAssets (), 11644 );
312- assertEq (vault.balanceOf (alice), 2000 );
313- assertEq (vault.convertToAssets (vault.balanceOf (alice)), 3643 );
314- assertEq (vault.balanceOf (bob), 4392 );
315- assertEq (vault.convertToAssets (vault.balanceOf (bob)), 8000 );
316-
317- // 9. Alice withdraws 3643 assets (2000 shares)
318- // NOTE: Bob's assets have been rounded back up
319- vm.prank (alice);
320- vault.withdraw (3643 , alice, alice);
321-
322- assertEq (assetOFT.balanceOf (alice), 6071 );
323- assertEq (vault.totalSupply (), 4392 );
324- assertEq (vault.totalAssets (), 8001 );
325- assertEq (vault.balanceOf (alice), 0 );
326- assertEq (vault.convertToAssets (vault.balanceOf (alice)), 0 );
327- assertEq (vault.balanceOf (bob), 4392 );
328- assertEq (vault.convertToAssets (vault.balanceOf (bob)), 8001 );
329-
330- // 10. Bob redeem 4392 shares (8001 tokens)
331- vm.prank (bob);
332- vault.redeem (4392 , bob, bob);
333- assertEq (assetOFT.balanceOf (bob), 10930 );
334- assertEq (vault.totalSupply (), 0 );
335- assertEq (vault.totalAssets (), 0 );
336- assertEq (vault.balanceOf (alice), 0 );
337- assertEq (vault.convertToAssets (vault.balanceOf (alice)), 0 );
338- assertEq (vault.balanceOf (bob), 0 );
339- assertEq (vault.convertToAssets (vault.balanceOf (bob)), 0 );
340-
341- // Sanity check
342- assertEq (assetOFT.balanceOf (address (vault)), 0 );
343- }
344-
345129 function test_ovault_FailDepositWithNotEnoughApproval () public {
346130 assetOFT.mint (address (this ), 0.5e18 );
347131 assetOFT.approve (address (vault), 0.5e18 );
0 commit comments