Soy nuevo por aquí y agradecería alguna ayuda intuitiva.
Escribí un contrato e hice una interfaz de usuario para él, y todo funciona bien con ganache-cli. Sin embargo, ahora que lo lancé en Ropsten y en un sitio web real, el código no funciona con MetaMask. Investigué y me di cuenta de que MetaMask necesita parámetros de devolución de llamada, pero después de probar diferentes formas, todavía no he logrado hacerlo bien.
mi código es:
$("#button1").click(function(resolve, reject) {
address = account.toString();
MyContract.function1({from: address, value: '1000000000000000000'});
})
$("#button2").click(function(web3) {
address = account.toString();
var spender = $("#useraddress")[0].value;
MyContract.function2(spender, "1", {from: address});
})
$("#button3").click(function (web3) {
address = account.toString();
var tokenreceiver = $("#newowner")[0].value;
MyContract.function3(tokenreceiver, "1", {from: address});
})
$("#button4").click(function(web3) {
address = account.toString();
MyContract.function4({from: address, value: '0', gas: >'3000000'});
})
El error que estoy recibiendo es:
Error no detectado: el objeto MetaMask Web3 no admite métodos sincrónicos como eth_sendTransaction sin un parámetro de devolución de llamada.
¿Cómo debo configurar mis parámetros de devolución de llamada para las funciones anteriores?
PD: soy nuevo en la programación, así que disculpe los posibles errores con el código.
Gracias de antemano.
Eche un vistazo a esta solución como una respuesta a su problema.
La idea general es que está intentando realizar una llamada síncrona y espera recibir una promesa. Los documentos lo explican muy claramente y proporcionan un ejemplo.
Eche un vistazo al siguiente ejemplo:
web3.eth.getBlock(48, function(error, result){
if(!error)
console.log(JSON.stringify(result));
else
console.error(error);
})
Está resuelto. El comentario de @shanefontaine y esta fueron las principales fuentes de ayuda. En cuanto a por qué las funciones se llamaron automáticamente cuando se cargó el sitio web, fue un error de sintaxis de mi parte. La función de JavaScript se invocaba a sí misma y, por lo tanto, llamaba a la función de contrato automáticamente. El código final se ve así para un botón + función:
$("#button").click(function(web3) {
var tx = MyContract.function(parameter1, parameter2, {
from: address,
gas: "300000",
to: "CONTRACTADDRESS",
value: "0",
data: "" },
function(err, transactionHash) {
if (!err)
console.log(transactionHash);
}) })
Gracias por la ayuda.
Yakko Majuri