|
@@ -0,0 +1,51 @@
|
|
|
+// SPDX-License-Identifier: MIT
|
|
|
+// This file was procedurally generated from scripts/generate/templates/Packing.t.js.
|
|
|
+
|
|
|
+pragma solidity ^0.8.20;
|
|
|
+
|
|
|
+import {Test} from "forge-std/Test.sol";
|
|
|
+import {NoncesKeyed} from "@openzeppelin/contracts/utils/NoncesKeyed.sol";
|
|
|
+import {Nonces} from "@openzeppelin/contracts/utils/Nonces.sol";
|
|
|
+
|
|
|
+// CAUTION: Unsafe mock for testing purposes.
|
|
|
+contract NoncesKeyedMock is NoncesKeyed {
|
|
|
+ function useNonce(address owner, uint192 key) public returns (uint256) {
|
|
|
+ return _useNonce(owner, key);
|
|
|
+ }
|
|
|
+
|
|
|
+ function useCheckedNonce(address owner, uint192 key, uint64 nonce) public {
|
|
|
+ _useCheckedNonce(owner, key, nonce);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+contract NoncesKeyedTest is Test {
|
|
|
+ NoncesKeyedMock private _mock;
|
|
|
+
|
|
|
+ function setUp() public {
|
|
|
+ _mock = new NoncesKeyedMock();
|
|
|
+ }
|
|
|
+
|
|
|
+ function testSymbolicUseNonce(address owner, uint192 key) public {
|
|
|
+ uint256 prevNonce = _mock.useNonce(owner, key);
|
|
|
+ assertEq(prevNonce + 1, _mock.nonces(owner, key));
|
|
|
+ }
|
|
|
+
|
|
|
+ function testSymbolicUseCheckedNonceLiveness(address owner, uint192 key) public {
|
|
|
+ uint256 currNonce = _mock.nonces(owner, key);
|
|
|
+
|
|
|
+ // Does not revert
|
|
|
+ _mock.useCheckedNonce(owner, key, uint64(currNonce));
|
|
|
+ assertEq(currNonce + 1, _mock.nonces(owner, key));
|
|
|
+ }
|
|
|
+
|
|
|
+ function testUseCheckedNonce(address owner, uint192 key, uint64 nonce) public {
|
|
|
+ uint256 currNonce = _mock.nonces(owner, key);
|
|
|
+
|
|
|
+ if (uint64(currNonce) == nonce) {
|
|
|
+ _mock.useCheckedNonce(owner, key, nonce);
|
|
|
+ } else {
|
|
|
+ vm.expectRevert(abi.encodeWithSelector(Nonces.InvalidAccountNonce.selector, owner, currNonce));
|
|
|
+ _mock.useCheckedNonce(owner, key, nonce);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|