diff --git a/packages/protocol/contracts/L1/TaikoConfig.sol b/packages/protocol/contracts/L1/TaikoConfig.sol index ef296c7a451..153503e06c7 100644 --- a/packages/protocol/contracts/L1/TaikoConfig.sol +++ b/packages/protocol/contracts/L1/TaikoConfig.sol @@ -42,8 +42,6 @@ library TaikoConfig { ethDepositGas: 21000, ethDepositMaxFee: 1 ether / 10, txListCacheExpiry: 0, - // 85s based on A2 testnet status, or set to 1800 for 30mins (mainnet mock) - proofTimeTarget: 1800, adjustmentQuotient: 16, relaySignalRoot: false }); diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index a18dcbb6b9f..52682ad8c64 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -28,7 +28,6 @@ library TaikoData { uint64 maxEthDepositsPerBlock; uint96 maxEthDepositAmount; uint96 minEthDepositAmount; - uint64 proofTimeTarget; uint8 adjustmentQuotient; bool relaySignalRoot; } @@ -40,6 +39,7 @@ library TaikoData { uint64 genesisTimestamp; uint64 numBlocks; uint64 proofTimeIssued; + uint64 proofTimeTarget; uint64 lastVerifiedBlockId; uint64 accProposedAt; uint64 nextEthDepositToProcess; @@ -150,7 +150,7 @@ library TaikoData { uint64 blockFee; uint64 proofTimeIssued; uint64 lastVerifiedBlockId; - uint64 __reserved91; + uint64 proofTimeTarget; // Reserved uint256[42] __gap; } diff --git a/packages/protocol/contracts/L1/TaikoEvents.sol b/packages/protocol/contracts/L1/TaikoEvents.sol index f9ff8d82b8e..a0d6cb864a9 100644 --- a/packages/protocol/contracts/L1/TaikoEvents.sol +++ b/packages/protocol/contracts/L1/TaikoEvents.sol @@ -24,4 +24,6 @@ abstract contract TaikoEvents { event BlockVerified(uint256 indexed id, bytes32 blockHash); event EthDeposited(TaikoData.EthDeposit deposit); + + event ProofTimeTargetChanged(uint64 proofTimeTarget); } diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index f5d53b7a54f..3637451bafc 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -38,6 +38,7 @@ contract TaikoL1 is EssentialContract, ICrossChainSync, TaikoEvents, TaikoErrors * @param _addressManager The AddressManager address. * @param _genesisBlockHash The block hash of the genesis block. * @param _initBlockFee Initial (reasonable) block fee value. + * @param _initProofTimeTarget Initial (reasonable) proof submission time target. * @param _initProofTimeIssued Initial proof time issued corresponding * with the initial block fee. */ @@ -45,6 +46,7 @@ contract TaikoL1 is EssentialContract, ICrossChainSync, TaikoEvents, TaikoErrors address _addressManager, bytes32 _genesisBlockHash, uint64 _initBlockFee, + uint64 _initProofTimeTarget, uint64 _initProofTimeIssued ) external initializer { EssentialContract._init(_addressManager); @@ -53,6 +55,7 @@ contract TaikoL1 is EssentialContract, ICrossChainSync, TaikoEvents, TaikoErrors config: getConfig(), genesisBlockHash: _genesisBlockHash, initBlockFee: _initBlockFee, + initProofTimeTarget: _initProofTimeTarget, initProofTimeIssued: _initProofTimeIssued }); } @@ -131,6 +134,25 @@ contract TaikoL1 is EssentialContract, ICrossChainSync, TaikoEvents, TaikoErrors }); } + /** + * Change proof parameters (time target and time issued) - to avoid complex/risky upgrades in case need to change relatively frequently. + * @param newProofTimeTarget New proof time target. + * @param newProofTimeIssued New proof time issued. If set to type(uint64).max, let it be unchanged. + */ + function setProofParams(uint64 newProofTimeTarget, uint64 newProofTimeIssued) external onlyOwner { + if (newProofTimeTarget == 0 || newProofTimeIssued == 0) + revert L1_INVALID_PARAM(); + + state.proofTimeTarget = newProofTimeTarget; + // Special case in a way - that we leave the proofTimeIssued unchanged + // because we think provers will adjust behavior. + if (newProofTimeIssued != type(uint64).max) { + state.proofTimeIssued = newProofTimeIssued; + } + + emit ProofTimeTargetChanged(newProofTimeTarget); + } + function depositTaikoToken(uint256 amount) external nonReentrant { LibTokenomics.depositTaikoToken(state, AddressResolver(this), amount); } diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 5a0da63b027..fa475dda1f8 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -151,7 +151,7 @@ library LibProving { fc.prover = evidence.prover; if (evidence.prover == address(1)) { - fc.provenAt = uint64(block.timestamp.max(blk.proposedAt + config.proofTimeTarget)); + fc.provenAt = uint64(block.timestamp.max(blk.proposedAt + state.proofTimeTarget)); } else { fc.provenAt = uint64(block.timestamp); } diff --git a/packages/protocol/contracts/L1/libs/LibTokenomics.sol b/packages/protocol/contracts/L1/libs/LibTokenomics.sol index cf9755141a1..d1fbf31ab8e 100644 --- a/packages/protocol/contracts/L1/libs/LibTokenomics.sol +++ b/packages/protocol/contracts/L1/libs/LibTokenomics.sol @@ -88,20 +88,20 @@ library LibTokenomics { TaikoData.Config memory config, uint64 proofTime ) internal view returns (uint64 newProofTimeIssued, uint64 blockFee) { - newProofTimeIssued = (state.proofTimeIssued > config.proofTimeTarget) - ? state.proofTimeIssued - config.proofTimeTarget + newProofTimeIssued = (state.proofTimeIssued > state.proofTimeTarget) + ? state.proofTimeIssued - state.proofTimeTarget : uint64(0); newProofTimeIssued += proofTime; uint256 x = (newProofTimeIssued * Math.SCALING_FACTOR_1E18) - / (config.proofTimeTarget * config.adjustmentQuotient); + / (state.proofTimeTarget * config.adjustmentQuotient); if (Math.MAX_EXP_INPUT <= x) { x = Math.MAX_EXP_INPUT; } uint256 result = (uint256(Math.exp(int256(x))) / Math.SCALING_FACTOR_1E18) - / (config.proofTimeTarget * config.adjustmentQuotient); + / (state.proofTimeTarget * config.adjustmentQuotient); blockFee = uint64(result.min(type(uint64).max)); } diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index de25096d156..9047d1d4bcf 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -56,6 +56,7 @@ library LibUtils { genesisTimestamp: state.genesisTimestamp, numBlocks: state.numBlocks, proofTimeIssued: state.proofTimeIssued, + proofTimeTarget: state.proofTimeTarget, lastVerifiedBlockId: state.lastVerifiedBlockId, accProposedAt: state.accProposedAt, nextEthDepositToProcess: state.nextEthDepositToProcess, diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index f598d766a93..fa181953167 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -29,6 +29,7 @@ library LibVerifying { TaikoData.Config memory config, bytes32 genesisBlockHash, uint64 initBlockFee, + uint64 initProofTimeTarget, uint64 initProofTimeIssued ) internal { if ( @@ -43,14 +44,16 @@ library LibVerifying { // EIP-4844 blob deleted after 30 days || config.txListCacheExpiry > 30 * 24 hours || config.ethDepositGas == 0 || config.ethDepositMaxFee == 0 || config.ethDepositMaxFee >= type(uint96).max - || config.proofTimeTarget == 0 || config.adjustmentQuotient == 0 + || config.adjustmentQuotient == 0 || initProofTimeTarget == 0 || initProofTimeIssued == 0 ) revert L1_INVALID_CONFIG(); + uint64 timeNow = uint64(block.timestamp); state.genesisHeight = uint64(block.number); state.genesisTimestamp = timeNow; state.blockFee = initBlockFee; state.proofTimeIssued = initProofTimeIssued; + state.proofTimeTarget = initProofTimeTarget; state.numBlocks = 1; TaikoData.Block storage blk = state.blocks[0]; diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol index ccfb2a335c1..142c0eb9d8a 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/DeployOnL1.s.sol @@ -44,10 +44,18 @@ contract DeployOnL1 is Script { uint256 public taikoTokenPremintAmount = vm.envUint("TAIKO_TOKEN_PREMINT_AMOUNT"); + // Change it based on 'consensus' / experience / expected result + // Based in seconds. Please set carefully. + // For testnet it could be somewhere 85-100s + // For mainnet it could be around 1800 s (30mins) + // Can be adjusted later with setters + uint64 public INITIAL_PROOF_TIME_TARGET = uint64(vm.envUint("INITIAL_PROOF_TIME_TARGET")); + TaikoL1 taikoL1; address public addressManagerProxy; error FAILED_TO_DEPLOY_PLONK_VERIFIER(string contractPath); + error PROOF_TIME_TARGET_NOT_SET(); function run() external { require(owner != address(0), "owner is zero"); @@ -107,9 +115,13 @@ contract DeployOnL1 is Script { // Calculating it for our needs based on testnet/mainnet. We need it in // order to make the fees on the same level - in ideal circumstences. // See Brecht's comment https://github.com/taikoxyz/taiko-mono/pull/13564 + if(INITIAL_PROOF_TIME_TARGET == 0) { + revert PROOF_TIME_TARGET_NOT_SET(); + } + uint64 initProofTimeIssued = LibLn.calcInitProofTimeIssued( feeBase, - uint16(taikoL1.getConfig().proofTimeTarget), + uint16(INITIAL_PROOF_TIME_TARGET), uint8(taikoL1.getConfig().adjustmentQuotient) ); @@ -118,7 +130,7 @@ contract DeployOnL1 is Script { address(taikoL1), bytes.concat( taikoL1.init.selector, - abi.encode(addressManagerProxy, genesisHash, feeBase, initProofTimeIssued) + abi.encode(addressManagerProxy, genesisHash, feeBase, initProofTimeIssued, initProofTimeIssued) ) ); setAddress("taiko", taikoL1Proxy); diff --git a/packages/protocol/script/DetermineNewProofTimeIssued.s.sol b/packages/protocol/script/DetermineNewProofTimeIssued.s.sol new file mode 100644 index 00000000000..7cb30f5f12a --- /dev/null +++ b/packages/protocol/script/DetermineNewProofTimeIssued.s.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "forge-std/Script.sol"; +import "forge-std/console2.sol"; +import {LibLn} from "../test/LibLn.sol"; + +uint16 constant DESIRED_PROOF_TIME_TARGET = 500; +uint8 constant ADJUSTMENT_QUOTIENT = 16; + +contract DetermineProofTimeIssued is Script { + + function run() public { + uint16 proofTimeTarget = DESIRED_PROOF_TIME_TARGET; // Approx. value which close to what is in the simulation + uint64 feeBase = 1e8; // 1 TKO + uint64 initProofTimeIssued = + LibLn.calcInitProofTimeIssued(feeBase, proofTimeTarget, ADJUSTMENT_QUOTIENT); + + console2.log("The proof time target is:", proofTimeTarget); + console2.log("The associated proof time issued is:", initProofTimeIssued); + } +} \ No newline at end of file diff --git a/packages/protocol/script/test_deploy_on_l1.sh b/packages/protocol/script/test_deploy_on_l1.sh index 548851bda76..ff459864eea 100755 --- a/packages/protocol/script/test_deploy_on_l1.sh +++ b/packages/protocol/script/test_deploy_on_l1.sh @@ -14,6 +14,7 @@ TAIKO_TOKEN_PREMINT_RECIPIENT=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ TAIKO_TOKEN_PREMINT_AMOUNT=0xffff \ TREASURE=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ L2_GENESIS_HASH=0xee1950562d42f0da28bd4550d88886bc90894c77c9c9eaefef775d4c8223f259 \ +INITIAL_PROOF_TIME_TARGET=101 \ forge script script/DeployOnL1.s.sol:DeployOnL1 \ --fork-url http://localhost:8545 \ --broadcast \ diff --git a/packages/protocol/test/TaikoL1.sim.sol b/packages/protocol/test/TaikoL1.sim.sol index 05a1c82fbc9..086458aa137 100644 --- a/packages/protocol/test/TaikoL1.sim.sol +++ b/packages/protocol/test/TaikoL1.sim.sol @@ -12,7 +12,7 @@ import {LibLn} from "./LibLn.sol"; /// @dev Tweak this if you iwhs to set - the config and the calculation of the proofTimeIssued /// @dev also originates from this -uint16 constant PROOF_TIME_TARGET = 375; //sec. Approx mainnet scenario +uint16 constant INITIAL_PROOF_TIME_TARGET = 375; //sec. Approx mainnet scenario /// @dev Warning: this test will take 7-10 minutes and require 1GB memory. /// `pnpm sim` @@ -25,7 +25,6 @@ contract TaikoL1_b is TaikoL1 { config.ringBufferSize = 1200; config.maxVerificationsPerTx = 10; config.proofCooldownPeriod = 1 minutes; - config.proofTimeTarget = PROOF_TIME_TARGET; config.realProofSkipSize = 0; } } @@ -86,7 +85,7 @@ contract TaikoL1Simulation is TaikoL1TestBase { } function setUp() public override { - uint16 proofTimeTarget = PROOF_TIME_TARGET; // Approx. value which close to what is in the simulation + proofTimeTarget = INITIAL_PROOF_TIME_TARGET; // Approx. value which close to what is in the simulation initProofTimeIssued = LibLn.calcInitProofTimeIssued(feeBase, proofTimeTarget, ADJUSTMENT_QUOTIENT); @@ -162,7 +161,7 @@ contract TaikoL1Simulation is TaikoL1TestBase { uint256 proposedIndex; console2.log("Last second:", maxTime); - console2.log("Proof time target:", PROOF_TIME_TARGET); + console2.log("Proof time target:", INITIAL_PROOF_TIME_TARGET); console2.log("Average proposal time: ", totalDiffsProp / blocksToSimulate); console2.log("Average proof time: ", totalDiffsProve / blocksToSimulate); printVariableHeaders(); @@ -340,7 +339,7 @@ contract TaikoL1Simulation is TaikoL1TestBase { uint256 proposedIndex; console2.log("Last second:", maxTime); - console2.log("Proof time target:", PROOF_TIME_TARGET); + console2.log("Proof time target:", INITIAL_PROOF_TIME_TARGET); console2.log("Average proposal time: ", totalDiffsProp / blocksToSimulate); console2.log("Average proof time: ", totalDiffsProve / blocksToSimulate); printVariableHeaders(); @@ -523,7 +522,7 @@ contract TaikoL1Simulation is TaikoL1TestBase { uint256 proposedIndex; console2.log("Last second:", maxTime); - console2.log("Proof time target:", PROOF_TIME_TARGET); + console2.log("Proof time target:", INITIAL_PROOF_TIME_TARGET); console2.log("Average proposal time: ", totalDiffsProp / blocksToSimulate); console2.log("Average proof time: ", totalDiffsProve / blocksToSimulate); printVariableHeaders(); diff --git a/packages/protocol/test/TaikoL1LibTokenomicsMainnet.t.sol b/packages/protocol/test/TaikoL1LibTokenomicsMainnet.t.sol index 01b4dd69a20..62c6428b609 100644 --- a/packages/protocol/test/TaikoL1LibTokenomicsMainnet.t.sol +++ b/packages/protocol/test/TaikoL1LibTokenomicsMainnet.t.sol @@ -14,6 +14,10 @@ import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {TaikoL1TestBase} from "./TaikoL1TestBase.t.sol"; import {LibLn} from "./LibLn.sol"; +/// @dev Tweak this if you iwhs to set - the config and the calculation of the proofTimeIssued +/// @dev also originates from this +uint16 constant INITIAL_PROOF_TIME_TARGET = 2160; //sec. Approx mainnet scenario + contract TaikoL1MainnetMockConfig is TaikoL1 { function getConfig() public pure override returns (TaikoData.Config memory config) { config = TaikoConfig.getConfig(); @@ -23,7 +27,6 @@ contract TaikoL1MainnetMockConfig is TaikoL1 { config.maxNumProposedBlocks = 200; config.ringBufferSize = 240; config.proofCooldownPeriod = 0; - config.proofTimeTarget = 2160; } } @@ -41,7 +44,7 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase { } function setUp() public override { - uint16 proofTimeTarget = 2160; // Approx. mainnet value + proofTimeTarget = INITIAL_PROOF_TIME_TARGET; // Approx. mainnet value // Calculating it for our needs based on testnet/mainnet proof vars. // See Brecht's comment https://github.com/taikoxyz/taiko-mono/pull/13564 initProofTimeIssued = diff --git a/packages/protocol/test/TaikoL1LibTokenomicsTestnet.t.sol b/packages/protocol/test/TaikoL1LibTokenomicsTestnet.t.sol index 7e2ce276e33..ab1861f8aa3 100644 --- a/packages/protocol/test/TaikoL1LibTokenomicsTestnet.t.sol +++ b/packages/protocol/test/TaikoL1LibTokenomicsTestnet.t.sol @@ -14,6 +14,8 @@ import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {TaikoL1TestBase} from "./TaikoL1TestBase.t.sol"; import {LibLn} from "./LibLn.sol"; +uint16 constant INITIAL_PROOF_TIME_TARGET = 120; //sec. Approx testnet scenario + contract TaikoL1WithTestnetConfig is TaikoL1 { function getConfig() public pure override returns (TaikoData.Config memory config) { config = TaikoConfig.getConfig(); @@ -23,7 +25,6 @@ contract TaikoL1WithTestnetConfig is TaikoL1 { config.proofCooldownPeriod = 0; config.maxNumProposedBlocks = 40; config.ringBufferSize = 48; - config.proofTimeTarget = 120; // Testnet example } } @@ -34,7 +35,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } function setUp() public override { - uint16 proofTimeTarget = 120; // Approx. testnet value + proofTimeTarget = INITIAL_PROOF_TIME_TARGET; // Approx. testnet value // Calculating it for our needs based on testnet/mainnet proof vars. // See Brecht's comment https://github.com/taikoxyz/taiko-mono/pull/13564 initProofTimeIssued = @@ -834,6 +835,75 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { assertApproxEqRel(deposits, withdrawals, 1e17); } + /// @dev Test if testing proof time params works (changes) as expected + function test_changing_proof_time_parameters( + ) external { + mine(1); + + depositTaikoToken(Alice, 1e6 * 1e8, 100 ether); + depositTaikoToken(Bob, 1e6 * 1e8, 100 ether); + depositTaikoToken(Carol, 1e6 * 1e8, 100 ether); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + // Check balances + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); + uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); + console2.log("Alice balance:", Alice_start_balance); + console2.log("Bob balance:", Bob_start_balance); + + //parentHash = prove_with_increasing_time(parentHash, 10); + for (uint256 blockId = 1; blockId < 20; blockId++) { + + // See if proof reward decreases faster than usual + if(blockId == 8) { + // 500 sec has the proofTimeIssued of 219263 (Calculated with 'forge script script/DetermineNewProofTimeIssued.s.sol') + L1.setProofParams(500, 219263); + } + + // See if proof reward increases now + if(blockId == 15) { + // 10 sec has the proofTimeIssued of 3759 (Calculated with 'forge script script/DetermineNewProofTimeIssued.s.sol') + L1.setProofParams(10, 3759); + } + + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1000000, 1024); + uint64 proposedAt = uint64(block.timestamp); + printVariables("after propose"); + mine(5); + + bytes32 blockHash = bytes32(1e10 + blockId); + bytes32 signalRoot = bytes32(1e9 + blockId); + proveBlock( + Bob, + Bob, + meta, + parentHash, + blockId == 1 ? 0 : 1000000, + 1000000, + blockHash, + signalRoot + ); + uint64 provenAt = uint64(block.timestamp); + console2.log("Proof reward is:", L1.getProofReward(provenAt, proposedAt)); + + verifyBlock(Carol, 1); + + parentHash = blockHash; + } + + //Check end balances + + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + + assertEq(deposits, withdrawals); + } + function mine_huge() internal { vm.warp(block.timestamp + 1200); vm.roll(block.number + 300); diff --git a/packages/protocol/test/TaikoL1Oracle.t.sol b/packages/protocol/test/TaikoL1Oracle.t.sol index 91b5b30d6fc..1fa6cfb0377 100644 --- a/packages/protocol/test/TaikoL1Oracle.t.sol +++ b/packages/protocol/test/TaikoL1Oracle.t.sol @@ -440,7 +440,7 @@ contract TaikoL1OracleTest is TaikoL1TestBase { assertEq(lastVerifiedBlockIdNow, lastVerifiedBlockId); } - vm.warp(block.timestamp + conf.proofTimeTarget + conf.systemProofCooldownPeriod); + vm.warp(block.timestamp + L1.getStateVariables().proofTimeTarget + conf.systemProofCooldownPeriod); verifyBlock(Carol, 1); lastVerifiedBlockIdNow = L1.getStateVariables().lastVerifiedBlockId; diff --git a/packages/protocol/test/TaikoL1TestBase.t.sol b/packages/protocol/test/TaikoL1TestBase.t.sol index 732bdf2d749..5c1a74e2c85 100644 --- a/packages/protocol/test/TaikoL1TestBase.t.sol +++ b/packages/protocol/test/TaikoL1TestBase.t.sol @@ -46,6 +46,7 @@ abstract contract TaikoL1TestBase is Test { // Calculation shall be done in derived contracts - based on testnet or mainnet expected proof time uint64 public initProofTimeIssued; + uint16 proofTimeTarget; uint8 public constant ADJUSTMENT_QUOTIENT = 16; function deployTaikoL1() internal virtual returns (TaikoL1 taikoL1); @@ -81,7 +82,14 @@ abstract contract TaikoL1TestBase is Test { registerAddress("proto_broker", address(L1)); // Lastly, init L1 - L1.init(address(addressManager), GENESIS_BLOCK_HASH, feeBase, initProofTimeIssued); + if( proofTimeTarget == 0 || initProofTimeIssued == 0) { + // This just means, these tests are not focusing on the tokenomics, which is fine! + // So here, with 500second proof time the initial proof time issued value shall be that below. + // Calculated with 'forge script script/DetermineNewProofTimeIssued.s.sol' + proofTimeTarget = 500; + initProofTimeIssued = 219263; + } + L1.init(address(addressManager), GENESIS_BLOCK_HASH, feeBase, proofTimeTarget, initProofTimeIssued); printVariables("init "); }