以太坊 Solidity example - 拍卖

pragma solidity ^0.4.11;
contract SimpleAuction {
    address public beneficiaryAddress; // 受益人地址
    uint public auctionClose; // 拍卖关闭

    address public topBidder; // 第一投标人地址
    uint public topBid; // 最高投标

    mapping(address => uint) returnsPending; // 未中标的用户的投标记录(记录了用户地址、投标金额)

    bool auctionComplete; // 拍卖是否结束

    event topBidIncreased(address bidder, uint bidAmount); // 事件:最高投标产生了(投标人地址,投标金额)
    event auctionResult(address winner, uint bidAmount); // 事件:拍卖结果(中标人地址,投标金额)

    // 构造函数,创建一个拍卖,初始化受益人地址、拍卖结束时间
    constructor(
        uint _biddingTime,
        address _beneficiary
    ) public {
        beneficiaryAddress = _beneficiary;
        auctionClose = now + _biddingTime;
    }
    // 投标
    // 要求:1. 当前时间 < 结束时间;2. 投标金额 > 当前的最高金额
    // 如果当前的最高投标人不为空,将其放入退款列表
    // 设置最高投标人的地址、金额
    // 发送投标增加事件
    function bid() public payable {
        require(now <= auctionClose);
        require(msg.value > topBid);
        if (topBidder != 0) {
            returnsPending[topBidder] += topBid;
        }
        topBidder = msg.sender;
        topBid = msg.value;
        emit topBidIncreased(msg.sender, msg.value);
    }

    // 退款给未中标的用户
    // 未中标用户发来退款请求,从可退款记录中取得此用户的投标金额
    // 如果大于0,先将可退款记录中的金额清0,然后给用户转账,如果转账成功,返回true,否则,将可退款记录中的金额再设置回来,返回false
    // 一定要先置为0,再转账,防止多次请求,因为转账是要时间,如果期间用户发起多次请求,那么就会产生多次转账
    function withdraw() public returns (bool) {
        uint bidAmount = returnsPending[msg.sender];
        if (bidAmount > 0) {
            returnsPending[msg.sender] = 0;
            if (!msg.sender.send(bidAmount)) {
                returnsPending[msg.sender] = bidAmount;
                return false;
            }
        }
        return true;
    }

    // 关闭拍卖
    // 要求:1. 当前时间 > 拍卖的结束时间;2. 还没有设置为结束状态
    // 设置结束状态,发送拍卖结果事件,给受益人转账
    function auctionClose() public {
        require(now >= auctionClose);
        require(!auctionComplete);

        auctionComplete = true;
        emit auctionResult(topBidder, topBid);

        beneficiaryAddress.transfer(topBid);
    }
}

remix 中进行测试:

  • 填入构造参数进行创建
"0xca35b7d915458ef540ade6068dfe2f44e8fa733c",10000

查看下变量 beneficiaryAddress,看是和参数一致。

  • 投标操作

例如:

第一次选择地址:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
value:3

第二次选择地址:0x583031d1113ad414f02576bd6afabfb302140225
value:5

每次操作之后都查看下变量 topBiddertopBid 进行验证。

  • 退款操作

选择地址 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 后点击 withdraw,然后在账户列表中可以看到余额的变化。

以太坊 Solidity example - 拍卖_第1张图片
remix

你可能感兴趣的:(以太坊 Solidity example - 拍卖)