Contract Operations
resource: contract — arbitrary read/write calls against any ABI, plus deployment and standard detection
read
Calls a view/pure contract function — no gas, no transaction.
| Field | Type | Required | Description |
|---|---|---|---|
contractAddress | text | ✓ Yes | Target contract address. |
abi | text (JSON) | ✓ Yes | Contract ABI (or just the relevant function's ABI fragment). |
functionName | text | ✓ Yes | Function to call. |
functionArgs | text (JSON array) | No | Positional arguments. |
block | text | No | Block number/tag to read at. Omit for latest. |
{ "success": true, "result": "1500000000", "decodedResult": ["1500000000"] }
decodedResult carries every output positionally as a string (the ABI's actual return
shape is only known at runtime); result is the first value, or the full list for
multi-value returns.
write — needs credential
| Field | Type | Required | Description |
|---|---|---|---|
contractAddress | text | ✓ Yes | Target contract address. |
abi | text (JSON) | ✓ Yes | Contract ABI. |
functionName | text | ✓ Yes | Function to call. |
functionArgs | text (JSON array) | No | Positional arguments. |
value | text | No | ETH to send with the call, in wei. |
gasLimit | text | No | Gas limit override. |
{ "success": true, "transactionHash": "0x5c504ed4..." }
simulate
Previews what a (typically state-changing) function would return or revert with, via
eth_call — without broadcasting anything.
| Field | Type | Required | Description |
|---|---|---|---|
contractAddress | text | ✓ Yes | Target contract address. |
abi | text (JSON) | ✓ Yes | Contract ABI. |
functionName | text | ✓ Yes | Function to simulate. |
functionArgs | text (JSON array) | No | Positional arguments. |
value | text | No | ETH to simulate sending, in wei. |
from | text | No | Caller address override — simulate as if called by a specific account, without needing its private key. |
contract.simulate with the same arguments you're
about to send to contract.write — a revert here means the real write would also revert,
caught before spending any gas.
deploy — needs credential
| Field | Type | Required | Description |
|---|---|---|---|
bytecode | text | ✓ Yes | Compiled contract bytecode (hex). |
abi | text (JSON) | ✓ Yes | Contract ABI (needed to encode constructor args). |
constructorArgs | text (JSON array) | No | Constructor arguments. |
value | text | No | ETH to send with deployment, in wei. |
gasLimit | text | No | Gas limit override. |
{ "success": true, "transactionHash": "0x5c504ed4..." }
from/nonce) or read the receipt's contractAddress field once
available, to keep this a fast, one-shot broadcast like every other write operation.
multicall
Batches multiple independent read calls — potentially against different contracts/ABIs/functions — into one node execution.
| Field | Type | Required | Description |
|---|---|---|---|
calls | text (JSON array) | ✓ Yes | Array of call objects, each with its own contract/ABI/function/args. |
{
"success": true,
"results": [
{ "success": true, "contractAddress": "0xdAC1...", "functionName": "symbol", "result": "USDT", "decodedResult": ["USDT"] },
{ "success": false, "contractAddress": "0xBAD0...", "functionName": "symbol", "errorCode": "CALL_REVERTED", "errorMessage": "execution reverted" }
]
}
success reflects whether the batch itself
could be parsed and executed at all (e.g. malformed calls JSON fails the whole
operation) — one entry's failure does not fail the batch. Always check each entry's own
success field.
detectStandards — addendum v3
| Field | Type | Required | Description |
|---|---|---|---|
contractAddress | text | ✓ Yes | Contract to probe. |
{
"success": true,
"erc165Supported": true,
"supportedStandards": ["ERC721", "ERC721Metadata", "ERC721Enumerable"],
"erc20Heuristic": false
}
Runs two independent probes: a real ERC-165
supportsInterface lookup against known interface IDs (reliable), plus a best-effort
ERC-20 heuristic (checking for totalSupply/transfer/balanceOf
selectors) since ERC-20 predates ERC-165 and can't be detected via supportsInterface at all.
logs — implemented, not currently reachable
logs feature is fully implemented in
code (a historical eth_getLogs query, taking contractAddress,
eventAbi*, fromBlock, toBlock, topics) but its
case in the node's operation-routing switch is currently commented out, so
resource=contract, operation=logs is not reachable through the node today
— it falls through to the default "operation not found" error. See
Roadmap.