PIKO - a new fair-launch, automated proof-of-work token

What PIKO is ?

Piko is an Independent implementation of the “proof-of-on-chain-work” idea publicly described by bob.fun. Own name, own token, own codebase. Not affiliated with, endorsed by, or connected to bob.fun or BOB.

It is a fixed-supply token whose only way of coming into existence is proof-of-work , no premine, no team allocation, no admin mint path anywhere in the code (checked: the reward-payout helper is only ever called from the block-win path and from retrying an already-decided pending reward : there is no function a controller can call to mint arbitrary PIKO). The ledger’s initial_balances is an empty vec at init , not just a claim in this paper, the actual init args say so.

The ledger’s mint history is the mining history, nothing else.

A transparency note before anyone asks: the chain isn’t at height 0. At this time 46 blocks (27,600 PIKO, about 0.13% of the 21M cap) were already mined before this post. All of it happened during development and testing, while the code itself was still being built, upgraded, and verified. Height and total minted are live and checkable via getStats() right now, same as every other figure in this post.

Why fully automated matters as much as fair-launch does

A fair launch that still depends on a human remembering to do something isn’t really decentralized, . So the second constraint, alongside “no team allocation,” is: nothing in the day-to-day operation of PIKO should require a person to act.

  • Seven canisters, no servers, no database, nothing off-chain: ledger (unmodified ICRC-1/2), mother (coordinator), miner (optional reference/self-hosted), frontend, dice + dice-frontend, landing.
  • mother self-funds its own compute: every mining fee, once swept, splits into a majority burned to the ICP ledger’s minting account and a small share (currently 20%, live via getStats()) converted to cycles via the CMC.
  • mother is also the only canister here with real, ongoing ICP income (the mining fee), so it shares its cycles surplus with the four canisters that have no reliable way to earn their own: ledger, frontend, the reference miner, and dice. (dice does have its own equivalent sweep for ICP betting profit, but the sanctioned dice-frontend site is PIKO-only by design, so that loop has essentially nothing real to convert in practice , mother’s top-up is what actually keeps dice funded.) dice then relays its own balance on to dice-frontend, the one canister with no ICP exposure at all. All of this runs automatically, every 15 minutes, on the same timers that run each coordinator’s burn/profit sweep.
  • Difficulty retargets itself from on-chain block timestamps every 10 blocks toward a 5-minute target , no controller call anywhere in that loop.

What’s actually under my control today, and what isn’t

I’d rather list this precisely than let anyone assume more (or less) decentralization than what’s currently deployed , and everything below is something you can check yourself via query calls, not something you have to take my word for.

Not under anyone’s control, enforced by code, no admin path exists at all:

  • The supply cap and the mint path (no mint function exists outside the block-win flow)
  • Difficulty retargeting (pure function of on-chain timestamps)
  • PIKO Dice’s odds : 1% house edge, payoutNumerator = 99, a compile-time constant, not a variable
  • The 0.3s anti-spam cooldown per principal
  • The 48h timelock delay itself. Hardcoded constant, the controller can’t shorten it
  • Which canisters the cycles top-up can reach (ledger/frontend/miner/dice for mother, dice-frontend for dice) — fixed at deploy time via env vars, no runtime setter

Already locked, no longer changeable by anyone : confirmed live via getStats() on mainnet right now:

  • mother’s ICP fee target (which ledger, which burn account, which Cycles Minting Canister) — icpFeeTargetLocked = true
  • The burn/cycles-conversion split ratio, currently 20% to cycles : cyclesFundRatioLocked = true
    Still under a single controller key today : timelocked (48h public delay), lockable, not yet locked, and fully checkable via getConfig():
  • dice’s ability to withdraw seeded bankroll back out : withdrawalsLocked = false - dice’s risk config (maxPayoutBps, currently 1%, and the protected bankroll floor) — riskConfigLocked = false - The mining fee itself (setMiningFeeE8s), deliberately not timelocked — it can only make mining cheaper or more expensive for everyone equally, it can’t drain supply or redirect anything, so it gets a lower bar than the parameters above

Fully under a single controller key, no timelock at all:

Upgrading the code itself, on any of the six non-ledger-standard canisters. This is the big one to be honest about, a code upgrade can rewrite any rule described above, including the already-locked params (a lock only binds the currently installed code; new code could remove the check). Blackholing (permanently removing all controllers) is what actually closes that door, and it’s deliberately not done yet —> see roadmap below.

How Piko mining actually works — a race, not a queue

A block at height h is won by finding a nonce such that sha256(previousHash || h || nonce) has at least difficultyBits leading zero bits. Every miner searches for that nonce completely independently, in parallel, with no coordination between them. No pool, no shared work assignment, no operator handing out ranges . A browser tab just starts hashing candidates against the current header on its own, exactly like every other miner is separately doing at that same moment for that same height.

1. Approve , grant mother an ICRC-2 allowance on the ICP ledger, a few blocks’ worth of fee.
2. Search, alone , hash candidates against (previousHash, h). Nobody else’s search affects yours; you’re not queued or assigned a slice, you’re purely racing your own hash rate against everyone else’s, independently.
3. Submit the instant a valid nonce turns up.
4. mother verifies it itself : recomputes the hash, never trusts a client-supplied result.
5. Pay regardless of outcome. The fixed 0.25 ICP fee is pulled the moment a submission is valid, win or lose. This is what makes it a real race: losing costs exactly what winning costs.
6. Settle: first valid submission for that height wins , if the chain height hasn’t moved since your search began, you win and the reward mints straight to your principal. If someone else’s valid proof landed first, yours is rejected and the fee is still gone.

Tokenomics

| Parameter | Value

| Max supply | 21,000,000 PIKO (8 decimals)
| Initial block reward | 600 PIKO, halving every 17,500 blocks
| Mining fee (burned/converted, win or lose) | 0.25 ICP
| Burn / cycles split | 80% burned / 20% to cycles — locked, permanent
| Difficulty | floor 18 bits, retargets every 10 blocks toward a 5-min target, max ±2 bits/window, unbounded upward |

| Anti-spam cooldown | 0.3s per principal
PIKO Dice

A separate, provably-fair on-chain dice game so PIKO has somewhere to be spent, not just mined and held. Standard “roll under” formula, 1% fixed house edge (compile-time constant). Deliberately a separate site/opt-in from mining. Every bet is checked against the game’s real, live on-chain bankroll, recomputed on every single bet, it can never accept a bet it couldn’t cover, including under concurrent load from multiple players at once.

Roadmap —>

Done:

  • Automatic difficulty retargeting (no controller path)

  • Automatic 15-minute treasury sweep on both mother and dice (burn/profit-sweep + cycles conversion + stale-entry pruning, all on one timer each)

  • Project-wide automatic cycles top-up: mother → ledger/frontend/miner/dice, and dice → dice-frontend

  • Locked mother’s ICP fee target and burn/cycles split : permanent, confirmed live on mainnet

  • PIKO Dice shipped as a companion utility, with its own timelocked risk config, lock status now publicly queryable

- Internal self-review pass — see above

Remaining, in order:

- Observation period (now) : run in production for enoug time, confirm the retarget algorithm tracks real participation as intended

- Lock dice’s withdrawal path and risk config once each is considered final (both confirmed still open as of this post)

  • Blackhole ledger (standard DFINITY code, lowest bug surface , earliest candidate)
  • Blackhole mother once difficulty and fee parameters have stabilized and a long enough track record backs the code
  • Blackhole dice, after mother, once a real track record of betting volume has run without incident , more moving parts than mother, so a slower timeline, not the same one
  • Liquidity: a PIKO/ICP pool on an ICP-native DEX first, once there’s a real community of miners to trade with

Risk disclosure

  • No liquidity or listed market exists yet.
  • The mining fee is real ICP, non-refundable the instant it’s pulled, win or lose.
  • Not investment advice, not a security, not a promise of future value. Mine only with ICP you’re fully prepared to never see again.
  • Single controller today across all six non-ledger-standard canisters , see above for exactly what that does and doesn’t allow, and note that a lock only binds the currently-installed code, not future upgrades.
  • Independent project, not affiliated with bob.fun/BOB.

Genuinely looking for this to be picked apart . The concurrent-submission handling in mother under real parallel load, the retarget math, the timelock machinery, anything in dice’s bet resolution. Code and whitepaper linked above.

if you want to see, piko.network is the landing page (start here) :slightly_smiling_face:

@Piko I’m testing it out currently and i got a block. What happens next? Will it be tradeable on icpswap?

Blackholing sounds like the right approach. Other than this it sounds largely identical to BOB, not that that’s a bad thing (governance/mutability was/is BOBs major flaw and its not a small detail).

Are there any other relevant key ways in which this differs to BOB?

You mentioned no team allocation but that’s not entirely true unless you reset the protocol after your testing (which is the normal thing to do), or unless it’s been open to others who can still mine tokens at the same exchange rate. Could you elaborate a little on the ‘fair launch’ aspect?

The other area I think BOB got wrong was how it managed its cycles leading to inevitable peak and trough dynamics rather than establishing stronger and stronger sustained immutable cycles support. For this you might be interested in utilising Jupiter Faucet. It’s also taking the same sort of blackhole path, and allows anyone to easily spawn immutable ‘relay’ canisters as sophisticated cycles allocation/generation engines. The last few items in its pre-launch roadmap are currently being finished up.

If you’re interested in becoming one of the whitepaper case studies alongside ALPHA-Vote, TAGGR and potentially ONICAI, send me a DM.

Yes, it will be listed on icpswap. No date I can promise, but once supply is more diluted and until that concentration comes down through organic participation and more active miners. (for pool stability)

Appreciate the substantive read, genuinely.

On differing from BOB: the one I can speak to most concretely, especially given what you flagged about BOB cycles dynamics, is that PIKO is built toward being completely automated in its final state, no manual intervention on cycles at all. Every canister in the family self-funds: mother shares its cycles surplus with ledger, both frontends, and the reference miner; dice does the same for dice-frontend. All on an automatic 15-minute timer, not something that needs a person watching a dashboard and topping up before it runs dry. Difficulty retargets itself the same way, zero controller path. The end state, once blackholed, is a system that keeps running whether or not anyone, including me, is still around to maintain it. Separately, on how you actually participate: PIKO’s mining site itself works directly in a browser tab via the Web Crypto API, just Internet Identity, no canister deployment or cycles management needed, hashing SHA-256(previousHash || height || nonce) against the current difficulty target. I don’t know if BOB uses the same hash function, haven’t checked. There’s also a documented path to self-host a dedicated miner canister via CLI for unattended mining, though that one does mean managing your own cycles, it’s the advanced/manual route, not something the site walks you through.

On “fair launch”: you gave the right test yourself, was it open to others at the same exchange rate the whole time. Yes, at any given moment. No, the protocol wasn’t reset after testing, and there’s no reset mechanism in the code at all, so testing-phase mining is a real head start in practice, not just in theory. What I can say for certain: there’s no code path, then or now, that mints PIKO any way other than the same paid, difficulty-gated submitProof everyone else calls, and internally, the actual mint only ever fires on a genuine block win or when retrying an already-decided pending reward, nothing else in the code can trigger it. The mining fee itself did move a few times early on while I was the only one testing it (0.01 → 0.05 → 0.25 ICP, over about two days), settling at 0.25 well before I ever posted here, and it’s been unchanged since, same for me as for anyone else who’s mined since. It’s never had a separate rate for me versus the public at the same point in time. What wasn’t equal was awareness, not terms: I knew it existed before it was public, same as any project’s first supporter. That’s a real, disclosed timing advantage worth being upfront about, but it’s a different thing from a team allocation, which would mean different terms, not just different timing.

One more concrete point: the PIKO I mined before publishing the site here wasn’t kept as personal holdings, it was sent into dice’s own bankroll (currently 22,360 PIKO), which is on the same path to being permanently blackholed as the rest of the system, not something I can withdraw on a whim without going through the same 48h timelock everything else does.

The different timing is the different term - unless the exchange rate is still the same?

This assumes a certain baseline level of sustained usage. In a bear market with a long enough lull, this won’t necessarily hold true without at least something like Jupitet Faucet.

Numbers, for the record: 0.01 → 0.05 → 0.25 ICP in testing phase over two days, settled before this thread existed. None of that PIKO sits in my wallet. It went into dice’s public bankroll, and pulling it back out goes through the same 48h controller timelock as any other admin withdrawal from that pot, it’s not something I can move on a whim. Every block since has run through the same 0.25 ICP path, no exceptions.

Cycles: current buffers are a solid runway, not forever, which is exactly why blackholing waits on a real observation time period rather than a promise. Jupiter Faucet looks like a good permanent fix for a bear-market gap, and I’ll look into it.

I won 3 blocks! Woooohooo! Cost me ~5ICP. . I wonder what PIKO would be in the time come

Quick update: I’ll open an ICPSwap pool once two things are both true – 25 to 30 distinct miners who’ve found at least one block (11 right now), and my own share of all blocks mined under 25% (24.5% right now, checkable live via getLeaderboard()/getMinerCount() on mother (45mjf-rqaaa-aaaaj-qsedq-cai )). No pool yet means no way to sell, which I know is a real reason to hesitate right now – but I’d rather earn this threshold than open a market while it’s still this concentrated.

Out of interest is there an incentive to buy? Are there rewards or anything that holders earn?

This is another thing BOB got wrong (lack thereof).

Actually there’s just the dice game in place for holders. A couple more apps are in the works too, still figuring out exactly what ships first. Also, if anyone’s got thoughts on what’d actually be worth building for Piko, I’m listening.

Small dashboard update: added total miner count, time since last block, and an estimated network hashrate (clearly labeled as an estimate : inferred from difficulty and average time per block, not directly measured).

Anything Casino. That way, users also make money and the house does too to ‘run’ in the shorter run.

That could work; and also the apps’ bankrolls would hold onto an increasingly large portion of the Piko supply over time due to the house edge, making the tokens scarcer. I was thinking about building a poker app, I had a start but there’s still quite a bit of work left to do on it.

As a side node, a side effect of using Jupiter Faucet to establish immutable baseline cycles support is liquid staking rewards are perpetually issued using age bonus maturity (this last bit is being finished up, as it requires lots of security reviews and edge case testing etc.).

Just mentioning as this may help to kill two birds with one stone for you. This has always been the remit for Jupiter Faucet.

Just added a new game: interactive single-deck Blackjack (Hit/Stand/Double/Split), betting real PIKO, fully on-chain.

Same architecture as PikoDice : escrowed stakes, timelocked admin config, cycles self-funded via “mother”, nothing to manage manually. The house bankroll isn’t seeded from an external source; it’s PIKO I actually mined myself with ICP and sent to the bankroll.

Also a small general update: fixed a minor mobile UX issue on the mining site where some tables were slightly overflowing their frame.

Find the new Blackjack game on the landing page (piko.network), next to Dice.

I tried both the dice and the mining of the blocks. It’s intriguing but what are your long term goals with this project. It seems like another iteration of bobdotfun (nothing wrong with that), which is a proof on work on a proof of useful stake chain. Will there be a way for users to buy and sell without having to mine and what are the possible mechanics on that?

Adding liquidity pair to ICP Swap as soon as you do!