For judges
Everything verifiable about Viky on one page, and everything that is not, written as it is. Nothing here is shown to funders or recipients. The first block is the page in one minute; every section under it opens when its title is pressed.
In one minute
- What it is
- A conditional gift on Monad. Money is put in someone's name and becomes theirs as a source that is not Viky says the thing was done. What is not earned goes back by itself.
- Who it is for
- The person who pays for someone else's effort from a distance and cannot check it: a year of studies, a language, a certificate, a race.
- Pilot activity
- The on-chain record separates founder and judge-credit trials from other activity; it is not a count of people. Pilot activity on-chain.
- Proven
- A student showed their enrolment from their university's portal and the gift paid 20 seconds after they signed in, with no review (Toulouse, 9 Oct 2026). Universities.
- Why Monad
- On a gift's usual path neither person holds MON or reads a fee: Viky's relayer sends and pays each step. A step is final in under a second. One signature funds a gift. In full.
- Where it runs
- Monad mainnet. A habit, day by day: 0x591d76863177E70FfcA2C793212d4715A367Ec70. One thing reached: 0x493c87A27E637bBc7179C17bE2B215fC18523CC0. The recipient's yes and stop: 0x2a15DF23fF62120700f14D1E5d5d56CA0dAd027e. A gift is made on these today: the daily one is the third version of its contract, the two others the second; the earlier contracts are under Network.
- One command
- It asks the gift contract who owns it, with no account and no key, and answers the Safe that owns every contract here. To check a credited day against its source: verify a credited day yourself.
cast call 0x591d76863177E70FfcA2C793212d4715A367Ec70 "owner()(address)" --rpc-url https://rpc.monad.xyz
The same, at length
A conditional gift on Monad. Someone puts money behind another person's goal: it is allocated in that person's name from the first day, becomes theirs as a source that is not Viky says the thing was done, and what is not earned goes back to the funder by itself. Nobody profits from a missed day.
The person who pays for somebody else's effort from a distance and cannot check it themselves: a parent paying for a year of studies in another city or another country, a relative backing a language, a certificate, a race.
The contracts record 22 gifts and $103.78 put into them. This is activity by event and account, not a count of individual people. 3 were paid from a judge credit and kept apart. The 19 other gifts were funded by 4 accounts, 2 outside the founder's accounts; opened by 9 accounts, 3 outside his. $29.39 earned, $64.97 gone back. Counted from the index as this page is served: pilot activity on-chain.
For judges, how to try it
- Open Viky by the link in the submission portal's instructions, which carries the judge code, and offer a gift from the home page.
- Press "Use the code" on the pay sheet: your face or your fingerprint makes your account, and it receives $3.00.
The code, the credit, and what a real funder pays
The pay sheet opens on the code, already filled in. Press "Use the code": your face or your fingerprint makes a passkey on your device, which is your account. Viky keeps no account for you, and you keep the passkey. Your account receives $3.00: a judge credit from Viky's treasury, once per account. A real funder pays by card instead, on the page of the card service their country is served by ("How money comes in", below). Without the link, press "Have a code?", right above the pay button, and type the code from those instructions. The code works until 4 Nov 2026, UTC. 3 credits have been given so far, 7 are left under the ceiling. - The sheet then pays with your credit and opens no card service.
A gift above the credit
The sheet then pays with your credit and opens no card service; a gift above the credit is brought to the credit, and the sheet says so. - To see the other side on this device, make a second account: Me, then Other account, then Create a new account.
The other side, gesture by gesture
To see the other side on this device: copy the link, press the back arrow, then Me, then Other account, then Create a new account. This browser is then signed in to a second account: paste the link in the address bar and press Open my gift. Then connect the source. With one account you only ever see the funder's side of your own gift. - Choose what to offer: each path asks something of you, and costs some of the month's attested readings.
What each path asks, and what it costs in readings
What to offer. Each path asks something of you: Duolingo, an account there, and a lesson done after you connect it; Chess.com, an account there with a settled rating, and one rating point won. For Duolingo, type your own Duolingo name on the card, under "Their Duolingo name", and connecting is one press. With no account of a source, the short path is the next step: open the gift, then end it. And what each costs of the month's attested readings, which are few and counted under "How a day is read", below. 75 readings are left until 1 Nov 2026, when the count starts again.- First, Duolingo, a lesson a day: two readings for one connection, one lesson and one day paid. Connecting the account is one, counting the day is the other. On a gift made now, the day is paid the day its lesson is done: when the gift's page is opened after the lesson, or within the hour. On a gift made on the second version, the day counts the morning after it ends (the readings pass of 00:30 UTC). Either way a day without a lesson costs no reading, a plain look sees it first, and it comes back to the funder 31 hours after it ends (the settling pass of 07:00 UTC, two mornings later).
- A climb on Chess.com: four readings, started and reached. Each reading is two fetches, the profile and the ratings: two at the start, two at the target. The rating offered has to be a settled one, an RD under 60 on Chess.com, which an account that plays that kind of game often has; on any other the sheet answers "This rating is still settling: they need a few more games first.", and another of the four ratings can be chosen. With a settled rating, it settles in one sitting: offer a rating one point above the account's own, and once it is reached open the gift's page: a climb is read as its page opens, and has no button for it. On Codeforces a reading is one fetch: two, started and reached.
- A certificate by its link (Coursera, edX, MITx Online, Accredible, the Duolingo English Test) or a WCA time: one reading, taken only once a plain look has found that the page can pay. A Credly badge: two. A race finished: one.
- Fitbit, by the day: one reading to connect, then one each morning that has a day to credit. Strava is read the same way, once it is opened on request.
- A document a person shows (a score, an enrolment, a grade): no reading. It is one of the month's 25 proofs shown by people.
- With no account at Duolingo or Chess.com: open your gift from the other account, connect nothing, and end it.
The short path, and where the money goes
With no account at Duolingo or Chess.com: open your gift from the other account, as above, and connect nothing. Press "Stop", then "End the gift", and confirm: all of it goes back to the account that paid. Money leaves a gift for the person it is for only once a reading has credited it. - Mera's stateless test: sign out, then sign in with the same passkey. The account comes back from the passkey alone.
What comes back, and what the first device kept
Mera's stateless test runs on this same account: sign out, clear this site's storage or take another device, and sign in with the same passkey. The account, its gifts and its money come back from the passkey alone. What the first device kept (which passkey to offer, a gift's link, the theme) is a convenience the account does not need. - One Passkey, Many Keys: the same sign-in makes a second key, which signs the recipient's yes and stop.
The second key, in six gestures
One Passkey, Many Keys: the same sign-in asks the passkey's PRF for a second salt, sha256("viky:consent:v1"), and its output is an Ed25519 key held in memory. It signs the recipient's yes to what a gift reads, and their stop, and nothing else: it cannot move money. In six gestures:- Sign in on this device. The one prompt asks the passkey for both salts.
- Read "Your agreement key" at the foot of this page: the public half of that Ed25519 key, from this page's memory.
- Open a gift made for you and press the key that starts its first reading, "Start counting" or "Check my profile" on a daily gift: that press signs your yes with this key, before anything is read.
- On a second device, sign in with the same passkey.
- Read "Your agreement key" there: it is the same key.
- Press Stop on the gift from the second device. Back on the first, the gift says Viky stopped reading: every reading that could move money checks the latest signed yes first (src/consent-guard.ts).
Universities: set up once, then paid on sign-in
- once, 2 days
- once, 1 day
Toulouse, 7 Oct 2026: a real student showed their enrolment, and the gift paid once the proof had been read by hand.
- in seconds
Toulouse, 9 Oct 2026: a student showed their enrolment, and the gift paid 20 seconds after they signed in to their university's portal, with no review.
Rome: ready today, on a check approved by Reclaim. 11,000 more: each set up within two days of a first gift.
Pilot activity on-chain
Counted from the index of the contracts' events as this page is served, at block 117,224,139. This is an event and account record, not a count of individual people. The founder's own test accounts are named as his: they are the seven listed in src/pilot-accounts.ts. Every other account is called "not the founder's"; nothing here establishes who it belongs to. A gift paid from a judge credit is a try of the path this page gives, paid with the treasury's money: it is counted apart, and the accounts below are those of the other gifts.
- Gifts on-chain
- 22 gifts made, $103.78 put into them in all, 17 opened. 9 are on the second version of the contracts, and 4 are on the third daily contract.
- Funding accounts, excluding judge-credit trials
- 4 accounts: 2 the founder's test accounts, 2 not his.
- Recipient accounts, excluding judge-credit trials
- 9 accounts: 6 the founder's test accounts, 3 not his.
- Between whom
- Between two people neither of whom is the founder: 2. From the founder to somebody else: 3. From somebody else to the founder: 0. The founder's own tries, between his test accounts: 9. Opened by nobody yet: 5. Paid from a judge credit: 3.
- Earned, and gone back
- $29.39 earned by the people the gifts were for, $64.97 sent back to the people who funded them.
Gift by gift (22)
Gift 1, $20.00, finalised: from 0x350a…7761 (the founder's test account) to 0x91C9…454d (the founder's test account); the founder's own try, between his test accounts. $2.85 earned, $17.14 sent back.Gift 2, $1.00, finalised: from 0x350a…7761 (the founder's test account) to 0x350a…7761 (the founder's test account); the founder's own try, between his test accounts. $0.14 earned, $0.85 sent back.Gift 3, $5.00, finalised: from 0xb12e…8376 (the founder's test account) to 0xb12e…8376 (the founder's test account); the founder's own try, between his test accounts. $0.00 earned, $5.00 sent back.Gift 1000000, $1.00, expired: from 0xb12e…8376 (the founder's test account) to 0x8813…4c3D (the founder's test account); the founder's own try, between his test accounts. $0.00 earned, $1.00 sent back.Gift 1000001, $1.00, expired: from 0xb12e…8376 (the founder's test account) to nobody yet, it has not been opened; opened by nobody yet. $0.00 earned, $1.00 sent back.Gift 1000002, $1.00, expired: from 0xb12e…8376 (the founder's test account) to 0x8813…4c3D (the founder's test account); the founder's own try, between his test accounts. $0.00 earned, $1.00 sent back.Gift 1000003, $3.41, claimed: from 0xb12e…8376 (the founder's test account) to 0x5719…1697 (the founder's test account); the founder's own try, between his test accounts. $0.00 earned, $0.00 sent back.Gift 1000004, $3.01, reached: from 0xb12e…8376 (the founder's test account) to 0x3D14…0Eec (not the founder's); from the founder to somebody else. $3.01 earned, $0.00 sent back.Gift 1000005, $3.01, reached: from 0x3D14…0Eec (not the founder's) to 0x9f30…B81D (not the founder's); between two people, neither of them the founder. $3.01 earned, $0.00 sent back.Gift 4, $16.83, finalised: from 0xb12e…8376 (the founder's test account) to 0x8813…4c3D (the founder's test account); the founder's own try, between his test accounts. $2.40 earned, $14.42 sent back.Gift 1000, $5.61, ended: from 0xb12e…8376 (the founder's test account) to 0x8813…4c3D (the founder's test account); the founder's own try, between his test accounts. $0.18 earned, $5.42 sent back.Gift 1000006, $8.98, reached: from 0x3922…dF5b (not the founder's) to 0x8E7D…fdE9 (not the founder's); between two people, neither of them the founder. $8.98 earned, $0.00 sent back.Gift 1000007, $3.11, expired: from 0x3922…dF5b (not the founder's) to nobody yet, it has not been opened; opened by nobody yet. $0.00 earned, $3.11 sent back.Gift 1000008, $5.02, reached: from 0xb12e…8376 (the founder's test account) to 0x8E7D…fdE9 (not the founder's); from the founder to somebody else. $5.02 earned, $0.00 sent back.Gift 1000009, $3.00, claimed: from 0x8738…16fe (credited by the judge code) to 0xb12e…8376 (the founder's test account); paid from a judge credit, counted apart. $0.00 earned, $0.00 sent back.Gift 1000010, $3.36, cancelled: from 0xb12e…8376 (the founder's test account) to nobody yet, it has not been opened; opened by nobody yet. $0.00 earned, $3.36 sent back.Gift 1000011, $3.36, cancelled: from 0xb12e…8376 (the founder's test account) to nobody yet, it has not been opened; opened by nobody yet. $0.00 earned, $3.36 sent back.Gift 1000012, $3.36, reached: from 0xb12e…8376 (the founder's test account) to 0x8E7D…fdE9 (not the founder's); from the founder to somebody else. $3.36 earned, $0.00 sent back.Gift 1000013, $5.60, cancelled: from 0xb12e…8376 (the founder's test account) to nobody yet, it has not been opened; opened by nobody yet. $0.00 earned, $5.60 sent back.Gift 1001, $3.00, ended: from 0x9E63…dAe9 (the founder's test account) to 0x811a…2376 (the founder's test account); paid from a judge credit, counted apart. $0.42 earned, $2.57 sent back.Gift 1002, $1.12, ended: from 0xb12e…8376 (the founder's test account) to 0x811a…2376 (the founder's test account); the founder's own try, between his test accounts. $0.00 earned, $1.12 sent back.Gift 1003, $3.00, claimed: from 0x307D…d0aa (credited by the judge code) to 0x1235…8229 (not the founder's); paid from a judge credit, counted apart. $0.00 earned, $0.00 sent back.
Network
- Chain
- Monad mainnet, chain id 143
- RPC
- https://rpc.monad.xyzThe reads a browser makes of Monad go through Alchemy's Monad RPC first, with the public endpoint above behind it.
- AUSD
- 0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a
- Where a gift is made today
- On the third version of the daily contract, and on the second version of the two others. The addresses are in the first block of this page.
Each address, its deployment, its verified source and its hand-over to the Safe
A habit, day by day: 0x591d76863177E70FfcA2C793212d4715A367Ec70 (MonadVision, deployed in 0xe6edce35…97f3), the third version of the daily contract, deployed on 3 Oct 2026 by 0x65F9c9225A646423878f0405f750a209c3648335; who owns it is read from the chain with the others, below. The second version's daily contract, 0xC83d8028347967Fc84D0e36Ae5876d9b29EAEc51 (MonadVision, deployed in 0x8be062b2…c409), runs the gifts it holds. One thing reached: 0x493c87A27E637bBc7179C17bE2B215fC18523CC0 (MonadVision, deployed in 0x15c35547…bd4c). The anchor of agreements, which holds no money: 0x2a15DF23fF62120700f14D1E5d5d56CA0dAd027e (MonadVision, deployed in 0xe0a2b412…d412). The source of the four is verified through Sourcify, an exact match. The three of the second version were deployed on 2 Oct 2026 by a key made for that day alone, 0xEFc6820AA6EFafb824f6e9c102079c8f81845840, which handed each to the Safe; the Safe accepted them in 0x5a8dca52…eae9, 0xb5b8b17b…921e and 0x4125aef7…171b, and that key owns nothing. The same day the Safe closed new gifts on the three first-version contracts, in 0x0c2e70ed…5397, 0x10e8d50e…57b5 and 0x32ec292b…181a: they go on running the gifts they hold, to the end. Whether a gift has run on each of these yet is counted from the index under "Who has used Viky": nothing is claimed as working on one of them before one has, end to end, with real amounts. - Gift contract, first version
- 0x995Ab09d8B20511d057E9E87D00fa1f41fC0e233 (MonadVision, source verified through Sourcify) Nothing is claimed as working until the first gift has run end to end on mainnet; the first gifts are read from the chain further down this page.
- Who owns the contracts
- One owner holds all 9 (third-version daily gifts, second-version gifts, second-version milestone gifts, the anchor of agreements, first-version gifts, the earlier gift contract that still runs the first gifts, first-version milestone gifts, the way out, the converter of card payments), read from the chain as this page was served: 0xE08D926c148A5065F4Df2892702785a183de86F9, a Safe 1.4.1 that signs with 2 of its 3 keys, the project's own. So registering a goal, replacing the evidence signer or pausing needs 2 of those signatures on any of them, and no single key can.
How each contract was handed to the Safe, and by which key
The four of the first version were handed to the Safe on 20 Sep 2026, in 0x1aa2887e…47d3 (gifts), 0x53455501…6635 (the earlier gift contract), 0x960a5ad8…072b (milestone gifts) and 0xcd2b1ac3…7b78 (the way out), from the founder's key 0x80fb079237Af2A634ba9B95263Ba0bd53d20Cd64, which had held each since its deployment or its hand-over, from 16 to 18 Sep 2026, and never was the key that deployed them (the gift contract in 0xa01ae787…a009, the earlier one in 0xe6f5b531…3840). Each owner is read again from the chain further down, with what that owner can and cannot do. Handing ownership over moved no money: the earlier contract held the 8.571432 AUSD of its first gift before and after it. That gift has since ended, and its last refund went back to its funder on 23 Sep 2026. The converter of card payments was born owned by a key made for its deployment alone, which handed it to the Safe in its third transaction on 3 Oct 2026, in 0x87d44ed9…7103. - Earlier gift contract
- 0xE04CD59bB93765333200a9da01df83149D4C4d67 (MonadVision, source verified through Sourcify). It holds the gifts created before the day-counting corrections and keeps running them to the end. Gift ids never restart: the newer contract continues the sequence, and every gift record names the contract that holds it.
Verify a credited day yourself
The key that signs is ours. The owner can replace it.
So here is how anybody checks, without us, that a reading really had a proof behind it.
Where every settled day is published
Every settled day of every gift is published: what happened, the transaction that settled it, and the fingerprint of the claim it was settled against, at /api/gift/<number>/journal. That fingerprint is the one the contract keeps so the same claim can never be used twice, so anybody can ask the chain whether it accepted exactly that claim. The proof itself is never published: it carries the account's own name and its points, and Privacy promises the public sees only a pseudonym.
One example to check from a clone, with no key and no account
One example is public in full, from a gift of Viky's own, published with the account holder's agreement: gift 2, the day of 12 September 2026. Take it and check it, from a clone of this repository, with no key and no account:
From nothing, on any machine with Node and pnpm. No key, no account, no permission from us:
git clone https://github.com/RedGnad/Viky.git
cd Viky
pnpm install
pnpm verify:dayIt reads /api/judges/example from this site, recomputes the claim's identifier from the signed claim, recovers the attestor that signed it, recomputes the fingerprint 0xefaad59b054323c8a4b913ac04bca77d0eb94e0ced689628e9007772165941ee, asks the gift contract whether that fingerprint is recorded, and reads transaction 0x55f9eafa857ee9897be5a7e092e055a3c75d2003d11a087dd9a0244e64726fab back to see it credit that day. Each answer is printed with what it was compared against.
The two people of a gift check their own day
The two people a gift is between can do the same with their own day: the gift's page offers "Check this day yourself", which hands over the proof of that day, and then:
pnpm verify:day --file day.json --gift <number> --day <day>A milestone gift: a reading rather than a day
A milestone gift settles on a reading rather than on a day, so its journal lists readings, its page offers "Check this reading yourself", and the same command takes --reading <number> instead of --day. It asks the milestone contract the same question: is this claim's fingerprint the one it recorded?
What a pass proves, and what it does not
What a pass proves: Duolingo's own servers answered that, and the contract credited that day against that one answer, which can never be replayed. What it does not prove: that the account belongs to the person the gift is for, or that a human rather than a script did the lesson. The account is tied to the person once, separately, by a code placed in its display name or by the funder naming it, and a session proof says nothing about whose hands were on the phone. Reclaim writes the same thing about its attestor: a third party must trust that it did not collude with the user.
What each condition proves
Four questions, asked of every condition, answered in the register the product itself reads. Where something is not known, the answer says so: none of these proves who did the activity, and that is written here rather than left to be discovered. Where each condition stands, and what no source lets anybody check at all, is the public page What Viky can check.
18 conditions: 3 paid with real money, 10 read on their real page, 4 open and waiting for their first person, 1 on request. A condition is proven the day the thing happens: a lesson is daily, a race has a date, a university gives its results once a year. Where each one stands today:
A public page or API, read under attestation 12 conditions
A Duolingo lesson a day, a Chess.com rating and puzzle record, a Codeforces rating, Credly, Accredible, the Duolingo English Test, edX, MIT and Coursera certificates, a cube result, a race finish.
Paid with real money: Duolingo, 5 real proofs and the Chess.com rating, 2 real proofs. Each of the 10 others had its real page read under attestation on 12 Oct 2026, with no gift yet.
The person's own account, shown by them 4 conditions
Enrolled at university, the year passed, a grade reached, a TOEFL score.
Paid with real money: enrolment, 3 real proofs. The first enrolment was read by hand (Toulouse, 7 Oct 2026) and the next was paid 20 seconds after sign-in (9 Oct 2026). Nobody has shown one yet: the year passed, a grade and a TOEFL score.
An account the person connects 2 conditions
Active minutes on Fitbit, kilometres on Strava.
Built, read on no real account yet. Fitbit takes a Fitbit tracker or a Pixel Watch. Strava opens on request, within two days of a first gift: its developer program is a paid subscription, taken when a gift asks for it, and serves ten athletes before its review, up to 9,999 after it.
Condition by condition, four questions each:
Learn
A Duolingo lesson each day
- Does the data come from the source's own servers?
- Duolingo's own servers, read through an attested fetch the day the lesson is done: when the gift's page is opened after the lesson, or within the hour. A gift made on the second version of the contract is read the morning after its day ends. The reading is signed by Reclaim's attestor and Viky checks that signature, the address that signed it and the request it was about, before a day can count. Nobody types a number, and the person never touches the proof. When the gift is made on one course, the reading is anchored on that course's id, so experience won in another course is not in it.
- Is the account theirs?
- Proved once, before anything counts: either the funder names the Duolingo account when they offer the gift, or the person puts a short code in their Duolingo display name and Viky reads it there.
- Who acted on the account?
- Unknown, and it is the honest answer: the reading proves what that account did, never who did it. Somebody else with the password, or a script, would read the same. Duolingo describes no proctoring and verifies no identity.
- What does the source do against cheating?
- Duolingo's own rules forbid scripts written to cheat and forbid scraping, and its terms let it delete an account for it. It publishes no anti-cheat status a third party can read, so Viky has nothing to check against: this is the weakest of the conditions on that question, and it is said here rather than left to be found.
Reach a Codeforces rating
- Does the data come from the source's own servers?
- Codeforces' public API, `user.info`, read through an attested fetch when the person binds the account, when the climb starts and when its target is reached: the handle as the site spells it, the rating, the best rating ever, and once the last name where the binding code was put. Nothing else is matched. An account with no rated round yet has no rating and can bind nothing.
- Is the account theirs?
- The funder writes the handle; the person proves the account is theirs by putting Viky's code in the last name of their Codeforces profile before the first reading, or the funder's own naming stands. The identity kept is the handle, in lower case.
- Who acted on the account?
- Unknown: Codeforces records what the account submitted in its rated rounds. Whether the person behind the account solved is not read.
- What does the source do against cheating?
- Codeforces judges every submission itself, punishes plagiarism with a rating rollback and a public note, and makes a round unrated when it fails; its API is public and asks for no key (one request every two seconds). Its terms forbid commercial use of the website's material and any use that harms it; Viky looks at one account's line every hour while a gift is climbing on it, in the day's two passes, and once a minute while that gift's page is open, for an account its holder bound with Viky's code, naming itself. Written on the judges' page.
A certification on Credly
- Does the data come from the source's own servers?
- Two public records of the same badge, read through an attested fetch and read again at every reading: the Open Badges assertion, which says the day and carries the issuer's id and the badge class's id, and the badge's public page, which is the only place the holder's name is published. Three things come out of them and nothing else. The assertion also carries the holder's email address, hashed: Viky's server reads the whole assertion when it looks at the badge, and nothing here matches that address or keeps it.
- Is the account theirs?
- The funder names the person and chooses the certification, and both are hashed into the terms they sign, so a badge for another certification or in another name pays nothing. The certification is decided by the pair of ids Credly publishes rather than by a title, which can be edited or reused. Two people of the same name who earn the same certification inside the same days cannot be told apart by this, because the page has no field its holder can edit: that gap is written down rather than dressed up.
- Who acted on the account?
- Unknown: nothing describes how the work behind the badge was supervised, and it varies by issuer. What is different from a certificate a site prints for its own course is that the issuer is a third party who awards the badge, so nobody can award one to themselves.
- What does the source do against cheating?
- Credly hosts what issuers award and does not mark the work: a badge can be revoked by its issuer, and a holder can make it private again, and both stop the reading, because the two records are read again every time. Nothing published says a badge was earned under supervision.
A credential on Accredible
- Does the data come from the source's own servers?
- The public record Accredible publishes for the credential (the JSON its page is drawn from), read through an attested fetch when the person shares its link, and again at every reading: the title, the issuer's website, the day of issue, whether it is private, expired or revoked, and the name on it. Its recipient's masked email is matched and never taken.
- Is the account theirs?
- The funder names the person and the credential by its title and its issuer's website, and all three are hashed into the terms they sign, so a credential with another title, from another issuer or in another name pays nothing. Two people of the same name with the same credential in the same window cannot be told apart.
- Who acted on the account?
- Unknown: what stands behind a credential varies by issuer, and Accredible describes none of it. What differs from a certificate a site prints for its own course is that an issuer, a third party, awards it.
- What does the source do against cheating?
- The issuer awards and can revoke the credential, and Accredible publishes whether it is revoked or expired, which the reading checks. Accredible's terms (April 2026) are a contract with issuers and name no automated access; nothing about a reader is claimed.
School & studies
Enrolled at university, shown
- Does the data come from the source's own servers?
- The page of the person's own student portal, shown by them: they sign in there, in a verification tab, and what the page carried is proved by an attestor in a TEE where the university's provider is a classic one, or by the signature of Viky's pinned witness on the provider's own domain where it is an AI provider, with no enclave: one field, the enrolment the university's enrolment provider reads, matched against its pattern. Viky keeps that it said enrolled and the day, and nothing else; the password never reaches Viky. A university without an enrolment provider yet takes the gift, and the provider is built within two days; the first proof under a rule Reclaim's agent wrote is read by the operator before anything pays, and where the operator fixed the rule ahead, from a version Reclaim publishes, the first proof that fits it is paid at once and one that does not is held.
- Is the account theirs?
- The funder chooses the university from the list, and it is hashed into the terms they sign; a page shown from another university pays nothing. Who holds the portal's account is not proved: a shared student account is a shared student account.
- Who acted on the account?
- Unknown. Signing in to a portal is one person's act, and nothing says who sat in class.
- What does the source do against cheating?
- Each university polices its own enrolment: a portal says enrolled because the registrar recorded it. What a portal's terms say about a program reading its pages is not read portal by portal (the judges' page says so), and a portal that changes its page stops proving until its provider is built again.
Passed the year at university
A year's results are published at its end: a gift made during the year waits for them, and a page of an earlier year does not count.
- Does the data come from the source's own servers?
- The results page of the person's own student portal, shown by them: they sign in there, in a verification tab, and what the page carried is proved by an attestor in a TEE where the university's provider is a classic one, or by the signature of Viky's pinned witness on the provider's own domain where it is an AI provider, with no enclave: the one field that says passed, matched against the results provider's pattern, and the year's field where the page dates itself, so a page of another year pays nothing. Viky keeps that it said passed and the day, and nothing else; no grade is read and the password never reaches Viky. A university without a results provider yet takes the gift, and the provider is built within two days; the first proof under a rule Reclaim's agent wrote is read by the operator before anything pays, and where the operator fixed the rule ahead, from a version Reclaim publishes, the first proof that fits it is paid at once and one that does not is held.
- Is the account theirs?
- The funder chooses the university from the list, and it is hashed into the terms they sign under this condition's own name; a page shown from another university, or a proof of enrolment on the same one, pays nothing. Who holds the portal's account is not proved: a shared student account is a shared student account.
- Who acted on the account?
- Unknown. Signing in to a portal is one person's act, and nothing says who sat the exams.
- What does the source do against cheating?
- Each university polices its own exams and publishes the result on its own portal: the page says passed because the jury recorded it. What a portal's terms say about a program reading its pages is not read portal by portal (the judges' page says so), and a portal that changes its results page stops proving until its provider is built again.
Reached a grade at university
A year's results are published at its end: a gift made during the year waits for them, and a page of an earlier year does not count.
- Does the data come from the source's own servers?
- The results page of the person's own student portal, shown by them: they sign in there, in a verification tab, and what the page carried is proved by an attestor in a TEE where the university's provider is a classic one, or by the signature of Viky's pinned witness on the provider's own domain where it is an AI provider, with no enclave: the one field that holds the grade, read on the scale the results provider declares (out of 20, a GPA out of 4, or out of N in a step; a scale of letters is declared and refused when the gift is made), and the year's field where the page dates itself, so a page of another year pays nothing. Viky keeps that the grade reached the target and the day, and nothing else: the grade itself is kept nowhere, except on the first proof ever shown from a university's page, which is held until a person at Viky has read it and erased when they decide. The password never reaches Viky. On a university whose results page is not read yet, the funder chooses the scale (out of 20, 4 or 100, or letters, ranked in one order), and the first proof the operator reviews pins the university's own: a gift made on another scale is refused, and nothing is paid.
- Is the account theirs?
- The funder chooses the university from the list and sets the grade on its own scale; the university is hashed into the terms they sign under this condition's own name, so a page shown from another university pays nothing, and Viky compares the grade shown with the target in the same hundredths: what the contract receives is the target, as the verdict, never the grade. Who holds the portal's account is not proved: a shared student account is a shared student account.
- Who acted on the account?
- Unknown. Signing in to a portal is one person's act, and nothing says who sat the exams.
- What does the source do against cheating?
- Each university polices its own exams and publishes the grade on its own portal: the page carries what the jury recorded. What a portal's terms say about a program reading its pages is not read portal by portal (the judges' page says so), and a portal that changes its results page stops proving until its provider is built again.
A TOEFL score, shown
- Does the data come from the source's own servers?
- The page ETS shows to the account holder once they have signed in, read in a Reclaim verification the person opens from their gift's page: one request to ETS's own servers, attested by a witness in a TEE, and two fields, the total score and the booking it belongs to. No name, no test date, no photograph. ETS's own terms on that reading were not read for this line, and that question stands.
- Is the account theirs?
- The link is the account the person signs in to, in their own browser, and the gift's own recipient, which the contract checks. No name is typed by the funder and none is read from the page: the subject the funder signs is the same for every gift on this condition, and that is written down rather than dressed up.
- Who acted on the account?
- Unknown to Viky: the proof says which ETS account was signed in to, not who sat the test. ETS's own pages on identity checks and proctoring were not read for this line, so nothing is claimed about them here.
- What does the source do against cheating?
- Not read: what ETS does about a score it cancels, and whether a cancelled score leaves the account page, are ETS's rules and were not read for this line. The only thing Viky reads is what the page shows on the day it is shown.
A Duolingo English Test score
- Does the data come from the source's own servers?
- The page of the certificate its taker chose to make public, read through an attested fetch that takes three fields and no more: the score, the day of the test, and the name printed on it. The same answer also carries a date of birth and a photograph: Viky's server reads the whole answer when it looks at the link, and keeps neither. The link is read again at every reading, so a certificate taken private again or past its two years stops paying, and says which. That reading is made by a program, which is the act Duolingo's terms ask to be asked about first, and that question has not been asked.
- Is the account theirs?
- The funder types the name the person will sit the test under, and it is hashed into the terms they sign. A certificate in another name pays nothing. Two people with the same name cannot be told apart by this, because the page has no field its holder can edit: that gap is written down rather than dressed up.
- Who acted on the account?
- Known, and this is the only condition where it is: Duolingo records the session, checks a valid identity document, and has qualified examiners review it before a score is released.
- What does the source do against cheating?
- Duolingo may invalidate a result after it has been certified and notify everyone who received it, and it says so in its own terms. A certificate can also be taken private again by its holder, and expires two years after the test. All three are visible in the reading Viky already makes.
An edX certificate
- Does the data come from the source's own servers?
- The public page edX publishes for the certificate, read through an attested fetch when the person shares its link, and again at every reading: the organisation and the course's number, its printed name, the track, the holder's name, the day of issue and the certificate's own id. Nothing else is matched. A certificate edX withdraws answers 404 and stops paying.
- Is the account theirs?
- The funder names the person and the course, and both are hashed into the terms they sign, so a certificate for another course or in another name pays nothing. Two people of the same name who finish the same course inside the same window cannot be told apart, as on Coursera.
- Who acted on the account?
- Unknown: edX verifies the learner's identity for the verified track and describes no supervision of each assignment.
- What does the source do against cheating?
- edX issues the certificate on a passing grade in the verified track, after an identity check, and publishes a page per certificate. Its terms (11.6, updated 3 Nov 2025) forbid accessing the service through robots or crawlers other than edX's own, which Viky's one reading per shared certificate is: written on the judges' page, the risk assumed as for Duolingo and Coursera.
An MIT course certificate
- Does the data come from the source's own servers?
- The public page MITx Online publishes for the certificate, read through an attested fetch when the person shares its link, and again at every reading: the course or program's title, the holder's name, the day of issue and the certificate's own id. Nothing else is matched. A certificate that is revoked answers 404 and stops paying.
- Is the account theirs?
- The funder names the person and the course by its title, and both are hashed into the terms they sign, so a certificate for another course or in another name pays nothing. Two people of the same name who finish the same course inside the same window cannot be told apart, as on edX.
- Who acted on the account?
- Unknown: MITx Online issues a certificate on a passing grade in the paid track; its terms describe identity-verified proctoring for some courses only, and the page does not say which.
- What does the source do against cheating?
- MITx Online issues the certificate at its own discretion, under its own name, and can revoke it (a revoked certificate's page answers 404). Its terms forbid scraping or downloading its content in bulk and allow personal, noncommercial use of site content, which Viky's one reading per shared certificate sits beside: written on the judges' page, the risk assumed as for edX.
A Coursera certificate
- Does the data come from the source's own servers?
- The public page of the certificate, read through an attested fetch when the person shares its link, and read again at every reading: four things come out of it and nothing else, the name on it, the course, the certificate's own code and the day it was granted. That reading is made by a program, which is the act Coursera's terms ask to be asked about first, and that question has not been asked.
- Is the account theirs?
- The funder names the person and the course, and both are hashed into the terms they sign, so a certificate for another course or in another name pays nothing. Two people of the same name who finish the same course inside the same days cannot be told apart by this, because the page has no field its holder can edit: that gap is written down rather than dressed up.
- Who acted on the account?
- Unknown: Coursera describes no supervision of each assignment.
- What does the source do against cheating?
- Coursera verifies identity once per account, with an official document and a selfie, and says some programmes require it while others only check a name. Nothing published says a certificate was earned under supervision.
Play
A chess rating on Chess.com
- Does the data come from the source's own servers?
- Chess.com's public API, read through an attested fetch when the climb starts and when its target is reached, and checked the same way as Duolingo. The rating read is the one Chess.com publishes for that cadence, with its own reliability figure beside it.
- Is the account theirs?
- The funder names the Chess.com account when they offer the gift, and that naming is the whole tie: no code is asked, so whoever opens the link is paid when that account gets there.
- Who acted on the account?
- Unknown here too: the rating belongs to the account. What is different is that Chess.com hunts exactly that, and says so publicly.
- What does the source do against cheating?
- Chess.com polices engine use, outside help, account sharing and arranged results itself, publishes the sanction in the same API Viky reads (`status: closed:fair_play_violations`), and Viky refuses a closed account at every reading, so a gift is never paid on an account its own source has closed.
A puzzle record on Chess.com
- Does the data come from the source's own servers?
- Chess.com's public API, the same page as the rating, read through an attested fetch and checked the same way. What is read is `tactics.highest`, the best puzzle rating that account ever reached: it never goes down, so nothing the person does after beating their record can take the gift away from them.
- Is the account theirs?
- The funder names the Chess.com account when they offer the gift, and that naming is the whole tie: no code is asked, so whoever opens the link is paid when that account gets there.
- Who acted on the account?
- Unknown, and less watched here than in a game: a puzzle is solved alone against a clock, with no opponent and no game anybody can examine afterwards. The reading proves what that account reached, never who was at the keyboard.
- What does the source do against cheating?
- Chess.com closes an account for a Fair Play violation and publishes it in the same API Viky reads (`status: closed:fair_play_violations`), and Viky refuses a closed account at every reading. What it does not publish is anything about puzzles: read on 20 Sep 2026, neither its Fair Play policy nor its help centre article on Fair Play mentions the puzzle rating, and what they forbid is written about play. So nothing tells us this number is policed the way a rating is, and this condition is the weaker of the two on that question.
A cube result in competition
- Does the data come from the source's own servers?
- The person's own list of results on the World Cube Association's public API, read through an attested fetch when the person asks after the competition, and again at every reading: the row of that competition, that event and the round of their best single, with the name and the times as the WCA prints them. Nothing else is matched. An attempt that is a DNF has no time there and pays nothing.
- Is the account theirs?
- Three ties: the person's name, written by the funder at creation and hashed into the terms they sign, never published; the competitors list of the competition, public, on which the person has to be registered in the event before the first day (that stands in for a bib); and the WCA's own results, which have to carry that name with a result in that event. The name is compared with no case, no accents and no order.
- Who acted on the account?
- The WCA's judges: every attempt at a WCA competition is timed and checked by a judge, the examiner of that attempt, under the WCA Regulations, at a table in the venue.
- What does the source do against cheating?
- The WCA governs the competition under its Regulations and can invalidate results and review incidents; its results are published for everybody and, by its privacy statement, are not personal data. Its API is public and asks for no key; its export may be re-published with a notice that the results are the WCA's. Written on the judges' page.
Move
Active minutes a day, Fitbit
- Does the data come from the source's own servers?
- The Google Health API's own daily roll-up of active minutes (`dailyRollUp` on `active-minutes`, the successor of the Fitbit Web API), read each morning through an attested fetch with the person's own key handed to the fetch as a secret the attestor never sees: the reading is signed by Reclaim's attestor, and Viky checks that signature and the request it was about, its body included. Only minutes recorded by Google's and Fitbit's own wearables are asked for, not minutes logged by hand; what is read is the moderate and vigorous minutes of the day; what is signed for the contract is the verdict alone, so the chain and the journal hold a yes or a no and never a number of the person's. The roll-up is judged and dropped: no proof of it is stored.
- Is the account theirs?
- The person connects their own Google account once, on Google's own page, in their own browser, after the consent screen says in Viky's words what the funder will be told and what they will never see. The pseudonym of that account's Google Health user id is bound at the first reading, and a key Google stops honouring ends the reading until the person connects again; disconnect and erase is theirs at any time, and gives the key back to Google first.
- Who acted on the account?
- Unknown: the roll-up says what the account's tracker recorded, never who wore it. Google describes no check of who moves.
- What does the source do against cheating?
- Google polices nothing about who moves, beyond leaving out intervals a wearable was not worn. Its Google Health API Developer Terms and its Developer and User Data Policy (both of 24 Mar 2026, read 23 Sep 2026) frame what Viky does: use limited to the feature the person asked for, a transfer to a third party only to provide it and with their consent, the disclosure shown immediately before the consent, deletion honoured on request, no human reading the data; the consent screen, the verdict-only reading and the erase button are those, and the judges' page says so.
Kilometres a day, on Strava
- Does the data come from the source's own servers?
- Strava's own API, the list of the day's activities, read each morning through an attested fetch with the person's own key handed to the fetch as a secret the attestor never sees: the reading is signed by Reclaim's attestor and Viky adds the distances, judges the day and drops the list, its routes and its times with it. What reaches the contract is the verdict, never a number of the person's.
- Is the account theirs?
- The person connects their own Strava account once, on Strava's own page, in their own browser, after the consent screen says in Viky's words what the funder will be told and what they will never see; Strava sends back what they allowed, and without the activities nothing is kept. The pseudonym of that account's athlete id is bound on the chain by the first reading, so another account cannot count for this gift, and the contract checks the recipient.
- Who acted on the account?
- Unknown: the list says what the account recorded, never who carried the phone or the watch, and an activity can be entered by hand. Strava describes no check of who moves.
- What does the source do against cheating?
- Strava polices nothing about who moves; it flags some activities as suspect on its own site and that flag is not read here. Its API Agreement (read 23 Sep 2026) frames what Viky does with Strava Data: used to serve the person who authorised it and nobody else, neither aggregated across people nor shown to others, deleted when they ask. The verdict-only reading, the consent screen and the erase button that gives the key back first are those three; the funder's daily yes or no is the one bit that leaves.
Finish a race
- Does the data come from the source's own servers?
- The runner's own page on the timing company's results site, read through an attested fetch when the person asks after the race, and again at every reading: the name and the bib in its title, and the official time. Nothing else is matched. A runner who did not finish has no time there and pays nothing; a bib nobody wore answers an empty page.
- Is the account theirs?
- Three ties: the runner's name, written by the funder at creation and hashed into the terms they sign, never published; the bib, entered by the person on the gift's page before the day of the race (the field closes at 00:00 that day, where the race is run); and the timing company's line for that bib, which has to carry that bib, that name and a finish time. The name is compared with no case, no accents and no order. Two runners of the same name in the same race with bibs entered before the day of the race cannot be told apart.
- Who acted on the account?
- Unknown: the timing company records who crossed the line wearing the bib. Whether the person wore their own bib is not read.
- What does the source do against cheating?
- The timing company chips the bib and publishes the results for the organiser; a runner can ask the federation to be removed from them. Klikego's terms (CGU of 26 Jun 2026, and its legal notice) claim the site's content and its database, forbid reproduction without written consent, and count the use of robots among the reasons to close a member's account: Viky reads one runner's page per gift, when the person asks, and keeps three fields; written on the judges' page, the risk assumed as for edX.
How reliable the readings are
Since 2026-09-18, the day each pass started writing a record of itself, which is 40 days ago. Passes before that day left no trace, so they are not counted here, and nothing has been filled in for them.
Why the hour is held, and not the minute
The hour, and not the minute, is what a run is held to here, because it is what the platform undertakes: on this plan Vercel "may invoke these cron jobs at any point within the specified hour to help distribute load across all accounts" (their documentation, read 19 September 2026). How long after its minute each pass actually began is said below, so the promise being kept never hides the delay.
- Readings pass, just after midnight
- 41 runs, 41 inside the hour the schedule names, over 40 days, since its first run on 2026-09-18. They began 10 minutes after that minute. A run that never happened writes nothing, so a missing run shows here as a run fewer, never as a late one.
- Second reading, before the catch-up window closes
- 27 runs, 27 inside the hour the schedule names, over 26 days, since its first run on 2026-10-02. They began 22 minutes after that minute. A run that never happened writes nothing, so a missing run shows here as a run fewer, never as a late one.
- Settling pass, after the catch-up window
- 40 runs, 40 inside the hour the schedule names, over 39 days, since its first run on 2026-09-18. They began 44 minutes after that minute. A run that never happened writes nothing, so a missing run shows here as a run fewer, never as a late one.
- Readings asked of the source
- 23 asked, 1 of which credited a day. A reading that finds the day's work not done yet answers perfectly well and credits nothing, so the second number is smaller than the first on any ordinary morning. A gift already counted today, finished, cancelled or not yet connected is not asked at all, and milestone readings run in their own pass: neither is in either number.
- Refusals the readings met
- NOT_ENOUGH_PROGRESS 18, NOT_STARTED 1. These are the codes the contract and the sources answered with, counted as they came and not translated: "NothingToCredit" is the contract saying the day it was offered was already settled, and a code from a source is that source's own. A morning where nothing was credited is either a quiet morning or a morning of refusals, and this line is what tells the two apart.
- Days held because a reading failed on our side
- 0 held, 0 caught up later, 0 still open.
- Days lost because of us
- 0. This is the measured number. What the code does: a reading that fails for a reason of ours is tried again at 03:30 UTC, and any working reading can still credit the day until its catch-up window closes, 30 hours after the day ends (06:00 UTC). Past that hour the day goes back to the funder, whoever was at fault: the settling pass of 07:00 UTC sends it, and on the second and third versions of the daily contract the next check-in settles it by itself. A failure of ours does not hold a day past its window. Only the owner pausing readings before that hour does, on those two versions and not on the first.
The contracts, as the chain answers now
Read while this page was served, never copied from the repository. Every command below is one you can run with the same public endpoint, and the refusal is a real one: asking for a gift number nobody has created.
The gift contract, for a habit, third version: new gifts are made here, and a day is paid the day it is read
- Where
- 0x591d76863177E70FfcA2C793212d4715A367Ec70
- Owner, right now
- 0xE08D926c148A5065F4Df2892702785a183de86F9
- Paused: new gifts
- no, running
- Paused: readings and openings
- no, running
- Evidence signer, right now
- 0x85702Eaaa6B8694A61a6FbBff2634FCd7E644d9a
A call you can repeat, and what it answered:
cast call 0x591d76863177E70FfcA2C793212d4715A367Ec70 "owner()(address)" --rpc-url https://rpc.monad.xyz0xE08D926c148A5065F4Df2892702785a183de86F9
A refusal you can repeat, in the contract's own words (GiftNotFound()):
cast call 0x591d76863177E70FfcA2C793212d4715A367Ec70 "getGift(uint256)" 999999999 --rpc-url https://rpc.monad.xyzThe gift contract, for a habit, second version: it runs the gifts it holds
- Where
- 0xC83d8028347967Fc84D0e36Ae5876d9b29EAEc51
- Owner, right now
- 0xE08D926c148A5065F4Df2892702785a183de86F9
- Paused: new gifts
- no, running
- Paused: readings and openings
- no, running
- Evidence signer, right now
- 0x85702Eaaa6B8694A61a6FbBff2634FCd7E644d9a
A call you can repeat, and what it answered:
cast call 0xC83d8028347967Fc84D0e36Ae5876d9b29EAEc51 "owner()(address)" --rpc-url https://rpc.monad.xyz0xE08D926c148A5065F4Df2892702785a183de86F9
A refusal you can repeat, in the contract's own words (GiftNotFound()):
cast call 0xC83d8028347967Fc84D0e36Ae5876d9b29EAEc51 "getGift(uint256)" 999999999 --rpc-url https://rpc.monad.xyzThe milestone contract, for one thing reached, second version: new gifts are made here
- Where
- 0x493c87A27E637bBc7179C17bE2B215fC18523CC0
- Owner, right now
- 0xE08D926c148A5065F4Df2892702785a183de86F9
- Paused: new gifts
- no, running
- Paused: readings and openings
- no, running
- Evidence signer, right now
- 0x85702Eaaa6B8694A61a6FbBff2634FCd7E644d9a
A call you can repeat, and what it answered:
cast call 0x493c87A27E637bBc7179C17bE2B215fC18523CC0 "owner()(address)" --rpc-url https://rpc.monad.xyz0xE08D926c148A5065F4Df2892702785a183de86F9
A refusal you can repeat, in the contract's own words (GiftNotFound()):
cast call 0x493c87A27E637bBc7179C17bE2B215fC18523CC0 "getGift(uint256)" 999999999 --rpc-url https://rpc.monad.xyzThe anchor of agreements: it holds no money
- Where
- 0x2a15DF23fF62120700f14D1E5d5d56CA0dAd027e
- Owner, right now
- 0xE08D926c148A5065F4Df2892702785a183de86F9
- The one account that may write a yes or a stop here
- 0x150d3066F615FC012a40E7779dB748D53F7CCFE4
A call you can repeat, and what it answered:
cast call 0x2a15DF23fF62120700f14D1E5d5d56CA0dAd027e "owner()(address)" --rpc-url https://rpc.monad.xyz0xE08D926c148A5065F4Df2892702785a183de86F9
The gift contract, for a habit, first version: it runs the gifts it holds
- Where
- 0x995Ab09d8B20511d057E9E87D00fa1f41fC0e233
- Owner, right now
- 0xE08D926c148A5065F4Df2892702785a183de86F9
- Paused: new gifts
- yes, paused
- Paused: readings
- no, running
- Evidence signer, right now
- 0x85702Eaaa6B8694A61a6FbBff2634FCd7E644d9a
A call you can repeat, and what it answered:
cast call 0x995Ab09d8B20511d057E9E87D00fa1f41fC0e233 "owner()(address)" --rpc-url https://rpc.monad.xyz0xE08D926c148A5065F4Df2892702785a183de86F9
A refusal you can repeat, in the contract's own words (GiftNotFound()):
cast call 0x995Ab09d8B20511d057E9E87D00fa1f41fC0e233 "getGift(uint256)" 999999999 --rpc-url https://rpc.monad.xyzThe earlier gift contract, which still runs the gifts it holds
- Where
- 0xE04CD59bB93765333200a9da01df83149D4C4d67
- Owner, right now
- 0xE08D926c148A5065F4Df2892702785a183de86F9
- Paused: new gifts
- yes, paused
- Paused: readings
- no, running
- Evidence signer, right now
- 0x85702Eaaa6B8694A61a6FbBff2634FCd7E644d9a
A call you can repeat, and what it answered:
cast call 0xE04CD59bB93765333200a9da01df83149D4C4d67 "owner()(address)" --rpc-url https://rpc.monad.xyz0xE08D926c148A5065F4Df2892702785a183de86F9
A refusal you can repeat, in the contract's own words (GiftNotFound()):
cast call 0xE04CD59bB93765333200a9da01df83149D4C4d67 "getGift(uint256)" 999999999 --rpc-url https://rpc.monad.xyzThe milestone contract, for one thing reached, first version: it runs the gifts it holds
- Where
- 0x8dc281Ac8a1c789fdb65a063b9225E98eC522F0e
- Owner, right now
- 0xE08D926c148A5065F4Df2892702785a183de86F9
- Paused: new gifts
- yes, paused
- Paused: readings
- no, running
- Evidence signer, right now
- 0x85702Eaaa6B8694A61a6FbBff2634FCd7E644d9a
A call you can repeat, and what it answered:
cast call 0x8dc281Ac8a1c789fdb65a063b9225E98eC522F0e "owner()(address)" --rpc-url https://rpc.monad.xyz0xE08D926c148A5065F4Df2892702785a183de86F9
A refusal you can repeat, in the contract's own words (GiftNotFound()):
cast call 0x8dc281Ac8a1c789fdb65a063b9225E98eC522F0e "getGift(uint256)" 999999999 --rpc-url https://rpc.monad.xyzWhat the owner of a contract can do, and what it cannot
What the owner of a gift contract of the second version, or of the third daily contract, can do, read from the contract:
- Pause and reopen new gifts.
- Pause readings, which pauses openings too. A pause ends by itself after seven days, and cannot be sent again while it runs nor for seven days after it ended. On the daily contracts, the second version's and the third, it holds every open day: no day is settled as missed from the start of a pause until one catch-up window, 30 hours, after its end. On the milestone contract a window that was open when the pause began keeps afterwards the time it had left, seven days at most, and a climb whose deadline fell inside the pause is judged on a reading taken until the pause ended. So a pause sent across a climb's deadline gives that climb up to seven days more than its funder signed: the owner can lengthen a climb that way, never shorten one.
- Announce a new key for the readings, which stands 24 hours later and not before: the key announced is read above the day it is announced. Add a goal; a goal once added is never changed.
- Hand ownership over, in two steps: the new owner must accept it. Giving ownership up is refused by the contract.
What the owner of a first-version contract can do. No gift is made on them any more: their owner closed new gifts on the three on 2 Oct 2026, and the contract would let that owner reopen them.
- Pause and reopen readings, for as long as it likes. On the milestone contract nothing can be taken back while readings are paused. On the daily contracts a pause stops check-ins only: once a day's catch-up window has passed, the contract lets anybody send that day back to the funder, pause or not.
- Replace the key whose signature the contract accepts for a reading, at once, and register or change what a goal reads.
- Hand ownership over, or renounce it. Renounced while readings are paused, the gifts under way could never settle.
On every one of them, whatever the version:
- Move money: no. No function lets the owner send anything anywhere. What was earned leaves only to the person the gift is for, at their own signed request, and what was not earned goes back to the funder's own address, which they signed when they made the gift. The terms of a gift cannot be changed after it is made.
- What that does not cover, and it is the sharpest thing on this page: a reading counts because our key signed it. Whoever holds that key, and the owner can replace it, could sign a reading that no source ever answered. The published journal is what makes that detectable, because a signed reading with no attestor claim behind it cannot be re-verified by anybody.
The first two gifts, and why this app does not show them
Where they were made, and why this app does not show them
Gifts 1 and 2 were made and opened on viky-two.vercel.app, before viky.cash served the app. An account here is a passkey, and a passkey is bound to the hostname it was created on, for ever and by design: the browser will not offer it to another host, and no server can move it. So that account cannot sign in here, and this app cannot show you its gifts. Nothing was lost and nothing is hidden: everything those gifts did is on the chain, and every figure below is read from it while this page is served.
Gift 1, $20.00 over 7 days
- Days earned
- 1, worth $2.85, of which $2.85 has been taken out by the person the gift is for.
- Days gone back
- 6, worth $17.14 sent back to the funder.
- Days not settled yet
- 0. The gift is finished on the contract. Marked to go back and not sent yet: $0.00, which is what the contract has taken out of the gift for missed days and not yet paid to the funder.
- Where it is held
- 0xe04cd59bb93765333200a9da01df83149d4c4d67
- Each day, as it settled
- 12 September 2026: earned · 13 September 2026: gone back · 14 September 2026: gone back · 15 September 2026: gone back · 16 September 2026: gone back · 17 September 2026: gone back · 18 September 2026: gone back. The transaction that settled each one is at
/api/gift/1/journal.
Gift 2, $1.00 over 7 days
- Days earned
- 1, worth $0.14, of which $0.00 has been taken out by the person the gift is for.
- Days gone back
- 6, worth $0.85 sent back to the funder.
- Days not settled yet
- 0. The gift is finished on the contract. Marked to go back and not sent yet: $0.00, which is what the contract has taken out of the gift for missed days and not yet paid to the funder.
- Where it is held
- 0x995ab09d8b20511d057e9e87d00fa1f41fc0e233
- Each day, as it settled
- 12 September 2026: earned · 13 September 2026: gone back · 14 September 2026: gone back · 15 September 2026: gone back · 16 September 2026: gone back · 17 September 2026: gone back · 18 September 2026: gone back. The transaction that settled each one is at
/api/gift/2/journal.
What this costs us
What this costs us, said plainly: those two gifts can never be read inside the app, on any device, because the passkey that holds them answers only to viky-two.vercel.app. Gifts made here are bound to viky.cash and stay readable here.
The index of the contracts' events
The index runs on Envio's hosted service, on its free Development plan: 750 indexing hours a month. When it does not answer, this page shows the last figures it read, with their block and their date.
What the index is, where it runs, and what it is not
The contracts' events are indexed with Envio HyperIndex, in the repository RedGnad/Viky-index, and read here as this page is served. No movement of money depends on it: it is a second reading of the same events, set beside the chain so that anybody can see whether the two agree. It follows the two gift contracts of each of the first two versions, the earlier gift contract, the daily contract of the third version, the way out and the anchor of agreements.
- Where the index stands
- Block 117,224,139, and the chain's head is 117,224,141: 2 blocks behind. 268 events indexed.
- In all
- 22 gifts created, 17 opened. 5 days earned, 25 gone back, 5 milestones reached. $29.39 earned, $29.25 taken out by the people the gifts were for.
- The anchor of agreements
- 5 accounts have bound an agreement key, 9 yes and 0 stops are written down.
The index beside the token, contract by contract
0xe04cd59bb93765333200a9da01df83149d4c4d67: the index's events add up to $0.00 still held, and the token says it holds $0.00: the same.0x995ab09d8b20511d057e9e87d00fa1f41fc0e233: the index's events add up to $0.142857 still held, and the token says it holds $0.142857: the same.0x8dc281ac8a1c789fdb65a063b9225e98ec522f0e: the index's events add up to $3.41 still held, and the token says it holds $3.41: the same.0xc83d8028347967fc84d0e36ae5876d9b29eaec51: the index's events add up to $0.00 still held, and the token says it holds $0.00: the same.0x591d76863177e70ffca2c793212d4715a367ec70: the index's events add up to $3.00 still held, and the token says it holds $3.00: the same.0x493c87a27e637bbc7179c17be2b215fc18523cc0: the index's events add up to $3.00 still held, and the token says it holds $3.00: the same.What a contract holds is what was put into its gifts, less what was taken out and what was sent back; the token's figure is AUSD's own balanceOf.
Every gift, and the transaction that created it
Gift 1, daily, $20.00, finalised, made 11 Sep 2026: 0x6abe9c0b…9c30Gift 2, daily, $1.00, finalised, made 11 Sep 2026: 0x6ee2303e…ef22Gift 3, daily, $5.00, finalised, made 15 Sep 2026: 0x798d1e69…d612Gift 1000000, milestone, $1.00, expired, made 18 Sep 2026: 0xc4e1e229…7c1dGift 1000001, milestone, $1.00, expired, made 18 Sep 2026: 0x5ede8b52…99daGift 1000002, milestone, $1.00, expired, made 18 Sep 2026: 0xff3b2f17…1954Gift 1000003, milestone, $3.41, claimed, made 28 Sep 2026: 0x70cd997a…7c16Gift 1000004, milestone, $3.01, reached, made 28 Sep 2026: 0xd82aa5c4…acebGift 1000005, milestone, $3.01, reached, made 1 Oct 2026: 0x664d8665…d1f2Gift 4, daily, $16.83, finalised, made 3 Oct 2026: 0x75a21fa5…414bGift 1000, daily, $5.61, ended, made 3 Oct 2026: 0xa6db35d9…de72Gift 1000006, milestone, $8.98, reached, made 5 Oct 2026: 0x7ab33557…0690Gift 1000007, milestone, $3.11, expired, made 5 Oct 2026: 0x3de2ba50…d121Gift 1000008, milestone, $5.02, reached, made 7 Oct 2026: 0x72bda66a…5a7eGift 1000009, milestone, $3.00, claimed, made 9 Oct 2026: 0x2ee6553c…6b5fGift 1000010, milestone, $3.36, cancelled, made 10 Oct 2026: 0x2780a981…f04aGift 1000011, milestone, $3.36, cancelled, made 10 Oct 2026: 0x38fbb1ae…ab69Gift 1000012, milestone, $3.36, reached, made 10 Oct 2026: 0xc1bae1cf…01b2Gift 1000013, milestone, $5.60, cancelled, made 11 Oct 2026: 0x0e127629…90bcGift 1001, daily, $3.00, ended, made 12 Oct 2026: 0xf20e9990…591eGift 1002, daily, $1.12, ended, made 12 Oct 2026: 0x0e3dd098…54a9Gift 1003, daily, $3.00, claimed, made 20 Oct 2026: 0x957088c6…a09a
AUSD, Agora's dollar: who issues it, what a gift costs, how fast it settles
Every gift is held and paid in AUSD (0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a) and in nothing else. AUSD is issued by Agora Bermuda Limited, which Agora's site says is licensed by the Bermuda Monetary Authority (agora.finance, read 2 Oct 2026). Viky is not affiliated with Agora.
Asked of the token as this page is served: transfers are not suspended, signed transfers are not suspended, the account that can replace its code is 0xB8fCC66d613e5f54ee6A425DDbf4a2fDBE4Dedee, and of the 6 contracts that hold gifts none is frozen.
What its issuer can do to a gift
What its issuer can do is in the token's own source, verified on Monad through Sourcify, and in Agora's documentation (Role Based Access Control), both read 2 Oct 2026. A freezer role can freeze an account, which can then neither send nor receive AUSD. A pauser role can suspend every transfer, or the signed transfers alone, which is how a gift is funded and how a send is relayed. A burner role can burn AUSD from an account. The contract's admin can replace its code. None of this is Viky's to prevent. What it would do to a gift: a frozen refund account blocks the return of what was not earned, and with it the cancelling and the ending of that gift, but not the recipient's withdrawal; a frozen recipient cannot take their money out; and a gift contract frozen, or transfers suspended, stops everything in and out of it until Agora lifts it. Nobody else gains by any of these: the money stays where it is.
A plain send, with no gift
From Me, "Spend or withdraw", then "Send to another Viky account of mine": AUSD goes from one account to another in one transaction. The person pastes the other account's code, types the amount and presses Send; their account signs an EIP-3009 authorization, Viky's relayer submits it and pays the network fee, and the AUSD moves from the one account to the other with no contract of Viky's in between (app/api/send/route.ts). The screen names it for the person's own second account; the transaction is the same to any account, and the only codes it refuses are this account's own and Viky's contracts. 4 such sends had been relayed when the fees below were read.
What a gift costs, who pays it, and how fast it settles
- The network, paid by Viky
- On a gift's usual path neither person holds MON or reads a fee: Viky's relayer (0x150d3066F615FC012a40E7779dB748D53F7CCFE4) sends and pays each step. Read from the chain on 2 Oct 2026, 12:11 UTC with
pnpm relayer:fees, as the limit each transaction declared times the price it paid, which is what Monad charges: 120 transactions, 2.196190 MON in all. By step, on average: a gift made, 0.038012 MON (9 sent); a gift opened, 0.013021 MON (8 sent); a day credited on a daily gift, 0.017544 MON (5 sent); a reading sent to a milestone gift, 0.017544 MON (7 sent); a missed day settled, 0.008772 MON (19 sent); what was not earned sent back to its funder, 0.018661 MON (20 sent); what was earned taken out by its recipient, 0.018173 MON (14 sent); a daily gift closed, 0.010965 MON (3 sent); a milestone gift closed at its deadline, 0.010965 MON (2 sent); a plain send from one account to another, 0.013370 MON (4 sent). All of them on the first version of the contracts: no gift had run on the second when this was read. - Three steps a person's own account sends
- Taking back a gift nobody has opened: the contract asks for the funder in person, so the relayer sends that account what its transaction costs, and the account sends it.Paying by card through Mercuryo: it delivers MON, which the funder's account changes for AUSD in a transaction it sends and pays for.A payout onto a card: the account's dollars are changed for MON, which the account sends to the card service itself, and what that cost is said in dollars afterwards.
- The same, in dollars
- At the price of MON on CoinGecko, $0.0337 at 2 Oct 2026, 12:10 UTC: a credited day costs Viky 0.017544 MON, about $0.0006; a missed day, settled and sent back, 0.027433 MON, about $0.0009; and a seven-day gift whose every day is credited, from its making to its closing (made, opened, seven days, one withdrawal, closed), 0.202979 MON, about $0.0068.
- The card service, paid by the funder
- Rampnow keeps 7 % plus 0.40 EUR with a minimum of 1.00 EUR (Rampnow's own quotes, read 1 Oct 2026).Ramp keeps up to 3.9 % with a minimum of 2.49 EUR (Ramp's own asset list, read 1 Oct 2026).Mercuryo keeps 3.8 % (Mercuryo's own limits and currencies, read 20 Sep 2026).That is the service's own fee, taken on its own page. Viky adds nothing to it.
- What Viky takes
- Nothing today. The gift contracts take no fee, in any version: every unit a funder puts into a gift goes to its recipient or back to its funder, and no function sends AUSD anywhere else. Viky pays the network fees above from its own account.
- How long a settlement takes
- A block every 0.302 s, measured over 10,000 blocks (109,877,824 to 109,887,824) on 2 Oct 2026; in 20 readings that day the block the public RPC calls final trailed the latest by 1 or 2 blocks. Viky says a step is done once the node reports its block final (
src/monad/chain.ts): on the network that is one or two blocks after the block that carries the step, under a second at that pace. What the person waits also includes Viky's server and their own connection, which is not measured here.
Agora's Instant Settlement: a fixed price, walked on Monad testnet
- Through a market, on mainnet
- Measured once with real amounts, on 3 Oct 2026: a card payment of 7.927876 USDC came back as 7.914524 AUSD, 0.168 % less (0x533e…1616). The contract is ExitRouter set on USDC, and the exchange it calls has a price that moves: it refuses, with nothing taken, when less than the floor the person signed would come back.
- Through Agora's pair, on testnet
- On 8 Oct 2026, on Monad testnet, the same ExitRouter set on Agora's test AUSD (0xE231C0310C4C6910f1D3A349c803AA94cdc18e3F) sent 10.00 test AUSD through Agora's Instant Settlement pair and handed back 10.00 CTK, the pair's other test coin: one for one, nothing taken (0x854e…b95c). One signature, from an account that holds none of the chain's coin, as on mainnet. The copy's code is the code of the way out on mainnet (0x8a1790DfD10CF1599bDaeD5eC8BB46B2A6eB6223) byte for byte, but for the coin's address, its source is in the explorer's registry as an exact match, and
pnpm agora:testnet checkreads all of it back with no key. It is the way out and not the conversion above: the pair's other test coin takes no signed transfer, so only the direction that starts from AUSD has a path there. - Why not on mainnet
- Agora opens this contract only to users it has verified (Instant Settlement, read 8 Oct 2026): on mainnet the pair swaps only for an address Agora approved, and none of Viky's is. On testnet a contract of Agora's gives that approval to any address, which is how the run above was made. No money of a gift has gone through Instant Settlement: every conversion on mainnet takes the market path above.
Mera: from a link to a first transaction, and one passkey with two keys
From the link to the first transaction
A person receives a gift's link and has no account. 2 gestures take them to their first transaction, the opening of the gift: 1. Press Open my gift. 2. Answer the device's passkey prompt, a face or a fingerprint. No field to fill, no password, no code to copy and nothing to install; they hold no MON, the relayer sends the opening for them. On the second version of the contracts the opening is signed in the browser by the key the link carries, with no gesture more.
The seconds, and what they are
Counted and timed on 8 Oct 2026 by the capture tool (test/browser/arrival-measure.spec.ts), at 390 by 844, 3 runs: 0.9 s, 0.7 s, 0.9 s in all. The slowest, moment by moment: 0.3 s for the link to show the gift, 0.6 s from the press to the account made, and the gift opened within the same tenth of a second, with no second press. What those seconds are, exactly: the screens of a production build served on the measuring machine, with a virtual passkey that answers at once and the gift's answers stood in. So neither a person's own time nor Monad's is in them: on Monad the opening is one relayed transaction, final one or two blocks after the block that carries it (the AUSD section above). Not measured: a real phone on a real network.
One passkey, two keys
One prompt asks the passkey's PRF for two salts. The first makes the account's key, which signs everything that moves money. The second, sha256("viky:consent:v1"), makes an Ed25519 key that signs the recipient's yes to what a gift reads of them, and their stop, and nothing else: it cannot move money, and the six gestures at the head of this page show it is the same on every device that holds the passkey.
Where the key is tied on Monad, and what the anchor is not
Where that key is tied to the account on Monad: the anchor of agreements, 0x2a15DF23fF62120700f14D1E5d5d56CA0dAd027e. The account itself signs the tie, once (EIP-712 ConsentKey), and the contract keeps the first one for ever: nobody else can name a key for an account, and nobody can replace one (event ConsentKeyBound). Each yes and each stop is then written there in order, with the key's signature and the digest of the text signed (event ConsentAnchored). As this page is served the index counts 5 keys bound, 9 yes and 0 stops written down.
What the anchor is, and what it is not. It is a public record, written after the fact by Viky's relayer, the one account allowed to write entries. It is not what a reading is decided on: that is still the signed row in Viky's database, which applies at once, a stop above all. An entry that could not be written is tried again each time the gift is asked whether it may be read, a yes and a stop alike; a yes or a stop signed while the anchor could not be read carries no signature for it and is never written there. So the anchor does not prevent a reading without a yes: it lets anybody see one.
The command reads, for every gift of the second version and of the third daily contract, the key the account bound and every yes and stop anchored, checks each Ed25519 signature itself, and checks that every reading that moved money came after a yes and before any stop:
pnpm verify:consentHow money comes in
A funder pays by card, through a card service, never to Viky. The pay sheet tries them in this order: Rampnow, then Ramp, then Mercuryo. Rampnow comes first where it serves the payer's country and takes the gift's amount; where it does not, the sheet goes on to the next.
Rampnow, by card
The first way is Rampnow, by card: the funder pays on Rampnow's page, which delivers USDC on Monad to their account, and the converter changes it into AUSD on one signature, though the account holds none of the chain's coin. The converter is a second copy of the way out's contract, ExitRouter, set on USDC at 0xf05449c8b868Ce1e6a0D7223e2ceCbbfD1498F9c, its source verified through Sourcify on 3 Oct 2026, and its owner read with the others' under Network. A conversion promises at least ninety-nine for a hundred, or nothing moves. Its page is opened in euros for a funder who reads Viky in euros, and in dollars for every other. Rampnow's own quote is not asked on this deployment: no partner key of Rampnow's is set. The amount is then worked out by a rule, not by Rampnow: it keeps 7 % plus 0.40 EUR, never under 1.00 EUR, and takes no card payment under 5 EUR, read on its page without paying on 1 Oct 2026 in euros and on 9 Oct 2026 in dollars, where those figures are said in dollars at the day's rate. Rampnow's page opens in a frame inside Viky. Its limit: Rampnow finishes a payment from its own page (the card buys USDC on Base, and its page then sends it on to Monad), so the frame has to stay open until the money arrives. The frame has no cross: one way out under it while no payment is known, "Go back without paying", and one after five minutes without the money. Left before the end, the payment waits at Rampnow: for a day, on the device that paid, the screen that waits leads back to it, and opens another only when the person answers that they did not pay. Seen on the first payment through the frame, on 3 Oct 2026: 6 EUR paid at 21:23 UTC, the frame closed, the money held on Base for 14 minutes, then 5.60 USDC on the account at 21:38 UTC, once Rampnow's page was opened in a tab. Where the frame cannot keep the person signed in at Rampnow, it is never shown: "Pay by card" opens Rampnow's page in a tab of its own, and the payment is followed as one started from a tab. That is Safari's engine before 18.4 and from 18.5 to 26.1, so every browser on an iPhone at those versions: Rampnow's session in a frame lives in cookies set "Partitioned", which that engine reads in 18.4 and from 26.2. Measured on Safari 17.6 on 4 Oct 2026, on a neutral page holding the same frame: after the code received by e-mail, Rampnow's page went back to its sign-in form. It is read from what the browser says of itself; it was not measured on viky.cash in Safari, nor on the versions in between. Open. Used 3 times. The first conversion was sent on 3 Oct 2026, 09:47 UTC: $7.92 of USDC, for at least $7.91 of AUSD. The conversion: 0x533ec074…1616.
Ramp, by card or bank transfer
After Rampnow, the way is Ramp: a funder pays by card or bank transfer on Ramp's own page, not Viky's. Ramp Swaps (Ireland) Limited is an authorised crypto-asset service provider under MiCA, regulated by the Central Bank of Ireland (Ramp's licences and registrations, read 27 Sep 2026). What arrives in the funder's account is AUSD on Monad, MONAD_AUSD in Ramp's own asset list, the asset the gift contract holds, so nothing is swapped after it. Open. No first use is recorded for it. Where Ramp does not serve, the last way is Mercuryo, which delivers MON that the account then swaps to AUSD. Open. No first use is recorded for it.
The next step is Ramp embedded with a partner key. Without one, Ramp's page answers any pre-filled parameter with "Integration issue detected" (read on its live page and in its own script, 27 Sep 2026), so today it opens bare and the funder copies their account from Viky's waiting screen. With the key, the page opens with the account, the amount in euros and AUSD already filled in. The key is not set on this deployment yet.
How money goes out
- Your bank, through Ramp. No setting: it is offered wherever Ramp pays a bank account in the person's country. The account's dollars are changed for USDC on Monad on one signature, and Ramp buys them. Open. Used once. The first exchange was sent on 16 Sep 2026, 15:40 UTC: $10.00 changed, for at least $9.99 of USDC. $9.99 of USDC were sent on to Ramp on 16 Sep 2026, 21:41 UTC. Ramp reports the payout completed. The exchange: 0x7599b203…f3ae. The USDC sent to Ramp: 0xd9f9d8e8…fe52.
- Your card, through Mercuryo. No setting: it is offered wherever Mercuryo pays onto a card in the person's country. The account's dollars are changed for MON on Monad on one signature, and Mercuryo buys them. Open. Nobody has used it yet.
- Mobile money, through Switch Labs. One setting,
MOBILE_MONEY_OUT, opens and closes it. Open. Nobody has used it yet. - A phone top-up or a gift card, through Bitrefill: what it is, its limits and how often each was delivered are under "Risks and holes", below.
How a day is read
A day is read from the source's own servers through Reclaim's attested fetch, and each reading is counted against a month's allowance. 75 readings are left until 1 Nov 2026, when the count starts again.
A daily gift made today: a day is paid the day it is read
On the third daily contract, where a daily gift is made now, a day is paid the day it is read. The first day is the day the account is connected. The gift's page looks at the public profile as it opens, a pass looks every hour, and an attested read is taken only for a lesson a look saw. A reading pays the oldest open day first, and never a day that has not begun. A lesson taken after the day was paid is counted by the first reading of the next day; taken before, it is not kept. So one lesson never pays two days, no more days are paid than lessons were taken, and a day can be paid on which no lesson was taken: the one after a day with a second lesson that came after that day's pay. A gift made on the second version stays there, under the rule the next paragraph says.
Duolingo, read in public mode
Duolingo runs in public mode: once a day, Viky's keeper looks at the recipient's public profile plainly, and when that look shows a day the contract can credit, reads it through an attested fetch (Reclaim zkFetch through Reclaim's TEE client). The look is never evidence: it is not signed and not sent, and it can only spare a reading the contract would refuse (src/daily-look.ts). The attestor signs Duolingo's response; Viky verifies that signature, pins the attestor's address (the one in src/reclaim-proof-set.ts) and checks the proof is about the right URL and username; the evidence signer then turns the signed reading into an EIP-712 check-in, and the contract credits or refuses it. What is not verified: the attestor's own TEE attestation, which zk-fetch 1.1.0 does not put in the proof. The person signs in to nothing and installs nothing. The account is tied to the gift once: by the funder naming it, which proves nothing about whose it is, or, when the recipient names it themselves, by a short code they place in their Duolingo display name.
Hardened on 18 Sep 2026: one course, and the account as Duolingo names it
Hardened on 18 Sep 2026, from Duolingo's own public profile (U1): a gift can be counted on one course rather than on the experience total. The funder picks the course from that profile's own courses, the daily reading is anchored on that course's id, and experience won in another course is not in the reading at all. Measured that day over 19 public profiles and 74 courses: every course carries its id, its title and its experience, and the sum of the courses is exactly the total the profile prints. A course gift is its own goal on the contract (goal 5, provider id keccak256("viky:provider:duolingo-course-zkfetch:v1"), registered in 0xcaadaca7…8a69) and its identity is the person and the course together, pinned by the contract at the first reading. So a reading of another course, or of the whole profile, cannot settle it, and gifts made before this keep counting the total exactly as they did. What this does not cover: a gift whose funder did not name the account has no course to choose from, so it counts the whole profile; and the course a gift counts is recorded by Viky, like the account name, not signed into the terms on the chain.
What a reading costs, and the ceilings Viky holds itself to
What a reading costs, written here on purpose: each attested read is paid on Reclaim's side (their public price starts at $0.10 per verification). Reads are counted per gift, never per person: the morning pass looks at each daily gift once, takes an attested read only for one whose look shows a day to credit, and skips one already counted that day, so two gifts on one Duolingo account are two reads on a morning both earned a day. A look that failed takes no read: on the first two versions of the daily contract the gift is looked at again at 03:30 UTC, and only then, if a day of it closes at 06:00 that morning, is one read taken without a look, once. On the third contract, where a daily gift is made today, that read is taken by the hourly pass, in the last 65 minutes before 06:00 UTC, once. And a breaker holds every paid read (src/attested-calls.ts): 4 for one gift in a UTC day and 25 for all gifts, counted on the proofs given. Past it nothing is asked of Reclaim until the next day, and the gift's page says when reading resumes and until when its open day can still be counted. The ceiling holds no day: a day not read stays open until its catch-up window closes, 30 hours after it ends, and then goes back to the funder like a missed day, whoever was at fault. A certificate's link is looked at plainly before its proof, and a climb at its target is given three proofs a day at most. Connecting the account is one more, and a connection by code takes it only once a plain look has found the code in the name; a count the person asks for looks first in the same way. No daily ceiling bounds those asks, only ten in ten minutes from one IP address, counted in each app server's memory. A gift on Fitbit is asked plainly first, with the person's key, and no proof is taken from a source that refuses or does not answer; that look does not judge the day, so it is read attested each morning that has a day to credit, earned or not. Strava is read the same way, once it is opened on request. A climb is looked at plainly, not through Reclaim, every hour by the pass a scheduler calls, in both of the day's passes and at each ask, and read attested only to connect the account or when that look does not show it below its target. Private sources keep the user-proof path through the Reclaim verifier app.
The count of the month, and what was spent
The month's count, kept here because Reclaim's dashboard shows no count of the fetches: its free tier allows up to 100 attested fetches and 25 verifications a month, and gives more on request only. Cycle from 1 Oct 2026 to 1 Nov 2026. Readings: 25 of 100 (attested fetches that gave a proof; 31 were started). Proofs shown by people: 5 of 25 (15 asked, 3 verified). A cycle runs from the 1st of a month to the 1st of the next, as Reclaim's dashboard shows it for the account that holds Viky's two applications. The limit Viky holds itself to goes by the readings that gave a proof and by the proofs that came back, not by what was started or asked: what Reclaim counts is not published, and in September's cycle readings went on giving their proof after the hundredth fetch was started, with no refusal for a quota: 98 proofs given that we know of, for at least 156 fetches started. Of this cycle's fetches, 5 were started before the journal began and each gave a proof, counted on 3 Oct 2026 from the reading service's logs: two on 1 Oct, two on 2 Oct, one on 3 Oct. 15 more were asked on 12 Oct 2026 from the author's machine, outside the journal and counted here: one attested read, without a gift, of each public source that had never passed a real one, and one of a race run the day before, the Chicago Marathon. 14 gave a proof, and one met a redirect. 75 readings are left until 1 Nov 2026, when the count starts again. A fault of ours, found and corrected, in September's cycle: on 30 Sep 2026 the ratings of one Chess.com gift answered 404, and the pass of every five minutes took a new proof of the profile at each round, 114 fetches in five hours and 57 proofs lost. Corrected on 3 Oct 2026: a proof is claimed before it is paid for and a day has its ceilings, so the same fault now costs 4 proofs in a day at most. Since 3 Oct 2026 every fetch is written down as it leaves, proof or not, and a proof is claimed before it is paid for: for one gift, once in 6 hours after a look that failed or showed no rating, once an hour in the gift's last day, and every 4 minutes at the target until one settles it. The operator is told by email when 15, 10, 5 and none are left of an allowance, the last with the days then waiting for a reading, and each morning of the judging (from 14 Oct 2026 to 3 Nov 2026) with what the day before spent, by gift and by reason. What is not closed: a gift on Fitbit takes a proof for a day that was not earned, a proof whose sending failed is taken again at the next reading, what a person shows has no ceiling of its own for a gift, and a reading asked from a developer's machine reaches the same Reclaim application without being written in this journal.
Risks and holes, written as they are
The sources' terms 16
What each source's terms say, quoted, and what Viky reads from it.
Duolingo's terms
University portals' terms
The world's universities, a provider per sense
Exam results services' terms
Google Health's terms, and the one risk
src/gift-end-erasure.ts); the journal of the days and the signed yes and stop are kept. The risk: the funder's daily yes or no is itself one bit about the person given to a third party, under the consent they gave. The client is published in production, so a connection does not lapse each week; past a hundred people, Google's app verification and its third party security review (CASA) apply.Strava: on request, and no real account read yet
edX's terms
Accredible's record
CHSI's terms
MITx Online's terms
Breizh Chrono's terms
MikaTiming's results sites
robots.txt tells every robot to stay out (Disallow: /), and they answer 403 to a bare user agent. Viky reads one runner's page per gift, at the person's own request, naming itself and its site in its user agent (Viky/1.0; +https://viky.cash), and keeps three fields, written here with the risk assumed as for edX. Open since goal 31 was signed on 26 Sep 2026.The WCA's public API
robots.txt keeps robots out of its search only. The API answers 403 to a bare user agent; Viky names itself and its site, as for MikaTiming. Open since goal 32 was signed on 26 Sep 2026.Codeforces' public API
codeforces.com/api/user.info, anonymous public data, one request every two seconds (the API help, read 26 Sep 2026): the handle, the rating and the best rating ever, and once, when the person binds the account with Viky's code, the last name of their profile. Its terms forbid commercial use of the site's material and any use that harms it or impacts access; Viky looks at one account's line every hour while a gift is climbing on it, in the day's two passes, and once a minute while that gift's page is open, for an account its holder bound with Viky's code, naming itself. An attested reading asks for the same line once more: when the account is bound, when the climb starts, at the target, and after a look that failed. Codeforces polices itself: plagiarism is punished with a rating rollback and a round that fails is made unrated. Open since goal 33 was signed on 26 Sep 2026.race result's lists
robots.txt keeps robots out of the list endpoint. Viky reads one row per gift, at the person's request, naming itself, the risk assumed as for MikaTiming. Open since goal 34 was signed on 26 Sep 2026.An incident, 26 Sep 2026: bursts are punished
What a proof is worth 5
What a reading proves, and what it cannot.
Providers read through a witness, no enclave
- Université de Toulouse (Paul Sabatier), France, enrolment: witness signature, no enclave; utoulouse.fr,univ-tlse3.fr; pinned: version 5.0.0 reads POST mondossierweb.univ-tlse3.fr/UIDL/ and keeps of the answer what matches ""tr",\{"key":\d+\},"(?<academicYear>2026\\/2027)","[^"]+""; Viky counts it when academicYear matches "^2026\\/2027$".
- Université de Toulouse (Paul Sabatier), France, results: witness signature, no enclave; utoulouse.fr,univ-tlse3.fr; first proof awaited.
What the number read is worth to anybody else
Coursera
The homonym
The milestone, two limits
Viky's own keys and steps 3
What our keys can do, and what happens when a step fails. The audit named here was made by sessions of the AI tool Viky was built with, reading the code.
The relayer's one key, found by the audit of 27 Sep 2026
A step whose confirmation runs out, found by the same audit
Our own key
The ways out 4
What Viky can say of money that left, and each way's ceiling.
A gift card or top-up whose invoice lapses, found by the same audit
The way out
Mobile money
The Bitrefill way out
A milestone: a Chess.com rating
A gift for one thing reached rather than a habit, held by a contract of its own. A Chess.com rating is the one read here.
What the milestone contract holds, and when it pays
MilestoneGift holds a gift for one thing rather than a habit: the whole amount becomes the recipient's the first time an attested reading shows the rating reached, or all of it goes back when the time runs out. Contract 0x8dc281Ac8a1c789fdb65a063b9225E98eC522F0e, source verified through Sourcify (match 1855380), deployed in 0x12d91b784d5abcb14ed7941c6de60b3eeb73fc978209653dbdd5c6fb9f7806e1. Owned by the same Safe as the other contracts, two signatures of three, read from the chain at the head of this page and in the contracts section. Gift numbers start at 1,000,000, so no number can mean a daily gift and a milestone gift at once. This is the first version, where the first real milestone gifts ran: it takes no new gift since 2 Oct 2026. A milestone gift made today is on the second version, 0x493c87A27E637bBc7179C17bE2B215fC18523CC0, which keeps the rule below and continues the numbers.
The rule it rests on, and its goals
The rule it rests on: the funder signs the target and the highest start they pay a climb from; the first reading is recorded as the start whatever it says, so a recipient cannot retry until a reading suits them, and a start above what the funder accepted can never pay. Each cadence is its own goal with its own provider id, so a blitz rating can never settle a rapid gift:
- goal 1, rapid: 0x56c9a42f353c58f8ef74b979c6a74fa6144562aed8f7fe5cf93c9cbeeef93b40
- goal 2, blitz: 0xc57bd1392946f1743380ebedbe6561e03e5a6e8bdaa6af8879b89caa5dc3fd36
- goal 3, bullet: 0x2b19a55b3e63943851b302dd0601451792be3cb97fadfa8047cb876900084330
- goal 4, daily: 0xb55b5e37e9fa879c5bc5adbffa5ca98372cc00d8fe21279e827cf9c94d3706e3
How a reading is made
How a reading is made: two attested reads through Reclaim zkFetch and Reclaim's TEE client, api.chess.com/pub/player/<name> for the player id (the identity a gift is bound to, which survives a change of name) and /stats for the cadence's rating. Viky verifies the attestor's signature, pins its address, and checks each proof is about exactly that page and exactly those patterns; the evidence signer then signs an EIP-712 Proof under the domain "Viky Milestone", and the contract accepts or refuses it. The funder names the Chess.com account when they offer the gift, and that naming is the whole tie: no code is asked, so whoever opens the link is paid when that account gets there. Only an account the recipient names themselves is asked for a one-hour code in the profile's name, which the first reading reads.
What the owner of this contract can do, and what it cannot
What the owner of this first-version contract can do, and what it cannot, read from the contract (the second version bounds its owner further: the contracts section says how):
- Pause and reopen new gifts, and pause and reopen readings. While readings are paused nothing can be taken back, and every window a pause ran across (the grace after a deadline, the wait for a first reading) counts again from the moment readings reopen.
- Replace the evidence signer, and register a goal or change the provider id its readings must carry, which applies to gifts already made on that goal.
- Hand the ownership over, or renounce it; renounced while readings are paused, the gifts under way could never settle.
- Move money: no. No function lets the owner send AUSD anywhere. Money leaves only to a gift's recipient, from what was earned and at their signed request, or to the refund address the funder signed, from what was not earned. The terms a funder signed cannot be changed.
- What that does not cover: the evidence signer attests who opened a gift and what a reading said, so whoever holds its key, which the owner can replace, could open a gift nobody has opened yet and attest a reading for it.
What was hardened against cheating
What was hardened against cheating, with the source read and the day it was read:
- 18 Sep 2026, Chess.com's published data API and its Fair Play policy: an account Chess.com has closed can neither be connected to a gift nor reach a target, and the whole amount goes back to the funder at the deadline, exactly as for a target not reached. The standing is on the same public profile, in the documented field "status" (closed, closed:fair_play_violations, basic, premium, mod, staff), and the policy says Chess.com "may close your account and label it publicly closed for Fair Play violations". It is read on every reading, plain and attested. Measured that day on four accounts: one premium, one staff, one basic, one closed. A profile whose status cannot be read is a reading that failed on our side: nothing is paid and nothing is taken back that day.
Whom a settlement trusts
Whom a settlement trusts, exactly: each reading is a claim signed by Reclaim's attestor (0x244897572368Eadf65bfBc5aec98D8e5443a9072), whose TEE mode Reclaim labels beta, and Viky's own evidence signer then signs it as an EIP-712 Proof the contract accepts. We trust those two keys, and we say so: Reclaim writes that a third party must trust that the attestor did not collude with the user.
What is not proven
What is not proven, written as it is:
- The attestor's own TEE attestation is not in the proof zk-fetch returns, so it is not verified; its signature and address are.
- The evidence signer is a key Viky holds. The contract trusts its signature, and anyone holding that key could sign a reading.
- The contract judges when a reading was taken, not when the rated game was played. Viky looks at each climb every hour, when an outside scheduler calls its pass, and the recipient can ask for a reading at any time; a rating reached and then lost again between two readings, or reached in the last hours and first read after the deadline, does not pay.
- Below the target, a day's reading is a plain read of the public page and carries no proof, because the contract refuses a reading short of the target and records nothing. Only a reading at or past the target is attested and sent.
- Where the person stood when the funder chose is a plain read too: it sets what the funder signs, with their own eyes, and moves nothing.
- A gift whose target was already reached when the recipient connected pays nothing: the first reading is the start, a start at or past the target can never settle, and the whole amount goes back at the deadline. The screens say so before and after; nobody else keeps any of it.
- The climb is measured from the rating on the day the funder paid, read again just before the money moves. A rating that happened to be low that day, after a bad session, makes the climb easier than it looks, and nothing here corrects for that.
- Chess.com publishes no rule for what its name field accepts; the code is six letters so that any name field takes it.
Your account on this device
Not signed in. Create or open an account on the home page, then come back through Me, For judges.
TOEFL is a registered trademark of ETS. This product is not endorsed or approved by ETS.