@@ -6,6 +6,7 @@ const { expectRevertCustomError } = require('../../../helpers/customError');
66
77const ERC20Decimals = artifacts . require ( '$ERC20DecimalsMock' ) ;
88const ERC4626 = artifacts . require ( '$ERC4626' ) ;
9+ const ERC4626LimitsMock = artifacts . require ( '$ERC4626LimitsMock' ) ;
910const ERC4626OffsetMock = artifacts . require ( '$ERC4626OffsetMock' ) ;
1011const ERC4626FeesMock = artifacts . require ( '$ERC4626FeesMock' ) ;
1112const ERC20ExcessDecimalsMock = artifacts . require ( 'ERC20ExcessDecimalsMock' ) ;
@@ -220,6 +221,49 @@ contract('ERC4626', function (accounts) {
220221 } ) ;
221222 } ) ;
222223
224+ describe ( 'limits' , async function ( ) {
225+ beforeEach ( async function ( ) {
226+ this . token = await ERC20Decimals . new ( name , symbol , decimals ) ;
227+ this . vault = await ERC4626LimitsMock . new ( name + ' Vault' , symbol + 'V' , this . token . address ) ;
228+ } ) ;
229+
230+ it ( 'reverts on deposit() above max deposit' , async function ( ) {
231+ const maxDeposit = await this . vault . maxDeposit ( holder ) ;
232+ await expectRevertCustomError ( this . vault . deposit ( maxDeposit . addn ( 1 ) , recipient ) , 'ERC4626ExceededMaxDeposit' , [
233+ recipient ,
234+ maxDeposit . addn ( 1 ) ,
235+ maxDeposit ,
236+ ] ) ;
237+ } ) ;
238+
239+ it ( 'reverts on mint() above max mint' , async function ( ) {
240+ const maxMint = await this . vault . maxMint ( holder ) ;
241+ await expectRevertCustomError ( this . vault . mint ( maxMint . addn ( 1 ) , recipient ) , 'ERC4626ExceededMaxMint' , [
242+ recipient ,
243+ maxMint . addn ( 1 ) ,
244+ maxMint ,
245+ ] ) ;
246+ } ) ;
247+
248+ it ( 'reverts on withdraw() above max withdraw' , async function ( ) {
249+ const maxWithdraw = await this . vault . maxWithdraw ( holder ) ;
250+ await expectRevertCustomError (
251+ this . vault . withdraw ( maxWithdraw . addn ( 1 ) , recipient , holder ) ,
252+ 'ERC4626ExceededMaxWithdraw' ,
253+ [ holder , maxWithdraw . addn ( 1 ) , maxWithdraw ] ,
254+ ) ;
255+ } ) ;
256+
257+ it ( 'reverts on redeem() above max redeem' , async function ( ) {
258+ const maxRedeem = await this . vault . maxRedeem ( holder ) ;
259+ await expectRevertCustomError (
260+ this . vault . redeem ( maxRedeem . addn ( 1 ) , recipient , holder ) ,
261+ 'ERC4626ExceededMaxRedeem' ,
262+ [ holder , maxRedeem . addn ( 1 ) , maxRedeem ] ,
263+ ) ;
264+ } ) ;
265+ } ) ;
266+
223267 for ( const offset of [ 0 , 6 , 18 ] . map ( web3 . utils . toBN ) ) {
224268 const parseToken = token => web3 . utils . toBN ( 10 ) . pow ( decimals ) . muln ( token ) ;
225269 const parseShare = share => web3 . utils . toBN ( 10 ) . pow ( decimals . add ( offset ) ) . muln ( share ) ;
@@ -849,6 +893,9 @@ contract('ERC4626', function (accounts) {
849893 expect ( await this . vault . balanceOf ( user2 ) ) . to . be . bignumber . equal ( '0' ) ;
850894 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user1 ) ) ) . to . be . bignumber . equal ( '2000' ) ;
851895 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user2 ) ) ) . to . be . bignumber . equal ( '0' ) ;
896+ expect ( await this . vault . convertToShares ( await this . token . balanceOf ( this . vault . address ) ) ) . to . be . bignumber . equal (
897+ '2000' ,
898+ ) ;
852899 expect ( await this . vault . totalSupply ( ) ) . to . be . bignumber . equal ( '2000' ) ;
853900 expect ( await this . vault . totalAssets ( ) ) . to . be . bignumber . equal ( '2000' ) ;
854901 }
@@ -872,6 +919,9 @@ contract('ERC4626', function (accounts) {
872919 expect ( await this . vault . balanceOf ( user2 ) ) . to . be . bignumber . equal ( '4000' ) ;
873920 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user1 ) ) ) . to . be . bignumber . equal ( '2000' ) ;
874921 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user2 ) ) ) . to . be . bignumber . equal ( '4000' ) ;
922+ expect ( await this . vault . convertToShares ( await this . token . balanceOf ( this . vault . address ) ) ) . to . be . bignumber . equal (
923+ '6000' ,
924+ ) ;
875925 expect ( await this . vault . totalSupply ( ) ) . to . be . bignumber . equal ( '6000' ) ;
876926 expect ( await this . vault . totalAssets ( ) ) . to . be . bignumber . equal ( '6000' ) ;
877927 }
@@ -883,6 +933,9 @@ contract('ERC4626', function (accounts) {
883933 expect ( await this . vault . balanceOf ( user2 ) ) . to . be . bignumber . equal ( '4000' ) ;
884934 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user1 ) ) ) . to . be . bignumber . equal ( '2999' ) ; // used to be 3000, but virtual assets/shares captures part of the yield
885935 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user2 ) ) ) . to . be . bignumber . equal ( '5999' ) ; // used to be 6000, but virtual assets/shares captures part of the yield
936+ expect ( await this . vault . convertToShares ( await this . token . balanceOf ( this . vault . address ) ) ) . to . be . bignumber . equal (
937+ '6000' ,
938+ ) ;
886939 expect ( await this . vault . totalSupply ( ) ) . to . be . bignumber . equal ( '6000' ) ;
887940 expect ( await this . vault . totalAssets ( ) ) . to . be . bignumber . equal ( '9000' ) ;
888941
@@ -904,6 +957,9 @@ contract('ERC4626', function (accounts) {
904957 expect ( await this . vault . balanceOf ( user2 ) ) . to . be . bignumber . equal ( '4000' ) ;
905958 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user1 ) ) ) . to . be . bignumber . equal ( '4999' ) ;
906959 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user2 ) ) ) . to . be . bignumber . equal ( '6000' ) ;
960+ expect ( await this . vault . convertToShares ( await this . token . balanceOf ( this . vault . address ) ) ) . to . be . bignumber . equal (
961+ '7333' ,
962+ ) ;
907963 expect ( await this . vault . totalSupply ( ) ) . to . be . bignumber . equal ( '7333' ) ;
908964 expect ( await this . vault . totalAssets ( ) ) . to . be . bignumber . equal ( '11000' ) ;
909965 }
@@ -928,6 +984,9 @@ contract('ERC4626', function (accounts) {
928984 expect ( await this . vault . balanceOf ( user2 ) ) . to . be . bignumber . equal ( '6000' ) ;
929985 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user1 ) ) ) . to . be . bignumber . equal ( '4999' ) ; // used to be 5000
930986 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user2 ) ) ) . to . be . bignumber . equal ( '9000' ) ;
987+ expect ( await this . vault . convertToShares ( await this . token . balanceOf ( this . vault . address ) ) ) . to . be . bignumber . equal (
988+ '9333' ,
989+ ) ;
931990 expect ( await this . vault . totalSupply ( ) ) . to . be . bignumber . equal ( '9333' ) ;
932991 expect ( await this . vault . totalAssets ( ) ) . to . be . bignumber . equal ( '14000' ) ; // used to be 14001
933992 }
@@ -940,6 +999,9 @@ contract('ERC4626', function (accounts) {
940999 expect ( await this . vault . balanceOf ( user2 ) ) . to . be . bignumber . equal ( '6000' ) ;
9411000 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user1 ) ) ) . to . be . bignumber . equal ( '6070' ) ; // used to be 6071
9421001 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user2 ) ) ) . to . be . bignumber . equal ( '10928' ) ; // used to be 10929
1002+ expect ( await this . vault . convertToShares ( await this . token . balanceOf ( this . vault . address ) ) ) . to . be . bignumber . equal (
1003+ '9333' ,
1004+ ) ;
9431005 expect ( await this . vault . totalSupply ( ) ) . to . be . bignumber . equal ( '9333' ) ;
9441006 expect ( await this . vault . totalAssets ( ) ) . to . be . bignumber . equal ( '17000' ) ; // used to be 17001
9451007
@@ -961,6 +1023,9 @@ contract('ERC4626', function (accounts) {
9611023 expect ( await this . vault . balanceOf ( user2 ) ) . to . be . bignumber . equal ( '6000' ) ;
9621024 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user1 ) ) ) . to . be . bignumber . equal ( '3643' ) ;
9631025 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user2 ) ) ) . to . be . bignumber . equal ( '10929' ) ;
1026+ expect ( await this . vault . convertToShares ( await this . token . balanceOf ( this . vault . address ) ) ) . to . be . bignumber . equal (
1027+ '8000' ,
1028+ ) ;
9641029 expect ( await this . vault . totalSupply ( ) ) . to . be . bignumber . equal ( '8000' ) ;
9651030 expect ( await this . vault . totalAssets ( ) ) . to . be . bignumber . equal ( '14573' ) ;
9661031 }
@@ -983,6 +1048,9 @@ contract('ERC4626', function (accounts) {
9831048 expect ( await this . vault . balanceOf ( user2 ) ) . to . be . bignumber . equal ( '4392' ) ;
9841049 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user1 ) ) ) . to . be . bignumber . equal ( '3643' ) ;
9851050 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user2 ) ) ) . to . be . bignumber . equal ( '8000' ) ;
1051+ expect ( await this . vault . convertToShares ( await this . token . balanceOf ( this . vault . address ) ) ) . to . be . bignumber . equal (
1052+ '6392' ,
1053+ ) ;
9861054 expect ( await this . vault . totalSupply ( ) ) . to . be . bignumber . equal ( '6392' ) ;
9871055 expect ( await this . vault . totalAssets ( ) ) . to . be . bignumber . equal ( '11644' ) ;
9881056 }
@@ -1006,6 +1074,9 @@ contract('ERC4626', function (accounts) {
10061074 expect ( await this . vault . balanceOf ( user2 ) ) . to . be . bignumber . equal ( '4392' ) ;
10071075 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user1 ) ) ) . to . be . bignumber . equal ( '0' ) ;
10081076 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user2 ) ) ) . to . be . bignumber . equal ( '8000' ) ; // used to be 8001
1077+ expect ( await this . vault . convertToShares ( await this . token . balanceOf ( this . vault . address ) ) ) . to . be . bignumber . equal (
1078+ '4392' ,
1079+ ) ;
10091080 expect ( await this . vault . totalSupply ( ) ) . to . be . bignumber . equal ( '4392' ) ;
10101081 expect ( await this . vault . totalAssets ( ) ) . to . be . bignumber . equal ( '8001' ) ;
10111082 }
@@ -1028,6 +1099,9 @@ contract('ERC4626', function (accounts) {
10281099 expect ( await this . vault . balanceOf ( user2 ) ) . to . be . bignumber . equal ( '0' ) ;
10291100 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user1 ) ) ) . to . be . bignumber . equal ( '0' ) ;
10301101 expect ( await this . vault . convertToAssets ( await this . vault . balanceOf ( user2 ) ) ) . to . be . bignumber . equal ( '0' ) ;
1102+ expect ( await this . vault . convertToShares ( await this . token . balanceOf ( this . vault . address ) ) ) . to . be . bignumber . equal (
1103+ '0' ,
1104+ ) ;
10311105 expect ( await this . vault . totalSupply ( ) ) . to . be . bignumber . equal ( '0' ) ;
10321106 expect ( await this . vault . totalAssets ( ) ) . to . be . bignumber . equal ( '1' ) ; // used to be 0
10331107 }
0 commit comments