Browse Source

Added rule sequentialBurnsEquivalentToSingleBurnOfSum (passing)

Thomas Adams 3 years ago
parent
commit
f74e316422
1 changed files with 35 additions and 5 deletions
  1. 35 5
      certora/specs/ERC1155Burnable.spec

+ 35 - 5
certora/specs/ERC1155Burnable.spec

@@ -25,24 +25,54 @@ rule burnAmountProportionalToBalanceReduction {
     env e;
     env e;
     
     
     address holder; uint256 token;
     address holder; uint256 token;
-    mathint startingBalance = balanceOf(holder, token); // 10
-    uint256 smallBurn; uint256 largeBurn; // 4, 7
+    mathint startingBalance = balanceOf(holder, token);
+    uint256 smallBurn; uint256 largeBurn;
     require smallBurn < largeBurn;
     require smallBurn < largeBurn;
 
 
     // smaller burn amount
     // smaller burn amount
     burn(e, holder, token, smallBurn) at beforeBurn;
     burn(e, holder, token, smallBurn) at beforeBurn;
-    mathint smallBurnBalanceChange = startingBalance - balanceOf(holder, token); // 4
+    mathint smallBurnBalanceChange = startingBalance - balanceOf(holder, token);
 
 
     // larger burn amount
     // larger burn amount
     burn(e, holder, token, largeBurn) at beforeBurn;
     burn(e, holder, token, largeBurn) at beforeBurn;
-    mathint largeBurnBalanceChange = startingBalance - balanceOf(holder, token); // 7
+    mathint largeBurnBalanceChange = startingBalance - balanceOf(holder, token);
 
 
     assert smallBurnBalanceChange < largeBurnBalanceChange, 
     assert smallBurnBalanceChange < largeBurnBalanceChange, 
         "A larger burn must lead to a larger decrease in balance";
         "A larger burn must lead to a larger decrease in balance";
 }
 }
 
 
 /// Unimplemented rule to verify monotonicity of burnBatch.
 /// Unimplemented rule to verify monotonicity of burnBatch.
-rule burnBatchAmountProportionalToBalanceReduction {
+rule burnBatchAmountProportionalToBalanceReduction { // TODO implement rule or remove
+    assert true, 
+        "just a placeholder that should never show up";
+}
+
+/// Two sequential burns must be equivalent to a single burn of the sum of their
+/// amounts.
+rule sequentialBurnsEquivalentToSingleBurnOfSum {
+    storage beforeBurns = lastStorage;
+    env e;
+
+    address holder; uint256 token;
+    mathint startingBalance = balanceOf(holder, token);
+    uint256 firstBurn; uint256 secondBurn; uint256 sumBurn;
+    require sumBurn == firstBurn + secondBurn;
+
+    // sequential burns
+    burn(e, holder, token, firstBurn) at beforeBurns;
+    burn(e, holder, token, secondBurn);
+    mathint sequentialBurnsBalanceChange = startingBalance - balanceOf(holder, token);
+
+    // burn of sum of sequential burns
+    burn(e, holder, token, sumBurn) at beforeBurns;
+    mathint sumBurnBalanceChange = startingBalance - balanceOf(holder, token);
+
+    assert sequentialBurnsBalanceChange == sumBurnBalanceChange, 
+        "Sequential burns must be equivalent to a burn of their sum";
+}
+
+/// Unimplemented rule to verify additivty of burnBatch.
+rule sequentialBatchBurnsEquivalentToSingleBurnBatchOfSum { // TODO implement rule or remove
     assert true, 
     assert true, 
         "just a placeholder that should never show up";
         "just a placeholder that should never show up";
 }
 }