use algonaut::Algod;
use algonaut::atomic::AtomicGroupBuilder;
use algonaut::core::AppId;
use algonaut::transaction::Signer;
use algonaut::transaction::account::Account;
use dotenv::dotenv;
use std::env;
use std::error::Error;
use std::sync::Arc;
#[macro_use]
extern crate log;
algonaut::contract!("tests/fixtures/calculator.json");
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
dotenv().ok();
env_logger::init();
info!("creating algod client");
let algod = Algod::new(&env::var("ALGOD_URL")?, &env::var("ALGOD_TOKEN")?)?;
info!("creating account for alice");
let alice = Account::from_mnemonic(&env::var("ALICE_MNEMONIC")?)?;
let signer: Arc<dyn Signer> = Arc::new(alice.clone());
info!("retrieving suggested params");
let params = algod.suggested_params().await?;
info!("creating calculator client");
let calculator = Calculator::new(AppId(123), alice.address(), Arc::clone(&signer));
info!("building add(2, 3) method call");
let add_call = calculator.add(2u64, 3u64).build(¶ms);
info!("building subtract(10, 4) method call");
let subtract_call = Calculator::new(AppId(123), alice.address(), Arc::clone(&signer))
.subtract(10u64, 4u64)
.build(¶ms);
info!("composing and executing atomic group");
let result = AtomicGroupBuilder::new()
.add_method_call(add_call)
.add_method_call(subtract_call)
.build()?
.sign()
.await?
.execute(&algod)
.await?;
info!("confirmed in round {:?}", result.confirmed_round);
for (i, r) in result.method_results.iter().enumerate() {
info!("method {} return: {:?}", i, r.return_value);
}
Ok(())
}