@@ -316,45 +316,53 @@ The ERC20 (formally `EIP20 <https://github.com/ethereum/EIPs/blob/master/EIPS/ei
316316First, create your Python object representing the ERC20 contract.
317317For this example, we'll be inspecting the `Unicorns <https://etherscan.io/token/0x89205a3a3b2a69de6dbf7f01ed13b2108b2c43e7 >`_ token contract.
318318
319- .. code-block :: python
319+ .. doctest ::
320320
321- import json
321+ >>> import json
322+ >>> import os
323+
324+ # Please play nice and don't use this key for any shenanigans, thanks!
325+ >>> os.environ[' INFURA_API_KEY' ] = " b2679bb624354d1b9a2586154651b51f"
326+ >>> from web3.auto.infura import w3
327+
322328
323- ERC20_ABI = json.loads('[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}]') # noqa: 501
329+ >>> ERC20_ABI = json.loads('[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}]') # noqa: 501
324330
325331 # Address field should be the checksum address at which the ERC20 contract was deployed
326- erc20 = w3.eth.contract(address = ' 0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7' , abi = ERC20_ABI )
332+ >>> erc20 = w3.eth.contract(address = ' 0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7' , abi = ERC20_ABI )
327333
328334Fetch various data about the current state of the ERC20 contract.
329335
330- .. code-block :: python
336+ .. doctest ::
331337
332- name = erc20.functions.name().call()
333- # -> " Unicorns"
334- symbol = erc20.functions.symbol().call()
335- # -> "🦄"
336- decimals = erc20.functions.decimals().call()
337- # -> 1
338- total_supply = erc20.functions.totalSupply().call()
339- # -> 2038 (at time of writing)
338+ >>> erc20.functions.name().call()
339+ ' Unicorns'
340+ >>> erc20.functions.symbol().call()
341+ '🦄'
342+ >>> erc20.functions.decimals().call()
343+ 0
344+ >>> erc20.functions.totalSupply().call()
345+ 2038
340346
341347Get the balance of an account address.
342348
343- .. code-block :: python
349+ .. doctest ::
344350
345- balance = erc20.functions.balanceOf(' 0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb' ).call()
346- # -> 1
351+ >>> erc20.functions.balanceOf(' 0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb' ).call()
352+ 1
347353
348354Calculate the token count from the token balance of an account address.
349355
350- .. code-block :: python
356+ .. doctest ::
351357
352- from decimal import Decimal
358+ >>> from decimal import Decimal
353359
354360 # Most applications expect *exact * results, so using the Decimal library,
355361 # with default precision of 28, is usually sufficient to avoid any rounding error.
356- count = balance / Decimal(10 ** decimals)
357- # -> 1
362+ >>> decimals = erc20.functions.decimals().call()
363+ >>> balance = erc20.functions.balanceOf(' 0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb' ).call()
364+ >>> balance / Decimal(10 ** decimals)
365+ Decimal('1')
358366
359367Balance is *always * an integer in the currency's smallest natural unit (equivalent to 'wei' for ether). Token balance is typically used only for backend calculations.
360368
0 commit comments