This example demonstrates the FHE user decryption mechanism with multiple values.
User decryption is a mechanism that allows specific users to decrypt encrypted values while keeping them hidden from others. Unlike public decryption where decrypted values become visible to everyone, user decryption maintains privacy by only allowing authorized users with the proper permissions to view the data. While permissions are granted onchain through smart contracts, the actual decryption call occurs off-chain in the frontend application.
To run this example correctly, make sure the files are placed in the following directories:
.sol file → <your-project-root-dir>/contracts/
.ts file → <your-project-root-dir>/test/
This ensures Hardhat can compile and test your contracts as expected.
// SPDX-License-Identifier: BSD-3-Clause-Clearpragmasolidity^0.8.24;import { FHE, ebool, euint32, euint64}from"@fhevm/solidity/lib/FHE.sol";import { ZamaEthereumConfig}from"@fhevm/solidity/config/ZamaConfig.sol";contractUserDecryptMultipleValuesisZamaEthereumConfig{ ebool private _encryptedBool;// = 0 (uninitizalized) euint32 private _encryptedUint32;// = 0 (uninitizalized) euint64 private _encryptedUint64;// = 0 (uninitizalized)// solhint-disable-next-line no-empty-blocksconstructor() {}functioninitialize(boola,uint32b,uint64c)external{// Compute 3 trivial FHE formulas// _encryptedBool = a ^ false _encryptedBool = FHE.xor(FHE.asEbool(a), FHE.asEbool(false));// _encryptedUint32 = b + 1 _encryptedUint32 = FHE.add(FHE.asEuint32(b), FHE.asEuint32(1));// _encryptedUint64 = c + 1 _encryptedUint64 = FHE.add(FHE.asEuint64(c), FHE.asEuint64(1));// see `DecryptSingleValue.sol` for more detailed explanations// about FHE permissions and asynchronous user decryption requests. FHE.allowThis(_encryptedBool); FHE.allowThis(_encryptedUint32); FHE.allowThis(_encryptedUint64); FHE.allow(_encryptedBool,msg.sender); FHE.allow(_encryptedUint32,msg.sender); FHE.allow(_encryptedUint64,msg.sender);}functionencryptedBool()publicviewreturns(ebool){return _encryptedBool;}functionencryptedUint32()publicviewreturns(euint32){return _encryptedUint32;}functionencryptedUint64()publicviewreturns(euint64){return _encryptedUint64;}}