美文网首页
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