Skip to content
Snippets Groups Projects
Commit 3d21841c authored by Hugo Trentesaux's avatar Hugo Trentesaux
Browse files

submit tx without waiting for result

parent 51217f7d
No related branches found
No related tags found
1 merge request!9add smith and membership commands
{
"rust-analyzer.server.extraEnv": null,
"windicss.includeLanguages": {}
}
\ No newline at end of file
...@@ -15,7 +15,8 @@ gcli config where ...@@ -15,7 +15,8 @@ gcli config where
gcli --network gdev config save gcli --network gdev config save
# save config to use Alice predefined secret # save config to use Alice predefined secret
gcli -S predefined -s Alice config save gcli -S predefined -s Alice config save
# these can be combined # the arguments above can be combined
# command below sets local network and predefined secret
gcli --network local -S predefined -s test1 config save gcli --network local -S predefined -s test1 config save
``` ```
...@@ -23,6 +24,8 @@ In the following, we assume this last command was run. ...@@ -23,6 +24,8 @@ In the following, we assume this last command was run.
## Commands ## Commands
Here is a list of useful commands
```sh ```sh
# get duniter current block # get duniter current block
gcli blockchain current-block gcli blockchain current-block
...@@ -38,6 +41,13 @@ gcli ud claim ...@@ -38,6 +41,13 @@ gcli ud claim
gcli account transfer 5000 5E4i8vcNjnrDp21Sbnp32WHm2gz8YP3GGFwmdpfg5bHd8Whb gcli account transfer 5000 5E4i8vcNjnrDp21Sbnp32WHm2gz8YP3GGFwmdpfg5bHd8Whb
``` ```
If you want to submit extrinsics without tracking progress:
```sh
# only submit extrinsic to network and do not listen to result
gcli --no-wait account transfer 1234 5FeggKqw2AbnGZF9Y9WPM2QTgzENS3Hit94Ewgmzdg5a3LNa
```
## Indexer commands ## Indexer commands
You can check first that indexer is on the same network as Duniter node: You can check first that indexer is on the same network as Duniter node:
......
...@@ -6,14 +6,15 @@ pub async fn certify(data: &Data, receiver: u32) -> Result<(), anyhow::Error> { ...@@ -6,14 +6,15 @@ pub async fn certify(data: &Data, receiver: u32) -> Result<(), anyhow::Error> {
.client() .client()
.tx() .tx()
.sign_and_submit_then_watch( .sign_and_submit_then_watch(
&runtime::tx() &runtime::tx().cert().add_cert(data.idty_index(), receiver),
.cert()
.add_cert(data.idty_index(), receiver),
&PairSigner::new(data.keypair()), &PairSigner::new(data.keypair()),
BaseExtrinsicParamsBuilder::new(), BaseExtrinsicParamsBuilder::new(),
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
// look for the expected event // look for the expected event
......
...@@ -147,6 +147,9 @@ pub async fn technical_committee_vote( ...@@ -147,6 +147,9 @@ pub async fn technical_committee_vote(
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
if let Some(e) = events.find_first::<runtime::technical_committee::events::Voted>()? { if let Some(e) = events.find_first::<runtime::technical_committee::events::Voted>()? {
......
...@@ -58,10 +58,10 @@ pub async fn handle_command(data: Data, command: Subcommand) -> anyhow::Result<( ...@@ -58,10 +58,10 @@ pub async fn handle_command(data: Data, command: Subcommand) -> anyhow::Result<(
.await? .await?
} }
Subcommand::Create { target } => { Subcommand::Create { target } => {
commands::identity::create_identity(data.keypair(), data.client(), target).await?; commands::identity::create_identity(&data, target).await?;
} }
Subcommand::Confirm { name } => { Subcommand::Confirm { name } => {
commands::identity::confirm_identity(data.keypair(), data.client(), name).await?; commands::identity::confirm_identity(&data, name).await?;
} }
Subcommand::Certify { target } => { Subcommand::Certify { target } => {
data = data.fetch_idty_index().await?; data = data.fetch_idty_index().await?;
...@@ -174,20 +174,20 @@ pub async fn get_identity_by_index( ...@@ -174,20 +174,20 @@ pub async fn get_identity_by_index(
} }
/// created identity /// created identity
pub async fn create_identity( pub async fn create_identity(data: &Data, target: AccountId) -> Result<(), subxt::Error> {
pair: Pair, let progress = data
client: &Client, .client()
target: AccountId,
) -> Result<(), subxt::Error> {
let progress = client
.tx() .tx()
.sign_and_submit_then_watch( .sign_and_submit_then_watch(
&runtime::tx().identity().create_identity(target), &runtime::tx().identity().create_identity(target),
&PairSigner::new(pair), &PairSigner::new(data.keypair()),
BaseExtrinsicParamsBuilder::new(), BaseExtrinsicParamsBuilder::new(),
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
if let Some(e) = events.find_first::<runtime::identity::events::IdtyCreated>()? { if let Some(e) = events.find_first::<runtime::identity::events::IdtyCreated>()? {
println!("{e:?}"); println!("{e:?}");
...@@ -196,20 +196,20 @@ pub async fn create_identity( ...@@ -196,20 +196,20 @@ pub async fn create_identity(
} }
/// confirm identity /// confirm identity
pub async fn confirm_identity( pub async fn confirm_identity(data: &Data, name: String) -> Result<(), subxt::Error> {
pair: Pair, let progress = data
client: &Client, .client()
name: String,
) -> Result<(), subxt::Error> {
let progress = client
.tx() .tx()
.sign_and_submit_then_watch( .sign_and_submit_then_watch(
&runtime::tx().identity().confirm_identity(name), &runtime::tx().identity().confirm_identity(name),
&PairSigner::new(pair), &PairSigner::new(data.keypair()),
BaseExtrinsicParamsBuilder::new(), BaseExtrinsicParamsBuilder::new(),
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
if let Some(e) = events.find_first::<runtime::identity::events::IdtyConfirmed>()? { if let Some(e) = events.find_first::<runtime::identity::events::IdtyConfirmed>()? {
println!("{e:?}"); println!("{e:?}");
...@@ -238,6 +238,9 @@ pub async fn revoke_identity(data: Data) -> Result<(), subxt::Error> { ...@@ -238,6 +238,9 @@ pub async fn revoke_identity(data: Data) -> Result<(), subxt::Error> {
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
if let Some(e) = events.find_first::<runtime::identity::events::IdtyRemoved>()? { if let Some(e) = events.find_first::<runtime::identity::events::IdtyRemoved>()? {
println!("{e:?}"); println!("{e:?}");
......
...@@ -102,6 +102,9 @@ pub async fn create_oneshot_account( ...@@ -102,6 +102,9 @@ pub async fn create_oneshot_account(
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
if let Some(e) = if let Some(e) =
events.find_first::<runtime::oneshot_account::events::OneshotAccountCreated>()? events.find_first::<runtime::oneshot_account::events::OneshotAccountCreated>()?
...@@ -145,6 +148,9 @@ pub async fn consume_oneshot_account( ...@@ -145,6 +148,9 @@ pub async fn consume_oneshot_account(
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
if let Some(e) = if let Some(e) =
events.find_first::<runtime::oneshot_account::events::OneshotAccountConsumed>()? events.find_first::<runtime::oneshot_account::events::OneshotAccountConsumed>()?
...@@ -157,7 +163,6 @@ pub async fn consume_oneshot_account( ...@@ -157,7 +163,6 @@ pub async fn consume_oneshot_account(
/// consume oneshot account with remaining /// consume oneshot account with remaining
pub async fn consume_oneshot_account_with_remaining( pub async fn consume_oneshot_account_with_remaining(
data: &Data, data: &Data,
balance: u64, balance: u64,
dest: AccountId, dest: AccountId,
dest_oneshot: bool, dest_oneshot: bool,
...@@ -203,6 +208,9 @@ pub async fn consume_oneshot_account_with_remaining( ...@@ -203,6 +208,9 @@ pub async fn consume_oneshot_account_with_remaining(
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
if let Some(e) = if let Some(e) =
events.find_first::<runtime::oneshot_account::events::OneshotAccountConsumed>()? events.find_first::<runtime::oneshot_account::events::OneshotAccountConsumed>()?
......
...@@ -58,7 +58,7 @@ pub async fn handle_command(data: Data, command: Subcommand) -> anyhow::Result<( ...@@ -58,7 +58,7 @@ pub async fn handle_command(data: Data, command: Subcommand) -> anyhow::Result<(
} }
Subcommand::SudoSetKey { new_key } => { Subcommand::SudoSetKey { new_key } => {
data = data.build_client().await?; data = data.build_client().await?;
commands::sudo::set_key(data.keypair(), data.client(), new_key).await?; commands::sudo::set_key(&data, new_key).await?;
} }
Subcommand::ShowExpire { blocks, sessions } => { Subcommand::ShowExpire { blocks, sessions } => {
data = data.build_client().await?.build_indexer().await?; data = data.build_client().await?.build_indexer().await?;
...@@ -104,6 +104,10 @@ pub async fn request_smith_membership(data: &Data, endpoint: String) -> Result<( ...@@ -104,6 +104,10 @@ pub async fn request_smith_membership(data: &Data, endpoint: String) -> Result<(
BaseExtrinsicParamsBuilder::new(), BaseExtrinsicParamsBuilder::new(),
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
let request = events.find_first::<runtime::smith_membership::events::MembershipRequested>()?; let request = events.find_first::<runtime::smith_membership::events::MembershipRequested>()?;
if let Some(event) = request { if let Some(event) = request {
...@@ -134,6 +138,9 @@ pub async fn update_session_keys(data: &Data) -> Result<(), GcliError> { ...@@ -134,6 +138,9 @@ pub async fn update_session_keys(data: &Data) -> Result<(), GcliError> {
let session_keys = rotate_keys(data.client()).await?; let session_keys = rotate_keys(data.client()).await?;
let progress = set_session_keys(data, session_keys).await?; let progress = set_session_keys(data, session_keys).await?;
if data.args.no_wait {
return Ok(());
}
let _ = track_progress(progress).await?; // TODO let _ = track_progress(progress).await?; // TODO
Ok(()) Ok(())
} }
...@@ -165,6 +172,9 @@ pub async fn go_online(data: &Data) -> Result<(), GcliError> { ...@@ -165,6 +172,9 @@ pub async fn go_online(data: &Data) -> Result<(), GcliError> {
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
if let Some(e) = events.find_first::<runtime::authority_members::events::MemberGoOnline>()? { if let Some(e) = events.find_first::<runtime::authority_members::events::MemberGoOnline>()? {
println!("{e:?}"); println!("{e:?}");
...@@ -183,6 +193,10 @@ pub async fn go_offline(data: &Data) -> Result<(), subxt::Error> { ...@@ -183,6 +193,10 @@ pub async fn go_offline(data: &Data) -> Result<(), subxt::Error> {
BaseExtrinsicParamsBuilder::new(), BaseExtrinsicParamsBuilder::new(),
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
if let Some(e) = events.find_first::<runtime::authority_members::events::MemberGoOffline>()? { if let Some(e) = events.find_first::<runtime::authority_members::events::MemberGoOffline>()? {
println!("{e:?}"); println!("{e:?}");
...@@ -286,6 +300,9 @@ pub async fn cert(data: &Data, receiver: u32) -> Result<(), anyhow::Error> { ...@@ -286,6 +300,9 @@ pub async fn cert(data: &Data, receiver: u32) -> Result<(), anyhow::Error> {
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
// look for the expected event // look for the expected event
......
use crate::*; use crate::*;
/// set sudo key /// set sudo key
pub async fn set_key(pair: Pair, client: &Client, new_key: AccountId) -> Result<(), subxt::Error> { pub async fn set_key(data: &Data, new_key: AccountId) -> Result<(), subxt::Error> {
let progress = client let progress = data
.client()
.tx() .tx()
.sign_and_submit_then_watch( .sign_and_submit_then_watch(
&runtime::tx().sudo().set_key(new_key.into()), &runtime::tx().sudo().set_key(new_key.into()),
&PairSigner::new(pair), &PairSigner::new(data.keypair()),
BaseExtrinsicParamsBuilder::new(), BaseExtrinsicParamsBuilder::new(),
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let _ = track_progress(progress).await?; // TODO let _ = track_progress(progress).await?; // TODO
Ok(()) Ok(())
} }
...@@ -33,6 +33,9 @@ pub async fn transfer( ...@@ -33,6 +33,9 @@ pub async fn transfer(
.await? .await?
}; };
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
if let Some(e) = events.find_first::<runtime::balances::events::Transfer>()? { if let Some(e) = events.find_first::<runtime::balances::events::Transfer>()? {
...@@ -69,6 +72,9 @@ pub async fn transfer_multiple( ...@@ -69,6 +72,9 @@ pub async fn transfer_multiple(
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
// TODO all transfer // TODO all transfer
if let Some(e) = events.find_first::<runtime::balances::events::Transfer>()? { if let Some(e) = events.find_first::<runtime::balances::events::Transfer>()? {
......
...@@ -34,6 +34,9 @@ pub async fn claim_ud(data: Data) -> Result<(), anyhow::Error> { ...@@ -34,6 +34,9 @@ pub async fn claim_ud(data: Data) -> Result<(), anyhow::Error> {
) )
.await?; .await?;
if data.args.no_wait {
return Ok(());
}
let events = track_progress(progress).await?; let events = track_progress(progress).await?;
if let Some(e) = events.find_first::<runtime::universal_dividend::events::UdsClaimed>()? { if let Some(e) = events.find_first::<runtime::universal_dividend::events::UdsClaimed>()? {
......
...@@ -160,7 +160,7 @@ impl Data { ...@@ -160,7 +160,7 @@ impl Data {
"test3" => "6", "test3" => "6",
"test4" => "8", "test4" => "8",
"test5" => "10", "test5" => "10",
_ => "" _ => "",
}; };
self.cfg.secret = Some(format!("{TEST_MNEMONIC}//{derivation}")); self.cfg.secret = Some(format!("{TEST_MNEMONIC}//{derivation}"));
} else { } else {
...@@ -175,21 +175,17 @@ impl Data { ...@@ -175,21 +175,17 @@ impl Data {
// address // address
if let Some(address) = self.args.address.clone() { if let Some(address) = self.args.address.clone() {
self.cfg.address = Some(AccountId::from_str(&address).expect("invalid address")); self.cfg.address = Some(AccountId::from_str(&address).expect("invalid address"));
// if giving address, cancel secret
self.cfg.secret = None
} }
self self
} }
/// build from config /// build from config
pub fn build_from_config(mut self) -> Self { pub fn build_from_config(mut self) -> Self {
// if a secret is defined, build keypair // if a secret is defined, build keypair and silently overwrite address
if let Some(secret) = self.cfg.secret.clone() { if let Some(secret) = self.cfg.secret.clone() {
let (address, keypair) = let (address, keypair) =
addr_and_pair_from_secret(SecretFormat::Predefined, &secret).unwrap(); addr_and_pair_from_secret(SecretFormat::Predefined, &secret).unwrap();
// if an address is already defined and differs from secret, warns user
if let Some(address_) = self.cfg.address {
if address_ != address {
println!("overwriting address ({address_}) from secret ({address})");
}
}
self.cfg.address = Some(address); self.cfg.address = Some(address);
self.cfg.secret = Some(secret); self.cfg.secret = Some(secret);
self.keypair = Some(keypair); self.keypair = Some(keypair);
......
...@@ -48,6 +48,9 @@ pub struct Args { ...@@ -48,6 +48,9 @@ pub struct Args {
/// Target network (local, gdev, gtest...) /// Target network (local, gdev, gtest...)
#[clap(short, long)] #[clap(short, long)]
network: Option<String>, network: Option<String>,
/// prevent waiting for extrinsic completion
#[clap(long)]
no_wait: bool,
} }
/// define subcommands /// define subcommands
...@@ -97,7 +100,7 @@ async fn main() -> Result<(), GcliError> { ...@@ -97,7 +100,7 @@ async fn main() -> Result<(), GcliError> {
// match subcommands // match subcommands
match data.args.subcommand.clone() { match data.args.subcommand.clone() {
Subcommand::DoNothing => {Ok(())} Subcommand::DoNothing => Ok(()),
Subcommand::Account(subcommand) => { Subcommand::Account(subcommand) => {
commands::account::handle_command(data, subcommand).await commands::account::handle_command(data, subcommand).await
} }
...@@ -117,5 +120,6 @@ async fn main() -> Result<(), GcliError> { ...@@ -117,5 +120,6 @@ async fn main() -> Result<(), GcliError> {
} }
Subcommand::Indexer(subcommand) => indexer::handle_command(data, subcommand).await, Subcommand::Indexer(subcommand) => indexer::handle_command(data, subcommand).await,
Subcommand::Config(subcommand) => conf::handle_command(data, subcommand), Subcommand::Config(subcommand) => conf::handle_command(data, subcommand),
}.map_err(|e| dbg!(e).into()) }
.map_err(|e| dbg!(e).into())
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment