async sponsoredTxn(args: {
data: TransactionPayload | SupraPayload
senderAddress?: string
senderAuth?: TxnBuilderTypes.AccountAuthenticatorEd25519
transaction?: TxnBuilderTypes.RawTransaction
options?: TransactionOptions
}): Promise<PendingTransactionResponse | PendingTransactionResponseForSupra> {
try {
if (this.wallet === undefined) {
throw new Error('No wallet')
}
let rawTransactionBytes: Uint8Array
let committedTxn: TransactionResponse | PendingTransactionResponse
let senderAuth: AccountAuthenticator | TxnBuilderTypes.AccountAuthenticatorEd25519
let transaction: SimpleTransaction
if (this.chain === chainName.Supra) {
rawTransactionBytes = BCS.bcsToBytes(args.transaction)
} else {
transaction = await this.aptosClient.transaction.build.simple({
sender: this.wallet.accountAddress.toString(),
data: args.data as TransactionPayload,
options: args.options,
withFeePayer: true,
})
senderAuth = this.aptosClient.transaction.sign({
signer: this.wallet,
transaction,
})
rawTransactionBytes = transaction.rawTransaction.bcsToBytes()
}
const url = `${this.baseUrl}/sponsorGas`
const headers = this.getCommonHeaders()
const response = await fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify({ data: rawTransactionBytes }),
})
if (response.status >= 400) {
await response.json().then((data) => {
throw new Error(data?.error || data?.message || 'Error in sponsoring transaction.')
})
}
const responseData = await response.json()
const feePayerAddress = responseData.feePayerAddress
const feepayerSignature = new Uint8Array(Object.values(responseData.feePayerAuth))
if (this.chain === chainName.Supra) {
const deserializerFeePayer = new BCS.Deserializer(feepayerSignature)
const feepayerAuth = TxnBuilderTypes.AccountAuthenticatorEd25519.deserialize(
deserializerFeePayer,
) as TxnBuilderTypes.AccountAuthenticatorEd25519
committedTxn = await this.SupraClient.sendSponsorTransaction(
args.senderAddress,
feePayerAddress,
[],
args.transaction,
args.senderAuth,
feepayerAuth,
[],
{
enableWaitForTransaction: true,
enableTransactionSimulation: true,
},
)
} else {
const deserializerFeePayer: any = new Deserializer(feepayerSignature)
const feepayerAuth = AccountAuthenticator.deserialize(deserializerFeePayer)
committedTxn = await this.aptosClient.transaction.submit.simple({
transaction: {
rawTransaction: transaction.rawTransaction as any,
feePayerAddress: AccountAddress.fromString(feePayerAddress),
} as AnyRawTransaction,
senderAuthenticator: senderAuth as AccountAuthenticator,
feePayerAuthenticator: feepayerAuth as AccountAuthenticator,
})
}
return committedTxn
} catch (error: any) {
throw error?.response?.data || error
}
}