Commit 141ffd88 authored by Maurelian's avatar Maurelian Committed by Kelvin Fichter

feat(contracts): Calculate the CTC's gas burn config at creation time

parent 95a0d803
...@@ -34,9 +34,9 @@ contract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressRes ...@@ -34,9 +34,9 @@ contract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressRes
// L2 tx gas-related // L2 tx gas-related
uint256 constant public MIN_ROLLUP_TX_GAS = 100000; uint256 constant public MIN_ROLLUP_TX_GAS = 100000;
uint256 constant public MAX_ROLLUP_TX_SIZE = 50000; uint256 constant public MAX_ROLLUP_TX_SIZE = 50000;
uint256 constant public L2_GAS_DISCOUNT_DIVISOR = 32; uint256 immutable public L2_GAS_DISCOUNT_DIVISOR;
uint256 constant public ENQUEUE_GAS_COST = 60000; uint256 immutable public ENQUEUE_GAS_COST;
uint256 public ENQUEUE_L2_GAS_PREPAID = L2_GAS_DISCOUNT_DIVISOR * ENQUEUE_GAS_COST; uint256 immutable public ENQUEUE_L2_GAS_PREPAID;
// Encoding-related (all in bytes) // Encoding-related (all in bytes)
uint256 constant internal BATCH_CONTEXT_SIZE = 16; uint256 constant internal BATCH_CONTEXT_SIZE = 16;
...@@ -63,13 +63,18 @@ contract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressRes ...@@ -63,13 +63,18 @@ contract CanonicalTransactionChain is ICanonicalTransactionChain, Lib_AddressRes
address _libAddressManager, address _libAddressManager,
uint256 _forceInclusionPeriodSeconds, uint256 _forceInclusionPeriodSeconds,
uint256 _forceInclusionPeriodBlocks, uint256 _forceInclusionPeriodBlocks,
uint256 _maxTransactionGasLimit uint256 _maxTransactionGasLimit,
uint256 _l2GasDiscountDivisor,
uint256 _enqueueGasCost
) )
Lib_AddressResolver(_libAddressManager) Lib_AddressResolver(_libAddressManager)
{ {
forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds; forceInclusionPeriodSeconds = _forceInclusionPeriodSeconds;
forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks; forceInclusionPeriodBlocks = _forceInclusionPeriodBlocks;
maxTransactionGasLimit = _maxTransactionGasLimit; maxTransactionGasLimit = _maxTransactionGasLimit;
L2_GAS_DISCOUNT_DIVISOR = _l2GasDiscountDivisor;
ENQUEUE_GAS_COST = _enqueueGasCost;
ENQUEUE_L2_GAS_PREPAID = _l2GasDiscountDivisor * _enqueueGasCost;
} }
......
...@@ -16,6 +16,8 @@ import { ...@@ -16,6 +16,8 @@ import {
DUMMY_BATCH_PROOFS, DUMMY_BATCH_PROOFS,
FORCE_INCLUSION_PERIOD_SECONDS, FORCE_INCLUSION_PERIOD_SECONDS,
FORCE_INCLUSION_PERIOD_BLOCKS, FORCE_INCLUSION_PERIOD_BLOCKS,
L2_GAS_DISCOUNT_DIVISOR,
ENQUEUE_GAS_COST,
TrieTestGenerator, TrieTestGenerator,
getNextBlockNumber, getNextBlockNumber,
encodeXDomainCalldata, encodeXDomainCalldata,
...@@ -100,7 +102,9 @@ describe('L1CrossDomainMessenger', () => { ...@@ -100,7 +102,9 @@ describe('L1CrossDomainMessenger', () => {
AddressManager.address, AddressManager.address,
FORCE_INCLUSION_PERIOD_SECONDS, FORCE_INCLUSION_PERIOD_SECONDS,
FORCE_INCLUSION_PERIOD_BLOCKS, FORCE_INCLUSION_PERIOD_BLOCKS,
MAX_GAS_LIMIT MAX_GAS_LIMIT,
L2_GAS_DISCOUNT_DIVISOR,
ENQUEUE_GAS_COST
) )
const batches = await Factory__ChainStorageContainer.deploy( const batches = await Factory__ChainStorageContainer.deploy(
......
...@@ -16,6 +16,8 @@ import { ...@@ -16,6 +16,8 @@ import {
makeAddressManager, makeAddressManager,
setProxyTarget, setProxyTarget,
FORCE_INCLUSION_PERIOD_SECONDS, FORCE_INCLUSION_PERIOD_SECONDS,
L2_GAS_DISCOUNT_DIVISOR,
ENQUEUE_GAS_COST,
getEthTime, getEthTime,
getNextBlockNumber, getNextBlockNumber,
NON_ZERO_ADDRESS, NON_ZERO_ADDRESS,
...@@ -85,7 +87,9 @@ describe('[GAS BENCHMARK] CanonicalTransactionChain', () => { ...@@ -85,7 +87,9 @@ describe('[GAS BENCHMARK] CanonicalTransactionChain', () => {
AddressManager.address, AddressManager.address,
FORCE_INCLUSION_PERIOD_SECONDS, FORCE_INCLUSION_PERIOD_SECONDS,
forceInclusionPeriodBlocks, forceInclusionPeriodBlocks,
MAX_GAS_LIMIT MAX_GAS_LIMIT,
L2_GAS_DISCOUNT_DIVISOR,
ENQUEUE_GAS_COST
) )
const batches = await Factory__ChainStorageContainer.deploy( const batches = await Factory__ChainStorageContainer.deploy(
......
...@@ -19,6 +19,8 @@ import { ...@@ -19,6 +19,8 @@ import {
setProxyTarget, setProxyTarget,
FORCE_INCLUSION_PERIOD_SECONDS, FORCE_INCLUSION_PERIOD_SECONDS,
FORCE_INCLUSION_PERIOD_BLOCKS, FORCE_INCLUSION_PERIOD_BLOCKS,
L2_GAS_DISCOUNT_DIVISOR,
ENQUEUE_GAS_COST,
setEthTime, setEthTime,
NON_ZERO_ADDRESS, NON_ZERO_ADDRESS,
getEthTime, getEthTime,
...@@ -132,7 +134,9 @@ describe('CanonicalTransactionChain', () => { ...@@ -132,7 +134,9 @@ describe('CanonicalTransactionChain', () => {
AddressManager.address, AddressManager.address,
FORCE_INCLUSION_PERIOD_SECONDS, FORCE_INCLUSION_PERIOD_SECONDS,
FORCE_INCLUSION_PERIOD_BLOCKS, FORCE_INCLUSION_PERIOD_BLOCKS,
MAX_GAS_LIMIT MAX_GAS_LIMIT,
L2_GAS_DISCOUNT_DIVISOR,
ENQUEUE_GAS_COST
) )
const batches = await Factory__ChainStorageContainer.deploy( const batches = await Factory__ChainStorageContainer.deploy(
...@@ -200,19 +204,19 @@ describe('CanonicalTransactionChain', () => { ...@@ -200,19 +204,19 @@ describe('CanonicalTransactionChain', () => {
}) })
it('should revert if transaction gas limit does not cover rollup burn', async () => { it('should revert if transaction gas limit does not cover rollup burn', async () => {
const ENQUEUE_L2_GAS_PREPAID = const _enqueueL2GasPrepaid =
await CanonicalTransactionChain.ENQUEUE_L2_GAS_PREPAID() await CanonicalTransactionChain.ENQUEUE_L2_GAS_PREPAID()
const L2_GAS_DISCOUNT_DIVISOR = const l2GasDiscountDivisor =
await CanonicalTransactionChain.L2_GAS_DISCOUNT_DIVISOR() await CanonicalTransactionChain.L2_GAS_DISCOUNT_DIVISOR()
const data = '0x' + '12'.repeat(1234) const data = '0x' + '12'.repeat(1234)
// Create a tx with high L2 gas limit, but insufficient L1 gas limit to cover burn. // Create a tx with high L2 gas limit, but insufficient L1 gas limit to cover burn.
const l2GasLimit = 2 * ENQUEUE_L2_GAS_PREPAID const l2GasLimit = 2 * _enqueueL2GasPrepaid
// This l1GasLimit is equivalent to the gasToConsume amount calculated in the CTC. After // This l1GasLimit is equivalent to the gasToConsume amount calculated in the CTC. After
// additional gas overhead, it will be enough trigger the gas burn, but not enough to cover // additional gas overhead, it will be enough trigger the gas burn, but not enough to cover
// it. // it.
const l1GasLimit = const l1GasLimit =
(l2GasLimit - ENQUEUE_L2_GAS_PREPAID) / L2_GAS_DISCOUNT_DIVISOR (l2GasLimit - _enqueueL2GasPrepaid) / l2GasDiscountDivisor
await expect( await expect(
CanonicalTransactionChain.enqueue(target, l2GasLimit, data, { CanonicalTransactionChain.enqueue(target, l2GasLimit, data, {
......
...@@ -11,6 +11,8 @@ export const DEFAULT_ACCOUNTS_HARDHAT = defaultAccounts.map((account) => { ...@@ -11,6 +11,8 @@ export const DEFAULT_ACCOUNTS_HARDHAT = defaultAccounts.map((account) => {
export const RUN_OVM_TEST_GAS = 20_000_000 export const RUN_OVM_TEST_GAS = 20_000_000
export const FORCE_INCLUSION_PERIOD_SECONDS = 600 export const FORCE_INCLUSION_PERIOD_SECONDS = 600
export const L2_GAS_DISCOUNT_DIVISOR = 32
export const ENQUEUE_GAS_COST = 60_000
export const FORCE_INCLUSION_PERIOD_BLOCKS = 600 / 12 export const FORCE_INCLUSION_PERIOD_BLOCKS = 600 / 12
export const NON_NULL_BYTES32 = export const NON_NULL_BYTES32 =
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment