@@ -14,12 +14,10 @@ library BatchMetadataStorage {
14
14
keccak256 (abi.encode (uint256 (keccak256 ("token.metadata.batch " )) - 1 )) & ~ bytes32 (uint256 (0xff ));
15
15
16
16
struct Data {
17
- // tokenId range end
18
- uint256 [] tokenIdRangeEnd;
19
17
// next tokenId as range start
20
18
uint256 nextTokenIdRangeStart;
21
- // tokenId range end => baseURI of range
22
- mapping ( uint256 => string ) baseURIOfTokenIdRange ;
19
+ // metadata batches
20
+ BatchMetadataERC721.MetadataBatch[] metadataBatches ;
23
21
}
24
22
25
23
function data () internal pure returns (Data storage data_ ) {
@@ -42,7 +40,7 @@ contract BatchMetadataERC721 is Module, UpdateMetadataCallbackERC721 {
42
40
/**
43
41
* @notice MetadataBatch struct to store metadata for a range of tokenIds.
44
42
* @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.
46
44
* @param baseURI The base URI for the range.
47
45
*/
48
46
struct MetadataBatch {
@@ -69,7 +67,7 @@ contract BatchMetadataERC721 is Module, UpdateMetadataCallbackERC721 {
69
67
//////////////////////////////////////////////////////////////*/
70
68
71
69
/// @dev ERC-4906 Metadata Update.
72
- event BatchMetadataUpdate (uint256 _fromTokenId , uint256 _toTokenId );
70
+ event BatchMetadataUpdate (uint256 startTokenIdIncluside , uint256 endTokenIdInclusive , string baseURI );
73
71
74
72
/*//////////////////////////////////////////////////////////////
75
73
MODULE CONFIG
@@ -89,9 +87,9 @@ contract BatchMetadataERC721 is Module, UpdateMetadataCallbackERC721 {
89
87
FallbackFunction ({selector: this .setBaseURI.selector , permissionBits: Role._MANAGER_ROLE});
90
88
config.fallbackFunctions[2 ] =
91
89
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 });
95
93
96
94
config.requiredInterfaces = new bytes4 [](1 );
97
95
config.requiredInterfaces[0 ] = 0x80ac58cd ; // ERC721.
@@ -121,7 +119,7 @@ contract BatchMetadataERC721 is Module, UpdateMetadataCallbackERC721 {
121
119
if (_startTokenId < _batchMetadataStorage ().nextTokenIdRangeStart) {
122
120
revert BatchMetadataMetadataAlreadySet ();
123
121
}
124
- _setMetadata (_quantity, _baseURI);
122
+ _setMetadata (_startTokenId, _quantity, _baseURI);
125
123
}
126
124
127
125
/*//////////////////////////////////////////////////////////////
@@ -130,71 +128,42 @@ contract BatchMetadataERC721 is Module, UpdateMetadataCallbackERC721 {
130
128
131
129
/// @notice Returns all metadata batches for a token.
132
130
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
+ }
147
133
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];
149
137
}
150
138
151
139
/// @notice Uploads metadata for a range of tokenIds.
152
140
function uploadMetadata (uint256 _amount , string calldata _baseURI ) external virtual {
153
- _setMetadata (_amount, _baseURI);
141
+ _setMetadata (_batchMetadataStorage ().nextTokenIdRangeStart, _amount, _baseURI);
154
142
}
155
143
156
144
function nextTokenIdToMint () external view returns (uint256 ) {
157
145
return _batchMetadataStorage ().nextTokenIdRangeStart;
158
146
}
159
147
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 ;
180
152
181
153
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;
187
156
}
188
157
}
189
-
190
158
revert BatchMetadataNoMetadataForTokenId ();
191
159
}
192
160
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);
198
167
}
199
168
200
169
/*//////////////////////////////////////////////////////////////
@@ -203,35 +172,34 @@ contract BatchMetadataERC721 is Module, UpdateMetadataCallbackERC721 {
203
172
204
173
/// @dev Returns the baseURI for a token. The intended metadata URI for the token is baseURI + indexInBatch.
205
174
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 ;
208
177
209
178
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);
216
181
}
217
182
}
218
183
revert BatchMetadataNoMetadataForTokenId ();
219
184
}
220
185
221
186
/// @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 {
223
188
if (_amount == 0 ) {
224
189
revert BatchMetadataZeroAmount ();
225
190
}
226
191
227
- uint256 rangeStart = _batchMetadataStorage ().nextTokenIdRangeStart;
228
- uint256 rangeEndNonInclusive = rangeStart + _amount;
192
+ uint256 rangeEndNonInclusive = _rangeStart + _amount;
229
193
194
+ MetadataBatch memory batch = MetadataBatch ({
195
+ startTokenIdInclusive: _rangeStart,
196
+ endTokenIdInclusive: rangeEndNonInclusive - 1 ,
197
+ baseURI: _baseURI
198
+ });
199
+ _batchMetadataStorage ().metadataBatches.push (batch);
230
200
_batchMetadataStorage ().nextTokenIdRangeStart = rangeEndNonInclusive;
231
- _batchMetadataStorage ().tokenIdRangeEnd.push (rangeEndNonInclusive);
232
- _batchMetadataStorage ().baseURIOfTokenIdRange[rangeEndNonInclusive] = _baseURI;
233
201
234
- emit BatchMetadataUpdate (rangeStart , rangeEndNonInclusive - 1 );
202
+ emit BatchMetadataUpdate (_rangeStart , rangeEndNonInclusive - 1 , _baseURI );
235
203
}
236
204
237
205
function _batchMetadataStorage () internal pure returns (BatchMetadataStorage.Data storage ) {
0 commit comments