Skip to Content
Dial v1 live 🎉

Security

Not audited. Last checked 2026-11-02. These are design requirements. Unless a page shows evidence, assume an invariant isn’t implemented yet.

Invariants

Every implementation must keep these true:

  1. Execution can’t exceed authorization. It can’t exceed the signed amount, recipients, duration, asset or contract version.
  2. Verification doesn’t depend on Dial services. Holding the object is enough to check the signature and the commitment.
  3. Unverifiable means rejected. Stale, missing or unreachable data fails closed.
  4. Side effects happen at most once per authorization.
  5. Irreversible effects wait for settlement at the level that route requires.
  6. A destination is only advertised if its derivation is proven against real deployment.
  7. Every state claim has evidence. A webhook or cache entry is only a signal.

Trust boundaries

You can verify independentlyYou have to trust
The SPORE signature and its termsThat the signer’s key wasn’t stolen, and that the identity binding is right
The SPAWN commitmentThe code behind the commitment, unless audited
On-chain execution and settlementThe network’s consensus
Route constraints in the signed objectThe provider’s actual performance
Any off-chain service’s claims
An admin or guardian key where a contract has one

Threats and required handling

ThreatRequired handling
Replayed authorizationNonce and sequence checks, and durable deduplication before side effects
Credit granted before settlementHold irreversible effects until settlement. Keep a reversal path for pending states
Tampered amount or payeeSignature covers them, and clients display only signed values
Expired or revoked objectChecked at execution time, as well as at display time
Quote changed after approvalRe-authorization
Malicious metadataTreat unsigned content as untrusted, and sanitize it for display
Wrong token or networkWarn before payment, and publish the recovery policy per adapter
Address mismatchFour-way equality before funds
Lost deployment inputsStore and back up salt and init code, or make them recoverable from the signed object
ReorgWait for the route’s stated finality
Partial failureReport it as unresolved, with a named owner for recovery
Compromised serviceSeparate public read services from privileged signing services

A payment request delivered by text or email looks the same whether it’s real or forged. So:

  • Show the issuer only from a verified signature and identity binding, never from the message text or page content.
  • Show a clear unverified state when verification fails or can’t run.
  • Display the exact recipient, asset and network from the signed object.
  • Use one known resolver domain, and teach users to expect it.
  • Treat a link as a pointer. It carries no authority.

Explore invoicing: Programmable Invoicing

Last updated on