https://github.com/samsshow/lottery-contract
Hardhat Smart Contract Lottery System
https://github.com/samsshow/lottery-contract
ether hardhat web3
Last synced: about 1 month ago
JSON representation
Hardhat Smart Contract Lottery System
- Host: GitHub
- URL: https://github.com/samsshow/lottery-contract
- Owner: SamsShow
- Created: 2024-05-10T13:42:34.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-05-20T16:12:09.000Z (about 2 years ago)
- Last Synced: 2025-01-11T00:41:53.459Z (over 1 year ago)
- Topics: ether, hardhat, web3
- Language: JavaScript
- Homepage: https://sepolia.etherscan.io/address/0xF4EEcB0783BF1BAcc4A559609D12a99F7a6577C3
- Size: 1.06 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Lottery-Contract
Hardhat Smart Contract Lottery System
# Key Components
## Chainlink VRF (Verifiable Random Function)
- Ensures that the random number used to select the winner is provably random and tamper-proof.
## Chainlink Keepers
- Automates the execution of the contract based on predefined conditions (e.g., time intervals).
# State Variables
## Chainlink VRF Variables
- `i_vrfCoordinatorV2`: Address of the VRFCoordinatorV2 contract.
- `i_subscriptionId`: Subscription ID for Chainlink VRF.
- `i_gasLane`: Maximum gas price for the callback request.
- `i_callbackGasLimit`: Maximum gas to be used for the callback.
- `REQUEST_CONFIRMATIONS`: Number of confirmations required before the VRF response is considered.
- `NUM_WORDS`: Number of random words requested.
## Lottery Variables
- `i_interval`: Time interval for each raffle draw.
- `i_entranceFee`: Fee to enter the raffle.
- `s_lastTimeStamp`: Timestamp of the last raffle draw.
- `s_recentWinner`: Address of the most recent winner.
- `s_players`: List of players in the current raffle.
- `s_raffleState`: State of the raffle (OPEN or CALCULATING).
# Events
- `RequestedRaffleWinner(uint256 indexed requestId)`: Emitted when a random winner is requested.
- `RaffleEnter(address indexed player)`: Emitted when a player enters the raffle.
- `WinnerPicked(address indexed player)`: Emitted when a winner is picked.
# Functions
## Constructor
- Initializes the contract with the necessary parameters and sets the initial state of the raffle to OPEN.
## enterRaffle
- Allows users to enter the raffle by sending the required entrance fee.
- Adds the player's address to the `s_players` array.
- Emits the `RaffleEnter` event.
## checkUpkeep
- Called by Chainlink Keepers to check if the upkeep (i.e., selecting a winner) is needed.
- Returns `true` if the time interval has passed, the raffle is open, there are players, and the contract has a balance.
## performUpkeep
- Called by Chainlink Keepers when `checkUpkeep` returns `true`.
- Initiates the random number request to Chainlink VRF.
- Sets the raffle state to CALCULATING.
- Emits the `RequestedRaffleWinner` event.
## fulfillRandomWords
- Callback function called by Chainlink VRF with the random number.
- Uses the random number to select a winner from the `s_players` array.
- Resets the raffle state to OPEN, clears the players array, updates the last timestamp, and transfers the contract balance to the winner.
- Emits the `WinnerPicked` event.
# Error Handling
## Custom Errors
- `Raffle__UpkeepNotNeeded`: Thrown when upkeep is not needed.
- `Raffle__TransferFailed`: Thrown when the transfer to the winner fails.
- `Raffle__SendMoreToEnterRaffle`: Thrown when the sent ETH is less than the entrance fee.
- `Raffle__RaffleNotOpen`: Thrown when the raffle is not open.
- `Raffle__NotEnoughETHEntered`: Thrown when not enough ETH is sent to enter the raffle.
# Getter Functions
- `getRaffleState`
- `getNumWords`
- `getRequestConfirmations`
- `getRecentWinner`
- `getPlayer`
- `getLastTimeStamp`
- `getInterval`
- `getEntranceFee`
- `getNumberOfPlayers`
Functions to retrieve the state and configuration of the raffle.
# Summary
This contract ensures a fair and automated raffle system by leveraging Chainlink's VRF for randomness and Keepers for automation. Users can participate by sending ETH, and the contract will automatically select a winner at defined intervals, transferring the accumulated prize to the winner. The use of custom errors and events helps in monitoring and debugging the contract's operation.