DENSHINBLOG

Why Our Daily Check-In Lives on a Contract

Our Daily Check is one small transaction a day on Soneium, Base or Sonic. Why a check-in lives on a contract, what that contract can't do, and how the streak pays.

The DENSHIN city map at night in royal blue. Headline: One check-in a day, written on-chain. Below: Denshin Sync, one contract on Soneium, Base and Sonic.

Every UTC day a point appears somewhere on our map. You find it, tap it and take it with one small transaction. That's the Daily Check.

We could have made it a button. Most games do: you press it, a server writes a row, a counter goes up. It would have been faster to build and free for you to use. We went the other way on purpose, and this post is about why.

A button is a claim, a transaction is a record#

A check-in button lives inside our database. Only we can see it, only we can say it happened, and it costs nothing to press a thousand times from a script.

A transaction is different. It lands in a block on a public network, it has a sender, a time and a fee someone actually paid. Anyone can open an explorer and read it. Our whole city is built on that idea: a quest counts because something really happened on-chain, not because a page said so. It would have been odd to make the one thing you do every day the only exception.

So the Daily Check became Denshin Sync: a single call to sync() on our DenshinSync contract.

What the contract does, and what it can't do#

The contract is deliberately boring. When your wallet calls it, it records four things for that wallet: the last day it synced, its streak there, its longest streak and its total number of syncs. Then it emits a public Synced event with your wallet, the day, the streak and the total. That's all.

What matters more is what it can't do:

  • it holds no funds, so there's nothing in it to withdraw;
  • it has no owner and no admin function, so nobody, us included, can change a rule;
  • it can't be upgraded, so the code you read today is the code that runs next month;
  • a sync sends no value and asks for no approval: nothing leaves your wallet except the fee.

That fee is a fraction of a cent, in ETH on Soneium or Base, or in S on Sonic.

The source is verified on the explorers, and the address is the same on all three networks:

0xCCFFb22048d9E1fDd04F5F3B9681cC0C95a0f654

One address is also a safety rule you can remember. A "sync" that asks for an approval, for value, or goes anywhere else isn't ours.

Three networks, one streak#

Our city sits on three shores: Base, Soneium and Sonic. The Sync is our daily presence on all three, and you pick the network every day. Sync on Base on Monday and on Sonic on Tuesday, and the streak carries on.

That works because there are two streaks, and only one of them pays. The contract keeps a streak per wallet and per network, because that's all a contract can see. The streak that pays your points is ours, and it belongs to you as a player: every wallet linked to your profile counts, on any of the three networks.

One Daily Check counts per player per UTC day. You can sync on a second network the same day, the chain will happily accept it, but it pays nothing extra.

What the streak pays#

A day pays points equal to your current streak, and the price of a day stops at 30.

Streak day Points that day
1 1
7 7
30 30
31 and beyond 30

A first full month without a miss is 465 points. Every month after that, held at the cap, is 900.

Miss a day and the streak goes back to 1. No freeze, no insurance, no way to buy the day back. That sounds harsh, but it's the point of a ladder: a missed day doesn't cost you one day's points, it costs the price every future day had climbed to.

And the streak survives the end of a season. Season points reset, the streak doesn't. Day 31 is day 31 whether or not a season changed underneath it. A check-in that wipes itself on a date nobody chose gives you a reason to stop coming back, which is the opposite of what it's for.

What a real transaction changes#

Because a sync is a real transaction somebody paid gas for, we treat it like one.

It pays the person who invited you their usual 10%, rounded down: nothing for days 1 to 9, one point a day from day 10, two from day 20, three from day 30. That's paid on top by the system, nothing is taken from you.

And a counted sync is a verified on-chain transaction for the season's reward rule. A button press could never be that.

The small rules that save your day#

Most of the questions we get are about midnight, so here's how the day actually works:

  • The day is the block's. The day turns at 00:00 UTC on every network, and a sync belongs to the UTC day of the block it landed in, not to your phone's clock. The Sync window shows UTC time in its corner for exactly this reason.
  • Just before midnight still counts. If your transaction landed before midnight, it counts for that day even if the app hears about it a minute later.
  • A closed tab doesn't cost you the day. If the page closes after you confirmed, the app remembers the transaction and hands it in on your next visit from the same browser. You never pay twice for one day.
  • One sync per wallet per network per day. The contract refuses a second one by itself. If you see "already synced on this network today", pick another network.

Try it#

Tap Daily Check in the top bar of app.denshin.io. It takes you to today's point and opens the Sync window. Pick a network, confirm one transaction, done. Tomorrow the point will be somewhere else in the city.

The full rules are on Daily Check and Denshin Sync in our docs.

Keep reading

電信 · DENSHIN MEANS “TELEGRAPH”

Join the signal

New articles, season news and the first word on what the city opens next — pick the channel you already read.

X@_denshin Announcements and the first word on anything new. Follow DiscordJoin the server Help, quest talk and the roles your rank unlocks. Join Telegram@denshin_channel Every announcement, delivered to Telegram. Subscribe Instagram@denshin.web3 Posters, clips and short updates from the city. Follow