Decodificar los datos de entrada del contrato de Etherscan.io

Al leer mis datos de entrada en etherscan, veo cada valor como valores hexadecimales. Lo cual está bien para leer las direcciones. Pero me gustaría leer las cantidades [1]&& [3]como números.

Método de contrato

Function: trade(address tokenGet, uint256 amountGet, address tokenGive, uint256 amountGive, uint256 expires, uint256 nonce, address user, uint8 v, bytes32 r, bytes32 s, uint256 amount)

los datos de entrada

MethodID: 0x0a19b14a
[0]:0000000000000000000000000000000000000000000000000000000000000000
[1]:000000000000000000000000000000000000000000000016d8fceafcef3c0000
[2]:000000000000000000000000340d2bde5eb28c1eed91b2f790723e3b160613b7
[3]:00000000000000000000000000000000000000000008b7363b040ca2bb600000

Hice una transacción etherdelta donde compré 25tokens. Entonces, el valor transformado esperado de los datos de entrada [1]debe ser 25o 25 * 10^18(en wei) o al menos cualquier múltiplo de 25*10^x.

Pregunta

¿Cómo convertir el hexadecimal al valor esperado?

Intentos

  1. Usar el decodificador de entrada ethereum me muestra los mismos valores que en etherscan.io

  2. convertir a Ascii da basura (como se recomienda aquí: ¿Cómo decodificar los datos de entrada de una transacción? )

  3. web3.utils.hexToNumberStringy web3.utils.hexToNumbererrar

  4. console.log(0x000000000000000000000000000000000000000000000016d8fceafcef3c0000)muestra algún valor arbitrario

¿Tienes la identificación de la transacción?

Respuestas (1)

De la página de Miguel Mota , usando Etherdelta ABI, y su entrada de transacción me sale

{
  "name": "trade",
  "types": [ .. ],
  "inputs": [
    "0",
    "16d8fceafcef3c0000",      // <- amountGet
    "340d2bde5eb28c1eed91b2f790723e3b160613b7",
    "8b7363b040ca2bb600000",   // <- amountGive
    "46eeac",
    "87d84d79",
    "14ce500a86f1e3ace039571e657783e069643617",
    "1c",
    {
      "type": "Buffer",
      "data": [..]
    },
    {
      "type": "Buffer",
      "data": [..]
    },
    "38d7ea4c68000"            // <- amount
  ]
}

Los valores comentados son los que se utilizan para calcular lo que recibes. tradeBalancesEsto se hace en la función Ethedeleta

  function tradeBalances(address tokenGet, uint amountGet, 
      address tokenGive, uint amountGive, 
      address user, uint amount) private {
    ...
    tokens[tokenGive][msg.sender] = 
       safeAdd(tokens[tokenGive][msg.sender], 
       safeMul(amountGive, amount) / amountGet);
  }

Debes recibir cantidadDar * cantidad / cantidadObtener

0x8b7363b040ca2bb600000 * 0x38d7ea4c68000 / 0x16d8fceafcef3c0000 25000000000000000000L = 25*10^18

Que es lo que esperabas.

Ok, el cálculo es realmente correcto. amountes en realidad la cantidad que gasto 0.001 eth. amountGive/amountGet es básicamente el precio. Todavía estoy desconcertado qué amountGive y amountGetes. De acuerdo con [overview]( reddit.com/r/EtherDelta/comments/6kdiyl/smart_contract_overview ), deberían ser la cantidad (en mi caso, 25x10^18 y 4x10^10). > cantidadObtener y cantidadGive representan el tamaño y el precio que desea negociar
No soy un experto en Etherdelta, pero supongo que son los montos de la oferta original, solo compras menos que el total para vender.