1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| contract CrowdFund{ event Launch(uint id,address indexed creator,uint goal,uint32 startAt,uint32 endAt); event Cancel(uint id); event Pledge(uint indexed id,address indexed caller,uint amount ); event Unpledge(uint indexed id,address indexed caller,uint amount); event Claim(uint id); event Refund(uint indexed id,address indexed caller,uint amount); struct Campaign{ address creator; uint goal; uint pledged; uint32 startAt; uint32 endAt; bool claimed;
} IERC20 public immutable token; uint public count; mapping(uint =>Campaign) public campaigns; mapping(uint=>mapping(address=>uint))public pledgeAmount; constructor(address _token){ token=IERC20(_token); }
function launch(uint _goal,uint32 _startAt,uint32 _endAt)external{ require(startAt>=block.timestamp,"start at < now"); require(_endAt>=_startAt,"end at < start at"); require (_endAt<=block.timestamp+90 days,"end at >max duration"); count+=1; campaigns[count]=Campaign({ creator:msg.sender, goal:_goal, pledged:0, startAt:_startAt, endAt:_endAt, claimed:false }); emit Launch(count, msg.sender,_goal,_startAt,_endAt); } function cancel(uint _id)external{ Campaign memory campaign=campaigns[id]; require(msg.sender==campaign.creator,"not creator"); require(block.timestamp<campaign.startAt,"started"); delete campaigns[id]; emit Cancel(_id);
} function pledge(uint _id,uint _amount)external{ Campaign storage campaign=campaigns[_id]; require(block.timestamp>=campaign.startAt,"not started"); require(block.timestamp<=campaign.endAt,"ended"); campaign.pledged+=_amount; pledgedAmount[_id][msg.sender]+=_amount; token.transferFrom(msg.sender,address(this),_amount); emit pledge(_id,msg.sender,_amount);
} function unpledge(uint _id,uint _amount)external{ Campaign storage campaign=campaigns[_id]; require(block.timestamp<=campaign.endAt,"ended"); require(pledgeAmount[_id][msg.sender]>=_amount); campaign.pledged-=_amount; pledgeAmount[_id][msg.sender]-=_amount;
token.transfer(msg.sender,_amount); emit Unpledge(_id,msg.sender,_amount);
} function claim(uint _id)external{ Campaign storage campaign=campaigns[_id]; require(msg.sender==campaign.creator,"not creator"); require(block.timestamp>campaign.endAt,"not ended"); require(campaign.pledged>=campaign.goal,"pledged<goal"); require(!campaign.claimed,"claimed"); campaign.claimed=true; token.transferFrom(msg.sender,campaign.pledged); emit Claim(_id);
} function refund(uint _id)external{ Campaign storage campaign=campaigns[_id]; require(block.timestamp>campaign.endAt,"not ended"); require(campaign.pledged<campaign.goal,"pledged>goal");
uint bal=pledgeAmount[_id][msg.sender]; pledgeAmount[_id][msg.sender]=0; token.transfer(msg.sender,bal); emit Refund(_id,msg.sender,bal);
} }
|