use kadena::crypto::PactKeypair;
use kadena::fetch::{ApiClient, ApiConfig};
use kadena::pact::{cap::Cap, command::Cmd, meta::Meta};
use log::info;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init();
info!("Starting transfer transaction example");
let keypair = PactKeypair::generate();
let sender_account = format!("k:{}", keypair.public_key);
let network = "testnet04";
let chain_id = "0";
let meta = Meta::new(chain_id, &sender_account)
.with_gas_limit(1500)
.with_gas_price(0.00000001)
.with_ttl(3600);
let caps = vec![
Cap::new("coin.GAS"), Cap::transfer(&sender_account, "Bob", 10.0), ];
let pact_code = format!("(coin.transfer \"{}\" \"Bob\" 10.0)", sender_account);
let transaction_cmd = Cmd::prepare_exec(
&[(&keypair, caps)],
None, &pact_code,
None,
meta,
Some(network.to_string()),
)?;
println!("Transaction Payload:");
println!("{}", serde_json::to_string_pretty(&transaction_cmd)?);
let client = ApiClient::new(
ApiConfig::new("https://api.testnet.chainweb.com", network, chain_id).with_timeout(60),
);
let result = client.local(&transaction_cmd).await?;
println!("\nTransaction Response:");
println!("{}", serde_json::to_string_pretty(&result)?);
Ok(())
}