Skip to content

Instantly share code, notes, and snippets.

@cupOJoseph
Created March 1, 2023 23:22
Show Gist options
  • Save cupOJoseph/1078ff84f7e9887988eb2996a4ac460b to your computer and use it in GitHub Desktop.
Save cupOJoseph/1078ff84f7e9887988eb2996a4ac460b to your computer and use it in GitHub Desktop.
contract from our solidity 102 workshop at eth denver 2023
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract Farm{
//track time of last deposit
//block.timestamp
mapping(address user => uint timestamp) public timeOfLastDeposit;
//track how much deposited
mapping(address user => uint balance) public userBalances;
// create instance of ERC20 tokens
address public rewardTokenAddress;
address public lockedTokenAddress;
IERC20 rewardToken;
constructor(address _rewardTokenAddress, address _lockedTokenAddress){
lockedTokenAddress = _lockedTokenAddress;
rewardTokenAddress = _rewardTokenAddress;
rewardToken = IERC20(rewardTokenAddress);
}
function deposit(uint amount) public{
//take tokens from user and move to this contract
IERC20 lockedToken = IERC20(lockedTokenAddress);
lockedToken.transferFrom(msg.sender, address(this), amount);
//update balance of user
require(userBalances[msg.sender] + amount >= userBalances[msg.sender], "overflow???? how did you even do this?");
userBalances[msg.sender] += amount;
//update timestamp of last deposit
timeOfLastDeposit[msg.sender] = block.timestamp;
}
function claim() public{
//calculate how much you can claim
uint timePassed = block.timestamp - timeOfLastDeposit[msg.sender];
uint reward = timePassed * userBalances[msg.sender] * 10000;
if(userBalances[msg.sender] > 100000){
reward = reward * 2;
}
//transfer to the claimer
rewardToken.transferFrom(address(this), msg.sender, reward);
//update time of last deposit
timeOfLastDeposit[msg.sender] = block.timestamp;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment