packages feed

hevm-0.51.0: test/contracts/pass/dsProvePass.sol

import "ds-test/test.sol";
import "tokens/erc20.sol";

contract ConstructorArg {
    address immutable public a;
    constructor(address _a) public {
        a = _a;
    }
}

contract SolidityTest is DSTest {
    ERC20 token;

    function setUp() public {
        token = new ERC20("Token", "TKN", 18);
    }

    function prove_trivial() public {
        assertTrue(true);
    }

    function prove_easy(uint v) public {
        if (v != 100) return;
        assertEq(v, 100);
    }

    function prove_add(uint x, uint y) public {
        unchecked {
            if (x + y < x) return; // no overflow
            assertTrue(x + y >= x);
        }
    }

    function prove_balance(address usr, uint amt) public {
        assertEq(0, token.balanceOf(usr));
        token.mint(usr, amt);
        assertEq(amt, token.balanceOf(usr));
    }

    function prove_supply(uint supply) public {
        token.mint(address(this), supply);
        uint actual = token.totalSupply();
        assertEq(supply, actual);
    }

    function prove_constructorArgs(address b) public {
        ConstructorArg c = new ConstructorArg(b);
        assertEq(b, c.a());
    }

    function proveFail_revertSmoke() public {
        require(false);
    }

    function proveFail_assertSmoke() public {
        assertTrue(false);
    }

    function prove_transfer(uint supply, address usr, uint amt) public {
        if (amt > supply) return; // no underflow

        token.mint(address(this), supply);

        uint prebal = token.balanceOf(usr);
        token.transfer(usr, amt);
        uint postbal = token.balanceOf(usr);

        uint expected = usr == address(this)
                        ? 0    // self transfer is a noop
                        : amt; // otherwise `amt` has been transfered to `usr`
        assertEq(expected, postbal - prebal);
    }

    function prove_burn(uint supply, uint amt) public {
        if (amt > supply) return; // no undeflow

        token.mint(address(this), supply);
        token.burn(address(this), amt);

        assertEq(supply - amt, token.totalSupply());
    }
}