Skip to content
Snippets Groups Projects
Commit 2f1fd210 authored by Hugo Trentesaux's avatar Hugo Trentesaux Committed by Hugo Trentesaux
Browse files

move identity commands to subcommand

parent 24978eb6
No related branches found
No related tags found
1 merge request!7Big refacto
......@@ -42,9 +42,9 @@ gcli --network gdev config save
# get duniter current block
gcli current-block
# get balance of test1 account
gcli --address 5FeggKqw2AbnGZF9Y9WPM2QTgzENS3Hit94Ewgmzdg5a3LNa get-balance
gcli --address 5FeggKqw2AbnGZF9Y9WPM2QTgzENS3Hit94Ewgmzdg5a3LNa balance
# get information about test1 identity (needs indexer)
gcli identity --username test1
gcli identity get --username test1
# show address of given secret
gcli --secret "pipe paddle ketchup filter life ice feel embody glide quantum ride usage"//2 show-address
```
......
......@@ -4,6 +4,7 @@ use anyhow::Result;
use sp_core::{sr25519::Pair, H256};
use subxt::tx::{BaseExtrinsicParamsBuilder, PairSigner};
/// list technical committee members
pub async fn technical_committee_members(data: &Data) -> Result<()> {
let client = data.client();
let indexer = data.indexer.clone();
......@@ -50,6 +51,7 @@ pub async fn technical_committee_members(data: &Data) -> Result<()> {
Ok(())
}
/// list technical committee proposals
// TODO:
// * better formatting (format pubkeys to SS58 and add usernames)
// * display proposals indices
......@@ -79,6 +81,7 @@ pub async fn technical_committee_proposals(client: &Client) -> Result<()> {
Ok(())
}
/// submit vote to technical committee
pub async fn technical_committee_vote(
pair: Pair,
client: &Client,
......
......@@ -8,6 +8,71 @@ use crate::runtime::runtime_types::sp_runtime::MultiSignature;
use sp_core::{crypto::AccountId32, sr25519::Pair};
use std::str::FromStr;
/// define identity subcommands
#[derive(Clone, Default, Debug, clap::Parser)]
pub enum Subcommand {
/// show identity
#[default]
Show,
/// Fetch identity
Get {
#[clap(short = 'a', long = "address")]
account_id: Option<AccountId>,
#[clap(short = 'i', long = "identity")]
identity_id: Option<u32>,
#[clap(short = 'u', long = "username")]
username: Option<String>,
},
/// Create and certify an identity
///
/// Caller must be member, and the target account must exist.
Create { target: AccountId },
/// Confirm an identity
///
/// To be called by the certified not-yet-member account, to become member.
Confirm { name: String },
/// Revoke an identity immediately
Revoke,
}
/// handle identity commands
pub async fn handle_command(data: Data, command: Subcommand) -> anyhow::Result<()> {
let mut data = data.build_client().await?.build_indexer().await?;
match command {
Subcommand::Show => {}
Subcommand::Get {
ref account_id,
identity_id,
ref username,
} => {
commands::identity::get_identity(
&data,
account_id.clone(),
identity_id,
username.clone(),
)
.await?
}
Subcommand::Create { target } => {
data = data.build_keypair();
commands::identity::create_identity(data.keypair(), data.client(), target).await?;
}
Subcommand::Confirm { name } => {
data = data.build_keypair();
commands::identity::confirm_identity(data.keypair(), data.client(), name).await?;
}
Subcommand::Revoke => {
data = data.build_keypair().fetch_idty_index().await?;
commands::identity::revoke_identity(data).await?;
}
};
Ok(())
}
// ======================
/// get identity
pub async fn get_identity(
data: &Data,
mut account_id: Option<AccountId32>,
......@@ -63,11 +128,12 @@ pub async fn get_identity(
if let (Some(indexer), Some(account_id), None) = (&indexer, &account_id, &username) {
username = indexer.username_by_pubkey(&account_id.to_string()).await?;
}
println!("Username: {}", username.unwrap_or_default());
println!("Username: {}", username.unwrap_or("<no indexer>".to_string()));
Ok(())
}
/// get identity index by account id
pub async fn get_idty_index_by_account_id(
client: &Client,
account_id: &AccountId32,
......@@ -81,6 +147,7 @@ pub async fn get_idty_index_by_account_id(
.await?)
}
/// get identityt value by index
pub async fn get_identity_by_index(
client: &Client,
idty_index: u32,
......@@ -91,6 +158,7 @@ pub async fn get_identity_by_index(
.await?)
}
/// created identity
pub async fn create_identity(
pair: Pair,
client: &Client,
......@@ -112,6 +180,7 @@ pub async fn create_identity(
Ok(())
}
/// confirm identity
pub async fn confirm_identity(
pair: Pair,
client: &Client,
......
......@@ -3,6 +3,7 @@ use crate::*;
use sp_core::{crypto::AccountId32, sr25519::Pair};
use subxt::tx::{BaseExtrinsicParamsBuilder, PairSigner};
/// set sudo key
pub async fn set_key(
pair: Pair,
client: &Client,
......
......@@ -108,32 +108,22 @@ impl Indexer {
}
}
/// define indexer subcommands
#[derive(Clone, Default, Debug, clap::Parser)]
pub enum Subcommand {
#[default]
/// Show indexer endpoint
ShowEndpoint,
/// Fetch latest indexed block
LatestBlock,
/// Check that indexer and node are on the same network (same genesis hash)
Check,
/// Fetch latest indexed block
LatestBlock,
}
/// handle indexer commands
pub async fn handle_command(data: Data, command: Subcommand) -> anyhow::Result<()> {
// build indexer because it is needed for all subcommands
let mut data = data.build_indexer().await?;
// match subcommand
match command {
Subcommand::ShowEndpoint => {
println!("indexer endpoint: {}", data.indexer().gql_url);
}
Subcommand::LatestBlock => {
println!(
"latest block indexed by {} is: {}",
data.cfg.indexer_endpoint,
data.indexer().fetch_latest_block().await?
);
}
Subcommand::Check => {
data = data.build_client().await?;
if data.genesis_hash == data.indexer_genesis_hash {
......@@ -153,6 +143,13 @@ pub async fn handle_command(data: Data, command: Subcommand) -> anyhow::Result<(
);
}
}
Subcommand::LatestBlock => {
println!(
"latest block indexed by {} is: {}",
data.cfg.indexer_endpoint,
data.indexer().fetch_latest_block().await?
);
}
};
Ok(())
......
......@@ -157,36 +157,13 @@ impl From<anyhow::Error> for GcliError {
#[derive(Clone, Debug, clap::Subcommand, Default)]
pub enum Subcommand {
/// Fetch account balance TODO also oneshot account
/// Fetch account balance
#[default]
GetBalance,
Balance,
/// Show address corresponding to given arguments
ShowAddress,
/// Fetch identity
Identity {
#[clap(short = 'p', long = "pubkey")]
account_id: Option<AccountId>,
#[clap(short = 'i', long = "identity")]
identity_id: Option<u32>,
#[clap(short = 'u', long = "username")]
username: Option<String>,
},
/// Create and certify an identity
///
/// Caller must be member, and the target account must exist.
CreateIdentity {
target: AccountId,
},
/// Confirm an identity
///
/// To be called by the certified not-yet-member account, to become member.
ConfirmIdentity {
name: String,
},
/// Generate a revocation document for the provided account
GenRevocDoc,
/// Revoke an identity immediately
RevokeIdentity,
/// List upcoming expirations that require an action
Expire {
/// Show certs that expire within less than this number of blocks
......@@ -255,6 +232,9 @@ pub enum Subcommand {
RuntimeInfo,
/// Check current block
CurrentBlock,
/// Indentity subcommands
#[clap(subcommand)]
Identity(commands::identity::Subcommand),
/// Oneshot account subcommands
#[clap(subcommand)]
Oneshot(commands::oneshot::Subcommand),
......@@ -279,7 +259,7 @@ async fn main() -> Result<(), GcliError> {
let mut data = Data::new(args.clone());
match args.subcommand {
Subcommand::GetBalance => {
Subcommand::Balance => {
data = data
.build_address()
.build_client()
......@@ -292,41 +272,10 @@ async fn main() -> Result<(), GcliError> {
data = data.build_address();
println!("address is: {}", data.address());
}
Subcommand::CreateIdentity { target } => {
data = data.build_client().await?.build_keypair();
commands::identity::create_identity(data.keypair(), data.client(), target).await?;
}
Subcommand::ConfirmIdentity { name } => {
data = data.build_client().await?.build_keypair();
commands::identity::confirm_identity(data.keypair(), data.client(), name).await?;
}
Subcommand::RevokeIdentity => {
data = data
.build_client()
.await?
.build_keypair()
.fetch_idty_index()
.await?;
commands::identity::revoke_identity(data).await?;
}
Subcommand::Expire { blocks, sessions } => {
data = data.build_client().await?;
commands::expire::monitor_expirations(&data, blocks, sessions).await?
}
Subcommand::Identity {
ref account_id,
identity_id,
ref username,
} => {
data = data.build_client().await?;
commands::identity::get_identity(
&data,
account_id.clone(),
identity_id,
username.clone(),
)
.await?
}
Subcommand::GenRevocDoc => {
data = data
.build_client()
......@@ -520,6 +469,7 @@ async fn main() -> Result<(), GcliError> {
.unwrap()
);
}
Subcommand::Identity(subcommand) => commands::identity::handle_command(data, subcommand).await?,
Subcommand::Oneshot(subcommand) => {
commands::oneshot::handle_command(data, subcommand).await?
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment