Я хочу, чтобы сработала функция "closeAuction", но она не работает - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь сделать Auction-Dapp-Ethereum для учебника. Все остальные функции работают, но функция closeAuc не работает. В чем проблема этой функции ?? Я скомпилировал на коммит Remix 0.5.6.

Я изменил closeAuc () public -> closeAuc () public payable. Но не удалось ......

pragma solidity ^0.5.0;

contract PictureAuction {
address contractOwner;
string contractName;
constructor (string memory _name) public {
    contractOwner = msg.sender;
    contractName=_name;
}

//상품 Product
struct Item {
    string name;    //상품명    Product name
    uint time;      //경매시간  Auction time limit
}

Item[] public items;

uint topBid;                             //최고 입찰금액  highest Bid
address payable private seller;          //상품 판매자(등록자) 주소     product seller address
address topBidder;                       //최고 입찰자 주소, 마지막에 이 주소를 사용    hightest bidder address
address payable private refundToBidder;  //더 높은 입찰자가 나타나면 전 입찰자에게 환불해줄 주소  refund address for ex-top bidder 

mapping (uint => address) productToOwner;            //상품의 소유자, 최고 입찰자가 나타나면 그 사람으로 변경 If higher bidder is up, update that.
mapping (address => uint) bidCooltime;               //입찰 쿨 타임, 고의적인 반복입찰 방지 Limit malicious repeated bidding on.
mapping (address => uint) bidMoney;                  //환불해줄 금액  Refund      

//상품 등록 Listing up Product
function listUp(string memory _name) public {
    require(seller == address(0));
    uint id = items.push(Item(_name, now + 1 minutes))-1;
    productToOwner[id] = msg.sender;
    seller = msg.sender;
    topBid = 0;
}

// @title 입찰, 입찰에는 다음과 같은 규칙이 있다. This is Auction rule.
// * 입찰금이 본인의 계좌의 잔액 이하일 것  Address balance >= msg.value
// * 한 번 입찰가를 등록하면 30초동안 입찰할 수 없다.   Bidding cool time: 30 seconds
function bidOn(uint _id) public payable {
    require(msg.value != 0);
    require(items[_id].time >= now);
    require(msg.sender.balance >= msg.value);
    require(bidCooltime[msg.sender] < now);
   if(topBid < msg.value){
        if(topBidder == address(0)){
            //첫 입찰자의 경우 First Bidding
            topBid = msg.value;
            topBidder = msg.sender;
            bidMoney[msg.sender]=topBid;
        }
        //전 입찰자에게 환불 후 Refund to ex-top bidder
        refundToBidder = address(uint160(topBidder));
        refundToBidder.transfer(topBid);
        //최고 입찰자 갱신  Update top bidder info.
        topBid = msg.value;
        topBidder = msg.sender;
        bidMoney[msg.sender]=topBid;
    } else {
        //현재 최고 입찰가보다 낮으면 금액을 환불해 준다.
        //If Bidding money is less than current topBid, refund money to msg.sender.
        refundToBidder = address(uint160(msg.sender));
        refundToBidder.transfer(msg.value);
    }
    bidCooltime[msg.sender] = now + 30 seconds;
}

//경매 종료 Limited Auction Time is up.
// @dev 최초 상품 등록자만 이 기능 이용 가능 Only product seller can use this function
function closeAuc(uint _id) public payable {
    require(msg.sender == seller);
    require(items[_id].time < now);
    seller.transfer(topBid);            //돈 주고  ****이 방식은 후에, 낙찰자가 상품을 받은 후, 승인하여 돈을 판매자에게 줄 수 있도록 변경하자!!*** Ignore this. does not 
    productToOwner[_id] = topBidder;    //상품 주인 바꿔주고 Change product owner.
}


//경매 결과 확인(경매가 간보기)  Check current Auction status.
function ganjebi(uint _id) public view returns (string memory name, uint time, uint) {
    return (items[_id].name, items[_id].time, topBid);
}
}

Я просто хочу, чтобы функция closeAuc работала.

...