// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract CrowdFunding {
struct Funder {
address addr; // 贊助者的Address
uint256 amount; // 該贊助者贊助的金額
}
struct Campaign {
address payable beneficiary; // 受益者的Address
uint256 fundingGoal; // 目標募資金額
uint256 numFunders; // 目前贊助者總人數
uint256 amount; // 目前已獲得的總贊助金額
mapping(uint256 => Funder) funders; // 使用Mapping紀錄Funders資料
}
// 建立一個全域變數,紀錄目前活動的總數
uint256 public numCampaigns;
mapping(uint256 => Campaign) public campaigns;
function newCampaign(address payable beneficiary, uint256 goal)
public
returns (uint256 campaignID)
{
campaignID = numCampaigns++; // 活動的編號累加上升
Campaign storage c = campaigns[campaignID]; // 複製一個名稱為c的指標,指向storage中campaigns[campaignID]的空間
c.beneficiary = beneficiary; // 將beneficiary assgin給campaigns[campaignID]的beneficiary
c.fundingGoal = goal; // 將goal assgin給campaigns[campaignID]的fundingGoal
}
function contribute(uint256 campaignID) public payable {
Campaign storage c = campaigns[campaignID];
c.funders[c.numFunders++] = Funder({ //constructor
addr: msg.sender,
amount: msg.value
});
c.amount += msg.value;
}
function checkGoalReached(uint256 campaignID)
public
returns (bool reached)
{
Campaign storage c = campaigns[campaignID];
if (c.amount < c.fundingGoal) return false;
uint256 amount = c.amount;
c.amount = 0;
c.beneficiary.transfer(amount);
return true;
}
event funderInfo(address funderAddr, uint256 fundVal);
function logFunderInfo(uint256 campaignID, uint256 funderID) public returns(address, uint256){
Campaign storage c=campaigns[campaignID];
Funder storage f=c.funders[funderID];
emit funderInfo(f.addr, f.amount);
return (f.addr, f.amount);
}
}
Hash: 0x4bc96b151e57530e4c74ed7fd7d14e15c856fcae2a50afbae6ba7214d14f66eb