Soy nuevo en solidez y me gustaría tener un poco de depuración.
este es mi ejemplo simple (estoy usando web3 1.0)
Tengo una función simple en mi contrato.
function bar(address _address_usr) public {
uint res = 5;
emit foo('test',res);
}
Y tengo prueba al respecto.
.....
it("...", async () => {
let livello = await instance.methods.bar(accounts[0]).call();
instance.events.foo(function (error, event) {
console.log(event);
})
.on('data', function (event) {
console.log("OK");
console.log(event);
})
.on('changed', function (event) {
console.log("OK");
})
.on('error', console.error);
});
....
Me gustaría saber el resultado de res. Probé con event pero tengo este error
err Error: The current provider doesn't support subscriptions: HttpProvider
¿Puedo imprimir algún resultado/var en mi consola como console.log o algo así?
Gracias
ACTUALIZAR
Mi distancia web3
ayudantes.js
const Web3 = require("web3") // import web3 v1.0 constructor
// use globally injected web3 to find the currentProvider and wrap with web3 v1.0
const getWeb3 = () => {
const myWeb3 = new Web3(web3.currentProvider)
return myWeb3
}
// assumes passed-in web3 is v1.0 and creates a function to receive contract name
const getContractInstance = (web3) => (contractName) => {
const artifact = artifacts.require(contractName) // globally injected artifacts helper
const deployedAddress = artifact.networks[artifact.network_id].address
const instance = new web3.eth.Contract(artifact.abi, deployedAddress)
return instance
}
module.exports = { getWeb3, getContractInstance }
mi prueba.js
const {getWeb3, getContractInstance} = require("./helpers")
const web3 = getWeb3()
const getInstance = getContractInstance(web3)
Su error indica que está utilizando HttpProvider
para web3 y según la documentación de web3 aquí , dice:
Objeto - HttpProvider: el proveedor HTTP está obsoleto, ya que no funcionará para las suscripciones.
y este error aparece en este código :
// throw error, if provider doesnt support subscriptions
if(!this.options.requestManager.provider.on) {
var err2 = new Error('The current provider doesn\'t support subscriptions: '+ this.options.requestManager.provider.constructor.name);
this.callback(err2, null, this);
this.emit('error', err2);
return this;
}
Creo que para la suscripción de eventos deberías intentar usar otras alternativas de proveedor.
ACTUALIZACIÓN: para obtener el valor de los parámetros del evento, puede cambiar el código de esta manera:
it("...", async () => {
let livello = await instance.methods.bar(accounts[0]).send();
console.log(livello.events.foo.returnValues);
}
Esto imprimirá los valores de los parámetros del evento. Para obtener más información, visite: https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-send
Además, si está buscando imprimir solo el valor de las variables, debería usar la función vista/pura sin eventos. Para obtener más información, visite: https://solidity.readthedocs.io/en/v0.5.0/contracts.html#functions
.call()
de su llamada de función y lo obtendrá en los parámetros del evento.The current provider doesn't support subscriptions: HttpProvider
console.log(livello.logs.foo.args)
gran flota
Enrique Alcázar
monoUsuario
Enrique Alcázar
Enrique Alcázar