# GL Darano's independent, append-only general-ledger service. It preserves every committed wallet value movement so financial state can be reconstructed when a blockchain or provider is unavailable. The implementation contract and invariants are defined in [DESIGN.md](DESIGN.md). Generate protobufs, test, and build with: ```bash make generate make test make build ``` Run the ledger API and dashboard as separate processes: ```bash go run ./cmd/gl -conf ./gl.cfg.toml go run ./cmd/dashboard -conf ./dashboard.cfg.toml ``` For live reload, install [Air](https://github.com/air-verse/air) and run `air` from the repository root. The checked-in `.air.toml` rebuilds and restarts both processes together. The read-only network explorer is served on `http://localhost:8080` by default: The header includes English/Persian localization and a persistent light/dark theme toggle that initially follows the operating-system preference. - `/` shows network totals and recent committed journals; - `/assets` ranks the top positive user holders for recently active assets; - `/holders` combines a user's available and frozen balance and activity for one asset; - `/transactions` shows paginated recent transactions, filters them by user/wallet and effect type, and finds journals by exact blockchain transaction hash or internal journal ID; - `/accounts` rebuilds a ledger account balance and activity history. The gRPC service owns schema migrations. The dashboard is read-only, uses its own `dashboard.cfg.toml`, and does not run migrations. Run the dashboard load test against a started dashboard with: ```bash make load-test LOADTEST_ARGS='-duration 30s -concurrency 50' ``` Use `-paths` to exercise known explorer records as well as the overview, for example `-paths '/,/transactions?q=KNOWN_HASH,/accounts?class=USER_AVAILABLE&owner_type=user&owner_id=17&asset_id=9'`. Run the fixed 10-person, 10,000,000-transfer GL conservation scenario with: ```bash make gl-redistribution-load-test Asset number: 7 ``` It starts with one person holding 10,000, uses random transfer values while protecting a minimum of 45 per person, and verifies that the final ten balances still sum to exactly 10,000.