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
De acuerdo con web3, está enviando 0.01 éter, pero pasando un valor de rent
.
Luego, está intentando enviar rent
al 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:
function payRent() public payable returns(bool status) {
require(msg.value == rent);
if(owner.send(msg.value)){
RentPaid(true);
return true;
} else {
return false;
}
}
contractInstance.payRent({from: this.web3.eth.accounts[0],
gas:1000000, value: this.web3.toWei(rent, "ether")});
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.
function payRent() public payable returns(bool status) {
require(msg.value == rent);
RentPaid(true);
owner.transfer(msg.value);
return true;
}
Shoaib Iqbal