Skip to content

Commit

Permalink
refactor: genelarize amount to balance of sender
Browse files Browse the repository at this point in the history
  • Loading branch information
colin-morpho committed Feb 4, 2025
1 parent 01aca82 commit 0874bf3
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 13 deletions.
18 changes: 9 additions & 9 deletions certora/specs/Delegation.spec
Original file line number Diff line number Diff line change
Expand Up @@ -216,34 +216,34 @@ rule delegatingWithSigUpdatesVotingPower(env e, DelegationToken.Delegation deleg
}

// Check that the updated voting power of a delegatee after a transfer is lesser than or equal to the total supply of tokens.
rule updatedDelegatedVPLTEqTotalSupply(address from, address to, uint256 amount) {
require from != 0;

rule updatedDelegatedVPLTEqTotalSupply(address from, address to) {
uint256 balanceOfFromBefore = balanceOf(from);
uint256 delegatedVotingPowerDelegateeToBefore = delegatedVotingPower(delegatee(to));
uint256 totalSupplyBefore = totalSupply();
env e;

require e.msg.value == 0;
require e.msg.sender == from;

require amount <= balanceOf(from);
require from != 0;
require delegatee(to) != delegatee(from);

requireInvariant sumOfTwoDelegatedVPLTEqTotalVP();
assert isTotalSupplyGTEqSumOfVotingPower();

// This require avoids an impossible revert as zeroVirtualVotingPower operations comme from munging.
require delegatee(from) == 0 => currentContract._zeroVirtualVotingPower >= balanceOf(from);
require delegatee(from) == 0 => currentContract._zeroVirtualVotingPower >= balanceOfFromBefore;

uint256 delegatedVotingPowerDelegateeToBefore = delegatedVotingPower(delegatee(to));
uint256 totalSupplyBefore = totalSupply();

// This invariant can't be required as it's using a parameterized variable.
// But it is proven by delegatedLTEqDelegateeVP.
require delegatee(from) != 0 => delegatedVotingPower(delegatee(from)) >= balanceOf(from);
require delegatee(from) != 0 => delegatedVotingPower(delegatee(from)) >= balanceOfFromBefore;

delegate@withrevert(e, from);

assert(!lastReverted);

assert delegatee(from) == from;

assert delegatedVotingPowerDelegateeToBefore + amount <= totalSupplyBefore;
assert delegatedVotingPowerDelegateeToBefore + balanceOfFromBefore <= totalSupplyBefore;
}
6 changes: 2 additions & 4 deletions certora/specs/RevertsERC20.spec
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ rule transferRevertConditions(env e, address to, uint256 amount) {
// Safe require as it proven in rule updatedDelegatedVPLTEqTotalSupply.
require
e.msg.sender != 0 =>
amount <= balanceOfSenderBefore =>
delegatee(to) != delegatee(e.msg.sender) => recipientVotingPowerBefore + amount <= totalSupply();
delegatee(to) != delegatee(e.msg.sender) => recipientVotingPowerBefore + balanceOfSenderBefore <= totalSupply();

transfer@withrevert(e, to, amount);
assert lastReverted <=> e.msg.sender == 0 || to == 0 || balanceOfSenderBefore < amount || e.msg.value != 0;
Expand All @@ -44,8 +43,7 @@ rule transferFromRevertConditions(env e, address from, address to, uint256 amoun
// Safe require as it proven in rule updatedDelegatedVPLTEqTotalSupply.
require
from != 0 =>
amount <= balanceOfHolderBefore =>
delegatee(to) != delegatee(from) => recipientVotingPowerBefore + amount <= totalSupply();
delegatee(to) != delegatee(from) => recipientVotingPowerBefore + balanceOfHolderBefore <= totalSupply();

transferFrom@withrevert(e, from, to, amount);

Expand Down

0 comments on commit 0874bf3

Please sign in to comment.