Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: migrate GPv2Signing recoverOrderSigner tests to Foundry #207

Merged
merged 30 commits into from
Aug 15, 2024
Merged
Changes from 1 commit
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
d0173f0
chore: migrate GPv2Signing domain separator tests to Foundry
fedgiac Aug 9, 2024
c7d4149
Fix unused import
fedgiac Aug 9, 2024
bc7f235
Remove duplicated import
fedgiac Aug 12, 2024
0721892
chore: migrate GPv2Signing set pre-signature tests to Foundry
fedgiac Aug 12, 2024
56ff598
chore: migrate GPv2Signing recoverOrderFromTrade tests to Foundry
fedgiac Aug 12, 2024
f71e28d
Merge branch 'main' into migrate-test-signing-domain-separator
fedgiac Aug 12, 2024
2816827
Add explanatory comment on domain separator struct
fedgiac Aug 12, 2024
585703d
Reuse existing PRE_SIGNED variable from library
fedgiac Aug 12, 2024
d51fced
Merge branch 'main' into migrate-test-signing-domain-separator
fedgiac Aug 12, 2024
e233612
Merge branch 'migrate-test-signing-domain-separator' into migrate-tes…
fedgiac Aug 12, 2024
84eb7fc
Fix missing setting of pre-signature at start of test
fedgiac Aug 12, 2024
6e618dc
Clean up imports
fedgiac Aug 14, 2024
a8c8b45
chore: migrate GPv2Signing calldata manipulation tests to Foundry
fedgiac Aug 14, 2024
ac6bcae
chore: migrate GPv2Signing recoverOrderSigner tests to Foundry
fedgiac Aug 14, 2024
483e8f2
Fix fuzz test case where buy and sell tokens are the same
fedgiac Aug 14, 2024
61a0da9
Merge branch 'main' into migrate-test-signing-set-pre-signature
fedgiac Aug 15, 2024
a16ab67
Merge branch 'main' into migrate-test-signing-set-pre-signature
fedgiac Aug 15, 2024
2ebcc44
Merge branch 'migrate-test-signing-set-pre-signature' into migrate-te…
fedgiac Aug 15, 2024
8dd66e7
Merge fuzzed order library into order library
fedgiac Aug 15, 2024
21e12c1
Merge branch 'migrate-test-signing-recover-order-from-trade' into mig…
fedgiac Aug 15, 2024
46fcb81
Update fuzz library usage
fedgiac Aug 15, 2024
db2a861
Merge branch 'migrate-test-signing-calldata-manipulation' into migrat…
fedgiac Aug 15, 2024
16d5d65
Fix invalid signing scheme test to involve a call
fedgiac Aug 15, 2024
6e97dce
Prefer EIP1271Verifier.isValidSignature.selector to static constant
fedgiac Aug 15, 2024
cc09214
Merge branch 'main' into migrate-test-signing-recover-order-from-trade
fedgiac Aug 15, 2024
a34bc31
Merge branch 'migrate-test-signing-recover-order-from-trade' into mig…
fedgiac Aug 15, 2024
53ef88b
Merge branch 'main' into migrate-test-signing-calldata-manipulation
fedgiac Aug 15, 2024
6d96620
Merge branch 'migrate-test-signing-calldata-manipulation' into migrat…
fedgiac Aug 15, 2024
a467ea6
Remove test of Solidity enum parsing
fedgiac Aug 15, 2024
94bf104
Remove unused import
fedgiac Aug 15, 2024
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
Next Next commit
chore: migrate GPv2Signing domain separator tests to Foundry
fedgiac committed Aug 9, 2024
commit d0173f0494ad84aaf71855f6a6c2f2fd79f284b5
19 changes: 0 additions & 19 deletions test/GPv2Signing.test.ts
Original file line number Diff line number Diff line change
@@ -38,25 +38,6 @@ describe("GPv2Signing", () => {
testDomain = domain(chainId, signing.address);
});

describe("domainSeparator", () => {
it("should have an EIP-712 domain separator", async () => {
expect(await signing.domainSeparator()).to.equal(
ethers.utils._TypedDataEncoder.hashDomain(testDomain),
);
});

it("should have a different replay protection for each deployment", async () => {
const GPv2Signing = await ethers.getContractFactory(
"GPv2SigningTestInterface",
);
const signing2 = await GPv2Signing.deploy();

expect(await signing.domainSeparator()).to.not.equal(
await signing2.domainSeparator(),
);
});
});

describe("setPreSignature", () => {
const [owner, nonOwner] = traders;
const orderUid = packOrderUidParams({
27 changes: 27 additions & 0 deletions test/GPv2Signing/DomainSeparator.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// SPDX-License-Identifier: LGPL-3.0-or-later
pragma solidity ^0.8;

import {Helper} from "./Helper.sol";

import {Harness, Helper} from "./Helper.sol";
import {Eip712} from "test/libraries/Eip712.sol";
import {Order as OrderLib} from "test/libraries/Order.sol";

Check warning on line 8 in test/GPv2Signing/DomainSeparator.t.sol

GitHub Actions / test (18.x, ubuntu-latest)

imported name OrderLib is not used

contract DomainSeparator is Helper {
function test_TYPE_HASH_matches_the_EIP_712_order_type_hash() public view {
bytes32 expectedDomainSeparator = Eip712.hashStruct(
Eip712.EIP712Domain({
name: "Gnosis Protocol",
version: "v2",
chainId: block.chainid,
verifyingContract: address(executor)
})
);
assertEq(executor.domainSeparator(), expectedDomainSeparator);
}

function test_should_have_a_different_replay_protection_for_each_deployment() public {
Harness signing = new Harness();
assertNotEq(executor.domainSeparator(), signing.domainSeparator());
}
}
33 changes: 11 additions & 22 deletions test/GPv2Signing/Helper.sol
Original file line number Diff line number Diff line change
@@ -1,30 +1,19 @@
// SPDX-License-Identifier: LGPL-3.0-or-later
pragma solidity ^0.8;

import {IERC20} from "src/contracts/interfaces/IERC20.sol";
import {GPv2Order} from "src/contracts/libraries/GPv2Order.sol";
import {GPv2Trade} from "src/contracts/libraries/GPv2Trade.sol";
import {GPv2Signing} from "src/contracts/mixins/GPv2Signing.sol";
import {Test} from "forge-std/Test.sol";

// solhint-disable func-name-mixedcase
contract Harness is GPv2Signing {
constructor(bytes32 _domainSeparator) {
domainSeparator = _domainSeparator;
}
import {GPv2SigningTestInterface} from "test/src/GPv2SigningTestInterface.sol";

function exposed_recoverOrderFromTrade(
RecoveredOrder memory recoveredOrder,
IERC20[] calldata tokens,
GPv2Trade.Data calldata trade
) external view {
recoverOrderFromTrade(recoveredOrder, tokens, trade);
}
// TODO: move the content of `GPv2SigningTestInterface` here once all tests have
// been removed.
// solhint-disable-next-line no-empty-blocks
contract Harness is GPv2SigningTestInterface {}

contract Helper is Test {
Harness internal executor;

function exposed_recoverOrderSigner(GPv2Order.Data memory order, Scheme signingScheme, bytes calldata signature)
external
view
returns (bytes32 orderDigest, address owner)
{
(orderDigest, owner) = recoverOrderSigner(order, signingScheme, signature);
function setUp() public {
executor = new Harness();
}
}
42 changes: 42 additions & 0 deletions test/libraries/Eip712.sol
Original file line number Diff line number Diff line change
@@ -4,6 +4,13 @@ pragma solidity ^0.8;
import {GPv2Order} from "src/contracts/libraries/GPv2Order.sol";

library Eip712 {
struct EIP712Domain {
string name;
string version;
uint256 chainId;
address verifyingContract;
}

// This is the struct representing an order that is signed by the user using
// EIP-712.
struct Order {
@@ -21,6 +28,25 @@ library Eip712 {
string buyTokenBalance;
}

// Ideally, this would be replaced by type(EIP712Domain).typehash.
// Progress tracking for this Solidity feature is here:
// https://github.com/ethereum/solidity/issues/14157
function EIP712DOMAIN_TYPE_HASH() internal pure returns (bytes32) {
return keccak256(
bytes(
string.concat(
// Should reflect the definition of the struct `EIP712Domain`.
"EIP712Domain(",
"string name,",
"string version,",
"uint256 chainId,",
"address verifyingContract",
")"
)
)
);
}

// Ideally, this would be replaced by type(Order).typehash.
// Progress tracking for this Solidity feature is here:
// https://github.com/ethereum/solidity/issues/14157
@@ -96,6 +122,22 @@ library Eip712 {
});
}

function hashStruct(EIP712Domain memory domain) internal pure returns (bytes32) {
// Ideally, this would be replaced by `domain.hashStruct()`.
// Progress tracking for this Solidity feature is here:
// https://github.com/ethereum/solidity/issues/14208
return keccak256(
// Note: dynamic types are hashed.
abi.encode(
EIP712DOMAIN_TYPE_HASH(),
keccak256(bytes(domain.name)),
keccak256(bytes(domain.version)),
domain.chainId,
domain.verifyingContract
)
);
}

function hashStruct(Order memory order) internal pure returns (bytes32) {
// Ideally, this would be replaced by `order.hashStruct()`.
// Progress tracking for this Solidity feature is here: