docs/solidity-guides/debug_decrypt.md
debug.decrypt[XX]This guide explains how to use the debug.decrypt[XX] functions for debugging encrypted data in mocked environments during development with FHEVM.
{% hint style="warning" %}
The debug.decrypt[XX] functions should not be used in production as they rely on private keys.
{% endhint %}
The debug.decrypt[XX] functions allow you to decrypt encrypted handles into plaintext values. This feature is useful for debugging encrypted operations such as transfers, balance checks, and other computations involving FHE-encrypted data.
debug.decrypt[XX] functions work only in mocked environments (e.g., hardhat network).debug.decrypt[XX] functions supports various encrypted types, including integers, and booleans.debug.decrypt[XX] functions allow decryption without ACL authorization, useful for verifying encrypted operations during development and testing.Decrypts encrypted integers of different bit-widths (euint8, euint16, ..., euint256).
| Function Name | Returns | Encrypted Type |
|---|---|---|
decrypt8 | bigint | euint8 |
decrypt16 | bigint | euint16 |
decrypt32 | bigint | euint32 |
decrypt64 | bigint | euint64 |
decrypt128 | bigint | euint128 |
decrypt256 | bigint | euint256 |
Decrypts encrypted booleans (ebool).
| Function Name | Returns | Encrypted Type |
|---|---|---|
decryptBool | boolean | ebool |
Decrypts encrypted addresses.
| Function Name | Returns | Encrypted Type |
|---|---|---|
decryptAddress | string | eaddress |
import { debug } from "../utils";
// Decrypt a 64-bit encrypted integer
const handle64: bigint = await this.erc20.balanceOf(this.signers.alice);
const plaintextValue: bigint = await debug.decrypt64(handle64);
console.log("Decrypted Balance:", plaintextValue);
{% hint style="info" %} To utilize the debug functions, import the utils.ts file. {% endhint %}
For a more complete example, refer to the ConfidentialERC20 test file.
Each decryption function includes a type verification step to ensure the provided handle matches the expected encrypted type. If the type is mismatched, an error is thrown.
function verifyType(handle: bigint, expectedType: number) {
const typeCt = handle >> 8n;
if (Number(typeCt % 256n) !== expectedType) {
throw "Wrong encrypted type for the handle";
}
}
{% hint style="danger" %}
The functions only work in the hardhat network. Attempting to use them in a production environment will result in an error.
{% endhint %}
if (network.name !== "hardhat") {
throw Error("This function can only be called in mocked mode");
}