u/internetA1

▲ 3 r/web3

Most "web3" wallets still depend on 3 companies for RPCs and 1 company for the block explorer

Spent the last few months thinking about how thin the "decentralized" layer of normal web3 UX actually is. The chain is decentralized. The execution is decentralized. But the way almost every user sees the chain — block explorers, hosted RPC providers, some dashboard — is concentrated in maybe five vendors total. If one of them rotates an API key tier or IP-bans you, a meaningful chunk of "web3 tooling" stops working for you specifically, and nobody talks about it because it's the kind of dependency that's invisible until it breaks.

The part I keep coming back to is the public RPC commons. Endpoints like publicnode, mempool dot space, blockstream, and Solana's mainnet-beta are open and unauthenticated, and they're genuinely good enough for read-side workflows — balances, tx lookups, gas estimation, mempool fees. But they're also a small handful of providers, and Solana mainnet-beta already throttles anonymous traffic hard enough that you have to maintain a fallback chain just to stay functional. I don't know whether that commons is holding up or quietly degrading, and I'd be curious whether anyone on here has data either way.

The other thing that bothers me is the dominant tx decoder being a webapp owned by one company. Calldata decoding for Uniswap V2/V3/Universal Router, Governor, Timelock, Safe, Gnosis MultiSend, ERC-20 — it's a pure function of the ABI and the calldata bytes. It doesn't need a server. There's no architectural reason this has to live behind a domain you don't control, and yet that's where almost everyone reads their own transactions. I'm honestly not sure whether the moat there is real indexing infrastructure or just inertia from being the default link in every wallet UI.

To pressure-test whether keyless local-first tooling is actually viable I built it, which is the only way I know how to argue with myself honestly. The result is an MIT-licensed CLI called glnc (glnc .dev) that does balance lookups, transaction decoding, multi-chain gas, ENS resolution, Aave health factor, Uniswap V3 LP enumeration, and CSV history export across nine chains, using only public RPCs and the Uniswap default token list. No account, no API key, no telemetry, no hosted backend. Token discovery runs locally against a cached token list. Decoding runs locally against a selector registry. Prices come from CoinGecko's free tier with an in-memory cache so anonymous traffic doesn't get rate-limited out of existence.

What I actually learned from doing it is more interesting to me than the tool itself. Public RPCs turned out to be more reliable than I expected for read paths; the worst-case in practice is Solana throttling you and the fallback kicking in. Token discovery without an indexer is genuinely expensive to do correctly, and the Uniswap default list of around 1,400 tokens per chain is roughly the ceiling for what a keyless tool can credibly claim — full discovery requires an archive node you can't run on a laptop, which is a hard limit, not an engineering gap. Linea and zkSync have a real spoofing problem where ERC-20 metadata alone isn't enough to price tokens safely without an independent canonical-address feed, and I ended up fail-closing prices on those chains until tokens are independently verified, which is uncomfortable UX but the only answer I could defend. And the "no API key" promise breaks the moment you need historical data; one major block explorer is still the only viable cross-chain history source, and that single vendor is a real centralization point that no amount of public RPC infrastructure fixes.

That last one is what I'd most like to discuss. Is "keyless, local-first, public-RPC-only" a workable long-term position for web3 read tooling, or does the indexer and history problem make it inevitable that any serious app re-centralizes on a hosted RPC plus a hosted explorer in the end? Where's the right boundary between sovereign tooling and "actually shipping software that works"?

reddit.com
u/internetA1 — 1 day ago
▲ 3 r/bun+1 crossposts

I built a free local CLI that generates a Form 8949-ready CSV without uploading my wallet anywhere — now with FIFO cost basis

Did my crypto taxes manually last year because I didn't want to hand my wallet address to Koinly or CoinTracker. Took me a weekend, two coffee-stained printouts, and a spreadsheet I had to rebuild twice. So I wrote the spreadsheet as code. It's a Node CLI called `glnc` that takes an EVM address, hits public RPCs to pull history, and dumps a CSV with FIFO cost basis already computed. Form 8949-shaped. No account, no API key, the address never leaves your laptop except to query the same public endpoints your wallet UI already hits.

The new bit (the reason I'm posting): I just added FIFO cost basis to the existing `glnc history` export. Before, you got the transaction log. Now you also get five extra columns: `cost_basis_usd`, `proceeds_usd`, `realized_gain_usd`, `holding_period` (short vs long), and `income_usd` for receipts that look like income at fair value (staking rewards, airdrops). The income column is surfaced for you to classify yourself, it doesn't try to be smart about it.

Install (Homebrew, macOS/Linux):

brew install aryarahimi1/glnc/glnc

Single wallet, full tax year:

glnc history 0xYourAddr --chain ethereum --cost-basis fifo \

--from 2025-01-01 --to 2025-12-31 --out 8949.csv

If you have multiple wallets you control, list them with `--own-wallets` so internal transfers between them don't get flagged as taxable disposals:

glnc history 0xYourMain --chain ethereum --cost-basis fifo \

--own-wallets 0xYourSecond,0xYourThird \

--from 2025-01-01 --to 2025-12-31 --out 8949.csv

Multi-chain (one CSV per chain — `history` is single-chain per run, you concat):

for c in ethereum polygon base optimism; do

glnc history 0xYourAddr --chain $c --cost-basis fifo \

--from 2025-01-01 --to 2025-12-31 --out 8949-$c.csv

done

Caveats up front because I know this sub will find them anyway. I'm not a CPA, this is not tax advice. FIFO is what it does right now; if you need HIFO or specific-ID I haven't built that yet, and I'd rather not ship it half-working. EVM only: Ethereum, Polygon, Base, Optimism. No Solana, no Bitcoin, no CEX trades (it can't see your Coinbase ledger, only on-chain stuff). DeFi gets messy fast; LP positions, perps, and rebasing tokens are the ones I'd hand-verify before trusting the output. And the historical USD prices come from public price feeds, so for thinly-traded tokens or weird timestamps the proceeds number is probably a few percent off what your exchange would have shown.

It's MIT-licensed, source is on GitHub, and if you find a wallet or pattern that produces a wrong number please open an issue with the tx hash, that's the most useful thing anyone can do.

website : https://glnc.dev

MIT, AS-IS, run the numbers past a CPA before you file. Curious if I'm missing an obvious edge case, tell me.

glnc.dev
u/internetA1 — 1 day ago
▲ 5 r/ethdev+1 crossposts

I built a CLI that does the read-side of Etherscan — balances, tx decoding, gas — so I'd stop opening 14 browser tabs

glnc is a single-binary CLI that does the read-side of Etherscan (balances, tx decoding, gas, positions, history, alerts) from your shell. MIT, free, open source. No
account, no API key required, no telemetry. Install via Homebrew or curl.

  $ glnc balance vitalik.eth                                                                                                                                                 
  $ glnc balance 0xAbc... 0xDef... --watch --positions --nfts                                                                                                              
  $ glnc tx 0x7c... --json | jq '.data.decoded.calls[] | select(.protocol=="UniswapV3")'                                                                                     
  $ glnc gas --json | jq '.data.chains.ethereum.priority.p50'                                                                                                                
  $ glnc history 0xAbc... --csv > out.csv                                                                                                                                    

What it actually does

  • balance — 6 chains (Ethereum, Polygon, Arbitrum, Base, plus Solana and Bitcoin as a bonus). Auto-detects chain from address format. ENS resolves. Token auto-discovery via the Uniswap default token list (~1,400 per chain, 24h disk-cached). Solana uses getTokenAccountsByOwner for true full SPL discovery. Multi-wallet portfolios with per-wallet tables + grand total.
  • --watch — re-polls on an interval, prints in-place +0.5 ETH / -100 USDC deltas, runs in the alternate screen buffer so your scrollback survives Ctrl+C. Snapshots
    persisted to ~/.glnc/snapshots.json.
  • tx <hash> — decodes calldata for Uniswap V2/V3, Universal Router, ERC-20, WETH, and decodes receipt logs into token movements from tx.from's perspective.
  • gas — live gas across 9 chains. EVM tiers are p10/p50/p90 priority percentiles from the last 64 blocks via eth_feeHistory. Includes BTC mempool fees and Solana priority fees.
  • --positions — Aave V3 health factor via getUserAccountData, Uniswap V3 LP NFT enumeration.
  • --nfts — top collections via Reservoir's public API.
  • history — CSV/JSON export via the Etherscan V2 unified endpoint. Works keyless; optional GLNC_ETHERSCAN_KEY raises the rate limit.
  • alert — conditional alerts to a webhook. SSRF hardening: scheme allowlist, then DNS-resolved IP checked against RFC1918 / IMDS (169.254.169.254) / loopback / CGNAT /
    link-local / IPv6-ULA / IPv4-mapped / 6to4 / NAT64 before every fire. Redirects blocked. Re-validated each invocation, not just at config time.

Dev angle

All RPCs are free public endpoints (publicnode, mainnet.base.org, blockstream, mempool.space, etc.). Prices via CoinGecko with a 60s in-memory cache. Output is stable
versioned JSON envelopes (glnc.balance/v1, glnc.tx/v1, etc.), NDJSON when streaming. --json makes stdout data-only; all chatter goes to stderr, so it pipes cleanly into jq / xargs / cron without contamination.

Honest tradeoffs

  • Token discovery is bounded by the Uniswap default list. Truly exhaustive ERC-20 discovery for an arbitrary wallet needs an archive node or a paid indexer (Alchemy/Moralis) — this is the conscious tradeoff for "no API keys."
  • CoinGecko free tier is ~30 req/min. The 60s cache absorbs most of it but you can hit the wall on big portfolios.
  • No test framework in the repo yet. It's in the README, calling it out here too.
  • BTC and Solana support is in there; not the headline for this sub, just useful if you have a multi-chain treasury.

Repo: https://github.com/aryarahimi1/glnc

Looking for feedback on the JSON envelope shape (before I have to start versioning it for real), additional protocols worth decoding in tx, and whether the SSRF blocklist is missing anything. Issues and PRs welcome.

reddit.com
u/internetA1 — 4 days ago