ots_hasCode
curl --request POST \
--url https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"method": "ots_hasCode",
"params": [
"0x5555555555555555555555555555555555555555",
"latest"
],
"id": 1
}
'import requests
url = "https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm"
payload = {
"jsonrpc": "2.0",
"method": "ots_hasCode",
"params": ["0x5555555555555555555555555555555555555555", "latest"],
"id": 1
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
method: 'ots_hasCode',
params: ['0x5555555555555555555555555555555555555555', 'latest'],
id: 1
})
};
fetch('https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'method' => 'ots_hasCode',
'params' => [
'0x5555555555555555555555555555555555555555',
'latest'
],
'id' => 1
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ots_hasCode\",\n \"params\": [\n \"0x5555555555555555555555555555555555555555\",\n \"latest\"\n ],\n \"id\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ots_hasCode\",\n \"params\": [\n \"0x5555555555555555555555555555555555555555\",\n \"latest\"\n ],\n \"id\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ots_hasCode\",\n \"params\": [\n \"0x5555555555555555555555555555555555555555\",\n \"latest\"\n ],\n \"id\": 1\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 1,
"result": true
}Hyperliquid node API
ots_hasCode | Hyperliquid EVM
The ots_hasCode JSON-RPC method checks whether a specified address contains deployed contract code on the Hyperliquid EVM blockchain.
POST
/
evm
ots_hasCode
curl --request POST \
--url https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"method": "ots_hasCode",
"params": [
"0x5555555555555555555555555555555555555555",
"latest"
],
"id": 1
}
'import requests
url = "https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm"
payload = {
"jsonrpc": "2.0",
"method": "ots_hasCode",
"params": ["0x5555555555555555555555555555555555555555", "latest"],
"id": 1
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
method: 'ots_hasCode',
params: ['0x5555555555555555555555555555555555555555', 'latest'],
id: 1
})
};
fetch('https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'method' => 'ots_hasCode',
'params' => [
'0x5555555555555555555555555555555555555555',
'latest'
],
'id' => 1
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ots_hasCode\",\n \"params\": [\n \"0x5555555555555555555555555555555555555555\",\n \"latest\"\n ],\n \"id\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ots_hasCode\",\n \"params\": [\n \"0x5555555555555555555555555555555555555555\",\n \"latest\"\n ],\n \"id\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"ots_hasCode\",\n \"params\": [\n \"0x5555555555555555555555555555555555555555\",\n \"latest\"\n ],\n \"id\": 1\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 1,
"result": true
}This method is available on Chainstack. Not all Hyperliquid methods are available on Chainstack, as the open-source node implementation does not support them yet — see Hyperliquid methods for the full availability breakdown.
ots_hasCode JSON-RPC method checks whether a specified address contains deployed contract code on the Hyperliquid EVM blockchain. This Otterscan-specific method provides a quick way to determine if an address is a smart contract or an externally owned account (EOA).
Get your own node endpoint todayStart for free and get your app to production levels immediately. No credit card required.You can sign up with your GitHub, X, Google, or Microsoft account.
Parameters
- address (string, required): The address to check for deployed code
- block identifier (string, optional): The block at which to check the code
- Can be a block number, block hash, or one of:
"earliest","latest","pending" - Defaults to
"latest"
- Can be a block number, block hash, or one of:
Response
The method returns a boolean value indicating whether the address contains code.Response structure
true— the address contains deployed contract codefalse— the address is an EOA or does not exist
Usage example
curl -X POST https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "ots_hasCode",
"params": ["0x5555555555555555555555555555555555555555", "latest"],
"id": 1
}'
from web3 import Web3
w3 = Web3(Web3.HTTPProvider("YOUR_CHAINSTACK_ENDPOINT"))
# ots_hasCode is an Otterscan namespace method, so call it as a raw JSON-RPC request.
response = w3.provider.make_request(
"ots_hasCode",
["0x5555555555555555555555555555555555555555", "latest"],
)
print(response["result"])
import { JsonRpcProvider } from "ethers";
const provider = new JsonRpcProvider("YOUR_CHAINSTACK_ENDPOINT");
// ots_hasCode is an Otterscan namespace method, so send it as a raw JSON-RPC request.
const hasCode = await provider.send("ots_hasCode", [
"0x5555555555555555555555555555555555555555",
"latest",
]);
console.log(hasCode);
import { createPublicClient, http } from "viem";
const client = createPublicClient({
transport: http("YOUR_CHAINSTACK_ENDPOINT"),
});
// ots_hasCode is an Otterscan namespace method, so issue it through the low-level request method.
const hasCode = await client.request({
method: "ots_hasCode" as any,
params: ["0x5555555555555555555555555555555555555555", "latest"] as any,
});
console.log(hasCode);
Use your own endpoint in your code. The code examples use a placeholder Chainstack endpoint (YOUR_CHAINSTACK_ENDPOINT) — replace it with your own Hyperliquid node endpoint from the Chainstack console. The curl above uses a shared public endpoint for quick checks only; do not use it in production.
Example response
{
"jsonrpc": "2.0",
"id": 1,
"result": true
}
Check at specific block
Shell
curl -X POST https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "ots_hasCode",
"params": ["0x5555555555555555555555555555555555555555", "0x1000"],
"id": 1
}'
Use cases
Theots_hasCode method is essential for:
- Address classification: Quickly determine if an address is a contract or EOA
- Transaction validation: Check if transaction targets are contracts before sending
- Security checks: Verify addresses before interacting with them
- UI differentiation: Display different interfaces for contracts vs EOAs
- Gas estimation: Optimize gas estimates based on target address type
- Contract verification: Confirm successful contract deployment
- Historical analysis: Check when contracts were deployed by testing different blocks
- Wallet integration: Warn users when sending to contracts vs regular addresses
- Smart contract interaction: Pre-validate addresses before calling contract methods
- Block explorer optimization: Efficiently categorize addresses without fetching full code
eth_getCode when you only need to know if code exists, not the actual bytecode itself.Body
application/json
Last modified on June 24, 2026
Was this page helpful?