Robyn AnyGas
← anygas.xyz

Privacy Policy

Privacy capabilities — what the system actually does

The policy below describes what we collect. This section describes what we have built so that we cannot collect it. Privacy here is selectable per transaction and never mandatory: ask for none of it and you pay nothing for it.

Live today

Oblivious HTTP — live

The relay went live on 8 August 2026 at relay.nightferry.net, hosted in Iceland by a different provider from the gateway, which runs in Virginia. The relay sees your network address and cannot read your request; the gateway reads your request and never learns your address. Linking the two requires compelling two companies under two legal systems.

Requests are additionally held briefly, shuffled, and released in batches, and both requests and responses are padded to fixed sizes — so neither timing nor length reveals which endpoint you called or whether you were answered.

The honest limit: while a single party operates both halves, the protection is against outside observers, network intermediaries and either host individually — not against that operator. Moving the relay to a genuinely independent operator is the remaining step, and we will say so here when it happens.

Guarantees

Agents: the machine-readable version is in /llms.txt under ## Privacy.

Last updated: 2026-07-14

We collect as little as possible, and what little we keep is hashed. This policy describes what the Robyn AnyGas service actually does — not an aspirational version of it.

Good-faith operator draft. This policy was written by the people who run Robyn AnyGas to describe our real data practices. It is not legal advice and has not been reviewed by an attorney; a lawyer will finalize it before it is presented as a definitive legal document.

1.What we collect

Operating a relay requires minimal usage and operational logs for reliability, security, and abuse prevention. Concretely, per request we may record:

What we do collect

  • Method / path / status / latency
  • Salted hash of client IP
  • Hashed API-key id
  • Timestamps
  • An API-key label, only if you provide one

What we don't collect

  • No raw IP addresses
  • No wallet addresses or amounts in public feeds
  • No names or email addresses
  • No private keys — ever
  • No selling of any of it

We do not collect names, emails, or other personal information unless you choose to provide it — for example, a human-readable label you attach to an API key. Our public activity feeds (such as the route explorer) are anonymized: they do not expose wallet addresses or amounts.

On-chain transactions are inherently public. Anything settled on a blockchain — addresses, amounts, transaction hashes — is recorded on that public ledger by design and is outside our control. That is a property of the blockchains you transact on, not data we publish about you.

2.Data stored in your browser

The site uses browser local storage only for your own convenience, and it is never sent to us as tracking:

We do not use advertising cookies or third-party trackers.

3.How we use it

We do not sell your data, and we don't share it except as needed to operate the service (below) or as required by law.

4.Third parties

To move value across chains, the Service submits transactions through independent third-party bridges and aggregators — for example LI.FI, Bungee, deBridge, Allbridge, and Chainflip — and the underlying blockchains. These providers operate their own infrastructure and privacy practices, which we do not control; review their policies where relevant.

Our endpoints sit behind Cloudflare, which provides network protection and may process request metadata (such as IP addresses) under its own privacy policy as part of delivering and securing traffic.

5.Data retention

Operational logs are kept only as long as needed for reliability, security, and abuse prevention, then rotated out. Because the identifiers we retain are hashed, they cannot be reversed back into raw IPs or keys.

6.Changes & contact

We may update this policy; the "Last updated" date reflects the latest version. For questions about privacy, reach us via the contact channels on anygas.xyz or the project repository. See also our Terms of Service.

Robyn AnyGas · Privacy Policy Terms → Proof → API docs → anygas.xyz

What changed, and how to check it yourself

Privacy claims you cannot verify are marketing. Everything below is checkable without asking us, and the failures we found in our own system are listed alongside the fixes.

Deferred withdrawals — POST /api/pool/withdraw with "hold": {}

Timing is the strongest deanonymiser in a small pool: deposit at 14:02, withdraw at 14:09, and no cryptography saves you. A held withdrawal waits for an exponentially distributed delay and for the anonymity set to reach the floor you named. It is opt-in per request — omit hold and behaviour is exactly as before. Poll GET /api/pool/hold?ticket=; the ticket carries no information about your note.

The subtle part: we do not release the moment your floor is met. The set grows when somebody deposits, and that deposit is a public timestamped event — firing on it would weld your exit to that entry, which is a tighter link than not queueing at all. A second, independent delay is drawn at that moment.

Merkle paths: use /api/pool/tree

Asking for a path with ?commitment= tells us which deposit is yours. That form is no longer served by default; fetch the whole tree and compute your path locally, which reveals nothing.

Cover traffic is now auditable — GET /api/stealth/coverproof

We publish a Merkle root over real payouts, the real count (kUsers) and the observed count including cover (kObserver), bound in a signed commitment fixed before you ask. You can prove your own payout was in a tick. We never publish which entries were cover — the cover set names the real set by complement.

A defect we shipped, and are telling you about

Our cover announcements derived their viewTag from the ephemeral public key, which is published in the announcement itself. Anyone could recompute that relation and identify every cover entry for free. 21 of 31 announcements in the live feed carried that mark, so the anonymity set was 10, not 31. It is fixed. A second, independent tell then showed up: an announced address that never received value is identifiable by one balanceOf call, no cryptography needed. Measured together, 21 of 31 announcements are identifiable by the viewTag relation and the remaining 10 by never having been funded, with no overlap — so the true anonymity set of the historical feed is zero, not the 10 an earlier version of this page reported. Cover emitted from now on is funded and derived correctly; the historical entries are counted, never deleted. Historical entries are counted rather than deleted: a genuine announcement matches the same relation about 1 in 256, and deleting one would strand a recipient whose money is waiting at that address.

Constant-shape replies and constant-rate traffic

Every reply over the private (OHTTP) channel is padded to one fixed size — a refusal, a quote, a tree fetch and a withdrawal are all the same number of bytes. GET /api/privacy/noop is a stateless, unlogged no-op so a client can speak on a fixed schedule whether or not it has anything to say.

Retention

Counterparty addresses in settled routes age into a keyed tag after 30 days: anyone holding an address can still confirm a match, nobody can enumerate who we paid.

Policy changes are logged — GET /api/privacy/policy

A hash-chained, signed record of every change to what we promise, each entry marked tightened, loosened or neutral. Entries commit to their predecessor, so nothing can be edited, reordered or removed without breaking every entry after it. Verify it yourself; the method is in the response.

Machine-checked privacy conformance — GET /svc/api/privacy/conformance

This is the SPHYNX standard — every privacy property this page claims is checked by a fail-closed conformance kernel on each run — a machine-checkable definition of what the system must be, not a description we ask you to trust. Each invariant covers a concrete property (no retained state, one uniform response size, post-quantum forward secrecy, no operator trust, a shared anonymity set, indistinguishable cover traffic). An unverifiable invariant counts as a failure, never a pass, and any failure is reported plainly rather than hidden. Don’t trust the list — fetch it and check the count yourself.

Check our cryptography — stealth-review-bundle.json

The same author wrote our stealth implementation, its tests and the harness that audits it, so our own tests cannot tell you whether we read ERC-5564 correctly. The bundle contains 20 deterministic vectors, reproducible from a seed, with the algorithm in prose. Reimplement it and compare. We would rather you found a mistake than trusted us not to have made one.

Privacy Pool — live in beta

The mechanism is Privacy Pools (Buterin, Illum, Nadler, Neuder, Weinstein 2023): you prove your deposit belongs to an association set that excludes known-bad deposits, without revealing which deposit is yours. You never prove innocence — that would require an identity, which is precisely what this protects. Sets are published by a key that can exclude an address but cannot invent a depositor: every member it submits is checked against real deposits and the root is recomputed on-chain. And if that publisher goes silent or refuses you, you can still exit against the pool's own root — the weakest privacy claim, but never a trap.

Contract: 0x7940E96d65Db811e61B3EE2F289fE92b3833D309 on Base. Fixed denomination 0.00002 ETH, hard cap 250 notes.

This circuit has not been independently audited. The cap is what bounds the value at risk, not a business limit. Deposit only what you are willing to lose entirely.

Fixed denominations are deliberate: variable amounts let an observer match a withdrawal to its deposit by size, which would defeat the entire mechanism.