Api

Blockchain API

Read-only blockchain queries — blocks, fees, balances, allowances, raw broadcasts

The Blockchain API exposes Hydra App's BlockchainService — read-only methods to query on-chain data and a single broadcast method for fully-signed raw transactions.

JSON-RPC namespace: blockchain

Endpoints


Get Block Number

Get the current block number for a network.

Service: BlockchainServiceMethod: GetBlockNumber

Parameters:

NameTypeRequiredDescription
networkNetworkYESNetwork to query

Response:

FieldTypeDescription
block_numberuint64Current block number/height

Example Request:

TypeScript
const blockNumber = await hydraGrpcClient.getBlockNumber({
  protocol: Protocol.BITCOIN,
  id: '0a03cf40' // Bitcoin Signet
})
Rust
let request = tonic::Request::new(GetBlockNumberRequest {
    network: Some(Network {
        protocol: Protocol::Bitcoin as i32,
        id: "0a03cf40".to_string(),
    }),
});

let response = client.get_block_number(request).await?;
let block_number = response.into_inner().block_number;

Get Block Header

Get block header information for a specific block.

Service: BlockchainServiceMethod: GetBlockHeader

Parameters:

NameTypeRequiredDescription
networkNetworkYESNetwork to query
block_numberuint64NOBlock number (omit for latest)

Response:

FieldTypeDescription
headerBlockHeaderBlock header data

BlockHeader Object:

FieldTypeDescription
hashstringBlock hash
numberuint64Block number
timestampTimestampBlock timestamp
parent_hashstringPrevious block hash

Example Request:

TypeScript
// Get latest block header
const header = await hydraGrpcClient.getBlockHeader({
  protocol: Protocol.EVM,
  id: '11155111'
})

// Get specific block
const header = await hydraGrpcClient.getBlockHeader({
  protocol: Protocol.EVM,
  id: '11155111'
}, 1000000)
Rust
// Latest block
let request = tonic::Request::new(GetBlockHeaderRequest {
    network: Some(Network {
        protocol: Protocol::Evm as i32,
        id: "11155111".to_string(),
    }),
    block_number: None,
});

let response = client.get_block_header(request).await?;
let header = response.into_inner().header;

Get Transaction By Id

Returns the details of a specific on-chain transaction by its ID.

Method: GetTransactionById

Parameters:

NameTypeRequiredDescription
networkNetworkYESTarget network
txidstringYESTransaction ID to query

Response:

FieldTypeDescription
transactionChainTransactionOn-chain transaction details

Example Request:

import { GetTransactionByIdRequest } from './proto/blockchain_pb'

const request = new GetTransactionByIdRequest()
request.setNetwork({ protocol: 1, id: '0a03cf40' })
request.setTxid('abc123def456...')

const response = await client.getTransactionById(request, {})
console.log('Transaction:', response.getTransaction()?.toObject())

Get Fee Estimates

Get current fee estimates for transactions on a network.

Service: BlockchainServiceMethod: GetFeeEstimates

Parameters:

NameTypeRequiredDescription
networkNetworkYESNetwork to get fees for

Response:

FieldTypeDescription
lowDecimalStringLow priority fee (sats/vB or gwei)
mediumDecimalStringMedium priority fee
highDecimalStringHigh priority fee

Example Request:

TypeScript
const fees = await hydraGrpcClient.getFeeEstimates({
  protocol: Protocol.BITCOIN,
  id: '0a03cf40'
})

console.log(`Low: ${fees.low} sat/vB`)
console.log(`Medium: ${fees.medium} sat/vB`)
console.log(`High: ${fees.high} sat/vB`)
Rust
let request = tonic::Request::new(GetFeeEstimatesRequest {
    network: Some(Network {
        protocol: Protocol::Bitcoin as i32,
        id: "0a03cf40".to_string(),
    }),
});

let response = client.get_fee_estimates(request).await?;
let fees = response.into_inner();
println!("Low: {} sat/vB", fees.low);
println!("Medium: {} sat/vB", fees.medium);
println!("High: {} sat/vB", fees.high);

Broadcast Raw Transaction

Broadcasts a fully signed raw transaction to the specified network. Use this when you have a pre-signed transaction in serialized form (e.g. produced offline or by an external signer).

Method: BroadcastRawTransaction

Parameters:

NameTypeRequiredDescription
networkNetworkYESTarget network
raw_txbytesYESFully signed raw transaction bytes

Response:

FieldTypeDescription
txidstringResulting transaction ID

Example Request:

import { BroadcastRawTransactionRequest } from './proto/blockchain_pb'

const request = new BroadcastRawTransactionRequest()
request.setNetwork({ protocol: 1, id: '0a03cf40' })
request.setRawTx(Buffer.from('0200000001...', 'hex'))

const response = await client.broadcastRawTransaction(request, {})
console.log('Broadcast TXID:', response.getTxid())

Example Response:

{ "txid": "abc123def456..." }

Get Address Balance

Returns the native asset balance for an arbitrary address (not necessarily this wallet's).

Method: GetAddressBalance

Parameters:

NameTypeRequiredDescription
networkNetworkYESTarget network
addressstringYESAddress to query

Response:

FieldTypeDescription
balanceDecimalStringNative asset balance

Example Request:

import { GetAddressBalanceRequest } from './proto/blockchain_pb'

const request = new GetAddressBalanceRequest()
request.setNetwork({ protocol: 2, id: '11155111' })
request.setAddress('0xabc...')

const response = await client.getAddressBalance(request, {})
console.log('Balance:', response.getBalance()?.getValue())

Example Response:

{ "balance": "1.234567" }

Get Token Balance

Returns the token balance for the given token contract and address (EVM only).

Method: GetTokenBalance

Parameters:

NameTypeRequiredDescription
networkNetworkYESEVM network
token_idstringYESToken contract address
addressstringYESHolder address

Response:

FieldTypeDescription
balanceDecimalStringToken balance

Example Request:

import { GetTokenBalanceRequest } from './proto/blockchain_pb'

const request = new GetTokenBalanceRequest()
request.setNetwork({ protocol: 2, id: '11155111' })
request.setTokenId('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48') // USDC
request.setAddress('0xabc...')

const response = await client.getTokenBalance(request, {})
console.log('Token balance:', response.getBalance()?.getValue())

Example Response:

{ "balance": "1500.000000" }

Get Token Allowance

Returns the current token allowance granted by an owner to a spender on the specified network. EVM only.

Method: GetTokenAllowance

Parameters:

NameTypeRequiredDescription
networkNetworkYESEVM network
token_idstringYESToken contract address
ownerstringYESToken owner address
spenderstringYESApproved spender address

Response:

FieldTypeDescription
allowanceTokenAllowanceAllowance details (token type + amount + approval status)

Example Request:

import { GetTokenAllowanceRequest } from './proto/blockchain_pb'

const request = new GetTokenAllowanceRequest()
request.setNetwork({ protocol: 2, id: '11155111' })
request.setTokenId('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48')
request.setOwner('0xowner...')
request.setSpender('0xspender...')

const response = await client.getTokenAllowance(request, {})
console.log('Allowance:', response.getAllowance()?.toObject())

Common Patterns

Monitor block confirmations

Rust
async fn wait_for_confirmations(
    client: &mut BlockchainServiceClient<Channel>,
    network: Network,
    tx_block: u64,
    required_confirmations: u64,
) -> Result<(), Box<dyn std::error::Error>> {
    loop {
        let current_block = client
            .get_block_number(GetBlockNumberRequest {
                network: Some(network.clone()),
            })
            .await?
            .into_inner()
            .block_number;

        let confirmations = current_block.saturating_sub(tx_block);

        if confirmations >= required_confirmations {
            return Ok(());
        }

        tokio::time::sleep(tokio::time::Duration::from_secs(15)).await;
    }
}

Get appropriate fee for urgency

Rust
async fn get_fee_for_urgency(
    client: &mut BlockchainServiceClient<Channel>,
    network: Network,
    urgent: bool,
) -> Result<String, Box<dyn std::error::Error>> {
    let fees = client
        .get_fee_estimates(GetFeeEstimatesRequest {
            network: Some(network),
        })
        .await?
        .into_inner();

    Ok(if urgent { fees.high } else { fees.medium })
}

Error Handling

Error CodeDescriptionSolution
INVALID_ARGUMENTInvalid network or parametersVerify all parameters
NOT_FOUNDBlock not foundCheck block number exists
UNAVAILABLENode temporarily unavailableRetry with backoff

Best Practices

  1. Cache fee estimates - Update every 30-60 seconds, not per transaction
  2. Monitor confirmations - Poll block number for transaction confirmations
  3. Use appropriate fees - Balance cost vs confirmation time
  4. Handle reorgs - Be aware of blockchain reorganizations on short confirmation counts

← Back to API Reference | Next: Orderbook API →


Copyright © 2025