Try   HackMD

Programming Language Constructs HW9

Code

// 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);
    }
}

Contract

Hash: 0x4bc96b151e57530e4c74ed7fd7d14e15c856fcae2a50afbae6ba7214d14f66eb

[View on Etherscan]