Skip to content

Commit

Permalink
refactor(protocol): reserve slots for upgradability & add bond events (
Browse files Browse the repository at this point in the history
…#14657)

Co-authored-by: Daniel Wang <dong77@gmail.com>
Co-authored-by: David <david@taiko.xyz>
  • Loading branch information
3 people committed Sep 6, 2023
1 parent 09c11bb commit c0d18e8
Show file tree
Hide file tree
Showing 20 changed files with 29 additions and 47 deletions.
10 changes: 7 additions & 3 deletions packages/protocol/contracts/L1/TaikoData.sol
Original file line number Diff line number Diff line change
Expand Up @@ -128,17 +128,18 @@ library TaikoData {
}

/// @dev Struct representing state transition data.
/// 4 slots.
/// 10 slots reserved for upgradability, 4 slots used.
struct Transition {
bytes32 key; //only written/read for the 1st state transition.
bytes32 blockHash;
bytes32 signalRoot;
address prover;
uint64 provenAt;
bytes32[6] __reserved;
}

/// @dev Struct containing data required for verifying a block.
/// 3 slots.
/// 10 slots reserved for upgradability, 3 slots used.
struct Block {
bytes32 metaHash; // slot 1
address prover; // slot 2
Expand All @@ -147,15 +148,18 @@ library TaikoData {
uint64 proposedAt;
uint32 nextTransitionId;
uint32 verifiedTransitionId;
bytes32[7] __reserved;
}

/// @dev Struct representing information about a transaction list.
/// 1 slot used.
struct TxListInfo {
uint64 validSince;
uint24 size;
}

/// @dev Struct representing an Ethereum deposit.
/// 1 slot used.
struct EthDeposit {
address recipient;
uint96 amount;
Expand Down Expand Up @@ -203,6 +207,6 @@ library TaikoData {
mapping(address account => uint256 balance) taikoTokenBalances;
SlotA slotA; // slot 7
SlotB slotB; // slot 8
uint256[42] __gap;
uint256[142] __gap;
}
}
8 changes: 8 additions & 0 deletions packages/protocol/contracts/L1/TaikoEvents.sol
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,12 @@ abstract contract TaikoEvents {
/// @param deposit The Ethereum deposit information including recipient,
/// amount, and ID.
event EthDeposited(TaikoData.EthDeposit deposit);

/// @dev The following events are emitted when bonds are received, returned,
/// or rewarded. Note that no event is emitted when a bond is kept/burnt as
/// for a single block, multiple bonds may get burned or retained by the
/// protocol, emitting events will consume more gas.
event BondReceived(address indexed from, uint64 blockId, uint256 bond);
event BondReturned(address indexed to, uint64 blockId, uint256 bond);
event BondRewarded(address indexed to, uint64 blockId, uint256 bond);
}
7 changes: 3 additions & 4 deletions packages/protocol/contracts/L1/libs/LibDepositing.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,13 @@ pragma solidity ^0.8.20;
import { AddressResolver } from "../../common/AddressResolver.sol";
import { LibAddress } from "../../libs/LibAddress.sol";
import { LibMath } from "../../libs/LibMath.sol";
import { SafeCastUpgradeable } from
"@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import { TaikoData } from "../TaikoData.sol";

/// @title LibDepositing
/// @notice A library for handling Ether deposits in the Taiko protocol.
library LibDepositing {
using LibAddress for address;
using LibMath for uint256;
using SafeCastUpgradeable for uint256;

event EthDeposited(TaikoData.EthDeposit deposit);

Expand Down Expand Up @@ -51,12 +48,14 @@ library LibDepositing {
address _recipient = recipient == address(0) ? msg.sender : recipient;
uint256 slot =
state.slotA.numEthDeposits % config.ethDepositRingBufferSize;

// range of msg.value is checked by next line.
state.ethDeposits[slot] = _encodeEthDeposit(_recipient, msg.value);

emit EthDeposited(
TaikoData.EthDeposit({
recipient: _recipient,
amount: msg.value.toUint96(),
amount: uint96(msg.value),
id: state.slotA.numEthDeposits
})
);
Expand Down
3 changes: 3 additions & 0 deletions packages/protocol/contracts/L1/libs/LibProposing.sol
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ library LibProposing {
uint256 reward,
TaikoData.BlockMetadata meta
);
event BondReceived(address indexed from, uint64 blockId, uint256 bond);

error L1_INVALID_ASSIGNMENT();
error L1_INVALID_BLOCK_ID();
Expand Down Expand Up @@ -89,6 +90,8 @@ library LibProposing {
amount: config.proofBond
});

emit BondReceived(assignment.prover, b.numBlocks, config.proofBond);

// Pay prover after verifying assignment
if (config.skipProverAssignmentVerificaiton) {
// For testing only
Expand Down
3 changes: 1 addition & 2 deletions packages/protocol/contracts/L1/libs/LibProving.sol
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,7 @@ library LibProving {
// A block can be proven by a regular prover in the following cases:
// 1. The actual prover is the assigned prover
// 2. The block has at least one state transition (which must be
// from the
// assigned prover)
// from the assigned prover)
// 3. The block has become open
if (
evidence.prover != blk.prover && blk.nextTransitionId == 1
Expand Down
7 changes: 6 additions & 1 deletion packages/protocol/contracts/L1/libs/LibVerifying.sol
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ library LibVerifying {
event CrossChainSynced(
uint64 indexed srcHeight, bytes32 blockHash, bytes32 signalRoot
);
event BondReturned(address indexed to, uint64 blockId, uint256 bond);
event BondRewarded(address indexed to, uint64 blockId, uint256 bond);

error L1_BLOCK_ID_MISMATCH();
error L1_INVALID_CONFIG();
Expand Down Expand Up @@ -146,8 +148,11 @@ library LibVerifying {
|| tran.provenAt <= blk.proposedAt + config.proofWindow
) {
state.taikoTokenBalances[blk.prover] += blk.proofBond;
emit BondReturned(blk.prover, blockId, blk.proofBond);
} else {
state.taikoTokenBalances[tran.prover] += blk.proofBond / 4;
uint256 rewardAmount = blk.proofBond / 4;
state.taikoTokenBalances[tran.prover] += rewardAmount;
emit BondRewarded(tran.prover, blockId, rewardAmount);
}

emit BlockVerified(blockId, tran.prover, tran.blockHash);
Expand Down
5 changes: 1 addition & 4 deletions packages/protocol/contracts/L2/TaikoL2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ import { ICrossChainSync } from "../common/ICrossChainSync.sol";
import { Lib1559Math } from "../libs/Lib1559Math.sol";
import { LibMath } from "../libs/LibMath.sol";
import { Proxied } from "../common/Proxied.sol";
import { SafeCastUpgradeable } from
"@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import { TaikoL2Signer } from "./TaikoL2Signer.sol";

/// @title TaikoL2
Expand All @@ -22,7 +20,6 @@ import { TaikoL2Signer } from "./TaikoL2Signer.sol";
/// communication, manage EIP-1559 parameters for gas pricing, and store
/// verified L1 block information.
contract TaikoL2 is EssentialContract, TaikoL2Signer, ICrossChainSync {
using SafeCastUpgradeable for uint256;
using LibMath for uint256;

struct VerifiedBlock {
Expand Down Expand Up @@ -59,7 +56,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, ICrossChainSync {
uint64 public gasExcess;
uint64 private __reserved1;

uint256[45] private __gap;
uint256[145] private __gap;

// Captures all block variables mentioned in
// https://docs.soliditylang.org/en/v0.8.20/units-and-global-variables.html
Expand Down
3 changes: 0 additions & 3 deletions packages/protocol/script/DeployOnL1.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import "forge-std/Script.sol";
import "forge-std/console2.sol";
import
"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "../contracts/L1/TaikoToken.sol";
import "../contracts/L1/TaikoL1.sol";
import "../contracts/L1/ProofVerifier.sol";
Expand All @@ -24,8 +23,6 @@ import "../contracts/test/erc20/FreeMintERC20.sol";
import "../contracts/test/erc20/MayFailFreeMintERC20.sol";

contract DeployOnL1 is Script {
using SafeCastUpgradeable for uint256;

bytes32 public genesisHash = vm.envBytes32("L2_GENESIS_HASH");

uint256 public deployerPrivateKey = vm.envUint("PRIVATE_KEY");
Expand Down
1 change: 0 additions & 1 deletion packages/protocol/script/upgrade/SetAddressManager.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "./UpgradeScript.s.sol";

interface IEssentialContract {
Expand Down
1 change: 0 additions & 1 deletion packages/protocol/script/upgrade/TransferOwnership.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "./UpgradeScript.s.sol";

interface IOwnable {
Expand Down
3 changes: 0 additions & 3 deletions packages/protocol/script/upgrade/UpgradeAddressManager.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import
"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "../../contracts/common/AddressManager.sol";
import "./UpgradeScript.s.sol";

Expand Down
3 changes: 0 additions & 3 deletions packages/protocol/script/upgrade/UpgradeBridge.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import
"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "../../contracts/bridge/Bridge.sol";
import "./UpgradeScript.s.sol";

Expand Down
3 changes: 0 additions & 3 deletions packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import
"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "../../contracts/tokenvault/ERC1155Vault.sol";
import "./UpgradeScript.s.sol";

Expand Down
3 changes: 0 additions & 3 deletions packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import
"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "../../contracts/tokenvault/ERC20Vault.sol";
import "./UpgradeScript.s.sol";

Expand Down
3 changes: 0 additions & 3 deletions packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import
"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "../../contracts/tokenvault/ERC721Vault.sol";
import "./UpgradeScript.s.sol";

Expand Down
1 change: 0 additions & 1 deletion packages/protocol/script/upgrade/UpgradeScript.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import "forge-std/Script.sol";
import "forge-std/console2.sol";
import
"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";

contract UpgradeScript is Script {
uint256 public deployerPrivateKey = vm.envUint("PRIVATE_KEY");
Expand Down
3 changes: 0 additions & 3 deletions packages/protocol/script/upgrade/UpgradeSignalService.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import
"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "../../contracts/signal/SignalService.sol";
import "./UpgradeScript.s.sol";

Expand Down
3 changes: 0 additions & 3 deletions packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import
"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "../../contracts/L1/TaikoL1.sol";
import "./UpgradeScript.s.sol";

Expand Down
3 changes: 0 additions & 3 deletions packages/protocol/script/upgrade/UpgradeTaikoL2.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import
"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "../../contracts/L2/TaikoL2.sol";
import "./UpgradeScript.s.sol";

Expand Down
3 changes: 0 additions & 3 deletions packages/protocol/script/upgrade/UpgradeTaikoToken.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import
"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "../../contracts/L1/TaikoToken.sol";
import "./UpgradeScript.s.sol";

Expand Down

0 comments on commit c0d18e8

Please sign in to comment.