# `Attesto.CredentialOfferStore.ETS`
[🔗](https://github.com/XukuLLC/attesto/blob/v2.1.0/lib/attesto/credential_offer_store/ets.ex#L1)

Single-node ETS implementation of `Attesto.CredentialOfferStore`.

Credential offers live in a `:protected` ETS table owned by a `GenServer`
that sweeps expired rows on a fixed interval. Writes (`put/1`, sweeping) run
in the owner process; `fetch/1` reads directly, is non-consuming, and returns
an offer only while its expiry is strictly in the future.

This is a per-node store; a multi-node deployment MUST back
`Attesto.CredentialOfferStore` with a shared store. Like the other ETS
stores it refuses to boot on a clustered BEAM unless
`multi_node_acknowledged?: true`.

Start options: `:sweep_interval_ms` (default `30_000`),
`:multi_node_acknowledged?` (default `false`).

# `reset`

```elixir
@spec reset() :: :ok
```

Clear every entry. Test-facing.

# `start_link`

```elixir
@spec start_link(keyword()) :: GenServer.on_start()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
