use sui_sdk::SuiClientBuilder;
use sui_types::transaction::{
TransactionData, Transaction, Command, Argument, CallArg,
};
use sui_types::programmable_transaction_builder::ProgrammableTransactionBuilder;
use sui_types::base_types::SuiAddress;
use sui_types::crypto::{SuiKeyPair, Signature};
use std::str::FromStr;
#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
let sui = SuiClientBuilder::default().build_mainnet().await?;
let sender = SuiAddress::from_str("0x...")?;
let recipient = SuiAddress::from_str("0x...")?;
let amount = 1_000_000_000u64; // 1 SUI
// Get gas price
let gas_price = sui.read_api().get_reference_gas_price().await?;
let gas_budget = 10_000_000; // 0.01 SUI
// Select gas coin
let gas_coins = sui.coin_read_api()
.select_coins(sender, None, gas_budget + amount, vec![])
.await?;
let gas_coin = gas_coins.first().unwrap();
let gas_payment = (gas_coin.coin_object_id, gas_coin.version, gas_coin.digest);
// Build programmable transaction
let mut ptb = ProgrammableTransactionBuilder::new();
// Split coin
let coin_arg = Argument::GasCoin;
let amount_arg = ptb.pure(amount)?;
let split_coin = ptb.command(Command::SplitCoins(coin_arg, vec![amount_arg]));
// Transfer
let recipient_arg = ptb.pure(recipient)?;
ptb.command(Command::TransferObjects(vec![split_coin], recipient_arg));
let pt = ptb.finish();
// Create transaction data
let tx_data = TransactionData::new_programmable(
sender,
vec![gas_payment],
pt,
gas_budget,
gas_price,
);
// Sign transaction
let keypair: SuiKeyPair = /* load your keypair */;
let signature = Signature::new_secure(
&IntentMessage::new(Intent::sui_transaction(), tx_data.clone()),
&keypair
);
let signed_tx = Transaction::from_data(tx_data, vec![signature]);
// Execute
let response = sui.quorum_driver_api()
.execute_transaction_block(
signed_tx,
SuiTransactionBlockResponseOptions::default()
.with_effects()
.with_events(),
None
)
.await?;
println!("Transaction executed: {}", response.digest);
Ok(())
}