BeThere
How it works Take a photo

How it works

A day, from midnight to the shutter.

Three acts on chain, one signature from you, and a record small enough that nobody has to pay for it. Everything below is what the contracts do, not a description of what they are meant to do.

Act one. Commit.

A sealed salt, a day early.

The operator publishes keccak256(salt) for a day that has not started. A commit for today is refused, because a salt chosen after seeing how the day is going is not a commitment to anything.

Settings are snapshotted here too, so changing the window length later can never reach a day that is already committed.

Act two. Stir.

Anyone adds the other half.

From midnight until stirring closes, anybody may call stir. Each call folds the block hash, the caller and the previous seed together, so a contribution can be added to but never removed.

The operator holds the salt, but the seed is not theirs, so at commit time the moment is unknown even to them.

Act three. Open.

The reveal has to land on time.

The salt is revealed and the contract recomputes fireTime = f(salt, seed), refusing the reveal unless the block it lands in sits inside the grace window after it.

The countdown starts when the reveal lands, so a reveal forty seconds late still gives everybody the full window rather than forty seconds less of one.

The residual

Whoever holds the salt can compute the moment once stirring closes, which is some hours before it fires. They cannot move it, fake it, or announce it early. They could tell somebody, and no amount of contract design removes that.

The defence is that the last stir wins. Anybody stirring late in the phase pushes the moment somewhere new, and the operator learns the answer at the same time anyone else could. The stir count and the second each one landed are on chain for every day.

A day the operator simply never opens costs that day and nothing else. Streaks count consecutive opened days, and every opened day stores the opened day before it, so going quiet is not a way to punish anybody.

Posting

One signature, and no gas.

You sign an EIP-712 message covering your address, the day, the photo hash and the take number. A relayer collects those and writes a whole window in one transaction.

The relayer can drop you. It cannot forge you, because the signature is the only thing that authorises a post, and it cannot replay you, because the take number moves every time you submit.

If it drops you anyway, the same contract takes a post straight from your key, with nobody's permission and no relayer in the path.

The first submission of a day is the one that is timed and scored. Later ones move the hash and not the clock, and the count is public, so a person who took eleven tries has eleven on their day next to their first timestamp.

The tape

Every moment has a price on it.

This runs on a chain full of tokenised equities, so the moment reads the market on its way past. When the window opens, the clock takes one look at the Uniswap v4 pools and stores what it saw.

One read a day, shared by everybody, so being anchored to the tape costs a post nothing. A tape that reverts, runs out of gas, or is unset costs the day nothing either.

Questions

The awkward ones.

Can the operator pick a moment that suits them?
No. The salt is committed before the day starts, and the seed it is combined with does not exist yet at that point. They can decline to open a day, which costs that day and breaks nobody's streak.
What stops the operator grinding the seed?
Stirring is permissionless and additive. To grind, they would have to be the last to stir before the phase closes, and anybody at all can take that position from them. The stir count and timings are public on every day.
Does this prove I was somewhere?
No, and the site will not claim it does. It proves timing. Read what it proves.
Where does the photo live?
On your device. The chain gets a hash, a timestamp and a flag. A record that cannot be deleted should never be the thing holding a picture of a person.
What do I actually get?
A share of that day's pot, paid in tokenised equity, if you answered inside the window. The pot is a fixed amount per day, decided before anybody knows who will answer, and it is split evenly between everyone who did.
So more people means more money?
The opposite. The pot does not grow with the crowd, so a hundred more answers makes every share smaller. That caps what a day can ever cost, and it means nobody can drain the contract by spinning up wallets.
Then what stops somebody farming it with a hundred wallets?
On its own, nothing. Posting is free and the contract does not know who anybody is, so a hundred wallets take a hundred shares of a fixed pot and everybody honest gets less. The contract has an eligibility gate for exactly this: point it at an allowlist or a friend graph and only those wallets are paid. Left open, it pays anybody who answered on time, which is the honest default and also the farmable one. This is a policy choice, and it is on chain either way.
Does a longer streak pay more?
No. The streak is a record, not a balance. Every on-time answer on a given day is worth exactly the same share of that day, whether it is your first or your four hundredth.
What happens if the relayer goes down?
The camera falls back to posting from your own wallet, which needs nobody's cooperation. It costs a small amount of gas and it always works.