The client for Anmu (安幕) on BNB Smart Chain. The live origin is https://app.anmu.pro. The public site is https://anmu.pro. The specification is https://docs.anmu.pro.
This package reads CampaignRegistry and lets a wallet create a launch, donate, trade the curve, and submit a claim. English and Chinese. It does not invent a holder count, a volume figure, or a candle. Empty chain state renders an empty board.
The registry on chain id 56 is 0x26Fa379809809bCef5C12b5eBa30b59eb1f0b75A, deployed in block 128647492. VITE_REGISTRY_ADDRESS and VITE_RPC_URL can point the same build at another chain. The browser does not generate the launch proof and does not accept a witness. The relayer builds that proof. The connected wallet pays the relayer for gas, and a standard token also pays the 0.005 BNB creation fee.
| Path | Page |
|---|---|
/ |
Board of campaigns and standard tokens. Closed records stay off the board. A standard card opens /token/:id. A campaign card opens /campaign/:id |
/create |
Create a campaign. ?kind=standard creates a standard token |
/token |
Standard tokens only |
/token/:id |
The curve desk: price, market cap, progress toward 16 BNB, and buy or sell. A campaign id redirects to /campaign/:id |
/campaign |
Campaigns only |
/campaign/:id |
The campaign record, the donation form, public activity, and the creator's claim. A standard-token id redirects to /token/:id |
/campaign/:id/accept |
The beneficiary's invite. The page saves a claim file. The wallet then locks a hash and publishes the commitment |
/transparency |
Checks the record, the allocation, the configuration hash, the nullifier, the supply, and the buckets. ?id=N opens campaign N |
/leaderboard |
Donors ranked by BNB. A social link is shown only when that donor shared a profile |
/discover |
Redirects to / |
/dashboard |
Redirects to /leaderboard |
Search uses the same split. A standard hit opens the token desk. A campaign hit opens the campaign record.
Create. The form asks for a logo, a name, a ticker, and a connected wallet. A campaign also asks for a donation story, a category, and a verified X account. Telegram and a website are optional. A standard token does not ask for X. The form shows one beneficiary invite. The creator keeps it and sends it to the beneficiary later. The public invite hash is not shown.
The relayer returns the creator claim to this browser and deletes the witness. The campaign record stores the commitment. The connected wallet transfers the quoted cost to the relayer, and the relayer broadcasts createCampaign or createStandardToken. A creator who broadcasts that call from their own wallet publishes that wallet as the gas payer.
The create page states these four sentences, verbatim:
- Private inputs are used to generate a zero-knowledge proof.
- The witness is not sent to the server.
- The blockchain transaction is public.
- Proof verification does not make the surrounding transactions anonymous.
The word "anonymous" appears only inside that last sentence.
Donate. A campaign donation is native BNB and is credited entirely to the beneficiary. The panel offers two choices. Share a profile publishes a name, a message, and optional X, Telegram, and website links. The other choice stores the gift without those fields. The chain transaction still publishes the sender. The donor API does not return a wallet on the leaderboard. Until the beneficiary accepts, the organizer's creator claim can withdraw donations.
Trade. The desk quotes locally with the same curve as BondingCurve: a virtual quote of 4 BNB and a migration quote of 16 BNB. Fees sit outside the product. On a standard token the creator share is 0.7% plus the creator tax, and the platform share is 0.3%. A buy calls BnbTradeRouter.buy. A sell approves the router, then calls sell. The router address is read from the token. It is not hardcoded. After migration the desk links to the PancakeSwap pair. The creator claim stays at the bottom of the token page so the creator can withdraw trade fees.
Claim. The platform builds the claim from the creator claim kept in this browser. The payment names the recipient. The campaign record does not. Submitting the claim publishes the gas payer and the recipient.
Accept. The beneficiary opens the invite, saves a claim file, and sends lockBeneficiary and then acceptBeneficiary. After acceptance, the creator's proof no longer withdraws donations.
The board, the record, and the transparency page read the registry. Most activity logs use the latest 20,000 blocks, or the registry deploy block when that window is shorter. Curve fills on the token page are read from block 128647492 in chunks, so the chart can replay the book. A failed chunk stops the scan. The chart draws the fills it has.
The protocol token is 安幕, symbol $ANMU. A campaign token and a standard token are separate assets. This site does not publish an $ANMU supply, address, or utility.
Copy .env.example to .env. Every VITE_ value is compiled into the public JavaScript. Do not commit .env. Do not put a key, a JWT, or a client secret in a VITE_ name.
| Variable | Role |
|---|---|
VITE_CHAIN_ID |
56 on mainnet |
VITE_RPC_URL |
Public RPC. A key in this value is visible in the built site |
VITE_REGISTRY_ADDRESS |
CampaignRegistry |
VITE_LOG_FROM_BLOCK |
128647492 |
VITE_RELAYER_URL |
Relayer that prepares the launch and the claim |
VITE_DOCS_URL |
https://docs.anmu.pro. The footer privacy link is ${VITE_DOCS_URL}/privacy |
VITE_TELEGRAM_URL |
https://t.me/anmuprotocol |
VITE_X_URL |
https://x.com/anmuprotocol |
VITE_X_AUTH_URL |
X confirmation service used before a campaign pins its metadata |
The X client secret, X_AUTH_SECRET, and PINATA_JWT are read by the auth service from the same file. They have no VITE_ prefix. The browser uploads a logo to that service. The service pins it.
npm install
npm test
npm run devThe dev server listens on http://127.0.0.1:5173. /api is proxied to the donor API. npm test covers the board, the token desk, the campaign record, the configuration digest, and the privacy sentences.
A local relayer is required before a create or a claim proof can be built. The default relayer origin is http://127.0.0.1:8787.