use aptos_sdk::{
Aptos, AptosConfig,
account::Ed25519Account,
transaction::{
EntryFunction, TransactionBuilder, builder::sign_fee_payer_transaction,
types::FeePayerRawTransaction,
},
};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let aptos = Aptos::new(AptosConfig::testnet())?;
println!("Connected to testnet");
let sender = Ed25519Account::generate();
let recipient = Ed25519Account::generate();
let fee_payer = Ed25519Account::generate();
println!("Sender: {}", sender.address());
println!("Recipient: {}", recipient.address());
println!("Fee payer: {}", fee_payer.address());
println!("\nFunding fee payer account...");
aptos.fund_account(fee_payer.address(), 100_000_000).await?;
println!("Funding sender account...");
aptos.fund_account(sender.address(), 10_000_000).await?;
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
let sender_balance = aptos.get_balance(sender.address()).await?;
let fee_payer_balance = aptos.get_balance(fee_payer.address()).await?;
println!("\nInitial balances:");
println!(" Sender: {} APT", sender_balance as f64 / 100_000_000.0);
println!(
" Fee payer: {} APT",
fee_payer_balance as f64 / 100_000_000.0
);
let payload = EntryFunction::apt_transfer(recipient.address(), 5_000_000)?;
let sequence_number = aptos.get_sequence_number(sender.address()).await?;
let raw_txn = TransactionBuilder::new()
.sender(sender.address())
.sequence_number(sequence_number)
.payload(payload.into())
.chain_id(aptos.chain_id())
.expiration_from_now(600)
.build()?;
let fee_payer_txn = FeePayerRawTransaction::new_simple(raw_txn, fee_payer.address());
let signed_txn = sign_fee_payer_transaction(
&fee_payer_txn,
&sender,
&[], &fee_payer,
)?;
println!("\nSubmitting sponsored transaction...");
let result = aptos.submit_and_wait(&signed_txn, None).await?;
let success = result.data.get("success").and_then(|v| v.as_bool());
if success == Some(true) {
println!("Transaction successful!");
let sender_balance = aptos.get_balance(sender.address()).await?;
let recipient_balance = aptos.get_balance(recipient.address()).await?;
let fee_payer_balance = aptos.get_balance(fee_payer.address()).await?;
println!("\nFinal balances:");
println!(" Sender: {} APT", sender_balance as f64 / 100_000_000.0);
println!(
" Recipient: {} APT",
recipient_balance as f64 / 100_000_000.0
);
println!(
" Fee payer: {} APT (paid gas fees)",
fee_payer_balance as f64 / 100_000_000.0
);
} else {
let vm_status = result
.data
.get("vm_status")
.and_then(|v| v.as_str())
.unwrap_or("unknown");
println!("Transaction failed: {}", vm_status);
}
Ok(())
}