美文网首页
solidity 合约开发测试1--募捐(捐赠)合约

solidity 合约开发测试1--募捐(捐赠)合约

作者: 精神病患者link常 | 来源:发表于2023-08-13 17:03 被阅读0次
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.21;

contract Fundraising {

    // 捐赠者信息
    struct Funder {
        address funderAddress; // 捐赠者地址
        uint money;// 捐赠者数量
    }

    // 接受者信息
    struct Needer {
        address neederAddress; // 接受者地址
        uint totalMoney;// 接受者总共需要的资金
        uint amount;// 当前募集到的资金
        uint funderAccount;// 捐赠数量 从1开始增加
        mapping (uint=>Funder) funderMap; // 捐赠者的信息 (funderAccount=>Funder)
    }

    uint neederID; // 接受者id  从1开始增加
    mapping (uint => Needer) neederMap;// 接受者集合  (neederID => Needer)
   
    // 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db
    

    /*
        初始化接受者信息
        _address: 接受者账户地址
        amount:  接受者总金额
    */
    function initNeeder(address _address, uint amount) public {
        neederID ++; // 从1开始
        // neederMap[neederID] = Needer(msg.sender,amount,0,0); 此方法不行

        Needer storage newNeeder = neederMap[neederID];
        newNeeder.neederAddress = _address;
        newNeeder.totalMoney = amount;
        newNeeder.amount = 0;
        newNeeder.funderAccount = 0;
    }

    /*
        捐款方法 通过设置 value 的值 从而给合约地址发送原生代币
        _neederID:接受者id
    */
    function sendMooney(uint _neederID) public payable {
        Needer storage _needer = neederMap[_neederID]; // 从id获取接受者信息
        _needer.amount += msg.value;
        _needer.funderAccount += 1;
        // _needer.funderMap[_needer.funderAccount] = Funder(...)
        Funder storage funder = _needer.funderMap[_needer.funderAccount];
        funder.funderAddress = msg.sender;
        funder.money = msg.value;
        // payable(address(this)).transfer(msg.value);
    }

    /*
        检查是否募捐结束
        _neederID:接受者id
    */
    function isComplete(uint _neederID) public  payable returns (bool){
        Needer storage _needer = neederMap[_neederID];
        if (_needer.amount >= _needer.totalMoney){
            // 募捐结束,则把合约的余额转入接受者的账户
            payable(_needer.neederAddress).transfer(_needer.amount);
            return true;
        }
        return false;
    }
    /*
        获取最后一个接受者的id
    */
    function getNeedLastID() public view returns (uint){
        return neederID;
    }
    /*
        通过接受者id获取接受者的信息
        因为是从1开始,所以前端 通过 getNeedLastID 获取到最后一个id
        然后循环 获取 getNeederInfo 即可获取所有的接受者信息列表
    */
    function getNeederInfo(uint _id) public view returns (address,uint,uint,uint){
        Needer storage _needer = neederMap[_id];
        return (_needer.neederAddress,_needer.totalMoney,_needer.amount,_needer.funderAccount);
    }

    /*
        获取捐赠者信息
        _id:接受者id
        _funderID:捐赠者id
        _funderID 也为自增从1开始,前端通过 getNeederInfo 获取到 funderAccount 的值(即最后一位捐赠者id)
        然后循环调用 getNeederFunderInfo 即可获取该接受者的捐赠者列表
    */
    function getNeederFunderInfo(uint _id,uint _funderID) public view returns (address,uint){
        Needer storage _needer = neederMap[_id];
        Funder storage funder = _needer.funderMap[_funderID];
        return (funder.funderAddress,funder.money);
    }

    receive() external payable {
    }

    fallback() external payable {
    }
}

相关文章

网友评论

      本文标题:solidity 合约开发测试1--募捐(捐赠)合约

      本文链接:https://www.haomeiwen.com/subject/ufxqmdtx.html