Skip to main content

What this does

On Sui, a wallet’s standing can be expressed as a capability object it holds. The object has key and no store, so it cannot be transferred. Holding it is proof the wallet earned standing. Your function takes &TrustedAgentCap (or the elite type) and calls assert_standard_valid. If the cap is missing, expired, or revoked, the call aborts. This is how TrustGate’s own gated pool demo works, and you build your own gate the same way. There is no runtime oracle call at trade time.

The pieces

TrustedAgentCap

Standard standing. Minted when the registry score is at least 70. Valid 30 epochs.

TrustedAgentCapElite

Elite standing. Minted at score 85 or above. Same 30-epoch expiry. No size limit in the demo pool.

ScoreRegistry

Shared object. Oracle writes update_score. Anyone can devInspect get_score / get_tier / is_bot_flagged.

MintAuthority / OracleCap

Owned by the publisher. Only they mint, revoke, or write scores. IDs are not in the public constants file.
A bot-flagged subject is hard-blocked from minting, even if the numeric score would pass.

How gating works

1

Require the capability in your function

Take &TrustedAgentCap (or &TrustedAgentCapElite). If the caller does not own one, the transaction cannot be built.
2

Assert it is still valid

assert_standard_valid(cap, ctx) rejects expired caps. Possession plus this assert is the whole check.
3

Standing is issued, not bought

The off-chain Sui wallet oracle writes the registry and mints. A wallet can also POST /api/score-wallet from the hosted UI to trigger a rescore. Caps can be revoked by the oracle (revoke_standard / revoke_elite) or self-burned.
For elite-only actions, take TrustedAgentCapElite and call assert_elite_valid. Views is_standard_valid / is_elite_valid exist if you need a boolean instead of an abort.

Demo pool (not DeepBook)

deepbook_gated_pool is a shared GatedPool that records orders in a table.
  • place_gated_order(&TrustedAgentCap, …) — valid standard cap, size <= 1_000_000
  • place_elite_order(&TrustedAgentCapElite, …) — no size limit
It is not a DeepBook fork and is not wrapped around the native order book. Treat it as the reference consumer of the cap, not as production venue infrastructure.

Onchain reference

Full type strings:
Discover owned caps with suix_getOwnedObjects and MatchAny on those two types. Prefer Elite, then furthest expiry_epoch versus the current system epoch. Read a wallet without spending gas:

HTTP helpers

Widget (Sui only)

Dynamic lists: window.TrustGate.scan(). This script does not understand EVM data-trustgate-address. The Arc widget.js does not understand coin types.

Next

Gated Pools

Why reputation makes a door, and what is demo vs real.

Sui network page

Package IDs, HTTP surface, and the mainnet/testnet split.