Gate your contract on a provable verdict.
ProofLock issues a versioned, revocable admission verdict on-chain. Any contract reads it at its own door in one line.
Import the interface. Call it at your door.
AgentGateV2 is the whole integration surface. requireAgent is a pure view function: it admits or reverts, costs no gas beyond your own call, and cannot alter state.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IAgentGateV2 {
// reverts AgentRejected(reason) if the agent is not currently admitted
function requireAgent(uint256 agentId)
external view returns (address subject, uint64 version);
}
contract MyProtocol {
IAgentGateV2 public immutable gate;
constructor(address gateAddress) {
gate = IAgentGateV2(gateAddress); // AgentGateV2 on 0G mainnet
}
function doSomethingForAgent(uint256 agentId) external {
// one line: admits or reverts
(address subject, uint64 version) = gate.requireAgent(agentId);
require(msg.sender == subject, "caller is not the bound agent wallet");
// ... your logic runs only for a currently-admitted agent
}
}Prefer a non-reverting branch? Call checkAgentinstead and read the stable reason code.
// Non-reverting variant: branch on the reason code instead of reverting.
interface IAgentGateV2Check {
function checkAgent(uint256 agentId)
external view
returns (bool allowed, uint8 reason, address subject, uint64 version);
}Deployed on 0G mainnet.
Every address is live and readable on the public explorer. A live demo consumer, ProofLockConsumerDemo, already gates on the verdict on mainnet.
- AgentGateV2 · the gate you call
- 0x32Ae81B1150AA7E91d8341E59b3810950e7A1171
- ProofLockConsumerDemo · live integrator
- 0x71823afFA086f6a4Be64B67142480Fa889Cd0773
- SentinelRegistryV2 · where verdicts are sealed
- 0x1d802114cfAFFd179f49E2F6fa8e11207c118944
- ERC-8004 Identity Registry · canonical
- 0x8004a169fb4a3325136eb29fa0ceb6d2e539a432
Every rejection has a name.
checkAgent returns a stable reason code. 0 is admitted; every non-zero value names the exact rejection.
| Code | Name | Meaning |
|---|---|---|
| 0 | ALLOWED | Allowed |
| 1 | NO_PROOF | No ProofLock |
| 2 | REVOKED | Revoked |
| 3 | DRIFTED | Drift detected |
| 4 | EXPIRED | Lease expired |
| 5 | SUBJECT_CHANGED | Agent wallet changed |
| 6 | RUNTIME_CODE_DRIFT | Runtime code drift |
| 7 | POLICY_TOO_OLD | Policy too old |
| 8 | COVERAGE_INCOMPLETE | Coverage incomplete |
| 9 | COMPUTE_UNVERIFIED | Compute unverified |
| 10 | STORAGE_UNVERIFIED | Storage unverified |
| 11 | BEHAVIORAL_RISK | Behavioral policy denied |
| 12 | CODE_RISK | Code policy denied |
| 13 | IDENTITY_UNAVAILABLE | Identity unavailable |
| 14 | AGENT_NOT_FOUND | Agent not found |
| 15 | AGENT_WALLET_UNSET | Agent wallet unset |
| 16 | IDENTITY_MISMATCH | Identity mismatch |
What the seal is backed by.
Three engines run before any verdict is sealed. Each is honest about its limits.
TEE-attested inference, verified on-chain
Risk inference runs on 0G Compute inside a hardware TEE (Intel TDX / dstack). The paid inference settles on-chain, and the verdict is bound to the exact response bytes and checked against the enclave's EIP-191 signature before it is sealed.
Deep identity + code analysis
Every agent is classified as an EOA, an EIP-7702 delegated EOA, or a contract with EIP-1967/1167 proxy unwrapping. Contract bytecode is disassembled opcode-by-opcode to flag selfdestruct, delegatecall, mint, pause, and blacklist patterns.
Live threat intelligence
Sanctions and scam screening runs live against ScamSniffer, alongside an OFAC sanctions set.