mirror of
https://github.com/luxfhe/example-rng-game.git
synced 2026-10-30 18:13:18 +00:00
- Update to unified FHE decryption API - Update dependencies to @luxfi/contracts
93 lines
2.1 KiB
Solidity
93 lines
2.1 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
|
|
pragma solidity >=0.8.13 <0.9.0;
|
|
|
|
import "@luxfi/contracts/fhe/FHE.sol";
|
|
import {Permissioned, Permission} from "@luxfi/contracts/fhe/access/Permissioned.sol";
|
|
|
|
// Simple console stub for development
|
|
library Console {
|
|
function log(string memory) internal pure {}
|
|
}
|
|
|
|
contract RngBinaryGame is Permissioned {
|
|
struct GameGuess {
|
|
uint8 guess;
|
|
bool lt;
|
|
bool gt;
|
|
}
|
|
|
|
struct GameState {
|
|
address player;
|
|
euint8 number;
|
|
uint8 guesses;
|
|
}
|
|
|
|
uint8 public flag = 0;
|
|
|
|
mapping(address => GameState) private gameState;
|
|
mapping(address => mapping(uint8 => GameGuess)) private gameGuesses;
|
|
|
|
constructor() {}
|
|
|
|
error GameNotFound();
|
|
error GameFinished();
|
|
error OutOfGuesses();
|
|
|
|
function createGame() public {
|
|
gameState[msg.sender] = GameState({
|
|
player: msg.sender,
|
|
number: FHE.randomEuint8(),
|
|
guesses: 0
|
|
});
|
|
}
|
|
|
|
function guess(uint8 _guess) public {
|
|
if (gameState[msg.sender].player != msg.sender) revert GameNotFound();
|
|
GameState storage game = gameState[msg.sender];
|
|
|
|
if (game.guesses >= 12) revert OutOfGuesses();
|
|
|
|
if (
|
|
game.guesses > 1 &&
|
|
!gameGuesses[msg.sender][game.guesses - 1].lt &&
|
|
!gameGuesses[msg.sender][game.guesses - 1].gt
|
|
) revert GameFinished();
|
|
|
|
euint8 eGuess = FHE.asEuint8(uint256(_guess));
|
|
Console.log("trivial encrypt finished");
|
|
|
|
ebool eLt = FHE.lt(eGuess, game.number);
|
|
FHE.decrypt(eLt);
|
|
bool lt = FHE.reveal(eLt);
|
|
Console.log("lt finished");
|
|
|
|
ebool eGt = FHE.gt(eGuess, game.number);
|
|
FHE.decrypt(eGt);
|
|
bool gt = FHE.reveal(eGt);
|
|
Console.log("gt finished");
|
|
|
|
gameGuesses[msg.sender][game.guesses] = GameGuess({
|
|
guess: _guess,
|
|
lt: lt,
|
|
gt: gt
|
|
});
|
|
game.guesses += 1;
|
|
|
|
Console.log("finished");
|
|
|
|
flag += 1;
|
|
}
|
|
|
|
function getGameState() public view returns (GameGuess[] memory guesses) {
|
|
if (gameState[msg.sender].player != msg.sender) revert GameNotFound();
|
|
GameState memory game = gameState[msg.sender];
|
|
|
|
guesses = new GameGuess[](game.guesses);
|
|
|
|
for (uint8 i = 0; i < game.guesses; i++) {
|
|
guesses[i] = gameGuesses[msg.sender][i];
|
|
}
|
|
}
|
|
}
|