No se puede acceder al contrato inteligente publicado con truffle en testrpc desde javascript

Estoy tratando de desarrollar un contrato inteligente simple que envíe Ether de una dirección a otra y no puedo hacerlo funcionar.

Estoy usando Ubuntu 16.04, truffle 3.4.7, node 7.10.1 y solidity 0.4.13.

El contrato se compila y publica en un testrpc local, pero cuando intento acceder a él, parece que no funciona.

He buscado soluciones en todas partes, pero no puedo entender qué es lo que está mal, así que espero que alguien aquí pueda ayudarme :)

El código del contrato inteligente es así:

contract Transfer {
    function Transfer () {
        owner = msg.sender;
    }
    function sendEther (address dst) payable {
        if(msg.value<=0) revert();
        dst.transfer(msg.value);
    }
}

La secuencia que sigo para desplegarlo es la siguiente:

  1. testrpc
  2. compilación de trufas
  3. despliegue de trufa

Luego tengo un archivo html simple que incluye un archivo js que debería realizar la transferencia:

< script src="/usr/local/lib/node_modules/ethereum-console/node_modules/web3/dist/web3.min.js" >< /script >
< script src="test.js" >< /script >
< /head >
< body >
< /body >
< /html >

Y aquí está el contenido del archivo test.js:

var Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
var account_one = web3.eth.accounts[0]; // testrpc address
var account_two = web3.eth.accounts[9]; // testrpc address
/*
// This works fine, makes the transfer:
web3.eth.sendTransaction({from: account_two, to: account_one, value: 100000000000});
*/
// These don't work:
try
{
// First try:
    obj = Transfer.deployed();
    obj.sendEther(account_two, {from: account_one, to: objTransfer, value: 100000000000});
// Second try:
    Transfer.deployed().then(
        function(instance) {
            obj = instance;
            return obj.sendEther.call(account_two, {from: account_one, to: objTransfer, value: 100000000000});
        }
    );
} catch (e) {
    document.write("< br/ >< b >Error: ");
    document.write(e.message);
    document.write("< /b >");
}

Por supuesto, el primer y el segundo intento son las dos cosas que he probado, no ejecuté los dos al mismo tiempo, al intentar uno de ellos, el otro está comentado.

De cualquier manera, el resultado que obtengo cuando muestro el archivo html en un navegador es:

Error: la transferencia no está definida

Obviamente, el contrato inteligente Transfer no se puede crear, pero no entiendo por qué. ¿Alguna ayuda sobre cómo puedo hacer que esto funcione?

¡Muchas gracias de antemano! :)

Respuestas (1)

Debe crear una instancia de contrato en un archivo javascript utilizando su ABI y la dirección en la que se implementa como se muestra a continuación [reemplace la ABI y la dirección de su contrato]:

// Try to use as below
try {
    // First try:
    var abi = <your contract ABI>;
    var Contract = web3.eth.contract(abi);
    var contractInstance = Contract.at('<Your contract address>');
    contractInstance.sendTransaction({from: account_two, to: account_one, value: 100000000000});
} catch (e) {
    document.write("< br/ >< b >Error: ");
    document.write(e.message);
    document.write("< /b >");
}
¡Muchas gracias! Voy a intentarlo ahora mismo, para ver si funciona :) ¿No hay una solución más... "elegante" para esto? Quiero decir, ¿es totalmente necesario agregar todo el ABI al archivo js?
Ok... a mi tampoco me funciona :( Muestra este error: t.abi.filter no es una función
su ABI debe ser una matriz de javascript en lugar de una cadena. Pruebe JSON.stringify('<ABI>'). ABI sería público cuando implemente el contrato para que pueda mantenerlo en javascript o puede guardarlo en un servidor y obtenerlo a través de una llamada ajax. todo depende de ti. :)
Guau... ¡finalmente funcionó! ¡¡No puedo agradecerte lo suficiente!! :)
¡Finalmente obtuve suficiente reputación para votar tu respuesta! :)