πRandom Number Contract
Introduction
How It Works
Smart Contract Implementation
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
contract Randomness is Ownable {
uint256 private requestIdCounter;
/**
* @dev Emitted when a request for randomness is raised.
*/
event RandomnessRequested(
uint256 indexed requestId,
uint256 indexed minNumber,
uint256 indexed maxNumber,
address requestedAddress,
uint256 timestamp
);
mapping(uint256 => bool) private requestUsed;
mapping(uint256 => address) private requestOwner;
mapping(uint256 => uint256) private requestToRandomNumber;
mapping(uint256 => bool) private randomnessFulfilled;
modifier validRequest(uint256 requestId) {
require(requestIdCounter != 0, "No requests have been made yet");
require(requestId <= requestIdCounter, "Invalid requestId");
require(!requestUsed[requestId], "Request ID already used");
_;
}
constructor() {
requestIdCounter = 0;
}
/**
* @dev Requests a random number within a specified range.
* @param minNumber Minimum range value.
* @param maxNumber Maximum range value.
* @return requestId Unique ID associated with the randomness request.
*/
function requestRandomness(uint256 minNumber, uint256 maxNumber) public returns (uint256 requestId) {
requestIdCounter++;
requestId = requestIdCounter;
requestOwner[requestId] = msg.sender;
emit RandomnessRequested(requestId, minNumber, maxNumber, msg.sender, block.timestamp);
}
/**
* @dev Retrieves the random number for a given requestId.
* @param requestId The unique ID of the randomness request.
* @return The generated random number.
*/
function getRandomNumber(uint256 requestId) public view validRequest(requestId) returns (uint256) {
require(requestOwner[requestId] == msg.sender, "Only the request owner can retrieve the random number");
require(randomnessFulfilled[requestId], "Random number not yet fulfilled");
return requestToRandomNumber[requestId];
}
/**
* @dev Fulfills the randomness request by providing a generated random number.
* Only the contract owner can call this function.
* @param requestId The unique ID of the randomness request.
* @param randomNumber The generated random number.
* @return success Boolean indicating the fulfillment status.
*/
function fulfillRandomness(uint256 requestId, uint256 randomNumber) public onlyOwner validRequest(requestId) returns (bool success) {
requestToRandomNumber[requestId] = randomNumber;
randomnessFulfilled[requestId] = true;
return true;
}
}