项目需求:众筹捐款
一个可以让任何人发起众筹进行募捐的应用,并让任何人参与捐款的应用。
捐款发起方:
发起捐款时需要指定收款钱包地址和要募集的捐款金额,达到此金额后,将不再接收捐款。
捐款方:
作为捐款方,需要指定捐款发起方的id以及自己要捐款的金额进行捐款。
代码
pragma solidity ^0.4.16;
contract crowdFunding {
struct Initiator {//发起方结构体
address helpSeekerAddress;//受捐者地址
uint targetCoinNum;//众筹目标币数量
uint moneyRaised;//已筹集数量
uint donorCount;//捐款次数
mapping(uint => Donor) donorInfos;//捐款者信息map集合。
}
struct Donor {//捐款者结构体
address donorAddress;//捐款者地址
uint onatedAmount;//捐款方
}
mapping(uint => Initiator) infos;//捐款信息map集合。
uint initiatorCount = 0;
//发起募捐,
//入参:受捐地址,募捐金额
//回参:捐款id
function createInitiator(address _helpSeekerAddress,uint _setTargetCoinNum) returns(uint initiatorId){
Initiator memory newInitiator = Initiator({helpSeekerAddress:_helpSeekerAddress,targetCoinNum:_setTargetCoinNum,moneyRaised:0,donorCount:0});
infos[initiatorCount] = newInitiator;
initiatorCount++;
}
//进行捐款
//入参:捐款发起方id
//回参:本次捐款金额,受捐地址。
function contributeMoneyByInitiatorId(uint _initiatorId) contributeCheck(_initiatorId) payable returns(uint _donationAmount,address _helpSeekerAddress){
require(msg.value > 0);
uint donationAmount = msg.value;
// create Donor obj
Donor memory newDonor = Donor({donorAddress:msg.sender,onatedAmount:donationAmount});
//get Initiator instanceObj
Initiator storage initiator = infos[_initiatorId];
initiator.moneyRaised+=donationAmount;
initiator.donorCount++;
initiator.donorInfos[initiator.donorCount] = newDonor;
//transaction
transferAccounts(initiator.helpSeekerAddress);
return (donationAmount,initiator.helpSeekerAddress);
}
function transferAccounts(address targetAddress) internal {
targetAddress.transfer(msg.value);
}
//捐款校验 校验捐款发起方是否存在,以及是否已经满额不再受捐。
//入参:捐款发起方id
modifier contributeCheck(uint _initiatorId){
require(infos[_initiatorId].helpSeekerAddress != address(0));
require(infos[_initiatorId].moneyRaised < infos[_initiatorId].targetCoinNum);
_;
}
//获取捐款发起方信息
//入参:捐款发起方id
//回参:受捐地址,目标募捐金额,当前已受捐金额,当前已受捐次数
function getInitiatorDataById(uint _initiatorId) returns(
address _helpSeekerAddress,
uint _targetCoinNum,
uint _moneyRaised,
uint _donorCount)
{
require(infos[_initiatorId].helpSeekerAddress != address(0));
Initiator storage initiator = infos[_initiatorId];
//return({_helpSeekerAddress:initiator.helpSeekerAddress,_targetCoinNum:initiator.targetCoinNum,_moneyRaised:initiator.moneyRaised,_donorCount:initiator.donorCount});
return (initiator.helpSeekerAddress,initiator.targetCoinNum,initiator.moneyRaised,initiator.donorCount);
}
}