RafflFactory

Git Source

Inherits: AutomationCompatibleInterface, VRFConsumerBaseV2Plus, FactoryFeeManager

Author: JA (@ubinatus)

Raffl is a decentralized platform built on the Ethereum blockchain, allowing users to create and participate in raffles/lotteries with complete transparency, security, and fairness.

The RafflFactory contract can be used to create raffle contracts, leveraging Chainlink VRF and Chainlink Automations.

State Variables

keyHash

Max gas to bump to

bytes32 keyHash;

callbackGasLimit

Callback gas limit for the Chainlink VRF

uint32 callbackGasLimit = 500_000;

requestConfirmations

Number of requests confirmations for the Chainlink VRF

uint16 requestConfirmations = 3;

subscriptionId

Chainlink subscription ID

uint256 public subscriptionId;

implementation

The address that will be used as a delegate call target for Raffls.

address public immutable implementation;

_salt

It will be used as the salt for create2

bytes32 internal _salt;

_raffles

Maps the created Raffls addresses

mapping(address => bool) internal _raffles;

_requestIds

Maps the VRF requestId to the Raffls address

mapping(uint256 => address) internal _requestIds;

_activeRaffles

Stores the active raffles, which upkeep is pending to be performed

ActiveRaffle[] internal _activeRaffles;

Functions

constructor

*Creates a Raffl factory contract. Requirements:

  • implementationAddress has to be a contract.
  • feeCollectorAddress can’t be address 0x0.
  • poolFeePercentage must be within 0 and maxFee range.
  • vrfCoordinator can’t be address 0x0.*
constructor(
    address implementationAddress,
    address feeCollectorAddress,
    uint64 creationFeeValue,
    uint64 poolFeePercentage,
    address vrfCoordinator,
    bytes32 _keyHash,
    uint256 _subscriptionId
)
    VRFConsumerBaseV2Plus(vrfCoordinator);

Parameters

NameTypeDescription
implementationAddressaddressAddress of Raffl contract implementation.
feeCollectorAddressaddressAddress of feeCollector.
creationFeeValueuint64Value for creationFee that will be charged on new Raffls deployed.
poolFeePercentageuint64Value for poolFeePercentage that will be charged from the Raffls pool on success draw.
vrfCoordinatoraddressVRF Coordinator address
_keyHashbytes32The gas lane to use, which specifies the maximum gas price to bump to
_subscriptionIduint256The subscription ID that this contract uses for funding VRF requests

nextSalt

Increments the salt one step.

function nextSalt() public;

createRaffle

Creates new Raffl contracts. Requirements:

  • underlyingTokenAddress cannot be the zero address.
  • timestamps must be given in ascending order.
  • percentages must be given in ascending order and the last one must always be 1 eth, where 1 eth equals to 100%.
function createRaffle(
    address entryToken,
    uint256 entryPrice,
    uint256 minEntries,
    uint256 deadline,
    IRaffl.Prize[] calldata prizes,
    IRaffl.TokenGate[] calldata tokenGates,
    IRaffl.ExtraRecipient calldata extraRecipient
)
    external
    payable
    returns (address raffle);

Parameters

NameTypeDescription
entryTokenaddressThe address of the ERC-20 token as entry. If address zero, entry is the network token
entryPriceuint256The value of each entry for the raffle.
minEntriesuint256The minimum number of entries to consider make the draw.
deadlineuint256The block timestamp until the raffle will receive entries and that will perform the draw if criteria is met.
prizesIRaffl.Prize[]The prizes that will be held by this contract.
tokenGatesIRaffl.TokenGate[]The token gating that will be imposed to users.
extraRecipientIRaffl.ExtraRecipientThe extra recipient that will share the rewards (optional).

activeRaffles

Exposes the ActiveRaffles

function activeRaffles() public view returns (ActiveRaffle[] memory);

handleSubscription

Sets the Chainlink VRF subscription settings

function handleSubscription(
    uint64 _subscriptionId,
    bytes32 _keyHash,
    uint32 _callbackGasLimit,
    uint16 _requestConfirmations
)
    external
    onlyOwner;

Parameters

NameTypeDescription
_subscriptionIduint64The subscription ID that this contract uses for funding VRF requests
_keyHashbytes32The gas lane to use, which specifies the maximum gas price to bump to
_callbackGasLimituint32Callback gas limit for the Chainlink VRF
_requestConfirmationsuint16Number of requests confirmations for the Chainlink VRF

checkUpkeep

Method called by the Chainlink Automation Nodes to check if performUpkeep must be done.

Performs the computation to the array of _activeRaffles. This opens the possibility of having several checkUpkeeps done at the same time.

function checkUpkeep(bytes calldata checkData)
    external
    view
    override
    returns (bool upkeepNeeded, bytes memory performData);

Parameters

NameTypeDescription
checkDatabytesEncoded binary data which contains the lower bound and upper bound of the _activeRaffles array on which to perform the computation

Returns

NameTypeDescription
upkeepNeededboolWhether the upkeep must be performed or not
performDatabytesEncoded binary data which contains the raffle address and index of the _activeRaffles

performUpkeep

Permissionless write method usually called by the Chainlink Automation Nodes.

Either starts the draw for a raffle or cancels the raffle if criteria is not met.

function performUpkeep(bytes calldata performData) external override;

Parameters

NameTypeDescription
performDatabytesEncoded binary data which contains the raffle address and index of the _activeRaffles

fulfillRandomWords

Method called by the Chainlink VRF Coordinator

function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override;

Parameters

NameTypeDescription
requestIduint256Id of the VRF request
randomWordsuint256[]Provably fair and verifiable array of random words

_burnActiveRaffle

Helper function to remove a raffle from the _activeRaffles array

Move the last element to the deleted stop and removes the last element

function _burnActiveRaffle(uint256 i) internal;

Parameters

NameTypeDescription
iuint256Element index to remove

setFeeCollector

FUNCTIONS

*Set address of fee collector. Requirements:

  • msg.sender has to be the owner of the factory.
  • newFeeCollector can’t be address 0x0.*
function setFeeCollector(address newFeeCollector) external override onlyOwner;

Parameters

NameTypeDescription
newFeeCollectoraddressAddress of feeCollector.

Events

RaffleCreated

event RaffleCreated(address raffle);

Parameters

NameTypeDescription
raffleaddressAddress of the created raffle

Structs

ActiveRaffle

raffle the address of the raffle

deadline is the timestamp that marks the start time to perform the upkeep effect.

struct ActiveRaffle {
    address raffle;
    uint256 deadline;
}