wallet/gettransactionbyid
Instant Transaction Tracking
Dwellir's TRON endpoints retrieve transaction details in under 50ms with comprehensive status information. Track payments, confirmations, and smart contract executions in real-time.
Retrieves detailed information about a specific transaction using its transaction ID (hash). Essential for tracking transaction status, confirmations, and execution results.
When to Use This Method
wallet/gettransactionbyid
is essential for:
- Transaction Confirmation - Check if transaction was successful and confirmed
- Payment Tracking - Monitor payment status in real-time
- Error Debugging - Analyze failed transactions and error messages
- Fee Analysis - Review bandwidth and energy consumption
- Smart Contract Results - Get contract execution results and logs
Parameters
-
value -
string
(required)- Transaction ID (hash) to lookup
- Example:
"94eea63bb6774c8fc4f4c9d1b62c1e8c2f7c8c2e4d3a2b1c0d9e8f7a6b5c4d3e2f1"
-
visible -
boolean
(optional, default: false)true
- Use Base58 address format in responsefalse
- Use hex address format in response
{
"value": "94eea63bb6774c8fc4f4c9d1b62c1e8c2f7c8c2e4d3a2b1c0d9e8f7a6b5c4d3e2f1",
"visible": true
}
Returns
Transaction Object containing:
ret
- Execution result array with status and feessignature
- Array of transaction signaturestxID
- Transaction identifierraw_data
- Original transaction dataraw_data_hex
- Hex encoded transaction data
Result Status Values
SUCCESS
- Transaction executed successfullyREVERT
- Smart contract execution revertedUNKNOWN
- Transaction not found or pending
Implementation Examples
- JavaScript
- Python
- cURL
const TRON_API = 'https://api-tron-mainnet.n.dwellir.com/YOUR_API_KEY';
// Get transaction by ID
async function getTransactionById(txId) {
const response = await fetch(`${TRON_API}/wallet/gettransactionbyid`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
value: txId,
visible: true
})
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
}
// Enhanced transaction analyzer
class TronTransactionAnalyzer {
constructor(apiKey) {
this.apiKey = apiKey;
this.apiUrl = `https://api-tron-mainnet.n.dwellir.com/${apiKey}`;
}
async getTransactionDetails(txId) {
try {
const transaction = await this.getTransactionById(txId);
if (!transaction.txID) {
return {
found: false,
txId: txId,
status: 'not_found',
message: 'Transaction not found'
};
}
const result = transaction.ret?.[0] || {};
const contract = transaction.raw_data?.contract?.[0] || {};
return {
found: true,
txId: transaction.txID,
status: result.contractRet || 'UNKNOWN',
successful: result.contractRet === 'SUCCESS',
blockNumber: transaction.blockNumber,
blockTimeStamp: transaction.blockTimeStamp,
fee: result.fee || 0,
energyUsed: result.energy_usage || 0,
netUsed: result.net_usage || 0,
contractType: contract.type,
contractDetails: this.parseContract(contract),
confirmations: transaction.confirmations || 0,
rawTransaction: transaction
};
} catch (error) {
console.error('Error getting transaction details:', error);
throw error;
}
}
async getTransactionById(txId) {
const response = await fetch(`${this.apiUrl}/wallet/gettransactionbyid`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ value: txId, visible: true })
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
}
parseContract(contract) {
if (!contract.parameter?.value) return null;
const value = contract.parameter.value;
switch (contract.type) {
case 'TransferContract':
return {
type: 'TRX Transfer',
from: value.owner_address,
to: value.to_address,
amount: value.amount,
amountTRX: (value.amount / 1000000).toFixed(6)
};
case 'TriggerSmartContract':
return {
type: 'Smart Contract Call',
caller: value.owner_address,
contract: value.contract_address,
data: value.data,
callValue: value.call_value || 0
};
case 'TransferAssetContract':
return {
type: 'TRC10 Token Transfer',
from: value.owner_address,
to: value.to_address,
asset: value.asset_name,
amount: value.amount
};
case 'FreezeBalanceContract':
return {
type: 'Freeze TRX',
owner: value.owner_address,
amount: value.frozen_balance,
duration: value.frozen_duration,
resource: value.resource
};
case 'UnfreezeBalanceContract':
return {
type: 'Unfreeze TRX',
owner: value.owner_address,
resource: value.resource
};
default:
return {
type: contract.type,
details: value
};
}
}
async trackTransactionStatus(txId, timeoutMs = 60000) {
const startTime = Date.now();
const checkInterval = 3000; // Check every 3 seconds
while (Date.now() - startTime < timeoutMs) {
try {
const details = await this.getTransactionDetails(txId);
if (details.found) {
if (details.blockNumber) {
return {
...details,
trackingStatus: 'confirmed',
trackingTime: Date.now() - startTime
};
} else {
// Found but not yet in block
console.log('Transaction found in mempool, waiting for confirmation...');
}
} else {
console.log('Transaction not found, checking again...');
}
await new Promise(resolve => setTimeout(resolve, checkInterval));
} catch (error) {
console.log('Error tracking transaction:', error.message);
}
}
return {
found: false,
txId: txId,
trackingStatus: 'timeout',
trackingTime: timeoutMs,
message: 'Transaction tracking timeout'
};
}
}
// Transaction monitor for multiple transactions
class TronTransactionMonitor {
constructor(apiKey) {
this.analyzer = new TronTransactionAnalyzer(apiKey);
this.monitoredTxs = new Map();
this.callbacks = new Map();
}
async monitor(txId, callback = null, timeoutMs = 300000) {
if (this.monitoredTxs.has(txId)) {
console.log(`Already monitoring transaction ${txId}`);
return;
}
this.monitoredTxs.set(txId, {
startTime: Date.now(),
timeout: timeoutMs,
status: 'monitoring'
});
if (callback) {
this.callbacks.set(txId, callback);
}
// Start monitoring in background
this.startMonitoring(txId);
}
async startMonitoring(txId) {
const monitorInfo = this.monitoredTxs.get(txId);
const callback = this.callbacks.get(txId);
while (this.monitoredTxs.has(txId)) {
try {
const details = await this.analyzer.getTransactionDetails(txId);
if (details.found && details.blockNumber) {
// Transaction confirmed
monitorInfo.status = 'confirmed';
monitorInfo.details = details;
if (callback) callback(details);
console.log(`✅ Transaction ${txId} confirmed in block ${details.blockNumber}`);
this.stopMonitoring(txId);
break;
}
// Check timeout
if (Date.now() - monitorInfo.startTime > monitorInfo.timeout) {
monitorInfo.status = 'timeout';
if (callback) {
callback({
found: false,
txId: txId,
status: 'timeout',
message: 'Monitoring timeout'
});
}
console.log(`⏰ Transaction ${txId} monitoring timeout`);
this.stopMonitoring(txId);
break;
}
await new Promise(resolve => setTimeout(resolve, 3000));
} catch (error) {
console.error(`Error monitoring transaction ${txId}:`, error);
await new Promise(resolve => setTimeout(resolve, 5000));
}
}
}
stopMonitoring(txId) {
this.monitoredTxs.delete(txId);
this.callbacks.delete(txId);
}
getMonitoredTransactions() {
return Array.from(this.monitoredTxs.entries()).map(([txId, info]) => ({
txId,
...info
}));
}
}
// Payment verification system
class TronPaymentVerifier {
constructor(apiKey) {
this.analyzer = new TronTransactionAnalyzer(apiKey);
}
async verifyPayment(txId, expectedAmount, expectedRecipient, tokenContract = null) {
try {
const details = await this.analyzer.getTransactionDetails(txId);
if (!details.found) {
return {
verified: false,
reason: 'Transaction not found',
details: null
};
}
if (!details.successful) {
return {
verified: false,
reason: `Transaction failed: ${details.status}`,
details: details
};
}
const contract = details.contractDetails;
if (tokenContract) {
// Verify TRC20 token payment
if (contract.type !== 'Smart Contract Call') {
return {
verified: false,
reason: 'Not a smart contract transaction',
details: details
};
}
// Would need to decode contract call data to verify TRC20 transfer
// This is simplified for example
return {
verified: true,
reason: 'TRC20 payment verification requires log analysis',
details: details,
note: 'Full TRC20 verification needs contract log parsing'
};
} else {
// Verify TRX payment
if (contract.type !== 'TRX Transfer') {
return {
verified: false,
reason: 'Not a TRX transfer',
details: details
};
}
const amountMatch = contract.amount === expectedAmount;
const recipientMatch = contract.to === expectedRecipient;
return {
verified: amountMatch && recipientMatch,
reason: !amountMatch ? 'Amount mismatch' :
!recipientMatch ? 'Recipient mismatch' :
'Payment verified successfully',
details: details,
verification: {
amountExpected: expectedAmount,
amountReceived: contract.amount,
recipientExpected: expectedRecipient,
recipientActual: contract.to
}
};
}
} catch (error) {
return {
verified: false,
reason: `Verification error: ${error.message}`,
details: null
};
}
}
}
// Usage examples
(async () => {
try {
const analyzer = new TronTransactionAnalyzer('YOUR_API_KEY');
const txId = '94eea63bb6774c8fc4f4c9d1b62c1e8c2f7c8c2e4d3a2b1c0d9e8f7a6b5c4d3e2f1';
// Get transaction details
const details = await analyzer.getTransactionDetails(txId);
console.log('Transaction details:', details);
// Track transaction status
const monitor = new TronTransactionMonitor('YOUR_API_KEY');
monitor.monitor(txId, (result) => {
if (result.found && result.successful) {
console.log(`Payment confirmed: ${result.contractDetails.amountTRX} TRX`);
} else {
console.log(`Transaction issue: ${result.message || result.status}`);
}
});
// Verify a payment
const verifier = new TronPaymentVerifier('YOUR_API_KEY');
const verification = await verifier.verifyPayment(
txId,
1000000, // 1 TRX in SUN
'TRX6Q82wMqWNbCCmJPLz9mR8AZwqvUU2pN'
);
console.log('Payment verification:', verification);
} catch (error) {
console.error('Error:', error);
}
})();
import requests
import json
import time
import asyncio
from typing import Dict, List, Optional, Callable
from datetime import datetime
class TronTransactionAnalyzer:
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = f"https://api-tron-mainnet.n.dwellir.com/{api_key}"
self.headers = {
'Content-Type': 'application/json'
}
def get_transaction_by_id(self, tx_id: str) -> Dict:
"""Get raw transaction data by ID"""
url = f"{self.base_url}/wallet/gettransactionbyid"
payload = {
"value": tx_id,
"visible": True
}
response = requests.post(url, headers=self.headers, json=payload)
response.raise_for_status()
return response.json()
def get_transaction_details(self, tx_id: str) -> Dict:
"""Get formatted transaction details with analysis"""
try:
transaction = self.get_transaction_by_id(tx_id)
if not transaction.get('txID'):
return {
'found': False,
'tx_id': tx_id,
'status': 'not_found',
'message': 'Transaction not found'
}
result = transaction.get('ret', [{}])[0]
contract = transaction.get('raw_data', {}).get('contract', [{}])[0]
return {
'found': True,
'tx_id': transaction['txID'],
'status': result.get('contractRet', 'UNKNOWN'),
'successful': result.get('contractRet') == 'SUCCESS',
'block_number': transaction.get('blockNumber'),
'block_timestamp': transaction.get('blockTimeStamp'),
'fee': result.get('fee', 0),
'energy_used': result.get('energy_usage', 0),
'net_used': result.get('net_usage', 0),
'contract_type': contract.get('type'),
'contract_details': self._parse_contract(contract),
'confirmations': transaction.get('confirmations', 0),
'raw_transaction': transaction
}
except Exception as e:
print(f"Error getting transaction details: {e}")
raise
def _parse_contract(self, contract: Dict) -> Optional[Dict]:
"""Parse contract details based on type"""
if not contract.get('parameter', {}).get('value'):
return None
value = contract['parameter']['value']
contract_type = contract.get('type')
if contract_type == 'TransferContract':
return {
'type': 'TRX Transfer',
'from': value.get('owner_address'),
'to': value.get('to_address'),
'amount': value.get('amount', 0),
'amount_trx': (value.get('amount', 0) / 1_000_000)
}
elif contract_type == 'TriggerSmartContract':
return {
'type': 'Smart Contract Call',
'caller': value.get('owner_address'),
'contract': value.get('contract_address'),
'data': value.get('data'),
'call_value': value.get('call_value', 0)
}
elif contract_type == 'TransferAssetContract':
return {
'type': 'TRC10 Token Transfer',
'from': value.get('owner_address'),
'to': value.get('to_address'),
'asset': value.get('asset_name'),
'amount': value.get('amount', 0)
}
elif contract_type == 'FreezeBalanceContract':
return {
'type': 'Freeze TRX',
'owner': value.get('owner_address'),
'amount': value.get('frozen_balance', 0),
'duration': value.get('frozen_duration', 0),
'resource': value.get('resource')
}
elif contract_type == 'UnfreezeBalanceContract':
return {
'type': 'Unfreeze TRX',
'owner': value.get('owner_address'),
'resource': value.get('resource')
}
else:
return {
'type': contract_type,
'details': value
}
def track_transaction_status(self, tx_id: str, timeout_ms: int = 60000) -> Dict:
"""Track transaction until confirmed or timeout"""
start_time = time.time() * 1000
check_interval = 3 # seconds
while (time.time() * 1000) - start_time < timeout_ms:
try:
details = self.get_transaction_details(tx_id)
if details['found']:
if details.get('block_number'):
return {
**details,
'tracking_status': 'confirmed',
'tracking_time': (time.time() * 1000) - start_time
}
else:
print('Transaction found in mempool, waiting for confirmation...')
else:
print('Transaction not found, checking again...')
time.sleep(check_interval)
except Exception as e:
print(f'Error tracking transaction: {e}')
time.sleep(check_interval)
return {
'found': False,
'tx_id': tx_id,
'tracking_status': 'timeout',
'tracking_time': timeout_ms,
'message': 'Transaction tracking timeout'
}
class TronPaymentVerifier:
def __init__(self, api_key: str):
self.analyzer = TronTransactionAnalyzer(api_key)
def verify_payment(self, tx_id: str, expected_amount: int,
expected_recipient: str, token_contract: str = None) -> Dict:
"""Verify payment transaction matches expected parameters"""
try:
details = self.analyzer.get_transaction_details(tx_id)
if not details['found']:
return {
'verified': False,
'reason': 'Transaction not found',
'details': None
}
if not details['successful']:
return {
'verified': False,
'reason': f"Transaction failed: {details['status']}",
'details': details
}
contract = details['contract_details']
if token_contract:
# Verify TRC20 token payment
if contract['type'] != 'Smart Contract Call':
return {
'verified': False,
'reason': 'Not a smart contract transaction',
'details': details
}
# Full TRC20 verification would require log analysis
return {
'verified': True,
'reason': 'TRC20 payment verification requires log analysis',
'details': details,
'note': 'Full TRC20 verification needs contract log parsing'
}
else:
# Verify TRX payment
if contract['type'] != 'TRX Transfer':
return {
'verified': False,
'reason': 'Not a TRX transfer',
'details': details
}
amount_match = contract['amount'] == expected_amount
recipient_match = contract['to'] == expected_recipient
return {
'verified': amount_match and recipient_match,
'reason': 'Amount mismatch' if not amount_match else
'Recipient mismatch' if not recipient_match else
'Payment verified successfully',
'details': details,
'verification': {
'amount_expected': expected_amount,
'amount_received': contract['amount'],
'recipient_expected': expected_recipient,
'recipient_actual': contract['to']
}
}
except Exception as e:
return {
'verified': False,
'reason': f'Verification error: {str(e)}',
'details': None
}
class TronTransactionBatchAnalyzer:
def __init__(self, api_key: str):
self.analyzer = TronTransactionAnalyzer(api_key)
def analyze_multiple_transactions(self, tx_ids: List[str]) -> List[Dict]:
"""Analyze multiple transactions"""
results = []
for tx_id in tx_ids:
try:
details = self.analyzer.get_transaction_details(tx_id)
results.append({
'tx_id': tx_id,
'success': True,
'details': details
})
except Exception as e:
results.append({
'tx_id': tx_id,
'success': False,
'error': str(e)
})
return results
def generate_transaction_report(self, tx_ids: List[str]) -> Dict:
"""Generate comprehensive report for multiple transactions"""
results = self.analyze_multiple_transactions(tx_ids)
successful_txs = [r for r in results if r['success'] and r['details']['found']]
failed_txs = [r for r in results if r['success'] and not r['details']['successful']]
not_found_txs = [r for r in results if r['success'] and not r['details']['found']]
error_txs = [r for r in results if not r['success']]
total_fees = sum(
tx['details']['fee'] for tx in successful_txs
if tx['details']['successful']
)
total_energy = sum(
tx['details']['energy_used'] for tx in successful_txs
if tx['details']['successful']
)
contract_types = {}
for tx in successful_txs:
if tx['details']['successful']:
contract_type = tx['details']['contract_type']
contract_types[contract_type] = contract_types.get(contract_type, 0) + 1
return {
'summary': {
'total_analyzed': len(tx_ids),
'successful': len(successful_txs),
'failed': len(failed_txs),
'not_found': len(not_found_txs),
'errors': len(error_txs)
},
'costs': {
'total_fees': total_fees,
'total_energy_used': total_energy,
'average_fee': total_fees / len(successful_txs) if successful_txs else 0
},
'contract_types': contract_types,
'detailed_results': results,
'generated_at': datetime.now().isoformat()
}
# Usage examples
if __name__ == "__main__":
analyzer = TronTransactionAnalyzer('YOUR_API_KEY')
try:
tx_id = '94eea63bb6774c8fc4f4c9d1b62c1e8c2f7c8c2e4d3a2b1c0d9e8f7a6b5c4d3e2f1'
# Get transaction details
details = analyzer.get_transaction_details(tx_id)
print("Transaction details:")
print(f" Status: {details['status']}")
print(f" Successful: {details['successful']}")
if details['contract_details']:
print(f" Type: {details['contract_details']['type']}")
if 'amount_trx' in details['contract_details']:
print(f" Amount: {details['contract_details']['amount_trx']} TRX")
# Verify payment
verifier = TronPaymentVerifier('YOUR_API_KEY')
verification = verifier.verify_payment(
tx_id,
1_000_000, # 1 TRX in SUN
'TRX6Q82wMqWNbCCmJPLz9mR8AZwqvUU2pN'
)
print(f"\nPayment verification: {verification['verified']}")
print(f"Reason: {verification['reason']}")
# Batch analysis
batch_analyzer = TronTransactionBatchAnalyzer('YOUR_API_KEY')
tx_list = [tx_id] # Add more transaction IDs here
report = batch_analyzer.generate_transaction_report(tx_list)
print(f"\nBatch analysis:")
print(f" Total analyzed: {report['summary']['total_analyzed']}")
print(f" Successful: {report['summary']['successful']}")
print(f" Total fees: {report['costs']['total_fees']} SUN")
except Exception as e:
print(f"Error: {e}")
# Get transaction by ID
curl -X POST "https://api-tron-mainnet.n.dwellir.com/YOUR_API_KEY/wallet/gettransactionbyid" \
-H "Content-Type: application/json" \
-d '{
"value": "94eea63bb6774c8fc4f4c9d1b62c1e8c2f7c8c2e4d3a2b1c0d9e8f7a6b5c4d3e2f1",
"visible": true
}'
# Parse transaction details
curl -s -X POST "https://api-tron-mainnet.n.dwellir.com/YOUR_API_KEY/wallet/gettransactionbyid" \
-H "Content-Type: application/json" \
-d '{
"value": "94eea63bb6774c8fc4f4c9d1b62c1e8c2f7c8c2e4d3a2b1c0d9e8f7a6b5c4d3e2f1",
"visible": true
}' | jq '{
tx_id: .txID,
status: .ret[0].contractRet // "NOT_FOUND",
successful: (.ret[0].contractRet == "SUCCESS"),
block_number: .blockNumber,
timestamp: .blockTimeStamp,
fee: .ret[0].fee // 0,
energy_used: .ret[0].energy_usage // 0,
contract_type: .raw_data.contract[0].type,
contract_details: .raw_data.contract[0].parameter.value
}'
# Transaction monitoring script
#!/bin/bash
API_KEY="YOUR_API_KEY"
# Function to get transaction details
get_transaction() {
local tx_id=$1
curl -s -X POST "https://api-tron-mainnet.n.dwellir.com/$API_KEY/wallet/gettransactionbyid" \
-H "Content-Type: application/json" \
-d "{\"value\": \"$tx_id\", \"visible\": true}"
}
# Function to analyze transaction
analyze_transaction() {
local tx_id=$1
local tx_data=$(get_transaction "$tx_id")
# Check if transaction exists
local tx_id_response=$(echo "$tx_data" | jq -r '.txID // empty')
if [ -z "$tx_id_response" ]; then
echo "❌ Transaction not found: $tx_id"
return 1
fi
# Extract key information
local status=$(echo "$tx_data" | jq -r '.ret[0].contractRet // "UNKNOWN"')
local block_number=$(echo "$tx_data" | jq -r '.blockNumber // empty')
local timestamp=$(echo "$tx_data" | jq -r '.blockTimeStamp // empty')
local fee=$(echo "$tx_data" | jq -r '.ret[0].fee // 0')
local energy_used=$(echo "$tx_data" | jq -r '.ret[0].energy_usage // 0')
local contract_type=$(echo "$tx_data" | jq -r '.raw_data.contract[0].type // "UNKNOWN"')
echo "=== Transaction Analysis: $tx_id ==="
echo "Status: $status"
echo "Contract Type: $contract_type"
if [ -n "$block_number" ]; then
echo "✅ Confirmed in block: $block_number"
if [ -n "$timestamp" ]; then
local readable_time=$(date -d "@$((timestamp / 1000))" "+%Y-%m-%d %H:%M:%S" 2>/dev/null || echo "Invalid timestamp")
echo "Time: $readable_time"
fi
else
echo "⏳ Pending confirmation"
fi
echo "Fee: $fee SUN"
echo "Energy Used: $energy_used"
# Parse contract details based on type
case "$contract_type" in
"TransferContract")
local from=$(echo "$tx_data" | jq -r '.raw_data.contract[0].parameter.value.owner_address')
local to=$(echo "$tx_data" | jq -r '.raw_data.contract[0].parameter.value.to_address')
local amount=$(echo "$tx_data" | jq -r '.raw_data.contract[0].parameter.value.amount')
local amount_trx=$(echo "scale=6; $amount / 1000000" | bc -l)
echo ""
echo "TRX Transfer Details:"
echo " From: $from"
echo " To: $to"
echo " Amount: $amount_trx TRX ($amount SUN)"
;;
"TriggerSmartContract")
local caller=$(echo "$tx_data" | jq -r '.raw_data.contract[0].parameter.value.owner_address')
local contract=$(echo "$tx_data" | jq -r '.raw_data.contract[0].parameter.value.contract_address')
local call_value=$(echo "$tx_data" | jq -r '.raw_data.contract[0].parameter.value.call_value // 0')
echo ""
echo "Smart Contract Call Details:"
echo " Caller: $caller"
echo " Contract: $contract"
echo " Call Value: $call_value SUN"
;;
esac
echo ""
}
# Function to track transaction until confirmed
track_transaction() {
local tx_id=$1
local timeout=${2:-300} # Default 5 minutes
local check_interval=${3:-5} # Default 5 seconds
echo "Tracking transaction: $tx_id"
echo "Timeout: ${timeout}s, Check interval: ${check_interval}s"
echo ""
local start_time=$(date +%s)
local end_time=$((start_time + timeout))
while [ $(date +%s) -lt $end_time ]; do
local tx_data=$(get_transaction "$tx_id")
local tx_id_response=$(echo "$tx_data" | jq -r '.txID // empty')
if [ -n "$tx_id_response" ]; then
local block_number=$(echo "$tx_data" | jq -r '.blockNumber // empty')
local status=$(echo "$tx_data" | jq -r '.ret[0].contractRet // "UNKNOWN"')
if [ -n "$block_number" ]; then
local elapsed=$(($(date +%s) - start_time))
echo "✅ Transaction confirmed after ${elapsed}s"
analyze_transaction "$tx_id"
return 0
else
echo "⏳ Transaction found in mempool, waiting for confirmation..."
fi
else
echo "🔍 Transaction not found yet, checking again..."
fi
sleep $check_interval
done
echo "⏰ Tracking timeout after ${timeout}s"
return 1
}
# Function to verify payment
verify_payment() {
local tx_id=$1
local expected_amount=$2
local expected_recipient=$3
echo "Verifying payment: $tx_id"
echo "Expected: $expected_amount SUN to $expected_recipient"
echo ""
local tx_data=$(get_transaction "$tx_id")
local tx_id_response=$(echo "$tx_data" | jq -r '.txID // empty')
if [ -z "$tx_id_response" ]; then
echo "❌ Verification failed: Transaction not found"
return 1
fi
local status=$(echo "$tx_data" | jq -r '.ret[0].contractRet // "UNKNOWN"')
if [ "$status" != "SUCCESS" ]; then
echo "❌ Verification failed: Transaction status is $status"
return 1
fi
local contract_type=$(echo "$tx_data" | jq -r '.raw_data.contract[0].parameter.value | keys[0]')
# Check if it's a TRX transfer
local actual_amount=$(echo "$tx_data" | jq -r '.raw_data.contract[0].parameter.value.amount // empty')
local actual_recipient=$(echo "$tx_data" | jq -r '.raw_data.contract[0].parameter.value.to_address // empty')
if [ -z "$actual_amount" ] || [ -z "$actual_recipient" ]; then
echo "❌ Verification failed: Not a TRX transfer transaction"
return 1
fi
if [ "$actual_amount" = "$expected_amount" ] && [ "$actual_recipient" = "$expected_recipient" ]; then
echo "✅ Payment verified successfully"
echo " Amount: $actual_amount SUN"
echo " Recipient: $actual_recipient"
return 0
else
echo "❌ Payment verification failed"
echo " Expected amount: $expected_amount SUN"
echo " Actual amount: $actual_amount SUN"
echo " Expected recipient: $expected_recipient"
echo " Actual recipient: $actual_recipient"
return 1
fi
}
# Batch transaction analysis
batch_analyze() {
local tx_file=$1
if [ ! -f "$tx_file" ]; then
echo "Error: Transaction list file not found: $tx_file"
echo "Create a file with one transaction ID per line"
return 1
fi
echo "=== Batch Transaction Analysis ==="
echo "Processing transactions from: $tx_file"
echo ""
local total=0
local successful=0
local failed=0
local pending=0
local not_found=0
while IFS= read -r tx_id; do
# Skip empty lines
[ -z "$tx_id" ] && continue
((total++))
local tx_data=$(get_transaction "$tx_id")
local tx_id_response=$(echo "$tx_data" | jq -r '.txID // empty')
if [ -z "$tx_id_response" ]; then
echo "❌ $tx_id - NOT FOUND"
((not_found++))
else
local status=$(echo "$tx_data" | jq -r '.ret[0].contractRet // "UNKNOWN"')
local block_number=$(echo "$tx_data" | jq -r '.blockNumber // empty')
if [ -z "$block_number" ]; then
echo "⏳ $tx_id - PENDING"
((pending++))
elif [ "$status" = "SUCCESS" ]; then
echo "✅ $tx_id - SUCCESS (Block: $block_number)"
((successful++))
else
echo "❌ $tx_id - FAILED ($status)"
((failed++))
fi
fi
done < "$tx_file"
echo ""
echo "=== Summary ==="
echo "Total: $total"
echo "Successful: $successful"
echo "Failed: $failed"
echo "Pending: $pending"
echo "Not Found: $not_found"
}
# Usage examples
case "${1:-analyze}" in
"analyze")
analyze_transaction "$2"
;;
"track")
track_transaction "$2" "$3" "$4"
;;
"verify")
verify_payment "$2" "$3" "$4"
;;
"batch")
batch_analyze "$2"
;;
*)
echo "Usage: $0 {analyze|track|verify|batch} [args...]"
echo ""
echo "Commands:"
echo " analyze TX_ID - Analyze single transaction"
echo " track TX_ID [TIMEOUT] [INTERVAL] - Track until confirmed"
echo " verify TX_ID AMOUNT RECIPIENT - Verify payment"
echo " batch TX_LIST_FILE - Analyze multiple transactions"
echo ""
echo "Examples:"
echo " $0 analyze 94eea63bb6774c8fc4f4c9d1b62c1e8c2f7c8c2e4d3a2b1c0d9e8f7a6b5c4d3e2f1"
echo " $0 track 94eea63bb6774c8fc4f4c9d1b62c1e8c2f7c8c2e4d3a2b1c0d9e8f7a6b5c4d3e2f1 300 5"
echo " $0 verify 94eea63bb6774c8fc4f4c9d1b62c1e8c2f7c8c2e4d3a2b1c0d9e8f7a6b5c4d3e2f1 1000000 TRX6Q82wMqWNbCCmJPLz9mR8AZwqvUU2pN"
echo " $0 batch transactions.txt"
;;
esac
Response Examples
Successful TRX Transfer
{
"ret": [
{
"contractRet": "SUCCESS",
"fee": 1100
}
],
"signature": [
"c8f8f8e8d8c8b8a898887878686858484838281807060504030201..."
],
"txID": "94eea63bb6774c8fc4f4c9d1b62c1e8c2f7c8c2e4d3a2b1c0d9e8f7a6b5c4d3e2f1",
"raw_data": {
"contract": [
{
"parameter": {
"value": {
"amount": 1000000,
"owner_address": "TJmmqjb1DK9TTZbQXzRQ2AuA94z4gKAPFh",
"to_address": "TRX6Q82wMqWNbCCmJPLz9mR8AZwqvUU2pN"
},
"type_url": "type.googleapis.com/protocol.TransferContract"
},
"type": "TransferContract"
}
],
"ref_block_bytes": "4a7b",
"ref_block_hash": "e15e44aa73bd9e15",
"expiration": 1734567890000,
"timestamp": 1734567830000
},
"blockNumber": 52895819,
"blockTimeStamp": 1734567893000
}
Failed Smart Contract Call
{
"ret": [
{
"contractRet": "REVERT",
"fee": 5000
}
],
"signature": ["..."],
"txID": "a1b2c3d4e5f6789012345678901234567890123456789012345678901234567890",
"raw_data": {
"contract": [
{
"parameter": {
"value": {
"data": "a9059cbb0000000000000000000000004142b5e01c8c59a25d78acdbec2bfc7e89e5e86300000000000000000000000000000000000000000000000000000000000f4240",
"owner_address": "TJmmqjb1DK9TTZbQXzRQ2AuA94z4gKAPFh",
"contract_address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"
},
"type_url": "type.googleapis.com/protocol.TriggerSmartContract"
},
"type": "TriggerSmartContract"
}
],
"ref_block_bytes": "4a7b",
"ref_block_hash": "e15e44aa73bd9e15",
"expiration": 1734567890000,
"timestamp": 1734567830000
},
"blockNumber": 52895820,
"blockTimeStamp": 1734567896000
}
Transaction Not Found
{}
Common Use Cases
1. E-commerce Payment Tracking
class EcommercePaymentTracker {
constructor(apiKey) {
this.analyzer = new TronTransactionAnalyzer(apiKey);
this.paymentDatabase = new Map(); // Replace with real database
}
async trackOrderPayment(orderId, txId, expectedAmount, expectedRecipient) {
try {
// Store payment attempt
this.paymentDatabase.set(orderId, {
txId,
expectedAmount,
expectedRecipient,
status: 'tracking',
createdAt: Date.now()
});
// Track transaction
const result = await this.analyzer.trackTransactionStatus(txId, 300000); // 5 min timeout
if (result.trackingStatus === 'confirmed' && result.successful) {
// Verify payment details
const verification = await this.verifyOrderPayment(orderId, result);
if (verification.verified) {
await this.fulfillOrder(orderId);
return { success: true, message: 'Payment confirmed and order fulfilled' };
} else {
await this.flagPaymentIssue(orderId, verification.reason);
return { success: false, message: verification.reason };
}
} else {
await this.handlePaymentFailure(orderId, result);
return { success: false, message: 'Payment failed or timeout' };
}
} catch (error) {
console.error(`Payment tracking error for order ${orderId}:`, error);
throw error;
}
}
async verifyOrderPayment(orderId, transactionResult) {
const payment = this.paymentDatabase.get(orderId);
const contract = transactionResult.contractDetails;
if (contract.type !== 'TRX Transfer') {
return { verified: false, reason: 'Not a TRX transfer' };
}
const amountMatch = contract.amount === payment.expectedAmount;
const recipientMatch = contract.to === payment.expectedRecipient;
return {
verified: amountMatch && recipientMatch,
reason: !amountMatch ? 'Payment amount mismatch' :
!recipientMatch ? 'Payment recipient mismatch' :
'Payment verified successfully'
};
}
async fulfillOrder(orderId) {
console.log(`✅ Fulfilling order ${orderId}`);
// Implement order fulfillment logic
}
async flagPaymentIssue(orderId, reason) {
console.log(`⚠️ Payment issue for order ${orderId}: ${reason}`);
// Implement payment issue handling
}
async handlePaymentFailure(orderId, result) {
console.log(`❌ Payment failed for order ${orderId}: ${result.message}`);
// Implement payment failure handling
}
}
2. Smart Contract Execution Monitor
class SmartContractMonitor {
constructor(apiKey) {
this.analyzer = new TronTransactionAnalyzer(apiKey);
this.contractAddresses = new Set();
}
addContract(address) {
this.contractAddresses.add(address);
}
async monitorContractTransaction(txId) {
try {
const details = await this.analyzer.getTransactionDetails(txId);
if (!details.found) {
return { status: 'not_found', message: 'Transaction not found' };
}
if (details.contractDetails?.type !== 'Smart Contract Call') {
return { status: 'not_contract', message: 'Not a smart contract transaction' };
}
const contractAddress = details.contractDetails.contract;
if (!this.contractAddresses.has(contractAddress)) {
return { status: 'not_monitored', message: 'Contract not in monitoring list' };
}
return {
status: 'monitored',
successful: details.successful,
contractAddress,
caller: details.contractDetails.caller,
energyUsed: details.energyUsed,
fee: details.fee,
blockNumber: details.blockNumber,
executionResult: details.status
};
} catch (error) {
return { status: 'error', message: error.message };
}
}
}
Need help? Contact our support team or check the TRON documentation.