Kann Audits / Security Review

Encifher

Encifher Privacy Bridging Security Review

Review of Encifher’s Solana privacy-bridging services, including swap slippage, Kafka consumers, and solver balance handling.

SolanaSolanaKafkaOff-chain servicesFebruary 12, 2026
Download Report Open Report
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.

FINDINGS04Documented in the published report
Medium: 2Informational: 2
SeverityCount
Critical0
High0
Medium2
Low0
Informational2

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

2 findings
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

2 findings
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:

  1. 01Architecture and trust-boundary analysis
  2. 02Independent manual review
  3. 03State-transition and invariant analysis
  4. 04Access-control and integration review
  5. 05Adversarial testing and attack-path analysis
  6. 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.