Files
macu-wallet/src/core/balances.js
T
2026-08-27 18:27:44 +00:00

40 lines
1.5 KiB
JavaScript

/**
* balances.js
*
* Reads on-chain balances. Requires the user to configure RPC endpoints
* (config.json) — we don't bake in a paid provider's API key. Free public
* endpoints are set as defaults so it works out of the box, but they are
* rate-limited and not meant for production use.
*/
const { ethers } = require('ethers');
const { Connection, PublicKey, LAMPORTS_PER_SOL } = require('@solana/web3.js');
async function getEthBalance(address, rpcUrl) {
const provider = new ethers.JsonRpcProvider(rpcUrl);
const wei = await provider.getBalance(address);
return ethers.formatEther(wei); // returns a decimal string, e.g. "1.234"
}
async function getSolBalance(address, rpcUrl) {
const connection = new Connection(rpcUrl);
const lamports = await connection.getBalance(new PublicKey(address));
return (lamports / LAMPORTS_PER_SOL).toString();
}
/** Bitcoin: no JSON-RPC by default without running your own node, so we
* use a block explorer's public REST API (Blockstream) instead. */
async function getBtcBalance(address, apiBase = 'https://blockstream.info/api') {
const res = await fetch(`${apiBase}/address/${address}`);
if (!res.ok) throw new Error(`Blockstream API error: ${res.status}`);
const data = await res.json();
const sats =
data.chain_stats.funded_txo_sum -
data.chain_stats.spent_txo_sum +
data.mempool_stats.funded_txo_sum -
data.mempool_stats.spent_txo_sum;
return (sats / 1e8).toString();
}
module.exports = { getEthBalance, getSolBalance, getBtcBalance };