Функция контракта не отправляет эфириум, как ожидалось

Я использую MetaMask и вношу некоторые изменения в учебник Ethereum Pet Shop . Я работаю с двумя разными учетными записями MetaMask, используя интерфейс командной строки Ganache , и когда adopt()вызывается, я ожидаю, что некоторая часть eth будет отправлена ​​обратно предыдущему «владельцу» или моей другой учетной записи, однако кажется, что eth не отправлено из договора вообще.

Вот код:

pragma solidity ^0.4.19;
contract Adoption {
  struct Pet {
    address owner;
    uint256 price;

  }

  Pet[16] data;

  function Adoption() public {
    for (uint i = 0; i < 16; i++) {

      data[i].price = 500;
      data[i].owner = msg.sender;
    }
  }


  // Adopting a pet
  function adopt(uint petId) public payable returns (uint, uint) {
    require(petId >= 0 && petId <= 15);
    if ( data[petId].price == 0 ) {
      data[petId].price = 100;
    } else {
      data[petId].price = data[petId].price * 2;
    }

    require(msg.value >= data[petId].price * uint256(1));
    returnEth(data[petId].owner,  (data[petId].price / 2)); 
    data[petId].owner = msg.sender;
    return (petId, data[petId].price);
    //return value;
  }





  function getAdopters() external view returns (address[], uint256[]) {
    address[] memory owners = new address[](16);
    uint256[] memory prices =  new uint256[](16);
    for (uint i=0; i<16; i++) {
      owners[i] = (data[i].owner);
      prices[i] = (data[i].price);
    }
    return (owners,prices);
  }

}

Может кто-то указать мне верное направление? Спасибо.

Для уточнения хочу отправить эфириум с контракта предыдущему "хозяину" питомца.

Ответы (2)

Когда вы делите 500 / 1000в этой строке, oldOwner.transfer((price / 1000));вы получаете 0. Обратите внимание, что transfer()принимает значение в wei, а не в эфире. Если вы хотите отправить 0,5 вэй, то это невозможно.

Вот более подробная информация о целочисленном делении в Solidity Невозможно выполнить целочисленное деление

Спасибо что подметил это. Тем не менее, я попытался использовать oldOwner.transfer(price);без какого-либо разделения после установки , и между кошельками MetaMask data[i].price = 100000000;по-прежнему нет движения .
есть идеи, почему это происходит?
Вы пробовали это на Ринкеби? Просто чтобы узнать, связано ли это только с Ганашем. Также попробуйте проверить результат в geth вместо MetaMask, чтобы убедиться, что он связан с MetaMask.

У меня была именно эта проблема, если вы хотите отправить правильное количество ETH при тестировании программы в Remix, вы можете просто ввести значение (в wei), которое вы хотите отправить с транзакцией, в поле под вкладкой запуска value. Если вы хотите отправить ETH через внешний интерфейс, это становится немного сложнее, и вам нужно использовать функцию sendTransactionв Web3.js, вот пример функции, которую вы можете вызвать по событию (возможно, по нажатию кнопки)

   function callThisFunction() {
        web3.eth.getAccounts(function(error, result) {
        web3.eth.sendTransaction(
            {from:web3.eth.accounts[0],
            to: contractAdress,
            value:  "amount in wei you're requesting", 
            data: "hash of the function you want to call"
                }, function(err, result) {
          if (!err)
            console.log(result + " success"); 

        });
    });

    }

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

это вообще не работает в ремиксе или ethfiddle.
@vipertherapper, что именно не работает? Я заметил в вашем коде, что вам нужен еще один }в конце вашего контракта, если вы поместите свой контракт в Remix, он скажет вам об этом.
вы уверены? Я вставил его в Remix, и он не дает мне предупреждения.
@vipertherapper, возможно, вы пропустили это при копировании и вставке в переполнение стека? Какая у тебя проблема?
Когда в моем внешнем интерфейсе вызывается accept(), из контракта владельцу не отправляется eth.
как говорится в другом ответе, вы не можете иметь менее 1 вей в транзакции
после его изменения все еще кажется, что транзакция не отправляется.