2024-02-27 solidity寫一個眾籌合約

眾籌合約示例代碼如下:

// 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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容