Commit e704fc61 authored by Juan C's avatar Juan C Committed by GitHub

Add fast summarization for Kontrol proofs (#9092)

* KontrolDeployment: move to `deployment` folder

* Add `DeploymentSummary.t.sol`

* `DeploymentSummary`: `vm` visivility from `internal` to `private`

* KontrolUtils: `vm` visivility form `private` to `internal`

* Add fast summarization; run `finalizeWithdrawalTransaction` proof

* Delete dummy proofs

* README.md: Reflect `deployment` folder & deletion of `proofs/tests`

* `run-kontrol.sh`: fix path for `Kontrol-Deploy.json`

* `OptimismPortal_Test`: set `virtual` functions to override in Kontrol summary test

* `DeploymentSummary_Test`: Tidy up & remove innecessary code

* `versions.json`: bump Kontrol from `0.1.117` to `0.1.121`

* Update `Kontrol-Deploy.json`

* `run-kontrol.sh`: remove `bmc` proving mode

* `OptimismPortalKontrol`: inline `setUp` function

* `OptimismPortal_Test`: fix typo in comments

* Prettify `snapshots/state-diff/Kontrol-Deploy.json`

* `run-kontrol.sh`: add logs to `test/kontrol/logs` instead of root

* Update Kontrol deployment summary

* `DeploymentSummary_Test`: Update `test_constructor_suceeds`; add `test_initialize_succeeds`

* `DeploymentSummary_Test`: fix typos

* `DeploymentSummary_Test`: remove `vm.skip(true)`

* `OptimismPortalKontrol`: simplify test logic
parent dc29f9af
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -25,13 +25,17 @@ import { OptimismPortal } from "src/L1/OptimismPortal.sol"; ...@@ -25,13 +25,17 @@ import { OptimismPortal } from "src/L1/OptimismPortal.sol";
contract OptimismPortal_Test is CommonTest { contract OptimismPortal_Test is CommonTest {
address depositor; address depositor;
function setUp() public override { /// @notice Marked virtual to be overridden in
/// test/kontrol/deployment/DeploymentSummary.t.sol
function setUp() public virtual override {
super.setUp(); super.setUp();
depositor = makeAddr("depositor"); depositor = makeAddr("depositor");
} }
/// @dev Tests that the constructor sets the correct values. /// @dev Tests that the constructor sets the correct values.
function test_constructor_succeeds() external { /// @notice Marked virtual to be overridden in
/// test/kontrol/deployment/DeploymentSummary.t.sol
function test_constructor_succeeds() external virtual {
OptimismPortal opImpl = OptimismPortal(payable(deploy.mustGetAddress("OptimismPortal"))); OptimismPortal opImpl = OptimismPortal(payable(deploy.mustGetAddress("OptimismPortal")));
assertEq(address(opImpl.L2_ORACLE()), address(0)); assertEq(address(opImpl.L2_ORACLE()), address(0));
assertEq(address(opImpl.l2Oracle()), address(0)); assertEq(address(opImpl.l2Oracle()), address(0));
...@@ -42,7 +46,9 @@ contract OptimismPortal_Test is CommonTest { ...@@ -42,7 +46,9 @@ contract OptimismPortal_Test is CommonTest {
} }
/// @dev Tests that the initializer sets the correct values. /// @dev Tests that the initializer sets the correct values.
function test_initialize_succeeds() external { /// @notice Marked virtual to be overridden in
/// test/kontrol/deployment/DeploymentSummary.t.sol
function test_initialize_succeeds() external virtual {
address guardian = deploy.cfg().superchainConfigGuardian(); address guardian = deploy.cfg().superchainConfigGuardian();
assertEq(address(optimismPortal.L2_ORACLE()), address(l2OutputOracle)); assertEq(address(optimismPortal.L2_ORACLE()), address(l2OutputOracle));
assertEq(address(optimismPortal.l2Oracle()), address(l2OutputOracle)); assertEq(address(optimismPortal.l2Oracle()), address(l2OutputOracle));
...@@ -282,7 +288,9 @@ contract OptimismPortal_Test is CommonTest { ...@@ -282,7 +288,9 @@ contract OptimismPortal_Test is CommonTest {
} }
/// @dev Tests that `isOutputFinalized` succeeds for an EOA depositing a tx with ETH and data. /// @dev Tests that `isOutputFinalized` succeeds for an EOA depositing a tx with ETH and data.
function test_simple_isOutputFinalized_succeeds() external { /// @notice Marked virtual to be overridden in
/// test/kontrol/deployment/DeploymentSummary.t.sol
function test_simple_isOutputFinalized_succeeds() external virtual {
uint256 startingBlockNumber = deploy.cfg().l2OutputOracleStartingBlockNumber(); uint256 startingBlockNumber = deploy.cfg().l2OutputOracleStartingBlockNumber();
uint256 ts = block.timestamp; uint256 ts = block.timestamp;
...@@ -302,7 +310,9 @@ contract OptimismPortal_Test is CommonTest { ...@@ -302,7 +310,9 @@ contract OptimismPortal_Test is CommonTest {
} }
/// @dev Tests `isOutputFinalized` for a finalized output. /// @dev Tests `isOutputFinalized` for a finalized output.
function test_isOutputFinalized_succeeds() external { /// @notice Marked virtual to be overridden in
/// test/kontrol/deployment/DeploymentSummary.t.sol
function test_isOutputFinalized_succeeds() external virtual {
uint256 checkpoint = l2OutputOracle.nextBlockNumber(); uint256 checkpoint = l2OutputOracle.nextBlockNumber();
uint256 nextOutputIndex = l2OutputOracle.nextOutputIndex(); uint256 nextOutputIndex = l2OutputOracle.nextOutputIndex();
vm.roll(checkpoint); vm.roll(checkpoint);
......
...@@ -8,15 +8,14 @@ The directory is structured as follows ...@@ -8,15 +8,14 @@ The directory is structured as follows
```tree ```tree
test/kontrol test/kontrol
├── KontrolDeployment.sol ├── deployment
│   ├── DeploymentSummary.t.sol
│   └── KontrolDeployment.sol
├── pausability-lemmas.k ├── pausability-lemmas.k
├── proofs ├── proofs
│   ├── interfaces │   ├── interfaces
│   │   └── KontrolInterfaces.sol │   │   └── KontrolInterfaces.sol
│   ├── OptimismPortal.k.sol │   ├── OptimismPortal.k.sol
│   ├── tests
│   │   ├── Counter.sol
│   │   └── Counter.t.sol
│   └── utils │   └── utils
│   ├── DeploymentSummaryCode.sol │   ├── DeploymentSummaryCode.sol
│   ├── DeploymentSummary.sol │   ├── DeploymentSummary.sol
...@@ -32,11 +31,16 @@ test/kontrol ...@@ -32,11 +31,16 @@ test/kontrol
### Root folder ### Root folder
- [`KontrolDeployment.sol`](./KontrolDeployment.sol): Reduced deployment to generate the summary contract
- [`pausability-lemmas.k`](./pausability-lemmas.k): File containing the necessary lemmas for this project - [`pausability-lemmas.k`](./pausability-lemmas.k): File containing the necessary lemmas for this project
- [`deployment`](./deployment): Custom deploy sequence for Kontrol proofs and tests for its summarization
- [`proofs`](./proofs): Where the proofs of the project live - [`proofs`](./proofs): Where the proofs of the project live
- [`scripts`](./scripts): Where the scripts of the projects live - [`scripts`](./scripts): Where the scripts of the projects live
### [`deployment`](./deployment) folder
- [`KontrolDeployment.sol`](./deployment/KontrolDeployment.sol): Simplified deployment sequence for Kontrol proofs
- [`DeploymentSummary.t.sol`](./deployment/DeploymentSummary.t.sol): Tests for the summarization of custom deployment
### [`proofs`](./proofs) folder ### [`proofs`](./proofs) folder
- [`OptimismPortal.k.sol`](./proofs/OptimismPortal.k.sol): Symbolic property tests - [`OptimismPortal.k.sol`](./proofs/OptimismPortal.k.sol): Symbolic property tests
......
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
// Libraries
import { Constants } from "src/libraries/Constants.sol";
// Target contract dependencies
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
import { DeploymentSummary } from "../proofs/utils/DeploymentSummary.sol";
import { OptimismPortal_Test } from "test/L1/OptimismPortal.t.sol";
/// @dev Contract testing the deployment summary correctness
contract DeploymentSummary_Test is DeploymentSummary, OptimismPortal_Test {
/// @notice super.setUp is not called on purpose
function setUp() public override {
// Recreate Deployment Summary state changes
DeploymentSummary deploymentSummary = new DeploymentSummary();
deploymentSummary.recreateDeployment();
// Set summary addresses
optimismPortal = OptimismPortal(payable(OptimismPortalProxyAddress));
superchainConfig = SuperchainConfig(SuperchainConfigProxyAddress);
l2OutputOracle = L2OutputOracle(L2OutputOracleProxyAddress);
systemConfig = SystemConfig(SystemConfigProxyAddress);
// Set up utilized addresses
depositor = makeAddr("depositor");
alice = makeAddr("alice");
bob = makeAddr("bob");
vm.deal(alice, 10000 ether);
vm.deal(bob, 10000 ether);
}
/// @dev Skips the first line of `super.test_constructor_succeeds` because
/// we're not exercising the `Deploy` logic in these tests. However,
/// the remaining assertions of the test are important to check
function test_constructor_succeeds() external override {
// OptimismPortal opImpl = OptimismPortal(payable(deploy.mustGetAddress("OptimismPortal")));
OptimismPortal opImpl = OptimismPortal(payable(OptimismPortalAddress));
assertEq(address(opImpl.L2_ORACLE()), address(0));
assertEq(address(opImpl.l2Oracle()), address(0));
assertEq(address(opImpl.SYSTEM_CONFIG()), address(0));
assertEq(address(opImpl.systemConfig()), address(0));
assertEq(address(opImpl.superchainConfig()), address(0));
assertEq(opImpl.l2Sender(), Constants.DEFAULT_L2_SENDER);
}
/// @dev Skips the first line of `super.test_initialize_succeeds` because
/// we're not exercising the `Deploy` logic in these tests. However,
/// the remaining assertions of the test are important to check
function test_initialize_succeeds() external override {
// address guardian = deploy.cfg().superchainConfigGuardian();
address guardian = superchainConfig.guardian();
assertEq(address(optimismPortal.L2_ORACLE()), address(l2OutputOracle));
assertEq(address(optimismPortal.l2Oracle()), address(l2OutputOracle));
assertEq(address(optimismPortal.SYSTEM_CONFIG()), address(systemConfig));
assertEq(address(optimismPortal.systemConfig()), address(systemConfig));
assertEq(optimismPortal.GUARDIAN(), guardian);
assertEq(optimismPortal.guardian(), guardian);
assertEq(address(optimismPortal.superchainConfig()), address(superchainConfig));
assertEq(optimismPortal.l2Sender(), Constants.DEFAULT_L2_SENDER);
assertEq(optimismPortal.paused(), false);
}
/// @notice This test is overridden because `KontrolDeployment` doesn't initialize
/// the L2OutputOracle, which is needed in this test
function test_simple_isOutputFinalized_succeeds() external override { }
/// @notice This test is overridden because `KontrolDeployment` doesn't initialize
/// the L2OutputOracle, which is needed in this test
function test_isOutputFinalized_succeeds() external override { }
}
...@@ -13,8 +13,9 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils { ...@@ -13,8 +13,9 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils {
OptimismPortal optimismPortal; OptimismPortal optimismPortal;
SuperchainConfig superchainConfig; SuperchainConfig superchainConfig;
function setUp() public { /// @dev Inlined setUp function for faster Kontrol performance
recreateDeployment(); /// Tracking issue: https://github.com/runtimeverification/kontrol/issues/282
function setUpInlined() public {
optimismPortal = OptimismPortal(payable(OptimismPortalProxyAddress)); optimismPortal = OptimismPortal(payable(OptimismPortalProxyAddress));
superchainConfig = SuperchainConfig(SuperchainConfigProxyAddress); superchainConfig = SuperchainConfig(SuperchainConfigProxyAddress);
} }
...@@ -39,6 +40,7 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils { ...@@ -39,6 +40,7 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils {
) )
external external
{ {
setUpInlined();
bytes memory _data = freshBigBytes(320); bytes memory _data = freshBigBytes(320);
bytes[] memory _withdrawalProof = freshWithdrawalProof(); bytes[] memory _withdrawalProof = freshWithdrawalProof();
...@@ -48,16 +50,10 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils { ...@@ -48,16 +50,10 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils {
Types.OutputRootProof memory _outputRootProof = Types.OutputRootProof memory _outputRootProof =
Types.OutputRootProof(_outputRootProof0, _outputRootProof1, _outputRootProof2, _outputRootProof3); Types.OutputRootProof(_outputRootProof0, _outputRootProof1, _outputRootProof2, _outputRootProof3);
// After deployment, Optimism portal is enabled
require(optimismPortal.paused() == false, "Portal should not be paused");
// Pause Optimism Portal // Pause Optimism Portal
vm.prank(optimismPortal.GUARDIAN()); vm.prank(optimismPortal.GUARDIAN());
superchainConfig.pause("identifier"); superchainConfig.pause("identifier");
// Portal is now paused
require(optimismPortal.paused(), "Portal should be paused");
// No one can call proveWithdrawalTransaction // No one can call proveWithdrawalTransaction
vm.expectRevert("OptimismPortal: paused"); vm.expectRevert("OptimismPortal: paused");
optimismPortal.proveWithdrawalTransaction(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof); optimismPortal.proveWithdrawalTransaction(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
...@@ -75,21 +71,16 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils { ...@@ -75,21 +71,16 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils {
) )
external external
{ {
setUpInlined();
bytes memory _data = freshBigBytes(320); bytes memory _data = freshBigBytes(320);
Types.WithdrawalTransaction memory _tx = Types.WithdrawalTransaction memory _tx =
Types.WithdrawalTransaction(_nonce, _sender, _target, _value, _gasLimit, _data); Types.WithdrawalTransaction(_nonce, _sender, _target, _value, _gasLimit, _data);
// After deployment, Optimism portal is enabled
require(optimismPortal.paused() == false, "Portal should not be paused");
// Pause Optimism Portal // Pause Optimism Portal
vm.prank(optimismPortal.GUARDIAN()); vm.prank(optimismPortal.GUARDIAN());
superchainConfig.pause("identifier"); superchainConfig.pause("identifier");
// Portal is now paused
require(optimismPortal.paused(), "Portal should be paused");
vm.expectRevert("OptimismPortal: paused"); vm.expectRevert("OptimismPortal: paused");
optimismPortal.finalizeWithdrawalTransaction(_tx); optimismPortal.finalizeWithdrawalTransaction(_tx);
} }
......
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
contract Counter {
uint256 public number;
function setNumber(uint256 newNumber) public {
number = newNumber;
}
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import { Counter } from "./Counter.sol";
contract CounterTest {
Counter counter;
function setUp() public {
counter = new Counter();
}
function test_SetNumber(uint256 x) public {
counter.setNumber(x);
require(counter.number() == x, "Not equal");
}
}
...@@ -9,13 +9,13 @@ import { DeploymentSummaryCode } from "./DeploymentSummaryCode.sol"; ...@@ -9,13 +9,13 @@ import { DeploymentSummaryCode } from "./DeploymentSummaryCode.sol";
contract DeploymentSummary is DeploymentSummaryCode { contract DeploymentSummary is DeploymentSummaryCode {
// Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D
address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); address private constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code"))));
Vm internal constant vm = Vm(VM_ADDRESS); Vm private constant vm = Vm(VM_ADDRESS);
address internal constant AddressManagerAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3; address internal constant AddressManagerAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3;
address internal constant L2OutputOracleAddress = 0x1B9F0e648A0A4780120A6Cd07B952F76560c8F8b; address internal constant L2OutputOracleAddress = 0x19652082F846171168Daf378C4fD3ee85a0D4A60;
address internal constant L2OutputOracleProxyAddress = 0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb; address internal constant L2OutputOracleProxyAddress = 0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb;
address internal constant OptimismPortalAddress = 0x94eA1235778aDc02FD93c242e6A23Ef5C8c3CE44; address internal constant OptimismPortalAddress = 0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4;
address internal constant OptimismPortalProxyAddress = 0x978e3286EB805934215a88694d80b09aDed68D90; address internal constant OptimismPortalProxyAddress = 0x978e3286EB805934215a88694d80b09aDed68D90;
address internal constant ProtocolVersionsAddress = 0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F; address internal constant ProtocolVersionsAddress = 0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F;
address internal constant ProtocolVersionsProxyAddress = 0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6; address internal constant ProtocolVersionsProxyAddress = 0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6;
...@@ -24,7 +24,7 @@ contract DeploymentSummary is DeploymentSummaryCode { ...@@ -24,7 +24,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
address internal constant SafeSingletonAddress = 0x90193C961A926261B756D1E5bb255e67ff9498A1; address internal constant SafeSingletonAddress = 0x90193C961A926261B756D1E5bb255e67ff9498A1;
address internal constant SuperchainConfigAddress = 0x068E44eB31e111028c41598E4535be7468674D0A; address internal constant SuperchainConfigAddress = 0x068E44eB31e111028c41598E4535be7468674D0A;
address internal constant SuperchainConfigProxyAddress = 0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809; address internal constant SuperchainConfigProxyAddress = 0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809;
address internal constant SystemConfigAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB; address internal constant SystemConfigAddress = 0xffbA8944650e26653823658d76A122946F27e2f2;
address internal constant SystemConfigProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; address internal constant SystemConfigProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4;
address internal constant SystemOwnerSafeAddress = 0x2601573C28B77dea6C8B73385c25024A28a00C3F; address internal constant SystemOwnerSafeAddress = 0x2601573C28B77dea6C8B73385c25024A28a00C3F;
...@@ -180,10 +180,19 @@ contract DeploymentSummary is DeploymentSummaryCode { ...@@ -180,10 +180,19 @@ contract DeploymentSummary is DeploymentSummaryCode {
slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000101"; value = hex"0000000000000000000000000000000000000000000000000000000000000101";
vm.store(L2OutputOracleAddress, slot, value); vm.store(L2OutputOracleAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000004";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
vm.store(L2OutputOracleAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
vm.store(L2OutputOracleAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001"; value = hex"0000000000000000000000000000000000000000000000000000000000000001";
vm.store(L2OutputOracleAddress, slot, value); vm.store(L2OutputOracleAddress, slot, value);
vm.etch(SystemConfigAddress, SystemConfigCode); vm.etch(SystemConfigAddress, SystemConfigCode);
slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f";
value = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
vm.store(SystemConfigAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001"; value = hex"0000000000000000000000000000000000000000000000000000000000000001";
vm.store(SystemConfigAddress, slot, value); vm.store(SystemConfigAddress, slot, value);
...@@ -191,16 +200,16 @@ contract DeploymentSummary is DeploymentSummaryCode { ...@@ -191,16 +200,16 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000101"; value = hex"0000000000000000000000000000000000000000000000000000000000000101";
vm.store(SystemConfigAddress, slot, value); vm.store(SystemConfigAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; value = hex"0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c";
vm.store(SystemConfigAddress, slot, value); vm.store(SystemConfigAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
value = hex"000000000000000000000000000000000000000000000000000000000000dead"; value = hex"000000000000000000000000000000000000000000000000000000000000dead";
vm.store(SystemConfigAddress, slot, value); vm.store(SystemConfigAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000068"; slot = hex"0000000000000000000000000000000000000000000000000000000000000068";
value = hex"0000000000000000000000000000000000000000000000000000000001406f40"; value = hex"0000000000000000000000000000000000000000000000000000000000000001";
vm.store(SystemConfigAddress, slot, value); vm.store(SystemConfigAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000069"; slot = hex"0000000000000000000000000000000000000000000000000000000000000069";
value = hex"0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00"; value = hex"0000000000000000000000000000000000000000000000000000020100000001";
vm.store(SystemConfigAddress, slot, value); vm.store(SystemConfigAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001"; value = hex"0000000000000000000000000000000000000000000000000000000000000001";
...@@ -209,7 +218,7 @@ contract DeploymentSummary is DeploymentSummaryCode { ...@@ -209,7 +218,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000003"; value = hex"0000000000000000000000000000000000000000000000000000000000000003";
vm.store(SystemOwnerSafeAddress, slot, value); vm.store(SystemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; value = hex"000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2";
vm.store(SystemConfigProxyAddress, slot, value); vm.store(SystemConfigProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001"; value = hex"0000000000000000000000000000000000000000000000000000000000000001";
...@@ -238,6 +247,18 @@ contract DeploymentSummary is DeploymentSummaryCode { ...@@ -238,6 +247,18 @@ contract DeploymentSummary is DeploymentSummaryCode {
slot = hex"65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08"; slot = hex"65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08";
value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc";
vm.store(SystemConfigProxyAddress, slot, value); vm.store(SystemConfigProxyAddress, slot, value);
slot = hex"71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc597";
value = hex"000000000000000000000000ff00000000000000000000000000000000000000";
vm.store(SystemConfigProxyAddress, slot, value);
slot = hex"e52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871815";
value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb";
vm.store(SystemConfigProxyAddress, slot, value);
slot = hex"4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac";
value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90";
vm.store(SystemConfigProxyAddress, slot, value);
slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
vm.store(SystemConfigProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000069"; slot = hex"0000000000000000000000000000000000000000000000000000000000000069";
value = hex"0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00"; value = hex"0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00";
vm.store(SystemConfigProxyAddress, slot, value); vm.store(SystemConfigProxyAddress, slot, value);
...@@ -248,7 +269,7 @@ contract DeploymentSummary is DeploymentSummaryCode { ...@@ -248,7 +269,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000004"; value = hex"0000000000000000000000000000000000000000000000000000000000000004";
vm.store(SystemOwnerSafeAddress, slot, value); vm.store(SystemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"00000000000000000000000094ea1235778adc02fd93c242e6a23ef5c8c3ce44"; value = hex"0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4";
vm.store(OptimismPortalProxyAddress, slot, value); vm.store(OptimismPortalProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001"; value = hex"0000000000000000000000000000000000000000000000000000000000000001";
...@@ -256,6 +277,12 @@ contract DeploymentSummary is DeploymentSummaryCode { ...@@ -256,6 +277,12 @@ contract DeploymentSummary is DeploymentSummaryCode {
slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000101"; value = hex"0000000000000000000000000000000000000000000000000000000000000101";
vm.store(OptimismPortalProxyAddress, slot, value); vm.store(OptimismPortalProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000036";
value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb";
vm.store(OptimismPortalProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000037";
value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4";
vm.store(OptimismPortalProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000035"; slot = hex"0000000000000000000000000000000000000000000000000000000000000035";
value = hex"0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900"; value = hex"0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900";
vm.store(OptimismPortalProxyAddress, slot, value); vm.store(OptimismPortalProxyAddress, slot, value);
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -40,8 +40,8 @@ contract GhostBytes10 { ...@@ -40,8 +40,8 @@ contract GhostBytes10 {
abstract contract KontrolUtils is KontrolCheats { abstract contract KontrolUtils is KontrolCheats {
/// @dev we only care about the vm signature /// @dev we only care about the vm signature
// Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D. // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D.
address private constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code"))));
Vm private constant vm = Vm(VM_ADDRESS); Vm internal constant vm = Vm(VM_ADDRESS);
/// @dev Creates a fresh bytes with length greater than 31 /// @dev Creates a fresh bytes with length greater than 31
/// @param bytesLength: Length of the fresh bytes. Should be concrete /// @param bytesLength: Length of the fresh bytes. Should be concrete
......
...@@ -26,7 +26,7 @@ cp ${DEPLOY_SCRIPT} ${DEPLOY_SCRIPT}.bak ...@@ -26,7 +26,7 @@ cp ${DEPLOY_SCRIPT} ${DEPLOY_SCRIPT}.bak
# of the system are deployed, we'd get some reverts on the `mustGetAddress` functions # of the system are deployed, we'd get some reverts on the `mustGetAddress` functions
awk '{gsub(/mustGetAddress/, "getAddress")}1' ${DEPLOY_SCRIPT} > temp && mv temp ${DEPLOY_SCRIPT} awk '{gsub(/mustGetAddress/, "getAddress")}1' ${DEPLOY_SCRIPT} > temp && mv temp ${DEPLOY_SCRIPT}
FOUNDRY_PROFILE=kdeploy forge script -vvv test/kontrol/KontrolDeployment.sol:KontrolDeployment --sig 'runKontrolDeployment()' FOUNDRY_PROFILE=kdeploy forge script -vvv test/kontrol/deployment/KontrolDeployment.sol:KontrolDeployment --sig 'runKontrolDeployment()'
echo "Created state diff json" echo "Created state diff json"
# Restore the file from the backup # Restore the file from the backup
...@@ -39,6 +39,7 @@ GENERATED_STATEDIFF=Deploy.json # Name of the statediff json produced by the dep ...@@ -39,6 +39,7 @@ GENERATED_STATEDIFF=Deploy.json # Name of the statediff json produced by the dep
STATEDIFF=Kontrol-${GENERATED_STATEDIFF} # Name of the Kontrol statediff STATEDIFF=Kontrol-${GENERATED_STATEDIFF} # Name of the Kontrol statediff
mv snapshots/state-diff/${GENERATED_STATEDIFF} snapshots/state-diff/${STATEDIFF} mv snapshots/state-diff/${GENERATED_STATEDIFF} snapshots/state-diff/${STATEDIFF}
python3 ${JSON_SCRIPTS}/clean_json.py snapshots/state-diff/${STATEDIFF} python3 ${JSON_SCRIPTS}/clean_json.py snapshots/state-diff/${STATEDIFF}
jq . snapshots/state-diff/${STATEDIFF} > temp && mv temp snapshots/state-diff/${STATEDIFF} # Prettify json
echo "Cleaned state diff json" echo "Cleaned state diff json"
CONTRACT_NAMES=deployments/hardhat/.deploy CONTRACT_NAMES=deployments/hardhat/.deploy
......
...@@ -94,14 +94,14 @@ kontrol_prove() { ...@@ -94,14 +94,14 @@ kontrol_prove() {
--max-depth ${max_depth} \ --max-depth ${max_depth} \
--max-iterations ${max_iterations} \ --max-iterations ${max_iterations} \
--smt-timeout ${smt_timeout} \ --smt-timeout ${smt_timeout} \
--bmc-depth ${bmc_depth} \
--workers ${workers} \ --workers ${workers} \
${reinit} \ ${reinit} \
${bug_report} \ ${bug_report} \
${break_on_calls} \ ${break_on_calls} \
${auto_abstract} \ ${auto_abstract} \
${tests} \ ${tests} \
${use_booster} ${use_booster} \
--init-node-from ${state_diff}
} }
start_docker () { start_docker () {
...@@ -135,20 +135,26 @@ run () { ...@@ -135,20 +135,26 @@ run () {
} }
dump_log_results(){ dump_log_results(){
trap clean_docker ERR trap clean_docker ERR
RESULTS_LOG="results-$(date +'%Y-%m-%d-%H-%M-%S').tar.gz" RESULTS_FILE="results-$(date +'%Y-%m-%d-%H-%M-%S').tar.gz"
LOG_PATH="test/kontrol/logs"
RESULTS_LOG="${LOG_PATH}/${RESULTS_FILE}"
notif "Generating Results Log: ${RESULTS_LOG}" if [ ! -d ${LOG_PATH} ]; then
mkdir ${LOG_PATH}
fi
notif "Generating Results Log: ${LOG_PATH}"
blank_line blank_line
run tar -czvf results.tar.gz kout-proofs/ > /dev/null 2>&1 run tar -czvf results.tar.gz kout-proofs/ > /dev/null 2>&1
if [ "${LOCAL}" = true ]; then if [ "${LOCAL}" = true ]; then
cp results.tar.gz "${RESULTS_LOG}" mv results.tar.gz "${RESULTS_LOG}"
else else
docker cp ${CONTAINER_NAME}:/home/user/workspace/results.tar.gz "${RESULTS_LOG}" docker cp ${CONTAINER_NAME}:/home/user/workspace/results.tar.gz "${RESULTS_LOG}"
fi fi
if [ -f "${RESULTS_LOG}" ]; then if [ -f "${RESULTS_LOG}" ]; then
cp "${RESULTS_LOG}" kontrol-results_latest.tar.gz cp "${RESULTS_LOG}" "${LOG_PATH}/kontrol-results_latest.tar.gz"
else else
notif "Results Log: ${RESULTS_LOG} not found, skipping.." notif "Results Log: ${RESULTS_LOG} not found, skipping.."
blank_line blank_line
...@@ -160,7 +166,7 @@ dump_log_results(){ ...@@ -160,7 +166,7 @@ dump_log_results(){
notif "Results Log: ${RESULTS_LOG} generated" notif "Results Log: ${RESULTS_LOG} generated"
blank_line blank_line
RUN_LOG="run-kontrol-$(date +'%Y-%m-%d-%H-%M-%S').log" RUN_LOG="run-kontrol-$(date +'%Y-%m-%d-%H-%M-%S').log"
docker logs ${CONTAINER_NAME} > "${RUN_LOG}" docker logs ${CONTAINER_NAME} > "${LOG_PATH}/${RUN_LOG}"
fi fi
} }
...@@ -208,7 +214,6 @@ regen= ...@@ -208,7 +214,6 @@ regen=
max_depth=1000000 max_depth=1000000
max_iterations=1000000 max_iterations=1000000
smt_timeout=100000 smt_timeout=100000
bmc_depth=10
workers=1 workers=1
reinit=--reinit reinit=--reinit
reinit= reinit=
...@@ -220,14 +225,14 @@ bug_report=--bug-report ...@@ -220,14 +225,14 @@ bug_report=--bug-report
bug_report= bug_report=
use_booster=--use-booster use_booster=--use-booster
# use_booster= # use_booster=
state_diff="./snapshots/state-diff/Kontrol-Deploy.json"
######################################### #########################################
# List of tests to symbolically execute # # List of tests to symbolically execute #
######################################### #########################################
tests="" tests=""
tests+="--match-test CounterTest.test_SetNumber "
#tests+="--match-test OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused " #tests+="--match-test OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused "
#tests+="--match-test OptimismPortalKontrol.prove_finalizeWithdrawalTransaction_paused " tests+="--match-test OptimismPortalKontrol.prove_finalizeWithdrawalTransaction_paused "
############# #############
# RUN TESTS # # RUN TESTS #
......
...@@ -4,5 +4,5 @@ ...@@ -4,5 +4,5 @@
"geth": "v1.13.4", "geth": "v1.13.4",
"nvm": "v20.9.0", "nvm": "v20.9.0",
"slither": "0.10.0", "slither": "0.10.0",
"kontrol": "0.1.117" "kontrol": "0.1.121"
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment