PoolTogether Prize Savings Protocol
The PoolTogether Prize Savings Protocol Ethereum smart contracts.
For an overview of the concepts and API please see the documentation
Setup
This project is available as an NPM package:
$ yarn add @pooltogether/pooltogether-contracts
Usage
Artifacts
There are deployment artifacts available in the deployments/
directory. For example, to pull in the PoolWithMultipleWinnersBuilder artifact:
const PoolWithMultipleWinnersBuilder = require('@pooltogether/pooltogether-contracts/deployments/rinkeby/PoolWithMultipleWinnersBuilder.json')
const {
abi,
address,
receipt
} = PoolWithMultipleWinnersBuilder
ABIs
Application Binary Interfaces for all PoolTogether contracts and related contracts are available in the abis/
directory.
For example, to pull in the PrizePool ABI:
const PrizePool = require('@pooltogether/pooltogether-contracts/abis/PrizePool.json')
Development
First clone this repository and enter the directory.
Install dependencies:
$ yarn
We use direnv to manage environment variables. You'll likely need to install it.
Testing
We use Hardhat and hardhat-deploy
To run unit & integration tests:
$ yarn test
To run coverage:
$ yarn coverage
To run fuzz tests:
$ yarn echidna
Fork Testing
Ensure your environment variables are set up. Make sure your Alchemy URL is set. Now start a local fork:
$ yarn start-fork
Setup account impersonation and transfer eth:
$ ./scripts/setup.sh
Deployment
Deploy Locally
Start a local node and deploy the top-level contracts:
$ yarn start
NOTE: When you run this command it will reset the local blockchain.
Connect Locally
Start up a Hardhat Console:
$ hardhat console --network localhost
Now you can load up the deployed contracts using hardhat-deploy:
> await deployments.all()
If you want to send transactions, you can get the signers like so:
> let signers = await ethers.getSigners()
Let's mint some Dai for ourselves:
> let dai = await ethers.getContractAt('ERC20Mintable', (await deployments.get('Dai')).address, signers[0])
> await dai.mint(signers[0]._address, ethers.utils.parseEther('10000'))
> ethers.utils.formatEther(await dai.balanceOf(signers[0]._address))
Deploy to Live Networks
Copy over .envrc.example to .envrc
$ cp .envrc.example .envrc
Make sure to update the enviroment variables with suitable values.
Now enable the env vars using direnv
$ direnv allow
Now deploy to a network like so:
$ yarn deploy rinkeby
It will update the deployments/
dir.