@@ -14,12 +14,10 @@ library BatchMetadataStorage {
1414 keccak256 (abi.encode (uint256 (keccak256 ("token.metadata.batch " )) - 1 )) & ~ bytes32 (uint256 (0xff ));
1515
1616 struct Data {
17- // tokenId range end
18- uint256 [] tokenIdRangeEnd;
1917 // next tokenId as range start
2018 uint256 nextTokenIdRangeStart;
21- // tokenId range end => baseURI of range
22- mapping ( uint256 => string ) baseURIOfTokenIdRange ;
19+ // metadata batches
20+ BatchMetadataERC721.MetadataBatch[] metadataBatches ;
2321 }
2422
2523 function data () internal pure returns (Data storage data_ ) {
@@ -42,7 +40,7 @@ contract BatchMetadataERC721 is Module, UpdateMetadataCallbackERC721 {
4240 /**
4341 * @notice MetadataBatch struct to store metadata for a range of tokenIds.
4442 * @param startTokenIdInclusive The first tokenId in the range.
45- * @param endTokenIdNonInclusive The last tokenId in the range.
43+ * @param endTokenIdInclusive The last tokenId in the range.
4644 * @param baseURI The base URI for the range.
4745 */
4846 struct MetadataBatch {
@@ -69,7 +67,7 @@ contract BatchMetadataERC721 is Module, UpdateMetadataCallbackERC721 {
6967 //////////////////////////////////////////////////////////////*/
7068
7169 /// @dev ERC-4906 Metadata Update.
72- event BatchMetadataUpdate (uint256 _fromTokenId , uint256 _toTokenId );
70+ event BatchMetadataUpdate (uint256 startTokenIdIncluside , uint256 endTokenIdInclusive , string baseURI );
7371
7472 /*//////////////////////////////////////////////////////////////
7573 MODULE CONFIG
@@ -89,9 +87,9 @@ contract BatchMetadataERC721 is Module, UpdateMetadataCallbackERC721 {
8987 FallbackFunction ({selector: this .setBaseURI.selector , permissionBits: Role._MANAGER_ROLE});
9088 config.fallbackFunctions[2 ] =
9189 FallbackFunction ({selector: this .getAllMetadataBatches.selector , permissionBits: 0 });
92- config.fallbackFunctions[3 ] = FallbackFunction ({selector: this .nextTokenIdToMint .selector , permissionBits: 0 });
93- config.fallbackFunctions[4 ] = FallbackFunction ({selector: this .getBatchId .selector , permissionBits: 0 });
94- config.fallbackFunctions[5 ] = FallbackFunction ({selector: this .getBatchRange .selector , permissionBits: 0 });
90+ config.fallbackFunctions[3 ] = FallbackFunction ({selector: this .getMetadataBatch .selector , permissionBits: 0 });
91+ config.fallbackFunctions[4 ] = FallbackFunction ({selector: this .nextTokenIdToMint .selector , permissionBits: 0 });
92+ config.fallbackFunctions[5 ] = FallbackFunction ({selector: this .getBatchIndex .selector , permissionBits: 0 });
9593
9694 config.requiredInterfaces = new bytes4 [](1 );
9795 config.requiredInterfaces[0 ] = 0x80ac58cd ; // ERC721.
@@ -121,7 +119,7 @@ contract BatchMetadataERC721 is Module, UpdateMetadataCallbackERC721 {
121119 if (_startTokenId < _batchMetadataStorage ().nextTokenIdRangeStart) {
122120 revert BatchMetadataMetadataAlreadySet ();
123121 }
124- _setMetadata (_quantity, _baseURI);
122+ _setMetadata (_startTokenId, _quantity, _baseURI);
125123 }
126124
127125 /*//////////////////////////////////////////////////////////////
@@ -130,71 +128,42 @@ contract BatchMetadataERC721 is Module, UpdateMetadataCallbackERC721 {
130128
131129 /// @notice Returns all metadata batches for a token.
132130 function getAllMetadataBatches () external view returns (MetadataBatch[] memory ) {
133- uint256 [] memory rangeEnds = _batchMetadataStorage ().tokenIdRangeEnd;
134- uint256 numOfBatches = rangeEnds.length ;
135-
136- MetadataBatch[] memory batches = new MetadataBatch [](rangeEnds.length );
137-
138- uint256 rangeStart = 0 ;
139- for (uint256 i = 0 ; i < numOfBatches; i += 1 ) {
140- batches[i] = MetadataBatch ({
141- startTokenIdInclusive: rangeStart,
142- endTokenIdInclusive: rangeEnds[i] - 1 ,
143- baseURI: _batchMetadataStorage ().baseURIOfTokenIdRange[rangeEnds[i]]
144- });
145- rangeStart = rangeEnds[i];
146- }
131+ return _batchMetadataStorage ().metadataBatches;
132+ }
147133
148- return batches;
134+ /// @dev returns the metadata batch for a given batchIndex
135+ function getMetadataBatch (uint256 _batchIndex ) public view returns (MetadataBatch memory ) {
136+ return _batchMetadataStorage ().metadataBatches[_batchIndex];
149137 }
150138
151139 /// @notice Uploads metadata for a range of tokenIds.
152140 function uploadMetadata (uint256 _amount , string calldata _baseURI ) external virtual {
153- _setMetadata (_amount, _baseURI);
141+ _setMetadata (_batchMetadataStorage ().nextTokenIdRangeStart, _amount, _baseURI);
154142 }
155143
156144 function nextTokenIdToMint () external view returns (uint256 ) {
157145 return _batchMetadataStorage ().nextTokenIdRangeStart;
158146 }
159147
160- /// @dev Returns the id for the batch of tokens the given tokenId belongs to.
161- function getBatchId (uint256 _tokenId ) public view virtual returns (uint256 batchId , uint256 index ) {
162- uint256 [] memory rangeEnds = _batchMetadataStorage ().tokenIdRangeEnd;
163- uint256 numOfBatches = rangeEnds.length ;
164-
165- for (uint256 i = 0 ; i < numOfBatches; i += 1 ) {
166- if (_tokenId < rangeEnds[i]) {
167- index = i;
168- batchId = rangeEnds[i];
169-
170- return (batchId, index);
171- }
172- }
173- revert BatchMetadataNoMetadataForTokenId ();
174- }
175-
176- /// @dev returns the starting tokenId of a given batchId.
177- function getBatchRange (uint256 _batchID ) public view returns (uint256 , uint256 ) {
178- uint256 [] memory rangeEnds = _batchMetadataStorage ().tokenIdRangeEnd;
179- uint256 numOfBatches = rangeEnds.length ;
148+ /// @dev Returns the index for the batch of tokens the given tokenId belongs to.
149+ function getBatchIndex (uint256 _tokenId ) public view virtual returns (uint256 ) {
150+ MetadataBatch[] memory batches = _batchMetadataStorage ().metadataBatches;
151+ uint256 numOfBatches = batches.length ;
180152
181153 for (uint256 i = 0 ; i < numOfBatches; i += 1 ) {
182- if (_batchID == rangeEnds[i]) {
183- if (i > 0 ) {
184- return (rangeEnds[i - 1 ], rangeEnds[i] - 1 );
185- }
186- return (0 , rangeEnds[i] - 1 );
154+ if (_tokenId >= batches[i].startTokenIdInclusive && _tokenId <= batches[i].endTokenIdInclusive) {
155+ return i;
187156 }
188157 }
189-
190158 revert BatchMetadataNoMetadataForTokenId ();
191159 }
192160
193- /// @dev Sets the base URI for the batch of tokens with the given batchId.
194- function setBaseURI (uint256 _batchId , string memory _baseURI ) external virtual {
195- _batchMetadataStorage ().baseURIOfTokenIdRange[_batchId] = _baseURI;
196- (uint256 startTokenId ,) = getBatchRange (_batchId);
197- emit BatchMetadataUpdate (startTokenId, _batchId);
161+ /// @dev Sets the base URI for the batch based on the batchIndex.
162+ function setBaseURI (uint256 _batchIndex , string memory _baseURI ) external virtual {
163+ MetadataBatch memory batch = _batchMetadataStorage ().metadataBatches[_batchIndex];
164+ batch.baseURI = _baseURI;
165+ _batchMetadataStorage ().metadataBatches[_batchIndex] = batch;
166+ emit BatchMetadataUpdate (batch.startTokenIdInclusive, batch.endTokenIdInclusive, batch.baseURI);
198167 }
199168
200169 /*//////////////////////////////////////////////////////////////
@@ -203,35 +172,34 @@ contract BatchMetadataERC721 is Module, UpdateMetadataCallbackERC721 {
203172
204173 /// @dev Returns the baseURI for a token. The intended metadata URI for the token is baseURI + indexInBatch.
205174 function _getBaseURI (uint256 _tokenId ) internal view returns (string memory baseUri , uint256 indexInBatch ) {
206- uint256 [] memory rangeEnds = _batchMetadataStorage ().tokenIdRangeEnd ;
207- uint256 numOfBatches = rangeEnds .length ;
175+ BatchMetadataERC721.MetadataBatch [] memory batches = _batchMetadataStorage ().metadataBatches ;
176+ uint256 numOfBatches = batches .length ;
208177
209178 for (uint256 i = 0 ; i < numOfBatches; i += 1 ) {
210- if (_tokenId < rangeEnds[i]) {
211- uint256 rangeStart = 0 ;
212- if (i > 0 ) {
213- rangeStart = rangeEnds[i - 1 ];
214- }
215- return (_batchMetadataStorage ().baseURIOfTokenIdRange[rangeEnds[i]], _tokenId - rangeStart);
179+ if (_tokenId >= batches[i].startTokenIdInclusive && _tokenId <= batches[i].endTokenIdInclusive) {
180+ return (batches[i].baseURI, _tokenId - batches[i].startTokenIdInclusive);
216181 }
217182 }
218183 revert BatchMetadataNoMetadataForTokenId ();
219184 }
220185
221186 /// @notice sets the metadata for a range of tokenIds.
222- function _setMetadata (uint256 _amount , string calldata _baseURI ) internal virtual {
187+ function _setMetadata (uint256 _rangeStart , uint256 _amount , string calldata _baseURI ) internal virtual {
223188 if (_amount == 0 ) {
224189 revert BatchMetadataZeroAmount ();
225190 }
226191
227- uint256 rangeStart = _batchMetadataStorage ().nextTokenIdRangeStart;
228- uint256 rangeEndNonInclusive = rangeStart + _amount;
192+ uint256 rangeEndNonInclusive = _rangeStart + _amount;
229193
194+ MetadataBatch memory batch = MetadataBatch ({
195+ startTokenIdInclusive: _rangeStart,
196+ endTokenIdInclusive: rangeEndNonInclusive - 1 ,
197+ baseURI: _baseURI
198+ });
199+ _batchMetadataStorage ().metadataBatches.push (batch);
230200 _batchMetadataStorage ().nextTokenIdRangeStart = rangeEndNonInclusive;
231- _batchMetadataStorage ().tokenIdRangeEnd.push (rangeEndNonInclusive);
232- _batchMetadataStorage ().baseURIOfTokenIdRange[rangeEndNonInclusive] = _baseURI;
233201
234- emit BatchMetadataUpdate (rangeStart , rangeEndNonInclusive - 1 );
202+ emit BatchMetadataUpdate (_rangeStart , rangeEndNonInclusive - 1 , _baseURI );
235203 }
236204
237205 function _batchMetadataStorage () internal pure returns (BatchMetadataStorage.Data storage ) {
0 commit comments