Kann Audits / Security Review
EncifherEncifher Privacy Bridging Security Review
Review of Encifher’s Solana privacy-bridging services, including swap slippage, Kafka consumers, and solver balance handling.
- Audit period
- February 4–11, 2026
- Researchers
- Not listed
- Scope
- 7 scoped paths
- Technologies
- Solana, Kafka, Off-chain services
- Findings
- 4 documented
Executive summary
What was reviewed
Review of Encifher’s Solana privacy-bridging services, including swap slippage, Kafka consumers, and solver balance handling.
This page reflects only the scope and review context disclosed in the published report. Fields the report does not provide are omitted rather than inferred; the PDF remains the source of record for issue detail and limitations.
Security is contextual. This report does not guarantee that the protocol is free from vulnerabilities. It applies to the review context documented in the report.
Scope & record
Engagement dossier
- Audit period
- February 4–11, 2026
- Technologies
- Solana, Kafka, Off-chain services
- Chain / ecosystem
- Solana
- Category
- Privacy Bridging
Files and paths in scope
packages/consumer/*packages/listener/*packages/mixer/*packages/pool-manager/*packages/refund/*packages/server/*packages/solver/*
Findings overview
Severity distribution
The counts below are transcribed from the published report. Status and issue detail remain subject to that report’s exact terminology.
Published findings
Findings
Findings below are reproduced from the complete Kann Audits security review. View the full PDF for complete scope, methodology, assumptions, and audit context.
Medium
M-01
Slippage Validation Failures
Medium
Description
Slippage values are calculated and displayed to users but never enforced during swap execution, leading to potential silent losses and misleading quotes. Code Example: // Quote calculation slippageLegOne: jupQuote.slippageBps, slippgageLegTwo: 50, // Swap execution - missing slippageBps orderUrl.searchParams.set("inputMint", inputMint); orderUrl.searchParams.set("outputMint", outputMint); orderUrl.searchParams.set("amount", amount);
Impact
- Users may receive significantly less than quoted amounts - Silent failures with no warning to users - Misleading quotes could harm user trust
Recommendation
- Pass ‘slippageBps‘ to Jupiter API: orderUrl.searchParams.set("slippageBps", slippageLegOne.toString()); - Implement post-execution validation: const actualOutput = await getTransactionOutput(signature); if (BigInt(actualOutput) < BigInt(orderData.otherAmountThreshold)) { throw new Error(‘Slippage exceeded: expected , got ‘); }
M-02
Kafka Consumer Retry Mechanism
Medium
Description
Single shared Kafka consumer instance (‘kafkaConsumer‘) across three consumers prevents proper error recovery, causing retries to fail and manual restarts to be required. Code Example: // Shared consumer export const kafkaConsumer = kafka.consumer({ groupId: "consumer-group", sessionTimeout: 120 * 1000, heartbeatInterval: 10000, });
KannAudits Encifher Security Review // All three consumers call kafkaConsumer.run() independently
Impact
- Failed consumers cannot recover automatically - Retry mechanism fails repeatedly every 500ms - Reduced system availability and reliability
Recommendation
- Option 1 (recommended): Create separate consumer instances: export const preDepositConsumer = kafka.consumer({ groupId: "predeposit-consumergroup" }); export const postDepositConsumer = kafka.consumer({ groupId: "postdeposit-consumergroup" }); export const solverConsumer = kafka.consumer({ groupId: "solver-consumer-group" }); - Option 2: Use ‘Promise.allSettled()‘ instead of ‘Promise.all()‘ to handle failures without retrying entire group.
Resolution
Fixed
KannAudits Encifher Security Review 5.2 Informational findings
Informational
I-01
Kafka missing SSL/TLS encryption and no auth
Informational
Description
All Kafka connections operate without SSL/TLS encryption and lack authentication mechanisms. Code Example: // Kafka server and consumer configuration // No SSL/TLS or SASL auth enabled
Impact
- All messages transmitted in plaintext - Wallet addresses, transaction IDs, and order details exposed to network eavesdropping
Recommendation
- Enable SSL/TLS encryption - Implement SASL authentication for all Kafka connections
I-02
Incomplete Balance Check in SolanaSolver
Informational
Description
‘isSolvable()‘ function performs an incomplete balance check and does not account for optional gas deposit transfers. Code Example: async isSolvable(params: OrderParams): Promise<boolean> { const balance = await this.getConnection().getBalance(new PublicKey(currentPool) ); const requiredAmount = BigInt(params.amount); // Missing gas return BigInt(balance) >= requiredAmount; }
Impact
- Orders marked as solvable may fail due to insufficient funds - User transactions fail after acceptance - Wasted RPC calls and fees
Recommendation
Include gas deposit in balance validation: let requiredAmount = BigInt(params.amount); if (params.destinationGasDepositAddress) { requiredAmount += BigInt(DESTINATION_GAS_AMOUNT_LAMPORTS); } return availableBalance >= requiredAmount;
Methodology
How Kann Audits reviews code
Kann Audits reports describe independent researcher review followed by collaborative analysis of findings and attack paths. The standard review foundation includes:
- 01Architecture and trust-boundary analysis
- 02Independent manual review
- 03State-transition and invariant analysis
- 04Access-control and integration review
- 05Adversarial testing and attack-path analysis
- 06Fix verification and regression review
Audit team
Researchers listed in the report
The public report does not list individual researcher names.
Final assessment
Documented outcome
All four reported findings were marked fixed.
The assessment applies only to the review context and limitations documented in the published report. Missing details are not inferred, and later changes require separate analysis.
Start a conversation
Planning your next release?
Share the system, fixed scope, and target date. Build enough time into the plan for review, remediation, and verification.