@@ -19,6 +19,7 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE
1919
2020 /// @notice Whether the contract publisher is paused.
2121 bool public isPaused;
22+ IContractPublisher public prevPublisher;
2223
2324 /*///////////////////////////////////////////////////////////////
2425 Mappings
@@ -49,8 +50,9 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE
4950 _;
5051 }
5152
52- constructor (address _trustedForwarder ) ERC2771Context (_trustedForwarder) {
53+ constructor (address _trustedForwarder , IContractPublisher _prevPublisher ) ERC2771Context (_trustedForwarder) {
5354 _setupRole (DEFAULT_ADMIN_ROLE, _msgSender ());
55+ prevPublisher = _prevPublisher;
5456 }
5557
5658 /*///////////////////////////////////////////////////////////////
@@ -63,13 +65,19 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE
6365 view
6466 returns (CustomContractInstance[] memory published )
6567 {
66- uint256 total = EnumerableSet.length (contractsOfPublisher[_publisher].contractIds);
67-
68+ CustomContractInstance[] memory linkedData = prevPublisher.getAllPublishedContracts (_publisher);
69+ uint256 currentTotal = EnumerableSet.length (contractsOfPublisher[_publisher].contractIds);
70+ uint256 prevTotal = linkedData.length ;
71+ uint256 total = prevTotal + currentTotal;
6872 published = new CustomContractInstance [](total);
69-
70- for (uint256 i = 0 ; i < total; i += 1 ) {
73+ // fill in previously published contracts
74+ for (uint256 i = 0 ; i < prevTotal; i += 1 ) {
75+ published[i] = linkedData[i];
76+ }
77+ // fill in current published contracts
78+ for (uint256 i = 0 ; i < currentTotal; i += 1 ) {
7179 bytes32 contractId = EnumerableSet.at (contractsOfPublisher[_publisher].contractIds, i);
72- published[i] = contractsOfPublisher[_publisher].contracts[contractId].latest;
80+ published[i + prevTotal ] = contractsOfPublisher[_publisher].contracts[contractId].latest;
7381 }
7482 }
7583
@@ -79,13 +87,25 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE
7987 view
8088 returns (CustomContractInstance[] memory published )
8189 {
90+ CustomContractInstance[] memory linkedVersions = prevPublisher.getPublishedContractVersions (
91+ _publisher,
92+ _contractId
93+ );
94+ uint256 prevTotal = linkedVersions.length ;
95+
8296 bytes32 id = keccak256 (bytes (_contractId));
83- uint256 total = contractsOfPublisher[_publisher].contracts[id].total;
97+ uint256 currentTotal = contractsOfPublisher[_publisher].contracts[id].total;
98+ uint256 total = prevTotal + currentTotal;
8499
85100 published = new CustomContractInstance [](total);
86101
87- for (uint256 i = 0 ; i < total; i += 1 ) {
88- published[i] = contractsOfPublisher[_publisher].contracts[id].instances[i];
102+ // fill in previously published contracts
103+ for (uint256 i = 0 ; i < prevTotal; i += 1 ) {
104+ published[i] = linkedVersions[i];
105+ }
106+ // fill in current published contracts
107+ for (uint256 i = 0 ; i < currentTotal; i += 1 ) {
108+ published[i + prevTotal] = contractsOfPublisher[_publisher].contracts[id].instances[i];
89109 }
90110 }
91111
@@ -96,6 +116,10 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE
96116 returns (CustomContractInstance memory published )
97117 {
98118 published = contractsOfPublisher[_publisher].contracts[keccak256 (bytes (_contractId))].latest;
119+ // if not found, check the previous publisher
120+ if (published.publishTimestamp == 0 ) {
121+ published = prevPublisher.getPublishedContract (_publisher, _contractId);
122+ }
99123 }
100124
101125 /*///////////////////////////////////////////////////////////////
@@ -129,7 +153,7 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE
129153 contractsOfPublisher[_publisher].contracts[contractIdInBytes].instances[index] = publishedContract;
130154
131155 uint256 metadataIndex = compilerMetadataUriToPublishedMetadataUris[_compilerMetadataUri].index;
132- compilerMetadataUriToPublishedMetadataUris[_compilerMetadataUri].uris[index ] = _publishMetadataUri;
156+ compilerMetadataUriToPublishedMetadataUris[_compilerMetadataUri].uris[metadataIndex ] = _publishMetadataUri;
133157 compilerMetadataUriToPublishedMetadataUris[_compilerMetadataUri].index = metadataIndex + 1 ;
134158
135159 emit ContractPublished (_msgSender (), _publisher, publishedContract);
@@ -159,6 +183,10 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE
159183 // @notice Get a publisher profile uri
160184 function getPublisherProfileUri (address publisher ) public view returns (string memory uri ) {
161185 uri = profileUriOfPublisher[publisher];
186+ // if not found, check the previous publisher
187+ if (bytes (uri).length == 0 ) {
188+ uri = prevPublisher.getPublisherProfileUri (publisher);
189+ }
162190 }
163191
164192 /// @notice Retrieve the published metadata URI from a compiler metadata URI
@@ -167,10 +195,20 @@ contract ContractPublisher is IContractPublisher, ERC2771Context, AccessControlE
167195 view
168196 returns (string [] memory publishedMetadataUris )
169197 {
170- uint256 length = compilerMetadataUriToPublishedMetadataUris[compilerMetadataUri].index;
171- publishedMetadataUris = new string [](length);
172- for (uint256 i = 0 ; i < length; i += 1 ) {
173- publishedMetadataUris[i] = compilerMetadataUriToPublishedMetadataUris[compilerMetadataUri].uris[i];
198+ string [] memory linkedUris = prevPublisher.getPublishedUriFromCompilerUri (compilerMetadataUri);
199+ uint256 prevTotal = linkedUris.length ;
200+ uint256 currentTotal = compilerMetadataUriToPublishedMetadataUris[compilerMetadataUri].index;
201+ uint256 total = prevTotal + currentTotal;
202+ publishedMetadataUris = new string [](total);
203+ // fill in previously published uris
204+ for (uint256 i = 0 ; i < prevTotal; i += 1 ) {
205+ publishedMetadataUris[i] = linkedUris[i];
206+ }
207+ // fill in current published uris
208+ for (uint256 i = 0 ; i < currentTotal; i += 1 ) {
209+ publishedMetadataUris[i + prevTotal] = compilerMetadataUriToPublishedMetadataUris[compilerMetadataUri].uris[
210+ i
211+ ];
174212 }
175213 }
176214
0 commit comments