11// SPDX-License-Identifier: MIT
22pragma solidity ^ 0.8.28 ;
33
4- import {ISuccinctTitanGPU } from "../interfaces/ISuccinctTitanGPU .sol " ;
4+ import {ISuccinctTitan1GPU } from "../interfaces/ISuccinctTitan1GPU .sol " ;
55import {Initializable} from
66 "../../lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol " ;
77import {OwnableUpgradeable} from
@@ -29,7 +29,7 @@ string constant SYMBOL = "Titan1GPU";
2929/// @title Succinct Titan 1 GPU
3030/// @author Succinct Labs
3131contract SuccinctTitan1GPU is
32- ISuccinctTitanGPU ,
32+ ISuccinctTitan1GPU ,
3333 Initializable ,
3434 OwnableUpgradeable ,
3535 ERC721Upgradeable ,
@@ -44,28 +44,28 @@ contract SuccinctTitan1GPU is
4444 STORAGE
4545 //////////////////////////////////////////////////////////////*/
4646
47- /// @inheritdoc ISuccinctTitanGPU
47+ /// @inheritdoc ISuccinctTitan1GPU
4848 address public override usdc;
4949
50- /// @inheritdoc ISuccinctTitanGPU
50+ /// @inheritdoc ISuccinctTitan1GPU
5151 uint256 public override mintPrice;
5252
53- /// @inheritdoc ISuccinctTitanGPU
53+ /// @inheritdoc ISuccinctTitan1GPU
5454 uint256 public override initialSupply;
5555
56- /// @inheritdoc ISuccinctTitanGPU
56+ /// @inheritdoc ISuccinctTitan1GPU
5757 uint256 public override totalSupply;
5858
59- /// @inheritdoc ISuccinctTitanGPU
59+ /// @inheritdoc ISuccinctTitan1GPU
6060 Stage public override currentStage;
6161
62- /// @inheritdoc ISuccinctTitanGPU
62+ /// @inheritdoc ISuccinctTitan1GPU
6363 string public override baseURI;
6464
65- /// @inheritdoc ISuccinctTitanGPU
65+ /// @inheritdoc ISuccinctTitan1GPU
6666 mapping (address => uint256 ) public override stage1Allocation;
6767
68- /// @inheritdoc ISuccinctTitanGPU
68+ /// @inheritdoc ISuccinctTitan1GPU
6969 mapping (address => uint256 ) public override stage1Minted;
7070
7171 /// @dev Reserved storage gap for future upgrades.
@@ -121,11 +121,11 @@ contract SuccinctTitan1GPU is
121121 return baseURI;
122122 }
123123
124- /// @inheritdoc ISuccinctTitanGPU
124+ /// @inheritdoc ISuccinctTitan1GPU
125125 function tokenURI (uint256 _tokenId )
126126 public
127127 view
128- override (ERC721Upgradeable , ISuccinctTitanGPU )
128+ override (ERC721Upgradeable , ISuccinctTitan1GPU )
129129 returns (string memory )
130130 {
131131 return string (abi.encodePacked (baseURI, _tokenId.toString ()));
@@ -135,15 +135,15 @@ contract SuccinctTitan1GPU is
135135 CORE
136136 //////////////////////////////////////////////////////////////*/
137137
138- /// @inheritdoc ISuccinctTitanGPU
138+ /// @inheritdoc ISuccinctTitan1GPU
139139 function stage1Mint (uint256 _amount ) external override nonReentrant whenNotPaused {
140140 // Transfer funds for all of the tokens being minted.
141141 IERC20 (usdc).safeTransferFrom (msg .sender , address (this ), mintPrice * _amount);
142142
143143 _stage1Mint (msg .sender , _amount);
144144 }
145145
146- /// @inheritdoc ISuccinctTitanGPU
146+ /// @inheritdoc ISuccinctTitan1GPU
147147 function permitAndStage1Mint (
148148 uint256 _amount ,
149149 uint256 _deadline ,
@@ -159,15 +159,15 @@ contract SuccinctTitan1GPU is
159159 _stage1Mint (msg .sender , _amount);
160160 }
161161
162- /// @inheritdoc ISuccinctTitanGPU
162+ /// @inheritdoc ISuccinctTitan1GPU
163163 function stage2Mint () external override nonReentrant whenNotPaused {
164164 // Transfer funds for the token being minted.
165165 IERC20 (usdc).safeTransferFrom (msg .sender , address (this ), mintPrice);
166166
167167 _stage2Mint (msg .sender );
168168 }
169169
170- /// @inheritdoc ISuccinctTitanGPU
170+ /// @inheritdoc ISuccinctTitan1GPU
171171 function permitAndStage2Mint (uint256 _deadline , uint8 _v , bytes32 _r , bytes32 _s )
172172 external
173173 override
@@ -184,7 +184,7 @@ contract SuccinctTitan1GPU is
184184 AUTHORIZED
185185 //////////////////////////////////////////////////////////////*/
186186
187- /// @inheritdoc ISuccinctTitanGPU
187+ /// @inheritdoc ISuccinctTitan1GPU
188188 function setStage1Allocation (address _minter , uint256 _allocation )
189189 external
190190 override
@@ -195,10 +195,35 @@ contract SuccinctTitan1GPU is
195195
196196 stage1Allocation[_minter] = _allocation;
197197
198- emit ISuccinctTitanGPU. Stage1AllocationUpdate (_minter, _allocation);
198+ emit Stage1AllocationUpdate (_minter, _allocation);
199199 }
200200
201- /// @inheritdoc ISuccinctTitanGPU
201+ /// @inheritdoc ISuccinctTitan1GPU
202+ function setStage1AllocationsBatch (address [] calldata _minters , uint256 [] calldata _allocations )
203+ external
204+ override
205+ onlyOwner
206+ {
207+ if (currentStage != Stage.NONE) revert StageAlreadyStarted ();
208+ if (_minters.length != _allocations.length ) revert ArrayLengthMismatch ();
209+
210+ for (uint256 i = 0 ; i < _minters.length ;) {
211+ address minter = _minters[i];
212+ uint256 allocation = _allocations[i];
213+
214+ if (minter == address (0 )) revert ZeroAddress ();
215+
216+ stage1Allocation[minter] = allocation;
217+
218+ emit Stage1AllocationUpdate (minter, allocation);
219+
220+ unchecked {
221+ ++ i;
222+ }
223+ }
224+ }
225+
226+ /// @inheritdoc ISuccinctTitan1GPU
202227 function beginStage1 () external override onlyOwner whenPaused {
203228 if (currentStage != Stage.NONE) revert StageAlreadyStarted ();
204229
@@ -207,21 +232,21 @@ contract SuccinctTitan1GPU is
207232 _unpause ();
208233 }
209234
210- /// @inheritdoc ISuccinctTitanGPU
235+ /// @inheritdoc ISuccinctTitan1GPU
211236 function beginStage2 () external override onlyOwner {
212237 if (currentStage != Stage.STAGE1) revert StageNotStarted ();
213238
214239 emit StageAdvance (currentStage, Stage.STAGE2);
215240 currentStage = Stage.STAGE2;
216241 }
217242
218- /// @inheritdoc ISuccinctTitanGPU
243+ /// @inheritdoc ISuccinctTitan1GPU
219244 function setBaseURI (string calldata _newBaseURI ) external override onlyOwner {
220245 emit BaseURIUpdate (baseURI, _newBaseURI);
221246 baseURI = _newBaseURI;
222247 }
223248
224- /// @inheritdoc ISuccinctTitanGPU
249+ /// @inheritdoc ISuccinctTitan1GPU
225250 function withdraw (address _to , uint256 _amount ) external override onlyOwner {
226251 if (_to == address (0 )) revert ZeroAddress ();
227252 if (_amount == 0 ) revert ZeroAmount ();
@@ -233,12 +258,12 @@ contract SuccinctTitan1GPU is
233258 IERC20 (usdc).safeTransfer (_to, _amount);
234259 }
235260
236- /// @inheritdoc ISuccinctTitanGPU
261+ /// @inheritdoc ISuccinctTitan1GPU
237262 function pause () external override onlyOwner whenNotPaused {
238263 _pause ();
239264 }
240265
241- /// @inheritdoc ISuccinctTitanGPU
266+ /// @inheritdoc ISuccinctTitan1GPU
242267 function unpause () external override onlyOwner whenPaused {
243268 _unpause ();
244269 }
@@ -258,7 +283,7 @@ contract SuccinctTitan1GPU is
258283 uint256 alreadyMinted = stage1Minted[_minter];
259284 if (alreadyMinted + _amount > allocation) revert ExceedsAllocation ();
260285
261- // Supply check (prevents overshoot) .
286+ // Supply check.
262287 if (totalSupply + _amount > initialSupply) revert SoldOut ();
263288
264289 // Mint `_amount` tokens to minter.
@@ -280,7 +305,6 @@ contract SuccinctTitan1GPU is
280305
281306 /// @dev Mint `_amount` tokens to `_to` for `_stage`.
282307 function _mintLoop (address _to , uint256 _amount , Stage _stage ) internal {
283- // unchecked loop index increment for gas; bounds guarded by supply checks.
284308 for (uint256 i = 0 ; i < _amount;) {
285309 uint256 tokenId = totalSupply;
286310 _safeMint (_to, tokenId);
@@ -291,7 +315,7 @@ contract SuccinctTitan1GPU is
291315 emit Mint (_to, tokenId, _stage);
292316 }
293317
294- // Auto-pause when cap reached.
318+ // Pause when cap reached.
295319 if (totalSupply == initialSupply && ! paused ()) {
296320 _pause ();
297321 }
0 commit comments