【跟乐乐学solidity】四 以太智能合约项目实践:众筹捐款应用

项目需求:众筹捐款

一个可以让任何人发起众筹进行募捐的应用,并让任何人参与捐款的应用。
捐款发起方:
发起捐款时需要指定收款钱包地址和要募集的捐款金额,达到此金额后,将不再接收捐款。

捐款方:
作为捐款方,需要指定捐款发起方的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);
    }
    
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值