Protocol reference
The marketplace is, at bottom, a small Move contract plus a manifest standard. Everything else is convenience.
#On-chain registry (the canonical API)
registry::register(registry: &mut Registry,
package_id: address, service_type: String,
manifest_uri: String, manifest_hash: vector<u8>, clock: &Clock)
registry::update(registry, service_type, package_id, manifest_uri, manifest_hash, clock)
// publisher only
registry::unlist(registry, service_type, clock) // publisher only
registry::attest(registry, service_type, score: u8 /* 1..5 */, comment_uri: String, clock)
register— permissionless. Records the anchor for aservice_type(which is the key). Re-registering the same service-type fails; useupdate.update/unlist— gated to the originalpublisher(recorded at register time).attest— anyone may leave a 1..5 score with an optional off-chain comment uri.
#Events (the discovery surface)
Registered, Updated, Unlisted, Attested. Each carries the service_type, the
publisher / attester, and (for listings) package_id, manifest_uri, manifest_hash,
version, timestamp_ms. Index these to build a catalog independently of any host.
#On-chain state is anchor-only
The contract stores only: { publisher, package_id, manifest_uri, manifest_hash, version, updated_at_ms } per service-type. No manifest body, no reviews, no usage — those are
off-chain (Walrus) or derived (events). This keeps the contract tiny and the data portable.
#Security model
- Anchor-only + hash-pinned. The manifest body lives off-chain but is content-addressed by
manifest_hash; a host can't serve a tampered manifest withoutmanifestVerifiedgoing false. - Witness can't be spoofed.
service_typeis namespaced by the publisher's package id viatype_name::with_defining_ids, so no one can register another publisher's witness type and have it resolve to their package. Service-types are globally unique by construction. - Allowance-bounded use. Using a listed adaptor only ever moves funds the owner granted via
grant_service_coin, capped by the per-service and per-coin allowances. A malicious or buggy listing is sandboxed to exactly what you authorized, and you can revoke at any time. - Reputation from real usage.
attestreviews are cross-referenced against on-chainSupWallet::intentevents for the same service-type: a reviewer who actually used the adaptor is marked verified, and verified reviews are surfaced over anonymous ones. Anyone can attest; sybils don't get the verified weight. - Fee transparency.
feeBpsis disclosed in the manifest, not silently taken. TheminOutslippage floor the user signs bounds what an op can actually extract.
#What to check before authorizing a third-party adaptor
- Is the listing
manifestVerified? (the off-chain body matches the on-chain hash) - Does it have real usage and verified reviews?
- Is the package immutable (its
UpgradeCapfrozen) or upgradeable? An upgrade can change behavior after you've authorized it. - Anything odd — a high declared
feeBps, an unexpected op set, an unfamiliar publisher?
Using it is still bounded by the per-service allowance you grant — but for third-party code, review and a tight allowance are your friends.
#Deployment ids
The registry package + shared object ids per network are returned by
GET /api/adaptors/schema. The manifest body is stored on Walrus; resolve a
walrus://<blobId> through the configured aggregator.