Predicate is programmable policy infrastructure for onchain financial products in regulated markets. It allows developers to enforce custom compliance rules at the smart contract level. This repository holds the official solidity contracts for Predicate's Application Compliance offering.
Full integration guide: docs.predicate.io
src/
├── PredicateRegistry.sol # Core registry contract (Predicate-owned)
│ # - Attester management
│ # - Attestation verification
│ # - UUID-based replay protection
│
├── mixins/
│ ├── PredicateClient.sol # Full-featured client (WHO + WHAT validation)
│ │ # - _authorizeTransaction(attestation, encoded, sender, value)
│ │
│ └── BasicPredicateClient.sol # Simplified client (WHO-only validation)
│ # - _authorizeTransaction(attestation, sender)
│ # - Use when policies only validate sender identity
│
├── interfaces/
│ ├── IPredicateRegistry.sol # Registry interface + Statement/Attestation structs
│ └── IPredicateClient.sol # Client interface
│
└── examples/ # Reference implementations
├── inheritance/ # Direct inheritance pattern
└── proxy/ # Proxy pattern for separation of concerns
forge install PredicateLabs/predicate-contractsnpm install @predicate/contractsBasicPredicateClient - Use when your policy only validates WHO is calling (sender identity):
import {BasicPredicateClient} from "@predicate/contracts/src/mixins/BasicPredicateClient.sol";
import {Attestation} from "@predicate/contracts/src/interfaces/IPredicateRegistry.sol";
contract MyVault is BasicPredicateClient {
constructor(address _registry, string memory _policyID) {
_initPredicateClient(_registry, _policyID);
}
function deposit(uint256 amount, Attestation calldata attestation) external payable {
require(_authorizeTransaction(attestation, msg.sender), "Unauthorized");
// ... business logic
}
}PredicateClient - Use when your policy also validates WHAT is being done (function, args, value):
import {PredicateClient} from "@predicate/contracts/src/mixins/PredicateClient.sol";
import {Attestation} from "@predicate/contracts/src/interfaces/IPredicateRegistry.sol";
contract MyVault is PredicateClient {
constructor(address _registry, string memory _policyID) {
_initPredicateClient(_registry, _policyID);
}
function deposit(uint256 amount, Attestation calldata attestation) external payable {
bytes memory encoded = abi.encodeWithSignature("_deposit(uint256)", amount);
require(_authorizeTransaction(attestation, encoded, msg.sender, msg.value), "Unauthorized");
// ... business logic
}
}- Integration Guide: docs.predicate.io/v2/applications/smart-contracts
- Supported Chains: docs.predicate.io/v2/applications/supported-chains
- API Reference: docs.predicate.io/api-reference
See LICENSE for details.
This software is provided as-is. Use at your own risk.
