From c0d18e86a7d1c3f62297288c1c55a89aaa4591d3 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Wed, 6 Sep 2023 16:00:29 +0800 Subject: [PATCH] refactor(protocol): reserve slots for upgradability & add bond events (#14657) Co-authored-by: Daniel Wang Co-authored-by: David --- packages/protocol/contracts/L1/TaikoData.sol | 10 +++++++--- packages/protocol/contracts/L1/TaikoEvents.sol | 8 ++++++++ packages/protocol/contracts/L1/libs/LibDepositing.sol | 7 +++---- packages/protocol/contracts/L1/libs/LibProposing.sol | 3 +++ packages/protocol/contracts/L1/libs/LibProving.sol | 3 +-- packages/protocol/contracts/L1/libs/LibVerifying.sol | 7 ++++++- packages/protocol/contracts/L2/TaikoL2.sol | 5 +---- packages/protocol/script/DeployOnL1.s.sol | 3 --- .../protocol/script/upgrade/SetAddressManager.s.sol | 1 - .../protocol/script/upgrade/TransferOwnership.s.sol | 1 - .../script/upgrade/UpgradeAddressManager.s.sol | 3 --- packages/protocol/script/upgrade/UpgradeBridge.s.sol | 3 --- .../protocol/script/upgrade/UpgradeERC1155Vault.s.sol | 3 --- .../protocol/script/upgrade/UpgradeERC20Vault.s.sol | 3 --- .../protocol/script/upgrade/UpgradeERC721Vault.s.sol | 3 --- packages/protocol/script/upgrade/UpgradeScript.s.sol | 1 - .../protocol/script/upgrade/UpgradeSignalService.sol | 3 --- packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol | 3 --- packages/protocol/script/upgrade/UpgradeTaikoL2.s.sol | 3 --- .../protocol/script/upgrade/UpgradeTaikoToken.s.sol | 3 --- 20 files changed, 29 insertions(+), 47 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index a57abb34d2..629cd659fd 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -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 @@ -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; @@ -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; } } diff --git a/packages/protocol/contracts/L1/TaikoEvents.sol b/packages/protocol/contracts/L1/TaikoEvents.sol index 49dfe80ccd..4fdc049e9f 100644 --- a/packages/protocol/contracts/L1/TaikoEvents.sol +++ b/packages/protocol/contracts/L1/TaikoEvents.sol @@ -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); } diff --git a/packages/protocol/contracts/L1/libs/LibDepositing.sol b/packages/protocol/contracts/L1/libs/LibDepositing.sol index daf7b07380..4a51f18ef0 100644 --- a/packages/protocol/contracts/L1/libs/LibDepositing.sol +++ b/packages/protocol/contracts/L1/libs/LibDepositing.sol @@ -9,8 +9,6 @@ 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 @@ -18,7 +16,6 @@ import { TaikoData } from "../TaikoData.sol"; library LibDepositing { using LibAddress for address; using LibMath for uint256; - using SafeCastUpgradeable for uint256; event EthDeposited(TaikoData.EthDeposit deposit); @@ -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 }) ); diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index ae82509e05..c90edf13a4 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -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(); @@ -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 diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 1619f2614a..fc26b687e9 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -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 diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 053d257f1f..4b086fda47 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -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(); @@ -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); diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index 1193e77793..cab9fdcaf1 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -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 @@ -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 { @@ -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 diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol index 9496deb3d6..5d42d6dc0e 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/DeployOnL1.s.sol @@ -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"; @@ -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"); diff --git a/packages/protocol/script/upgrade/SetAddressManager.s.sol b/packages/protocol/script/upgrade/SetAddressManager.s.sol index 924943c4e3..1c0fa7c073 100644 --- a/packages/protocol/script/upgrade/SetAddressManager.s.sol +++ b/packages/protocol/script/upgrade/SetAddressManager.s.sol @@ -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 { diff --git a/packages/protocol/script/upgrade/TransferOwnership.s.sol b/packages/protocol/script/upgrade/TransferOwnership.s.sol index b8398947f5..e3e14c5e60 100644 --- a/packages/protocol/script/upgrade/TransferOwnership.s.sol +++ b/packages/protocol/script/upgrade/TransferOwnership.s.sol @@ -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 { diff --git a/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol b/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol index 5f65b83ab2..d68bc7f555 100644 --- a/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol +++ b/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol @@ -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"; diff --git a/packages/protocol/script/upgrade/UpgradeBridge.s.sol b/packages/protocol/script/upgrade/UpgradeBridge.s.sol index f15c7f9524..c85feace55 100644 --- a/packages/protocol/script/upgrade/UpgradeBridge.s.sol +++ b/packages/protocol/script/upgrade/UpgradeBridge.s.sol @@ -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"; diff --git a/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol b/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol index edb55e9395..7373ca202c 100644 --- a/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol +++ b/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol @@ -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"; diff --git a/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol b/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol index 6445073284..5184a56edf 100644 --- a/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol +++ b/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol @@ -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"; diff --git a/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol b/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol index 19384ac709..270aba5ba0 100644 --- a/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol +++ b/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol @@ -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"; diff --git a/packages/protocol/script/upgrade/UpgradeScript.s.sol b/packages/protocol/script/upgrade/UpgradeScript.s.sol index 0d795c6e3f..31aece2a5d 100644 --- a/packages/protocol/script/upgrade/UpgradeScript.s.sol +++ b/packages/protocol/script/upgrade/UpgradeScript.s.sol @@ -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"); diff --git a/packages/protocol/script/upgrade/UpgradeSignalService.sol b/packages/protocol/script/upgrade/UpgradeSignalService.sol index c1a98d645d..aa2e887319 100644 --- a/packages/protocol/script/upgrade/UpgradeSignalService.sol +++ b/packages/protocol/script/upgrade/UpgradeSignalService.sol @@ -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"; diff --git a/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol b/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol index bd08bd7e1d..7eccfcea3d 100644 --- a/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol +++ b/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol @@ -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"; diff --git a/packages/protocol/script/upgrade/UpgradeTaikoL2.s.sol b/packages/protocol/script/upgrade/UpgradeTaikoL2.s.sol index 0151f8c2db..0d4887a1dc 100644 --- a/packages/protocol/script/upgrade/UpgradeTaikoL2.s.sol +++ b/packages/protocol/script/upgrade/UpgradeTaikoL2.s.sol @@ -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"; diff --git a/packages/protocol/script/upgrade/UpgradeTaikoToken.s.sol b/packages/protocol/script/upgrade/UpgradeTaikoToken.s.sol index 494acf37e4..e901190abb 100644 --- a/packages/protocol/script/upgrade/UpgradeTaikoToken.s.sol +++ b/packages/protocol/script/upgrade/UpgradeTaikoToken.s.sol @@ -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";