RWAioMint
Base SepoliaSign in

Implementation contract

API surface

Authentication is an RWA.io session cookie. Wallet signatures are needed only where the owner appends to the on-chain ledger.

MethodPathPurpose
POST/v1/assetsCreate the durable identity, edition 1 and the genesis event
GET/v1/assetsList assets (public fields only)
GET/v1/assets/:idAsset, current edition, chain integrity and anchor state
GET/v1/assets/:id/timelineFull attributable history plus the integrity verdict
POST/v1/assets/:id/eventsAppend a typed event — custom types allowed (owner)
GET/POST/v1/assets/:id/versionsImmutable content snapshots
GET/POST/v1/assets/:id/contributorsRoster and role assignment
GET/POST/v1/assets/:id/contributionsThe appendix; submit with an account, no wallet
POST/v1/contributions/:id/decisionOwner accepts (merges) or declines (appendix)
POST/v1/assets/:id/invitesInvite a cited org, reviewer or contributor
POST/v1/invites/acceptAccept an invitation
GET/POST/v1/assets/:id/editionsList editions; prepare the next anchor
POST/v1/events/:id/anchorAnchor one individual event on demand
POST/v1/anchors/:id/confirmVerify the transaction and record the anchor
POST/v1/assets/:id/forkVerified project fork; the parent is never mutated
POST/v1/assets/:id/publish-dnsSign the manifest and issue the TXT record to add
POST/v1/assets/:id/verify-dnsResolve the record now and record what was observed
GET/v1/manifests/:hostnameResolve the current signed manifest
POST/v1/signalsRecord a consented signal for export
POST/v1/uploads/signSigned upload URL into the private documents bucket

Verifying history yourself

Each event hash is keccak256 over these seven fields joined by U+001F, in order:

assetId | seq | eventType | actor | occurredAt | contentHash | priorEventHash

contentHash  = keccak256(canonical JSON: keys sorted at every depth, no whitespace)
occurredAt   = ISO-8601 UTC, millisecond precision
genesis prior = 0x00…00

editionHash  = keccak256(versionContentHash | lastEventHash)
             = the bytes32 appended to DataStorage.updateDynamicData

Read the on-chain array with DataStorage.getDynamicDataStorage(token) and compare entry i against the recomputed edition hash. Reordering or editing any event breaks the chain.