use iota_sdk::{
client::{
api::GetAddressesOptions, node_api::indexer::query_parameters::QueryParameter, request_funds_from_faucet,
secret::SecretManager, Client, Result,
},
types::block::input::UtxoInput,
};
#[tokio::main]
async fn main() -> Result<()> {
dotenvy::dotenv().ok();
for var in ["NODE_URL", "EXPLORER_URL", "FAUCET_URL", "MNEMONIC"] {
std::env::var(var).expect(&format!(".env variable '{var}' is undefined, see .env.example"));
}
let node_url = std::env::var("NODE_URL").unwrap();
let faucet_url = std::env::var("FAUCET_URL").unwrap();
let amount = std::env::args()
.nth(1)
.map(|s| s.parse::<u64>().unwrap())
.unwrap_or(1_000_000u64);
let client = Client::builder().with_node(&node_url)?.finish().await?;
let secret_manager = SecretManager::try_from_mnemonic(std::env::var("MNEMONIC").unwrap())?;
let first_address = secret_manager
.generate_ed25519_addresses(GetAddressesOptions::from_client(&client).await?.with_range(0..1))
.await?[0];
println!("1st address: {first_address:#?}");
println!(
"Requesting funds (waiting 15s): {}",
request_funds_from_faucet(&faucet_url, &first_address).await?
);
tokio::time::sleep(std::time::Duration::from_secs(15)).await;
let output_ids_response = client
.basic_output_ids([QueryParameter::Address(first_address)])
.await?;
println!("{output_ids_response:?}");
let recv_address = std::env::args()
.nth(2)
.map(|s| s.parse().unwrap())
.unwrap_or(first_address);
let block = client
.build_block()
.with_secret_manager(&secret_manager)
.with_input(UtxoInput::from(output_ids_response.items[0]))?
.with_output(recv_address, amount)
.await?
.finish()
.await?;
println!("{block:#?}");
println!(
"Block with custom inputs sent: {}/block/{}",
std::env::var("EXPLORER_URL").unwrap(),
block.id()
);
Ok(())
}