Skip to content

Commit beb978f

Browse files
authored
Add scheduled actions reference doc + CLAUDE.md sync rule (#2940)
1 parent 9209009 commit beb978f

3 files changed

Lines changed: 108 additions & 0 deletions

File tree

CLAUDE.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ Key strategies: Aave, Compound, Convex/Curve, Balancer, Morpho, Native Staking (
127127

128128
Bundle with: `pnpm rollup -c ./scripts/defender-actions/rollup.config.cjs`
129129

130+
**Scheduled actions (Talos):** distinct from the Defender scripts above — the Talos runner's cron/manual actions live in `contracts/tasks/actions/*.ts`, are scheduled in `contracts/migrations/seed_schedules.sql`, and are catalogued in `contracts/docs/ACTIONS.md`. Update that doc in the same change whenever a scheduled action is added, removed, or its behaviour changes.
131+
130132
### Cross-Chain
131133
- CCTP (Circle) for USDC bridging
132134
- Network-specific bridge contracts in `contracts/bridges/`

contracts/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,8 @@ The hardhat action tasks under `contracts/tasks/actions/` are driven in producti
303303
- **`contracts/migrations/seed_schedules.sql`** seeds the `schedules` table, mirroring the old `contracts/cron/cron-jobs.ts`.
304304
- **`contracts/tasks/lib/action.ts`** wraps the hardhat signer with `wrapSignerWithNonceQueueV5` from the library when `DATABASE_URL` is set. That routes `signer.sendTransaction` through Postgres row-locked nonce coordination across concurrent runs.
305305

306+
Every scheduled action — its cadence and one-line purpose — is catalogued in [`docs/ACTIONS.md`](docs/ACTIONS.md).
307+
306308
Every action remains directly executable as a hardhat task on your dev machine — nothing about the local workflow changed:
307309

308310
```

contracts/docs/ACTIONS.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# Talos scheduled actions
2+
3+
Hardhat tasks the Talos runner (`contracts/runner.ts``@talos/client`) runs on
4+
a cron schedule, or on demand via the "Run now" button in the Talos admin UI.
5+
Each action is defined in [`tasks/actions/<name>.ts`](../tasks/actions); the
6+
canonical schedule — cron, enabled state, and per-row operational notes — lives
7+
in [`migrations/seed_schedules.sql`](../migrations/seed_schedules.sql). See
8+
[Automated Actions (Talos)](../README.md#automated-actions-talos) for how the
9+
runner works.
10+
11+
> **Keep in sync** (see [`CLAUDE.md`](../../CLAUDE.md)): update this file whenever
12+
> a scheduled action is added, removed, or its behaviour changes.
13+
14+
Cron times are UTC. Enable state and operational caveats (e.g. "do not enable",
15+
`permissioned`) are managed in `seed_schedules.sql`, not here.
16+
17+
## OToken rebases
18+
19+
| Action | Network | Cron | Description |
20+
| ---------------------- | ------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
21+
| `otokenOusdRebase` | mainnet | `45 11,23 * * *` | Rebase OUSD on mainnet |
22+
| `otokenOethRebase` | mainnet | `45 11,23 * * *` | Collect the OETH dripper and rebase OETH on mainnet |
23+
| `otokenOusdOethRebase` | mainnet | `45 11,23 * * *` | Collect OETH and rebase OUSD on mainnet |
24+
| `otokenOsRebase` | sonic | `45 11,23 * * *` | Collect the OS dripper and rebase OS on Sonic |
25+
| `otokenOethbRebase` | base | `25 9,21 * * *` | Rebase the OETHb vault on Base |
26+
| `permissionedRebase` | mainnet | `15 10,22 * * *` | Collect fixed-rate drippers, then `permissionedRebase()` every managed vault via the Safe module (unpause → rebase → re-pause atomically) |
27+
| `permissionedRebase` | base | `15 10,22 * * *` | As above, on Base |
28+
| `permissionedRebase` | sonic | `15 10,22 * * *` | As above, on Sonic |
29+
30+
## OToken operations
31+
32+
| Action | Network | Cron | Description |
33+
| ----------------------------------- | ------- | ---------------- | ----------------------------------------------------------------------- |
34+
| `otokenOsCollectAndRelease` | sonic | `55 23 * * *` | Rebase the OS vault and harvest on Sonic |
35+
| `otokenOusdAutoWithdrawal` | mainnet | `35 11,23 * * *` | Auto-process OUSD withdrawals via the AutoWithdrawalModule |
36+
| `otokenAddWithdrawalQueueLiquidity` | mainnet | `20 0 * * *` | Call `addWithdrawalQueueLiquidity` on every OToken vault on the network |
37+
| `otokenAddWithdrawalQueueLiquidity` | base | `30 0 * * *` | As above, on Base |
38+
| `otokenAddWithdrawalQueueLiquidity` | sonic | `35 0 * * *` | As above, on Sonic |
39+
| `otokenAddWithdrawalQueueLiquidity` | plume | `25 0 * * *` | As above, on Plume |
40+
| `otokenOethbUpdateWoethPrice` | base | `30 21 * * *` | Update the wOETH oracle price on the Base BridgedWOETHStrategy |
41+
| `otokenOethbHarvest` | base | `55 11 * * *` | Harvest strategies on Base OETHb |
42+
| `otokenOsSonicRestakeRewards` | sonic | `52 22 * * *` | Restake rewards for Sonic validators |
43+
44+
## Native staking (Ethereum validators)
45+
46+
| Action | Network | Cron | Description |
47+
| -------------------------- | ------- | ---------------- | --------------------------------------------------------------------------------------------------- |
48+
| `harvest` | mainnet | `25 11,23 * * *` | Harvest and swap rewards from native staking strategies |
49+
| `doAccounting` | mainnet | `30 23 * * *` | Account for consensus rewards and validator exits in the Native Staking Strategy |
50+
| `snapBalances` | mainnet | `2 0 * * *` | Take a snapshot of the staking strategy's balance |
51+
| `verifyBalances` | mainnet | `6 0 * * *` | Verify validator balances on the Beacon chain |
52+
| `verifyDeposits` | mainnet | `11 */4 * * *` | Verify any processed deposit on the Beacon chain |
53+
| `autoValidatorDeposits` | mainnet | `14 1 * * *` | Deposit WETH to under-funded validators (withdrawing from the strategy first if the Vault needs it) |
54+
| `autoValidatorWithdrawals` | mainnet | `24 1 * * *` | Withdraw ETH from validators when the Vault needs WETH for user withdrawals |
55+
56+
## Sonic staking
57+
58+
| Action | Network | Cron | Description |
59+
| ----------------------- | ------- | -------------------- | ---------------------------------------------------------- |
60+
| `sonicUndelegate` | sonic | `35 3,9,15,21 * * *` | Remove liquidity from a Sonic validator (request withdraw) |
61+
| `sonicClaimWithdrawals` | sonic | `58 */2 * * *` | Withdraw native S from a previously undelegated validator |
62+
63+
## Cross-chain
64+
65+
| Action | Network | Cron | Description |
66+
| --------------------------------- | -------- | ----------------------- | ---------------------------------------------------------------------------------------------------- |
67+
| `crossChainBalanceUpdateBase` | base | `40 7,15,23 * * *` | Send a cross-chain balance update from Base |
68+
| `crossChainBalanceUpdateHyperevm` | hyperevm | `50 7,15,23 * * *` | Send a cross-chain balance update from HyperEVM |
69+
| `relayCCTPMessage` | base | `27 2,8,14,20 * * *` | Fetch CCTP-attested messages via the Circle Gateway API and relay to the integrator (Base → mainnet) |
70+
| `relayCCTPMessage` | mainnet | `43 4,10,16,22 * * *` | As above (mainnet → Base) |
71+
| `crossChainRelayHyperEVM` | hyperevm | `17 1,6,11,16,21 * * *` | Relay CCTP bridge transactions between mainnet and HyperEVM (HyperEVM → mainnet) |
72+
| `crossChainRelayHyperEVM` | mainnet | `7 3,8,13,18,23 * * *` | As above (mainnet → HyperEVM) |
73+
74+
## Rewards & bribes
75+
76+
| Action | Network | Cron | Description |
77+
| --------------------------- | ----------- | ------------- | ----------------------------------------------------------------------------------------------- |
78+
| `manageMerklBribes` | mainnet | `30 13 * * 3` | Call `bribeAll` on the MerklPoolBoosterBribesModule via the Gnosis Safe |
79+
| `manageMerklBribes` | base | `35 13 * * 3` | As above, on Base |
80+
| `manageBribes` | mainnet | `30 09 * * 5` | `manageBribes` on the CurvePoolBoosterBribesModule; sizes rewards-per-vote by target efficiency |
81+
| `claimBribes` | base | `30 10 * * 4` | Claim bribes from Aerodrome veNFT lockers on Base |
82+
| `updateVotemarketEpochs` | arbitrumOne | `0 6 * * 5` | Update Votemarket epochs for all Curve Pool Booster campaigns on Arbitrum |
83+
| `ognClaimAndForwardRewards` | mainnet | `50 0 * * 2` | Claim and forward OGN rewards from all modules |
84+
| `claimSSVRewards` | mainnet | `45 0 1 * *` | Claim SSV rewards and forward the claimed SSV |
85+
| `managePassThrough` | mainnet | `30 12 * * 0` | Transfer tokens via the pass-through mechanism |
86+
87+
## System
88+
89+
| Action | Network | Cron | Description |
90+
| ------------- | ------- | ------------- | --------------------------------------------------------------- |
91+
| `healthcheck` | mainnet | `*/5 * * * *` | Verify the action execution pipeline (signer, network, logging) |
92+
93+
## Manual / on-demand — mainnet
94+
95+
Dispatched via "Run now"; params are edited into the schedule's command before
96+
each run (see notes in `seed_schedules.sql`).
97+
98+
| Action | Description |
99+
| ---------------------------- | ------------------------------------------------------------------------------------ |
100+
| `stakeValidator` | Convert WETH to ETH and deposit to a validator from the Compounding Staking Strategy |
101+
| `removeValidator` | Remove a registered or exited compounding validator from the SSV cluster |
102+
| `ousdRebalancer` | Plan and execute OUSD strategy rebalancing via the RebalancerModule |
103+
| `queueGovernorSixProposal` | Queue a GovernorSix proposal (`--propid`) |
104+
| `executeGovernorSixProposal` | Execute a GovernorSix proposal (`--propid`) |

0 commit comments

Comments
 (0)