Documentation
The full specification
Everything the protocol does, in one place — written from the contract source, not from marketing. Constants shown here are fixed at deployment; live counters live on the protocol pages.
Overview
Agent Ely — Proof of Agent is a two-contract system on Elysium: the collection (ERC-721 + ERC-2981) holds the packed art and the mint, and the staking contract holds the $ELY reward pools and implements stake/claim/burn-for-rewards. A third contract, $ELY, is a plain fixed-supply ERC-20 distributed at deployment.
Everything about the art — grids, tone maps, exact colors, traits — is stored in contract storage and rendered by an on-chain SVG builder. tokenURI() returns base64 JSON whose image field is the rendered SVG, so every marketplace that reads tokenURI sees the true art with no external dependency.
Architecture
| Contract | Standard | Responsibilities |
|---|---|---|
| AgentElyNFT | ERC-721, ERC-2981, Ownable | Art storage, public mint, royalty, tokenURI/contractURI, burn (owner or staking contract) |
| ElyStaking | Ownable | Stake/unstake, emission accumulator, claim, burn-for-rewards |
| ELYToken | ERC-20 | Fixed 1B supply, minted once in the constructor |
Trust model: the NFT contract authorizes the staking contract to burn; the staking contract enforces ownership and the not-staked check before burning. Art upload is owner-only and happens before the sale opens — every token id must have its art committed before it can be minted.
Mint
Price
0.02 HYPE (fixed)
Supply
4,444 (sequential ids 1..4444)
Availability
First come, first served until sold out
Refunds
Overpayment returned automatically
Sale window
Opened by the owner once art is live
Funds
Mint proceeds stay in the treasury
Tokenomics
Rewards · 75%
750,000,000
600M staking + 150M burn, held by the staking contract
Liquidity · 25%
250,000,000
Treasury — designated for $ELY market liquidity
Total supply
1,000,000,000
Minted once. No inflation, no further minting.
Staking spec
Emission uses the accumulator pattern: a global accRewardPerWeight advances each second while the pool has room, and each account settles against it on stake, unstake and claim. The rate is fixed per weight point, so partial stake slows the drain but never changes anyone's rate.
| Staking pool | 600,000,000 ELY |
| Emission window | 30 days at full stake (9,053 weight points) |
| Rate | 25569588145529822 wei/weight/sec (≈2,208.00 ELY/day per common agent) |
| Weights | common ×1, rare (Lavender/Orchid) ×2, epic (Amber) ×4, legendary (Gold) ×10 |
| Settlement | on claim, and on stake/unstake (pending paid first) |
| Start | owner-only start() — before it, no time accrues |
Burn spec
Burn pool
150,000,000 ELY
Payouts
Common 15,000 · Rare 30,000 · Epic 60,000 · Legendary 120,000 ELY
The whole collection can never outspend the pool: 3071 × 15,000 + 691 × 30,000 + 370 × 60,000 + 312 × 120,000 = 126.44M ≤ 150M. The contract reverts if a payout would exceed the remaining pool. Burning requires the token to be unstaked and owned by the caller.
Art encoding
Each token stores exactly 9 storage words (~288 bytes): three shape words (576 bits, 1 bit per cell), five tone-map words (2 bits per cell selecting body/light/dark), and one meta word packing four RGB24 colors plus seven 4-bit trait indices.
// meta word layout (bits)
[0..23] bg RGB24 · [24..47] dark · [48..71] light · [72..95] body
[96..99] shading · [100..103] palette · [104..107] bottom
[108..111] face · [112..115] eyes · [116..119] top · [120..123] archetype
// rendering: bg rect + one 16×16 rect per foreground cell,
// colors: tone 0 = body, 1 = light, 2 = dark — flat fills
The SVG builder is deterministic and byte-identical to the reference renderer: the test suite compares contract output for sample tokens against pre-computed strings, and a separate script re-renders all 4,444 tokens from the packed encoding and diffs them pixel-by-pixel against the collection PNGs.
Contract reference
- mint() payable → uint256
- artUri(uint256) → string · preview without minting
- artSvg(uint256) → string · raw SVG
- tokenURI(uint256) → string · base64 JSON
- rarity(uint256) → uint8 · 0 Common, 1 Rare, 2 Epic, 3 Legendary
- paletteOf(uint256) → uint8
- burn(uint256) · owner/approved or staking contract
- uploadArt(uint256, uint256[9][]) · owner-only
- stake(uint256[]) · settle + lock agents
- unstake(uint256[]) · settle + return agents
- claim() · pay all accrued rewards
- burnForRewards(uint256) · payout per tier
- pendingRewards(address) → uint256
- startedAt / totalStaked / totalWeight → uint256
- stakingEmitted / burnPaid → uint256
- start() · owner-only emission start
Deployment
Target network: Elysium mainnet — chain ID 99901, RPC https://rpc.elysium.kinetiq.xyz, gas token HYPE. Addresses will be published here immediately after deployment; until then the protocol pages show fixed parameters with an awaiting-deployment notice.
Status
Contracts built and verified locally (26 tests, 4,444-token parity proof, Anvil end-to-end). Awaiting funded deployer key → Deploy.s.sol → UploadArt.s.sol (139 txs) → setSaleActive(true).