diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index de7a8cbff..778ec28ba 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -4,6 +4,230 @@ All notable changes to the Bitcoin Research Kit (BRK) project will be documented > *This changelog was generated by Claude Code* +## [v0.3.0-alpha.1](https://github.com/bitcoinresearchkit/brk/releases/tag/v0.3.0-alpha.1) - 2026-04-03 + +### Breaking Changes + +#### `brk_types` +- Changed `DifficultyAdjustment` time units from seconds to milliseconds for `estimated_retarget_date`, `remaining_time`, `time_avg`, and `adjusted_time_avg` to match mempool.space API format ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/difficulty_adjustment.rs)) +- Changed `DifficultyEntry` field `timestamp` to `time` and added `adjustment: f64` field (ratio of new/previous difficulty) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/difficulty_entry.rs)) +- Changed `Transaction` field ordering — `input` and `output` now serialize before `size`/`weight`/`fee`/`status` to match mempool.space format ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/tx.rs)) +- Changed `TxIn` to include `witness: Vec` and `inner_witness_script_asm` fields — witness data now hex-encoded and included in serialization; removed `script_sig_asm()` and `inner_redeemscript_asm()` methods (logic moved to custom `Serialize` impl that dynamically includes fields based on content) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/txin.rs)) +- Removed `time: u32` field from `BlockHeader` — block timestamp is already present on the parent `BlockInfo` struct as `timestamp`, so the duplicate was removed ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/block_header.rs)) +- Renamed `PoolDetailInfo.addrs` to `addresses` for mempool.space API compatibility ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/pool_detail.rs)) +- Changed `PoolsSummary` to use `#[serde(rename_all = "camelCase")]` instead of per-field `#[serde(rename)]` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/pools_summary.rs)) +- Moved all API parameter types (`AddrParam`, `BlockHashParam`, `HeightParam`, `TxidParam`, etc.) from `brk_types` into a new `brk_server::params` module — 17 param types relocated to keep `brk_types` focused on domain types ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_server/src/params/mod.rs)) + +#### `brk_server` +- Overhauled cache strategy system: renamed `Height` to `Tip` (etag based on tip block hash prefix instead of height), added `Immutable(Version)` for deep/confirmed data, added `BlockBound(Version, BlockHashPrefix)` for reorg-aware caching, changed etag format from `{VERSION}-{height}` to prefix-coded format (`t{hash:x}`, `i{version}`, `b{version}-{hash:x}`, `s{VERSION}`, `m{hash:x}`) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_server/src/cache.rs)) +- Reorganized API route files from `api/addrs/`, `api/blocks/`, `api/fees/`, `api/general/`, `api/mempool/`, `api/mining/`, `api/transactions/` into `api/mempool_space/` directory ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_server/src/api/mempool_space/mod.rs)) + +### New Features + +#### `brk_types` +- Added `error_locations: Option>` and `error: Option` fields to `AddrValidation` for reporting validation errors on invalid addresses ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/addr_validation.rs)) +- Added `previous_time: Timestamp` and `expected_blocks: f64` fields to `DifficultyAdjustment` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/difficulty_adjustment.rs)) +- Added `From<(Sats, Weight)>` impl for `FeeRate` to compute fee rates from weight instead of only vsize ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/feerate.rs)) +- Added `unique_id` field to `PoolDetailInfo` and `pool_unique_id` to `PoolStats` for pool identification across endpoints ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/pool_detail.rs)) +- Added `last_estimated_hashrate3d` and `last_estimated_hashrate1w` fields to `PoolsSummary` for 3-day and 1-week hashrate estimates ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/pools_summary.rs)) +- Added two new mining pools: `BraiinsSolo` and `SoloPool` (replacing dummy slots 168-169), increasing pool count to 170 ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/pool_slug.rs)) + +#### `brk_indexer` +- Added `tip_blockhash()` accessor that returns the current chain tip block hash via a shared `Arc>`, updated on each indexed block ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_indexer/src/lib.rs)) +- Added `check_xor_bytes()` that detects Bitcoin Core XOR obfuscation key changes and triggers a full index reset when the key differs from the cached value ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_indexer/src/lib.rs)) + +#### `brk_server` +- Added smart cache strategy helpers on `AppState`: `height_cache()` returns `Immutable` for blocks >6 deep and `Tip` for recent; `addr_cache()` checks mempool activity; `block_cache()` and `block_status_cache()` use `BlockBound` for reorg-aware caching; `tx_cache()` selects strategy based on confirmation depth ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_server/src/state.rs)) + +#### `brk_rpc` +- Added witness data to `TxIn` construction — each witness stack item is now hex-encoded and included in the `witness` field ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_rpc/src/lib.rs)) +- Added `inner_witness_script_asm` field to `TxIn` for P2WSH transactions — decodes the last witness item as a script and formats in ASM ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_rpc/src/lib.rs)) + +### Bug Fixes + +#### `brk_cohort` +- Fixed off-by-one error in profit threshold iterator `iter_ge_thresholds()` — range was missing one cohort per threshold ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_cohort/src/profit.rs)) +- Fixed off-by-one error in loss threshold iterator — range included one extra cohort per threshold ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_cohort/src/loss.rs)) + +### Internal Changes + +#### `brk_computer` +- Bumped profitability aggregate version to `Version::TWO` to trigger recomputation with corrected cohort threshold ranges ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_computer/src/distribution/metrics/profitability.rs)) +- Bumped pools version from 3 to 4 for the new BraiinsSolo and SoloPool additions ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_computer/src/pools/mod.rs)) + +#### `brk_indexer` +- Added export phase logging with total elapsed time (`"Exporting..."` / `"Exported in {:?}"`) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_indexer/src/lib.rs)) + +#### `brk_types` +- Added doc comments to `Transaction`, `TxIn`, `DifficultyAdjustmentEntry`, `DifficultyEntry`, and `RewardStats` fields ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/tx.rs)) +- Trimmed verbose `#[schemars(example)]` annotations on `TxIn` fields to reduce generated schema size ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/txin.rs)) + +[View changes](https://github.com/bitcoinresearchkit/brk/compare/v0.3.0-alpha.0...v0.3.0-alpha.1) + +## [v0.3.0-alpha.0](https://github.com/bitcoinresearchkit/brk/releases/tag/v0.3.0-alpha.0) - 2026-04-01 + +### Breaking Changes + +#### `brk_types` +- Changed `BlockInfo` struct to include a flattened `BlockHeader` field and `median_time: Timestamp`, and changed `tx_count` from `usize` to `u32` — existing consumers of `BlockInfo` must update to the new field layout ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/block_info.rs)) +- Changed `Block::coinbase_tag()` return type from `Cow<'_, str>` to `CoinbaseTag` — callers must use `.as_str()` to get a string ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/block.rs)) +- Simplified `get_percentile` to use nearest-rank method (no interpolation), removing `Add` and `Div` trait bounds — only `Clone` is now required ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/percentile.rs)) + +#### `brk_indexer` +- Bumped indexer data VERSION from 25 to 26 — requires full re-index when upgrading ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/constants.rs)) +- Removed `height_to_coinbase_tag` KV store — coinbase tags migrated from `brk_store` to indexed vec storage ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/stores.rs)) +- Changed `index()` and `checked_index()` to accept `&Reader` instead of `&Blocks`, removing the `brk_iterator` dependency ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/lib.rs)) + +#### `brk_computer` +- Removed `positions` module entirely — block/tx positions now indexed directly by `brk_indexer` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_computer/src/lib.rs)) +- Removed `reader: &Reader` parameter from `Computer::compute()` since positions are no longer needed at compute time ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_computer/src/lib.rs)) + +#### `brk_store` +- Removed `Kind::Sequential` store variant and its `is_sequential()` method ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_store/src/kind.rs)) + +### New Features + +#### `brk_types` +- Added `BlockExtras` struct matching mempool.space `/api/v1/blocks` extras format with 25 fields: totalFees, medianFee, feeRange, reward, pool, avgFee, avgFeeRate, coinbaseRaw, coinbaseAddress, coinbaseAddresses, coinbaseSignature, coinbaseSignatureAscii, avgTxSize, totalInputs, totalOutputs, totalOutputAmt, medianFeeAmt, feePercentiles, segwitTotalTxs, segwitTotalSize, segwitTotalWeight, header, utxoSetChange, utxoSetSize, totalInputAmt, virtualSize ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/block_extras.rs)) +- Added `BlockHeader` struct matching mempool.space format with version, previousblockhash, merkle_root, time, bits, nonce — includes `From` conversion ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/block_header.rs)) +- Added `BlockInfoV1` struct combining `BlockInfo` with `BlockExtras` for the mempool.space v1 blocks endpoint ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/block_info_v1.rs)) +- Added `BlockPool` struct for mining pool identification (id, name, slug) in block extras ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/block_pool.rs)) +- Added `CoinbaseTag` struct — fixed 101-byte record (1-byte length + 100 bytes data) with latin-1 decoding via `as_str()`, proper JSON escaping for control characters, and `Bytes`/`Formattable` implementations for vec storage ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/coinbase_tag.rs)) +- Added `CpfpInfo` and `CpfpEntry` structs for Child-Pays-For-Parent transaction data ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/cpfp.rs)) +- Added `Prices`, `HistoricalPrice`, `HistoricalPriceEntry`, and `ExchangeRates` structs matching mempool.space `/api/v1/prices` format ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/historical_price.rs)) +- Added `MempoolRecentTx` struct with txid, fee, vsize, value — constructed from `(&Txid, &Transaction)` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/mempool_recent_tx.rs)) +- Added `MerkleProof` struct with block_height, merkle path, and position ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/merkle_proof.rs)) +- Added `PoolHashrateEntry` struct with timestamp, avg_hashrate, share, and pool_name ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/pool_hashrate_entry.rs)) +- Added `PoolSlugAndHeightParam` for endpoints requiring both pool slug and height ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/pool_slug_param.rs)) +- Added `fee_histogram` field to `MempoolInfo` — incrementally maintained `BTreeMap` that updates on tx add/remove, serialized as `[[fee_rate, vsize], ...]` sorted by descending fee rate ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/mempool_info.rs)) + +#### `brk_indexer` +- Added `coinbase_tag: BytesVec` to `BlocksVecs` — stores coinbase scriptSig tags as indexed vec data for fast range queries ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/vecs/blocks.rs)) +- Added `position: PcoVec` to `BlocksVecs` — indexes each block's file position for random-access reads from blk files ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/vecs/blocks.rs)) +- Added `position: PcoVec` to `TransactionsVecs` — indexes each transaction's file position ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/vecs/transactions.rs)) +- Added per-block segwit tracking: `segwit_txs` (count), `segwit_size` (bytes), `segwit_weight` (weight units) — computed during block processing ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/vecs/blocks.rs)) +- Added `is_segwit()` and `weight()` methods to `ComputedTx` for detecting segwit transactions and computing tx weight ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/processor/types.rs)) + +#### `brk_reader` +- Added `read_rev()` method for reverse-order block reading (newest first) by scanning `.blk` files from the tail in 5MB chunks — efficient for reading recent blocks without scanning from genesis ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_reader/src/lib.rs)) +- Added `after()` method that streams blocks from `hash + 1` to chain tip — replaces the `Blocks` iterator pattern ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_reader/src/lib.rs)) +- Extracted block scanning logic into `scan.rs` module with reusable `scan_bytes()` function and `ScanResult` struct, shared by both forward and reverse reading ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_reader/src/scan.rs)) + +#### `brk_query` +- Added `block_by_height_v1()` returning `BlockInfoV1` with full extras (pool, fees, segwit stats, coinbase data, UTXO set changes) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/block/info.rs)) +- Added `blocks_v1()` and `blocks_v1_range()` for batch v1 block queries with all extras data ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/block/info.rs)) +- Added `block_header_hex()` that reads the raw 80-byte header from blk files and returns it as hex ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/block/info.rs)) +- Added `block_hash_by_height()` for direct height-to-hash lookups ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/block/info.rs)) +- Block queries now read block headers from raw blk data and compute `median_time` (median of last 11 block timestamps) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/block/info.rs)) +- Added `transaction_raw()` returning raw transaction bytes by reading from blk files via indexed position ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/tx.rs)) +- Added `broadcast_transaction()` that forwards raw transaction hex to the RPC client for broadcasting ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/tx.rs)) +- Added `merkle_proof()` returning a `MerkleProof` with block height, merkle path hashes, and tx position within the block ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/tx.rs)) +- Added `merkleblock_proof()` returning a BIP37-format merkleblock proof as hex for SPV verification ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/tx.rs)) +- Added `mempool_recent()` returning the last 10 transactions to enter the mempool ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/mempool.rs)) +- Added `cpfp()` computing CPFP (Child-Pays-For-Parent) relationships by walking ancestor/descendant dependency chains in the mempool entry pool ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/mempool.rs)) +- Added `transaction_times()` returning first-seen timestamps for a batch of txids from mempool entries ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/mempool.rs)) + +#### `brk_server` +- Added `/api/block/{hash}` endpoint returning `BlockInfo` with full header fields and median time ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/blocks/mod.rs)) +- Added `/api/v1/block/{hash}` endpoint returning `BlockInfoV1` with extras (fees, pool, segwit, coinbase, UTXO stats) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/blocks/mod.rs)) +- Added `/api/v1/blocks` and `/api/v1/blocks/{height}` endpoints returning blocks with extras data ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/blocks/mod.rs)) +- Added `/api/block/{hash}/header` endpoint returning the raw 80-byte block header as hex text ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/blocks/mod.rs)) +- Added `/api/block-height/{height}` endpoint returning block hash as plain text ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/blocks/mod.rs)) +- Added `POST /api/tx` endpoint for broadcasting raw transaction hex to the Bitcoin network ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/transactions/mod.rs)) +- Added `/api/tx/{txid}/raw` endpoint returning raw transaction bytes ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/transactions/mod.rs)) +- Added `/api/tx/{txid}/merkle-proof` endpoint returning JSON merkle inclusion proof (block_height, merkle path, position) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/transactions/mod.rs)) +- Added `/api/tx/{txid}/merkleblock-proof` endpoint returning BIP37-format merkleblock proof as hex ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/transactions/mod.rs)) +- Added `/api/v1/cpfp/{txid}` endpoint returning CPFP ancestor/descendant relationships and effective fee rate ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/mempool/mod.rs)) +- Added `/api/mempool/recent` endpoint returning the last 10 transactions to enter the mempool ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/mempool/mod.rs)) +- Added bundled Scalar API docs viewer (`scalar.js` + `scalar.html`) for interactive OpenAPI documentation ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/scalar.html)) + +#### `brk_rpc` +- Added `send_raw_transaction()` to both `bitcoincore` and `corepc` RPC backends for broadcasting raw transaction hex ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_rpc/src/lib.rs)) + +#### `brk_mempool` +- Added `get_entries()` method to expose the entry pool for direct access ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_mempool/src/sync.rs)) +- Added `first_seen: Timestamp` field to mempool `Entry` — records when each transaction was first observed ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_mempool/src/entry.rs)) +- Added recent transactions tracking to `TxStore` — maintains the last 10 transactions with a `recent()` accessor for the mempool recent transactions endpoint ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_mempool/src/tx_store.rs)) + +#### `brk_computer` +- Added `output_volume` to mining rewards — computes transfer volume minus fees per block ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_computer/src/mining/rewards/vecs.rs)) + +#### `website` +- Added block explorer pane with isometric 3D cube visualization — each block displays height, miner name, median fee, and fee range; supports infinite scroll for older blocks and auto-polls every 15 seconds for new blocks (localhost/127.0.0.1 only) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/website/scripts/panes/explorer.js)) +- Renamed "Invert" button to "Theme" for clarity ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/website/scripts/utils/theme.js)) + +### Internal Changes + +#### `brk_server` +- Renamed `.ok_response` to `.json_response` across all OpenAPI endpoint specifications for consistency ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/addrs/mod.rs)) + +#### `brk_indexer` +- Changed per-block indexing log level from `info!` to `debug!`, with `info!` only emitted every 100 blocks — reduces log noise during bulk indexing ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/lib.rs)) +- Changed stores export/commit/persist log level from `info!` to `debug!` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/stores.rs)) + +#### `brk_computer` +- Distribution block loop now logs at `debug!` level for every block, with `info!` only every 100 blocks ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_computer/src/distribution/compute/block_loop.rs)) +- Pool identification now reads coinbase tags from indexed vec instead of KV store, with a version mismatch warning for debugging ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_computer/src/pools/mod.rs)) + +#### `brk_bindgen` +- Added `sanitize_ident()` for JavaScript query parameters that clash with reserved words ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_bindgen/src/generators/javascript/api.rs)) + +#### `brk_cli` +- Removed `brk_iterator` dependency — indexer now uses `Reader` directly for block streaming ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_cli/src/main.rs)) + +[View changes](https://github.com/bitcoinresearchkit/brk/compare/v0.2.5...v0.3.0-alpha.0) + +## [v0.2.5](https://github.com/bitcoinresearchkit/brk/releases/tag/v0.2.5) - 2026-03-29 + +### New Features + +#### `brk_website` +- Added comprehensive static file serving tests covering path sanitization, index.html serving for root and SPA routes, static asset cache headers (`max-age=31536000, immutable` in release, `max-age=1, must-revalidate` in debug), directory traversal protection, and 404 responses for missing files ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.5/crates/brk_website/src/handlers.rs)) + +### Internal Changes + +#### `brk_computer` +- Switched all background compaction calls from `compact()` to `compact_deferred_default()` across all 14 compute modules (blocks, cointime, indicators, inputs, investing, market, mining, outputs, pools, positions, prices, scripts, supply, transactions), deferring compaction work to reduce I/O contention during block processing ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.5/crates/brk_computer/src/blocks/compute.rs)) + +#### `brk_indexer` +- Added 5-second delay before background compaction tasks execute, allowing recent writes to settle before compaction begins ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.5/crates/brk_indexer/src/lib.rs)) +- Removed `db.flush()` call from background tasks — background compaction now only calls `db.compact()` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.5/crates/brk_indexer/src/lib.rs)) + +#### `brk_website` +- Added `Debug` derive to `Error` struct to support test assertions and diagnostic output ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.5/crates/brk_website/src/error.rs)) + +[View changes](https://github.com/bitcoinresearchkit/brk/compare/v0.2.4...v0.2.5) + +## [v0.2.4](https://github.com/bitcoinresearchkit/brk/releases/tag/v0.2.4) - 2026-03-27 + +### New Features + +#### `website` +- Added "all" range preset button to chart toolbar that selects 1w resolution and scrolls to show the full chart history ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/scripts/chart/index.js)) +- Added touch device support for chart toolbar — `pointer: coarse` media query enables pointer events on touch screens ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/chart.css)) + +### Bug Fixes + +#### `website` +- Fixed potential division-by-zero in pane stretch factor calculation when chart height is zero ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/scripts/chart/index.js)) + +### Internal Changes + +#### `website` +- Switched h1/h2/h3 headings to "Instrument" font family with `letter-spacing: 0.05rem` and `font-weight: 400` for a distinct heading style ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/elements.css)) +- Set h1 to fixed `2rem` and h3 to fixed `1.5rem` font sizes instead of CSS variables ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/elements.css)) +- Renamed `types.js` to `_types.js` to follow underscore-prefix convention for generated/private files ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/scripts/_types.js)) +- Simplified CSS reset by removing redundant Tailwind-style rules that were already handled elsewhere ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/reset.css)) +- Reduced mobile bottom padding and removed standalone display-specific extra padding ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/elements.css)) +- Adjusted gradient fade stop from 90% to 85% for earlier fade-out effect ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/main.css)) +- Tightened range preset button spacing and adjusted chart heading letter-spacing from `0.075rem` to `0.05rem` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/chart.css)) +- Added `padding: 0` and `letter-spacing: inherit` to input elements, and explicit `color: var(--color)` to labels ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/elements.css)) + +#### `brk_client` +- Bumped `brk-client` VERSION to v0.2.3 across Rust, JavaScript, and Python client packages ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/crates/brk_client/src/lib.rs)) + +[View changes](https://github.com/bitcoinresearchkit/brk/compare/v0.2.3...v0.2.4) + ## [v0.2.3](https://github.com/bitcoinresearchkit/brk/releases/tag/v0.2.3) - 2026-03-26 ### New Features