chore(karma-rln): improving tests

This commit is contained in:
Ricardo Guilherme Schmidt
2025-06-02 11:30:50 -03:00
parent 42aa589847
commit c4d211e9bb
6 changed files with 536 additions and 399 deletions

View File

@@ -4,13 +4,13 @@
+==================================================================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|-------------------------------------------------------------------------------------------+-----------------+--------+--------+--------+---------|
| 0 | 1374 | | | | |
| 275353 | 1374 | | | | |
|-------------------------------------------------------------------------------------------+-----------------+--------+--------+--------+---------|
| | | | | | |
|-------------------------------------------------------------------------------------------+-----------------+--------+--------+--------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|-------------------------------------------------------------------------------------------+-----------------+--------+--------+--------+---------|
| fallback | 666 | 112892 | 97112 | 193429 | 693 |
| fallback | 5145 | 102784 | 97112 | 193429 | 783 |
╰-------------------------------------------------------------------------------------------+-----------------+--------+--------+--------+---------╯
╭-----------------------------------------------------+-----------------+---------+---------+---------+---------╮
@@ -55,19 +55,19 @@
| run | 7425695 | 7425695 | 7425695 | 7425695 | 95 |
╰-------------------------------------------------------------------+-----------------+---------+---------+---------+---------╯
╭---------------------------------------------------------+-----------------+-----+--------+-----+---------╮
| script/DeploymentConfig.s.sol:DeploymentConfig Contract | | | | | |
+==========================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|---------------------------------------------------------+-----------------+-----+--------+-----+---------|
| 0 | 9022 | | | | |
|---------------------------------------------------------+-----------------+-----+--------+-----+---------|
| | | | | | |
|---------------------------------------------------------+-----------------+-----+--------+-----+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|---------------------------------------------------------+-----------------+-----+--------+-----+---------|
| activeNetworkConfig | 455 | 455 | 455 | 455 | 414 |
╰---------------------------------------------------------+-----------------+-----+--------+-----+---------╯
╭---------------------------------------------------------+-----------------+------+--------+------+---------╮
| script/DeploymentConfig.s.sol:DeploymentConfig Contract | | | | | |
+============================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|---------------------------------------------------------+-----------------+------+--------+------+---------|
| 0 | 9022 | | | | |
|---------------------------------------------------------+-----------------+------+--------+------+---------|
| | | | | | |
|---------------------------------------------------------+-----------------+------+--------+------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|---------------------------------------------------------+-----------------+------+--------+------+---------|
| activeNetworkConfig | 455 | 1971 | 455 | 4455 | 414 |
╰---------------------------------------------------------+-----------------+------+--------+------+---------╯
╭---------------------------------------------------------------------+-----------------+---------+---------+---------+---------╮
| script/UpgradeStakeManager.s.sol:UpgradeStakeManagerScript Contract | | | | | |
@@ -104,13 +104,13 @@
|------------------------------+-----------------+--------+--------+--------+---------|
| approve | 441 | 441 | 441 | 441 | 6 |
|------------------------------+-----------------+--------+--------+--------+---------|
| balanceOf | 10085 | 13751 | 10085 | 21085 | 18 |
| balanceOf | 21085 | 21085 | 21085 | 21085 | 18 |
|------------------------------+-----------------+--------+--------+--------+---------|
| getRewardDistributors | 1119 | 3523 | 5607 | 5607 | 17 |
| getRewardDistributors | 5119 | 7759 | 9607 | 9607 | 17 |
|------------------------------+-----------------+--------+--------+--------+---------|
| grantRole | 29440 | 29440 | 29440 | 29440 | 5 |
|------------------------------+-----------------+--------+--------+--------+---------|
| hasRole | 685 | 2185 | 2685 | 2685 | 4 |
| hasRole | 2685 | 2685 | 2685 | 2685 | 4 |
|------------------------------+-----------------+--------+--------+--------+---------|
| initialize | 94595 | 94595 | 94595 | 94595 | 152 |
|------------------------------+-----------------+--------+--------+--------+---------|
@@ -120,7 +120,7 @@
|------------------------------+-----------------+--------+--------+--------+---------|
| setReward | 4832 | 147872 | 166705 | 166705 | 307 |
|------------------------------+-----------------+--------+--------+--------+---------|
| totalSupply | 3567 | 7567 | 9567 | 9567 | 18 |
| totalSupply | 22567 | 22567 | 22567 | 22567 | 18 |
|------------------------------+-----------------+--------+--------+--------+---------|
| transfer | 439 | 439 | 439 | 439 | 6 |
|------------------------------+-----------------+--------+--------+--------+---------|
@@ -144,7 +144,7 @@
|-------------------------------------------------+-----------------+-------+--------+-------+---------|
| isApprovedForAll | 510 | 510 | 510 | 510 | 1 |
|-------------------------------------------------+-----------------+-------+--------+-------+---------|
| metadataGenerator | 325 | 325 | 325 | 325 | 1 |
| metadataGenerator | 2325 | 2325 | 2325 | 2325 | 1 |
|-------------------------------------------------+-----------------+-------+--------+-------+---------|
| safeTransferFrom(address,address,uint256) | 485 | 485 | 485 | 485 | 1 |
|-------------------------------------------------+-----------------+-------+--------+-------+---------|
@@ -154,7 +154,7 @@
|-------------------------------------------------+-----------------+-------+--------+-------+---------|
| setMetadataGenerator | 24036 | 27334 | 28983 | 28983 | 3 |
|-------------------------------------------------+-----------------+-------+--------+-------+---------|
| tokenURI | 69222 | 69222 | 69222 | 69222 | 1 |
| tokenURI | 75722 | 75722 | 75722 | 75722 | 1 |
|-------------------------------------------------+-----------------+-------+--------+-------+---------|
| transferFrom | 530 | 530 | 530 | 530 | 1 |
╰-------------------------------------------------+-----------------+-------+--------+-------+---------╯
@@ -180,41 +180,41 @@
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| enableEmergencyMode | 2543 | 25291 | 25457 | 25457 | 264 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| getAccountTotalMaxMP | 3191 | 3191 | 3191 | 3191 | 1 |
| getAccountTotalMaxMP | 21191 | 21191 | 21191 | 21191 | 1 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| getAccountTotalStakedBalance | 15170 | 15170 | 15170 | 15170 | 1 |
| getAccountTotalStakedBalance | 21170 | 21170 | 21170 | 21170 | 1 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| getAccountVaults | 5230 | 5230 | 5230 | 5230 | 4 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| getVault | 1653 | 5709 | 1653 | 13653 | 4180 |
| getVault | 13653 | 13653 | 13653 | 13653 | 4181 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| initialize | 92752 | 92752 | 92752 | 92752 | 95 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| lastRewardTime | 407 | 1407 | 1407 | 2407 | 2 |
| lastRewardTime | 2407 | 2407 | 2407 | 2407 | 2 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| leave | 66348 | 66348 | 66348 | 66348 | 2 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| lock | 7040 | 43426 | 46713 | 87964 | 1034 |
| lock | 7040 | 43473 | 46713 | 87673 | 1034 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| migrateToVault | 9294 | 53513 | 17021 | 170715 | 4 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| mpAccruedOf | 629 | 629 | 629 | 629 | 20 |
| mpAccruedOf | 2629 | 2629 | 2629 | 2629 | 20 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| mpBalanceOf | 917 | 2361 | 2316 | 7063 | 12 |
| mpBalanceOf | 4917 | 8695 | 10316 | 10316 | 12 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| mpBalanceOfAccount | 6210 | 8283 | 8283 | 10356 | 2 |
| mpBalanceOfAccount | 30210 | 31283 | 31283 | 32356 | 2 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| proxiableUUID | 342 | 342 | 342 | 342 | 4 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| registerVault | 2583 | 74547 | 75107 | 75107 | 374 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| rewardEndTime | 429 | 1429 | 1429 | 2429 | 2 |
| rewardEndTime | 2429 | 2429 | 2429 | 2429 | 2 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| rewardStartTime | 364 | 1364 | 1364 | 2364 | 2 |
| rewardStartTime | 2364 | 2364 | 2364 | 2364 | 2 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| rewardsBalanceOf | 2295 | 3511 | 3908 | 6295 | 268 |
| rewardsBalanceOf | 20295 | 24409 | 25908 | 26129 | 268 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| rewardsBalanceOfAccount | 10220 | 10220 | 10220 | 10220 | 1 |
| rewardsBalanceOfAccount | 62220 | 62220 | 62220 | 62220 | 1 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| setReward | 2508 | 105565 | 107076 | 107076 | 265 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
@@ -222,39 +222,39 @@
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| setTrustedCodehash | 24238 | 24238 | 24238 | 24238 | 95 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| stake | 2639 | 131085 | 60725 | 228623 | 2670 |
| stake | 2639 | 132481 | 60725 | 228623 | 2670 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| stakedBalanceOf | 2622 | 2622 | 2622 | 2622 | 1 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalMP | 805 | 1257 | 1257 | 1710 | 6 |
| totalMP | 6805 | 8257 | 8257 | 9710 | 6 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalMPAccrued | 385 | 1064 | 385 | 2385 | 4160 |
| totalMPAccrued | 2385 | 2385 | 2385 | 2385 | 4161 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalMPStaked | 429 | 1107 | 429 | 2429 | 4163 |
| totalMPStaked | 2429 | 2429 | 2429 | 2429 | 4164 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalMaxMP | 407 | 1086 | 407 | 2407 | 4160 |
| totalMaxMP | 2407 | 2407 | 2407 | 2407 | 4161 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalRewardsAccrued | 407 | 407 | 407 | 407 | 3 |
| totalRewardsAccrued | 2407 | 2407 | 2407 | 2407 | 3 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalRewardsSupply | 998 | 1629 | 1792 | 6737 | 290 |
| totalRewardsSupply | 6737 | 11058 | 11792 | 11903 | 290 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalShares | 597 | 597 | 597 | 597 | 6 |
| totalShares | 4597 | 4597 | 4597 | 4597 | 6 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalStaked | 408 | 1086 | 408 | 2408 | 4167 |
| totalStaked | 2408 | 2408 | 2408 | 2408 | 4168 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| unstake | 9886 | 41548 | 39781 | 79550 | 271 |
| unstake | 9886 | 41170 | 39781 | 79550 | 271 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| updateAccount | 347677 | 347677 | 347677 | 347677 | 1 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| updateGlobalState | 15820 | 25876 | 29230 | 29230 | 8 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| updateVault | 31948 | 34368 | 31948 | 110579 | 1022 |
| updateVault | 31948 | 34668 | 31948 | 110579 | 1023 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| upgradeTo | 10279 | 10772 | 10279 | 12745 | 5 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| upgradeToAndCall | 3228 | 3228 | 3228 | 3228 | 1 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| vaultShares | 893 | 1059 | 893 | 2893 | 12 |
| vaultShares | 4893 | 4893 | 4893 | 4893 | 12 |
╰--------------------------------------------+-----------------+--------+--------+--------+---------╯
╭----------------------------------------+-----------------+--------+--------+--------+---------╮
@@ -274,11 +274,11 @@
|----------------------------------------+-----------------+--------+--------+--------+---------|
| initialize | 97688 | 97688 | 97688 | 97688 | 374 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| leave | 12223 | 113138 | 84120 | 356510 | 5 |
| leave | 12223 | 113137 | 84120 | 356508 | 5 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| lock | 12151 | 58918 | 62251 | 103499 | 1035 |
| lock | 12151 | 58965 | 62251 | 103208 | 1035 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| lockUntil | 363 | 1744 | 2363 | 2363 | 7766 |
| lockUntil | 2363 | 2363 | 2363 | 2363 | 7766 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| migrateToVault | 24910 | 77530 | 32637 | 219937 | 4 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
@@ -286,36 +286,36 @@
|----------------------------------------+-----------------+--------+--------+--------+---------|
| register | 12742 | 78218 | 78761 | 78761 | 374 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| stake | 12131 | 165292 | 76290 | 284275 | 2671 |
| stake | 12131 | 167018 | 76290 | 284275 | 2671 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| stakeManager | 393 | 393 | 393 | 393 | 373 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| trustStakeManager | 7650 | 7650 | 7650 | 7650 | 1 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| unstake | 12108 | 58273 | 55296 | 110656 | 272 |
| unstake | 12108 | 57840 | 55296 | 110656 | 272 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| updateLockUntil | 4432 | 20761 | 21532 | 21532 | 506 |
| updateLockUntil | 4432 | 20702 | 21532 | 21532 | 532 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| withdraw | 20817 | 20817 | 20817 | 20817 | 1 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| withdrawFromVault | 20391 | 20391 | 20391 | 20391 | 1 |
╰----------------------------------------+-----------------+--------+--------+--------+---------╯
╭----------------------------------------------------+-----------------+------+--------+--------+---------╮
| src/TransparentProxy.sol:TransparentProxy Contract | | | | | |
+=========================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|----------------------------------------------------+-----------------+------+--------+--------+---------|
| 0 | 1520 | | | | |
|----------------------------------------------------+-----------------+------+--------+--------+---------|
| | | | | | |
|----------------------------------------------------+-----------------+------+--------+--------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|----------------------------------------------------+-----------------+------+--------+--------+---------|
| fallback | 708 | 6172 | 2125 | 374054 | 23155 |
|----------------------------------------------------+-----------------+------+--------+--------+---------|
| implementation | 346 | 2137 | 2346 | 2346 | 4868 |
╰----------------------------------------------------+-----------------+------+--------+--------+---------╯
╭----------------------------------------------------+-----------------+-------+--------+--------+---------╮
| src/TransparentProxy.sol:TransparentProxy Contract | | | | | |
+==========================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|----------------------------------------------------+-----------------+-------+--------+--------+---------|
| 0 | 1520 | | | | |
|----------------------------------------------------+-----------------+-------+--------+--------+---------|
| | | | | | |
|----------------------------------------------------+-----------------+-------+--------+--------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|----------------------------------------------------+-----------------+-------+--------+--------+---------|
| fallback | 5208 | 12845 | 7353 | 374054 | 23161 |
|----------------------------------------------------+-----------------+-------+--------+--------+---------|
| implementation | 346 | 2128 | 2346 | 2346 | 4894 |
╰----------------------------------------------------+-----------------+-------+--------+--------+---------╯
╭--------------------------------------------+-----------------+--------+--------+--------+---------╮
| src/VaultFactory.sol:VaultFactory Contract | | | | | |
@@ -346,9 +346,9 @@
|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| generate | 54775 | 54775 | 54775 | 54775 | 1 |
|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| imagePrefix | 1183 | 2183 | 2183 | 3183 | 2 |
| imagePrefix | 3183 | 3183 | 3183 | 3183 | 2 |
|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| imageSuffix | 1227 | 2227 | 2227 | 3227 | 2 |
| imageSuffix | 3227 | 3227 | 3227 | 3227 | 2 |
|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| setImageStrings | 25295 | 30634 | 30634 | 35974 | 2 |
╰------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------╯
@@ -368,11 +368,65 @@
|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| setURLStrings | 25463 | 30802 | 30802 | 36142 | 2 |
|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| urlPrefix | 1184 | 1184 | 1184 | 1184 | 1 |
| urlPrefix | 3184 | 3184 | 3184 | 3184 | 1 |
|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| urlSuffix | 1228 | 1228 | 1228 | 1228 | 1 |
| urlSuffix | 3228 | 3228 | 3228 | 3228 | 1 |
╰------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------╯
╭----------------------------------------+-----------------+--------+--------+--------+---------╮
| src/rln/KarmaRLN.sol:KarmaRLN Contract | | | | | |
+===============================================================================================+
| Deployment Cost | Deployment Size | | | | |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| 2008065 | 9253 | | | | |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| | | | | | |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| DEFAULT_ADMIN_ROLE | 262 | 262 | 262 | 262 | 10 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| REGISTER_ROLE | 262 | 262 | 262 | 262 | 10 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| SET_SIZE | 2339 | 2339 | 2339 | 2339 | 1 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| SLASHER_ROLE | 262 | 262 | 262 | 262 | 10 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| exit | 7158 | 16284 | 18757 | 22939 | 3 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| hasRole | 2707 | 2707 | 2707 | 2707 | 30 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| identityCommitmentIndex | 2340 | 2340 | 2340 | 2340 | 5 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| initialize | 145136 | 145136 | 145136 | 145136 | 11 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| members | 4669 | 4669 | 4669 | 4669 | 6 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| register | 6974 | 45250 | 52888 | 55688 | 11 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| slash | 7186 | 16419 | 18800 | 23272 | 3 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| verifier | 2359 | 2359 | 2359 | 2359 | 1 |
╰----------------------------------------+-----------------+--------+--------+--------+---------╯
╭-------------------------------------------+-----------------+-------+--------+-------+---------╮
| test/KarmaRLN.t.sol:MockVerifier Contract | | | | | |
+================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|-------------------------------------------+-----------------+-------+--------+-------+---------|
| 204321 | 642 | | | | |
|-------------------------------------------+-----------------+-------+--------+-------+---------|
| | | | | | |
|-------------------------------------------+-----------------+-------+--------+-------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|-------------------------------------------+-----------------+-------+--------+-------+---------|
| changeResult | 21649 | 21649 | 21649 | 21649 | 2 |
|-------------------------------------------+-----------------+-------+--------+-------+---------|
| result | 2298 | 2298 | 2298 | 2298 | 3 |
|-------------------------------------------+-----------------+-------+--------+-------+---------|
| verifyProof | 4790 | 4790 | 4790 | 4790 | 4 |
╰-------------------------------------------+-----------------+-------+--------+-------+---------╯
╭-------------------------------------------------------------------+-----------------+-------+--------+-------+---------╮
| test/mocks/KarmaDistributorMock.sol:KarmaDistributorMock Contract | | | | | |
+========================================================================================================================+
@@ -384,13 +438,13 @@
|-------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|-------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| rewardsBalanceOfAccount | 549 | 1882 | 2549 | 2549 | 36 |
| rewardsBalanceOfAccount | 2549 | 2549 | 2549 | 2549 | 36 |
|-------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| setTotalKarmaShares | 43589 | 43589 | 43589 | 43589 | 36 |
|-------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| setUserKarmaShare | 44194 | 44194 | 44194 | 44194 | 12 |
|-------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| totalRewardsSupply | 324 | 324 | 324 | 324 | 36 |
| totalRewardsSupply | 2324 | 2324 | 2324 | 2324 | 36 |
╰-------------------------------------------------------------------+-----------------+-------+--------+-------+---------╯
╭---------------------------------------------------------------------+-----------------+-------+--------+-------+---------╮
@@ -404,7 +458,7 @@
|---------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|---------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| generate | 58554 | 58554 | 58554 | 58554 | 1 |
| generate | 60554 | 60554 | 60554 | 60554 | 1 |
╰---------------------------------------------------------------------+-----------------+-------+--------+-------+---------╯
╭---------------------------------------------+-----------------+-------+--------+-------+---------╮
@@ -418,11 +472,11 @@
|---------------------------------------------+-----------------+-------+--------+-------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|---------------------------------------------+-----------------+-------+--------+-------+---------|
| approve | 29075 | 31545 | 29183 | 46259 | 2676 |
| approve | 29075 | 31546 | 29183 | 46259 | 2676 |
|---------------------------------------------+-----------------+-------+--------+-------+---------|
| balanceOf | 561 | 1345 | 561 | 2561 | 4958 |
| balanceOf | 2561 | 2561 | 2561 | 2561 | 4959 |
|---------------------------------------------+-----------------+-------+--------+-------+---------|
| mint | 33964 | 37190 | 34072 | 68248 | 2685 |
| mint | 33964 | 37192 | 34072 | 68248 | 2685 |
╰---------------------------------------------+-----------------+-------+--------+-------+---------╯
╭-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------╮
@@ -436,7 +490,7 @@
|-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------|
| leave | 29 | 161076 | 161076 | 322248 | 334 |
| leave | 26 | 161074 | 161074 | 322246 | 334 |
|-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------|
| proxiableUUID | 308 | 308 | 308 | 308 | 1 |
╰-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------╯

View File

@@ -1,141 +1,151 @@
AddRewardDistributorTest:testAddKarmaDistributorOnlyAdmin() (gas: 423055)
AddRewardDistributorTest:testAddRewardDistributorAsOtherAdmin() (gas: 165263)
AddRewardDistributorTest:testBalanceOf() (gas: 431293)
AddRewardDistributorTest:testBalanceOfWithNoSystemTotalKarma() (gas: 49655)
AddRewardDistributorTest:testMintOnlyAdmin() (gas: 378769)
AddRewardDistributorTest:testRemoveKarmaDistributorOnlyOwner() (gas: 147308)
AddRewardDistributorTest:testAddKarmaDistributorOnlyAdmin() (gas: 438055)
AddRewardDistributorTest:testAddRewardDistributorAsOtherAdmin() (gas: 182763)
AddRewardDistributorTest:testBalanceOf() (gas: 449293)
AddRewardDistributorTest:testBalanceOfWithNoSystemTotalKarma() (gas: 69655)
AddRewardDistributorTest:testMintOnlyAdmin() (gas: 428769)
AddRewardDistributorTest:testRemoveKarmaDistributorOnlyOwner() (gas: 162308)
AddRewardDistributorTest:testRemoveUnknownKarmaDistributor() (gas: 41630)
AddRewardDistributorTest:testTotalSupply() (gas: 339166)
AddRewardDistributorTest:testTransfersNotAllowed() (gas: 40285)
AddRewardDistributorTest:testTotalSupply() (gas: 359166)
AddRewardDistributorTest:testTransfersNotAllowed() (gas: 61785)
AddRewardDistributorTest:test_RevertWhen_SenderIsNotDefaultAdmin() (gas: 68325)
EmergencyExitTest:test_CannotEnableEmergencyModeTwice() (gas: 93554)
EmergencyExitTest:test_CannotLeaveBeforeEmergencyMode() (gas: 336067)
EmergencyExitTest:test_EmergencyExitBasic() (gas: 427580)
EmergencyExitTest:test_EmergencyExitMultipleUsers() (gas: 730615)
EmergencyExitTest:test_EmergencyExitToAlternateAddress() (gas: 433110)
EmergencyExitTest:test_EmergencyExitWithLock() (gas: 433444)
EmergencyExitTest:test_EmergencyExitWithRewards() (gas: 419310)
EmergencyExitTest:test_EmergencyExitBasic() (gas: 524580)
EmergencyExitTest:test_EmergencyExitMultipleUsers() (gas: 937615)
EmergencyExitTest:test_EmergencyExitToAlternateAddress() (gas: 479110)
EmergencyExitTest:test_EmergencyExitWithLock() (gas: 452444)
EmergencyExitTest:test_EmergencyExitWithRewards() (gas: 484810)
EmergencyExitTest:test_OnlyOwnerCanEnableEmergencyMode() (gas: 39176)
FuzzTests:testFuzz_AccrueMP(uint128,uint64,uint64) (runs: 1006, μ: 400351, ~: 368061)
FuzzTests:testFuzz_AccrueMP_Relock(uint128,uint64,uint64,uint64) (runs: 1006, μ: 501707, ~: 471734)
FuzzTests:testFuzz_EmergencyExit(uint256,uint256) (runs: 1001, μ: 497146, ~: 487267)
FuzzTests:testFuzz_Lock(uint256,uint64) (runs: 1006, μ: 727489, ~: 726735)
FuzzTests:testFuzz_Relock(uint256,uint64,uint64) (runs: 1006, μ: 409218, ~: 388725)
FuzzTests:testFuzz_Rewards(uint256,uint256,uint256,uint16,uint16) (runs: 1001, μ: 599846, ~: 601205)
FuzzTests:testFuzz_Stake(uint256,uint64) (runs: 1006, μ: 311868, ~: 285086)
FuzzTests:testFuzz_Unstake(uint128,uint64,uint16,uint128) (runs: 1006, μ: 501292, ~: 473125)
FuzzTests:testFuzz_UpdateVault(uint128,uint64,uint64) (runs: 1006, μ: 400374, ~: 368084)
IntegrationTest:testStakeFoo() (gas: 1362931)
FuzzTests:testFuzz_AccrueMP(uint128,uint64,uint64) (runs: 1024, μ: 587151, ~: 549070)
FuzzTests:testFuzz_AccrueMP_Relock(uint128,uint64,uint64,uint64) (runs: 1024, μ: 812396, ~: 777234)
FuzzTests:testFuzz_EmergencyExit(uint256,uint256) (runs: 1007, μ: 588350, ~: 578267)
FuzzTests:testFuzz_Lock(uint256,uint64) (runs: 1025, μ: 961806, ~: 961235)
FuzzTests:testFuzz_Relock(uint256,uint64,uint64) (runs: 1025, μ: 599078, ~: 574234)
FuzzTests:testFuzz_Rewards(uint256,uint256,uint256,uint16,uint16) (runs: 1001, μ: 650369, ~: 653205)
FuzzTests:testFuzz_Stake(uint256,uint64) (runs: 1025, μ: 376001, ~: 346086)
FuzzTests:testFuzz_Unstake(uint128,uint64,uint16,uint128) (runs: 1024, μ: 806573, ~: 780622)
FuzzTests:testFuzz_UpdateVault(uint128,uint64,uint64) (runs: 1024, μ: 587174, ~: 549093)
IntegrationTest:testStakeFoo() (gas: 2348931)
KarmaNFTTest:testApproveNotAllowed() (gas: 10507)
KarmaNFTTest:testGetApproved() (gas: 10531)
KarmaNFTTest:testIsApprovedForAll() (gas: 10705)
KarmaNFTTest:testSafeTransferNotAllowed() (gas: 10688)
KarmaNFTTest:testSafeTransferWithDataNotAllowed() (gas: 10884)
KarmaNFTTest:testSetApprovalForAllNotAllowed() (gas: 8519)
KarmaNFTTest:testSetMetadataGenerator() (gas: 1010377)
KarmaNFTTest:testSetMetadataGenerator() (gas: 1012377)
KarmaNFTTest:testSetMetadataGeneratorRevert() (gas: 1006937)
KarmaNFTTest:testTokenURI() (gas: 1105935)
KarmaNFTTest:testTokenURI() (gas: 1112435)
KarmaNFTTest:testTransferNotAllowed() (gas: 10701)
KarmaOwnershipTest:testAddKarmaDistributorOnlyAdmin() (gas: 423043)
KarmaOwnershipTest:testBalanceOf() (gas: 431293)
KarmaOwnershipTest:testBalanceOfWithNoSystemTotalKarma() (gas: 49677)
KarmaOwnershipTest:testInitialOwner() (gas: 16039)
KarmaOwnershipTest:testMintOnlyAdmin() (gas: 378791)
KarmaOwnershipTest:testOwnershipTransfer() (gas: 76843)
KarmaOwnershipTest:testRemoveKarmaDistributorOnlyOwner() (gas: 147229)
KarmaOwnershipTest:testAddKarmaDistributorOnlyAdmin() (gas: 438043)
KarmaOwnershipTest:testBalanceOf() (gas: 449293)
KarmaOwnershipTest:testBalanceOfWithNoSystemTotalKarma() (gas: 69677)
KarmaOwnershipTest:testInitialOwner() (gas: 20539)
KarmaOwnershipTest:testMintOnlyAdmin() (gas: 428791)
KarmaOwnershipTest:testOwnershipTransfer() (gas: 94343)
KarmaOwnershipTest:testRemoveKarmaDistributorOnlyOwner() (gas: 162229)
KarmaOwnershipTest:testRemoveUnknownKarmaDistributor() (gas: 41618)
KarmaOwnershipTest:testTotalSupply() (gas: 339166)
KarmaOwnershipTest:testTransfersNotAllowed() (gas: 40285)
KarmaTest:testAddKarmaDistributorOnlyAdmin() (gas: 423021)
KarmaTest:testBalanceOf() (gas: 431293)
KarmaTest:testBalanceOfWithNoSystemTotalKarma() (gas: 49655)
KarmaTest:testMintOnlyAdmin() (gas: 378769)
KarmaTest:testRemoveKarmaDistributorOnlyOwner() (gas: 147274)
KarmaOwnershipTest:testTotalSupply() (gas: 359166)
KarmaOwnershipTest:testTransfersNotAllowed() (gas: 61785)
KarmaTest:testAddKarmaDistributorOnlyAdmin() (gas: 438021)
KarmaTest:testBalanceOf() (gas: 449293)
KarmaTest:testBalanceOfWithNoSystemTotalKarma() (gas: 69655)
KarmaTest:testMintOnlyAdmin() (gas: 428769)
KarmaTest:testRemoveKarmaDistributorOnlyOwner() (gas: 162274)
KarmaTest:testRemoveUnknownKarmaDistributor() (gas: 41618)
KarmaTest:testTotalSupply() (gas: 339166)
KarmaTest:testTransfersNotAllowed() (gas: 40263)
LeaveTest:test_LeaveShouldKeepFundsLockedInStakeVault() (gas: 9899411)
LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 9865059)
KarmaTest:testTotalSupply() (gas: 359166)
KarmaTest:testTransfersNotAllowed() (gas: 61763)
LeaveTest:test_LeaveShouldKeepFundsLockedInStakeVault() (gas: 9938411)
LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 10011059)
LeaveTest:test_RevertWhenStakeManagerIsTrusted() (gas: 333238)
LeaveTest:test_TrustNewStakeManager() (gas: 9933491)
LockTest:test_LockFailsWithInvalidPeriod(uint256) (runs: 1006, μ: 384564, ~: 384588)
LeaveTest:test_TrustNewStakeManager() (gas: 9944491)
LockTest:test_LockFailsWithInvalidPeriod(uint256) (runs: 1025, μ: 384562, ~: 384588)
LockTest:test_LockFailsWithNoStake() (gas: 89700)
LockTest:test_LockFailsWithZero() (gas: 343310)
LockTest:test_LockMultipleTimesExceedMaxLock() (gas: 628421)
LockTest:test_LockWithPriorLock() (gas: 566521)
LockTest:test_LockWithoutPriorLock() (gas: 446388)
LockTest:test_LockMultipleTimesExceedMaxLock() (gas: 746921)
LockTest:test_LockWithPriorLock() (gas: 681021)
LockTest:test_LockWithoutPriorLock() (gas: 521888)
LockTest:test_RevertWhenVaultToLockIsEmpty() (gas: 89700)
MaliciousUpgradeTest:test_UpgradeStackOverflowStakeManager() (gas: 1995193)
MaliciousUpgradeTest:test_UpgradeStackOverflowStakeManager() (gas: 2056691)
MathTest:test_CalcAbsoluteMaxTotalMP() (gas: 5240)
MathTest:test_CalcAccrueMP() (gas: 8599)
MathTest:test_CalcBonusMP() (gas: 19244)
MathTest:test_CalcBonusMP() (gas: 30744)
MathTest:test_CalcInitialMP() (gas: 5836)
MathTest:test_CalcMaxAccruedMP() (gas: 4886)
MathTest:test_CalcMaxTotalMP() (gas: 20006)
MultipleVaultsStakeTest:test_StakeMultipleVaults() (gas: 801979)
MathTest:test_CalcMaxTotalMP() (gas: 31506)
MultipleVaultsStakeTest:test_StakeMultipleVaults() (gas: 918979)
NFTMetadataGeneratorSVGTest:testGenerateMetadata() (gas: 92580)
NFTMetadataGeneratorSVGTest:testSetImageStrings() (gas: 60081)
NFTMetadataGeneratorSVGTest:testSetImageStrings() (gas: 77581)
NFTMetadataGeneratorSVGTest:testSetImageStringsRevert() (gas: 35891)
NFTMetadataGeneratorURLTest:testGenerateMetadata() (gas: 108341)
NFTMetadataGeneratorURLTest:testSetBaseURL() (gas: 50631)
NFTMetadataGeneratorURLTest:testSetBaseURL() (gas: 59131)
NFTMetadataGeneratorURLTest:testSetBaseURLRevert() (gas: 36066)
OverflowTest:testAddKarmaDistributorOnlyAdmin() (gas: 423043)
OverflowTest:testBalanceOf() (gas: 431293)
OverflowTest:testBalanceOfWithNoSystemTotalKarma() (gas: 49655)
OverflowTest:testMintOnlyAdmin() (gas: 378769)
OverflowTest:testRemoveKarmaDistributorOnlyOwner() (gas: 147274)
OverflowTest:testAddKarmaDistributorOnlyAdmin() (gas: 438043)
OverflowTest:testBalanceOf() (gas: 449293)
OverflowTest:testBalanceOfWithNoSystemTotalKarma() (gas: 69655)
OverflowTest:testMintOnlyAdmin() (gas: 428769)
OverflowTest:testRemoveKarmaDistributorOnlyOwner() (gas: 162274)
OverflowTest:testRemoveUnknownKarmaDistributor() (gas: 41630)
OverflowTest:testTotalSupply() (gas: 339166)
OverflowTest:testTransfersNotAllowed() (gas: 40263)
OverflowTest:testTotalSupply() (gas: 359166)
OverflowTest:testTransfersNotAllowed() (gas: 61763)
OverflowTest:test_RevertWhen_MintingCausesOverflow() (gas: 129464)
OverflowTest:test_RevertWhen_SettingRewardCausesOverflow() (gas: 127792)
RemoveRewardDistributorTest:testAddKarmaDistributorOnlyAdmin() (gas: 423045)
RemoveRewardDistributorTest:testBalanceOf() (gas: 431366)
RemoveRewardDistributorTest:testBalanceOfWithNoSystemTotalKarma() (gas: 49633)
RemoveRewardDistributorTest:testMintOnlyAdmin() (gas: 378759)
RemoveRewardDistributorTest:testRemoveKarmaDistributorOnlyOwner() (gas: 147298)
RemoveRewardDistributorTest:testRemoveRewardDistributor() (gas: 132118)
RemoveRewardDistributorTest:testRemoveRewardDistributorAsOtherAdmin() (gas: 203200)
RLNTest:test_exit_fails_when_invalid_proof() (gas: 193235)
RLNTest:test_exit_fails_when_not_registered() (gas: 65339)
RLNTest:test_exit_succeeds() (gas: 184871)
RLNTest:test_initial_state() (gas: 60571)
RLNTest:test_register_fails_when_duplicate_identity_commitment() (gas: 129095)
RLNTest:test_register_fails_when_index_exceeds_set_size() (gas: 2565352)
RLNTest:test_register_succeeds() (gas: 267452)
RLNTest:test_slash_fails_when_invalid_proof() (gas: 193297)
RLNTest:test_slash_fails_when_not_registered() (gas: 65317)
RLNTest:test_slash_succeeds() (gas: 185761)
RemoveRewardDistributorTest:testAddKarmaDistributorOnlyAdmin() (gas: 438045)
RemoveRewardDistributorTest:testBalanceOf() (gas: 449366)
RemoveRewardDistributorTest:testBalanceOfWithNoSystemTotalKarma() (gas: 69633)
RemoveRewardDistributorTest:testMintOnlyAdmin() (gas: 428759)
RemoveRewardDistributorTest:testRemoveKarmaDistributorOnlyOwner() (gas: 162298)
RemoveRewardDistributorTest:testRemoveRewardDistributor() (gas: 162118)
RemoveRewardDistributorTest:testRemoveRewardDistributorAsOtherAdmin() (gas: 242200)
RemoveRewardDistributorTest:testRemoveUnknownKarmaDistributor() (gas: 41636)
RemoveRewardDistributorTest:testTotalSupply() (gas: 339239)
RemoveRewardDistributorTest:testTransfersNotAllowed() (gas: 40263)
RemoveRewardDistributorTest:testTotalSupply() (gas: 359239)
RemoveRewardDistributorTest:testTransfersNotAllowed() (gas: 61763)
RemoveRewardDistributorTest:test_RevertWhen_SenderIsNotDefaultAdmin() (gas: 66507)
SetRewardTest:testAddKarmaDistributorOnlyAdmin() (gas: 423077)
SetRewardTest:testBalanceOf() (gas: 431293)
SetRewardTest:testBalanceOfWithNoSystemTotalKarma() (gas: 49677)
SetRewardTest:testMintOnlyAdmin() (gas: 378791)
SetRewardTest:testRemoveKarmaDistributorOnlyOwner() (gas: 147241)
SetRewardTest:testAddKarmaDistributorOnlyAdmin() (gas: 438077)
SetRewardTest:testBalanceOf() (gas: 449293)
SetRewardTest:testBalanceOfWithNoSystemTotalKarma() (gas: 69677)
SetRewardTest:testMintOnlyAdmin() (gas: 428791)
SetRewardTest:testRemoveKarmaDistributorOnlyOwner() (gas: 162241)
SetRewardTest:testRemoveUnknownKarmaDistributor() (gas: 41630)
SetRewardTest:testSetRewardAsAdmin() (gas: 134934)
SetRewardTest:testSetRewardAsOperator() (gas: 126214)
SetRewardTest:testSetRewardAsOtherAdmin() (gas: 199420)
SetRewardTest:testTotalSupply() (gas: 339211)
SetRewardTest:testTransfersNotAllowed() (gas: 40307)
SetRewardTest:testSetRewardAsOperator() (gas: 143714)
SetRewardTest:testSetRewardAsOtherAdmin() (gas: 203920)
SetRewardTest:testTotalSupply() (gas: 359211)
SetRewardTest:testTransfersNotAllowed() (gas: 61807)
SetRewardTest:test_RevertWhen_SenderIsNotDefaultAdmin() (gas: 43559)
SetRewardTest:test_RevertWhen_SenderIsNotOperator() (gas: 53332)
StakeManager_RewardsTest:testRewardsBalanceOf() (gas: 1281535)
StakeManager_RewardsTest:testSetRewards() (gas: 227100)
SetRewardTest:test_RevertWhen_SenderIsNotOperator() (gas: 61832)
StakeManager_RewardsTest:testRewardsBalanceOf() (gas: 2712035)
StakeManager_RewardsTest:testSetRewards() (gas: 278100)
StakeManager_RewardsTest:testSetRewards_RevertsBadAmount() (gas: 63751)
StakeManager_RewardsTest:testSetRewards_RevertsBadDuration() (gas: 103509)
StakeManager_RewardsTest:testSetRewards_RevertsNotAuthorized() (gas: 39367)
StakeManager_RewardsTest:testTotalRewardsSupply() (gas: 746224)
StakeTest:test_StakeMultipleAccounts() (gas: 556308)
StakeTest:test_StakeMultipleAccountsAndRewards() (gas: 564800)
StakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 942461)
StakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 571074)
StakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 595232)
StakeTest:test_StakeMultipleTimesDoesNotExceedsMaxMP() (gas: 1528357)
StakeTest:test_StakeMultipleTimesWithLockIncreaseAtSameBlock() (gas: 581504)
StakeTest:test_StakeMultipleTimesWithLockZeroAfterMaxLock() (gas: 1124100)
StakeTest:test_StakeOneAccount() (gas: 316362)
StakeTest:test_StakeOneAccountAndRewards() (gas: 324917)
StakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 616802)
StakeTest:test_StakeOneAccountReachingMPLimit() (gas: 503792)
StakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 337583)
StakeTest:test_StakeOneAccountWithMinLockUp() (gas: 338223)
StakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 338268)
StakeVaultMigrationTest:testMigrateToVault() (gas: 885152)
StakeVaultMigrationTest:test_RevertWhenDestinationVaultIsNotRegistered() (gas: 162181)
StakeManager_RewardsTest:testTotalRewardsSupply() (gas: 1280724)
StakeTest:test_StakeMultipleAccounts() (gas: 666808)
StakeTest:test_StakeMultipleAccountsAndRewards() (gas: 721800)
StakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 1324461)
StakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 615074)
StakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 645732)
StakeTest:test_StakeMultipleTimesDoesNotExceedsMaxMP() (gas: 1780357)
StakeTest:test_StakeMultipleTimesWithLockIncreaseAtSameBlock() (gas: 691504)
StakeTest:test_StakeMultipleTimesWithLockZeroAfterMaxLock() (gas: 1191100)
StakeTest:test_StakeOneAccount() (gas: 390362)
StakeTest:test_StakeOneAccountAndRewards() (gas: 445417)
StakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 825302)
StakeTest:test_StakeOneAccountReachingMPLimit() (gas: 714792)
StakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 381583)
StakeTest:test_StakeOneAccountWithMinLockUp() (gas: 382223)
StakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 382268)
StakeVaultMigrationTest:testMigrateToVault() (gas: 1157152)
StakeVaultMigrationTest:test_RevertWhenDestinationVaultIsNotRegistered() (gas: 166681)
StakeVaultMigrationTest:test_RevertWhenMigrationVaultNotEmpty() (gas: 631911)
StakeVaultMigrationTest:test_RevertWhenNotOwnerOfMigrationVault() (gas: 70563)
StakeVaultTest:testOwner() (gas: 15331)
@@ -143,31 +153,31 @@ StakingTokenTest:testOwner() (gas: 15331)
StakingTokenTest:testStakeToken() (gas: 13156)
TrustedCodehashAccessTest:test_RevertWhenProxyCloneCodehashNotTrusted() (gas: 2021691)
UnstakeTest:test_RevertWhen_FundsLocked() (gas: 461737)
UnstakeTest:test_StakeMultipleAccounts() (gas: 556287)
UnstakeTest:test_StakeMultipleAccountsAndRewards() (gas: 564844)
UnstakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 942527)
UnstakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 571140)
UnstakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 595231)
UnstakeTest:test_StakeMultipleTimesDoesNotExceedsMaxMP() (gas: 1528413)
UnstakeTest:test_StakeMultipleTimesWithLockIncreaseAtSameBlock() (gas: 581459)
UnstakeTest:test_StakeMultipleTimesWithLockZeroAfterMaxLock() (gas: 1124111)
UnstakeTest:test_StakeOneAccount() (gas: 316384)
UnstakeTest:test_StakeOneAccountAndRewards() (gas: 324916)
UnstakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 616801)
UnstakeTest:test_StakeOneAccountReachingMPLimit() (gas: 503772)
UnstakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 337605)
UnstakeTest:test_StakeOneAccountWithMinLockUp() (gas: 338223)
UnstakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 338268)
UnstakeTest:test_UnstakeBonusMPAndAccuredMP() (gas: 581839)
UnstakeTest:test_UnstakeMultipleAccounts() (gas: 796850)
UnstakeTest:test_UnstakeMultipleAccountsAndRewards() (gas: 907371)
UnstakeTest:test_UnstakeOneAccount() (gas: 545178)
UnstakeTest:test_UnstakeOneAccountAndAccruedMP() (gas: 544489)
UnstakeTest:test_UnstakeOneAccountAndRewards() (gas: 468681)
UnstakeTest:test_UnstakeOneAccountWithLockUpAndAccruedMP() (gas: 570741)
UpdateVaultTest:test_UpdateAccount() (gas: 2397378)
UnstakeTest:test_StakeMultipleAccounts() (gas: 666787)
UnstakeTest:test_StakeMultipleAccountsAndRewards() (gas: 721844)
UnstakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 1324527)
UnstakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 615140)
UnstakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 645731)
UnstakeTest:test_StakeMultipleTimesDoesNotExceedsMaxMP() (gas: 1780413)
UnstakeTest:test_StakeMultipleTimesWithLockIncreaseAtSameBlock() (gas: 691459)
UnstakeTest:test_StakeMultipleTimesWithLockZeroAfterMaxLock() (gas: 1191111)
UnstakeTest:test_StakeOneAccount() (gas: 390384)
UnstakeTest:test_StakeOneAccountAndRewards() (gas: 445416)
UnstakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 825301)
UnstakeTest:test_StakeOneAccountReachingMPLimit() (gas: 714772)
UnstakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 381605)
UnstakeTest:test_StakeOneAccountWithMinLockUp() (gas: 382223)
UnstakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 382268)
UnstakeTest:test_UnstakeBonusMPAndAccuredMP() (gas: 754339)
UnstakeTest:test_UnstakeMultipleAccounts() (gas: 1037350)
UnstakeTest:test_UnstakeMultipleAccountsAndRewards() (gas: 1322871)
UnstakeTest:test_UnstakeOneAccount() (gas: 759178)
UnstakeTest:test_UnstakeOneAccountAndAccruedMP() (gas: 719489)
UnstakeTest:test_UnstakeOneAccountAndRewards() (gas: 673681)
UnstakeTest:test_UnstakeOneAccountWithLockUpAndAccruedMP() (gas: 722241)
UpdateVaultTest:test_UpdateAccount() (gas: 2587378)
UpgradeTest:test_RevertWhenNotOwner() (gas: 3696209)
UpgradeTest:test_UpgradeStakeManager() (gas: 9769347)
VaultRegistrationTest:test_VaultRegistration() (gas: 63138)
UpgradeTest:test_UpgradeStakeManager() (gas: 9855347)
VaultRegistrationTest:test_VaultRegistration() (gas: 90138)
WithdrawTest:testOwner() (gas: 15365)
WithdrawTest:test_CannotWithdrawStakedFunds() (gas: 348908)
WithdrawTest:test_CannotWithdrawStakedFunds() (gas: 373408)

View File

@@ -6,21 +6,22 @@ import { DeploymentConfig } from "./DeploymentConfig.s.sol";
import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import {Verifier} from "../src/rln/Verifier.sol";
import { Groth16Verifier } from "../src/rln/Verifier.sol";
import { KarmaRLN } from "../src/rln/KarmaRLN.sol";
contract DeployKarmaScript is BaseScript {
function run() public returns (Karma, DeploymentConfig) {
function run() public returns (KarmaRLN, DeploymentConfig) {
DeploymentConfig deploymentConfig = new DeploymentConfig(broadcaster);
(address deployer,) = deploymentConfig.activeNetworkConfig();
uint256 depth = vm.envUint("DEPTH");
address karmaAddress = vm.envAddress("KARMA_ADDRESS");
vm.startBroadcast(deployer);
Groth16Verifier verifier = new Groth16Verifier();
address verifier = (address)(new Groth16Verifier());
// Deploy Karma logic contract
bytes memory initializeData = abi.encodeCall(KarmaRLN.initialize, (deployer, deployer, deployer, verifier, depth, karmaAddress));
bytes memory initializeData =
abi.encodeCall(KarmaRLN.initialize, (deployer, deployer, deployer, depth, verifier, karmaAddress));
address impl = address(new KarmaRLN());
// Create upgradeable proxy
address proxy = address(new ERC1967Proxy(impl, initializeData));

View File

@@ -7,5 +7,8 @@ interface IVerifier {
uint256[2][2] calldata b,
uint256[2] calldata c,
uint256[2] calldata input
) external view returns (bool);
}
)
external
view
returns (bool);
}

View File

@@ -22,44 +22,73 @@ pragma solidity 0.8.26;
contract Groth16Verifier {
// Scalar field size
uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
uint256 constant r =
21_888_242_871_839_275_222_246_405_745_257_275_088_548_364_400_416_034_343_698_204_186_575_808_495_617;
// Base field size
uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
uint256 constant q =
21_888_242_871_839_275_222_246_405_745_257_275_088_696_311_157_297_823_662_689_037_894_645_226_208_583;
// Verification Key data
uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;
uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;
uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;
uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;
uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;
uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;
uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;
uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;
uint256 constant deltax1 = 11551021181461167826461759140322976337427023987127500996455457136635486400849;
uint256 constant deltax2 = 16440331697014556916876897072677669680121386347171004539353252116876383229648;
uint256 constant deltay1 = 16935666883311644237478257793713075046951222500094443222621864730929684383196;
uint256 constant deltay2 = 15542122065551809636611024015159689732218122471819623718488423844152861811271;
uint256 constant alphax =
20_491_192_805_390_485_299_153_009_773_594_534_940_189_261_866_228_447_918_068_658_471_970_481_763_042;
uint256 constant alphay =
9_383_485_363_053_290_200_918_347_156_157_836_566_562_967_994_039_712_273_449_902_621_266_178_545_958;
uint256 constant betax1 =
4_252_822_878_758_300_859_123_897_981_450_591_353_533_073_413_197_771_768_651_442_665_752_259_397_132;
uint256 constant betax2 =
6_375_614_351_688_725_206_403_948_262_868_962_793_625_744_043_794_305_715_222_011_528_459_656_738_731;
uint256 constant betay1 =
21_847_035_105_528_745_403_288_232_691_147_584_728_191_162_732_299_865_338_377_159_692_350_059_136_679;
uint256 constant betay2 =
10_505_242_626_370_262_277_552_901_082_094_356_697_409_835_680_220_590_971_873_171_140_371_331_206_856;
uint256 constant gammax1 =
11_559_732_032_986_387_107_991_004_021_392_285_783_925_812_861_821_192_530_917_403_151_452_391_805_634;
uint256 constant gammax2 =
10_857_046_999_023_057_135_944_570_762_232_829_481_370_756_359_578_518_086_990_519_993_285_655_852_781;
uint256 constant gammay1 =
4_082_367_875_863_433_681_332_203_403_145_435_568_316_851_327_593_401_208_105_741_076_214_120_093_531;
uint256 constant gammay2 =
8_495_653_923_123_431_417_604_973_247_489_272_438_418_190_587_263_600_148_770_280_649_306_958_101_930;
uint256 constant deltax1 =
11_551_021_181_461_167_826_461_759_140_322_976_337_427_023_987_127_500_996_455_457_136_635_486_400_849;
uint256 constant deltax2 =
16_440_331_697_014_556_916_876_897_072_677_669_680_121_386_347_171_004_539_353_252_116_876_383_229_648;
uint256 constant deltay1 =
16_935_666_883_311_644_237_478_257_793_713_075_046_951_222_500_094_443_222_621_864_730_929_684_383_196;
uint256 constant deltay2 =
15_542_122_065_551_809_636_611_024_015_159_689_732_218_122_471_819_623_718_488_423_844_152_861_811_271;
uint256 constant IC0x =
19_490_069_286_251_317_200_471_893_224_761_952_280_235_157_078_692_599_655_063_040_494_106_083_015_102;
uint256 constant IC0y =
15_613_730_057_977_833_735_664_106_983_317_680_013_118_142_165_231_654_768_046_521_650_638_333_652_991;
uint256 constant IC1x =
1_563_543_155_852_853_229_359_605_494_188_815_884_199_915_022_658_219_002_707_722_789_976_065_966_419;
uint256 constant IC1y =
858_819_375_930_654_753_672_617_171_465_307_097_688_802_650_498_051_619_587_167_586_479_724_200_799;
uint256 constant IC2x =
3_808_889_614_445_935_800_597_561_392_085_733_302_718_838_702_771_107_544_944_545_050_886_958_022_904;
uint256 constant IC2y =
13_293_649_293_049_947_010_793_838_294_353_767_499_934_999_769_633_605_908_974_566_715_226_392_122_400;
uint256 constant IC0x = 19490069286251317200471893224761952280235157078692599655063040494106083015102;
uint256 constant IC0y = 15613730057977833735664106983317680013118142165231654768046521650638333652991;
uint256 constant IC1x = 1563543155852853229359605494188815884199915022658219002707722789976065966419;
uint256 constant IC1y = 858819375930654753672617171465307097688802650498051619587167586479724200799;
uint256 constant IC2x = 3808889614445935800597561392085733302718838702771107544944545050886958022904;
uint256 constant IC2y = 13293649293049947010793838294353767499934999769633605908974566715226392122400;
// Memory data
uint16 constant pVk = 0;
uint16 constant pPairing = 128;
uint16 constant pLastMem = 896;
function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[2] calldata _pubSignals) public view returns (bool) {
function verifyProof(
uint256[2] calldata _pA,
uint256[2][2] calldata _pB,
uint256[2] calldata _pC,
uint256[2] calldata _pubSignals
)
public
view
returns (bool)
{
assembly {
function checkField(v) {
if iszero(lt(v, q)) {
@@ -67,7 +96,7 @@ contract Groth16Verifier {
return(0, 0x20)
}
}
// G1 function to multiply a G1 value(x,y) to value in an address
function g1_mulAccC(pR, x, y, s) {
let success
@@ -102,11 +131,10 @@ contract Groth16Verifier {
mstore(add(_pVk, 32), IC0y)
// Compute the linear combination vk_x
g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))
g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))
// -A
mstore(_pPairing, calldataload(pA))
@@ -132,7 +160,6 @@ contract Groth16Verifier {
mstore(add(_pPairing, 384), mload(add(pMem, pVk)))
mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))
// gamma2
mstore(add(_pPairing, 448), gammax1)
mstore(add(_pPairing, 480), gammax2)
@@ -149,7 +176,6 @@ contract Groth16Verifier {
mstore(add(_pPairing, 704), deltay1)
mstore(add(_pPairing, 736), deltay2)
let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)
isOk := and(success, mload(_pPairing))
@@ -159,19 +185,18 @@ contract Groth16Verifier {
mstore(0x40, add(pMem, pLastMem))
// Validate that all evaluations ∈ F
checkField(calldataload(add(_pubSignals, 0)))
checkField(calldataload(add(_pubSignals, 32)))
checkField(calldataload(add(_pubSignals, 64)))
// Validate all evaluations
let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)
mstore(0, isValid)
return(0, 0x20)
}
}
}
return(0, 0x20)
}
}
}

View File

@@ -1,15 +1,13 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
pragma solidity ^0.8.26;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "forge-std/Test.sol";
import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import "../src/rln/KarmaRLN.sol";
import { IVerifier } from "../src/rln/IVerifier.sol";
// A mock verifier which makes us skip the proof verification.
/// @dev A mock verifier that allows toggling proof validity.
contract MockVerifier is IVerifier {
bool public result;
@@ -25,6 +23,7 @@ contract MockVerifier is IVerifier {
)
external
view
override
returns (bool)
{
return result;
@@ -36,199 +35,244 @@ contract MockVerifier is IVerifier {
}
contract RLNTest is Test {
event MemberRegistered(uint256 identityCommitment, uint256 messageLimit, uint256 index);
event MemberWithdrawn(uint256 index);
event MemberSlashed(uint256 index, address slasher);
KarmaRLN public rln;
MockVerifier public verifier;
Karma token;
KarmaRLN rln;
MockVerifier verifier;
uint256 private constant DEPTH = 2; // for most tests
uint256 private constant SMALL_DEPTH = 1; // for “full” test
uint256 depth = 20;
uint256 identityCommitment0 = 1234;
uint256 identityCommitment1 = 5678;
// Sample identity commitments
uint256 private identityCommitment0 = 1234;
uint256 private identityCommitment1 = 5678;
uint256 private identityCommitment2 = 9999;
address adminAddr = makeAddr("admin");
address registerAddr = makeAddr("register");
address slasherAddr = makeAddr("slasher");
address user0 = makeAddr("user0");
address user1 = makeAddr("user1");
uint256 messageLimit0 = 2;
uint256 messageLimit1 = 3;
uint256[8] mockProof =
// Sample SNARK proof (8element array)
uint256[8] private mockProof =
[uint256(0), uint256(1), uint256(2), uint256(3), uint256(4), uint256(5), uint256(6), uint256(7)];
function deployRLN(uint256 _depth) public returns (KarmaRLN) {
// Deploy KarmaRLN contract
bytes memory initializeData = abi.encodeCall(KarmaRLN.initialize, (adminAddr, registerAddr, slasherAddr, _depth, address(verifier), address(token)));
// Roleholders
address private adminAddr;
address private registerAddr;
address private slasherAddr;
function setUp() public {
// Assign deterministic addresses
adminAddr = makeAddr("admin");
registerAddr = makeAddr("register");
slasherAddr = makeAddr("slasher");
// Deploy mock verifier
verifier = new MockVerifier();
// Deploy KarmaRLN via UUPS proxy with DEPTH = 2
rln = _deployRLN(DEPTH, address(verifier));
// Sanitycheck that roles were assigned correctly
assertTrue(rln.hasRole(rln.DEFAULT_ADMIN_ROLE(), adminAddr));
assertTrue(rln.hasRole(rln.REGISTER_ROLE(), registerAddr));
assertTrue(rln.hasRole(rln.SLASHER_ROLE(), slasherAddr));
}
/// @dev Deploys a new KarmaRLN instance (behind ERC1967Proxy).
function _deployRLN(uint256 depth, address verifierAddr) internal returns (KarmaRLN) {
bytes memory initData = abi.encodeCall(
KarmaRLN.initialize,
(
adminAddr,
slasherAddr,
registerAddr,
depth,
verifierAddr,
address(0) // token address unused in these tests
)
);
address impl = address(new KarmaRLN());
// Create upgradeable proxy
address proxy = address(new ERC1967Proxy(impl, initializeData));
address proxy = address(new ERC1967Proxy(impl, initData));
return KarmaRLN(proxy);
}
function deployKarmaToken() public returns (Karma) {
// Deploy Karma logic contract
bytes memory initializeData = abi.encodeCall(Karma.initialize, (adminAddr));
address impl = address(new Karma());
// Create upgradeable proxy
address proxy = address(new ERC1967Proxy(impl, initializeData));
return (Karma(proxy));
}
function setUp() public {
verifier = new MockVerifier();
token = deployKarmaToken();
rln = deployRLN();
}
/* ---------- INITIAL STATE ---------- */
function test_initial_state() public {
assertEq(rln.SET_SIZE(), 1 << depth);
assertEq(address(rln.karma()), address(token));
assertEq(address(rln.verifier()), address(verifier));
// SET_SIZE should be 2^DEPTH = 4
assertEq(rln.SET_SIZE(), uint256(1) << DEPTH);
// No identities registered yet
assertEq(rln.identityCommitmentIndex(), 0);
// members(...) should return (address(0), 0) for any commitment
(address user0, uint256 idx0) = _memberData(identityCommitment0);
assertEq(user0, address(0));
assertEq(idx0, 0);
// Verifier address matches
assertEq(address(rln.verifier()), address(verifier));
}
/* register */
/* ---------- REGISTER ---------- */
function test_register_succeeds() public {
// Test: register one user
register(user0, identityCommitment0, messageLimit0);
// Test: register second user
register(user1, identityCommitment1, messageLimit1);
// Register first identity
uint256 indexBefore = rln.identityCommitmentIndex();
vm.startPrank(registerAddr);
vm.expectEmit(true, false, false, true);
emit KarmaRLN.MemberRegistered(identityCommitment0, indexBefore);
rln.register(identityCommitment0);
vm.stopPrank();
assertEq(rln.identityCommitmentIndex(), indexBefore + 1);
(address u0, uint256 i0) = _memberData(identityCommitment0);
assertEq(u0, registerAddr);
assertEq(i0, indexBefore);
// Register second identity
indexBefore = rln.identityCommitmentIndex();
vm.startPrank(registerAddr);
vm.expectEmit(true, false, false, true);
emit KarmaRLN.MemberRegistered(identityCommitment1, indexBefore);
rln.register(identityCommitment1);
vm.stopPrank();
assertEq(rln.identityCommitmentIndex(), indexBefore + 1);
(address u1, uint256 i1) = _memberData(identityCommitment1);
assertEq(u1, registerAddr);
assertEq(i1, indexBefore);
}
function test_register_fails_when_index_exceeds_set_size() public {
// Set size is (1 << smallDepth) = 2, and thus there can
// only be 2 members, otherwise reverts.
uint256 smallDepth = 1;
KarmaRLN smallRLN = deployRLN(smallDepth);
// Deploy a small RLN with depth = 1 => SET_SIZE = 2
KarmaRLN smallRLN = _deployRLN(SMALL_DEPTH, address(verifier));
address smallRegister = registerAddr;
// Register the first user
vm.startPrank(registerAddr);
smallRLN.register(identityCommitment0, minimalDeposit);
smallRLN.register(identityCommitment1, minimalDeposit);
// Fill up both slots
vm.startPrank(smallRegister);
smallRLN.register(identityCommitment0);
smallRLN.register(identityCommitment1);
vm.stopPrank();
// Now tree (set) is full. Try register the third. It should revert.
uint256 identityCommitment2 = 9999;
// `register` should revert
vm.expectRevert("KarmaRLN, register: set is full");
smallRLN.register(identityCommitment2, minimalDeposit);
// Now the set is full (2 members). Attempt a third registration.
vm.startPrank(smallRegister);
vm.expectRevert(bytes("RLN, register: set is full"));
smallRLN.register(identityCommitment2);
vm.stopPrank();
}
function test_register_fails_when_duplicate_identity_commitments() public {
// Register first with user0 with identityCommitment0
register(user0, identityCommitment0);
// Register again with user1 with identityCommitment0
function test_register_fails_when_duplicate_identity_commitment() public {
// Register once
vm.startPrank(registerAddr);
// `register` should revert
vm.expectRevert("KarmaRLN, register: idCommitment already registered");
rln.register(identityCommitment0, rlnInitialTokenBalance);
rln.register(identityCommitment0);
vm.stopPrank();
// Attempt to register the same commitment again
vm.startPrank(registerAddr);
vm.expectRevert(bytes("RLN, register: idCommitment already registered"));
rln.register(identityCommitment0);
vm.stopPrank();
}
/* ---------- EXIT ---------- */
function test_exit_succeeds() public {
// Register first
register(user0, identityCommitment0);
// Withdraw user0
// Make sure proof verification is skipped
assertEq(verifier.result(), true);
rln.withdraw(identityCommitment0, mockProof);
rln.exit(identityCommitment0);
// Register the identity
vm.startPrank(registerAddr);
rln.register(identityCommitment0);
vm.stopPrank();
checkUserIsDeleted(identityCommitment0);
// Ensure mock verifier returns true by default
assertTrue(verifier.result());
// Call exit with a valid proof
vm.startPrank(registerAddr);
vm.expectEmit(false, false, false, true);
emit KarmaRLN.MemberExited(0);
rln.exit(identityCommitment0, mockProof);
vm.stopPrank();
// After exit, the member record should be cleared
(address u0, uint256 i0) = _memberData(identityCommitment0);
assertEq(u0, address(0));
assertEq(i0, 0);
}
/* slash */
function test_exit_fails_when_not_registered() public {
// Attempt exit without prior registration
vm.startPrank(registerAddr);
vm.expectRevert(bytes("RLN, withdraw: member doesn't exist"));
rln.exit(identityCommitment1, mockProof);
vm.stopPrank();
}
function test_exit_fails_when_invalid_proof() public {
// Register the identity
vm.startPrank(registerAddr);
rln.register(identityCommitment0);
vm.stopPrank();
// Make proof invalid
verifier.changeResult(false);
assertFalse(verifier.result());
// Attempt exit with invalid proof
vm.startPrank(registerAddr);
vm.expectRevert(bytes("RLN, withdraw: invalid proof"));
rln.exit(identityCommitment0, mockProof);
vm.stopPrank();
}
/* ---------- SLASH ---------- */
function test_slash_succeeds() public {
// Test: register and get slashed
register(user0, identityCommitment0, messageLimit0);
(,, uint256 index) = rln.members(identityCommitment0);
vm.startPrank(slasherAddr);
vm.expectEmit(true, true, false, true);
emit MemberSlashed(index, slashedReceiver);
// Slash and check balances
rln.slash(identityCommitment0, mockProof);
// Check the record of user0 has been deleted
// Register the identity first
vm.startPrank(registerAddr);
rln.register(identityCommitment1);
vm.stopPrank();
checkUserIsDeleted(identityCommitment0);
// Test: register, withdraw, ang get slashed before release
register(user1, identityCommitment1, messageLimit1);
// Retrieve the assigned index
(, uint256 index1) = _memberData(identityCommitment1);
// Slash with a valid proof
vm.startPrank(slasherAddr);
rln.slash(identityCommitment1, slashedReceiver, mockProof);
vm.expectEmit(false, true, false, true);
emit KarmaRLN.MemberSlashed(index1, slasherAddr);
rln.slash(identityCommitment1, mockProof);
vm.stopPrank();
// Check the record of user1 has been deleted
checkUserIsDeleted(identityCommitment1);
// After slash, the member record should be cleared
(address u1, uint256 i1) = _memberData(identityCommitment1);
assertEq(u1, address(0));
assertEq(i1, 0);
}
function test_slash_fails_when_not_registered() public {
// It fails if the user is not registered yet
// Attempt to slash a nonexistent identity
vm.startPrank(slasherAddr);
vm.expectRevert("KarmaRLN, slash: member doesn't exist");
rln.slash(identityCommitment0, slashedReceiver, mockProof);
vm.expectRevert(bytes("RLN, slash: member doesn't exist"));
rln.slash(identityCommitment0, mockProof);
vm.stopPrank();
}
function test_slash_fails_when_invalid_proof() public {
// It fails if the proof is invalid
// Register first
register(user0, identityCommitment0);
// Make sure mock verifier always return false
// And thus the proof is always considered invalid
// Register the identity
vm.startPrank(registerAddr);
rln.register(identityCommitment0);
vm.stopPrank();
// Make proof invalid
verifier.changeResult(false);
assertEq(verifier.result(), false);
vm.expectRevert("KarmaRLN, slash: invalid proof");
// Slash fails because of the invalid proof
assertFalse(verifier.result());
// Attempt to slash with invalid proof
vm.startPrank(slasherAddr);
vm.expectRevert(bytes("RLN, slash: invalid proof"));
rln.slash(identityCommitment0, mockProof);
vm.stopPrank();
}
/* Helpers */
function getRegisterAmount(uint256 messageLimit) public view returns (uint256) {
return messageLimit * minimalDeposit;
/* ========== HELPERS ========== */
/// @dev Returns (userAddress, index) for a given identityCommitment.
function _memberData(uint256 commitment) internal view returns (address userAddress, uint256 index) {
(userAddress, index) = rln.members(commitment);
return (userAddress, index);
}
function register(address user, uint256 identityCommitment, uint256 messageLimit) public {
// Mint to user first
uint256 identityCommitmentIndexBefore = rln.identityCommitmentIndex();
// User approves to rln and calls register
vm.startPrank(registerAddr);
// Ensure event is emitted
vm.expectEmit(true, true, false, true);
emit MemberRegistered(identityCommitment, identityCommitmentIndexBefore);
rln.register(identityCommitment);
vm.stopPrank();
// KarmaRLN state
assertEq(rln.identityCommitmentIndex(), identityCommitmentIndexBefore + 1);
// User state
(address userAddress, uint256 index) = rln.members(identityCommitment);
assertEq(userAddress, user);
assertEq(index, identityCommitmentIndexBefore);
}
function checkUserIsDeleted(uint256 identityCommitment) public {
(address userAddress, uint256 index) = rln.members(identityCommitment);
assertEq(userAddress, address(0));
assertEq(index, 0);
}
}