Reference

Manifest & call spec

A listing's rich metadata is a JSON manifest — off-chain on Walrus, with its sha256 pinned on-chain. The registry never trusts the body until the hash matches (manifestVerified).

#Manifest fields

{
  "name": "Cetus",
  "category": "Swap",
  "summary": "Spot swap via Cetus AMM",
  "serviceType": "0x…::adaptor::CetusAdaptor",
  "packageId": "0x…",
  "ops": [ /* AdaptorOp[] */ ],
  "supportedCoins": ["*"],
  "feeBps": 10,
  "feeRecipient": "0x…",
  "integrator": "acme",
  "networks": ["mainnet"],
  "docsUrl": "…", "repoUrl": "…", "auditUrl": "…", "appUrl": "…", "glyph": "≋"
}
fieldtypemeaning
namestringdisplay name (required)
categorystringSwap | Lend | Trading | Stake | Recurring | Guardian | Other
summarystringone line (required)
serviceTypestringthe witness FQN 0x<pkg>::<module>::<Witness> (required)
packageIdaddressdeployed adaptor package (required)
opsAdaptorOp[]operations (required)
supportedCoinsstring[]coin types, or ["*"] for any
feeBpsnumberdeclared integrator fee in basis points (optional)
feeRecipientaddresswho receives the fee (optional)
integratorstringpartner id for attribution (optional)
networksstring[]("testnet"|"mainnet")[]
docsUrl / repoUrl / auditUrl / appUrl / glyphoptional

#AdaptorOp

{ "kind": "swap",            // swap | lend | stake | pay | custom — for UI grouping
  "module": "adaptor",       // Move module
  "entry": "swap_a_to_b",    // entry function name
  "label": "Swap A → B",     // human label
  "intentMode": "D",          // A|B|C|D (informational)
  "call": { /* OpCallSpec — present ⇒ agent-EXECUTABLE; absent ⇒ discover/authorize only */ } }

#OpCallSpec

The on-chain ABI gives parameter types, not meaning — so the publisher declares each argument's role. An agent resolves it into a concrete PTB at call time.

{
  "typeArgs": ["coinIn", "coinOut"],   // each: "coinIn" | "coinOut" | a fixed "0x..::mod::T"
  "args": [                            // in order; TxContext is NOT included (PTBs supply it)
    { "kind": "wallet" },
    { "kind": "object", "id": "0x…" },
    { "kind": "amount" },
    { "kind": "minOut" },
    { "kind": "pure", "type": "u128", "value": "4295048016" },
    { "kind": "clock" }
  ],
  "needsAmount": true, "needsCoinIn": true, "needsCoinOut": true
}

#Argument roles

kindresolved to (at call time)
walletthe vault object id
amountthe user's input amount, atomic by coinIn decimals
minOutslippage floor, atomic by coinOut decimals (0 if absent)
objecta fixed object id you provide (id) — pool / config / treasury / market
clock0x6
purea fixed scalar — typeu8 u16 u32 u64 u128 u256 bool address string, with value
ctxdropped — Sui PTBs provide TxContext implicitly

#Type arguments

typeArgs are filled in order: "coinIn" / "coinOut" substitute the user's chosen coin types; any other string is treated as a fixed type argument and used verbatim.

#Hashing (integrity)

manifest_hash = sha256( canonicalBytes )
canonicalBytes = utf8( JSON.stringify( manifest, keys sorted RECURSIVELY, no whitespace ) )

Readers fetch the Walrus blob, recompute the hash, and compare to the on-chain manifest_hash before trusting the body. Upload exactly the canonical bytes you hashed — otherwise manifestVerified is false.

#Validation rules (enforced by the tooling)

  • name, category, summary, serviceType, packageId are required; ops non-empty.
  • feeBps must be a non-negative number; the UI flags anything above 1000 bps (10%).
  • An op with a call spec must resolve every object arg to a non-empty id to be executable.