我从以太扫描中取出USDC,然后把它传给web3
erc20_dict = {
'USDC': '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'
}
url = f'https://api.etherscan.io/api?module=contract&action=getabi&address={contract_address}&apikey={apikey}'
ret = requests.get(url)
ABI = ret.json()['result']
contract = w3.eth.contract(address=w3.toChecksumAddress(erc20_dict['USDC']), abi=ABI)
print(contract.functions.decimals().call())但我得到了以下错误:
web3.exceptions.ABIFunctionNotFound: ("The function 'decimals' was not found in this contract's abi. ", 'Are you sure you provided the correct contract abi?')为什么在以太扫描上的USDC ABI不包含小数函数?我想一般地使用这个函数来为令牌/契约提取ABI,所以使用泛型erc20 ABI并不是最好的解决方案。有什么想法吗?谢谢!
发布于 2022-02-20 04:03:49
这是因为USDC使用代理合同。代理合同将使用delegatecall实现合同,其中将包含所有的ERC-20功能。因此,在您的代码中,您不需要从以太扫描中获取ABI,您可以使用基本的ERC-20合同的ABI,这应该适用于所有ERC-20令牌合同。这也将帮助您避免对每个契约进行外部API调用。
https://ethereum.stackexchange.com/questions/122085
复制相似问题