⚠️Blast API (blastapi.io) ends Oct 31. Migrate to Dwellir and skip Alchemy's expensive compute units.
Switch Today →
Skip to main content

wallet/validateaddress

Instant Address Validation

Dwellir's TRON infrastructure provides sub-10ms address validation with format checking and encoding verification. Ensure address validity before processing transactions or queries.

Start validating addresses →

Validate a TRON address to check if it's properly formatted and valid on the network. Supports both Base58 and Hexadecimal address formats.

Use Cases

wallet/validateaddress is essential for:

  • Input Validation - Verify user-provided addresses
  • Transaction Safety - Validate recipient before sending
  • Form Validation - Real-time address checking in UIs
  • API Security - Validate addresses in API requests
  • Data Integrity - Ensure address validity in databases

Parameters

ParameterTypeRequiredDescription
addressstringYesTRON address to validate (Base58 or Hex)
visiblebooleanNoFormat type - true for Base58, false for Hex (default: true)

Request Example

{
"address": "TRX6Q82wMqWNbCCmJPLz9mR8AZwqvUU2pN",
"visible": true
}

Response Fields

FieldTypeDescription
resultbooleanWhether the address is valid
messagestringValidation result message

Implementation Examples

const TRON_API = 'https://api-tron-mainnet.n.dwellir.com/YOUR_API_KEY';

// Basic address validation
async function validateAddress(address) {
const response = await fetch(`${TRON_API}/wallet/validateaddress`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
address: address,
visible: true
})
});

if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}

return await response.json();
}

// Advanced address validator class
class TronAddressValidator {
constructor(apiKey) {
this.apiUrl = `https://api-tron-mainnet.n.dwellir.com/${apiKey}`;
this.cache = new Map();
this.cacheTimeout = 60000; // 1 minute cache
}

async validate(address, useCache = true) {
// Check cache first
if (useCache && this.cache.has(address)) {
const cached = this.cache.get(address);
if (Date.now() - cached.timestamp < this.cacheTimeout) {
return cached.result;
}
}

// Perform basic format check first
const formatValid = this.checkFormat(address);
if (!formatValid.valid) {
return {
result: false,
message: formatValid.message,
format: formatValid.format
};
}

// Call API for full validation
try {
const response = await fetch(`${this.apiUrl}/wallet/validateaddress`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
address: address,
visible: formatValid.format === 'base58'
})
});

const result = await response.json();

// Cache the result
if (useCache) {
this.cache.set(address, {
result: result,
timestamp: Date.now()
});
}

return result;
} catch (error) {
console.error('Validation API error:', error);
return {
result: false,
message: 'API validation failed',
error: error.message
};
}
}

checkFormat(address) {
// Base58 format check (starts with T, 34 characters)
if (address.startsWith('T') && address.length === 34) {
// Check for valid Base58 characters
const base58Regex = /^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$/;
if (base58Regex.test(address)) {
return { valid: true, format: 'base58' };
}
return {
valid: false,
format: 'base58',
message: 'Invalid Base58 characters'
};
}

// Hex format check (41 prefix, 42 characters)
if (address.startsWith('41') && address.length === 42) {
const hexRegex = /^[0-9a-fA-F]+$/;
if (hexRegex.test(address)) {
return { valid: true, format: 'hex' };
}
return {
valid: false,
format: 'hex',
message: 'Invalid hexadecimal characters'
};
}

return {
valid: false,
format: 'unknown',
message: 'Invalid TRON address format'
};
}

async validateBatch(addresses) {
const results = await Promise.allSettled(
addresses.map(addr => this.validate(addr))
);

return results.map((result, index) => ({
address: addresses[index],
valid: result.status === 'fulfilled' && result.value.result,
details: result.status === 'fulfilled' ? result.value : null,
error: result.status === 'rejected' ? result.reason : null
}));
}

// Convert between formats
async convertFormat(address) {
const validation = await this.validate(address);
if (!validation.result) {
return { error: 'Invalid address', validation };
}

const format = this.checkFormat(address);

// Note: Actual conversion requires base58/hex encoding libraries
// This is a placeholder for the conversion logic
return {
original: address,
format: format.format,
converted: format.format === 'base58' ?
this.toHex(address) :
this.toBase58(address)
};
}

toHex(base58Address) {
// Placeholder - actual implementation needs base58 decoder
return '41' + '0'.repeat(40);
}

toBase58(hexAddress) {
// Placeholder - actual implementation needs base58 encoder
return 'T' + 'x'.repeat(33);
}
}

// Form validation helper
class FormValidator {
constructor(apiKey) {
this.validator = new TronAddressValidator(apiKey);
this.debounceTimer = null;
}

async validateInput(inputElement, feedbackElement) {
const address = inputElement.value.trim();

// Clear previous timer
clearTimeout(this.debounceTimer);

// Quick format check
const formatCheck = this.validator.checkFormat(address);

if (!address) {
this.updateFeedback(feedbackElement, 'empty', 'Enter a TRON address');
return false;
}

if (!formatCheck.valid) {
this.updateFeedback(feedbackElement, 'invalid', formatCheck.message);
return false;
}

// Show validating state
this.updateFeedback(feedbackElement, 'validating', 'Validating address...');

// Debounce API call
this.debounceTimer = setTimeout(async () => {
try {
const result = await this.validator.validate(address);

if (result.result) {
this.updateFeedback(feedbackElement, 'valid', 'Valid TRON address');
return true;
} else {
this.updateFeedback(feedbackElement, 'invalid', result.message);
return false;
}
} catch (error) {
this.updateFeedback(feedbackElement, 'error', 'Validation failed');
return false;
}
}, 500);
}

updateFeedback(element, status, message) {
element.textContent = message;
element.className = `feedback feedback-${status}`;
}
}

// Usage examples
(async () => {
const validator = new TronAddressValidator('YOUR_API_KEY');

try {
// Validate single address
const result = await validator.validate('TRX6Q82wMqWNbCCmJPLz9mR8AZwqvUU2pN');
console.log('Address valid:', result.result);

// Validate batch of addresses
const addresses = [
'TRX6Q82wMqWNbCCmJPLz9mR8AZwqvUU2pN',
'InvalidAddress123',
'TJmmqjb1DK9TTZbQXzRQ2AuA94z4gKAPFh'
];

const batchResults = await validator.validateBatch(addresses);
batchResults.forEach(result => {
console.log(`${result.address}: ${result.valid ? 'Valid' : 'Invalid'}`);
});

// Form validation example
const formValidator = new FormValidator('YOUR_API_KEY');
const input = document.getElementById('addressInput');
const feedback = document.getElementById('feedback');

input?.addEventListener('input', () => {
formValidator.validateInput(input, feedback);
});

} catch (error) {
console.error('Validation error:', error);
}
})();

Response Examples

Valid Address Response

{
"result": true,
"message": "Valid address"
}

Invalid Address Response

{
"result": false,
"message": "Invalid address format"
}

Malformed Address Response

{
"result": false,
"message": "Illegal address"
}

Common Use Cases

1. Form Input Validation

function setupAddressValidation() {
const input = document.getElementById('addressInput');
const submitBtn = document.getElementById('submitBtn');
const feedback = document.getElementById('feedback');

let isValid = false;

input.addEventListener('input', async (e) => {
const address = e.target.value.trim();

if (!address) {
feedback.textContent = '';
submitBtn.disabled = true;
return;
}

// Quick format check
if (!address.startsWith('T') || address.length !== 34) {
feedback.textContent = '❌ Invalid format';
feedback.className = 'error';
submitBtn.disabled = true;
return;
}

// API validation
try {
const result = await validateAddress(address);

if (result.result) {
feedback.textContent = '✓ Valid address';
feedback.className = 'success';
isValid = true;
} else {
feedback.textContent = '❌ ' + result.message;
feedback.className = 'error';
isValid = false;
}

submitBtn.disabled = !isValid;
} catch (error) {
feedback.textContent = '⚠️ Validation error';
feedback.className = 'warning';
submitBtn.disabled = true;
}
});
}

2. Transaction Pre-validation

async function sendTransaction(toAddress, amount) {
// Validate address before sending
const validation = await validateAddress(toAddress);

if (!validation.result) {
throw new Error(`Invalid recipient address: ${validation.message}`);
}

// Proceed with transaction
return createTransaction(toAddress, amount);
}

3. Bulk Address Import

async function importAddresses(addressList) {
const results = {
valid: [],
invalid: []
};

for (const address of addressList) {
const validation = await validateAddress(address);

if (validation.result) {
results.valid.push(address);
} else {
results.invalid.push({
address,
reason: validation.message
});
}
}

return results;
}

Error Handling

Error TypeDescriptionSolution
Format ErrorInvalid address formatCheck Base58/Hex format
Length ErrorWrong address lengthVerify 34 (Base58) or 42 (Hex) chars
Character ErrorInvalid charactersEnsure valid Base58/Hex chars
Network ErrorAPI connection failedImplement retry logic
function validateWithFallback(address) {
// Local format validation first
const formatCheck = checkAddressFormat(address);

if (!formatCheck.valid) {
return {
result: false,
message: formatCheck.message,
source: 'local'
};
}

// API validation with fallback
return validateAddress(address)
.catch(error => ({
result: null,
message: 'Could not verify with network',
source: 'error',
formatValid: true
}));
}

Best Practices

  1. Cache Results - Cache validation results for 60 seconds
  2. Format Check First - Validate format locally before API call
  3. Debounce Input - Debounce validation on user input
  4. Batch Validation - Validate multiple addresses in parallel
  5. Error Handling - Gracefully handle validation failures

Need help? Contact support or visit our TRON documentation.