Hidden Random Card

// SPDX-License-Identifier: BSD-3-Clause-Clear

pragma solidity >=0.8.13 <0.9.0;

import "fhevm/abstracts/EIP712WithModifier.sol";
import "fhevm/lib/TFHE.sol";

contract CardDealer is EIP712WithModifier {
    // used for output authorization
    bytes32 private DOMAIN_SEPARATOR;
    mapping (address => euint8) public encryptedCards;

    constructor() EIP712WithModifier("Authorization token", "1") {

    // A random encrypted uint8 is generated
    function getCard() public {
        encryptedCards[msg.sender] = TFHE.randEuint8();

    // EIP 712 signature is required to prove that the user is requesting to view his/her own card
    // card is decrypted then re-encrypted using a publicKey provided by the user client to make sure that RPC cannot peek. 
    // The user can decrypt their card with the respective privateKey (stored on client)
    function viewCard(bytes32 publicKey, bytes calldata signature) public view onlySignedPublicKey(publicKey, signature) returns (bytes memory) {
        return TFHE.reencrypt(encryptedCards[msg.sender], publicKey, 0);

Last updated