Skip to content

Commit ccf7666

Browse files
committed
feat(signature): check not signed already
1 parent 11e2d4e commit ccf7666

File tree

6 files changed

+72
-53
lines changed

6 files changed

+72
-53
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ hash:
1616
forge script script/HashData.sol
1717

1818
sign\:%: hash
19+
forge script script/CheckNoSignature.sol
1920
cast wallet sign --$* $$(cat data/hashData.txt) 1>> data/signatures.txt
2021
@echo "\033[0;32mTx signature successfully appended to data/signatures.txt"
2122

script/CheckNoSignature.sol

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.0;
3+
4+
import "./SignatureScript.sol";
5+
6+
contract CheckNoSignature is SignatureScript {
7+
function run() public {
8+
SafeTxData memory txData = loadSafeTxData();
9+
10+
loadSignatures(hashData(txData));
11+
12+
require(signatureOf[SENDER].length == 0, "Already signed!");
13+
}
14+
}

script/ExecTransaction.sol

Lines changed: 10 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,25 @@ pragma solidity ^0.8.0;
33

44
import {QuickSort} from "./libraries/QuickSort.sol";
55

6-
import {SafeTxDataBuilder, SafeTx, Enum} from "./SafeTxDataBuilder.sol";
6+
import "./SignatureScript.sol";
77

8-
contract ExecTransaction is SafeTxDataBuilder {
8+
contract ExecTransaction is SignatureScript {
99
using QuickSort for address[];
1010

11-
address[] signers;
12-
bytes[] signatures;
13-
mapping(address => bytes) signatureOf;
14-
1511
function run() public {
1612
SafeTx memory safeTx;
1713
safeTx.data = loadSafeTxData();
1814

1915
loadSignatures(hashData(safeTx.data));
2016

17+
uint256 nbSignatures = signatures.length;
18+
require(
19+
nbSignatures >= THRESHOLD,
20+
string.concat(
21+
"Not enough signatures (found: ", vm.toString(nbSignatures), "; expected: ", vm.toString(THRESHOLD), ")"
22+
)
23+
);
24+
2125
signers.sort();
2226

2327
for (uint256 i; i < signers.length; ++i) {
@@ -39,45 +43,4 @@ contract ExecTransaction is SafeTxDataBuilder {
3943
safeTx.signatures
4044
);
4145
}
42-
43-
function loadSignatures(bytes32 dataHash) internal {
44-
bytes memory line = bytes(vm.readLine(SIGNATURES_FILE));
45-
46-
while (line.length > 0 && signatures.length < THRESHOLD) {
47-
parseSignature(dataHash, line);
48-
49-
line = bytes(vm.readLine(SIGNATURES_FILE));
50-
}
51-
52-
uint256 nbSignatures = signatures.length;
53-
require(
54-
nbSignatures >= THRESHOLD,
55-
string.concat(
56-
"Not enough signatures (found: ", vm.toString(nbSignatures), "; expected: ", vm.toString(THRESHOLD), ")"
57-
)
58-
);
59-
}
60-
61-
function parseSignature(bytes32 dataHash, bytes memory line) internal {
62-
require(
63-
line.length == 132,
64-
string.concat(
65-
"Malformed signature: ", string(line), " (length: ", vm.toString(line.length), "; expected: 132)"
66-
)
67-
);
68-
69-
bytes memory hexSignature = new bytes(130);
70-
for (uint256 j; j < 130; ++j) {
71-
hexSignature[j] = line[j + 2];
72-
}
73-
74-
bytes memory signature = vm.parseBytes(string(hexSignature));
75-
76-
(address signer, bytes32 r, bytes32 s, uint8 v) = decode(dataHash, signature);
77-
require(signatureOf[signer].length == 0, string.concat("Duplicate signature: ", string(line)));
78-
79-
signatureOf[signer] = abi.encodePacked(r, s, v + 4);
80-
signatures.push(signature);
81-
signers.push(signer);
82-
}
8346
}

script/HashData.sol

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.0;
33

4-
import {SafeTxDataBuilder, SafeTxData} from "./SafeTxDataBuilder.sol";
4+
import "./SafeTxScript.sol";
55

6-
contract HashData is SafeTxDataBuilder {
6+
contract HashData is SafeTxScript {
77
function run() public {
88
SafeTxData memory txData = loadSafeTxData();
99

10-
bytes32 dataHash = hashData(txData);
11-
12-
vm.writeFile(HASH_DATA_FILE, vm.toString(dataHash));
10+
vm.writeFile(HASH_DATA_FILE, vm.toString(hashData(txData)));
1311
}
1412
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ struct SafeTx {
2626
bytes signatures;
2727
}
2828

29-
contract SafeTxDataBuilder is Script, SignatureDecoder {
29+
contract SafeTxScript is Script, SignatureDecoder {
3030
using stdJson for string;
3131

3232
string internal ROOT = vm.projectRoot();

script/SignatureScript.sol

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.0;
3+
4+
import "./SafeTxScript.sol";
5+
6+
contract SignatureScript is SafeTxScript {
7+
address[] signers;
8+
bytes[] signatures;
9+
mapping(address => bytes) signatureOf;
10+
11+
function loadSignatures(bytes32 dataHash) internal {
12+
bytes memory line = bytes(vm.readLine(SIGNATURES_FILE));
13+
14+
while (line.length > 0) {
15+
parseSignature(dataHash, line);
16+
17+
line = bytes(vm.readLine(SIGNATURES_FILE));
18+
}
19+
}
20+
21+
function parseSignature(bytes32 dataHash, bytes memory line) internal {
22+
require(
23+
line.length == 132,
24+
string.concat(
25+
"Malformed signature: ", string(line), " (length: ", vm.toString(line.length), "; expected: 132)"
26+
)
27+
);
28+
29+
bytes memory hexSignature = new bytes(130);
30+
for (uint256 j; j < 130; ++j) {
31+
hexSignature[j] = line[j + 2];
32+
}
33+
34+
bytes memory signature = vm.parseBytes(string(hexSignature));
35+
36+
(address signer, bytes32 r, bytes32 s, uint8 v) = decode(dataHash, signature);
37+
require(signatureOf[signer].length == 0, string.concat("Duplicate signature: ", string(line)));
38+
39+
signatureOf[signer] = abi.encodePacked(r, s, v + 4);
40+
signatures.push(signature);
41+
signers.push(signer);
42+
}
43+
}

0 commit comments

Comments
 (0)