acceder a abstracciones de contratos de trufas desde un script JS externo

Al escribir pruebas en truffle (v3.2.1), puedo olvidarme de cosas como el ABI y la dirección de un contrato y simplemente usar ContractName.deployed() para interactuar con un contrato en mi cadena testrpc. ¿Cómo puedo imitar este comportamiento en mi código Javascript externo, es decir, no usando la consola integrada de truffle o truffle test? ¿Hay alguna biblioteca que deba importar en mi secuencia de comandos o debo obtener manualmente la ABI y la dirección de implementación del contrato como si no estuviera usando Truffle?

También estaría bien si pudiera usar esa abstracción de contrato ejecutando mi código JS a través de trufa, pero no estoy seguro de cómo lo haría.

¡Gracias!

Respuestas (3)

No estoy seguro de si esta es la forma prevista, pero experimentar con fragmentos de código que se encuentran en Internet dio como resultado algo que parece estar funcionando. Esto es lo que hice en mi aplicación javascript:

....
const artifacts = require('../build/contracts/MyContract.json')
const contract = require('truffle-contract')
let MyContract = contract(artifacts);
MyContract.setProvider(web3.currentProvider);    
return MyContract.deployed().then(function(instance){      
  return instance.sendTransaction(param1, param2, {from: accounts[0]});
}).then(function(tx_id){
....

El archivo json es lo que produjo truffle al migrar MyContract. Tenga en cuenta que tuve que instalar truffle-contract(en la parte superior de la trufa) para que esto funcione. Si alguien tiene una forma más elegante de hacer esto, ¡compártala!

Suponiendo que tengo un contrato de HelloWorld con una uint public balancevariable y me gustaría obtener su saldo, haría lo siguiente:

let Web3 = require('web3')
var provider = new Web3.providers.HttpProvider("http://localhost:8545")
let contract = require('truffle-contract')
let HelloWorld = contract(require('./build/contracts/HelloWorld.json'))

HelloWorld.setProvider(provider);
HelloWorld.deployed().then(contract => {
   return contract.balance()
}).then(response => {
   console.log(response)
})

¡Trabajó para mi! ¡Hazme saber si esto funciona para ti!

Si desea ingresarlo manualmente, puede usar algo como esto en su js

var contractAddressED = 'HERE YOUR CONTRACT ADDRESS';

var byteCodeED = 'HEREYOUR BYTECODE IF YOU WANT TO';

var contractABIED = HEREYOURABI;

contractED = web3.eth.contract(contractABIED).at(contractAddressED);

Para interactuar con sus funciones, puede hacer algo como:

//to read a state variable eg. owner

contractED.owner(function(err, result) {
    // document.getElementById('name').innerHTML = 'Hello, ' + result; or jquery
    $("#owner").html('some text: ' + result);
});

//to trigger a function

$("#clearstatus").click(function() {
    contractED.clearstatusjudging(function(err, result) {
        console.log(err, result);
    })
});

¡espero que esto ayude!

Gracias, eso ciertamente funcionará, pero evitar hacerlo manualmente y aprovechar la abstracción del contrato de la trufa era precisamente el punto de la pregunta.