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

wallet/delegateresource

Delegate staked bandwidth or energy resources to another TRON account.

Endpoint

POST /wallet/delegateresource

Parameters

Required Parameters

ParameterTypeDescription
owner_addressstringAccount address delegating resources (base58)
receiver_addressstringAccount receiving delegated resources (base58)
balancenumberAmount to delegate in SUN (1 TRX = 1,000,000 SUN)
resourcestringResource type: "BANDWIDTH" or "ENERGY"

Optional Parameters

ParameterTypeDescription
lockbooleanLock delegation for 3 days (default: false)
lock_periodnumberCustom lock period in seconds (if lock=true)
permission_idnumberPermission ID for multi-signature (default: 0)
visiblebooleanReturn base58 addresses (default: false returns hex)

Response

Returns unsigned transaction containing the delegation operation. Transaction must be signed and broadcast.

Response Fields

  • txID - Transaction hash
  • raw_data - Transaction raw data
    • contract - Delegation contract details
    • expiration - Transaction expiration timestamp
    • timestamp - Transaction creation timestamp
  • visible - Address format indicator

Important Notes

Delegation Rules

  1. Must Stake First: Resources must be staked before delegation
  2. Immediate Effect: Delegation takes effect immediately after transaction confirmation
  3. Lock Period: Optional 3-day lock prevents immediate reclaim
  4. Resource Ownership: Delegated resources remain owned by delegator
  5. Reclaim Process: Use undelegateresource to reclaim delegated resources

Resource Calculations

  • Energy delegation helps with smart contract execution
  • Bandwidth delegation helps with transactions and transfers
  • Receiver pays no TRX but can use delegated resources

Implementation Examples

class TronDelegationManager {
constructor(apiKey) {
this.apiKey = apiKey;
this.baseUrl = `https://api-tron-mainnet.n.dwellir.com/${apiKey}`;
}

// Create delegation transaction
async delegateResources(ownerAddress, receiverAddress, amountTRX, resourceType, lock = false) {
const response = await fetch(`${this.baseUrl}/wallet/delegateresource`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
owner_address: ownerAddress,
receiver_address: receiverAddress,
balance: amountTRX * 1000000, // Convert TRX to SUN
resource: resourceType,
lock: lock,
lock_period: lock ? 3 * 24 * 3600 : undefined, // 3 days in seconds
visible: true
})
});

if (!response.ok) {
throw new Error(`Delegation failed: ${response.statusText}`);
}

return response.json();
}

// Check delegated resources for an account
async getDelegatedResources(address) {
const response = await fetch(`${this.baseUrl}/wallet/getdelegatedresourceaccountindex`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
value: address,
visible: true
})
});

const data = await response.json();

// Get detailed info for each delegation
const delegations = [];

if (data.toAccounts) {
for (const account of data.toAccounts) {
const detail = await this.getDelegationDetail(address, account);
delegations.push(detail);
}
}

return delegations;
}

// Get detailed delegation info between two accounts
async getDelegationDetail(from, to) {
const response = await fetch(`${this.baseUrl}/wallet/getdelegatedresource`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
fromAddress: from,
toAddress: to,
visible: true
})
});

return response.json();
}

// Calculate optimal delegation based on receiver's needs
async calculateOptimalDelegation(receiverAddress, contractAddress = null) {
// Get receiver's current resources
const resourceResponse = await fetch(`${this.baseUrl}/wallet/getaccountresource`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
address: receiverAddress,
visible: true
})
});

const resources = await resourceResponse.json();

// Estimate energy needs if contract address provided
let energyNeeded = 0;
if (contractAddress) {
const contractResponse = await fetch(`${this.baseUrl}/wallet/triggerconstantcontract`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
owner_address: receiverAddress,
contract_address: contractAddress,
function_selector: 'estimateEnergy()',
visible: true
})
});

const contractData = await contractResponse.json();
energyNeeded = contractData.energy_used || 50000; // Default 50k energy
}

// Calculate delegation amounts
const currentEnergy = resources.EnergyLimit || 0;
const currentBandwidth = resources.NetLimit || 0;
const freeNetUsed = resources.freeNetUsed || 0;

return {
energy: {
current: currentEnergy,
needed: energyNeeded,
delegate: Math.max(0, energyNeeded - currentEnergy),
delegateTRX: Math.ceil((energyNeeded - currentEnergy) / 28.5) // Approximate ratio
},
bandwidth: {
current: currentBandwidth,
dailyUsage: freeNetUsed,
delegate: Math.max(0, 5000 - currentBandwidth), // Aim for 5000 bandwidth
delegateTRX: Math.max(0, 5000 - currentBandwidth) // 1 TRX = 1 bandwidth
}
};
}

// Batch delegate to multiple receivers
async batchDelegate(ownerAddress, delegations) {
const transactions = [];

for (const delegation of delegations) {
const tx = await this.delegateResources(
ownerAddress,
delegation.receiver,
delegation.amount,
delegation.resource,
delegation.lock || false
);

transactions.push({
receiver: delegation.receiver,
resource: delegation.resource,
amount: delegation.amount,
txID: tx.txID,
transaction: tx
});
}

return transactions;
}
}

// Advanced delegation strategies
class DelegationStrategy {
constructor(manager) {
this.manager = manager;
}

// Delegate to DApp users based on usage patterns
async delegateForDApp(ownerAddress, dappUsers) {
const delegations = [];

for (const user of dappUsers) {
// Calculate needs based on historical usage
const optimal = await this.manager.calculateOptimalDelegation(
user.address,
user.primaryContract
);

if (optimal.energy.delegate > 0) {
delegations.push({
receiver: user.address,
resource: 'ENERGY',
amount: optimal.energy.delegateTRX,
lock: true // Lock for stability
});
}

if (optimal.bandwidth.delegate > 0) {
delegations.push({
receiver: user.address,
resource: 'BANDWIDTH',
amount: optimal.bandwidth.delegateTRX,
lock: false // Flexible bandwidth
});
}
}

return this.manager.batchDelegate(ownerAddress, delegations);
}

// Dynamic delegation based on real-time needs
async dynamicDelegation(ownerAddress, receiverAddress, threshold = 0.8) {
const interval = setInterval(async () => {
try {
// Check receiver's resource usage
const resourceResponse = await fetch(
`${this.manager.baseUrl}/wallet/getaccountresource`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
address: receiverAddress,
visible: true
})
}
);

const resources = await resourceResponse.json();

// Check energy usage
const energyUsage = resources.EnergyUsed / resources.EnergyLimit;
if (energyUsage > threshold) {
console.log(`High energy usage detected: ${(energyUsage * 100).toFixed(1)}%`);

// Delegate additional energy
const additionalEnergy = Math.ceil(resources.EnergyLimit * 0.5);
const tx = await this.manager.delegateResources(
ownerAddress,
receiverAddress,
additionalEnergy / 28.5, // Convert to TRX
'ENERGY',
false
);

console.log(`Delegated additional energy: TX ${tx.txID}`);
}

// Check bandwidth usage
const netUsage = resources.NetUsed / resources.NetLimit;
if (netUsage > threshold) {
console.log(`High bandwidth usage detected: ${(netUsage * 100).toFixed(1)}%`);

// Delegate additional bandwidth
const additionalBandwidth = Math.ceil(resources.NetLimit * 0.5);
const tx = await this.manager.delegateResources(
ownerAddress,
receiverAddress,
additionalBandwidth,
'BANDWIDTH',
false
);

console.log(`Delegated additional bandwidth: TX ${tx.txID}`);
}

} catch (error) {
console.error('Dynamic delegation error:', error);
}
}, 60000); // Check every minute

return interval;
}
}

// Example usage
async function manageDelegation() {
const manager = new TronDelegationManager('YOUR_API_KEY');
const strategy = new DelegationStrategy(manager);

try {
// Simple delegation
const simpleTx = await manager.delegateResources(
'TOwnerAddress...',
'TReceiverAddress...',
1000, // 1000 TRX
'ENERGY',
true // Lock for 3 days
);
console.log('Simple delegation TX:', simpleTx.txID);

// Calculate optimal delegation
const optimal = await manager.calculateOptimalDelegation(
'TReceiverAddress...',
'TContractAddress...'
);
console.log('Optimal delegation:', optimal);

// Batch delegation to multiple users
const dappUsers = [
{ address: 'TUser1...', primaryContract: 'TContract1...' },
{ address: 'TUser2...', primaryContract: 'TContract2...' }
];

const batchTxs = await strategy.delegateForDApp('TOwnerAddress...', dappUsers);
console.log('Batch delegations:', batchTxs);

// Start dynamic delegation monitoring
const monitor = await strategy.dynamicDelegation(
'TOwnerAddress...',
'TReceiverAddress...',
0.75 // Trigger at 75% usage
);

console.log('Dynamic delegation monitor started');

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

Example Response

{
"visible": true,
"txID": "d8f3c4b9e2a7d6c5e4f3b2a1d9c8e7f6b5a4d3c2e1f9a8b7c6d5e4f3a2b1c9e",
"raw_data": {
"contract": [
{
"parameter": {
"value": {
"owner_address": "TOwnerAddress...",
"receiver_address": "TReceiverAddress...",
"balance": 1000000000,
"resource": "ENERGY",
"lock": true,
"lock_period": 259200
},
"type_url": "type.googleapis.com/protocol.DelegateResourceContract"
},
"type": "DelegateResourceContract"
}
],
"ref_block_bytes": "6b5c",
"ref_block_hash": "4d3e5f9a8b7c6d5e",
"expiration": 1702456849000,
"timestamp": 1702456789000
}
}

Delegation Flow

graph LR
A[Owner Stakes TRX] --> B[Resources Available]
B --> C[Delegate to Receiver]
C --> D[Receiver Uses Resources]
D --> E[Resources Consumed]
E --> F[Owner Can Reclaim]

style A fill:#4CAF50
style C fill:#2196F3
style D fill:#FF9800

Best Practices

1. Calculate Before Delegating

// Always analyze needs first
const needs = await analyzeNeeds(receiverAddress);
const delegateAmount = Math.ceil(needs.energy.deficit / 28.5);

2. Use Locks Strategically

  • Lock for stable, long-term delegations
  • Keep unlocked for flexible, short-term needs
  • Consider 3-day default lock period

3. Monitor Resource Usage

  • Track receiver's consumption patterns
  • Adjust delegations based on actual usage
  • Implement alerts for high usage

4. Batch Operations

  • Group multiple delegations together
  • Reduces transaction overhead
  • Easier management and tracking

Common Errors

ErrorDescriptionSolution
Insufficient staked balanceNot enough staked resourcesStake more TRX first
Invalid resource typeMust be BANDWIDTH or ENERGYUse correct resource string
Receiver address invalidMalformed receiver addressVerify base58 format
Already delegatedResources already delegated to receiverCheck existing delegations

Use Cases

  • DApp Support: Provide resources for users to interact with your DApp
  • Gaming: Enable free gameplay by covering resource costs
  • DeFi Trading: Support traders with energy for smart contract calls
  • Onboarding: Help new users get started without staking
  • Resource Rental: Commercial resource delegation services