How Squeekchain turns a hamster's wheel into $SQK on Ethereum: the system that records the work, the economy built on it, and what you have to trust.
Squeektoshi, a hamster, runs on the WHEELY9000. Each time the wheel's magnet passes its sensor counts as one unit of work. SqueekCore settles that work on Ethereum into Squeek blocks. Once mining starts, SqueekMining issues $SQK for every completed block and funds Staking, which streams it to the accounts that stake Squeeks and $SQK. { .wp-lede }
In active development Squeekchain is still being built. Parts of this paper, the pool in particular, describe contracts that haven't been deployed yet and can change before they ship. Values that aren't set yet are marked TBD, and values proposed for launch are marked proposed.
Squeekchain has one source of work, the WHEELY9000; one unit, an accepted magnet passage; one ledger, SqueekCore on Ethereum; and one token, $SQK. This paper describes it in three parts. The System follows work from the wheel to Squeek blocks on Ethereum. The Economy covers $SQK, its pool, the Squeeks and how accounts earn with them. Trust covers who can change what, what the system proves and what happens when a part fails.
Figure 1 follows one round of work from the wheel to a wallet.
--8<-- "f01-journey.md"
Only the WHEELY9000 records work, and only SqueekCore settles it. The website, the livestream and this paper show copies.
Each part of Squeekchain has a narrow job. Work moves along one path, from the device to SqueekCore, and every other surface reads copies of that path's records. A copy can be shown, cached or rebuilt, but it can't change the record it came from.
--8<-- "f02-system-map.md"
| Part | Function |
|---|---|
| WHEELY9000 | Accepts magnet passages, closes ten-minute rounds and signs uploads with its Trust M chip |
| Oracle | Checks each signed upload and keeps accepted rounds ready for settlement |
| Reporter | Signs one exact batch of accepted rounds for SqueekCore |
| Relayer | Pays the gas to submit a signed batch |
| SqueekCore | Records settled work on Ethereum and turns it into Squeek blocks |
| SqueekMining | Issues $SQK on its schedule for completed blocks and funds Staking with all of it |
| SqueekToken | The $SQK token, with a 210M premine for liquidity, a fixed lifetime cap and burns; its one minter, SqueekMining, is bound once by the admin |
| SqueekNFT | Records each Squeek's owner, level and next merge, and merges Squeeks |
| Staking | Holds deposited Squeeks, staked $SQK and the $SQK SqueekMining funds it with; streams that $SQK by power, pays claims and burns exit fees |
| Pool | The one Uniswap v4 pool where $SQK trades against ETH, with a sniper tax on buys at launch |
| Keeper | Calls the public checkpoint that issues completed blocks' $SQK and funds Staking with it |
| Indexer, API, website and livestream | Show confirmed copies of the records |
The WHEELY9000 has a magnet on the wheel and a Hall sensor beside it. A small controller, the Pico, reports each time the sensor turns active or inactive. The Pi decides which of those changes count, and saves every accepted passage before doing anything else with it. One accepted passage is one work unit.
The rules are strict on purpose. The sensor has to read inactive for at least 10 ms before it can count again, accepted passages are at least 60 ms apart, and a magnet that stays in front of the sensor counts once. If the clock, storage or sensor stream becomes uncertain, the device stops counting rather than guess.
--8<-- "f03-signal.md"
Work is grouped into rounds of exactly 600 seconds, ten minutes, counted from a fixed starting point. When a round ends, the device saves its total, including rounds with no work, and it never moves work from one round to another. A round can hold at most 10,000 work units, which is exactly as many as the 60 ms spacing allows in ten minutes. The cap is a safety limit: a passage beyond it would be rejected, and the device would stop counting until an operator steps in.
--8<-- "f04-rounds.md"
Counting doesn't depend on the internet. If the connection drops, the device keeps counting and closing rounds, and holds its signed upload until the Oracle answers.
One accepted passage is one work unit. Nothing downstream can add, remove or move it.
Each upload is signed over its exact bytes by the device's Trust M chip. The Oracle checks the signature before it reads anything else, then accepts, rejects or quarantines the upload. Only accepted rounds can be settled: a rejected upload leaves evidence behind, but no work.
Every five minutes the Reporter looks for accepted rounds that are ready. It builds a batch that moves the frontier, the last round settled so far, forward. Rounds with work are listed, at most 16 of them, and every round in between that has no work is certified as zero. The Reporter signs the batch with a one-use number, the nonce, and a deadline, and a separate relayer pays the gas to send it.
SqueekCore checks the signature, the nonce, the order and the limits. If any round breaks a rule, the whole transaction fails and nothing changes. A successful batch uses up its nonce, so it can't be replayed. Public views wait for 12 Ethereum confirmations before they show the result.
--8<-- "f05-batch.md"
A batch settles in full or not at all. SqueekCore never trims, caps or repairs work.
A Squeek block isn't a fixed amount of running. SqueekCore keeps a running total of block units, and every billion block units completes one Squeek block. Squeek blocks are SqueekCore's own count; they have nothing to do with Ethereum's blocks.
Difficulty is the work that 1,000 Squeek blocks cost. Each round with work is first priced at the difficulty that earlier rounds set. Then, if it had at least 40 work, it moves difficulty one-thirtieth of the way toward the level at which its own work would have earned exactly 40 blocks. Rounds with less than 40 work earn progress but leave difficulty alone, and rounds with no work change nothing.
--8<-- "f06-block-maker.md"
blockUnits += floor(w × 10^12 / D)
D_next = floor((29 × D + floor(w × 1,000 / 40)) / 30) when w ≥ 40
D_next = D when w < 40
height = floor(blockUnits / 10^9)
w is a round's work and D is the difficulty, in work per 1,000 blocks. Difficulty never falls below 1,000, one work unit per block. These integer expressions are the definition: any other implementation must use them exactly.
--8<-- "f07-difficulty-sim.md"
Earned block units are never repriced. A change in difficulty only prices later work.
The contracts run on the Sepolia testnet for testing; the proposed values deployed there are listed on the Developers overview.
The economy has one token, $SQK; 9,999 Squeeks; one Staking contract; and one pool where $SQK trades against ETH. As the hamster completes Squeek blocks, they issue $SQK on a three-year schedule that halves every year. All of it goes to Staking, which streams it to accounts in proportion to their power. Your power comes from the Squeeks you deposit there and the $SQK you stake, and each Squeek multiplies what your staked $SQK is worth. Trades in the pool pay a 1% fee, and $SQK taken out of Staking pays an exit fee that's burned.
--8<-- "f19-flows.md"
Lifetime cap2.1B2.1 billion $SQK Premined for liquidity, 10%210M210 million $SQK Issued by SqueekMining, at most1.89B1.89 billion $SQK Years of issuance, halving every year33 years
$SQK, the Squeek token, has a lifetime cap of 2.1 billion. 10% of it, 210 million $SQK, is created up front when the token launches, and all of it goes into the pool as its starting liquidity. That's the only $SQK that doesn't come from the hamster's work.
SqueekMining creates the other 1.89 billion over three years, paced by completed Squeek blocks from the moment rewards start. Each year issues half as much as the year before: 4/7 of the base in the first year, 2/7 in the second and 1/7 in the third. On top of that, a proposed launch bonus of 105 million $SQK is spread over the first 97,020 blocks.
| Schedule | Blocks | $SQK a block | Issued |
|---|---|---|---|
| First 90 days, with bonus | 97,020 | ≈3,675 | 356.5M |
| Rest of year 1 | 296,450 | ≈2,592 | 768.5M |
| Year 2 | 393,470 | ≈1,296 | 510.0M |
| Year 3 | 393,470 | ≈648 | 255.0M |
| Total | 1,180,410 | 1,890.0M |
A year here is a proposed 393,470 blocks: 365 days at the 1,078 blocks a day the wheel has averaged so far. Difficulty steers every busy round, one with at least 40 work, toward 40 blocks, so a busier hamster finishes a year sooner and a quieter one later, while each block issues the same.
--8<-- "f08-supply.md"
Rewards start once, on a date announced in advance, TBD. Before then, the admin connects Staking to SqueekMining and Staking opens for deposits. Earning begins with the next full round after the start; blocks completed before that earn nothing.
Whenever a checkpoint issues $SQK, SqueekMining funds Staking with all of it immediately.
Inside Squeekchain, you can stake $SQK to earn power, or trade it in the pool. $SQK leaves circulation when it's burned: every exit fee is burned, and any holder can burn their own. Burned $SQK stays counted against the cap, so it never makes room for more.
When issuance ends after year three, no new $SQK is earned. Anything Staking already holds for accounts can still be claimed.
Only the premine and SqueekMining's schedule ever create $SQK, and never more than 2.1 billion in all.
Premine in the pool210M210 million $SQK LP fee on every swap1%1% Sniper tax on buys at launch, falling to zero99%99%
$SQK launches in a single Uniswap v4 pool against ETH, seeded with the whole 210 million $SQK premine. Every trade pays the pool's 1% LP fee, which goes to its liquidity providers, at first the protocol.
To keep bots from grabbing $SQK at launch, buys start with a 99% sniper tax that falls to zero within minutes. After that, buys and sells pay only the 1% fee.
Squeeks9,9999,999 Squeeks Sale allocation, IDs 1 to 8,8888,8888,888 Squeeks For the protocol1,0001,000 Squeeks For the team111111 Squeeks
Squeeks are NFTs, and there are 9,999 of them. Squeeks 1 to 8,888 are the sale allocation, and 8,889 to 9,999 go to the protocol, which keeps 1,000 and gives 111 to the team. No more can ever be created.
A Squeek adds power while it's deposited in Staking, for the account that deposited it. Holding one in your wallet adds nothing.
Every Squeek starts at level 1 and rises by merging, up to level 10. Its level, and when it can next merge, are stored with the Squeek itself in SqueekNFT, a contract that can't be upgraded, so they follow it through sales, deposits and withdrawals. Staking sets how much power each level is worth, and each level is always worth more than two of the level below.
A deposited Squeek gives you power in two ways. It adds its level's Squeek power, and it multiplies the power of the $SQK you stake: every 1,000 of Squeek power adds 1 to the multiplier, so a single level 1 Squeek doubles it. Power at level L is 1,000 × 2.2L−1 (proposed), rounded, so each merge makes the survivor worth 10% more than the pair.
| Level | Squeek power proposed | Adds to the $SQK multiplier |
|---|---|---|
| 1 | 1,000 | +1 |
| 2 | 2,200 | +2.2 |
| 3 | 4,840 | +4.84 |
| 4 | 10,648 | +10.6 |
| 5 | 23,426 | +23.4 |
| 6 | 51,536 | +51.5 |
| 7 | 113,380 | +113 |
| 8 | 249,436 | +249 |
| 9 | 548,759 | +549 |
| 10 | 1,207,269 | +1,207 |
There will only ever be 9,999 Squeeks. A burned Squeek's ID is never minted again.
All the $SQK the hamster's blocks issue goes to Staking, and Staking streams it to accounts in proportion to their power. Each new batch is streamed over the following 20 minutes, counting only time when someone is staked, and a new batch rolls whatever is left of the last one into a fresh 20 minutes. If your account has 1,000 power and everyone else together has 99,000, you receive 1% of what's streamed while those numbers hold.
--8<-- "f09-share.md"
Squeeks are the main source of power. Each deposited Squeek adds power set by its level, and multiplies what your staked $SQK is worth. $SQK staked without a Squeek earns at a base rate, and there's no limit on how much you can stake, so your power grows with both.
| Term | Meaning |
|---|---|
P | The Squeek power of the account's deposited Squeeks |
Q | S × (1 + P / P_ref) / c, where S is the account's staked $SQK |
W | P + Q, the account's power |
c is the $SQK that earns one unit of power at the base rate: a proposed 40 $SQK. P_ref is the Squeek power that doubles an account's $SQK power: a proposed 1,000, one level 1 Squeek. 1,000 $SQK staked alone gives 25 power; with one level 1 Squeek deposited, it gives 50, and the account's power is 1,050.
Your deposited Squeeks, staked $SQK and everything they earn belong to your account. Any change, whether you deposit, withdraw, stake, unstake or merge in Staking, takes effect immediately, and what you'd earned up to that moment is kept.
You can withdraw a Squeek at any time and it comes back immediately. Your $SQK stays staked, and the Squeek's power, along with its boost to your $SQK, stops at that moment. You'll need to withdraw a Squeek before you can sell it, and what your account earned stays with your account.
Newly staked $SQK starts earning immediately, and can be unstaked from the next round, for an exit fee.
--8<-- "f10-staking.md"
Power counts from the moment it's added, and Staking only streams $SQK that SqueekMining already funded it with.
Unstaking $SQK costs an exit fee, and every fee is burned in full: none of it goes to the protocol or the team. Withdrawing Squeeks and claiming rewards are free.
The fee works like congestion pricing. It follows exit pressure, the share of the stake unstaked over the past week: ordinary exits cost 2%, and as more of the stake leaves at once, the fee climbs, slowly at first and then steeply, to 60% when a fifth leaves within a week. That makes a sudden rush expensive and keeps Staking steady for those who stay.
| Exit pressure over the past week | Fee |
|---|---|
| Quiet (about 0%) | 2% |
| Elevated (5%) | 5.6% |
| Heavy (10%) | 16.5% |
| Bank run (20% or more) | 60% |
Settled blocks turn into $SQK when someone calls the checkpoint. Anyone can, and the Keeper service does so routinely. A checkpoint works through settled rounds in order, issues the $SQK their completed blocks earned, and funds Staking with all of it immediately.
Because Staking streams each batch over the 20 minutes after it arrives, a checkpoint that runs late, after an outage, pays whoever is staked at that point rather than whoever was staked while the blocks were earned.
--8<-- "f11-checkpoint.md"
Claiming sends the $SQK you've earned from Staking to your wallet, or you can claim it directly into your stake. You can also name one claim recipient; from then on only that address can claim for you, and claiming into stake is off. You can change or clear your claim recipient at any time. Earnings stay with your account, not with a Squeek, so selling a Squeek leaves them with you. Claiming, withdrawing, unstaking and changing your claim recipient all keep working through any pause.
--8<-- "f12-claims.md"
Claims only move $SQK that a checkpoint already issued. They never mint.
Merging combines two Squeeks of the same level into one Squeek a level higher. You choose which one survives: it keeps its number and image and rises a level, and the other is permanently burned. Your $SQK and rewards stay where they are. Both Squeeks need to be below level 10 and past their cooldown, and the survivor then starts a new one. Merging opens when the admin switches it on, and the admin can switch it off again.
You can merge in two places. Squeeks in your wallet merge directly in SqueekNFT, as long as you own both yourself. The survivor keeps its new level, and its extra power counts once you deposit it. Squeeks you've already deposited merge through Staking, and your power goes up immediately, by 10% of the pair, which also lifts the multiplier on your staked $SQK.
A level 1 Squeek has no cooldown. After a merge, the survivor waits a set number of completed Squeek blocks before it can merge again, longer at each level: proposed from 3,000 at level 2 to 49,000 at level 9. These waits are fixed in SqueekNFT when it launches and can never change. They count completed Squeek blocks, the same clock as issuance, so they pass faster when the wheel is busy.
| Level | Wait before its next merge in completed Squeek blocks, proposed |
|---|---|
| 1 | No cooldown. Merges whenever merges are open. |
| 2 | 3,000 |
| 3 | 7,000 |
| 4 | 14,000 |
| 5 | 21,000 |
| 6 | 28,000 |
| 7 | 35,000 |
| 8 | 42,000 |
| 9 | 49,000 |
| 10 | Squeek level cap. Cannot merge higher. |
--8<-- "f13-merge.md"
A merge can't be undone: the donor is burned.
Three loops follow directly from the rules above: two that compound and one that balances. The schedule sets how much $SQK each block issues however much power exists, so the loops change how it's divided, never how much is issued. They describe what the rules do, not what prices will do.
Earn and stakeAn account can stake the $SQK it earns, in one step if it claims directly into stake. The stake raises its power, more power takes a larger share of what Staking streams, and that share can be staked again. Each deposited Squeek multiplies the stake's power and stake has no cap, so the loop keeps going. Accumulating power, by buying Squeeks, merging, staking and selling to someone who wants more, is the intended game, and the concentration it brings is intended too. MergeMerging is the only way a Squeek's level rises, and the only way a Squeek leaves circulation. Each merge burns the donor and makes the survivor worth 10% more than the pair, in Squeek power and in the $SQK multiplier, so as Squeeks grow there are fewer of them. Cooldowns count completed Squeek blocks, so the wheel sets how soon the next merge can happen. Exit feesEvery exit fee is burned. It's 2% when exits are quiet and rises to 60% in a bank run, so the more stake leaves together, the more each exit costs and the more $SQK leaves circulation.
Squeekchain is a new idea: proof of work powered by a hamster. With little precedent to learn from, its trust model balances two needs: rules that no one can change, and a careful, public way to fix problems if they appear.
Most of Squeekchain can't be changed by anyone. The $SQK token and the Squeeks are fixed for good: the 2.1 billion cap, the premine, the level table and the merge cooldowns will always be what they are today, and no one can move $SQK or Squeeks out of your wallet.
Three contracts can be improved over time:
Upgrades to them follow clear conditions:
The Guardian is a safety switch. If something looks wrong, it can pause specific actions, such as settlement or new deposits, but it can't move $SQK or Squeeks or change a rule, and claiming, withdrawing and unstaking keep working through every pause. The table lists every power each role has.
--8<-- "f14-authority.md"
Difficulty has no setter. Only settled work changes it.
Each step adds a specific, limited guarantee.
--8<-- "f15-evidence.md"
A work record says a passage was accepted under the device's rules. It doesn't identify the animal, show the wheel's direction or establish what made it move. A round with no work means no passage was accepted, which could also mean the device was off. The livestream shows the wheel, but cameras never create, confirm or correct work.
A signature proves which chip signed the bytes, not that the measurement is true.
Squeekchain is built to stop rather than guess. Each part fails on its own, and the parts that hold records keep them.
--8<-- "f17-ladder.md"
--8<-- "f17-failures.md"
Recovery never edits work, skips a round or reuses a nonce.
Squeekchain records a hamster's work. Nothing in this paper promises a price, a return or liquidity.
Every value this paper uses, in one place. The contracts, their events and a public API are open to anyone building on Squeektoshi's work; the developer documentation lists them.
| The system | Value |
|---|---|
| Round length | 600 seconds |
| Work in one round, at most | 10,000 work units |
| Block units in one Squeek block | 1,000,000,000 |
| Starting difficulty | TBD |
| Minimum difficulty | 1,000 work per 1,000 blocks |
| Work needed to steer difficulty | 40 in a round |
| Steering target | 40 Squeek blocks per round |
| Steering step | One-thirtieth of the way to the target |
| The economy | Value |
|---|---|
| Lifetime $SQK cap | 2,100,000,000 |
| Premine | 210,000,000 $SQK, 10% of the cap, all of it seeding the pool's liquidity |
| Issued by SqueekMining | At most 1,890,000,000 over three years, halving every year (base 4/7, 2/7, 1/7) |
| Blocks in a year of issuance | 393,470 (proposed) |
| Launch bonus | 105,000,000 $SQK over the first 97,020 blocks (proposed) |
| Where issued $SQK goes | All of it to Staking |
| Start of rewards | Once, by the admin, after Staking is connected; date TBD |
| Stream of each batch | Over the next 1,200 seconds in which some account has power |
| Pool | One Uniswap v4 pool, $SQK and ETH |
| LP fee | 1% of every swap, buy or sell, to the pool's liquidity providers |
| Sniper tax | On buys at launch: 99%, falling to zero within minutes |
| Squeeks | 9,999 |
| Distribution | Squeeks 1–8,888 the sale allocation; 8,889–9,999 to the protocol, which keeps 1,000 and passes 111 to the team |
| Squeek levels | 1 to 10, recorded in SqueekNFT |
| Squeek power | 1,000 × 2.2L−1, rounded: 1,000 at level 1 to 1,207,269 at level 10 (proposed) |
P_ref, Squeek power that doubles $SQK power | 1,000 (proposed) |
c, $SQK per unit of power at the base rate | 40 $SQK (proposed) |
| Stake per account | No cap |
| Exit fee | Follows exit pressure, the share of the stake unstaked over the past week: 2% when quiet, 5.6% at 5%, 16.5% at 10%, 60% at 20% or more, on a quadratic curve; burned in full |
| Merge cooldown | None at level 1; 3,000 to 49,000 completed Squeek blocks after reaching levels 2 to 9 (proposed), fixed in SqueekNFT; about 2.8 to 45 days at 1,078 blocks a day |