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 values
me refiero a valores convertidos de BN
y tipos de búfer a cadenas utf8.
La herramienta ethereum-input-data-decoder , que usó para decodificar los datos de entrada codificados, devuelve uint
tipos como Big Numbers y byte32
tipos como Buffers .
Para convertir a un formato legible, simplemente llame al toString
mé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.
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
usuario19510
erik
usuario19510
.toString()
¿On theBN
s y.toString('hex')
on the hacenBuffers
lo que quieres?erik