如何付款到所有者地址?

时间:2018-12-19 14:35:24

标签: ethereum solidity remix

我的问题是我无法通过transfer()函数从买方地址向所有者地址付款。我尝试在completeOrder()中执行此操作,但是我一次又一次遇到相同的错误。然后,我尝试通过Remix ide上买方地址上的sendtoOwner函数进行调试。错误保持不变。

  • 所有者地址= 0xca35b7d915458ef540ade6068dfe2f44e8fa733c
  • 买方地址= 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c

我收到的错误消息:

  

与UPChain.sendtoOwner的交易错误:VM错误:恢复。
  恢复事务已恢复到初始状态。
  注意:如果您发送值,则应向构造函数付款。
  调试事务以获取更多信息。

我的代码:

 pragma solidity ^0.5.0;

contract UPChain  {
    address payable public owner;
    address payable public buyerAd;
    uint private price;
    Order private order;
    mapping(uint => Product) offeredProducts;
    uint private productseq;
    uint private orderedProductseq;

   struct Product{
       string productName;
       uint productPrice;
   }
   struct Order{
       uint orderNo;
       mapping(uint => Product) products;
   }

    modifier ownerMod  {
        require(owner == msg.sender);
        _;
    }
    modifier buyerMod {
        require(buyerAd == msg.sender);
        _;
    }
    function () external payable {
     buyerAd.transfer(msg.value);
    }

    constructor (address payable _buyerAd) public payable  {
        buyerAd = _buyerAd;
        order = Order(1);
        owner = msg.sender;
    }
    function addProduct(string memory _productName,uint _productPrice) public ownerMod{
        offeredProducts[productseq] = Product(_productName,_productPrice);
        productseq++;
    }
    function queryProduct(uint _productseq) public view returns(string memory, uint){

       return (offeredProducts[_productseq].productName,offeredProducts[_productseq].productPrice);
    }


    // functions used by buyer
    function addtoOrder(uint _productseq) public buyerMod{
        order.products[orderedProductseq] = offeredProducts[_productseq];
        orderedProductseq++;
    }

    function queryOrderedProduct(uint _orderedProductseq) public view buyerMod returns(string memory,uint){
        return(order.products[_orderedProductseq].productName,order.products[_orderedProductseq].productPrice);
    } 

    function completeOrder() public payable buyerMod returns(string memory,uint){
        uint totalPrice=0;
        for(uint i=0; i<orderedProductseq;i++){
            totalPrice+= order.products[i].productPrice*1000000000000000000;
        }
        if(msg.value > totalPrice){
            owner.transfer(msg.value);
            return ("Order is completed", buyerAd.balance);
        }
        else{
            revert();
            return ("Order is not completed", buyerAd.balance);

        }
    }




    //

    function sendtoOwner(uint256 value) public payable buyerMod{
        owner.transfer(value);
    }


    function setPrice(uint _price) public ownerMod {
        price = _price;
    }

    function getPrice() public view returns(uint)  {
        return price;
    }
    function getContractValue() public  payable returns(uint){
        return owner.balance;

    }


}

1 个答案:

答案 0 :(得分:0)

我可以毫无问题地运行您的代码。调用以下函数时

function sendtoOwner(uint256 value) public payable buyerMod{
        owner.transfer(value);
    }

您使用所有者帐户或买方帐户打电话吗?执行此功能时,您需要以买方身份致电,因为您有一个修饰符,该修饰符会检查其买方还是所有者。如果它不是买家,那么它将恢复原状,这就是我所期望的情况。