Skip to content

Commit 2e0f83f

Browse files
mattstamctian1
andauthored
chore(contracts): atomic deployments (#197)
* wip * wip * compiles * no warnings * only owner * commit * good * calldata contract code * deployed * snapshot * reset --------- Co-authored-by: Chris Tian <[email protected]>
1 parent 47ee4e1 commit 2e0f83f

File tree

5 files changed

+258
-25
lines changed

5 files changed

+258
-25
lines changed

contracts/.gas-snapshot

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ SuccinctStakingFulfillmentTests:test_Reward_WhenTwoStakersTwoProversOneRewarded(
4646
SuccinctStakingFulfillmentTests:test_Reward_WhenUnstaked() (gas: 768285)
4747
SuccinctStakingFulfillmentTests:test_Reward_WhenValid() (gas: 600885)
4848
SuccinctStakingInitalizationTests:test_RevertInitialize_WhenAlreadyInitialized() (gas: 30268)
49-
SuccinctStakingInitalizationTests:test_RevertInitialize_WhenNotProxy() (gas: 4973780)
49+
SuccinctStakingInitalizationTests:test_RevertInitialize_WhenNotProxy() (gas: 4995240)
5050
SuccinctStakingMiscellaneousTests:test_Misc_BelowMinimumStake() (gas: 149488)
5151
SuccinctStakingMiscellaneousTests:test_Misc_CannotAvoidSlashingByUnstaking() (gas: 773305)
5252
SuccinctStakingMiscellaneousTests:test_Misc_CannotSwitchProvers() (gas: 465191)
@@ -75,8 +75,8 @@ SuccinctStakingMiscellaneousTests:test_Misc_UnstakeMoreThanBalance() (gas: 37902
7575
SuccinctStakingMiscellaneousTests:test_Misc_UnstakeQueueDoS() (gas: 4794312)
7676
SuccinctStakingMiscellaneousTests:test_Misc_VaultReturnsZero() (gas: 462500)
7777
SuccinctStakingMiscellaneousTests:test_Misc_ZeroProverAddress() (gas: 30191)
78-
SuccinctStakingRegistryTests:test_CreateProver_WhenValid() (gas: 1637461)
79-
SuccinctStakingRegistryTests:test_RevertCreateProver_WhenAlreadyCreated() (gas: 1632213)
78+
SuccinctStakingRegistryTests:test_CreateProver_WhenValid() (gas: 1648324)
79+
SuccinctStakingRegistryTests:test_RevertCreateProver_WhenAlreadyCreated() (gas: 1643076)
8080
SuccinctStakingSetupTests:test_SetUp() (gas: 131466)
8181
SuccinctStakingSlashTests:test_RevertSlash_WhenProverNotFound() (gas: 420606)
8282
SuccinctStakingSlashTests:test_Slash_Events() (gas: 837816)
@@ -157,7 +157,7 @@ SuccinctStakingUnstakeTests:test_Unstake_WhenValid() (gas: 636726)
157157
SuccinctTokenTest:test_InitialOwner() (gas: 12808)
158158
SuccinctTokenTest:test_Mint_WhenOwner() (gas: 61178)
159159
SuccinctTokenTest:test_RevertMint_WhenNotOwner() (gas: 11221)
160-
SuccinctVAppDelegateTest:test_Prover_WhenProverCreated() (gas: 1920462)
160+
SuccinctVAppDelegateTest:test_Prover_WhenProverCreated() (gas: 1931325)
161161
SuccinctVAppDepositTest:test_Deposit_WhenValid() (gas: 395856)
162162
SuccinctVAppDepositTest:test_PermitAndDeposit_WhenAttackerFrontruns() (gas: 294481)
163163
SuccinctVAppDepositTest:test_PermitAndDeposit_WhenValid() (gas: 420827)
@@ -178,7 +178,7 @@ SuccinctVAppOwnerTest:test_Unpause_WhenValid() (gas: 34712)
178178
SuccinctVAppOwnerTest:test_UpdateAuctioneer_WhenValid() (gas: 29601)
179179
SuccinctVAppOwnerTest:test_UpdateStaking_WhenValid() (gas: 29669)
180180
SuccinctVAppOwnerTest:test_UpdateVerifier_WhenValid() (gas: 29449)
181-
SuccinctVAppPauseTest:test_RevertCreateProver_WhenPaused() (gas: 1656439)
181+
SuccinctVAppPauseTest:test_RevertCreateProver_WhenPaused() (gas: 1667302)
182182
SuccinctVAppPauseTest:test_RevertDeposit_WhenPaused() (gas: 49443)
183183
SuccinctVAppPauseTest:test_RevertStep_WhenPaused() (gas: 49100)
184184
SuccinctVAppSetupTests:test_RevertInitialized_WhenInvalidInitialization() (gas: 33850)

contracts/foundry.toml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,10 @@ exclude_lints = ["mixed-case-variable", "mixed-case-function", "screaming-snake-
1616
[profile.deploy]
1717
optimizer = true
1818
optimizer_runs = 100
19-
bytecode_hash = "none"
20-
cbor_metadata = false
2119

2220
[profile.fuzz]
2321
optimizer = true
2422
optimizer_runs = 100
25-
bytecode_hash = "none"
26-
cbor_metadata = false
2723
runs = 10000
2824
seed = "0x1234"
2925

contracts/script/deploy/All.s.sol

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,22 @@ contract AllScript is BaseScript, FixtureLoader {
1919
// Read config
2020
bytes32 salt = readBytes32("CREATE2_SALT");
2121
address OWNER = readAddress("OWNER");
22+
address PROVE = readAddress("PROVE");
2223

2324
// Deploy contracts
2425
(address STAKING, address STAKING_IMPL) = _deployStakingAsProxy(salt);
25-
address PROVE = address(new Succinct{salt: salt}(OWNER));
2626
address I_PROVE = address(new IntermediateSuccinct{salt: salt}(PROVE, STAKING));
2727
address GOVERNOR = _deployGovernor(salt, I_PROVE);
28-
(address VERIFIER, address VAPP, address VAPP_IMPL) =
29-
_deployVAppAsProxy(salt, OWNER, PROVE, I_PROVE, STAKING);
28+
(address VAPP, address VAPP_IMPL) = _deployVAppAsProxy(salt, OWNER, PROVE, I_PROVE, STAKING);
3029

3130
// Initialize staking contract
3231
_initializeStaking(OWNER, STAKING, GOVERNOR, VAPP, PROVE, I_PROVE);
3332

3433
// Write addresses
3534
writeAddress("STAKING", STAKING);
3635
writeAddress("STAKING_IMPL", STAKING_IMPL);
37-
writeAddress("VERIFIER", VERIFIER);
3836
writeAddress("VAPP", VAPP);
3937
writeAddress("VAPP_IMPL", VAPP_IMPL);
40-
writeAddress("PROVE", PROVE);
4138
writeAddress("I_PROVE", I_PROVE);
4239
writeAddress("GOVERNOR", GOVERNOR);
4340
}
@@ -63,21 +60,14 @@ contract AllScript is BaseScript, FixtureLoader {
6360
address PROVE,
6461
address I_PROVE,
6562
address STAKING
66-
) internal returns (address, address, address) {
63+
) internal returns (address, address) {
6764
// Read config
6865
address AUCTIONEER = readAddress("AUCTIONEER");
6966
address VERIFIER = readAddress("VERIFIER");
7067
uint256 MIN_DEPOSIT_AMOUNT = readUint256("MIN_DEPOSIT_AMOUNT");
7168
bytes32 VKEY = readBytes32("VKEY");
7269
bytes32 GENESIS_STATE_ROOT = readBytes32("GENESIS_STATE_ROOT");
7370

74-
// If the verifier is not provided, deploy the SP1VerifierGateway and add v5.0.0 Groth16 SP1Verifier to it
75-
if (VERIFIER == address(0)) {
76-
VERIFIER = address(new SP1VerifierGateway{salt: salt}(OWNER));
77-
address groth16 = address(new SP1Verifier{salt: salt}());
78-
SP1VerifierGateway(VERIFIER).addRoute(groth16);
79-
}
80-
8171
// Encode the initialize function call data
8272
bytes memory initData = abi.encodeCall(
8373
SuccinctVApp.initialize,
@@ -100,7 +90,7 @@ contract AllScript is BaseScript, FixtureLoader {
10090
SuccinctVApp(payable(address(new ERC1967Proxy{salt: salt}(VAPP_IMPL, initData))))
10191
);
10292

103-
return (VERIFIER, VAPP, VAPP_IMPL);
93+
return (VAPP, VAPP_IMPL);
10494
}
10595

10696
/// @dev Deploys the staking contract as a proxy but does not initialize it.
Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.28;
3+
4+
import {BaseScript} from "../utils/Base.s.sol";
5+
import {SuccinctStaking} from "../../src/SuccinctStaking.sol";
6+
import {SuccinctVApp} from "../../src/SuccinctVApp.sol";
7+
import {IntermediateSuccinct} from "../../src/tokens/IntermediateSuccinct.sol";
8+
import {SuccinctGovernor} from "../../src/SuccinctGovernor.sol";
9+
import {Succinct} from "../../src/tokens/Succinct.sol";
10+
import {FixtureLoader} from "../../test/utils/FixtureLoader.sol";
11+
import {ERC1967Proxy} from
12+
"../../lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol";
13+
import {SP1VerifierGateway} from "../../lib/sp1-contracts/contracts/src/SP1VerifierGateway.sol";
14+
import {SP1Verifier} from "../../lib/sp1-contracts/contracts/src/v5.0.0/SP1VerifierGroth16.sol";
15+
16+
contract AtomicDeployer {
17+
// Staking proxy param
18+
address public stakingImpl;
19+
20+
// IntermediateSuccinct param
21+
address public prove;
22+
23+
// Governor params
24+
uint48 public votingDelay;
25+
uint32 public votingPeriod;
26+
uint256 public proposalThreshold;
27+
uint256 public quorumFraction;
28+
29+
address public vappImpl;
30+
address public owner;
31+
address public auctioneer;
32+
address public verifier;
33+
uint256 public minDepositAmount;
34+
bytes32 public vkey;
35+
address public dispenser;
36+
uint256 public minStakeAmount;
37+
uint256 public maxUnstakeRequests;
38+
uint256 public unstakePeriod;
39+
uint256 public slashCancellationPeriod;
40+
bytes32 public genesisStateRoot;
41+
42+
address public deployerOwner;
43+
44+
constructor() {
45+
deployerOwner = msg.sender;
46+
}
47+
48+
modifier onlyOwner() {
49+
require(msg.sender == deployerOwner);
50+
_;
51+
}
52+
53+
function setParams1(
54+
address _stakingImpl,
55+
address _prove,
56+
uint48 _votingDelay,
57+
uint32 _votingPeriod,
58+
uint256 _proposalThreshold,
59+
uint256 _quorumFraction
60+
) external onlyOwner {
61+
stakingImpl = _stakingImpl;
62+
prove = _prove;
63+
votingDelay = _votingDelay;
64+
votingPeriod = _votingPeriod;
65+
proposalThreshold = _proposalThreshold;
66+
quorumFraction = _quorumFraction;
67+
}
68+
69+
function setParams2(
70+
address _vappImpl,
71+
address _owner,
72+
address _auctioneer,
73+
address _verifier,
74+
uint256 _minDepositAmount,
75+
bytes32 _vkey
76+
) external onlyOwner {
77+
vappImpl = _vappImpl;
78+
owner = _owner;
79+
auctioneer = _auctioneer;
80+
verifier = _verifier;
81+
minDepositAmount = _minDepositAmount;
82+
vkey = _vkey;
83+
}
84+
85+
function setParams3(
86+
address _dispenser,
87+
uint256 _minStakeAmount,
88+
uint256 _maxUnstakeRequests,
89+
uint256 _unstakePeriod,
90+
uint256 _slashCancellationPeriod,
91+
bytes32 _genesisStateRoot
92+
) external onlyOwner {
93+
dispenser = _dispenser;
94+
minStakeAmount = _minStakeAmount;
95+
maxUnstakeRequests = _maxUnstakeRequests;
96+
unstakePeriod = _unstakePeriod;
97+
slashCancellationPeriod = _slashCancellationPeriod;
98+
genesisStateRoot = _genesisStateRoot;
99+
}
100+
101+
function deploy(bytes32 salt, bytes calldata iproveCode, bytes calldata governorCode)
102+
external
103+
onlyOwner
104+
returns (address, address, address, address)
105+
{
106+
address STAKING;
107+
{
108+
STAKING = address(new ERC1967Proxy{salt: salt}(stakingImpl, ""));
109+
}
110+
111+
address I_PROVE;
112+
{
113+
// I_PROVE = address(new IntermediateSuccinct{salt: salt}(prove, STAKING));
114+
bytes memory args = abi.encode(prove, STAKING);
115+
bytes memory initCode = abi.encodePacked(iproveCode, args);
116+
117+
assembly {
118+
I_PROVE := create2(0, add(initCode, 0x20), mload(initCode), salt)
119+
if iszero(extcodesize(I_PROVE)) { revert(0, 0) }
120+
}
121+
}
122+
123+
address GOVERNOR;
124+
{
125+
// GOVERNOR = address(
126+
// new SuccinctGovernor{salt: salt}(
127+
// I_PROVE, votingDelay, votingPeriod, proposalThreshold, quorumFraction
128+
// )
129+
// );
130+
bytes memory args =
131+
abi.encode(I_PROVE, votingDelay, votingPeriod, proposalThreshold, quorumFraction);
132+
bytes memory initCode = abi.encodePacked(governorCode, args);
133+
134+
assembly {
135+
GOVERNOR := create2(0, add(initCode, 0x20), mload(initCode), salt)
136+
if iszero(extcodesize(GOVERNOR)) { revert(0, 0) }
137+
}
138+
}
139+
140+
address VAPP;
141+
{
142+
// Encode the initialize function call data
143+
bytes memory vappInitData;
144+
{
145+
vappInitData = abi.encodeCall(
146+
SuccinctVApp.initialize,
147+
(
148+
owner,
149+
prove,
150+
I_PROVE,
151+
auctioneer,
152+
STAKING,
153+
verifier,
154+
minDepositAmount,
155+
vkey,
156+
genesisStateRoot
157+
)
158+
);
159+
}
160+
VAPP = address(new ERC1967Proxy{salt: salt}(vappImpl, vappInitData));
161+
}
162+
163+
SuccinctStaking(STAKING).initialize(
164+
owner,
165+
GOVERNOR,
166+
VAPP,
167+
prove,
168+
I_PROVE,
169+
dispenser,
170+
minStakeAmount,
171+
maxUnstakeRequests,
172+
unstakePeriod,
173+
slashCancellationPeriod
174+
);
175+
176+
return (STAKING, VAPP, I_PROVE, GOVERNOR);
177+
}
178+
}
179+
180+
// Deploy all contracts.
181+
contract AllAtomicScript is BaseScript, FixtureLoader {
182+
function run() external broadcaster {
183+
// Read config
184+
bytes32 salt = readBytes32("CREATE2_SALT");
185+
address OWNER = readAddress("OWNER");
186+
address PROVE = readAddress("PROVE");
187+
address VERIFIER = readAddress("VERIFIER");
188+
189+
// Deploy implementation contracts
190+
address STAKING_IMPL = address(new SuccinctStaking{salt: salt}());
191+
address VAPP_IMPL = address(new SuccinctVApp{salt: salt}());
192+
193+
// Atomically deploy the rest of the contracts
194+
{
195+
AtomicDeployer deployer = new AtomicDeployer();
196+
{
197+
uint48 VOTING_DELAY = readUint48("VOTING_DELAY");
198+
uint32 VOTING_PERIOD = readUint32("VOTING_PERIOD");
199+
uint256 PROPOSAL_THRESHOLD = readUint256("PROPOSAL_THRESHOLD");
200+
uint256 QUORUM_FRACTION = readUint256("QUORUM_FRACTION");
201+
deployer.setParams1(
202+
STAKING_IMPL,
203+
PROVE,
204+
VOTING_DELAY,
205+
VOTING_PERIOD,
206+
PROPOSAL_THRESHOLD,
207+
QUORUM_FRACTION
208+
);
209+
}
210+
{
211+
address AUCTIONEER = readAddress("AUCTIONEER");
212+
uint256 MIN_DEPOSIT_AMOUNT = readUint256("MIN_DEPOSIT_AMOUNT");
213+
bytes32 VKEY = readBytes32("VKEY");
214+
deployer.setParams2(
215+
VAPP_IMPL, OWNER, AUCTIONEER, VERIFIER, MIN_DEPOSIT_AMOUNT, VKEY
216+
);
217+
}
218+
{
219+
address DISPENSER = readAddress("DISPENSER");
220+
uint256 MIN_STAKE_AMOUNT = readUint256("MIN_STAKE_AMOUNT");
221+
uint256 MAX_UNSTAKE_REQUESTS = readUint256("MAX_UNSTAKE_REQUESTS");
222+
uint256 UNSTAKE_PERIOD = readUint256("UNSTAKE_PERIOD");
223+
uint256 SLASH_CANCELLATION_PERIOD = readUint256("SLASH_CANCELLATION_PERIOD");
224+
bytes32 GENESIS_STATE_ROOT = readBytes32("GENESIS_STATE_ROOT");
225+
deployer.setParams3(
226+
DISPENSER,
227+
MIN_STAKE_AMOUNT,
228+
MAX_UNSTAKE_REQUESTS,
229+
UNSTAKE_PERIOD,
230+
SLASH_CANCELLATION_PERIOD,
231+
GENESIS_STATE_ROOT
232+
);
233+
}
234+
(address STAKING, address VAPP, address I_PROVE, address GOVERNOR) = deployer.deploy(
235+
salt, type(IntermediateSuccinct).creationCode, type(SuccinctGovernor).creationCode
236+
);
237+
writeAddress("STAKING", STAKING);
238+
writeAddress("VAPP", VAPP);
239+
writeAddress("I_PROVE", I_PROVE);
240+
writeAddress("GOVERNOR", GOVERNOR);
241+
}
242+
243+
// Write addresses
244+
writeAddress("STAKING_IMPL", STAKING_IMPL);
245+
writeAddress("VAPP_IMPL", VAPP_IMPL);
246+
}
247+
}

contracts/script/utils/PostDeployment.s.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ contract PostDeploymentScript is BaseScript, Test {
9191
uint256 MAX_UNSTAKE_REQUESTS = readUint256("MAX_UNSTAKE_REQUESTS");
9292
uint256 UNSTAKE_PERIOD = readUint256("UNSTAKE_PERIOD");
9393
uint256 SLASH_CANCELLATION = readUint256("SLASH_CANCELLATION_PERIOD");
94-
uint256 DISPENSE_RATE = readUint256("DISPENSE_RATE");
94+
// uint256 DISPENSE_RATE = readUint256("DISPENSE_RATE");
9595

9696
SuccinctStaking staking = SuccinctStaking(_staking);
9797

@@ -104,7 +104,7 @@ contract PostDeploymentScript is BaseScript, Test {
104104
assertEq(staking.maxUnstakeRequests(), MAX_UNSTAKE_REQUESTS);
105105
assertEq(staking.unstakePeriod(), UNSTAKE_PERIOD);
106106
assertEq(staking.slashCancellationPeriod(), SLASH_CANCELLATION);
107-
assertEq(staking.dispenseRate(), DISPENSE_RATE);
107+
// assertEq(staking.dispenseRate(), DISPENSE_RATE);
108108
assertEq(staking.dispenseEarned(), 0);
109109
assertEq(staking.dispenseDistributed(), 0);
110110
assertLe(staking.dispenseRateTimestamp(), block.timestamp);

0 commit comments

Comments
 (0)