From cc03987f47aa96848d28cfc8e003c3e1cade2539 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 25 Feb 2024 18:13:05 +0800 Subject: [PATCH 1/8] cooldown and proving window in minutes --- .../protocol/contracts/L1/libs/LibProving.sol | 2 +- .../contracts/L1/libs/LibVerifying.sol | 2 +- .../contracts/L1/tiers/ITierProvider.sol | 5 +- .../L1/tiers/MainnetTierProvider.sol | 87 +++++++++++++++++++ .../L1/tiers/OptimisticTierProvider.sol | 65 -------------- .../L1/tiers/TestnetTierProvider.sol | 14 +-- packages/protocol/script/DeployOnL1.s.sol | 6 +- packages/protocol/script/test_deploy_on_l1.sh | 2 +- packages/protocol/test/L1/TaikoL1.t.sol | 4 +- .../test/L1/TaikoL1LibProvingWithTiers.t.sol | 38 ++++---- 10 files changed, 125 insertions(+), 100 deletions(-) create mode 100644 packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol delete mode 100644 packages/protocol/contracts/L1/tiers/OptimisticTierProvider.sol diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index b7ee0fcd69..1e20d75f77 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -399,7 +399,7 @@ library LibProving { if (tier.contestBond == 0) return; bool inProvingWindow = uint256(ts.timestamp).max(state.slotB.lastUnpausedAt) - + tier.provingWindow >= block.timestamp; + + tier.provingWindow * 60 >= block.timestamp; bool isAssignedPover = msg.sender == blk.assignedProver; // The assigned prover can only submit the very first transition. diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index fc03215c01..979acbcb3e 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -172,7 +172,7 @@ library LibVerifying { tierProvider = resolver.resolve("tier_provider", false); } if ( - uint256(ITierProvider(tierProvider).getTier(ts.tier).cooldownWindow) + uint256(ITierProvider(tierProvider).getTier(ts.tier).cooldownWindow) * 60 + uint256(ts.timestamp).max(state.slotB.lastUnpausedAt) > block.timestamp ) { // If cooldownWindow is 0, the block can theoretically diff --git a/packages/protocol/contracts/L1/tiers/ITierProvider.sol b/packages/protocol/contracts/L1/tiers/ITierProvider.sol index d668c189aa..6643be92fd 100644 --- a/packages/protocol/contracts/L1/tiers/ITierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/ITierProvider.sol @@ -21,8 +21,8 @@ interface ITierProvider { bytes32 verifierName; uint96 validityBond; uint96 contestBond; - uint24 cooldownWindow; - uint16 provingWindow; + uint24 cooldownWindow; // in minutes + uint16 provingWindow; // in minutes uint8 maxBlocksToVerifyPerProof; } @@ -42,5 +42,6 @@ interface ITierProvider { library LibTiers { uint16 public constant TIER_OPTIMISTIC = 100; uint16 public constant TIER_SGX = 200; + uint16 public constant TIER_SGX_ZKVM = 300; uint16 public constant TIER_GUARDIAN = 1000; } diff --git a/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol new file mode 100644 index 0000000000..76c8428465 --- /dev/null +++ b/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz + +pragma solidity 0.8.24; + +import "../../common/EssentialContract.sol"; +import "./ITierProvider.sol"; + +/// @title MainnetTierProvider +/// @dev Labeled in AddressResolver as "tier_provider" +/// @dev Assuming liveness bound is 250TKO. +// Taiko token's total supply is 1 billion. Assuming block time is 2 second, and +// the cool down period is 2 days. In 2 days, we can have (2*86400/2)=86400 +// blocks. Assuming 10% tokens are used in bonds, then each block may use up to +// these many tokens: 1,000,000,000 * 10% / 86400=1157 TOK per block, which is +// about 722 USD. +contract MainnetTierProvider is EssentialContract, ITierProvider { + uint256[50] private __gap; + + error TIER_NOT_FOUND(); + + /// @notice Initializes the contract with the provided address manager. + function init() external initializer { + __Essential_init(); + } + + function getTier(uint16 tierId) public pure override returns (ITierProvider.Tier memory) { + if (tierId == LibTiers.TIER_SGX) { + return ITierProvider.Tier({ + verifierName: "tier_sgx", + validityBond: 250 ether, // TKO + contestBond: 500 ether, // TKO + cooldownWindow: 1440, //24 hours + provingWindow: 60, // 1 hours + maxBlocksToVerifyPerProof: 8 + }); + } + + if (tierId == LibTiers.TIER_SGX_ZKVM) { + return ITierProvider.Tier({ + verifierName: "tier_sgx_zkvm", + validityBond: 500 ether, // TKO + contestBond: 1000 ether, // TKO + cooldownWindow: 1440, //24 hours + provingWindow: 240, // 4 hours + maxBlocksToVerifyPerProof: 4 + }); + } + + if (tierId == LibTiers.TIER_GUARDIAN) { + return ITierProvider.Tier({ + verifierName: "tier_guardian", + validityBond: 0, // must be 0 for top tier + contestBond: 0, // must be 0 for top tier + cooldownWindow: 60, //1 hours + provingWindow: 2880, // 48 hours + maxBlocksToVerifyPerProof: 18 + }); + } + + revert TIER_NOT_FOUND(); + } + + function getTierIds() public pure override returns (uint16[] memory tiers) { + tiers = new uint16[](3); + tiers[0] = LibTiers.TIER_SGX; + tiers[1] = LibTiers.TIER_SGX_ZKVM; + tiers[2] = LibTiers.TIER_GUARDIAN; + } + + function getMinTier(uint256 rand) public pure override returns (uint16) { + // 0.1% require SGX + ZKVM; all others require SGX + if (rand % 1000 == 0) return LibTiers.TIER_SGX_ZKVM; + else return LibTiers.TIER_SGX; + } +} diff --git a/packages/protocol/contracts/L1/tiers/OptimisticTierProvider.sol b/packages/protocol/contracts/L1/tiers/OptimisticTierProvider.sol deleted file mode 100644 index c025131593..0000000000 --- a/packages/protocol/contracts/L1/tiers/OptimisticTierProvider.sol +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ -// -// Email: security@taiko.xyz -// Website: https://taiko.xyz -// GitHub: https://github.com/taikoxyz -// Discord: https://discord.gg/taikoxyz -// Twitter: https://twitter.com/taikoxyz -// Blog: https://mirror.xyz/labs.taiko.eth -// Youtube: https://www.youtube.com/@taikoxyz - -pragma solidity 0.8.24; - -import "../../common/EssentialContract.sol"; -import "./ITierProvider.sol"; - -contract OptimisticTierProvider is EssentialContract, ITierProvider { - uint256[50] private __gap; - - error TIER_NOT_FOUND(); - - /// @notice Initializes the contract with the provided address manager. - function init() external initializer { - __Essential_init(); - } - - function getTier(uint16 tierId) public pure override returns (ITierProvider.Tier memory) { - if (tierId == LibTiers.TIER_OPTIMISTIC) { - return ITierProvider.Tier({ - verifierName: "tier_optimistic", - validityBond: 250 ether, // TKO - contestBond: 500 ether, // TKO - cooldownWindow: 24 hours, - provingWindow: 2 hours, - maxBlocksToVerifyPerProof: 10 - }); - } - - if (tierId == LibTiers.TIER_GUARDIAN) { - return ITierProvider.Tier({ - verifierName: "tier_guardian", - validityBond: 0, // must be 0 for top tier - contestBond: 0, // must be 0 for top tier - cooldownWindow: 24 hours, - provingWindow: 8 hours, - maxBlocksToVerifyPerProof: 4 - }); - } - - revert TIER_NOT_FOUND(); - } - - function getTierIds() public pure override returns (uint16[] memory tiers) { - tiers = new uint16[](2); - tiers[0] = LibTiers.TIER_OPTIMISTIC; - tiers[1] = LibTiers.TIER_GUARDIAN; - } - - function getMinTier(uint256 /*rand*/ ) public pure override returns (uint16) { - return LibTiers.TIER_OPTIMISTIC; - } -} diff --git a/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol index adb5d98080..41dc1f753e 100644 --- a/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol @@ -41,8 +41,8 @@ contract TestnetTierProvider is EssentialContract, ITierProvider { verifierName: "tier_optimistic", validityBond: 250 ether, // TKO contestBond: 500 ether, // TKO - cooldownWindow: 24 hours, - provingWindow: 2 hours, + cooldownWindow: 1440, //24 hours + provingWindow: 30, // 0.5 hours maxBlocksToVerifyPerProof: 10 }); } @@ -52,8 +52,8 @@ contract TestnetTierProvider is EssentialContract, ITierProvider { verifierName: "tier_sgx", validityBond: 500 ether, // TKO contestBond: 1000 ether, // TKO - cooldownWindow: 24 hours, - provingWindow: 4 hours, + cooldownWindow: 1440, //24 hours + provingWindow: 60, // 1 hours maxBlocksToVerifyPerProof: 8 }); } @@ -63,9 +63,9 @@ contract TestnetTierProvider is EssentialContract, ITierProvider { verifierName: "tier_guardian", validityBond: 0, // must be 0 for top tier contestBond: 0, // must be 0 for top tier - cooldownWindow: 24 hours, - provingWindow: 8 hours, - maxBlocksToVerifyPerProof: 4 + cooldownWindow: 60, //1 hours + provingWindow: 2880, // 48 hours + maxBlocksToVerifyPerProof: 18 }); } diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol index ac09cb47d2..1dd4fc9a88 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/DeployOnL1.s.sol @@ -20,7 +20,7 @@ import "../contracts/L1/TaikoToken.sol"; import "../contracts/L1/TaikoL1.sol"; import "../contracts/L1/provers/GuardianProver.sol"; import "../contracts/L1/tiers/TestnetTierProvider.sol"; -import "../contracts/L1/tiers/OptimisticTierProvider.sol"; +import "../contracts/L1/tiers/MainnetTierProvider.sol"; import "../contracts/L1/hooks/AssignmentHook.sol"; import "../contracts/L1/gov/TaikoTimelockController.sol"; import "../contracts/L1/gov/TaikoGovernor.sol"; @@ -321,8 +321,8 @@ contract DeployOnL1 is DeployCapability { }); address tierProvider; - if (vm.envBool("OPTIMISTIC_TIER_PROVIDER")) { - tierProvider = address(new OptimisticTierProvider()); + if (vm.envBool("MAINNET")) { + tierProvider = address(new MainnetTierProvider()); } else { tierProvider = address(new TestnetTierProvider()); } diff --git a/packages/protocol/script/test_deploy_on_l1.sh b/packages/protocol/script/test_deploy_on_l1.sh index e371b2e320..55e3fafe19 100755 --- a/packages/protocol/script/test_deploy_on_l1.sh +++ b/packages/protocol/script/test_deploy_on_l1.sh @@ -16,7 +16,7 @@ TAIKO_TOKEN_NAME="Taiko Token Katla" \ TAIKO_TOKEN_SYMBOL=TTKOk \ SHARED_ADDRESS_MANAGER=0x0000000000000000000000000000000000000000 \ L2_GENESIS_HASH=0xee1950562d42f0da28bd4550d88886bc90894c77c9c9eaefef775d4c8223f259 \ -OPTIMISTIC_TIER_PROVIDER=false \ +MAINNET=false \ forge script script/DeployOnL1.s.sol:DeployOnL1 \ --fork-url http://localhost:8545 \ --broadcast \ diff --git a/packages/protocol/test/L1/TaikoL1.t.sol b/packages/protocol/test/L1/TaikoL1.t.sol index f5ac4fd5e3..effb2ff37b 100644 --- a/packages/protocol/test/L1/TaikoL1.t.sol +++ b/packages/protocol/test/L1/TaikoL1.t.sol @@ -57,7 +57,7 @@ contract TaikoL1Test is TaikoL1TestBase { vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); verifyBlock(Carol, 1); parentHash = blockHash; @@ -89,7 +89,7 @@ contract TaikoL1Test is TaikoL1TestBase { proveBlock(Bob, Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); verifyBlock(Alice, 2); parentHash = blockHash; diff --git a/packages/protocol/test/L1/TaikoL1LibProvingWithTiers.t.sol b/packages/protocol/test/L1/TaikoL1LibProvingWithTiers.t.sol index 9c9ac00ac8..10ca0540cd 100644 --- a/packages/protocol/test/L1/TaikoL1LibProvingWithTiers.t.sol +++ b/packages/protocol/test/L1/TaikoL1LibProvingWithTiers.t.sol @@ -86,7 +86,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); verifyBlock(Carol, 1); @@ -128,14 +128,14 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); // Cannot verify block because it is contested.. verifyBlock(Carol, 1); proveHigherTierProof(meta, parentHash, stateRoot, blockHash, minTier); - vm.warp(block.timestamp + L1.getTier(LibTiers.TIER_GUARDIAN).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(LibTiers.TIER_GUARDIAN).cooldownWindow * 60 + 1); // Now can verify console2.log("Probalom verify-olni"); verifyBlock(Carol, 1); @@ -177,7 +177,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); // Cannot verify block because it is contested.. verifyBlock(Carol, 1); @@ -185,7 +185,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { proveHigherTierProof(meta, parentHash, stateRoot, blockHash, minTier); // Otherwise just not contest - vm.warp(block.timestamp + L1.getTier(LibTiers.TIER_GUARDIAN).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(LibTiers.TIER_GUARDIAN).cooldownWindow * 60 + 1); // Now can verify verifyBlock(Carol, 1); @@ -228,7 +228,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); // Cannot verify block because it is contested.. verifyBlock(Carol, 1); @@ -239,7 +239,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { } // Otherwise just not contest - vm.warp(block.timestamp + L1.getTier(LibTiers.TIER_GUARDIAN).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(LibTiers.TIER_GUARDIAN).cooldownWindow * 60 + 1); // Now can verify verifyBlock(Carol, 1); @@ -281,7 +281,9 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); - vm.warp(block.timestamp + L1.getTier(LibTiers.TIER_GUARDIAN).cooldownWindow + 1); + vm.warp( + block.timestamp + L1.getTier(LibTiers.TIER_GUARDIAN).cooldownWindow * 60 + 1 + ); // Cannot verify block because it is contested.. verifyBlock(Carol, 1); @@ -299,7 +301,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { } // Otherwise just not contest - vm.warp(block.timestamp + L1.getTier(LibTiers.TIER_GUARDIAN).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(LibTiers.TIER_GUARDIAN).cooldownWindow * 60 + 1); // Now can verify verifyBlock(Carol, 1); @@ -343,7 +345,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); verifyBlock(Carol, 1); parentHash = blockHash; @@ -377,7 +379,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); proveBlock( Bob, @@ -439,7 +441,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); verifyBlock(Carol, 1); @@ -456,7 +458,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { ); vm.roll(block.number + 15 * 12); - vm.warp(block.timestamp + L1.getTier(LibTiers.TIER_GUARDIAN).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(LibTiers.TIER_GUARDIAN).cooldownWindow * 60 + 1); verifyBlock(Carol, 1); parentHash = blockHash; @@ -505,7 +507,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); verifyBlock(Carol, 1); @@ -548,7 +550,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); verifyBlock(Carol, 1); @@ -600,7 +602,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); verifyBlock(Carol, 1); @@ -740,7 +742,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); verifyBlock(Carol, 1); @@ -810,7 +812,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; - vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow + 1); + vm.warp(block.timestamp + L1.getTier(minTier).cooldownWindow * 60 + 1); verifyBlock(Carol, 1); From 25daefdcfab62c1a631b34f9dfdfe0a4557c65b1 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 25 Feb 2024 18:27:52 +0800 Subject: [PATCH 2/8] more --- .../contracts/L1/tiers/DevnetTierProvider.sol | 63 +++++++++++++++++++ .../contracts/L1/tiers/ITierProvider.sol | 2 + .../L1/tiers/MainnetTierProvider.sol | 4 +- .../L1/tiers/TestnetTierProvider.sol | 6 +- packages/protocol/script/DeployOnL1.s.sol | 10 ++- packages/protocol/script/test_deploy_on_l1.sh | 2 +- 6 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol diff --git a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol new file mode 100644 index 0000000000..1e2cea1f36 --- /dev/null +++ b/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz + +pragma solidity 0.8.24; + +import "../../common/EssentialContract.sol"; +import "./ITierProvider.sol"; + +contract DevnetTierProvider is EssentialContract, ITierProvider { + uint256[50] private __gap; + + /// @notice Initializes the contract with the provided address manager. + function init() external initializer { + __Essential_init(); + } + + function getTier(uint16 tierId) public pure override returns (ITierProvider.Tier memory) { + if (tierId == LibTiers.TIER_OPTIMISTIC) { + return ITierProvider.Tier({ + verifierName: "tier_optimistic", + validityBond: 250 ether, // TKO + contestBond: 500 ether, // TKO + cooldownWindow: 1440, //24 hours + provingWindow: 120, // 2 hours + maxBlocksToVerifyPerProof: 16 + }); + } + + if (tierId == LibTiers.TIER_GUARDIAN) { + return ITierProvider.Tier({ + verifierName: "tier_guardian", + validityBond: 0, // must be 0 for top tier + contestBond: 0, // must be 0 for top tier + cooldownWindow: 24 hours, + provingWindow: 8 hours, + maxBlocksToVerifyPerProof: 16 + }); + } + + revert TIER_NOT_FOUND(); + } + + function getTierIds() public pure override returns (uint16[] memory tiers) { + tiers = new uint16[](2); + tiers[0] = LibTiers.TIER_OPTIMISTIC; + tiers[1] = LibTiers.TIER_GUARDIAN; + } + + function getMinTier(uint256 /*rand*/ ) public pure override returns (uint16) { + return LibTiers.TIER_OPTIMISTIC; + } +} diff --git a/packages/protocol/contracts/L1/tiers/ITierProvider.sol b/packages/protocol/contracts/L1/tiers/ITierProvider.sol index 6643be92fd..4702b33764 100644 --- a/packages/protocol/contracts/L1/tiers/ITierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/ITierProvider.sol @@ -17,6 +17,8 @@ pragma solidity 0.8.24; /// @title ITierProvider /// @notice Defines interface to return tier configuration. interface ITierProvider { + error TIER_NOT_FOUND(); + struct Tier { bytes32 verifierName; uint96 validityBond; diff --git a/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol index 76c8428465..7070987de3 100644 --- a/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol @@ -28,8 +28,6 @@ import "./ITierProvider.sol"; contract MainnetTierProvider is EssentialContract, ITierProvider { uint256[50] private __gap; - error TIER_NOT_FOUND(); - /// @notice Initializes the contract with the provided address manager. function init() external initializer { __Essential_init(); @@ -65,7 +63,7 @@ contract MainnetTierProvider is EssentialContract, ITierProvider { contestBond: 0, // must be 0 for top tier cooldownWindow: 60, //1 hours provingWindow: 2880, // 48 hours - maxBlocksToVerifyPerProof: 18 + maxBlocksToVerifyPerProof: 16 }); } diff --git a/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol index 41dc1f753e..7ca5a634d8 100644 --- a/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol @@ -28,8 +28,6 @@ import "./ITierProvider.sol"; contract TestnetTierProvider is EssentialContract, ITierProvider { uint256[50] private __gap; - error TIER_NOT_FOUND(); - /// @notice Initializes the contract with the provided address manager. function init() external initializer { __Essential_init(); @@ -43,7 +41,7 @@ contract TestnetTierProvider is EssentialContract, ITierProvider { contestBond: 500 ether, // TKO cooldownWindow: 1440, //24 hours provingWindow: 30, // 0.5 hours - maxBlocksToVerifyPerProof: 10 + maxBlocksToVerifyPerProof: 12 }); } @@ -65,7 +63,7 @@ contract TestnetTierProvider is EssentialContract, ITierProvider { contestBond: 0, // must be 0 for top tier cooldownWindow: 60, //1 hours provingWindow: 2880, // 48 hours - maxBlocksToVerifyPerProof: 18 + maxBlocksToVerifyPerProof: 16 }); } diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol index 1dd4fc9a88..cc4e922353 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/DeployOnL1.s.sol @@ -19,6 +19,7 @@ import "@openzeppelin/contracts/utils/Strings.sol"; import "../contracts/L1/TaikoToken.sol"; import "../contracts/L1/TaikoL1.sol"; import "../contracts/L1/provers/GuardianProver.sol"; +import "../contracts/L1/tiers/DevnetTierProvider.sol"; import "../contracts/L1/tiers/TestnetTierProvider.sol"; import "../contracts/L1/tiers/MainnetTierProvider.sol"; import "../contracts/L1/hooks/AssignmentHook.sol"; @@ -320,11 +321,16 @@ contract DeployOnL1 is DeployCapability { owner: timelock }); + bytes32 tierProviderName = vm.envBytes32("TIER_PROVIDER"); address tierProvider; - if (vm.envBool("MAINNET")) { + if (tierProviderName == "devnet") { + tierProvider = address(new DevnetTierProvider()); + } else if (tierProviderName == "testnet") { + tierProvider = address(new TestnetTierProvider()); + } else if (tierProviderName == "mainnet") { tierProvider = address(new MainnetTierProvider()); } else { - tierProvider = address(new TestnetTierProvider()); + revert("invalid tier provider"); } deployProxy({ diff --git a/packages/protocol/script/test_deploy_on_l1.sh b/packages/protocol/script/test_deploy_on_l1.sh index 55e3fafe19..27114762f9 100755 --- a/packages/protocol/script/test_deploy_on_l1.sh +++ b/packages/protocol/script/test_deploy_on_l1.sh @@ -16,7 +16,7 @@ TAIKO_TOKEN_NAME="Taiko Token Katla" \ TAIKO_TOKEN_SYMBOL=TTKOk \ SHARED_ADDRESS_MANAGER=0x0000000000000000000000000000000000000000 \ L2_GENESIS_HASH=0xee1950562d42f0da28bd4550d88886bc90894c77c9c9eaefef775d4c8223f259 \ -MAINNET=false \ +TIER_PROVIDER="devnet" \ forge script script/DeployOnL1.s.sol:DeployOnL1 \ --fork-url http://localhost:8545 \ --broadcast \ From d110b448f433edfe5c2a115a4609e9589940ca3a Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 25 Feb 2024 18:28:26 +0800 Subject: [PATCH 3/8] Update DevnetTierProvider.sol --- packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol index 1e2cea1f36..7ff3f36124 100644 --- a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol @@ -42,8 +42,8 @@ contract DevnetTierProvider is EssentialContract, ITierProvider { verifierName: "tier_guardian", validityBond: 0, // must be 0 for top tier contestBond: 0, // must be 0 for top tier - cooldownWindow: 24 hours, - provingWindow: 8 hours, + cooldownWindow: 60, //1 hours + provingWindow: 2880, // 48 hours maxBlocksToVerifyPerProof: 16 }); } From 84c1ed837ca38929c997b6506eab9f7a83cd99e4 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 25 Feb 2024 18:50:19 +0800 Subject: [PATCH 4/8] Update DeployOnL1.s.sol --- packages/protocol/script/DeployOnL1.s.sol | 26 +++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol index cc4e922353..42798fabf3 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/DeployOnL1.s.sol @@ -321,21 +321,9 @@ contract DeployOnL1 is DeployCapability { owner: timelock }); - bytes32 tierProviderName = vm.envBytes32("TIER_PROVIDER"); - address tierProvider; - if (tierProviderName == "devnet") { - tierProvider = address(new DevnetTierProvider()); - } else if (tierProviderName == "testnet") { - tierProvider = address(new TestnetTierProvider()); - } else if (tierProviderName == "mainnet") { - tierProvider = address(new MainnetTierProvider()); - } else { - revert("invalid tier provider"); - } - deployProxy({ name: "tier_provider", - impl: tierProvider, + impl: deployTierProvider(vm.envString("TIER_PROVIDER")), data: abi.encodeCall(TestnetTierProvider.init, ()), registerTo: rollupAddressManager, owner: timelock @@ -386,6 +374,18 @@ contract DeployOnL1 is DeployCapability { ); } + function deployTierProvider(string memory tierProviderName) private returns (address) { + if (keccak256(abi.encode(tierProviderName)) == keccak256(abi.encode("devnet"))) { + return address(new DevnetTierProvider()); + } else if (keccak256(abi.encode(tierProviderName)) == keccak256(abi.encode("testnet"))) { + return address(new TestnetTierProvider()); + } else if (keccak256(abi.encode(tierProviderName)) == keccak256(abi.encode("mainnet"))) { + return address(new MainnetTierProvider()); + } else { + revert("invalid tier provider"); + } + } + function deployAuxContracts() private { address horseToken = address(new FreeMintERC20("Horse Token", "HORSE")); console2.log("HorseToken", horseToken); From ba5c297c6ff3b2768cbc3990b23039aaf4015c41 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 25 Feb 2024 21:02:44 +0800 Subject: [PATCH 5/8] more --- packages/protocol/contracts/L1/TaikoL1.sol | 10 +++++----- packages/protocol/contracts/L1/libs/LibProposing.sol | 2 +- .../protocol/contracts/L1/tiers/DevnetTierProvider.sol | 2 +- packages/protocol/contracts/L1/tiers/ITierProvider.sol | 2 +- .../contracts/L1/tiers/MainnetTierProvider.sol | 4 ++-- .../contracts/L1/tiers/TestnetTierProvider.sol | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index dbd183d6e8..79de6a8e80 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -195,15 +195,15 @@ contract TaikoL1 is EssentialContract, ITaikoL1, ITierProvider, TaikoEvents, Tai return ITierProvider(resolve("tier_provider", false)).getTier(tierId); } - /// @notice Retrieves the IDs of all supported tiers. - function getTierIds() public view virtual override returns (uint16[] memory ids) { + /// @inheritdoc ITierProvider + function getTierIds() public view override returns (uint16[] memory ids) { ids = ITierProvider(resolve("tier_provider", false)).getTierIds(); if (ids.length >= type(uint8).max) revert L1_TOO_MANY_TIERS(); } - /// @notice Determines the minimal tier for a block based on a random input. - function getMinTier(uint256 rand) public view virtual override returns (uint16) { - return ITierProvider(resolve("tier_provider", false)).getMinTier(rand); + /// @inheritdoc ITierProvider + function getMinTier(uint64 blockId, uint256 rand) public view override returns (uint16) { + return ITierProvider(resolve("tier_provider", false)).getMinTier(blockId, rand); } /// @inheritdoc ITaikoL1 diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 4852521bb5..d4a2dbb105 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -203,7 +203,7 @@ library LibProposing { // Use the difficulty as a random number meta.minTier = ITierProvider(resolver.resolve("tier_provider", false)).getMinTier( - uint256(meta.difficulty) + b.numBlocks, uint256(meta.difficulty) ); // Create the block that will be stored onchain diff --git a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol index 7ff3f36124..40d597bddc 100644 --- a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol @@ -57,7 +57,7 @@ contract DevnetTierProvider is EssentialContract, ITierProvider { tiers[1] = LibTiers.TIER_GUARDIAN; } - function getMinTier(uint256 /*rand*/ ) public pure override returns (uint16) { + function getMinTier(uint64, uint256) public pure override returns (uint16) { return LibTiers.TIER_OPTIMISTIC; } } diff --git a/packages/protocol/contracts/L1/tiers/ITierProvider.sol b/packages/protocol/contracts/L1/tiers/ITierProvider.sol index 4702b33764..9b59433d73 100644 --- a/packages/protocol/contracts/L1/tiers/ITierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/ITierProvider.sol @@ -37,7 +37,7 @@ interface ITierProvider { function getTierIds() external view returns (uint16[] memory); /// @dev Determines the minimal tier for a block based on a random input. - function getMinTier(uint256 rand) external view returns (uint16); + function getMinTier(uint64 blockId, uint256 rand) external view returns (uint16); } /// @dev Tier ID cannot be zero! diff --git a/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol index 7070987de3..8d5a583900 100644 --- a/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol @@ -77,9 +77,9 @@ contract MainnetTierProvider is EssentialContract, ITierProvider { tiers[2] = LibTiers.TIER_GUARDIAN; } - function getMinTier(uint256 rand) public pure override returns (uint16) { + function getMinTier(uint64 blockId, uint256) public pure override returns (uint16) { // 0.1% require SGX + ZKVM; all others require SGX - if (rand % 1000 == 0) return LibTiers.TIER_SGX_ZKVM; + if (blockId % 1000 == 0) return LibTiers.TIER_SGX_ZKVM; else return LibTiers.TIER_SGX; } } diff --git a/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol index 7ca5a634d8..83e80b3870 100644 --- a/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol @@ -77,9 +77,9 @@ contract TestnetTierProvider is EssentialContract, ITierProvider { tiers[2] = LibTiers.TIER_GUARDIAN; } - function getMinTier(uint256 rand) public pure override returns (uint16) { + function getMinTier(uint64 blockId, uint256) public pure override returns (uint16) { // 10% will be selected to require SGX proofs. - if (rand % 10 == 0) return LibTiers.TIER_SGX; + if (blockId % 10 == 0) return LibTiers.TIER_SGX; // Other blocks are optimisitc, without validity proofs. return LibTiers.TIER_OPTIMISTIC; } From 624731009881e1b8f33c900a888d8b5ac497f874 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 25 Feb 2024 21:33:45 +0800 Subject: [PATCH 6/8] Update ITierProvider.sol --- packages/protocol/contracts/L1/tiers/ITierProvider.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/L1/tiers/ITierProvider.sol b/packages/protocol/contracts/L1/tiers/ITierProvider.sol index 9b59433d73..0c0f1febeb 100644 --- a/packages/protocol/contracts/L1/tiers/ITierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/ITierProvider.sol @@ -17,8 +17,6 @@ pragma solidity 0.8.24; /// @title ITierProvider /// @notice Defines interface to return tier configuration. interface ITierProvider { - error TIER_NOT_FOUND(); - struct Tier { bytes32 verifierName; uint96 validityBond; @@ -28,6 +26,8 @@ interface ITierProvider { uint8 maxBlocksToVerifyPerProof; } + error TIER_NOT_FOUND(); + /// @dev Retrieves the configuration for a specified tier. function getTier(uint16 tierId) external view returns (Tier memory); From 180efbeecac970f80e8314a3206e8e56b411f2b9 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Mon, 26 Feb 2024 06:31:39 +0800 Subject: [PATCH 7/8] revert --- packages/protocol/contracts/L1/TaikoL1.sol | 4 ++-- packages/protocol/contracts/L1/libs/LibProposing.sol | 2 +- packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol | 2 +- packages/protocol/contracts/L1/tiers/ITierProvider.sol | 2 +- packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol | 4 ++-- packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 79de6a8e80..cfd836567a 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -202,8 +202,8 @@ contract TaikoL1 is EssentialContract, ITaikoL1, ITierProvider, TaikoEvents, Tai } /// @inheritdoc ITierProvider - function getMinTier(uint64 blockId, uint256 rand) public view override returns (uint16) { - return ITierProvider(resolve("tier_provider", false)).getMinTier(blockId, rand); + function getMinTier(uint256 rand) public view override returns (uint16) { + return ITierProvider(resolve("tier_provider", false)).getMinTier(rand); } /// @inheritdoc ITaikoL1 diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index d4a2dbb105..4852521bb5 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -203,7 +203,7 @@ library LibProposing { // Use the difficulty as a random number meta.minTier = ITierProvider(resolver.resolve("tier_provider", false)).getMinTier( - b.numBlocks, uint256(meta.difficulty) + uint256(meta.difficulty) ); // Create the block that will be stored onchain diff --git a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol index 40d597bddc..742a924bf5 100644 --- a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol @@ -57,7 +57,7 @@ contract DevnetTierProvider is EssentialContract, ITierProvider { tiers[1] = LibTiers.TIER_GUARDIAN; } - function getMinTier(uint64, uint256) public pure override returns (uint16) { + function getMinTier(uint256) public pure override returns (uint16) { return LibTiers.TIER_OPTIMISTIC; } } diff --git a/packages/protocol/contracts/L1/tiers/ITierProvider.sol b/packages/protocol/contracts/L1/tiers/ITierProvider.sol index 0c0f1febeb..3759d4cfdc 100644 --- a/packages/protocol/contracts/L1/tiers/ITierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/ITierProvider.sol @@ -37,7 +37,7 @@ interface ITierProvider { function getTierIds() external view returns (uint16[] memory); /// @dev Determines the minimal tier for a block based on a random input. - function getMinTier(uint64 blockId, uint256 rand) external view returns (uint16); + function getMinTier(uint256 rand) external view returns (uint16); } /// @dev Tier ID cannot be zero! diff --git a/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol index 8d5a583900..7070987de3 100644 --- a/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol @@ -77,9 +77,9 @@ contract MainnetTierProvider is EssentialContract, ITierProvider { tiers[2] = LibTiers.TIER_GUARDIAN; } - function getMinTier(uint64 blockId, uint256) public pure override returns (uint16) { + function getMinTier(uint256 rand) public pure override returns (uint16) { // 0.1% require SGX + ZKVM; all others require SGX - if (blockId % 1000 == 0) return LibTiers.TIER_SGX_ZKVM; + if (rand % 1000 == 0) return LibTiers.TIER_SGX_ZKVM; else return LibTiers.TIER_SGX; } } diff --git a/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol index 83e80b3870..7ca5a634d8 100644 --- a/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol @@ -77,9 +77,9 @@ contract TestnetTierProvider is EssentialContract, ITierProvider { tiers[2] = LibTiers.TIER_GUARDIAN; } - function getMinTier(uint64 blockId, uint256) public pure override returns (uint16) { + function getMinTier(uint256 rand) public pure override returns (uint16) { // 10% will be selected to require SGX proofs. - if (blockId % 10 == 0) return LibTiers.TIER_SGX; + if (rand % 10 == 0) return LibTiers.TIER_SGX; // Other blocks are optimisitc, without validity proofs. return LibTiers.TIER_OPTIMISTIC; } From d8ee4ac019b2a28889c3e1c9ed28265f9902eb95 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Mon, 26 Feb 2024 07:18:02 +0800 Subject: [PATCH 8/8] fix comments --- packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol | 2 ++ .../protocol/contracts/L1/tiers/MainnetTierProvider.sol | 6 ------ .../protocol/contracts/L1/tiers/TestnetTierProvider.sol | 6 ------ 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol index 742a924bf5..1d6151ea73 100644 --- a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol @@ -17,6 +17,8 @@ pragma solidity 0.8.24; import "../../common/EssentialContract.sol"; import "./ITierProvider.sol"; +/// @title DevnetTierProvider +/// @dev Labeled in AddressResolver as "tier_provider" contract DevnetTierProvider is EssentialContract, ITierProvider { uint256[50] private __gap; diff --git a/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol index 7070987de3..414417967f 100644 --- a/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/MainnetTierProvider.sol @@ -19,12 +19,6 @@ import "./ITierProvider.sol"; /// @title MainnetTierProvider /// @dev Labeled in AddressResolver as "tier_provider" -/// @dev Assuming liveness bound is 250TKO. -// Taiko token's total supply is 1 billion. Assuming block time is 2 second, and -// the cool down period is 2 days. In 2 days, we can have (2*86400/2)=86400 -// blocks. Assuming 10% tokens are used in bonds, then each block may use up to -// these many tokens: 1,000,000,000 * 10% / 86400=1157 TOK per block, which is -// about 722 USD. contract MainnetTierProvider is EssentialContract, ITierProvider { uint256[50] private __gap; diff --git a/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol b/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol index 7ca5a634d8..4716267e81 100644 --- a/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/TestnetTierProvider.sol @@ -19,12 +19,6 @@ import "./ITierProvider.sol"; /// @title TestnetTierProvider /// @dev Labeled in AddressResolver as "tier_provider" -/// @dev Assuming liveness bound is 250TKO. -// Taiko token's total supply is 1 billion. Assuming block time is 2 second, and -// the cool down period is 2 days. In 2 days, we can have (2*86400/2)=86400 -// blocks. Assuming 10% tokens are used in bonds, then each block may use up to -// these many tokens: 1,000,000,000 * 10% / 86400=1157 TOK per block, which is -// about 722 USD. contract TestnetTierProvider is EssentialContract, ITierProvider { uint256[50] private __gap;