Proveable Random Raffle Contracts

About

This code is to create a proveable random smart contract lottery.

What we want it to do?

  1. Users can enter by paying for a ticket
    1. The ticket fees are going to go to the winner during the draw
  2. After X period of time, the lottery will automatically draw a winner
    1. This will be done programatically
  3. Using Chainlink VRF and Chainlink Automation
    1. Chainlink VRF -> Randomness
    2. Chainlink Automation -> Time based trigger

Solidity Style Guide

Contract elements should be laid out in the following order:

  • Pragma statements
  • Import statements
  • Events
  • Errors
  • Interfaces
  • Libraries
  • Contracts

Inside each contract, library or interface, use the following order:

  • Type declarations
  • State variables
  • Events
  • Errors
  • Modifiers
  • Functions

Order of functions

  • constructor
  • receive function (if exists)
  • fallback function (if exists)
  • external
  • public
  • internal
  • private
  • Within a grouping, place the view and pure functions last.

The modifier order for a function should be:

  • Visibility
  • Mutability
  • Virtual
  • Override
  • Custom modifiers

Tests!

  1. Write some deploy scripts
  2. Write some Tests
    1. Work on local chain
    2. Work on Forked testnet
    3. Work on Forked mainnet

Foundry

Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.

Foundry consists of:

  • Forge: Ethereum testing framework (like Truffle, Hardhat and DappTools).
  • Cast: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data.
  • Anvil: Local Ethereum node, akin to Ganache, Hardhat Network.
  • Chisel: Fast, utilitarian, and verbose solidity REPL.

Documentation

https://book.getfoundry.sh/

Usage

Build

$ forge build

Test

$ forge test

Format

$ forge fmt

Gas Snapshots

$ forge snapshot

Anvil

$ anvil

Deploy

$ forge script script/Counter.s.sol:CounterScript --rpc-url <your_rpc_url> --private-key <your_private_key>

Cast

$ cast <subcommand>

Help

$ forge --help
$ anvil --help
$ cast --help