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

feat: update to use taiko protocol v1.9.0 #39

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
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
3 changes: 0 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,3 @@
[submodule "lib/ens-contracts"]
path = lib/ens-contracts
url = https://github.com/ensdomains/ens-contracts.git
[submodule "lib/taiko-mono"]
path = lib/taiko-mono
url = https://github.com/taikoxyz/taiko-mono
1 change: 0 additions & 1 deletion lib/taiko-mono
Submodule taiko-mono deleted from dd8725
1 change: 0 additions & 1 deletion remappings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,3 @@
@aragon/osx/=lib/osx/packages/contracts/src/
@ensdomains/ens-contracts/=lib/ens-contracts/
forge-std/=lib/forge-std/src/
@taikoxyz/taiko-mono=lib/taiko-mono/packages/protocol/contracts/
17 changes: 6 additions & 11 deletions src/OptimisticTokenVotingPlugin.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {ProposalUpgradeable} from "@aragon/osx/core/plugin/proposal/ProposalUpgr
import {PluginUUPSUpgradeable} from "@aragon/osx/core/plugin/PluginUUPSUpgradeable.sol";
import {RATIO_BASE, _applyRatioCeiled, RatioOutOfBounds} from "@aragon/osx/plugins/utils/Ratio.sol";
import {IDAO} from "@aragon/osx/core/dao/IDAO.sol";
import {TaikoL1, TaikoData} from "./adapted-dependencies/TaikoL1.sol";
import {ITaikoL1} from "./adapted-dependencies/ITaikoL1.sol";

/// @title OptimisticTokenVotingPlugin
/// @author Aragon Association - 2023-2024
Expand Down Expand Up @@ -91,7 +91,7 @@ contract OptimisticTokenVotingPlugin is
address public taikoBridge;

/// @notice Taiko L1 contract to check the status from.
TaikoL1 public taikoL1;
ITaikoL1 public taikoL1;

/// @notice The struct storing the governance settings.
/// @dev Takes 1 storage slot (32+64+64+64)
Expand Down Expand Up @@ -168,7 +168,7 @@ contract OptimisticTokenVotingPlugin is
if (_taikoL1 == address(0)) revert();

votingToken = _token;
taikoL1 = TaikoL1(_taikoL1);
taikoL1 = ITaikoL1(_taikoL1);
taikoBridge = _taikoBridge;

_updateOptimisticGovernanceSettings(_governanceSettings);
Expand Down Expand Up @@ -220,14 +220,9 @@ contract OptimisticTokenVotingPlugin is
return false;
}

try taikoL1.slotB() returns (TaikoData.SlotB memory _slot) {
// No L2 blocks yet
if (_slot.numBlocks == 0) return false;

// The last L2 block is too old
TaikoData.Block memory _block = taikoL1.getBlock(_slot.numBlocks - 1);
// proposedAt < (block.timestamp - l2InactivityPeriod), written as a sum
if ((_block.proposedAt + governanceSettings.l2InactivityPeriod) < block.timestamp) return false;
try taikoL1.getLastVerifiedBlock() returns (uint64, bytes32, bytes32, uint64 verifiedAt) {
// verifiedAt < (block.timestamp - l2InactivityPeriod), written as a sum
if ((verifiedAt + governanceSettings.l2InactivityPeriod) < block.timestamp) return false;
} catch {
// Assume that L2 is not available if we can't read properly
return false;
Expand Down
21 changes: 21 additions & 0 deletions src/adapted-dependencies/ITaikoL1.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/// @dev Manual copy of lib/taiko-mono/packages/protocol/contracts/L1/TaikoL1.sol and its dependent structs
/// from https://github.com/taikoxyz/taiko-mono/tree/protocol-v1.9.0.
/// This is in order to overcome the conflicting compiler versions between 0.8.17 (OSx) and 0.8.24 (Taiko)
interface ITaikoL1 {
/// @notice Returns true if the contract is paused, and false otherwise.
/// @return true if paused, false otherwise.
function paused() external view returns (bool);

/// @notice Returns information about the last verified block.
/// @return blockId The last verified block's ID.
/// @return blockHash The last verified block's blockHash.
/// @return stateRoot The last verified block's stateRoot.
/// @return verifiedAt The timestamp this block is verified at.
function getLastVerifiedBlock()
external
view
returns (uint64 blockId, bytes32 blockHash, bytes32 stateRoot, uint64 verifiedAt);
}
85 changes: 0 additions & 85 deletions src/adapted-dependencies/TaikoL1.sol

This file was deleted.

2 changes: 1 addition & 1 deletion src/setup/OptimisticTokenVotingPluginSetup.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {IGovernanceWrappedERC20} from "@aragon/osx/token/ERC20/governance/IGover
import {OptimisticTokenVotingPlugin} from "../OptimisticTokenVotingPlugin.sol";
import {StandardProposalCondition} from "../conditions/StandardProposalCondition.sol";
import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import {TaikoL1} from "../adapted-dependencies/TaikoL1.sol";
import {ITaikoL1} from "../adapted-dependencies/ITaikoL1.sol";

/// @title OptimisticTokenVotingPluginSetup
/// @author Aragon Association - 2022-2023
Expand Down
2 changes: 1 addition & 1 deletion test/EmergencyMultisigPluginSetup.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {IPluginSetup} from "@aragon/osx/framework/plugin/setup/PluginSetup.sol";
import {PermissionLib} from "@aragon/osx/core/permission/PermissionLib.sol";
import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import {ERC20Mock} from "./mocks/ERC20Mock.sol";
import {TaikoL1} from "../src/adapted-dependencies/TaikoL1.sol";
import {ITaikoL1} from "../src/adapted-dependencies/ITaikoL1.sol";

contract EmergencyMultisigPluginSetupTest is Test {
EmergencyMultisigPluginSetup public pluginSetup;
Expand Down
2 changes: 1 addition & 1 deletion test/MultisigPluginSetup.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {IPluginSetup} from "@aragon/osx/framework/plugin/setup/PluginSetup.sol";
import {PermissionLib} from "@aragon/osx/core/permission/PermissionLib.sol";
import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import {ERC20Mock} from "./mocks/ERC20Mock.sol";
import {TaikoL1} from "../src/adapted-dependencies/TaikoL1.sol";
import {ITaikoL1} from "../src/adapted-dependencies/ITaikoL1.sol";

contract MultisigPluginSetupTest is Test {
MultisigPluginSetup public pluginSetup;
Expand Down
6 changes: 3 additions & 3 deletions test/OptimisticTokenVotingPlugin.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {IMembership} from "@aragon/osx/core/plugin/membership/IMembership.sol";
import {RATIO_BASE, RatioOutOfBounds} from "@aragon/osx/plugins/utils/Ratio.sol";
import {DaoUnauthorized} from "@aragon/osx/core/utils/auth.sol";
import {GovernanceERC20Mock} from "./mocks/GovernanceERC20Mock.sol";
import {TaikoL1} from "../src/adapted-dependencies/TaikoL1.sol";
import {ITaikoL1} from "../src/adapted-dependencies/ITaikoL1.sol";
import {IERC165Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol";
import {IERC1822ProxiableUpgradeable} from
"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol";
Expand All @@ -25,7 +25,7 @@ contract OptimisticTokenVotingPluginTest is AragonTest {
DAO dao;
OptimisticTokenVotingPlugin optimisticPlugin;
GovernanceERC20Mock votingToken;
TaikoL1 taikoL1;
ITaikoL1 taikoL1;

// Events from external contracts
event Initialized(uint8 version);
Expand Down Expand Up @@ -261,7 +261,7 @@ contract OptimisticTokenVotingPluginTest is AragonTest {
assertEq(address(optimisticPlugin.taikoBridge()), address(taikoBridge), "Incorrect taikoBridge");

// Different taikoL1 contract
taikoL1 = TaikoL1(address(0x1234));
taikoL1 = ITaikoL1(address(0x1234));
optimisticPlugin = OptimisticTokenVotingPlugin(
createProxyAndCall(
address(OPTIMISTIC_BASE),
Expand Down
6 changes: 3 additions & 3 deletions test/OptimisticTokenVotingPluginSetup.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {IPluginSetup} from "@aragon/osx/framework/plugin/setup/PluginSetup.sol";
import {PermissionLib} from "@aragon/osx/core/permission/PermissionLib.sol";
import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import {ERC20Mock} from "./mocks/ERC20Mock.sol";
import {TaikoL1} from "../src/adapted-dependencies/TaikoL1.sol";
import {ITaikoL1} from "../src/adapted-dependencies/ITaikoL1.sol";

contract OptimisticTokenVotingPluginSetupTest is Test {
OptimisticTokenVotingPluginSetup public pluginSetup;
Expand All @@ -27,7 +27,7 @@ contract OptimisticTokenVotingPluginSetupTest is Test {
OptimisticTokenVotingPlugin.OptimisticGovernanceSettings votingSettings;
OptimisticTokenVotingPluginSetup.TokenSettings tokenSettings;
GovernanceERC20.MintSettings mintSettings;
TaikoL1 taikoL1;
ITaikoL1 taikoL1;
address taikoBridge;
uint64 stdProposalMinDuration;
address stdProposer;
Expand Down Expand Up @@ -68,7 +68,7 @@ contract OptimisticTokenVotingPluginSetupTest is Test {
symbol: "wTK"
});
mintSettings = GovernanceERC20.MintSettings({receivers: new address[](0), amounts: new uint256[](0)});
taikoL1 = TaikoL1(address(0x66666666));
taikoL1 = ITaikoL1(address(0x66666666));
taikoBridge = address(0x55555555);
stdProposalMinDuration = 10 days;
stdProposer = address(0x1234567890);
Expand Down
2 changes: 1 addition & 1 deletion test/base/AragonTest.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.s
import {createProxyAndCall} from "../../src/helpers/proxy.sol";
import {RATIO_BASE} from "@aragon/osx/plugins/utils/Ratio.sol";
import {TaikoL1Mock, TaikoL1PausedMock, TaikoL1WithOldLastBlock} from "../mocks/TaikoL1Mock.sol";
import {TaikoL1} from "../../src/adapted-dependencies/TaikoL1.sol";
import {ITaikoL1} from "../../src/adapted-dependencies/ITaikoL1.sol";
import {ALICE_ADDRESS, BOB_ADDRESS, CAROL_ADDRESS, DAVID_ADDRESS, TAIKO_BRIDGE_ADDRESS} from "../constants.sol";
import {Test} from "forge-std/Test.sol";

Expand Down
6 changes: 3 additions & 3 deletions test/helpers/DaoBuilder.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {OptimisticTokenVotingPlugin} from "../../src/OptimisticTokenVotingPlugin
import {createProxyAndCall} from "../../src/helpers/proxy.sol";
import {RATIO_BASE} from "@aragon/osx/plugins/utils/Ratio.sol";
import {TaikoL1Mock, TaikoL1PausedMock, TaikoL1WithOldLastBlock, TaikoL1Incompatible} from "../mocks/TaikoL1Mock.sol";
import {TaikoL1} from "../../src/adapted-dependencies/TaikoL1.sol";
import {ITaikoL1} from "../../src/adapted-dependencies/ITaikoL1.sol";
import {ALICE_ADDRESS, TAIKO_BRIDGE_ADDRESS} from "../constants.sol";
import {GovernanceERC20Mock} from "../mocks/GovernanceERC20Mock.sol";

Expand Down Expand Up @@ -162,7 +162,7 @@ contract DaoBuilder is Test {
Multisig multisig,
EmergencyMultisig emergencyMultisig,
GovernanceERC20Mock votingToken,
TaikoL1 taikoL1
ITaikoL1 taikoL1
)
{
// Deploy the DAO with `this` as root
Expand Down Expand Up @@ -193,7 +193,7 @@ contract DaoBuilder is Test {
} else if (taikoL1Status == TaikoL1Status.OutOfSync) {
taikoL1 = new TaikoL1WithOldLastBlock();
} else {
taikoL1 = TaikoL1(address(new TaikoL1Incompatible()));
taikoL1 = ITaikoL1(address(new TaikoL1Incompatible()));
}

{
Expand Down
61 changes: 38 additions & 23 deletions test/mocks/TaikoL1Mock.sol
Original file line number Diff line number Diff line change
@@ -1,46 +1,61 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.17 <0.9.0;

import {TaikoL1, TaikoData} from "../../src/adapted-dependencies/TaikoL1.sol";
import {ITaikoL1} from "../../src/adapted-dependencies/ITaikoL1.sol";

/// @dev Returns an unpaused TaikoL1 with any given block proposed 1 second ago
contract TaikoL1Mock is TaikoL1 {
function paused() external pure override returns (bool) {
contract TaikoL1Mock is ITaikoL1 {
function paused() public pure override returns (bool) {
return false;
}

function slotB() public pure override returns (TaikoData.SlotB memory result) {
result.numBlocks = 90;
}

function getBlock(uint64 _blockId) public view override returns (TaikoData.Block memory result) {
_blockId;
result.proposedAt = uint64(block.timestamp) - 1;
function getLastVerifiedBlock()
external
view
override
returns (uint64 blockId, bytes32 blockHash, bytes32 stateRoot, uint64 verifiedAt)
{
blockId;
blockHash;
stateRoot;
verifiedAt = uint64(block.timestamp) - 1;
}
}

/// @dev Returns a paused TaikoL1
contract TaikoL1PausedMock is TaikoL1 {
function paused() external pure override returns (bool) {
contract TaikoL1PausedMock is ITaikoL1 {
function paused() public pure override returns (bool) {
return true;
}

function slotB() public view override returns (TaikoData.SlotB memory result) {}
function getBlock(uint64 _blockId) public view override returns (TaikoData.Block memory) {}
function getLastVerifiedBlock()
external
pure
override
returns (uint64 blockId, bytes32 blockHash, bytes32 stateRoot, uint64 verifiedAt)
{
blockId;
blockHash;
stateRoot;
verifiedAt = 0;
}
}

contract TaikoL1WithOldLastBlock is TaikoL1 {
function paused() external pure override returns (bool) {
contract TaikoL1WithOldLastBlock is ITaikoL1 {
function paused() public pure override returns (bool) {
return false;
}

function slotB() public pure override returns (TaikoData.SlotB memory result) {
result.numBlocks = 1;
}

function getBlock(uint64 _blockId) public pure override returns (TaikoData.Block memory result) {
_blockId;
result.proposedAt = 1;
function getLastVerifiedBlock()
external
pure
override
returns (uint64 blockId, bytes32 blockHash, bytes32 stateRoot, uint64 verifiedAt)
{
blockId;
blockHash;
stateRoot;
verifiedAt = 1;
}
}

Expand Down
Loading