PluginBench
Skill
Official
Review
Audit score 70

query-onchain-data

coinbase/agentic-wallet-skills

Query onchain data on Base using the CDP SQL API via x402 with decoded events, transactions, and blocks.

What is query-onchain-data?

Query decoded onchain data on Base (events, transactions, blocks) using the CDP SQL API via x402. Use this when you need to retrieve specific blockchain information like event logs, transaction details, or block metadata. Queries are charged per execution.

  • Query decoded event logs from smart contracts with filtered parameters
  • Retrieve transaction details including sender, recipient, value, and gas information
  • Access block-level metadata such as timestamps, gas usage, and transaction counts
  • Filter efficiently using indexed fields (event_signature, address, block_timestamp)
  • Support complex queries with joins, CTEs, GROUP BY, and subqueries via CoinbaseQL

How to install query-onchain-data

npx skills add https://github.com/coinbase/agentic-wallet-skills --skill query-onchain-data
Prerequisites
  • Wallet initialized and authenticated (use authenticate-wallet skill if needed)
  • Valid x402 account with balance to pay per-query fees
  • Knowledge of SQL and CoinbaseQL syntax
Claude Code
Cursor
Windsurf
Cline

How to use query-onchain-data

  1. 1.Confirm wallet status with: npx awal@2.10.0 status
  2. 2.Construct your SQL query using CoinbaseQL syntax, filtering on at least one indexed field (event_signature, address, or block_timestamp)
  3. 3.Execute the query via: npx awal@2.10.0 x402 pay https://x402.cdp.coinbase.com/platform/v2/data/query/run -X POST -d '{"sql": "YOUR_QUERY"}' --json
  4. 4.Always single-quote the -d JSON string to prevent bash variable expansion
  5. 5.Review results and adjust query filters or LIMIT as needed

Use cases

Good for
  • Track USDC or other token transfers by querying Transfer events with decoded parameters
  • Analyze transaction history for a specific address over a time range
  • Monitor contract activity by counting events by type in the last hour
  • Retrieve latest block information and chain state
  • Build dashboards of onchain activity filtered by contract address and time
Who it's for
  • Blockchain analysts and researchers
  • DeFi developers building onchain applications
  • Traders monitoring token transfers and contract interactions
  • Data engineers building analytics pipelines
  • Anyone needing to query Base mainnet onchain data

query-onchain-data FAQ

What indexed fields should I use for best performance?

Always filter on at least one of: event_signature (for event type), address (for contract), or block_timestamp (for time range). Combining all three gives the best performance. Avoid full table scans by never querying base.events without these filters.

Why should I use event_signature instead of event_name?

event_signature is indexed while event_name is not. Using event_signature is much faster and prevents full table scans. Both return the same event type information.

How do I prevent shell injection when passing queries?

Always single-quote the entire -d JSON string (not double quotes) to prevent bash variable expansion. Validate addresses to match ^0x[0-9a-fA-F]{40}$ and never embed unvalidated user input directly in SQL.

What tables are available for querying?

Three main tables: base.events (decoded event logs), base.transactions (transaction data), and base.blocks (block metadata). base.events is the primary table for most queries.

How are queries charged?

Queries are executed via x402 and charged per query execution. Ensure your x402 account has sufficient balance before running queries.

Full instructions (SKILL.md)

Source of truth, from coinbase/agentic-wallet-skills.


name: query-onchain-data description: Query onchain data on Base using the CDP SQL API via x402. Use when you or your user want to view onchain information about decoded blocks, transactions, and events. user-invocable: true disable-model-invocation: false allowed-tools: ["Bash(npx awal@2.10.0 status*)", "Bash(npx awal@2.10.0 balance*)", "Bash(npx awal@2.10.0 x402 pay *)"]

Query Onchain Data on Base

Use the CDP SQL API to query onchain data (events, transactions, blocks, transfers) on Base. Queries are executed via x402 and are charged per query.

Confirm wallet is initialized and authed

npx awal@2.10.0 status

If the wallet is not authenticated, refer to the authenticate-wallet skill.

Executing a Query

npx awal@2.10.0 x402 pay https://x402.cdp.coinbase.com/platform/v2/data/query/run -X POST -d '{"sql": "<YOUR_QUERY>"}' --json

IMPORTANT: Always single-quote the -d JSON string to prevent bash variable expansion.

Input Validation

Before constructing the command, validate inputs to prevent shell injection:

  • SQL query: Always embed the query inside a single-quoted JSON string (-d '{"sql": "..."}'). Never use double quotes for the outer -d wrapper, as this enables shell expansion of $ and backticks within the query.
  • Addresses: Must be valid 0x hex addresses (^0x[0-9a-fA-F]{40}$). Reject any value containing shell metacharacters.

Do not pass unvalidated user input into the command.

CRITICAL: Indexed Fields

Queries against base.events MUST filter on indexed fields to avoid full table scans. The indexed fields are:

Indexed FieldUse For
event_signatureFilter by event type. Use this instead of event_name for performance.
addressFilter by contract address.
block_timestampFilter by time range.

Always include at least one indexed field in your WHERE clause. Combining all three gives the best performance.

CoinbaseQL Syntax

CoinbaseQL is a SQL dialect based on ClickHouse. Supported features:

  • Clauses: SELECT (DISTINCT), FROM, WHERE, GROUP BY, ORDER BY (ASC/DESC), LIMIT, WITH (CTEs), UNION (ALL/DISTINCT)
  • Joins: INNER, LEFT, RIGHT, FULL with ON
  • Operators: =, !=, <>, <, >, <=, >=, +, -, *, /, %, AND, OR, NOT, BETWEEN, IN, IS NULL, LIKE
  • Expressions: CASE/WHEN/THEN/ELSE, CAST (both CAST() and :: syntax), subqueries, array/map indexing with [], dot notation
  • Literals: Array [...], Map {...}, Tuple (...)
  • Functions: Standard SQL functions, lambda functions with -> syntax

Available Tables

base.events

Decoded event logs from smart contract interactions. This is the primary table for most queries.

ColumnTypeDescription
log_idStringUnique log identifier
block_numberUInt64Block number
block_hashFixedString(66)Block hash
block_timestampDateTime64(3, 'UTC')Block timestamp (INDEXED)
transaction_hashFixedString(66)Transaction hash
transaction_toFixedString(42)Transaction recipient
transaction_fromFixedString(42)Transaction sender
log_indexUInt32Log index within block
addressFixedString(42)Contract address (INDEXED)
topicsArray(FixedString(66))Event topics
event_nameLowCardinality(String)Decoded event name
event_signatureLowCardinality(String)Event signature (INDEXED - prefer over event_name)
parametersMap(String, Variant(Bool, Int256, String, UInt256))Decoded event parameters
parameter_typesMap(String, String)ABI types for parameters
actionEnum8('removed' = -1, 'added' = 1)Added or removed (reorg)

base.transactions

Complete transaction data.

ColumnTypeDescription
block_numberUInt64Block number
block_hashStringBlock hash
transaction_hashStringTransaction hash
transaction_indexUInt64Index in block
from_addressStringSender address
to_addressStringRecipient address
valueStringValue transferred (wei)
gasUInt64Gas limit
gas_priceUInt64Gas price
inputStringInput data
nonceUInt64Sender nonce
typeUInt64Transaction type
max_fee_per_gasUInt64EIP-1559 max fee
max_priority_fee_per_gasUInt64EIP-1559 priority fee
chain_idUInt64Chain ID
vStringSignature v
rStringSignature r
sStringSignature s
is_system_txBoolSystem transaction flag
max_fee_per_blob_gasStringBlob gas fee
blob_versioned_hashesArray(String)Blob hashes
timestampDateTimeBlock timestamp
actionInt8Added (1) or removed (-1)

base.blocks

Block-level metadata.

ColumnTypeDescription
block_numberUInt64Block number
block_hashStringBlock hash
parent_hashStringParent block hash
timestampDateTimeBlock timestamp
minerStringBlock producer
nonceUInt64Block nonce
sha3_unclesStringUncles hash
transactions_rootStringTransactions merkle root
state_rootStringState merkle root
receipts_rootStringReceipts merkle root
logs_bloomStringBloom filter
gas_limitUInt64Block gas limit
gas_usedUInt64Gas used in block
base_fee_per_gasUInt64Base fee per gas
total_difficultyStringTotal chain difficulty
sizeUInt64Block size in bytes
extra_dataStringExtra data field
mix_hashStringMix hash
withdrawals_rootStringWithdrawals root
parent_beacon_block_rootStringBeacon chain parent root
blob_gas_usedUInt64Blob gas used
excess_blob_gasUInt64Excess blob gas
transaction_countUInt64Number of transactions
actionInt8Added (1) or removed (-1)

Example Queries

Get recent USDC Transfer events with decoded parameters

SELECT
  parameters['from'] AS sender,
  parameters['to'] AS to,
  parameters['value'] AS amount,
  address AS token_address
FROM base.events
WHERE
  event_signature = 'Transfer(address,address,uint256)'
  AND address = '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913'
  AND block_timestamp >= now() - INTERVAL 7 DAY
LIMIT 10

Get transactions from a specific address

npx awal@2.10.0 x402 pay https://x402.cdp.coinbase.com/platform/v2/data/query/run -X POST -d '{"sql": "SELECT transaction_hash, to_address, value, gas, timestamp FROM base.transactions WHERE from_address = lower('\''0xYOUR_ADDRESS'\'') AND timestamp >= now() - INTERVAL 1 DAY LIMIT 10"}' --json

Count events by type for a contract in the last hour

npx awal@2.10.0 x402 pay https://x402.cdp.coinbase.com/platform/v2/data/query/run -X POST -d '{"sql": "SELECT event_signature, count(*) as cnt FROM base.events WHERE address = lower('\''0xCONTRACT_ADDRESS'\'') AND block_timestamp >= now() - INTERVAL 1 HOUR GROUP BY event_signature ORDER BY cnt DESC LIMIT 20"}' --json

Get latest block info

npx awal@2.10.0 x402 pay https://x402.cdp.coinbase.com/platform/v2/data/query/run -X POST -d '{"sql": "SELECT block_number, timestamp, transaction_count, gas_used FROM base.blocks ORDER BY block_number DESC LIMIT 1"}' --json

Common Contract Addresses (Base)

TokenAddress
USDC0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
WETH0x4200000000000000000000000000000000000006

Best Practices

  1. Always filter on indexed fields (event_signature, address, block_timestamp) in base.events queries.
  2. Never use SELECT * - specify only the columns you need.
  3. Always include a LIMIT clause to bound result size.
  4. Use event_signature instead of event_name for filtering - it is indexed and much faster.
  5. Use time-bounded queries with block_timestamp to narrow the scan range.
  6. Always wrap address values in lower() - the database stores lowercase addresses but users may provide checksummed (mixed-case) addresses. Use address = lower('0xAbC...') not address = '0xAbC...'.
  7. Common event signatures: Transfer(address,address,uint256), Approval(address,address,uint256), Swap(address,uint256,uint256,uint256,uint256,address).

Prerequisites

  • Must be authenticated (npx awal@2.10.0 status to check, see authenticate-wallet skill)
  • Wallet must have sufficient USDC balance (npx awal@2.10.0 balance to check)
  • Each query costs $0.10 (100000 USDC atomic units)

Error Handling

  • "Not authenticated" - Run awal auth login <email> first, or see authenticate-wallet skill
  • "Insufficient balance" - Fund wallet with USDC; see fund skill
  • Query timeout or error - Ensure you are filtering on indexed fields and using a LIMIT