Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1093 commits
Select commit Hold shift + click to select a range
f4497bf
chore(config): configurable debouncedelay, increasing for POL, ARB
pragmaxim Apr 20, 2026
61d0289
chore(config): explicit trace_timeout for heavy debug_traceBlockByHas…
pragmaxim Apr 21, 2026
fa350e8
improving pagination defaults for GetBlock
pragmaxim Apr 21, 2026
9070456
adding missing erc4626 ts types
pragmaxim Apr 21, 2026
772e29e
fix: removing erc4626 ts types
pragmaxim Apr 22, 2026
a12a630
Adding general getContractInfo EVM endpoint (#1477)
pragmaxim Apr 28, 2026
7c9ac4d
chore(erc4624): remove ContractInfo duplication from api types
pragmaxim Apr 28, 2026
badc795
chore(memory): explicitly release bulk indexing memory before chain t…
pragmaxim Apr 25, 2026
69334d1
chore(memory): ContractsCacheMaxBytes should be lower for tip than fo…
pragmaxim Apr 26, 2026
0d47375
chore(memory): make hot lru cache contractIndex lifetime follow hot-a…
pragmaxim Apr 27, 2026
12c5d96
chore(memory): backend-list reconciliation when queryBackendOnMempool…
pragmaxim Apr 27, 2026
32b15a4
chore(memory): mempoolTxTimeoutHours=12 for high TPS chains
pragmaxim Apr 27, 2026
9d31787
chore(memory): turn unbounded CachedContracts to LRU
pragmaxim Apr 27, 2026
5eff360
chore(memory): turn unbounded cachedAddressAliasRecords to lazy LRU
pragmaxim Apr 27, 2026
c98f60c
chore(memory): drop bsc -dbcache=1500000000 override
pragmaxim Apr 27, 2026
4bea981
chore(memory): small hygine memory freeing fixes
pragmaxim Apr 27, 2026
f7bfc3b
chore(memory): set trace_timeout and increase resyncindexdebounce on …
pragmaxim Apr 27, 2026
8307952
chore(memory): bound amount of requests in flight on WS connection
pragmaxim Apr 27, 2026
9942fc2
fix(btc): accept non-standard tx versions outside int32 range
pragmaxim Apr 27, 2026
bbee823
chore(ws-caps): ip address rate limiting
pragmaxim Apr 29, 2026
8cc43a5
chore(ws-caps): estimateFee.blocks cap
pragmaxim Apr 29, 2026
083e154
chore(ws-caps): subscribeAddresses caps
pragmaxim Apr 29, 2026
93220d3
chore(ws-caps): accountInfo pagination clamping
pragmaxim Apr 29, 2026
565e778
chore(ws-caps): trust X-Real-Ip from private networks
pragmaxim Apr 29, 2026
1aeefc8
chore(ws-caps): periodically sweep limiter from a goroutine
pragmaxim Apr 29, 2026
ac44dae
chore(ws-caps): account-history paging cap
pragmaxim Apr 29, 2026
b3c22ef
chore(ws-caps): configurable trusted proxy CIDR allowlist
pragmaxim Apr 29, 2026
7c2030c
chore(ws-caps): trusted proxy docs
pragmaxim Apr 29, 2026
43da531
chore(ws-caps): drain WS goroutines before RocksDB close
pragmaxim Apr 29, 2026
c0c0991
chore(ws-caps): RocksDB must not close until tracked WS work is done
pragmaxim Apr 29, 2026
2d5b161
Strip IPv6 zone from parseAddr and add link-local zone test
Copilot Apr 30, 2026
8fffaf1
Fix test name casing and add zone-stripping verification test
Copilot Apr 30, 2026
f495091
fix(consensus): Improving consensus node monitoring
pragmaxim Apr 30, 2026
b7f3ee0
fix(fiat): improve errors
pragmaxim May 3, 2026
fad2280
fix(avalanche): retry unfinalized RPC responses
pragmaxim May 1, 2026
7b1cf88
1484 add metric to alternative fee providers (#1485)
cranycrane May 4, 2026
394e29d
fix(erc20): stop ERC20 batch fallback from amplifying RPC calls
pragmaxim May 5, 2026
408d9f6
fix(erc20): swallowed error
pragmaxim May 6, 2026
eba989d
fix(erc20): prefer non-batch call for single contract
pragmaxim May 6, 2026
42e06d4
mempool(mev): decrease mempool timeout for MEV-protected coins
pragmaxim May 5, 2026
6912d27
enhancement(fees): extend infura fetching period, better stale infura…
pragmaxim May 6, 2026
a9ed3ed
mempool(mev): cleanup
pragmaxim May 6, 2026
3e4c0da
1486 remove obsolete socketio interface (#1487)
cranycrane May 6, 2026
dbf6a0d
Stateful ERC4626 - introducing persistent cache to eliminate high eth…
pragmaxim May 8, 2026
61ba7d4
fix(fiat): denominate ETH archive token rates in USD to remove ETH-US…
cranycrane May 4, 2026
2d027ee
feat(contrib): add reset eth token rates script to wipe existing toke…
cranycrane May 4, 2026
606d0ef
feat(fiat): change platformVsCurrency to "usd" for ethereum.json config
cranycrane May 4, 2026
3f2dbb4
Zcash: zebra 4.1.0 -> 4.4.1
cranycrane May 6, 2026
d059b1a
feat: zcashrpc uses getnetworkinfo to fetch current backend name and …
cranycrane May 7, 2026
69613d9
Bcash: 28.0.1 -> 29.0.0
cranycrane May 7, 2026
d22e280
chore(erc4626): e2e tests
pragmaxim May 8, 2026
202513f
chore(erc4626): Unify parsing in tests
pragmaxim May 8, 2026
249b20d
fix(erc4626): prevent vacuous opt-in test pass
Copilot May 8, 2026
fa22e1f
chore(agents): agentic local testing
pragmaxim May 10, 2026
5538935
chore(agents): important facts to avoid regressions
pragmaxim May 10, 2026
b40c4bf
chore(agents): unifying contrib scripts
pragmaxim May 12, 2026
0b70975
chore(agents): caching gh variables into $XDG_CACHE_HOME
pragmaxim May 12, 2026
dcda95a
chore(agents): cleanup
pragmaxim May 13, 2026
e8f1a8c
perf(ws): skip mempool tx loading for AccountDetailsBasic
pragmaxim May 5, 2026
31998b5
perf(ws): skip mempool tx loading for AccountDetailsBasic on xpubs
pragmaxim May 5, 2026
dd1f650
perf(ws): more tests
pragmaxim May 14, 2026
426ac88
perf(ws): Deduplicate address descriptors before counting and fix mat…
pragmaxim May 7, 2026
91c2683
feat: tron returns staking/voting data for accounts (#1467)
cranycrane May 22, 2026
29c73c2
fix: skip ZMQ initialization when message_queue_binding is empty (#1460)
tuan-phan May 22, 2026
fef0e88
Limit xpub descriptor expansion
pragmaxim May 21, 2026
c2cea8a
Handle xpub descriptor limit errors
pragmaxim May 21, 2026
7da3d93
Enforce maxXpubAddressDerivations against the actual cumulative deriv…
pragmaxim May 23, 2026
6fbbeaf
Limit fiat timestamp requests
pragmaxim May 21, 2026
41a1099
Handle websocket work_limit without disconnecting channel
Copilot May 21, 2026
94b22a3
fix: return zero for empty comma-separated input
Copilot May 21, 2026
cab9433
fix(evm): ERC721 Ownership Index Desync After Reorg of a Self-Transfer
pragmaxim May 27, 2026
0554ff6
feat: added avalanche priority fees and corrected existing ones (#1376)
etimofeeva May 27, 2026
0387f16
chore(openapi): openapi.yaml fully tested against btc and etherem BBs
pragmaxim May 25, 2026
7491ad4
chore(openapi): CI/CD validation and smoke tests
pragmaxim May 25, 2026
c7b1879
chore(openapi): port doc and examples from api.md to openapi.yaml
pragmaxim May 25, 2026
b1cd7b6
chore(openapi): rewriting e2e tests from Golang to TS
pragmaxim May 26, 2026
a015e8b
chore(openapi): cleanup and LOC reduction
pragmaxim May 26, 2026
c49cfef
chore(openapi): package-lock.json, big but necessary
pragmaxim May 26, 2026
8a36b41
chore(openapi): blockbook-api.ts openapi.yaml parity
pragmaxim May 26, 2026
04f0de2
chore(openapi): openapi.yaml improvements
pragmaxim May 26, 2026
081e538
fix(openapi): the fragment-only $ref throws can't resolve reference
pragmaxim May 27, 2026
d5bc28a
evm(rpc): reducing trace_timeout
pragmaxim May 15, 2026
8e638c7
chore(sync): Retry transient missing-tip block fetches before unwindi…
pragmaxim May 15, 2026
8cd6fc3
chore(sync): watch chanOsSignal
pragmaxim May 15, 2026
2551364
chore(sync): reflect looping in metrics
pragmaxim May 15, 2026
2e91810
chore(sync): optimize getBestBlockHeight calls
pragmaxim May 15, 2026
4263864
chore(sync): Renamed notFoundRetries => retries at all five usages
pragmaxim May 15, 2026
6beffb8
chore(sync): improve logging
pragmaxim May 15, 2026
0e976da
chore(sync): new stale tip based prometheus metrics
pragmaxim May 15, 2026
9589dbd
chore(sync): average_block_time_seconds prometheus metrics for utxo c…
pragmaxim May 15, 2026
d7b1184
chore(sync): IndexBlockNotFoundRetries + IndexReorgEvents metrics
pragmaxim May 15, 2026
3dd1008
chore(sync): prevent syncing from getting stuck
pragmaxim May 23, 2026
938114a
chore(sync): new sync yield metric
pragmaxim May 23, 2026
f3284bc
chore(sync): configuration and documentation
pragmaxim May 23, 2026
65a78bf
chore(sync): mermaid documentation
pragmaxim May 24, 2026
56b3c90
fix(sync): improving validation
pragmaxim May 27, 2026
19ff83a
feat(ethrpc): observe JSON-RPC calls for block sync and emit error re…
cranycrane May 27, 2026
8e0b671
fix(config): duck-typing issue prevents config propagation
pragmaxim May 27, 2026
4180ccd
fix(config): increase arbitrum block_addresses_to_keep
pragmaxim May 27, 2026
db77f25
fix(metrics): maxPendingHits for address_hotness
pragmaxim May 27, 2026
ba2e659
fix(metrics): reinitialize hits map to release oversized buckets
pragmaxim May 28, 2026
666f74d
fix(sync): syncing stuck because coordinator stopped reading worker a…
pragmaxim May 28, 2026
1c24b43
fix(sync): prevent config value to break syncing
pragmaxim May 29, 2026
a540611
update to Zebra 4.5.0 (#1532)
cranycrane May 29, 2026
42a41b6
chore(sync): subscription-watchdog
pragmaxim May 29, 2026
04bc97c
chore(sync): improving test coverage
pragmaxim May 29, 2026
4f2fe4f
fix(polygon): change deprecated fiat rate param "matic-network" to "p…
cranycrane May 29, 2026
a49590f
feat(evm-metrics): emit eth sync error JSON-RPC error code instead of…
cranycrane May 29, 2026
baea266
chore(sync): sync diagram about EVM newHeads WS
pragmaxim May 29, 2026
801a9ff
fix(sync): advance EVM tip from newHeads header, not an HTTP re-query
cranycrane May 30, 2026
5fca5cc
chore(sync): newHeads (re)establisthing fix
pragmaxim May 31, 2026
39998ec
fix(sync): heal real EVM tip rollback masked by the monotonic guard
pragmaxim May 31, 2026
8f0d66a
refactor(eth): drop write-only bestHeaderTime field
pragmaxim May 31, 2026
fb782be
fix(tron): stop watchdog poll from masking a dead ZeroMQ feed
pragmaxim May 31, 2026
6108c9a
docs(tron): record the non-monotonic tip tradeoff vs the EVM guard
pragmaxim May 31, 2026
dc7134d
docs(sync): document the NotFound over-disconnect tradeoff in handleFork
pragmaxim May 31, 2026
cba66d9
fix(rpc): bound shutdown by clamping rpc_timeout and aborting Tron RPC
pragmaxim Jun 1, 2026
dc1fbf1
fix(rpc): cancel in-flight sync RPCs on shutdown (BTC + Tron HTTP)
pragmaxim Jun 1, 2026
8cf9c8e
fix(api): report fast EVM chains as synced while the resync loop runs
pragmaxim Jun 1, 2026
774e813
enhancement(prof): enable profiling on dev blockbooks
pragmaxim Jun 2, 2026
d0a80f8
fix(sync): bound the RPC dial so a hung reconnect can't park the tip …
pragmaxim Jun 2, 2026
23960fb
feat(evm-metrics): make a stalled sync observable
pragmaxim Jun 2, 2026
bb2ae15
fix(ci/cd): deploy did not call systemctl daemon-reload after install
pragmaxim Jun 2, 2026
5618370
chore(prof): remote blockbook profiling
pragmaxim Jun 2, 2026
f3ddc60
chore(mempool): polygon_archive runs on quicknode, disable mempool sync
pragmaxim Jun 2, 2026
044399d
refactor(metrics): make configs/metrics.yaml the single source of truth
pragmaxim Jun 3, 2026
04dbfac
feat(metrics): render the Grafana dashboard from metrics.yaml
pragmaxim Jun 3, 2026
a086e1a
refactor(grafana): split dashboard into template skeleton + panels.yaml
pragmaxim Jun 3, 2026
3b656e9
refactor(grafana): final cleanup, better titles and descriptions
pragmaxim Jun 3, 2026
70fb58c
refactor(metrics): address PR review comments
pragmaxim Jun 3, 2026
b19a0cf
feat(metrics): track websocket per-connection request volume and conn…
pragmaxim Jun 5, 2026
dfde161
feat(metrics): track websocket unique client IPs and per-IP connectio…
pragmaxim Jun 5, 2026
fac06b3
fix(grafana): clamp websocket connections-per-IP denominator
pragmaxim Jun 5, 2026
0b64ab3
refactor(grafana): avoid storing grid positions into template
pragmaxim Jun 5, 2026
6ee80c8
fix(ci/cd): add render_grafana_test.py
pragmaxim Jun 5, 2026
9281e0c
Extend E2E tests (#1539)
cranycrane Jun 8, 2026
4b60d54
feat(xpub): do not query for best height for every public key
cranycrane Jun 8, 2026
7056e5f
feat(websocket): add WriteBufferPool so the gorilla lib does not allo…
cranycrane Jun 8, 2026
a8f68e6
refactor(websocket): getNewTxSubscriptions to reduce the lock contention
cranycrane Jun 8, 2026
39fef66
feat(xpub): cache txid list for xpub to avoid dedup and sorting for e…
cranycrane Jun 8, 2026
bc94732
chore(xpub): code cleanups after review
cranycrane Jun 8, 2026
11629e5
fix(ci/cd): improving python setup + removing legacy gitlab
pragmaxim Jun 9, 2026
18545f4
update to zebra 5.0.0 (#1544)
cranycrane Jun 9, 2026
79ab125
fix(zcash): migrate testnet backend to Zebra 5.0.0 for NU6.2 (#1548)
sneurlax Jun 9, 2026
9119669
xpub(fix): XSS in xpub explorer descriptor handling
pragmaxim Jun 9, 2026
a22b9d7
docs(xpub): clarify jsStr escaping behavior and JS-context constraint
pragmaxim Jun 9, 2026
fc20e28
feat(tron): extend the TronAccountExtraData with total energy, bandwi…
cranycrane Jun 10, 2026
8d244dc
fix(ci/cd): de-template branch_or_tag and coins in deploy.yml shell (H3)
pragmaxim Jun 9, 2026
901d83b
fix(ci/cd): pin third-party Actions + PyYAML, add Dependabot (M4)
pragmaxim Jun 9, 2026
5f5f287
fix(ci/cd): least-privilege token + fork-PR guard for testing.yml (H1)
pragmaxim Jun 9, 2026
b64d0b8
fix(coins): pin & verify backend artifact sources + CI lint (M2)
pragmaxim Jun 9, 2026
7af6f6a
fix(build): verify Go tarball checksum + pin RocksDB commit (M3)
pragmaxim Jun 9, 2026
7fd8217
Lint platform backend artifact overrides
pragmaxim Jun 9, 2026
42e001e
Verify Docker CLI build tarball
pragmaxim Jun 9, 2026
da75ae6
fix(ci/cd): opt-in TLS verification for wait_for_sync sync gate (L1)
pragmaxim Jun 9, 2026
f66f9fc
fix(contrib): harden deploy-dev.sh quoting + UPDATE_VENDOR default (L2)
pragmaxim Jun 9, 2026
3a813da
tests: system check for meeting conditions for running tests locally
pragmaxim Jun 11, 2026
5da5b38
feat(websocket): per-connection message rate limit + temporary IP block
pragmaxim Jun 10, 2026
28de0e2
refactor(websocket): address self-review of rate limit + IP block
pragmaxim Jun 10, 2026
a12a695
feat(websocket): cleanup
pragmaxim Jun 11, 2026
2a81f78
refactor websocket rate limiter
pragmaxim Jun 11, 2026
68b758b
feat(websoket): Add REST API rate limiting
pragmaxim Jun 11, 2026
6ebc3bc
fix(server): address rate-limit review findings
pragmaxim Jun 11, 2026
60efef4
fix(server): stop trusting spoofable CF-Connecting-IPv6 by default
pragmaxim Jun 12, 2026
192f1ed
fix(server): block IPv6 on the /128, not the shared /64
pragmaxim Jun 12, 2026
5552378
fix(server): stop implicitly trusting link-local peers as proxies
pragmaxim Jun 12, 2026
54a94e2
fix(api): cap per-request balance-history work to prevent DoS
pragmaxim Jun 12, 2026
e4758d3
fix(grafana): uniform width for websocket rate-limit panels
pragmaxim Jun 12, 2026
272aaab
fix(grafana): gate the render on Grafana import invariants
pragmaxim Jun 12, 2026
ce6f960
feat(grafana): add REST API section for bot/automation visibility
pragmaxim Jun 12, 2026
dec47d8
fix(api): bound xpub balance-history work before the DoS cap
pragmaxim Jun 13, 2026
19814a4
docs(server): trim oversized resolveClientIP doc comment
pragmaxim Jun 13, 2026
5fded41
feat(api): split balance-history tx cap into WS/REST with metrics
pragmaxim Jun 15, 2026
ff53240
documentation distilation
pragmaxim Jun 15, 2026
ca7ff5d
feat(ws): replace per-block broadcast log with delivered-notification…
pragmaxim Jun 17, 2026
208229a
feat(fiat-rates): make the fetching of historical rates resillient to…
cranycrane Jun 10, 2026
5d176fa
fix(coingecko): when throttle retries exhausted, break, log and store…
cranycrane Jun 10, 2026
4fddc1a
feat(coingecko): use the exponential backoff and retry-after HTTP header
cranycrane Jun 10, 2026
799f7f6
feat(coingecko): retry-after HTTP header has priority over the hard-c…
cranycrane Jun 10, 2026
a4eb569
feat(coingecko): make the throttle shared across current ticker fetch…
cranycrane Jun 12, 2026
5b1d903
fix(fiat-rates): delete dead code and address all the issues in the r…
cranycrane Jun 12, 2026
0e18c1e
fix(coingecko): apply default fast throttle for bootstrapping
cranycrane Jun 12, 2026
73e99f6
chore(coingecko): code cleanups
cranycrane Jun 13, 2026
476dde3
feat(fiat-rates): make fetching of current rates and historical rates…
cranycrane Jun 13, 2026
6ba0409
feat(fiat-rates): route historical backfill to CDN, keep only chain t…
pragmaxim Jun 15, 2026
492a7bf
feat(fiat-rates): blocking startup self-healing reconciliation of his…
pragmaxim Jun 15, 2026
a320921
feat(grafana): add Fiat Rates dashboard section
pragmaxim Jun 15, 2026
626987c
fix(fiat-rates): make startup reconciliation cheap, gap-driven and cr…
pragmaxim Jun 15, 2026
fd28960
feat(fiat-rates): make startup reconciliation cancellable on shutdown
pragmaxim Jun 15, 2026
a1be71b
feat(fiat-rates): bound startup reconciliation with a wall-clock budg…
pragmaxim Jun 15, 2026
7bdd0db
fix(fiat-rates): take the read lock in logTickersInfo to avoid a data…
pragmaxim Jun 17, 2026
4d0ca09
fix(fiat-rates): route the daily 1-day tip to the CDN, not the Free tier
pragmaxim Jun 17, 2026
3dc56b3
fix(fiat-rates): discard partial reconcile results on early exit to a…
pragmaxim Jun 17, 2026
f0b0c31
fix(fiat-rates): log completion of historical token ticker updates
pragmaxim Jun 17, 2026
2527b20
fix(sync): collapse steady-state resync logging to a single line
pragmaxim Jun 17, 2026
e7f29be
fix(eth): reconcile alternative provider mempool cache
pragmaxim Jun 10, 2026
03cfc4d
fix(eth): address review findings on mempool cache reconciliation
pragmaxim Jun 10, 2026
b6ced30
fix(eth): delete tx-removal-decision.md
pragmaxim Jun 11, 2026
3e45ccd
fix(eth): address review follow-up
pragmaxim Jun 11, 2026
aa20378
fix(eth): metrics for tx mempool cache reconciliation
pragmaxim Jun 11, 2026
7aae6c9
fix(eth): heal nonce-superseded txs in alternative mempool cache
pragmaxim Jun 15, 2026
2c68a9d
refactor(eth): simplify alternative mempool reconciliation tests and …
pragmaxim Jun 15, 2026
0ba2a06
feat(eth): expose confirmed nonce on address API
pragmaxim Jun 15, 2026
e09655e
feat(eth): gate confirmed nonce behind confirmedNonce query param
pragmaxim Jun 16, 2026
0cc4020
refactor(eth): make confirmed-nonce fetch best-effort + cover nonce p…
pragmaxim Jun 16, 2026
fccb3f6
test(eth): add WebSocket e2e coverage for confirmedNonce
pragmaxim Jun 16, 2026
3d8d72e
fix(eth): stop alternative mempool reconcile goroutine on shutdown
pragmaxim Jun 17, 2026
bb6c555
fix(eth): return confirmedNonce "0" for fresh addresses when opted in
pragmaxim Jun 17, 2026
04a55ea
fix(eth): route alt-mempool timeout eviction through removeMempoolTx
pragmaxim Jun 17, 2026
52cd4cb
test(eth): cover alternative-provider getNonces
pragmaxim Jun 17, 2026
fe5e94e
test(eth): cover reconcile timeout eviction
pragmaxim Jun 17, 2026
a71b067
test(eth): cover decodeConfirmedNonce decode-failure branch
pragmaxim Jun 17, 2026
86cb790
refactor(eth): drop dead alternativeSendTxProvider.metrics write in S…
pragmaxim Jun 17, 2026
095f24d
test(tron): assert confirmedNonce omitted by default on address
pragmaxim Jun 17, 2026
c9c4bd7
test(openapi): pick a sample (address, tx) whose tx is on the address…
pragmaxim Jun 17, 2026
bf460bc
test(openapi): route e2e fetch and websocket through an egress proxy
pragmaxim Jun 17, 2026
21a868f
fix(eth): keep alt-mempool txs a private relay stops surfacing until …
pragmaxim Jun 18, 2026
c5ffe68
fix(grafana): renumber duplicate panel ids 321-325
pragmaxim Jun 18, 2026
9140999
ci: move Grafana dashboard validation into the lint job
pragmaxim Jun 18, 2026
376ef4f
fix(base): disable node mempool sync for Base archive
pragmaxim Jun 18, 2026
cfa7374
feat(eth): observe alt-mempool tx lifetime and cache depth
pragmaxim Jun 19, 2026
1cd14b7
fix(tron): add polling-only tip sync fallback when ZeroMQ is disabled…
h45hc47 Jun 22, 2026
e7710e5
feat(deploy): supply blockbook runtime env via optional EnvironmentFile
pragmaxim Jun 18, 2026
a7f2031
refactor(build): single source of truth for build-time variable prefixes
pragmaxim Jun 19, 2026
848fadc
fix(deploy): create blockbook.env restricted before writing secrets
pragmaxim Jun 19, 2026
6029579
feat(eth): fail fast when a configured alternative fee provider is mi…
pragmaxim Jun 19, 2026
584aae4
fix(tests): supply placeholder fee-provider keys to integration run
pragmaxim Jun 21, 2026
74a4d84
refactor(deploy): rename runtime-env secret to BB_RUNTIME_ENV
pragmaxim Jun 22, 2026
60e9a6b
feat(server): require HTTP Basic auth on internal /admin endpoints
pragmaxim Jun 22, 2026
ba30620
fix(server): redirect bare /admin/ to /admin instead of 404
pragmaxim Jun 22, 2026
676f9f3
test(integration): enable testnet integration/e2e tests (sepolia, hoo…
pragmaxim Jun 23, 2026
a6d9a13
fix(api): always serialize token decimals, default unresolved to coin…
pragmaxim Jun 21, 2026
dccbb7c
test(openapi-e2e): assert token decimals is always present and valid
pragmaxim Jun 21, 2026
650ef68
feat(server): extend per-IP rate limiter to cover explorer UI routes
cranycrane Jun 25, 2026
fcd1cc6
refactor(server): rename REST_ limiter to REST_UI_ to reflect UI cove…
cranycrane Jun 25, 2026
19512b3
fix(server): tighten api-docs rate-limit exemption to exact route
cranycrane Jun 25, 2026
e7192d9
refactor(grafana): rename rest_api limiter panel keys to rest_ui
cranycrane Jun 25, 2026
0d18e7d
feat(server): lower default REST/UI rate limits
cranycrane Jun 25, 2026
8608169
fix(server): exempt static routes under a slash-less base path
pragmaxim Jun 27, 2026
0ac6430
fix(grafana): correct REST/UI panel descriptions to lowered defaults
pragmaxim Jun 27, 2026
6212600
style(metrics): gofmt RestUI metric struct-tag alignment
pragmaxim Jun 27, 2026
dc96ea5
docs(env): document test-websocket.html exemption and fix prefix wording
pragmaxim Jun 27, 2026
41e8933
test(server): cover REST/UI limiter defaults and env-var parsing
pragmaxim Jun 27, 2026
80cb76b
extra agent instructions
pragmaxim Jun 27, 2026
fabe57d
fix(fiat): add Blockbook user-agent to requests for CDN compatibility
pragmaxim Jun 27, 2026
03fae6f
fix(logging): change glog.Info to glog.V(1).Info for improved log ver…
pragmaxim Jun 27, 2026
d9a4ac5
Port Syscoin support to latest upstream Blockbook (#23)
sidhujag Jun 29, 2026
25c1ee2
Merge branch 'trezor:master' into upstream-latest
sidhujag Jun 29, 2026
e73682e
fix(syscoin): restore explorer UX after upstream merge (#24)
sidhujag Jun 30, 2026
0722016
chore: replace master with upstream-latest
Jun 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 10 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
root = true

[*.md]
indent_style = space
indent_size = 4
trim_trailing_whitespace = false
max_line_length = 80
insert_final_newline = true
charset = utf-8
end_of_line = lf
49 changes: 49 additions & 0 deletions .github/actions/export-env-vars/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Export Repository Variables
description: Export all repository/environment variables from a JSON map into GITHUB_ENV.

inputs:
vars_json:
description: JSON object map of repository/environment variables.
required: true

runs:
using: composite
steps:
- name: Export variables to GITHUB_ENV
shell: bash
env:
VARS_JSON: ${{ inputs.vars_json }}
run: |
python3 - <<'PY'
import json
import os
import uuid

vars_map = json.loads(os.environ.get("VARS_JSON", "{}"))
env_path = os.environ["GITHUB_ENV"]
# Single source of truth shared with the Makefile and build/tools/templates.go.
workspace = os.environ.get("GITHUB_WORKSPACE", ".")
prefixes_path = os.path.join(workspace, "build", "bb-build-var-prefixes.txt")
with open(prefixes_path, encoding="utf-8") as prefixes_file:
alias_prefixes = tuple(
line.strip()
for line in prefixes_file
if line.strip() and not line.strip().startswith("#")
)

def write_env_var(env_file, key, value):
delimiter = f"__{uuid.uuid4().hex}__"
env_file.write(f"{key}<<{delimiter}\n{value}\n{delimiter}\n")

with open(env_path, "a", encoding="utf-8") as env_file:
for key, value in vars_map.items():
text = "" if value is None else str(value)
normalized = key
for prefix in alias_prefixes:
if key.startswith(prefix):
alias = key[len(prefix):]
# Blockbook env lookups use lowercase coin aliases from configs/coins.
normalized = prefix + alias.lower().replace("-", "_")
break
write_env_var(env_file, normalized, text)
PY
7 changes: 7 additions & 0 deletions .github/bin/bbcli
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
set -euo pipefail

script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
repo_root="$(cd -- "${script_dir}/../.." && pwd)"

exec "${repo_root}/.github/scripts/run.py" "$@"
18 changes: 18 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
version: 2
updates:
# Keep third-party GitHub Actions (pinned to commit SHAs in the workflows)
# bumped deliberately via PRs instead of silently tracking a moving tag.
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
commit-message:
prefix: "ci"

# Python tooling used by the CI workflows (.github/requirements.txt).
- package-ecosystem: "pip"
directory: "/.github"
schedule:
interval: "weekly"
commit-message:
prefix: "ci"
1 change: 1 addition & 0 deletions .github/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
PyYAML==6.0.3
49 changes: 49 additions & 0 deletions .github/scripts/backend_decision.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#!/usr/bin/env python3

from __future__ import annotations

import os
import shlex
import sys
from pathlib import Path

import backend_policy
from coin_rpc import CoinRPCError, load_config, resolve_build_env


def format_shell(decision: dict, build_env: str) -> str:
pairs = {
"BACKEND_SHOULD_BUILD": "1" if decision["should_build_backend"] else "0",
"BACKEND_REASON": decision["reason"],
"BACKEND_RPC_ENV": decision["rpc_env"],
"BACKEND_RPC_HOST": decision["rpc_host"],
"BACKEND_COIN_ALIAS": decision["coin_alias"],
"BACKEND_BUILD_ENV": build_env,
}
return "\n".join(f"{key}={shlex.quote(str(value))}" for key, value in pairs.items())


def main(argv: list[str] | None = None) -> None:
args = list(sys.argv[1:] if argv is None else argv)
if len(args) != 1:
raise CoinRPCError(f"usage: {Path(sys.argv[0]).name} <coin>")
coin = args[0]
config_path = Path("configs") / "coins" / f"{coin}.json"
if not config_path.is_file():
raise CoinRPCError(f"missing coin config {config_path}")
build_env = resolve_build_env()
decision = backend_policy.compute_backend_decision(
coin=coin,
config=load_config(config_path),
build_env=build_env,
backend_mode=backend_policy.BACKEND_MODE_AUTO,
)
print(format_shell(decision, build_env))


if __name__ == "__main__":
try:
main()
except CoinRPCError as exc:
print(str(exc), file=sys.stderr)
raise SystemExit(1)
57 changes: 57 additions & 0 deletions .github/scripts/backend_policy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/usr/bin/env python3

from __future__ import annotations

import os
from typing import Mapping

from coin_rpc import get_coin_alias, rpc_hostname, rpc_url_env_name

BACKEND_MODE_AUTO = "auto"
BACKEND_MODE_ALWAYS = "always"
BACKEND_MODE_NEVER = "never"


def should_build_backend(
*,
backend_mode: str,
rpc_url: str,
) -> tuple[bool, str]:
if backend_mode == BACKEND_MODE_NEVER:
return False, "backend-mode-never"
if backend_mode == BACKEND_MODE_ALWAYS:
return True, "backend-mode-always"
if not rpc_url:
return True, "rpc-url-env-missing-or-empty"
rpc_host = rpc_hostname(rpc_url)
if not rpc_host:
return False, "rpc-host-missing"
if rpc_host in {"localhost", "127.0.0.1", "::1"}:
return True, f"rpc-host-is-local-{rpc_host}"
return False, f"rpc-host-is-remote-{rpc_host}"


def compute_backend_decision(
*,
coin: str,
config: dict,
build_env: str,
backend_mode: str,
env: Mapping[str, str] | None = None,
) -> dict:
if env is None:
env = os.environ
coin_alias = get_coin_alias(config, coin)
rpc_env = rpc_url_env_name(coin_alias, build_env)
rpc_url = env.get(rpc_env, "").strip()
should_build, reason = should_build_backend(
backend_mode=backend_mode,
rpc_url=rpc_url,
)
return {
"coin_alias": coin_alias,
"rpc_env": rpc_env,
"rpc_host": rpc_hostname(rpc_url),
"should_build_backend": should_build,
"reason": reason,
}
Loading
Loading