// 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--募捐(捐赠)合约
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- zkTube是如何诞生的? 众所周知,以太坊1.0主网凭借其强大的共识与安全性吸引了无数应用搭建于其上,但随着整个...
- 微信支付来打赏,一直是个人开发者的心痛之地。 微信的很多Activity都是只能在它自己app的uid下启动,其他...
- Solidity智能合约开发测试环境搭建 以太坊合约开发工具非常多,但是功能上各有优缺点,因此如何选择搭配一套比较...