Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
581 commits
Select commit Hold shift + click to select a range
bb02eb5
Update blockbook-api.ts
martinboehm May 22, 2025
cbb179b
eth (+testnet) 3.0.3 -> 3.0.4
f7b May 27, 2025
c013242
EthereumType: Add alternative provider for send raw tx
martinboehm May 23, 2025
2b155a4
EthereumType: Fetch mempool transactions from alternative provider
martinboehm May 23, 2025
04bfd56
EthereumType: Fetch mempool transactions from alternative provider
martinboehm May 28, 2025
e98b435
Fix for windows support
cpuchainorg May 23, 2025
6cfc6fa
changed infura periods
Dehumanizer77 Jun 9, 2025
bc43907
prysm (+testnets) 6.0.3 -> 6.0.4
f7b Jun 6, 2025
8989ab7
eth (+testnets) 3.0.4 -> 3.0.5
f7b Jun 5, 2025
ae0172d
Add longTermFeeRate websocket endpoint (#1262)
grdddj Jun 9, 2025
41ac2d5
Fix ETH contract cmETH parameters
martinboehm Jun 13, 2025
0f90ea1
polygon-bor 2.0.3 -> 2.1.1
f7b Jun 17, 2025
27cf2ff
eth (+testnets) 3.0.5 -> 3.0.8
f7b Jun 24, 2025
24e3459
rocksdb v7.5.3 -> rocksdb v9.10.0
cranycrane Jun 16, 2025
d367147
Update Firo daemon 0.14.14.1 (mandatory)
justanwar Jun 21, 2025
ca17fc5
chore: fix some function names in comment
highcloudwind Apr 1, 2025
775cb4c
polygon-heimdall 1.2.2 → 1.6.0
f7b Jul 3, 2025
304d596
polygon-bor 2.1.1 -> 2.2.8
f7b Jul 11, 2025
50310a7
eth (+testnets) 3.0.8 -> 3.0.11
f7b Jul 2, 2025
17fa06f
avalanche 1.13.0 → 1.13.2
martinboehm Jun 27, 2025
ebc34c7
polygon-bor 2.2.8 -> 2.2.9
f7b Jul 17, 2025
4da97b8
Fix GetChainInfo for Avalanche
martinboehm Jul 25, 2025
2023481
Use Zebra as ZCash backend node
martinboehm Jun 24, 2025
aa445e6
Polygon heimdall v2
martinboehm Jul 30, 2025
c2ded90
Update Flux Daemon to v8.0.0 (#1306)
TheTrunk Aug 11, 2025
e1fb89c
feat: implemented eth_getTransactionCount with pending tag
etimofeeva Aug 14, 2025
54c1339
Fix initialization of ethereum rpc
martinboehm Aug 4, 2025
541e30d
2.4.2 zebra update
etimofeeva Jul 31, 2025
0e92dd1
feat: add alternative RPC provider support for sendTransaction
etimofeeva Aug 14, 2025
188d06e
feat: added alternative provider to eth_estimateGas, eth_call, eth_ge…
etimofeeva Aug 21, 2025
ecf8736
Fix initialization of ethereum rpc
martinboehm Sep 1, 2025
1e14f35
Merge pull request #1316 from trezor/alternative-provider-url-simulat…
etimofeeva Sep 1, 2025
a1f7bac
Add init alternative providers for EVM chains
martinboehm Sep 1, 2025
db2d8cd
Add AddrContractsCache to speed up indexing
martinboehm Sep 1, 2025
e6ecaff
added test to test-websocket.html
etimofeeva Aug 28, 2025
29b7d66
fix: improved error handling and added better logging for readability
etimofeeva Sep 2, 2025
d4e9f0f
Fix EthereumTypeGetNonce
martinboehm Sep 8, 2025
9939b92
Add support for Ethereum Testnet Hoodi
martinboehm Aug 17, 2025
b4fa97a
Stop using alternative provider for eth_call and eth_gasPrice
martinboehm Sep 9, 2025
ebe0b46
eth (+testnets) 3.0.11 -> 3.0.17
f7b Sep 17, 2025
6670f22
Resolve Arbitrum, Base, and Zcash build errors (#1325)
emersonian Sep 17, 2025
4b09cae
Zcash: Zebra 2.5.0
emersonian Sep 4, 2025
7bd643e
Rename ETH contract 0x6f40d4A6237C257fff2dB00FA0510DeEECd303eb to Fluid
martinboehm Sep 25, 2025
2569d6f
return for low even lower fees than 1 sat/vb
etimofeeva Sep 11, 2025
cba50bf
eth (+testnets) 3.0.17 -> 3.1.0
f7b Sep 22, 2025
9f18d57
added basic detail to stakingPools
etimofeeva Sep 26, 2025
8727e9c
refactor: use slices.Clone
careworry Apr 28, 2025
39daa17
refactor: use the built-in max/min to simplify the code
wmypku Aug 26, 2025
3223295
publish new block transactions by address
kaladinlight Jan 22, 2025
7c18189
copilot feedback
kaladinlight Oct 6, 2025
f2042e1
btc (+testnets) 29.0 → 29.2
Dehumanizer77 Oct 15, 2025
34a6f9b
eth (+testnets) 3.1.0 -> 3.2.0
f7b Oct 6, 2025
4ce39bc
Escape html in name and symbol shown in explorer
martinboehm Oct 16, 2025
9557fa2
fluxd v9.0.0
TheTrunk Oct 22, 2025
65334fb
Update Firo daemon 0.14.15.0 (mandatory)
justanwar Oct 20, 2025
b28f0ea
eth (+testnets) 3.2.0 -> 3.2.1
f7b Oct 20, 2025
c5fca2a
prysm (+testnets) 6.0.4 -> 6.1.0, holesky decommisioned
f7b Sep 29, 2025
674271f
prysm (+testnets) 6.1.0 -> 6.1.2
AlexanderPavlenko Oct 15, 2025
d6a15b6
Zcash: Upgrade to zebra v3.0.0
emersonian Nov 18, 2025
609d87e
Enhance CoinGecko integration by adding support for plan parameter in…
RampantDespair Nov 23, 2025
964662d
Upgrade golang to 1.25 and dependencies, fix Avalanche sync
martinboehm Nov 24, 2025
d76f7c5
fix: adjusted zebrarpc for new version of zebrad backend
etimofeeva Dec 29, 2025
cf2fb62
feature: using backend env vars for builds and integration tests
pragmaxim Jan 15, 2026
82a0827
error on RPC env var for non-existing coin to prevent misconfig
pragmaxim Jan 15, 2026
0630490
config cleanup
pragmaxim Jan 16, 2026
a85a343
readme: update rocksdb build flags
pragmaxim Jan 16, 2026
bdc1fc4
fix: commit 0790f881 broke test compilation
pragmaxim Jan 16, 2026
b0bb622
blockchaincfg.json loader
pragmaxim Jan 16, 2026
47bd9da
Normalized plan and improved url logic
RampantDespair Jan 17, 2026
447f859
dual (ws/http) rpc_client support
pragmaxim Jan 21, 2026
c635311
evm chains http/ws connectivity integration tests
pragmaxim Jan 21, 2026
962b5c2
improvement: parallel internal data fetching in GetBlock
pragmaxim Jan 9, 2026
483595b
fix: commented out code references non-existing variable
pragmaxim Jan 9, 2026
be3076e
using config loader in ethrpc integration tests
pragmaxim Jan 16, 2026
54799b6
porting older integration tests to new dual (ws/http) rpc_client
pragmaxim Jan 21, 2026
88edd9b
using standard blockbook rpc tests with ethereum fixture
pragmaxim Jan 21, 2026
ca36f51
improvement: replace eth_call per erc20 contract with multicall
pragmaxim Jan 12, 2026
3868aa8
limit eth_call batch size
pragmaxim Jan 12, 2026
c07c869
eth_call batch integration tests for avax,op,base,bsc
pragmaxim Jan 13, 2026
660685e
eth_call batch it tests, use chain address from conf
pragmaxim Jan 13, 2026
e94af5c
eth_call batch it tests cleanup
pragmaxim Jan 14, 2026
5a45460
using config loader in contract batch integration tests
pragmaxim Jan 16, 2026
e8558f1
erc20 batching : let's warn in case of invalid balance results
pragmaxim Jan 19, 2026
38cf8c2
porting older integration tests to new dual (ws/http) rpc_client
pragmaxim Jan 21, 2026
7014e78
default geth --rpc.batch.limit is 100
pragmaxim Jan 22, 2026
8918eec
arbitrum,optimism,base,polygon fixtures
pragmaxim Jan 22, 2026
8542377
eth_call batch integration tests
pragmaxim Jan 22, 2026
a2274c9
integration tests connectivity suite
pragmaxim Jan 22, 2026
3d25282
integration tests connectivity target
pragmaxim Jan 22, 2026
052a30b
erc20 eth_call batching cleanup
pragmaxim Jan 23, 2026
d1c652d
integration tests : lazy initialization of mempool
pragmaxim Jan 23, 2026
3bcbe44
BB_RPC_URL_* -> BB_RPC_URL_HTTP_*
pragmaxim Jan 23, 2026
de9c4aa
integration tests: run only those with connectivity
pragmaxim Jan 23, 2026
7673996
integration tests: fixing bitcoin and zcash issues : racing, missing …
pragmaxim Jan 23, 2026
90f2645
Resync mempool using batch api with temporary outpoint cache
pragmaxim Jan 24, 2026
cc72eb7
mempool_resync_batch_size should be 100
pragmaxim Jan 24, 2026
734c922
avoid batch mempool resync besides bitcoin as those pools are small +…
pragmaxim Jan 25, 2026
970581b
log resync outpoint cache hit/miss rate
pragmaxim Jan 25, 2026
2390dda
fix: GetBlock unmarshals the same raw JSON twice
pragmaxim Jan 9, 2026
9b6f4e9
utxo reorg detection fix
pragmaxim Jan 25, 2026
0a49807
improving mempool syncing periodic logging with metrics
pragmaxim Jan 25, 2026
75ca6e1
fix: avoid Base newHeads bursts
pragmaxim Jan 26, 2026
2824b99
fix: closing Rocksdb on shutdown signal
pragmaxim Jan 26, 2026
cdd6e06
fix: continue syncing on missing block error
pragmaxim Jan 26, 2026
1385233
new contrib scripts for checking blockbook and backend status
pragmaxim Jan 29, 2026
468a349
avoid linar scan in contract lists
pragmaxim Feb 7, 2026
02ff88b
Skip ERC20 balance aggregation
pragmaxim Feb 7, 2026
13ceaa0
lower addrContractsCacheMinSize
pragmaxim Feb 7, 2026
0763a36
unpackedAddrContracts_findContractIndex tests
pragmaxim Feb 7, 2026
9a5dd21
contractIndexLookup benchmark
pragmaxim Feb 8, 2026
5ef3336
address hotness
pragmaxim Feb 8, 2026
9bbbbb4
increase addrContractsCacheMinSize
pragmaxim Feb 8, 2026
67ceb76
collect and log txs and transfer counts, vin/vouts, etc. in bulkconnect
pragmaxim Feb 8, 2026
94dcf3a
revert addrContractsCacheMinSize to original 300KB
pragmaxim Feb 8, 2026
4ab7046
addressContracts cache cap - flush early on cache size limit
pragmaxim Feb 9, 2026
390cdd0
Merge pull request #1392 from trezor/using-backend-env-vars-for-build…
pragmaxim Feb 10, 2026
91a79f1
Merge pull request #1400 from trezor/evm-chains-with-both-http-and-ws…
pragmaxim Feb 10, 2026
ce4fa58
Merge pull request #1383 from trezor/get-block-parallel-internal-data…
pragmaxim Feb 10, 2026
80e969e
Merge pull request #1388 from trezor/replace-eth_call-per-ERC20-contr…
pragmaxim Feb 10, 2026
88f6604
Merge pull request #1403 from trezor/resync-mempool-using-batch-api
pragmaxim Feb 10, 2026
f0422bb
Merge pull request #1385 from trezor/GetBlock-unmarshalls-block-twice…
pragmaxim Feb 10, 2026
1d99e0b
Merge pull request #1398 from trezor/utxo-reorg-fix
pragmaxim Feb 10, 2026
a9482a8
Merge pull request #1407 from trezor/base-newHeads-subscription-fix
pragmaxim Feb 10, 2026
716a2e3
Merge pull request #1408 from trezor/fix-closing-rocksdb-on-shutdown-…
pragmaxim Feb 10, 2026
0954a54
Merge pull request #1409 from trezor/fix/continue-syncing-on-missing-…
pragmaxim Feb 10, 2026
213a7e1
zero existing erc20 balances
pragmaxim Feb 10, 2026
9487b23
support for 32bit systems
pragmaxim Feb 10, 2026
a20c761
feat: add CSP headers and fix XSS vulnerabilities in templates
etimofeeva Jan 18, 2026
9aed792
syncing/caching premetheus metrics
pragmaxim Feb 11, 2026
f37e1e6
fix possible racing condition with minimal contention
pragmaxim Feb 11, 2026
5880cd2
eth_call metrics
pragmaxim Feb 13, 2026
e8030c8
fetchContractInfo eth_call metrics
pragmaxim Feb 13, 2026
3976aac
token_uri_requests and staking_pool_requests eth_call metrics
pragmaxim Feb 13, 2026
bdfe40f
Merge pull request #1417 from trezor/micro-optimizations-at-address-c…
pragmaxim Feb 16, 2026
307bd69
Merge pull request #1370 from RampantDespair/dev
pragmaxim Feb 16, 2026
2eab1cb
Merge pull request #1420 from trezor/syncing-prometheus-metrics
pragmaxim Feb 16, 2026
e94564c
Merge branch 'master' into pub-new-block-txs
pragmaxim Feb 17, 2026
bd75be0
fix(websocket): set confirmed metadata for newBlockTxs
pragmaxim Feb 17, 2026
99d41c7
fix(websocket): avoid panic on missing ethereum specific data
pragmaxim Feb 17, 2026
49f5efc
fix(websocket): keep newBlockTxs notifications on receipt errors
pragmaxim Feb 17, 2026
9c3f843
test(sync): update OnNewBlock callbacks to block arg
pragmaxim Feb 17, 2026
f9fc15e
test(websocket): cover newBlockTxs edge cases
pragmaxim Feb 17, 2026
efbf7f5
inline documentation in websocket.go
pragmaxim Feb 17, 2026
1746402
new websocket prometheus metrics
pragmaxim Feb 17, 2026
ad7dd78
Merge pull request #1198 from kaladinlight/pub-new-block-txs
pragmaxim Feb 17, 2026
44b0dde
feat: added ens resolver to GetAddress function
etimofeeva Jul 24, 2025
ffc6fe2
Update api/worker.go
etimofeeva Oct 10, 2025
659507f
fixed test
etimofeeva Oct 22, 2025
7a545cb
fixed test
etimofeeva Oct 22, 2025
4f9fccf
fixed test
etimofeeva Oct 22, 2025
bb90241
fixed test
etimofeeva Oct 22, 2025
780a5a4
fixed test
etimofeeva Oct 22, 2025
431195d
fixed unit test
etimofeeva Oct 22, 2025
023905f
fixed error wording
etimofeeva Oct 22, 2025
180b5b7
fixed the tests
etimofeeva Oct 22, 2025
21685ef
fixed the tests
etimofeeva Oct 22, 2025
961bc62
fixed the tests
etimofeeva Oct 22, 2025
1bab1ef
fixed the tests
etimofeeva Oct 22, 2025
ca67205
clean up
etimofeeva Oct 23, 2025
3a467b3
fixing ens resolution bypass in production due to unimplemented Check…
pragmaxim Jan 17, 2026
c7d097d
updated CheckENSExpiration to handle subdomains by checking the parent
pragmaxim Jan 17, 2026
d6a6683
adding ENS contract guard to resolve ENS on mainnet only
pragmaxim Jan 17, 2026
01c7759
ens: avoid duplicate ResolveENS call and update test fixture
pragmaxim Jan 17, 2026
5f5ffb1
Zcash: Upgrade to zebra v4.1.0 (#1402)
emersonian Feb 25, 2026
5dfb731
return websocket error to client instead of logging it
pragmaxim Feb 17, 2026
fa83fb4
websocket unmarshal test
pragmaxim Feb 17, 2026
218f9ba
fiat rates perf optimization
pragmaxim Feb 18, 2026
91bddea
new fiat-rate metrics
pragmaxim Feb 18, 2026
38383e0
mempool resync metrics
pragmaxim Feb 18, 2026
889e481
fiat: reduce ticker cache lock contention
pragmaxim Feb 18, 2026
0d6ffd5
fiat: optimize token ticker timestamp lookups
pragmaxim Feb 18, 2026
8e957ed
api: skip ethereum secondary ticker lookup when unused
pragmaxim Feb 18, 2026
53ef252
fiat: add downloader update duration metric
pragmaxim Feb 18, 2026
42864a3
api: skip fiat balance-history lookup when rates disabled
pragmaxim Feb 18, 2026
0d2a67d
fiat: cap public Coingecko history and stop range-limit flood
pragmaxim Feb 18, 2026
b39d0db
fiat: breaking huge setFiatRateToBalanceHistories method into fiat_ba…
pragmaxim Feb 19, 2026
6a8b635
fiat: extracting worker.go methods into fiat_rates_api.go
pragmaxim Feb 19, 2026
9710b66
server: add fiat HTTP error-path coverage
pragmaxim Feb 19, 2026
0601105
api: guard nil fiat ticker in available currencies
pragmaxim Feb 19, 2026
8414dc5
server: extend websocket fiat token request tests
pragmaxim Feb 19, 2026
c7c35fc
server: test websocket fiat subscribe broadcast flow
pragmaxim Feb 19, 2026
3f7e845
server: add structured fiat HTTP assertions and consistency tests
pragmaxim Feb 19, 2026
08ef40b
server: extend ethereum fiat token HTTP coverage
pragmaxim Feb 19, 2026
df2afbe
fiat: apply historical cap only to coingecko free plan
pragmaxim Feb 19, 2026
30f22ec
fiat: optimizing token db lookup
pragmaxim Feb 20, 2026
ae3dbee
fiat: avoid decoding duplication for sparse token rates + short-circu…
pragmaxim Feb 20, 2026
c88c659
fiat: revisiting api-key hierarchy
pragmaxim Feb 20, 2026
81275e1
fiat: reverting free plan cap
pragmaxim Feb 23, 2026
e8b1c0e
fiat: split fiat rates fetching to boostrap and chain tip phase
pragmaxim Feb 24, 2026
1efee13
sync: retry for context deadline exceeded
pragmaxim Feb 24, 2026
640cddc
fix: LoadInternalState starts setBlockTimes asynchronously
pragmaxim Feb 25, 2026
50438cf
fiat: coingecko retries with backoff
pragmaxim Feb 26, 2026
fbbdf8d
fiat: stop historical updatewhen rate-limit retries are exhausted
pragmaxim Feb 27, 2026
a524eb8
fiat: stop historical token update when rate-limit retries are exhausted
pragmaxim Feb 27, 2026
2c8178c
fiat: do not log warnings as errors
pragmaxim Feb 27, 2026
0767492
end-to-end API tests for all utxo coins
pragmaxim Feb 24, 2026
d63225d
end-to-end API tests for all evm coins
pragmaxim Feb 25, 2026
e9bdd62
fix: filter out invalid tokens without any holding fields
pragmaxim Feb 25, 2026
496f8e0
fix: add validation for negative ranges
pragmaxim Feb 25, 2026
0703a69
fix: retry sync on various errors + log swallowed errors
pragmaxim Feb 26, 2026
87c20fd
hardening e2e tests for newly discovered bugs
pragmaxim Feb 26, 2026
da37dfd
fiat: e2e tests
pragmaxim Feb 26, 2026
e568383
log warning that hostnames differ
pragmaxim Feb 27, 2026
95eaa9b
adding github workflow with e2e tests on self-hosted runners
pragmaxim Mar 2, 2026
6249ddf
ci: avoid building docker image each time
pragmaxim Mar 2, 2026
f8f9e5c
ci: do not upper case env vars
pragmaxim Mar 2, 2026
fcf1329
ci: avoid mixing runners for caching reasons
pragmaxim Mar 2, 2026
28e8502
ci: fixing non-deterministic race condition
pragmaxim Mar 2, 2026
c36e24b
ci: add BB_API_* env vars
pragmaxim Mar 2, 2026
2fa948a
ci: fail fast e2e abort if BB is unavailable
pragmaxim Mar 2, 2026
d33d606
ci: safety net timeout
pragmaxim Mar 3, 2026
73b3f2a
ci: bb connectivity suite
pragmaxim Mar 3, 2026
3bc29ea
ci: deploy workflow matrix
pragmaxim Mar 4, 2026
23a4a84
ci: _archive fallback in env resolution
pragmaxim Mar 4, 2026
84c652d
e2e tests should run on specific runners
pragmaxim Mar 5, 2026
ca942e2
not run e2e tests against Base chain
pragmaxim Mar 5, 2026
4607063
fixing packaging problem during build time
pragmaxim Mar 6, 2026
680ac91
fix: add missing strings import
pragmaxim Mar 13, 2026
6442dd1
ws origin allowlist
pragmaxim Feb 16, 2026
22fc431
fixes #1426 scientific notation parsing error
pragmaxim Mar 4, 2026
33b99cc
enhancement: limit /api/sendtx body size
pragmaxim Mar 11, 2026
f8349fc
enhancement: reject oversized websocket messages
pragmaxim Mar 11, 2026
e4fdb5e
enhancement: avoid template.JSStr
pragmaxim Mar 11, 2026
a08fa8f
enhancement: improving unsound mempool rsync log messages
pragmaxim Mar 13, 2026
3a9d427
fix: lower case coin alias in BB_RUNNER_ variables
pragmaxim Mar 16, 2026
1287b7f
fix: decrease shell boundaries crossing for E2E_REGEX passing
pragmaxim Mar 16, 2026
d4be5a9
fix: remove bsc_archive from tests.json
pragmaxim Mar 16, 2026
ee31ca9
fix: lookup coins in tests without _archive suffix
pragmaxim Mar 16, 2026
13aaa7e
deploy: expect BB_API_URL_* variables to be without _archive alias
pragmaxim Mar 16, 2026
7544c00
deploy: wait for blockbook to be synced after deploy before e2e tests
pragmaxim Mar 16, 2026
67fee60
deploy: rename BB_API_URL to BB_TEST_API_URL as a convention for coin…
pragmaxim Mar 16, 2026
a91dcc6
ci/cd: introducing test name config
pragmaxim Mar 17, 2026
f8ae668
ci/cd: removing unused env_resolution
pragmaxim Mar 17, 2026
e23bfbd
ci/cd: both suffix & infix archive fallback mechanism
pragmaxim Mar 17, 2026
f99e617
ci/cd: build + deploy steps
pragmaxim Mar 17, 2026
24a76f0
ci/cd: build groups BBs by runner and call make with all of them
pragmaxim Mar 17, 2026
ea4cbe7
ci/cd: batter naming for GH action
pragmaxim Mar 17, 2026
b4b2b93
ci/cd: use apt-get as originally
pragmaxim Mar 17, 2026
cce3899
ci/cd: transparent deploy progress for troubleshooting
pragmaxim Mar 17, 2026
7d37154
ci/cd: cleanup
pragmaxim Mar 17, 2026
8139873
ci/cd: prod & dev environments
pragmaxim Mar 18, 2026
a1f1403
ci/cd: /root-path/{branch_or_tag}/{coin_alias}/blockbook.deb
pragmaxim Mar 18, 2026
ab37884
ci/cd: conditional backend building
pragmaxim Mar 18, 2026
c0abe5d
ci/cd: coin/coin_alias usage should be sound
pragmaxim Mar 18, 2026
4a86daa
ci/cd: cleanup domain filtering
pragmaxim Mar 19, 2026
4446042
ci/cd: validation logic
pragmaxim Mar 19, 2026
b5bc614
ci/cd: sub-commands help
pragmaxim Mar 19, 2026
0bfa88c
ci/cd: bin/bb_deploy wrapper
pragmaxim Mar 19, 2026
f6e5804
ci/cd: env vars section and naming matrix in documentation
pragmaxim Mar 19, 2026
ea5c98a
ci/cd: final cleanup
pragmaxim Mar 19, 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
48 changes: 48 additions & 0 deletions .github/actions/export-env-vars/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
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"]
alias_prefixes = (
"BB_RPC_URL_HTTP_",
"BB_RPC_URL_WS_",
"BB_RPC_BIND_HOST_",
"BB_RPC_ALLOW_IP_",
"BB_TEST_API_URL_HTTP_",
"BB_TEST_API_URL_WS_",
)

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()
break
write_env_var(env_file, normalized, text)
PY
7 changes: 7 additions & 0 deletions .github/bin/bb_deploy
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" "$@"
243 changes: 243 additions & 0 deletions .github/scripts/build_packages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,243 @@
#!/usr/bin/env python3

from __future__ import annotations

import argparse
import json
import os
import shutil
import subprocess
import sys
from pathlib import Path
from urllib.parse import urlparse


LOG_PREFIX = "CI/CD Pipeline:"
SCRIPT_NAME = "[build-packages]"
DEFAULT_PACKAGE_ROOT = "/opt/blockbook-builds"


def log(message: str) -> None:
print(f"{LOG_PREFIX} {SCRIPT_NAME} {message}", file=sys.stderr, flush=True)


def fail(message: str) -> None:
print(f"{LOG_PREFIX} error: {message}", file=sys.stderr)
raise SystemExit(1)


def load_config(path: Path) -> dict:
try:
payload = json.loads(path.read_text(encoding="utf-8"))
except Exception as exc:
fail(f"cannot read {path}: {exc}")
if not isinstance(payload, dict):
fail(f"invalid config {path}: expected a JSON object")
return payload


def get_package_name(config: dict, section: str, coin: str) -> str:
value = config.get(section, {}).get("package_name", "")
if not isinstance(value, str) or not value.strip():
fail(f"coin '{coin}' does not define {section}.package_name")
return value.strip()


def get_coin_alias(config: dict, coin: str) -> str:
value = config.get("coin", {}).get("alias", coin)
if not isinstance(value, str) or not value.strip():
fail(f"coin '{coin}' does not define coin.alias")
return value.strip().lower()


def resolve_backend_domain(always_build_backend: bool) -> str:
domain = os.environ.get("BB_BACKEND_DOMAIN", "").strip()
if always_build_backend:
return domain
if not domain:
fail("BB_BACKEND_DOMAIN must be set unless --always-build-backend is used")
return domain


def rpc_url_env_name(alias: str) -> str:
return f"BB_RPC_URL_HTTP_{alias}"


def rpc_hostname(url: str) -> str:
if not url:
return ""
try:
return urlparse(url).hostname or ""
except ValueError:
return ""


def should_build_backend(
*,
always_build_backend: bool,
backend_domain: str,
rpc_host: str,
) -> tuple[bool, str]:
if always_build_backend:
return True, "always-build-backend"
if backend_domain and backend_domain == rpc_host:
return True, f"rpc-host-matches-{backend_domain}"
if not rpc_host:
return False, "rpc-host-missing"
return False, f"rpc-host-does-not-match-{backend_domain}"


def resolve_branch_or_tag() -> str:
configured = os.environ.get("BRANCH_OR_TAG", "").strip()
if configured:
return configured

try:
result = subprocess.run(
["git", "branch", "--show-current"],
check=True,
capture_output=True,
text=True,
)
current_branch = result.stdout.strip()
except (FileNotFoundError, subprocess.CalledProcessError):
current_branch = ""
if current_branch:
return current_branch

try:
result = subprocess.run(
["git", "describe", "--tags", "--exact-match"],
check=True,
capture_output=True,
text=True,
)
current_tag = result.stdout.strip()
except (FileNotFoundError, subprocess.CalledProcessError):
current_tag = ""
if current_tag:
return current_tag

fail("BRANCH_OR_TAG is not set and the current checkout is neither a branch nor an exact tag")


def latest_package(pattern: str) -> Path:
matches = sorted(Path("build").glob(pattern), key=lambda p: p.stat().st_mtime, reverse=True)
if not matches:
fail(f"built package was not found (pattern build/{pattern})")
return matches[0]


def parse_args(argv: list[str]) -> argparse.Namespace:
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("--always-build-backend", action="store_true")
parser.add_argument("coins", nargs="+")
return parser.parse_args(argv)


def main(argv: list[str] | None = None) -> None:
raw_args = list(sys.argv[1:] if argv is None else argv)
if not raw_args:
fail(f"usage: {Path(sys.argv[0]).name} <coin-alias> [<coin-alias> ...]")
parsed = parse_args(raw_args)
args = parsed.coins

always_build_backend = parsed.always_build_backend
backend_domain = resolve_backend_domain(always_build_backend)

package_root = os.environ.get("BB_PACKAGE_ROOT", "").strip() or DEFAULT_PACKAGE_ROOT
if not os.path.isabs(package_root):
fail(f"BB_PACKAGE_ROOT must be an absolute path (got '{package_root}')")
branch_or_tag = resolve_branch_or_tag()
branch_or_tag_path = branch_or_tag.replace("/", "-")

log("requested coins: " + " ".join(args))
log(f"always_build_backend={int(always_build_backend)}")
log(f"BB_BACKEND_DOMAIN={backend_domain or '<unset>'}")
log(f"branch_or_tag={branch_or_tag} -> path={branch_or_tag_path}")
log(f"package_root={package_root}")

coins: list[str] = []
blockbook_package_names: list[str] = []
backend_package_names: list[str] = []
build_backend_flags: list[bool] = []
make_targets: list[str] = []

for coin in args:
config_path = Path("configs") / "coins" / f"{coin}.json"
if not config_path.is_file():
fail(f"missing coin config {config_path}")

config = load_config(config_path)
blockbook_package_name = get_package_name(config, "blockbook", coin)
backend_package_name = get_package_name(config, "backend", coin)
coin_alias = get_coin_alias(config, coin)
rpc_env = rpc_url_env_name(coin_alias)
rpc_url = os.environ.get(rpc_env, "").strip()
host = rpc_hostname(rpc_url)
build_backend, reason = should_build_backend(
always_build_backend=always_build_backend,
backend_domain=backend_domain,
rpc_host=host,
)

coins.append(coin)
blockbook_package_names.append(blockbook_package_name)
backend_package_names.append(backend_package_name)
build_backend_flags.append(build_backend)

if build_backend:
target = f"deb-{coin}"
else:
target = f"deb-blockbook-{coin}"
log(
f"validated {coin}: alias={coin_alias}, blockbook={blockbook_package_name}, "
f"backend={backend_package_name}, target={target}, build_backend={str(build_backend).lower()}, "
f"reason={reason}, rpc_env={rpc_env}, rpc_host={host or '<unset>'}"
)
make_targets.append(target)

log(f"removing previous packages matching build/{blockbook_package_name}_*.deb")
for path in Path("build").glob(f"{blockbook_package_name}_*.deb"):
path.unlink()
if build_backend:
log(f"removing previous packages matching build/{backend_package_name}_*.deb")
for path in Path("build").glob(f"{backend_package_name}_*.deb"):
path.unlink()
shutil.rmtree(Path(package_root) / branch_or_tag_path / coin, ignore_errors=True)

log("starting build: make " + " ".join(make_targets))
try:
subprocess.run(["make", *make_targets], check=True)
except subprocess.CalledProcessError as exc:
raise SystemExit(exc.returncode) from exc
log("build finished")

for coin, blockbook_package_name, backend_package_name, build_backend in zip(
coins, blockbook_package_names, backend_package_names, build_backend_flags
):
blockbook_package_file = latest_package(f"{blockbook_package_name}_*.deb")
backend_package_file: Path | None = None
if build_backend:
backend_package_file = latest_package(f"{backend_package_name}_*.deb")

target_dir = Path(package_root) / branch_or_tag_path / coin
target_dir.mkdir(parents=True, exist_ok=True)

staged_blockbook = target_dir / blockbook_package_file.name
shutil.copy2(blockbook_package_file, staged_blockbook)
log(f"staged {coin} blockbook to {staged_blockbook}")

if build_backend and backend_package_file is not None:
staged_backend = target_dir / backend_package_file.name
shutil.copy2(backend_package_file, staged_backend)
log(f"staged {coin} backend to {staged_backend}")

log(f"built {coin} blockbook via {blockbook_package_file}")
if backend_package_file is not None:
log(f"built {coin} backend via {backend_package_file}")
print(blockbook_package_file)


if __name__ == "__main__":
main()
Loading