NuntioAccount.sol
The account that holds the funds and decides every payment. Allowance, per payment cap, frequency limit, expiry, pause, and a merchant allowlist held separately for each spender. There is no address parameter on the paying function at all, so naming a recipient is not something a spender can express.
- packages/contracts/src/NuntioAccount.sol
- 1,064 lines
- 188 tests
ApprovalQueue.sol
Where a refused payment goes to ask a human. It is a separate transaction because a revert rolls back its own writes, so blocking a payment and recording that somebody asked for it cannot happen in the same call. Only the owner may agree to a request, and a request is accepted only from the spender it names.
- packages/contracts/src/ApprovalQueue.sol
- 800 lines
- 108 tests
ServiceRegistry.sol
Merchant lookup by id. Resolution reverts on an id nobody registered, rather than returning the zero address, which is what makes an invented recipient fail at lookup instead of sending money to a hole and minting a receipt that claims delivery.
- packages/contracts/src/ServiceRegistry.sol
- 205 lines
- 30 tests
- packages/contracts/deployments/10143.json
NuntioTeamFactory.sol
Creates a sealed account and approval queue for a new team in one transaction, then hands ownership to whoever asked. Anyone signed in can create a team of their own through it, owned by their own wallet. On testnet it also created the Sandbox, the account every tester joins.
- packages/contracts/src/NuntioTeamFactory.sol
- 108 lines
- 15 tests, plus 3 for its deploy script
CallerProbe.sol
A throwaway diagnostic that records what a contract observes as its caller during a real transaction. It exists so that no authorization code has to assume the answer. It is state changing rather than a view, because a read reports what a node computes and not what the chain records.
- packages/contracts/src/CallerProbe.sol
- 130 lines
- 9 tests
- docs/research/CONSTANTS.md
The assistant
A constrained tool caller that emits a typed payment intent and nothing else. It holds no key, builds no calldata and picks no address. The pipeline runs catalog, provider, shape, resolution and assembly in that order, and the first stage refuses a request before the model is ever called.
- packages/agent/
- 266 tests across 13 files
Service resolution in the SDK
A lookup has four outcomes: known, unknown, suspended, and unreadable. Unreadable is the one that gets deleted, and folding it into unknown would let a rate limited node report a real merchant as invented, which is the most misleading direction that failure can take.
- packages/sdk/src/registry.ts
- 206 lines
- 207 tests in the package
The web application
Onboarding, policies, spenders, approvals, activity, the assistant screen, the testnet Sandbox and teams: creating your own, invitation links, and owner actions signed by the owner’s own wallet. It includes the held and declined states that the product exists to show. A blocked payment is drawn as a success state, because that is what it is. Payment history reads every account deployment through Envio HyperSync, and each payment shown is read back from its own onchain receipt.
- apps/web/
- 2,433 tests, plus 22 against the live chain
Persistence
PostgreSQL for the state a contract cannot hold: agents, jobs, payment intents, an append-only audit trail, Sandbox joins, and the teams people create with their invitations. Duplicate intents and duplicate chain events are refused by the database itself, not by application code remembering to check. Nothing here authorizes a payment; the contract still does that.
- packages/db/
- 4 migrations
- 122 tests, plus 55 against a real database
The agent worker
The process that lets an assistant act while nobody is signed in. It records an intent before it signs and a transaction hash the moment one exists, so a crash mid-payment is recovered by reading the chain rather than by sending again. It runs live on mainnet and testnet: on 12 October 2026 an agent paid $0.10 of real AUSD to a demo service run by Nuntio, by itself, from a wallet holding no MON. That service is suspended now, and the worker cannot buy a quoted compute run, so on mainnet an agent has nothing to pay on its own today. It files no approval requests yet, so an agent’s payment over its limit is refused and stops there.
- apps/worker/
- 354 tests, plus 74 against a real database
Agent identity
Each agent gets its own wallet, created by Privy under a key that only the worker holds, so the web server can set an agent up and can never sign for it. The wallet’s own policy allows payments from this account and approval requests for itself, and nothing else; the contract still decides every payment. Agents are in beta: during it, only Nuntio’s team can create one, and only on Nuntio’s own account, not yet on a team’s.
The commerce gateway
Nuntio’s own merchant, and on mainnet the only one. It signs a price, waits until the payment is final and matches that price exactly, then runs the model on 0G or buys the latest Monad block over x402, paying both from its own funds, and keeps the result. It can sign for no account. A run it cannot deliver is recorded as owed, and an operator sends the refund.
- apps/gateway/
- packages/commerce/
- packages/zg-compute/
- 407 tests, plus 27 against a real database
506 Solidity tests across 15 suites and 3,870 TypeScript tests across 280 files, all passing on 19 October 2026. Each rule the contracts enforce carries a test that it holds and a test that the invalid case is rejected.