EMPLOYEE HANDBOOK
How it works,
with the numbers.
Every mechanic on this page is a statement about deployed bytecode. Where there is arithmetic, this page runs the same function the contract runs rather than repeating a result. There are no projected returns here, and there will not be any.
THE GAME, IN ONE PARAGRAPH
There are 1,000 monsters and there will never be more. Every $PONSTRO swap is charged 4.00%, of which 3.70%reaches this project's fee router — two different numbers, and this site will not merge them. Anybody can harvest what the router holds. One leg of it buys $PONS — Pons, the launchpad's own token on this chain — and deposits it in the NFT contract; another buys $PONSTRO and destroys it.
The $PONS is divided between monsters by weight, and your weight is your streak. Feed today: +1. Miss a day: −1. A monster on a streak of one carries 10,000; one that has kept it up for 10 days carries ten times that. Let it fall all the way over and it is on 1,000; a monster that has never eaten at all is on 100.
That is a spread of 1,000x from an abandoned intern to a maxed streak, and it is the whole game. There is no separate penalty taken at claim time: the weight IS the penalty, it lives in the denominator, and a monster that stops eating loses share to everybody else automatically and exactly. Rewards belong to the token id, not to your wallet — sell the monster and the unclaimed $PONS goes with it, so claim before you list.
WHERE THE $PONS COMES FROM
$PONSTRO was launched with a creator fee that accrues into an escrow. The fee router is the registered recipient. Anybody can call the harvest — it is not gated on us existing — and each cycle the router claims what has accrued and splits it three ways.
That is the split at launch. The owner can move the reward and liquidity legs at any time, with immediate effect; the burn leg is whatever is left, so the three always make up the whole harvest. The payroll board reads the split the router is using right now.
BUY $PONS
BUY AND BURN
MINT LIQUIDITY
What the owner can change
| SETTING | SET WITH | HOW IT MOVES |
|---|---|---|
| Router legs | setRewardLegBps · setLiquidityLegBps | immediate; the burn leg is what is left, so all 3 always make up 100% |
| Feed cost ($PONSTRO) | setFeedCost | immediate; refuses only zero |
| Mint price (ETH) | setMintPriceWei | immediate |
| Feed window | setFeedWindow | immediate; refuses only zero |
| Grace on the decay deadline | setGraceWindow | immediate |
| Mints per wallet | setWalletLimit | immediate |
| Poke bounty | setPokeBountyBps | immediate; at most 100% of what a settle frees |
| Marketplace burn | none | fixed at 5% — a constant in the market contract |
sweepMintProceeds(), which anyone may call and which can only reach the burner, an address the owner sets with setBurner().WHAT FEEDING COSTS
Feeding does two things. It adds one to the streak, capped at 10 — at most once per feed window, and only when the feed is on time — so weight climbs by 10,000 each time until the top rung. And it stamps lastFedAt with the current block time, which restarts the decay deadline.
The cost is per monster and it is flat. feedCostFor(tokenIds) charges feedCost times the number of ids, and nothing else. There USED to be a cap on top of it — the lesser of feedCost and a percentage of that monster's own pending — and it was removed because the two sides of that comparison were denominated in different assets at different prices, which made it meaningless. Making it work would have needed an on-chain price of the reward token in $PONSTRO, which is a new dependency and a new manipulation surface: a manipulable oracle is a manipulable feed price.
The price is a calibration, and the owner sets it. A feed has to cost clearly less than the streak level it buys, or nobody rationally feeds; and clearly more than nothing, or nobody ever lapses, no streak ever falls, and the whole mechanic stops firing. setFeedCost takes effect immediately and refuses only zero. This site publishes the live ratio — what a feed costs against what a monster earns in a day — precisely so that calibration is falsifiable in public.
Ids must be unique. A duplicated id used to buy one streak level per array entry, so ten repeats bought the top of the ladder in a single transaction and a newcomer reached parity with a ten-day incumbent instantly. feed now reverts DuplicateTokenId, and a monster may gain at most one level per window across separate transactions too, not merely within one array.
Feeding also records fedTotal, a permanent lifetime figure that never decreases. It is tenure. It does not affect the payout; it is the number the shift board ranks by.
THE STREAK LADDER
Your weight is your streak. Feed on time and the streak goes up one, to a maximum of 10. Let the feed window and its grace pass without a feed and it comes down one. Weight is streak × 10,000, so the ladder runs from 1.00x to 10.00x and there is nothing else to it.
There is no partial decay. A level is owed or it is not. That is what makes the mechanic explainable, and it is why the picture below is a set of steps rather than a curve — a monster cannot sit between two rungs.
The deadline is the window plus the grace. With a 24h feed window and 8h of grace, nothing is owed until both have passed since lastFedAt; after that levelsOwed is (now − lastFedAt − graceWindow) / feedWindow, rounded down. Both are owner settings that take effect immediately.
A late feed buys nothing back. A feed that arrives after the deadline still costs the feed and still burns it, but the monster loses the level it owed and gains nothing — and the next level is a whole feed window after that late feed. It no longer works to feed every couple of days and have each feed win back the level the gap cost: the streak holds only if every feed lands within the window plus the grace.
- Never fed — 0.01x
- Streak broken — 0.10x
- On a streak — 1.00x per level
- Maxed at 10 — 10.00x
Bars are on a square-root scale, not a linear one: on a linear axis the intern rung would be half a pixel tall and indistinguishable from the broken-streak rung ten times above it. The two ends really are 1,000x apart. The window and its grace are owner settings; the ladder is not — every value on it is a compiled constant.
Every rung, with the weight the contract actually uses
| RUNG | WEIGHT | MULTIPLIER | WHAT IT MEANS |
|---|---|---|---|
| NEVER FED | 100 | 0.01x | An intern. Has never eaten and does not know it. |
| STREAK BROKEN | 1,000 | 0.10x | Has eaten before. Missed enough windows to fall all the way off. |
| DAY 1 OF 10 | 10,000 | 1.00x | One feed in. The ladder starts here. |
| DAY 2 OF 10 | 20,000 | 2.00x | Two days running. |
| DAY 3 OF 10 | 30,000 | 3.00x | Three days running. |
| DAY 4 OF 10 | 40,000 | 4.00x | Four days running. |
| DAY 5 OF 10 | 50,000 | 5.00x | Halfway up. |
| DAY 6 OF 10 | 60,000 | 6.00x | Six days running. |
| DAY 7 OF 10 | 70,000 | 7.00x | Seven days running. |
| DAY 8 OF 10 | 80,000 | 8.00x | Eight days running. |
| DAY 9 OF 10 | 90,000 | 9.00x | One short of the top. |
| DAY 10 OF 10 | 100,000 | 10.00x | Maxed. 1,000x the weight of an intern. |
Every figure is read from the same table the roster card and the mock use, so nothing here can drift from what a monster is actually paid. A feed at least one 24h window after the last level gained moves you up one rung; going 32h without a feed (the launch window plus its grace) moves you down one, and the late feed does not win it back. Rung 0 and the intern rung are DIFFERENT: a broken streak has eaten before and sits at 0.10x, an intern never started and sits at 0.01x.
One monster on a streak of 6, then ignored
| SINCE LAST FEED | LEVELS OWED | EFFECTIVE STREAK | WEIGHT | MULTIPLIER |
|---|---|---|---|---|
| just fed | 0 | 6 | 60,000 | 6.00x |
| 24h | 0 | 6 | 60,000 | 6.00x |
| 32h | 0 | 6 | 60,000 | 6.00x |
| 33h | 1 | 5 | 50,000 | 5.00x |
| 48h | 1 | 5 | 50,000 | 5.00x |
| 81h | 3 | 3 | 30,000 | 3.00x |
| 8d | 7 | 0 | 1,000 | 0.10x |
Note the 32h row: the window and the grace have both passed and still NOTHING is owed — the deadline is inclusive. An hour later one level is owed, and a feed at that point pays, loses that level and gains nothing back. Computed at page render with the same arithmetic levelsOwed and weightOf use, at the launch window (24h) and grace (8h).
NOTHING IS TAKEN AT CLAIM TIME
BROKEN IS NOT THE SAME AS NEVER
CLAIM, THEN FEED
POKE — ANYBODY CAN SETTLE ANYBODY
Here is the one honest complication in the model. totalWeight is the sum of every monster's stored streak, and a stored streak only falls when somebody touches the token. The clock cannot write to storage on its own. So between touches, a monster that lapsed a week ago is still being counted at the weight it had a week ago.
That is safe in exactly one direction, and the direction matters: an over-counted denominator pays out less per unit of weight than it could, never more. Nothing is lost — the remainder stays in the contract — but it does not reach anybody until the stale monster is settled.
poke(uint256[]) is the settle, and anybody may call it on anybody's monster. The caller is paid a share, set by the owner, of exactly what their call released, out of that released amount. The rest goes back to everyone still on a streak.
IT CANNOT STEAL
IT SORTS ITSELF
IT IS A NO-OP, NOT A REVERT
WHAT THE TEAM CAN CHANGE
The honest version of a launch is that the numbers will be wrong at first. The prior project this one is built from died with its parameters frozen and no way to fix them. So Ponstro is adjustable, and it says exactly how.
Every number with an economic effect is a plain owner setter. The owner calls it and the new value applies in that same transaction — there is no waiting period and no range compiled in. The current value of every one of them is on the payroll board, read from the contracts.
- 01
SET BY THE OWNER
One onlyOwner call per number. It takes effect in the transaction that makes it.
- 02
LOGGED ON CHAIN
Every numeric setter emits the old value and the new one, so the full history of every number is readable from the logs.
- 03
ONLY BREAKAGE IS REFUSED
A setter reverts only on values the contract's own arithmetic cannot survive: a zero feed cost or feed window, a bps figure above 100%, router legs that do not fit, a zero TWAP window.
- 04
OR ENDED FOR GOOD
sunsetSetters() is optional and one-way. After it, the numeric setters on that contract revert forever.
Every settable number on the NFT, and what it reads now
| PARAMETER | AT LAUNCH | NOW, ON CHAIN | WHAT IT DOES |
|---|---|---|---|
| feedCostsetFeedCost() | 10,000 $PONSTRO | — | Burned per monster, per feed. The contract refuses only zero. |
| mintPriceWeisetMintPriceWei() | 0.004 ETH (~$10) | — | Paid in ETH per monster hired. |
| feedWindowsetFeedWindow() | 24h | — | A feed gains at most one level per window; decay is counted in windows. The contract refuses only zero. |
| graceWindowsetGraceWindow() | 8h | — | Slack on the decay deadline. The streak holds while fed within feedWindow + graceWindow. |
| pokeBountyBpssetPokeBountyBps() | 5% | — | Paid to whoever settles a lapsed monster, out of what the settle frees. At most 100%. |
| walletLimitsetWalletLimit() | 10 | — | Mints per wallet. A fairness signal, not a security control. |
The owner can set any of these at any moment, with immediate effect. There are no bounds in the bytecode to quote: the only values refused are the ones named above, because the contract itself would break on them.
And the same for the fee router
| PARAMETER | AT LAUNCH | WHAT IT DOES |
|---|---|---|
| rewardLegBpssetRewardLegBps() | 3,334 (33.34%) | How much of each harvest buys $PONS for the monsters. With the liquidity leg it must fit inside 100%; the burn leg is the remainder. There is no fourth destination and no owner cut. |
| liquidityLegBpssetLiquidityLegBps() | 3,333 (33.33%) | How much of each harvest mints liquidity for the overtime crew. |
| maxEthPerHarvestsetMaxEthPerHarvest() | 2 ETH | Ceiling on the fresh ETH one harvest splits, so a single cycle cannot move a pool too far. |
| maxSlippageBpssetMaxSlippageBps() | 200 (2%) | How far below the reference price the reward leg's swap may settle. At most 100%. |
| ponsPoolFeesetPonsPoolFee() | 3,000 (0.30%) | The Uniswap V3 fee tier the reward leg buys $PONS in. |
| refPoolFeesetRefPoolFee() | 10,000 (1%) | The fee tier of the pool the reward leg's price floor is read from. |
| twapWindowsetTwapWindow() | 15m | The averaging window the price band is measured against. The contract refuses only zero. |
| maxTickDeviationsetMaxTickDeviation() | 1,000 ticks | How far the reference pool's spot may sit from its TWAP before a harvest refuses. |
The burn leg has no setter of its own: it is whatever the reward and liquidity legs leave, so the split can never point a share of the fee anywhere outside the three legs. The live value of every router number is on the payroll board.
What is not a number
- mintOpen
Opens and closes hiring. A boolean — there is no number in it, and no setting of it moves a token or a reward. After sunsetSetters() it can only be closed.
- baseURI
Where the art metadata is served from. The owner can move it with setBaseURI() — immediately, to fix a broken directory — until freezeMetadata() is called, which ends it permanently. Whether that has happened is metadataFrozen(), public on the NFT.
- ponstroToken · overtime
Set ONCE and then permanently rejected: after the first call there is no second one.
- burner (NFT)
Where the mint ETH is swept and where the marketplace sends its burn share. setBurner() on the NFT moves it immediately and checks nothing about the address; sunsetSetters() on the NFT ends it.
- burner · swap venue · farm (router)
Where the router sends each leg. Each moves immediately, cannot be pointed at an address with no code, and has its own one-way freeze after which it can never move again.
- keeper
Priority inside the 6h harvest window, never authority. Harvesting stays permissionless whatever this is set to.
These are owner switches too, and they are immediate as well.
THE ONE-WAY SWITCH
sunsetSetters()
A single call that permanently ends the owner's ability to change the numbers on that contract. After it, every numeric setter reverts, forever. Calling it twice reverts, so the event is emitted exactly once in the contract's life. There is no un-sunset function and no upgrade path that could add one. It is optional: nothing calls it and nothing requires it.
What it does not do, because conflating the two would be a lie: ownership survives it. The owner keeps the switches above — closing mintOpen, the keeper slot, baseURIuntil it is frozen, the router's addresses until each is frozen — and stray-token rescue. Sunset is about numbers.
NO ADMIN WITHDRAWAL
There is no function anywhere in this suite that lets an owner move user funds. Not behind an owner switch, not under any name. The base governance contract contains no value-moving function at all.
rescueToken(address) exists for strays and reverts for $PONS and for $PONSTRO. Stated rather than hidden: it is ERC-20 only, so a stray NFT sent to the contract cannot be recovered — deliberately, because an NFT rescue would be an owner power over every NFT the contract holds.
NO RENOUNCING EITHER
NO ETH IN THE VAULT
THE ONLY CONTRACTS THAT ARE OURS
Read off the published deployment manifest, not typed into this page. Anything that is not deployed yet renders an em-dash rather than a plausible-looking address, because a placeholder somebody can paste into a wallet is the one mistake here that costs a stranger money.
Contract addresses
Only ever interact with the addresses shown here. We will never DM you a different one, and we will never ask you to sign anything from a link somebody sent you.
ON-CHAIN ADDRESSES · CHAIN 4663
- PONSTROS · ERC-721NOT DEPLOYED
—The 1,000. Holds the reward vault, the streak ledger and the mint.
- $PONSTRO · ERC-20NOT DEPLOYED
—What a feed burns. Set once on the NFT and never swappable afterwards.
- $PONS · REWARD TOKENCONSTANT
0x39dbed3a2bd333467115de45665cc57f813c4571What a monster earns. Immutable, ownerless and fixed supply — nine standard ERC-20 entry points and nothing else. View on the explorer
- WETH / PONS POOLCONSTANT
0xed50bdeea8adc232f159486192a4157281d722ffUniswap V3, 0.30% tier. Where leg 1 buys $PONS. Its fee is swap friction on that one leg — 0.10% of the whole fee — paid to the pool's own liquidity providers, and it is not a leg of the split. View on the explorer
- FEE ROUTERNOT DEPLOYED
—Collects the swap fee and divides it into 3 equal legs — reward, burn, liquidity. It has no owner destination and no fourth leg of any kind.
- BURNERNOT DEPLOYED
—Leg 2. Buys $PONSTRO in its own pool and destroys it. Swept mint ETH lands here too. Read from the NFT's burner(), which the owner can repoint with setBurner() — so it is read live, never cached.
- OVERTIME FARM · LEG 3NOT DEPLOYED
—Where leg 3 mints $PONSTRO/ETH positions and where Work Overtime locks yours. Read from the NFT's overtime(), which is set once and never moves.
- HARVEST RELAYNOT DEPLOYED
—Makes harvesting permissionless. Anyone can turn the crank.
- BURN ADDRESSCONSTANT
0x000000000000000000000000000000000000dEaDWhere fed $PONSTRO — and everything leg 2 buys back — goes to die. Validated in the constructor: a constant, not a setting, so it cannot be pointed at a wallet. View on the explorer
WHAT THIS IS NOT
- It is not a yield product. There is no rate, no APY and no projection anywhere on this site. What a monster receives depends entirely on trading volume in a token nobody controls, and that can be zero for as long as you like.
- The wallet limit is not a security control. It is trivially bypassed with more wallets. It is a fairness signal at the mint and the contract's own documentation says so.
- The mint is not refundable. Mint payment is burned, not held. There is no escrow to reverse and nobody holds a balance that could be returned.
- The weight the vault divides by is deliberately stale. A lapsed monster keeps its old weight in totalWeight until somebody pokes it, so the floor is always paying out slightly less per unit than it has earned. The shortfall is not lost, it is waiting — and clearing it is a job anybody can take, with a bounty on it.
- A dash is not a zero, anywhere on this site. Every number here comes from a read that can fail, and a failed read prints an em-dash. A zero is a claim; a broken RPC has not earned the right to make one.
- The reward asset has its own risk, and it is not ours. $PONS is a separate token on this chain with its own liquidity, its own holders and its own price. This project buys it; it does not issue it, back it, or control it. A monster's payout is denominated in it, so its price is your price.
- Nothing here is financial advice. There is no rate anywhere in this contract. Every percentage on this site is a share of a pot, not a return on a deposit, and the size of the pot is not ours to promise.
Feed your Ponstro, or someone else eats its lunch.