decodificar datos de entrada de ethereum

Chicos, estoy ocupado revisando el mempool y tratando de rastrear varias transacciones y partes de transacciones. Como primer paso, pensé en enumerar las transacciones y los bits que podría necesitar más adelante. Aquí viene el problema.

No puedo obtener ninguna información de la entrada de la transacción. Probé todas las soluciones anteriores y los paquetes recomendados, pero fue en vano.

Cuando uso web3.utils.toAscii me sale un galimatías. Cuando uso ethereum-tx-decoders decodeTx, obtengo un valor de arrayify no válido. cuando uso cualquiera de las otras herramientas de web3, aparece un error.

Encuentre la última iteración de mi código a continuación después de muchas horas de intentar todas las soluciones que pude encontrar (arriba están las tres fallas más recientes)

const txDecoder = require("ethereum-tx-decoder");
const express = require("express");
require("dotenv").config();
const Web3 = require("web3");
const curl = `wss://mainnet.infura.io/ws/v3/${process.env.infuraProjId}`;
const web3 = new Web3(new Web3.providers.WebsocketProvider(curl));

let counter = 0;

const subscription = web3.eth.subscribe(
    "pendingTransactions",
    (error, transactionHash) => {
        if (!error) {
            web3.eth
                .getTransaction(transactionHash)
                .then((tx) => {
                    if (tx !== null) {
                        counter++;
                        // console.log(tx.hash);

                        const decodedInput = txDecoder.decodeTx(tx.input);
                        console.log(decodedInput);

                       
                    }
                })
                .catch((err) => console.error(err));
        } else {
            console.error(error);
        }
    }
);
// .on("data", (transactionHash) => {
//     web3.eth.getTransaction(transactionHash).then((transaction) => {
//         console.log("coming from data");
//         console.log(transaction.from, transaction.to);
//     });
// }); 

// ^^ this kept returning null

Por favor y gracias

Respuestas (1)

te falta una pieza vital. No podrá descodificar la entrada o los registros hasta que tenga el ABI del contrato "receptor" para la entrada TX y el contrato FROM para los registros.

Para obtener el ABI: use etherscan, use https://sourcify.dev/ o encuéntrelo en IPFS/BZZ leyendo el código de bytes y analizando la dirección si el compilador de solidity pudo cargarlo.

DESPUÉS de tener el ABI, lo pasa a ethersjs/web3js/web3py y esas bibliotecas podrán analizar la entrada/salida.

Editar: también tenga en cuenta: si el contrato del receptor es un contrato de "Proxy", deberá buscar la dirección del contrato del "receptor final" de las transacciones internas.

Gracias por su respuesta. Entonces, si obtengo un ABI para el contrato para el que estoy tratando de encontrar transacciones y una de las transacciones pendientes puede encajar en el ABI, o coincidir con él (perdón por la mala terminología), entonces debería obtener los resultados que quiero, pero solo para las transacciones que interactúan con los contratos para los que ya tengo el ABI?
@streetrat solo necesita el contrato "TO" ABI, el que está recibiendo la transacción. Esa es la ABI que utilizará para decodificar la entrada TX. Entonces, sí: cuando tiene el ABI de recepción y tiene el TX que se envía a ese contrato, es cuando decodifica sus datos de entrada.
@streetrat también editó la respuesta para cuándo/si llega a un contrato de proxy.
muchas gracias por sus respuestas! Realmente aprecio la ayuda (: