Solidity 智能合约基础案例——抢红包(2023版)

案例业务:土豪发红包,屌丝抢红包

需要实现的核心功能:

  • 发红包
  • 抢红包
  • 金额退还
  • 合约销毁

角色分析:

  • 土豪
  • 屌丝

土豪操作:

  • 发红包
  • 红包退回
  • 销毁合约

屌丝操作:

  • 抢红包

具体代码实现如下:

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.7;
/*      1.sendpacket:随机或平均;
      2.stakepacket;
*/

contract redpacket{
    bool public rType;             //记录红包类型
    uint8 public rCount;               //红包数量
    uint256 public rTotalAmount;       //总金额
    address public tuhao;        //记录发红包人的地址
    mapping (address=>bool) panduan;    //判断是否已经抢过红包
    constructor(bool isAvg,uint8 _count,uint _amount)payable                  //是平均还是随机;红包数量
    {
        rType = isAvg;
        rCount = _count;
        rTotalAmount=_amount;
        require(_amount == msg.value,"redpacket's balance is ok");
        tuhao = msg.sender;
        

    }

    function getbalance()public view returns(uint256){
        return address(this).balance;
    }

    //抢红包;
    function stakePacket()public payable{
        require(rCount>0,"red packet must left");
        require(getbalance()>0,"contratc's balance must enough");
        require(!panduan[msg.sender],"panduan must equal false");
        panduan[msg.sender] = true;
        if(rType){
            uint256 amount =getbalance()/rCount;
            payable(msg.sender).transfer(amount);

        }else {
            if(rCount==1){
                payable(msg.sender).transfer(getbalance());
                
            }else{

            uint256 randnum = uint256(keccak256(abi.encode(tuhao,rTotalAmount,rCount,block.timestamp,msg.sender)))%10;    //得到一个10以内的随机数;
            uint256 amount = randnum*getbalance()/10;
            payable(msg.sender).transfer(amount);
            }

        }
        rCount--;
    }

    function kill()public payable{
        selfdestruct(payable(tuhao));            //销毁合约
    }

   
}

这里有个需要注意的销毁合约的方法

function selfdestruct(address user)

user:销毁时指定的受益人,如果涉及到资金问题,需要使用payable进行转换。 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值