Skip to main content

sui_getTransactionBlock

Retrieves comprehensive information about an executed transaction on the Sui blockchain, including transaction data, effects, events, and execution results.

Overview​

The sui_getTransactionBlock method is essential for analyzing executed transactions on Sui. It provides detailed information about transaction inputs, outputs, gas usage, events emitted, and the overall execution status. This method is crucial for transaction monitoring, debugging, and building analytical tools.

Parameters​

ParameterTypeRequiredDescription
digeststringYesThe transaction digest (64-character hex string with 0x prefix)
optionsobjectNoOptions for controlling the response content

Options Object​

FieldTypeDefaultDescription
showInputbooleanfalseInclude transaction input data and arguments
showRawInputbooleanfalseInclude raw BCS-encoded input data
showEffectsbooleanfalseInclude transaction effects and state changes
showEventsbooleanfalseInclude events emitted during execution
showObjectChangesbooleanfalseInclude object changes and mutations
showBalanceChangesbooleanfalseInclude balance changes for all addresses
showRawEffectsbooleanfalseInclude raw BCS-encoded effects

Returns​

Returns an object containing the requested transaction information.

FieldTypeDescription
digeststringTransaction digest (unique identifier)
transactionobjectTransaction data including inputs and kind
effectsobjectTransaction effects and state changes
eventsarrayEvents emitted during transaction execution
objectChangesarrayChanges to objects during execution
balanceChangesarrayBalance changes for involved addresses
timestampMsstringTransaction execution timestamp
checkpointstringCheckpoint number containing this transaction

Transaction Structure​

FieldTypeDescription
dataobjectTransaction input data and parameters
txSignaturesarrayCryptographic signatures

Effects Structure​

FieldTypeDescription
messageVersionstringProtocol version
statusobjectExecution status (success or failure)
executedEpochstringEpoch when transaction was executed
gasUsedobjectGas consumption details
modifiedAtVersionsarrayVersions of modified objects
sharedObjectsarrayShared objects accessed
transactionDigeststringTransaction digest
createdarrayObjects created during execution
mutatedarrayObjects modified during execution
deletedarrayObjects deleted during execution
gasObjectobjectGas coin used for transaction
dependenciesarrayTransaction dependencies

Code Examples​

curl -X POST https://sui-mainnet.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "sui_getTransactionBlock",
"params": [
"0x8c123c0b23c456789abcdef0123456789abcdef0123456789abcdef0123456789a",
{
"showInput": true,
"showEffects": true,
"showEvents": true,
"showObjectChanges": true,
"showBalanceChanges": true
}
],
"id": 1
}'

Response Example​

{
"jsonrpc": "2.0",
"id": 1,
"result": {
"digest": "0x8c123c0b23c456789abcdef0123456789abcdef0123456789abcdef0123456789a",
"transaction": {
"data": {
"messageVersion": "v1",
"transaction": {
"kind": "ProgrammableTransaction",
"inputs": [
{
"type": "pure",
"valueType": "address",
"value": "0xd77955e670601c2c2e6e8637e383695c166aac0a86b741c266bdfb23c2e3369f"
}
],
"transactions": [
{
"TransferObjects": [
[
{
"Input": 0
}
],
{
"Input": 1
}
]
}
]
},
"sender": "0xd77955e670601c2c2e6e8637e383695c166aac0a86b741c266bdfb23c2e3369f",
"gasData": {
"payment": [
{
"objectId": "0x5d3c87e88bc566e3f10c66e0275a366001ffa8b86142adc78c744de6afffeb34",
"version": 31823924,
"digest": "HpSeCiMLG53N9FcHDrRTxwGhc4RVJa1seZhXYJ7KFpJe"
}
],
"owner": "0xd77955e670601c2c2e6e8637e383695c166aac0a86b741c266bdfb23c2e3369f",
"price": "750",
"budget": "7500000"
}
},
"txSignatures": [
"AIXfGNvFvVwrVlOJQCAjNZ1mJ7QfOdxzQDQmHgdEGurBTGEpTKyKtIfxWq0YyL9JcF2JHGvglq3SqfX9VgwjJ+AONmH8/BbLSvdNuKLJAMjnafcTq4JxFRZGBKPhZCDn5w=="
]
},
"effects": {
"messageVersion": "v1",
"status": {
"status": "success"
},
"executedEpoch": "251",
"gasUsed": {
"computationCost": "750000",
"storageCost": "2340000",
"storageRebate": "1956000",
"nonRefundableStorageFee": "19764"
},
"modifiedAtVersions": [
{
"objectId": "0x5d3c87e88bc566e3f10c66e0275a366001ffa8b86142adc78c744de6afffeb34",
"sequenceNumber": "31823924"
}
],
"transactionDigest": "0x8c123c0b23c456789abcdef0123456789abcdef0123456789abcdef0123456789a",
"created": [],
"mutated": [
{
"owner": {
"AddressOwner": "0xd77955e670601c2c2e6e8637e383695c166aac0a86b741c266bdfb23c2e3369f"
},
"reference": {
"objectId": "0x5d3c87e88bc566e3f10c66e0275a366001ffa8b86142adc78c744de6afffeb34",
"version": 31823925,
"digest": "7dBx2Q5KDhz9AjZgWwHqGEKhWu9sF4fE2yNzYtGqHx8P"
}
}
],
"gasObject": {
"owner": {
"AddressOwner": "0xd77955e670601c2c2e6e8637e383695c166aac0a86b741c266bdfb23c2e3369f"
},
"reference": {
"objectId": "0x5d3c87e88bc566e3f10c66e0275a366001ffa8b86142adc78c744de6afffeb34",
"version": 31823925,
"digest": "7dBx2Q5KDhz9AjZgWwHqGEKhWu9sF4fE2yNzYtGqHx8P"
}
},
"dependencies": []
},
"events": [
{
"id": {
"txDigest": "0x8c123c0b23c456789abcdef0123456789abcdef0123456789abcdef0123456789a",
"eventSeq": "0"
},
"packageId": "0x2",
"transactionModule": "pay",
"sender": "0xd77955e670601c2c2e6e8637e383695c166aac0a86b741c266bdfb23c2e3369f",
"type": "0x2::balance::Supply<0x2::sui::SUI>",
"parsedJson": {
"value": "1000000000"
},
"bcs": "NNTJCEGnC4Ts7hGJYJzbeUXJZYwmGDL8DELcD9fv2N2k"
}
],
"objectChanges": [
{
"type": "mutated",
"sender": "0xd77955e670601c2c2e6e8637e383695c166aac0a86b741c266bdfb23c2e3369f",
"owner": {
"AddressOwner": "0xd77955e670601c2c2e6e8637e383695c166aac0a86b741c266bdfb23c2e3369f"
},
"objectType": "0x2::coin::Coin<0x2::sui::SUI>",
"objectId": "0x5d3c87e88bc566e3f10c66e0275a366001ffa8b86142adc78c744de6afffeb34",
"version": "31823925",
"previousVersion": "31823924",
"digest": "7dBx2Q5KDhz9AjZgWwHqGEKhWu9sF4fE2yNzYtGqHx8P"
}
],
"balanceChanges": [
{
"owner": {
"AddressOwner": "0xd77955e670601c2c2e6e8637e383695c166aac0a86b741c266bdfb23c2e3369f"
},
"coinType": "0x2::sui::SUI",
"amount": "-1134000"
}
],
"timestampMs": "1703097600000",
"checkpoint": "18523456"
}
}

Common Use Cases​

1. Transaction Status Verification​

async function checkTransactionStatus(digest) {
const txn = await client.getTransactionBlock({
digest: digest,
options: { showEffects: true }
});

const status = txn.effects?.status?.status;
const successful = status === 'success';

console.log(`Transaction ${digest}: ${status}`);

if (!successful) {
console.error('Transaction failed:', txn.effects?.status?.error);
}

return successful;
}

2. Gas Usage Analysis​

async function analyzeGasUsage(digest) {
const txn = await client.getTransactionBlock({
digest: digest,
options: { showEffects: true }
});

const gasUsed = txn.effects?.gasUsed;
if (gasUsed) {
const totalGas = parseInt(gasUsed.computationCost) +
parseInt(gasUsed.storageCost) -
parseInt(gasUsed.storageRebate);

console.log('Gas Analysis:', {
computation: gasUsed.computationCost,
storage: gasUsed.storageCost,
rebate: gasUsed.storageRebate,
total: totalGas,
totalInSUI: totalGas / 1_000_000_000
});
}
}

3. Event Processing​

async function processTransactionEvents(digest) {
const txn = await client.getTransactionBlock({
digest: digest,
options: { showEvents: true }
});

const events = txn.events || [];

for (const event of events) {
console.log('Event:', {
type: event.type,
sender: event.sender,
packageId: event.packageId,
module: event.transactionModule,
data: event.parsedJson
});

// Handle specific event types
if (event.type.includes('Transfer')) {
console.log('Transfer event detected');
} else if (event.type.includes('Mint')) {
console.log('Mint event detected');
}
}
}

4. Object Change Tracking​

async function trackObjectChanges(digest) {
const txn = await client.getTransactionBlock({
digest: digest,
options: { showObjectChanges: true }
});

const changes = txn.objectChanges || [];
const changesByType = {
created: [],
mutated: [],
deleted: [],
wrapped: [],
published: []
};

changes.forEach(change => {
if (changesByType[change.type]) {
changesByType[change.type].push(change);
}
});

console.log('Object Changes Summary:', {
created: changesByType.created.length,
mutated: changesByType.mutated.length,
deleted: changesByType.deleted.length,
wrapped: changesByType.wrapped.length,
published: changesByType.published.length
});

return changesByType;
}

Transaction Types and Patterns​

Programmable Transaction Blocks​

function analyzeProgrammableTransaction(txn) {
const transaction = txn.transaction?.data?.transaction;

if (transaction?.kind === 'ProgrammableTransaction') {
console.log('Programmable Transaction:', {
inputCount: transaction.inputs?.length || 0,
commandCount: transaction.transactions?.length || 0,
commands: transaction.transactions?.map(cmd => Object.keys(cmd)[0])
});

// Analyze specific commands
transaction.transactions?.forEach((cmd, index) => {
const commandType = Object.keys(cmd)[0];
console.log(`Command ${index}: ${commandType}`);

switch (commandType) {
case 'TransferObjects':
console.log(' - Transfer operation detected');
break;
case 'MoveCall':
console.log(' - Function call detected');
break;
case 'MakeMoveVec':
console.log(' - Vector creation detected');
break;
case 'SplitCoins':
console.log(' - Coin splitting detected');
break;
case 'MergeCoins':
console.log(' - Coin merging detected');
break;
}
});
}
}

Balance Change Analysis​

async function analyzeBalanceChanges(digest) {
const txn = await client.getTransactionBlock({
digest: digest,
options: { showBalanceChanges: true }
});

const balanceChanges = txn.balanceChanges || [];
const changesByAddress = {};

balanceChanges.forEach(change => {
const owner = change.owner.AddressOwner ||
change.owner.ObjectOwner ||
'Shared';

if (!changesByAddress[owner]) {
changesByAddress[owner] = [];
}

changesByAddress[owner].push({
coinType: change.coinType,
amount: change.amount,
isPositive: parseInt(change.amount) > 0
});
});

console.log('Balance Changes by Address:');
Object.entries(changesByAddress).forEach(([address, changes]) => {
console.log(` ${address}:`);
changes.forEach(change => {
const symbol = change.coinType.includes('::sui::SUI') ? 'SUI' : 'Token';
const amount = parseInt(change.amount) / 1_000_000_000;
console.log(` ${change.isPositive ? '+' : ''}${amount} ${symbol}`);
});
});
}

Error Handling and Debugging​

Transaction Failure Analysis​

async function debugFailedTransaction(digest) {
try {
const txn = await client.getTransactionBlock({
digest: digest,
options: {
showInput: true,
showEffects: true,
showEvents: true
}
});

const status = txn.effects?.status;

if (status?.status !== 'success') {
console.error('Transaction Failed:');
console.error('Status:', status?.status);
console.error('Error:', status?.error);

// Analyze potential causes
const gasUsed = txn.effects?.gasUsed;
if (gasUsed) {
const totalCost = parseInt(gasUsed.computationCost) +
parseInt(gasUsed.storageCost);
console.log('Gas Analysis:', {
budgetExceeded: totalCost > 7500000, // Typical budget
computationCost: gasUsed.computationCost,
storageCost: gasUsed.storageCost
});
}
}

return txn;
} catch (error) {
console.error('Error fetching transaction:', error.message);

if (error.message.includes('Could not find the referenced transaction')) {
console.error('Transaction digest may be invalid or transaction not yet indexed');
}

throw error;
}
}

Comprehensive Transaction Monitor​

class TransactionMonitor {
constructor(client) {
this.client = client;
this.cache = new Map();
}

async monitorTransaction(digest, options = {}) {
const startTime = Date.now();
let attempts = 0;
const maxAttempts = options.maxAttempts || 30;
const interval = options.interval || 2000;

console.log(`Monitoring transaction: ${digest}`);

while (attempts < maxAttempts) {
try {
const txn = await this.client.getTransactionBlock({
digest: digest,
options: {
showEffects: true,
showEvents: true,
showObjectChanges: true
}
});

const analysis = {
digest: txn.digest,
status: txn.effects?.status?.status,
gasUsed: txn.effects?.gasUsed,
eventCount: txn.events?.length || 0,
objectChanges: txn.objectChanges?.length || 0,
elapsedTime: Date.now() - startTime,
attempts: attempts + 1
};

console.log('Transaction found:', analysis);
this.cache.set(digest, { txn, analysis, timestamp: Date.now() });

return { txn, analysis };
} catch (error) {
attempts++;
console.log(`Attempt ${attempts}/${maxAttempts} failed: ${error.message}`);

if (attempts < maxAttempts) {
await new Promise(resolve => setTimeout(resolve, interval));
}
}
}

throw new Error(`Transaction ${digest} not found after ${maxAttempts} attempts`);
}

getCachedTransaction(digest) {
return this.cache.get(digest);
}

clearCache() {
this.cache.clear();
}
}

Best Practices​

1. Selective Data Fetching​

Only request the data you need to minimize response size and improve performance:

// Minimal request for status check
const statusCheck = await client.getTransactionBlock({
digest: digest,
options: { showEffects: true }
});

// Full analysis request
const fullAnalysis = await client.getTransactionBlock({
digest: digest,
options: {
showInput: true,
showEffects: true,
showEvents: true,
showObjectChanges: true,
showBalanceChanges: true
}
});

2. Implement Caching​

const transactionCache = new Map();

async function getCachedTransaction(digest) {
if (transactionCache.has(digest)) {
return transactionCache.get(digest);
}

const txn = await client.getTransactionBlock({
digest: digest,
options: { showEffects: true, showEvents: true }
});

// Cache successful transactions (they don't change)
if (txn.effects?.status?.status === 'success') {
transactionCache.set(digest, txn);
}

return txn;
}

3. Handle Rate Limits​

class RateLimitedClient {
constructor(client, requestsPerSecond = 10) {
this.client = client;
this.interval = 1000 / requestsPerSecond;
this.lastRequest = 0;
}

async getTransactionBlock(params) {
const now = Date.now();
const timeSinceLastRequest = now - this.lastRequest;

if (timeSinceLastRequest < this.interval) {
await new Promise(resolve =>
setTimeout(resolve, this.interval - timeSinceLastRequest)
);
}

this.lastRequest = Date.now();
return this.client.getTransactionBlock(params);
}
}

Performance Considerations​

  • Selective Options: Only request data you need (events, object changes, etc.)
  • Caching: Cache transaction results as they are immutable once executed
  • Rate Limiting: Implement rate limiting for high-frequency queries
  • Batch Processing: Process multiple transactions in parallel when possible
  • Error Handling: Implement retry logic for network failures

Need help? Contact our support team or check the Sui documentation.