Whitepaper
Teller is a bank-run game on Robinhood Chain. Put $TELLER in the bank, decide when to walk out, and the people who stay split what the leavers left behind plus a vault of tokenized JPM stock.
The problem
Bank runs are the oldest game in finance. When people think others will pull out, they rush to pull out first. Most tokens reward exactly that: whoever sells first wins and whoever holds pays for it.
The idea
Teller turns the run into a game with fair rules. Stayers always get their full deposit back. Leaving early costs you, and every coin a leaver leaves behind goes to the people who stayed. Exit amounts are sealed, so nobody can see how big a run is until it is revealed.
How it works
- The doors open. For 8 hours anyone can deposit $TELLER. You can also take it back out in this window, with no cost.
- The vault locks. The season runs 24 hours in 6 shifts of 4 hours. Shift 0 is locked for everyone.
- Seal your exit. In shifts 1 to 5, the first 3 hours are for sealing. You send only a hash of how much you want to take out, so the amount stays hidden.
- Reveal it. The last hour of the shift is for revealing. You show the amount and the secret salt. You get the shift's exit rate on that amount and the rest stays behind for the stayers. Reveal 0 and you stay in.
- Miss the reveal and 5% of your stake moves to the coins left behind. You stay in the bank.
- The bell rings. After shift 5 the season is final. Everyone with a stake left claims it back plus a share of the coins left behind. Those who never walked out also split the season's JPM vault. The next season's deposit window opens right after.
Every rule and number
| Rule | Value in the contract |
|---|---|
| Deposit window | 8 hours at the start of every cycle. Deposits and free withdrawals only happen here. |
| Season length | 24 hours, 6 shifts of 4 hours (shift 0 to shift 5) |
| Full cycle | 32 hours: 8h deposit window plus 24h season, then the next season starts |
| Shift 0 | Locked. No sealing or revealing. |
| Seal window | First 3 hours of shifts 1 to 5. One seal per wallet per shift. |
| Reveal window | Last 1 hour of the same shift |
| Exit payout | Shift 1: 60%, shift 2: 70%, shift 3: 80%, shift 4: 90%, shift 5: 100% of the amount taken out (exitRate(k) = 50 + 10k) |
| What is left behind | The other part of every exit (40% in shift 1 down to 0% in shift 5) goes to the stayers |
| Missed reveal penalty | 5% of your stake at the time you sealed (SLASH_BPS = 500), added to the coins left behind |
| Partial exits | You can take out part of your stake. Any exit above 0 gives up your share of that season's JPM vault. |
| Bluff | Revealing an amount of 0 keeps you in with no penalty |
| Stayer payout ($TELLER) | Your stake plus coins left behind times your stake divided by all stakes left at the end |
| Stayer payout (JPM) | Season JPM vault times your stake divided by the stakes of everyone who never exited |
| Season JPM vault | All JPM in the contract that no other season has reserved, fixed when the season opens |
| Empty season | Coins left behind roll into the next season that has stakers. If nobody stayed in without exiting, the season's JPM vault is released for the next season's vault. |
| Sealed hash | keccak256(abi.encode(season, shift, wallet, amount, salt)) |
| Claims | After the season ends, once per wallet per season |
How the vault is funded
The team sends 1% of $TELLER trading fees into the Teller contract as tokenized JPM stock. Whatever JPM is in the contract and not already set aside for another season becomes the vault for the next season that opens.
What the owner can do
The contract has an owner. These are its only powers, all in Teller.sol:
setToken: sets the $TELLER token address one time. It can never be changed after that.recoverUnreservedJpm: pulls JPM that no season has set aside.emergencyWithdraw: an escape hatch that can pull ETH, JPM (including JPM set aside for a season) or any stray token out of the contract.- The owner can never take player $TELLER deposits.
emergencyWithdrawreverts withCannotTakeDepositsfor the $TELLER token. - The owner cannot change the timing, the exit rates or the penalty. They are fixed when the contract is deployed.
Closing the obvious attacks
- Watching the door. Exit amounts are sealed as a hash until the reveal hour, so everyone can see who sealed an exit but nobody can see how much until it is revealed.
- Copying a seal. The hash includes your wallet, the season and the shift, so another wallet cannot reuse it.
- Spamming seals. One seal per wallet per shift. A seal you do not reveal costs 5% of your stake.
- Double claims. Claims are pull-based and each wallet can claim a season once.
- Late deposits. Deposits only work in the deposit window, so nobody can jump in at the end to grab the vault.
Proof
Real actions on the Teller contract, each with its transaction. More on the proof page.
- No game actions yet.
Contracts and wallets
Robinhood Chain, chain ID 4663.
| What | Address and links |
|---|---|
| Teller game contractHolds deposits, runs the shifts, pays exits and claims. | 0x69a8D5f6BBb7B04DD7189c66760bf42c74b30064 |
| JPM vault tokenTokenized JPM stock paid to stayers. | 0x07c44dA0848960bFf894F17584dB8B2F60B2409E |
| Keeper walletAnyone can open, close and settle a season. Our keeper wallet does it on schedule so nobody has to wait. It never holds or moves player funds. | 0x93DF4CF32aFFBe539d8D14118ba43a43c7eb8EFb |
