Token Supply API
Public REST endpoints that serve CLAIM token supply data for indexers such as CoinGecko, CoinMarketCap, DeFiLlama, and any third-party aggregator.
Endpoints
All endpoints are unauthenticated, return JSON, and are safe to poll at any frequency. Responses are cached for 5 minutes (max supply: 24 hours).
GET /api/supply/total
Returns the current total supply of CLAIM (all minted tokens minus any burned).
GET https://claimru.sh/api/supply/totalResponse:
{ "result": "14349000.00" }GET /api/supply/circulating
Returns the circulating supply: total supply minus CLAIM locked in veCLAIM.
GET https://claimru.sh/api/supply/circulatingResponse:
{ "result": "12000000.00" }GET /api/supply/max
Returns null — CLAIM has no hard-coded max supply. Supply starts at 0 and is minted continuously by MineCore with a decaying emission schedule.
GET https://claimru.sh/api/supply/maxResponse:
{ "result": null }Bare response format (?format=bare)
All three endpoints accept the ?format=bare query parameter. When set, they return the decimal value as text/plain instead of the JSON wrapper — required by CoinMarketCap-style submissions that expect a bare numeric body. CoinGecko continues to use the default JSON shape.
GET https://claimru.sh/api/supply/total?format=bareReturns:
14349000.00GET https://claimru.sh/api/supply/circulating?format=bareReturns:
12000000.00GET https://claimru.sh/api/supply/max?format=bareReturns the literal four-character string null (since CLAIM has no max supply). CoinMarketCap-style submissions should typically omit the max-supply URL entirely and use the “unlimited” form toggle instead; this endpoint exists for parity.
On error, bare-format responses return HTTP 502 with an empty body and the original error code in the x-supply-error response header.
Error responses
On failure (RPC unreachable, contracts not deployed, or RPC returns a malformed uint256), all endpoints return HTTP 502 with result: null and an error code:
{ "result": null, "error": "SUPPLY_NO_RPC_URL" }{ "result": null, "error": "SUPPLY_RPC_INVALID_UINT256" }SUPPLY_RPC_INVALID_UINT256 is emitted when the upstream RPC returns anything other than a strict 0x + 64 hex characters payload for an eth_call view. The endpoints fail closed on that case rather than caching 0 as a “valid” supply read.
Supply methodology
Formula
totalSupply = ClaimToken.totalSupply()
lockedSupply = VeClaimNFT.totalLockedClaim()
circulatingSupply = totalSupply - lockedSupplyBoth values are read from Base mainnet via eth_call against the latest block.
Onchain sources
| Metric | Contract | Solidity selector |
|---|---|---|
| Total supply | ClaimToken | totalSupply() — 0x18160ddd |
| Locked supply | VeClaimNFT | totalLockedClaim() — 0x0ff566a7 |
Contract addresses are loaded from deployments/<network>.json.
Why exclude locked tokens?
CoinGecko’s official supply methodology states:
Locked Tokens: Tokens that are locked via smart contracts or other time-based lockups are excluded.
This matches the Aerodrome (AERO) precedent on Base: CoinGecko shows AERO circulating supply as totalSupply - veAERO locked balance. As of April 2026, AERO total supply is ~1.875B with ~954M locked in the Voting Escrow contract, producing a circulating supply of ~921M — which matches the CoinGecko listing exactly.
CLAIM follows the same ve-tokenomics model, so the same formula applies.
Implementation details
| Component | Role |
|---|---|
/api/supply/total | Server-side handler: total supply via eth_call to ClaimToken.totalSupply() (0x18160ddd); 5-min cache-control. |
/api/supply/circulating | Server-side handler: circulating supply via eth_call to both ClaimToken.totalSupply() and VeClaimNFT.totalLockedClaim() (0x0ff566a7); 5-min cache-control. |
/api/supply/max | Server-side handler: returns static { "result": null } (no hard-coded max supply); 24-hour cache-control. |
| Default response contract | JSON shaped as { result: string | null, error?: string }. Wei is converted to a fixed-point decimal string (18 decimals truncated to 2). |
?format=bare response contract | text/plain body: the decimal string on success, the literal null for max, or an empty body on 502 (with the error code in the x-supply-error header). |
deployments/<network>.json | Source for ClaimToken and VeClaimNFT addresses used by the handlers. |