眾籌合約示例代碼如下:
// 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方法 只有合約的部署者可以調用該方法,效果如下
構建需要捐款者跟目標金額.png
查詢map數據結構.png
發起捐款給誰這里是給0x1D99d05a9616973Ba67751e7DD3600aBB29d9698這個地址捐款
效果如下:
發起捐款.png