众筹合约示例代码如下:
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract CrowFund {
//首先定义一个变量用来专门统计 多少个人 需要 捐款
uint256 public neederAmount = 0; //用来统计多少人的
//这里肯定有一个键值对map用来存粹 a b c d等收款地址
mapping(address => Needer) public neederMap; //a的收款地址 有哪些人捐款 分别捐款多少钱
address public owner;
//定义一个结构体
struct Needer {
address neederUserAddress; // 需要接受捐款的收款地址
uint256 goalMoney; //目标本个人 需要捐款多少钱 计划需要别人捐款多少钱
uint256 alreadyMoney; //本格收款地址下已经捐款多少钱
uint256 funderAcount; // 这个收款地址有多少人捐款
}
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
//传入用户地址 统计数据 +1 目标要捐款多少钱
function newNeeder(address _neederUserAddress, uint256 _goalMoney) external onlyOwner {
//每产生一个需要捐款的地址工程
Needer memory neederStruct = Needer({
neederUserAddress: _neederUserAddress,
goalMoney: _goalMoney,
alreadyMoney: 0,
funderAcount: 0
});
neederMap[_neederUserAddress] = neederStruct;
neederAmount++;
}
//开始捐款
function startHelpMoney(address _to) external payable {
//payable(_to).transfer(msg.value);
// send all Ether to owner
(bool success, ) = _to.call{value: msg.value}("");
require(success, "Failed to send Ether");
//msg.sender捐款给谁捐款多少
neederMap[_to].alreadyMoney+=msg.value;
}
}
捐款逻辑如下:
1.合约的部署者才可以调用newNeeder方法构建 需要捐款的地址
2.每个用户可以发起捐款到目标地址.
实例效果如下:
部署的账号地址:0x1D99d05a9616973Ba67751e7DD3600aBB29d9698
部署合约的合约地:0x86277FbD8403B1907269775e01100FbE198319c8
第一步调用newNeeder方法 只有合约的部署者可以调用该方法,效果如下
发起捐款给谁这里是给0x1D99d05a9616973Ba67751e7DD3600aBB29d9698这个地址捐款
效果如下: