Enviar un argumento a un método de contrato con sendTransaction

Estoy usando la consola de trufas para probar mi contrato, pero tengo problemas para pasar una discusión. Por ejemplo, tengo un método como este

function sendEtherTo(address addr) public payable {
   require(addr != 0x0);
   require(msg.value > 0);
   addr.transfer(msg.value);
}

Estoy tratando de usar sendTransactionpero no puedo averiguar cómo pasar el argumento.

Este:

 web3.eth.sendTransaction({from: web3.eth.accounts[1], to: myContract.address, data: myContract.sendEtherTo.sendTransaction(web3.eth.accounts[2]), value: web3.toWei(10, "finney")})

Da como resultado que mi testrpc se bloquee con un error en trufa diciendo

Error: Invalid JSON RPC response: undefined

Intenté lo siguiente que hice en web3 con éxito

web3.eth.sendTransaction({from: web3.eth.accounts[1], to: myContract.address, data: myContract['sendEtherTo'].getData(web3.eth.accounts[2]), value: web3.toWei(10, "finney")})

pero esto me dice que getDataes indefinido

¿ Cómo creas myContract? Si llamas myContract.sendEtherTo()directamente funciona?
AFAIK sendTransaction no puede invocar un método, puede invocar un contrato. Entonces este contrato puede enviar un mensaje (es decir, llamar a un método) a otro contrato,
@Nulik Estás equivocado. Para usar sendTransaction, debe codificar la llamada de función dentro del campo de datos.

Respuestas (1)

Truffle ajusta los contratos con un objeto personalizado que no proporciona getData, pero podemos usar el requestmétodo para obtener los parámetros para sendTransaction.

const MyContract = artifacts.require('MyContract');

contract('MyContract', function(accounts) {
  it('Call with sendTransaction', async () => {
    const myContract = await MyContract.deployed();

    // We want to call foo(23) on myContract
    const data = myContract.foo.request(23);

    // Here data.params[0].data contains the parameters to the call

    const txhash = web3.eth.sendTransaction({ 
      from: accounts[0], 
      to: myContract.address, 
      value: 1, 
      data: data.params[0].data
    });
  });
});
Gracias, voy a probar esto esta noche para ver cómo funciona. ¿Cuál es el marco JS que usa este ejemplo? He estado fuera del circuito en el mundo de JS por un tiempo
Esta es una prueba unitaria para Trufa.