Skip to content

Commit

Permalink
Add bugs and Makefile
Browse files Browse the repository at this point in the history
  • Loading branch information
horsefacts committed Feb 8, 2023
1 parent 01044bd commit 872eddc
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 39 deletions.
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
check:
git apply "bugs/$(bug).patch" && forge test

clean:
git checkout src/WETH9.sol
13 changes: 13 additions & 0 deletions bugs/bug1.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
diff --git a/src/WETH9.sol b/src/WETH9.sol
index cd55b98..ccb40cb 100644
--- a/src/WETH9.sol
+++ b/src/WETH9.sol
@@ -33,7 +33,7 @@ contract WETH9 {
}

function deposit() public payable {
- balanceOf[msg.sender] += msg.value;
+ balanceOf[msg.sender] += 1;
emit Deposit(msg.sender, msg.value);
}

13 changes: 13 additions & 0 deletions bugs/bug2.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
diff --git a/src/WETH9.sol b/src/WETH9.sol
index cd55b98..961f03b 100644
--- a/src/WETH9.sol
+++ b/src/WETH9.sol
@@ -40,7 +40,7 @@ contract WETH9 {
function withdraw(uint256 wad) public {
require(balanceOf[msg.sender] >= wad);
balanceOf[msg.sender] -= wad;
- payable(msg.sender).transfer(wad);
+ payable(msg.sender).transfer(1);
emit Withdrawal(msg.sender, wad);
}

12 changes: 12 additions & 0 deletions bugs/bug3.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
diff --git a/src/WETH9.sol b/src/WETH9.sol
index cd55b98..6e74bd5 100644
--- a/src/WETH9.sol
+++ b/src/WETH9.sol
@@ -29,7 +29,6 @@ contract WETH9 {
mapping(address => mapping(address => uint256)) public allowance;

fallback() external payable {
- deposit();
}

function deposit() public payable {
22 changes: 22 additions & 0 deletions bugs/bug4.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
diff --git a/src/WETH9.sol b/src/WETH9.sol
index cd55b98..26cec99 100644
--- a/src/WETH9.sol
+++ b/src/WETH9.sol
@@ -59,15 +59,8 @@ contract WETH9 {
}

function transferFrom(address src, address dst, uint256 wad) public returns (bool) {
- require(balanceOf[src] >= wad);
-
- if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) {
- require(allowance[src][msg.sender] >= wad);
- allowance[src][msg.sender] -= wad;
- }
-
- balanceOf[src] -= wad;
- balanceOf[dst] += wad;
+ balanceOf[src] -= wad;
+ balanceOf[dst] += 1;

emit Transfer(src, dst, wad);

41 changes: 2 additions & 39 deletions test/handlers/Handler.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,47 +2,10 @@
pragma solidity ^0.8.13;

import {Test} from "forge-std/Test.sol";
import {AddressSet, LibAddressSet} from "../helpers/AddressSet.sol";
import {WETH9} from "../../src/WETH9.sol";

uint256 constant ETH_SUPPLY = 120_500_000;

struct AddressSet {
address[] addrs;
mapping(address => bool) saved;
}

library LibAddressSet {
function add(AddressSet storage s, address addr) internal {
if (!s.saved[addr]) {
s.addrs.push(addr);
s.saved[addr] = true;
}
}

function contains(AddressSet storage s, address addr) internal view returns (bool) {
return s.saved[addr];
}

function count(AddressSet storage s) internal view returns (uint256) {
return s.addrs.length;
}

function forEach(AddressSet storage s, function(address) external func) internal {
for (uint256 i; i < s.addrs.length; ++i) {
func(s.addrs[i]);
}
}

function reduce(AddressSet storage s, uint256 acc, function(uint256,address) external returns (uint256) func)
internal
returns (uint256)
{
for (uint256 i; i < s.addrs.length; ++i) {
acc = func(acc, s.addrs[i]);
}
return acc;
}
}
uint256 constant ETH_SUPPLY = 120_500_000 ether;

contract Handler is Test {
using LibAddressSet for AddressSet;
Expand Down
40 changes: 40 additions & 0 deletions test/helpers/AddressSet.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

struct AddressSet {
address[] addrs;
mapping(address => bool) saved;
}

library LibAddressSet {
function add(AddressSet storage s, address addr) internal {
if (!s.saved[addr]) {
s.addrs.push(addr);
s.saved[addr] = true;
}
}

function contains(AddressSet storage s, address addr) internal view returns (bool) {
return s.saved[addr];
}

function count(AddressSet storage s) internal view returns (uint256) {
return s.addrs.length;
}

function forEach(AddressSet storage s, function(address) external func) internal {
for (uint256 i; i < s.addrs.length; ++i) {
func(s.addrs[i]);
}
}

function reduce(AddressSet storage s, uint256 acc, function(uint256,address) external returns (uint256) func)
internal
returns (uint256)
{
for (uint256 i; i < s.addrs.length; ++i) {
acc = func(acc, s.addrs[i]);
}
return acc;
}
}

0 comments on commit 872eddc

Please sign in to comment.