# Programming Language Constructs HW9 ## Code ```solidity // 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]](https://rinkeby.etherscan.io/tx/0x4bc96b151e57530e4c74ed7fd7d14e15c856fcae2a50afbae6ba7214d14f66eb)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up