use aptos_sdk::transaction::{CollectionConfig, InputEntryFunctionData};
use aptos_sdk::types::AccountAddress;
use aptos_sdk::{Aptos, AptosConfig, account::Ed25519Account};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let aptos = Aptos::new(AptosConfig::devnet())?;
println!("Connected to devnet");
let creator = aptos.create_funded_account(100_000_000).await?;
println!("Creator: {}", creator.address());
let collection_name = "My Collection";
println!("Creating collection...");
let create = InputEntryFunctionData::create_collection(
"An example collection",
1000, collection_name,
"https://example.com/collection",
CollectionConfig::default(),
0, 100,
)?;
aptos.sign_submit_and_wait(&creator, create, None).await?;
println!("Minting a digital asset...");
let mint = InputEntryFunctionData::mint_digital_asset(
collection_name,
"A one-of-a-kind token",
"Token #1",
"https://example.com/token/1",
vec![],
vec![],
vec![],
)?;
let mint_result = aptos.sign_submit_and_wait(&creator, mint, None).await?;
let token_address = extract_minted_token_address(&mint_result.data)
.ok_or_else(|| anyhow::anyhow!("could not find minted token address in events"))?;
println!("Minted token object: {token_address}");
let recipient = Ed25519Account::generate();
println!("Transferring token to {}...", recipient.address());
aptos
.transfer_digital_asset(&creator, token_address, recipient.address())
.await?;
println!("Digital asset transferred!");
Ok(())
}
fn extract_minted_token_address(txn: &serde_json::Value) -> Option<AccountAddress> {
let events = txn.get("events")?.as_array()?;
for event in events {
if let Some(token) = event
.get("data")
.and_then(|d| d.get("token"))
.and_then(|t| t.as_str())
&& let Ok(addr) = AccountAddress::from_hex(token)
{
return Some(addr);
}
}
None
}