眾籌合約示例代碼如下:
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract CrowFund {
//首先定義一個(gè)變量用來專門統(tǒng)計(jì) 多少個(gè)人 需要 捐款
uint256 public neederAmount = 0; //用來統(tǒng)計(jì)多少人的
//這里肯定有一個(gè)鍵值對map用來存粹 a b c d等收款地址
mapping(address => Needer) public neederMap; //a的收款地址 有哪些人捐款 分別捐款多少錢
address public owner;
//定義一個(gè)結(jié)構(gòu)體
struct Needer {
address neederUserAddress; // 需要接受捐款的收款地址
uint256 goalMoney; //目標(biāo)本個(gè)人 需要捐款多少錢 計(jì)劃需要?jiǎng)e人捐款多少錢
uint256 alreadyMoney; //本格收款地址下已經(jīng)捐款多少錢
uint256 funderAcount; // 這個(gè)收款地址有多少人捐款
}
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
//傳入用戶地址 統(tǒng)計(jì)數(shù)據(jù) +1 目標(biāo)要捐款多少錢
function newNeeder(address _neederUserAddress, uint256 _goalMoney) external onlyOwner {
//每產(chǎn)生一個(gè)需要捐款的地址工程
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.合約的部署者才可以調(diào)用newNeeder方法構(gòu)建 需要捐款的地址
2.每個(gè)用戶可以發(fā)起捐款到目標(biāo)地址.
實(shí)例效果如下:
部署的賬號(hào)地址:0x1D99d05a9616973Ba67751e7DD3600aBB29d9698
部署合約的合約地:0x86277FbD8403B1907269775e01100FbE198319c8
第一步調(diào)用newNeeder方法 只有合約的部署者可以調(diào)用該方法淤年,效果如下
構(gòu)建需要捐款者跟目標(biāo)金額.png
查詢map數(shù)據(jù)結(jié)構(gòu).png
發(fā)起捐款給誰這里是給0x1D99d05a9616973Ba67751e7DD3600aBB29d9698這個(gè)地址捐款
效果如下:
發(fā)起捐款.png