Python SDK - Sponsoring Transactions
Normally, the account that is executing a transaction pays for the gas fees. You can allow another account to cover those charges by sponsoring a transaction.
This can be used to help manage fees from a central account when working with complicated smart contracts.
How To Sponsor a Transaction
Section titled “How To Sponsor a Transaction”-
Build a raw transaction for the sender, then wrap it in
FeePayerRawTransaction.raw_txn = await aptos.transaction.build(sender=alice.address,payload=TransactionPayload(payload),)fee_payer_txn = FeePayerRawTransaction(raw_txn, secondary_signers=[], fee_payer=sponsor.address) -
Sign the fee-payer transaction with BOTH the sender and the fee payer.
alice_auth = fee_payer_txn.sign(alice.private_key)sponsor_auth = fee_payer_txn.sign(sponsor.private_key) -
Combine the signatures into a
FeePayerAuthenticatorand submit.authenticator = Authenticator(FeePayerAuthenticator(sender=alice_auth,secondary_signers=[],fee_payer=(sponsor.address, sponsor_auth),))txn_hash = await aptos.transaction.submit(SignedTransaction(raw_txn, authenticator)) -
Wait for the transaction to execute.
result = await aptos.transaction.wait_for_transaction(txn_hash)
Python Sponsored Transaction Code Sample
Section titled “Python Sponsored Transaction Code Sample”import asyncio
from aptos_sdk.v2 import Account, Aptos, AptosConfig, Networkfrom aptos_sdk.v2.bcs import Serializerfrom aptos_sdk.v2.transactions import ( Authenticator, EntryFunction, FeePayerAuthenticator, FeePayerRawTransaction, SignedTransaction, TransactionArgument, TransactionPayload,)from aptos_sdk.v2.types import StructTag, TypeTag
async def main(): async with Aptos(AptosConfig(network=Network.DEVNET)) as aptos: alice = Account.generate() bob = Account.generate() sponsor = Account.generate()
await asyncio.gather( aptos.faucet.fund_account(alice.address, 100_000_000), aptos.faucet.fund_account(bob.address, 10_000_000), aptos.faucet.fund_account(sponsor.address, 100_000_000), )
payload = EntryFunction.natural( "0x1::coin", "transfer", [TypeTag(StructTag.from_str("0x1::aptos_coin::AptosCoin"))], [ TransactionArgument(bob.address, Serializer.struct), TransactionArgument(10_000, Serializer.u64), ], ) raw_txn = await aptos.transaction.build( sender=alice.address, payload=TransactionPayload(payload), ) fee_payer_txn = FeePayerRawTransaction( raw_txn, secondary_signers=[], fee_payer=sponsor.address )
alice_auth = fee_payer_txn.sign(alice.private_key) sponsor_auth = fee_payer_txn.sign(sponsor.private_key) authenticator = Authenticator( FeePayerAuthenticator( sender=alice_auth, secondary_signers=[], fee_payer=(sponsor.address, sponsor_auth), ) )
txn_hash = await aptos.transaction.submit(SignedTransaction(raw_txn, authenticator)) result = await aptos.transaction.wait_for_transaction(txn_hash) print(f"Success: {result['success']}") print(f"Gas used: {result['gas_used']}")
asyncio.run(main())