Web3js
解碼 Etherscan.io 合約輸入數據
在 etherscan 上讀取我的輸入數據,我將每個值都視為十六進制值。閱讀地址很好。但我想將金額
[1]
&&[3]
視為數字。合約方式
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
我在購買
25
代幣的地方進行了一次交易 etherdelta。因此,輸入數據的預期轉換值[1]
應該是25
或25 * 10^18
(以 wei 為單位)或至少是 的任何倍數25*10^x
。問題
如何將十六進制轉換為期望值?
嘗試
- 使用乙太坊輸入解碼器 向我顯示與 etherscan.io 上相同的值
- 轉換為 Ascii 會產生垃圾(此處推薦:如何從事務中解碼輸入數據?)
web3.utils.hexToNumberString
&web3.utils.hexToNumber
錯誤console.log(0x000000000000000000000000000000000000000000000016d8fceafcef3c0000)
顯示一些任意值
從Miguel Mota 頁面,使用 Etherdelta ABI,我得到你的交易輸入
{ "name": "trade", "types": [ .. ], "inputs": [ "0", "16d8fceafcef3c0000", // <- amountGet "340d2bde5eb28c1eed91b2f790723e3b160613b7", "8b7363b040ca2bb600000", // <- amountGive "46eeac", "87d84d79", "14ce500a86f1e3ace039571e657783e069643617", "1c", { "type": "Buffer", "data": [..] }, { "type": "Buffer", "data": [..] }, "38d7ea4c68000" // <- amount ] }
註釋值是用於計算您收到的值的值。這是在 Ethedeleta
tradeBalances
函式中完成的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); }
您應該收到 amountGive * amount / amountGet
0x8b7363b040ca2bb600000 * 0x38d7ea4c68000 / 0x16d8fceafcef3c0000 25000000000000000000L = 25*10^18
這是你所期望的。