智能合約solidity:轉(zhuǎn)賬藏雏,打款,退款作煌,銷毀等

本合約是一個比較完整的眾籌合約掘殴,含:新建眾籌項目,轉(zhuǎn)賬粟誓,打款奏寨,以及退款等功能!
編寫合約時鹰服,可以直接在線上編寫和測試部署

聲明結(jié)構(gòu)體和變量

參與者只需記錄參與者的地址和捐贈的金額

    struct funder {
        address funderAddress; // 捐贈者地址
        uint toMoney; // 捐贈money
    }

發(fā)起者則需要較多的屬性服爷,如:受益地址,目標(biāo)金額获诈,是否募資完成等H栽础!舔涎!
另外笼踩,要通過funderMap(mapping)將捐贈者的id與捐贈者綁定在一起,從而得知是誰給受益人捐錢亡嫌。

    struct needer {
        address payable neederAddress; // 受益人地址
        uint goal; // 眾湊總數(shù)(目標(biāo))
        uint amount; // 當(dāng)前募資金額
        uint isFinish; // 募資是否完成
        uint funderAccount; // 當(dāng)前捐贈者人數(shù)
        mapping(uint => funder) funderMap; // 映射嚎于,將捐贈者的id與捐贈者綁定在一起,從而得知是誰給受益人捐錢
    }

聲明發(fā)起眾湊的項目挟冠,并且通過neederMap(mapping)將受益人id與收益金額綁定在一起于购,從而可以更好的管理受益人

    address payable owner; // 合約發(fā)起者地址
    uint neederAmount; // 眾籌項目id
    mapping (uint => needer) neederMap; // 通過mapping將受益人id與收益金額綁定在一起,從而可以更好的管理受益人

實例眾湊項目

create眾湊項目的時候知染,直接給定一個自增的序號當(dāng)作當(dāng)前眾湊項目的id肋僧。create項目時,要根據(jù)前面聲明的needer結(jié)構(gòu)體實例,參數(shù)要一一對應(yīng)嫌吠。

    /*
    * _neederAddress: 受益人地址(項目發(fā)起者)
    * _goal: 眾籌目標(biāo)
    */
    function NewNeeder(address payable _neederAddress, uint _goal) public {
        owner = msg.sender;
        neederAmount++;
        neederMap[neederAmount] = needer(address(_neederAddress), _goal, 0, 0, 0);
    }

捐贈者參與捐贈(轉(zhuǎn)賬)

捐贈可以根據(jù)眾湊項目id給該項目捐錢(轉(zhuǎn)賬)止潘,當(dāng)合約的方法發(fā)生轉(zhuǎn)賬時必須用到payable關(guān)鍵字。另外辫诅,要先校驗捐贈者錢包余額夠不夠本次捐贈的余額凭戴,還有校驗該項目是否已終止,判斷都有效的情況炕矮,此時會將本次捐贈的金額直接轉(zhuǎn)賬到當(dāng)前合約中么夫,同時記錄捐贈人數(shù)和記錄捐贈者。

    // 捐贈者給指定眾籌id打錢
    /*
    *_neederAmount: 眾籌項目id
    *_address: 捐贈者地址
    */
    function contribue(address _address, uint _neederAmount) public payable {
        require(msg.value > 0);
        needer storage _needer = neederMap[_neederAmount]; // 獲取眾籌項目
        require(_needer.isFinish == 0); // 募資是否完成肤视, 若完成則取消當(dāng)前捐款
        _needer.amount += msg.value; // 捐贈金額
        
        _needer.funderAccount++; // 捐贈者個數(shù)
        _needer.funderMap[_needer.funderAccount] = funder(_address, msg.value); // 標(biāo)記捐贈者及捐贈金額
    }

項目結(jié)束档痪,轉(zhuǎn)賬給受益人(也是屬于轉(zhuǎn)賬)

結(jié)束項目的原因有多種,但是這里只是用捐贈完成的原因作為例子钢颂。捐贈完成后钞它,可以由合約發(fā)起者(本合約中也是受益者)發(fā)起將合約的錢轉(zhuǎn)到自己的錢包地址中拜银,這里同樣發(fā)生了交易殊鞭,所以也要用到關(guān)鍵字payable。然而尼桶,我們發(fā)現(xiàn)該方法中有一個onlyOwner修飾詞操灿,onlyOwner在下面會聲明,表示只能是合約發(fā)起者才能調(diào)用該方法泵督。

    // 捐贈是否完成趾盐,若完整,給受益人轉(zhuǎn)賬
    /*
    *_neederAmount: 眾籌項目id
    */
    function Iscompelete(uint _neederAmount) public payable onlyOwner {
        needer storage _needer = neederMap[_neederAmount]; // 獲取眾籌項目
        require(_needer.amount >= _needer.goal);
        _needer.neederAddress.transfer(_needer.amount);
        _needer.isFinish = 1; // 若完成募資小腊,則取消繼續(xù)募資
    }

退錢(也是屬于轉(zhuǎn)賬)

當(dāng)捐款的完成后救鲤,由于合約沒有銷毀,捐贈者還是可以繼續(xù)捐贈的秩冈,因此會導(dǎo)致多出的錢仍在合約賬戶中本缠,所以就有了該退款的方法。該方法是將合約上的錢根據(jù)捐贈者退回給捐贈者入问。

    //  募資完成時丹锹,退款給捐贈人
    function returnBack(uint _neederAmount) public payable {
        needer storage _needer = neederMap[_neederAmount]; // 獲取眾籌項目
        require(_needer.funderMap[_needer.funderAccount].funderAddress == msg.sender);
        uint returnMoney = _needer.funderMap[_needer.funderAccount].toMoney;
         
        uint balance = address(this).balance;
         
        balance -= returnMoney;
        msg.sender.transfer(returnMoney);
    }

查詢已募資金額(合約的錢)

    // 查詢合約余額
    function getBalance() public view returns(uint) {
        return address(this).balance;
    }

查詢募資狀態(tài)

   // 查看募資狀態(tài)
    function showData(uint _neederAmount) public view returns(uint, uint, uint, uint) {
        return (neederMap[_neederAmount].goal, neederMap[_neederAmount].isFinish, neederMap[_neederAmount].amount,            neederMap[_neederAmount].funderAccount); 
    }

聲明合約擁有者

    modifier onlyOwner(){
        require(msg.sender == owner);
        _;
    }

合約銷毀

    function kill() public {
        require(msg.sender == owner);
        selfdestruct(owner);
    }

源碼地址:https://github.com/Jacky-MYD/Crowd-funding-solidity

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芬失,隨后出現(xiàn)的幾起案子楣黍,更是在濱河造成了極大的恐慌,老刑警劉巖棱烂,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件租漂,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機窜锯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門张肾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锚扎,你說我怎么就攤上這事吞瞪。” “怎么了驾孔?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵芍秆,是天一觀的道長。 經(jīng)常有香客問我翠勉,道長妖啥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任对碌,我火速辦了婚禮荆虱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朽们。我一直安慰自己怀读,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布骑脱。 她就那樣靜靜地躺著菜枷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叁丧。 梳的紋絲不亂的頭發(fā)上啤誊,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音拥娄,去河邊找鬼蚊锹。 笑死,一個胖子當(dāng)著我的面吹牛稚瘾,可吹牛的內(nèi)容都是我干的牡昆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼孟抗,長吁一口氣:“原來是場噩夢啊……” “哼迁杨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凄硼,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤铅协,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后摊沉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狐史,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了骏全。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苍柏。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姜贡,靈堂內(nèi)的尸體忽然破棺而出试吁,到底是詐尸還是另有隱情,我是刑警寧澤楼咳,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布熄捍,位于F島的核電站,受9級特大地震影響母怜,放射性物質(zhì)發(fā)生泄漏余耽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一苹熏、第九天 我趴在偏房一處隱蔽的房頂上張望碟贾。 院中可真熱鬧,春花似錦轨域、人聲如沸袱耽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扛邑。三九已至怜浅,卻和暖如春铐然,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恶座。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工搀暑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跨琳。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓自点,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脉让。 傳聞我的和親對象是個殘疾皇子桂敛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容