Skip to main content
KineticVM on Monad is four addresses a device talks to, plus two ERC-8004 registries it shares with every other agent on the chain. The device never holds a special role in any of them. It holds a key that the registry has bound to an agent, and every contract checks that binding before it accepts a signature. Addresses, deployment transactions, and explorers are on Deployments.

How a claim uses all three

1

KineticRegistry.claim

Mints an ERC-8004 agent to the caller, checks the device’s claim ticket, and calls DeviceVault.bindLimits with the starting caps.
2

IdentityRegistry.setApprovalForAll

The owner approves KineticAttestor. The registry cannot do this. It only holds the NFT for the duration of claim.
3

DeviceVault.deposit

Anyone can fund the agent. The device spends through pay and topUpGas. The owner recovers funds with withdraw.
4

KineticAttestor.attest

The device signs an action proof. The attestor checks the active device and the owner approval, then writes response 100 to the Validation Registry.

Rules that hold in every contract

  • The owner is always ownerOf on the Identity Registry. KineticVM does not keep a second copy that can drift.
  • The device key is never the NFT owner, and no KineticVM contract approves it as an operator.
  • Raising a cap, adding a recipient, or unpausing requires the owner wallet or an EIP-712 signature from it. Tightening and pausing are direct owner calls.
  • activeDevice reverts when the NFT has moved, so a sold machine cannot keep spending on the previous owner’s terms.
  • The attestor never calls giveFeedback. Reputation is a separate ERC-8004 surface, and this deployment does not write it.
These contracts are deployed on Monad testnet and have not been audited. Treat balances as testnet MON. Mainnet is refused by the runtime until a mainnet deployment exists.
The source is contracts/src, compiled with Solidity 0.8.28 and the optimizer at 200 runs. Tests live next to the contracts in contracts/test.