Skip to Content

Interface

Contract0xfE9daFC133eD3e9726D4B2c24b8cC3c3AaDD8225
Chain ID101010 — Global Trust Network
RPChttps://rpc.stabilityprotocol.com/zgt/try-it-out
ExplorerView 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.

FunctionReturns
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.

FunctionKindNotes
registerPublicManifest(bytes32 fingerprint, bytes32 manifestHash, string userId, string[] endpoints, string manifestId)writeCallable by any address
deletePublicManifest(bytes32 fingerprint, string reason)writeCallable by the address that registered the entry, or by Monolith
publicManifestExists(bytes32 fingerprint)readbool
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)readaddress
getTotalPublicManifests()readuint256
isPublicRegistryPaused()readbool — check before sending a write

Curated registry

Written by Monolith when an Artifact is created. Read-only from outside.

FunctionReturns
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.

FunctionReturns
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

EventRegistry
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

ErrorCause
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

Last updated on