Skip to main content
Utter’s on-chain layer is four Solidity contracts (Solidity 0.8.28) plus the reference ERC-8004 registries. All amounts are USDC base units. The basis-point denominator is 10000. Deployed addresses are on the addresses page.

PaymentEscrow

The primary money path. Buyers hold an internal deposit balance; a relayer-signed debit charges against it and splits the amount inline. EIP-712 domain: UtterEscrow version 1.

debit checks

debit enforces, in order:
  1. The nonce is unused (usedNonce mapping).
  2. validBefore has not passed.
  3. amount <= maxAmount.
  4. The EIP-712 signature over the authorization recovers the buyer.
  5. The resource is active in the registry.
It then splits inline: toCreator = amount * creatorBps / 10000, toTreasury = amount - toCreator, crediting internal balances. An underfunded debit reverts on balance underflow, so the buyer’s balanceOf is the effective reservation.

DebitAuthorization type

Events

The Debited event carries both split legs, so settlement and the split are one transaction. See the escrow response gate.

ResourceRegistry

On-chain config keyed by bytes32 resourceId.

Roles

Slashing (two-step)

Slashing has a dispute window so a creator can contest a strike-driven slash before funds move:
  1. slashAuthorization(bytes32 resourceId, uint256 amount, string reason) records a pending slash. A SLASH_DISPUTE_WINDOW of 1 day starts.
  2. cancelSlashAuthorization(...) disputes and cancels the pending slash during the window.
  3. consumeSlashAuthorization(...) is called by the vault after the window to finalize.

StakingVault

Per-resource USDC bond custody plus an insurance pool. Funds never leave the vault on a slash; they move from a bond into the pool.

PaymentSplitter

The flat-path splitter for the exact scheme. It holds a balance and flushes it on demand.

ERC-8004 reference registries

The reference identity, reputation, and validation contracts an Utter resource is registered against. See ERC-8004 identity.