See what your confidential contract still reveals.

In the Arc Privacy Sector, contract storage is confidential by default — but a single Open getter, an event carrying an amount, a bridge to the public chain, or an over-broad trust grant can put private state back in the open. Concentric reads a Solidity contract and its APS access policy, then traces every path a confidential value can take across the boundary. It runs entirely in your browser, before you deploy.

Confidential analysis developer tools
Confidentiality analysis models APS spec · docs.arc.io · runs client-side
Or load an example scenario ↓
Example Scenarios

The below scenarios explore five contracts an institution might actually deploy to APS: four with a distinct, realistic confidentiality bug, and one done right. Load any of them in the analyzer above.

Understanding the developer tools

How is analysis performed? Static analysis builds a model of your contract's exposure surface (the reachability of each function and the flow of confidential state to observable sinks) and checks it against the rules the APS specification implies. It flags application-level leaks and misconfiguration; it does not analyze the enclaves or the cryptography themselves.

01 · reachability

Who can call what

Every function is placed by its APS access policy: Open (any caller), Restricted (grant-holders), Locked (no one). An external function with no policy is unreachable under default-deny. It is safe, but flagged in case it was meant to be callable.

02 · information flow

Where confidential state goes

Storage is confidential by default. The analyzer propagates it forward to the sinks that make it observable (e.g., a function's return value, an emitted event, a bridge to the public EVM, or an argument handed to an untrusted contract) and reports the exact path.

03 · trust domains

Who you let look in

Every addTrustee grant is examined. A trustee gets non-zero introspection and can reach your Restricted entrypoints. Therefore, trust is transitive through whatever that trustee re-exposes. Over-broad and third-party grants are surfaced.

04 · commitments

Hashes are not leaks

A confidential value disclosed only through a cryptographic hash (i.e., a commitment) is recognized as such, not flagged as a leak. It notes the disclosure is a commitment and reminds you it is only as strong as the entropy of its pre-image.

05 · open ≠ unsafe

It won't just cry "Open"

An Open function that moves value but never returns, emits, or bridges it reveals nothing. The tool distinguishes disclosure from exposure, so a clean contract gets a clean bill, not noise.

06 · honest model

Its own assumptions, stated

It models the published specification, not the live protocol. Its assumptions are listed with every run, and where APS behavior needs confirming (for example, immutables), it flags for review rather than asserting.


Acknowledge what you've reviewed. Not every disclosure is a mistake, as some are deliberate and reviewed. Concentric honors an inline comment so an accepted finding stops failing CI while staying documented in the source, next to the code it concerns.

01 · at the site

Suppress a single line

Put // concentric-disable-next-line APS-2 above a line to silence one rule there, or // concentric-disable-line at the end of a line to silence all findings on it. Naming the rule keeps every other check live.

02 · across a run

Tune the rule set

Disable a rule everywhere with --disable APS-9, or raise the reporting floor with --min-severity medium. The severity a rule reports and its documentation are fixed, so a suppressed finding is always traceable to a rule.

03 · one library, every surface

Nothing new to trust

The CLI, the Action, and the browser analyzer all rely on the @choosek/concentric library, tested to full coverage and relying on one rule set. All three default to the AST front-end, parsing with a real Solidity grammar (the vetted @solidity-parser/parser) for precise dataflow and inheritance. Browser and CLI run the same engine and so agree on every finding.


Interpret the results. Every finding Concentric reports comes from one of the rules enumerated below. Each has a stable identifier and a default severity.

IDRuleWhat it flags
HighA confidential value can be exposed on a reachable path. Fails CI by default.
APS-1Open function returns confidential stateA function any caller can reach returns a value read from confidential storage.
APS-2Confidential value emitted in an eventAn emitted event carries a confidential value or amount to every authorized viewer of the transaction.
APS-3Confidential value bridged to the public EVMA confidential value is moved across the boundary onto the public ledger.
APS-4Over-broad trust grantTrust is granted to an arbitrary or third-party contract, exposing introspection and Restricted entrypoints.
APS-10Confidential value passed to an external contractA confidential value is handed as an argument to a contract outside the boundary.
APS-14Confidential value copied into a public variableA confidential value is assigned into a public or cleared variable, exposing it through that variable's getter.
MediumA likely disclosure that warrants review before deploying.
APS-5Public state variable auto-generates a getterA public state variable exposes confidential storage through its implicit getter.
APS-12Confidential value indexed in an eventA confidential value is declared indexed, placing it in a queryable log topic.
APS-TTransitive exposure through a trusted contractAn Open forwarder re-exposes the confidential state of a contract that trusts it.
LowA narrow or conditional disclosure worth confirming.
APS-7Confidential value in immutable or constantA confidential value is placed in an immutable or constant, which may live in bytecode.
APS-8Open function echoes a calldata argumentA function any caller can reach returns a value derived from its arguments.
InfoAdvisory — a disclosure that is often intended, surfaced so it is reviewed.
APS-2bEvent reveals transaction metadataAn emitted event exposes a counterparty or timing, though no confidential amount.
APS-4okTrust granted to a compliance partyTrust is granted to a named auditor or regulator — a deliberate, policy-driven disclosure.
APS-6External function has no access policyAn externally visible function carries no APS access policy and is unreachable under default-deny.
APS-9Restricted function returns confidential state to grant-holdersA grant-holder-reachable function returns confidential state to every holder of a grant.
APS-HConfidential value disclosed as a commitmentA confidential value is disclosed only through a cryptographic hash rather than in the clear.
PositiveA positive result: a correctly gated read or a clean bill.
APS-OKOwner-gated confidential readA confidential read is correctly gated so each caller reads only their own entry.
APS-CLEANNo confidentiality findingsNo reachable path exposes a confidential value beyond what is appropriately disclosed.

These rules model the published APS specification at the application level. They reason about the paths a contract's own code opens, not the enclaves or cryptography beneath, and a clean result is an aid to review rather than a guarantee.