Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Kontrol proof prove_relayMessage_paused #9156

Merged
merged 14 commits into from
Jan 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,954 changes: 2,408 additions & 546 deletions packages/contracts-bedrock/snapshots/state-diff/Kontrol-Deploy.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ contract L1CrossDomainMessenger_Test is Bridge_Initializer {
uint256 constant senderSlotIndex = 50;

/// @dev Tests that the implementation is initialized correctly.
function test_constructor_succeeds() external {
/// @notice Marked virtual to be overridden in
/// test/kontrol/deployment/DeploymentSummary.t.sol
function test_constructor_succeeds() external virtual {
L1CrossDomainMessenger impl = L1CrossDomainMessenger(deploy.mustGetAddress("L1CrossDomainMessenger"));
assertEq(address(impl.superchainConfig()), address(0));
assertEq(address(impl.PORTAL()), address(0));
Expand Down Expand Up @@ -110,7 +112,9 @@ contract L1CrossDomainMessenger_Test is Bridge_Initializer {

/// @dev Tests that the relayMessage function reverts when
/// the message version is not 0 or 1.
function test_relayMessage_v2_reverts() external {
/// @notice Marked virtual to be overridden in
/// test/kontrol/deployment/DeploymentSummary.t.sol
function test_relayMessage_v2_reverts() external virtual {
address target = address(0xabcd);
address sender = Predeploys.L2_CROSS_DOMAIN_MESSENGER;

Expand Down
6 changes: 4 additions & 2 deletions packages/contracts-bedrock/test/kontrol/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ test/kontrol
├── proofs
│   ├── interfaces
│   │   └── KontrolInterfaces.sol
│   ├── L1CrossDomainMessenger.k.sol
│   ├── OptimismPortal.k.sol
│   └── utils
│   ├── DeploymentSummaryCode.sol
Expand Down Expand Up @@ -43,9 +44,10 @@ test/kontrol

### [`proofs`](./proofs) folder

- [`OptimismPortal.k.sol`](./proofs/OptimismPortal.k.sol): Symbolic property tests
- [`L1CrossDomainMessenger.k.sol`](./proofs/L1CrossDomainMessenger.k.sol): Symbolic property tests for [`L1CrossDomainMessenger`](../../src/L1/L1CrossDomainMessenger.sol)
- [`OptimismPortal.k.sol`](./proofs/OptimismPortal.k.sol): Symbolic property tests for [`OptimismPortal`](../../src/L1/OptimismPortal.sol)
- [`interfaces`](./proofs/interfaces): Files with the signature of the functions involved in the verification effort
- [`utils`](./proofs/utils): Dependencies for `OptimismPortal.k.sol`, including the summary contracts
- [`utils`](./proofs/utils): Proof dependencies, including the summary contracts

### [`scripts`](./scripts) folder

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,31 @@ pragma solidity 0.8.15;

// Libraries
import { Constants } from "src/libraries/Constants.sol";
import { Predeploys } from "src/libraries/Predeploys.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 { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
import { DeploymentSummary } from "../proofs/utils/DeploymentSummary.sol";
import { OptimismPortal_Test } from "test/L1/OptimismPortal.t.sol";
import { L1CrossDomainMessenger_Test } from "test/L1/L1CrossDomainMessenger.t.sol";

/// @dev Contract testing the deployment summary correctness
contract DeploymentSummary_Test is DeploymentSummary, OptimismPortal_Test {
contract DeploymentSummary_TestOptimismPortal 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);
optimismPortal = OptimismPortal(payable(optimismPortalProxyAddress));
superchainConfig = SuperchainConfig(superchainConfigProxyAddress);
l2OutputOracle = L2OutputOracle(l2OutputOracleProxyAddress);
systemConfig = SystemConfig(systemConfigProxyAddress);

// Set up utilized addresses
depositor = makeAddr("depositor");
Expand All @@ -39,7 +42,7 @@ contract DeploymentSummary_Test is DeploymentSummary, OptimismPortal_Test {
/// 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));
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));
Expand Down Expand Up @@ -73,3 +76,42 @@ contract DeploymentSummary_Test is DeploymentSummary, OptimismPortal_Test {
/// the L2OutputOracle, which is needed in this test
function test_isOutputFinalized_succeeds() external override { }
}

contract DeploymentSummary_TestL1CrossDomainMessenger is DeploymentSummary, L1CrossDomainMessenger_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);
l1CrossDomainMessenger = L1CrossDomainMessenger(l1CrossDomainMessengerProxyAddress);

// Set up utilized addresses
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 {
// L1CrossDomainMessenger impl = L1CrossDomainMessenger(deploy.mustGetAddress("L1CrossDomainMessenger"));
L1CrossDomainMessenger impl = L1CrossDomainMessenger(l1CrossDomainMessengerAddress);
assertEq(address(impl.superchainConfig()), address(0));
assertEq(address(impl.PORTAL()), address(0));
assertEq(address(impl.portal()), address(0));
assertEq(address(impl.OTHER_MESSENGER()), Predeploys.L2_CROSS_DOMAIN_MESSENGER);
assertEq(address(impl.otherMessenger()), Predeploys.L2_CROSS_DOMAIN_MESSENGER);
}

/// @notice This test is overridden because `KontrolDeployment` doesn't deploy
/// L2CrossDomainMessenger, which is needed in this test
function test_relayMessage_v2_reverts() external override { }
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,18 @@ contract KontrolDeployment is Deploy {
deployERC1967Proxy("OptimismPortalProxy");
deployERC1967Proxy("L2OutputOracleProxy");
deployERC1967Proxy("SystemConfigProxy");
deployL1CrossDomainMessengerProxy();
transferAddressManagerOwnership(); // to the ProxyAdmin

// deployImplementations();
deployOptimismPortal();
deployL1CrossDomainMessenger();
deployL2OutputOracle();
deploySystemConfig();

// initializeImplementations();
initializeSystemConfig();
initializeL1CrossDomainMessenger();
initializeOptimismPortal();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import { DeploymentSummary } from "./utils/DeploymentSummary.sol";
import { KontrolUtils } from "./utils/KontrolUtils.sol";
import {
IL1CrossDomainMessenger as L1CrossDomainMessenger,
ISuperchainConfig as SuperchainConfig
} from "./interfaces/KontrolInterfaces.sol";

contract L1CrossDomainMessengerKontrol is DeploymentSummary, KontrolUtils {
L1CrossDomainMessenger l1CrossDomainMessenger;
SuperchainConfig superchainConfig;

/// @dev Inlined setUp function for faster Kontrol performance
/// Tracking issue: https://github.com/runtimeverification/kontrol/issues/282
function setUpInlined() public {
l1CrossDomainMessenger = L1CrossDomainMessenger(l1CrossDomainMessengerProxyAddress);
superchainConfig = SuperchainConfig(superchainConfigProxyAddress);
}

/// TODO: Replace struct parameters and workarounds with the appropriate
/// types once Kontrol supports symbolic `bytes` and `bytes[]`
/// Tracking issue: https://github.com/runtimeverification/kontrol/issues/272
function prove_relayMessage_paused(
uint256 _nonce,
address _sender,
address _target,
uint256 _value,
uint256 _gas
)
external
{
setUpInlined();

bytes memory _message = freshBigBytes(600);

// Pause System
vm.prank(superchainConfig.guardian());
superchainConfig.pause("identifier");

vm.expectRevert("CrossDomainMessenger: paused");
l1CrossDomainMessenger.relayMessage(_nonce, _sender, _target, _value, _gas, _message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils {
/// @dev Inlined setUp function for faster Kontrol performance
/// Tracking issue: https://github.com/runtimeverification/kontrol/issues/282
function setUpInlined() public {
optimismPortal = OptimismPortal(payable(OptimismPortalProxyAddress));
superchainConfig = SuperchainConfig(SuperchainConfigProxyAddress);
optimismPortal = OptimismPortal(payable(optimismPortalProxyAddress));
superchainConfig = SuperchainConfig(superchainConfigProxyAddress);
}

/// TODO: Replace struct parameters and workarounds with the appropriate
Expand Down Expand Up @@ -59,7 +59,7 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils {
optimismPortal.proveWithdrawalTransaction(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
}

/// TODO: Replace struct parameters and workarounds with the appropiate
/// TODO: Replace struct parameters and workarounds with the appropriate
/// types once Kontrol supports symbolic `bytes` and `bytes[]`
/// Tracking issue: https://github.com/runtimeverification/kontrol/issues/272
function prove_finalizeWithdrawalTransaction_paused(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,18 @@ interface ISuperchainConfig {

function unpause() external;
}

interface IL1CrossDomainMessenger {
function paused() external view returns (bool);

function relayMessage(
uint256 _nonce,
address _sender,
address _target,
uint256 _value,
uint256 _minGasLimit,
bytes calldata _message
)
external
payable;
}
Loading