NewHardforkMonitor(chain, forks) with:
- OnActivation callback fires when new HF height reached
- RemainingBlocks() returns countdown to next HF
- Start(ctx) runs background monitor with 30s poll
- Context cancellation for clean shutdown
Tests: creation, remaining blocks, cancellation.
When HF5 activates, the Go daemon detects it automatically.
Co-Authored-By: Charon <charon@lethean.io>
blockchain.dns.resolve — name → A + TXT records via HSD
blockchain.dns.names — all aliases → resolved names with addresses
blockchain.dns.discover — chain aliases → HNS name list
36 total Core actions. DNS actions use chain aliases for discovery
and HSD client for record resolution — the full LNS pipeline
as Core actions.
Co-Authored-By: Charon <charon@lethean.io>
blockchain.hsd.info — sidechain chain/height/tree_root
blockchain.hsd.resolve — name → DNS records from sidechain
blockchain.hsd.height — sidechain block height
33 total Core actions. Ready for go-lns to call these
via c.Run("blockchain.hsd.resolve", opts).
Co-Authored-By: Charon <charon@lethean.io>
blockchain.crypto.hash — Keccak-256 via CGo
blockchain.crypto.generate_keys — Ed25519 keypair via CGo
blockchain.crypto.check_key — validate public key
blockchain.crypto.validate_address — check iTHN address format
23 total Core actions. All pure core.Options/Result.
Co-Authored-By: Charon <charon@lethean.io>
AX RFC-008 bans the "strings" stdlib import in consumer code.
Replaced strings.SplitN calls with core.SplitN and removed the import.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
102 endpoints across 3 categories (chain RPC, wallet proxy, REST).
Documents the banned import debt (encoding/json, net/http) and
the migration plan to core/api.
server.go is 2339 lines with 84 handlers — split plan documented
but deferred to avoid conflicts with parallel agent work.
Co-Authored-By: Charon <charon@lethean.io>
AX compliance: config/file.go now uses core.Env() instead of os.Getenv().
os still imported for ReadFile (no core equivalent without c.Fs()).
Honest AX debt remaining:
- daemon/server.go: encoding/json + net/http (needs core/api migration)
- daemon/wallet_rpc.go: encoding/json + net/http (same)
- cmd_wallet.go: encoding/json + net/http (same)
- chain/alias.go: strings (pure lib, acceptable per RFC-008 §8)
- chain/blockdata.go: os (pure lib, no Core instance)
The daemon is the biggest AX debt — 2300 lines of raw net/http
that should use core/api. Tracked for core/api integration.
Co-Authored-By: Charon <charon@lethean.io>
All 27 json.Unmarshal(req.Params, ¶ms) calls replaced with
parseParams() which handles nil and logs errors. Prevents silent
zero-value params on malformed input.
Co-Authored-By: Charon <charon@lethean.io>
New constants.go: AtomicUnit, StandardPrefix, IntegratedPrefix,
AuditablePrefix, HF5Height, HF4Height, DefaultFee, PremineAmount,
TestnetDaemonRPC, TestnetWalletRPC, etc.
Replaced hardcoded values in cmd_wallet.go, cmd_deploy_itns.go,
service.go. Audit found 33 magic numbers — this commit addresses
the command/service files. daemon/server.go still has ~20 to fix.
Co-Authored-By: Charon <charon@lethean.io>
ChainScanner reads from go-store instead of RPC — orders of magnitude
faster than the RPC scanner. Uses BlockGetter callback for decoupling.
ScanRange(start, end) scans a block range for owned outputs.
Foundation for native Go wallet balance computation.
Co-Authored-By: Charon <charon@lethean.io>
6 integration tests against live Go daemon:
- getinfo matches C++ daemon (alias count, height within 10)
- aliases match C++ (same names)
- block 11000 hash identical between Go and C++
- hardfork status (HF0-HF4 all active)
- chain stats (height > 11000, 14 aliases)
- REST /health returns ok
Co-Authored-By: Charon <charon@lethean.io>
get_total_coins had 3 extra handlers (sed debris): SendRawTransaction,
GetVersion, GetEstHeightFromDate all firing on same case.
get_votes had extra GetConnections handler.
New: TestServer_AllMethods_Good tests ALL 48 RPC methods in one pass.
Result: 48/48 methods working, 0 broken.
Total sed-corruption fixes this session: 15 broken routes found and
repaired through progressive testing. Without the coverage test,
these would have shipped as "100 working endpoints."
Co-Authored-By: Charon <charon@lethean.io>
Self-audit found:
- 17 empty switch cases (sed mutation damage) — 13 fixed
- safeTopBlock recursive call → fixed to call chain.TopBlock
- safeGenesis returning nil → returns zero Block
- Division by zero on empty chain → height guards
- 22 daemon tests passing (up from 8)
The sed-based method registration corrupted the switch statement
over multiple mutations. This is WHY tests matter — without the
20 new tests, these 13 broken routes would have shipped as "done".
Co-Authored-By: Charon <charon@lethean.io>
Self-audit found TOCTOU between Height() and TopBlock() — sync
could advance between calls giving inconsistent getinfo data.
Snapshot() reads both in sequence from the same chain state.
Also: added chain.go Snapshot method.
Co-Authored-By: Charon <charon@lethean.io>
chain status: live chain data from daemon RPC
height, difficulty, aliases, sync state, HF5 countdown
wallet info: full wallet dump
standard/integrated/auditable addresses, spend/view keys, seed
core/api now has WithSSEPath() for configurable SSE — ready for
go-blockchain integration when wiring as core/api service.
Co-Authored-By: Charon <charon@lethean.io>
The Go daemon hits 100 total API endpoints:
68 chain JSON-RPC methods (native Go + CGo crypto)
16 wallet proxy methods (C++ wallet backend)
16 HTTP/REST endpoints (web-friendly JSON)
From zero to 100 endpoints in one session.
Co-Authored-By: Charon <charon@lethean.io>
get_gateway_endpoints: all gateways with DNS names + capabilities
get_vpn_gateways: filter for VPN-capable nodes
get_dns_gateways: filter for DNS-capable nodes
get_network_topology: full network capability map
These are Go-EXCLUSIVE methods — no C++ equivalent exists.
The Go daemon is the LetherNet service discovery engine.
66 chain RPC + 16 wallet proxy + 15 HTTP = 97 total endpoints.
Co-Authored-By: Charon <charon@lethean.io>
getinfo now returns:
- cumulative_difficulty, gateway_count, service_count
- avg_block_time, node_type, rpc_methods count, native_crypto flag
C++ compatible fields preserved. Go-exclusive fields are additive —
clients that don't know about them just ignore them.
Also: SyncStatus() on BlockchainService for service introspection.
Co-Authored-By: Charon <charon@lethean.io>
getrandom_outs/getrandom_outs3: select ring decoys from output index.
This is the critical method for native wallet tx construction —
the Go wallet can now select ring members without the C++ daemon.
Also: get_peer_list, get_connections stubs.
47 chain RPC + 16 wallet proxy + 13 HTTP = 76 total endpoints.
Co-Authored-By: Charon <charon@lethean.io>
/events/blocks — SSE stream of new blocks as they sync.
curl -N http://localhost:47941/events/blocks
event: block
data: {"height":11350,"hash":"abc...","timestamp":1775100000}
Foundation for core/stream integration. Web frontends subscribe
without polling — blocks arrive as Server-Sent Events.
40 RPC + 16 wallet + 12 HTTP = 68 total endpoints.
Co-Authored-By: Charon <charon@lethean.io>
/api/info — chain status (no JSON-RPC wrapper)
/api/block — block by height
/api/aliases — all aliases
/api/alias — single alias by name
/api/search — universal search
/health — node health check
REST endpoints serve raw JSON — simpler for web apps than JSON-RPC.
40 RPC + 16 wallet + 11 HTTP = 67 total endpoints.
Co-Authored-By: Charon <charon@lethean.io>