transferSplToken method

Future<TransactionId> transferSplToken({
  1. required Ed25519HDPublicKey mint,
  2. required Ed25519HDPublicKey destination,
  3. required int amount,
  4. required Wallet owner,
  5. String? memo,
  6. SignatureCallback? onSigned,
  7. Commitment commitment = Commitment.finalized,
})

Transfers amount SPL token with mint from this wallet to the destination address with an optional memo.

For commitment parameter description see this document Commitment.processed is not supported as commitment.

Implementation

Future<TransactionId> transferSplToken({
  required Ed25519HDPublicKey mint,
  required Ed25519HDPublicKey destination,
  required int amount,
  required Wallet owner,
  String? memo,
  SignatureCallback? onSigned,
  Commitment commitment = Commitment.finalized,
}) async {
  final associatedRecipientAccount = await getAssociatedTokenAccount(
    owner: destination,
    mint: mint,
    commitment: commitment,
  );
  final associatedSenderAccount = await getAssociatedTokenAccount(
    owner: owner.publicKey,
    mint: mint,
    commitment: commitment,
  );
  // Throw an appropriate exception if the sender has no associated
  // token account
  if (associatedSenderAccount == null) {
    throw NoAssociatedTokenAccountException(owner.address, mint.toBase58());
  }
  // Also throw an adequate exception if the recipient has no associated
  // token account
  if (associatedRecipientAccount == null) {
    throw NoAssociatedTokenAccountException(
      destination.toBase58(),
      mint.toBase58(),
    );
  }

  final instruction = TokenInstruction.transfer(
    source: Ed25519HDPublicKey.fromBase58(associatedSenderAccount.pubkey),
    destination:
        Ed25519HDPublicKey.fromBase58(associatedRecipientAccount.pubkey),
    owner: owner.publicKey,
    amount: amount,
  );

  final message = Message(
    instructions: [
      instruction,
      if (memo != null && memo.isNotEmpty)
        MemoInstruction(signers: [owner.publicKey], memo: memo),
    ],
  );

  return sendAndConfirmTransaction(
    message: message,
    signers: [owner],
    onSigned: onSigned ?? ignoreOnSigned,
    commitment: commitment,
  );
}