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

safe-global / safe-client-gateway / 36992366810
90%

Build:
DEFAULT BRANCH: main
Ran 02 Oct 2026 09:56AM UTC
Jobs 2
Files 1043
Run time 5min
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

02 Oct 2026 09:53AM UTC coverage: 89.455% (+0.02%) from 89.436%
36992366810

push

github

web-flow
feat(spaces): return the caller's Safes across all their workspaces (#3533)

Add `GET /v1/spaces/safes`, which returns the Safes of every workspace the caller is an `ACTIVE` member of, keyed by workspace UUID and grouped by chain, the same shape as the per-workspace endpoint's `safes`: `{ "<spaceUuid>": { "<chainId>": ["<address>", ...] } }`. A workspace without Safes maps to `{}`, and workspaces the caller is only invited to are left out. Clients get all of their Safes in one request instead of calling `GET /v1/spaces/:spaceId/safes` once per workspace.

The route service runs one query for the caller's `ACTIVE` memberships, then `SpaceSafesRepository.findBySpaceIds` loads the Safes of all those workspaces in a single join-free query (`WHERE space_id IN (...)`, using `loadRelationIds` for the space id) and decrypts each workspace's addresses under its own KMS context.

Authorization: the route sits behind `AuthGuard` and takes the caller's identity from the verified JWT. It does not call `assertMember`, because it has no single `spaceId` to check. The `ACTIVE`-membership query is what scopes it to the caller's workspaces, the same way `SpacesService` lists spaces. It is a read, so it is ungated and recorded in the ungated table of `elevation.integration.spec.ts`.

Known cost: decryption makes one KMS call per Safe row, all in parallel, so a caller with many workspaces and Safes sends one larger burst than the per-workspace endpoint does. The cost per row is unchanged and there is no cap yet; a concurrency limit or pagination can follow if needed.

The existing three routes keep their URLs: `SpaceSafesController` is now mounted at `spaces` and each method carries its own `:spaceId/safes` path. `PreparedSpaceSafe` moved from the repository interface to `domain/safes/entities/space-safe.entity.ts`, next to the new `SpaceSafesBySpaceId` type.

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

4551 of 5343 branches covered (85.18%)

Branch coverage included in aggregate %.

16 of 16 new or added lines in 3 files covered. (100.0%)

11609 of 12722 relevant lines covered (91.25%)

552.05 hits per line

Jobs
ID Job ID Ran Files Coverage
1 run-integration-tests - 36992366810.1 02 Oct 2026 09:59AM UTC 1043
64.72
GitHub Action Run
2 run-unit-tests - 36992366810.2 02 Oct 2026 09:56AM UTC 1043
67.36
GitHub Action Run
Source Files on build 36992366810
  • Tree
  • List 1043
  • Changed 10
  • Source Changed 5
  • Coverage Changed 10
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #36992366810
  • bd03c7f7 on github
  • Prev Build on main (#36903341129)
  • Next Build on main (#36992672606)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc