From bea7e02e2d9e216bcf0b3de5c12a87e26331d00d Mon Sep 17 00:00:00 2001 From: Hugo Trentesaux <hugo@trentesaux.fr> Date: Mon, 23 Oct 2023 18:45:05 +0200 Subject: [PATCH] update runtime and refac --- res/metadata.scale | Bin 131104 -> 133013 bytes src/cache.rs | 3 +- src/commands/account.rs | 3 +- src/commands/expire.rs | 40 +------------------- src/commands/smith.rs | 15 ++++++-- src/commands/transfer.rs | 79 +++++++++++++++++++++------------------ src/indexer.rs | 3 +- src/main.rs | 8 ++-- src/runtime_config.rs | 3 +- 9 files changed, 66 insertions(+), 88 deletions(-) diff --git a/res/metadata.scale b/res/metadata.scale index 5ca3e2273e371e7e0f42789281bf44892e42e55b..ff2e4c744170ba9f541fe08fb699d41f1a28eb0a 100644 GIT binary patch delta 21995 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 J#-3T${|y;Pb8P?s delta 20128 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 diff --git a/src/cache.rs b/src/cache.rs index bec5bae..5662335 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -1,5 +1,4 @@ -use crate::indexer::*; -use crate::*; +use crate::{indexer::*, *}; use std::collections::{hash_map, HashMap}; diff --git a/src/commands/account.rs b/src/commands/account.rs index 59856a4..dc86d70 100644 --- a/src/commands/account.rs +++ b/src/commands/account.rs @@ -18,7 +18,6 @@ pub enum Subcommand { /// Use universal dividends instead of units #[clap(short = 'u', long = "ud")] is_ud: bool, - }, /// Transfer the same amount for each space-separated address. /// If an address appears mutiple times, it will get multiple times the same amount @@ -42,7 +41,7 @@ pub async fn handle_command(data: Data, command: Subcommand) -> anyhow::Result<( amount, dest, keep_alive, - is_ud + is_ud, } => { commands::transfer::transfer(&data, amount, dest, keep_alive, is_ud).await?; } diff --git a/src/commands/expire.rs b/src/commands/expire.rs index 7fe2518..43d7d98 100644 --- a/src/commands/expire.rs +++ b/src/commands/expire.rs @@ -3,7 +3,7 @@ use crate::*; use futures::join; use std::collections::BTreeMap; -pub async fn monitor_expirations(data: &Data, blocks: u32, sessions: u32) -> anyhow::Result<()> { +pub async fn monitor_expirations(data: &Data, blocks: u32, _sessions: u32) -> anyhow::Result<()> { let client = data.client(); let indexer = data.indexer.clone(); @@ -14,7 +14,7 @@ pub async fn monitor_expirations(data: &Data, blocks: u32, sessions: u32) -> any .unwrap(); let addr_current_block = runtime::storage().system().number(); let addr_current_session = runtime::storage().session().current_index(); - let (current_block, current_session) = join!( + let (current_block, _current_session) = join!( client .storage() .fetch(&addr_current_block, Some(parent_hash)), @@ -23,47 +23,11 @@ pub async fn monitor_expirations(data: &Data, blocks: u32, sessions: u32) -> any .fetch(&addr_current_session, Some(parent_hash),) ); let current_block = current_block?.unwrap_or_default(); - let current_session = current_session?.unwrap_or_default(); let end_block = current_block + blocks; - let end_session = current_session + sessions; let mut identity_cache = cache::IdentityCache::new(client.clone(), indexer); - // Rotate keys - let mut must_rotate_keys_before_iter = client - .storage() - .iter( - runtime::storage() - .authority_members() - .must_rotate_keys_before(0), - 10, - Some(parent_hash), - ) - .await?; - let mut must_rotate_keys_before = BTreeMap::new(); - while let Some((k, v)) = must_rotate_keys_before_iter.next().await? { - let session_index = u32::from_le_bytes(k.as_ref()[40..44].try_into().unwrap()); - if session_index < end_session { - must_rotate_keys_before.insert(session_index - current_session, v); - } - } - - println!("\nAuthority members:"); - for (sessions_left, identity_ids) in must_rotate_keys_before { - println!("Must rotate keys before {sessions_left} sessions:"); - for identity_id in identity_ids { - println!( - " {} ({})", - identity_cache - .fetch_identity(identity_id, parent_hash) - .await - .unwrap_or_else(|_| "?".into()), - identity_id - ); - } - } - // Certifications let mut basic_certs_iter = client .storage() diff --git a/src/commands/smith.rs b/src/commands/smith.rs index 865a9ed..8a69b7a 100644 --- a/src/commands/smith.rs +++ b/src/commands/smith.rs @@ -86,7 +86,9 @@ pub async fn handle_command(data: Data, command: Subcommand) -> anyhow::Result<( data.client() .storage() .fetch( - &runtime::storage().smith_membership().counter_for_membership(), + &runtime::storage() + .smith_membership() + .counter_for_membership(), None, ) .await? @@ -103,7 +105,13 @@ pub async fn rotate_keys(client: &Client) -> Result<SessionKeys, anyhow::Error> client .rpc() .rotate_keys() - .await.map_err(|e| anyhow!("Please make sure you are connected to your validator node with the unsafe RPC API enabled {e}"))? + .await + .map_err(|e| { + anyhow!( + "Please make sure you are connected to your validator node with the unsafe RPC \ + API enabled {e}" + ) + })? .deref() .try_into() .map_err(|e| anyhow!("Session keys have wrong length: {:?}", e)) @@ -190,7 +198,8 @@ pub async fn go_online(data: &Data) -> Result<(), GcliError> { runtime::authority_members::events::MemberGoOnline, StaticTxPayload<runtime::authority_members::calls::GoOnline>, >(data, &runtime::tx().authority_members().go_online()) - .await.map_err(|e| e.into()) + .await + .map_err(|e| e.into()) } /// claim smith membership diff --git a/src/commands/transfer.rs b/src/commands/transfer.rs index aca2273..c49512b 100644 --- a/src/commands/transfer.rs +++ b/src/commands/transfer.rs @@ -12,49 +12,54 @@ pub async fn transfer( keep_alive: bool, is_ud: bool, ) -> Result<(), subxt::Error> { - let progress = if keep_alive { - if is_ud {data.client() - .tx() - .sign_and_submit_then_watch( - &runtime::tx().universal_dividend().transfer_ud(dest.into(), balance), - &PairSigner::new(data.keypair()), - BaseExtrinsicParamsBuilder::new(), + match (keep_alive, is_ud) { + (true, false) => { + submit_call_and_look_event::< + runtime::balances::events::Transfer, + StaticTxPayload<runtime::balances::calls::TransferKeepAlive>, + >( + data, + &runtime::tx() + .balances() + .transfer_keep_alive(dest.into(), balance), ) - .await?} else {data.client() - .tx() - .sign_and_submit_then_watch( + .await + } + (false, false) => { + submit_call_and_look_event::< + runtime::balances::events::Transfer, + StaticTxPayload<runtime::balances::calls::Transfer>, + >( + data, &runtime::tx().balances().transfer(dest.into(), balance), - &PairSigner::new(data.keypair()), - BaseExtrinsicParamsBuilder::new(), ) - .await?} - } else { - if is_ud {data.client() - .tx() - .sign_and_submit_then_watch( - &runtime::tx().universal_dividend().transfer_ud_keep_alive(dest.into(), balance), - &PairSigner::new(data.keypair()), - BaseExtrinsicParamsBuilder::new(), + .await + } + (true, true) => { + submit_call_and_look_event::< + runtime::balances::events::Transfer, + StaticTxPayload<runtime::universal_dividend::calls::TransferUdKeepAlive>, + >( + data, + &runtime::tx() + .universal_dividend() + .transfer_ud_keep_alive(dest.into(), balance), ) - .await?} else {data.client() - .tx() - .sign_and_submit_then_watch( - &runtime::tx().balances().transfer_keep_alive(dest.into(), balance), - &PairSigner::new(data.keypair()), - BaseExtrinsicParamsBuilder::new(), + .await + } + (false, true) => { + submit_call_and_look_event::< + runtime::balances::events::Transfer, + StaticTxPayload<runtime::universal_dividend::calls::TransferUd>, + >( + data, + &runtime::tx() + .universal_dividend() + .transfer_ud(dest.into(), balance), ) - .await?} - }; - - if data.args.no_wait { - return Ok(()); + .await + } } - let events = track_progress(progress).await?; - - if let Some(e) = events.find_first::<runtime::balances::events::Transfer>()? { - println!("{e:?}"); - } - Ok(()) } /// transfer balance to multiple target diff --git a/src/indexer.rs b/src/indexer.rs index 25473cb..51677d6 100644 --- a/src/indexer.rs +++ b/src/indexer.rs @@ -1,5 +1,4 @@ -use graphql_client::reqwest::post_graphql; -use graphql_client::GraphQLQuery; +use graphql_client::{reqwest::post_graphql, GraphQLQuery}; use crate::*; diff --git a/src/main.rs b/src/main.rs index b976245..e4c0b00 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,9 +15,11 @@ use keys::*; use runtime_config::*; use serde::Deserialize; use sp_core::{sr25519::Pair, Pair as _}; -use subxt::blocks::ExtrinsicEvents; -use subxt::events::StaticEvent; -use subxt::tx::{BaseExtrinsicParamsBuilder, PairSigner, TxPayload, TxStatus, StaticTxPayload}; +use subxt::{ + blocks::ExtrinsicEvents, + events::StaticEvent, + tx::{BaseExtrinsicParamsBuilder, PairSigner, StaticTxPayload, TxPayload, TxStatus}, +}; use utils::*; /// define command line arguments diff --git a/src/runtime_config.rs b/src/runtime_config.rs index e1c2a19..d62c5e1 100644 --- a/src/runtime_config.rs +++ b/src/runtime_config.rs @@ -14,7 +14,8 @@ pub type Client = subxt::OnlineClient<Runtime>; pub type AccountId = subxt::ext::sp_runtime::AccountId32; pub type TxProgress = subxt::tx::TxProgress<Runtime, Client>; pub type Balance = u64; -pub type AccountData = runtime::runtime_types::pallet_duniter_account::types::AccountData<Balance>; +pub type AccountData = + runtime::runtime_types::pallet_duniter_account::types::AccountData<Balance, u32>; pub type AccountInfo = runtime::runtime_types::frame_system::AccountInfo<u32, AccountData>; pub type Hash = sp_core::H256; -- GitLab