跳转到内容

Rust SDK:赞助交易

通常,执行交易的账户支付 Gas 费用。可以通过赞助交易,让另一账户承担这些费用。

在处理复杂智能合约时,这可用于从中心账户管理费用。

  1. 构建 the raw transaction, then wrap it with FeePayerRawTransaction.

    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());
  2. 由发送方和费用支付方同时签名。

    let signed_txn = sign_fee_payer_transaction(
    &fee_payer_txn,
    &sender,
    &[], // secondary signers
    &fee_payer,
    )?;
  3. 提交并等待交易。

    let result = aptos.submit_and_wait(&signed_txn, None).await?;
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::devnet())?;
let sender = Ed25519Account::generate();
let recipient = Ed25519Account::generate();
let fee_payer = Ed25519Account::generate();
aptos
.fund_account(fee_payer.address(), 1_000_000_000)
.await?;
aptos.fund_account(sender.address(), 10_000_000).await?;
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)?;
let result = aptos.submit_and_wait(&signed_txn, None).await?;
println!("Submitted: {:?}", result.data.get("hash"));
Ok(())
}