diff --git a/crates/astria-core/src/lib.rs b/crates/astria-core/src/lib.rs index 81733f10aa..da0a2151ae 100644 --- a/crates/astria-core/src/lib.rs +++ b/crates/astria-core/src/lib.rs @@ -11,6 +11,7 @@ pub mod crypto; pub mod execution; pub mod primitive; pub mod protocol; +pub mod sequencer; pub mod sequencerblock; #[cfg(feature = "brotli")] diff --git a/crates/astria-sequencer/src/genesis.rs b/crates/astria-core/src/sequencer.rs similarity index 65% rename from crates/astria-sequencer/src/genesis.rs rename to crates/astria-core/src/sequencer.rs index e484fc0781..940b67c99c 100644 --- a/crates/astria-sequencer/src/genesis.rs +++ b/crates/astria-core/src/sequencer.rs @@ -1,39 +1,90 @@ -use astria_core::primitive::v1::{ +//! Sequencer specific types that are needed outside of it. +pub use penumbra_ibc::params::IBCParameters; + +use crate::primitive::v1::{ asset, Address, }; -use penumbra_ibc::params::IBCParameters; -use serde::{ - Deserialize, - Serialize, -}; -/// The genesis state for the application. +/// The genesis state of Astria's Sequencer. /// /// Verified to only contain valid fields (right now, addresses that have the same base prefix /// as set in `GenesisState::address_prefixes::base`). /// -/// **NOTE:** The fields should not be publicly accessible to guarantee invariants. However, -/// it's easy to just go along with this for now. -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(try_from = "UncheckedGenesisState", into = "UncheckedGenesisState")] -pub(crate) struct GenesisState { - pub(crate) address_prefixes: AddressPrefixes, - pub(crate) accounts: Vec, - pub(crate) authority_sudo_address: Address, - pub(crate) ibc_sudo_address: Address, - pub(crate) ibc_relayer_addresses: Vec
, - pub(crate) native_asset_base_denomination: String, - pub(crate) ibc_params: IBCParameters, - pub(crate) allowed_fee_assets: Vec, - pub(crate) fees: Fees, +/// *Note on the implementation:* access to all fields is through getters to uphold invariants, +/// but most returned values themselves have publicly exposed fields. This is to make it easier +/// to construct an [`UncheckedGenesisState`]. +#[derive(Clone, Debug)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] +#[cfg_attr( + feature = "serde", + serde(try_from = "UncheckedGenesisState", into = "UncheckedGenesisState") +)] +pub struct GenesisState { + address_prefixes: AddressPrefixes, + accounts: Vec, + authority_sudo_address: Address, + ibc_sudo_address: Address, + ibc_relayer_addresses: Vec
, + native_asset_base_denomination: String, + ibc_params: IBCParameters, + allowed_fee_assets: Vec, + fees: Fees, +} + +impl GenesisState { + #[must_use] + pub fn address_prefixes(&self) -> &AddressPrefixes { + &self.address_prefixes + } + + #[must_use] + pub fn accounts(&self) -> &[Account] { + &self.accounts + } + + #[must_use] + pub fn authority_sudo_address(&self) -> &Address { + &self.authority_sudo_address + } + + #[must_use] + pub fn ibc_sudo_address(&self) -> &Address { + &self.ibc_sudo_address + } + + #[must_use] + pub fn ibc_relayer_addresses(&self) -> &[Address] { + &self.ibc_relayer_addresses + } + + #[must_use] + pub fn native_asset_base_denomination(&self) -> &str { + &self.native_asset_base_denomination + } + + #[must_use] + pub fn ibc_params(&self) -> &IBCParameters { + &self.ibc_params + } + + #[must_use] + pub fn allowed_fee_assets(&self) -> &[asset::Denom] { + &self.allowed_fee_assets + } + + #[must_use] + pub fn fees(&self) -> &Fees { + &self.fees + } } #[derive(Debug, thiserror::Error)] -// allow: this error is only seen at chain init and never after so perf impact of too large enum -// variants is negligible -#[allow(clippy::result_large_err)] -pub(crate) enum VerifyGenesisError { +#[error(transparent)] +pub struct VerifyGenesisError(Box); + +#[derive(Debug, thiserror::Error)] +enum VerifyGenesisErrorKind { #[error("address `{address}` at `{field}` does not have `{base_prefix}`")] AddressDoesNotMatchBase { base_prefix: String, @@ -42,6 +93,12 @@ pub(crate) enum VerifyGenesisError { }, } +impl From for VerifyGenesisError { + fn from(value: VerifyGenesisErrorKind) -> Self { + Self(Box::new(value)) + } +} + impl TryFrom for GenesisState { type Error = VerifyGenesisError; @@ -75,39 +132,37 @@ impl TryFrom for GenesisState { } /// The unchecked genesis state for the application. -#[derive(Debug, Deserialize, Serialize)] -pub(crate) struct UncheckedGenesisState { - pub(crate) address_prefixes: AddressPrefixes, - pub(crate) accounts: Vec, - pub(crate) authority_sudo_address: Address, - pub(crate) ibc_sudo_address: Address, - pub(crate) ibc_relayer_addresses: Vec
, - pub(crate) native_asset_base_denomination: String, - pub(crate) ibc_params: IBCParameters, - pub(crate) allowed_fee_assets: Vec, - pub(crate) fees: Fees, +#[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] +pub struct UncheckedGenesisState { + pub address_prefixes: AddressPrefixes, + pub accounts: Vec, + pub authority_sudo_address: Address, + pub ibc_sudo_address: Address, + pub ibc_relayer_addresses: Vec
, + pub native_asset_base_denomination: String, + pub ibc_params: IBCParameters, + pub allowed_fee_assets: Vec, + pub fees: Fees, } impl UncheckedGenesisState { - // allow: as for the enum definition itself: this only happens at init-chain and is negligible - #[allow(clippy::result_large_err)] fn ensure_address_has_base_prefix( &self, address: &Address, field: &str, ) -> Result<(), VerifyGenesisError> { if self.address_prefixes.base != address.prefix() { - return Err(VerifyGenesisError::AddressDoesNotMatchBase { + return Err(VerifyGenesisErrorKind::AddressDoesNotMatchBase { base_prefix: self.address_prefixes.base.clone(), address: *address, field: field.to_string(), - }); + } + .into()); } Ok(()) } - // allow: as for the enum definition itself: this only happens at init-chain and is negligible - #[allow(clippy::result_large_err)] fn ensure_all_addresses_have_base_prefix(&self) -> Result<(), VerifyGenesisError> { for (i, account) in self.accounts.iter().enumerate() { self.ensure_address_has_base_prefix( @@ -154,33 +209,35 @@ impl From for UncheckedGenesisState { } } -#[derive(Clone, Debug, Deserialize, Serialize)] -pub(crate) struct Fees { - pub(crate) transfer_base_fee: u128, - pub(crate) sequence_base_fee: u128, - pub(crate) sequence_byte_cost_multiplier: u128, - pub(crate) init_bridge_account_base_fee: u128, - pub(crate) bridge_lock_byte_cost_multiplier: u128, - pub(crate) bridge_sudo_change_fee: u128, - pub(crate) ics20_withdrawal_base_fee: u128, +#[derive(Clone, Debug)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] +pub struct Fees { + pub transfer_base_fee: u128, + pub sequence_base_fee: u128, + pub sequence_byte_cost_multiplier: u128, + pub init_bridge_account_base_fee: u128, + pub bridge_lock_byte_cost_multiplier: u128, + pub bridge_sudo_change_fee: u128, + pub ics20_withdrawal_base_fee: u128, } -#[derive(Clone, Debug, Deserialize, Serialize)] -pub(crate) struct Account { - pub(crate) address: Address, - pub(crate) balance: u128, +#[derive(Clone, Debug)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] +pub struct Account { + pub address: Address, + pub balance: u128, } -#[derive(Clone, Debug, Deserialize, Serialize)] -pub(crate) struct AddressPrefixes { - pub(crate) base: String, +#[derive(Clone, Debug)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] +pub struct AddressPrefixes { + pub base: String, } #[cfg(test)] -mod test { - use astria_core::primitive::v1::Address; - +mod tests { use super::*; + use crate::primitive::v1::Address; const ASTRIA_ADDRESS_PREFIX: &str = "astria"; @@ -265,11 +322,14 @@ mod test { fn mismatched_addresses_are_caught() { #[track_caller] fn assert_bad_prefix(unchecked: UncheckedGenesisState, bad_field: &'static str) { - match GenesisState::try_from(unchecked).expect_err( - "converting to genesis state should have produced an error, but a valid state was \ - returned", - ) { - VerifyGenesisError::AddressDoesNotMatchBase { + match *GenesisState::try_from(unchecked) + .expect_err( + "converting to genesis state should have produced an error, but a valid state \ + was returned", + ) + .0 + { + VerifyGenesisErrorKind::AddressDoesNotMatchBase { base_prefix, address, field, @@ -319,6 +379,7 @@ mod test { ); } + #[cfg(feature = "serde")] #[test] fn genesis_state_is_unchanged() { insta::assert_json_snapshot!(genesis_state()); diff --git a/crates/astria-sequencer/src/snapshots/astria_sequencer__genesis__test__genesis_state_is_unchanged.snap b/crates/astria-core/src/snapshots/astria_core__sequencer__tests__genesis_state_is_unchanged.snap similarity index 96% rename from crates/astria-sequencer/src/snapshots/astria_sequencer__genesis__test__genesis_state_is_unchanged.snap rename to crates/astria-core/src/snapshots/astria_core__sequencer__tests__genesis_state_is_unchanged.snap index 17211f5bed..fde7a2b1e4 100644 --- a/crates/astria-sequencer/src/snapshots/astria_sequencer__genesis__test__genesis_state_is_unchanged.snap +++ b/crates/astria-core/src/snapshots/astria_core__sequencer__tests__genesis_state_is_unchanged.snap @@ -1,5 +1,5 @@ --- -source: crates/astria-sequencer/src/genesis.rs +source: crates/astria-core/src/sequencer.rs expression: genesis_state() --- { diff --git a/crates/astria-sequencer-utils/Cargo.toml b/crates/astria-sequencer-utils/Cargo.toml index da842683ec..1317e08d62 100644 --- a/crates/astria-sequencer-utils/Cargo.toml +++ b/crates/astria-sequencer-utils/Cargo.toml @@ -26,7 +26,7 @@ rlp = "0.5.2" serde = { workspace = true } serde_json = { workspace = true } -astria-core = { path = "../astria-core", features = ["brotli"] } +astria-core = { path = "../astria-core", features = ["brotli", "serde"] } astria-eyre = { path = "../astria-eyre" } astria-merkle = { path = "../astria-merkle" } diff --git a/crates/astria-sequencer-utils/README.md b/crates/astria-sequencer-utils/README.md index cfa55fc6a9..28de855e6e 100644 --- a/crates/astria-sequencer-utils/README.md +++ b/crates/astria-sequencer-utils/README.md @@ -6,7 +6,29 @@ ## General -There are two functions provided by the tool, as described below. +There are three functions provided by the tool, further described below: + +1. `generate-genesis-state` +1. `copy-genesis-state` +1. `parse-blob` + +### `generate-genesis-state`: create an example sequencer genesis state + +This subcommand creates an example genesis state file that can be +fed into the `copy-genesis-state` command. It should be editted to +have the desired options. + +#### Usage for `generate-genesis-state` + +1. no arguments: it will write the example genesis to stdout. +1. `--output `: write the example genesis to ``. +1. `-f`: override `` in the previous argument if another file was present. + +#### Example for `generate-genesis-state` + +```sh +cargo run -- generate-genesis-state -o genesis-state.json +``` ### `copy-genesis-state`: JSON-encode Genesis State to a File @@ -27,8 +49,10 @@ the path to the output file In `crates/astria-sequencer-utils`: ```sh +# genesis-state.json would be a file created by the generate-genesis-state +# subcommand and then manually edited cargo run -- copy-genesis-state \ - --genesis-app-state-file=../astria-sequencer/test-genesis-app-state.json \ + --genesis-app-state-file=genesis-state.json \ --output=$HOME/.cometbft/config/genesis.json \ --chain-id=astria ``` diff --git a/crates/astria-sequencer-utils/src/cli.rs b/crates/astria-sequencer-utils/src/cli.rs index acc11b0c2d..3733d1dd68 100644 --- a/crates/astria-sequencer-utils/src/cli.rs +++ b/crates/astria-sequencer-utils/src/cli.rs @@ -5,6 +5,7 @@ use clap::{ use super::{ blob_parser, + genesis_example, genesis_parser, }; @@ -22,6 +23,9 @@ pub enum Command { #[command(arg_required_else_help = true)] CopyGenesisState(genesis_parser::Args), + /// Generate an example sequencer genesis state + GenerateGenesisState(genesis_example::Args), + /// Parse blob data from an arg, a file, or stdin #[command(arg_required_else_help = true)] ParseBlob(blob_parser::Args), diff --git a/crates/astria-sequencer-utils/src/genesis_example.rs b/crates/astria-sequencer-utils/src/genesis_example.rs new file mode 100644 index 0000000000..f089dd7464 --- /dev/null +++ b/crates/astria-sequencer-utils/src/genesis_example.rs @@ -0,0 +1,134 @@ +use std::{ + fs::File, + io::Write, + path::PathBuf, +}; + +use astria_core::{ + primitive::v1::Address, + sequencer::{ + Account, + AddressPrefixes, + Fees, + GenesisState, + IBCParameters, + UncheckedGenesisState, + }, +}; +use astria_eyre::eyre::{ + Result, + WrapErr as _, +}; + +const ASTRIA_ADDRESS_PREFIX: &str = "astria"; + +fn alice() -> Address { + Address::builder() + .prefix(ASTRIA_ADDRESS_PREFIX) + .slice(hex::decode("1c0c490f1b5528d8173c5de46d131160e4b2c0c3").unwrap()) + .try_build() + .unwrap() +} + +fn bob() -> Address { + Address::builder() + .prefix(ASTRIA_ADDRESS_PREFIX) + .slice(hex::decode("34fec43c7fcab9aef3b3cf8aba855e41ee69ca3a").unwrap()) + .try_build() + .unwrap() +} + +fn charlie() -> Address { + Address::builder() + .prefix(ASTRIA_ADDRESS_PREFIX) + .slice(hex::decode("60709e2d391864b732b4f0f51e387abb76743871").unwrap()) + .try_build() + .unwrap() +} + +fn genesis_state() -> GenesisState { + UncheckedGenesisState { + accounts: vec![ + Account { + address: alice(), + balance: 1_000_000_000_000_000_000, + }, + Account { + address: bob(), + balance: 1_000_000_000_000_000_000, + }, + Account { + address: charlie(), + balance: 1_000_000_000_000_000_000, + }, + ], + address_prefixes: AddressPrefixes { + base: "astria".into(), + }, + authority_sudo_address: alice(), + ibc_sudo_address: alice(), + ibc_relayer_addresses: vec![alice(), bob()], + native_asset_base_denomination: "nria".to_string(), + ibc_params: IBCParameters { + ibc_enabled: true, + inbound_ics20_transfers_enabled: true, + outbound_ics20_transfers_enabled: true, + }, + allowed_fee_assets: vec!["nria".parse().unwrap()], + fees: Fees { + transfer_base_fee: 12, + sequence_base_fee: 32, + sequence_byte_cost_multiplier: 1, + init_bridge_account_base_fee: 48, + bridge_lock_byte_cost_multiplier: 1, + bridge_sudo_change_fee: 24, + ics20_withdrawal_base_fee: 24, + }, + } + .try_into() + .unwrap() +} + +#[derive(clap::Args, Debug)] +pub struct Args { + /// Where to write the example genesis json (writes to stdout if unspecified). + #[arg(long, short, value_name = "PATH")] + output: Option, + #[arg(long, short)] + force: bool, +} + +impl Args { + fn get_output(&self) -> Result> { + match &self.output { + Some(p) => { + let mut opt = File::options(); + if self.force { + opt.write(true).truncate(true); + } else { + opt.write(true).create_new(true); + }; + opt.open(p) + .map(|f| Box::new(f) as Box) + .wrap_err("failed opening provided file for writing") + } + None => Ok(Box::new(std::io::stdout()) as Box), + } + } +} + +/// Writes an example genesis state to a file or stdout. +/// +/// # Errors +/// Returns errors if: +/// 1. the output could not be opened. +/// 2. the output could not be written to. +pub fn run(args: &Args) -> Result<()> { + let genesis_state = genesis_state(); + let writer = args + .get_output() + .wrap_err("failed opening output for writing")?; + serde_json::to_writer_pretty(writer, &genesis_state) + .context("failed to write genesis state")?; + Ok(()) +} diff --git a/crates/astria-sequencer-utils/src/lib.rs b/crates/astria-sequencer-utils/src/lib.rs index 40b780d809..27ec4d45e3 100644 --- a/crates/astria-sequencer-utils/src/lib.rs +++ b/crates/astria-sequencer-utils/src/lib.rs @@ -1,3 +1,4 @@ pub mod blob_parser; pub mod cli; +pub mod genesis_example; pub mod genesis_parser; diff --git a/crates/astria-sequencer-utils/src/main.rs b/crates/astria-sequencer-utils/src/main.rs index 6bede2c3cc..7513825bbd 100644 --- a/crates/astria-sequencer-utils/src/main.rs +++ b/crates/astria-sequencer-utils/src/main.rs @@ -5,6 +5,7 @@ use astria_sequencer_utils::{ self, Command, }, + genesis_example, genesis_parser, }; @@ -13,6 +14,7 @@ fn main() -> Result<()> { .expect("the astria eyre install hook must be called before eyre reports are constructed"); match cli::get() { Command::CopyGenesisState(args) => genesis_parser::run(args), + Command::GenerateGenesisState(args) => genesis_example::run(&args), Command::ParseBlob(args) => blob_parser::run(args), } } diff --git a/crates/astria-sequencer/README.md b/crates/astria-sequencer/README.md index b6a39774a9..2229b451ba 100644 --- a/crates/astria-sequencer/README.md +++ b/crates/astria-sequencer/README.md @@ -101,10 +101,14 @@ abci-cli query --path=accounts/nonce/
0x00 # initialize the node cometbft init -# inside astria-sequencer, update the genesis file to include genesis -# application state -../../target/debug/astria-sequencer-utils \ - --genesis-app-state-file=test-genesis-app-state.json \ +# generate a sequencer genesis file +cargo run -p astria-sequencer-utils -- generate-genesis-state -o genesis-state.json + +# Edit the generated `genesis-state.json` as desired + +# update the cometbft genesis file to include the sequencer genesis application state +cargo run -p astria-sequencer-utils -- copy-genesis-state \ + --genesis-app-state-file=genesis-state.json \ --destination-genesis-file=$HOME/.cometbft/config/genesis.json \ --chain-id diff --git a/crates/astria-sequencer/justfile b/crates/astria-sequencer/justfile index 07531e0750..8391be8864 100644 --- a/crates/astria-sequencer/justfile +++ b/crates/astria-sequencer/justfile @@ -13,7 +13,13 @@ run: run-cometbft: cometbft init - ../../target/debug/astria-sequencer-utils copy-genesis-state --genesis-app-state-file=test-genesis-app-state.json --destination-genesis-file=$HOME/.cometbft/config/genesis.json --chain-id=astria + cargo run -p astria-sequencer-utils -- \ + generate-genesis-state -o app-genesis-state.json + cargo run -p astria-sequencer-utils -- \ + copy-genesis-state \ + --genesis-app-state-file=app-genesis-state.json \ + --destination-genesis-file=$HOME/.cometbft/config/genesis.json \ + --chain-id=astria sed -i'.bak' 's/timeout_commit = "1s"/timeout_commit = "2s"/g' ~/.cometbft/config/config.toml cometbft node diff --git a/crates/astria-sequencer/src/accounts/component.rs b/crates/astria-sequencer/src/accounts/component.rs index 4c4f7bc383..e52e81aabe 100644 --- a/crates/astria-sequencer/src/accounts/component.rs +++ b/crates/astria-sequencer/src/accounts/component.rs @@ -14,7 +14,6 @@ use super::state_ext::StateWriteExt; use crate::{ asset::get_native_asset, component::Component, - genesis::GenesisState, }; #[derive(Default)] @@ -22,19 +21,19 @@ pub(crate) struct AccountsComponent; #[async_trait::async_trait] impl Component for AccountsComponent { - type AppState = GenesisState; + type AppState = astria_core::sequencer::GenesisState; #[instrument(name = "AccountsComponent::init_chain", skip(state))] async fn init_chain(mut state: S, app_state: &Self::AppState) -> Result<()> { let native_asset = get_native_asset(); - for account in &app_state.accounts { + for account in app_state.accounts() { state .put_account_balance(account.address, native_asset, account.balance) .context("failed writing account balance to state")?; } state - .put_transfer_base_fee(app_state.fees.transfer_base_fee) + .put_transfer_base_fee(app_state.fees().transfer_base_fee) .context("failed to put transfer base fee")?; Ok(()) } diff --git a/crates/astria-sequencer/src/app/mod.rs b/crates/astria-sequencer/src/app/mod.rs index 9ecdf35efc..a09100e606 100644 --- a/crates/astria-sequencer/src/app/mod.rs +++ b/crates/astria-sequencer/src/app/mod.rs @@ -87,7 +87,6 @@ use crate::{ }, }, component::Component as _, - genesis::GenesisState, ibc::component::IbcComponent, mempool::{ Mempool, @@ -207,7 +206,7 @@ impl App { pub(crate) async fn init_chain( &mut self, storage: Storage, - genesis_state: GenesisState, + genesis_state: astria_core::sequencer::GenesisState, genesis_validators: Vec, chain_id: String, ) -> anyhow::Result { @@ -216,16 +215,16 @@ impl App { .try_begin_transaction() .expect("state Arc should not be referenced elsewhere"); - crate::address::initialize_base_prefix(&genesis_state.address_prefixes.base) + crate::address::initialize_base_prefix(&genesis_state.address_prefixes().base) .context("failed setting global base prefix")?; - state_tx.put_base_prefix(&genesis_state.address_prefixes.base); + state_tx.put_base_prefix(&genesis_state.address_prefixes().base); - crate::asset::initialize_native_asset(&genesis_state.native_asset_base_denomination); - state_tx.put_native_asset_denom(&genesis_state.native_asset_base_denomination); + crate::asset::initialize_native_asset(genesis_state.native_asset_base_denomination()); + state_tx.put_native_asset_denom(genesis_state.native_asset_base_denomination()); state_tx.put_chain_id_and_revision_number(chain_id.try_into().context("invalid chain ID")?); state_tx.put_block_height(0); - for fee_asset in &genesis_state.allowed_fee_assets { + for fee_asset in genesis_state.allowed_fee_assets() { state_tx.put_allowed_fee_asset(fee_asset); } @@ -236,7 +235,7 @@ impl App { AuthorityComponent::init_chain( &mut state_tx, &AuthorityComponentAppState { - authority_sudo_address: genesis_state.authority_sudo_address, + authority_sudo_address: *genesis_state.authority_sudo_address(), genesis_validators, }, ) diff --git a/crates/astria-sequencer/src/app/test_utils.rs b/crates/astria-sequencer/src/app/test_utils.rs index 3979cbf7f2..38e72a5772 100644 --- a/crates/astria-sequencer/src/app/test_utils.rs +++ b/crates/astria-sequencer/src/app/test_utils.rs @@ -11,19 +11,19 @@ use astria_core::{ TransactionParams, UnsignedTransaction, }, + sequencer::{ + Account, + AddressPrefixes, + Fees, + GenesisState, + UncheckedGenesisState, + }, }; use cnidarium::Storage; use penumbra_ibc::params::IBCParameters; use crate::{ app::App, - genesis::{ - self, - Account, - AddressPrefixes, - GenesisState, - UncheckedGenesisState, - }, mempool::Mempool, metrics::Metrics, }; @@ -82,8 +82,8 @@ pub(crate) fn default_genesis_accounts() -> Vec { ] } -pub(crate) fn default_fees() -> genesis::Fees { - genesis::Fees { +pub(crate) fn default_fees() -> Fees { + Fees { transfer_base_fee: 12, sequence_base_fee: 32, sequence_byte_cost_multiplier: 1, diff --git a/crates/astria-sequencer/src/app/tests_app.rs b/crates/astria-sequencer/src/app/tests_app.rs index 9fdd48f880..0fcbf541a0 100644 --- a/crates/astria-sequencer/src/app/tests_app.rs +++ b/crates/astria-sequencer/src/app/tests_app.rs @@ -11,6 +11,7 @@ use astria_core::{ TransactionParams, UnsignedTransaction, }, + sequencer::Account, sequencerblock::v1alpha1::block::Deposit, }; use cnidarium::StateDelta; @@ -47,7 +48,6 @@ use crate::{ StateReadExt as _, StateWriteExt, }, - genesis::Account, proposal::commitment::generate_rollup_datas_commitment, state_ext::StateReadExt as _, }; diff --git a/crates/astria-sequencer/src/app/tests_breaking_changes.rs b/crates/astria-sequencer/src/app/tests_breaking_changes.rs index 1924f257ec..088a4899b8 100644 --- a/crates/astria-sequencer/src/app/tests_breaking_changes.rs +++ b/crates/astria-sequencer/src/app/tests_breaking_changes.rs @@ -29,6 +29,11 @@ use astria_core::{ TransactionParams, UnsignedTransaction, }, + sequencer::{ + Account, + AddressPrefixes, + UncheckedGenesisState, + }, sequencerblock::v1alpha1::block::Deposit, }; use cnidarium::StateDelta; @@ -56,10 +61,6 @@ use crate::{ }, asset::get_native_asset, bridge::state_ext::StateWriteExt as _, - genesis::{ - AddressPrefixes, - UncheckedGenesisState, - }, proposal::commitment::generate_rollup_datas_commitment, }; @@ -178,8 +179,6 @@ async fn app_execute_transaction_with_every_action_snapshot() { SudoAddressChangeAction, }; - use crate::genesis::Account; - let (alice_signing_key, _) = get_alice_signing_key_and_address(); let (bridge_signing_key, bridge_address) = get_bridge_signing_key_and_address(); let bob_address = address_from_hex_string(BOB_ADDRESS); diff --git a/crates/astria-sequencer/src/app/tests_execute_transaction.rs b/crates/astria-sequencer/src/app/tests_execute_transaction.rs index 35911de417..3d641d1274 100644 --- a/crates/astria-sequencer/src/app/tests_execute_transaction.rs +++ b/crates/astria-sequencer/src/app/tests_execute_transaction.rs @@ -19,6 +19,11 @@ use astria_core::{ TransactionParams, UnsignedTransaction, }, + sequencer::{ + AddressPrefixes, + GenesisState, + UncheckedGenesisState, + }, sequencerblock::v1alpha1::block::Deposit, }; use cnidarium::StateDelta; @@ -33,11 +38,6 @@ use crate::{ StateReadExt as _, StateWriteExt, }, - genesis::{ - AddressPrefixes, - GenesisState, - UncheckedGenesisState, - }, ibc::state_ext::StateReadExt as _, sequence::calculate_fee_from_state, state_ext::StateReadExt as _, diff --git a/crates/astria-sequencer/src/bridge/component.rs b/crates/astria-sequencer/src/bridge/component.rs index bc180e4e24..e719d666a4 100644 --- a/crates/astria-sequencer/src/bridge/component.rs +++ b/crates/astria-sequencer/src/bridge/component.rs @@ -8,23 +8,22 @@ use tendermint::abci::request::{ use tracing::instrument; use super::state_ext::StateWriteExt; -use crate::{ - component::Component, - genesis::GenesisState, -}; +use crate::component::Component; #[derive(Default)] pub(crate) struct BridgeComponent; #[async_trait::async_trait] impl Component for BridgeComponent { - type AppState = GenesisState; + type AppState = astria_core::sequencer::GenesisState; #[instrument(name = "BridgeComponent::init_chain", skip(state))] async fn init_chain(mut state: S, app_state: &Self::AppState) -> Result<()> { - state.put_init_bridge_account_base_fee(app_state.fees.init_bridge_account_base_fee); - state.put_bridge_lock_byte_cost_multiplier(app_state.fees.bridge_lock_byte_cost_multiplier); - state.put_bridge_sudo_change_base_fee(app_state.fees.bridge_sudo_change_fee); + state.put_init_bridge_account_base_fee(app_state.fees().init_bridge_account_base_fee); + state.put_bridge_lock_byte_cost_multiplier( + app_state.fees().bridge_lock_byte_cost_multiplier, + ); + state.put_bridge_sudo_change_base_fee(app_state.fees().bridge_sudo_change_fee); Ok(()) } diff --git a/crates/astria-sequencer/src/ibc/component.rs b/crates/astria-sequencer/src/ibc/component.rs index 7d7a61b502..19aa1fcab9 100644 --- a/crates/astria-sequencer/src/ibc/component.rs +++ b/crates/astria-sequencer/src/ibc/component.rs @@ -16,7 +16,6 @@ use tracing::instrument; use crate::{ component::Component, - genesis::GenesisState, ibc::{ host_interface::AstriaHost, state_ext::StateWriteExt, @@ -28,28 +27,28 @@ pub(crate) struct IbcComponent; #[async_trait::async_trait] impl Component for IbcComponent { - type AppState = GenesisState; + type AppState = astria_core::sequencer::GenesisState; #[instrument(name = "IbcComponent::init_chain", skip(state))] async fn init_chain(mut state: S, app_state: &Self::AppState) -> Result<()> { Ibc::init_chain( &mut state, Some(&Content { - ibc_params: app_state.ibc_params.clone(), + ibc_params: app_state.ibc_params().clone(), }), ) .await; state - .put_ibc_sudo_address(app_state.ibc_sudo_address) + .put_ibc_sudo_address(*app_state.ibc_sudo_address()) .context("failed to set IBC sudo key")?; - for address in &app_state.ibc_relayer_addresses { + for address in app_state.ibc_relayer_addresses() { state.put_ibc_relayer_address(address); } state - .put_ics20_withdrawal_base_fee(app_state.fees.ics20_withdrawal_base_fee) + .put_ics20_withdrawal_base_fee(app_state.fees().ics20_withdrawal_base_fee) .context("failed to put ics20 withdrawal base fee")?; Ok(()) } diff --git a/crates/astria-sequencer/src/lib.rs b/crates/astria-sequencer/src/lib.rs index 709ee76abd..e1edfc6409 100644 --- a/crates/astria-sequencer/src/lib.rs +++ b/crates/astria-sequencer/src/lib.rs @@ -9,7 +9,6 @@ mod build_info; pub(crate) mod component; pub mod config; pub(crate) mod fee_asset_change; -pub(crate) mod genesis; pub(crate) mod grpc; pub(crate) mod ibc; mod mempool; diff --git a/crates/astria-sequencer/src/sequence/component.rs b/crates/astria-sequencer/src/sequence/component.rs index 28b733f2d4..2a7c710dcb 100644 --- a/crates/astria-sequencer/src/sequence/component.rs +++ b/crates/astria-sequencer/src/sequence/component.rs @@ -8,23 +8,21 @@ use tendermint::abci::request::{ use tracing::instrument; use super::state_ext::StateWriteExt; -use crate::{ - component::Component, - genesis::GenesisState, -}; +use crate::component::Component; #[derive(Default)] pub(crate) struct SequenceComponent; #[async_trait::async_trait] impl Component for SequenceComponent { - type AppState = GenesisState; + type AppState = astria_core::sequencer::GenesisState; #[instrument(name = "SequenceComponent::init_chain", skip(state))] async fn init_chain(mut state: S, app_state: &Self::AppState) -> Result<()> { - state.put_sequence_action_base_fee(app_state.fees.sequence_base_fee); - state - .put_sequence_action_byte_cost_multiplier(app_state.fees.sequence_byte_cost_multiplier); + state.put_sequence_action_base_fee(app_state.fees().sequence_base_fee); + state.put_sequence_action_byte_cost_multiplier( + app_state.fees().sequence_byte_cost_multiplier, + ); Ok(()) } diff --git a/crates/astria-sequencer/src/service/consensus.rs b/crates/astria-sequencer/src/service/consensus.rs index 051eb3fe70..9b9b540258 100644 --- a/crates/astria-sequencer/src/service/consensus.rs +++ b/crates/astria-sequencer/src/service/consensus.rs @@ -18,10 +18,7 @@ use tracing::{ Instrument, }; -use crate::{ - app::App, - genesis::GenesisState, -}; +use crate::app::App; pub(crate) struct Consensus { queue: mpsc::Receiver>, @@ -132,8 +129,9 @@ impl Consensus { bail!("database already initialized"); } - let genesis_state: GenesisState = serde_json::from_slice(&init_chain.app_state_bytes) - .context("failed to parse app_state in genesis file")?; + let genesis_state: astria_core::sequencer::GenesisState = + serde_json::from_slice(&init_chain.app_state_bytes) + .context("failed to parse app_state in genesis file")?; let app_hash = self .app .init_chain( @@ -229,6 +227,11 @@ mod test { TransactionParams, UnsignedTransaction, }, + sequencer::{ + Account, + AddressPrefixes, + UncheckedGenesisState, + }, }; use bytes::Bytes; use prost::Message as _; @@ -243,10 +246,6 @@ mod test { use crate::{ app::test_utils::default_fees, asset::get_native_asset, - genesis::{ - AddressPrefixes, - UncheckedGenesisState, - }, mempool::Mempool, metrics::Metrics, proposal::commitment::generate_rollup_datas_commitment, @@ -460,7 +459,7 @@ mod test { async fn new_consensus_service(funded_key: Option) -> (Consensus, Mempool) { let accounts = if funded_key.is_some() { - vec![crate::genesis::Account { + vec![Account { address: crate::address::base_prefixed(funded_key.unwrap().address_bytes()), balance: 10u128.pow(19), }] diff --git a/crates/astria-sequencer/test-genesis-app-state.json b/crates/astria-sequencer/test-genesis-app-state.json deleted file mode 100644 index 87f6879ecb..0000000000 --- a/crates/astria-sequencer/test-genesis-app-state.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "accounts": [ - { - "address": "1c0c490f1b5528d8173c5de46d131160e4b2c0c3", - "balance": 1000000000000000000 - }, - { - "address": "34fec43c7fcab9aef3b3cf8aba855e41ee69ca3a", - "balance": 1000000000000000000 - }, - { - "address": "60709e2d391864b732b4f0f51e387abb76743871", - "balance": 1000000000000000000 - } - ], - "authority_sudo_address": "1c0c490f1b5528d8173c5de46d131160e4b2c0c3", - "ibc_sudo_address": "1c0c490f1b5528d8173c5de46d131160e4b2c0c3", - "ibc_relayer_addresses": ["1c0c490f1b5528d8173c5de46d131160e4b2c0c3", "34fec43c7fcab9aef3b3cf8aba855e41ee69ca3a"], - "ibc_params": { - "ibc_enabled": true, - "inbound_ics20_transfers_enabled": true, - "outbound_ics20_transfers_enabled": true - }, - "fees": { - "transfer_base_fee": 12, - "sequence_base_fee": 32, - "sequence_byte_cost_multiplier": 1, - "init_bridge_account_base_fee": 48, - "bridge_lock_byte_cost_multiplier": 1, - "bridge_sudo_change_fee": 24, - "ics20_withdrawal_base_fee": 24 - }, - "native_asset_base_denomination": "nria", - "allowed_fee_assets": ["nria"] -}