pragma solidity >=0.4.22 <0.7.0;
contract zhongchou{
uint NeederId;
mapping(uint => Needer) Needers;
struct Needer{
address neederAddress;
uint needMoney;
uint nowMoney;
uint FunderId;
mapping(uint=>Funder) Funders;
}
//发起,注意转账的时候的ether不是写在合约里面的。
struct Funder{
address playerAdderss;
uint toMoney;
}
//设置每次参与的单位
uint price = 1 ether;
function getAddress() public view returns(address){
return msg.sender;
}
function newNeeder(uint _needMoney) public{
NeederId ++;
Needers[NeederId] = Needer(msg.sender,_needMoney*price,0,0);
}
//参与众筹,
function fund(uint _to) payable public{
Needer storage _needer = Needers[_to];
_needer.nowMoney += msg.value;
_needer.FunderId++;
_needer.Funders[_needer.FunderId] = Funder(msg.sender,msg.value);
}
//查看是否完成
function finishd(uint _NeederID) payable public {
Needer storage _Needer = Needers[_NeederID];
if(_Needer.nowMoney>=_Needer.needMoney){
address(uint160(_Needer.neederAddress)).transfer(_Needer.nowMoney);
}
}
//这样写是为了方便查看信息
function showData(uint _NeederId) public view returns(uint,uint,address){
Needer storage _Needer = Needers[_NeederId];
return (_Needer.needMoney,_Needer.nowMoney,_Needer.neederAddress);
}
}
功能:
- Needer结构体是众筹发起者的数据结构,其中的mapping对应该众筹项目下的参与众筹者,一个id对应一个参与者
- Funder为参与者结构体,有其地址和参与的金额。
- needer发起请求,函数为NewNeeder,参数为需要的总金额,将id写入到Needers中,Needers(NeederId) = Needer(msgd.sender,needMoney,0,0)通过该结构体构造函数新生成一个Needer,
- 转账的时候是先给合约地址,当nowMoney>=needmoney的时候,表示众筹成功,此时众筹者再将存在合约中的ether转移到自己的账户中。