Skip to content
Closed
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
4 changes: 4 additions & 0 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,8 @@ test= "test/rollup"
[profile.host]
test= "test/host"

[invariant]
runs = 256
depth = 500

# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options
17 changes: 9 additions & 8 deletions src/orders/OrdersPermit2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,15 @@ abstract contract OrdersPermit2 is UsesPermit2 {
ISignatureTransfer.SignatureTransferDetails[] memory transferDetails,
Permit2Batch calldata permit2
) internal {
ISignatureTransfer(permit2Contract).permitWitnessTransferFrom(
permit2.permit,
transferDetails,
permit2.owner,
_witness.witnessHash,
_witness.witnessTypeString,
permit2.signature
);
ISignatureTransfer(permit2Contract)
.permitWitnessTransferFrom(
permit2.permit,
transferDetails,
permit2.owner,
_witness.witnessHash,
_witness.witnessTypeString,
permit2.signature
);
}

/// @notice transform Output and TokenPermissions structs to TransferDetails structs, for passing to permit2.
Expand Down
22 changes: 12 additions & 10 deletions src/passage/PassagePermit2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,9 @@ abstract contract PassagePermit2 is UsesPermit2 {
pure
returns (Witness memory _witness)
{
_witness.witnessHash =
keccak256(abi.encode(_ENTER_WITNESS_TYPEHASH, EnterWitness(rollupChainId, rollupRecipient)));
_witness.witnessHash = keccak256(
abi.encode(_ENTER_WITNESS_TYPEHASH, EnterWitness(rollupChainId, rollupRecipient))
);
_witness.witnessTypeString = _ENTER_WITNESS_TYPESTRING;
}

Expand All @@ -49,14 +50,15 @@ abstract contract PassagePermit2 is UsesPermit2 {
/// @param _witness - the hashed witness and its typestring.
/// @param permit2 - the Permit2 information.
function _permitWitnessTransferFrom(Witness memory _witness, Permit2 calldata permit2) internal {
ISignatureTransfer(permit2Contract).permitWitnessTransferFrom(
permit2.permit,
_selfTransferDetails(permit2.permit.permitted.amount),
permit2.owner,
_witness.witnessHash,
_witness.witnessTypeString,
permit2.signature
);
ISignatureTransfer(permit2Contract)
.permitWitnessTransferFrom(
permit2.permit,
_selfTransferDetails(permit2.permit.permitted.amount),
permit2.owner,
_witness.witnessHash,
_witness.witnessTypeString,
permit2.signature
);
}

/// @notice Construct TransferDetails transferring a balance to this contract, for passing to permit2.
Expand Down
12 changes: 7 additions & 5 deletions test/Helpers.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,9 @@ contract Permit2Helpers is SignetStdTest {
bytes32 _witness,
string memory witnessTypeString
) internal pure returns (bytes32) {
bytes32 typeHash =
keccak256(abi.encodePacked(_PERMIT_BATCH_WITNESS_TRANSFER_FROM_TYPEHASH_STUB, witnessTypeString));
bytes32 typeHash = keccak256(
abi.encodePacked(_PERMIT_BATCH_WITNESS_TRANSFER_FROM_TYPEHASH_STUB, witnessTypeString)
);

uint256 numPermitted = permit.permitted.length;
bytes32[] memory tokenPermissionHashes = new bytes32[](numPermitted);
Expand Down Expand Up @@ -133,9 +134,10 @@ contract Permit2Helpers is SignetStdTest {
/// @notice Returns the domain separator for the current chain.
/// @dev Uses cached version if chainid and address are unchanged from construction.
function DOMAIN_SEPARATOR() public view returns (bytes32) {
return block.chainid == _CACHED_CHAIN_ID
? _CACHED_DOMAIN_SEPARATOR
: _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME);
return
block.chainid == _CACHED_CHAIN_ID
? _CACHED_DOMAIN_SEPARATOR
: _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME);
}

/// @notice Builds a domain separator using the current chainId and contract address.
Expand Down
9 changes: 5 additions & 4 deletions test/fuzz-rollup/OrdersFuzz.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ contract OrdersFuzzTest is SignetStdTest {
function test_sweepETH(uint256 deadline, uint256 amount, address recipient, IOrders.Output memory output) public {
vm.assume(deadline >= block.timestamp);
vm.assume(amount < type(uint256).max - 1000 ether); // prevent overflow in vm.deal
vm.assume(recipient.code.length == 0 && uint160(recipient) > 0x09); // recipient is non-precompile EOA
vm.assume(recipient.code.length == 0 && uint160(recipient) > 0xff); // recipient is non-precompile EOA
vm.assume(address(recipient).balance == 0); // recipient starts with zero balance
vm.deal(address(this), amount); // give contract some ETH

Expand All @@ -112,6 +112,7 @@ contract OrdersFuzzTest is SignetStdTest {

function test_sweepERC20(address recipient, address token, uint256 amount) public {
vm.assume(token != address(0));
vm.assume(token != address(vm));

vm.mockCall(
token, abi.encodeWithSelector(ERC20.transfer.selector, address(recipient), amount), abi.encode(true)
Expand All @@ -126,7 +127,7 @@ contract OrdersFuzzTest is SignetStdTest {

function test_fill(IOrders.Output memory output) public {
vm.assume(output.amount < type(uint256).max - 1000 ether); // prevent overflow in vm.deal
vm.assume(output.recipient.code.length == 0 && uint160(output.recipient) > 0x09); // recipient is non-precompile EOA
vm.assume(output.recipient.code.length == 0 && uint160(output.recipient) > 0xff); // recipient is non-precompile EOA
vm.assume(output.token != address(vm));
vm.deal(address(this), output.amount); // give contract some ETH

Expand Down Expand Up @@ -162,7 +163,7 @@ contract OrdersFuzzTest is SignetStdTest {

function test_fill_underflowETH(uint256 amount, address recipient, uint32 chainId) public {
vm.assume(amount > 0 && amount < type(uint256).max - 1000 ether); // prevent overflow in vm.deal
vm.assume(recipient.code.length == 0 && uint160(recipient) > 0x09); // recipient is non-precompile EOA
vm.assume(recipient.code.length == 0 && uint160(recipient) > 0xff); // recipient is non-precompile EOA
vm.deal(address(this), amount); // give contract some ETH

IOrders.Output[] memory outputs = new IOrders.Output[](2);
Expand All @@ -175,7 +176,7 @@ contract OrdersFuzzTest is SignetStdTest {
}

function test_fill_zeroETH(address recipient, uint32 chainId) public {
vm.assume(recipient.code.length == 0 && uint160(recipient) > 0x09); // recipient is non-precompile EOA
vm.assume(recipient.code.length == 0 && uint160(recipient) > 0xff); // recipient is non-precompile EOA

IOrders.Output memory output = IOrders.Output(address(0), 0, recipient, chainId);
IOrders.Output[] memory outputs = new IOrders.Output[](1);
Expand Down
Loading
Loading