Own a Chog
Trophy cabinet
Soulbound ERC-1155 trophies minted into a Chog's own wallet, so its history moves with the NFT.
A Chog's history lives inside the NFT. AnimrTrophies mints soulbound ERC-1155 trophies into the Chog's own ERC-6551 wallet, so when the Chog is sold its trophies go with it. The cabinet shows on each Chog's page.
Trophy kinds
| ID | Trophy | Awarded when | How often |
|---|---|---|---|
| 1 | Best call | Closest call on a live Daily Bell | Once per UTC day |
| 2 | Most rekt | Furthest call on a live Daily Bell | Once per UTC day |
| 3 | Survived a heist | Its AI said yes to a robber, Monad said no | Once per UTC day |
| 4 | First real trade | First trade through the guard | Once per Chog |
Award triggers
- Best call and Most rekt: after a live Daily Bell settles, its Oracle of the Day and its Most Rekt. Replayed Bells never award.
- Survived a heist: when the House Chog's AI said yes and the mainnet proof showed the transfer refused.
- First real trade: the Chog's first trade through AnimrTradeGuard.
The contract
| Fact | Value |
|---|---|
| Address (Monad mainnet) | 0x7720Ed65f3DdfC4AD812D8A5ACd25762712b513dView 0x7720Ed65f3DdfC4AD812D8A5ACd25762712b513d on the explorer (opens in a new tab) |
| Source | Verified on Sourcify (exact match, Oct 21, 2026); Monadscan shows the verified source |
| Standard | Minimal ERC-1155, name "Animr Trophies", symbol ANIMR-TROPHY. Token ID = trophy kind; a balance counts how often it was won. |
| Recipient | The contract derives the Chog's canonical Tokenbound address itself (registry v0.3.1, AccountProxy, salt 0, this chain), so it can only ever mint into real Chog wallets. The wallet doesn't have to exist yet. |
| Idempotency | keccak256(abi.encode(kind, context)) can be used once. Context is the UTC day as YYYYMMDD for daily kinds, the Chog's token ID for First real trade. |
| Soulbound | Transfers and approvals revert with Soulbound() |
| Roles | The owner (two-step transfer) enables kinds, sets the metadata URI and rotates the minter. It is the team's main wallet, the guard's admin, 0xc742AdA2872a042dD36D2E706907b4036968960CView 0xc742AdA2872a042dD36D2E706907b4036968960C on the explorer (opens in a new tab), after a handover the team accepted on the explorer. The minter, the operator key 0x2523bBdD941783C4E565180D2a1b18DE86319cC2View 0x2523bBdD941783C4E565180D2a1b18DE86319cC2 on the explorer (opens in a new tab), can only award. They can never be the same address. |
| Metadata | The URI set on the contract is https://useanimr.vercel.app/api/trophies/meta/{id}; the badge art is at /api/trophies/art/<id> |
12 Foundry tests cover awards to counterfactual and deployed wallets, one mint per key, soulbinding, trophies following the NFT and the roles; 12 of 12 pass against Oct 21, 2026 mainnet state. Minting is idempotent in the app too: it checks awarded before sending and retries a failed mint later. Awards are sent only from the production deployment, the same gate as guarded trades (lib/runtime-env.ts). With NEXT_PUBLIC_TROPHIES_ADDRESS unset, the cabinet and awards are off.
Read it on Monadscan (opens in a new tab).
