
@solana/transactions
This package contains types and functions for compiling, signing and sending transactions. It can be used standalone, but it is also exported as part of Kit @solana/kit
.
Transactions are created by compiling a transaction message. They must then be signed before being submitted to the network.
Compiling a transaction
Functions
compileTransaction()
Given a TransactionMessage
, this function returns a Transaction
object. This includes the compiled bytes of the transaction message, and a map of signatures. This map will have a key for each address that is required to sign the transaction. The transaction will not yet have signatures for any of these addresses.
Whether a transaction message is ready to be compiled or not is enforced for you at the type level. In order to be signable, a transaction message must:
- have a version and a list of zero or more instructions (ie. conform to
BaseTransactionMessage
)
- have a fee payer set (ie. conform to
TransactionMessageWithFeePayer
)
- have a lifetime specified (ie. conform to
TransactionMessageWithBlockhashLifetime | TransactionMessageWithDurableNonceLifetime
)
Signing transactions
In order to be landed on the network, a transaction must be signed by all of the private keys belonging to accounts that are required signers of the transaction.
Types
FullySignedTransaction
This type represents a transaction that is signed by all of its required signers.
TransactionWithSizeLimit
This type represents a transaction that is under or equal to the maximum size limit for transactions on the Solana network.
SendableTransaction
This type represents a transaction that has all the required conditions to be sent to the network. Namely:
- It must be fully signed (ie. conform to
FullySignedTransaction
)
- It must be within size limit (ie. conform to
TransactionWithSizeLimit
)
The SendableTransaction
type is a prerequisite of functions designed to land transactions on the network.
Functions
getSignatureFromTransaction()
Given a transaction signed by its fee payer, this method will return the Signature
that uniquely identifies it. This string can be used to look up transactions at a later date, for example on a Solana block explorer.
import { getSignatureFromTransaction } from '@solana/transactions';
const signature = getSignatureFromTransaction(tx);
console.debug(`Inspect this transaction at https://explorer.solana.com/tx/${signature}`);
signTransaction()
Given an array of CryptoKey
objects which are private keys pertaining to addresses that are required to sign a transaction, this method will return a new signed transaction of type FullySignedTransaction
. This function will throw unless the resulting transaction is fully signed.
import { generateKeyPair } from '@solana/keys';
import { signTransaction } from '@solana/transactions';
const signedTransaction = await signTransaction([myPrivateKey], tx);
partiallySignTransaction()
This function is the same as signTransaction()
but does not require the transaction to be signed by all signers. A partially signed transaction cannot be landed on the network, but can be serialized and deserialized.
Serializing transactions
Before sending a transaction to be landed on the network, you must serialize it in a particular way. You can use these types and functions to serialize a signed transaction into a binary format suitable for transit over the wire.
Types
Base64EncodedWireTransaction
This type represents the wire format of a transaction as a base64-encoded string.
Functions
getBase64EncodedWireTransaction()
Given a signed transaction, this method returns the transaction as a string that conforms to the Base64EncodedWireTransaction
type.
import { getBase64EncodedWireTransaction, signTransaction } from '@solana/transactions';
const serializedTransaction = getBase64EncodedWireTransaction(signedTransaction);
const signature = await rpc.sendTransaction(serializedTransaction, { encoding: 'base64' }).send();