From 4d9e1cc95c8d8547d5d0f057abb35cbb2821842b Mon Sep 17 00:00:00 2001 From: Uncle Stretch Date: Sun, 13 Sep 2026 11:05:16 +0300 Subject: [PATCH] adapt latest casper runtime changes Signed-off-by: Uncle Stretch --- Cargo.toml | 2 +- artifacts/casper.scale | Bin 281718 -> 216509 bytes src/components/validator/gatekeepers.rs | 4 +- src/components/validator/listen_addresses.rs | 2 +- src/components/validator/mod.rs | 38 ++------------ src/components/validator/reward_details.rs | 29 ----------- src/components/validator/rotate_popup.rs | 22 +++++--- src/components/validator/stash_details.rs | 27 +++++++++- src/components/validator/stash_info.rs | 4 +- src/network/predefined_calls.rs | 51 +++++++++++-------- src/network/predefined_txs.rs | 10 +++- src/network/raw_calls/networks.rs | 14 ++--- src/types/networks.rs | 2 +- 13 files changed, 98 insertions(+), 107 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 07df71c..dda1c7d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "ghost-eye" authors = ["str3tch "] description = "Application for interacting with Casper/Ghost nodes that are exposing RPC only to the localhost" -version = "0.3.92" +version = "0.4.0" edition = "2021" homepage = "https://git.ghostchain.io/ghostchain" repository = "https://git.ghostchain.io/ghostchain/ghost-eye" diff --git a/artifacts/casper.scale b/artifacts/casper.scale index d927e9c48726cedfdf89f4759ad5b661956a404a..fdf49b343ded9d6bd0f155ce8ffa800f423ac168 100644 GIT binary patch delta 32998 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 T;k$5V+@TbM^*A(FCzAgQ+ApX4 delta 93105 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 Result<()> { - let [_, place, _] = super::validator_session_and_listen_layout(area); + let [_, place] = super::validator_session_and_listen_layout(area); let (border_style, border_type) = self.palette.create_border_style(self.is_active); let list = List::new( self.listen_addresses diff --git a/src/components/validator/mod.rs b/src/components/validator/mod.rs index aea4467..977281a 100644 --- a/src/components/validator/mod.rs +++ b/src/components/validator/mod.rs @@ -15,9 +15,6 @@ mod bond_popup; mod change_blocks_popup; mod chill_popup; mod event_log; -mod gatekeeper_details; -mod gatekeeper_endpoints_popup; -mod gatekeepers; mod history; mod listen_addresses; mod nominators; @@ -40,9 +37,6 @@ use bond_popup::BondPopup; use change_blocks_popup::ChangeBlocksPopup; use chill_popup::ChillPopup; use event_log::EventLogs; -use gatekeeper_details::GatekeeperDetails; -use gatekeeper_endpoints_popup::GatekeeperEndpoints; -use gatekeepers::Gatekeepers; use history::History; use listen_addresses::ListenAddresses; use nominators::NominatorsByValidator; @@ -65,7 +59,6 @@ use withdrawals::Withdrawals; pub enum CurrentTab { Nothing, ListenAddresses, - Gatekeepers, NominatorsByValidator, History, Withdrawals, @@ -82,7 +75,6 @@ pub enum CurrentTab { WithdrawPopup, PayeePopup, ChangeBlocksPopup, - GatekeeperEndpoints, } pub trait PartialComponent: Component { @@ -108,12 +100,10 @@ impl Default for Validator { Box::new(StashDetails::default()), Box::new(StakingDetails::default()), Box::new(RewardDetails::default()), - Box::new(GatekeeperDetails::default()), Box::new(History::default()), Box::new(Withdrawals::default()), Box::new(Peers::default()), Box::new(ListenAddresses::default()), - Box::new(Gatekeepers::default()), Box::new(EventLogs::default()), Box::new(BondPopup::default()), Box::new(PayoutPopup::default()), @@ -126,7 +116,6 @@ impl Default for Validator { Box::new(WithdrawPopup::default()), Box::new(PayeePopup::default()), Box::new(ChangeBlocksPopup::default()), - Box::new(GatekeeperEndpoints::default()), ], } } @@ -139,17 +128,12 @@ impl Validator { CurrentTab::Peers => self.current_tab = CurrentTab::Withdrawals, CurrentTab::Withdrawals => self.current_tab = CurrentTab::History, CurrentTab::History => self.current_tab = CurrentTab::NominatorsByValidator, - CurrentTab::NominatorsByValidator => self.current_tab = CurrentTab::Gatekeepers, - CurrentTab::ListenAddresses => self.current_tab = CurrentTab::Gatekeepers, _ => {} } } fn move_right(&mut self) { match self.current_tab { - CurrentTab::ListenAddresses => self.current_tab = CurrentTab::Gatekeepers, - CurrentTab::Gatekeepers => self.current_tab = CurrentTab::NominatorsByValidator, - CurrentTab::Nothing => self.current_tab = CurrentTab::NominatorsByValidator, CurrentTab::NominatorsByValidator => self.current_tab = CurrentTab::History, CurrentTab::History => self.current_tab = CurrentTab::Withdrawals, CurrentTab::Withdrawals => self.current_tab = CurrentTab::Peers, @@ -197,8 +181,7 @@ impl Component for Validator { | CurrentTab::WithdrawPopup | CurrentTab::PayoutPopup | CurrentTab::PayoutAllPopup - | CurrentTab::ChangeBlocksPopup - | CurrentTab::GatekeeperEndpoints => { + | CurrentTab::ChangeBlocksPopup => { for component in self.components.iter_mut() { component.handle_key_event(key)?; } @@ -264,8 +247,7 @@ impl Component for Validator { match action { Action::SetActiveScreen(Mode::Validator) => { self.is_active = true; - self.previous_tab = CurrentTab::Gatekeepers; - self.current_tab = CurrentTab::Gatekeepers; + self.previous_tab = CurrentTab::History; } Action::PayoutValidatorPopup(_) => { self.previous_tab = self.current_tab; @@ -283,10 +265,6 @@ impl Component for Validator { self.previous_tab = self.current_tab; self.current_tab = CurrentTab::ChangeBlocksPopup; } - Action::GatekeeperEndpoints => { - self.previous_tab = self.current_tab; - self.current_tab = CurrentTab::GatekeeperEndpoints; - } Action::ClosePopup => self.current_tab = self.previous_tab, _ => {} } @@ -321,21 +299,15 @@ pub fn validator_details_layout(area: Rect) -> [Rect; 2] { Layout::horizontal([Constraint::Length(31), Constraint::Fill(1)]).areas(place) } -pub fn validator_session_and_listen_layout(area: Rect) -> [Rect; 3] { +pub fn validator_session_and_listen_layout(area: Rect) -> [Rect; 2] { let [_, place] = validator_details_layout(area); Layout::vertical([ - Constraint::Length(6), - Constraint::Length(6), + Constraint::Length(7), Constraint::Fill(1), ]) .areas(place) } -pub fn validator_gatekeeped_networks_layout(area: Rect) -> [Rect; 2] { - let [_, _, place] = validator_session_and_listen_layout(area); - Layout::horizontal([Constraint::Fill(1), Constraint::Length(30)]).areas(place) -} - pub fn validator_statistics_layout(area: Rect) -> [Rect; 3] { let [_, place, _, _] = validator_layout(area); Layout::horizontal([ @@ -349,7 +321,7 @@ pub fn validator_statistics_layout(area: Rect) -> [Rect; 3] { pub fn validator_balance_layout(area: Rect) -> [Rect; 3] { let [place, _] = validator_details_layout(area); Layout::vertical([ - Constraint::Length(6), + Constraint::Length(7), Constraint::Length(6), Constraint::Fill(1), ]) diff --git a/src/components/validator/reward_details.rs b/src/components/validator/reward_details.rs index cc32498..2fcdc49 100644 --- a/src/components/validator/reward_details.rs +++ b/src/components/validator/reward_details.rs @@ -9,13 +9,10 @@ use ratatui::{ use super::{Component, CurrentTab, PartialComponent}; use crate::types::EraRewardPoints; -use crate::widgets::DotSpinner; use crate::{action::Action, config::Config, palette::StylePalette}; pub struct RewardDetails { palette: StylePalette, - commission: Option, - nominators_blocked: bool, apy: String, treasury_apy: String, inflation: String, @@ -37,8 +34,6 @@ impl RewardDetails { pub fn new() -> Self { Self { palette: StylePalette::default(), - commission: None, - nominators_blocked: false, apy: String::from("0.0%"), treasury_apy: String::from("0.0%"), inflation: String::from("0.0%"), @@ -51,19 +46,6 @@ impl RewardDetails { } } - fn comission_to_string(&self) -> String { - match self.commission { - Some(commission) => { - if self.nominators_blocked { - "blocked".to_string() - } else { - format!("{:.2}%", commission as f64 / 10_000_000.0) - } - } - None => DotSpinner::default().to_string(), - } - } - fn update_individual(&mut self, individual: &Vec) { let (is_disabled, in_rewards) = individual .iter() @@ -108,13 +90,6 @@ impl Component for RewardDetails { Action::SetCurrentValidatorEraRewards(_, _, individual) => { self.update_individual(&individual) } - Action::SetValidatorPrefs(commission, disabled, account_id) - if self.stash == account_id => - { - self.commission = commission; - self.in_staking_validators = commission.is_some(); - self.nominators_blocked = disabled; - } Action::SetSessionKey(name, session_key_info) => { if name.starts_with("q_") { self.in_queued_keys = !session_key_info.key.is_empty(); @@ -150,10 +125,6 @@ impl Component for RewardDetails { let table = Table::new( vec![ - Row::new(vec![ - Cell::from(Text::from("Nominators".to_string()).alignment(Alignment::Left)), - Cell::from(Text::from(self.comission_to_string()).alignment(Alignment::Right)), - ]), Row::new(vec![ Cell::from(Text::from("Validator APY".to_string()).alignment(Alignment::Left)), Cell::from(Text::from(self.apy.clone()).alignment(Alignment::Right)), diff --git a/src/components/validator/rotate_popup.rs b/src/components/validator/rotate_popup.rs index c9a4cd6..3260488 100644 --- a/src/components/validator/rotate_popup.rs +++ b/src/components/validator/rotate_popup.rs @@ -65,20 +65,22 @@ impl RotatePopup { } } - fn parse_session_keys(&self) -> (String, String, String, String) { - if !self.cached_keys.is_empty() && self.cached_keys.len() == 258 { + fn parse_session_keys(&self) -> (String, String, String, String, String) { + if !self.cached_keys.is_empty() && self.cached_keys.len() == 322 { let gran_key = format!("0x{}", &self.cached_keys[2..66]); let babe_key = format!("0x{}", &self.cached_keys[66..130]); let audi_key = format!("0x{}", &self.cached_keys[130..194]); - let slow_key = format!("0x{}", &self.cached_keys[194..258]); + let wevr_key = format!("0x{}", &self.cached_keys[194..258]); + let exds_key = format!("0x{}", &self.cached_keys[258..322]); - (gran_key, babe_key, audi_key, slow_key) + (gran_key, babe_key, audi_key, wevr_key, exds_key) } else { ( String::from("0x0000000000000000000000000000000000000000000000000000000000000000"), String::from("0x0000000000000000000000000000000000000000000000000000000000000000"), String::from("0x0000000000000000000000000000000000000000000000000000000000000000"), String::from("0x0000000000000000000000000000000000000000000000000000000000000000"), + String::from("0x0000000000000000000000000000000000000000000000000000000000000000"), ) } } @@ -143,8 +145,8 @@ impl Component for RotatePopup { fn draw(&mut self, frame: &mut Frame, area: Rect) -> Result<()> { if self.is_active { let (border_style, border_type) = self.palette.create_popup_style(); + let (gran_key, babe_key, audi_key, wevr_key, exds_key) = self.parse_session_keys(); - let (gran_key, babe_key, audi_key, slow_key) = self.parse_session_keys(); let table = Table::new( vec![ Row::new(vec![ @@ -160,8 +162,12 @@ impl Component for RotatePopup { Cell::from(Text::from(audi_key).alignment(Alignment::Right)), ]), Row::new(vec![ - Cell::from(Text::from("slow".to_string()).alignment(Alignment::Left)), - Cell::from(Text::from(slow_key).alignment(Alignment::Right)), + Cell::from(Text::from("wevr".to_string()).alignment(Alignment::Left)), + Cell::from(Text::from(wevr_key).alignment(Alignment::Right)), + ]), + Row::new(vec![ + Cell::from(Text::from("exds".to_string()).alignment(Alignment::Left)), + Cell::from(Text::from(exds_key).alignment(Alignment::Right)), ]), ], [Constraint::Length(4), Constraint::Min(0)], @@ -177,7 +183,7 @@ impl Component for RotatePopup { .title("Rotate session keys (Enter to proceed / Esc to close)"), ); - let v = Layout::vertical([Constraint::Max(6)]).flex(Flex::Center); + let v = Layout::vertical([Constraint::Max(7)]).flex(Flex::Center); let h = Layout::horizontal([Constraint::Max(73)]).flex(Flex::Center); let [area] = v.areas(area); let [area] = h.areas(area); diff --git a/src/components/validator/stash_details.rs b/src/components/validator/stash_details.rs index 35aa7ce..19341d4 100644 --- a/src/components/validator/stash_details.rs +++ b/src/components/validator/stash_details.rs @@ -15,6 +15,8 @@ use crate::{action::Action, config::Config, palette::StylePalette}; pub struct StashDetails { palette: StylePalette, network_tx: Option>, + commission: Option, + nominators_blocked: bool, is_bonded: bool, free_balance: Option, staked_total: Option, @@ -37,6 +39,8 @@ impl StashDetails { Self { palette: StylePalette::default(), network_tx: None, + nominators_blocked: false, + commission: None, is_bonded: false, free_balance: None, staked_total: None, @@ -46,6 +50,19 @@ impl StashDetails { } } + fn commission_to_string(&self) -> String { + match self.commission { + Some(commission) => { + if self.nominators_blocked { + "disabled".to_string() + } else { + format!("{:.2}%", commission as f64 / 10_000_000.0) + } + } + None => DotSpinner::default().to_string(), + } + } + fn prepare_u128(&self, maybe_value: Option) -> String { match maybe_value { Some(value) => { @@ -102,6 +119,10 @@ impl Component for StashDetails { match action { Action::SetStashSecret(secret) => self.stash_secret = secret, Action::SetStashAccount(account_id) => self.stash_account_id = account_id, + Action::SetValidatorPrefs(commission, disabled, account_id) if self.stash_account_id == account_id => { + self.commission = commission; + self.nominators_blocked = disabled; + } Action::SetIsBonded(is_bonded, account_id) if self.stash_account_id == account_id => { self.is_bonded = is_bonded } @@ -139,7 +160,7 @@ impl Component for StashDetails { let table = Table::new( vec![ Row::new(vec![ - Cell::from(Text::from("Bond ready".to_string()).alignment(Alignment::Left)), + Cell::from(Text::from("Bond status".to_string()).alignment(Alignment::Left)), Cell::from(Text::from(self.is_bonded_to_string()).alignment(Alignment::Right)), ]), Row::new(vec![ @@ -163,6 +184,10 @@ impl Component for StashDetails { .alignment(Alignment::Right), ), ]), + Row::new(vec![ + Cell::from(Text::from("Nomination fee".to_string()).alignment(Alignment::Left)), + Cell::from(Text::from(self.commission_to_string()).alignment(Alignment::Right)) + ]), ], [Constraint::Min(14), Constraint::Min(0)], ) diff --git a/src/components/validator/stash_info.rs b/src/components/validator/stash_info.rs index f9e81d7..6377ff8 100644 --- a/src/components/validator/stash_info.rs +++ b/src/components/validator/stash_info.rs @@ -56,7 +56,7 @@ impl StashInfo { stash_address: String::new(), stash_pair: None, session_keys: Default::default(), - key_names: &["gran", "babe", "audi", "slow"], + key_names: &["gran", "babe", "audi", "wevr", "exds"], stash_filepath: PathBuf::from("/etc/ghost/stash-key"), } } @@ -232,7 +232,7 @@ impl Component for StashInfo { } fn draw(&mut self, frame: &mut Frame, area: Rect) -> Result<()> { - let [place, _, _] = super::validator_session_and_listen_layout(area); + let [place, _] = super::validator_session_and_listen_layout(area); let (border_style, border_type) = self.palette.create_border_style(self.is_active); let table = Table::new( self.key_names.iter().map(|name| { diff --git a/src/network/predefined_calls.rs b/src/network/predefined_calls.rs index 6bf7320..413f09d 100644 --- a/src/network/predefined_calls.rs +++ b/src/network/predefined_calls.rs @@ -14,7 +14,8 @@ use tokio::sync::mpsc::UnboundedSender; use crate::{ action::Action, casper_network::runtime_types::{ - ghost_networks::NetworkType, pallet_staking::RewardDestination, sp_consensus_slots, + ghost_helpers::networks::{NetworkCurve, NetworkType}, + pallet_staking::RewardDestination, sp_consensus_slots, }, types::{ EraInfo, EraRewardPoints, Gatekeeper, Nominations, Nominator, SessionKeyInfo, @@ -201,8 +202,8 @@ pub async fn get_inflation( .await? .map(|imbalance| { total_issuance - .saturating_add(imbalance.bridged_out) - .saturating_sub(imbalance.bridged_in) + .saturating_add(imbalance.1) + .saturating_sub(imbalance.0) }) .unwrap_or_default(); @@ -237,22 +238,24 @@ pub async fn get_session_keys( account_id: &[u8; 32], ) -> Result<()> { let maybe_session_keys = super::raw_calls::session::next_keys(api, None, account_id).await?; - let (gran_key, babe_key, audi_key, slow_key) = match maybe_session_keys { + let (gran_key, babe_key, audi_key, wevr_key, exds_key) = match maybe_session_keys { Some(session_keys) => { let gran_key = format!("0x{}", hex::encode(session_keys.grandpa.0)); let babe_key = format!("0x{}", hex::encode(session_keys.babe.0)); let audi_key = format!("0x{}", hex::encode(session_keys.authority_discovery.0)); - let slow_key = format!("0x{}", hex::encode(session_keys.slow_clap.0)); + let wevr_key = format!("0x{}", hex::encode(session_keys.weaver.0)); + let exds_key = format!("0x{}", hex::encode(session_keys.exodus.0)); - (gran_key, babe_key, audi_key, slow_key) + (gran_key, babe_key, audi_key, wevr_key, exds_key) } - None => (String::new(), String::new(), String::new(), String::new()), + None => (String::new(), String::new(), String::new(), String::new(), String::new()), }; check_author_has_key(rpc_client, action_tx, &gran_key, "gran").await?; check_author_has_key(rpc_client, action_tx, &babe_key, "babe").await?; check_author_has_key(rpc_client, action_tx, &audi_key, "audi").await?; - check_author_has_key(rpc_client, action_tx, &slow_key, "slow").await?; + check_author_has_key(rpc_client, action_tx, &wevr_key, "wevr").await?; + check_author_has_key(rpc_client, action_tx, &exds_key, "exds").await?; Ok(()) } @@ -266,26 +269,28 @@ pub async fn get_queued_session_keys( let account = super::raw_calls::convert_array_to_account_id(account_id); let maybe_queued_keys = super::raw_calls::session::queued_keys(api, None).await?; - let (gran_key, babe_key, audi_key, slow_key) = match maybe_queued_keys { + let (gran_key, babe_key, audi_key, wevr_key, exds_key) = match maybe_queued_keys { Some(session_keys) => match session_keys.iter().find(|tuple| tuple.0 == account) { Some(keys) => { let session_keys = &keys.1; let gran_key = format!("0x{}", hex::encode(session_keys.grandpa.0)); let babe_key = format!("0x{}", hex::encode(session_keys.babe.0)); let audi_key = format!("0x{}", hex::encode(session_keys.authority_discovery.0)); - let slow_key = format!("0x{}", hex::encode(session_keys.slow_clap.0)); + let wevr_key = format!("0x{}", hex::encode(session_keys.weaver.0)); + let exds_key = format!("0x{}", hex::encode(session_keys.exodus.0)); - (gran_key, babe_key, audi_key, slow_key) + (gran_key, babe_key, audi_key, wevr_key, exds_key) } - None => (String::new(), String::new(), String::new(), String::new()), + None => (String::new(), String::new(), String::new(), String::new(), String::new()), }, - None => (String::new(), String::new(), String::new(), String::new()), + None => (String::new(), String::new(), String::new(), String::new(), String::new()), }; check_author_has_key(rpc_client, action_tx, &gran_key, "q_gran").await?; check_author_has_key(rpc_client, action_tx, &babe_key, "q_babe").await?; check_author_has_key(rpc_client, action_tx, &audi_key, "q_audi").await?; - check_author_has_key(rpc_client, action_tx, &slow_key, "q_slow").await?; + check_author_has_key(rpc_client, action_tx, &wevr_key, "q_wevr").await?; + check_author_has_key(rpc_client, action_tx, &exds_key, "q_exds").await?; Ok(()) } @@ -712,20 +717,24 @@ pub async fn get_gatekeeped_network( .await? .map(|network| Gatekeeper { chain_id, - chain_name: String::from_utf8_lossy(&network.chain_name).to_string(), - chain_type: match network.network_type { + chain_curve: match network.curve { + NetworkCurve::Secp256k1 => String::from("Secp256k1"), + NetworkCurve::Ed25519 => String::from("Ed25519"), + }, + chain_type: match network.r#type { NetworkType::Evm => String::from("EVM"), NetworkType::Utxo => String::from("UTXO"), - NetworkType::Undefined => String::from("???"), + _ => String::from("???"), }, default_endpoints: network .default_endpoints + .0 .iter() - .map(|endpoint| String::from_utf8_lossy(&endpoint).to_string()) + .map(|endpoint| String::from_utf8_lossy(endpoint.0.as_slice()).to_string()) .collect(), - gatekeeper: String::from_utf8_lossy(&network.gatekeeper).to_string(), - incoming_fee: network.incoming_fee, - outgoing_fee: network.outgoing_fee, + gatekeeper: String::from_utf8_lossy(network.gatekeeper.0.as_slice()).to_string(), + incoming_fee: network.incoming_share, + outgoing_fee: network.outgoing_share, }) .unwrap_or_default(); action_tx.send(Action::SetGatekeepedNetwork(gatekeeped_network))?; diff --git a/src/network/predefined_txs.rs b/src/network/predefined_txs.rs index d3c20fa..310958c 100644 --- a/src/network/predefined_txs.rs +++ b/src/network/predefined_txs.rs @@ -115,7 +115,7 @@ pub async fn set_keys( hashed_keys_str: &String, maybe_nonce: Option<&mut u32>, ) -> Result>> { - let (gran_key, babe_key, audi_key, slow_key) = { + let (gran_key, babe_key, audi_key, wevr_key, exds_key) = { let s = hashed_keys_str.trim_start_matches("0x"); ( hex::decode(&s[0..64]) @@ -138,13 +138,19 @@ pub async fn set_keys( .as_slice() .try_into() .unwrap(), + hex::decode(&s[256..320]) + .unwrap() + .as_slice() + .try_into() + .unwrap(), ) }; let session_keys = runtime_types::casper_runtime::opaque::SessionKeys { grandpa: runtime_types::sp_consensus_grandpa::app::Public(gran_key), babe: runtime_types::sp_consensus_babe::app::Public(babe_key), authority_discovery: runtime_types::sp_authority_discovery::app::Public(audi_key), - slow_clap: runtime_types::ghost_slow_clap::sr25519::app_sr25519::Public(slow_key), + weaver: runtime_types::ghost_weaver::sr25519::app_sr25519::Public(wevr_key), + exodus: runtime_types::ghost_exodus::sr25519::app_sr25519::Public(exds_key), }; // it seems like there is no check for the second paramter, that's why // we it can be anything. For example empty vector. diff --git a/src/network/raw_calls/networks.rs b/src/network/raw_calls/networks.rs index e3adb8e..f856a03 100644 --- a/src/network/raw_calls/networks.rs +++ b/src/network/raw_calls/networks.rs @@ -4,7 +4,7 @@ use subxt::{client::OnlineClient, utils::H256}; use crate::{ casper_network::{ self, - runtime_types::ghost_networks::{BridgeAdjustment, NetworkData}, + runtime_types::ghost_helpers::networks::NetworkData, }, CasperConfig, }; @@ -12,12 +12,13 @@ use crate::{ pub async fn bridged_imbalance( online_client: &OnlineClient, at_hash: Option<&H256>, -) -> Result>> { +) -> Result> { let storage_key = casper_network::storage() .ghost_networks() - .bridged_imbalance(); - let maybe_bridged_imbalance = + .network_imbalance(); + let maybe_network_imbalance = super::do_storage_call(online_client, &storage_key, at_hash).await?; + let maybe_bridged_imbalance = maybe_network_imbalance.map(|n| (n.incoming, n.outgoing)); Ok(maybe_bridged_imbalance) } @@ -27,9 +28,10 @@ pub async fn accumulated_commission( ) -> Result> { let storage_key = casper_network::storage() .ghost_networks() - .accumulated_commission(); - let maybe_accumulated_commission = + .network_imbalance(); + let maybe_network_imbalance = super::do_storage_call(online_client, &storage_key, at_hash).await?; + let maybe_accumulated_commission = maybe_network_imbalance.map(|n| n.curve_share); Ok(maybe_accumulated_commission) } diff --git a/src/types/networks.rs b/src/types/networks.rs index 2515de4..2c5e705 100644 --- a/src/types/networks.rs +++ b/src/types/networks.rs @@ -4,8 +4,8 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize, Decode)] pub struct Gatekeeper { pub chain_id: u64, - pub chain_name: String, pub chain_type: String, + pub chain_curve: String, pub gatekeeper: String, pub incoming_fee: u32, pub outgoing_fee: u32,