Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[submodule "lib/forge-std"]
path = lib/forge-std
url = https://github.com/bowd/forge-std
url = https://github.com/foundry-rs/forge-std
2 changes: 1 addition & 1 deletion lib/forge-std
Submodule forge-std updated 63 files
+1 −0 .gitattributes
+134 −0 .github/workflows/ci.yml
+29 −0 .github/workflows/sync.yml
+0 −26 .github/workflows/tests.yml
+1 −1 .gitignore
+0 −3 .gitmodules
+1 −1 LICENSE-APACHE
+1 −1 LICENSE-MIT
+9 −5 README.md
+21 −0 foundry.toml
+0 −1 lib/ds-test
+16 −0 package.json
+635 −0 scripts/vm.py
+35 −0 src/Base.sol
+21 −33 src/Script.sol
+669 −0 src/StdAssertions.sol
+250 −0 src/StdChains.sol
+817 −0 src/StdCheats.sol
+15 −0 src/StdError.sol
+107 −0 src/StdInvariant.sol
+28 −28 src/StdJson.sol
+43 −0 src/StdMath.sol
+473 −0 src/StdStorage.sol
+333 −0 src/StdStyle.sol
+179 −0 src/StdToml.sol
+226 −0 src/StdUtils.sol
+31 −765 src/Test.sol
+1,620 −286 src/Vm.sol
+406 −386 src/console2.sol
+105 −0 src/interfaces/IERC1155.sol
+12 −0 src/interfaces/IERC165.sol
+43 −0 src/interfaces/IERC20.sol
+190 −0 src/interfaces/IERC4626.sol
+164 −0 src/interfaces/IERC721.sol
+73 −0 src/interfaces/IMulticall3.sol
+234 −0 src/mocks/MockERC20.sol
+235 −0 src/mocks/MockERC721.sol
+13,248 −0 src/safeconsole.sol
+0 −12 src/test/Script.t.sol
+0 −599 src/test/StdAssertions.t.sol
+0 −213 src/test/StdCheats.t.sol
+0 −200 src/test/StdMath.t.sol
+0 −321 src/test/StdStorage.t.sol
+145 −0 test/StdAssertions.t.sol
+221 −0 test/StdChains.t.sol
+618 −0 test/StdCheats.t.sol
+14 −18 test/StdError.t.sol
+49 −0 test/StdJson.t.sol
+212 −0 test/StdMath.t.sol
+463 −0 test/StdStorage.t.sol
+110 −0 test/StdStyle.t.sol
+49 −0 test/StdToml.t.sol
+342 −0 test/StdUtils.t.sol
+15 −0 test/Vm.t.sol
+10 −0 test/compilation/CompilationScript.sol
+10 −0 test/compilation/CompilationScriptBase.sol
+10 −0 test/compilation/CompilationTest.sol
+10 −0 test/compilation/CompilationTestBase.sol
+187 −0 test/fixtures/broadcast.log.json
+8 −0 test/fixtures/test.json
+6 −0 test/fixtures/test.toml
+441 −0 test/mocks/MockERC20.t.sol
+721 −0 test/mocks/MockERC721.t.sol
2 changes: 1 addition & 1 deletion remappings.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
ds-test/=lib/forge-std/lib/ds-test/src/
forge-std/=lib/forge-std/src/
forge-std-8/=lib/forge-std/src/
4 changes: 2 additions & 2 deletions script/Helper.s.sol
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.5.13;
pragma solidity >=0.5.13 <0.8.20;

import "forge-std/Script.sol";
import "forge-std-8/Script.sol";
import "../src/PrecompileHandler.sol";

contract Helper is Script, PrecompileHandler {
Expand Down
52 changes: 26 additions & 26 deletions src/PrecompileHandler.sol
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.5.13;
pragma solidity >=0.5.13 <0.8.20;

import "forge-std/Vm.sol";
import "forge-std/console2.sol";
import "forge-std-8/Vm.sol";
import "forge-std-8/console2.sol";
import "./Precompiles.sol";

contract PrecompileHandler is Precompiles {
address constant private VM_ADDRESS =
address(bytes20(uint160(uint256(keccak256('hevm cheat code')))));

Vm public constant vm = Vm(VM_ADDRESS);
Vm public constant _vm = Vm(VM_ADDRESS);

bytes4 constant TRANSFER_SIG = bytes4(keccak256("transfer(address,address,uint256)"));
bytes4 constant EPOCH_SIZE_SIG = bytes4(keccak256("epochSize()"));
Expand All @@ -30,41 +30,41 @@ contract PrecompileHandler is Precompiles {
Mock private revertMock = Mock(true, _empty, true);

constructor() public {
vm.etch(TRANSFER, proxyTo(TRANSFER_SIG));
vm.label(TRANSFER, "TRANSFER");
_vm.etch(TRANSFER, proxyTo(TRANSFER_SIG));
_vm.label(TRANSFER, "TRANSFER");

vm.etch(EPOCH_SIZE, proxyTo(EPOCH_SIZE_SIG));
vm.label(EPOCH_SIZE, "EPOCH_SIZE");
_vm.etch(EPOCH_SIZE, proxyTo(EPOCH_SIZE_SIG));
_vm.label(EPOCH_SIZE, "EPOCH_SIZE");

bytes memory catchAllProxy = proxyTo(CATCHALL_SIG);
vm.etch(FRACTION_MUL, catchAllProxy);
vm.label(FRACTION_MUL, "FRACTION_MUL");
_vm.etch(FRACTION_MUL, catchAllProxy);
_vm.label(FRACTION_MUL, "FRACTION_MUL");

vm.etch(PROOF_OF_POSSESSION, catchAllProxy);
vm.label(PROOF_OF_POSSESSION, "PROOF_OF_POSSESSION");
_vm.etch(PROOF_OF_POSSESSION, catchAllProxy);
_vm.label(PROOF_OF_POSSESSION, "PROOF_OF_POSSESSION");

vm.etch(GET_VALIDATOR, catchAllProxy);
vm.label(GET_VALIDATOR, "GET_VALIDATOR");
_vm.etch(GET_VALIDATOR, catchAllProxy);
_vm.label(GET_VALIDATOR, "GET_VALIDATOR");

vm.etch(NUMBER_VALIDATORS, catchAllProxy);
vm.label(NUMBER_VALIDATORS, "NUMBER_VALIDATORS");
_vm.etch(NUMBER_VALIDATORS, catchAllProxy);
_vm.label(NUMBER_VALIDATORS, "NUMBER_VALIDATORS");

vm.etch(BLOCK_NUMBER_FROM_HEADER, catchAllProxy);
vm.label(BLOCK_NUMBER_FROM_HEADER, "BLOCK_NUMBER_FROM_HEADER");
_vm.etch(BLOCK_NUMBER_FROM_HEADER, catchAllProxy);
_vm.label(BLOCK_NUMBER_FROM_HEADER, "BLOCK_NUMBER_FROM_HEADER");

vm.etch(HASH_HEADER, catchAllProxy);
vm.label(HASH_HEADER, "HASH_HEADER");
_vm.etch(HASH_HEADER, catchAllProxy);
_vm.label(HASH_HEADER, "HASH_HEADER");

vm.etch(GET_PARENT_SEAL_BITMAP, catchAllProxy);
vm.label(GET_PARENT_SEAL_BITMAP, "GET_PARENT_SEAL_BITMAP");
_vm.etch(GET_PARENT_SEAL_BITMAP, catchAllProxy);
_vm.label(GET_PARENT_SEAL_BITMAP, "GET_PARENT_SEAL_BITMAP");

vm.etch(GET_VERIFIED_SEAL_BITMAP, catchAllProxy);
vm.label(GET_VERIFIED_SEAL_BITMAP, "GET_VERIFIED_SEAL_BITMAP");
_vm.etch(GET_VERIFIED_SEAL_BITMAP, catchAllProxy);
_vm.label(GET_VERIFIED_SEAL_BITMAP, "GET_VERIFIED_SEAL_BITMAP");
}

function transfer(address from, address to, uint256 amount) public returns (bool) {
vm.deal(from, from.balance - amount);
vm.deal(to, to.balance + amount);
_vm.deal(from, from.balance - amount);
_vm.deal(to, to.balance + amount);
return true;
}

Expand Down
2 changes: 1 addition & 1 deletion src/Precompiles.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.5.13;
pragma solidity >=0.5.13 <0.8.20;

contract Precompiles {
address public constant TRANSFER = address(0xff - 2);
Expand Down
125 changes: 85 additions & 40 deletions src/Test.sol
Original file line number Diff line number Diff line change
@@ -1,56 +1,101 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.5.13;
pragma solidity >=0.5.13 <0.8.20;

import {Test as ForgeTest} from "forge-std/Test.sol";
import { Test as ForgeTest } from "forge-std-8/Test.sol";
import "./Precompiles.sol";
import "./PrecompileHandler.sol";

contract Test is ForgeTest, Precompiles {
PrecompileHandler public ph;
address currentPrank;
PrecompileHandler public ph;
address currentPrank;

event log_named_array(string key, address[] val);
event log_named_array(string key, bytes32[] val);
event log_array(string key, address[] val);
event log_array(string key, bytes32[] val);
event log_named_array(string key, bytes32[] val);
event log_array(string key, address[] val);
event log_array(string key, bytes32[] val);

constructor() ForgeTest() public {
ph = new PrecompileHandler();
}
constructor() public ForgeTest() {
ph = new PrecompileHandler();
}

/* Utility functions */
/* Utility functions */

function changePrank(address who) internal {
// Record current prank so helper functions can revert
// if they need to prank
currentPrank = who;
super.changePrank(who);
}
function changePrank(address who) internal virtual override {
// Record current prank so helper functions can revert
// if they need to prank
currentPrank = who;
super.changePrank(who);
}

function actor(string memory name) public returns (address) {
uint256 pk = uint256(keccak256(bytes(name)));
address addr = vm.addr(pk);
vm.label(addr, name);
return addr;
}
function actor(string memory name) public returns (address) {
uint256 pk = uint256(keccak256(bytes(name)));
address addr = vm.addr(pk);
vm.label(addr, name);
return addr;
}

/* Extra assertions, extends forge-std/Test.sol */
function actorWithPK(string memory name) public returns (address, uint256) {
uint256 pk = uint256(keccak256(bytes(name)));
address addr = vm.addr(pk);
vm.label(addr, name);
return (addr, pk);
}

function assertEq(address[] memory a, address[] memory b) internal {
if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
emit log("Error: a == b not satisfied [address[]]");
emit log_named_array(" Expected", b);
emit log_named_array(" Actual", a);
fail();
}
/* Extra assertions, extends forge-std/Test.sol */

function assertEq(address[] memory a, address[] memory b) internal virtual override {
if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
emit log("Error: a == b not satisfied [address[]]");
emit log_named_array(" Expected", b);
emit log_named_array(" Actual", a);
fail();
}
}

function assertEq(bytes32[] memory a, bytes32[] memory b) internal {
if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
emit log("Error: a == b not satisfied [bytes32[]]");
emit log_named_array(" Expected", b);
emit log_named_array(" Actual", a);
fail();
}
function assertEq(
address[] memory a,
address[] memory b,
string memory err
) internal virtual override {
if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
emit log_named_string("Error", err);
assertEq(a, b);
}
}
}

function assertEq(bytes32[] memory a, bytes32[] memory b) internal {
if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
emit log("Error: a == b not satisfied [bytes32[]]");
emit log_named_array(" Expected", b);
emit log_named_array(" Actual", a);
fail();
}
}

function deployCodeTo(string memory what, address where) internal virtual override {
deployCodeTo(what, "", 0, where);
}

function deployCodeTo(
string memory what,
bytes memory args,
address where
) internal virtual override {
deployCodeTo(what, args, 0, where);
}

function deployCodeTo(
string memory what,
bytes memory args,
uint256 value,
address where
) internal virtual override {
bytes memory creationCode = vm.getCode(what);
vm.etch(where, abi.encodePacked(creationCode, args));
(bool success, bytes memory runtimeBytecode) = where.call{ value: value }("");
require(
success,
"StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode."
);
vm.etch(where, runtimeBytecode);
}
}
Loading