From 3bd9c46fb3d1b6d7091ed4859cceff4cb71d2c20 Mon Sep 17 00:00:00 2001 From: Ricardo Guilherme Schmidt <3esmit@gmail.com> Date: Mon, 3 Feb 2025 08:00:58 -0300 Subject: [PATCH] chore(tests): Add fuzz tests --- .gas-report | 384 +++++++++++++++++++++++++++++++++++ .gas-snapshot | 86 ++++---- foundry.toml | 3 +- test/RewardsStreamerMP.t.sol | 194 +++++++++++++++++- 4 files changed, 624 insertions(+), 43 deletions(-) diff --git a/.gas-report b/.gas-report index e69de29..54d951c 100644 --- a/.gas-report +++ b/.gas-report @@ -0,0 +1,384 @@ + +╭-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------╮ +| script/DeployRewardsStreamerMP.s.sol:DeployRewardsStreamerMPScript Contract | | | | | | ++=======================================================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| +| 6955264 | 33115 | | | | | +|-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| +| | | | | | | +|-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| +| run | 6073661 | 6073661 | 6073661 | 6073661 | 76 | +╰-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------╯ + +╭---------------------------------------------------------+-----------------+-----+--------+-----+---------╮ +| script/DeploymentConfig.s.sol:DeploymentConfig Contract | | | | | | ++==========================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|---------------------------------------------------------+-----------------+-----+--------+-----+---------| +| 0 | 7607 | | | | | +|---------------------------------------------------------+-----------------+-----+--------+-----+---------| +| | | | | | | +|---------------------------------------------------------+-----------------+-----+--------+-----+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|---------------------------------------------------------+-----------------+-----+--------+-----+---------| +| activeNetworkConfig | 419 | 419 | 419 | 419 | 152 | +╰---------------------------------------------------------+-----------------+-----+--------+-----+---------╯ + +╭-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------╮ +| script/UpgradeRewardsStreamerMP.s.sol:UpgradeRewardsStreamerMPScript Contract | | | | | | ++=========================================================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| +| 3121871 | 15242 | | | | | +|-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| +| | | | | | | +|-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| +| run | 2609105 | 2609105 | 2609105 | 2609105 | 3 | +╰-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------╯ + +╭------------------------------+-----------------+-------+--------+-------+---------╮ +| src/Karma.sol:Karma Contract | | | | | | ++===================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|------------------------------+-----------------+-------+--------+-------+---------| +| 957795 | 4699 | | | | | +|------------------------------+-----------------+-------+--------+-------+---------| +| | | | | | | +|------------------------------+-----------------+-------+--------+-------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|------------------------------+-----------------+-------+--------+-------+---------| +| acceptOwnership | 28335 | 28335 | 28335 | 28335 | 1 | +|------------------------------+-----------------+-------+--------+-------+---------| +| addRewardProvider | 23807 | 57744 | 51218 | 68318 | 44 | +|------------------------------+-----------------+-------+--------+-------+---------| +| allowance | 697 | 697 | 697 | 697 | 2 | +|------------------------------+-----------------+-------+--------+-------+---------| +| approve | 240 | 240 | 240 | 240 | 2 | +|------------------------------+-----------------+-------+--------+-------+---------| +| balanceOf | 3292 | 10958 | 9292 | 20292 | 6 | +|------------------------------+-----------------+-------+--------+-------+---------| +| getRewardProviders | 1091 | 3374 | 3374 | 5657 | 4 | +|------------------------------+-----------------+-------+--------+-------+---------| +| mint | 24184 | 75565 | 90655 | 90667 | 14 | +|------------------------------+-----------------+-------+--------+-------+---------| +| mintAllowance | 5568 | 5578 | 5578 | 5589 | 2 | +|------------------------------+-----------------+-------+--------+-------+---------| +| owner | 570 | 1236 | 570 | 2570 | 3 | +|------------------------------+-----------------+-------+--------+-------+---------| +| removeRewardProvider | 23690 | 28149 | 25831 | 34928 | 6 | +|------------------------------+-----------------+-------+--------+-------+---------| +| totalSupply | 2897 | 4897 | 2897 | 10897 | 8 | +|------------------------------+-----------------+-------+--------+-------+---------| +| transfer | 614 | 614 | 614 | 614 | 2 | +|------------------------------+-----------------+-------+--------+-------+---------| +| transferFrom | 357 | 357 | 357 | 357 | 2 | +|------------------------------+-----------------+-------+--------+-------+---------| +| transferOwnership | 47977 | 47977 | 47977 | 47977 | 1 | +╰------------------------------+-----------------+-------+--------+-------+---------╯ + +╭-------------------------------------------------+-----------------+-------+--------+-------+---------╮ +| src/KarmaNFT.sol:KarmaNFT Contract | | | | | | ++======================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| 673138 | 2982 | | | | | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| | | | | | | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| approve | 228 | 228 | 228 | 228 | 1 | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| getApproved | 148 | 148 | 148 | 148 | 1 | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| isApprovedForAll | 609 | 609 | 609 | 609 | 1 | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| metadataGenerator | 350 | 350 | 350 | 350 | 1 | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| safeTransferFrom(address,address,uint256) | 337 | 337 | 337 | 337 | 1 | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| safeTransferFrom(address,address,uint256,bytes) | 655 | 655 | 655 | 655 | 1 | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| setApprovalForAll | 479 | 479 | 479 | 479 | 1 | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| setMetadataGenerator | 24009 | 26514 | 26514 | 29019 | 2 | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| tokenURI | 60816 | 60816 | 60816 | 60816 | 1 | +|-------------------------------------------------+-----------------+-------+--------+-------+---------| +| transferFrom | 293 | 293 | 293 | 293 | 1 | +╰-------------------------------------------------+-----------------+-------+--------+-------+---------╯ + +╭------------------------------------------------------+-----------------+--------+--------+--------+---------╮ +| src/RewardsStreamerMP.sol:RewardsStreamerMP Contract | | | | | | ++=============================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| 2767624 | 12754 | | | | | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| | | | | | | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| MAX_LOCKUP_PERIOD | 1486 | 1486 | 1486 | 1486 | 4 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| MAX_MULTIPLIER | 642 | 642 | 642 | 642 | 10 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| MIN_LOCKUP_PERIOD | 202 | 202 | 202 | 202 | 15 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| compound | 37136 | 75198 | 75198 | 113261 | 2 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| emergencyModeEnabled | 3530 | 3530 | 3530 | 3530 | 263 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| enableEmergencyMode | 3413 | 26136 | 26302 | 26302 | 264 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| getAccountTotalMaxMP | 4096 | 4096 | 4096 | 4096 | 1 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| getAccountTotalStakedBalance | 15333 | 15333 | 15333 | 15333 | 1 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| getAccountVaults | 5773 | 5773 | 5773 | 5773 | 4 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| getStakedBalance | 2675 | 2675 | 2675 | 2675 | 1 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| getVault | 1792 | 1792 | 1792 | 1792 | 1100 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| initialize | 115245 | 115245 | 115245 | 115245 | 76 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| lastRewardTime | 1122 | 2122 | 2122 | 3122 | 2 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| leave | 94547 | 94547 | 94547 | 94547 | 1 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| lock | 15241 | 52239 | 52136 | 92820 | 260 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| migrateToVault | 14701 | 73085 | 16880 | 187676 | 3 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| mpBalanceOf | 1047 | 2185 | 1985 | 7200 | 12 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| mpBalanceOfAccount | 11097 | 11097 | 11097 | 11097 | 1 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| mpStakedOf | 725 | 878 | 725 | 2725 | 13 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| proxiableUUID | 615 | 615 | 615 | 615 | 3 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| registerVault | 2520 | 74781 | 75302 | 75302 | 304 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| rewardEndTime | 503 | 1503 | 1503 | 2503 | 2 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| rewardStartTime | 393 | 1393 | 1393 | 2393 | 2 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| rewardsBalanceOf | 2039 | 2939 | 3170 | 6039 | 12 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| setReward | 3285 | 56852 | 62610 | 107330 | 8 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| setTrustedCodehash | 24115 | 24115 | 24115 | 24115 | 76 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| stake | 3116 | 233324 | 228544 | 248873 | 1351 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| totalMP | 1040 | 1282 | 1282 | 1524 | 6 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| totalMPAccrued | 767 | 767 | 767 | 767 | 1108 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| totalMPStaked | 723 | 723 | 723 | 723 | 1111 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| totalMaxMP | 789 | 789 | 789 | 789 | 1108 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| totalRewardsAccrued | 1031 | 1031 | 1031 | 1031 | 3 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| totalRewardsSupply | 1791 | 2384 | 2207 | 7624 | 34 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| totalShares | 711 | 711 | 711 | 711 | 6 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| totalStaked | 965 | 965 | 965 | 965 | 1115 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| unstake | 54386 | 78554 | 78413 | 85333 | 269 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| updateGlobalState | 16846 | 28150 | 29662 | 29733 | 276 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| updateVaultMP | 25115 | 34126 | 36039 | 36110 | 276 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| upgradeToAndCall | 3307 | 8018 | 8629 | 10897 | 5 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| vaultShares | 1754 | 1920 | 1754 | 3754 | 12 | +╰------------------------------------------------------+-----------------+--------+--------+--------+---------╯ + +╭----------------------------------------+-----------------+--------+--------+--------+---------╮ +| src/StakeVault.sol:StakeVault Contract | | | | | | ++===============================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| 1465368 | 6898 | | | | | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| | | | | | | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| STAKING_TOKEN | 171 | 171 | 171 | 171 | 1 | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| emergencyExit | 16145 | 32518 | 32516 | 49616 | 263 | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| initialize | 97512 | 97512 | 97512 | 97512 | 304 | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| leave | 12252 | 152622 | 69405 | 459428 | 4 | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| lock | 12167 | 67480 | 67589 | 108367 | 261 | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| migrateToVault | 30198 | 99793 | 32377 | 236806 | 3 | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| owner | 546 | 565 | 546 | 2546 | 309 | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| register | 12453 | 78318 | 78818 | 78818 | 304 | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| stake | 12013 | 288556 | 284011 | 304340 | 1352 | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| stakeManager | 458 | 458 | 458 | 458 | 303 | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| trustStakeManager | 7519 | 7519 | 7519 | 7519 | 1 | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| unstake | 11837 | 108778 | 109206 | 116126 | 270 | +|----------------------------------------+-----------------+--------+--------+--------+---------| +| withdraw | 20931 | 20931 | 20931 | 20931 | 1 | +╰----------------------------------------+-----------------+--------+--------+--------+---------╯ + +╭----------------------------------------------------+-----------------+------+--------+--------+---------╮ +| src/TransparentProxy.sol:TransparentProxy Contract | | | | | | ++=========================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|----------------------------------------------------+-----------------+------+--------+--------+---------| +| 0 | 948 | | | | | +|----------------------------------------------------+-----------------+------+--------+--------+---------| +| | | | | | | +|----------------------------------------------------+-----------------+------+--------+--------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|----------------------------------------------------+-----------------+------+--------+--------+---------| +| fallback | 547 | 8330 | 1310 | 139538 | 6774 | +|----------------------------------------------------+-----------------+------+--------+--------+---------| +| implementation | 241 | 2240 | 2241 | 2241 | 2195 | +╰----------------------------------------------------+-----------------+------+--------+--------+---------╯ + +╭--------------------------------------------+-----------------+--------+--------+--------+---------╮ +| src/VaultFactory.sol:VaultFactory Contract | | | | | | ++===================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|--------------------------------------------+-----------------+--------+--------+--------+---------| +| 0 | 1972 | | | | | +|--------------------------------------------+-----------------+--------+--------+--------+---------| +| | | | | | | +|--------------------------------------------+-----------------+--------+--------+--------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|--------------------------------------------+-----------------+--------+--------+--------+---------| +| createVault | 231027 | 247844 | 248127 | 248127 | 303 | +╰--------------------------------------------+-----------------+--------+--------+--------+---------╯ + +╭------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------╮ +| src/nft-metadata-generators/NFTMetadataGeneratorSVG.sol:NFTMetadataGeneratorSVG Contract | | | | | | ++===============================================================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| 1146843 | 5972 | | | | | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| | | | | | | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| generate | 44856 | 44856 | 44856 | 44856 | 1 | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| imagePrefix | 851 | 1851 | 1851 | 2851 | 2 | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| imageSuffix | 895 | 1895 | 1895 | 2895 | 2 | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| setImageStrings | 25271 | 30572 | 30572 | 35873 | 2 | +╰------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------╯ + +╭------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------╮ +| src/nft-metadata-generators/NFTMetadataGeneratorURL.sol:NFTMetadataGeneratorURL Contract | | | | | | ++===============================================================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| 1115405 | 5698 | | | | | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| | | | | | | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| generate | 50871 | 50871 | 50871 | 50871 | 1 | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| setURLStrings | 25439 | 30740 | 30740 | 36041 | 2 | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| urlPrefix | 763 | 763 | 763 | 763 | 1 | +|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| urlSuffix | 829 | 829 | 829 | 829 | 1 | +╰------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------╯ + +╭-------------------------------------------------------------+-----------------+-------+--------+-------+---------╮ +| test/mocks/KarmaProviderMock.sol:KarmaProviderMock Contract | | | | | | ++==================================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|-------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| 182244 | 625 | | | | | +|-------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| | | | | | | +|-------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|-------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| rewardsBalanceOfAccount | 422 | 1755 | 2422 | 2422 | 12 | +|-------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| setTotalKarmaShares | 43510 | 43510 | 43510 | 43510 | 20 | +|-------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| setUserKarmaShare | 44075 | 44075 | 44075 | 44075 | 4 | +|-------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| totalRewardsSupply | 363 | 1029 | 363 | 2363 | 72 | +╰-------------------------------------------------------------+-----------------+-------+--------+-------+---------╯ + +╭---------------------------------------------------------------------+-----------------+-------+--------+-------+---------╮ +| test/mocks/MockMetadataGenerator.sol:MockMetadataGenerator Contract | | | | | | ++==========================================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|---------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| 813059 | 3977 | | | | | +|---------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| | | | | | | +|---------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|---------------------------------------------------------------------+-----------------+-------+--------+-------+---------| +| generate | 47214 | 47214 | 47214 | 47214 | 1 | +╰---------------------------------------------------------------------+-----------------+-------+--------+-------+---------╯ + +╭---------------------------------------------+-----------------+-------+--------+-------+---------╮ +| test/mocks/MockToken.sol:MockToken Contract | | | | | | ++==================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|---------------------------------------------+-----------------+-------+--------+-------+---------| +| 569126 | 3218 | | | | | +|---------------------------------------------+-----------------+-------+--------+-------+---------| +| | | | | | | +|---------------------------------------------+-----------------+-------+--------+-------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|---------------------------------------------+-----------------+-------+--------+-------+---------| +| approve | 28773 | 32817 | 29001 | 45957 | 1326 | +|---------------------------------------------+-----------------+-------+--------+-------+---------| +| balanceOf | 513 | 1073 | 513 | 2513 | 1900 | +|---------------------------------------------+-----------------+-------+--------+-------+---------| +| mint | 33813 | 39151 | 34041 | 68097 | 1338 | +╰---------------------------------------------+-----------------+-------+--------+-------+---------╯ + +╭-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------╮ +| test/mocks/StackOverflowStakeManager.sol:StackOverflowStakeManager Contract | | | | | | ++====================================================================================================================================+ +| Deployment Cost | Deployment Size | | | | | +|-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------| +| 887790 | 3932 | | | | | +|-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------| +| | | | | | | +|-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------| +| Function Name | Min | Avg | Median | Max | # Calls | +|-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------| +| leave | 321 | 213894 | 213894 | 427541 | 323 | +|-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------| +| proxiableUUID | 383 | 383 | 383 | 383 | 1 | +╰-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------╯ + + diff --git a/.gas-snapshot b/.gas-snapshot index a5d1eeb..f6bdfd5 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -7,11 +7,47 @@ EmergencyExitTest:test_EmergencyExitToAlternateAddress() (gas: 453110) EmergencyExitTest:test_EmergencyExitWithLock() (gas: 450358) EmergencyExitTest:test_EmergencyExitWithRewards() (gas: 439675) EmergencyExitTest:test_OnlyOwnerCanEnableEmergencyMode() (gas: 40626) +FuzzTests:testFuzz_AccrueMP(uint256,uint256,uint16) (runs: 1002, μ: 521564, ~: 515955) +FuzzTests:testFuzz_EmergencyExit(uint256,uint256) (runs: 1002, μ: 513790, ~: 504677) +FuzzTests:testFuzz_Stake(uint256,uint256) (runs: 1002, μ: 404805, ~: 395692) +FuzzTests:testFuzz_Unstake(uint256,uint256,uint16,uint256) (runs: 1001, μ: 527488, ~: 527212) IntegrationTest:testStakeFoo() (gas: 1416716) -LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 6195340) +KarmaMintAllowanceTest:testAddKarmaProviderOnlyOwner() (gas: 316675) +KarmaMintAllowanceTest:testBalanceOf() (gas: 294197) +KarmaMintAllowanceTest:testBalanceOfWithNoSystemTotalKarma() (gas: 43077) +KarmaMintAllowanceTest:testMintAllowance_Available() (gas: 205127) +KarmaMintAllowanceTest:testMintAllowance_NotAvailable() (gas: 205187) +KarmaMintAllowanceTest:testMintOnlyOwner() (gas: 241762) +KarmaMintAllowanceTest:testMint_Ok() (gas: 263754) +KarmaMintAllowanceTest:testMint_RevertWithAllowanceExceeded() (gas: 246839) +KarmaMintAllowanceTest:testRemoveKarmaProviderIndexOutOfBounds() (gas: 36489) +KarmaMintAllowanceTest:testRemoveKarmaProviderOnlyOwner() (gas: 72980) +KarmaMintAllowanceTest:testTotalSupply() (gas: 202527) +KarmaMintAllowanceTest:testTransfersNotAllowed() (gas: 17736) +KarmaNFTTest:testApproveNotAllowed() (gas: 10917) +KarmaNFTTest:testGetApproved() (gas: 10635) +KarmaNFTTest:testIsApprovedForAll() (gas: 10797) +KarmaNFTTest:testSafeTransferNotAllowed() (gas: 11042) +KarmaNFTTest:testSafeTransferWithDataNotAllowed() (gas: 11112) +KarmaNFTTest:testSetApprovalForAllNotAllowed() (gas: 8654) +KarmaNFTTest:testSetMetadataGenerator() (gas: 886751) +KarmaNFTTest:testSetMetadataGeneratorRevert() (gas: 883297) +KarmaNFTTest:testTokenURI() (gas: 93186) +KarmaNFTTest:testTransferNotAllowed() (gas: 10679) +KarmaOwnershipTest:testInitialOwner() (gas: 13010) +KarmaOwnershipTest:testOwnershipTransfer() (gas: 88372) +KarmaTest:testAddKarmaProviderOnlyOwner() (gas: 316641) +KarmaTest:testBalanceOf() (gas: 294179) +KarmaTest:testBalanceOfWithNoSystemTotalKarma() (gas: 43055) +KarmaTest:testMintOnlyOwner() (gas: 241738) +KarmaTest:testRemoveKarmaProviderIndexOutOfBounds() (gas: 36483) +KarmaTest:testRemoveKarmaProviderOnlyOwner() (gas: 72968) +KarmaTest:testTotalSupply() (gas: 202421) +KarmaTest:testTransfersNotAllowed() (gas: 17714) +LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 6215464) LeaveTest:test_RevertWhenStakeManagerIsTrusted() (gas: 350929) -LeaveTest:test_TrustNewStakeManager() (gas: 6246483) -LockTest:test_LockFailsWithInvalidPeriod(uint256) (runs: 1000, μ: 407521, ~: 407489) +LeaveTest:test_TrustNewStakeManager() (gas: 6266606) +LockTest:test_LockFailsWithInvalidPeriod(uint256) (runs: 1002, μ: 407524, ~: 407489) LockTest:test_LockFailsWithNoStake() (gas: 115941) LockTest:test_LockFailsWithZero() (gas: 369509) LockTest:test_LockWithoutPriorLock() (gas: 464698) @@ -23,11 +59,11 @@ MathTest:test_CalcBonusMP() (gas: 17488) MathTest:test_CalcInitialMP() (gas: 5941) MathTest:test_CalcMaxAccruedMP() (gas: 4580) MathTest:test_CalcMaxTotalMP() (gas: 17901) -MultipleVaultsStakeTest:test_StakeMultipleVaults() (gas: 853171) -NFTMetadataGeneratorSVGTest:testGenerateMetadata() (gas: 79488) +MultipleVaultsStakeTest:test_StakeMultipleVaults() (gas: 855943) +NFTMetadataGeneratorSVGTest:testGenerateMetadata() (gas: 78556) NFTMetadataGeneratorSVGTest:testSetImageStrings() (gas: 57996) NFTMetadataGeneratorSVGTest:testSetImageStringsRevert() (gas: 36175) -NFTMetadataGeneratorURLTest:testGenerateMetadata() (gas: 92494) +NFTMetadataGeneratorURLTest:testGenerateMetadata() (gas: 91549) NFTMetadataGeneratorURLTest:testSetBaseURL() (gas: 49145) NFTMetadataGeneratorURLTest:testSetBaseURLRevert() (gas: 36219) RewardsStreamerMP_RewardsTest:testRewardsBalanceOf() (gas: 1228876) @@ -72,39 +108,7 @@ UnstakeTest:test_UnstakeOneAccount() (gas: 572086) UnstakeTest:test_UnstakeOneAccountAndAccruedMP() (gas: 595995) UnstakeTest:test_UnstakeOneAccountAndRewards() (gas: 492152) UnstakeTest:test_UnstakeOneAccountWithLockUpAndAccruedMP() (gas: 622113) -UpgradeTest:test_RevertWhenNotOwner() (gas: 2833999) -UpgradeTest:test_UpgradeStakeManager() (gas: 6083699) +UpgradeTest:test_RevertWhenNotOwner() (gas: 2844286) +UpgradeTest:test_UpgradeStakeManager() (gas: 6103823) VaultRegistrationTest:test_VaultRegistration() (gas: 64599) -WithdrawTest:test_CannotWithdrawStakedFunds() (gas: 367398) -XPNFTTokenTest:testApproveNotAllowed() (gas: 10917) -XPNFTTokenTest:testGetApproved() (gas: 10635) -XPNFTTokenTest:testIsApprovedForAll() (gas: 10797) -XPNFTTokenTest:testSafeTransferNotAllowed() (gas: 11042) -XPNFTTokenTest:testSafeTransferWithDataNotAllowed() (gas: 11134) -XPNFTTokenTest:testSetApprovalForAllNotAllowed() (gas: 8654) -XPNFTTokenTest:testSetMetadataGenerator() (gas: 894671) -XPNFTTokenTest:testSetMetadataGeneratorRevert() (gas: 891217) -XPNFTTokenTest:testTokenURI() (gas: 94156) -XPNFTTokenTest:testTransferNotAllowed() (gas: 10679) -XPTokenMintAllowanceTest:testAddXPProviderOnlyOwner() (gas: 316437) -XPTokenMintAllowanceTest:testBalanceOf() (gas: 294269) -XPTokenMintAllowanceTest:testBalanceOfWithNoSystemTotalXP() (gas: 43045) -XPTokenMintAllowanceTest:testMintAllowance_Available() (gas: 205309) -XPTokenMintAllowanceTest:testMintAllowance_NotAvailable() (gas: 205369) -XPTokenMintAllowanceTest:testMintOnlyOwner() (gas: 241922) -XPTokenMintAllowanceTest:testMint_Ok() (gas: 263926) -XPTokenMintAllowanceTest:testMint_RevertWithAllowanceExceeded() (gas: 247021) -XPTokenMintAllowanceTest:testRemoveXPProviderIndexOutOfBounds() (gas: 36667) -XPTokenMintAllowanceTest:testRemoveXPProviderOnlyOwner() (gas: 72980) -XPTokenMintAllowanceTest:testTotalSupply() (gas: 202725) -XPTokenMintAllowanceTest:testTransfersNotAllowed() (gas: 17758) -XPTokenOwnershipTest:testInitialOwner() (gas: 13010) -XPTokenOwnershipTest:testOwnershipTransfer() (gas: 88372) -XPTokenTest:testAddXPProviderOnlyOwner() (gas: 316425) -XPTokenTest:testBalanceOf() (gas: 294251) -XPTokenTest:testBalanceOfWithNoSystemTotalXP() (gas: 43023) -XPTokenTest:testMintOnlyOwner() (gas: 241898) -XPTokenTest:testRemoveXPProviderIndexOutOfBounds() (gas: 36661) -XPTokenTest:testRemoveXPProviderOnlyOwner() (gas: 72968) -XPTokenTest:testTotalSupply() (gas: 202619) -XPTokenTest:testTransfersNotAllowed() (gas: 17736) \ No newline at end of file +WithdrawTest:test_CannotWithdrawStakedFunds() (gas: 367398) \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index aae65e3..25558c0 100644 --- a/foundry.toml +++ b/foundry.toml @@ -6,7 +6,7 @@ bytecode_hash = "none" cbor_metadata = false evm_version = "cancun" - fuzz = { runs = 1_000 } + fuzz = { runs = 1_000, max_test_rejects = 262144 } gas_reports = ["*"] libs = ["lib"] via_ir = true @@ -17,6 +17,7 @@ solc = "0.8.26" src = "src" test = "test" + [profile.ci] fuzz = { runs = 10_000, max_test_rejects = 2621440 } verbosity = 4 diff --git a/test/RewardsStreamerMP.t.sol b/test/RewardsStreamerMP.t.sol index 0bdc36c..fe57c9a 100644 --- a/test/RewardsStreamerMP.t.sol +++ b/test/RewardsStreamerMP.t.sol @@ -2,6 +2,8 @@ pragma solidity ^0.8.26; import { Test } from "forge-std/Test.sol"; +import { Test, console } from "forge-std/Test.sol"; +import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; import { DeployRewardsStreamerMPScript } from "../script/DeployRewardsStreamerMP.s.sol"; import { UpgradeRewardsStreamerMPScript } from "../script/UpgradeRewardsStreamerMP.s.sol"; import { DeploymentConfig } from "../script/DeploymentConfig.s.sol"; @@ -120,7 +122,7 @@ contract RewardsStreamerMPTest is StakeMath, Test { vault = vaultFactory.createVault(); } - function _stake(address account, uint256 amount, uint256 lockupTime) public { + function _stake(address account, uint256 amount, uint256 lockupTime) public virtual { StakeVault vault = StakeVault(vaults[account]); vm.prank(account); vault.stake(amount, lockupTime); @@ -2393,6 +2395,8 @@ contract MultipleVaultsStakeTest is RewardsStreamerMPTest { } function test_StakeMultipleVaults() public { + console.log(MAX_BALANCE); + // Alice vault1 stakes 10 tokens _stakeWithVault(alice, vault1, 10e18, 0); @@ -2579,3 +2583,191 @@ contract CompoundTest is RewardsStreamerMPTest { _compound(alice); } } + +contract FuzzTests is RewardsStreamerMPTest { + function _stake(address account, uint256 amount, uint256 lockPeriod) public override { + stakingToken.mint(account, amount); + vm.prank(account); + stakingToken.approve(vaults[account], amount); + super._stake(account, amount, lockPeriod); + } + + function testFuzz_Stake(uint256 stakeAmount, uint256 lockUpPeriod) public { + vm.assume(stakeAmount > 0 && stakeAmount <= MAX_BALANCE); + vm.assume(lockUpPeriod == 0 || (lockUpPeriod >= MIN_LOCKUP_PERIOD && lockUpPeriod <= MAX_LOCKUP_PERIOD)); + uint256 expectedBonusMP = _bonusMP(stakeAmount, lockUpPeriod); + uint256 expectedMaxTotalMP = _maxTotalMP(stakeAmount, lockUpPeriod); + + _stake(alice, stakeAmount, lockUpPeriod); + + checkStreamer( + CheckStreamerParams({ + totalStaked: stakeAmount, + totalMPStaked: stakeAmount + expectedBonusMP, + totalMPAccrued: stakeAmount + expectedBonusMP, + totalMaxMP: expectedMaxTotalMP, + stakingBalance: stakeAmount, + rewardBalance: 0, + rewardIndex: 0 + }) + ); + + checkVault( + CheckVaultParams({ + account: vaults[alice], + rewardBalance: 0, + stakedBalance: stakeAmount, + vaultBalance: stakeAmount, + rewardIndex: 0, + mpStaked: stakeAmount + expectedBonusMP, + mpAccrued: stakeAmount + expectedBonusMP, + maxMP: expectedMaxTotalMP, + rewardsAccrued: 0 + }) + ); + } + + function testFuzz_AccrueMP(uint256 stakeAmount, uint256 lockUpPeriod, uint16 accruedTime) public { + vm.assume(stakeAmount > 0 && stakeAmount <= MAX_BALANCE); + vm.assume(lockUpPeriod == 0 || (lockUpPeriod >= MIN_LOCKUP_PERIOD && lockUpPeriod <= MAX_LOCKUP_PERIOD)); + uint256 expectedMaxTotalMP = _maxTotalMP(stakeAmount, lockUpPeriod); + uint256 expectedStakedMP = _initialMP(stakeAmount) + _bonusMP(stakeAmount, lockUpPeriod); + uint256 rawTotalMP = expectedStakedMP + _accrueMP(stakeAmount, accruedTime); + uint256 expectedTotalMP = Math.min(rawTotalMP, expectedMaxTotalMP); + + _stake(alice, stakeAmount, lockUpPeriod); + + uint256 currentTime = vm.getBlockTimestamp(); + vm.warp(currentTime + accruedTime); + streamer.updateGlobalState(); + streamer.updateVaultMP(vaults[alice]); + checkStreamer( + CheckStreamerParams({ + totalStaked: stakeAmount, + totalMPStaked: expectedStakedMP, + totalMPAccrued: expectedTotalMP, + totalMaxMP: expectedMaxTotalMP, + stakingBalance: stakeAmount, + rewardBalance: 0, + rewardIndex: 0 + }) + ); + + checkVault( + CheckVaultParams({ + account: vaults[alice], + rewardBalance: 0, + stakedBalance: stakeAmount, + vaultBalance: stakeAmount, + rewardIndex: 0, + mpStaked: expectedStakedMP, + mpAccrued: expectedTotalMP, + maxMP: expectedMaxTotalMP, + rewardsAccrued: 0 + }) + ); + } + + function testFuzz_Unstake( + uint256 stakeAmount, + uint256 lockUpPeriod, + uint16 accruedTime, + uint256 unstakeAmount + ) + public + { + vm.assume(stakeAmount > 0 && stakeAmount <= MAX_BALANCE); + vm.assume(lockUpPeriod == 0 || (lockUpPeriod >= MIN_LOCKUP_PERIOD && lockUpPeriod <= MAX_LOCKUP_PERIOD)); + vm.assume(unstakeAmount <= stakeAmount); + vm.assume(accruedTime >= lockUpPeriod); + + uint256 expectedMaxTotalMP = _maxTotalMP(stakeAmount, lockUpPeriod); + uint256 expectedStakedMP = _initialMP(stakeAmount) + _bonusMP(stakeAmount, lockUpPeriod); + uint256 rawTotalMP = expectedStakedMP + _accrueMP(stakeAmount, accruedTime); + uint256 expectedTotalMP = Math.min(rawTotalMP, expectedMaxTotalMP); + + _stake(alice, stakeAmount, lockUpPeriod); + + uint256 currentTime = vm.getBlockTimestamp(); + vm.warp(currentTime + accruedTime); + + _unstake(alice, unstakeAmount); + + uint256 totalMPAccrued = expectedTotalMP - _reduceMP(stakeAmount, expectedTotalMP, unstakeAmount); + if (totalMPAccrued < expectedStakedMP) { + expectedStakedMP = totalMPAccrued; + } + + checkStreamer( + CheckStreamerParams({ + totalStaked: stakeAmount - unstakeAmount, + totalMPStaked: expectedStakedMP, + totalMPAccrued: totalMPAccrued, + totalMaxMP: expectedMaxTotalMP - _reduceMP(stakeAmount, expectedMaxTotalMP, unstakeAmount), + stakingBalance: stakeAmount - unstakeAmount, + rewardBalance: 0, + rewardIndex: 0 + }) + ); + + checkVault( + CheckVaultParams({ + account: vaults[alice], + rewardBalance: 0, + stakedBalance: stakeAmount - unstakeAmount, + vaultBalance: stakeAmount - unstakeAmount, + rewardIndex: 0, + mpStaked: expectedStakedMP, + mpAccrued: expectedTotalMP - _reduceMP(stakeAmount, expectedTotalMP, unstakeAmount), + maxMP: expectedMaxTotalMP - _reduceMP(stakeAmount, expectedMaxTotalMP, unstakeAmount), + rewardsAccrued: 0 + }) + ); + } + + function testFuzz_EmergencyExit(uint256 stakeAmount, uint256 lockUpPeriod) public { + vm.assume(stakeAmount > 0 && stakeAmount <= MAX_BALANCE); + vm.assume(lockUpPeriod == 0 || (lockUpPeriod >= MIN_LOCKUP_PERIOD && lockUpPeriod <= MAX_LOCKUP_PERIOD)); + + uint256 aliceInitialBalance = stakingToken.balanceOf(alice); + uint256 expectedBonusMP = _bonusMP(stakeAmount, lockUpPeriod); + uint256 expectedMaxTotalMP = _maxTotalMP(stakeAmount, lockUpPeriod); + + _stake(alice, stakeAmount, lockUpPeriod); + + vm.prank(admin); + streamer.enableEmergencyMode(); + + _emergencyExit(alice); + + checkStreamer( + CheckStreamerParams({ + totalStaked: stakeAmount, + totalMPStaked: stakeAmount + expectedBonusMP, + totalMPAccrued: stakeAmount + expectedBonusMP, + totalMaxMP: expectedMaxTotalMP, + stakingBalance: 0, + rewardBalance: 0, + rewardIndex: 0 + }) + ); + + checkVault( + CheckVaultParams({ + account: vaults[alice], + rewardBalance: 0, + stakedBalance: stakeAmount, + vaultBalance: 0, + rewardIndex: 0, + mpStaked: stakeAmount + expectedBonusMP, + mpAccrued: stakeAmount + expectedBonusMP, + maxMP: expectedMaxTotalMP, + rewardsAccrued: 0 + }) + ); + + assertEq( + stakingToken.balanceOf(alice), aliceInitialBalance + stakeAmount, "Alice should get staked tokens back" + ); + } +}