Three CI fixes for the lux-build ARC pool to actually pass:
- go.sum: hanzoai/[email protected] hash refreshed via go mod tidy
against the live proxy (was 5Rl3…, now YxjIyn…). proxy.golang.org
serves the current zip; sum.golang.org's stale record was rejecting
on every build.
- e2e/pchain_test.go, e2e/xchain_test.go: deleted. They imported
luxfi/indexer/{pchain,xchain} which were renamed long ago to
platform/, dag/, etc. Tests have been failing since.
- build.yml: install gcc + libsqlite3-dev on the ARC runner so cgo
works (mattn/go-sqlite3 needs it).
luxfi/indexer is now a single-purpose repo: the standalone indexerd
chain-indexer daemon. The unified Go binary (indexer + graph + embedded
SPA) lives in luxfi/explorer; the standalone graph daemon lives in
luxfi/graph. One way to do everything.
Changes:
- cmd/indexerd/ new entrypoint (replaces broken cmd/indexer/)
- daemon/ public package: Config, RunIndexers, MountIndexerAPI,
MountHealth, ListenAndServe — importable by
luxfi/explorer for the unified binary
- Dockerfile builds only /usr/local/bin/indexerd (port 8091)
- Makefile single target
Removed:
- cmd/explorer/, cmd/explorerd/ — moved to luxfi/explorer
- cmd/indexer/ — broken (imports nonexistent
{a,b,k,p,q,t,x,z}chain packages)
- cmd/multichain/, multichain/ — outdated multi-chain manager
- cmd/evmchains/ — outdated EVM chain registry tool
- cmd/graphd/ — moved to luxfi/graph
- Dockerfile.{indexer,orig,simple} — pre-canonical leftovers
Indexer config (daemon.Config) is intentionally minimal: data_dir,
http_addr, chains[]. Brand, networks, graph, token, and subgraph
customization is the unified-explorer concern (per-chain in chains.yaml,
read by luxfi/explorer). Extra YAML fields are silently ignored here.
The standalone API server's detectTables() runs once on construction and
caches the table name (evm_blocks vs blocks). If main.go mounts the API
before runChain has called idx.Init() on the EVM indexer, detectTables
sees no evm_blocks and falls back to the bare 'blocks' default — which
never exists, so every query returns empty.
Verified locally: with the table-wait fix, multi-chain mode indexes all
five mainnet chains correctly. After ~50s of run time:
cchain blocks=845 max=844 txs=1
zoo blocks=833 max=832 txs=52 (fully synced)
hanzo blocks=47 max=46 txs=58 (fully synced)
spc blocks=11 max=10 txs=2 (fully synced)
pars blocks=29 max=28 txs=42 (fully synced)
/v1/indexer/{slug}/blocks returns chain-specific data; /v1/explorer/*
legacy alias works; /v1/indexer/cchain/* default-chain alias works.
Runs the per-network manifests in universe/k8s/lux-explorer, pins the
freshly built ghcr.io/luxfi/indexer:main image, restarts each deployment,
and patches IngressRoutes so testnet/devnet hostnames stop sharing the
mainnet pod's data.
Idempotent — safe to rerun whenever a new image is published.
cmd/indexer was kept around as the per-chain legacy entrypoint; cmd/explorer
is now the unified single-binary entrypoint that subsumes it. The legacy
build step was failing in CI because cmd/indexer hasn't been kept compiling
through recent refactors. Drop it — the unified binary covers single-chain
mode via --rpc as well as multi-chain via --config.
Local re-download went via GitHub directly and got a different commit
content for the v0.6.0 tag. Restore the proxy.golang.org-canonical hash
so CI builds (which fetch via the module proxy) succeed.
Reusable workflow at hanzoai/.github expects lux-* ARC runners that
aren't provisioned for the luxfi org, so every push fails with a
startup_failure. Drop the indirection and build amd64 with QEMU on a
hosted runner. Pushes ghcr.io/luxfi/indexer:{sha,branch,latest}.
Trade-off: amd64-only for now. Can re-add arm64 once the per-org ARC
scale-set is provisioned.
The 30-second mount cap was firing before the EVM indexer wrote its first
block — for chains whose RPC was slow or whose subnet had only a handful of
blocks, the standalone API never mounted and requests fell through to the
SPA placeholder. Three fixes:
1. Pre-init the EVM schema in runChain *before* starting the indexing loop.
Run() also calls Init(), so this is idempotent — but doing it eagerly
means the API server can detect tables on its first probe instead of
waiting on a slow first GetLatestBlock RPC roundtrip.
2. Replace the 30-attempt cap with retry-until-ctx-done and log the actual
failure reason every five minutes. Bad RPC URLs and missing data dirs
are now visible in the log instead of silently disappearing.
3. Mount each chain at both /v1/indexer/* and /v1/explorer/* (legacy alias)
so existing Blockscout-fork frontends keep working without an ingress
middleware. Default chain also gets a /v1/indexer/{slug}/* alias for
hostname-based routing.
Also: PORT env (K8s convention) now feeds HTTP_ADDR if set, and
CHAIN_RPC_URL (LiquidExplorer operator) joins RPC_ENDPOINT as a single-chain
RPC source.
Lets chain configs declare these protocols natively. Per-event decoding
already happens generically via evm/contracts/abi.go (any ABI uploaded to
verifier surfaces); the structured GraphQL ingestion for ERC-3643 lives in
luxfi/graph and is fed automatically once SecurityToken/IdentityRegistry/
ONCHAINID/etc. emit events on the indexed chain.
The evmchains process creates API servers but never created the
database tables they query. Add EnsureTables() that runs CREATE TABLE
IF NOT EXISTS for all 9 required tables (blocks, transactions,
addresses, tokens, token_transfers, logs, internal_transactions,
token_balances, extended_stats) with proper indexes and seeds the
stats row. Called on each chain startup before serving API requests.
Fixes: pq: relation "cchain_extended_stats" does not exist
- Replace all hardcoded cchain_ table references with Tbl() prefix pattern
- Add chainSlug parameter to Repository, Adapter, Search, Stats, Charts
- New cmd/evmchains binary: runs all EVM chains in single process
- Config-driven via YAML (configs/evmchains.yaml)
- Management HTTP server on :9000 (/health, /chains)
- Shared PostgreSQL with per-chain table prefixes
- Update Dockerfile for multi-binary support
- AUTOINCREMENT → SERIAL (bchain, qchain, zchain)
- INSERT OR IGNORE → ON CONFLICT DO NOTHING (all chains)
- INSERT OR REPLACE → ON CONFLICT DO UPDATE (qchain, tchain)
- datetime('now') → NOW() (pchain)
- datetime(?, 'unixepoch') → to_timestamp(?) (pchain)
- Add K-chain to DAG indexer and CLI
Add JWT validation middleware using OIDC discovery and JWKS from
hanzo.id. The middleware is optional (IAM_ENABLED=true to activate)
for backward compatibility.
- iam.go: OIDC JWT validation with JWKS caching (1h TTL), RS256
signature verification, issuer validation, and automatic user
provisioning from IAM claims
- account_handlers.go: REST API handlers for user info, API keys,
watchlists, address tags, and custom ABIs
- server.go: wire IAM middleware into /api/account/v2 subrouter
with RequireAuth on all account endpoints; public endpoints
(blocks, transactions, search) remain unauthenticated
- Implement full TON indexer with NFT marketplace support
- Support GetGems, TON Diamonds, Fragment marketplaces
- Parse TEP-62 NFT transfer and ownership messages
- Add TONNFTSale struct for sale tracking
- Implement BOC/Cell parsing helpers
- Add TON address and coin parsing
- Remove stub from other_indexers.go
- Test metadata parsing (OpenSea format, IPFS URLs, animation URLs)
- Test trait extraction (attributes, properties)
- Test URI resolution (IPFS, Arweave, HTTP, data URIs)
- Test cache operations
- Add NFTMetadataService with caching and rate limiting
- Support IPFS gateways (ipfs.io, cloudflare-ipfs, pinata)
- Support Arweave (arweave.net)
- Parse OpenSea/ERC721 metadata JSON format
- Extract traits with type, value, display type, max value
- Add configurable TTL cache for metadata
- Replace AUTOINCREMENT with BIGSERIAL for PostgreSQL
- Replace INSERT OR IGNORE with ON CONFLICT DO NOTHING
- Add DATABASE_URL environment variable support in unified storage
- Add schema helper functions to postgres.go query backend
- Replace @hanzo/mdx with fumadocs-core, fumadocs-mdx, fumadocs-ui
- Update all components to use fumadocs imports
- Upgrade to Tailwind CSS v4 with @tailwindcss/postcss
- Update Next.js to 15.5.9 (patched version)
- Add fumadocs-ui CSS imports and theme configuration