The action proof
The device signs an EIP-712ActionProof:
name = "KineticAttestor", version = "1". The requestURI is hashed into the signature, so it cannot be swapped after signing. As with claim tickets, the device asks the contract for the digest (hashActionProof) and signs that.
What the attestor checks
Anyone can submit a signed proof toKineticAttestor.attest(proof, signature). In practice the device submits its own. The attestor accepts it only if every check passes:
1
The signer is the active device
The signature must recover to
KineticRegistry.activeDevice(agentId). A revoked key, a rotated-out key, or a key whose NFT changed hands is rejected.2
The nonce is fresh
nonceUsed[agentId][nonce] must be false. Otherwise NonceUsed.3
The proof is recent
timestamp may be at most 10 minutes old (StaleProof) and at most 2 minutes in the future (FutureProof).4
The attestor is an operator on the agent
The owner must have approved the attestor with
setApprovalForAll or approve. Otherwise NotOperator. ERC-8004 only lets an owner or operator open a validation request, and this is how the owner consents.What gets written
The attestor then computes a request hash and writes two calls to the Validation Registry:
Finally it emits:
getValidationStatus(requestHash) on the Validation Registry and get back the validator, agent, response, response hash, and tag. That lookup is the foundation of buyer verification.
When the device attests
- Actuator actions
- Builder operations
When
[chain] is enabled, the runtime wraps the actuator tools gpio_write, gpio_rpi_write, gpio_rpi_blink, and set_device. After one of them succeeds, the runtime attests it automatically:actionis the tool name,- the parameters are the tool’s JSON arguments,
requestURIiskinetic://actuator/<tool name>.
Plugin tools are not wrapped automatically. If a plugin drives a motor through its own path, the SOP or the model should call
monad_attest after the operation completes.Gas and nonces
The device pays gas for its attestations. Before submitting, the runtime checks its balance and tops up from the vault if it holds 1 MON or less. The runtime picks the nonce from the latest block time and tries up to four consecutive values until it finds one the attestor has not used, so two attestations in the same second do not collide.Reading attestations
/status lists explorer links for the five most recent Attested transactions for the agent.