• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

safe-global / safe-client-gateway / 28239568849
87%

Build:
DEFAULT BRANCH: main
Ran 26 Jun 2026 01:01PM UTC
Jobs 2
Files 892
Run time 3min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

26 Jun 2026 12:58PM UTC coverage: 86.574% (+0.2%) from 86.393%
28239568849

push

github

web-flow
fix: Zerion /portfolio 429 storm — fetch-once-per-wallet + shared rate limit (#3199)

* feat(cache): add Redis-6-safe incrWithTtl counter and shared ZerionRateLimiter

Adds a version-agnostic Lua INCR+EXPIRE counter (cacheService.incrWithTtl)
that resets its fixed window on Redis 6 and 7 alike, unlike increment's
EXPIRE NX (a Redis 7.0+ feature). Builds a shared ZerionRateLimiter that
enforces the account-wide Zerion budget (global + optional per-address
sub-budget) and fails open on Redis errors.

* feat(zerion): enforce shared account budget across Zerion datasources

Wires every Zerion account consumer through ZerionRateLimiter:
wallet portfolio (global + per-address, degraded upstream), balances
(migrated off the Redis-6-broken increment counter), positions, and the
portfolio route. The cross-pod budget keeps cluster traffic under Zerion's
~10 RPS account ceiling so calls succeed instead of 429-storming.

* fix(safe): fetch one Zerion portfolio per wallet-identity, degrade balances honestly

Restructures getSafeOverview to fetch the per-wallet Zerion portfolio once
per (address, isTestnet, currency, trusted) identity and slice per chain,
instead of one identical call per (chainId, address). Dedupes getChain per
chainId. A failed portfolio degrades the wallet to the balances repository
(never a fabricated $0); only a double failure drops the Safe. Adds a
PortfolioDegradedServe log for observability.

* chore: add SPDX headers and document per-address rate-limit env vars

Adds the FSL-1.1-MIT header to the two touched files that lacked one
(cache.service.interface.ts, zerion.module.ts) and registers
ZERION_RATE_LIMIT_PER_ADDRESS_CALLS_BY_PERIOD / _PERIOD_SECONDS in
.env.sample.json so env validation passes.

* fix(safe): validate Safes before prefetching portfolios; preserve 429 for collectibles

Addresses PR review (codex):
- Resolve and validate each Safe up front so a non-Safe or stale address
  never spends a Zerion call or consumes the shared r... (continued)

3507 of 4297 branches covered (81.62%)

Branch coverage included in aggregate %.

109 of 114 new or added lines in 8 files covered. (95.61%)

1 existing line in 1 file now uncovered.

9299 of 10495 relevant lines covered (88.6%)

490.75 hits per line

Uncovered Changes

Lines Coverage ∆ File
5
92.5
0.29% src/modules/safe/routes/v2/safes.v2.service.ts

Coverage Regressions

Lines Coverage ∆ File
1
86.67
-5.0% src/modules/notifications/routes/v1/notifications.controller.ts
Jobs
ID Job ID Ran Files Coverage
1 run-unit-tests - 28239568849.1 26 Jun 2026 01:01PM UTC 892
60.36
GitHub Action Run
2 run-integration-tests - 28239568849.2 26 Jun 2026 01:04PM UTC 892
63.07
GitHub Action Run
Source Files on build 28239568849
  • Tree
  • List 892
  • Changed 18
  • Source Changed 11
  • Coverage Changed 17
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #28239568849
  • 142559ad on github
  • Prev Build on main (#28108899422)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc