Quiero llamar a una función de pago en un contrato inteligente que implementé, pero no funciona. Este es el error que estoy recibiendo:
Error: Returned error: The method eth_sendTransaction does not exist/is not available
La respuesta que pude encontrar es simplemente usar una clave privada, porque infura no ofrece este método, sin embargo, quiero que el usuario firme la transacción del contrato inteligente con MetaMask.
Este es mi código:
export async function helloworld() { const rpcURL = "https://ropsten.infura.io/v3/KEY"; const web3 = new Web3(rpcURL); let provider = window.ethereum; if (typeof provider !== "undefined") { provider .request({ method: "eth_requestAccounts" }) .then((accounts) => { selectedAccount = accounts[0]; console.log(`Selected account is ${selectedAccount}`); }) .catch((err) => { console.log(err); return; }); window.ethereum.on("accountsChanged", function (accounts) { selectedAccount = accounts[0]; console.log(`Selected account changed to ${selectedAccount}`); }); } const networkId = await web3.eth.net.getId(); const thecontract = new web3.eth.Contract( simpleContractAbi, "0x50A404efF9A057900f87ad0E0dEfA0D485931464" ); isInitialized = true; investit(thecontract, selectedAccount); }
y este es el código que realmente arroja el error:
export const investit = async (thecontract, selectedAccount) => { if (!isInitialized) { await helloworld(); } thecontract.methods .invest() .send({ from: selectedAccount, value: 10000 }) .catch(function (err) { console.log(err); }); };
Estoy completamente perdido, ya que si uso el window.ethereum.request
normal ( https://docs.metamask.io/guide/sending-transactions.html#example ) para enviar una transacción, se abre metamask y puedo firmarlo . Con la llamada de contrato simplemente no funciona.
¿Sabe usted la razón? ¿Cómo puedo arreglar esto?
¡Salud!
Este debe ser el problema. solo estás pasando una url:
const rpcURL ="https://ropsten.infura.io/v3/KEY";
en cambio:
const web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/v3/KEY"))
eth_sendTransaction requiere que tenga la clave privada para firmar la transacción antes de transmitirla a la red. Infura no mantiene ninguna clave privada. Para enviar una transacción, debe firmar la transacción por su parte con su clave privada.
La forma de comprobar los proveedores no es correcta. window.ethereum
también es un proveedor proporcionado por metamask. El provider
en sí no tiene sentido, debe inyectarse en el new Web3()
.