Wenn ich meine Eingabedaten auf Etherscan lese, sehe ich jeden Wert als Hex-Werte. Was in Ordnung ist, um die Adressen zu lesen. Aber ich möchte die Beträge [1]
&& [3]
als Zahlen lesen.
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
Ich habe eine Etherdelta-Transaktion durchgeführt, bei der ich 25
Token gekauft habe. Der erwartete transformierte Wert der Eingabedaten [1]
sollte also 25
oder 25 * 10^18
(in wei) oder mindestens ein beliebiges Vielfaches von sein 25*10^x
.
Wie konvertiert man das Hex in den erwarteten Wert?
Die Verwendung des Ethereum-Eingangsdecoders zeigt mir die gleichen Werte wie auf etherscan.io
Konvertieren in Ascii gibt Müll (wie hier empfohlen: Wie werden Eingabedaten aus einer Transaktion dekodiert? )
web3.utils.hexToNumberString
& web3.utils.hexToNumber
irr
console.log(0x000000000000000000000000000000000000000000000016d8fceafcef3c0000)
zeigt einen willkürlichen Wert
Von der Miguel Mota-Seite mit Etherdelta ABI und Ihrer Transaktionseingabe, die ich bekomme
{
"name": "trade",
"types": [ .. ],
"inputs": [
"0",
"16d8fceafcef3c0000", // <- amountGet
"340d2bde5eb28c1eed91b2f790723e3b160613b7",
"8b7363b040ca2bb600000", // <- amountGive
"46eeac",
"87d84d79",
"14ce500a86f1e3ace039571e657783e069643617",
"1c",
{
"type": "Buffer",
"data": [..]
},
{
"type": "Buffer",
"data": [..]
},
"38d7ea4c68000" // <- amount
]
}
Die kommentierten Werte werden verwendet, um zu berechnen, was Sie erhalten. Dies geschieht in der Ethedeleta- tradeBalances
Funktion
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);
}
Sie sollten den Betrag gebenGeben * Betrag / BetragGet erhalten
0x8b7363b040ca2bb600000 * 0x38d7ea4c68000 / 0x16d8fceafcef3c0000 25000000000000000000L = 25*10^18
Was Sie erwartet haben.
amount
ist eigentlich der Betrag, den ich ausgebe 0.001 eth
. amountGive/amountGet
ist im Grunde der Preis. Ich bin immer noch verwirrt, was amountGive
und amountGet
ist. Laut der [Übersicht] ( reddit.com/r/EtherDelta/comments/6kdiyl/smart_contract_overview ) sollten sie die Menge sein (in meinem Fall 25x10^18 & 4x10^10). > betragGet und betragGive repräsentieren die Größe und den Preis, den Sie handeln möchten
Ismael