Skip to content

feat(protocol): tract avgProverMarketFee and cap bids with the average #19260

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 13 commits into from
88 changes: 44 additions & 44 deletions packages/protocol/.gas-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -23,56 +23,56 @@ ForcedInclusionStoreTest:test_storeConsumeForcedInclusion_notOperator() (gas: 12
ForcedInclusionStoreTest:test_storeConsumeForcedInclusion_success() (gas: 130906)
ForcedInclusionStoreTest:test_storeForcedInclusion_incorrectFee() (gas: 39834)
ForcedInclusionStoreTest:test_storeForcedInclusion_only_once_per_tx() (gas: 112138)
InboxTest_BondMechanics:test_inbox_bonds_debit_and_credit_proved_by_non_proposer_in_proving_window() (gas: 1023196)
InboxTest_BondMechanics:test_inbox_bonds_debit_and_credit_proved_by_proposer_in_proving_window() (gas: 1017236)
InboxTest_BondMechanics:test_inbox_bonds_half_returned_to_non_proposer_out_of_proving_window() (gas: 1045255)
InboxTest_BondMechanics:test_inbox_bonds_half_returned_to_proposer_out_of_proving_window() (gas: 1019289)
InboxTest_BondMechanics:test_inbox_bonds_multiple_blocks_per_batch() (gas: 282192)
InboxTest_BondToken:test_inbox_deposit_and_withdraw_from_multiple_users() (gas: 272656)
InboxTest_BondToken:test_inbox_deposit_withdraw() (gas: 144379)
InboxTest_BondMechanics:test_inbox_bonds_debit_and_credit_proved_by_non_proposer_in_proving_window() (gas: 1023187)
InboxTest_BondMechanics:test_inbox_bonds_debit_and_credit_proved_by_proposer_in_proving_window() (gas: 1017249)
InboxTest_BondMechanics:test_inbox_bonds_half_returned_to_non_proposer_out_of_proving_window() (gas: 1045245)
InboxTest_BondMechanics:test_inbox_bonds_half_returned_to_proposer_out_of_proving_window() (gas: 1019301)
InboxTest_BondMechanics:test_inbox_bonds_multiple_blocks_per_batch() (gas: 282364)
InboxTest_BondToken:test_inbox_deposit_and_withdraw_from_multiple_users() (gas: 272414)
InboxTest_BondToken:test_inbox_deposit_withdraw() (gas: 144313)
InboxTest_BondToken:test_inbox_exceeding_token_balance() (gas: 98492)
InboxTest_BondToken:test_inbox_insufficient_approval() (gas: 95903)
InboxTest_BondToken:test_inbox_no_value_sent_on_deposit() (gas: 96709)
InboxTest_BondToken:test_inbox_withdraw_more_than_bond_balance() (gas: 131126)
InboxTest_CalldataForTxList:test_batch_rejection_due_to_missing_txlist_and_blobindex() (gas: 166600)
InboxTest_CalldataForTxList:test_calldata_used_for_txlist_da() (gas: 1026551)
InboxTest_CalldataForTxList:test_multiple_blocks_with_different_txlist() (gas: 1767317)
InboxTest_CalldataForTxList:test_propose_batch_with_empty_txlist_and_valid_blobindex() (gas: 1052782)
InboxTest_CalldataForTxList:test_prove_batch_with_mismatched_info_hash() (gas: 921429)
InboxTest_Cooldownis:test_inbox_batches_cannot_verify_inside_cooldown_window() (gas: 12581317)
InboxTest_EtherAsBond:test_inbox_bond_balance_after_multiple_operations() (gas: 144196)
InboxTest_EtherAsBond:test_inbox_deposit_withdraw() (gas: 64056)
InboxTest_BondToken:test_inbox_withdraw_more_than_bond_balance() (gas: 131104)
InboxTest_CalldataForTxList:test_batch_rejection_due_to_missing_txlist_and_blobindex() (gas: 166662)
InboxTest_CalldataForTxList:test_calldata_used_for_txlist_da() (gas: 1026624)
InboxTest_CalldataForTxList:test_multiple_blocks_with_different_txlist() (gas: 1767459)
InboxTest_CalldataForTxList:test_propose_batch_with_empty_txlist_and_valid_blobindex() (gas: 1052839)
InboxTest_CalldataForTxList:test_prove_batch_with_mismatched_info_hash() (gas: 921335)
InboxTest_Cooldownis:test_inbox_batches_cannot_verify_inside_cooldown_window() (gas: 12578887)
InboxTest_EtherAsBond:test_inbox_bond_balance_after_multiple_operations() (gas: 143954)
InboxTest_EtherAsBond:test_inbox_deposit_withdraw() (gas: 63990)
InboxTest_EtherAsBond:test_inbox_eth_not_paid_as_bond_on_deposit() (gas: 18884)
InboxTest_EtherAsBond:test_inbox_overpayment_of_ether() (gas: 25676)
InboxTest_EtherAsBond:test_inbox_withdraw_more_than_bond_balance() (gas: 51406)
InboxTest_Params:test_validateParams_defaults_when_anchorBlockId_is_zero() (gas: 266678)
InboxTest_Params:test_validateParams_reverts_when_anchorBlockId_smaller_than_parent() (gas: 922226)
InboxTest_Params:test_validateParams_reverts_when_anchorBlockId_too_large() (gas: 132931)
InboxTest_Params:test_validateParams_reverts_when_anchorBlockId_too_small() (gas: 144466)
InboxTest_Params:test_validateParams_reverts_when_first_block_time_shift_not_zero() (gas: 310939)
InboxTest_Params:test_validateParams_reverts_when_timestamp_smaller_than_parent() (gas: 319582)
InboxTest_Params:test_validateParams_reverts_when_timestamp_too_large() (gas: 133016)
InboxTest_Params:test_validateParams_when_anchorBlockId_is_not_zero() (gas: 266962)
InboxTest_ProposeAndProve:test_inbox_exceed_max_batch_proposal_will_revert() (gas: 8137888)
InboxTest_ProposeAndProve:test_inbox_max_batch_proposal() (gas: 8456873)
InboxTest_ProposeAndProve:test_inbox_measure_gas_used() (gas: 16327201)
InboxTest_ProposeAndProve:test_inbox_propose_1block_per_batch_and_prove_many_blocks_with_first_transition_being_correct() (gas: 8833782)
InboxTest_ProposeAndProve:test_inbox_propose_7block_per_batch_and_prove_many_blocks_with_first_transition_being_correct() (gas: 12094419)
InboxTest_ProposeAndProve:test_inbox_propose_and_prove_many_blocks_with_second_transition_being_correct() (gas: 10122663)
InboxTest_ProposeAndProve:test_inbox_prove_batch_not_exist_will_revert() (gas: 124974)
InboxTest_ProposeAndProve:test_inbox_prove_verified_batch_will_revert() (gas: 1053785)
InboxTest_ProposeAndProve:test_inbox_prove_with_wrong_transitions_will_not_finalize_blocks() (gas: 5993151)
InboxTest_EtherAsBond:test_inbox_withdraw_more_than_bond_balance() (gas: 51384)
InboxTest_Params:test_validateParams_defaults_when_anchorBlockId_is_zero() (gas: 266871)
InboxTest_Params:test_validateParams_reverts_when_anchorBlockId_smaller_than_parent() (gas: 922514)
InboxTest_Params:test_validateParams_reverts_when_anchorBlockId_too_large() (gas: 133015)
InboxTest_Params:test_validateParams_reverts_when_anchorBlockId_too_small() (gas: 144528)
InboxTest_Params:test_validateParams_reverts_when_first_block_time_shift_not_zero() (gas: 311300)
InboxTest_Params:test_validateParams_reverts_when_timestamp_smaller_than_parent() (gas: 319944)
InboxTest_Params:test_validateParams_reverts_when_timestamp_too_large() (gas: 133100)
InboxTest_Params:test_validateParams_when_anchorBlockId_is_not_zero() (gas: 267155)
InboxTest_ProposeAndProve:test_inbox_exceed_max_batch_proposal_will_revert() (gas: 8140259)
InboxTest_ProposeAndProve:test_inbox_max_batch_proposal() (gas: 8458821)
InboxTest_ProposeAndProve:test_inbox_measure_gas_used() (gas: 16325637)
InboxTest_ProposeAndProve:test_inbox_propose_1block_per_batch_and_prove_many_blocks_with_first_transition_being_correct() (gas: 8832853)
InboxTest_ProposeAndProve:test_inbox_propose_7block_per_batch_and_prove_many_blocks_with_first_transition_being_correct() (gas: 12093418)
InboxTest_ProposeAndProve:test_inbox_propose_and_prove_many_blocks_with_second_transition_being_correct() (gas: 10118487)
InboxTest_ProposeAndProve:test_inbox_prove_batch_not_exist_will_revert() (gas: 124699)
InboxTest_ProposeAndProve:test_inbox_prove_verified_batch_will_revert() (gas: 1053568)
InboxTest_ProposeAndProve:test_inbox_prove_with_wrong_transitions_will_not_finalize_blocks() (gas: 5992453)
InboxTest_ProposeAndProve:test_inbox_query_batches_not_exist_will_revert() (gas: 40299)
InboxTest_ProposeAndProve:test_inbox_query_right_after_genesis_batch() (gas: 109904)
InboxTest_ProposeAndProve:test_inbox_reprove_by_transition_with_same_parent_hash_but_different_block_hash_or_state_root_will_pause_inbox() (gas: 1312482)
InboxTest_ProposeAndProve:test_inbox_reprove_by_transition_with_same_parent_hash_but_different_block_hash_will_pause_inbox() (gas: 7855692)
InboxTest_ProposeAndProve:test_inbox_reprove_the_same_batch_with_same_transition_will_do_nothing() (gas: 1226859)
InboxTest_ProposeAndProve:test_inbox_ring_buffer_will_be_reused() (gas: 15186899)
InboxTest_ProposeAndProve:test_proposeBatch_reverts_for_invalid_proposer_and_operator() (gas: 165828)
InboxTest_StopBatch:test_inbox_num_batches_verified() (gas: 8420393)
PreconfRouterTest:test_preconfRouter_proposeBatch() (gas: 375520)
PreconfRouterTest:test_preconfRouter_proposeBatch_notOperator() (gas: 325803)
PreconfRouterTest:test_preconfRouter_proposeBatch_proposerNotSender() (gas: 374150)
InboxTest_ProposeAndProve:test_inbox_query_right_after_genesis_batch() (gas: 109998)
InboxTest_ProposeAndProve:test_inbox_reprove_by_transition_with_same_parent_hash_but_different_block_hash_or_state_root_will_pause_inbox() (gas: 1312403)
InboxTest_ProposeAndProve:test_inbox_reprove_by_transition_with_same_parent_hash_but_different_block_hash_will_pause_inbox() (gas: 7856296)
InboxTest_ProposeAndProve:test_inbox_reprove_the_same_batch_with_same_transition_will_do_nothing() (gas: 1226906)
InboxTest_ProposeAndProve:test_inbox_ring_buffer_will_be_reused() (gas: 15187287)
InboxTest_ProposeAndProve:test_proposeBatch_reverts_for_invalid_proposer_and_operator() (gas: 165934)
InboxTest_StopBatch:test_inbox_num_batches_verified() (gas: 8420765)
PreconfRouterTest:test_preconfRouter_proposeBatch() (gas: 375526)
PreconfRouterTest:test_preconfRouter_proposeBatch_notOperator() (gas: 325794)
PreconfRouterTest:test_preconfRouter_proposeBatch_proposerNotSender() (gas: 374151)
SendMessageToDelegateOwner:testAddress1() (gas: 2391)
TestAutomataDcapV3Attestation:testAttestation() (gas: 4848498)
TestAutomataDcapV3Attestation:testParsedCustomQuoteBinAttestation() (gas: 4553350)
Expand Down
4 changes: 2 additions & 2 deletions packages/protocol/contracts/layer1/based/ITaikoInbox.sol
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,14 @@ interface ITaikoInbox {
// corresponds to the `_anchorStateRoot` parameter in the anchor transaction.
// The batch's validity proof shall verify the integrity of these two values.
bytes32 anchorBlockHash;
bool usingProverMarket;
LibSharedData.BaseFeeConfig baseFeeConfig;
}

/// @dev This struct holds batch metadata essential for proving the batch.
struct BatchMetadata {
bytes32 infoHash;
address prover;
bool usingProverMarket;
uint64 batchId;
uint64 proposedAt; // Used by node/client
}
Expand Down Expand Up @@ -132,7 +132,7 @@ interface ITaikoInbox {
/// compiling without any optimization (neither optimizer runs, no compiling --via-ir flag).
struct Stats1 {
uint64 genesisHeight;
uint64 __reserved2;
uint64 avgProverMarketFee; // in gwei
uint64 lastSyncedBatchId;
uint64 lastSyncedAt;
}
Expand Down
52 changes: 38 additions & 14 deletions packages/protocol/contracts/layer1/based/TaikoInbox.sol
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ abstract contract TaikoInbox is EssentialContract, ITaikoInbox, IProposeBatch, I
address public immutable inboxWrapper;
address public immutable verifier;
address public immutable bondToken;

uint256 public immutable proverMarketFeeChangeFactor;

ISignalService public immutable signalService;
IProverMarket public immutable proverMarket;

Expand All @@ -59,6 +62,7 @@ abstract contract TaikoInbox is EssentialContract, ITaikoInbox, IProposeBatch, I
bondToken = _bondToken;
signalService = ISignalService(_signalService);
proverMarket = IProverMarket(_proverMarket);
proverMarketFeeChangeFactor = 1024;
}

function init(address _owner, bytes32 _genesisBlockHash) external initializer {
Expand All @@ -81,6 +85,7 @@ abstract contract TaikoInbox is EssentialContract, ITaikoInbox, IProposeBatch, I
nonReentrant
returns (BatchInfo memory info_, BatchMetadata memory meta_)
{
Stats1 memory stats1; // not loaded from storage yet
Stats2 memory stats2 = state.stats2;
Config memory config = pacayaConfig();
require(stats2.numBatches >= config.forkHeights.pacaya, ForkNotActivated());
Expand Down Expand Up @@ -177,8 +182,9 @@ abstract contract TaikoInbox is EssentialContract, ITaikoInbox, IProposeBatch, I
// Data for the L2 anchor transaction, shared by all blocks in the batch
anchorBlockId: anchorBlockId,
anchorBlockHash: blockhash(anchorBlockId),
baseFeeConfig: config.baseFeeConfig
});
baseFeeConfig: config.baseFeeConfig,
usingProverMarket: false // to be updated later
});

require(info_.anchorBlockHash != 0, ZeroAnchorBlockHash());

Expand All @@ -191,8 +197,7 @@ abstract contract TaikoInbox is EssentialContract, ITaikoInbox, IProposeBatch, I

meta_ = BatchMetadata({
infoHash: keccak256(abi.encode(info_)),
prover: info_.proposer,
usingProverMarket: false,
prover: info_.proposer, // may be updated later
batchId: stats2.numBatches,
proposedAt: uint64(block.timestamp)
});
Expand All @@ -205,7 +210,17 @@ abstract contract TaikoInbox is EssentialContract, ITaikoInbox, IProposeBatch, I
_debitBond(info_.proposer, proverFee);
_creditBond(meta_.prover, proverFee);

meta_.usingProverMarket = true;
info_.usingProverMarket = true;

// Update avg prover market fee
require(stats1.genesisHeight == 0, "loaded already"); // TODO(daniel): remove this
stats1 = state.stats1; // load from storage
stats1.avgProverMarketFee = uint64(
(
(proverMarketFeeChangeFactor - 1) * stats1.avgProverMarketFee
+ uint64(proverFee / (1 gwei))
) / proverMarketFeeChangeFactor
);
Comment on lines +217 to +223
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is a bit "on-chain heavy". I mean, this code is done when there is a proposal. While the fee only changes when there is an incoming bid. (at least with prover market).
I propose a very similar approach, but inside ProverMarket, and just the cycle of 4 fees can give a good, rough starting point to calculate the max threshold.

See this PR: #19254

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the moving average is updated by bids in the prover market, then the bidder can manipulate the average. In this PR, the moving average is only updated when the fee is actually used by a preconfer, avoiding such manipulation.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe these two average can work together.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that if we allow the average to naively change in the bid there's an option for the prover to manipulate that. You put the max bid possible, then submit a bunch of other bids undercutting you by the minimum possible in the same block effectively pushing the moving average higher, and then repeat the process with a higher number. Admittedly, this is a bit elaborated and would cost significant L1 gas fees.
I think if we want to eliminate the calculation in the proposeBatch function, one option we have is to only update the moving average once per block(or every X blocks). This way the average still changes slowly and gives enough time for other provers(or Taiko) to come in and bid a reasonable amount. The downside is that we would have to store an extra uint64, but significantly reduces the cost in the inbox(which is what should be called more often) since we don't have to do an SSTORE anymore.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See #19264

}

Batch storage batch = state.batches[stats2.numBatches % config.batchRingBufferSize];
Expand Down Expand Up @@ -240,7 +255,7 @@ abstract contract TaikoInbox is EssentialContract, ITaikoInbox, IProposeBatch, I
emit BatchProposed(info_, meta_, _txList);
} // end-of-unchecked

_verifyBatches(config, stats2, 1);
_verifyBatches(config, stats1, stats2, 1);
}

/// @notice Proves multiple batches with a single aggregated proof.
Expand Down Expand Up @@ -375,7 +390,8 @@ abstract contract TaikoInbox is EssentialContract, ITaikoInbox, IProposeBatch, I
_pause();
emit Paused(verifier);
} else {
_verifyBatches(config, stats2, metasLength);
Stats1 memory stats1; // not loaded from storage yet
_verifyBatches(config, stats1, stats2, metasLength);
}
}

Expand All @@ -389,7 +405,8 @@ abstract contract TaikoInbox is EssentialContract, ITaikoInbox, IProposeBatch, I
nonReentrant
whenNotPaused
{
_verifyBatches(pacayaConfig(), state.stats2, _length);
Stats1 memory stats1; // not loaded from storage yet
_verifyBatches(pacayaConfig(), stats1, state.stats2, _length);
}

/// @inheritdoc ITaikoInbox
Expand Down Expand Up @@ -612,6 +629,7 @@ abstract contract TaikoInbox is EssentialContract, ITaikoInbox, IProposeBatch, I

function _verifyBatches(
Config memory _config,
Stats1 memory _stats1,
Stats2 memory _stats2,
uint256 _length
)
Expand Down Expand Up @@ -707,12 +725,12 @@ abstract contract TaikoInbox is EssentialContract, ITaikoInbox, IProposeBatch, I
batch.verifiedTransitionId = synced.tid;
}

Stats1 memory stats1 = state.stats1;
stats1.lastSyncedBatchId = batch.batchId;
stats1.lastSyncedAt = uint64(block.timestamp);
state.stats1 = stats1;

emit Stats1Updated(stats1);
if (_stats1.genesisHeight == 0) {
// _stats1 is not loaded from storage yet.
_stats1 = state.stats1;
}
_stats1.lastSyncedBatchId = batch.batchId;
_stats1.lastSyncedAt = uint64(block.timestamp);

// Ask signal service to write cross chain signal
signalService.syncChainData(
Expand All @@ -722,6 +740,12 @@ abstract contract TaikoInbox is EssentialContract, ITaikoInbox, IProposeBatch, I
}
}

if (_stats1.genesisHeight != 0) {
// _stats1 is every loaded from storage so there is no need to save it.
state.stats1 = _stats1;
emit Stats1Updated(_stats1);
}

state.stats2 = _stats2;
emit Stats2Updated(_stats2);
}
Expand Down
24 changes: 18 additions & 6 deletions packages/protocol/contracts/layer1/prover-market/ProverMarket.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ contract ProverMarket is EssentialContract, IProverMarket {
error InvalidThresholds();
error NotCurrentProver();
error FeeNotDivisibleByFeeUnit();
error FeeBiggerThanMax();
error FeeTooLarge();
error TooEarly();

Expand All @@ -34,6 +35,8 @@ contract ProverMarket is EssentialContract, IProverMarket {
uint256 public immutable provingThreshold;
/// @dev The minimum delay required before a prover can exit the prover market.
uint256 public immutable minExitDelay;
/// @dev The unit of fee to make sure fee can fit into uint64
uint256 public immutable feeUnit;

/// @dev Slot 1
address internal prover;
Expand Down Expand Up @@ -84,9 +87,12 @@ contract ProverMarket is EssentialContract, IProverMarket {
external
validExitTimestamp(_exitTimestamp)
{
require(_fee % (1 gwei) == 0, FeeNotDivisibleByFeeUnit());
require(_fee / (1 gwei) <= type(uint64).max, FeeTooLarge());
uint64 fee_ = uint64(_fee / (1 gwei));
require(_fee % feeUnit == 0, FeeNotDivisibleByFeeUnit());
require(_fee / feeUnit <= type(uint64).max, FeeTooLarge());
Comment on lines +90 to +91

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wouldn't it be simpler if the bid is already expressed in feeUnit(gwei) as a uint64. I think having different representations(what people use to bid vs how fees are represented internally) leads to more complexity and might even lead to more confusion

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alternatively if you represent everything with a uint96 should be enough to represent all Taiko supply, but I think you already had a reserved uint64 in the struct that you are reusing, so likely not possible


uint256 maxFee = getMaxFee();
require(maxFee == 0 || _fee <= maxFee, FeeBiggerThanMax());
uint64 fee_ = uint64(_fee / feeUnit);

require(inbox.bondBalanceOf(msg.sender) >= biddingThreshold, InsufficientBondBalance());

Expand All @@ -113,7 +119,7 @@ contract ProverMarket is EssentialContract, IProverMarket {
onlyCurrentProver
{
exitTimestamps[msg.sender] = _exitTimestamp;
emit ProverChanged(msg.sender, 1 gwei * fee, _exitTimestamp);
emit ProverChanged(msg.sender, feeUnit * fee, _exitTimestamp);
}

/// @inheritdoc IProverMarket
Expand All @@ -122,10 +128,16 @@ contract ProverMarket is EssentialContract, IProverMarket {
_getCurrentProver();
return currentProverBalance < provingThreshold
? (address(0), 0)
: (currentProver, 1 gwei * currentFee);
: (currentProver, feeUnit * currentFee);
}

/// @dev The maximum fee that can be used by provers to bid.
/// The current implementation returns a 5 times of the moving average.
function getMaxFee() public view returns (uint256) {
return 5 gwei * inbox.getStats1().avgProverMarketFee;
}

function _getCurrentProver() public view returns (address, uint64, uint256) {
function _getCurrentProver() internal view returns (address, uint64, uint256) {
address currentProver = prover;
if (
currentProver == address(0) // no bidding
Expand Down
6 changes: 3 additions & 3 deletions packages/protocol/deployments/test_inbox_measure_gas_used.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
See `test_inbox_measure_gas_used` in InboxTest_ProposeAndProve.t.sol

Gas per proposeBatches: 680644
Gas per proveBatches: 51267
Total: 731911
Gas per proposeBatches: 680858
Gas per proveBatches: 50934
Total: 731792
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ contract MockTaikoInbox is EssentialContract {
anchorBlockId: params.anchorBlockId,
anchorBlockHash: bytes32(0), // Mock value
blocks: params.blocks,
usingProverMarket: false,
baseFeeConfig: LibSharedData.BaseFeeConfig({
adjustmentQuotient: 0,
sharingPctg: 0,
Expand All @@ -50,8 +51,7 @@ contract MockTaikoInbox is EssentialContract {

meta_ = ITaikoInbox.BatchMetadata({
batchId: 0,
prover: params.proposer,
usingProverMarket: false,
prover: params.proposer, // TODO(daniel)
proposedAt: uint64(block.timestamp),
infoHash: keccak256(abi.encode(info_))
});
Expand Down
Loading