Как произвести оплату по адресу владельца? - PullRequest
0 голосов
/ 19 декабря 2018

Моя проблема в том, что я не могу произвести оплату с адреса покупателя на адрес владельца через функцию transfer().Я пытался сделать это в completeOrder(), однако я получаю одну и ту же ошибку снова и снова.Затем я попытался выполнить отладку с помощью функции sendtoOwner по адресу покупателей на Remix ide.Ошибка осталась тем же

  • адрес владельца = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c
1011 * Ошибки, что я получил:.

transact to UPChain.sendtoOwner с ошибкой: ошибка виртуальной машины: возврат.
revert Транзакция была возвращена в исходное состояние.
Примечание: конструктор должен оплачиваться, если вы отправляете значение.
Отладка транзакции для полученияДополнительная информация.

Мой код:

 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 голосов
/ 19 декабря 2018

Я могу запустить ваш код без проблем.Когда вы звоните по приведенной ниже функции

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

, вы звоните со счета владельца или со счета покупателя.Вы должны вызывать покупателя при выполнении этой функции, так как у вас есть модификатор, который проверяет, является ли его покупатель или владелец.Если это не покупатель, то он вернется, это то, что я ожидаю, происходит в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...