Skip to content

Privacy Levels

SIP defines three privacy levels that users can select per-intent.

LevelPrivacyComplianceUse Case
TRANSPARENTNoneFullMaximum compatibility
SHIELDEDFullNoneMaximum privacy
COMPLIANTFull + DisclosureSelectiveInstitutional/regulatory

Standard on-chain transaction with no privacy enhancements.

const intent = await sip
.intent()
.input('near', 'NEAR', 100n)
.output('ethereum', 'ETH')
.privacy(PrivacyLevel.TRANSPARENT)
.build()
InformationVisible To
Sender addressEveryone
Input amountEveryone
Output amountEveryone
Recipient addressEveryone

None - standard transaction signing only.

  • DEX integrations requiring transparency
  • Public treasury operations
  • Airdrops and distributions
  • Testing and debugging

Full privacy with cryptographic hiding of sender, amounts, and recipient.

const intent = await sip
.intent()
.input('ethereum', 'ETH', 1_000_000_000_000_000_000n)
.output('zcash', 'ZEC')
.privacy(PrivacyLevel.SHIELDED)
.build()
InformationVisible ToHidden Via
Sender addressNobodySender commitment
Input amountNobodyPedersen commitment
Output amountSolver only (range)Commitment
Recipient addressNobodyStealth address
Min output requiredEveryonePlaintext (for quoting)
ProofPurpose
Funding ProofProve balance ≥ input
Validity ProofProve authorization
Fulfillment ProofProve correct delivery
Solver view:
├── "Someone wants to swap"
├── "Input: ??? amount of SOL (committed)"
├── "Output: at least 100 ZEC"
├── "Recipient: stealth address 0x..."
└── "Proof that sender has sufficient funds: ✓"
PropertyGuaranteed?Mechanism
Sender privacyYesPedersen commitment
Amount privacyYesAmount commitments
Recipient privacyYesStealth address
UnlinkabilityYesFresh blinding + stealth per tx

Full privacy with selective disclosure for authorized auditors.

const viewingKey = sip.generateViewingKey('/audit')
const intent = await sip
.intent()
.input('solana', 'SOL', 5_000_000_000n)
.output('near', 'NEAR')
.privacy(PrivacyLevel.COMPLIANT)
.viewingKey(viewingKey)
.build()
InformationPublicAuditor (with key)
Sender addressHiddenVisible
Input amountHiddenVisible
Output amountHiddenVisible
Recipient addressHiddenVisible
Audit trailHiddenFull history
  1. User creates COMPLIANT intent
  2. User designates auditor (provides viewing key hash)
  3. Transaction data encrypted with auditor’s key
  4. Encrypted blob stored with intent
  5. Auditor decrypts when needed
  6. Auditor generates ViewingProof for reports
  • Institutional trading
  • Tax compliance
  • Regulatory requirements
  • DAO treasury operations
AspectTRANSPARENTSHIELDEDCOMPLIANT
Sender hiddenNoYesYes (public) / No (auditor)
Amount hiddenNoYesYes (public) / No (auditor)
Recipient hiddenNoYesYes (public) / No (auditor)
Audit possibleTrivialNoYes (with key)
AspectTRANSPARENTSHIELDEDCOMPLIANT
Proof generationNone~2-5s~2-5s + encryption
VerificationFast~10ms~10ms
Data sizeSmallMediumMedium + encrypted blob
Use CaseRecommended Level
Public DEX swapTRANSPARENT
Personal privacySHIELDED
Institutional tradingCOMPLIANT
Tax reporting neededCOMPLIANT
Anonymous donationSHIELDED
Regulated exchangeCOMPLIANT
TRANSPARENT → SHIELDED ✓ (add proofs and commitments)
TRANSPARENT → COMPLIANT ✓ (add proofs + viewing key)
SHIELDED → COMPLIANT ✓ (add viewing key encryption)
SHIELDED → TRANSPARENT ✗ (cannot reveal hidden data)
COMPLIANT → SHIELDED ✗ (auditor key already shared)
COMPLIANT → TRANSPARENT ✗ (cannot reveal hidden data)

Once data is committed/hidden, it cannot be revealed without user cooperation.

import { SIP, PrivacyLevel } from '@sip-protocol/sdk'
const sip = new SIP({ network: 'testnet' })
// Transparent
const transparent = await sip.createIntent({
privacyLevel: PrivacyLevel.TRANSPARENT,
sender: '0x...',
recipient: '0x...',
inputAmount: 100n,
})
// Shielded - SDK generates commitments, stealth, proofs
const shielded = await sip.createIntent({
privacyLevel: PrivacyLevel.SHIELDED,
inputAmount: 100n,
})
// Compliant - SDK adds encrypted viewing data
const compliant = await sip.createIntent({
privacyLevel: PrivacyLevel.COMPLIANT,
inputAmount: 100n,
auditorKeyHash: '0x...',
})
ConsiderationGuidance
Default levelSHIELDED (privacy by default)
Downgrade requestsReject - cannot downgrade
Level in metadataIncluded in intent_hash

All commitments are bound to privacy level:

commitment_hash = Poseidon(
commitment,
privacy_level,
intent_id
)

This prevents commitment reuse across different privacy contexts.

For COMPLIANT mode:

  • User chooses auditor (not protocol)
  • Multiple auditors supported
  • Revocation possible but doesn’t hide past disclosures