Skip to content

Commit d202367

Browse files
committed
review fix
1 parent 0e570d5 commit d202367

File tree

4 files changed

+198
-85
lines changed

4 files changed

+198
-85
lines changed

contracts/.gas-snapshot

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -200,43 +200,47 @@ SuccinctStakingUnstakeTests:test_Unstake_WhenTwoStakersOneProverReward() (gas: 1
200200
SuccinctStakingUnstakeTests:test_Unstake_WhenTwoStakersTwoProversDispenseOnly() (gas: 1052844)
201201
SuccinctStakingUnstakeTests:test_Unstake_WhenValid() (gas: 654142)
202202
SuccinctTitan1GPUTest:test_RevertBeginStage1_StageAlreadyStarted() (gas: 51741)
203-
SuccinctTitan1GPUTest:test_RevertBeginStage2_StageNotStarted() (gas: 20333)
204-
SuccinctTitan1GPUTest:test_RevertMint_WhenPaused() (gas: 85858)
205-
SuccinctTitan1GPUTest:test_RevertNonOwner_beginStage1() (gas: 18735)
206-
SuccinctTitan1GPUTest:test_RevertNonOwner_beginStage2() (gas: 18648)
207-
SuccinctTitan1GPUTest:test_RevertNonOwner_setBaseURI() (gas: 18942)
208-
SuccinctTitan1GPUTest:test_RevertNonOwner_setStage1Allocation() (gas: 21014)
203+
SuccinctTitan1GPUTest:test_RevertBeginStage2_StageNotStarted() (gas: 20200)
204+
SuccinctTitan1GPUTest:test_RevertMint_WhenPaused() (gas: 85880)
205+
SuccinctTitan1GPUTest:test_RevertNonOwner_beginStage1() (gas: 18757)
206+
SuccinctTitan1GPUTest:test_RevertNonOwner_beginStage2() (gas: 18670)
207+
SuccinctTitan1GPUTest:test_RevertNonOwner_setBaseURI() (gas: 18964)
208+
SuccinctTitan1GPUTest:test_RevertNonOwner_setStage1Allocation() (gas: 21036)
209209
SuccinctTitan1GPUTest:test_RevertNonOwner_withdraw() (gas: 19101)
210210
SuccinctTitan1GPUTest:test_RevertPermitAndStage1Mint_WhenDeadlineExpired() (gas: 117777)
211-
SuccinctTitan1GPUTest:test_RevertSetStage1Allocation_StageAlreadyStarted() (gas: 48211)
211+
SuccinctTitan1GPUTest:test_RevertSetStage1Allocation_StageAlreadyStarted() (gas: 48233)
212212
SuccinctTitan1GPUTest:test_RevertSetStage1Allocation_ZeroAddress() (gas: 20585)
213+
SuccinctTitan1GPUTest:test_RevertSetStage1AllocationsBatch_ArrayLengthMismatch() (gas: 26467)
214+
SuccinctTitan1GPUTest:test_RevertSetStage1AllocationsBatch_StageAlreadyStarted() (gas: 49373)
215+
SuccinctTitan1GPUTest:test_RevertSetStage1AllocationsBatch_ZeroAddress() (gas: 48572)
213216
SuccinctTitan1GPUTest:test_RevertStage1Mint_ExceedsAllocation() (gas: 147715)
214217
SuccinctTitan1GPUTest:test_RevertStage1Mint_NoAllocation() (gas: 121276)
215-
SuccinctTitan1GPUTest:test_RevertStage1Mint_SoldOut() (gas: 2795979)
216-
SuccinctTitan1GPUTest:test_RevertStage1Mint_Stage1Only() (gas: 122814)
217-
SuccinctTitan1GPUTest:test_RevertStage1Mint_ZeroAmount() (gas: 70667)
218-
SuccinctTitan1GPUTest:test_RevertStage2Mint_Stage2Only() (gas: 118930)
219-
SuccinctTitan1GPUTest:test_RevertTransferFrom_TokenIsSoulbound() (gas: 224108)
220-
SuccinctTitan1GPUTest:test_RevertWithdraw_InvalidPayment() (gas: 28245)
221-
SuccinctTitan1GPUTest:test_RevertWithdraw_ZeroAddress() (gas: 18494)
222-
SuccinctTitan1GPUTest:test_RevertWithdraw_ZeroAmount() (gas: 20604)
223-
SuccinctTitan1GPUTest:test_autoPauseWhenSoldOut() (gas: 2917054)
218+
SuccinctTitan1GPUTest:test_RevertStage1Mint_SoldOut() (gas: 2905874)
219+
SuccinctTitan1GPUTest:test_RevertStage1Mint_Stage1Only() (gas: 122836)
220+
SuccinctTitan1GPUTest:test_RevertStage1Mint_ZeroAmount() (gas: 70512)
221+
SuccinctTitan1GPUTest:test_RevertStage2Mint_Stage2Only() (gas: 118952)
222+
SuccinctTitan1GPUTest:test_RevertTransferFrom_TokenIsSoulbound() (gas: 224130)
223+
SuccinctTitan1GPUTest:test_RevertWithdraw_InvalidPayment() (gas: 28267)
224+
SuccinctTitan1GPUTest:test_RevertWithdraw_ZeroAddress() (gas: 18538)
225+
SuccinctTitan1GPUTest:test_RevertWithdraw_ZeroAmount() (gas: 20626)
226+
SuccinctTitan1GPUTest:test_autoPauseWhenSoldOut() (gas: 3026971)
224227
SuccinctTitan1GPUTest:test_beginStage1() (gas: 48993)
225-
SuccinctTitan1GPUTest:test_beginStage2() (gas: 51160)
226-
SuccinctTitan1GPUTest:test_fullWorkflow() (gas: 56208866)
228+
SuccinctTitan1GPUTest:test_beginStage2() (gas: 51204)
229+
SuccinctTitan1GPUTest:test_fullWorkflow() (gas: 56208932)
227230
SuccinctTitan1GPUTest:test_pause() (gas: 52519)
228231
SuccinctTitan1GPUTest:test_permitAndStage1Mint() (gas: 329440)
229-
SuccinctTitan1GPUTest:test_permitAndStage2Mint() (gas: 217082)
230-
SuccinctTitan1GPUTest:test_setBaseURI() (gas: 240025)
231-
SuccinctTitan1GPUTest:test_setStage1Allocation() (gas: 50136)
232-
SuccinctTitan1GPUTest:test_setUp() (gas: 57811)
233-
SuccinctTitan1GPUTest:test_stage1Mint_batch() (gas: 353712)
234-
SuccinctTitan1GPUTest:test_stage1Mint_single() (gas: 233439)
235-
SuccinctTitan1GPUTest:test_stage2Mint() (gas: 186189)
236-
SuccinctTitan1GPUTest:test_stage2Mint_multipleUsers() (gas: 250436)
237-
SuccinctTitan1GPUTest:test_tokenURI() (gas: 228125)
232+
SuccinctTitan1GPUTest:test_permitAndStage2Mint() (gas: 217148)
233+
SuccinctTitan1GPUTest:test_setBaseURI() (gas: 239936)
234+
SuccinctTitan1GPUTest:test_setStage1Allocation() (gas: 50165)
235+
SuccinctTitan1GPUTest:test_setStage1AllocationsBatch() (gas: 113371)
236+
SuccinctTitan1GPUTest:test_setUp() (gas: 57833)
237+
SuccinctTitan1GPUTest:test_stage1Mint_batch() (gas: 353690)
238+
SuccinctTitan1GPUTest:test_stage1Mint_single() (gas: 233461)
239+
SuccinctTitan1GPUTest:test_stage2Mint() (gas: 186211)
240+
SuccinctTitan1GPUTest:test_stage2Mint_multipleUsers() (gas: 250458)
241+
SuccinctTitan1GPUTest:test_tokenURI() (gas: 228036)
238242
SuccinctTitan1GPUTest:test_unpause() (gas: 22858)
239-
SuccinctTitan1GPUTest:test_withdraw() (gas: 424132)
243+
SuccinctTitan1GPUTest:test_withdraw() (gas: 424176)
240244
SuccinctTokenTest:test_InitialOwner() (gas: 12808)
241245
SuccinctTokenTest:test_Mint_WhenOwner() (gas: 61178)
242246
SuccinctTokenTest:test_RevertMint_WhenNotOwner() (gas: 11221)

contracts/src/interfaces/ISuccinctTitanGPU.sol renamed to contracts/src/interfaces/ISuccinctTitan1GPU.sol

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.28;
33

4-
interface ISuccinctTitanGPU {
4+
interface ISuccinctTitan1GPU {
55
/*//////////////////////////////////////////////////////////////
66
TYPES
77
//////////////////////////////////////////////////////////////*/
@@ -50,6 +50,9 @@ interface ISuccinctTitanGPU {
5050
/// @dev Thrown when attempting to transfer a soulbound token.
5151
error TokenIsSoulbound();
5252

53+
/// @dev Thrown when array lengths don't match.
54+
error ArrayLengthMismatch();
55+
5356
/*//////////////////////////////////////////////////////////////
5457
EVENTS
5558
//////////////////////////////////////////////////////////////*/
@@ -160,6 +163,12 @@ interface ISuccinctTitanGPU {
160163
/// @param allocation The allocation amount.
161164
function setStage1Allocation(address minter, uint256 allocation) external;
162165

166+
/// @notice Set multiple Stage 1 allocations in batch; only before Stage 1 starts.
167+
/// @param minters The addresses to set allocations for.
168+
/// @param allocations The allocation amounts for each minter.
169+
function setStage1AllocationsBatch(address[] calldata minters, uint256[] calldata allocations)
170+
external;
171+
163172
/// @notice Begin Stage 1 (unpauses sale). Can only be called from NONE.
164173
function beginStage1() external;
165174

contracts/src/tokens/SuccinctTitan1GPU.sol

Lines changed: 51 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.28;
33

4-
import {ISuccinctTitanGPU} from "../interfaces/ISuccinctTitanGPU.sol";
4+
import {ISuccinctTitan1GPU} from "../interfaces/ISuccinctTitan1GPU.sol";
55
import {Initializable} from
66
"../../lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol";
77
import {OwnableUpgradeable} from
@@ -29,7 +29,7 @@ string constant SYMBOL = "Titan1GPU";
2929
/// @title Succinct Titan 1 GPU
3030
/// @author Succinct Labs
3131
contract 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

Comments
 (0)