Skip to main content

The Graph Queries: ENS, Uniswap, Aave & More

Access indexed blockchain data through The Graph subgraphs. Query ENS registrations, Uniswap pools, Aave markets, and Lido staking stats.

Overview​

The Graph indexes blockchain data and makes it queryable via GraphQL. We provide pre-built endpoints for popular subgraphs:

  • ENS - Domain registrations, transfers, ownership
  • Uniswap V3 - Pools, swaps, liquidity, stats
  • Aave V3 - Lending markets, rates, utilization
  • Lido - Staking stats, submissions

All endpoints are prefixed with /api/graph/.

Prerequisites​

npm install @atv-eth/x402-sdk
# or use curl/fetch directly

ENS Subgraph​

Recent Registrations​

const registrations = await fetch('https://api.web3identity.com/api/graph/ens/registrations?limit=25');
const data = await registrations.json();

console.log('Recent ENS Registrations:');
data.registrations.forEach(r => {
console.log(` ${r.name}`);
console.log(` Registrant: ${r.registrant?.slice(0, 10)}...`);
console.log(` Registered: ${r.registrationDate}`);
console.log(` Expires: ${r.expiryDate}`);
});

Response:

{
"registrations": [
{
"name": "coolname.eth",
"label": "coolname",
"registrant": "0x1234567890abcdef...",
"registrationDate": "2026-02-09T08:00:00.000Z",
"expiryDate": "2027-02-09T08:00:00.000Z",
"cost": "5000000000000000000"
}
],
"count": 25,
"source": "thegraph/ens",
"timestamp": "2026-02-09T08:30:00.000Z"
}

Domain Lookup​

const name = 'vitalik.eth';
const domain = await fetch(`https://api.web3identity.com/api/graph/ens/domain/${name}`);
const data = await domain.json();

console.log(`Domain: ${data.name}`);
console.log(`Owner: ${data.owner}`);
console.log(`Resolver: ${data.resolver}`);
console.log(`Created: ${data.createdAt}`);
console.log(`Expires: ${data.expiryDate}`);
console.log(`Subdomains: ${data.subdomainCount}`);

Recent Transfers​

const transfers = await fetch('https://api.web3identity.com/api/graph/ens/transfers?limit=25');
const data = await transfers.json();

console.log('Recent ENS Transfers:');
data.transfers.forEach(t => {
console.log(` ${t.name} → ${t.newOwner?.slice(0, 10)}...`);
console.log(` Block: ${t.blockNumber}, TX: ${t.txHash?.slice(0, 16)}...`);
});

Domains by Owner​

const owner = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045';
const domains = await fetch(`https://api.web3identity.com/api/graph/ens/owner/${owner}?limit=50`);
const data = await domains.json();

console.log(`Domains owned by ${data.owner?.slice(0, 10)}...:`);
data.domains.forEach(d => {
console.log(` ${d.name}`);
console.log(` Created: ${d.createdAt}, Expires: ${d.expiryDate}`);
});

Uniswap V3 Subgraph​

Top Pools by TVL​

const pools = await fetch('https://api.web3identity.com/api/graph/uniswap/pools?limit=20');
const data = await pools.json();

console.log('Top Uniswap V3 Pools by TVL:');
data.pools.forEach((pool, i) => {
console.log(`${i + 1}. ${pool.pair}`);
console.log(` Address: ${pool.address?.slice(0, 10)}...`);
console.log(` Fee: ${pool.feeTier}`);
console.log(` TVL: $${pool.tvlUsd?.toLocaleString()}`);
console.log(` Volume: $${pool.volumeUsd?.toLocaleString()}`);
});

Response:

{
"pools": [
{
"address": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"pair": "USDC/ETH",
"token0": "USDC",
"token1": "ETH",
"feeTier": "0.3%",
"tvlUsd": 456789012.34,
"volumeUsd": 12345678901.23,
"txCount": 5678901
}
],
"count": 20,
"source": "thegraph/uniswap-v3",
"timestamp": "2026-02-09T08:30:00.000Z"
}

Pool Details​

const poolAddress = '0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8';
const pool = await fetch(`https://api.web3identity.com/api/graph/uniswap/pool/${poolAddress}`);
const data = await pool.json();

console.log(`Pool: ${data.token0.symbol}/${data.token1.symbol}`);
console.log(`Fee Tier: ${data.feeTier}`);
console.log(`TVL: $${data.tvlUsd?.toLocaleString()}`);
console.log(`Total Volume: $${data.volumeUsd?.toLocaleString()}`);
console.log(`Total Transactions: ${data.txCount?.toLocaleString()}`);
console.log(`Created: ${data.createdAt}`);

Recent Swaps​

const swaps = await fetch('https://api.web3identity.com/api/graph/uniswap/swaps?limit=25');
const data = await swaps.json();

console.log('Recent Uniswap Swaps:');
data.swaps.forEach(swap => {
console.log(` ${swap.pair}: $${swap.amountUsd?.toFixed(2)}`);
console.log(` Sender: ${swap.sender?.slice(0, 10)}...`);
console.log(` Time: ${swap.timestamp}`);
});

Uniswap Protocol Stats​

const stats = await fetch('https://api.web3identity.com/api/graph/uniswap/stats');
const data = await stats.json();

console.log('Uniswap V3 Protocol Stats:');
console.log(` Total Pools: ${data.poolCount?.toLocaleString()}`);
console.log(` Total Transactions: ${data.txCount?.toLocaleString()}`);
console.log(` Total Volume: $${data.totalVolumeUsd?.toLocaleString()}`);
console.log(` Total TVL: $${data.tvlUsd?.toLocaleString()}`);

Aave V3 Subgraph​

Lending Markets​

const markets = await fetch('https://api.web3identity.com/api/graph/aave/markets?limit=25');
const data = await markets.json();

console.log('Aave V3 Markets:');
data.markets.forEach(market => {
console.log(`\n${market.symbol} (${market.name})`);
console.log(` Supply APY: ${(market.supplyApy * 100).toFixed(2)}%`);
console.log(` Borrow APY: ${(market.borrowApy * 100).toFixed(2)}%`);
console.log(` Utilization: ${(market.utilization * 100).toFixed(1)}%`);
console.log(` Total Liquidity: ${market.totalLiquidity}`);
console.log(` Total Borrowed: ${market.totalBorrowed}`);
});

Response:

{
"markets": [
{
"id": "0x...",
"name": "Wrapped Ether",
"symbol": "WETH",
"totalLiquidity": "1234567890000000000000",
"availableLiquidity": "987654321000000000000",
"totalBorrowed": "246913579000000000000",
"supplyApy": 0.0234,
"borrowApy": 0.0456,
"utilization": 0.20
}
],
"count": 25,
"source": "thegraph/aave-v3",
"timestamp": "2026-02-09T08:30:00.000Z"
}

Lido Subgraph​

Staking Stats​

const stats = await fetch('https://api.web3identity.com/api/graph/lido/stats');
const data = await stats.json();

console.log('Lido Staking Stats:');
console.log(` Total Pooled ETH: ${data.totalPooledEther}`);
console.log(` Total Shares: ${data.totalShares}`);

if (data.latestSubmission) {
console.log(`\nLatest Submission:`);
console.log(` Sender: ${data.latestSubmission.sender}`);
console.log(` Amount: ${data.latestSubmission.amount}`);
console.log(` Block: ${data.latestSubmission.block}`);
}

Custom Queries​

Query Any Subgraph​

For advanced users, you can run custom GraphQL queries:

const query = `{
domains(first: 10, where: {name_contains: "vitalik"}) {
name
owner {
id
}
}
}`;

const response = await fetch('https://api.web3identity.com/api/graph/query/ens', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ query })
});

const data = await response.json();
console.log('Custom query results:', data.data);

List Available Subgraphs​

const subgraphs = await fetch('https://api.web3identity.com/api/graph/subgraphs');
const data = await subgraphs.json();

console.log('Available Subgraphs:');
data.subgraphs.forEach(sg => {
console.log(` ${sg.name}: ${sg.endpoint}`);
});

Available subgraphs:

  • ens - ENS domains
  • uniswapV3 - Uniswap V3
  • aaveV3 - Aave V3
  • lido - Lido staking
  • compound - Compound V2

Building an ENS Activity Monitor​

async function getENSActivity(limit = 20) {
const [registrations, transfers] = await Promise.all([
fetch(`https://api.web3identity.com/api/graph/ens/registrations?limit=${limit}`).then(r => r.json()),
fetch(`https://api.web3identity.com/api/graph/ens/transfers?limit=${limit}`).then(r => r.json())
]);

const activity = [];

registrations.registrations.forEach(r => {
activity.push({
type: 'registration',
name: r.name,
actor: r.registrant,
timestamp: new Date(r.registrationDate).getTime()
});
});

transfers.transfers.forEach(t => {
activity.push({
type: 'transfer',
name: t.name,
actor: t.newOwner,
timestamp: parseInt(t.blockNumber) // Approximate
});
});

// Sort by timestamp descending
activity.sort((a, b) => b.timestamp - a.timestamp);

return activity.slice(0, limit);
}

// Usage
const activity = await getENSActivity(25);
activity.forEach(a => {
console.log(`[${a.type.toUpperCase()}] ${a.name}`);
});

Building a DeFi Dashboard​

async function getDeFiOverview() {
const [uniswapStats, aaveMarkets, lidoStats] = await Promise.all([
fetch('https://api.web3identity.com/api/graph/uniswap/stats').then(r => r.json()),
fetch('https://api.web3identity.com/api/graph/aave/markets?limit=10').then(r => r.json()),
fetch('https://api.web3identity.com/api/graph/lido/stats').then(r => r.json())
]);

return {
uniswap: {
tvl: uniswapStats.tvlUsd,
totalVolume: uniswapStats.totalVolumeUsd,
pools: uniswapStats.poolCount
},
aave: {
markets: aaveMarkets.markets?.slice(0, 5).map(m => ({
symbol: m.symbol,
supplyApy: (m.supplyApy * 100).toFixed(2) + '%',
borrowApy: (m.borrowApy * 100).toFixed(2) + '%'
}))
},
lido: {
totalStaked: lidoStats.totalPooledEther
},
timestamp: new Date().toISOString()
};
}

// Usage
const overview = await getDeFiOverview();
console.log(JSON.stringify(overview, null, 2));

Endpoint Reference​

EndpointDescriptionPrice
/api/graph/ens/registrationsRecent ENS registrations$0.01
/api/graph/ens/domain/:nameDomain details$0.01
/api/graph/ens/transfersRecent transfers$0.01
/api/graph/ens/owner/:addressDomains by owner$0.01
/api/graph/uniswap/poolsTop pools by TVL$0.01
/api/graph/uniswap/pool/:addressPool details$0.01
/api/graph/uniswap/swapsRecent swaps$0.01
/api/graph/uniswap/statsProtocol stats$0.01
/api/graph/aave/marketsLending markets$0.01
/api/graph/lido/statsStaking stats$0.01
POST /api/graph/query/:subgraphCustom query$0.02
/api/graph/subgraphsList subgraphsFree

Important Notes​

Data Freshness​

The Graph indexes data with some delay:

  • Decentralized network (Uniswap, Aave): ~1-5 minutes
  • Hosted service (ENS, Lido): ~10-30 seconds
  • For real-time data, use RPC endpoints directly

Pagination​

Use the limit query parameter (max 100):

// First page
const page1 = await fetch('/api/graph/ens/registrations?limit=50');

// For more data, use custom queries with skip
const query = `{
registrations(first: 50, skip: 50, orderBy: registrationDate, orderDirection: desc) {
...
}
}`;

Rate Limits​

  • Free tier: 100 calls/day
  • Cache TTL: 60 seconds for most endpoints
  • Custom queries may have stricter limits

Next Steps​