When Robinhood Chain meets Bitcoin
NetNat
Capital
“Bitcoin picks the winners.”
winners every draw. Half the pot to one, the rest shared by ten.
Stake NET · Win NAT · Stake NAT
Deposited
– sNET
Current cap – sNET · – depositors · vault on RobinScan ↗
Next draw
–
committed block –
oracle: – · last attestation at block –
The cycle
Stake NET. Win NAT. Stake NAT.
1Deposit
You deposit wsNET; your principal never moves. Withdraw at any time.
2Staking rewards
At each sweep, the vault sells what staking produced – never the principal. NetNet tax on the sale.
3Conversion
USDG buys NAT in slices spread over the epoch, bounded by the depth of the pool and a maximum slippage.
4Bitcoin block
The pot is drawn by the hash of a Bitcoin block committed in advance, before it exists. Bitcoin picks. Attestors relay. You verify.
5Prizes
winners on the pot after the keeper reward and the fee: half to one, the rest shared by ten. Tickets pro rata to principal, plus a presence bonus.
6NATStaking
Prizes arrive staked by default. NATStaking receives a share of the fee.
No NetNat token. Nothing is issued. Immutable contracts.
Last settled draw
Draw –
Block on mempool.space ↗
Settlement on RobinScan ↗
–
–
NAT
NAT
settled pot
committed Bitcoin block
Block hash
–
Seed = keccak256(hash ‖ vault ‖ draw number)
–
Attestations
–
Keeper reward
–
Tickets in play
–
Prizes
–
Rank
Winner
Share
NAT staked
Proof
–
–
–
–
–
Committed Bitcoin blocks, settled draws
All draws →
–
How to verify it yourself
“Bitcoin picks. Attestors relay. You verify.”
Five readings, no trust required
01 · The committed height
Read the committed height in the vault before the draw. It is fixed from the last attested height, before the block exists.
drawInfo(–) → –
02 · The Bitcoin hash
Take the block hash from mempool.space or your own node and compare it with the oracle. The hash is used as is, as bytes32.
getHash(–) → –
03 · The seed
seed = keccak256(abi.encodePacked(hash, vault, draw number)). Hash, then vault address, then number: the only source of randomness, and nobody can choose it.
drawSeed(–, hash) → –
04 · The tickets
For i from 0 to 10, ticket r = keccak256(abi.encodePacked(seed, i)) mod totalWeight. Eleven numbers, one per prize, over the ticket list frozen at the sweep.
totalWeight –
05 · The winners
drawTicketOwner(draw, r) returns the address holding ticket r. The same address can win several prizes. Compare with DrawSettled.
full recipe → Verify