See what your confidential Move contract still reveals.

On Sui, Seal gates a decryption key behind a Move access policy; on Aptos, Confidential Assets keep balances and transfer amounts encrypted on-chain. But a single seal_approve that forgets to assert!, an amount emitted in an event, a decryption key handed to a sink, or the public amounts at a deposit can put private state back in the open. Kinetics reads a Move module and its confidentiality primitive, then traces every path a confidential value can take across the boundary. It runs entirely in your browser, before you deploy.

Confidentiality analysis developer tools
Confidentiality analysis models Seal & Aptos CA · runs client-side
Or load an example scenario ↓
Example Scenarios

Six Move modules a team might actually ship: three Sui Seal access policies and three Aptos Confidential-Asset modules. Four carry a distinct, realistic confidentiality defect; two are written correctly. Load any of them in the analyzer above.

Understanding the developer tools

How is analysis performed? Static analysis builds a model of your module's confidentiality surface — the reachability of each function and the flow of confidential state to the sinks that make it observable — and checks it against the rules the Seal and Confidential-Assets designs imply. It flags application-level leaks and misconfiguration; it does not analyze the key servers, the enclaves, or the cryptography themselves.

01 · reachability

Who the policy admits

Each seal_approve policy is placed by what it does: Open (completes for any caller — the key is granted to everyone), Restricted (asserts a condition first), or Locked (always aborts — no one). Seal grants the key when a policy completes and denies when it aborts, so an Open policy is the same footgun as a public getter.

02 · information flow

Where a confidential amount goes

An encrypted balance or amount is confidential on-chain. Kinetics propagates it forward to the sinks that disclose it — an argument in an emitted event, a returned or exported decryption key, the public amount at a deposit / withdraw — and reports the exact path.

03 · trust domains

Who you let look in

On Aptos, every transfer amount is also encrypted to the account's auditor viewing key, so a configured auditor decrypts everything — a mutable auditor is a trust change. On Sui, an upgradeable package's authority can replace a seal_approve policy after the fact. Both are surfaced.

04 · commitments

Hashes are not leaks

A confidential value disclosed only through a cryptographic hash or commitment is recognized as such, not flagged as a leak — noted as a commitment, with the reminder that it is only as strong as the entropy of its pre-image.

05 · moving ≠ disclosing

It won't just cry "transfer"

A confidential_transfer that keeps its amount encrypted, or an Open function that moves value but never returns, emits, or exports it, reveals nothing. Kinetics distinguishes moving an encrypted value from disclosing it, so a clean module gets a clean bill, not noise.

06 · honest model

Its own assumptions, stated

It models the published Seal and Confidential-Assets designs, not a live deployment, and lists its assumptions with every run. It parses the source to a Move AST and traces information flow through calls, falling back to a lexical scan on the rare construct the parser does not yet cover; where behavior needs confirming (package upgradeability, the configured auditor) it flags for review rather than asserting.


One rule set, wherever it runs. The analyzer parses Move to an AST — resolving modules and following dataflow through calls, so a policy whose check lives in a helper reads as Restricted and a hashed amount reads as a commitment, not a leak. The engine ships in the @choosek/kinetics library, so this page, the kinetics confidential command line, and the GitHub Action all agree on every finding. The rules below are the catalog the engine checks.