A public weekly cadence on Arcron TestNet. If keepers show up, the counter ticks.
LIVE on Arcron TestNet. Unaudited. No MainNet path. This repo will refuse one. Do not send mainnet funds at this contract.
| live | |
|---|---|
| App | 770734249 |
| Keeper | 769891898 |
| Upkeep | 110 |
| Interval | 224000 rounds (~1 week at measured TestNet round time) |
| Policy | SKIP_AHEAD |
| Next tick | round 67054248 |
| Fee | 4000 µALGO / tick |
| Escrow | 500000 µALGO (0.5 ALGO) |
| Ticks so far | 0 |
| Creator | CEPY52VZRWFLQCJZXQRVQFOPMNAD6M4HCDP4XWKVFXRONJTC6KJVWRCXJI |
Status board: https://corvid-agent.github.io/plod/ (CRT flaps plus remaining-rounds / escrow / weekly-timeline graphs)
Read-only snapshot as of round 66992603 (2026-09-05T00:43:15Z UTC): docs/snapshot.json. Refresh with python3 scripts/refresh_snapshot.py (no key). The CRT prefers live algod/indexer and falls back to that file. CRT graphs paint appending TestNet samples from docs/history.json via in-page sql.js (filtered to app 770734249 / upkeep 110).
Sibling flight board: arrivals.
Plod is a small ARC-4 Algorand Python (Puya) app. Global state is three
numbers a keeper can move:
| key | meaning |
|---|---|
calls |
how many times tick has succeeded |
last_round |
Global.round of the last successful tick |
last_caller |
inner-call sender of that tick |
keeper_app |
Arcron keeper app id, set once by the creator |
The Arcron hook is tick(), zero arguments. Arcron execute() inner-calls
the target; the inner sender is Application(keeper_app).address, and that is
what tick authorizes. It does not compare against itob(keeper_app.id).
The keeper is named with set_keeper(app) after create — an explicit admin
method, not a create arg. A sloppy deploy.py that mapped every uint64
create-arg onto keeper app 769891898 would freeze a "weekly" interval at
about 68 years. This contract takes no uint64 create args so that cannot
happen here.
On TestNet as of 2026-08-30 (#1, #2):
- Keeper: Arcron TestNet app
769891898 - Upkeep:
110 - Hook:
tick()(selector only) - Interval: 224000 rounds at measured ~2.7 s/round
- Fee: 4000 µALGO, escrow 0.5 ALGO, policy SKIP_AHEAD
- First tick due round 67054248
- Contract
callsis still 0
That round count was chosen at register time against measured round time, not compiled into the app.
The Pages board reads only box u || itob(110) on the keeper plus this
app's global calls. It paints ON TIME / LATE / GROUNDED
(#3). It does not walk the
rest of the keeper's boxes.
No mnemonic belongs in this repo, in a workflow, or in docs/deploy.json.
The creator of record deployed from a machine that already had the TestNet
bank. Zero create-args. Then set_keeper(769891898), then Arcron register
for weekly tick(). Ids live in docs/deploy.json. Do not re-create.
Sketch, AlgoKit / Puya, TestNet only — kept so nobody "helps" by passing the keeper id as a create arg:
# compile
algokit compile python smart_contracts/plod/contract.py
# create with ZERO args — do not pass 769891898, an interval, or anything else
# sign with a key that lives in the OS keychain / AlgoKit wallet / env var
# that is NOT committed. `algokit goal account export` if you must; never
# paste a 25-word phrase into a file in this tree.
# then, still as creator:
# set_keeper(Application(769891898))
# write the resulting app id into docs/deploy.json (appId, still "testnet")
# register the upkeep on Arcron 769891898 with tick() and a weekly intervalUse the TestNet dispenser for fees. If a deploy script grows a create_args
list, keep it empty. The weekly cadence is an Arcron register field, not a
Puya constructor argument.
smart_contracts/plod/contract.py ARC-4 target
scripts/refresh_snapshot.py read-only TestNet snapshot refresh
docs/index.html CRT board + escrow/countdown graphs
docs/app.js live reader + sql.js history graphs (upkeep 110)
docs/style.css
docs/deploy.json live TestNet ids (app 770734249)
docs/snapshot.json last successful read-only probe
docs/history.json appending TestNet probe samples for graphs
.github/workflows/pages.yml publishes docs/ from main
MIT. See LICENSE.