Skip to content

Keeper

Keeper #2152

Workflow file for this run

name: Keeper
on:
# Offset from update-prices.yml (which runs */5) so the two 5-min crons don't
# fire on the same minute and cancel each other in the shared concurrency
# group below. Keeper runs at minutes 02, 07, 12, ... giving each workflow
# ~2.5 min of clear runway before the next tick arrives.
schedule:
- cron: "2-59/5 * * * *"
# External scheduler fallback (GitHub's `schedule` trigger drops ~95% of
# intended ticks for this repo; see docs/KEEPER_OPERATIONS.md). POST to
# /repos/<owner>/<repo>/dispatches with body {"event_type":"keeper-tick"}.
repository_dispatch:
types: [keeper-tick]
workflow_dispatch:
# Serialize against every other workflow that signs with KEEPER_PRIVATE_KEY
# (update-prices.yml, vault-agent.yml) so they can't race on the same nonce.
concurrency:
group: keeper-key-serialized
cancel-in-progress: false
permissions:
contents: read
jobs:
keeper:
name: Keeper Epoch
runs-on: ubuntu-latest
env:
PRIVATE_KEY: ${{ secrets.KEEPER_PRIVATE_KEY }}
SEPOLIA_RPC_URL: ${{ secrets.SEPOLIA_RPC_URL }}
FUJI_RPC_URL: ${{ secrets.FUJI_RPC_URL }}
# Chains to include each epoch. Add a chain here only after deploying its
# StateRelay and committing apps/web/src/config/<chain>-deployment.json.
KEEPER_CHAINS: "sepolia,fuji"
KEEPER_ONCE: "1"
steps:
# No submodules: services/keeper runs tsc + node only.
- uses: actions/checkout@v5
- name: Setup CI environment (cached)
uses: ./.github/actions/setup-snx
- name: Build keeper
run: npm --prefix services/keeper run build
- name: Run one keeper epoch
run: node services/keeper/dist/index.js