Skip to main content
Bloklake keeps values in their native binary form: an address is 20 bytes, a hash 32 bytes, an amount a fixed-width big-endian integer. Arrow sends them as-is; JSON writes them as hex or decimal strings.

The types

Every field and its exact type is in the field reference (logs, transactions, blocks), and GET /v1/schema returns it as JSON.

Amounts are big-endian integers

value, gas prices, fees and other amounts are unsigned big-endian integers: 16 bytes (128-bit) for amounts that fit, 32 bytes (256-bit) for the Arbitrum retryable amounts that can be as large as 2²⁵⁶ − 1. They’re binary rather than UInt64 because wei amounts overflow 64 bits (1 ETH is 10¹⁸ wei; UInt64 tops out near 18.4 ETH).

Addresses in topics

Indexed address arguments of an event are stored in a 32-byte topic, left-padded with zeros. The address is the last 20 bytes:
To filter on an address in a topic, pad it the other way: "0x000000000000000000000000" + address[2:].

Unsigned integers in JavaScript

apache-arrow returns UInt64 columns as bigint (19426000n). Convert with Number(x) when you know the value fits (block numbers and timestamps do), and keep bigint for gas totals you add up.

Nulls

Every nullable field can be null in a row. There are three different reasons:
  1. The value doesn’t apply: to on a contract creation, baseFeePerGas before London, topic3 on an event with fewer indexed arguments, contractAddress on a normal call.
  2. The chain didn’t report it: status on pre-Byzantium transactions.
  3. The chain never has the field: listed in unavailable_fields. See Fields a chain doesn’t have.
Fields marked non-nullable in the reference are never null.

Nested fields

withdrawals, accessList and authorizationList are lists of structs; uncles and blobVersionedHashes are lists of hashes. They are not flattened.
In JSON they’re arrays of objects with snake_case keys (validator_index, storage_keys).

Booleans

status, timeboosted and isSystemTx are UInt8: 1 is true, 0 is false, null is unknown or not applicable.