Descripción del proyecto: los destinatarios inician una campaña de crowdfunding y los donantes hacen las donaciones. (Práctica, muchos detalles no son perfectos)
Rol: receptor, donante
Evento: Iniciar crowdfunding, iniciar donación, receptor retirar efectivo.
pragma solidity^0.4.26;
contract crowdFunding{
// 接收者:账户,目标金额,当前已筹集到的金额,捐款人数,捐赠者列表(用id关联)
struct Initiator{
address ini_address;
uint goal;
uint current;
uint sup_amount;
mapping(uint => Support) idSup;
}
// 捐赠者:账户,捐赠金额
struct Support{
address sup_address;
uint sup_value;
}
// 接收者集合(用id关联)
uint iniId;
mapping(uint => Initiator) idIni;
// 发起众筹,不通过Id的方法没法初始化
// 参数:接收者账户,目标金额
function create_crowdFunding(address iniAddress, uint _goal){
idIni[iniId] = Initiator(iniAddress,_goal,0,0);
iniId++;
}
// 发起捐赠
// 参数:接收者账户,id
function contribute(address iniAddress, uint _iniId) payable {
Initiator initiator = idIni[_iniId];
require(initiator.ini_address == iniAddress);
Support memory support = Support(msg.sender, msg.value);
initiator.idSup[initiator.sup_amount] = support;
initiator.sup_amount++;
initiator.current += msg.value;
}
// 提现,如果大于目标金额即可提现,否则失败
// 参数:接收者id
function withdrawal(uint _iniId) returns(string){
Initiator initiator = idIni[_iniId];
// 判断是否为接收者,只有接收者有权提现
if(initiator.ini_address != msg.sender){
return "Not qualified !";
}
if(initiator.current >= initiator.goal){
initiator.ini_address.transfer(initiator.current);
return 'success !';
}
return 'false !';
}
// 获取当前接收者的地址和id
function getIniId() view returns(uint,address){
return(iniId-1,idIni[iniId-1].ini_address);
}
}