Skip to content

Commit df618e0

Browse files
authored
feat(gpo): starknet gas price oracle (#152)
1 parent df5a957 commit df618e0

File tree

34 files changed

+940
-539
lines changed

34 files changed

+940
-539
lines changed

Cargo.lock

Lines changed: 26 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ members = [
1616
"crates/metrics",
1717
"crates/node",
1818
"crates/node-bindings",
19+
"crates/oracle/gas",
1920
"crates/pool",
2021
"crates/primitives",
2122
"crates/rpc/rpc",
@@ -72,6 +73,7 @@ katana-executor = { path = "crates/executor" }
7273
katana-explorer = { path = "crates/explorer" }
7374
katana-feeder-gateway = { path = "crates/feeder-gateway" }
7475
katana-fork = { path = "crates/storage/fork" }
76+
katana-gas-oracle = { path = "crates/oracle/gas" }
7577
katana-log = { path = "crates/log" }
7678
katana-messaging = { path = "crates/messaging" }
7779
katana-metrics = { path = "crates/metrics" }
@@ -91,7 +93,9 @@ katana-stage = { path = "crates/sync/stage" }
9193
katana-tasks = { path = "crates/tasks" }
9294
katana-trie = { path = "crates/trie" }
9395
katana-utils = { path = "crates/utils" }
96+
9497
# cairo
98+
backon = { version = "1.5", features = [ "tokio-sleep" ] }
9599
cairo-lang-casm = "2.11.2"
96100
cairo-lang-runner = "2.11.2"
97101
cairo-lang-sierra = "2.11.2"
@@ -212,6 +216,7 @@ alloy-provider = { version = "0.4", default-features = false }
212216
alloy-rpc-types-eth = { version = "0.4", default-features = false }
213217
alloy-signer = { version = "0.4", default-features = false }
214218
alloy-transport = { version = "0.4", default-features = false }
219+
alloy-transport-http = { version = "0.4", default-features = false }
215220

216221
bitvec = "1.0.1"
217222
starknet = "0.15.1"

crates/chain-spec/src/dev.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::collections::BTreeMap;
22

33
use alloy_primitives::U256;
4-
use katana_primitives::block::{Block, GasPrice, Header};
4+
use katana_primitives::block::{Block, GasPrices, Header};
55
use katana_primitives::chain::ChainId;
66
use katana_primitives::class::ClassHash;
77
use katana_primitives::contract::ContractAddress;
@@ -61,7 +61,7 @@ impl ChainSpec {
6161
parent_hash: self.genesis.parent_hash,
6262
l1_da_mode: L1DataAvailabilityMode::Calldata,
6363
l1_gas_prices: self.genesis.gas_prices.clone(),
64-
l2_gas_prices: GasPrice::MIN,
64+
l2_gas_prices: GasPrices::MIN,
6565
l1_data_gas_prices: self.genesis.gas_prices.clone(),
6666
sequencer_address: self.genesis.sequencer_address,
6767
};
@@ -264,7 +264,7 @@ mod tests {
264264

265265
use alloy_primitives::U256;
266266
use katana_primitives::address;
267-
use katana_primitives::block::{Block, GasPrice, Header};
267+
use katana_primitives::block::{Block, GasPrices, Header};
268268
use katana_primitives::da::L1DataAvailabilityMode;
269269
use katana_primitives::genesis::allocation::{
270270
GenesisAccount, GenesisAccountAlloc, GenesisContractAlloc,
@@ -341,7 +341,7 @@ mod tests {
341341
state_root: felt!("0x99"),
342342
parent_hash: felt!("0x999"),
343343
sequencer_address: address!("0x100"),
344-
gas_prices: unsafe { GasPrice::new_unchecked(1111, 2222) },
344+
gas_prices: unsafe { GasPrices::new_unchecked(1111, 2222) },
345345
},
346346
fee_contracts: FeeContracts {
347347
eth: DEFAULT_ETH_FEE_TOKEN_ADDRESS,
@@ -363,7 +363,7 @@ mod tests {
363363
state_root: chain_spec.genesis.state_root,
364364
parent_hash: chain_spec.genesis.parent_hash,
365365
sequencer_address: chain_spec.genesis.sequencer_address,
366-
l2_gas_prices: GasPrice::MIN,
366+
l2_gas_prices: GasPrices::MIN,
367367
l1_gas_prices: chain_spec.genesis.gas_prices.clone(),
368368
l1_data_gas_prices: chain_spec.genesis.gas_prices.clone(),
369369
l1_da_mode: L1DataAvailabilityMode::Calldata,

crates/chain-spec/src/rollup/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use katana_primitives::block::{ExecutableBlock, GasPrice, PartialHeader};
1+
use katana_primitives::block::{ExecutableBlock, GasPrices, PartialHeader};
22
use katana_primitives::chain::ChainId;
33
use katana_primitives::contract::ContractAddress;
44
use katana_primitives::da::L1DataAvailabilityMode;
@@ -43,7 +43,7 @@ impl ChainSpec {
4343
timestamp: self.genesis.timestamp,
4444
parent_hash: self.genesis.parent_hash,
4545
l1_da_mode: L1DataAvailabilityMode::Calldata,
46-
l2_gas_prices: GasPrice::MIN,
46+
l2_gas_prices: GasPrices::MIN,
4747
l1_gas_prices: self.genesis.gas_prices.clone(),
4848
l1_data_gas_prices: self.genesis.gas_prices.clone(),
4949
sequencer_address: self.genesis.sequencer_address,

crates/cli/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ url.workspace = true
3030

3131
[dev-dependencies]
3232
assert_matches.workspace = true
33+
katana-gas-oracle.workspace = true
3334
starknet.workspace = true
3435

3536
[features]

crates/cli/src/args.rs

Lines changed: 53 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -311,24 +311,34 @@ impl NodeArgs {
311311
fn dev_config(&self) -> DevConfig {
312312
let mut fixed_gas_prices = None;
313313

314-
if let Some(eth_gas_price) = self.gpo.l1_eth_gas_price {
314+
if let Some(eth) = self.gpo.l2_eth_gas_price {
315315
let prices = fixed_gas_prices.get_or_insert(FixedL1GasPriceConfig::default());
316-
prices.gas_price.eth = eth_gas_price;
316+
prices.l2_gas_prices.eth = eth;
317317
}
318318

319-
if let Some(strk_gas_price) = self.gpo.l1_strk_gas_price {
319+
if let Some(strk) = self.gpo.l2_strk_gas_price {
320320
let prices = fixed_gas_prices.get_or_insert(FixedL1GasPriceConfig::default());
321-
prices.gas_price.strk = strk_gas_price;
321+
prices.l2_gas_prices.strk = strk;
322322
}
323323

324-
if let Some(eth_data_gas_price) = self.gpo.l1_eth_data_gas_price {
324+
if let Some(eth) = self.gpo.l1_eth_gas_price {
325325
let prices = fixed_gas_prices.get_or_insert(FixedL1GasPriceConfig::default());
326-
prices.data_gas_price.eth = eth_data_gas_price;
326+
prices.l1_gas_prices.eth = eth;
327327
}
328328

329-
if let Some(strk_data_gas_price) = self.gpo.l1_strk_data_gas_price {
329+
if let Some(strk) = self.gpo.l1_strk_gas_price {
330330
let prices = fixed_gas_prices.get_or_insert(FixedL1GasPriceConfig::default());
331-
prices.data_gas_price.strk = strk_data_gas_price;
331+
prices.l1_gas_prices.strk = strk;
332+
}
333+
334+
if let Some(eth) = self.gpo.l1_eth_data_gas_price {
335+
let prices = fixed_gas_prices.get_or_insert(FixedL1GasPriceConfig::default());
336+
prices.l1_data_gas_prices.eth = eth;
337+
}
338+
339+
if let Some(strk) = self.gpo.l1_strk_data_gas_price {
340+
let prices = fixed_gas_prices.get_or_insert(FixedL1GasPriceConfig::default());
341+
prices.l1_data_gas_prices.strk = strk;
332342
}
333343

334344
DevConfig {
@@ -461,9 +471,9 @@ mod test {
461471
use std::str::FromStr;
462472

463473
use assert_matches::assert_matches;
464-
use katana_core::constants::{
465-
DEFAULT_ETH_L1_DATA_GAS_PRICE, DEFAULT_ETH_L1_GAS_PRICE, DEFAULT_STRK_L1_DATA_GAS_PRICE,
466-
DEFAULT_STRK_L1_GAS_PRICE,
474+
use katana_gas_oracle::{
475+
DEFAULT_ETH_L1_DATA_GAS_PRICE, DEFAULT_ETH_L1_GAS_PRICE, DEFAULT_ETH_L2_GAS_PRICE,
476+
DEFAULT_STRK_L1_DATA_GAS_PRICE, DEFAULT_STRK_L1_GAS_PRICE,
467477
};
468478
use katana_node::config::execution::{
469479
DEFAULT_INVOCATION_MAX_STEPS, DEFAULT_VALIDATION_MAX_STEPS,
@@ -524,37 +534,37 @@ mod test {
524534
let config =
525535
NodeArgs::parse_from(["katana", "--gpo.l1-eth-gas-price", "10"]).config().unwrap();
526536
assert_matches!(config.dev.fixed_gas_prices, Some(prices) => {
527-
assert_eq!(prices.gas_price.eth.get(), 10);
528-
assert_eq!(prices.gas_price.strk, DEFAULT_STRK_L1_GAS_PRICE);
529-
assert_eq!(prices.data_gas_price.eth, DEFAULT_ETH_L1_DATA_GAS_PRICE);
530-
assert_eq!(prices.data_gas_price.strk, DEFAULT_STRK_L1_DATA_GAS_PRICE);
537+
assert_eq!(prices.l1_gas_prices.eth.get(), 10);
538+
assert_eq!(prices.l1_gas_prices.strk, DEFAULT_ETH_L2_GAS_PRICE);
539+
assert_eq!(prices.l1_data_gas_prices.eth, DEFAULT_ETH_L1_DATA_GAS_PRICE);
540+
assert_eq!(prices.l1_data_gas_prices.strk, DEFAULT_STRK_L1_DATA_GAS_PRICE);
531541
});
532542

533543
let config =
534544
NodeArgs::parse_from(["katana", "--gpo.l1-strk-gas-price", "20"]).config().unwrap();
535545
assert_matches!(config.dev.fixed_gas_prices, Some(prices) => {
536-
assert_eq!(prices.gas_price.eth, DEFAULT_ETH_L1_GAS_PRICE);
537-
assert_eq!(prices.gas_price.strk.get(), 20);
538-
assert_eq!(prices.data_gas_price.eth, DEFAULT_ETH_L1_DATA_GAS_PRICE);
539-
assert_eq!(prices.data_gas_price.strk, DEFAULT_STRK_L1_DATA_GAS_PRICE);
546+
assert_eq!(prices.l1_gas_prices.eth, DEFAULT_ETH_L1_GAS_PRICE);
547+
assert_eq!(prices.l1_gas_prices.strk.get(), 20);
548+
assert_eq!(prices.l1_data_gas_prices.eth, DEFAULT_ETH_L1_DATA_GAS_PRICE);
549+
assert_eq!(prices.l1_data_gas_prices.strk, DEFAULT_STRK_L1_DATA_GAS_PRICE);
540550
});
541551

542552
let config =
543553
NodeArgs::parse_from(["katana", "--gpo.l1-eth-data-gas-price", "2"]).config().unwrap();
544554
assert_matches!(config.dev.fixed_gas_prices, Some(prices) => {
545-
assert_eq!(prices.gas_price.eth, DEFAULT_ETH_L1_GAS_PRICE);
546-
assert_eq!(prices.gas_price.strk, DEFAULT_STRK_L1_GAS_PRICE);
547-
assert_eq!(prices.data_gas_price.eth.get(), 2);
548-
assert_eq!(prices.data_gas_price.strk, DEFAULT_STRK_L1_DATA_GAS_PRICE);
555+
assert_eq!(prices.l1_gas_prices.eth, DEFAULT_ETH_L1_GAS_PRICE);
556+
assert_eq!(prices.l1_gas_prices.strk, DEFAULT_STRK_L1_GAS_PRICE);
557+
assert_eq!(prices.l1_data_gas_prices.eth.get(), 2);
558+
assert_eq!(prices.l1_data_gas_prices.strk, DEFAULT_STRK_L1_DATA_GAS_PRICE);
549559
});
550560

551561
let config =
552562
NodeArgs::parse_from(["katana", "--gpo.l1-strk-data-gas-price", "2"]).config().unwrap();
553563
assert_matches!(config.dev.fixed_gas_prices, Some(prices) => {
554-
assert_eq!(prices.gas_price.eth, DEFAULT_ETH_L1_GAS_PRICE);
555-
assert_eq!(prices.gas_price.strk, DEFAULT_STRK_L1_GAS_PRICE);
556-
assert_eq!(prices.data_gas_price.eth, DEFAULT_ETH_L1_DATA_GAS_PRICE);
557-
assert_eq!(prices.data_gas_price.strk.get(), 2);
564+
assert_eq!(prices.l1_gas_prices.eth, DEFAULT_ETH_L1_GAS_PRICE);
565+
assert_eq!(prices.l1_gas_prices.strk, DEFAULT_STRK_L1_GAS_PRICE);
566+
assert_eq!(prices.l1_data_gas_prices.eth, DEFAULT_ETH_L1_DATA_GAS_PRICE);
567+
assert_eq!(prices.l1_data_gas_prices.strk.get(), 2);
558568
});
559569

560570
let config = NodeArgs::parse_from([
@@ -568,10 +578,10 @@ mod test {
568578
.unwrap();
569579

570580
assert_matches!(config.dev.fixed_gas_prices, Some(prices) => {
571-
assert_eq!(prices.gas_price.eth.get(), 10);
572-
assert_eq!(prices.gas_price.strk, DEFAULT_STRK_L1_GAS_PRICE);
573-
assert_eq!(prices.data_gas_price.eth, DEFAULT_ETH_L1_DATA_GAS_PRICE);
574-
assert_eq!(prices.data_gas_price.strk.get(), 2);
581+
assert_eq!(prices.l1_gas_prices.eth.get(), 10);
582+
assert_eq!(prices.l1_gas_prices.strk, DEFAULT_STRK_L1_GAS_PRICE);
583+
assert_eq!(prices.l1_data_gas_prices.eth, DEFAULT_ETH_L1_DATA_GAS_PRICE);
584+
assert_eq!(prices.l1_data_gas_prices.strk.get(), 2);
575585
});
576586

577587
// Set all the gas prices options
@@ -591,10 +601,10 @@ mod test {
591601
.unwrap();
592602

593603
assert_matches!(config.dev.fixed_gas_prices, Some(prices) => {
594-
assert_eq!(prices.gas_price.eth.get(), 10);
595-
assert_eq!(prices.gas_price.strk.get(), 20);
596-
assert_eq!(prices.data_gas_price.eth.get(), 1);
597-
assert_eq!(prices.data_gas_price.strk.get(), 2);
604+
assert_eq!(prices.l1_gas_prices.eth.get(), 10);
605+
assert_eq!(prices.l1_gas_prices.strk.get(), 20);
606+
assert_eq!(prices.l1_data_gas_prices.eth.get(), 1);
607+
assert_eq!(prices.l1_data_gas_prices.strk.get(), 2);
598608
})
599609
}
600610

@@ -624,10 +634,10 @@ mod test {
624634
assert_eq!(config.chain.genesis().gas_prices.eth.get(), 9999);
625635
assert_eq!(config.chain.genesis().gas_prices.strk.get(), 8888);
626636
assert_matches!(config.dev.fixed_gas_prices, Some(prices) => {
627-
assert_eq!(prices.gas_price.eth.get(), 100);
628-
assert_eq!(prices.gas_price.strk.get(), 200);
629-
assert_eq!(prices.data_gas_price.eth.get(), 111);
630-
assert_eq!(prices.data_gas_price.strk.get(), 222);
637+
assert_eq!(prices.l1_gas_prices.eth.get(), 100);
638+
assert_eq!(prices.l1_gas_prices.strk.get(), 200);
639+
assert_eq!(prices.l1_data_gas_prices.eth.get(), 111);
640+
assert_eq!(prices.l1_data_gas_prices.strk.get(), 222);
631641
})
632642
}
633643

@@ -675,10 +685,10 @@ chain_id.Named = "Mainnet"
675685
assert_eq!(config.execution.invocation_max_steps, 9988);
676686
assert!(!config.dev.fee);
677687
assert_matches!(config.dev.fixed_gas_prices, Some(prices) => {
678-
assert_eq!(prices.gas_price.eth.get(), 254);
679-
assert_eq!(prices.gas_price.strk.get(), 200);
680-
assert_eq!(prices.data_gas_price.eth.get(), 111);
681-
assert_eq!(prices.data_gas_price.strk.get(), 222);
688+
assert_eq!(prices.l1_gas_prices.eth.get(), 254);
689+
assert_eq!(prices.l1_gas_prices.strk.get(), 200);
690+
assert_eq!(prices.l1_data_gas_prices.eth.get(), 111);
691+
assert_eq!(prices.l1_data_gas_prices.strk.get(), 222);
682692
});
683693
assert_eq!(config.chain.genesis().number, 0);
684694
assert_eq!(config.chain.genesis().parent_hash, felt!("0x999"));

0 commit comments

Comments
 (0)