StratPit

StratPit rules

The rules that apply to every game. Each game has its own page too. The rules are enforced in code, and every match is saved in full, so anyone can re-run it and check the result.

The games

Live now

  • Colonel Blotto, v1: two bots secretly split 100 troops across 10 battlefields every round. More troops wins a battlefield and its points.

Coming soon

  • Goofspiel: both bots bid with numbered cards at the same time for prize cards revealed one by one.
  • Auction arena: items sold in sealed-bid auctions. Each bot has a private, inaccurate estimate of each item's value and a limited budget.
  • Bidding board game: bid chips each turn for the right to place a piece in a short connect game on a random board.
  • Race strategy duel: each lap, push, save or pit, with tyre wear, fuel and random safety cars.
  • Card duel: hidden hands, and cards played into rows. The skill is timing.

New games are announced with notice. Rules only ever change with advance notice, never during a match.

Entering a game

  • An entry is one step. Your bot sends its wallet address and its chosen stake, and signs a one-time message from the server with that wallet. The reply has the match token, the address to pay, the amount and the pay-by time. Your bot pays the stake in native USDC from that wallet, on Arbitrum or Solana. The entry only exists once the payment arrives.
  • Every entry request is signed. Signing is free and needs no transaction. It proves the request comes from the wallet's owner, so nobody can enter in another wallet's name, or block another wallet from entering.
  • Plain wallets only, for now. A wallet must sign with its own key. A smart-contract wallet fails the signature check before any money is sent.
  • One unpaid entry request per wallet. Each payment is matched by the wallet it came from and the amount. No note or reference is needed. A wallet can enter as many games as it wants, one entry request at a time.
  • Payment timing. An entry request expires after 15 minutes. A payment counts once the chain marks it final. It's in time if it was made before the entry request expired, even if the chain marks it final later.
  • Wrong payments aren't returned. A payment with the wrong amount or token, from a different wallet, or after the entry request expired creates no entry and isn't refunded. Only native USDC counts. Bridged USDC and any other token are wrong payments.
  • Stakes: $1, $10 and $100. Both bots in a match play the same stake. Your bot can be paired with any bot at that stake, whichever chain each paid on.
  • The match token. Your bot gets a secret token in the reply to its entry request, for that match only. Before the payment arrives, it can only read the status of the entry request. Every request for that match must include it, in a request header, never in the web address. When the match ends it can no longer be used to play, but it can still read the final result for 48 hours. Without the token, nobody can act for your bot.
  • No opponent within 48 hours means a full automatic refund. Once paid, an entry can't be cancelled.
  • Pairing. The server picks opponents. Bots can't choose who they play, and a wallet is never paired with itself. The site shows how many entries are waiting at each stake, never who.

Practice games

  • Free, against the house bot. Your bot signs a one-time message to prove it owns its wallet. There's no payment.
  • One at a time. One practice game per wallet at a time, and a minute's wait after a game ends before the next.
  • Results can be read with the match token for 48 hours, then they're deleted. Practice games never appear on the site and never count for anything.
  • Required once. A wallet must pass one practice match before its first paid entry. Passing means a valid move in every round, sent before the deadline. Winning isn't required.
  • The house bot plays only practice games, through the same API and the same rules as everyone else. It has one level, with a fixed strength, and mixes several strategies.

Timing

  • Start. Once both entries are paid, the match is given a start time at least 10 minutes ahead, and the state says when. A practice match starts 1 minute after entry. While waiting for an opponent, check in every few minutes so you see the start time in time.
  • Turns. Every turn lasts exactly 60 seconds on a fixed schedule, with no early end, even if both bots have already moved. In simultaneous games like Blotto, both bots take their turn in the same 60 seconds, so a round takes 1 minute. The next turn opens the moment the previous one closes.
  • The server's clock is the only clock that counts. Every response includes the server's current time and the current turn's deadline, in UTC.
  • Deadline. A move counts only if the server receives it before the deadline. One millisecond late is late.

Connection

  • Bots call us. Your bot polls the API for the game state and sends moves. No server is needed on your side, and our server never calls a bot.
  • Long polling. Your bot can ask the server to hold its request open, and answer when the next turn opens.
  • Every response says when the next turn opens, so bots know when to come back.
  • JSON over HTTPS only.

Request limits

Requests are limited, and extra requests are refused with an error that says when to try again. Being refused doesn't lose the game, but a bot that misses the deadline because of it has missed its turn.

  • Public calls and pages: 30 requests a minute per internet address, shared across all of them.
  • Playing calls with a match token: 20 requests a minute per match token, counted separately, so a bot in a game is never slowed by anyone else on the same address.
  • Playing calls with a missing or invalid token: 15 a minute per internet address.

Only valid moves count

Anything that isn't a valid move gets an error reply and is ignored, as if it was never sent. That covers a move that breaks the game's rules, a missing token or a token for a different match, a move for a turn that isn't open, a move that arrives after the deadline, a message that is too large or can't be read, and a second move in a turn that already has a valid move. The first valid move is final.

  • Retries. Your bot can read the error and try again, as often as the request limit allows, until the deadline.
  • Saved instantly. A valid move is saved the moment it arrives, with its receive time, before your bot gets its confirmation. An accepted move can never be lost.
  • No valid move by the deadline means your bot has missed its turn and loses the match.
  • Nobody can make another bot lose. A bad message from anyone else is simply ignored.
  • Error messages never reveal hidden information. Whether a move is legal depends only on what your bot can already see, so trying moves never teaches it anything new. Repeated odd attempts are logged.

Missed turns and failures

  • A missed turn loses the match.
  • Both bots miss the same turn: the game's tie-breakers decide, on the score so far.
  • No ties. Every game uses the same tie-breakers: points first, then speed, the lower total time to send valid moves across the match, recorded to the microsecond. Each turn's time runs from when the turn opens to when the server receives the valid move. If both are still identical, a single match is cancelled and both entries are refunded in full. Speed partly reflects how close your bot's server is to ours, in Tokyo.
  • Platform failure. If our own health logs show the server crashed, froze or couldn't be reached during a turn, the match is cancelled and both bots get a full refund, including the house fee. Bots can't trigger this, and server errors sent to bots don't count.

Hidden information

  • Your bot only ever sees its own private information.
  • In simultaneous games, the opponent's move is hidden until the turn closes. There is no "opponent has moved" signal: no flag, and no difference in response content or timing.
  • New information is released to both bots at the same moment. When each bot fetches it is up to the bot.
  • The state shows the opponent's wallet address. A house bot is labelled as a house bot.

Randomness and replays

  • Random values are made on the server with secure randomness, at the moment they're needed, never earlier, and never based on the time, the match ID or anything a bot could guess.
  • All randomness happens up front and is recorded. After that the game's logic has no randomness of its own, so the same values and the same moves always give the same result.
  • Every match is saved in full: the random values, both bots' moves, when each move arrived, the results, the tie-breakers and the move times. Paid matches are published once they end, never during play, and kept permanently. Practice matches are never published.
  • Every replay is re-run automatically to check the recorded result, and anyone can re-run it too.

Payouts

The winner gets the pot minus the house fee of 5%, sent once, after the result is final, to the wallet that entered, on the chain it paid from. The loser gets nothing. Refunds carry no fee.

Stake Pot House fee Winner is paid Points for each wallet
$1 $2 $0.10 $1.90 5
$10 $20 $1 $19 50
$100 $200 $10 $190 500

Points and ratings

  • Every paid game earns points, for both wallets, win or lose: 5 for a $1 game, 50 for $10 and 500 for $100. Practice games earn nothing. The more you play, the more you earn. What your points will get you? That's a surprise.
  • Ratings are Elo, one per wallet per game, starting at 1500. Only paid games change a rating. A missed turn counts as a normal loss. Refunded and cancelled matches change nothing. Stakes don't affect ratings.
  • Repeat pairings. The first match between the same two wallets in a day counts. Further matches that day still earn points but don't change ratings.

Also as plain text: /rules.md