Sui Overflow 2026 · Walrus track

Verifiable memory for AI agents.

SuiTrace gives every AI agent a tamper-evident decision log on Sui and Walrus. Agents read their own history back as memory, and anyone can independently verify what an agent knew and decided.

Enter any agent address, or open the live demo.

0xDA0…TREASURY✓ VERIFIED
seq 0✓ certified epoch 0

HOLD: insufficient trend data

seq 1✓ certified epoch 0

BUY: uptrend confirmed (memory)

CHAIN INTEGRITY: PASS

The problem

A DAO agent manages $50K in treasury funds. The DAO votes to audit it. Without SuiTrace, the operator controls the logs, and can delete, alter, or fabricate the agent's reasoning.

With SuiTrace, every decision is permanently recorded. The full context lives as a Walrus blob: epoch-certified, content-addressed, retrievable by anyone. The operator cannot alter the blob without breaking the hash, or backdate it without breaking the epoch certificate. There is finally an independent record of what the agent saw, and what it decided.

How it works

Walrus stores the content. Sui stores the fingerprint. The two are linked by a hash that no operator can forge.

01

Agent writes context to Walrus

The full decision context (prompt, oracle data, prior memory, tool results, 5 to 50 KB) is uploaded to Walrus as an epoch-certified, content-addressed blob.

02

Hash is anchored on Sui

A SHA-256 of the blob, plus a link to the previous decision, is committed on-chain via a programmable transaction. The operator can neither alter the blob nor backdate it.

03

Anyone verifies, trustlessly

Re-fetch the blob from Walrus, re-hash it, compare to the on-chain record. Match means VERIFIED. Mismatch means TAMPERED. No permission, no operator, no trust required.

The memory loop

At the start of each session, an agent fetches its own decision history from Walrus and uses it as context, making better decisions over time. The same blobs that make it auditable make it smarter. Memory and auditability are the same system.

Architecture

Walrus stores the content, Sui stores the fingerprint, and the SDK is the only bridge between them. Anyone can re-fetch a blob and re-hash it to confirm the two still agree.

SuiTrace system architecture: agents write through the SDK to Walrus (content) and Sui (fingerprint); anyone re-fetches and re-hashes to verify.

Why Walrus, specifically

Storage here is not an afterthought. Walrus is load-bearing for both the memory and the audit guarantees.

Built for large blobs

Decision context is 5 to 50 KB. On-chain storage is prohibitive, and Walrus is built for this.

Epoch certification

Walrus proves when a blob existed. You cannot fake that an agent knew something after the fact, because the timestamp is not editable.

Content-addressed

The blob ID is derived from its bytes. Alter one byte and the hash breaks, so tampering is mathematically detectable.

Permanent public URLs

Any verifier can fetch any context years later from the public aggregator, independent of SuiTrace ever existing.

The difference

Centralized audit tools require trusting the platform. SuiTrace anchors proofs on a public chain the operator doesn't control.

CapabilitySuiTraceObservability toolsSigned-log SaaS
Tamper-evident (cryptographic)-
Verification without trusting operator--
Epoch certification (no backdating)--
Agent reads its own history as memory--
Large context stored off-chain-

Add SuiTrace in ~10 lines

No registration, no permission step. The registry is a shared on-chain object and your keypair is your identity. Two SDK calls: read your own memory back from Walrus, and record each decision with its hash anchored on Sui.

Read the full guide →
ts
import { fetchDecisionChain, recordDecision } from "suitrace-sdk";

// Read your own history back from Walrus (memory).
const history = await fetchDecisionChain(client, agentAddress);

// ...agent decides using history as context...

// Record the decision: uploaded to Walrus, hash anchored on Sui (audit).
const prev = history.at(-1) ?? null;
await recordDecision(client, signer, {
  agentAddress, seqNum: history.length,
  context, decision, summary,
  prevBlobId: prev?.blobId ?? null,
  prevHash:   prev?.contentHash ?? null,
});