diff --git a/.gas-snapshot b/.gas-snapshot index b8e332a8..385aa7b4 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -146,6 +146,32 @@ ERC20Test:testTransfer() (gas: 60272) ERC20Test:testTransfer(address,uint256) (runs: 256, μ: 58773, ~: 60484) ERC20Test:testTransferFrom() (gas: 83777) ERC20Test:testTransferFrom(address,uint256,uint256) (runs: 256, μ: 86464, ~: 92841) +ERC4626StdTest:testFail_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 585845, ~: 586557) +ERC4626StdTest:testFail_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 589776, ~: 590333) +ERC4626StdTest:test_RT_deposit_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 515838, ~: 516226) +ERC4626StdTest:test_RT_deposit_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 515883, ~: 516146) +ERC4626StdTest:test_RT_mint_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 517898, ~: 518224) +ERC4626StdTest:test_RT_mint_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 517662, ~: 518179) +ERC4626StdTest:test_RT_redeem_deposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 516058, ~: 516259) +ERC4626StdTest:test_RT_redeem_mint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 515890, ~: 516217) +ERC4626StdTest:test_RT_withdraw_deposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 517968, ~: 518293) +ERC4626StdTest:test_RT_withdraw_mint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 517830, ~: 518220) +ERC4626StdTest:test_asset((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 450530, ~: 451772) +ERC4626StdTest:test_convertToAssets((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 455096, ~: 455554) +ERC4626StdTest:test_convertToShares((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 455034, ~: 455556) +ERC4626StdTest:test_deposit((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 494103, ~: 494743) +ERC4626StdTest:test_maxDeposit((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 450572, ~: 451814) +ERC4626StdTest:test_maxMint((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 450544, ~: 451785) +ERC4626StdTest:test_maxRedeem((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 450680, ~: 451922) +ERC4626StdTest:test_maxWithdraw((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 452693, ~: 454886) +ERC4626StdTest:test_mint((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 495982, ~: 496759) +ERC4626StdTest:test_previewDeposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 490122, ~: 490510) +ERC4626StdTest:test_previewMint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 491996, ~: 492512) +ERC4626StdTest:test_previewRedeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 509681, ~: 510133) +ERC4626StdTest:test_previewWithdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 511693, ~: 512144) +ERC4626StdTest:test_redeem((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 513764, ~: 514334) +ERC4626StdTest:test_totalAssets((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 451134, ~: 452376) +ERC4626StdTest:test_withdraw((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 515792, ~: 516372) ERC4626Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2885) ERC4626Test:testFailDepositWithNoApproval() (gas: 13357) ERC4626Test:testFailDepositWithNotEnoughApproval() (gas: 86993) diff --git a/.gitmodules b/.gitmodules index e1247196..522f6724 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,9 @@ [submodule "lib/ds-test"] path = lib/ds-test url = https://github.com/dapphub/ds-test +[submodule "lib/erc4626-tests"] + path = lib/erc4626-tests + url = https://github.com/a16z/erc4626-tests.git +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/lib/erc4626-tests b/lib/erc4626-tests new file mode 160000 index 00000000..8b1d7c2a --- /dev/null +++ b/lib/erc4626-tests @@ -0,0 +1 @@ +Subproject commit 8b1d7c2ac248c33c3506b1bff8321758943c5e11 diff --git a/lib/forge-std b/lib/forge-std new file mode 160000 index 00000000..2a2ce369 --- /dev/null +++ b/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 2a2ce3692b8c1523b29de3ec9d961ee9fbbc43a6 diff --git a/src/test/ERC4626.st.sol b/src/test/ERC4626.st.sol new file mode 100644 index 00000000..e9216123 --- /dev/null +++ b/src/test/ERC4626.st.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity >=0.8.0 <0.9.0; + +import "erc4626-tests/ERC4626.test.sol"; + +import {MockERC20} from "./utils/mocks/MockERC20.sol"; +import {MockERC4626} from "./utils/mocks/MockERC4626.sol"; + +contract ERC4626StdTest is ERC4626Test { + function setUp() public override { + _underlying_ = address(new MockERC20("MockERC20", "MockERC20", 18)); + _vault_ = address(new MockERC4626(MockERC20(_underlying_), "MockERC4626", "MockERC4626")); + _delta_ = 0; + _vaultMayBeEmpty = false; + _unlimitedAmount = false; + } + + // NOTE: The following test is relaxed to consider only smaller values (of type uint120), + // since maxWithdraw() fails with large values (due to overflow). + + function test_maxWithdraw(Init memory init) public override { + init = clamp(init, type(uint120).max); + super.test_maxWithdraw(init); + } + + function clamp(Init memory init, uint256 max) internal pure returns (Init memory) { + for (uint256 i = 0; i < N; i++) { + init.share[i] = init.share[i] % max; + init.asset[i] = init.asset[i] % max; + } + init.yield = init.yield % int256(max); + return init; + } +}