// 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 {
}
}
网友评论