Skip to content

Commit

Permalink
Format
Browse files Browse the repository at this point in the history
  • Loading branch information
hayesgm committed Sep 9, 2024
1 parent bbc06cf commit 1b774f2
Show file tree
Hide file tree
Showing 9 changed files with 158 additions and 46 deletions.
5 changes: 3 additions & 2 deletions src/quark-core/src/QuarkNonceManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ contract QuarkNonceManager {
bytes32 public constant FREE = bytes32(uint256(0));

/// @notice A token that implies a Quark Operation is no longer replayable.
bytes32 public constant EXHAUSTED = bytes32(type(uint).max);
bytes32 public constant EXHAUSTED = bytes32(type(uint256).max);

/// @notice Mapping from nonces to last used submission token.
mapping(address wallet => mapping(bytes32 nonce => bytes32 lastToken)) public nonceSubmissions;
Expand All @@ -44,7 +44,8 @@ contract QuarkNonceManager {
revert NonReplayableNonce(msg.sender, nonce, submissionToken);
}

bool validFirstPlayOrReplay = lastTokenSubmission == FREE || keccak256(abi.encodePacked(submissionToken)) == lastTokenSubmission;
bool validFirstPlayOrReplay =
lastTokenSubmission == FREE || keccak256(abi.encodePacked(submissionToken)) == lastTokenSubmission;
if (!validFirstPlayOrReplay) {
revert InvalidSubmissionToken(msg.sender, nonce, submissionToken);
}
Expand Down
2 changes: 1 addition & 1 deletion src/quark-core/src/QuarkWallet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ contract QuarkWallet is IERC1271 {
bytes32 public constant ACTIVE_SCRIPT_SLOT = bytes32(uint256(keccak256("quark.v1.active.script")) - 1);

/// @notice A nonce submission token that implies a Quark Operation is no longer replayable.
bytes32 public constant EXHAUSTED_TOKEN = bytes32(type(uint).max);
bytes32 public constant EXHAUSTED_TOKEN = bytes32(type(uint256).max);

/// @notice The magic value to return for valid ERC1271 signature
bytes4 internal constant EIP_1271_MAGIC_VALUE = 0x1626ba7e;
Expand Down
2 changes: 1 addition & 1 deletion test/lib/CancelOtherScript.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ import "quark-core/src/QuarkWallet.sol";

contract CancelOtherScript {
function run(bytes32 nonce) public {
return QuarkWallet(payable(address(this))).nonceManager().submitNonceToken(nonce, bytes32(type(uint).max));
return QuarkWallet(payable(address(this))).nonceManager().submitNonceToken(nonce, bytes32(type(uint256).max));
}
}
4 changes: 2 additions & 2 deletions test/quark-core-scripts/UniswapFlashLoan.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ contract UniswapFlashLoanTest is Test {
callContract: ethcallAddress,
callData: abi.encodeWithSelector(
Ethcall.run.selector, USDC, abi.encodeCall(IERC20.transfer, (address(1), 1000e6)), 0
)
)
});

QuarkWallet.QuarkOperation memory op = new QuarkOperationHelper().newBasicOpWithCalldata(
Expand Down Expand Up @@ -271,7 +271,7 @@ contract UniswapFlashLoanTest is Test {
callContract: ethcallAddress,
callData: abi.encodeWithSelector(
Ethcall.run.selector, USDC, abi.encodeCall(IERC20.approve, (comet, 1000e6)), 0
)
)
})
),
ScriptType.ScriptAddress
Expand Down
6 changes: 5 additions & 1 deletion test/quark-core/EIP712.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,11 @@ contract EIP712Test is Test {
assertEq(nonceManager.getNonceSubmission(address(wallet), op.nonce), bytes32(type(uint256).max));

// submitter tries to reuse the same signature twice, for a non-replayable operation
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.NonReplayableNonce.selector, address(wallet), op.nonce, bytes32(type(uint256).max)));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.NonReplayableNonce.selector, address(wallet), op.nonce, bytes32(type(uint256).max)
)
);
wallet.executeQuarkOperation(op, v, r, s);
}

Expand Down
132 changes: 105 additions & 27 deletions test/quark-core/Nonce.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,13 @@ contract NonceTest is Test {
nonceManager.submitNonceToken(nonce, EXHAUSTED_TOKEN);
assertEq(nonceManager.getNonceSubmission(address(this), nonce), EXHAUSTED_TOKEN);

vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.NonReplayableNonce.selector, address(this), nonce, FREE_TOKEN));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.NonReplayableNonce.selector, address(this), nonce, FREE_TOKEN)
);
nonceManager.submitNonceToken(nonce, FREE_TOKEN);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.NonReplayableNonce.selector, address(this), nonce, EXHAUSTED_TOKEN));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.NonReplayableNonce.selector, address(this), nonce, EXHAUSTED_TOKEN)
);
nonceManager.submitNonceToken(nonce, EXHAUSTED_TOKEN);
}

Expand All @@ -63,13 +67,25 @@ contract NonceTest is Test {
nonceManager.submitNonceToken(nonce, nonceSecret);
assertEq(nonceManager.getNonceSubmission(address(this), nonce), nonceSecret);

vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, nonceSecret));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, nonceSecret)
);
nonceManager.submitNonceToken(nonce, nonceSecret);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, nonceSecretHash));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, nonceSecretHash
)
);
nonceManager.submitNonceToken(nonce, nonceSecretHash);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, FREE_TOKEN));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, FREE_TOKEN)
);
nonceManager.submitNonceToken(nonce, FREE_TOKEN);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, EXHAUSTED_TOKEN));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, EXHAUSTED_TOKEN
)
);
nonceManager.submitNonceToken(nonce, EXHAUSTED_TOKEN);
}

Expand All @@ -88,59 +104,121 @@ contract NonceTest is Test {
nonceManager.submitNonceToken(nonce, rootHash);
assertEq(nonceManager.getNonceSubmission(address(this), nonce), rootHash);

vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, rootHash));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, rootHash)
);
nonceManager.submitNonceToken(nonce, rootHash);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, replayToken2));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, replayToken2
)
);
nonceManager.submitNonceToken(nonce, replayToken2);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, nonceSecret));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, nonceSecret)
);
nonceManager.submitNonceToken(nonce, nonceSecret);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, FREE_TOKEN));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, FREE_TOKEN)
);
nonceManager.submitNonceToken(nonce, FREE_TOKEN);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, EXHAUSTED_TOKEN));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, EXHAUSTED_TOKEN
)
);
nonceManager.submitNonceToken(nonce, EXHAUSTED_TOKEN);

nonceManager.submitNonceToken(nonce, replayToken1);
assertEq(nonceManager.getNonceSubmission(address(this), nonce), replayToken1);

vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, rootHash));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, rootHash)
);
nonceManager.submitNonceToken(nonce, rootHash);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, replayToken1));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, replayToken1
)
);
nonceManager.submitNonceToken(nonce, replayToken1);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, nonceSecret));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, nonceSecret)
);
nonceManager.submitNonceToken(nonce, nonceSecret);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, FREE_TOKEN));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, FREE_TOKEN)
);
nonceManager.submitNonceToken(nonce, FREE_TOKEN);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, EXHAUSTED_TOKEN));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, EXHAUSTED_TOKEN
)
);
nonceManager.submitNonceToken(nonce, EXHAUSTED_TOKEN);

nonceManager.submitNonceToken(nonce, replayToken2);
assertEq(nonceManager.getNonceSubmission(address(this), nonce), replayToken2);

vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, rootHash));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, rootHash)
);
nonceManager.submitNonceToken(nonce, rootHash);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, replayToken1));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, replayToken1
)
);
nonceManager.submitNonceToken(nonce, replayToken1);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, replayToken2));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, replayToken2
)
);
nonceManager.submitNonceToken(nonce, replayToken2);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, FREE_TOKEN));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, FREE_TOKEN)
);
nonceManager.submitNonceToken(nonce, FREE_TOKEN);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, EXHAUSTED_TOKEN));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, EXHAUSTED_TOKEN
)
);
nonceManager.submitNonceToken(nonce, EXHAUSTED_TOKEN);

nonceManager.submitNonceToken(nonce, nonceSecret);
assertEq(nonceManager.getNonceSubmission(address(this), nonce), nonceSecret);

vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, rootHash));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, rootHash)
);
nonceManager.submitNonceToken(nonce, rootHash);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, replayToken1));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, replayToken1
)
);
nonceManager.submitNonceToken(nonce, replayToken1);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, replayToken2));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, replayToken2
)
);
nonceManager.submitNonceToken(nonce, replayToken2);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, nonceSecret));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, nonceSecret)
);
nonceManager.submitNonceToken(nonce, nonceSecret);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, FREE_TOKEN));
vm.expectRevert(
abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, FREE_TOKEN)
);
nonceManager.submitNonceToken(nonce, FREE_TOKEN);
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, EXHAUSTED_TOKEN));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.InvalidSubmissionToken.selector, address(this), nonce, EXHAUSTED_TOKEN
)
);
nonceManager.submitNonceToken(nonce, EXHAUSTED_TOKEN);
}

Expand Down
6 changes: 5 additions & 1 deletion test/quark-core/QuarkNonceManager.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,11 @@ contract QuarkNonceManagerTest is Test {
bytes32 nonce = bytes32(uint256(0));
nonceManager.submitNonceToken(nonce, EXHAUSTED);

vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.NonReplayableNonce.selector, address(this), nonce, bytes32(type(uint256).max)));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.NonReplayableNonce.selector, address(this), nonce, bytes32(type(uint256).max)
)
);
nonceManager.submitNonceToken(nonce, EXHAUSTED);
}
}
9 changes: 8 additions & 1 deletion test/quark-core/QuarkWallet.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -669,7 +669,14 @@ contract QuarkWalletTest is Test {
assertEq(counter.number(), 3);

// call again using the same operation
vm.expectRevert(abi.encodeWithSelector(QuarkNonceManager.NonReplayableNonce.selector, address(aliceWallet), op1.nonce, bytes32(type(uint256).max)));
vm.expectRevert(
abi.encodeWithSelector(
QuarkNonceManager.NonReplayableNonce.selector,
address(aliceWallet),
op1.nonce,
bytes32(type(uint256).max)
)
);
aliceWallet.executeMultiQuarkOperation(op1, opDigests, v, r, s);

assertEq(counter.number(), 3);
Expand Down
Loading

0 comments on commit 1b774f2

Please sign in to comment.