Skip to content

Commit a0cb200

Browse files
joaquim-vergesKrishang Nadgauda
andauthored
Add optional metadata URI to registry.add() (#263)
* Add optional metadata URI to registry.add() * fix tests * Maintain copy of TWRegistry and TWMultichainRegistry * docs update * Use TWMultichainRegistry in BaseTest * add legacy TWRegistry ABI * add docs * Re-introduce original TWRegistry Co-authored-by: Krishang Nadgauda <[email protected]>
1 parent 0830e77 commit a0cb200

11 files changed

+891
-233
lines changed

contracts/TWFactory.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ contract TWFactory is Multicall, ERC2771Context, AccessControlEnumerable, IContr
7575

7676
emit ProxyDeployed(_implementation, deployedProxy, _msgSender());
7777

78-
registry.add(_msgSender(), deployedProxy, block.chainid);
78+
registry.add(_msgSender(), deployedProxy);
7979

8080
if (_data.length > 0) {
8181
// slither-disable-next-line unused-return

contracts/TWMultichainRegistry.sol

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
pragma solidity ^0.8.11;
3+
4+
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
5+
import "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
6+
import "@openzeppelin/contracts/utils/Multicall.sol";
7+
import "@openzeppelin/contracts/metatx/ERC2771Context.sol";
8+
9+
import "./interfaces/ITWMultichainRegistry.sol";
10+
11+
contract TWMultichainRegistry is ITWMultichainRegistry, Multicall, ERC2771Context, AccessControlEnumerable {
12+
bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");
13+
14+
using EnumerableSet for EnumerableSet.AddressSet;
15+
using EnumerableSet for EnumerableSet.UintSet;
16+
17+
/// @dev wallet address => [contract addresses]
18+
mapping(address => mapping(uint256 => EnumerableSet.AddressSet)) private deployments;
19+
/// @dev contract address deployed => imported metadata uri
20+
mapping(uint256 => mapping(address => string)) private addressToMetadataUri;
21+
22+
EnumerableSet.UintSet private chainIds;
23+
24+
constructor(address _trustedForwarder) ERC2771Context(_trustedForwarder) {
25+
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
26+
}
27+
28+
// slither-disable-next-line similar-names
29+
function add(
30+
address _deployer,
31+
address _deployment,
32+
uint256 _chainId,
33+
string memory metadataUri
34+
) external {
35+
require(hasRole(OPERATOR_ROLE, _msgSender()) || _deployer == _msgSender(), "not operator or deployer.");
36+
37+
bool added = deployments[_deployer][_chainId].add(_deployment);
38+
require(added, "failed to add");
39+
40+
chainIds.add(_chainId);
41+
42+
if (bytes(metadataUri).length > 0) {
43+
addressToMetadataUri[_chainId][_deployment] = metadataUri;
44+
}
45+
46+
emit Added(_deployer, _deployment, _chainId, metadataUri);
47+
}
48+
49+
// slither-disable-next-line similar-names
50+
function remove(
51+
address _deployer,
52+
address _deployment,
53+
uint256 _chainId
54+
) external {
55+
require(hasRole(OPERATOR_ROLE, _msgSender()) || _deployer == _msgSender(), "not operator or deployer.");
56+
57+
bool removed = deployments[_deployer][_chainId].remove(_deployment);
58+
require(removed, "failed to remove");
59+
60+
emit Deleted(_deployer, _deployment, _chainId);
61+
}
62+
63+
function getAll(address _deployer) external view returns (Deployment[] memory allDeployments) {
64+
uint256 totalDeployments;
65+
uint256 chainIdsLen = chainIds.length();
66+
67+
for (uint256 i = 0; i < chainIdsLen; i += 1) {
68+
uint256 chainId = chainIds.at(i);
69+
70+
totalDeployments += deployments[_deployer][chainId].length();
71+
}
72+
73+
allDeployments = new Deployment[](totalDeployments);
74+
uint256 idx;
75+
76+
for (uint256 j = 0; j < chainIdsLen; j += 1) {
77+
uint256 chainId = chainIds.at(j);
78+
79+
uint256 len = deployments[_deployer][chainId].length();
80+
address[] memory deploymentAddrs = deployments[_deployer][chainId].values();
81+
82+
for (uint256 k = 0; k < len; k += 1) {
83+
allDeployments[idx] = Deployment({ deploymentAddress: deploymentAddrs[k], chainId: chainId });
84+
idx += 1;
85+
}
86+
}
87+
}
88+
89+
function count(address _deployer) external view returns (uint256 deploymentCount) {
90+
uint256 chainIdsLen = chainIds.length();
91+
92+
for (uint256 i = 0; i < chainIdsLen; i += 1) {
93+
uint256 chainId = chainIds.at(i);
94+
95+
deploymentCount += deployments[_deployer][chainId].length();
96+
}
97+
}
98+
99+
function getMetadataUri(uint256 _chainId, address _deployment) external view returns (string memory metadataUri) {
100+
metadataUri = addressToMetadataUri[_chainId][_deployment];
101+
}
102+
103+
function _msgSender() internal view virtual override(Context, ERC2771Context) returns (address sender) {
104+
return ERC2771Context._msgSender();
105+
}
106+
107+
function _msgData() internal view virtual override(Context, ERC2771Context) returns (bytes calldata) {
108+
return ERC2771Context._msgData();
109+
}
110+
}

contracts/TWRegistry.sol

Lines changed: 14 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -6,87 +6,47 @@ import "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
66
import "@openzeppelin/contracts/utils/Multicall.sol";
77
import "@openzeppelin/contracts/metatx/ERC2771Context.sol";
88

9-
import "./interfaces/ITWRegistry.sol";
10-
11-
contract TWRegistry is ITWRegistry, Multicall, ERC2771Context, AccessControlEnumerable {
9+
contract TWRegistry is Multicall, ERC2771Context, AccessControlEnumerable {
1210
bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");
1311

1412
using EnumerableSet for EnumerableSet.AddressSet;
15-
using EnumerableSet for EnumerableSet.UintSet;
1613

1714
/// @dev wallet address => [contract addresses]
18-
mapping(address => mapping(uint256 => EnumerableSet.AddressSet)) private deployments;
15+
mapping(address => EnumerableSet.AddressSet) private deployments;
1916

20-
EnumerableSet.UintSet private chainIds;
17+
event Added(address indexed deployer, address indexed deployment);
18+
event Deleted(address indexed deployer, address indexed deployment);
2119

2220
constructor(address _trustedForwarder) ERC2771Context(_trustedForwarder) {
2321
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
2422
}
2523

2624
// slither-disable-next-line similar-names
27-
function add(
28-
address _deployer,
29-
address _deployment,
30-
uint256 _chainId
31-
) external {
25+
function add(address _deployer, address _deployment) external {
3226
require(hasRole(OPERATOR_ROLE, _msgSender()) || _deployer == _msgSender(), "not operator or deployer.");
3327

34-
bool added = deployments[_deployer][_chainId].add(_deployment);
28+
bool added = deployments[_deployer].add(_deployment);
3529
require(added, "failed to add");
3630

37-
chainIds.add(_chainId);
38-
39-
emit Added(_deployer, _deployment, _chainId);
31+
emit Added(_deployer, _deployment);
4032
}
4133

4234
// slither-disable-next-line similar-names
43-
function remove(
44-
address _deployer,
45-
address _deployment,
46-
uint256 _chainId
47-
) external {
35+
function remove(address _deployer, address _deployment) external {
4836
require(hasRole(OPERATOR_ROLE, _msgSender()) || _deployer == _msgSender(), "not operator or deployer.");
4937

50-
bool removed = deployments[_deployer][_chainId].remove(_deployment);
38+
bool removed = deployments[_deployer].remove(_deployment);
5139
require(removed, "failed to remove");
5240

53-
emit Deleted(_deployer, _deployment, _chainId);
41+
emit Deleted(_deployer, _deployment);
5442
}
5543

56-
function getAll(address _deployer) external view returns (Deployment[] memory allDeployments) {
57-
uint256 totalDeployments;
58-
uint256 chainIdsLen = chainIds.length();
59-
60-
for (uint256 i = 0; i < chainIdsLen; i += 1) {
61-
uint256 chainId = chainIds.at(i);
62-
63-
totalDeployments += deployments[_deployer][chainId].length();
64-
}
65-
66-
allDeployments = new Deployment[](totalDeployments);
67-
uint256 idx;
68-
69-
for (uint256 j = 0; j < chainIdsLen; j += 1) {
70-
uint256 chainId = chainIds.at(j);
71-
72-
uint256 len = deployments[_deployer][chainId].length();
73-
address[] memory deploymentAddrs = deployments[_deployer][chainId].values();
74-
75-
for (uint256 k = 0; k < len; k += 1) {
76-
allDeployments[idx] = Deployment({ deploymentAddress: deploymentAddrs[k], chainId: chainId });
77-
idx += 1;
78-
}
79-
}
44+
function getAll(address _deployer) external view returns (address[] memory) {
45+
return deployments[_deployer].values();
8046
}
8147

82-
function count(address _deployer) external view returns (uint256 deploymentCount) {
83-
uint256 chainIdsLen = chainIds.length();
84-
85-
for (uint256 i = 0; i < chainIdsLen; i += 1) {
86-
uint256 chainId = chainIds.at(i);
87-
88-
deploymentCount += deployments[_deployer][chainId].length();
89-
}
48+
function count(address _deployer) external view returns (uint256) {
49+
return deployments[_deployer].length();
9050
}
9151

9252
function _msgSender() internal view virtual override(Context, ERC2771Context) returns (address sender) {

contracts/interfaces/IContractMetadataRegistry.sol

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
pragma solidity ^0.8.11;
3+
4+
interface ITWMultichainRegistry {
5+
struct Deployment {
6+
address deploymentAddress;
7+
uint256 chainId;
8+
}
9+
10+
event Added(address indexed deployer, address indexed deployment, uint256 indexed chainId, string metadataUri);
11+
event Deleted(address indexed deployer, address indexed deployment, uint256 indexed chainId);
12+
13+
/// @notice Add a deployment for a deployer.
14+
function add(
15+
address _deployer,
16+
address _deployment,
17+
uint256 _chainId,
18+
string memory metadataUri
19+
) external;
20+
21+
/// @notice Remove a deployment for a deployer.
22+
function remove(
23+
address _deployer,
24+
address _deployment,
25+
uint256 _chainId
26+
) external;
27+
28+
/// @notice Get all deployments for a deployer.
29+
function getAll(address _deployer) external view returns (Deployment[] memory allDeployments);
30+
31+
/// @notice Get the total number of deployments for a deployer.
32+
function count(address _deployer) external view returns (uint256 deploymentCount);
33+
34+
/// @notice Returns the metadata IPFS URI for a deployment on a given chain if previously registered via add().
35+
function getMetadataUri(uint256 _chainId, address _deployment) external view returns (string memory metadataUri);
36+
}

docs/IContractMetadataRegistry.md

Lines changed: 0 additions & 52 deletions
This file was deleted.

0 commit comments

Comments
 (0)