GIP-XXX: Should GnosisDAO fund Pipes — encrypted coordination infrastructure for Safe signers?

Executive Summary

Pipes is an encrypted coordination layer for Gnosis Safe signers. It replaces Telegram, Discord, and Signal with a communication channel that is operator-blind (the relay cannot read messages), and automatically rotates when signer sets change on-chain.

The encryption relay is already running on bare metal, processing real user traffic. The consumer proof-of-concept, NFTFAX CHAIN, a collaborative art relay game (see: nftfax.app), launched on Base with live contract at 0xcC121BF9E3a13d03EACd55E15495e3E8De61fac5. This GIP asks for $65,000 to audit the relay, build the Safe module integration, add Gnosis VPN transport, and release Pipes as open-source infrastructure for every DAO on Gnosis Chain.

The timing is right: GIP-153 (EEZ) is in vote, GIP-154 ($15m/year core funding) is in Phase 2, and the Gnosis forum is actively discussing what infrastructure the ecosystem needs. Pipes answers that question with working code: not a roadmap, not a whitepaper, but a live protocol that needs hardening to serve the DAOs that already depend on Gnosis Safe.


The Problem

Gnosis Safe is the gold standard for on-chain execution. Thousands of DAOs use it to secure tens of billions in treasury value. But the coordination that precedes execution, which includes discussing the payload, confirming who will sign, and tracking quorum readiness, happens over Discord, Telegram, and Signal.

These channels:

  • Leak metadata: who is coordinating, when, how frequently, and with whom.
  • Are not cryptographically bound to signer identity. A compromised Discord account can impersonate a signer.
  • Require manual offboarding. When a signer rotates out, someone must manually remove them from the group chat. In practice, this rarely happens.
  • Introduce a third-party dependency. The DAO does not control the infrastructure. The platform operator is a witness and a potential point of failure, subpoena, or deplatforming.

The gap between Safe’s execution security and the coordination layer’s ad-hoc vulnerability is the most significant unsolved problem in DAO operations. We secure the vault with titanium. We leave the blueprints in a public coffee shop.


The Solution

Pipes is a coordination channel with six properties:

  1. Access is cryptographically gated, with no new NFT required. For DAO Safe signers, identity is verified directly against the Safe contract: getOwners() returns the current signer set, and only those wallets can read or write to safe.42@pipe. No separate token, no mint, no additional onboarding. Membership is the intersection of two things: the Safe’s current getOwners() set, and a SIWE-style signed acceptance from that signer naming that specific Safe. Being listed as an owner is necessary but not sufficient, because Safe owner assignment is permissionless at creation: anyone can name any address as an owner without consent. The signer can revoke acceptance unilaterally at any time, regardless of Safe threshold, since it is their signature rather than the Safe state. This gives a signer an exit that Safe itself does not provide. If you are removed, access drops automatically. For communities that already use governance NFTs, the NFT itself becomes the identity key: ownerOf(tokenId) is verified at send time. The ERC-8004 / ghostagent.ninja integration adds optional reputation scoring (notapaperclip.red swarm trust) and composability with agent frameworks, but is not required for basic signer coordination. No passwords, no invite links, no admin adding or removing users.

  2. Signer rotation is automatic. Pipes reads the Safe contract directly. When the signer set changes on-chain, whether via swapOwner() or governance NFT transfer, access updates automatically. The departing signer loses access instantly. The new signer gains it. No admin action, no forgotten permissions, no manual offboarding. The Safe contract state is the single source of truth.

  3. The relay is operator-blind. All messages are encrypted with ECIES (Elliptic Curve Integrated Encryption Scheme). The relay stores and serves ciphertext only. Even with root access to the machine, the operator cannot read the payload. A warrant produces noise.

  4. Quorum tracking is built in. The sender sees “3 of 5 signers have acknowledged” without knowing which specific signers: preventing collusion pressure while confirming readiness. “Acknowledged” means “I have read the coordination payload,” not “I approve the transaction.” The Safe signing is separate and on-chain.

  5. The namespace is sovereign. safe.42@pipe is an internal protocol namespace. No DNS, no SMTP, no ICANN. The address resolves entirely within the Pipes protocol on Gnosis Chain. The protocol cannot be deplatformed because there is no platform: just a relay that anyone can run.

  6. Network-level metadata protection. Pipes supports a Sovereign Transport Mode that routes encrypted traffic through Gnosis VPN, powered by the HOPR mixnet. In this mode, the relay cannot observe either the message content or the sender’s network identity. Payload privacy (ECIES) plus connection privacy (HOPR) equals total amnesia.


Competitive Landscape & Differentiation

Pipes doesn’t compete with general-purpose messengers. It is purpose-built for DAO coordination where identity must be provable, and the infrastructure must not be a witness.

Solution Identity Model Server Can Read? Signer Rotation Quorum Tracking Infrastructure Control
Signal Phone number Metadata only Manual No Signal’s servers
Telegram Phone number Yes (not E2E by default) Manual No Telegram’s servers
Discord Email/account Yes Manual No Discord’s servers
Keybase Social proofs No (E2E) Manual No Keybase servers (Zoom-owned)
XMTP Wallet address Metadata Manual No XMTP network
Pipes Safe contract / NFT No (ECIES, operator-blind) Automatic (reads Safe state) Yes (aggregated) DAO runs its own relay

The moat: no other coordination tool combines on-chain identity verification, operator-blind encryption, automatic signer rotation, and quorum tracking in a single protocol where the DAO controls the infrastructure.

Synergy with Funded Gnosis Projects

Pipes is designed to complement, not compete with, existing Gnosis ecosystem investments:

Project Funding Pipes Integration
ProbeLab $105k (GIP, network metrics) Pipes relay performance and P2P health can be monitored by ProbeLab’s existing dashboards. The relay uses standard libp2p/devp2p transports, which ProbeLab’s tooling already covers. Integration is zero-effort: the relay exposes standard metrics endpoints.
Gnosis VPN / HOPR Core infra (GIP-154) Sovereign Transport Mode routes Pipes traffic through HOPR mixnet. This creates immediate utility for Gnosis VPN by giving it a production use case: encrypted Safe coordination.
Gnosis Safe Core product (spinout) The Safe module integrates directly. Every Safe on Gnosis Chain becomes a potential Pipes user.
EEZ (GIP-153) $15m/year (GIP-154) Pipes runs on Gnosis Chain regardless of L1/L2 architecture. If EEZ passes, Pipes benefits from synchronous Ethereum composability for NFT ownership verification.
Circles $0.7m (GIP-154) Community currencies need community coordination. Pipes provides the coordination layer for Circles-based local economies.

What Already Exists

Pipes is not a whitepaper. The core infrastructure is running today:

Component Status Details
ECIES relay Live Hetzner bare metal. Processes encrypted envelopes. Operator-blind. Stateless, amnesiac, disposable.
nftmail.box Live Encrypted messaging with PGP interop. Wallet-derived key management. WKD key discovery. ERC-8004 on-chain identity binding.
@fax protocol namespace Live DFZ.1234@fax identities resolve off-chain via the relay. No DNS dependency. Four NFT communities onboarded (DeadFellaz, Chonks, Normies, POW NFT).
NFTFAX CHAIN game Live on Base Consumer proof-of-concept. Contract: 0xcC121BF9E3a13d03EACd55E15495e3E8De61fac5. 2,222 mint supply. On-chain commit-reveal prize draw. 48 API routes serving identity, messaging, coordination, and minting.
ghostagent.ninja Live ERC-8004 agent identity platform. NFT-bound sovereign identity with Gnosis Safe integration. Cross-chain binding.
notapaperclip.red Live Swarm trust oracle. Diversity-scored agent reputation. Four analysers: ERC-8004 verifier, A2A validator, MCP inspector, swarm trust scorer.
nftfax.app API Live 48 documented routes. Public resolution, inbox management, fax composition, minting, telegraph leaderboard.
On-chain identity authorisation Live Per-request ownerOf() verification on Base and Ethereum, fail-closed, across all read and destructive endpoints. Replaced registry-based authorisation after live testing surfaced a bypass.
Consented membership Designed Signed acceptance + unilateral revocation, replacing getOwners()-only membership. Prompted by a real Safe owner-set poisoning incident. Part of the Safe module deliverable.

Key Metrics (Current)

  • NFT communities onboarded: 4 (DeadFellaz, Chonks, Normies, POW NFT)

  • Registered @fax identities: 64 (Chonks 35, POW NFT 26, DeadFellaz 2, Normies 1) — from an addressable base of ~21,000 holders across ~103,000 NFTs; addressable is not active

  • Public transmissions: 45, from 21 senders to 26 recipients

  • Collectibles minted on Base: 23, by 13 distinct wallets; prize pool 0.046 ETH

  • Live on-chain contract: 0xcC121BF9E3a13d03EACd55E15495e3E8De61fac5 (Base), owner ghostagent.eth

  • API routes: 48 (identity, messaging, coordination, minting)

  • Standards implemented: ERC-8004, ERC-8312 (contributed), ERC-8048, EIP-4361 (SIWE), ERC-8217 (referenced)

  • Availability: one self-inflicted outage (2026-09-22, ~30 min, build on the production host); cause removed

  • Encryption: ECIES (ephemeral secp256k1 ECDH → HKDF-SHA256 → AES-256-GCM) in the reference implementation; deployed relay still on the v1 P-256 path. No forward secrecy in either.

  • Identity authorisation: resolved on-chain per request, fail-closed, on Base and Ethereum (migrated off registry-based lookup, September 2026)

  • Findings from live operation: 2 authorisation defects found and fixed pre-audit (one read + destructive, one unauthenticated endpoint that spent funds); 1 protocol assumption invalidated by a real attack, resulting in the consented-membership design change; 4 further reliability defects fixed


Technical Architecture

[ SAFE SIGNER CLIENT ]
        │
        ├─► 1. PAYLOAD PRIVACY (ECIES)
        │      Message encrypted to recipient's ERC-8048 public key.
        │      Relay stores ciphertext only. Cannot decrypt.
        │      PGP interop for legacy email compatibility.
        │
        ├─► 2. IDENTITY (Safe contract + optional NFT)
        │      SIWE authentication. getOwners() verified on-chain.
        │      Signer set resolved from Safe contract at send time.
        │      Optional: ERC-8004 reputation + NFT-gating for communities.
        │
        └─► 3. NETWORK PRIVACY (HOPR via Gnosis VPN)
               IP & connection metadata obfuscated through HOPR mixnet.
               Relay receives encrypted blobs with no source address.
               Configurable transport mode per Safe.
                        │
                        ▼
        [ AMNESIAC PIPES RELAY ]
               Stateless. Stores encrypted envelopes in KV.
               Multi-jurisdiction deployment (DE + US + SG).
               No session state. No message history. No group metadata.
               Standard metrics endpoints for ProbeLab monitoring.

Group Addressing & Quorum

safe.42@pipe resolves dynamically to the current signer set of Safe #42 via on-chain getOwners() at send time. Each signer receives an individually encrypted copy. The relay sees N encrypted blobs, not a group chat.

Per-message acknowledgement: each recipient signs a lightweight SIWE attestation. Aggregated into quorum status. “Acknowledged” means “I have read the coordination payload,” not “I approve the transaction.” Safe signing is separate.

Standards

Standard Role Status
EIP-4361 (SIWE) Authentication Published, deployed
ERC-8004 Agent identity registry Published
ERC-8217 NFT-to-agent binding Published (nxt3d)
ERC-8312 Bounded agent actions Draft (GhostAgent contributed)
ERC-8048 On-chain metadata for tokens Draft

Performance & Gas

Operation Gas (Gnosis Chain) Notes
SIWE verification 0 (off-chain) Signature verified client-side and by relay
Safe getOwners() resolution ~800 gas + 500/signer Standard Safe read
ERC-8312 cursor advance ~21,000 gas Stateful write, per transaction
Acknowledgment attestation 0 (off-chain) SIWE-signed, stored in relay KV
Message send (ECIES encrypt) 0 (client-side) Encryption in browser, ciphertext to relay
Transport mode switch 0 (config) Standard vs HOPR selected per-Safe, no gas

A typical multisig coordination round on Pipes consumes under 4,000 gas (two getOwners reads). Traditional on-chain governance with proposal submission and voting can consume 200,000–500,000 gas. Pipes moves coordination off-chain while keeping identity verification on-chain: reducing gas costs by 98%+ for the coordination phase.


Budget

# Deliverable Cost
1 Security audit: independent audit of ECIES relay, group coordination protocol, and Safe module by a Gnosis DAO-approved firm (Consensys Diligence, Trail of Bits, or equivalent). $25,000
2 Lead developer: Safe module development, Gnosis VPN transport integration, SDK, documentation, project management. Operator-Blind Webhook Notification System + Open-Source Discord/Telegram Adapter, project management. 8+ weeks of work. $22,000
3 Relay hardening: multi-jurisdiction deployment (DE + US + SG), rate limiting, API key system for third-party integrations, ProbeLab metrics endpoint. $5,000
4 Existing infrastructure contribution: ECIES rela@fax@fa@f@faxfax@fa@fa@fax @fax namespace, PGP interop, ERC-8004 identity integration. 6+ months of prior development now being open-sourced and hardened for the Gnosis ecosystem. $8,000
5 Contingency: unforeseen technical complexity, audit remediation, extended timeline. $5,000
Total $65,000

Payment: $65,000 in stablecoins (EURe or USDC on Gnosis Chain) to a Gnosis Safe controlled by the author. Two tranches:

  • Tranche 1 (50%, $32,500): On proposal approval, to initiate audit engagement and begin Safe module development.
  • Tranche 2 (50%, $32,500): On completion of the independent audit, publication of the remediation report, and public open-sourcing of the Safe module repository.

Budget context: GIP-154 allocates $3.572m to Core and Infra (including $0.1m for audits, $0.2m for Safe, and $0.68m for hosting). This GIP is 1.8% of that line item, and delivers infrastructure that serves the entire Safe ecosystem, not just Gnosis Ltd.


Note on scope and budget

Consented membership extends deliverable 2 (Safe module development) rather than adding a line item. If reviewers consider the acceptance/revocation registry and its verification tooling to warrant separate costing, say so and I will revise. I would rather adjust the budget than under-scope a security-critical component.


12-Month Roadmap

Phase Timeline Milestones
Phase 0: Pre-GIP Completed ECIES relay live. nftmail.box with PGP interop. NFTFAX CHAIN game on Base. 48 API routes. 4 communities onboarded.
Phase 1: Audit & Harden Sep–Nov 2026 Security audit complete. Safe module developed. Gnosis VPN transport integrated. Relay hardened (multi-jurisdiction, rate limiting).
Phase 2: Release Nov 2026 Open-source release. Documentation + SDK. Reference UI. Pipes relay available for any DAO to deploy.
Phase 3: Adoption Dec 2026–Feb 2027 First 5 DAO pilots. Gnosis DAO treasury coordination on Pipes. Feedback loop for improvements.
Phase 4: Scale Mar–Aug 2027 Signer ping notifications. B2B invoicing. OTC authentication. Agent-to-agent coordination. 50+ DAOs.
Phase 5: Ecosystem Sep 2027–Aug 2028 Pipes as default Safe coordination layer. Marketplace for integrations. Agentic DAO tooling. 500+ DAOs.

5-Year Vision

Pipes becomes the default coordination layer for every Gnosis Safe: the encrypted, identity-gated communication primitive that DAOs, working groups, and autonomous agents use to coordinate before execution. The same way Safe became the default for custody, Pipes becomes the default for coordination.

By Year 5:

  • 5,000+ DAOs using Pipes for Safe coordination
  • Native integration in Safe{Wallet} UI (“Coordinate” tab next to “Transactions”)
  • Agent-to-agent coordination via ERC-8312 bounded authority
  • Gnosis VPN transport as default for enterprise Safes
  • Pipes protocol adopted beyond Gnosis: any EVM chain, any multisig
  • Revenue model: enterprise tiers, hosted relay options, audit services

Risks & Mitigation

Risk Severity Mitigation
Owner-set poisoning / membership without consent High Observed in production against the author’s own address. Safe owner assignment is permissionless at creation and Safe has no unilateral exit, so any address can be conscripted into a hostile owner set and cannot leave. Mitigation: membership requires a signed acceptance naming the Safe, revocable unilaterally by the signer. getOwners() alone is never sufficient.
Registry-based identity drift High Observed in production. A cached signer/key registry consulted for authorisation fails open for unregistered identities and closed for legitimate ones once stale. Mitigation: authorisation resolves against chain state per request; the registry is a performance optimisation only. Migrating the deployed relay off its key registry is Phase 1 scope.
Fail-closed availability under RPC failure Medium Observed in production: correct fail-closed behaviour combined with RPC rate limiting silently hid waiting messages. Mitigation: minimise on-chain calls per request; cache authorised results briefly and never denials; treat RPC availability as an explicit audit requirement.
Audit reveals critical vulnerability High Contingency budget covers remediation. Open-source code enables community review before audit. Two findings have already been surfaced and addressed pre-audit under live traffic.
Low Safe DAO adoption Medium FAX CHAIN game proves coordination model with real users. Start with Gnosis DAO as first pilot.
Gnosis VPN/HOPR transport unstable Medium Sovereign Transport Mode is optional. Standard HTTPS transport works independently. Degrade gracefully.
Regulatory attention (encrypted comms infra) Low Open-source. No user data. Operator-blind architecture means no plaintext to produce. Tool posture, not operator posture.
Single developer dependency Medium Open-source release enables community contributions. Audit by independent firm validates code quality.
Competing protocol emerges Low First-mover advantage with live infrastructure. Standards-based architecture enables interoperability, not lock-in.

FAQ

Q: How is this different from using Signal for Safe coordination?

Signal provides end-to-end encrypted messaging but uses phone numbers as identifiers, cannot verify that a message recipient is currently a Safe signer, requires manual group management when signers rotate, and relies on Signal’s centralised infrastructure. Pipes is cryptographically gated to the Safe signer set, rotates access automatically, and lets the DAO run its own relay.

Q: What happens if the relay goes down?

The relay is stateless and deployed across three jurisdictions. If one relay is taken offline, the other two continue operating. A new relay instance can be deployed in minutes. Messages are stored temporarily in KV: the relay is a pass-through, not a database.

Q: Can the DAO verify the relay is not logging anything?

Yes. The relay is open-source. The DAO can audit the code, run its own instance, and verify that the operator cannot decrypt messages (ECIES encryption is client-side). For maximum assurance, the DAO deploys its own relay: Pipes is infrastructure, not a service.

Q: How does this integrate with existing DAO tooling (Snapshot, Tally, Safe UI)?

Pipes is complementary. Snapshot handles voting. Safe handles execution. Pipes handles the coordination between them. No integration with existing tooling is required: Pipes is a standalone coordination channel that signers use alongside their existing workflow.

Q: Why not build this as a Discord bot or Signal bot?

Bots introduce a third party that can read messages. A Discord bot sees plaintext. A Signal bot requires a phone number. Pipes is operator-blind: the relay cannot read messages. The encryption is client-side, the identity is on-chain, and there is no third party.

Q: Do Safe signers need to hold a separate NFT to use Pipes?

No. For standard Safe signer coordination, Pipes reads the signer set directly from the Safe contract via getOwners(). No additional token is required. The NFT-gating model is an option for communities that already use governance NFTs (e.g., DeadFellaz holders using their existing NFT as their Pipes identity). For DAO treasuries, the Safe itself is the gate.


Feedback & Links

Smart Contract (NFTFAX CHAIN proof-of-concept): 0xcC121BF9E3a13d03EACd55E15495e3E8De61fac5 (Base)
API: 48 routes documented at nftfax.app (public resolution, inbox, fax composition, minting, telegraph)
Live relay: nftmail.box (PGP + ECIES encrypted messaging, operator-blind architecture)
Identity platform: ghostagent.ninja (ERC-8004 agent registry)
Trust oracle: notapaperclip.red (swarm-scored agent reputation)
Forum: This thread. Feedback on scope, budget, and architecture welcome.
Contact: GhostAgent on the Gnosis Discord or via the forum


This GIP is posted for Phase 1 discussion. The author welcomes feedback from delegates, especially on scope, budget, integration with existing Gnosis infrastructure, and the Safe module specification. All feedback will be incorporated before moving to Phase 2.

From a signer’s point of view, how would they know that a new coordination message is waiting?

If it means regularly checking another inbox, I worry important messages could be missed compared with the tools teams already use. Clear notifications and a simple fallback path seem important before asking signers to change their workflow.

1 Like

Great question, Anzus. You’ve hit the exact nail on the head: notification latency is the difference between a protocol people want to use and an inbox that gets neglected.

Expecting a multisig signer who manages 5+ DAOs to log into a separate dashboard every morning just to check for pending messages will fail. Here’s how we solve the push-vs-pull workflow without compromising payload privacy:

1. The Operator-Blind Webhook Adapter (Phase 1 deliverable)

The Pipes relay knows when a new encrypted envelope is deposited for safe.42@pipe. It cannot read the payload, but it knows an event occurred.

The relay fires a minimal webhook containing only what the relay already knows:

Copied


  "event": "COORDINATION_MESSAGE_WAITING",
  "recipient": "safe.42@pipe",
  "timestamp": 1724391200,
  "messageHash": "0x8f3a..."

messageHash is a SHA-256 hash of the encrypted envelope. It lets the client check “is this new?” without asking the relay for the full ciphertext. It leaks nothing — it’s a hash of noise to anyone without the recipient’s private key.

Sender identity is intentionally omitted from the default webhook payload. The Discord bot doesn’t need to know who sent the message, only that a message exists. If a DAO prefers sender-visible notifications (“safe.17 sent a coordination message”), they can toggle that in their relay config. Default is metadata-minimal.

2. Meeting signers where they already are

That webhook feeds into lightweight adapters for the surfaces signers already monitor 24/7:

  • Discord / Slack bot – posts “:open_mailbox_with_raised_flag: New coordination payload waiting for Safe #42. Open Pipes to decrypt.” in the DAO’s private signer channel.

  • Telegram bot – direct ping to the signer group.

  • Email digest – daily summary or real-time alert.

The bot never sees plaintext, ABI data, or sender metadata. It’s a signal bell, not a reader.

3. Built-in quorum tracking is the safety net

If the notification adapter is down or a signer ignores the ping, the sender’s client displays real-time quorum status: “2 of 5 signers have acknowledged.” The sender knows instantly that something is wrong and can ping the missing signer through traditional channels. The protocol degrades gracefully, it doesn’t silently stall.

4. Long-term: native Safe{Wallet} integration (Phase 4)

The ultimate home is a “Coordinate” tab inside Safe{Wallet} with an unread badge next to “Transactions.” But signers shouldn’t have to wait for Safe UI updates to get a usable workflow today. The webhook bridge means nobody’s blocked on upstream integration.

1 Like

Thanks for publishing the proposed audit budget and Phase 1 timeline.

Has an audit provider or procurement route already been selected for the $25,000 security-review allocation?

Arctek Audits could assess a bounded initial package around the Safe-module authorization, signer-set changes and the relay-to-Safe trust boundary. If the engagement remains unassigned, who should receive a private scope discussion?

Reuben Kassongo
Arctek Audits

1 Like

Thanks for reaching out, Reuben. The audit procurement process hasn’t begun yet — the GIP is still in Phase 1 discussion, and the $25,000 allocation is contingent on the proposal passing. The proposal references a preference for a Gnosis DAO-approved firm given the sensitivity of the Safe module integration, but I’m happy to receive a scope proposal at ghostagent@nftmail.box once we’re closer to Phase 2.

Appreciate the interest.

Thanks, @GhostAgent , understood.

I’ll follow the Phase 1 discussion and wait until the proposal is closer to Phase 2. If it advances and Arctek is eligible under the final procurement route, I’ll send a concise scope proposal to the address you provided, focused on the Safe-module authorization path, signer-set transitions and the relay-to-Safe trust boundary.

Appreciate the clear direction.

Reuben Kassongo
Arctek Audits

1 Like

Quick update for delegates following this proposal:

  • The nftfax.app game (the consumer POC cited in the proposal) now includes a built-in ERC-6551 backpack viewer with asset withdrawal: view what’s inside any Chonks backpack, and withdraw assets directly. This is the precursor to a standalone nftbackpack.ninja account explorer we’re preparing as an alternative to tokenbound.org (which since two weeks, currently loads but fails to display NFT assets, consistent with a provider outage).

  • The relay’s encryption has been migrated to secp256k1 in the upcoming release – the same curve Ethereum and Gnosis Safe use. P-256 was the pragmatic starting choice: widely supported, well-understood, and it let us ship the relay quickly to prove the coordination model worked. The live deployment (worker.nftmail.box) currently carries two channels – unencrypted public faxes for the nftfax.app chain-letter game, and ECIES-encrypted private faxes where the image is ciphertext at rest and only the recipient’s wallet can decrypt. Running both channels in production confirmed the model works. It also surfaced a barrier: P-256 required signers to generate and register a separate encryption key, which real-world usage showed would slow DAO adoption. The v2 release switches to secp256k1, where a signer’s existing wallet keypair IS their encryption keypair. No separate key to generate, store, or rotate. The protocol is stronger because it was tested in production before being proposed for DAO use. The relay depends on @noble/curves (audited by Trail of Bits, Aug 2026, and Cure53, Sep 2024) and @noble/hashes (audited by Cure53, Jan 2022, funded by the Ethereum Foundation).

  • The core relay infrastructure continues to run without downtime. The nftfax.app game is being refined based on early feedback.

Happy to answer questions on any of these.

A short infrastructure update for delegates following this proposal.

What we’re doing

We’re migrating nftfax.app’s leaderboard and event queries from raw eth_getLogs scanning to Envio HyperIndex.

Envio provides faster, more reliable querying of public on-chain activity, including registrations, mints, forwards, withdrawals, and leaderboard events. This matters for the consumer application because scanning the chain page by page for every request is slow and can silently miss events under RPC rate limits.

What Envio never touches

Envio indexes public NFTfax-related on-chain data only. Encrypted Pipes envelopes are not sent to Envio.

Private message content, coordination payloads, and encryption keys remain client-side and operator-blind. The indexing layer sees activity that is already public on-chain—such as contract interactions and mint events—not the encrypted content passing through the Pipes relay.

Fallback is built in

If the Envio endpoint is unavailable or a query fails, nftfax.app automatically falls back to direct RPC log scanning. An indexing outage should make the application slower, not break it entirely.

We’re also separating hosted indexers by project to stay within free-tier allocations. Longer term, the indexer can be self-hosted on our existing Docker infrastructure, avoiding a recurring hosted-indexer dependency.

How this applies to Pipes

Pipes will use a more conservative dependency model.

Envio may be used as an optional indexing layer for:

  • Discovering Safe-related activity

  • Historical signer-set changes

  • Deployment and usage analytics

  • Relay dashboards

  • Operational metrics

Envio will not be required for the core privacy or authorization path.

The relay will remain deployable with an RPC endpoint and local cache. Safe authorization will be checked against the Safe contracts directly, including current owner information from methods such as getOwners(), with RPC-based verification remaining available when an indexer is unavailable.

If Envio goes offline, Pipes should continue operating through direct contract reads and RPC log scanning.

Mode Dependencies Use case
Minimal Relay + RPC + local cache Default and easiest self-hosted deployment
Hosted indexer Relay + Envio GraphQL + RPC fallback Faster production queries and analytics
Fully self-hosted Relay + RPC + self-hosted Envio DAOs wanting predictable infrastructure
Development Relay + local RPC or Anvil Testing and integration

The principle is straightforward: an indexer improves performance and discovery, but it must not become a requirement for message delivery, encryption, or access control.

Privacy measures

  • Client-side encryption: Message payloads are ECIES-encrypted before leaving the user’s device.

  • Operator blindness: The relay stores and serves ciphertext. It is designed not to receive plaintext messages or private keys.

  • On-chain identity: Safe signer authorization is derived from Safe contract state rather than passwords, invite links, or a centralized user directory.

  • Signer rotation: The current Safe owner set remains the source of truth, so access changes follow on-chain state.

  • Graceful fallback: Direct RPC reads and local caching prevent a hosted indexing service from becoming a single point of failure.

  • Self-hosting: DAOs can operate their own relay and, if desired, their own indexing infrastructure.

  • Minimal notifications: Future notification adapters should expose only that an encrypted message is waiting—not its plaintext, ABI payload, or unnecessary sender information.

  • Optional network privacy: We are beginning to test Pipes traffic through Gnosis VPN/HOPR transport to evaluate whether it reduces the relay’s ability to associate encrypted traffic with a sender’s network address. The results and limitations will be documented from measurements, not assumed guarantees.

One correction from the original proposal

The original proposal described the relay as having “no group metadata” and suggested that HOPR could provide “total anonymity.” Those claims were too broad.

The more defensible framing is that Pipes:

  • Minimizes the metadata it collects and exposes

  • Keeps message payloads operator-blind

  • Uses on-chain Safe state for authorization

  • Treats network-level privacy as an optional transport layer

  • Documents the guarantees and limitations of that transport based on testing

We are not asserting stronger anonymity properties before they have been verified.

Why this update matters

nftfax.app is serving as a practical canary. We’re running real indexing infrastructure, encountering real RPC and rate-limit constraints, and identifying dependency boundaries before asking any DAO to rely on Pipes.

Envio makes the consumer application faster and more reliable. The lessons from that integration are informing a more resilient Pipes architecture.

The privacy boundary – what is public and indexed, what remains encrypted, and what the relay can observe – is being defined through implementation and testing rather than only through a whitepaper.

Update: two production findings, one of which changed the protocol

Running the consumer Proof-Of-Concept (nftfax.app) with real users has produced two findings that directly shaped the Pipes design. One is an implementation bug we fixed. The other is an attack against me personally, which invalidated a core assumption in this proposal and forced a protocol change. I am disclosing both in full, including an address of mine that is currently flagged as malicious, because a proposal asking for audit funding should be judged on how it handles findings rather than on a claim to have none.


Finding 1: authorisation resolved against a cache instead of the chain

nftfax.app authorised access to a mailbox by consulting the relay’s identity directory rather than the chain. An @fax identity exists as soon as you hold the NFT, most handles have no directory record at all. The check only ran for handles that did have one. A handle with no record matched neither branch and continued into the handler unverified.

Measured against live data, 5 of the 8 mailboxes that had actually received traffic had no directory record, so for those the check never ran and any connected wallet could read inbox and sent-message metadata, read the account’s credit balance, delete another identity’s messages, and re-route another identity’s message to a different recipient (which in the game also disables the original recipient’s mint). The last two are destructive, not a read leak. Sending from an identity was gated separately; this was unauthorised access to other people’s mailboxes, not impersonation.

The same assumption failed in the opposite direction. Where the registry did hold a record, that record went stale as soon as the underlying NFT was traded, so the legitimate current owner was refused with “Wallet does not match the registered owner". One bad assumption, failing open for attackers and closed for real users simultaneously.

The fix. Authorisation now resolves on-chain per request and fails closed. Identity derives from ownerOf(tokenId) against the owning collection’s contract, with no cached record in the authorisation path. Applied uniformly to every read and destructive endpoint.

A second bug, introduced while fixing the first. The initial fix verified ownership for every identity a wallet holds before reading anything. A wallet holding a dozen NFTs exhausted the public RPC rate limit partway through the first five ownerOf calls succeeded; the rest errored. Because the check correctly fails closed, those identities silently reported zero waiting messages. A live message with 36 hours left on its timer was invisible. Fail-closed is the right default, and it converted a rate limit into silent data loss. The fix: read cheap state first, spend on-chain verification only on results actually returned, cache authorised results for 60 seconds, and never cache denials.

The directory and access control are now decoupled. Those five mailboxes still have no directory record; that hasn’t changed and doesn’t need to, because the directory is no longer consulted when deciding access. Previously “no record” meant “unprotected”; now it means nothing.

Any Safe module resolving getOwners() per request inherits the same tension between fail-closed correctness and RPC availability. It is now a named audit requirement rather than something to discover in production.


Finding 2: getOwners() is not consent – this changed the protocol

This one is not a bug in my code. It is an attack against me, and it invalidated an assumption written into this proposal.

What happened

An address I control was added as an owner of a Gnosis Safe created by someone else, without my knowledge or consent, in what appears to be a Safe address-poisoning setup. Blockaid subsequently classified my address as an address-poisoning operator on the strength of that owner configuration, which is now affecting how mints of the FAX CHAIN proof-of-concept contract are treated.

Blockaid’s response to my verification request, quoted directly:

The address 0x1c63C3d9d211641e15cd3aF46De76b4bc84CC382 is flagged as an address-poisoning operator based on observed on-chain activity. The address was identified in the owner configuration of a Safe smart account that appears to have been created to impersonate another legitimate Safe.

They confirmed in the same message that neither nftfax.app nor ghostagent.eth carries a malicious flag. The finding is against the address only. My appeal is pending.

The specifics (anyone can verify them)

Impersonating Safe — 0x3189143eC385AE81bB1bf2005FFf17E175b75E70 (Ethereum), Safe v1.4.1, threshold 3 of 5:

Owner Control
0xe811F02418646AE93F540ED2877a487BE85dd842 mine — eyemine.eth
0x1c63C3d9d211641e15cd3aF46De76b4bc84CC382 mine — the flagged address, FAX CHAIN contract owner
0xA32ec64ebD1a3907B806E3afE645b37991959aAf not mine
0xc6A2551eB9c3e14EAf4921CE85165b091F51C485 not mine
0x9c6C6770CFBb873fA9162d5E33c6681Bd624E0a8 not mine
  • Created by 0x5e36Ae4aAaf9cE428df1F198D96D17bEa08fA21b, an address I do not control.

  • Zero executed transactions. It has never done anything.

  • Four transactions have been proposed on it, all by me, each stranded at 1 of the 3 required confirmations, all submitted within three minutes on 2026-09-11:

Copied

nonce 0, 1   removeOwner(0x9c6C6770…)
nonce 2      removeOwner(0xc6A2551e…)
nonce 3      removeOwner(0xe811F024…)   ← eyemine.eth, removing myself

My legitimate Safe is 0xb7e493e3d226f8fE722CC9916fF164B793af13F4, 1 of 2, owners 0xf251Ca37… and 0x1c63C3d9…, deployed on both Ethereum and Base.

The mechanism

Three properties combine into a trap:

  1. Safe owner assignment is permissionless at creation. Anyone can name any address as an owner. There is no consent step, no notification, and no way to decline.

  2. Safe has no unilateral exit. Removing an owner requires the same threshold as any other transaction. With the threshold at 3 and three of the five owners outside my control, I can never reach it. I cannot remove them, and I cannot remove myself. The removeOwner attempts above will never execute.

  3. Reputation systems treat the owner set as an affiliation graph. Being named propagates a malicious classification to the named address, and from there to unrelated contracts that address deploys or owns.

Any Safe signer can be conscripted into a hostile owner set, cannot leave, and may find unrelated deployments degraded by association. There is currently no primitive for proving non-affiliation.

What this means for Pipes

The original proposal states that identity is verified against the Safe contract, that getOwners() returns the current signer set, and that only those wallets can read or write to safe.42@pipe.

That is not sufficient, and this incident proves it. Under the specification as written, the impersonating Safe above would have auto-provisioned a coordination channel with me as a member, without my consent, and I would have had no way to leave, because leaving depends on Safe threshold, which the attacker controls. Worse, the attacker could point at my membership as social proof: “eyemine.eth coordinates with us.”

This is the second time in this development cycle that an authority turned out to be insufficient for authorisation. First a cached registry, then getOwners() itself. The lesson is the same: a lookup that tells you who is listed is not the same as proof that they agreed.

The protocol change: consented, revocable membership

Pipes membership is no longer getOwners() alone. It is now the intersection of getOwners() AND the set of signers who have published a signed acceptance naming that specific Safe.

  • Acceptance: A SIWE-style signature from the signer, naming the specific Safe address. Being listed by getOwners() is necessary but not sufficient — you must also consent.

  • Revocation: Unilateral. A signer can revoke their acceptance at any time, regardless of Safe threshold, because the acceptance is signed with their own key and not governed by Safe state.

  • Verification: Anyone can verify whether a given address has accepted membership in a given Safe’s coordination channel.

This gives a Safe signer something Safe itself does not provide: exit. It also produces, as a byproduct, exactly the artefact Blockaid asked me to produce – a signed, timestamped, independently verifiable statement that an address does not operate a given Safe. Proof of non-affiliation, from the same primitive that gates the channel.


Why these matter for this proposal

Both findings came from running real infrastructure. Neither would have surfaced on a testnet or in a whitepaper. The first needed real mailboxes with unregistered handles; the second needed a real adversary. The proof-of-concept is doing what it was built to do – surfacing protocol-level problems before any DAO treasury depends on the result.

The audit line item ($25,000) exists to do this systematically rather than opportunistically. I have found two issues by trial and error and one by being targeted. A funded audit finds the rest on purpose.


Still not true, stated plainly

Consistent with README.md in the pipes repository:

  • The deployed relay still runs the pre-migration path – v1 (P-256) envelopes, recipient keys from its own registry. The published packages/relay reference implementation uses secp256k1. Wiring the migration into production is the first task in scope.

  • No Safe module yet. Automatic rotation on signer-set change is designed, not deployed. The authorisation work described above is the NFT-gated path; the getOwners() path, now with consented membership, is scoped work.

  • No mixnet transport yet. HOPR/Gnosis VPN transport is scoped. We have applied for early access.

  • Not audited. That is what this GIP funds.

  • The delegate.xyz path is wired but untested. Ownership verification through a delegate-aware helper should authorise a hot wallet delegated by a cold vault, but I have not exercised it end to end.

The core relay infrastructure continues to run without downtime. Happy to answer questions on any of these.

1 Like

**Update, 2026-09-28:** done, and it worked. I sent Blockaid a signed proof of control, the lookalike Safe’s creation transaction (paid by `0x5e36…`, an address I have no relationship with), and the four `removeOwner` proposals decoded — including nonce 3, my attempt to remove my *own* address. Their reply: *“we have found that the flagging was indeed incorrect, the flagging has been modified accordingly.”* Sixteen days from flag to clearance, and it required producing, by hand, exactly the artefact this section argues the protocol should make automatic: a signed, timestamped statement of non-consent that a reputation provider can verify without asking.

Update: three production findings, one of which changed the protocol

TL;DR

  • Running nftfax.app with real users surfaced three security findings before any audit: an authorisation path that failed open for unregistered identities (fixed), an unauthenticated endpoint that spent funds (fixed), and a real owner-set poisoning attack against my own address that invalidated this proposal’s membership model.

  • The attack got my deployer address flagged as malicious by Blockaid. I appealed with a signed proof of control and decoded evidence; Blockaid reversed the flag on 2026-09-28. The artefact that cleared it (a signed, verifiable statement of non-affiliation) is exactly what the protocol change below produces automatically.

  • Protocol change: Pipes membership is no longer getOwners() alone. It is getOwners() and a signed, unilaterally revocable acceptance from the signer. Being listed is not consent. This is specified, but not yet built.

  • Three corrections to my September 8 update, stated below, where I described designs in terms that the deployment did not yet meet.

  • Still not true: no Safe module, no consented-membership implementation, no mixnet transport, the live relay is still on the v1 encryption path, not audited. The audit line item exists to find, on purpose, what I’ve found so far by accident and by being targeted.

  • NFTFAX CHAIN is going physical at Art Blocks’ Marfa Weekend Oct 22-25:
    Collage art faxes forwarded from the gallery in Texas are minted on Base and printed out on a real “Fax” thermal printer in Australia, viewed live over webcam on the exhibition display at nftfax.app/exhibit. Same relay, same public feed, no special casing; a coordination layer demonstrated at planetary distance.

  • Live numbers, verifiable: 4 communities, 64 registered identities, 45 public faxes from 21 senders

  • 23 collectibles minted by 13 wallets, 0.046 ETH in the prize pool.

- – -

Running the consumer proof-of-concept (nftfax.app) with real users has produced three findings that directly shaped the Pipes design. Two are implementation bugs we fixed. The third is a direct attack against my wallets, which invalidated a core assumption in this proposal and forced a protocol change. I am disclosing all three in full, including the malicious classification my address carried for sixteen days and how it was resolved, because a proposal asking for audit funding should be judged on how it handles findings rather than on a claim to have none.

Corrections to my September 8 update

Before the findings, three statements from my last update that I now consider too strong. In each case, I described a design property in the present tense when the deployment did not yet have it.

  1. “Signer rotation: the current Safe owner set remains the source of truth, so access changes follow on-chain state.” Finding 2 shows getOwners() alone is not a safe source of truth for membership. It tells you who is listed, which an attacker can arrange without the listed party’s consent. The corrected model is below.

  2. “We are beginning to test Pipes traffic through Gnosis VPN/HOPR transport.” We have applied for early access. Credentials have not been issued, and no transport testing has taken place. “Beginning to test” was premature; the accurate statement is “applied, waiting.”

  3. “Operator blindness: the relay stores and serves ciphertext.” True of the published packages/relay reference implementation. The deployed relay still runs the pre-migration path: v1 (P-256) envelopes with recipient keys from its own registry. The operator-blind property holds for the library, not yet for the production deployment. Wiring the migration is the first in-scope task.

- – -

Finding 1: authorisation resolved against a cache instead of the chain

nftfax.app authorised access to a mailbox by consulting the relay’s identity directory rather than the chain. An @fax identity is not created by signing up; it exists as soon as you hold the NFT. So most handles have no directory record at all. The check only ran for handles that did have one: a handle with no record matched neither branch and continued into the handler unverified. Measured against live data, 5 of the 8 mailboxes that had actually received traffic had no directory record, so for those the check never ran and any connected wallet could:

- read inbox and sent-message metadata,

- read the account’s credit balance,

- delete another identity’s messages, and

- re-route another identity’s message to a different recipient, which in the game also disables the original recipient’s mint.

The last two are destructive, not a read leak. To be precise about what was not possible: sending from an identity was gated separately, so this was unauthorised access to other people’s mailboxes, not impersonation.

The same assumption failed in the opposite direction. Where the registry did hold a record, that record went stale as soon as the underlying NFT was traded, so the legitimate current owner was refused with `Wallet does not match the registered owner`. One bad assumption: failing open for attackers and failing closed for real users at the same time.

The fix. Authorisation now resolves on-chain per request and fails closed. Identity derives from the asset itself (ownerOf(tokenId) against the owning collection’s contract) with no cached record in the authorisation path. Applied to every endpoint that returns mailbox contents or performs a destructive action; the mint, save, and reset-mint routes inherit it via the same check. Verified against live mailboxes on both Base and Ethereum: the legitimate owner receives 200, any other wallet 403. I also checked the over-blocking case, because an authorisation change that locks users out of their own mailbox is a worse outcome than the original bug.

The point worth drawing out is that directory presence and access control are now decoupled. Those five mailboxes still have no directory record; that hasn’t changed and doesn’t need to, because the directory is no longer consulted when deciding access. Previously “no record” meant “unprotected”; now it means nothing. A directory is a lookup convenience, and the moment it is consulted for authorisation, it becomes a security boundary it was never designed to be.

What I am not going to claim. This was not purely a proof-of-concept shortcut. README.md in the pipes repository states that the deployed relay still reads recipient keys from its own registry, and names migrating off that path as the first task in this scope. The POC has now demonstrated, on live traffic, the failure mode of the very pattern the relay is scheduled to migrate away from. That is the empirical case for prioritising it, not evidence that production was already correct.

A second bug, which I introduced while fixing the first. Worth reporting because it is instructive about fail-closed design. The initial fix verified ownership for every identity a wallet holds before reading anything. A wallet holding a dozen NFTs exhausted the public RPC rate limit partway through: the first five ownerOf calls succeeded, the rest errored. Because the check correctly fails closed, those identities silently reported zero waiting messages. A live message with 36 hours left on its timer was invisible.

Fail-closed is the right default, and it converted a rate limit into silent data loss. More retries did not help; they hit the same throttled endpoint. The fix was to stop making twelve on-chain calls to report one message: read cheap state first, spend on-chain verification only on results actually returned, and cache authorised results for 60 seconds – never denials, so connecting the correct wallet takes effect immediately.

Any Safe module resolving getOwners() per request inherits the same tension between fail-closed correctness and RPC availability. It is now a named audit requirement rather than something to discover in production.

- – -

Finding 2: getOwners() is not consent; this changed the protocol

This one is not a bug in my code. It is an attack against me, and it invalidated an assumption written into this proposal. It has since been resolved in my favour, making it a complete case study rather than an open dispute, but the protocol gap it exposed remains unchanged.

What happened

Someone added an address I control as an owner of a Gnosis Safe they created, without my knowledge or consent, in what appears to be a Safe address-poisoning setup. Blockaid classified my address as an address-poisoning operator based on that owner configuration. While the flag stood, it affected how transactions involving the FAX CHAIN proof-of-concept contract were treated, since that address had deployed and owned it.

Blockaid’s initial finding, quoted with the relevant part:

> The address 0x1c63C3d9d211641e15cd3aF46De76b4bc84CC382 is flagged as an address-poisoning operator based on observed on-chain activity. The address was identified in the owner configuration of a Safe smart account that appears to have been created to impersonate another legitimate Safe.

They confirmed in the same message that neither nftfax.app nor ghostagent.eth carried a flag.

Resolution, 2026-09-28. After an appeal supplying a signed proof of control, the lookalike’s creation transaction, and the decoded remediation attempts described below, Blockaid replied:

> After a thorough investigation, we have found that the flagging was indeed incorrect, the flagging has been modified accordingly.

Sixteen days from flag to clearance. In the interim, I transferred FAX CHAIN ownership to ghostagent.eth (tx 0xec2f60a2…3fb786, 2026-09-22) so that a public contract was not tied to a disputed address; that transfer stays.

The specifics, so that anyone can verify them

The Safe being imitated is one of mine: 0x316aC7032d1a2b00faAB8A72185f5Ef8b4c75E70 (Ethereum), 1 of 1, sole owner eyemine.eth, deployed for the LabLab.ai hackathon to demonstrate notapaperclip.red.

The impersonating Safe 0x3189143eC385AE81bB1bf2005FFf17E175b75E70 (Ethereum), Safe v1.4.1, threshold 3 of 5 shares the first four and last five characters with it (0x31…75e70), which is the shape of a vanity-generated lookalike:

| Owner | Control |

| 0xe811F02418646AE93F540ED2877a487BE85dd842 | mine (eyemine.eth) the legitimate Safe’s real owner, copied into the fake |

| 0x1c63C3d9d211641e15cd3aF46De76b4bc84CC382 | mine. Publicly linked to eyemine.eth as co-owner of my operational Safe; added to make the fake look more convincingly mine |

| 0xA32ec64ebD1a3907B806E3afE645b37991959aAf | not mine :angry_face_with_horns: |
| 0xc6A2551eB9c3e14EAf4921CE85165b091F51C485 | not mine :angry_face_with_horns: |
| 0x9c6C6770CFBb873fA9162d5E33c6681Bd624E0a8 | not mine :angry_face_with_horns: |

- Created by 0x5e36Ae4aAaf9cE428df1F198D96D17bEa08fA21b :angry_face_with_horns:
(tx 0x8b0af698…ab11ca, 2026-03-18), an address I have no relationship with.
- Zero executed transactions. It has never done anything.
- Four transactions have been proposed on it, all by me, each stranded at 1 of the 3 required confirmations, all submitted within three minutes on 2026-09-11 — the day I learned of the flag:

```
nonce 0, 1 removeOwner(0x9c6C6770…)
nonce 2 removeOwner(0xc6A2551e…)
nonce 3 removeOwner(0xe811F024…) ← eyemine.eth, i.e. removing myself

```

Both of my addresses sit on the deceived side of this configuration, not the controlling side. The three attacker-set owners reach threshold; my two never can.
My operational Safe, 0xb7e493e3d226f8fE722CC9916fF164B793af13F4 (1 of 2, owners 0xf251Ca37… and 0x1c63C3d9…, on Ethereum, Base, Gnosis, Optimism and Story), was not imitated; it is where the public link between my two addresses comes from.

The mechanism, which I think is under-appreciated

Three properties combine into a trap:

1. Safe owner assignment is permissionless at creation. Anyone can name any address as an owner.

There is no consent step, no notification, and no way to decline.

2. Safe has no unilateral exit. Removing an owner requires the same threshold as any other transaction. With the threshold at 3 and three of the five owners outside my control, I hold 2 of the 3 signatures required and can never reach it alone. I cannot remove them, and I cannot remove myself; the removeOwner attempts above cannot execute without cooperation from the very addresses they are trying to remove. The asymmetry is total: whoever controls those three can reconfigure the Safe at will, including removing me. I cannot reciprocate.

3. Reputation systems treat the owner set as an affiliation graph. Being named propagates a malicious classification to the named address, and from there to unrelated contracts that address deploys or owns. That is how a coordination-layer artefact ended up affecting a token contract on a different chain.

Point 3 is the part that should concern other DAOs rather than just me. Any Safe signer can be conscripted into a hostile owner set, cannot leave, and may find unrelated deployments degraded by association. There is no standard primitive for proving non-affiliation. Blockaid asked for “a signed message proving control”, “an explanation of why it was added as an owner”, and “evidence supporting a legitimate purpose, false attribution, or wallet-compromise claim”. I produced all of that by hand, a personal-sign message, decoded calldata, a timeline and it took a human review cycle to accept. The appeal succeeded; the process it required is the finding.

What this means for Pipes, including where the proposal was wrong

The original proposal states that identity is verified directly against the Safe contract, that getOwners() returns the current signer set, and that only those wallets can read or write to safe.42@pipe.

That is not sufficient, and this incident proves it. Under the specification as written, the impersonating Safe above would have auto-provisioned a coordination channel with me as a member, without my consent, and I would have had no way to leave, because leaving depends on Safe threshold, which the attacker controls. Worse, the attacker could then point at my membership as social proof: eyemine.eth coordinates with us. Pipes would not merely have failed to prevent this attack. It would have handed the attacker a credibility primitive.

Notably, this is the second time in this development cycle that an authority turned out to be insufficient for authorisation. First a cached registry, then `getOwners()` itself. The lesson in both cases is the same: a lookup that tells you who is listed is not the same as a proof that they agreed.

The protocol change: consented, revocable membership

Status: specified, not yet implemented. This is the design the incident forced; building it is scoped work, listed in “Still not true” below.

Membership is no longer getOwners(). It is the intersection of getOwners() and the set of signers who have published a signed acceptance:

- Acceptance is a SIWE-style signature naming the specific Safe. Being listed by `getOwners()` is necessary but not sufficient.

- Revocation is unilateral. A signer can revoke at any time regardless of Safe threshold, because the acceptance is their own signature rather than Safe state.

- Both are verifiable by anyone, so a third party can check whether an address actually participates in a given Safe’s coordination channel.

This gives a signer something Safe itself does not provide today: exit. It also produces, as a by-product, exactly the artefact I had to assemble by hand for Blockaid, a signed, timestamped, independently verifiable statement that an address does not operate a given Safe and which, once assembled, they accepted. Proof of non-affiliation, from the same primitive that gates the channel, available on demand instead of after sixteen days of correspondence. I would rather have found this by reading the spec than by being attacked, but it is a better finding than the one I was looking for.

- – -

Finding 3: found while writing this update

Auditing my own claims for this post surfaced a third issue, which is worth reporting because of how it was found. I wanted to state that the on-chain authorisation check now covered every endpoint that exposes mailbox contents or performs a destructive action. Rather than assert it, I enumerated the routes and found that /api/tray/\[id\]/pin had no authentication of any kind. No wallet, no ownership check.

On its own that was merely wasteful. But earlier that day I fixed the Arweave mirror so image uploads actually succeed, which means the endpoint now funds an on-chain Irys deposit and uploads roughly a megabyte per call. Before that fix, the upload failed and cost nothing; after it, anyone holding a tray ID could drain the Irys wallet on the order of 1,500 calls at current prices and write unbounded permanent pins against my Pinata quota.

A reliability fix converted a wasteful endpoint into a possible funds-draining one, and nothing in the change itself looked security-relevant. Now gated by the same on-chain ownership check as the other routes: no wallet returns 401, a wallet that does not own the mailbox returns 403, the owner returns 200.

Two things I take from this. Cost is an attack surface, and an endpoint that spends money needs the same authorisation discipline as one that returns private data, a distinction easy to miss because it does not read or write user data at all. It was caught because writing a precise claim forced enumeration. “Applied everywhere” is the kind of sentence that hides a gap; listing the routes does not.

- – -

Why these matter for this proposal

All three findings came from running real infrastructure. None would have surfaced on a testnet or in a whitepaper: the first needed real mailboxes with unregistered handles, the second a real adversary, the third a real endpoint spending real funds. The proof-of-concept does what it was built to do: surface protocol-level problems before a DAO treasury depends on the result.

The second finding also produced something a whitepaper cannot: a security vendor’s process, observed end to end. Blockaid flagged an address based on a Safe owner set, asked for a signed statement of non-affiliation that no standard produces, accepted the one I assembled by hand, and reversed the flag. Sixteen days. The consented-membership primitive would have answered in seconds, and that is the clearest argument in this update for funding it.

The audit line item ($25,000) exists to do this systematically, not opportunistically. I found one issue by accident, one by being targeted, and one by being forced to write a precise sentence. That is not a methodology. A funded audit is.

- – -

Other progress

Author-reported, not independently verified in this update:

- Encryption migration: secp256k1 v2 committed: the wallet key is the encryption key. P-256 v1 retained for backward compatibility with existing envelopes. Awaiting deployment to the live relay.

- ERC-6551 backpacks: the Chonks backpack viewer with asset withdrawal is live inside nftfax.app. The planned standalone explorer (nftbackpack.ninja) has been dropped: the ERC-6551 standard’s author has since shipped the official explorer at erc6551.xyz, including transfer, which covers the generic case. Collection-specific backpack views stay in the products that need them rather than duplicating reference infrastructure.

- Gnosis VPN: applied for early access. HOPR transport testing begins when credentials are issued.

- Availability: one incident. On 2026-09-22, a production image build running on the same 8 GB host as the live containers exhausted memory; the kernel killed the Docker daemon, and nftmail.box was down for roughly 30 minutes until restarted. Self-inflicted and structural: builds now run in GitHub Actions, and the host only pulls images. The relay process itself was not affected. I am no longer claiming “no downtime.”

- Blockaid: the flag on the deployer address was reversed on 2026-09-28 after appeal (Finding 2).

Texas to Australia: NFTFAX at Art Blocks’ Marfa Weekend

The proof-of-concept is leaving the browser. For Artblocks.io Marfa Weekend (22-25 Oct, Marfa, Texas), the exhibition display at nftfax.app/exhibit runs on a wall in the Plastic Cactus gallery: the network summary, the latest public transmissions, the minted collectibles, and the current fax rendered as thermal paper.

A visitor can select a minted fax, add a Cover Note and forward it from the wall-mounted touchscreen device. The tablet plays the fax handshake tone, and roughly 14,000 km away, in Australia, a real thermal printer inside a replica fax machine prints it. A webcam on that machine streams back to the gallery as a picture-in-picture, so the room watches the paper emerge on the other side of the planet a few seconds after the tones stop.

Nothing in the installation is special-cased. The wall reads the same public leaderboard and tray documents as the website, over the same relay; the printer in Australia is driven by a small local middleware that receives the same event a browser would. That is deliberate. The proposal is for infrastructure that lets people who have never met coordinate through nothing but chain state and ciphertext. A fax crossing the Pacific from a gallery to a machine, with every hop publicly verifiable on Base and no one in between able to read the private ones, is that claim made physical, in front of people who have never heard of a Safe.

Building it has already paid for itself. Preparing the display surfaced the throttling failure under a burst of concurrent requests described in Finding 1’s follow-up, a cache that pinned stale artwork for a day, and the expired forward markers that misattributed several early mints, none of which a single-user browser session had ever triggered. A gallery wall is a load test with an audience. I will post photographs from both ends, the print log, and any further findings here after the weekend.

- – -

Still not true, stated plainly

Consistent with README.md in the pipes repository:

- The deployed relay still runs the pre-migration path v1 (P-256) envelopes, recipient keys from its own registry. The published packages/relay reference implementation is secp256k1. Wiring the migration into production is the first in-scope task.

- No Safe module yet. Automatic rotation on signer-set change is designed, not deployed. The authorisation work described above is the NFT-gated path; the getOwners() path, now with consented membership, is scoped work.

- Consented, revocable membership (Finding 2) is specified, not implemented. Nothing running today produces or checks an acceptance or revocation signature.

- No mixnet transport yet. Topic derivation exists; HOPR/Gnosis VPN transport is scoped.

- Not audited. That is what this GIP funds.

- The delegate.xyz path is wired but untested. Ownership verification calls through a delegate-aware helper, so a hot wallet delegated by a cold vault should be authorised, but I have not exercised it end-to-end and am not claiming it works.

- – -

Open questions for reviewers

1. Deny-on-RPC-failure. Authorisation currently denies when the chain is unreachable. For a coordination channel, that means an RPC outage locks signers out mid-incident, precisely when coordination matters most. Is fail-closed correct here, or is a short authenticated grace window preferable?

2. Plaintext annotation beside encrypted payloads. The POC added a short plaintext note carried alongside an opaque payload, which is useful for triage without decrypting but is metadata leakage by definition. For Safe coordination, is a plaintext subject line worth the leak, or should everything live inside the envelope?

3. Should consented membership be a standard? The acceptance/revocation artefact is useful well beyond Pipes; any reputation provider assessing affiliation could consume it. Worth pursuing as an ERC, or premature?