繁体   English   中英

py中钱包的代币余额小数错误

[英]Decimal error in token balance from wallet in py

我正在尝试正确获取钱包中令牌的值。 代币有 18 位小数,但 function contract.functions.decimals().call()返回 9 位小数。 我尝试了很多例子,但错误是一样的。 这是我的代码:

import json
import requests
from web3
import Web3

# Check Tokens Balance
MyAddress = '0xD036680F1d50C11B5924Ac487bf7E58632020a79'
TokenAddress = '0xacFC95585D80Ab62f67A14C566C1b7a49Fe91167'

#
Get ABI from BSCscan
bsc = 'https://bsc-dataseed.binance.org/'
web3 = Web3(Web3.HTTPProvider(bsc))
url_eth = 'https://api.bscscan.com/api'
contract_address = web3.toChecksumAddress(TokenAddress)

API_ENDPOINT = url_eth + '?module=contract&action=getabi&address=' + str(contract_address)
r = requests.get(url = API_ENDPOINT)
response = r.json()
abi = json.loads(response['result'])

# Call contract
contract = web3.eth.contract(address = contract_address, abi = abi)
totalSupply = contract.functions.totalSupply().call()
print(totalSupply)
print(contract.functions.name().call())
print(contract.functions.symbol().call())
print(contract.functions.decimals().call())
address = web3.toChecksumAddress(MyAddress)
balance = contract.functions.balanceOf(address).call()
print(web3.fromWei(balance, 'ether'))

这是控制台中的结果:

100000000000000000000000000
FEGtoken
FEG
9
3.660343728974475686

但在我的钱包里,余额是 3660343519.636 FEG

我不明白如何解决这个错误。

我遇到了类似的问题。 您遇到此问题的原因是并非每个令牌都具有相同数量的小数。 大多数硬币有 18 个小数点,等于 'ether',但正如你所见,contract.functions.decimals().call() 返回 9。这意味着当你打印出 web3.fromwWei 时,你需要调用 'wei '。 要使其更具动态性,请传入您从 decimals().call() 方法获得的值。

不过问题是:contract.functions.decimals().call() 对我来说大约需要 1.4 秒。 相比之下,调用 web3.eth.contract(address = contract_address, abi = abi) 需要 0.01 秒。 这是某种 API 错误吗? 有没有返回小数值的替代方法?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM