智能合约solidity:转账,打款,退款,销毁等

本合约是一个比较完整的众筹合约,含:新建众筹项目,转账,打款,以及退款等功能!
编写合约时,可以直接在线上编写和测试部署

声明结构体和变量

参与者只需记录参与者的地址和捐赠的金额

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

发起者则需要较多的属性,如:受益地址,目标金额,是否募资完成等!!!
另外,要通过funderMap(mapping)将捐赠者的id与捐赠者绑定在一起,从而得知是谁给受益人捐钱。

    struct needer {
        address payable neederAddress; // 受益人地址
        uint goal; // 众凑总数(目标)
        uint amount; // 当前募资金额
        uint isFinish; // 募资是否完成
        uint funderAccount; // 当前捐赠者人数
        mapping(uint => funder) funderMap; // 映射,将捐赠者的id与捐赠者绑定在一起,从而得知是谁给受益人捐钱
    }

声明发起众凑的项目,并且通过neederMap(mapping)将受益人id与收益金额绑定在一起,从而可以更好的管理受益人

    address payable owner; // 合约发起者地址
    uint neederAmount; // 众筹项目id
    mapping (uint => needer) neederMap; // 通过mapping将受益人id与收益金额绑定在一起,从而可以更好的管理受益人

实例众凑项目

create众凑项目的时候,直接给定一个自增的序号当作当前众凑项目的id。create项目时,要根据前面声明的needer结构体实例,参数要一一对应。

    /*
    * _neederAddress: 受益人地址(项目发起者)
    * _goal: 众筹目标
    */
    function NewNeeder(address payable _neederAddress, uint _goal) public {
        owner = msg.sender;
        neederAmount++;
        neederMap[neederAmount] = needer(address(_neederAddress), _goal, 0, 0, 0);
    }

捐赠者参与捐赠(转账)

捐赠可以根据众凑项目id给该项目捐钱(转账),当合约的方法发生转账时必须用到payable关键字。另外,要先校验捐赠者钱包余额够不够本次捐赠的余额,还有校验该项目是否已终止,判断都有效的情况,此时会将本次捐赠的金额直接转账到当前合约中,同时记录捐赠人数和记录捐赠者。

    // 捐赠者给指定众筹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); // 募资是否完成, 若完成则取消当前捐款
        _needer.amount += msg.value; // 捐赠金额
        
        _needer.funderAccount++; // 捐赠者个数
        _needer.funderMap[_needer.funderAccount] = funder(_address, msg.value); // 标记捐赠者及捐赠金额
    }

项目结束,转账给受益人(也是属于转账)

结束项目的原因有多种,但是这里只是用捐赠完成的原因作为例子。捐赠完成后,可以由合约发起者(本合约中也是受益者)发起将合约的钱转到自己的钱包地址中,这里同样发生了交易,所以也要用到关键字payable。然而,我们发现该方法中有一个onlyOwner修饰词,onlyOwner在下面会声明,表示只能是合约发起者才能调用该方法。

    // 捐赠是否完成,若完整,给受益人转账
    /*
    *_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; // 若完成募资,则取消继续募资
    }

退钱(也是属于转账)

当捐款的完成后,由于合约没有销毁,捐赠者还是可以继续捐赠的,因此会导致多出的钱仍在合约账户中,所以就有了该退款的方法。该方法是将合约上的钱根据捐赠者退回给捐赠者。

    //  募资完成时,退款给捐赠人
    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;
    }

查询募资状态

   // 查看募资状态
    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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容