incapaz de enviar éter desde el contrato de solidez

tengo un contrato que tiene una función que envía ether a una dirección de cuenta. aqui esta el codigo del contrato

pragma solidity ^0.4.8;

contract Rental {
    struct PaidRent {
        uint id;
        uint value;
    }
    PaidRent[] public paidrents;
    event RentPaid(bool Status);
    uint public createdTimestamp;
    uint public rent;
    uint public security_deposit;
    string public house;
    address public owner;
    address public tenant;

    enum State {Created, Started, Terminated}
    State public state;
    function Rental(uint _rent, uint _security_deposit, string _house, address _owner, address _tenant) {
        createdTimestamp = block.timestamp;
        rent = _rent;
        security_deposit = _security_deposit;
        house = _house;
        owner = _owner;
        tenant = _tenant;
    }
    modifier require(bool _condition) {
        if(!_condition) throw;
        _;
    }
    modifier ownerOnly() {
        if(msg.sender != owner) throw;
        _;
    }
    modifier TenantOnly() {
        if(msg.sender != tenant) throw;
        _;
    }
    modifier inState(State _state){
        if(_state != state) throw;
        _;
    }

    function getPaidRents() internal returns (PaidRent[]) {
        return paidrents;
    }

      function getHouse() constant returns (string) {
        return house;
    }
    function getowner() constant returns (address) {
        return owner;
    }
    function getTenant() constant returns (address) {
        return tenant;
    }
    function getRent() constant returns (uint) {
        return rent;
    }
    function getDeposit() constant returns (uint) {
        return security_deposit;
    }
    function getContractCreated() constant returns (uint) {
        return createdTimestamp;
    }
    function getContractAddress() constant returns (address) {
        return this;
    }
    function getState() returns (State) {
        return state;
    }
    function CollectEth() payable  {}

    function payRent(uint _rent) public payable returns(bool status) {
        if(owner.send(_rent)){
          RentPaid(true);
          return true;
        } else {
          return false;
        }
    }

    function terminateContract(address deposit_to) inState(State.Started) require(this.balance == security_deposit) {
        deposit_to.transfer(security_deposit);
        state = State.Terminated;
    }



}

y en el servicio de mi angular, primero transfiero una cantidad a la dirección del contrato y luego llamo a esta función de la siguiente manera

paymyRent(contractInstance, rent) {
    this.contractevent = contractInstance.RentPaid();
    this.contractevent.watch(function (error, result) {
      if (!error) {
        console.log(result.args);
      } else {
        console.log(error);
      }
    });
    console.log(contractInstance.getowner());
    contractInstance.payRent(rent, {from: this.web3.eth.accounts[0],
      gas:1000000, value: this.web3.toWei(0.01, "ether")});
  } 

pero esta función nunca envía el ether a la dirección del propietario y tampoco emite el evento. Otras funciones de contrato como getowner(), getTenant(), getHouse() funcionan bien excepto esta función payRent().

EDITAR

ingrese la descripción de la imagen aquí

Respuestas (1)

msg.value contiene la cantidad enviada

De acuerdo con web3, está enviando 0.01 éter, pero pasando un valor de rent.

Luego, está intentando enviar rental propietario, pero solo 0.1 ether estarán disponibles porque eso es todo lo que ha enviado.

Creo que quieres algo más en la línea de:

Función de solidez:

function payRent() public payable returns(bool status) {
    require(msg.value == rent);

    if(owner.send(msg.value)){
      RentPaid(true);
      return true;
    } else {
      return false;
    }
}

código web3:

contractInstance.payRent({from: this.web3.eth.accounts[0],
  gas:1000000, value: this.web3.toWei(rent, "ether")});

Otro problema

También tiene el problema de que si .send()falla, los fondos quedarán atrapados en el contrato y no se devolverán al arrendatario.

Probablemente desee .transfer()en su lugar, lo que hará que la transacción falle y devuelva los fondos al remitente.

Ejemplo de solidez mejorada:

function payRent() public payable returns(bool status) {
    require(msg.value == rent);
    RentPaid(true);
    owner.transfer(msg.value);
    return true;
}
gracias por tu respuesta Hice los cambios que sugirió, pero aún no tuve suerte. además, he pegado una captura de pantalla de la transacción en la dirección de mi contrato. no hay rastro de transacción que envíe dinero fuera del contrato.