Quiero usar Metamask en mi aplicación para permitir que los usuarios paguen una tarifa ETH fija (más gas) para llamar a un método de mi contrato de Solidity. Miré la documentación de Metamask y el método eth_sendTransaction parece estar cerca de lo que necesito; eth_sendTransaction ciertamente me permitiría solicitar ETH a un usuario, pero el parámetro "datos" es un poco confuso.
Los documentos de Metamask dicen:
los datos son opcionales, pero se utilizan para definir la creación e interacción de contratos inteligentes
y
también se utiliza para especificar métodos de contrato y sus parámetros.
Entonces, "datos" representa mi método y sus parámetros, pero ¿cómo sabe Metamask (o window.ethereum , más bien) el contrato cuyos métodos estoy tratando de llamar?
¿No tiene que proporcionar normalmente una dirección de contrato y ABI/JSON para interactuar con un contrato implementado? En resumen, ¿es posible hacer lo que he descrito solo con Metamask? ¿O tiene que hacer otras configuraciones del lado del cliente para llamar a un método con eth_sendTransaction ?
Editar: por cierto, TylerH, la respuesta implicó el uso de web3.js. Tal vez no edites las publicaciones de las personas a menos que sepas de qué diablos estás hablando. Solo un pensamiento...
Sí, necesitará el contrato abi para obtener la información que necesita incluir en los datos que está pasando al contrato. También hay algunas otras cosas que necesitará para lograr esto:
Primero deberá asegurarse de descargar las ethers.js y @alch/alchemy-web3 npm en su aplicación. En segundo lugar, necesitará una clave API de proveedor de una plataforma como Alchemy para comunicarse con el contrato abi. Por último, necesitará el contrato abi que se puede encontrar en la parte inferior de la sección de contratos de etherscan. Hay mucha información sobre cómo obtener estas cosas en línea, por lo que no explicaré cómo configurarlas aquí.
Una vez que los tenga, estará listo para el siguiente paso.
Sugiero crear esto en un archivo de utilidades en algún lugar de su sistema de archivos de aplicaciones, pero la idea es esta:
const alchemyKey = process.env.ALCHEMY_KEY; const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS; const { createAlchemyWeb3 } = require("@alch/alchemy-web3"); const web3 = createAlchemyWeb3(alchemyKey); const contractABI = require('../contract-abi.json'); export const contract = new web3.eth.Contract(contractABI, CONTRACT_ADDRESS); export const yourMethod = () => { if(window.ethereum.request({method: 'eth_requestAccounts'})){ const provider = new ethers.providers.Web3Provider(window.ethereum); const signer = provider.getSigner(); const address = await signer.getAddress(); const tx = { from: address, to: CONTRACT_ADDRESS, value: "some wei value", // this is the value in wei to send data: contract.methods.YOUR_CONTRACT_METHOD_HERE().encodeABI() } const txHash = await window.ethereum.request({ method: 'eth_sendTransaction', params: [tx] }); // do something with your transaction hash here console.log({txHash}); }else{ console.log('user must connect wallet'); } }Entonces, el valor que se completa en el campo de datos de nuestra transacción proviene de llamar al método que estamos tratando de invocar en nuestro contrato. Esto se codifica y luego pasamos esta información junto con el resto de nuestros datos de transacción.
Esta es una descripción muy breve y breve de lo que hace, y espero que esto sea lo que está buscando. Si necesita más ayuda, siempre estoy disponible para chatear en Twitter @_syndk8.