Build with CHERRY

Devnet buildNo valueRead-only, no keys

CHERRY is a community token on Solana. Everything below is free to read and needs no key and no sign-up; only the sign-in button near the end asks a visitor to approve a wallet message. Build a bot, a site badge, a game perk or a dashboard. We ask for three things: read the address from /mint.json and never hard-code one; never present CHERRY as an investment or hint at value; and use your own RPC for anything busy.

Public data (JSON, CORS open)

/mint.jsonThe one official mint and its network. The only source of truth for the address.
/token.jsonStable facts: name, symbol, decimals, supply, designed end state.
/holders.jsonTiers (name, minimum) and holder counts, read from chain weekly.
/season.jsonThe current season: dates, minimum tier, weekly checks.
/treasury.jsonTreasury balances, measured weekly.
/status.jsonThe hourly uptime check summary.
/copycats.jsonLook-alike tokens found by the weekly scan.
/pulseA page that reads supply, treasury vault and account counts straight from the chain, with the date of every weekly number.
/history.jsonEvery weekly measurement so far, oldest first: counts and CHERRY vault balances with the date each was read. No price, no pool figures.
/feed.xmlThe same measurements as an Atom feed, one plain-words entry per week.
/feed.jsonThe same, as a JSON Feed 1.1.
/llms.txtThe same facts, written for AI agents, with the rules for quoting them.
curl https://cherry.wildcherry.io/mint.json

One function: a wallet's tier

A one-file library, no dependencies, browser and Node 18 or newer. It reads the official mint, the tier list and the wallet's balance, and returns the tier name only (never the balance).

import { tierForWallet } from 'https://cherry.wildcherry.io/cherry-tier.js';

const r = await tierForWallet('<wallet address>');
// { wallet, tier: 'Tree' | null, network: 'devnet', mint: '...' }

// your own RPC for anything busy:
await tierForWallet(addr, { rpc: 'https://your-rpc.example' });

Also exported: getOfficial(), getTiers(), balanceOf() and the pure tierOf(balance, tiers).

An embeddable tier badge

<script type="module" src="https://cherry.wildcherry.io/embed-v1.js"
        integrity="sha384-JdlDUfuUF3ZA8erVmR+xziw9wWkrha0oCc/C0lt57N+2XOtZKDXs2EXN7m0a6bhx"
        crossorigin="anonymous"></script>
<cherry-tier wallet="<wallet address>"></cherry-tier>

Pin it exactly as shown. embed-v1.js is one self-contained file that never changes once published; the integrity value is its fingerprint, so your page refuses to load it if a single byte were ever different. A change would be a new file, embed-v2.js, with its own fingerprint.

It shows the tree for that tier and the tier name, or "No CHERRY tier yet". No balance, no price, no cookies, no tracking, nothing stored. Live example for a devnet test wallet:

An embeddable Pulse panel

<script type="module" src="https://cherry.wildcherry.io/pulse-embed-v1.js"
        integrity="sha384-DG9pb/aEqiQFDIOnMxI6hv2JZefgexLVe8z6REtkq/1PnVgN2YxouyphsaS4NFKv"
        crossorigin="anonymous"></script>
<cherry-pulse></cherry-pulse>

Pin it exactly as shown. pulse-embed-v1.js is one self-contained file that never changes once published; the integrity value is its fingerprint. A change would be a new file, pulse-embed-v2.js, with its own fingerprint.

It shows the supply, the number of outside holders and "measured N days ago", and says "Stale" when the newest measurement is older than 9 days. No price, no cookies, no tracking, nothing stored. It reads /token.json and /history.json from this site. Live:

Sign in with CHERRY: is this one real person?

A button that lets a visitor prove, with a wallet signature, that they are one verified human. Your site learns two things: the wallet address and a yes or no. It learns no name, no passport detail and nothing Self holds. The visitor signs one readable sentence; no transaction is made and no money moves. A person verifies once with one passport, so one human cannot pass as many.

On this devnet build verification runs in Self's test mode, so treat it as a working demonstration, not a real identity check.

<script type="module" src="https://cherry.wildcherry.io/signin-v1.js"
        integrity="sha384-ubJ0yCiPXFKRwsVDUJTA4z7IOWvAsgFnQRcmrUFOLOUDmukMqR6eKPJSzEKwmOW/"
        crossorigin="anonymous"></script>
<cherry-signin nonce="<a nonce your server issued>"></cherry-signin>
<script>
  document.querySelector('cherry-signin').addEventListener('cherry-signin', e =>
    fetch('/login', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(e.detail) }));
</script>

The browser's answer is for display only: your server must ignore the human value the page sends and use only the reply from this call, so nobody can fake a login by editing the page:

// on YOUR server (Node 18 or newer). `issuedNonce` is the nonce you gave THIS visitor's session. Single-use: delete it on the first successful check, or a captured proof could be replayed to your site for 10 minutes.
const r = await fetch('https://cherry.wildcherry.io/api/human-check', {
  method: 'POST', headers: { 'content-type': 'application/json' },
  body: JSON.stringify({ wallet, site, nonce, issued, signature }) }).then(x => x.json());
const loggedIn = r.ok && r.human && r.site === 'https://yoursite.example' && r.nonce === issuedNonce;

The signed sentence names your site and your nonce, so a signature made for another site, or an old one (the window is 10 minutes), is refused. The endpoint stores nothing and sets no cookie. Pin the file exactly as shown: signin-v1.js never changes once published, and a change would be signin-v2.js. Try it (the demo makes its own nonce; a real site must issue one):

Rules for anything you build

Holder page · Official CHERRY · llms.txt · Security policy. Devnet build. No value.