Interface
| Contract | 0xfE9daFC133eD3e9726D4B2c24b8cC3c3AaDD8225 |
| Chain ID | 101010 — Global Trust Network |
| RPC | https://rpc.stabilityprotocol.com/zgt/try-it-out |
| Explorer | View the contract |
| ABI (canonical) | GET https://api.joinmonolith.com/c2pa/contract |
| ABI (download) | /abi/monolith-c2pa-registry.json |
This page covers the functions an outside integrator can call. The deployed ABI is published whole and contains additional entries used to operate the contract; they are intentionally not documented here.
Resolution
Lookups that search both registries, curated first. Start here unless you specifically need one registry.
| Function | Returns |
|---|---|
resolveByBinding(bytes32 fingerprint) | (string[] endpoints, string manifestId) |
resolveByBindingDetailed(bytes32 fingerprint) | (uint8 source, string[] endpoints, string manifestId, bytes32 manifestHash, address registeredBy, uint256 timestamp) |
source is 1 for a curated entry and 2 for a public one. Both revert
with ManifestNotFound when the fingerprint is in neither registry.
Public registry
Permissionless — see Public records.
| Function | Kind | Notes |
|---|---|---|
registerPublicManifest(bytes32 fingerprint, bytes32 manifestHash, string userId, string[] endpoints, string manifestId) | write | Callable by any address |
deletePublicManifest(bytes32 fingerprint, string reason) | write | Callable by the address that registered the entry, or by Monolith |
publicManifestExists(bytes32 fingerprint) | read | bool |
getPublicManifestByBinding(bytes32 fingerprint) | read | (string[] endpoints, string manifestId) |
getPublicManifestRecord(bytes32 fingerprint) | read | (bytes32 manifestHash, string userId, string[] endpoints, string manifestId, uint256 timestamp) |
getPublicManifestRegisteredBy(bytes32 fingerprint) | read | address |
getTotalPublicManifests() | read | uint256 |
isPublicRegistryPaused() | read | bool — check before sending a write |
Curated registry
Written by Monolith when an Artifact is created. Read-only from outside.
| Function | Returns |
|---|---|
manifestExists(bytes32 fingerprint) | bool |
getManifestByBinding(bytes32 fingerprint) | (string[] endpoints, string manifestId) |
getManifestRecord(bytes32 fingerprint) | (bytes32 manifestHash, string userId, string[] endpoints, string manifestId, uint256 timestamp) |
getTotalManifests() | uint256 |
getActiveManifests() | uint256 |
getDefaultEndpoints() | string[] — the fallback used when an entry is registered with no endpoints |
Discovery
The C2PA soft binding resolver description — see Soft binding.
| Function | Returns |
|---|---|
describe() | string — JSON array of supported resolution methods |
c2paSpecVersion() | string — "2.2.0" |
supportedAlgorithms() | string[] — ["sha256"] |
getContractMetadata() | (string name, string version, string description, string specUrl) |
getDescribeStructured() | (string resolutionMethod, address contractAddress, string functionName) |
Events
| Event | Registry |
|---|---|
PublicManifestRegistered(bytes32 indexed fingerprint, address indexed registeredBy, bytes32 manifestHash, uint256 timestamp) | Public |
PublicSoftBindingRegistered(bytes32 indexed fingerprint, address indexed registeredBy, string[] endpoints, string manifestId) | Public |
PublicManifestDeleted(bytes32 indexed fingerprint, string reason, uint256 timestamp) | Public |
ManifestRegistered(bytes32 indexed fingerprint, string indexed userIdHash, bytes32 manifestHash, uint256 timestamp) | Curated |
SoftBindingRegistered(bytes32 indexed fingerprint, string[] endpoints, string manifestId) | Curated |
ManifestUpdated(bytes32 indexed fingerprint, bytes32 newManifestHash, uint256 timestamp) | Curated |
ManifestDeleted(bytes32 indexed fingerprint, string reason, uint256 timestamp) | Curated |
A registration emits two events: the …ManifestRegistered record and the
…SoftBindingRegistered resolution entry. Soft binding resolvers watch the
latter.
Reverts
| Error | Cause |
|---|---|
ManifestNotFound(bytes32) | resolveByBinding* found the fingerprint in neither registry |
PublicManifestNotFound(bytes32) | Public-registry read or delete for a fingerprint with no entry |
PublicManifestAlreadyExists(bytes32) | The fingerprint already has a public entry |
ZeroFingerprint() | fingerprint was bytes32(0) |
ZeroManifestHash() | manifestHash was bytes32(0) |
ArrayTooLong(uint256 provided, uint256 max) | Too many endpoints |
EmptyEndpoint() | One of the endpoints strings was empty |
NotAuthorizedToDelete() | Delete attempted by an address that didn’t register the entry |
PublicRegistryPaused() | The public registry is not accepting writes |
ContractPaused() | The contract is not accepting writes |
FunctionNotFound(bytes4) | The selector isn’t routed — usually a stale ABI |
These are Solidity custom errors, not revert strings. Decode them with the published ABI; a client without it will surface only the raw selector.
Type notes
Fingerprints are bytes32: 0x followed by 64 lowercase hex
characters, the SHA-256 of the asset’s exact bytes. The same value appears
base64-encoded inside C2PA manifests — see
Soft binding.
Timestamps are uint256 Unix seconds taken from the block, not ISO
8601 strings like the REST API returns.
ManifestRegistered.userIdHash is declared string indexed. The emitted
value is keccak256(userId) rendered as a hex string, which ABI encoding
then hashes again to produce the topic. You cannot filter that topic by
a plain userId, and decoders will report the field as unavailable —
read getManifestRecord instead if you need the value.
Where to go next
- Overview — what’s stored on-chain and why
- Public records — register a binding yourself
- Soft binding — the C2PA spec behind it