All notable changes to the Rewards Eligibility Oracle project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.4.14 (2026-10-27)
- build the Docker image whenever a release is created (#172) (d3df62a)
- config: set the example subgraph minimum to 5 to match production (fc6f494)
- deps: Bump the python-dependencies group across 1 directory with 14 updates (#182) (fdb2261)
- remove deprecated k8s configuration files (73e33e4)
- criteria: announce 10 subgraph minimum from 2026-10-27 (#179) (b76f15e)
- criteria: explain that a criteria change covers the whole window (498d7d4)
- criteria: mark the 5 subgraph daily minimum as active (b81e8ab)
- mark the 10 subgraph daily minimum as active (#183) (d2b1944)
- publishing: describe the 5 subgraph minimum as already in force (8573f87)
0.4.13 (2026-10-01)
- generate and post on chain daily eligibility details per indexer (a956334)
- publish metrics on chain (ea288aa)
- add validation for query attempts before publishing (b55b01f)
- adjust days to publish based on window size (c24105c)
- bigquery: stop counting missing measurements as slow or behind (5b29b54)
- cache hits + renewal (c748e46)
- codec: limit varints to 64 bits so a subgraph can decode them (0ef64b1)
- codec: write message tags as varints, as the wire format states (ebcc7f2)
- config: check the DataEdge settings when the service starts (800e106)
- copilot issues (e21926b)
- handle overflow in date decoding (76b6387)
- limit published days to a maximum threshold (5b6a16d)
- more fixes (dab8f99)
- oracle: keep renewing when the daily metrics cannot be saved (db2b112)
- oracle: renew from cache when the publish files cannot be read (9e76d12)
- partial published retries (83204a4)
- publishing: confirm through the next provider if one fails mid-wait (0541368)
- publishing: keep a 1-day publish setting at 1 day after a good run (121b289)
- publishing: name the transaction when no provider can send it (b37739f)
- publishing: reach back over days earlier runs failed to publish (2b10537)
- publishing: refuse to publish to an address with no contract code (c80b114)
- publishing: sign afresh when another transaction took the nonce (e10922a)
- publishing: sign the metrics once and resend it to each provider (ac9adfb)
- publishing: skip publishing when the trailing days have no data (1f5ca2f)
- publishing: stop sending a payload that reverts in gas estimation (2728429)
- publishing: treat only rate limits as refused among node errors (871bbdb)
- publishing: try the next provider when a rate-limited send fails (c5e718c)
- refactor publish_days assignment with conditional check (dff3841)
- restore per-day row filtering in the DataEdge payload encoder (15994c8)
- stop renewals replacing the DataEdge publish transaction (bf3fcc2)
- blockchain: mark the RPC connection loop's counter as unused (7b37648)
- deps: Bump the python-dependencies group with 2 updates (#157) (a1addfc)
- docker: merge back-to-back RUN steps in the image build (97b8290)
- docker: merge back-to-back RUN steps in the image build (#159) (213a8d5)
- errors: catch OSError once, not alongside its own subclasses (9d31300)
- errors: drop 2 handlers that only re-raise what they catch (c0f3681)
- formatter: split the blank line pass into small named steps (437800c)
- formatter: split the blank line pass into small steps (#163) (0ed15bd)
- k8s: drop the unused API token and bound the pod's scratch disk (52e7c82)
- oracle: mark the Slack success helper as returning nothing (0067345)
- oracle: split the daily run into a helper per stage (e6d0d80)
- pipeline: name each output CSV file once at the top of the module (8122b56)
- scheduler: split start-up into a helper per step (b493403)
- split the daily run and scheduler start-up into steps (#164) (ef36820)
- docker: state the Python version the base image actually uses (edb5048)
- formatter: cover functions nested inside other functions (41a4019)
- formatter: pin the blank lines added above definitions (c79696c)
- oracle: report a cached data failure at its own stage (a7250a2)
0.4.12 (2026-09-22)
- deps: Bump eth-typing from 5.2.1 to 6.0.0 (#149) (6831ce5)
- deps: Bump mypy from 1.19.1 to 2.3.1 (#152) (7aa920c)
- deps: Bump pandas from 2.3.3 to 3.0.6 (#147) (7f10890)
- deps: Bump python from 3.14.6-slim to 3.14.7-slim (#131) (7e608c5)
- deps: Bump pytz from 2025.2 to 2026.3.post1 (#146) (15bb229)
- deps: Bump the python-dependencies group across 1 directory with 13 updates (#134) (c1db28d)
- deps: Bump the python-dependencies group with 4 updates (#145) (5485be3)
- deps: Bump types-pytz from 2025.2.0.20251108 to 2026.3.1.20260727 (#151) (6ad6d17)
- deps: Bump types-requests from 2.33.0.20260712 to 2.33.0.20260906 (#150) (fd45c3e)
- deps: Bump web3 from 7.14.0 to 8.0.0 (#148) (2f39cf4)
- slack: share 1 timestamp format across all notifications (62f9142)
0.4.11 (2026-08-11)
- fail over to the next RPC provider when quota runs out (#129) (f652655)
- stop RPC failover looping forever when all providers fail (#128) (2a56b19)
- deps: Bump actions/setup-python from 6 to 7 (#122) (7f7a4f6)
- deps: Bump python from 3.14.2-slim to 3.14.6-slim (#116) (884e51b)
- readme: delete duplicate readme that hid the main one on GitHub (#124) (e9c5092)
- readme: rewrite README to be more visual and explanatory (#123) (733abae)
0.4.10 (2026-07-13)
- ci: improve sync-manifest to handle branch protection (#96) (3b191c2)
- ci: use printf for PR body to avoid YAML parsing error (#97) (cd07a6d)
- deps: Bump actions/cache from 5 to 6 (#118) (e0cde4c)
- deps: Bump actions/checkout from 5 to 6 (#93) (f876bdd)
- deps: Bump actions/checkout from 6 to 7 (#117) (5e61119)
- deps: Bump docker/build-push-action from 6 to 7 (#107) (0ebbf6e)
- deps: Bump docker/login-action from 3 to 4 (#105) (90aebf5)
- deps: Bump docker/metadata-action from 5 to 6 (#106) (34a4c84)
- deps: Bump docker/setup-buildx-action from 3 to 4 (#104) (f05e5d6)
- deps: Bump softprops/action-gh-release from 2 to 3 (#112) (bb5d93e)
- release: sync release-please manifest to actual version 0.4.9 (#119) (b357318)
- update testnet contract address to new deployment (#101) (ed9e1eb)
0.4.5 (2025-11-22)
- remove unused keys/URLs from config (3d9f6a1)
0.4.4 (2025-11-21)
0.4.3 (2025-11-21)
0.4.2 (2025-11-20)
- Add BigQuery caching with 30-minute freshness (#12) (ac822a8)
- Add clickable transaction links and Python style guidelines (#15) (8534bf8)
- Add continuous deployment pipeline with manual version control (#13) (8ad0436)
- Add Kubernetes deployment support (#14) (daaa778)
- add release-please automation (#45) (4c49ba5)
- SQO: Implement RPC failover, retry logic and notification on RPC provider rotation. (#4) (5a6ea0a)
- SQO: Introduce circuit breaker. (#9) (62ef969)
- SQO: Introduce minimal CI/CD pipeline (#1) (8131872)
- SQO: Introduce Slack notification pipeline and test script for failed/successful runs of the SQO (#2) (d50ab59)
- ci: update Python to 3.13.7 and limit workflow permissions (#43) (cc8cac6)
- configure release-please to auto-update Docker image versions (#49) (caf6dbe)
- configure release-please workflow to use config files (#53) (dda3c24)
- mount config.toml from ConfigMap in K8s (#62) (09dc59c)
- Resolve TruffleHog BASE/HEAD comparison failure (#11) (d025069)
- update contract ABI to match deployed ServiceQualityOracle (#24) (29001d6)
- update Dependabot config and add CODEOWNERS (#26) (8dd13a0)
- update release-please config filename and release type (#63) (231b976)
- add dependabot config and update to production image (#16) (06f58ee)
- auth: improve Google Cloud credential handling (#42) (ab2063c)
- deps: Bump actions/cache from 3 to 4 (#21) (16e6c29)
- deps: Bump actions/checkout from 4 to 5 (#31) (cb12126)
- deps: Bump actions/setup-python from 4 to 5 (#19) (82a82bd)
- deps: Bump actions/setup-python from 5 to 6 (#35) (6c1c174)
- deps: Bump docker/build-push-action from 5 to 6 (#18) (5b2cd65)
- deps: Bump gql from 3.5.3 to 4.0.0 (#34) (e7860cd)
- deps: Bump python from 3.11-slim to 3.13.7-slim (#30) (ba3b323)
- deps: Bump softprops/action-gh-release from 1 to 2 (#17) (931f0c1)
- deps: Bump tenacity from 8.5.0 to 9.1.2 (#23) (597c6f6)
- deps: Bump the python-dependencies group across 1 directory with 13 updates (#40) (f2d35e1)
- deps: Bump the python-dependencies group with 10 updates (#22) (d1daf2d)
- deps: Bump types-pytz from 2025.2.0.20250516 to 2025.2.0.20250809 (#29) (31ea904)
- deps: Bump types-requests from 2.32.4.20250611 to 2.32.4.20250809 (#27) (6e1bbc8)
- main: release 0.4.0 (#46) (eceb4d6)
- main: release 0.4.1 (#48) (2d32fd5)
- rename Service Quality to Rewards Eligibility (#50) (0b1dd6d)
- REO: rename to RewardsEligibilityOracle, reduce initial requirements (#39) (5043ac7)
- SQO: Create unit tests. (#5) (68ba132)
- SQO: Modularise codebase, create a single source of truth for config, add test framework, review all components. (#3) (2845036)
- SQO: Remove unused module/test file. (#6) (6950e19)
- SQO: Update eligibility criteria document structure. (#8) (fc44590)
- update Docker image to v0.2.2 (#25) (09d0f4f)
- update Docker image to v0.3.0 (#44) (4075cf9)
- add end-to-end oracle flow diagram (#54) (3b1997b)
- clean up stale README and apply auto formatting fixes (#47) (ba1ce3e)
- Remove unimplemented curation requirement and enhance security (#10) (ee06dee)
0.4.1 (2025-11-06)
0.4.0 (2025-11-03)
- Apply markdownlint formatting to documentation files
- Update Python to 3.13.7 with limited workflow permissions (#43)
- Update Docker image to v0.3.0 (#44)
- Dependabot configuration for automated dependency updates (#16)
- CODEOWNERS file for code review assignments (#26)
- Improved Google Cloud credential handling with better error messages (#42)
- Renamed contract from IssuanceEligibilityOracle to RewardsEligibilityOracle (#39)
- Updated contract ABI to match deployed RewardsEligibilityOracle (#24)
- Updated to production Docker image configuration (#16, #25)
- Python upgraded from 3.11-slim to 3.13.7-slim (#30)
- Bumped python-dependencies group with 13 updates (#40)
- Bumped python-dependencies group with 10 updates (#22)
- Updated types-pytz from 2025.2.0.20250516 to 2025.2.0.20250809 (#29)
- Updated types-requests from 2.32.4.20250611 to 2.32.4.20250809 (#27)
- Updated tenacity from 8.5.0 to 9.1.2 (#23)
- Updated gql from 3.5.3 to 4.0.0 (#34)
- Updated actions/setup-python from 4 to 5, then 5 to 6 (#19, #35)
- Updated actions/checkout from 4 to 5 (#31)
- Updated actions/cache from 3 to 4 (#21)
- Updated docker/build-push-action from 5 to 6 (#18)
- Updated softprops/action-gh-release from 1 to 2 (#17)
- Updated contract ABI to match deployed ServiceQualityOracle (#24)
- Dependabot configuration for automated dependency updates (#16)
- Production Docker image configuration (#16)
- Clickable transaction links in notifications for easier verification (#15)
- Python style guidelines documentation (#15)
- Kubernetes deployment support with manifests and documentation (#14)
- Persistent volume configurations for data and logs
- ConfigMap and Secret management for Kubernetes
- Resource allocation and health check configurations
- BigQuery caching system with 30-minute freshness threshold
- Cache directory initialization in scheduler
- Force refresh capability via environment variable
- Comprehensive cache test coverage
- Container restart performance improved from ~5 minutes to ~30 seconds
- BigQuery costs reduced by eliminating redundant expensive queries
- Cache location:
/app/data/cache/bigquery_cache.json - Configurable via
CACHE_MAX_AGE_MINUTESenvironment variable - Override caching with
FORCE_BIGQUERY_REFRESH=true
- Daily BigQuery performance data fetching from Google BigQuery
- Indexer eligibility processing based on threshold algorithms
- On-chain oracle updates to RewardsEligibilityOracle contract
- RPC provider failover with circuit breaker pattern
- Slack notifications for monitoring
- Docker containerization with health checks
- Scheduled execution at 10:00 UTC daily
- Data persistence and CSV output generation
- Comprehensive test coverage
- Python 3.11 with slim Docker image
- Google BigQuery integration
- Web3 blockchain client with automatic failover
- Circuit breaker prevents infinite restart loops
- Retry mechanisms with exponential backoff
- Configuration management via TOML and environment variables