Etherscan.io-Vertragseingangsdaten entschlüsseln

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.

Vertragsmethode

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

Eingabedaten

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

Ich habe eine Etherdelta-Transaktion durchgeführt, bei der ich 25Token gekauft habe. Der erwartete transformierte Wert der Eingabedaten [1]sollte also 25oder 25 * 10^18(in wei) oder mindestens ein beliebiges Vielfaches von sein 25*10^x.

Frage

Wie konvertiert man das Hex in den erwarteten Wert?

Versuche

  1. Die Verwendung des Ethereum-Eingangsdecoders zeigt mir die gleichen Werte wie auf etherscan.io

  2. Konvertieren in Ascii gibt Müll (wie hier empfohlen: Wie werden Eingabedaten aus einer Transaktion dekodiert? )

  3. web3.utils.hexToNumberString& web3.utils.hexToNumberirr

  4. console.log(0x000000000000000000000000000000000000000000000016d8fceafcef3c0000)zeigt einen willkürlichen Wert

Haben Sie die Transaktions-ID?

Antworten (1)

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- tradeBalancesFunktion

  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.

Ok, die Rechnung stimmt in der Tat. amountist eigentlich der Betrag, den ich ausgebe 0.001 eth. amountGive/amountGet ist im Grunde der Preis. Ich bin immer noch verwirrt, was amountGive und amountGetist. 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
Ich bin kein Etherdelta-Experte, aber ich vermute, dass es sich um die ursprünglichen Angebotsbeträge handelt, Sie kaufen nur weniger als die zu verkaufende Gesamtsumme.