1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity = 0.8.24 ;
3
+
4
+ import "@openzeppelin/contracts/access/Ownable.sol " ;
5
+
6
+ /**
7
+ * @dev Example "SystemSignerRegistry" storing `(startBlock, signer)` pairs.
8
+ * The getSigners() function returns parallel arrays for block numbers and addresses,
9
+ *
10
+ */
11
+ contract SystemSignerRegistry is Ownable {
12
+ struct Signer {
13
+ uint64 startBlock;
14
+ address signer;
15
+ }
16
+
17
+ Signer[] private signers;
18
+
19
+ constructor (address _owner ) {
20
+ _transferOwnership (_owner);
21
+ }
22
+
23
+ /**
24
+ * @dev Add a (startBlock, signer) pair. Only the owner can do this.
25
+ */
26
+ function addSigner (uint64 _startBlock , address _signer ) external onlyOwner {
27
+ require (_signer != address (0 ), "Zero address not allowed " );
28
+ signers.push (Transition ({startBlock: _startBlock, signer: _signer}));
29
+ }
30
+
31
+ /**
32
+ * @dev Remove a signer by matching both startBlock & signer, or just signer (you choose).
33
+ *
34
+ */
35
+ function removeSigner (uint64 _startBlock , address _signer ) external onlyOwner {
36
+ uint256 length = signers.length ;
37
+ for (uint256 i = 0 ; i < length; i++ ) {
38
+ // If you only want to match signer, ignore _startBlock
39
+ if (signers[i].startBlock == _startBlock && signers[i].signer == _signer) {
40
+ if (i < length - 1 ) {
41
+ signers[i] = signers[length - 1 ];
42
+ }
43
+ signers.pop ();
44
+ return ;
45
+ }
46
+ }
47
+ revert ("Transition not found " );
48
+ }
49
+
50
+ /**
51
+ * @dev Return two parallel arrays: blockNumbers and signers.
52
+ *
53
+ */
54
+ function getSigners () external view returns (uint64 [] memory , address [] memory ) {
55
+ uint256 len = transitions.length ;
56
+ uint64 [] memory blocks = new uint64 [](len);
57
+ address [] memory addrs = new address [](len);
58
+
59
+ for (uint256 i = 0 ; i < len; i++ ) {
60
+ blocks[i] = signers[i].startBlock;
61
+ addrs[i] = signers[i].signer;
62
+ }
63
+ return (blocks, addrs);
64
+ }
65
+ }
0 commit comments