Who can do what
Every key that can act on the Brot Markets program, what it can do, and the limit written in the program's code. Keys are named by role and address, never by person. Checked against the devnet program on 2026-10-10.
Program: 5Rx8o5c5frxqF17mZwvTFg36ZcW5xU12ePojqDbj9n8o, on Solana devnet.
The keys on devnet
| Role | Address | Held by |
|---|---|---|
| Upgrade authority | 6N7rUnJ88yyBiZmGEn3DjyyX9AEtmwzXNGUsps2A4wcq | A co-founder's devnet key |
| Admin | 6N7rUnJ88yyBiZmGEn3DjyyX9AEtmwzXNGUsps2A4wcq | The same key |
| Fee recipient | 6N7rUnJ88yyBiZmGEn3DjyyX9AEtmwzXNGUsps2A4wcq | The same key |
| Team key | 3EgrFsDDBks8zG31rquNvtP1BR91BVArypwtiBg6XwMz | A co-founder's team key; one team key is set today |
Brot's service holds no key with a power over the program. Its wallet holds SOL only to pay network fees, and it asks the program to read results, as any wallet can.
Every power and its limit
| Power | Who | Limit in the program's code |
|---|---|---|
| Replace the program | The upgrade authority | On devnet, at any time and with no waiting period. A replaced program could do what this table rules out. |
| Open a campaign, paying | Any wallet | At least US$500 in SOL at the Pyth SOL/USD price the transaction reads, less its confidence band, 90% of it the prize and 10% Brot's opening fee; the kinds this build opens (four today: price, burn, locked liquidity and stake pool; validator stake waits for its first devnet proof); an account the program's reader accepts; 3 to 90 days; the fees copied from the config when it opens, never above the ceilings below. Refused once the cap on open campaigns is reached. |
| Open a campaign without paying | One team key | No prize and no creator share. It does not count against the cap on open campaigns. Used for the team and launch partners: a team rule, not a limit in the code. |
| Confirm a result in review | One team key | Only while the campaign is in review, inside its 6-hour window. It never changes a YES or a NO. |
| Record the cause of an automatic void | One team key | Only on a campaign the program already voided by itself (a missed reading, an unreadable account, a stale price feed), inside its 6-hour window; never on a YES or a NO. It ends the review and sets the cause, which decides whether the 10% opening fee goes back to whoever opened or stays with Brot. The program stores the cause and the hash of the team's note; publishing each one in the public record is a team rule. |
| Open a contest | One team key | Only while the campaign is in review, inside its 6-hour window, after every entry is tallied. It pauses the payout: anyone runs the reading again; a different reading goes to the admin at once, and the same one pays as recorded only after a 24-hour wait, during which a team key can send the contest to the admin. The payout is due at most 78 hours after the result was read. A team key can so hold a payout up to 72 hours; a price campaign's reading changes with each price update. |
| Decide a contest at its second stage | The admin | Only once the contest reached its second stage (a second reading that came out different, or a team key sending it on during the 24-hour wait), before stage 2's deadline, 48 hours after that (after stage 1's end at the latest): confirm the result as recorded, or void the campaign with a cause the team may record and the hash of a published note. It never turns a result into another YES or NO, but with a team key's contest it can void a correct one. Without a decision, the recorded result stands. |
| Pause new entries and openings | One team key | Never results, reviews, payouts or refunds. |
| Resume after a pause | The admin | Only the admin: a team key can pause but not resume. |
| Change the creation parameters | The admin | New campaigns only, within ceilings written in the code: Brot's fee at most 10% of the losing side, the creator share at most 1%, the one-sided fee at most 1%, an opening price of US$1 to US$5,000 with at least 90% as prize, a minimum entry of 0.001 to 1 SOL, at most 10,000 open campaigns. An open campaign's fees never change. A low cap stops paid openings while free team openings go on. |
| Change the team keys, the fee recipient or the admin | The admin | A new admin takes over in two steps. |
| Resolve, settle and pay | Any wallet | Chooses no result, amount or destination: the result comes from the account read, and every amount and destination from the program. On a price campaign that ends YES, the proof the resolver posts sets which entries count as late (made at or after the proof's time), and those come back whole. |
| Move Brot's fees | Any wallet | Only to the fee recipient. |
| Move or take a baker's entry | Nobody | No instruction does it, and there is no emergency withdrawal. The upgrade authority could still replace the program (first row). |
The next version of the program, not deployed
The next version of the program is built but not deployed: 6RQ6BrByCa3YXTYHg4hGZx2tKNAGZUjUd7pPfBHfoEqt. Until it is, the table above is the program that runs, and this page changes when the next one does. Its code splits the creation parameters into sections, each changed by the admin alone, for new campaigns only, within these limits:
| Section | Limit in the next program's code |
|---|---|
| Fees and entries | Brot's fee at most 10% of the losing side, the one-sided fee at most 1%, a minimum entry of US$1 to US$100 converted to SOL at each opening's price, an alert when more than a set number of campaigns are open (no limit on how many); a sealed entry's floor of US$1 to US$5,000, with 90% to 100% of what it pays in the pot. |
| Opening tiers | One to three tiers, each priced US$1 to US$50,000, with 70% to 100% of the price as the prize and a creator share of at most 2%. A paid opening pays its tier's exact price. |
| Schedule | The shortest campaign from 15 minutes to a year; entries close before the deadline by a share of the duration that is never zero and at most half; a review window from an hour to 30 days; each contest stage from an hour to 30 days. |
| Limits | Sponsor and seeder amounts at most US$1,000,000 each, 1 to 10 sponsors a campaign, a Turbo surcharge of at most 20% and a Turbo fee of at most 50%, vouchers valid a day to a year, a house share of at most 2% in kinds among the six, at most 1,000 opening credits of each tier. |
| Roles and switches | Three roles, each a key or none, and never one key for two of them, a team key or the admin; the kinds switched on are among the six kinds; per-kind parameters with no limit in the code yet. |
The next program reads the schedule and the kinds switched on, the house opener, the credits authority, the voucher authority, the feature switches, the house's share and kinds, the credits' ceilings, the sponsor and seeder limits and the vouchers' validity, and each opening copies the Turbo's two rates into its campaign. The per-kind parameters are not used yet.
Three of its roles act on their own, each a key the admin names, or none; none is named yet:
| Role | Can | Cannot |
|---|---|---|
| House opener | Open the house's own campaigns, free, in the kinds the admin allows for them, and cancel one before its first entry. | Pause, confirm, void or contest, grant credits, load vouchers. |
| Credits authority | Grant a partner's opening credits, up to each tier's ceiling (15, 10 and 5 to start), and close an empty or expired record, its rent back to whoever paid it. | Anything else; like any wallet, it may add a prize. |
| Voucher authority | Load an entry voucher for one other wallet with its own SOL, paying its rent. That wallet alone spends it, as one entry, before it expires (60 days to start); its rent comes back to the loader then, and once it expires anyone can send its SOL and rent back to the loader, or to Brot's fee vault once that key is no longer the voucher authority. | Spend a voucher, move a campaign's money, or anything else; like any wallet, it may add a prize. |
In the next program a team key opens only house campaigns, free and with no prize, and no longer a paid one, and it cancels any house campaign before its first entry, as the house opener does; the creator share of a house campaign goes to Brot's fee vault with the fee. No team key confirms, voids or contests a campaign it opened: another team key does, or the review window ends. A partner with credits opens a campaign free, one credit each, until its credits expire (2027-03-16 for the first round); a cancel spends the credit. The admin can do what the credits authority does, and on mainnet only the admin's multisig grants credits. There is no limit on how many campaigns are open at once. The admin opens no campaign of any kind and decides no contest on a campaign it opened. Taking a partner's credits back always works, even with credits switched off. One key never holds two powers: the house opener, the credits authority and the voucher authority are three different keys, none of them a team key or the admin, and the admin is never a team key. A team key opens a house campaign only while another team key exists to judge it.
The admin can also do what the voucher authority does. A voucher's SOL becomes an entry like any other: it wins as any entry wins, and when an entry is refunded (a void, a one-sided pot or a late entry), the part of it a voucher paid goes to Brot's fee vault, never to the wallet, so a voucher cannot be turned into cash. Any wallet may also enter as a seeder, US$500 to US$5,000 at the Pyth SOL/USD price and at most the SOL it signs for, only in the first half of a campaign's entry window, with no Turbo; its entry is marked as a seeder's. Every entry records its value in US$ at the SOL/USD price when it lands. A seeder or a sponsor pays in US$ and is refused when that price is old or uncertain; a wallet's own entry and a voucher's take the last price the price account holds then, and none, for the records to fill, when the price is more than an hour old. No key loads a voucher for itself. A wallet may add the Turbo to its own entry or to a voucher's, always from its own SOL and never more than it signs for; the Turbo comes back in full on a refund, a one-sided pot or a late entry, and Brot keeps a share of the losing side's Turbo only. The admin's Turbo switch stops new Turbo, never the Turbo already in.
Any wallet but the admin and a team key, which judge campaigns, may add a prize to an open campaign before its entries close, paid in US$ at the Pyth SOL/USD price and at most the SOL it signs for: a third party US$500 to US$5,000, at most three a campaign and one each; the campaign's creator its own prize, from the campaign's minimum entry to US$1,000,000, outside those three. The prize splits at the campaign's tier: the pot part joins what the winners share, and Brot's part waits in the campaign until it closes, then goes to Brot's fee vault. When the campaign does not split, the pot part goes back to the sponsor; a void, or the house cancelling its own campaign, gives back Brot's part too, which Brot keeps when the creator of a paid campaign cancels. Anyone settles a prize, always to its own sponsor, who gets its rent back. The pause stops new prizes, never their settlement. The program checks who judges only when a prize is added, so the admin names no wallet that holds an open prize to the team or as admin: a rule the admin follows, not one the program can check.
The team panel
The team uses these powers from a private panel that holds no key. Each act is prepared from the chain as it stands, summarized from the exact bytes to be signed and simulated first, then signed by the wallet that holds the power, in the browser of the person who holds it. The panel refuses to prepare an act for a wallet without that power: a team key cannot grant credits or load vouchers, and the only team key cannot open a house campaign.
| Role | What the panel prepares for it | Signed by |
|---|---|---|
| Admin | The switches, the three roles and the other settings; on mainnet, every grant and removal of a partner's credits | The admin's multisig, as a proposal its members vote on |
| Credits authority | A partner's whole package of credits, built on the record as it was just read, and its removal: zero first, closed once expired | Its own wallet; on mainnet there is none, and the multisig grants |
| Voucher authority | The week's vouchers, one load at a time, from the batch the Crumbs redemptions made | Its own wallet |
| House opener | The schedule of the house's openings, and the cancel of a house campaign before its first entry | Its own key, on the server for the schedule; its wallet for a cancel |
| Team key | The cancel of a house campaign before its first entry | Its own wallet |
The panel also keeps three lists outside the program: the partner KOLs who may get credits, the BDs with their payout wallets and the creators they bring, and the sponsors with the BD who brought each. Each change is a message a team wallet signs, kept with who signed it and when; a BD's payout wallet is the one the BD sends, entered by the team, and a BD can never sign a change that names it. Names and contacts are kept beside those lists, not in the signed messages, so they can be erased on request.
The plan for mainnet
The plan, if this ever runs with real money, is that the upgrade authority, the admin and the fee recipient move to a 2-of-3 multisig on hardware devices first, and that an upgrade then waits 24 to 48 hours in public before it takes effect. This page changes with them.
Check the keys yourself
Read now from the chain, through this site's RPC: the program's upgrade authority and its config's keys.
Reading the chain…
Public record
Every void the team records, with its reason and the team's own words, and every correction to one. The program voids a campaign by itself when it cannot read the result: a missed reading, an unreadable account or a stale price feed. Inside the campaign's review window, a team key can then record the cause, which decides who keeps the opening fee. A team key can never void or change a YES or a NO.
Each record's SHA-256 is of exactly its file's bytes, and a void's is stored in the campaign on-chain, so anyone can check that the text was not changed. Records are never edited: a correction is a new record.
Voids the program records by itself show their reason on the campaign's page.
No voids or corrections recorded yet.