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.
Function: trade(address tokenGet, uint256 amountGet, address tokenGive, uint256 amountGive, uint256 expires, uint256 nonce, address user, uint8 v, bytes32 r, bytes32 s, uint256 amount)
MethodID: 0x0a19b14a
[0]:0000000000000000000000000000000000000000000000000000000000000000
[1]:000000000000000000000000000000000000000000000016d8fceafcef3c0000
[2]:000000000000000000000000340d2bde5eb28c1eed91b2f790723e3b160613b7
[3]:00000000000000000000000000000000000000000008b7363b040ca2bb600000
Hice una transacción etherdelta donde compré 25
tokens. Entonces, el valor transformado esperado de los datos de entrada [1]
debe ser 25
o 25 * 10^18
(en wei) o al menos cualquier múltiplo de 25*10^x
.
¿Cómo convertir el hexadecimal al valor esperado?
Usar el decodificador de entrada ethereum me muestra los mismos valores que en etherscan.io
convertir a Ascii da basura (como se recomienda aquí: ¿Cómo decodificar los datos de entrada de una transacción? )
web3.utils.hexToNumberString
y web3.utils.hexToNumber
errar
console.log(0x000000000000000000000000000000000000000000000016d8fceafcef3c0000)
muestra algún valor arbitrario
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. tradeBalances
Esto 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.
amount
es en realidad la cantidad que gasto 0.001 eth
. amountGive/amountGet
es básicamente el precio. Todavía estoy desconcertado qué amountGive
y amountGet
es. 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
ismael