use anyhow::Context;
use clap::AppSettings;
use concordium_rust_sdk::{
common::types::{Amount, TransactionTime},
types::{
transactions::{send, BlockItem},
WalletAccount,
},
v2::{self},
};
use std::path::PathBuf;
use structopt::*;
#[derive(StructOpt)]
struct App {
#[structopt(
long = "node",
help = "GRPC interface of the node.",
default_value = "http://localhost:20000"
)]
endpoint: v2::Endpoint,
#[structopt(long = "account", help = "Path to the account key file.")]
keys_path: PathBuf,
}
#[tokio::main(flavor = "multi_thread")]
async fn main() -> anyhow::Result<()> {
let app = {
let app = App::clap().global_setting(AppSettings::ColoredHelp);
let matches = app.get_matches();
App::from_clap(&matches)
};
let mut client = v2::Client::new(app.endpoint).await?;
let keys: WalletAccount =
WalletAccount::from_json_file(app.keys_path).context("Could not read the keys file.")?;
let nonce = client
.get_next_account_sequence_number(&keys.address)
.await?;
let nonce = nonce.nonce;
let expiry: TransactionTime =
TransactionTime::from_seconds((chrono::Utc::now().timestamp() + 300) as u64);
let tx = send::transfer(
&keys,
keys.address,
nonce,
expiry,
keys.address, Amount::from_micro_ccd(1), );
let item = BlockItem::AccountTransaction(tx);
let transaction_hash = client.send_block_item(&item).await?;
println!(
"Transaction {} submitted (nonce = {}).",
transaction_hash, nonce,
);
let (bh, bs) = client.wait_until_finalized(&transaction_hash).await?;
println!("Transaction finalized in block {}.", bh);
println!("The outcome is {:#?}", bs);
Ok(())
}