Web3js
使用 Web3 以程式方式獲取 ERC20 代幣的 ABI 數據
我剛剛開始深入研究 Web3。我正在嘗試顯示給定乙太坊地址的各種 ERC20 代幣值。
我需要這樣做的部分是:
- 代幣合約地址
- 代幣合約 ABI
有沒有任何程序化的方法可以從區塊鏈中獲取給定合約地址的合約 ABI?
如果不是,那麼假設合約 ABI 對於任何代幣合約都是不變的似乎是公平的……是否有人集中了一個數據庫,可用於以程式方式與這些 ERC20 代幣進行互動?
如果沒有完整的 ABI,你是否能夠與代幣合約進行互動?例如,根據 ERC20 標準,每個合約都必須有
balanceOf()
,我們可以在給定地址而沒有 ABI 的情況下呼叫這個函式嗎?
感謝 K.Fichter 的幫助,我只想為可能遇到此問題的其他人完全澄清答案。
假設您想在乙太坊地址獲取代幣的餘額。使用 Web3,您將執行以下操作:
var tokenContract = web3.eth.contract(contractABI).at(contractAddress) var decimal = tokenContract.decimals() var balance = tokenContract.balanceOf(address) var adjustedBalance = balance / Math.pow(10, decimal) var tokenName = tokenContract.name() var tokenSymbol = tokenContract.symbol()
那麼你的最終輸出可能是這樣的:
output = adjustedBalance + " " + tokenSymbol + " (" + tokenName + ")";
我認為我需要
contractABI
為每個令牌載入一個新的,contractAddress
因為每個令牌可能都有自己的功能,即使它們遵循 ERC20 標準。但是,您只需要為您正在使用的函式定義 ABI。所以在我的例子中,你只需要定義:
balanceOf()
decimals()
name()
symbol()
假設代幣遵循 ERC20 標準,這些功能將始終相同,並且可以用此 ABI 表示:
[ { "constant": true, "inputs": [], "name": "name", "outputs": [ { "name": "", "type": "string" } ], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "decimals", "outputs": [ { "name": "", "type": "uint8" } ], "payable": false, "type": "function" }, { "constant": true, "inputs": [ { "name": "_owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "name": "balance", "type": "uint256" } ], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "symbol", "outputs": [ { "name": "", "type": "string" } ], "payable": false, "type": "function" } ]
使用它,您可以連接到任何一個
contractAddress
並能夠獲取餘額資訊,假設它們遵循 ERC20 標準。編輯:我在這裡寫了一篇關於這個的部落格文章。我希望它可以幫助別人!