curl --request POST \
--url https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "debug_traceCall",
"params": [
{
"from": "0x69835D480110e4919B7899f465aAB101e21c8A87",
"to": "0xB7C609cFfa0e47DB2467ea03fF3e598bf59361A5",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0xde0b6b3a7640000",
"data": "0x"
},
"latest",
{
"tracer": "callTracer"
}
],
"id": 1
}'
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"type": "CALL",
"from": "0x69835D480110e4919B7899f465aAB101e21c8A87",
"to": "0xB7C609cFfa0e47DB2467ea03fF3e598bf59361A5",
"value": "0xde0b6b3a7640000",
"gas": "0x76c0",
"gasUsed": "0x5208",
"input": "0x",
"output": "0x"
}
}
Executes a call and returns detailed trace information without creating a transaction. This method simulates transaction execution and provides debugging information including call traces and state changes.
curl --request POST \
--url https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "debug_traceCall",
"params": [
{
"from": "0x69835D480110e4919B7899f465aAB101e21c8A87",
"to": "0xB7C609cFfa0e47DB2467ea03fF3e598bf59361A5",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0xde0b6b3a7640000",
"data": "0x"
},
"latest",
{
"tracer": "callTracer"
}
],
"id": 1
}'
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"type": "CALL",
"from": "0x69835D480110e4919B7899f465aAB101e21c8A87",
"to": "0xB7C609cFfa0e47DB2467ea03fF3e598bf59361A5",
"value": "0xde0b6b3a7640000",
"gas": "0x76c0",
"gasUsed": "0x5208",
"input": "0x",
"output": "0x"
}
}
debug_traceCall
JSON-RPC method executes a call and returns detailed trace information without creating a transaction. This method simulates transaction execution and provides comprehensive debugging information including call traces, gas usage, and state changes, making it essential for testing and debugging smart contract interactions before committing transactions to the blockchain.
from
(string, optional): Address the transaction is sent fromto
(string, required): Address the transaction is directed togas
(string, optional): Gas provided for the transaction executiongasPrice
(string, optional): Gas price for the transactionvalue
(string, optional): Value sent with the transactiondata
(string, optional): Hash of the method signature and encoded parameterstracer
(string): The type of tracer to use
"callTracer"
: Provides detailed call trace information"prestateTracer"
: Shows state before execution"4byteTracer"
: Tracks function selector usagetype
— The type of call (CALL, DELEGATECALL, STATICCALL, CREATE, etc.)from
— The address that initiated the callto
— The address that received the callvalue
— The value transferred in the callgas
— The amount of gas allocated for the callgasUsed
— The amount of gas actually consumedinput
— The input data for the calloutput
— The output data returned by the callcalls
— Array of sub-calls made during execution// Trace a simulated call
const traceCall = async (callObject, blockParameter = 'latest') => {
const response = await fetch('https://hyperliquid-mainnet.core.chainstack.com/YOUR_ENDPOINT/evm', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
method: 'debug_traceCall',
params: [
callObject,
blockParameter,
{
tracer: 'callTracer'
}
],
id: 1
})
});
const data = await response.json();
return data.result;
};
// Simulate and analyze a contract interaction
const simulateContractCall = async () => {
const callObject = {
from: '0x69835D480110e4919B7899f465aAB101e21c8A87',
to: '0xB7C609cFfa0e47DB2467ea03fF3e598bf59361A5',
gas: '0x76c0',
gasPrice: '0x9184e72a000',
value: '0xde0b6b3a7640000',
data: '0x' // Simple transfer, no data
};
try {
const trace = await traceCall(callObject);
console.log('Call Simulation Results:');
console.log(`Type: ${trace.type}`);
console.log(`From: ${trace.from}`);
console.log(`To: ${trace.to}`);
console.log(`Value: ${parseInt(trace.value, 16)} wei`);
console.log(`Gas Used: ${parseInt(trace.gasUsed, 16)}`);
return trace;
} catch (error) {
console.error('Error simulating call:', error);
throw error;
}
};
// Test contract function before execution
const testContractFunction = async (contractAddress, functionData, fromAddress) => {
const callObject = {
from: fromAddress,
to: contractAddress,
data: functionData,
gas: '0x100000' // High gas limit for testing
};
const trace = await traceCall(callObject);
// Analyze the simulation
const analysis = {
willSucceed: trace.output !== '0x',
gasEstimate: parseInt(trace.gasUsed, 16),
hasSubCalls: trace.calls && trace.calls.length > 0,
subCallCount: trace.calls ? trace.calls.length : 0
};
console.log('Function Test Analysis:');
console.log(`Will Succeed: ${analysis.willSucceed}`);
console.log(`Estimated Gas: ${analysis.gasEstimate}`);
console.log(`Sub-calls: ${analysis.subCallCount}`);
return { trace, analysis };
};
// Compare gas usage across different scenarios
const compareGasUsage = async (scenarios) => {
const results = [];
for (const [name, callObject] of scenarios) {
try {
const trace = await traceCall(callObject);
results.push({
scenario: name,
gasUsed: parseInt(trace.gasUsed, 16),
success: trace.output !== '0x'
});
} catch (error) {
results.push({
scenario: name,
error: error.message,
success: false
});
}
}
console.log('Gas Usage Comparison:');
results.forEach(result => {
if (result.success) {
console.log(`${result.scenario}: ${result.gasUsed.toLocaleString()} gas`);
} else {
console.log(`${result.scenario}: Failed - ${result.error}`);
}
});
return results;
};
// Usage
simulateContractCall().then(trace => {
console.log('Simulation completed successfully');
});
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "debug_traceCall",
"params": [
{
"from": "0x69835D480110e4919B7899f465aAB101e21c8A87",
"to": "0xB7C609cFfa0e47DB2467ea03fF3e598bf59361A5",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0xde0b6b3a7640000",
"data": "0x"
},
"latest",
{
"tracer": "callTracer"
}
],
"id": 1
}' \
https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm
debug_traceCall
method is essential for applications that need to:
Successful response with call trace data
The response is of type object
.