pragma solidity ^0.8.1; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract Campaign is ERC20 { int public currentAmount; int public goal; address public creator; mapping(address => int) public pledges; event Pledge(address _pledger, int _amount); event Claim(address _pledger, int _amount); event Refund(address _pledger, int _amount); constructor(int _goal) public { creator = msg.sender; goal = _goal; } function pledge(int _amount) public { require(msg.sender.transferFrom(msg.sender, address(this), _amount), "Could not pledge tokens."); pledges[msg.sender] += _amount; currentAmount += _amount; emit Pledge(msg.sender, _amount); } function claim() public { require(msg.sender == creator, "You are not the creator so you cannot claim the funds."); require(currentAmount >= goal, "The goal has not yet been reached!"); require(address(this).transfer(msg.sender, currentAmount), "Something went wrong and we couldn't transfer the funds."); emit Claim(msg.sender, currentAmount); } function refund(address _pledger) public { require(msg.sender == creator, "You are not the creator so you cannot refund."); require(pledges[_pledger] > 0, "This person has not pledged funds."); require(address(this).transfer(_pledger, pledges[_pledger]), "Something went wrong and we couldn't refund."); pledges[_pledger] = 0; currentAmount -= pledges[_pledger]; emit Refund(_pledger, pledges[_pledger]); } function balanceOf(address _pledger) public view returns (int) { return pledges[_pledger]; } }
0.4.18