Providers

eCash Explorer

eCash history and blocks from explorer.e.cash, the Bitcoin ABC explorer. One request a page, no key, and Blockchair gets to rest.
IDecash19 / 19keyless
Provider

eCash Explorer

  • ecash
Chains
1
Auth
none
Operations
2 of 10
served 2 / 10

Operations

  • balancegetBalanceabsent
  • historygetTxHistoryserved
  • tx detailgetTxDetailabsent
  • utxosgetUtxosabsent
  • pubkeygetPubkeyabsent
  • contractgetContractInfoabsent
  • tokensgetTokenBalancesabsent
  • transfersgetTokenTransfersabsent
  • gasgetGasDataabsent
  • blockgetBlockInfoserved

Access

Createcreate("ecash")
Import@agntn/explorers/providers/ecash
Hostexplorer.e.cash
Statusproviders on the docs worker

Address it

ts
import { ECash } from "@agntn/explorers/providers/ecash";

const xec = new ECash(); // or create("ecash")
await xec.getTxHistory("ecash:qq5r308v2mkh6x5mkqpr6wytszz6f9r7qcnfttev0z", "ecash", { limit: 10 });
await xec.getBlockInfo(963629, "ecash");

One chain, no key. explorer.e.cash is the block explorer Bitcoin ABC runs on top of its Chronik indexer. baseUrl is the explorer root, https://explorer.e.cash by default.

Why bother, when Blockchair already reads eCash? Because keyless Blockchair spends one request on the address and one more on every transaction in it. A handful of reads later your IP sits on its blacklist. Here a whole page of history is one request. So history and blocks now start on eCash Explorer, and with BLOCKCHAIR_API_KEY set they start on Blockchair and fall back here. Any other chain is an UnsupportedChainError.

What it reads

OperationRoute
history/api/address/{address}/transactions?page=&take=
block/api/blocks/{height - 1}/{height}

That's the whole JSON side. The balance, a single transaction and the unspent outputs only exist as HTML pages. Scraping them? No thanks. getBalance throws UnsupportedOperationError, and the automatic choice sends balances to Blockchair, which still answers them fine.

Gotchas

  • The explorer reads one spelling: lowercase CashAddr with the ecash: prefix. Anything else gets a 500 page. So the provider checks the address with @agntn/chains first, then adds the prefix and lowers the case. A Bitcoin Cash address fails before a request goes out.
  • A history row gives only the net change of the address, never the other side. Negative means a send: from is the address, to is null and value is what left minus the fee, the way Mempool counts it. Anything else is a receive, with from empty and to the address.
  • The fee is inputs minus outputs. A block reward has no inputs, so it gets no fee at all.
  • timestamp is when Chronik first saw the transaction. That can be minutes before its block was mined. The block time shows up only for a transaction that never sat in Chronik's mempool.
  • Mempool transactions come first and read as pending at block 0.
  • Newest first and only that way, so sort: "asc" throws. No block bounds either, so startBlock and endBlock throw instead of being ignored.
  • limit up to 100, and page from 1 becomes Chronik's page index from 0. Past the last page you get an empty list.
  • Token rows keep their token details in raw. tokenTransfers stays empty, because the row only says how much of one token moved, not between whom.
  • A block range comes newest first. The provider asks for the block and the one below it, so the parent hash costs no extra request. Genesis gets the all-zero parent, and a height past the tip is a NotFoundError.
  • A block has an empty miner and gas fields of "0". eCash has no gas, no surprise.

Where it lives

src/providers/ecash.ts.