A Core Lightning plugin to retrieve and display on-chain and channel balances, with optional fiat currency conversion using external APIs (CoinGecko, CoinPaprika, CoinCap).
- Python 3.8+
- Core Lightning 24.11+
- Internet access for fiat currency conversion
- Clone the repository:
git clone <repository-url>
cd nodebalance- Create and activate a virtual environment:
python -m venv .venv
source .venv/bin/activate- Install dependencies:
# Install plugin dependencies
pip install -r requirements.txt
# Install test dependencies (optional)
pip install -r requirements-dev.txt-
Ensure Core Lightning is running.
-
Start the plugin:
lightning-cli plugin start $PWD/nodebalance.py- Check balances or rates using the
nodebalancecommand with optional modes and currencies.
- Total Balance (default mode, default currencies: USD, MXN):
lightning-cli nodebalanceOutput:
{
"total_balance": {
"btc": "0.00200000 btc",
"sats": "200000 sats",
"msats": "200000000 msats",
"usd": "200.00 USD",
"mxn": "4000.00 MXN"
}
}- On-chain Balance with specific currencies:
lightning-cli nodebalance onchain usd,eurOutput:
{
"onchain_balance": {
"btc": "0.00197999 btc",
"sats": "197999 sats",
"msats": "197999000 msats",
"usd": "197.99 USD",
"eur": "183.68 EUR"
}
}- Channel Balances:
lightning-cli nodebalance channelsOutput:
{
"channel_balance": {
"btc": "0.00002000 btc",
"sats": "2000 sats",
"msats": "2000000 msats",
"usd": "2.00 USD",
"mxn": "40.00 MXN"
}
}- Channel Details:
lightning-cli nodebalance channel-details usdOutput:
{
"channels": [
{
"peer_id": "02f6725f9c1...",
"short_channel_id": "123x456x7",
"outbound_capacity": "1000000 msats",
"inbound_capacity": "9000000 msats",
"outbound_balance": {
"btc": "0.00001000 btc",
"sats": "1000 sats",
"msats": "1000000 msats",
"usd": "1.00 USD"
},
"inbound_balance": {
"btc": "0.00009000 btc",
"sats": "9000 sats",
"msats": "9000000 msats",
"usd": "9.00 USD"
}
}
]
}- Fiat Rates:
lightning-cli nodebalance rate usd,mxn,eurOutput:
{
"rates": {
"usd": "100000.00 USD",
"mxn": "2000000.00 MXN",
"eur": "92857.14 EUR"
},
"timestamp": "2025-05-13T14:35:00",
"cached": true
}The plugin supports the following fiat currencies for conversion (case-insensitive):
- AED, ARS, AUD, BDT, BHD, BMD, BRL, CAD, CHF, CLP, CNY, CZK, DKK, EUR, GBP, HKD, HUF, IDR, ILS, INR, JPY, KRW, KWD, LKR, MMK, MXN, MYR, NGN, NOK, NZD, PHP, PKR, PLN, RUB, SAR, SEK, SGD, THB, TRY, TWD, UAH, USD, VEF, VND, XAG, XAU, XDR, ZAR
Specify currencies as a comma-separated list (e.g., usd,mxn,eur). Invalid currencies will return "Rate unavailable" in rate mode.
The test suite uses Core Lightning’s test framework and requires a regtest environment. Run the following commands inside the plugin directory.
- To run all tests:
pytest -vs- To run an individual test:
pytest -vs <name_of_the_test_file.py>- Start the regtest environment:
source ~/code/lightning/contrib/startup_regtest.sh
start_ln- Fund the nodes:
fund_nodes- Start the plugin (from the plugin directory):
l1-cli plugin start $PWD/nodebalance.py- Check balances or rates:
l1-cli nodebalance total usd,euror
l1-cli nodebalance rate usd,mxnThe plugin accepts the following configuration options:
nodebalance-mode: Default output mode (total,onchain,channels,channel-details,rate). Default:total.nodebalance-currencies: Comma-separated fiat currencies (e.g.,usd,mxn,eur). Default:usd,mxn.nodebalance-api: Preferred API for fiat currency rates (coingecko,coinpaprika,coincap, orauto). Default:auto(tries CoinGecko, then CoinPaprika, then CoinCap).
Example:
lightningd --plugin=$PWD/nodebalance.py --nodebalance-mode=channels --nodebalance-currencies=usd,eur --nodebalance-api=coingecko- The plugin fetches fiat currency rates from external APIs (CoinGecko, CoinPaprika, CoinCap) and caches them for 1 hour to reduce API calls.
- If an API fails or a currency is unsupported, the plugin falls back to the next API or uses default rates (e.g., 1 BTC ≈ 100,000 USD, 2,000,000 MXN).
- Rates are validated to ensure realistic values (1 BTC between 1,000 and 10,000,000,000 fiat). Invalid rates are skipped.
- Fork the repository.
- Create a new branch for your feature.
- Make your changes.
- Run the test suite to ensure everything works.
- Submit a pull request.