Skip to content

Commit c8cac00

Browse files
committed
apollo_l1_gas_price: put eth/strk oracle into gas price provider
1 parent c2cab4c commit c8cac00

File tree

13 files changed

+122
-69
lines changed

13 files changed

+122
-69
lines changed

crates/apollo_consensus_manager/src/consensus_manager.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ use apollo_consensus_orchestrator::sequencer_consensus_context::{
1919
};
2020
use apollo_infra::component_definitions::ComponentStarter;
2121
use apollo_infra_utils::type_name::short_type_name;
22-
use apollo_l1_gas_price::eth_to_strk_oracle::EthToStrkOracleClient;
2322
use apollo_l1_gas_price_types::L1GasPriceProviderClient;
2423
use apollo_network::gossipsub_impl::Topic;
2524
use apollo_network::network_manager::metrics::{BroadcastNetworkMetrics, NetworkMetrics};
@@ -158,9 +157,6 @@ impl ConsensusManager {
158157
self.config.cende_config.clone(),
159158
Arc::clone(&self.class_manager_client),
160159
)),
161-
eth_to_strk_oracle_client: Arc::new(EthToStrkOracleClient::new(
162-
self.config.eth_to_strk_oracle_config.clone(),
163-
)),
164160
l1_gas_price_provider: self.l1_gas_price_provider.clone(),
165161
clock: Arc::new(DefaultClock),
166162
outbound_proposal_sender: outbound_internal_sender,

crates/apollo_consensus_orchestrator/src/build_proposal.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ async fn initiate_build(args: &ProposalBuildArguments) -> BuildProposalResult<Co
136136
.expect("Can't convert timeout to chrono::Duration");
137137
let timestamp = args.deps.clock.unix_now();
138138
let (eth_to_fri_rate, l1_prices) = get_oracle_rate_and_prices(
139-
args.deps.eth_to_strk_oracle_client.clone(),
140139
args.deps.l1_gas_price_provider.clone(),
141140
timestamp,
142141
args.previous_block_info.as_ref(),

crates/apollo_consensus_orchestrator/src/sequencer_consensus_context.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use apollo_consensus::types::{
2525
Round,
2626
ValidatorId,
2727
};
28-
use apollo_l1_gas_price_types::{EthToStrkOracleClientTrait, L1GasPriceProviderClient};
28+
use apollo_l1_gas_price_types::L1GasPriceProviderClient;
2929
use apollo_network::network_manager::{BroadcastTopicClient, BroadcastTopicClientTrait};
3030
use apollo_protobuf::consensus::{
3131
ConsensusBlockInfo,
@@ -164,7 +164,6 @@ pub struct SequencerConsensusContextDeps {
164164
pub state_sync_client: Arc<dyn StateSyncClient>,
165165
pub batcher: Arc<dyn BatcherClient>,
166166
pub cende_ambassador: Arc<dyn CendeContext>,
167-
pub eth_to_strk_oracle_client: Arc<dyn EthToStrkOracleClientTrait>,
168167
pub l1_gas_price_provider: Arc<dyn L1GasPriceProviderClient>,
169168
/// Use DefaultClock if you don't want to inject timestamps.
170169
pub clock: Arc<dyn Clock>,

crates/apollo_consensus_orchestrator/src/sequencer_consensus_context_test.rs

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,7 @@ use apollo_l1_gas_price_types::errors::{
1111
L1GasPriceClientError,
1212
L1GasPriceProviderError,
1313
};
14-
use apollo_l1_gas_price_types::{
15-
MockEthToStrkOracleClientTrait,
16-
MockL1GasPriceProviderClient,
17-
PriceInfo,
18-
DEFAULT_ETH_TO_FRI_RATE,
19-
};
14+
use apollo_l1_gas_price_types::{MockL1GasPriceProviderClient, PriceInfo, DEFAULT_ETH_TO_FRI_RATE};
2015
use apollo_protobuf::consensus::{ProposalFin, ProposalInit, ProposalPart, TransactionBatch, Vote};
2116
use apollo_time::time::MockClock;
2217
use chrono::{TimeZone, Utc};
@@ -474,6 +469,7 @@ async fn gas_price_limits(#[case] maximum: bool) {
474469
0
475470
};
476471
let mut l1_gas_price_provider = MockL1GasPriceProviderClient::new();
472+
l1_gas_price_provider.expect_get_eth_to_fri_rate().returning(|_| Ok(ETH_TO_FRI_RATE));
477473
l1_gas_price_provider.expect_get_price_info().returning(move |_| {
478474
Ok(PriceInfo { base_fee_per_gas: GasPrice(price), blob_fee: GasPrice(price) })
479475
});
@@ -586,6 +582,7 @@ async fn oracle_fails_on_startup(#[case] l1_oracle_failure: bool) {
586582

587583
if l1_oracle_failure {
588584
let mut l1_prices_oracle_client = MockL1GasPriceProviderClient::new();
585+
l1_prices_oracle_client.expect_get_eth_to_fri_rate().returning(|_| Ok(ETH_TO_FRI_RATE));
589586
l1_prices_oracle_client.expect_get_price_info().times(1).return_const(Err(
590587
L1GasPriceClientError::L1GasPriceProviderError(
591588
// random error, these parameters don't mean anything
@@ -594,11 +591,19 @@ async fn oracle_fails_on_startup(#[case] l1_oracle_failure: bool) {
594591
));
595592
deps.l1_gas_price_provider = l1_prices_oracle_client;
596593
} else {
597-
let mut eth_to_strk_oracle_client = MockEthToStrkOracleClientTrait::new();
598-
eth_to_strk_oracle_client.expect_eth_to_fri_rate().times(1).return_once(|_| {
599-
Err(EthToStrkOracleClientError::MissingFieldError("".to_string(), "".to_string()))
594+
let mut l1_prices_oracle_client = MockL1GasPriceProviderClient::new();
595+
l1_prices_oracle_client.expect_get_price_info().returning(|_| {
596+
Ok(PriceInfo {
597+
base_fee_per_gas: GasPrice(TEMP_ETH_GAS_FEE_IN_WEI),
598+
blob_fee: GasPrice(TEMP_ETH_BLOB_GAS_FEE_IN_WEI),
599+
})
600600
});
601-
deps.eth_to_strk_oracle_client = eth_to_strk_oracle_client;
601+
l1_prices_oracle_client.expect_get_eth_to_fri_rate().times(1).return_once(|_| {
602+
Err(L1GasPriceClientError::EthToStrkOracleClientError(
603+
EthToStrkOracleClientError::MissingFieldError("".to_string(), "".to_string()),
604+
))
605+
});
606+
deps.l1_gas_price_provider = l1_prices_oracle_client;
602607
}
603608

604609
let mut context = deps.build_context();
@@ -667,6 +672,7 @@ async fn oracle_fails_on_second_block(#[case] l1_oracle_failure: bool) {
667672
// set the oracle to succeed on first block and fail on second
668673
if l1_oracle_failure {
669674
let mut l1_prices_oracle_client = MockL1GasPriceProviderClient::new();
675+
l1_prices_oracle_client.expect_get_eth_to_fri_rate().returning(|_| Ok(ETH_TO_FRI_RATE));
670676
l1_prices_oracle_client.expect_get_price_info().times(1).return_const(Ok(PriceInfo {
671677
base_fee_per_gas: GasPrice(TEMP_ETH_GAS_FEE_IN_WEI),
672678
blob_fee: GasPrice(TEMP_ETH_BLOB_GAS_FEE_IN_WEI),
@@ -679,15 +685,36 @@ async fn oracle_fails_on_second_block(#[case] l1_oracle_failure: bool) {
679685
));
680686
deps.l1_gas_price_provider = l1_prices_oracle_client;
681687
} else {
682-
let mut eth_to_strk_oracle_client = MockEthToStrkOracleClientTrait::new();
683-
eth_to_strk_oracle_client
684-
.expect_eth_to_fri_rate()
688+
let mut l1_prices_oracle_client = MockL1GasPriceProviderClient::new();
689+
// Make sure the L1 gas price always returns with good values.
690+
l1_prices_oracle_client.expect_get_price_info().returning(|_| {
691+
Ok(PriceInfo {
692+
base_fee_per_gas: GasPrice(TEMP_ETH_GAS_FEE_IN_WEI),
693+
blob_fee: GasPrice(TEMP_ETH_BLOB_GAS_FEE_IN_WEI),
694+
})
695+
});
696+
// Set the eth_to_fri_rate to succeed on first block and fail on second.
697+
l1_prices_oracle_client
698+
.expect_get_eth_to_fri_rate()
685699
.times(1)
686700
.return_once(|_| Ok(ETH_TO_FRI_RATE));
687-
eth_to_strk_oracle_client.expect_eth_to_fri_rate().times(1).return_once(|_| {
688-
Err(EthToStrkOracleClientError::MissingFieldError("".to_string(), "".to_string()))
701+
// Set the eth_to_fri_rate to fail on second block.
702+
l1_prices_oracle_client.expect_get_eth_to_fri_rate().times(1).return_once(|_| {
703+
Err(L1GasPriceClientError::EthToStrkOracleClientError(
704+
EthToStrkOracleClientError::MissingFieldError("".to_string(), "".to_string()),
705+
))
689706
});
690-
deps.eth_to_strk_oracle_client = eth_to_strk_oracle_client;
707+
deps.l1_gas_price_provider = l1_prices_oracle_client;
708+
709+
// let mut eth_to_strk_oracle_client = MockEthToStrkOracleClientTrait::new();
710+
// eth_to_strk_oracle_client
711+
// .expect_eth_to_fri_rate()
712+
// .times(1)
713+
// .return_once(|_| Ok(ETH_TO_FRI_RATE));
714+
// eth_to_strk_oracle_client.expect_eth_to_fri_rate().times(1).return_once(|_| {
715+
// Err(EthToStrkOracleClientError::MissingFieldError("".to_string(), "".to_string()))
716+
// });
717+
// deps.eth_to_strk_oracle_client = eth_to_strk_oracle_client;
691718
}
692719

693720
let mut context = deps.build_context();

crates/apollo_consensus_orchestrator/src/test_utils.rs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,7 @@ use apollo_class_manager_types::transaction_converter::{
2020
TransactionConverterTrait,
2121
};
2222
use apollo_class_manager_types::EmptyClassManagerClient;
23-
use apollo_l1_gas_price_types::{
24-
MockEthToStrkOracleClientTrait,
25-
MockL1GasPriceProviderClient,
26-
PriceInfo,
27-
};
23+
use apollo_l1_gas_price_types::{MockL1GasPriceProviderClient, PriceInfo};
2824
use apollo_network::network_manager::test_utils::{
2925
mock_register_broadcast_topic,
3026
BroadcastNetworkMock,
@@ -93,7 +89,6 @@ pub(crate) struct TestDeps {
9389
pub state_sync_client: MockStateSyncClient,
9490
pub batcher: MockBatcherClient,
9591
pub cende_ambassador: MockCendeContext,
96-
pub eth_to_strk_oracle_client: MockEthToStrkOracleClientTrait,
9792
pub l1_gas_price_provider: MockL1GasPriceProviderClient,
9893
pub clock: Arc<dyn Clock>,
9994
pub outbound_proposal_sender: mpsc::Sender<(HeightAndRound, mpsc::Receiver<ProposalPart>)>,
@@ -107,7 +102,6 @@ impl From<TestDeps> for SequencerConsensusContextDeps {
107102
state_sync_client: Arc::new(deps.state_sync_client),
108103
batcher: Arc::new(deps.batcher),
109104
cende_ambassador: Arc::new(deps.cende_ambassador),
110-
eth_to_strk_oracle_client: Arc::new(deps.eth_to_strk_oracle_client),
111105
l1_gas_price_provider: Arc::new(deps.l1_gas_price_provider),
112106
clock: deps.clock,
113107
outbound_proposal_sender: deps.outbound_proposal_sender,
@@ -121,7 +115,6 @@ impl TestDeps {
121115
self.setup_default_transaction_converter();
122116
self.setup_default_cende_ambassador();
123117
self.setup_default_gas_price_provider();
124-
self.setup_default_eth_to_strk_oracle_client();
125118
}
126119

127120
pub(crate) fn setup_deps_for_build(
@@ -229,10 +222,7 @@ impl TestDeps {
229222
base_fee_per_gas: GasPrice(TEMP_ETH_GAS_FEE_IN_WEI),
230223
blob_fee: GasPrice(TEMP_ETH_BLOB_GAS_FEE_IN_WEI),
231224
}));
232-
}
233-
234-
pub(crate) fn setup_default_eth_to_strk_oracle_client(&mut self) {
235-
self.eth_to_strk_oracle_client.expect_eth_to_fri_rate().returning(|_| Ok(ETH_TO_FRI_RATE));
225+
self.l1_gas_price_provider.expect_get_eth_to_fri_rate().return_const(Ok(ETH_TO_FRI_RATE));
236226
}
237227

238228
pub(crate) fn build_context(self) -> SequencerConsensusContext {
@@ -261,7 +251,6 @@ pub(crate) fn create_test_and_network_deps() -> (TestDeps, NetworkDependencies)
261251
let state_sync_client = MockStateSyncClient::new();
262252
let batcher = MockBatcherClient::new();
263253
let cende_ambassador = MockCendeContext::new();
264-
let eth_to_strk_oracle_client = MockEthToStrkOracleClientTrait::new();
265254
let l1_gas_price_provider = MockL1GasPriceProviderClient::new();
266255
let clock = Arc::new(DefaultClock);
267256

@@ -270,7 +259,6 @@ pub(crate) fn create_test_and_network_deps() -> (TestDeps, NetworkDependencies)
270259
state_sync_client,
271260
batcher,
272261
cende_ambassador,
273-
eth_to_strk_oracle_client,
274262
l1_gas_price_provider,
275263
clock,
276264
outbound_proposal_sender,

crates/apollo_consensus_orchestrator/src/utils.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
use std::sync::Arc;
22

3-
use apollo_l1_gas_price_types::{
4-
EthToStrkOracleClientTrait,
5-
L1GasPriceProviderClient,
6-
PriceInfo,
7-
DEFAULT_ETH_TO_FRI_RATE,
8-
};
3+
use apollo_l1_gas_price_types::{L1GasPriceProviderClient, PriceInfo, DEFAULT_ETH_TO_FRI_RATE};
94
use apollo_protobuf::consensus::{ConsensusBlockInfo, ProposalPart};
105
use apollo_state_sync_types::communication::{StateSyncClient, StateSyncClientError};
116
// TODO(Gilad): Define in consensus, either pass to blockifier as config or keep the dup.
@@ -77,14 +72,13 @@ impl From<StateSyncError> for ValidateProposalError {
7772
}
7873

7974
pub(crate) async fn get_oracle_rate_and_prices(
80-
eth_to_strk_oracle_client: Arc<dyn EthToStrkOracleClientTrait>,
8175
l1_gas_price_provider_client: Arc<dyn L1GasPriceProviderClient>,
8276
timestamp: u64,
8377
previous_block_info: Option<&ConsensusBlockInfo>,
8478
gas_price_params: &GasPriceParams,
8579
) -> (u128, PriceInfo) {
8680
let (eth_to_strk_rate, price_info) = tokio::join!(
87-
eth_to_strk_oracle_client.eth_to_fri_rate(timestamp),
81+
l1_gas_price_provider_client.get_eth_to_fri_rate(timestamp),
8882
l1_gas_price_provider_client.get_price_info(BlockTimestamp(timestamp))
8983
);
9084
if price_info.is_err() {

crates/apollo_consensus_orchestrator/src/validate_proposal.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use apollo_batcher_types::communication::{BatcherClient, BatcherClientError};
1616
use apollo_class_manager_types::transaction_converter::TransactionConverterTrait;
1717
use apollo_consensus::types::ProposalCommitment;
1818
use apollo_l1_gas_price_types::errors::{EthToStrkOracleClientError, L1GasPriceClientError};
19-
use apollo_l1_gas_price_types::{EthToStrkOracleClientTrait, L1GasPriceProviderClient};
19+
use apollo_l1_gas_price_types::L1GasPriceProviderClient;
2020
use apollo_protobuf::consensus::{ConsensusBlockInfo, ProposalFin, ProposalPart, TransactionBatch};
2121
use apollo_state_sync_types::communication::{StateSyncClient, StateSyncClientError};
2222
use apollo_time::time::{sleep_until, Clock, DateTime};
@@ -147,7 +147,6 @@ pub(crate) async fn validate_proposal(
147147
is_block_info_valid(
148148
args.block_info_validation.clone(),
149149
block_info.clone(),
150-
args.deps.eth_to_strk_oracle_client,
151150
args.deps.clock.as_ref(),
152151
args.deps.l1_gas_price_provider,
153152
&args.gas_price_params,
@@ -232,7 +231,6 @@ pub(crate) async fn validate_proposal(
232231
async fn is_block_info_valid(
233232
block_info_validation: BlockInfoValidation,
234233
block_info_proposed: ConsensusBlockInfo,
235-
eth_to_strk_oracle_client: Arc<dyn EthToStrkOracleClientTrait>,
236234
clock: &dyn Clock,
237235
l1_gas_price_provider: Arc<dyn L1GasPriceProviderClient>,
238236
gas_price_params: &GasPriceParams,
@@ -274,7 +272,6 @@ async fn is_block_info_valid(
274272
));
275273
}
276274
let (eth_to_fri_rate, l1_gas_prices) = get_oracle_rate_and_prices(
277-
eth_to_strk_oracle_client,
278275
l1_gas_price_provider,
279276
block_info_proposed.timestamp,
280277
block_info_validation.previous_block_info.as_ref(),

crates/apollo_l1_gas_price/src/communication.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ impl ComponentRequestHandler<L1GasPriceRequest, L1GasPriceResponse> for L1GasPri
3434
L1GasPriceRequest::AddGasPrice(data) => {
3535
L1GasPriceResponse::AddGasPrice(self.add_price_info(data))
3636
}
37+
L1GasPriceRequest::GetEthToFriRate(timestamp) => {
38+
L1GasPriceResponse::GetEthToFriRate(self.eth_to_fri_rate(timestamp).await)
39+
}
3740
}
3841
}
3942
}

crates/apollo_l1_gas_price/src/l1_gas_price_provider.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
use std::any::type_name;
22
use std::collections::{BTreeMap, VecDeque};
3+
use std::sync::Arc;
34

45
use apollo_config::dumping::{ser_param, SerializeConfig};
56
use apollo_config::{ParamPath, ParamPrivacyInput, SerializedParam};
67
use apollo_infra::component_definitions::ComponentStarter;
78
use apollo_infra_utils::info_every_n_sec;
89
use apollo_l1_gas_price_types::errors::L1GasPriceProviderError;
9-
use apollo_l1_gas_price_types::{GasPriceData, L1GasPriceProviderResult, PriceInfo};
10+
use apollo_l1_gas_price_types::{
11+
EthToStrkOracleClientTrait,
12+
GasPriceData,
13+
L1GasPriceProviderResult,
14+
PriceInfo,
15+
};
1016
use async_trait::async_trait;
1117
use serde::{Deserialize, Serialize};
1218
use starknet_api::block::BlockTimestamp;
@@ -111,11 +117,15 @@ pub struct L1GasPriceProvider {
111117
config: L1GasPriceProviderConfig,
112118
// If received data before initialization (is None), it means the scraper has restarted.
113119
price_samples_by_block: Option<RingBuffer<GasPriceData>>,
120+
eth_to_strk_oracle_client: Arc<dyn EthToStrkOracleClientTrait>,
114121
}
115122

116123
impl L1GasPriceProvider {
117-
pub fn new(config: L1GasPriceProviderConfig) -> Self {
118-
Self { config, price_samples_by_block: None }
124+
pub fn new(
125+
config: L1GasPriceProviderConfig,
126+
eth_to_strk_oracle_client: Arc<dyn EthToStrkOracleClientTrait>,
127+
) -> Self {
128+
Self { config, price_samples_by_block: None, eth_to_strk_oracle_client }
119129
}
120130

121131
pub fn initialize(&mut self) -> L1GasPriceProviderResult<()> {
@@ -226,6 +236,13 @@ impl L1GasPriceProvider {
226236
L1_DATA_GAS_PRICE_LATEST_MEAN_VALUE.set_lossy(price_info_out.blob_fee.0);
227237
Ok(price_info_out)
228238
}
239+
240+
pub async fn eth_to_fri_rate(&self, timestamp: u64) -> L1GasPriceProviderResult<u128> {
241+
self.eth_to_strk_oracle_client
242+
.eth_to_fri_rate(timestamp)
243+
.await
244+
.map_err(|e| L1GasPriceProviderError::EthToStrkOracleClientError(e))
245+
}
229246
}
230247

231248
#[async_trait]

crates/apollo_l1_gas_price/src/l1_gas_price_provider_test.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use apollo_l1_gas_price_types::{GasPriceData, PriceInfo};
1+
use std::sync::Arc;
2+
3+
use apollo_l1_gas_price_types::{GasPriceData, MockEthToStrkOracleClientTrait, PriceInfo};
24
use starknet_api::block::{BlockTimestamp, GasPrice};
35

46
use crate::l1_gas_price_provider::{
@@ -11,10 +13,11 @@ use crate::l1_gas_price_provider::{
1113
// To get the prices for the middle three blocks use the timestamp for block[3].
1214
// Returns the provider, a vector of block prices to compare with, and the timestamp of block[3].
1315
fn make_provider() -> (L1GasPriceProvider, Vec<PriceInfo>, u64) {
14-
let mut provider = L1GasPriceProvider::new(L1GasPriceProviderConfig {
15-
number_of_blocks_for_mean: 3,
16-
..Default::default()
17-
});
16+
let eth_to_strk_oracle_client = Arc::new(MockEthToStrkOracleClientTrait::new());
17+
let mut provider = L1GasPriceProvider::new(
18+
L1GasPriceProviderConfig { number_of_blocks_for_mean: 3, ..Default::default() },
19+
eth_to_strk_oracle_client,
20+
);
1821
provider.initialize().unwrap();
1922
let mut prices = Vec::new();
2023
let mut timestamp3 = 0;
@@ -116,10 +119,11 @@ fn gas_price_provider_timestamp_changes_mean() {
116119

117120
#[test]
118121
fn gas_price_provider_can_start_at_nonzero_height() {
119-
let mut provider = L1GasPriceProvider::new(L1GasPriceProviderConfig {
120-
number_of_blocks_for_mean: 3,
121-
..Default::default()
122-
});
122+
let eth_to_strk_oracle_client = Arc::new(MockEthToStrkOracleClientTrait::new());
123+
let mut provider = L1GasPriceProvider::new(
124+
L1GasPriceProviderConfig { number_of_blocks_for_mean: 3, ..Default::default() },
125+
eth_to_strk_oracle_client,
126+
);
123127
provider.initialize().unwrap();
124128
let price_info = PriceInfo { base_fee_per_gas: GasPrice(0), blob_fee: GasPrice(0) };
125129
let timestamp = BlockTimestamp(0);
@@ -128,10 +132,11 @@ fn gas_price_provider_can_start_at_nonzero_height() {
128132

129133
#[test]
130134
fn gas_price_provider_uninitialized_error() {
131-
let mut provider = L1GasPriceProvider::new(L1GasPriceProviderConfig {
132-
number_of_blocks_for_mean: 3,
133-
..Default::default()
134-
});
135+
let eth_to_strk_oracle_client = Arc::new(MockEthToStrkOracleClientTrait::new());
136+
let mut provider = L1GasPriceProvider::new(
137+
L1GasPriceProviderConfig { number_of_blocks_for_mean: 3, ..Default::default() },
138+
eth_to_strk_oracle_client,
139+
);
135140
let price_info = PriceInfo { base_fee_per_gas: GasPrice(0), blob_fee: GasPrice(0) };
136141
let timestamp = BlockTimestamp(0);
137142
let result = provider.add_price_info(GasPriceData { block_number: 42, timestamp, price_info });

0 commit comments

Comments
 (0)