Agent Ely

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

ContractStandardResponsibilities
AgentElyNFTERC-721, ERC-2981, OwnableArt storage, public mint, royalty, tokenURI/contractURI, burn (owner or staking contract)
ElyStakingOwnableStake/unstake, emission accumulator, claim, burn-for-rewards
ELYTokenERC-20Fixed 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 pool600,000,000 ELY
Emission window30 days at full stake (9,053 weight points)
Rate25569588145529822 wei/weight/sec (≈2,208.00 ELY/day per common agent)
Weightscommon ×1, rare (Lavender/Orchid) ×2, epic (Amber) ×4, legendary (Gold) ×10
Settlementon claim, and on stake/unstake (pending paid first)
Startowner-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

AgentElyNFT
  • 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
ElyStaking
  • 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).