¿Cómo convertir las entradas de la transacción en valores legibles?

Tengo la siguiente entrada de transacción:

{
    name: 'trade',
    types: [
        'address',
        'uint256',
        'address',
        'uint256',
        'uint256',
        'uint256',
        'address',
        'uint8',
        'bytes32',
        'bytes32',
        'uint256'
    ],
    inputs: ['ac709fcb44a43c35f0da4e3163b117a17f3770f5',
        <BN: 878678326eac900000>,
        '0000000000000000000000000000000000000000', 
        <BN: bf2aa18455018000>, 
        <BN: 302bdf>,
        <BN: dc51da3a>,
        'd8eeda4ee2657bb267bc35c1d60babdc5aedd269', 
        <BN: 1c>,
        <Buffer b4 bf 0 d cd 37 ca 73 bd 5 a bc e9 53 2 b 03 3 d cc 64 27 be 16 06 83 de 11 3e fc a4 13 20 c2 7 f 3e>, 
        <Buffer 78 79 9 d 84 04 0e 5 c 24 58 28 b1 b5 31 ef 97 e1 af 12 49 46 f4 dc 1 d b5 a2 0 c f2 8 a 70 73 b2 69>, 
        <BN: 275dcc081d0c2351e0>
    ]
}

Estos datos provienen de la entrada de transacciones sin procesar que es

0x0a19b14a000000000000000000000000ac709fcb44a43c35f0da4e3163b117a17f3770f50000000000000000000000000000000000000000000000878678326eac9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf2aa184550180000000000000000000000000000000000000000000000000000000000000302bdf00000000000000000000000000000000000000000000000000000000dc51da3a000000000000000000000000d8eeda4ee2657bb267bc35c1d60babdc5aedd269000000000000000000000000000000000000000000000000000000000000001cb4bf0dcd37ca73bd5abce9532b033dcc6427be160683de113efca41320c27f3e78799d84040e5c245828b1b531ef97e1af124946f4dc1db5a20cf28a7073b2690000000000000000000000000000000000000000000000275dcc081d0c2351e0

¿Cómo puedo convertir entradas en valores de cadena legibles?

PD: readable string valuesme refiero a valores convertidos de BNy tipos de búfer a cadenas utf8.

¿Puede explicar de dónde provienen estos datos y qué está tratando de obtener? (¿Cómo se verían los "valores de cadena legibles"?)
@smarx He actualizado mi pregunta, espero que ahora tenga más sentido :)
Todavía no estoy seguro de lo que quieres decir. .toString()¿On the BNs y .toString('hex')on the hacen Bufferslo que quieres?
Déjame revisar por favor

Respuestas (4)

La herramienta ethereum-input-data-decoder , que usó para decodificar los datos de entrada codificados, devuelve uinttipos como Big Numbers y byte32tipos como Buffers .

Para convertir a un formato legible, simplemente llame al toStringmétodo.

Ejemplos

// big number to decimal string
myBN.toString(10) 

// buffer to hex string
myBuffer.toString(16) 

Esta es una de las muchas maneras de hacerlo. Para este método necesita el código fuente y la dirección del contrato.

  1. Use metamask o ingrese su proveedor web3 personalizado en la ide en línea
  2. Compile su código fuente
  3. Ingrese la dirección del contrato implementado para cargar en ide
  4. Habilitar escuchar el botón de radio de la red
  5. Podrá leer la entrada de las transacciones enviadas

Estos son tus datos,

Los primeros 4 bytes codifican la función. 0x0a19b14a

Lo siguiente codifica los parámetros. Cada fila tiene 32 bytes. Tienes 12 filas, ya que tienes 12 parámetros (para las variables dinámicas es más complicado y una variable puede tomar más de una línea y no mantener el orden ('apuntará' a su valor).

000000000000000000000000ac709fcb44a43c35f0da4e3163b117a17f3770f5 0000000000000000000000000000000000000000000000878678326eac900000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000bf2aa18455018000 0000000000000000000000000000000000000000000000000000000000302bdf 00000000000000000000000000000000000000000000000000000000dc51da3a 000000000000000000000000d8eeda4ee2657bb267bc35c1d60babdc5aedd269 000000000000000000000000000000000000000000000000000000000000001c b4bf0dcd37ca73bd5abce9532b033dcc6427be160683de113efca41320c27f3e 78799d84040e5c245828b1b531ef97e1af124946f4dc1db5a20cf28a7073b269 0000000000000000000000000000000000000000000000275dcc081d0c2351e0

Tenga en cuenta que la primera fila es la dirección. el segundo es un uint256, en hexadecimal: 00000000000000000000000000000000000000000000000878678326eac900000

necesitas convertirlo a decimal. El resultado es 2500000000000000000000.

No sé si bytes32 es una cadena. Si es así, puede decodificar de hexadecimal a utf-8. Puede probarlo usando el sitio web https://onlineutf8tools.com/convert-hexadecimal-to-utf8 .

Puedes decodificarlo usando ethersjs . Sin embargo, debe eliminar el selector de función en los datos.

const inputTypes = [
        'address',
        'uint256',
        'address',
        'uint256',
        'uint256',
        'uint256',
        'address',
        'uint8',
        'bytes32',
        'bytes32',
        'uint256'
    ]
const input = '0x' + '0x0a19b14a000000000000000000000000ac709fcb44a43c35f0da4e3163b117a17f3770f50000000000000000000000000000000000000000000000878678326eac9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf2aa184550180000000000000000000000000000000000000000000000000000000000000302bdf00000000000000000000000000000000000000000000000000000000dc51da3a000000000000000000000000d8eeda4ee2657bb267bc35c1d60babdc5aedd269000000000000000000000000000000000000000000000000000000000000001cb4bf0dcd37ca73bd5abce9532b033dcc6427be160683de113efca41320c27f3e78799d84040e5c245828b1b531ef97e1af124946f4dc1db5a20cf28a7073b2690000000000000000000000000000000000000000000000275dcc081d0c2351e0'.slice(10)
const decoded = ethers.utils.defaultAbiCoder.decode(inputTypes, input)
decoded.forEach((data, i) => console.log(inputTypes[i], data.toString()))
address 0xAc709FcB44a43c35F0DA4e3163b117A17F3770f5
uint256 2500000000000000000000
address 0x0000000000000000000000000000000000000000
uint256 13775000000000000000
uint256 3156959
uint256 3696351802
address 0xD8eeda4ee2657Bb267bc35C1d60babdc5aEdD269
uint8 28
bytes32 0xb4bf0dcd37ca73bd5abce9532b033dcc6427be160683de113efca41320c27f3e
bytes32 0x78799d84040e5c245828b1b531ef97e1af124946f4dc1db5a20cf28a7073b269
uint256 726181804936299500000