Web3py Readthedocs Io en Stable
Web3py Readthedocs Io en Stable
Release 5.23.0
Piper Merriam
1 Getting Started 3
2 Table of Contents 5
Index 235
i
ii
Populus Documentation, Release 5.23.0
INTRO 1
Populus Documentation, Release 5.23.0
2 INTRO
CHAPTER
ONE
GETTING STARTED
3
Populus Documentation, Release 5.23.0
TWO
TABLE OF CONTENTS
2.1 Quickstart
• Installation
• Using Web3
– Provider: Local Geth Node
– Provider: Infura
• Getting Blockchain Info
Note: All code starting with a $ is meant to run on your terminal. All code starting with a >>> is meant to run in a
python interpreter, like ipython.
2.1.1 Installation
Note: If you run into problems during installation, you might have a broken environment. See the troubleshooting
guide to setting up a clean environment.
This library depends on a connection to an Ethereum node. We call these connections Providers and there are several
ways to configure them. The full details can be found in the Providers documentation. This Quickstart guide will
highlight a couple of the most common use cases.
5
Populus Documentation, Release 5.23.0
For locally run nodes, an IPC connection is the most secure option, but HTTP and websocket configurations are also
available. By default, Geth exposes port 8545 to serve HTTP requests and 8546 for websocket requests. Connecting
to this local node can be done as follows:
# IPCProvider:
>>> w3 = Web3(Web3.IPCProvider('./path/to/geth.ipc'))
# HTTPProvider:
>>> w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
# WebsocketProvider:
>>> w3 = Web3(Web3.WebsocketProvider('ws://127.0.0.1:8546'))
>>> w3.isConnected()
True
If you stick to the default ports or IPC file locations, you can utilize a convenience method to automatically detect the
provider and save a few keystrokes:
Provider: Infura
The quickest way to interact with the Ethereum blockchain is to use a remote node provider, like Infura. You can
connect to a remote node by specifying the endpoint, just like the previous local node example:
Note that this requires your Infura Project ID to be set as the environment variable WEB3_INFURA_PROJECT_ID
before running your script or application:
$ export WEB3_INFURA_PROJECT_ID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
It’s time to start using Web3.py! Once properly configured, the w3 instance will allow you to interact with the Ethereum
blockchain. Try getting all the information about the latest block:
>>> w3.eth.get_block('latest')
{'difficulty': 1,
'gasLimit': 6283185,
'gasUsed': 0,
'hash': HexBytes('0x53b983fe73e16f6ed8178f6c0e0b91f23dc9dad4cb30d0831f178291ffeb8750
˓→'),
'logsBloom': HexBytes(
˓→'0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
˓→'),
'miner': '0x0000000000000000000000000000000000000000',
'mixHash': HexBytes(
˓→'0x0000000000000000000000000000000000000000000000000000000000000000'),
'nonce': HexBytes('0x0000000000000000'),
'number': 0,
'parentHash': HexBytes(
˓→'0x0000000000000000000000000000000000000000000000000000000000000000'),
'proofOfAuthorityData': HexBytes(
˓→'0x0000000000000000000000000000000000000000000000000000000000000000dddc391ab2bf6701c74d0c8698c2e133
˓→'),
'receiptsRoot': HexBytes(
˓→'0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421'),
'sha3Uncles': HexBytes(
˓→'0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347'),
'size': 622,
'stateRoot': HexBytes(
˓→'0x1f5e460eb84dc0606ab74189dbcfe617300549f8f4778c3c9081c119b5b5d1c1'),
'timestamp': 0,
'totalDifficulty': 1,
'transactions': [],
'transactionsRoot': HexBytes(
˓→'0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421'),
'uncles': []}
Web3.py can help you read block data, sign and send transactions, deploy and interact with contracts, and a number
of other features.
Many of the typical things you’ll want to do will be in the w3.eth API, so that is a good place to start.
If you want to dive straight into contracts, check out the section on Contracts, including a Contract Deployment
Example, and how to create a contract instance using w3.eth.contract().
Note: It is recommended that your development environment have the PYTHONWARNINGS=default environment
variable set. Some deprecation warnings will not show up without this variable being set.
2.1. Quickstart 7
Populus Documentation, Release 5.23.0
2.2 Overview
The purpose of this page is to give you a sense of everything Web3.py can do and to serve as a quick reference guide.
You’ll find a summary of each feature with links to learn more. You may also be interested in the Examples page,
which demonstrates some of these features in greater detail.
2.2.1 Configuration
After installing Web3.py (via pip install web3), you’ll need to specify the provider and any middleware you
want to use beyond the defaults.
Providers
Providers are how Web3.py connects to the blockchain. The library comes with the following built-in providers:
• Web3.IPCProvider for connecting to ipc socket based JSON-RPC servers.
• Web3.HTTPProvider for connecting to http and https based JSON-RPC servers.
• Web3.WebsocketProvider for connecting to ws and wss websocket based JSON-RPC servers.
# IPCProvider:
>>> w3 = Web3(Web3.IPCProvider('./path/to/geth.ipc'))
# HTTPProvider:
>>> w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
# WebsocketProvider:
>>> w3 = Web3(Web3.WebsocketProvider('ws://127.0.0.1:8546'))
>>> w3.isConnected()
True
For more information, (e.g., connecting to remote nodes, provider auto-detection, using a test provider) see the
Providers documentation.
Middleware
Private keys are required to approve any transaction made on your behalf. The manner in which your key is secured
will determine how you create and send transactions in Web3.py.
A local node, like Geth, may manage your keys for you. You can reference those keys using the web3.eth.
accounts property.
A hosted node, like Infura, will have no knowledge of your keys. In this case, you’ll need to have your private key
available locally for signing transactions.
Full documentation on the distinction between keys can be found here.
• Web3.is_encodable()
• Web3.toBytes()
• Web3.toHex()
• Web3.toInt()
• Web3.toJSON()
• Web3.toText()
Address Helpers
• Web3.isAddress()
• Web3.isChecksumAddress()
• Web3.toChecksumAddress()
Currency Conversions
• Web3.fromWei()
• Web3.toWei()
Cryptographic Hashing
• Web3.keccak()
• Web3.solidityKeccak()
2.2. Overview 9
Populus Documentation, Release 5.23.0
The most commonly used APIs for interacting with Ethereum can be found under the web3.eth namespace. As a
reminder, the Examples page will demonstrate how to use several of these methods.
Fetching Data
Viewing account balances (get_balance), transactions (get_transaction), and block data (get_block) are
some of the most common starting points in Web3.py.
API
• web3.eth.get_balance()
• web3.eth.get_block()
• web3.eth.get_block_transaction_count()
• web3.eth.get_code()
• web3.eth.get_proof()
• web3.eth.get_storage_at()
• web3.eth.get_transaction()
• web3.eth.get_transaction_by_block()
• web3.eth.get_transaction_count()
• web3.eth.get_uncle_by_block()
• web3.eth.get_uncle_count()
Making Transactions
The most common use cases will be satisfied with send_transaction or the combination of
sign_transaction and send_raw_transaction.
Note: If interacting with a smart contract, a dedicated API exists. See the next section, Contracts.
API
• web3.eth.send_transaction()
• web3.eth.sign_transaction()
• web3.eth.send_raw_transaction()
• web3.eth.replace_transaction()
• web3.eth.modify_transaction()
• web3.eth.wait_for_transaction_receipt()
• web3.eth.get_transaction_receipt()
• web3.eth.sign()
• web3.eth.sign_typed_data()
• web3.eth.estimate_gas()
• web3.eth.generate_gas_price()
• web3.eth.set_gas_price_strategy()
Contracts
The two most common use cases involving smart contracts are deploying and executing functions on a deployed
contract.
Deployment requires that the contract already be compiled, with its bytecode and ABI available. This compilation
step can done within Remix or one of the many contract development frameworks, such as Brownie.
Once the contract object is instantiated, calling transact on the constructor method will deploy an instance of
the contract:
Once loaded into a Contract object, the functions of a deployed contract are available on the functions namespace:
If you want to read data from a contract (or see the result of transaction locally, without executing it on the network),
you can use the ContractFunction.call method, or the more concise ContractCaller syntax:
# Using ContractFunction.call
>>> deployed_contract.functions.getMyValue().call()
42
# Using ContractCaller
>>> deployed_contract.caller().getMyValue()
42
API
• web3.eth.contract()
• Contract.address
• Contract.abi
• Contract.bytecode
• Contract.bytecode_runtime
• Contract.functions
• Contract.events
2.2. Overview 11
Populus Documentation, Release 5.23.0
• Contract.fallback
• Contract.constructor()
• Contract.encodeABI()
• web3.contract.ContractFunction
• web3.contract.ContractEvents
If you want to react to new blocks being mined or specific events being emitted by a contract, you can leverage
Web3.py filters.
More complex patterns for creating filters and polling for logs can be found in the Filtering documentation.
API
• web3.eth.filter()
• web3.eth.get_filter_changes()
• web3.eth.get_filter_logs()
• web3.eth.uninstall_filter()
• web3.eth.get_logs()
• Contract.events.your_event_name.createFilter()
• Contract.events.your_event_name.build_filter()
• Filter.get_new_entries()
• Filter.get_all_entries()
• Filter.format_entry()
• Filter.is_valid_entry()
2.2.6 ethPM
ethPM allows you to package up your contracts for reuse or use contracts from another trusted registry. See the full
details here.
2.2.7 ENS
Ethereum Name Service (ENS) provides the infrastructure for human-readable addresses. As an example, instead
of 0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359, you can send funds to ethereumfoundation.
eth. Web3.py has support for ENS, documented here.
Features
Bugfixes
• Hot fix for string interpolation issue with contract function call decoding exception to facilitate extracting a
meaningful message from the eth_call response (#2096)
• Bypass adding a gasPrice via the gas price strategy, if one is set, when EIP-1559 transaction params are used
for send_transaction (#2099)
Improved Documentation
Features
Bugfixes
Improved Documentation
Misc
Features
• Adds support for EIP 1559 transaction keys: maxFeePerGas and maxPriorityFeePerGas (#2060)
Bugfixes
• Bugfix where an error response got passed to a function expecting a block identifier.
Split out null result formatters from the error formatters and added some tests. (#2022)
• Fix broken tests and use the new 1559 params for most of our test transactions. (#2053)
• Set a default maxFeePerGas value consistent with Geth (#2055)
• Fix bug in geth PoA middleware where a None response should throw a BlockNotFound error, but was
instead throwing an AttributeError (#2064)
Improved Documentation
• Added general documentation on unit and integration testing and how to contribute to our test suite. (#2053)
Bugfixes
• Have the geth dev IPC auto connection check for the WEB3_PROVIDER_URI environment variable. (#2023)
Improved Documentation
Misc
Features
Bugfixes
Improved Documentation
Misc
Features
Improved Documentation
Misc
Features
Improved Documentation
Misc
Features
Improved Documentation
Features
Bugfixes
• Fix event filter creation if the event ABI contains a values key. (#1807)
Improved Documentation
• Remove v5 breaking changes link from the top of the release notes. (#1837)
• Add account creation troubleshooting docs. (#1855)
• Document passing a struct into a contract function. (#1860)
• Add instance configuration troubleshooting docs. (#1865)
• Clarify nonce lookup in sendRawTransaction docs. (#1866)
• Updated docs for web3.eth methods: eth.getTransactionReceipt and eth.waitForTransactionReceipt (#1868)
Features
Bugfixes
• PR #1585 changed the error that was coming back from eth-tester when the Revert opcode was called, which
broke some tests in downstream libraries. This PR reverts back to raising the original error. (#1813)
• Added a new ContractLogicError for when a contract reverts a transaction. ContractLogicError
will replace SolidityError, in v6. (#1814)
Improved Documentation
Misc
Bugfixes
• Remove docs/web3.* from the gitignore to allow for the beacon docs to be added to git, and add beacon to the
default web3 modules that get loaded. (#1824)
• Remove auto-documenting from the Beacon API (#1825)
Features
Misc
• #1815, #1816
Bugfixes
Improved Documentation
Misc
Features
• Raise SolidityError exceptions that contain the revert reason when a call fails. (#941)
Bugfixes
• Update eth-tester dependency to fix tester environment install version conflict. (#1782)
Misc
• #1757, #1767
Misc
Bugfixes
Misc
Misc
Features
Improved Documentation
Misc
• #1687
• #1690
Bugfixes
Bugfixes
Improved Documentation
Features
• Allow consumer to initialize HttpProvider with their own requests.Session. This allows the HttpAdapter con-
nection pool to be tuned as desired. (#1469)
• Update web3.pm and ethpm module to EthPM v3 specification. (#1652)
Bugfixes
Improved Documentation
• Add a getBalance() example and provide more context for using the fromWei and toWei utility methods.
(#1676)
• Overhaul the Overview documentation to provide a tour of major features. (#1681)
Bugfixes
• Added formatter rules for eth_tester middleware to allow getBalance() by using integer block numbers
(#1660)
• Fix type annotations within the eth.py module. Several arguments that defaulted to None were not declared
Optional. (#1668)
• Fix type annotation warning when using string URI to instantiate an HTTP or WebsocketProvider. (#1669)
• Fix type annotations within the web3 modules. Several arguments that defaulted to None were not declared
Optional. (#1670)
Improved Documentation
• Breaks up links into three categories (Intro, Guides, and API) and adds content to the index page: a lib intro-
duction and some “Getting Started” links. (#1671)
• Fills in some gaps in the Quickstart guide and adds provider connection details for local nodes. (#1673)
Features
• Accept a block identifier in the Contract.estimateGas method. Includes a related upgrade of eth-tester
to v0.5.0-beta.1. (#1639)
• Introduce a more specific validation error, ExtraDataLengthError. This enables tools to detect when
someone may be connected to a POA network, for example, and provide a smoother developer experience.
(#1666)
Bugfixes
Improved Documentation
• Corrects the return value of getTransactionReceipt, description of caching middleware, and deprecated
method names. (#1663)
• Corrects documentation of websocket timeout configuration. (#1665)
Features
• An update of eth-tester includes a change of the default fork from Constantinople to Muir Glacier. #1636
Bugfixes
Misc
• #1636
Features
• Upgrade eth-account to use v0.5.2+. eth-account 0.5.2 adds support for hd accounts
Also had to pin eth-keys to get dependencies to resolve. (#1622)
Bugfixes
Features
Bugfixes
Improved Documentation
Misc
• #1545
Features
Bugfixes
Misc
• #1590
Features
• Add snake_case methods to Geth Miner class, deprecate camelCase methods (#1579)
• Add snake_case methods for the net module, deprecate camelCase methods (#1581)
• Add PEP561 type marker (#1583)
Bugfixes
Improved Documentation
Misc
• #1576
Features
• ENS had to release a new registry to push a bugfix. See this article for background information. Web3.py uses
the new registry for all default ENS interactions, now. (#1573)
Bugfixes
Improved Documentation
Misc
Features
Bugfixes
Bugfixes
Improved Documentation
Misc
• #1518, #1532
Features
Bugfixes
• Make local block filter return empty list when when no blocks mined (#1255)
• Google protobuf dependency was updated to 3.10.0 (#1493)
• Infura websocket provider works when no secret key is present (#1501)
Improved Documentation
• Update Quickstart instructions to use the auto Infura module instead of the more complicated web3 auto module
(#1482)
• Remove outdated py.test command from readme (#1483)
Misc
Features
Bugfixes
Misc
• #1472, #1474
Improved Documentation
Misc
• #1468
Features
Bugfixes
Improved Documentation
Features
Bugfixes
Improved Documentation
• Remove whitespace, move topics key -> topic in Geth docs (#1425)
• Enforce stricter doc checking, turning warnings into errors to fail CI builds to catch issues quickly.
Add missing web3.tools.rst to the table of contents and fix incorrectly formatted JSON example. (#1437)
• Add example using Geth POA Middleware with Infura Rinkeby Node (#1444)
Misc
• #1446, #1451
2.3.44 v5.0.2
2.3.45 v5.0.1
2.3.46 v5.0.0
2.3.47 v5.0.0-beta.5
2.3.48 v5.0.0-beta.4
• Misc
– [ethPM] Migrate tests over from pytest-ethereum - #1385
2.3.49 v5.0.0-beta.3
2.3.50 v5.0.0-beta.2
2.3.51 v5.0.0-beta.1
2.3.52 v5.0.0-alpha.11
2.3.53 v5.0.0-alpha.10
2.3.54 v5.0.0-alpha.9
2.3.55 v5.0.0-alpha.8
2.3.56 v5.0.0-alpha.7
2.3.57 v5.0.0-alpha.6
2.3.58 v5.0.0-alpha.5
2.3.59 v5.0.0-alpha.4
• Misc
– Update .gitignore to ignore .DS_Store and .mypy_cache/ - #1215
– Change CircleCI badge link to CircleCI project - #1214
2.3.60 v5.0.0-alpha.3
2.3.61 v5.0.0-alpha.2
2.3.62 v5.0.0-alpha.1
2.3.63 v4.8.2
2.3.64 v4.8.1
2.3.65 v4.7.2
2.3.66 v4.7.1
2.3.67 v4.7.0
2.3.68 v4.6.0
• Misc
– Disallow configuring filters with both manual and generated topic lists - #976
– Add support for the upcoming eth-abi v2, which does ABI string decoding differently - #974
– Add a lot more filter tests - #997
– Add more tests for filtering with None. Note that geth & parity differ here. - #985
– Follow-up on Parity bug that we reported upstream (parity#7816): they resolved in 1.10. We removed xfail
on that test. - #992
– Docs: add an example of interacting with an ERC20 contract - #995
– A couple doc typo fixes
* #1006
* #1010
2.3.69 v4.5.0
2.3.70 v4.4.1
2.3.71 v4.4.0
2.3.72 v4.3.0
* Two functions with the same name that accept similar argument types, like myfunc(uint8) and
myfunc(int8), and you want to call contract.functions.myfunc(1).call()
• Misc
– Friendlier json encoding/decoding failure error messages
– Performance improvements, when the responses from the node are large (by reducing the number of times
we evaluate if the response is valid json)
– Parity CI test fixes (ugh, environment setup hell, thanks to the community for cleaning this up!)
– Don’t crash when requesting a transaction that was created with the parity bug (which allowed an unsigned
transaction to be included, so publicKey is None)
– Doc fixes: addresses must be checksummed (or ENS names on mainnet)
– Enable local integration testing of parity on non-Debian OS
– README:
2.3.73 v4.2.1
2.3.74 v4.2.0
2.3.75 v4.1.0
2.3.76 v4.0.0
2.3.77 v4.0.0-beta.13
2.3.78 v4.0.0-beta.12
2.3.79 v4.0.0-beta.11
2.3.80 v4.0.0-beta.10
2.3.81 v4.0.0-beta.9
2.3.82 v4.0.0-beta.8
Released Feb 7, 2018, then recalled. It added 32MB of test data to git history, so the tag was deleted, as well as the
corresponding release. (Although the release would not have contained that test data)
2.3.83 v4.0.0-beta.7
2.3.84 v4.0.0-beta.6
2.3.85 v4.0.0-beta.5
2.3.86 v4.0.0-beta.4
2.3.87 v4.0.0-beta.3
2.3.88 v4.0.0-beta.2
• If running multiple threads with the same w3 instance, ValueError: Recursively called ... is
no longer raised
Plus, various python modernization code cleanups, and testing against geth 1.7.2.
2.3.89 v4.0.0-beta.1
2.3.90 3.16.1
2.3.91 3.16.0
2.3.92 3.15.0
2.3.93 3.14.2
2.3.94 3.14.1
2.3.95 3.14.0
• New stalecheck_middleware
• Improvements to Web3.toHex and Web3.toText.
• Improvements to Web3.sha3 signature.
• Bugfixes for Web3.eth.sign api
2.3.96 3.13.5
2.3.97 3.13.4
2.3.98 3.13.3
2.3.99 3.13.2
• Bugfix for retrieving filter changes for both new block filters and pending transaction filters.
2.3.100 3.13.1
2.3.101 3.13.0
2.3.102 3.12.0
• Bugfix for abi filtering to correctly handle constructor and fallback type abi entries.
2.3.103 3.11.0
• All web3 apis which accept address parameters now enforce checksums if the address looks like it is check-
summed.
• Improvements to error messaging with when calling a contract on a node that may not be fully synced
• Bugfix for web3.eth.syncing to correctly handle False
2.3.104 3.10.0
2.3.105 3.9.0
2.3.106 3.8.1
2.3.107 3.8.0
2.3.108 3.7.1
2.3.109 3.7.0
2.3.110 3.6.2
2.3.111 3.6.1
2.3.112 3.6.0
2.3.113 3.5.3
2.3.114 3.5.2
2.3.115 3.5.1
2.3.116 3.5.0
• Deprecate web3.providers.rpc.RPCProvider
• Deprecate web3.providers.rpc.KeepAliveRPCProvider
• Add new web3.providers.rpc.HTTPProvider
• Remove hard dependency on gevent.
2.3.117 3.4.4
2.3.118 3.4.3
• Bugfix for event log data decoding to properly handle dynamic sized values.
• New web3.tester module to access extra RPC functionality from eth-testrpc
2.3.119 3.4.2
2.3.120 3.4.1
2.3.121 3.4.0
2.3.122 3.3.0
2.3.123 3.2.0
2.3.124 3.1.1
• Bugfix for contract transaction sending not respecting the web3.eth.defaultAccount configuration.
2.3.125 3.1.0
2.3.126 3.0.2
2.3.127 3.0.1
2.3.128 3.0.0
• Filter objects now support controlling the interval through which they poll using the poll_interval
property
2.3.129 2.9.0
2.3.130 2.8.1
2.3.131 2.8.0
2.3.132 2.7.1
2.3.133 2.7.0
2.3.134 2.6.0
2.3.135 2.5.0
• All transactions which contain a data element will now have their gas automatically estimated with 100k
additional buffer. This was previously only true with transactions initiated from a Contract object.
2.3.136 2.4.0
2.3.137 2.3.0
2.3.138 2.2.0
• The filters that come back from the contract on and pastEvents methods now call their callbacks with the
same data format as web3.js.
2.3.139 2.1.1
2.3.140 2.1.0
2.3.141 2.0.0
2.3.142 1.9.0
2.3.143 1.8.0
2.3.144 1.7.1
2.3.145 1.7.0
2.3.146 1.6.0
2.3.147 1.5.0
2.3.148 1.4.0
2.3.149 1.3.0
2.3.150 1.2.0
2.3.151 1.1.0
2.3.152 1.0.1
2.3.153 1.0.0
2.3.154 0.1.0
• Initial release
The Ethereum protocol defines a way for people to interact with smart contracts and each other over a network. In
order to have up-to-date information about the status of contracts, balances, and new transactions, the protocol requires
a connection to nodes on the network. These nodes are constantly sharing new data with each other.
Web3.py is a python library for connecting to these nodes. It does not run its own node internally.
Due to the nature of Ethereum, this is largely a question of personal preference, but it has significant ramifications on
security and usability. Further, node software is evolving quickly, so please do your own research about the current
options. We won’t advocate for any particular node, but list some popular options and some basic details on each.
One of the key decisions is whether to use a local node or a hosted node. A quick summary is at Local vs Hosted
Nodes.
A local node requires less trust than a hosted one. A malicious hosted node can give you incorrect information, log
your sent transactions with your IP address, or simply go offline. Incorrect information can cause all kinds of problems,
including loss of assets.
On the other hand, with a local node your machine is individually verifying all the transactions on the network,
and providing you with the latest state. Unfortunately, this means using up a significant amount of disk space, and
sometimes notable bandwidth and computation. Additionally, there is a big up-front time cost for downloading the
full blockchain history.
If you want to have your node manage keys for you (a popular option), you must use a local node. Note that even
if you run a node on your own machine, you are still trusting the node software with any accounts you create on the
node.
The most popular self-run node options are:
• geth (go-ethereum)
• parity
You can find a fuller list of node software at ethdocs.org.
Some people decide that the time it takes to sync a local node from scratch is too high, especially if they are just
exploring Ethereum for the first time. One way to work around this issue is to use a hosted node.
The most popular hosted node option is Infura. You can connect to it as if it were a local node, with a few
caveats. It cannot (and should not) host private keys for you, meaning that some common methods like w3.eth.
send_transaction() are not directly available. To send transactions to a hosted node, read about Working with
Local Private Keys.
Once you decide what node option you want, you need to choose which network to connect to. Typically, you are
choosing between the main network and one of the available test networks. See Which network should I connect to?
MetaMask is not a node. It is an interface for interacting with a node. Roughly, it’s what you get if you turn Web3.py
into a browser extension.
By default, MetaMask connects to an Infura node. You can also set up MetaMask to use a node that you run locally.
If you are trying to use accounts that were already created in MetaMask, see Why isn’t my web3 instance connecting
to the network?
Once you have answered How do I choose which node to use? you have to pick which network to connect to. This is
easy for some scenarios: if you have ether and you want to spend it, or you want to interact with any production smart
contracts, then you connect to the main Ethereum network.
If you want to test these things without using real ether, though, then you need to connect to a test network. There
are several test networks to choose from. One test network, Ropsten, is the most similar to the production network.
However, spam and mining attacks have happened, which is disruptive when you want to test out a contract.
There are some alternative networks that limit the damage of spam attacks, but they are not standardized across
node software. Geth runs their own (Rinkeby), and Parity runs their own (Kovan). See a full comparison in this
Stackexchange Q&A.
So roughly, choose this way:
• If using Parity, connect to Kovan
• If using Geth, connect to Rinkeby
• If using a different node, or testing mining, connect to Ropsten
Each of their networks has their own version of Ether. Main network ether must be purchased, naturally, but test
network ether is usually available for free. See How do I get ether for my test network?
Once you have decided which network to connect to, and set up your node for that network, you need to decide how
to connect to it. There are a handful of options in most nodes. See Choosing How to Connect to Your Node.
2.5 Providers
The provider is how web3 talks to the blockchain. Providers take JSON-RPC requests and return the response. This is
normally done by submitting the request to an HTTP or IPC socket based server.
Note: Web3.py supports one provider per instance. If you have an advanced use case that requires multiple providers,
create and configure a new web3 instance per connection.
If you are already happily connected to your Ethereum node, then you can skip the rest of the Providers section.
2.5. Providers 57
Populus Documentation, Release 5.23.0
Most nodes have a variety of ways to connect to them. If you have not decided what kind of node to use, head on over
to How do I choose which node to use?
The most common ways to connect to your node are:
1. IPC (uses local filesystem: fastest and most secure)
2. Websockets (works remotely, faster than HTTP)
3. HTTP (more nodes support it)
If you’re not sure how to decide, choose this way:
• If you have the option of running Web3.py on the same machine as the node, choose IPC.
• If you must connect to a node on a different computer, use Websockets.
• If your node does not support Websockets, use HTTP.
Most nodes have a way of “turning off” connection options. We recommend turning off all connection options that
you are not using. This provides a safer setup: it reduces the number of ways that malicious hackers can try to steal
your ether.
Once you have decided how to connect, you specify the details using a Provider. Providers are Web3.py classes that
are configured for the kind of connection you want.
See:
• IPCProvider
• WebsocketProvider
• HTTPProvider
Once you have configured your provider, for example:
Then you are ready to initialize your Web3 instance, like so:
w3 = Web3(my_provider)
The Web3 object will look for the Ethereum node in a few standard locations if no providers are specified. Auto-
detection happens when you initialize like so:
• If you know the connection method, but not the other information needed to connect (like the path to the IPC
file), you will need to look up that information in your node’s configuration.
• If you’re not sure which node you are using, see How do I choose which node to use?
For a deeper dive into how automated detection works, see:
Web3 attempts to connect to nodes in the following order, using the first successful connection it can make:
1. The connection specified by an environment variable, see Provider via Environment Variable
2. IPCProvider, which looks for several IPC file locations. IPCProvider will not automatically detect a
testnet connection, it is suggested that the user instead uses a w3 instance from web3.auto.infura (e.g.
from web3.auto.infura.ropsten import w3) if they want to auto-detect a testnet.
3. HTTPProvider, which attempts to connect to “http://localhost:8545”
4. None - if no providers are successful, you can still use Web3 APIs that do not require a connection, like:
• Encoding and Decoding Helpers
• Currency Conversions
• Addresses
• Working with Local Private Keys
• etc.
Some nodes provide APIs beyond the standards. Sometimes the same information is provided in different ways across
nodes. If you want to write code that works across multiple nodes, you may want to look up the node type you are
connected to.
For example, the following retrieves the client enode endpoint for both geth and parity:
connected = w3.isConnected()
else:
enode = None
2.5. Providers 59
Populus Documentation, Release 5.23.0
Alternatively, you can set the environment variable WEB3_PROVIDER_URI before starting your script, and web3
will look for that provider first.
Valid formats for this environment variable are:
• file:///path/to/node/rpc-json/file.ipc
• http://192.168.1.2:8545
• https://node.ontheweb.com
• ws://127.0.0.1:8546
Infura Mainnet
To easily connect to the Infura Mainnet remote node, first register for a free project ID if you don’t have one at
https://infura.io/register .
Then set the environment variable WEB3_INFURA_PROJECT_ID with your Project ID:
$ export WEB3_INFURA_PROJECT_ID=YourProjectID
If you have checked the box in the Infura UI indicating that requests need an optional secret key, set the environment
variable WEB3_INFURA_API_SECRET:
$ export WEB3_INFURA_API_SECRET=YourProjectSecret
Web3 ships with the following providers which are appropriate for connecting to local and remote JSON-RPC servers.
HTTPProvider
Note that you should create only one HTTPProvider per python process, as the HTTPProvider recycles under-
lying TCP/IP network connections, for better performance.
Under the hood, the HTTPProvider uses the python requests library for making requests. If you would like
to modify how requests are made, you can use the request_kwargs to do so. A common use case for this is
increasing the timeout for each request.
To tune the connection pool size, you can pass your own requests.Session.
IPCProvider
If no ipc_path is specified, it will use the first IPC file it can find from this list:
• On Linux and FreeBSD:
– ~/.ethereum/geth.ipc
– ~/.local/share/io.parity.ethereum/jsonrpc.ipc
2.5. Providers 61
Populus Documentation, Release 5.23.0
– ~/.local/share/trinity/mainnet/ipcs-eth1/jsonrpc.ipc
• On Mac OS:
– ~/Library/Ethereum/geth.ipc
– ~/Library/Application Support/io.parity.ethereum/jsonrpc.ipc
– ~/.local/share/trinity/mainnet/ipcs-eth1/jsonrpc.ipc
• On Windows:
– \\\.\pipe\geth.ipc
– \\\.\pipe\jsonrpc.ipc
WebsocketProvider
Under the hood, the WebsocketProvider uses the python websockets library for making requests. If you
would like to modify how requests are made, you can use the websocket_kwargs to do so. See the web-
sockets documentation for available arguments.
Unlike HTTP connections, the timeout for WS connections is controlled by a separate websocket_timeout
argument, as shown below.
EthereumTesterProvider
Warning: Experimental: This provider is experimental. There are still significant gaps in functionality. However
it is being actively developed and supported.
class web3.providers.eth_tester.EthereumTesterProvider(eth_tester=None)
This provider integrates with the eth-tester library. The eth_tester constructor argument should
be an instance of the EthereumTester or a subclass of BaseChainBackend class provided by the
eth-tester library. If you would like a custom eth-tester instance to test with, see the eth-tester li-
brary documentation for details.
Note: To install the needed dependencies to use EthereumTesterProvider, you can install the pip extras package that
has the correct interoperable versions of the eth-tester and py-evm dependencies needed to do testing: e.g. pip
install web3[tester]
AutoProvider
AutoProvider is the default used when initializing web3.Web3 without any providers. There’s rarely a reason to
use it explicitly.
AsyncHTTPProvider
Warning: This provider is unstable and there are still gaps in functionality. However, it is being actively devel-
oped.
Under the hood, the AsyncHTTPProvider uses the python aiohttp library for making requests.
Supported Methods
Eth
• web3.eth.block_number
• web3.eth.coinbase
• web3.eth.gas_price
• web3.eth.max_priority_fee
• web3.eth.call()
• web3.eth.estimate_gas()
• web3.eth.generate_gas_price()
• web3.eth.get_balance()
• web3.eth.get_block()
• web3.eth.get_code()
• web3.eth.get_raw_transaction()
2.5. Providers 63
Populus Documentation, Release 5.23.0
• web3.eth.get_transaction()
• web3.eth.get_transaction_count()
• web3.eth.send_transaction()
Net
• web3.net.listening()
• web3.net.peer_count()
• web3.net.version()
Supported Middleware
2.6 Examples
• Looking up blocks
• Getting the latest block
• Checking the balance of an account
• Converting currency denominations
• Making transactions
• Looking up transactions
• Looking up receipts
• Working with Contracts
– Interacting with existing contracts
– Deploying new contracts
• Working with Contracts via ethPM
• Working with an ERC20 Token Contract
– Creating the contract factory
– Querying token metadata
– Query account balances
– Sending tokens
– Creating an approval for external transfers
– Performing an external transfer
• Contract Unit Tests in Python
• Using Infura Rinkeby Node
Here are some common things you might want to do with web3.
Blocks can be looked up by either their number or hash using the web3.eth.get_block API. Block hashes should
be in their hexadecimal representation. Block numbers
˓→',
'miner': '0xad5c1768e5974c231b2148169da064e61910f31a',
'mixHash': '0x31d9ec7e3855aeba37fd92aa1639845e70b360a60f77f12eff530429ef8cfcba',
'nonce': '0x549f882c5f356f85',
'number': 12345,
'parentHash': '0x4b3c1d7e65a507b62734feca1ee9f27a5379e318bd52ae62de7ba67dbeac66a3
˓→',
'receiptsRoot':
˓→'0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
'sealFields': ['0x31d9ec7e3855aeba37fd92aa1639845e70b360a60f77f12eff530429ef8cfcba
˓→',
'0x549f882c5f356f85'],
'sha3Uncles': '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347
˓→',
'size': 539,
'stateRoot': '0xca495e22ed6b88c61714d129dbc8c94f5bf966ac581c09a57c0a72d0e55e7286',
'timestamp': 1438367030,
'totalDifficulty': 3862140487204603,
'transactions': [],
'transactionsRoot':
˓→'0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
'uncles': [],
}
{...}
2.6. Examples 65
Populus Documentation, Release 5.23.0
You can also retrieve the latest block using the string 'latest' in the web3.eth.get_block API.
>>> web3.eth.get_block('latest')
{...}
If you want to know the latest block number you can use the web3.eth.block_number property.
>>> web3.eth.block_number
4194803
To find the amount of ether owned by an account, use the get_balance() method. At the time of writing, the
account with the most ether has a public address of 0x742d35Cc6634C0532925a3b844Bc454e4438f44e.
>>> web3.eth.get_balance('0x742d35Cc6634C0532925a3b844Bc454e4438f44e')
3841357360894980500000001
Note that this number is not denominated in ether, but instead in the smallest unit of value in Ethereum, wei. Read on
to learn how to convert that number to ether.
Web3 can help you convert between denominations. The following denominations are supported.
Picking up from the previous example, the largest account contained 3841357360894980500000001 wei. You can use
the fromWei() method to convert that balance to ether (or another denomination).
To convert back to wei, you can use the inverse function, toWei(). Note that Python’s default floating point precision
is insufficient for this use case, so it’s necessary to cast the value to a Decimal if it isn’t already.
Best practice: If you need to work with multiple currency denominations, default to wei. A typical workflow may
require a conversion from some denomination to wei, then from wei to whatever you need.
Note: The location of your keys (e.g., local or hosted) will have implications on these methods. Read about the
differences here.
2.6. Examples 67
Populus Documentation, Release 5.23.0
>>> web3.eth.get_transaction(
˓→'0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060')
{
'blockHash': '0x4e3a3754410177e6937ef1f84bba68ea139e8d1a2258c5f85db9f1cd715a1bdd',
'blockNumber': 46147,
'condition': None,
'creates': None,
'from': '0xA1E4380A3B1f749673E270229993eE55F35663b4',
'gas': 21000,
'gasPrice': None,
'hash': '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060',
'input': '0x',
'maxFeePerGas': 2000000000,
'maxPriorityFeePerGas': 1000000000,
'networkId': None,
'nonce': 0,
'publicKey':
˓→'0x376fc429acc35e610f75b14bc96242b13623833569a5bb3d72c17be7e51da0bb58e48e2462a59897cead8ab88e78709f
˓→',
'r': '0x88ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0',
'raw':
˓→'0xf86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db
˓→',
's': '0x45e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33a',
'standardV': '0x1',
'to': '0x5DF9B87991262F6BA471F09758CDE1c0FC1De734',
'transactionIndex': 0,
'v': '0x1c',
'value': 31337,
}
If no transaction for the given hash can be found, then this function will instead return None.
>>> web3.eth.get_transaction_receipt(
˓→'0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060')
{
'blockHash': '0x4e3a3754410177e6937ef1f84bba68ea139e8d1a2258c5f85db9f1cd715a1bdd',
'blockNumber': 46147,
'contractAddress': None,
'cumulativeGasUsed': 21000,
'gasUsed': 21000,
'logs': [],
'logsBloom':
˓→'0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
˓→',
'root': '0x96a8e009d2b88b1483e6941e6812e32263b05683fac202abc622a3e31aed1957',
'transactionHash':
˓→'0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060',
If the transaction has not yet been mined then this method will return None.
In order to use an existing contract, you’ll need its deployed address and its ABI. Both can be found using block
explorers, like Etherscan. Once you instantiate a contract instance, you can read data and execute transactions.
# read state:
contract_instance.functions.storedValue().call()
# 42
# update state:
tx_hash = contract_instance.functions.updateValue(43).transact()
contract StoreVar {
2.6. Examples 69
Populus Documentation, Release 5.23.0
import sys
import time
import pprint
def compile_source_file(file_path):
with open(file_path, 'r') as f:
source = f.read()
return compile_source(source)
address = w3.eth.get_transaction_receipt(tx_hash)['contractAddress']
return address
w3 = Web3(EthereumTesterProvider(PyEVMBackend()))
contract_source_path = 'contract.sol'
compiled_sol = compile_source_file('contract.sol')
gas_estimate = store_var_contract.functions.setVar(255).estimateGas()
print(f'Gas estimate to transact with setVar: {gas_estimate}')
Output:
'blockNumber': 2,
'contractAddress': None,
'cumulativeGasUsed': 43488,
'gasUsed': 43488,
'logs': [AttributeDict({'type': 'mined', 'logIndex': 0, 'transactionIndex': 0,
˓→'transactionHash': HexBytes(
˓→'0x50aa3ba0673243f1e60f546a12ab364fc2f6603b1654052ebec2b83d4524c6d0'), 'blockHash':
˓→HexBytes('0x837609ad0a404718c131ac5157373662944b778250a507783349d4e78bd8ac84'),
˓→'0x6c2b4666ba8da5a95717621d879a77de725f3d816709b9cbe9f059b8f875e284'), HexBytes(
˓→'0x00000000000000000000000000000000000000000000000000000000000000ff')]})],
'status': 1,
'transactionHash': HexBytes(
˓→'0x50aa3ba0673243f1e60f546a12ab364fc2f6603b1654052ebec2b83d4524c6d0'),
'transactionIndex': 0}
ethPM packages contain configured contracts ready for use. Web3’s ethpm module (web3.pm) extends Web3’s
native Contract module, with a few modifications for how you instantiate Contract factories and instances.
All you need is the package name, version and ethPM registry address for the package you wish to use. An ethPM
registry is an on-chain datastore for the release data associated with an ethPM package. You can find some sample
registries to explore in the ethPM registry. Remember, you should only use packages from registries whose maintainer
you trust not to inject malicious code!
In this example we will use the [email protected] package sourced from the ens.snakecharmers.eth
registry.
web3.pm uses the Package class to represent an ethPM package. This object houses all of the contract assets
within a package, and exposes them via an API. So, before we can interact with our package, we need to generate it
as a Package instance.
# Note. To use the web3.pm module, you will need to instantiate your w3 instance
# with a web3 provider connected to the chain on which your registry lives.
2.6. Examples 71
Populus Documentation, Release 5.23.0
Now that we have a Package representation of our target ethPM package, we can generate contract factories and
instances from this Package. However, it’s important to note that some packages might be missing the necessary
contract assets needed to generate an instance or a factory. You can use the ethPM CLI to figure out the available
contract types and deployments within an ethPM package.
# Now you can treat mainnet_registrar like any other Web3 Contract instance!
mainnet_registrar.caller.balanceOf("0x123...")
> 0
mainnet_registrar.functions.approve("0x123", 100000).transact()
> 0x123abc... # tx_hash
# Now you can treat registrar_factory like any other Web3 Contract factory to deploy
˓→new instances!
# Note. This will deploy new instances to the chain of the connected provider (in
˓→this example, mainnet)
registrar_factory.constructor(...).transact()
> 0x456def... # tx_hash
# To connect your Package to a new chain - simply pass it a new Web3 instance
# connected to your provider of choice. Now your factories will automatically
# deploy to this new chain, and the deployments available on a package will
# be automatically filtered to those located on the new chain.
from web3.auto.infura.goerli import w3 as goerli_w3
goerli_registrar = ens_package.update_w3(goerli_w3)
Most fungible tokens on the Ethereum blockchain conform to the ERC20 standard. This section of the guide covers
interacting with an existing token contract which conforms to this standard.
In this guide we will interact with an existing token contract that we have already deployed to a local testing chain.
This guide assumes:
1. An existing token contract at a known address.
2. Access to the proper ABI for the given contract.
3. A web3.main.Web3 instance connected to a provider with an unlocked account which can send transactions.
First we need to create a contract instance with the address of our token contract and the ERC20 ABI.
Each token will have a total supply which represents the total number of tokens in circulation. In this example we’ve
initialized the token contract to have 1 million tokens. Since this token contract is setup to have 18 decimal places, the
raw total supply returned by the contract is going to have 18 additional decimal places.
>>> contract.functions.name().call()
'TestToken'
>>> contract.functions.symbol().call()
'TEST'
>>> decimals = contract.functions.decimals().call()
>>> decimals
18
>>> DECIMALS = 10 ** decimals
>>> contract.functions.totalSupply().call() // DECIMALS
1000000
Next we can query some account balances using the contract’s balanceOf function. The token contract we are using
starts with a single account which we’ll refer to as alice holding all of the tokens.
Sending tokens
Next we can transfer some tokens from alice to bob using the contract’s transfer function.
2.6. Examples 73
Populus Documentation, Release 5.23.0
Alice could also approve someone else to spend tokens from her account using the approve function. We can also
query how many tokens we’re approved to spend using the allowance function.
When someone has an allowance they can transfer those tokens using the transferFrom function.
Here is an example of how one can use the pytest framework in python, Web3.py, eth-tester, and PyEVM to perform
unit tests entirely in python without any additional need for a full featured ethereum node/client. To install needed
dependencies you can use the pinned extra for eth_tester in web3 and pytest:
Once you have an environment set up for testing, you can then write your tests like so:
import pytest
@pytest.fixture
def tester_provider():
return EthereumTesterProvider()
@pytest.fixture
def eth_tester(tester_provider):
return tester_provider.ethereum_tester
@pytest.fixture
def w3(tester_provider):
return Web3(tester_provider)
@pytest.fixture
def foo_contract(eth_tester, w3):
# For simplicity of this example we statically define the
# contract code here. You might read your contracts from a
# file, or something else to test with in your own code
#
# pragma solidity^0.5.3;
#
# contract Foo {
#
# string public bar;
# event barred(string _bar);
#
# constructor() public {
# bar = "hello world";
# }
#
# function setBar(string memory _bar) public {
# bar = _bar;
# emit barred(_bar);
# }
#
# }
deploy_address = eth_tester.get_accounts()[0]
abi = """[{"anonymous":false,"inputs":[{"indexed":false,"name":"_bar","type":
˓→"string"}],"name":"barred","type":"event"},{"constant":false,"inputs":[{"name":"_bar
˓→","type":"string"}],"name":"setBar","outputs":[],"payable":false,"stateMutability":
˓→"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":
˓→"nonpayable","type":"constructor"},{"constant":true,"inputs":[],"name":"bar",
˓→"outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view",
2.6. Examples 75
Populus Documentation, Release 5.23.0
w3 = Web3(Web3.HTTPProvider("https://rinkeby.infura.io/v3/YOUR_INFURA_KEY"))
Just remember that you have to sign all transactions locally, as infura does not handle any keys from your wallet ( refer
to this )
transaction = contract.functions.function_Name(params).buildTransaction()
transaction.update({ 'gas' : appropriate_gas_amount })
transaction.update({ 'nonce' : w3.eth.get_transaction_count('Your_Wallet_Address') })
signed_tx = w3.eth.account.sign_transaction(transaction, private_key)
P.S : the two updates are done to the transaction dictionary, since a raw transaction might not contain gas & nonce
amounts, so you have to add them manually.
And finally, send the transaction
txn_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
txn_receipt = w3.eth.wait_for_transaction_receipt(txn_hash)
Tip : afterwards you can use the value stored in txn_hash, in an explorer like etherscan to view the transaction’s
details
import logging
import coloredlogs
def setup_logging(log_level=logging.DEBUG):
"""Setup root logger and quiet some levels."""
logger = logging.getLogger()
# Set log format to dislay the logger name to hunt down verbose logging modules
fmt = "%(name)-25s %(levelname)-8s %(message)s"
# Use colored logging output for console with the coloredlogs package
# https://pypi.org/project/coloredlogs/
coloredlogs.install(level=log_level, fmt=fmt, logger=logger)
return logger
2.6. Examples 77
Populus Documentation, Release 5.23.0
In this example, we show how to fetch all events of a certain event type from the Ethereum blockchain. There are three
challenges when working with a large set of events:
• How to incrementally update an existing database of fetched events
• How to deal with interruptions in long running processes
• How to deal with eth_getLogs JSON-RPC call query limitations
• How to handle Ethereum minor chain reorganisations in (near) real-time data
eth_getLogs limitations
Ethereum JSON-RPC API servers, like Geth, do not provide easy to paginate over events, only over blocks. There’s
no request that can find the first block with an event or how many events occur within a range of blocks. The only
feedback the JSON-RPC service will give you is whether the eth_getLogs call failed.
In this example script, we provide two kinds of heurestics to deal with this issue. The script scans events in a chunk of
blocks (start block number - end block number). Then it uses two methods to find how many events there are likely to
be in a block window:
• Dynamically set the block range window size, while never exceeding a threshold (e.g., 10,000 blocks).
• In the case eth_getLogs JSON-PRC call gives a timeout error, decrease the end block number and try again with
a smaller block range window.
Example code
The following example code is divided into a reusable EventScanner class and then a demo script that:
• fetches all transfer events for RCC token,
• can incrementally run again to check if there are new events,
• handles interruptions (e.g., CTRL+C abort) gracefully,
• writes all Transfer events in a single file JSON database, so that other process can consume them,
• uses the tqdm library for progress bar output in a console,
• only supports HTTPS providers, because JSON-RPC retry logic depends on the implementation details of the
underlying protocol,
• disables the standard http_retry_request_middleware because it does not know how to handle the
shrinking block range window for eth_getLogs, and
• consumes around 20k JSON-RPC API calls.
The script can be run with: python ./eventscanner.py <your JSON-RPC API URL>.
"""A stateful event scanner for Ethereum-based blockchains using Web3.py.
With the stateful mechanism, you can do one batch scan or incremental scans,
where events are added wherever the scanner left off.
"""
import datetime
import time
import logging
(continues on next page)
logger = logging.getLogger(__name__)
class EventScannerState(ABC):
"""Application state that remembers what blocks we have scanned in the case of
˓→crash.
"""
@abstractmethod
def get_last_scanned_block(self) -> int:
"""Number of the last block we have scanned on the previous cycle.
@abstractmethod
def start_chunk(self, block_number: int):
"""Scanner is about to ask data of multiple blocks over JSON-RPC.
@abstractmethod
def end_chunk(self, block_number: int):
"""Scanner finished a number of blocks.
@abstractmethod
def process_event(self, block_when: datetime.datetime, event: AttributeDict) ->
˓→object:
This function takes raw events from Web3, transforms them to your application
˓→ internal
format, then saves them in a database or some other state.
2.6. Examples 79
Populus Documentation, Release 5.23.0
@abstractmethod
def delete_data(self, since_block: int) -> int:
"""Delete any data since this block was scanned.
class EventScanner:
"""Scan blockchain for events and try not to abuse JSON-RPC API too much.
Can be used for real-time scans, as it detects minor chain reorganisation and
˓→rescans.
Unlike the easy web3.contract.Contract, this scanner can scan events from
˓→multiple contracts at once.
For example, you can get all transfers from all tokens in the same scan.
"""
"""
:param contract: Contract
:param events: List of web3 Event we scan
:param filters: Filters passed to getLogs
:param max_chunk_scan_size: JSON-RPC API limit in the number of blocks we
˓→query. (Recommendation: 10,000 for mainnet, 500,000 for testnets)
"""
self.logger = logger
self.contract = contract
self.web3 = web3
self.state = state
self.events = events
self.filters = filters
# Factor how fast we increase the chunk size if results are found
# # (slow down scan after starting to get hits)
(continues on next page)
@property
def address(self):
return self.token_address
def get_suggested_scan_start_block(self):
"""Get where we should start to scan for new token events.
These heurestics could be made more robust, but this is for the sake of
˓→simple reference implementation.
"""
end_block = self.get_last_scanned_block()
if end_block:
return max(1, end_block - self.NUM_BLOCKS_RESCAN_FOR_FORKS)
return 1
def get_suggested_scan_end_block(self):
"""Get the last mined block on Ethereum chain we are following."""
Dynamically decrease the size of the chunk if the case JSON-RPC server pukes
˓→ out.
(continues on next page)
2.6. Examples 81
Populus Documentation, Release 5.23.0
:return: tuple(actual end block number, when this block was mined, processed
˓→ events)
"""
block_timestamps = {}
get_block_timestamp = self.get_block_timestamp
all_processed = []
block_number = evt["blockNumber"]
# Get UTC time when this event happened (block mined timestamp)
# from our in-memory cache
block_when = get_block_when(block_number)
end_block_timestamp = get_block_when(end_block)
return end_block, end_block_timestamp, all_processed
(continues on next page)
Our scanner might need to scan the whole blockchain for all events
* We want to make sure that one scan chunk does not try to process too many
˓→entries once, as we try to control commit buffer size and potentially asynchronous
˓→busy loop
* Do not overload node serving JSON-RPC API by asking data for too many
˓→ events at a time
Currently Ethereum JSON-API does not have an API to tell when a first event
˓→occured in a blockchain
and our heuristics try to accelerate block fetching (chunk size) until we see
˓→the first event.
It does not make sense to do a full chain scan starting from block 1, doing
˓→one JSON-RPC call per 20 blocks.
"""
if event_found_count > 0:
# When we encounter first events, reset the chunk size window
current_chuck_size = self.min_scan_chunk_size
else:
current_chuck_size *= self.chunk_size_increase
Assumes all balances in the database are valid before start_block (no forks
˓→ sneaked in).
:param start_chunk_size: How many blocks we try to fetch over JSON-RPC on the
˓→ first attempt
2.6. Examples 83
Populus Documentation, Release 5.23.0
current_block = start_block
self.state.start_chunk(current_block, chunk_size)
# Print some diagnostics to logs to try to fiddle with real world JSON-
˓→RPC API performance
estimated_end_block = current_block + chunk_size
logger.debug(
"Scanning token transfers for blocks: %d - %d, chunk size %d, last
˓→chunk scan took %f, last logs found %d",
start = time.time()
actual_end_block, end_block_timestamp, new_entries = self.scan_
˓→chunk(current_block, estimated_end_block)
# Where does our current chunk scan ends - are we out of chain yet?
current_end = actual_end_block
# Try to guess how many blocks to fetch over `eth_getLogs` API next time
chunk_size = self.estimate_next_chunk_size(chunk_size, len(new_entries))
For example, Go Ethereum does not indicate what is an acceptable response size.
It just fails on the server-side with a "context was cancelled" warning.
# https://github.com/ethereum/go-ethereum/issues/20426
if i < retries - 1:
# Give some more verbose info than the default middleware
logger.warning(
"Retrying events for block range %d - %d (%d) failed with %s,
˓→retrying in %s seconds",
start_block,
end_block,
end_block-start_block,
e,
delay)
# Decrease the `eth_getBlocks` range
end_block = start_block + ((end_block - start_block) // 2)
# Let the JSON-RPC to recover e.g. from restart
time.sleep(delay)
continue
else:
logger.warning("Out of retries")
raise
def _fetch_events_for_all_contracts(
web3,
event,
argument_filters: dict,
from_block: int,
to_block: int) -> Iterable:
"""Get events using eth_getLogs API.
2.6. Examples 85
Populus Documentation, Release 5.23.0
if from_block is None:
raise TypeError("Missing mandatory keyword argument to getLogs: fromBlock")
if __name__ == "__main__":
# Simple demo that scans all the token transfers of RCC token (11k).
# The demo supports persistant state by using a JSON file.
(continues on next page)
class JSONifiedState(EventScannerState):
"""Store the state of scanned blocks and all events.
def __init__(self):
self.state = None
self.fname = "test-state.json"
# How many second ago we saved the JSON file
self.last_save = 0
def reset(self):
(continues on next page)
2.6. Examples 87
Populus Documentation, Release 5.23.0
def restore(self):
"""Restore the last scan state from a file."""
try:
self.state = json.load(open(self.fname, "rt"))
print(f"Restored the state, previously {self.state['last_scanned_block
˓→']} blocks have been scanned")
def save(self):
"""Save everything we have scanned so far in a file."""
with open(self.fname, "wt") as f:
json.dump(self.state, f)
self.last_save = time.time()
#
# EventScannerState methods implemented below
#
def get_last_scanned_block(self):
"""The number of the last block we have stored."""
return self.state["last_scanned_block"]
# Next time the scanner is started we will resume from this block
self.state["last_scanned_block"] = block_number
# Create empty dict as the block that contains all transactions by txhash
if block_number not in self.state["blocks"]:
self.state["blocks"][block_number] = {}
block = self.state["blocks"][block_number]
if txhash not in block:
# We have not yet recorded any transfers in this transaction
# (One transaction may contain multiple events if executed by a smart
˓→contract).
def run():
if len(sys.argv) < 2:
print("Usage: eventscanner.py http://your-node-url")
sys.exit(1)
api_url = sys.argv[1]
provider = HTTPProvider(api_url)
web3 = Web3(provider)
2.6. Examples 89
Populus Documentation, Release 5.23.0
max_chunk_scan_size=10000
)
# Assume we might have scanned the blocks all the way to the last Ethereum
˓→ block
# that mined a few seconds before the previous scan run ended.
# Because there might have been a minor Etherueum chain reorganisations
# since the last scan ended, we need to discard
# the last few blocks from the previous scan results.
chain_reorg_safety_blocks = 10
scanner.delete_potentially_forked_block_data(state.get_last_scanned_block() -
˓→chain_reorg_safety_blocks)
if current_block_timestamp:
formatted_time = current_block_timestamp.strftime("%d-%m-%Y")
else:
formatted_time = "no block time available"
progress_bar.set_description(f"Current block: {current} ({formatted_
˓→time}), blocks in a scan batch: {chunk_size}, events processed in a batch {events_
˓→count}")
progress_bar.update(chunk_size)
state.save()
(continues on next page)
run()
2.7 Troubleshooting
Many things can cause a broken environment. You might be on an unsupported version of Python. Another package
might be installed that has a name or version conflict. Often, the best way to guarantee a correct environment is with
virtualenv, like:
# Install pip if it is not available:
$ which pip || curl https://bootstrap.pypa.io/get-pip.py | python
# *If* the above command displays an error, you can try installing as root:
$ sudo pip install virtualenv
# With virtualenv active, make sure you have the latest packaging tools
$ pip install --upgrade pip setuptools
Note: Remember that each new terminal session requires you to reactivate your virtualenv, like: $ source ~/.
venv-py3/bin/activate
Note that a Web3.py instance must be configured before you can use most of its capabilities. One symptom of not
configuring the instance first is an error that looks something like this: AttributeError: type object
'Web3' has no attribute 'eth'.
To properly configure your Web3.py instance, specify which provider you’re using to connect to the Ethereum network.
An example configuration, if you’re connecting to a locally run node, might be:
>>> from web3 import Web3
>>> w3 = Web3(Web3.HTTPProvider('http://localhost:8545'))
2.7. Troubleshooting 91
Populus Documentation, Release 5.23.0
You can check that your instance is connected via the isConnected method:
>>> w3.isConnected()
False
There’s a variety of explanations for why you may see False here. If you’re running a local node, such as Geth,
double-check that you’ve indeed started the binary and that you’ve started it from the intended directory - particularly
if you’ve specified a relative path to its ipc file.
If that does not address your issue, it’s probable that you still have a Provider configuration issue. There are several
options for configuring a Provider, detailed here.
Often you don’t need to do this, just make a new account in Web3.py, and transfer funds from your MetaMask account
into it. But if you must. . .
Export your private key from MetaMask, and use the local private key tools in Web3.py to sign and send transactions.
See how to export your private key and Working with Local Private Keys.
Test networks usually have something called a “faucet” to help get test ether to people who want to use it. The faucet
simply sends you test ether when you visit a web page, or ping a chat bot, etc.
Each test network has its own version of test ether, so each one must maintain its own faucet. If you’re not sure which
test network to use, see Which network should I connect to?
Faucet mechanisms tend to come and go, so if any information here is out of date, try the Ethereum Stackexchange.
Here are some links to testnet ether instructions (in no particular order):
• Kovan
• Rinkeby
• Ropsten
If you’re seeing the error The method personal_newAccount does not exist/is not
available, you may be trying to create an account while connected to a remote node provider, like Infura.
As a matter of security, remote nodes cannot create accounts.
If you are in fact running a local node, make sure that it’s properly configured to accept personal methods. For Geth,
that looks something like: --http.api personal,eth,<etc> or --ws.api personal,eth,<etc> de-
pending on your configuration. Note that the IPC configuration is most secure and includes the personal API by
default.
In general, your options for accounts are:
• Run a node (e.g., Geth) locally, connect to it via the local port, then use the personal API.
• Import a keystore file for an account and extract the private key.
• Create an account via the eth-account API, e.g., new_acct = w3.eth.account.create().
• Use an external service (e.g., MyCrypto) to generate a new account, then securely import its private key.
Warning: Don’t store real value in an account until you are familiar with security best practices. If you lose your
private key, you lose your account!
Your Ethereum node JSON-RPC API might be slow when fetching multiple and large requests, especially when
running batch jobs. Here are some tips for how to speed up your web3.py application.
• Run your client locally, e.g., Go Ethereum or TurboGeth. The network latency and speed are the major limiting
factors for fast API access.
• Use IPC communication instead of HTTP/WebSockets. See Choosing How to Connect to Your Node.
• Use an optimised JSON decoder. A future iteration of Web3.py may change the default decoder or provide an
API to configure one, but for now, you may patch the provider class to use ujson.
import ujson
2.7. Troubleshooting 93
Populus Documentation, Release 5.23.0
Some Windows users that do not have Microsoft Visual C++ version 14.0 or greater installed may see an error message
when installing Web3.py as shown below:
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++
˓→Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
To fix this error, download and install Microsoft Visual C++ from here :
Microsoft Visual C++ Redistributable for Visual Studio
• x64 Visual C++
• x86 Visual C++
• ARM64 Visual C++
Local Node A local node is started and controlled by you. It is as safe as you keep it. When you run geth or
parity on your machine, you are running a local node.
Hosted Node A hosted node is controlled by someone else. When you connect to Infura, you are connected to a
hosted node.
Local Private Key A key is 32 bytes of data that you can use to sign transactions and messages, before sending
them to your node. You must use send_raw_transaction() when working with local keys, instead of
send_transaction() .
Hosted Private Key This is a common way to use accounts with local nodes. Each account returned by w3.eth.
accounts has a hosted private key stored in your node. This allows you to use send_transaction().
Warning: It is unnacceptable for a hosted node to offer hosted private keys. It gives other people complete control
over your account. “Not your keys, not your Ether” in the wise words of Andreas Antonopoulos.
A very common reason to work with local private keys is to interact with a hosted node.
Some common things you might want to do with a Local Private Key are:
• Sign a Transaction
• Sign a Contract Transaction
• Sign a Message
• Verify a Message
Using private keys usually involves w3.eth.account in one way or another. Read on for more, or see a full list of
things you can do in the docs for eth_account.Account.
with open('~/.ethereum/keystore/UTC--...--5ce9454909639D2D17A3F753ce7d93fa0b9aB12E')
˓→as keyfile:
encrypted_key = keyfile.read()
private_key = w3.eth.account.decrypt(encrypted_key, 'correcthorsebatterystaple')
# tip: do not save the key or password anywhere, especially into a shared source
˓→file
Warning: There is no single message format that is broadly adopted with community consensus. Keep an eye on
several options, like EIP-683, EIP-712, and EIP-719. Consider the w3.eth.sign() approach be deprecated.
For this example, we will use the same message hashing mechanism that is provided by w3.eth.sign().
r=104389933075820307925104709181714897380569894203213074526835978196648170704563,
s=28205917190874851400050446352651915501321657673772411533993420917949420456142,
v=28,
signature=HexBytes(
˓→'0xe6ca9bba58c88611fad66a6ce8f996908195593807c4b38bd528d2cff09d4eb33e5bfbbf4d3e39b1a2fd816a7680c19e
˓→'))
Sometimes, for historical reasons, you don’t have the original message, all you have is the prefixed & hashed message.
To verify it, use:
Caution: This method is deprecated, only having a hash typically indicates that you’re using some old kind of
mechanism. Expect this method to go away in the next major version upgrade.
>>> signature =
˓→'0xe6ca9bba58c88611fad66a6ce8f996908195593807c4b38bd528d2cff09d4eb33e5bfbbf4d3e39b1a2fd816a7680c19e
˓→'
Let’s say you want a contract to validate a signed message, like if you’re making payment channels, and you want to
validate the value in Remix or web3.js.
You might have produced the signed_message locally, as in Sign a Message. If so, this will prepare it for Solidity:
Instead, you might have received a message and a signature encoded to hex. Then this will prepare it for Solidity:
˓→'
contract Recover {
function ecr (bytes32 msgh, uint8 v, bytes32 r, bytes32 s) public pure
returns (address sender) {
return ecrecover(msgh, v, r, s);
}
}
Then call ecr with these arguments from Prepare message for ecrecover in Solidity in Remix,
"0x1476abb745d423bf09273f1afd887d951181d25adc66c4834a70491911b7f750", 28,
"0xe6ca9bba58c88611fad66a6ce8f996908195593807c4b38bd528d2cff09d4eb3",
"0x3e5bfbbf4d3e39b1a2fd816a7680c19ebebaf3a141b239934ad43cb33fcec8ce"
The message is verified, because we get the correct sender of the message back in response:
0x5ce9454909639d2d17a3f753ce7d93fa0b9ab12e.
Create a transaction, sign it locally, and then send it to your node for broadcasting, with
send_raw_transaction().
>>> transaction = {
... 'to': '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55',
... 'value': 1000000000,
... 'gas': 2000000,
... 'gasPrice': 234567897654321,
... 'nonce': 0,
... 'chainId': 1
... }
>>> key = '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318'
>>> signed = w3.eth.account.sign_transaction(transaction, key)
>>> signed.rawTransaction
HexBytes(
˓→'0xf86a8086d55698372431831e848094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008025a009ebb6ca05
˓→')
>>> signed.hash
HexBytes('0xd8f64a42b57be0d565f385378db2f6bf324ce14a594afc05de90436e9ce01f60')
>>> signed.r
4487286261793418179817841024889747115779324305375823110249149479905075174044
>>> signed.s
30785525769477805655994251009256770582792548537338581640010273753578382951464
>>> signed.v
37
# When you run send_raw_transaction, you get back the hash of the transaction:
>>> w3.eth.send_raw_transaction(signed.rawTransaction)
'0xd8f64a42b57be0d565f385378db2f6bf324ce14a594afc05de90436e9ce01f60'
# When running locally, execute the statements found in the file linked below to load
˓→the EIP20_ABI variable.
# See: https://github.com/carver/ethtoken.py/blob/v0.0.1-alpha.4/ethtoken/abi.py
>>> unicorn_txn
{'value': 0,
'chainId': 1,
'gas': 70000,
'gasPrice': 1000000000,
'nonce': 0,
'to': '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359',
'data':
˓→'0xa9059cbb000000000000000000000000fb6916095ca1df60bb79ce92ce3ea74c37c5d359000000000000000000000000
˓→'}
˓→')
>>> signed_txn.r
7104843568152743554992057394334744036860247658813231830421570918634460546288
>>> signed_txn.s
20971591154030974221209741174186570949918731455961098911091818811306894497524
>>> signed_txn.v
37
>>> w3.eth.send_raw_transaction(signed_txn.rawTransaction)
# When you run send_raw_transaction, you get the same result as the hash of the
˓→transaction:
>>> w3.toHex(w3.keccak(signed_txn.rawTransaction))
'0x4795adc6a719fa64fa21822630c0218c04996e2689ded114b6553cef1ae36618'
2.9 Filtering
Note: Most one-liners below assume w3 to be a web3.Web3 instance; obtainable, for example, with:
2.9. Filtering 99
Populus Documentation, Release 5.23.0
event_filter = mycontract.events.myEvent.createFilter(fromBlock='latest',
˓→argument_filters={'arg1':10})
existing_filter = w3.eth.filter(filter_id="0x0")
Note: Creating event filters requires that your Ethereum node has an API support enabled for filters. It does
not work with Infura nodes. To get event logs on Infura or other stateless nodes please see web3.contract.
ContractEvents.
class web3.utils.filters.BlockFilter(...)
BlockFilter is a subclass of Filter.
You can setup a filter for new blocks using web3.eth.filter('latest') which will return a new
BlockFilter object.
new_block_filter = w3.eth.filter('latest')
new_block_filter.get_new_entries()
class web3.utils.filters.TransactionFilter(...)
TransactionFilter is a subclass of Filter.
You can setup a filter for new blocks using web3.eth.filter('pending') which will return a new
BlockFilter object.
new_transaction_filter = w3.eth.filter('pending')
new_transaction_filter.get_new_entries()
You can set up a filter for event logs using the web3.py contract api: web3.contract.Contract.events.
your_event_name.createFilter(), which provides some conveniences for creating event log filters. Refer
to the following example:
event_filter = myContract.events.<event_name>.createFilter(fromBlock="latest
˓→", argument_filters={'arg1':10})
event_filter.get_new_entries()
event_signature_hash = web3.keccak(text="eventName(uint32)").hex()
event_filter = web3.eth.filter({
"address": myContract_address,
"topics": [event_signature_hash,
˓→"0x000000000000000000000000000000000000000000000000000000000000000a"],
})
The topics argument is order-dependent. For non-anonymous events, the first item in the topic list is always the
keccack hash of the event signature. Subsequent topic items are the hex encoded values for indexed event arguments.
In the above example, the second item is the arg1 value 10 encoded to its hex string representation.
In addition to being order-dependent, there are a few more points to recognize when specifying topic filters:
Given a transaction log with topics [A, B], the following topic filters will yield a match:
• [] “anything”
• [A] “A in first position (and anything after)”
• [None, B] “anything in first position AND B in second position (and anything after)”
You can query an Ethereum node for direct fetch of events, without creating a filter first. This works on all node types,
including Infura.
For examples see web3.contract.ContractEvents.getLogs().
Synchronous
def handle_event(event):
print(event)
def main():
block_filter = w3.eth.filter('latest')
log_loop(block_filter, 2)
if __name__ == '__main__':
main()
Starting with web3 version 4, the watch method was taken out of the web3 filter objects. There are many decisions
to be made when designing a system regarding threading and concurrency. Rather than force a decision, web3 leaves
these choices up to the user. Below are some example implementations of asynchronous filter-event handling that can
serve as starting points.
Beginning in python 3.5, the async and await built-in keywords were added. These provide a shared api for
coroutines that can be utilized by modules such as the built-in asyncio. Below is an example event loop using asyncio,
that polls multiple web3 filter object, and passes new entries to a handler.
def handle_event(event):
print(event)
# and whatever
def main():
block_filter = w3.eth.filter('latest')
tx_filter = w3.eth.filter('pending')
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(
asyncio.gather(
log_loop(block_filter, 2),
log_loop(tx_filter, 2)))
finally:
loop.close()
if __name__ == '__main__':
main()
Here is an extended version of above example, where the event loop is run in a separate thread, releasing the main
function for other tasks.
def main():
block_filter = w3.eth.filter('latest')
worker = Thread(target=log_loop, args=(block_filter, 5), daemon=True)
worker.start()
# .. do some other stuff
if __name__ == '__main__':
main()
Here are some other libraries that provide frameworks for writing asynchronous python:
• gevent
• twisted
• celery
2.10 Contracts
Smart contracts are programs deployed to the Ethereum network. See the ethereum.org docs for a proper introduction.
To run this example, you will need to install a few extra features:
• The sandbox node provided by eth-tester. You can install it with:
• py-solc-x. This is the supported route to installing the solidity compiler solc. You can install it with:
After py-solc-x is installed, you will need to install a version of solc. You can install the latest version via a new
REPL with:
You should now be set up to run the contract deployment example below:
# get abi
>>> abi = contract_interface['abi']
# web3.py instance
>>> w3 = Web3(Web3.EthereumTesterProvider())
# Wait for the transaction to be mined, and get the transaction receipt
>>> tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
>>> greeter.functions.greet().call()
'Hello'
These factories are not intended to be initialized directly. Instead, create contract objects using the w3.eth.
contract() method. By default, the contract factory is Contract. See the example in ConciseContract
for specifying an alternate factory.
class web3.contract.Contract(address)
Contract provides a default interface for deploying and interacting with Ethereum smart contracts.
The address parameter can be a hex address or an ENS name, like mycontract.eth.
class web3.contract.ConciseContract(Contract())
Warning: Deprecated: This method is deprecated in favor of the ContractCaller API or the verbose
syntax
This variation of Contract is designed for more succinct read access, without making write access more
wordy. This comes at a cost of losing access to features like deploy() and properties like address. It is rec-
ommended to use the classic Contract for those use cases. Just to be be clear, ConciseContract only exposes
contract functions and all other Contract class methods and properties are not available with the ConciseC-
ontract API. This includes but is not limited to contract.address, contract.abi, and contract.
deploy().
Create this type of contract by passing a Contract instance to ConciseContract:
This variation invokes all methods as a call, so if the classic contract had a method like contract.
functions.owner().call(), you could call it with concise.owner() instead.
For access to send a transaction or estimate gas, you can add a keyword argument like so:
class web3.contract.ImplicitContract(Contract())
This variation mirrors ConciseContract, but it invokes all methods as a transaction rather than a call, so
if the classic contract had a method like contract.functions.owner.transact(), you could call it
with implicit.owner() instead.
Create this type of contract by passing a Contract instance to ImplicitContract:
2.10.3 Properties
2.10.4 Methods
>>> transaction = {
'gasPrice': w3.eth.gas_price,
'chainId': None
}
>>> contract_data = token_contract.constructor(web3.eth.coinbase, 12345).
˓→buildTransaction(transaction)
>>> web3.eth.send_transaction(contract_data)
classmethod Contract.events.your_event_name.build_filter()
Creates a EventFilterBuilder instance with the event abi, and the contract address if called from a deployed
contract instance. The EventFilterBuilder provides a convenient way to construct the filter parameters with
value checking against the event abi. It allows for defining multiple match values or of single values through the
match_any and match_single methods.
filter_builder = myContract.events.myEvent.build_filter()
filter_builder.fromBlock = "latest"
filter_builder.args.clientID.match_any(1, 2, 3, 4)
filter_builder.args.region.match_single("UK")
filter_instance = filter_builder.deploy()
The deploy method returns a web3.utils.filters.LogFilter instance from the filter parameters
generated by the filter builder. Defining multiple match values for array arguments can be accomplished easily
with the filter builder:
filter_builder = myContract.events.myEvent.build_filter()
filter_builder.args.clientGroups.match_any((1, 3, 5,), (2, 3, 5), (1, 2, 3))
The filter builder blocks already defined filter parameters from being changed.
filter_builder = myContract.events.myEvent.build_filter()
filter_builder.fromBlock = "latest"
filter_builder.fromBlock = 0 # raises a ValueError
Warning: Deprecated: this method is deprecated in favor of constructor(), which provides more
flexibility.
˓→"0xea87152b00000000000000000000000000000000000000000000000000000000000000400000000000000000000
˓→"
classmethod Contract.all_functions()
Returns a list of all the functions present in a Contract where every function is an instance of
ContractFunction.
>>> contract.all_functions()
[<Function identity(uint256,bool)>, <Function identity(int256,bool)>]
classmethod Contract.get_function_by_signature(signature)
Searches for a distinct function with matching signature. Returns an instance of ContractFunction upon
finding a match. Raises ValueError if no match is found.
>>> contract.get_function_by_signature('identity(uint256,bool)')
<Function identity(uint256,bool)>
classmethod Contract.find_functions_by_name(name)
Searches for all function with matching name. Returns a list of matching functions where every function is an
instance of ContractFunction. Returns an empty list when no match is found.
>>> contract.find_functions_by_name('identity')
[<Function identity(uint256,bool)>, <Function identity(int256,bool)>]
classmethod Contract.get_function_by_name(name)
Searches for a distinct function with matching name. Returns an instance of ContractFunction upon
finding a match. Raises ValueError if no match is found or if multiple matches are found.
>>> contract.get_function_by_name('unique_name')
<Function unique_name(uint256)>
classmethod Contract.get_function_by_selector(selector)
Searches for a distinct function with matching selector. The selector can be a hexadecimal string, bytes or int.
Returns an instance of ContractFunction upon finding a match. Raises ValueError if no match is
found.
>>> contract.get_function_by_selector('0xac37eebb')
<Function identity(uint256)'>
>>> contract.get_function_by_selector(b'\xac7\xee\xbb')
<Function identity(uint256)'>
>>> contract.get_function_by_selector(0xac37eebb)
<Function identity(uint256)'>
classmethod Contract.find_functions_by_args(*args)
Searches for all function with matching args. Returns a list of matching functions where every function is an
instance of ContractFunction. Returns an empty list when no match is found.
classmethod Contract.get_function_by_args(*args)
Searches for a distinct function with matching args. Returns an instance of ContractFunction upon finding
a match. Raises ValueError if no match is found or if multiple matches are found.
>>> contract.get_function_by_args(1)
<Function unique_func_with_args(uint256)>
Note: Web3.py rejects the initialization of contracts that have more than one function with the same selector or signa-
ture. eg. blockHashAddendsInexpansible(uint256) and blockHashAskewLimitary(uint256)
have the same selector value equal to 0x00000000. A contract containing both of these functions will be rejected.
Below is an example of a contract that has multiple functions of the same name, and the arguments are ambiguous.
By default, web3 is not very strict when it comes to hex and bytes values. A bytes type will take a hex string, a
bytestring, or a regular python string that can be decoded as a hex. Additionally, if an abi specifies a byte size, but the
value that gets passed in is less than the specified size, web3 will automatically pad the value. For example, if an abi
specifies a type of bytes4, web3 will handle all of the following values:
However, you may want to be stricter with acceptable values for bytes types. For this you can use the w3.
enable_strict_bytes_type_checking() method, which is available on the web3 instance. A web3 in-
stance which has had this method invoked will enforce a stricter set of rules on which values are accepted.
• A Python string that is not prefixed with 0x will throw an error.
• A bytestring whose length not exactly the specified byte size will raise an error.
Table 3: Valid byte and hex strings for a strict bytes4 type
Input Normalizes to
'0x' b'\x00\x00\x00\x00'
'0x61626364' b'abcd'
'1234' b'1234'
Table 4: Invalid byte and hex strings with strict bytes4 type checking
Input Reason
'' Needs to be prefixed with a “0x” to be interpreted as an empty hex string
'1234' Needs to either be a bytestring (b’1234’) or be a hex value of the right size, prefixed
with 0x (in this case: ‘0x31323334’)
b'' Needs to have exactly 4 bytes
b'ab' Needs to have exactly 4 bytes
'0xab' Needs to have exactly 4 bytes
'0x6162636464' Needs to have exactly 4 bytes
>>> array_contract.functions.getBytes2Value().call()
[b'b\x00']
>>> array_contract.functions.setBytes2Value([b'a']).transact({'gas': 420000, 'gasPrice
˓→': 21000})
HexBytes('0x89f9b3a00651e406c568e85c1d2336c66b4ec40ba82c5e72726fbd072230a41c')
>>> array_contract.functions.getBytes2Value().call()
[b'a\x00']
>>> w3.enable_strict_bytes_type_checking()
>>> array_contract.functions.setBytes2Value([b'a']).transact()
Traceback (most recent call last):
...
ValidationError:
Could not identify the intended function with name `setBytes2Value`
class web3.contract.ContractFunction
The named functions exposed through the Contract.functions property are of the ContractFunction type. This
class is not to be used directly, but instead through Contract.functions.
For example:
If you have the function name in a variable, you might prefer this alternative:
func_to_call = 'multiply7'
contract_func = myContract.functions[func_to_call]
twentyone = contract_func(3).call()
ContractFunction provides methods to interact with contract functions. Positional and keyword arguments
supplied to the contract function subclass will be used to find the contract function by signature, and forwarded to the
contract function when applicable.
Methods
ContractFunction.transact(transaction)
Execute the specified function by sending a new public transaction.
Refer to the following invocation:
myContract.functions.myMethod(*args, **kwargs).transact(transaction)
The first portion of the function call myMethod(*args, **kwargs) selects the appropriate contract func-
tion based on the name and provided argument. Arguments can be provided as positional arguments, keyword
arguments, or a mix of the two.
The end portion of this function call transact(transaction) takes a single parame-
ter which should be a python dictionary conforming to the same format as the web3.eth.
send_transaction(transaction) method. This dictionary may not contain the keys data.
If any of the args or kwargs specified in the ABI are an address type, they will accept ENS names.
If a gas value is not provided, then the gas value for the method transaction will be created using the web3.
eth.estimate_gas() method.
Returns the transaction hash.
ContractFunction.call(transaction, block_identifier='latest')
Call a contract function, executing the transaction locally using the eth_call API. This will not create a new
public transaction.
Refer to the following invocation:
myContract.functions.myMethod(*args, **kwargs).call(transaction)
This method behaves the same as the ContractFunction.transact() method, with transaction details
being passed into the end portion of the function call, and function arguments being passed into the first portion.
Returns the return value of the executed function.
>>> my_contract.functions.multiply7(3).call()
21
>>> token_contract.functions.myBalance().call({'from': web3.eth.coinbase})
12345 # the token balance for `web3.eth.coinbase`
>>> token_contract.functions.myBalance().call({'from': web3.eth.accounts[1]})
54321 # the token balance for the account `web3.eth.accounts[1]`
You can call the method at a historical block using block_identifier. Some examples:
# or a block hash:
>>> token_contract.functions.myBalance().call(block_identifier=
˓→'0x4ff4a38b278ab49f7739d3a4ed4e12714386a9fdf72192f2e8f7da7822f10b4d')
˓→')
# You can check the state after your pending transactions (if supported by your
˓→node):
>>> token_contract.functions.myBalance().call(block_identifier='pending')
Passing the block_identifier parameter for past block numbers requires that your Ethereum API node is
running in the more expensive archive node mode. Normally synced Ethereum nodes will fail with a “missing
trie node” error, because Ethereum node may have purged the past state from its database. More information
about archival nodes here.
ContractFunction.estimateGas(transaction, block_identifier=None)
Call a contract function, executing the transaction locally using the eth_call API. This will not create a new
public transaction.
Refer to the following invocation:
myContract.functions.myMethod(*args, **kwargs).estimateGas(transaction)
This method behaves the same as the ContractFunction.transact() method, with transaction details
being passed into the end portion of the function call, and function arguments being passed into the first portion.
Returns the amount of gas consumed which can be used as a gas estimate for executing this transaction publicly.
>>> my_contract.functions.multiply7(3).estimateGas()
42650
Note: The parameter block_identifier is not enabled in geth nodes, hence passing a value of
block_identifier when connected to a geth nodes would result in an error like: ValueError:
{'code': -32602, 'message': 'too many arguments, want at most 1'}
ContractFunction.buildTransaction(transaction)
Builds a transaction dictionary based on the contract function call specified.
Refer to the following invocation:
myContract.functions.myMethod(*args, **kwargs).buildTransaction(transaction)
This method behaves the same as the Contract.transact() method, with transaction details being passed
into the end portion of the function call, and function arguments being passed into the first portion.
Note: nonce is not returned as part of the transaction dictionary unless it is specified in the first portion of the
function call:
You may use getTransactionCount() to get the current nonce for an account. Therefore a shortcut for
producing a transaction dictionary with nonce included looks like:
Returns a transaction dictionary. This transaction dictionary can then be sent using send_transaction().
Additionally, the dictionary may be used for offline transaction signing using sign_transaction().
>>> math_contract.functions.increment(5).buildTransaction({'gasPrice':
˓→21000000000})
{
'to': '0x6Bc272FCFcf89C14cebFC57B8f1543F5137F97dE',
'data':
˓→'0x7cf5dab00000000000000000000000000000000000000000000000000000000000000005',
'value': 0,
'gas': 43242,
'gasPrice': 21000000000,
'chainId': 1
}
Fallback Function
The Contract Factory also offers an API to interact with the fallback function, which supports four meth-
ods like normal functions:
Contract.fallback.call(transaction)
Call fallback function, executing the transaction locally using the eth_call API. This will not create a new
public transaction.
Contract.fallback.estimateGas(transaction)
Call fallback function and return the gas estimation.
Contract.fallback.transact(transaction)
Execute fallback function by sending a new public transaction.
Contract.fallback.buildTransaction(transaction)
Builds a transaction dictionary based on the contract fallback function call.
2.10.8 Events
class web3.contract.ContractEvents
The named events exposed through the Contract.events property are of the ContractEvents type. This class is
not to be used directly, but instead through Contract.events.
For example:
ContractEvent provides methods to interact with contract events. Positional and keyword arguments supplied to
the contract event subclass will be used to find the contract event by signature.
ContractEvents.myEvent(*args, **kwargs).processReceipt(transaction_receipt, errors=WARN)
Extracts the pertinent logs from a transaction receipt.
If there are no errors, processReceipt returns a tuple of Event Log Objects, emitted from the event (e.g.
myEvent), with decoded ouput.
>>> tx_hash = contract.functions.myFunction(12345).transact({'to':contract_
˓→address})
If there are errors, the logs will be handled differently depending on the flag that is passed in:
• WARN (default) - logs a warning to the console for the log that has an error, and discards the log. Returns
any logs that are able to be processed.
• STRICT - stops all processing and raises the error encountered.
• IGNORE - returns any raw logs that raised an error with an added “errors” field, along with any other logs
were able to be processed.
• DISCARD - silently discards any logs that have errors, and returns processed logs that don’t have errors.
An event log error flag needs to be imported from web3/logs.py.
>>> tx_hash = contract.functions.myFunction(12345).transact({'to':contract_
˓→address})
'address': '0xF2E246BB76DF876Cef8b38ae84130F4F55De395b',
'blockHash': HexBytes(
˓→'0xd74c3e8bdb19337987b987aee0fa48ed43f8f2318edfc84e3a8643e009592a68'),
'blockNumber': 3
})
)
>>> processed_logs
(
AttributeDict({
'type': 'mined',
'logIndex': 0,
'transactionIndex': 0,
'transactionHash': HexBytes(
˓→'0x01682095d5abb0270d11a31139b9a1f410b363c84add467004e728ec831bd529'),
'blockHash': HexBytes(
˓→'0x92abf9325a3959a911a2581e9ea36cba3060d8b293b50e5738ff959feb95258a'),
'blockNumber': 5,
(continues on next page)
'topics': [
HexBytes(
˓→'0xf70fe689e290d8ce2b2a388ac28db36fbb0e16a6d89c6804c461f65a1b40bb15')
],
'errors': LogTopicError('Expected 1 log topics. Got 0')})
})
)
>>> processed_logs = contract.events.myEvent().processReceipt(tx_receipt,
˓→errors=DISCARD)
ContractEvents.myEvent(*args, **kwargs).processLog(log)
Similar to processReceipt, but only processes one log at a time, instead of a whole transaction receipt. Will
return a single Event Log Object if there are no errors encountered during processing. If an error is encountered
during processing, it will be raised.
'address': '0xF2E246BB76DF876Cef8b38ae84130F4F55De395b',
'blockHash': HexBytes(
˓→'0xd74c3e8bdb19337987b987aee0fa48ed43f8f2318edfc84e3a8643e009592a68'),
'blockNumber': 3
})
The Event Log Object is a python dictionary with the following keys:
• args: Dictionary - The arguments coming from the event.
• event: String - The event name.
• logIndex: Number - integer of the log index position in the block.
• transactionIndex: Number - integer of the transactions index position log was created from.
• transactionHash: String, 32 Bytes - hash of the transactions this log was created from.
• address: String, 32 Bytes - address from which this log originated.
• blockHash: String, 32 Bytes - hash of the block where this log was in. null when it’s pending.
• blockNumber: Number - the block number where this log was in. null when it’s pending.
>>> transfer_filter.get_new_entries()
[AttributeDict({'args': AttributeDict({'from':
˓→'0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
'to': '0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
'value': 10}),
'event': 'Transfer',
'logIndex': 0,
'transactionIndex': 0,
'transactionHash': HexBytes(
˓→'0x0005643c2425552308b4a28814a4dedafb5d340a811b3d2b1c019b290ffd7410'),
'address': '0xF2E246BB76DF876Cef8b38ae84130F4F55De395b',
'blockHash': HexBytes('...'),
'blockNumber': 2})]
>>> transfer_filter.get_new_entries()
[]
>>> tx_hash = contract.functions.transfer(alice, 10).transact({'gas': 899000,
˓→'gasPrice': 200000})
'to': '0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
'value': 10}),
'event': 'Transfer',
'logIndex': 0,
'transactionIndex': 0,
'transactionHash': HexBytes(
˓→'0xea111a49b82b0a0729d49f9ad924d8f87405d01e3fa87463cf2903848aacf7d9'),
'address': '0xF2E246BB76DF876Cef8b38ae84130F4F55De395b',
'blockHash': HexBytes('...'),
'blockNumber': 3})]
>>> transfer_filter.get_all_entries()
[AttributeDict({'args': AttributeDict({'from':
˓→'0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
'to': '0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
'value': 10}),
'event': 'Transfer',
'logIndex': 0,
'transactionIndex': 0,
'transactionHash': HexBytes(
˓→'0x0005643c2425552308b4a28814a4dedafb5d340a811b3d2b1c019b290ffd7410'),
'address': '0xF2E246BB76DF876Cef8b38ae84130F4F55De395b',
'blockHash': HexBytes('...'),
'blockNumber': 2}),
AttributeDict({'args': AttributeDict({'from':
˓→'0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
'to': '0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
'value': 10}),
'event': 'Transfer',
'logIndex': 0,
'transactionIndex': 0,
'transactionHash': HexBytes(
˓→'0xea111a49b82b0a0729d49f9ad924d8f87405d01e3fa87463cf2903848aacf7d9'),
'address': '0xF2E246BB76DF876Cef8b38ae84130F4F55De395b',
'blockHash': HexBytes('...'),
'blockNumber': 3})]
2.10.9 Utils
classmethod Contract.decode_function_input(data)
Decodes the transaction data used to invoke a smart contract function, and returns ContractFunction and
decoded parameters as dict.
>>> transaction.input
'0x612e45a3000000000000000000000000b656b2a9c3b2416437a811e07466ca712f5a5b5a0000000000000000000
˓→
'
˓→
>>> contract.decode_function_input(transaction.input)
(<Function newProposal(address,uint256,string,bytes,uint256,bool)>,
{'_recipient': '0xB656b2a9c3b2416437A811e07466cA712F5a5b5a',
'_amount': 0,
'_description': b'lonely, so lonely',
'_transactionData': b'',
'_debatingPeriod': 604800,
'_newCurator': True})
2.10.10 ContractCaller
class web3.contract.ContractCaller
The ContractCaller class provides an API to call functions in a contract. This class is not to be used directly, but
instead through Contract.caller.
There are a number of different ways to invoke the ContractCaller.
For example:
And a transaction dictionary, with or without the transaction keyword. You can also optionally include a block
identifier. For example:
Like ContractFunction, ContractCaller provides methods to interact with contract functions. Positional
and keyword arguments supplied to the contract caller subclass will be used to find the contract function by signature,
and forwarded to the contract function when applicable.
Web3.py accepts struct arguments as dictionaries. This format also supports nested structs. Let’s take a look at a quick
example. Given the following Solidity contract:
contract Example {
address addr;
struct S1 {
address a1;
address a2;
}
struct S2 {
bytes32 b1;
bytes32 b2;
}
struct X {
S1 s1;
S2 s2;
address[] users;
}
>>> deployed_contract.functions.retrieve().call()
'0x0000000000000000000000000000000000000000'
>>> deployed_contract.functions.update({'s1': [
˓→'0x0000000000000000000000000000000000000001',
˓→[]}).transact()
>>> deployed_contract.functions.retrieve().call()
'0x0000000000000000000000000000000000000002'
There is a method on web3 that will enable stricter bytes type checking. The default is to allow Python
strings, and to allow bytestrings less than the specified byte size. To enable stricter checks, use w3.
enable_strict_bytes_type_checking(). This method will cause the web3 instance to raise an error if
a Python string is passed in without a “0x” prefix. It will also raise an error if the byte string or hex string is not
the exact number of bytes specified by the ABI type. See the Enabling Strict Checks for Bytes Types section for an
example and more details.
contract ManyTypes {
// booleans
bool public b;
// unsigned ints
uint8 public u8;
uint256 public u256;
uint256[] public u256s;
// addresses
address public addr;
address[] public addrs;
// bytes
bytes1 public b1;
// structs
struct S {
address sa;
bytes32 sb;
}
mapping(address => S) addrStructs;
Booleans
contract_instance.functions.updateBool(True).transact()
Unsigned Integers
contract_instance.functions.updateUint8(255).transact()
contract_instance.functions.updateUint256(2**256 - 1).transact()
contract_instance.functions.updateUintArray([1, 2, 3]).transact()
Signed Integers
contract_instance.functions.updateInt8(-128).transact()
Addresses
contract_instance.functions.updateAddr("0x0000000000000000000000000000000000000000").
˓→transact()
Bytes
contract_instance.functions.updateBytes1(HexBytes(255)).transact()
Structs
contract_instance.functions.updateMapping({"sa":
˓→"0x0000000000000000000000000000000000000000", "sb": HexBytes(123)}).transact()
2.12 Middleware
Web3 manages layers of middlewares by default. They sit between the public Web3 methods and the Providers, which
handle native communication with the Ethereum client. Each layer can modify the request and/or response. Some
middlewares are enabled by default, and others are available for optional use.
Each middleware layer gets invoked before the request reaches the provider, and then processes the result after the
provider returns, in reverse order. However, it is possible for a middleware to return early from a call without the
request ever getting to the provider (or even reaching the middlewares that are in deeper layers).
More information is available in the “Internals: Middlewares” section.
Some middlewares are added by default if you do not supply any. The defaults are likely to change regularly, so this list
may not include the latest version’s defaults. You can find the latest defaults in the constructor in web3/manager.
py
AttributeDict
web3.middleware.attrdict_middleware()
This middleware converts the output of a function from a dictionary to an AttributeDict
which enables dot-syntax access, like eth.get_block('latest').number in addition to eth.
get_block('latest')['number'].
web3.middleware.name_to_address_middleware()
This middleware converts Ethereum Name Service (ENS) names into the address that the name points to. For
example w3.eth.send_transaction will accept .eth names in the ‘from’ and ‘to’ fields.
Note: This middleware only converts ENS names if invoked with the mainnet (where the ENS contract is deployed),
for all other cases will result in an InvalidAddress error
Pythonic
web3.middleware.pythonic_middleware()
This converts arguments and returned values to python primitives, where appropriate. For example, it converts
the raw hex string returned by the RPC call eth_blockNumber into an int.
web3.middleware.gas_price_strategy_middleware()
Warning: Gas price strategy is only supported for legacy transactions. The London fork introduced
maxFeePerGas and maxPriorityFeePerGas transaction parameters which should be used over
gasPrice whenever possible.
This adds a gasPrice to transactions if applicable and when a gas price strategy has been set. See Gas Price API
for information about how gas price is derived.
web3.middleware.buffered_gas_estimate_middleware()
This adds a gas estimate to transactions if gas is not present in the transaction parameters. Sets gas
to: min(w3.eth.estimate_gas + gas_buffer, gas_limit) where the gas_buffer default is
100,000 Wei
HTTPRequestRetry
web3.middleware.http_retry_request_middleware()
This middleware is a default specifically for HTTPProvider that retries failed requests that return the
following errors: ConnectionError, HTTPError, Timeout, TooManyRedirects. Addition-
ally there is a whitelist that only allows certain methods to be retried in order to not resend trans-
actions, excluded methods are: eth_sendTransaction, personal_signAndSendTransaction,
personal_sendTransaction.
Middleware can be added, removed, replaced, and cleared at runtime. To make that easier, you can name the middle-
ware for later reference. Alternatively, you can use a reference to the middleware itself.
Middleware Order
Think of the middleware as being layered in an onion, where you initiate a web3.py request at the outermost layer of
the onion, and the Ethereum node (like geth or parity) receives and responds to the request inside the innermost layer
of the onion. Here is a (simplified) diagram:
|
|
v
`````Layer 2``````
``````` ```````
````` | ````
```` v ````
``` ```
`. ````````Layer 1``````` `.`
`` ```` ````` .`
`. ``` | ``` `.`
.` ``` v ``` `.
`. `.` ``` .`
`` .` `Layer 0` `` .`
`` `. ````` `````` . .`
`. `` ``` | ``` .` .
. `` `.` | `` . .
. `. `` JSON-RPC call .` . .`
. . `` | . `` .
`` . . v . . .
. .` . . . ``
. . . Ethereum node .` . .
. . . . . .
. `` `. | . . .
. . .` | .` . .
`. .` .` Response .` .` .
. . `.` | `.` `. .
`. . ``` | ```` `. .
. `. ````` v ```` `. ``
. .` ```Layer 0`` `` `.
. `. `.` `.
. `. | `.` `.
.` ``` | ``` .`
`. ``` v ```` `.`
`` `````` ````` .`
`` `````Layer 1````` `.`
``` ```
```` | ```
````` v ````
`````` `````
`````````Layer 2``````````
The middlewares are maintained in Web3.middleware_onion. See below for the API.
When specifying middlewares in a list, or retrieving the list of middlewares, they will be returned in the order of outer-
most layer first and innermost layer last. In the above example, that means that list(w3.middleware_onion)
would return the middlewares in the order of: [2, 1, 0].
See “Internals: Middlewares” for a deeper dive to how middlewares work.
Web3.middleware_onion.remove(middleware)
Middleware will be removed from whatever layer it was in. If you added the middleware with a name, use the
name to remove it. If you added the middleware as an object, use the object again later to remove it:
>>> w3 = Web3(...)
>>> w3.middleware_onion.remove(web3.middleware.pythonic_middleware)
# or
>>> w3.middleware_onion.remove('pythonic')
Web3.middleware_onion.replace(old_middleware, new_middleware)
Middleware will be replaced from whatever layer it was in. If the middleware was named, it will continue to
have the same name. If it was un-named, then you will now reference it with the new middleware object.
>>> from web3.middleware import pythonic_middleware, attrdict_middleware
>>> w3 = Web3(...)
Web3.middleware_onion.clear()
Empty all the middlewares, including the default ones.
>>> w3 = Web3(...)
>>> w3.middleware_onion.clear()
>>> assert len(w3.middleware_onion) == 0
Web3 ships with non-default middleware, for your custom use. In addition to the other ways of Configuring Middle-
ware, you can specify a list of middleware when initializing Web3, with:
Web3(middlewares=[my_middleware1, my_middleware2])
Warning: This will replace the default middlewares. To keep the default functionality, either use
middleware_onion.add() from above, or add the default middlewares to your list of new middlewares.
Stalecheck
web3.middleware.make_stalecheck_middleware(allowable_delay)
This middleware checks how stale the blockchain is, and interrupts calls with a failure if the blockchain is too
old.
• allowable_delay is the length in seconds that the blockchain is allowed to be behind of time.
time()
Because this middleware takes an argument, you must create the middleware with a method call.
two_day_stalecheck = make_stalecheck_middleware(60 * 60 * 24 * 2)
web3.middleware_onion.add(two_day_stalecheck)
If the latest block in the blockchain is older than 2 days in this example, then the middleware will raise a
StaleBlockchain exception on every call except web3.eth.get_block().
Cache
This middleware is required to connect to geth --dev or the Rinkeby public network.
The easiest way to connect to a default geth --dev instance which loads the middleware is:
This example connects to a local geth --dev instance on Linux with a unique IPC location and loads the middle-
ware:
# connect to the IPC location started with 'geth --dev --datadir ~/mynode'
>>> w3 = Web3(IPCProvider('~/mynode/geth.ipc'))
There is no strong community consensus on a single Proof-of-Authority (PoA) standard yet. Some nodes have suc-
cessful experiments running, though. One is go-ethereum (geth), which uses a prototype PoA for it’s development
mode and the Rinkeby test network.
Unfortunately, it does deviate from the yellow paper specification, which constrains the extraData field in each
block to a maximum of 32-bytes. Geth’s PoA uses more than 32 bytes, so this middleware modifies the block data a
bit before returning it.
This middleware provides an alternative to ethereum node managed filters. When used, Log and Block filter logic are
handled locally while using the same web3 filter api. Filter results are retrieved using JSON-RPC endpoints that don’t
rely on server state.
Signing
web3.middleware.construct_sign_and_send_raw_middleware(private_key_or_account)
This middleware automatically captures transactions, signs them, and sends them as raw transactions. The from field
on the transaction, or w3.eth.default_account must be set to the address of the private key for this middleware
to have any effect.
• private_key_or_account A single private key or a tuple, list or set of private keys.
Keys can be in any of the following formats:
– An eth_account.LocalAccount object
– An eth_keys.PrivateKey object
– A raw private key as a hex string or byte string
Now you can send a transaction from acct.address without having to build and sign each raw transaction.
When making use of this signing middleware, when sending EIP-1559 transactions (recommended over legacy
transactions), the transaction type of 2 (or '0x2') is necessary. This is because transaction signing is vali-
dated based on the transaction type parameter. This value defaults to '0x2' when maxFeePerGas and / or
maxPriorityFeePerGas are present as parameters in the transaction as these params imply a 1559-style transac-
tion. Since these values effectively replace the legacy gasPrice value, do not set a gasPrice for 1559 transactions.
Doing so will lead to validation issues.
>>> transaction_1559 = {
... 'type': '0x2', # optional - defaults to '0x2' when 1559 fee params are
˓→present
... }
>>> w3.eth.send_transaction(transaction_1559)
A legacy transaction still works in the same way as it did before EIP-1559 was introduced:
>>> legacy_transaction = {
... 'to': receiving_account_address,
... 'value': 22,
... 'gasPrice': 123456, # optional - if not provided, gas_price_strategy (if
˓→exists) or eth_gasPrice is used
... }
>>> w3.eth.send_transaction(legacy_transaction)
Warning: This section of the documentation is for advanced users. You should probably stay away from these
APIs if you don’t know what you are doing.
The Web3 library has multiple layers of abstraction between the public api exposed by the web3 object and the backend
or node that web3 is connecting to.
• Providers are responsible for the actual communication with the blockchain such as sending JSON-RPC re-
quests over HTTP or an IPC socket.
• Middlewares provide hooks for monitoring and modifying requests and responses to and from the provider.
These can be global operating on all providers or specific to one provider.
• Managers provide thread safety and primatives to allow for asynchronous usage of web3.
Here are some common things you might want to do with these APIs.
• Redirect certain RPC requests to different providers such as sending all read operations to a provider backed by
Infura and all write operations to a go-ethereum node that you control.
• Transparently intercept transactions sent over eth_sendTransaction, sign them locally, and then send
them through eth_sendRawTransaction.
• Modify the response from an RPC request so that it is returned in different format such as converting all integer
values to their hexadecimal representation.
• Validate the inputs to RPC requests
Each web3 RPC call passes through these layers in the following manner.
*********** ************
| Request | | Response |
*********** ************
| ^
v |
+-----------------------------+
| Manager |
+-----------------------------+
| ^
v |
+-----------------------------+
| Global Middlewares |
+-----------------------------+
| ^
v |
+-----------------------------+
| Provider Middlewares |
+-----------------------------+
| ^
v |
+-----------------------------+
| Provider |
+-----------------------------+
You can visualize this relationship like an onion, with the Provider at the center. The request originates from the
Manager, outside of the onion, passing down through each layer of the onion until it reaches the Provider at the center.
The Provider then handles the request, producing a response which will then pass back out from the center of the
onion, through each layer until it is finally returned by the Manager.
In the situation where web3 is operating with multiple providers the same lifecycle applies. The manager will iterate
over each provider, returning the response from the first provider that returns a response.
2.13.2 Providers
A provider is responsible for all direct blockchain interactions. In most cases this means interacting with the JSON-
RPC server for an ethereum node over HTTP or an IPC socket. There is however nothing which requires providers to
be RPC based, allowing for providers designed for testing purposes which use an in-memory EVM to fulfill requests.
Writing your own provider requires implementing two required methods as well as setting the middlewares the
provider should use.
BaseProvider.make_request(method, params)
Each provider class must implement this method. This method should return a JSON object with either a
'result' key in the case of success, or an 'error' key in the case of failure.
• method This will be a string representing the JSON-RPC method that is being called such as
'eth_sendTransaction'.
• params This will be a list or other iterable of the parameters for the JSON-RPC method being called.
BaseProvider.isConnected()
This function should return True or False depending on whether the provider should be considered con-
nected. For example, an IPC socket based provider should return True if the socket is open and False if the
socket is closed.
BaseProvider.middlewares
This should be an iterable of middlewares.
You can set a new list of middlewares by assigning to provider.middlewares, with the first middleware that
processes the request at the beginning of the list.
2.13.3 Middlewares
Note: The Middleware API in web3 borrows heavily from the Django middleware API introduced in version 1.10.0
Middlewares provide a simple yet powerful api for implementing layers of business logic for web3 requests. Writing
middleware is simple.
def simple_middleware(make_request, w3):
# do one-time setup operations here
# do post-processing here
class SimpleMiddleware:
def __init__(self, make_request, w3):
self.w3 = w3
self.make_request = make_request
# do post-processing here
The make_request parameter is a callable which takes two positional arguments, method and params which
correspond to the RPC method that is being called. There is no requirement that the make_request function be
called. For example, if you were writing a middleware which cached responses for certain methods your middleware
would likely not call the make_request method, but instead get the response from some local cache.
By default, Web3 will use the web3.middleware.pythonic_middleware. This middleware performs the
following translations for requests and responses.
• Numeric request parameters will be converted to their hexadecimal representation
• Numeric responses will be converted from their hexadecimal representations to their integer representations.
The RequestManager object exposes the middleware_onion object to manage middlewares. It is also exposed
on the Web3 object for convenience. That API is detailed in Configuring Middleware.
2.13.4 Managers
The Manager acts as a gatekeeper for the request/response lifecycle. It is unlikely that you will need to change the
Manager as most functionality can be implemented in the Middleware layer.
2.14 ethPM
2.14.1 Overview
This is a Python implementation of the Ethereum Smart Contract Packaging Specification V3, driven by discussions
in ERC 190, ERC 1123, ERC 1319.
Py-EthPM is being built as a low-level library to help developers leverage the ethPM spec. Including . . .
• Parse and validate packages.
2.14.2 Package
The Package object will function much like the Contract class provided by web3. Rather than instantiating the
base class provided by ethpm, you will instead use a classmethod which generates a new Package class for a
given package.
Package objects must be instantiated with a valid web3 object.
>>> w3 = Web3(Web3.EthereumTesterProvider())
>>> ethpm_spec_dir = get_ethpm_spec_dir()
>>> owned_manifest_path = ethpm_spec_dir / 'examples' / 'owned' / 'v3.json'
>>> OwnedPackage = Package.from_file(owned_manifest_path, w3)
>>> assert isinstance(OwnedPackage, Package)
For a closer look at how to interact with EthPM packages using web3, check out the examples page.
Properties
__repr__() → str
String readable representation of the Package.
>>> OwnedPackage.__repr__()
'<Package owned==1.0.0>'
property name
The name of this Package.
>>> OwnedPackage.name
'owned'
property version
The package version of a Package.
>>> OwnedPackage.version
'1.0.0'
property manifest_version
The manifest version of a Package.
>>> OwnedPackage.manifest_version
'ethpm/3'
property uri
The uri (local file_path / content-addressed URI) of a Package’s manifest.
property contract_types
All contract types included in this package.
build_dependencies
Return Dependencies instance containing the build dependencies available on this Package. The Package
class should provide access to the full dependency tree.
>>> owned_package.build_dependencies['zeppelin']
<ZeppelinPackage>
deployments
Returns a Deployments object containing all the deployment data and contract instances of a
Package’s contract_types. Automatically filters deployments to only expose those available on the cur-
rent Package.w3 instance.
package.deployments.get_instance("ContractType")
Package.w3
The Web3 instance currently set on this Package. The deployments available on a package are automatically
filtered to only contain those belonging to the currently set w3 instance.
Package.manifest
The manifest dict used to instantiate a Package.
Methods
• HTTP: https://api.github.com/repos/:owner/:repo/git/blobs/:file_sha
• Registry: erc1319://registry.eth:1/greeter?version=1.0.0
OwnedPackage = Package.from_uri('ipfs://
˓→QmbeVyFLSuEUxiXKwSsEjef7icpdTdA4kGG9BcrJXKNKUW', w3) # noqa: E501
Owned = OwnedPackage.get_contract_factory('owned')
In cases where a contract uses a library, the contract factory will have unlinked bytecode. The
ethpm package ships with its own subclass of web3.contract.Contract, ethpm.contract.
LinkableContract with a few extra methods and properties related to bytecode linking.
Validation
2.14.3 LinkableContract
Py-EthPM uses a custom subclass of Web3.contract.Contract to manage contract factories and instances
which might require bytecode linking. To create a deployable contract factory, both the contract type’s abi and
deploymentBytecode must be available in the Package’s manifest.
>>> w3 = Web3(Web3.EthereumTesterProvider())
>>> escrow_manifest_path = ASSETS_DIR / 'escrow' / 'with_bytecode_v3.json'
Properties
LinkableContract.unlinked_references
A list of link reference data for the deployment bytecode, if present in the manifest data used to generate a
LinkableContract factory. Deployment bytecode link reference data must be present in a manifest in
order to generate a factory for a contract which requires bytecode linking.
LinkableContract.linked_references
A list of link reference data for the runtime bytecode, if present in the manifest data used to generate a
LinkableContract factory. If you want to use the web3 Deployer tool for a contract, then runtime bytecode
link reference data must be present in a manifest.
LinkableContract.needs_bytecode_linking
A boolean attribute used to indicate whether a contract factory has unresolved link references, which must be
resolved before a new contract instance can be deployed or instantiated at a given address.
Methods
classmethod LinkableContract.link_bytecode(attr_dict)
This method returns a newly created contract factory with the applied link references defined in the
attr_dict. This method expects attr_dict to be of the type Dict[`contract_name`:
`address`] for all link references that are unlinked.
BaseURIBackend
Py-EthPM uses the BaseURIBackend as the parent class for all of its URI backends. To write your own backend,
it must implement the following methods.
BaseURIBackend.can_resolve_uri(uri)
Return a bool indicating whether or not this backend is capable of resolving the given URI to a manifest. A
content-addressed URI pointing to valid manifest is said to be capable of “resolving”.
BaseURIBackend.can_translate_uri(uri)
Return a bool indicating whether this backend class can translate the given URI to a corresponding content-
addressed URI. A registry URI is said to be capable of “translating” if it points to another content-addressed
URI in its respective on-chain registry.
BaseURIBackend.fetch_uri_contents(uri)
Fetch the contents stored at the provided uri, if an available backend is capable of resolving the URI. Validates
that contents stored at uri match the content hash suffixing the uri.
IPFS
Py-EthPM has multiple backends available to fetch/pin files to IPFS. The desired backend can be set via the environ-
ment variable: ETHPM_IPFS_BACKEND_CLASS.
• InfuraIPFSBackend (default)
– https://ipfs.infura.io
• IPFSGatewayBackend (temporarily deprecated)
– https://ipfs.io/ipfs/
• LocalIPFSBacked
– Connect to a local IPFS API gateway running on port 5001.
• DummyIPFSBackend
– Won’t pin/fetch files to an actual IPFS node, but mocks out this behavior.
BaseIPFSBackend.pin_assets(file_or_directory_path)
Pin asset(s) found at the given path and returns the pinned asset data.
HTTPS
https://api.github.com/repos/:owner/:repo/git/blobs/:file_sha
create_content_addressed_github_uri(uri)
This util function will return a content-addressed URI, as defined by Github’s blob scheme. To generate a
content-addressed URI for any manifest stored on github, this function requires accepts a Github API uri that
follows the following scheme.
https://api.github.com/repos/:owner/:repo/contents/:path/:to/manifest.json
Registry URIs
The URI to lookup a package from a registry should follow the following format. (subject to change as the Registry
Contract Standard makes it’s way through the EIP process)
scheme://address:chain_id/package_name@version
2.14.5 Builder
The manifest Builder is a tool designed to help construct custom manifests. The builder is still under active develop-
ment, and can only handle simple use-cases for now.
build(
{},
package_name(str),
version(str),
manifest_version(str), ...,
)
# Or
build(
(continues on next page)
The builder (i.e. build()) expects a dict as the first argument. This dict can be empty, or populated if you want to
extend an existing manifest.
>>> expected_manifest = {
... "name": "owned",
... "version": "1.0.0",
... "manifest": "ethpm/3"
... }
>>> base_manifest = {"name": "owned"}
>>> built_manifest = build(
... {},
... package_name("owned"),
... manifest_version("ethpm/3"),
... version("1.0.0"),
... )
>>> extended_manifest = build(
... base_manifest,
... manifest_version("ethpm/3"),
... version("1.0.0"),
... )
>>> assert built_manifest == expected_manifest
>>> assert extended_manifest == expected_manifest
With init_manifest(), which populates “manifest” with “ethpm/3” (the only supported EthPM specification
version), unless provided with an alternative “version”.
>>> build(
... init_manifest("owned", "1.0.0"),
... )
{'name': 'owned', 'version': '1.0.0', 'manifest': 'ethpm/3'}
To return a Package
build(
...,
as_package(w3: Web3),
)
By default, the manifest builder returns a dict representing the manifest. To return a Package instance (instantiated
with the generated manifest) from the builder, add the as_package() builder function with a valid web3 instance
to the end of the builder.
>>> w3 = Web3(Web3.EthereumTesterProvider())
>>> built_package = build(
... {},
(continues on next page)
To validate a manifest
build(
...,
validate(),
)
By default, the manifest builder does not perform any validation that the generated fields are correctly formatted. There are two
build(
...,
write_to_disk(
manifest_root_dir: Optional[Path],
manifest_name: Optional[str],
prettify: Optional[bool],
),
)
Writes the active manifest to disk. Will not overwrite an existing manifest with the same name and root directory.
Defaults - Writes manifest to current working directory (as returned by os.getcwd()) unless a Path is provided
as manifest_root_dir. - Writes manifest with a filename of <version>.json unless desired manifest name (which
must end in “.json”) is provided as manifest_name. - Writes the minified manifest version to disk unless prettify is set
to True
>>> from pathlib import Path
>>> import tempfile
>>> p = Path(tempfile.mkdtemp("temp"))
>>> build(
... {},
... package_name("owned"),
... manifest_version("ethpm/3"),
... version("1.0.0"),
... write_to_disk(manifest_root_dir=p, manifest_name="manifest.json",
˓→prettify=True),
... )
{'name': 'owned', 'manifest': 'ethpm/3', 'version': '1.0.0'}
>>> with open(str(p / "manifest.json")) as f:
... actual_manifest = f.read()
>>> print(actual_manifest)
{
"manifest": "ethpm/3",
"name": "owned",
"version": "1.0.0"
}
build(
...,
pin_to_ipfs(
backend: BaseIPFSBackend,
prettify: Optional[bool],
),
)
Pins the active manfiest to disk. Must be the concluding function in a builder set since it returns the IPFS pin data
rather than returning the manifest for further processing.
build(
...,
description(str),
license(str),
authors(*args: str),
keywords(*args: str),
links(*kwargs: str),
...,
)
... )
>>> assert expected_manifest == built_manifest
Compiler Output
To build a more complex manifest for solidity contracts, it is required that you provide standard-json output from the
solidity compiler. Or for a more convenient experience, use the EthPM CLI.
Here is an example of how to compile the contracts and generate the standard-json output. More information can be
found in the Solidity Compiler docs.
Sample standard-json-input.json
{
"language": "Solidity",
"sources": {
"Contract.sol": {
"urls": ["<path-to-contract>"]
}
},
"settings": {
"outputSelection": {
"*": {
"*": ["abi", "evm.bytecode.object"]
}
}
}
}
The compiler_output as used in the following examples is the entire value of the contracts key of the solc
output, which contains compilation data for all compiled contracts.
To add a source
# To inline a source
build(
...,
inline_source(
contract_name: str,
compiler_output: Dict[str, Any],
package_root_dir: Optional[Path]
),
...,
)
# To pin a source
build(
...,
pin_source(
contract_name: str,
compiler_output: Dict[str, Any],
ipfs_backend: BaseIPFSBackend,
package_root_dir: Optional[Path]
),
...,
)
Note: output_v3.json below is expected to be the standard-json output generated by the solidity compiler as
described here. The output must contain the abi and bytecode objects from compilation.
>>> expected_manifest = {
... "name": "owned",
... "version": "1.0.0",
... "manifest": "ethpm/3",
... "sources": {
... "./Owned.sol": {
... "content": """// SPDX-License-Identifier: MIT\npragma solidity ^0.6.8;\n\
˓→ncontract Owned """
To include the source as a content-addressed URI, Py-EthPM can pin your source via the Infura IPFS API. As well
as the contract name and compiler output, this function requires that you provide the desired IPFS backend to pin the
contract sources.
... )
>>> assert expected_manifest == built_manifest
>>> # With `source_pinner()` for multiple sources from the same compiler output
>>> pinner = source_pinner(compiler_output, ipfs_backend, package_root_dir=owned_dir)
>>> built_manifest = build(
... BASE_MANIFEST,
... pinner("Owned"),
... # pinner("other_source"), etc
... )
>>> assert expected_manifest == built_manifest
build(
...,
contract_type(
contract_name: str,
compiler_output: Dict[str, Any],
alias: Optional[str],
abi: Optional[bool],
compiler: Optional[bool],
contract_type: Optional[bool],
deployment_bytecode: Optional[bool],
devdoc: Optional[bool],
userdoc: Optional[bool],
source_id: Optional[bool],
runtime_bytecode: Optional[bool]
),
...,
)
The default behavior of the manifest builder’s contract_type() function is to populate the manifest with all of
the contract type data found in the compiler_output.
>>> expected_manifest = {
... 'name': 'owned',
... 'manifest': 'ethpm/3',
... 'version': '1.0.0',
... 'compilers': [
... {'name': 'solc', 'version': '0.6.8+commit.0bbfe453', 'settings': {'optimize':
˓→True}, 'contractTypes': ['Owned']}
... ],
... 'contractTypes': {
... 'Owned': {
... 'abi': [{'inputs': [], 'stateMutability': 'nonpayable', 'type': 'constructor
˓→'}],
... 'deploymentBytecode': {
... 'bytecode':
˓→'0x6080604052348015600f57600080fd5b50600080546001600160a01b03191633179055603f80602f6000396000f3fe60
˓→'
... },
... 'sourceId': 'Owned.sol',
... 'devdoc': {'methods': {}},
... 'userdoc': {'methods': {}}
... }
... }
... }
>>> built_manifest = build(
... BASE_MANIFEST,
... contract_type("Owned", compiler_output)
... )
>>> assert expected_manifest == built_manifest
To select only certain contract type data to be included in your manifest, provide the desired fields as True keyword arguments.
• abi
• compiler
• deployment_bytecode
• runtime_bytecode
• devdoc
• userdoc
• source_id
>>> expected_manifest = {
... 'name': 'owned',
... 'manifest': 'ethpm/3',
... 'version': '1.0.0',
... 'contractTypes': {
... 'Owned': {
... 'abi': [{'inputs': [], 'stateMutability': 'nonpayable', 'type': 'constructor
˓→'}],
... }
... }
... }
>>> built_manifest = build(
... BASE_MANIFEST,
... contract_type("Owned", compiler_output, abi=True)
... )
>>> assert expected_manifest == built_manifest
If you would like to alias your contract type, provide the desired alias as a kwarg. This will automatically include
the original contract type in a contractType field. Unless specific contract type fields are provided as kwargs,
contractType will stil default to including all availabe contract type data found in the compiler output.
>>> expected_manifest = {
... 'name': 'owned',
... 'manifest': 'ethpm/3',
... 'version': '1.0.0',
... 'contractTypes': {
... 'OwnedAlias': {
... 'abi': [{'inputs': [], 'stateMutability': 'nonpayable', 'type': 'constructor
˓→'}],
To add a deployment
build(
...,
deployment(
block_uri,
contract_instance,
contract_type,
address,
transaction=None,
block=None,
deployment_bytecode=None,
runtime_bytecode=None,
compiler=None,
),
...,
)
>>> expected_manifest = {
... 'name': 'owned',
... 'manifest': 'ethpm/3',
... 'version': '1.0.0',
... 'deployments': {
... 'blockchain://
˓→1234567890123456789012345678901234567890123456789012345678901234/block/
˓→1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef': {
... 'Owned': {
... 'contractType': 'Owned',
... 'address': '0x4F5B11C860B37B68De6d14FB7e7b5f18A9a1BD00',
... }
... }
... }
... }
>>> built_manifest = build(
... BASE_MANIFEST,
... deployment(
... block_uri='blockchain://
˓→1234567890123456789012345678901234567890123456789012345678901234/block/
˓→1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
... contract_instance='Owned',
... contract_type='Owned',
... address='0x4F5B11C860B37B68De6d14FB7e7b5f18A9a1BD00',
... ),
... )
>>> assert expected_manifest == built_manifest
˓→"
},
runtime_bytecode = {
"bytecode":
˓→"0x6080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000
˓→"
},
compiler = {
"name": "solc",
"version": "0.4.24+commit.e67f0147.Emscripten.clang",
"settings": {
"optimize": True
}
}
)
manifest = build(
package_name("escrow"),
version("1.0.0"),
manifest_version("ethpm/3"),
owned_type(
block_uri='blockchain://
˓→abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd/block/
˓→1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
address=owned_testnet_address,
),
owned_type(
block_uri='blockchain://
˓→1234567890123456789012345678901234567890123456789012345678901234/block/
˓→1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
address=owned_mainnet_address,
transaction=owned_mainnet_transaction,
block=owned_mainnet_block,
),
escrow_type(
block_uri='blockchain://
˓→abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd/block/
˓→1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
address=escrow_testnet_address,
),
escrow_type(
(continues on next page)
˓→1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
address=escrow_mainnet_address,
transaction=escrow_mainnet_transaction,
),
)
build(
...,
build_dependency(
package_name,
uri,
),
...,
)
build_dependency(package_name, uri)
To add a build dependency to your manifest, just provide the package’s name and a supported, content-addressed URI.
>>> expected_manifest = {
... 'name': 'owned',
... 'manifest': 'ethpm/3',
... 'version': '1.0.0',
... 'buildDependencies': {
... 'owned': 'ipfs://QmbeVyFLSuEUxiXKwSsEjef6icpdTdA4kGG9BcrJXKNKUW',
... }
... }
>>> built_manifest = build(
... BASE_MANIFEST,
... build_dependency('owned', 'ipfs://
˓→QmbeVyFLSuEUxiXKwSsEjef6icpdTdA4kGG9BcrJXKNKUW'),
... )
>>> assert expected_manifest == built_manifest
2.14.6 Checker
The manifest Checker is a tool designed to help validate manifests according to the natural language spec (link).
To validate a manifest
˓→only include contract types that can be found in the source files for this package.
(continues on next page)
˓→Packages should not include contract types from dependencies. Packages should not
The Ethereum Name Service is analogous to the Domain Name Service. It enables users and developers to use human-
friendly names in place of error-prone hexadecimal addresses, content hashes, and more.
The ens module is included with web3.py. It provides an interface to look up an address from a name, set up your
own address, and more.
2.15.1 Setup
# automatic detection
from ens.auto import ns
provider = IPCProvider(...)
ns = ENS(provider)
w3 = Web3(...)
ns = ENS.fromWeb3(w3)
2.15.2 Usage
Name info
eth_address = ns.address('jasoncarver.eth')
The ENS module has no opinion as to which TLD you can use, but will not infer a TLD if it is not provided with the
name.
domain = ns.name('0x5B2063246F2191f18F2675ceDB8b28102e957458')
# confirm that the name resolves back to the address that you looked up:
eth_address = ns.owner('exchange.eth')
Do you want to set up your name so that address() will show the address it points to?
ns.setup_address('jasoncarver.eth', '0x5B2063246F2191f18F2675ceDB8b28102e957458')
You must already be the owner of the domain (or its parent).
In the common case where you want to point the name to the owning address, you can skip the address
ns.setup_address('jasoncarver.eth')
You can claim arbitrarily deep subdomains. Gas costs scale up with the number of subdomains!
ns.setup_address('supreme.executive.power.derives.from.a.mandate.from.the.masses.
˓→jasoncarver.eth')
assert ns.address('supreme.executive.power.derives.from.a.mandate.from.the.masses.
˓→jasoncarver.eth') == \
'0x5B2063246F2191f18F2675ceDB8b28102e957458'
Do you want to set up your address so that name() will show the name that points to it?
This is like Caller ID. It enables you and others to take an account and determine what name points to it. Sometimes
this is referred to as “reverse” resolution.
ns.setup_name('jasoncarver.eth', '0x5B2063246F2191f18F2675ceDB8b28102e957458')
If you don’t supply the address, setup_name() will assume you want the address returned by address().
ns.setup_name('jasoncarver.eth')
If the name doesn’t already point to an address, setup_name() will call setup_address() for you.
Wait for the transaction to be mined, then:
assert ns.name('0x5B2063246F2191f18F2675ceDB8b28102e957458') == 'jasoncarver.eth'
Web3.py follows Semantic Versioning, which means that version 5 introduced backwards-incompatible changes. If
your project depends on Web3.py v4, then you’ll probably need to make some changes.
Here are the most common required updates:
JSON-RPC Updates
In v4, JSON-RPC calls that looked up transactions or blocks and didn’t find them, returned None. Now if a transaction
or block is not found, a BlockNotFound or a TransactionNotFound error will be thrown as appropriate. This
applies to the following web3 methods:
• getTransaction() will throw a TransactionNotFound error
• getTransactionReceipt() will throw a TransactionNotFound error
• getTransactionByBlock() will throw a TransactionNotFound error
Removed Methods
Deprecated Methods
The ConciseContract and ImplicitContract have been deprecated and will be removed in v6.
ImplicitContract instances will need to use the verbose syntax. For example:
contract.functions.<function name>.transact({})
ConciseContract has been replaced with the ContractCaller API. Instead of using the ConciseContract factory, you can
now use:
contract.caller.<function_name>
or the classic contract syntax:
contract.functions.<function name>.call().
Some more concrete examples can be found in the ContractCaller docs
Manager Provider
In v5, only a single provider will be allowed. While allowing multiple providers is a feature we’d like to support in
the future, the way that multiple providers was handled in v4 wasn’t ideal. The only thing they could do was fall
back. There was no mechanism for any round robin, nor was there any control around which provider was chosen.
Eventually, the idea is to expand the Manager API to support injecting custom logic into the provider selection process.
For now, manager.providers has changed to manager.provider. Similarly, instances of web3.
providers have been changed to web3.provider.
Testnet Changes
Web3.py will no longer automatically look up a testnet connection in IPCProvider. Something like from web3.
auto.infura.ropsten import w3 should be used instead.
2.16.4 ENS
Web3.py has stopped inferring the .eth TLD on domain names. If a domain name is used instead of an address,
you’ll need to specify the TLD. An InvalidTLD error will be thrown if the TLD is missing.
In order to interact with Infura after March 27, 2019, you’ll need to set an environment variable called
WEB3_INFURA_PROJECT_ID. You can get a project id by visiting https://infura.io/register.
Web3.py follows Semantic Versioning, which means that version 4 introduced backwards-incompatible changes. If
your project depends on Web3.py v3, then you’ll probably need to make some changes.
Here are the most common required updates:
Only Python 3 is supported in v4. If you are running in Python 2, it’s time to upgrade. We recommend using 2to3
which can make most of your code compatible with Python 3, automatically.
The most important update, relevant to Web3.py, is the new bytes type. It is used regularly, throughout the library,
whenever dealing with data that is not guaranteed to be text.
Many different methods in Web3.py accept text or binary data, like contract methods, transaction details, and crypto-
graphic functions. The following example uses sha3(), but the same pattern applies elsewhere.
In v3 & Python 2, you might have calculated the hash of binary data this way:
>>> Web3.sha3('I\xe2\x99\xa5SF')
'0x50a826df121f4d076a3686d74558f40082a8e70b3469d8e9a16ceb2a79102e5e'
Or, you might have calculated the hash of text data this way:
>>> Web3.sha3(text=u'ISF')
'0x50a826df121f4d076a3686d74558f40082a8e70b3469d8e9a16ceb2a79102e5e'
>>> Web3.sha3(b'I\xe2\x99\xa5SF')
HexBytes('0x50a826df121f4d076a3686d74558f40082a8e70b3469d8e9a16ceb2a79102e5e')
>>> Web3.sha3(text='ISF')
HexBytes('0x50a826df121f4d076a3686d74558f40082a8e70b3469d8e9a16ceb2a79102e5e')
Note that the return value is different too: you can treat hexbytes.main.HexBytes like any other bytes value,
but the representation on the console shows you the hex encoding of those bytes, for easier visual comparison.
It takes a little getting used to, but the new py3 types are much better. We promise.
2.17.2 Filters
Filters usually don’t work quite the way that people want them to.
The first step toward fixing them was to simplify them by removing the polling logic. Now, you must request an update
on your filters explicitly. That means that any exceptions during the request will bubble up into your code.
In v3, those exceptions (like “filter is not found”) were swallowed silently in the automated polling logic. Here was
the invocation for printing out new block hashes as they appear:
The caller is responsible for polling the results from get_new_entries(). See Asynchronous Filter Polling for
examples of filter-event handling with web3 v4.
These providers are fairly uncommon. If you don’t recognize the names, you can probably skip the section.
However, if you were using web3.py for testing contracts, you might have been using TestRPCProvider or
EthereumTesterProvider.
In v4 there is a new EthereumTesterProvider, and the old v3 implementation has been removed. Web3.py v4
uses eth_tester.main.EthereumTester under the hood, instead of eth-testrpc. While eth-tester is still
in beta, many parts are already in better shape than testrpc, so we decided to replace it in v4.
If you were using TestRPC, or were explicitly importing EthereumTesterProvider, like: from web3.providers.
tester import EthereumTesterProvider, then you will need to update.
With v4 you should import with from web3 import EthereumTesterProvider. As before, you’ll need to
install Web3.py with the tester extra to get these features, like:
Web3.toDecimal()
In v4 Web3.toDecimal() is renamed: toInt() for improved clarity. It does not return a decimal.Decimal,
it returns an int.
Removed Methods
Provider Access
There are a number of places where an arbitrary string input might be either a byte-string that has been hex-encoded,
or unicode characters in text. These are named hexstr and text in Web3.py. You specify which kind of str you
have by using the appropriate keyword argument. See examples in Encoding and Decoding Helpers.
In v3, some methods accepted a str as the first positional argument. In v4, you must pass strings as one of hexstr
or text keyword arguments.
Notable methods that no longer accept ambiguous strings:
• sha3()
• toBytes()
2.17.5 Contracts
• When a contract returns the ABI type string, Web3.py v4 now returns a str value by decoding the underlying
bytes using UTF-8.
• When a contract returns the ABI type bytes (of any length), Web3.py v4 now returns a bytes value
• Providers
• Attributes
• Encoding and Decoding Helpers
• Currency Conversions
• Addresses
• Cryptographic Hashing
• Check Encodability
• RPC APIS
class web3.Web3(provider)
Each web3 instance exposes the following APIs.
2.18.1 Providers
Web3.HTTPProvider
Convenience API to access web3.providers.rpc.HTTPProvider
Web3.IPCProvider
Convenience API to access web3.providers.ipc.IPCProvider
2.18.2 Attributes
Web3.api
Returns the current Web3 version.
>>> web3.api
"4.7.0"
Web3.clientVersion
• Delegates to web3_clientVersion RPC Method
Returns the current client version.
>>> web3.clientVersion
'Geth/v1.4.11-stable-fed692f6/darwin/go1.7'
>>> Web3.toText(0x636f776dc3b6)
'cowmö'
>>> Web3.toText(b'cowm\xc3\xb6')
'cowmö'
>>> Web3.toText(hexstr='0x636f776dc3b6')
'cowmö'
>>> Web3.toText(hexstr='636f776dc3b6')
'cowmö'
>>> Web3.toText(text='cowmö')
'cowmö'
>>> Web3.toBytes(0)
b'\x00'
>>> Web3.toBytes(0x000F)
b'\x0f'
>>> Web3.toBytes(b'')
b''
>>> Web3.toBytes(b'\x00\x0F')
b'\x00\x0f'
>>> Web3.toBytes(False)
b'\x00'
>>> Web3.toBytes(True)
b'\x01'
>>> Web3.toBytes(hexstr='0x000F')
b'\x00\x0f'
>>> Web3.toBytes(hexstr='000F')
b'\x00\x0f'
>>> Web3.toBytes(text='')
b''
>>> Web3.toBytes(text='cowmö')
b'cowm\xc3\xb6'
>>> Web3.toInt(0)
0
>>> Web3.toInt(0x000F)
15
(continues on next page)
Web3.toJSON(obj)
Takes a variety of inputs and returns its JSON equivalent.
>>> Web3.toJSON(3)
'3'
>>> Web3.toJSON({'one': 1})
'{"one": 1}'
Web3.toWei(value, currency)
Returns the value in the denomination specified by the currency argument converted to wei.
>>> Web3.toWei(1, 'ether')
1000000000000000000
Web3.fromWei(value, currency)
Returns the value in wei converted to the given currency. The value is returned as a Decimal to ensure precision
down to the wei.
>>> Web3.fromWei(1000000000000000000, 'ether')
Decimal('1')
2.18.5 Addresses
Web3.isAddress(value)
Returns True if the value is one of the recognized address formats.
• Allows for both 0x prefixed and non-prefixed values.
• If the address contains mixed upper and lower cased characters this function also checks if the address
checksum is valid according to EIP55
>>> Web3.isAddress('0xd3CdA913deB6f67967B99D67aCDFa1712C293601')
True
Web3.isChecksumAddress(value)
Returns True if the value is a valid EIP55 checksummed address
>>> Web3.isChecksumAddress('0xd3CdA913deB6f67967B99D67aCDFa1712C293601')
True
>>> Web3.isChecksumAddress('0xd3cda913deb6f67967b99d67acdfa1712c293601')
False
Web3.toChecksumAddress(value)
Returns the given address with an EIP55 checksum.
>>> Web3.toChecksumAddress('0xd3cda913deb6f67967b99d67acdfa1712c293601')
'0xd3CdA913deB6f67967B99D67aCDFa1712C293601'
>>> Web3.keccak(0x747874)
>>> Web3.keccak(b'\x74\x78\x74')
>>> Web3.keccak(hexstr='0x747874')
>>> Web3.keccak(hexstr='747874')
>>> Web3.keccak(text='txt')
HexBytes('0xd7278090a36507640ea6b7a0034b69b0d240766fa3f98e3722be93c613b29d2e')
HexBytes("0x2ff37b5607484cd4eecf6d13292e22bd6e5401eaffcc07e279583bc742c68882")
Returns the Keccak SHA256 of the given value. Text is encoded to UTF-8 before computing the hash, just like
Solidity. Any of the following are valid and equivalent:
>>> Web3.sha3(0x747874)
>>> Web3.sha3(b'\x74\x78\x74')
>>> Web3.sha3(hexstr='0x747874')
>>> Web3.sha3(hexstr='747874')
>>> Web3.sha3(text='txt')
HexBytes('0xd7278090a36507640ea6b7a0034b69b0d240766fa3f98e3722be93c613b29d2e')
Returns the sha3 as it would be computed by the solidity sha3 function on the provided value and
abi_types. The abi_types value should be a list of solidity type strings which correspond to each of
the provided values.
>>> Web3.soliditySha3(['bool'], [True])
HexBytes("0x5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2")
w3.is_encodable(_type, value)
Returns True if a value can be encoded as the given type. Otherwise returns False.
>>> from web3.auto.gethdev import w3
>>> w3.is_encodable('bytes2', b'12')
True
>>> w3.is_encodable('bytes2', b'1')
True
>>> w3.is_encodable('bytes2', '0x1234')
True
>>> w3.is_encodable('bytes2', b'123')
False
w3.enable_strict_bytes_type_checking()
Enables stricter bytes type checking. For more examples see Enabling Strict Checks for Bytes Types
>>> from web3.auto.gethdev import w3
>>> w3.enable_strict_bytes_type_checking()
(continues on next page)
'number': 4022281,
# ... etc ...
})
>>> block['number']
4022281
>>> block.number
4022281
2.19.1 Properties
Eth.default_block
The default block number that will be used for any RPC methods that accept a block identifier. Defaults to
'latest'.
Eth.defaultBlock
Eth.syncing
• Delegates to eth_syncing RPC Method
Returns either False if the node is not syncing or a dictionary showing sync status.
>>> web3.eth.syncing
AttributeDict({
'currentBlock': 2177557,
'highestBlock': 2211611,
'knownStates': 0,
'pulledStates': 0,
'startingBlock': 2177365,
})
Eth.coinbase
• Delegates to eth_coinbase RPC Method
Returns the current Coinbase address.
>>> web3.eth.coinbase
'0xd3CdA913deB6f67967B99D67aCDFa1712C293601'
Eth.mining
• Delegates to eth_mining RPC Method
Returns boolean as to whether the node is currently mining.
>>> web3.eth.mining
False
Eth.hashrate
• Delegates to eth_hashrate RPC Method
Returns the current number of hashes per second the node is mining with.
>>> web3.eth.hashrate
906
Eth.max_priority_fee
• Delegates to eth_maxPriorityFeePerGas RPC Method
Returns a suggestion for a max priority fee for dynamic fee transactions in Wei.
>>> web3.eth.max_priority_fee
2000000000
Eth.gas_price
• Delegates to eth_gasPrice RPC Method
Returns the current gas price in Wei.
>>> web3.eth.gas_price
20000000000
Eth.gasPrice
Eth.accounts
• Delegates to eth_accounts RPC Method
Returns the list of known accounts.
>>> web3.eth.accounts
['0xd3CdA913deB6f67967B99D67aCDFa1712C293601']
Eth.block_number
• Delegates to eth_blockNumber RPC Method
Returns the number of the most recent block
Alias for get_block_number()
>>> web3.eth.block_number
2206939
Eth.blockNumber
Eth.protocol_version
• Delegates to eth_protocolVersion RPC Method
Returns the id of the current Ethereum protocol version.
>>> web3.eth.protocol_version
'63'
Eth.protocolVersion
Eth.chain_id
• Delegates to eth_chainId RPC Method
Returns an integer value for the currently configured “Chain Id” value introduced in EIP-155. Returns None if
no Chain Id is available.
>>> web3.eth.chain_id
61
Eth.chainId
2.19.2 Methods
>>> web3.eth.get_balance('0xd3CdA913deB6f67967B99D67aCDFa1712C293601')
77320681768999138915
Eth.getBalance(account, block_identifier=eth.default_block)
Eth.get_block_number()
• Delegates to eth_blockNumber RPC Method
Returns the number of the most recent block.
>>> web3.eth.get_block_number()
2206939
˓→',
˓→'0xf90151a097b17a89fd2c03ee98cb6459c08f51b269da5cee46650e84470f62bf83b43efe80a03b269d284a4c3cf
˓→',
˓→'0xf869a020d13b52a61d3c1325ce3626a51418adebd6323d4840f1bdd93906359d11c933b846f8440180a01ab7c0b
˓→'
],
'balance': 0,
'codeHash':
˓→'0x551332d96d085185ab4019ad8bcf89c45321e136c261eb6271e574a2edf1461f',
'nonce': 1,
'storageHash':
˓→'0x1ab7c0b0a2a4bbb5a1495da8c142150891fc64e0c321e1feb70bd5f881951f7e',
'storageProof': [
AttributeDict({
'key': '0x00',
'value':
˓→'0x48656c6c6f00000000000000000000000000000000000000000000000000000a',
'proof': [
˓→'0xf9019180a01ace80e7bed79fbadbe390876bd1a7d9770edf9462049ef8f4b555d05715d53ea049347a3c2eac652
˓→',
˓→'0xf891808080a0c7d094301e0c54da37b696d85f72de5520b224ab2cf4f045d8db1a3374caf0488080a0fc5581783
˓→',
˓→'0xf843a0200decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563a1a048656c6c6f0000000
˓→'
]
(continues on next page)
The following example verifies that the values returned in the AttributeDict are included in the state of given
trie root.
from eth_utils import (
keccak,
)
import rlp
from rlp.sedes import (
Binary,
big_endian_int,
)
from trie import (
HexaryTrie,
)
from web3._utils.encoding import (
pad_bytes,
)
def format_proof_nodes(proof):
trie_proof = []
for rlp_node in proof:
trie_proof.append(rlp.decode(bytes(rlp_node)))
return trie_proof
class _Account(rlp.Serializable):
fields = [
('nonce', big_endian_int),
('balance', big_endian_int),
('storage', trie_root),
('code_hash', hash32)
]
acc = _Account(
proof.nonce, proof.balance, proof.storageHash, proof.codeHash
)
rlp_account = rlp.encode(acc)
trie_key = keccak(bytes.fromhex(proof.address[2:]))
return True
block = w3.eth.get_block(3391)
proof = w3.eth.get_proof('0x6C8f2A135f6ed072DE4503Bd7C4999a1a17F824B', [0, 1],
˓→3391)
Eth.get_code(account, block_identifier=eth.default_block)
• Delegates to eth_getCode RPC Method
Returns the bytecode for the given account at the block specified by block_identifier.
account may be a checksum address or an ENS name
Eth.getCode(account, block_identifier=eth.default_block)
Eth.get_block(block_identifier=eth.default_block, full_transactions=False)
• Delegates to eth_getBlockByNumber or eth_getBlockByHash RPC Methods
Returns the block specified by block_identifier. Delegates to eth_getBlockByNumber if
block_identifier is an integer or one of the predefined block parameters 'latest', 'earliest',
'pending', otherwise delegates to eth_getBlockByHash. Throws BlockNotFound error if the block
is not found.
If full_transactions is True then the 'transactions' key will contain full transactions objects.
Otherwise it will be an array of transaction hashes.
>>> web3.eth.get_block(2000000)
AttributeDict({
'difficulty': 49824742724615,
(continues on next page)
˓→',
'miner': '0x61c808d82a3ac53231750dadc13c777b59310bd9',
'nonce': '0x3b05c6d5524209f1',
'number': 2000000,
'parentHash':
˓→'0x57ebf07eb9ed1137d41447020a25e51d30a0c272b5896571499c82c33ecb7288',
'receiptRoot':
˓→'0x84aea4a7aad5c5899bd5cfc7f309cc379009d30179316a2a7baa4a2ea4a438ac',
'sha3Uncles':
˓→'0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
'size': 650,
'stateRoot':
˓→'0x96dbad955b166f5119793815c36f11ffa909859bbfeb64b735cca37cbf10bef1',
'timestamp': 1470173578,
'totalDifficulty': 44010101827705409388,
'transactions': [
˓→'0xc55e2b90168af6972193c1f86fa4d7d7b31a29c156665d15b9cd48618b5177ef'],
'transactionsRoot':
˓→'0xb31f174d27b99cdae8e746bd138a01ce60d8dd7b224f7c60845914def05ecc58',
'uncles': [],
})
Eth.getBlock(block_identifier=eth.default_block, full_transactions=False)
Eth.get_block_transaction_count(block_identifier)
• Delegates to eth_getBlockTransactionCountByNumber or
eth_getBlockTransactionCountByHash RPC Methods
Returns the number of transactions in the block specified by block_identifier. Delegates
to eth_getBlockTransactionCountByNumber if block_identifier is an integer or one
of the predefined block parameters 'latest', 'earliest', 'pending', otherwise delegates to
eth_getBlockTransactionCountByHash. Throws BlockNotFoundError if transactions are not
found.
>>> web3.eth.get_block_transaction_count(46147)
1
>>> web3.eth.get_block_transaction_count(
˓→'0x4e3a3754410177e6937ef1f84bba68ea139e8d1a2258c5f85db9f1cd715a1bdd') # block
˓→46147
Eth.getBlockTransactionCount(block_identifier)
Eth.getUncle(block_identifier)
Note: Method to get an Uncle from its hash is not available through RPC, a possible substitute is the method
Eth.get_uncle_by_block
Eth.get_uncle_by_block(block_identifier, uncle_index)
• Delegates to eth_getUncleByBlockHashAndIndex or eth_getUncleByBlockNumberAndIndex
RPC methods
Returns the uncle at the index specified by uncle_index from the block specified by block_identifier.
Delegates to eth_getUncleByBlockNumberAndIndex if block_identifier is an integer or one
of the predefined block parameters 'latest', 'earliest', 'pending', otherwise delegates to
eth_getUncleByBlockHashAndIndex. Throws BlockNotFound if the block is not found.
>>> web3.eth.get_uncle_by_block(56160, 0)
AttributeDict({
'author': '0xbe4532e1b1db5c913cf553be76180c1777055403',
'difficulty': '0x17dd9ca0afe',
'extraData': '0x476574682f686261722f76312e302e312f6c696e75782f676f312e342e32',
'gasLimit': '0x2fefd8',
'gasUsed': '0x0',
'hash': '0xc78c35720d930f9ef34b4e6fb9d02ffec936f9b02a8f0fa858456e4afd4d5614',
'logsBloom':
˓→'0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
˓→',
'miner': '0xbe4532e1b1db5c913cf553be76180c1777055403',
'mixHash': '0x041e14603f35a82f6023802fec96ef760433292434a39787514f140950597e5e',
'nonce': '0x5d2b7e3f1af09995',
'number': '0xdb5e',
'parentHash':
˓→'0xcc30e8a9b15c548d5bf113c834143a8f0e1909fbfea96b2a208dc154293a78cf',
'receiptsRoot':
˓→'0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
'sealFields': [
˓→'0xa0041e14603f35a82f6023802fec96ef760433292434a39787514f140950597e5e',
˓→'0x885d2b7e3f1af09995'],
'sha3Uncles':
˓→'0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
'timestamp': '0x55c6a972',
'totalDifficulty': '0xce4c4f0a0b810b',
'transactions': [],
'transactionsRoot':
˓→'0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
'uncles': []
})
Eth.getUncleByBlock(block_identifier, uncle_index)
Eth.get_uncle_count(block_identifier)
• Delegates to eth_getUncleCountByBlockHash or eth_getUncleCountByBlockNumber
RPC methods
Returns the (integer) number of uncles associated with the block specified by block_identifier.
Delegates to eth_getUncleCountByBlockNumber if block_identifier is an integer or one
of the predefined block parameters 'latest', 'earliest', 'pending', otherwise delegates to
eth_getUncleCountByBlockHash. Throws BlockNotFound if the block is not found.
>>> web3.eth.get_uncle_count(56160)
1
Eth.getUncleCount(block_identifier)
Eth.get_transaction(transaction_hash)
• Delegates to eth_getTransactionByHash RPC Method
Returns the transaction specified by transaction_hash. If the transaction has not yet been mined throws
web3.exceptions.TransactionNotFound.
>>> web3.eth.get_transaction(
˓→'0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060')
AttributeDict({
'blockHash':
˓→'0x4e3a3754410177e6937ef1f84bba68ea139e8d1a2258c5f85db9f1cd715a1bdd',
'blockNumber': 46147,
'from': '0xA1E4380A3B1f749673E270229993eE55F35663b4',
'gas': 21000,
'gasPrice': None,
'hash': '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060',
'input': '0x',
'maxFeePerGas': 2000000000,
'maxPriorityFeePerGas': 1000000000,
'nonce': 0,
'to': '0x5DF9B87991262F6BA471F09758CDE1c0FC1De734',
(continues on next page)
Eth.getTransaction(transaction_hash)
Eth.get_raw_transaction(transaction_hash)
• Delegates to eth_getRawTransactionByHash RPC Method
Returns the raw form of transaction specified by transaction_hash.
If no transaction is found, TransactionNotFound is raised.
>>> web3.eth.get_raw_transaction(
˓→'0x86fbfe56cce542ff0a2a2716c31675a0c9c43701725c4a751d20ee2ddf8a733d')
HexBytes(
˓→'0xf86907843b9aca0082520894dc544d1aa88ff8bbd2f2aec754b1f1e99e1812fd018086eecac466e115a0f9db4e2
˓→')
Eth.getTransactionFromBlock(block_identifier, transaction_index)
Eth.get_transaction_by_block(block_identifier, transaction_index)
• Delegates to eth_getTransactionByBlockNumberAndIndex or
eth_getTransactionByBlockHashAndIndex RPC Methods
Returns the transaction at the index specified by transaction_index from the block speci-
fied by block_identifier. Delegates to eth_getTransactionByBlockNumberAndIndex if
block_identifier is an integer or one of the predefined block parameters 'latest', 'earliest',
'pending', otherwise delegates to eth_getTransactionByBlockHashAndIndex. If the transaction
has not yet been mined throws web3.exceptions.TransactionNotFound.
>>> web3.eth.get_transaction_by_block(46147, 0)
AttributeDict({
'blockHash':
˓→'0x4e3a3754410177e6937ef1f84bba68ea139e8d1a2258c5f85db9f1cd715a1bdd',
'blockNumber': 46147,
'from': '0xA1E4380A3B1f749673E270229993eE55F35663b4',
'gas': 21000,
'gasPrice': None,
'hash': '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060',
'input': '0x',
'maxFeePerGas': 2000000000,
'maxPriorityFeePerGas': 1000000000,
'nonce': 0,
'to': '0x5DF9B87991262F6BA471F09758CDE1c0FC1De734',
'transactionIndex': 0,
(continues on next page)
AttributeDict({
'blockHash':
˓→'0x4e3a3754410177e6937ef1f84bba68ea139e8d1a2258c5f85db9f1cd715a1bdd',
'blockNumber': 46147,
'from': '0xA1E4380A3B1f749673E270229993eE55F35663b4',
'gas': 21000,
'gasPrice': None,
'hash': '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060',
'input': '0x',
'maxFeePerGas': 2000000000,
'maxPriorityFeePerGas': 1000000000,
'nonce': 0,
'to': '0x5DF9B87991262F6BA471F09758CDE1c0FC1De734',
'transactionIndex': 0,
'value': 31337,
})
Eth.getTransactionByBlock(block_identifier, transaction_index)
>>> web3.eth.wait_for_transaction_receipt(
˓→'0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060')
# If transaction is not yet in a block, time passes, while the thread sleeps...
# ...
# Then when the transaction is added to a block, its receipt is returned:
AttributeDict({
'blockHash':
˓→'0x4e3a3754410177e6937ef1f84bba68ea139e8d1a2258c5f85db9f1cd715a1bdd',
'blockNumber': 46147,
'contractAddress': None,
'cumulativeGasUsed': 21000,
'from': '0xA1E4380A3B1f749673E270229993eE55F35663b4',
'gasUsed': 21000,
'logs': [],
'logsBloom': '0x000000000000000000000000000000000000000000000000...0000',
'status': 1,
'to': '0x5DF9B87991262F6BA471F09758CDE1c0FC1De734',
'transactionHash':
˓→'0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060',
'transactionIndex': 0,
})
Eth.get_transaction_receipt(transaction_hash)
• Delegates to eth_getTransactionReceipt RPC Method
Returns the transaction receipt specified by transaction_hash. If the transaction has not yet been mined
throws web3.exceptions.TransactionNotFound.
If status in response equals 1 the transaction was successful. If it is equals 0 the transaction was reverted by
EVM.
>>> web3.eth.get_transaction_receipt(
˓→'0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060') # not
˓→yet mined
AttributeDict({
'blockHash':
˓→'0x4e3a3754410177e6937ef1f84bba68ea139e8d1a2258c5f85db9f1cd715a1bdd',
'blockNumber': 46147,
'contractAddress': None,
'cumulativeGasUsed': 21000,
'from': '0xA1E4380A3B1f749673E270229993eE55F35663b4',
'gasUsed': 21000,
'logs': [],
'logsBloom': '0x000000000000000000000000000000000000000000000000...0000',
'status': 1, # 0 or 1
'to': '0x5DF9B87991262F6BA471F09758CDE1c0FC1De734',
'transactionHash':
˓→'0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060',
'transactionIndex': 0,
})
Eth.getTransactionReceipt(transaction_hash)
Eth.get_transaction_count(account, block_identifier=web3.eth.default_block)
• Delegates to eth_getTransactionCount RPC Method
Returns the number of transactions that have been sent from account as of the block specified by
block_identifier.
account may be a checksum address or an ENS name
>>> web3.eth.get_transaction_count('0xd3CdA913deB6f67967B99D67aCDFa1712C293601')
340
Eth.getTransactionCount(account, block_identifier=web3.eth.default_block)
Eth.send_transaction(transaction)
• Delegates to eth_sendTransaction RPC Method
Signs and sends the given transaction
The transaction parameter should be a dictionary with the following fields.
• from: bytes or text, checksum address or ENS name - (optional, default: web3.eth.
defaultAccount) The address the transaction is sent from.
• to: bytes or text, checksum address or ENS name - (optional when creating new contract) The
address the transaction is directed to.
• gas: integer - (optional) Integer of the gas provided for the transaction execution. It will return unused
gas.
• maxFeePerGas: integer or hex - (optional) maximum amount you’re willing to pay, inclusive
of baseFeePerGas and maxPriorityFeePerGas. The difference between maxFeePerGas and
baseFeePerGas + maxPriorityFeePerGas is refunded to the user.
• maxPriorityFeePerGas: integer or hex - (optional) the part of the fee that goes to the miner
• gasPrice: integer - Integer of the gasPrice used for each paid gas LEGACY - unless you have good
reason to, use maxFeePerGas and maxPriorityFeePerGas instead.
• value: integer - (optional) Integer of the value send with this transaction
• data: bytes or text - The compiled code of a contract OR the hash of the invoked method signature
and encoded parameters. For details see Ethereum Contract ABI.
• nonce: integer - (optional) Integer of a nonce. This allows to overwrite your own pending transactions
that use the same nonce.
If the transaction specifies a data value but does not specify gas then the gas value will be populated
using the estimate_gas() function with an additional buffer of 100000 gas up to the gasLimit of the
latest block. In the event that the value returned by estimate_gas() method is greater than the gasLimit
a ValueError will be raised.
Eth.sendTransaction(transaction)
Eth.sign_transaction(transaction)
• Delegates to eth_signTransaction RPC Method.
Returns a transaction that’s been signed by the node’s private key, but not yet submitted. The signed tx can be
submitted with Eth.send_raw_transaction
˓→x0en\xb5\x99\xed;\xf6\x8f\xb3\xf1\xe6,\x82\xdf\xe5\x97lF|\x97%;\x15\xa04P\xb7=*\
˓→xef \t\xf0&\xbc\xbf\tz%z\xe7\xa3~\xb5\xd3\xb7=\xc0v\n\xef\xad+\x98\xe3'" #
˓→noqa: E501
Eth.signTransaction(transaction)
Eth.send_raw_transaction(raw_transaction)
• Delegates to eth_sendRawTransaction RPC Method
Sends a signed and serialized transaction. Returns the transaction hash as a HexBytes object.
Eth.sendRawTransaction(raw_transaction)
Eth.replace_transaction(transaction_hash, new_transaction)
• Delegates to eth_sendTransaction RPC Method
Sends a transaction that replaces the transaction with transaction_hash.
The transaction_hash must be the hash of a pending transaction.
The new_transaction parameter should be a dictionary with transaction fields as required by
send_transaction(). It will be used to entirely replace the transaction of transaction_hash without
using any of the pending transaction’s values.
If the new_transaction specifies a nonce value, it must match the pending transaction’s nonce.
If the new_transaction specifies maxFeePerGas and maxPriorityFeePerGas values, they must
be greater than the pending transaction’s values for each field, respectively.
• Legacy Transaction Support (Less Efficient - Not Recommended)
If the pending transaction specified a gasPrice value (legacy transaction), the gasPrice value for the
new_transaction must be greater than the pending transaction’s gasPrice.
If the new_transaction does not specify any of gasPrice, maxFeePerGas, or
maxPriorityFeePerGas values, one of the following will happen:
• If the pending transaction has a gasPrice value, this value will be used with a multiplier of 1.125 - This
is typically the minimum gasPrice increase a node requires before it accepts a replacement transaction.
• If a gas price strategy is set, the gasPrice value from the gas price strategy(See Gas Price API) will be
used.
• If none of the above, the client will ultimately decide appropriate values for maxFeePerGas and
maxPriorityFeePerGas. These will likely be default values and may result in an unsuccessful re-
placement of the pending transaction.
This method returns the transaction hash of the replacement transaction as a HexBytes object.
>>> tx = web3.eth.send_transaction({
'to': '0xd3CdA913deB6f67967B99D67aCDFa1712C293601',
'from': web3.eth.coinbase,
'value': 1000
})
HexBytes('0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331')
>>> web3.eth.replace_transaction(
˓→'0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331', {
'to': '0xd3CdA913deB6f67967B99D67aCDFa1712C293601',
'from': web3.eth.coinbase,
'value': 2000
})
HexBytes('0x4177e670ec6431606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1528989')
Eth.replaceTransaction(transaction_hash, new_transaction)
Eth.modify_transaction(transaction_hash, **transaction_params)
• Delegates to eth_sendTransaction RPC Method
Sends a transaction that modifies the transaction with transaction_hash.
transaction_params are keyword arguments that correspond to valid transaction parameters as required
by send_transaction(). The parameter values will override the pending transaction’s values to create the
replacement transaction to send.
The same validation and defaulting rules of replace_transaction() apply.
This method returns the transaction hash of the newly modified transaction as a HexBytes object.
>>> tx = web3.eth.send_transaction({
'to': '0xd3CdA913deB6f67967B99D67aCDFa1712C293601',
'from': web3.eth.coinbase,
'value': 1000
})
HexBytes('0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331')
>>> web3.eth.modify_transaction(
˓→'0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331', value=2000)
HexBytes('0xec6434e6701771606e55d6b4ca35a1a6b75ee3d73315145a921026d15299d05')
Eth.modifyTransaction(transaction_hash, **transaction_params)
>>> web3.eth.sign(
'0xd3CdA913deB6f67967B99D67aCDFa1712C293601',
text='some-text-tö-sign')
˓→'0x1a8bbe6eab8c72a219385681efefe565afd3accee35f516f8edf5ae82208fbd45a58f9f9116d8d88ba40fcd2907
˓→'
>>> web3.eth.sign(
'0xd3CdA913deB6f67967B99D67aCDFa1712C293601',
data=b'some-text-t\xc3\xb6-sign')
˓→'0x1a8bbe6eab8c72a219385681efefe565afd3accee35f516f8edf5ae82208fbd45a58f9f9116d8d88ba40fcd2907
˓→'
>>> web3.eth.sign(
'0xd3CdA913deB6f67967B99D67aCDFa1712C293601',
hexstr='0x736f6d652d746578742d74c3b62d7369676e')
˓→'0x1a8bbe6eab8c72a219385681efefe565afd3accee35f516f8edf5ae82208fbd45a58f9f9116d8d88ba40fcd2907
˓→'
Eth.sign_typed_data(account, jsonMessage)
• Delegates to eth_signTypedData RPC Method
Please note that the jsonMessage argument is the loaded JSON Object and NOT the JSON String itself.
Signs the Structured Data (or Typed Data) with the private key of the given account. The account
must be unlocked.
account may be a checksum address or an ENS name
Eth.signTypedData(account, jsonMessage)
>>> myContract.functions.setVar(1).transact()
HexBytes('0x79af0c7688afba7588c32a61565fd488c422da7b5773f95b242ea66d3d20afda')
>>> myContract.functions.getVar().call()
1
# The above call equivalent to the raw call:
>>> we3.eth.call({'value': 0, 'gas': 21736, 'maxFeePerGas': 2000000000,
˓→'maxPriorityFeePerGas': 1000000000, 'to':
HexBytes('0x0000000000000000000000000000000000000000000000000000000000000001')
In most cases it is better to make contract function call through the web3.contract.Contract interface.
Overriding state is a debugging feature available in Geth clients. View their usage documentation for a list of
possible parameters.
Eth.fee_history(block_count, newest_block, reward_percentiles=None)
• Delegates to eth_feeHistory RPC Method
Returns transaction fee data for up to 1,024 blocks.
Parameters
• block_count (int or hexstring) – The number of blocks in the requested range.
Depending on the client, this value should be either a int between 1 and 1024 or a
hexstring. Less than requested may be returned if not all blocks are available.
• newest_block (int or BlockParams) – The newest, highest-numbered, block in
the requested range. This value may be an int or one of the predefined block parameters
'latest', 'earliest', or 'pending'.
• reward_percentiles (List[float] or None) – (optional) A monotonically in-
creasing list of percentile float values to sample from each block’s effective priority fees
per gas in ascending order, weighted by gas used.
Returns An AttributeDict containing the following keys:
• oldestBlock (int) – The oldest, lowest-numbered, block in the range requested as a BlockNumber type
with int value.
• baseFeePerGas (List[Wei]) – An array of block base fees per gas. This includes the next block after the
newest of the returned range, because this value can be derived from the newest block. Zeroes are returned
for pre-EIP-1559 blocks.
• gasUsedRatio (List[float]) – An array of gasUsed/gasLimit float values for the requested blocks.
• reward (List[List[Wei]]) – (optional) A two-dimensional array of effective priority fees per gas at the
requested block percentiles.
})
Eth.estimate_gas(transaction, block_identifier=None)
• Delegates to eth_estimateGas RPC Method
Executes the given transaction locally without creating a new transaction on the blockchain. Returns amount of
gas consumed by execution which can be used as a gas estimate.
The transaction and block_identifier parameters are handled in the same manner as the
send_transaction() method.
21000
Eth.estimateGas(transaction, block_identifier=None)
Eth.generate_gas_price(transaction_params=None)
Uses the selected gas price strategy to calculate a gas price. This method returns the gas price denominated in
wei.
The transaction_params argument is optional however some gas price strategies may require it to be able
to produce a gas price.
>>> web3.eth.generate_gas_price()
20000000000
Note: For information about how gas price can be customized in web3 see Gas Price API.
Eth.generateGasPrice(transaction_params=None)
Eth.set_gas_price_strategy(gas_price_strategy)
Set the selected gas price strategy. It must be a method of the signature (web3, transaction_params)
and return a gas price denominated in wei.
Eth.setGasPriceStrategy(gas_price_strategy)
2.19.3 Filters
The following methods are available on the web3.eth object for interacting with the filtering API.
Eth.filter(filter_params)
• Delegates to eth_newFilter, eth_newBlockFilter, and eth_newPendingTransactionFilter
RPC Methods.
This method delegates to one of three RPC methods depending on the value of filter_params.
• If filter_params is the string 'pending' then a new filter is registered using the
eth_newPendingTransactionFilter RPC method. This will create a new filter that will be called
for each new unmined transaction that the node receives.
• If filter_params is the string 'latest' then a new filter is registered using the
eth_newBlockFilter RPC method. This will create a new filter that will be called each time the
node receives a new block.
• If filter_params is a dictionary then a new filter is registered using the eth_newFilter RPC
method. This will create a new filter that will be called for all log entries that match the provided
filter_params.
This method returns a web3.utils.filters.Filter object which can then be used to either directly
fetch the results of the filter or to register callbacks which will be called with each result of the filter.
When creating a new log filter, the filter_params should be a dictionary with the following keys.
• fromBlock: integer/tag - (optional, default: “latest”) Integer block number, or “latest” for the last
mined block or “pending”, “earliest” for not yet mined transactions.
• toBlock: integer/tag - (optional, default: “latest”) Integer block number, or “latest” for the last
mined block or “pending”, “earliest” for not yet mined transactions.
• address: string or list of strings, each 20 Bytes - (optional) Contract address or a list of addresses
from which logs should originate.
• topics: list of 32 byte strings or null - (optional) Array of topics that should be used for filtering.
Topics are order-dependent. This parameter can also be a list of topic lists in which case filtering will
match any of the provided topic arrays.
See Filtering for more information about filtering.
>>> web3.eth.filter('latest')
<BlockFilter at 0x10b72dc28>
>>> web3.eth.filter('pending')
<TransactionFilter at 0x10b780340>
>>> web3.eth.filter({'fromBlock': 1000000, 'toBlock': 1000100, 'address':
˓→'0x6C8f2A135f6ed072DE4503Bd7C4999a1a17F824B'})
<LogFilter at 0x10b7803d8>
Eth.get_filter_changes(self, filter_id)
• Delegates to eth_getFilterChanges RPC Method.
Returns all new entries which occurred since the last call to this method for the given filter_id
'blockNumber': 2217196,
'data':
˓→'0x0000000000000000000000000000000000000000000000000000000000000001',
'logIndex': 0,
'topics': [
˓→'0xe65b00b698ba37c614af350761c735c5f4a82b4ab365a1f1022d49d9dfc8e930',
'0x000000000000000000000000754c50465885f1ed1fa1a55b95ee8ecf3f1f4324',
'0x296c7fb6ccafa3e689950b947c2895b07357c95b066d5cdccd58c301f41359a3'],
'transactionHash':
˓→'0xfe1289fd3915794b99702202f65eea2e424b2f083a12749d29b4dd51f6dce40d',
'transactionIndex': 1,
},
...
]
Eth.getFilterChanges(self, filter_id)
Eth.get_filter_logs(self, filter_id)
• Delegates to eth_getFilterLogs RPC Method.
Returns all entries for the given filter_id
'blockNumber': 2217196,
'data':
˓→'0x0000000000000000000000000000000000000000000000000000000000000001',
'logIndex': 0,
'topics': [
˓→'0xe65b00b698ba37c614af350761c735c5f4a82b4ab365a1f1022d49d9dfc8e930',
'0x000000000000000000000000754c50465885f1ed1fa1a55b95ee8ecf3f1f4324',
'0x296c7fb6ccafa3e689950b947c2895b07357c95b066d5cdccd58c301f41359a3'],
'transactionHash':
˓→'0xfe1289fd3915794b99702202f65eea2e424b2f083a12749d29b4dd51f6dce40d',
'transactionIndex': 1,
},
...
]
Eth.getFilterLogs(self, filter_id)
Eth.uninstall_filter(self, filter_id)
• Delegates to eth_uninstallFilter RPC Method.
Uninstalls the filter specified by the given filter_id. Returns boolean as to whether the filter was success-
fully uninstalled.
Eth.uninstallFilter(self, filter_id)
Eth.get_logs(filter_params)
This is the equivalent of: creating a new filter, running get_filter_logs(), and then uninstalling the filter.
See filter() for details on allowed filter parameters.
Eth.getLogs(filter_params)
Eth.submit_hashrate(hashrate, nodeid)
• Delegates to eth_submitHashrate RPC Method
>>> node_id = '59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c'
>>> web3.eth.submit_hashrate(5000, node_id)
True
Eth.submitHashrate(hashrate, nodeid)
2.19.4 Contracts
w3 = Web3(...)
contract = w3.eth.contract(address='0x000000000000000000000000000000000000dEaD',
˓→abi=...)
Note: If you use an ENS name to initialize a contract, the contract will be looked up by name on each use. If
the name could ever change maliciously, first Look up the address for an ENS name, and then create the contract
with the checksum address.
If address is not provided, the newly created contract class will be returned. That class will then be initialized
by supplying the address.
w3 = Web3(...)
Contract = w3.eth.contract(abi=...)
contract_name will be used as the name of the contract class. If it is None then the name of the
ContractFactoryClass will be used.
ContractFactoryClass will be used as the base Contract class.
The following arguments are accepted for contract class creation.
• abi
• asm
• ast
• bytecode
• bytecode_runtime
• clone_bin
• dev_doc
• interface
• metadata
• opcodes
• src_map
• src_map_runtime
• user_doc
See Contracts for more information about how to use contracts.
Eth.set_contract_factory(contractFactoryClass)
Modify the default contract factory from Contract to contractFactoryClass. Future calls to Eth.
contract() will then default to contractFactoryClass.
An example of an alternative Contract Factory is ConciseContract.
Eth.setContractFactory(contractFactoryClass)
Warning: This API Is experimental. Client support is incomplete and the API itself is still evolving.
To use this API, you’ll need a beacon node running locally or remotely. To set that up, refer to the documentation of
your specific client.
Once you have a running beacon node, import and configure your beacon instance:
2.20.1 Methods
Beacon.get_genesis()
>>> beacon.get_genesis()
{
'data': {
'genesis_time': '1605700807',
'genesis_validators_root':
˓→'0x9436e8a630e3162b7ed4f449b12b8a5a368a4b95bc46b941ae65c11613bfa4c1',
'genesis_fork_version': '0x00002009'
}
}
Beacon.get_hash_root(state_id='head')
>>> beacon.get_hash_root()
{
"data": {
"root":"0xbb399fda70617a6f198b3d9f1c1cdbd70077677231b84f34e58568c9dc903558"
}
}
Beacon.get_fork_data(state_id='head')
>>> beacon.get_fork_data()
{
'data': {
'previous_version': '0x00002009',
'current_version': '0x00002009',
(continues on next page)
Beacon.get_finality_checkpoint(state_id='head')
>>> beacon.get_finality_checkpoint()
{
'data': {
'previous_justified': {
'epoch': '5024',
'root': '0x499ba555e8e8be639dd84be1be6d54409738facefc662f37d97065aa91a1a8d4'
},
'current_justified': {
'epoch': '5025',
'root': '0x34e8a230f11536ab2ec56a0956e1f3b3fd703861f96d4695877eaa48fbacc241'
},
'finalized': {
'epoch': '5024',
'root': '0x499ba555e8e8be639dd84be1be6d54409738facefc662f37d97065aa91a1a8d4'
}
}
}
Beacon.get_validators(state_id='head')
>>> beacon.get_validators()
{
'data': [
{
'index': '110280',
'balance': '32000000000',
'status': 'pending_queued',
'validator': {
'pubkey':
˓→'0x99d37d1f7dd15859995330f75c158346f86d298e2ffeedfbf1b38dcf3df89a7dbd1b34815f3bcd1b2a5588592a3
˓→',
'withdrawal_credentials':
˓→'0x00f338cfdb0c22bb85beed9042bd19fff58ad6421c8a833f8bc902b7cca06f5f',
'effective_balance': '32000000000',
'slashed': False,
'activation_eligibility_epoch': '5029',
'activation_epoch': '18446744073709551615',
'exit_epoch': '18446744073709551615',
'withdrawable_epoch': '18446744073709551615'
}
},
...
]
}
Beacon.get_validator(validator_id, state_id='head')
>>> beacon.get_validator(110280)
{
'data': {
'index': '110280',
'balance': '32000000000',
'status': 'pending_queued',
'validator': {
'pubkey':
˓→'0x99d37d1f7dd15859995330f75c158346f86d298e2ffeedfbf1b38dcf3df89a7dbd1b34815f3bcd1b2a5588592a3
˓→',
'withdrawal_credentials':
˓→'0x00f338cfdb0c22bb85beed9042bd19fff58ad6421c8a833f8bc902b7cca06f5f',
'effective_balance': '32000000000',
'slashed': False,
'activation_eligibility_epoch': '5029',
'activation_epoch': '18446744073709551615',
'exit_epoch': '18446744073709551615',
'withdrawable_epoch': '18446744073709551615'
}
}
}
Beacon.get_validator_balances(state_id='head')
>>> beacon.get_validator_balances()
{
'data': [
{
'index': '110278',
'balance': '32000000000'
},
...
]
}
Beacon.get_epoch_committees(state_id='head')
>>> beacon.get_epoch_committees()
{
'data': [
{
'slot': '162367',
'index': '25',
'validators': ['50233', '36829', '84635', ...],
},
...
]
}
Beacon.get_block_headers()
>>> beacon.get_block_headers()
{
'data': [
(continues on next page)
'state_root':
˓→'0x4dc0a72959803a84ee0231160b05dda76a91b8f8b77220b4cfc7db160840b8a8',
'body_root':
˓→'0xa3873e7b1e0bcc7c59013340cfea59dff16e42e79825e7b8ab6c243dbafd4fe0'
},
'signature':
˓→'0x87b549448d36e5e8b1783944b5511a05f34bb78ad3fcbf71a1adb346eed363d46e50d51ac53cd23bd03d0107d06
˓→'
}
}
]
}
Beacon.get_block_header(block_id)
>>> beacon.get_block_header(1)
{
'data': {
root': '0x30c04689dd4f6cd4d56eb78f72727d2d16d8b6346724e4a88f546875f11b750d',
'canonical': True,
'header': {
'message': {
'slot': '1',
'proposer_index': '61090',
'parent_root':
˓→'0x6a89af5df908893eedbed10ba4c13fc13d5653ce57db637e3bfded73a987bb87',
'state_root':
˓→'0x7773ed5a7e944c6238cd0a5c32170663ef2be9efc594fb43ad0f07ecf4c09d2b',
'body_root':
˓→'0x30c04689dd4f6cd4d56eb78f72727d2d16d8b6346724e4a88f546875f11b750d'
},
'signature':
˓→'0xa30d70b3e62ff776fe97f7f8b3472194af66849238a958880510e698ec3b8a470916680b1a82f9d4753c023153f
˓→'
}
}
}
Beacon.get_block(block_id)
>>> beacon.get_block(1)
{
'data': {
'message': {
(continues on next page)
'state_root':
˓→'0x7773ed5a7e944c6238cd0a5c32170663ef2be9efc594fb43ad0f07ecf4c09d2b',
'body': {
'randao_reveal':
˓→'0x8e245a52a0a680fcfe789013e123880c321f237de10cad108dc55dd47290d7cfe50cdaa003c6f783405efdac48c
˓→',
'eth1_data': {
'deposit_root':
˓→'0x4e910ac762815c13e316e72506141f5b6b441d58af8e0a049cd3341c25728752',
'deposit_count': '100596',
'block_hash':
˓→'0x89cb78044843805fb4dab8abd743fc96c2b8e955c58f9b7224d468d85ef57130'
},
'graffiti':
˓→'0x74656b752f76302e31322e31342b34342d673863656562663600000000000000',
'proposer_slashings': [],
'attester_slashings': [],
'attestations': [
{
'aggregation_bits': '0x0080020004000000008208000102000905',
'data': {
'slot': '0',
'index': '7',
'beacon_block_root':
˓→'0x6a89af5df908893eedbed10ba4c13fc13d5653ce57db637e3bfded73a987bb87',
'source': {
'epoch': '0',
'root':
˓→'0x0000000000000000000000000000000000000000000000000000000000000000'
},
'target': {
'epoch': '0',
'root':
˓→'0x6a89af5df908893eedbed10ba4c13fc13d5653ce57db637e3bfded73a987bb87'
}
},
'signature':
˓→'0x967dd2946358db7e426ed19d4576bc75123520ef6a489ca50002222070ee4611f9cef394e5e3071236a93b825f1
˓→'
}
],
'deposits': [],
'voluntary_exits': []
}
},
'signature':
˓→'0xa30d70b3e62ff776fe97f7f8b3472194af66849238a958880510e698ec3b8a470916680b1a82f9d4753c023153f
˓→'
}
}
Beacon.get_block_root(block_id)
>>> beacon.get_block_root(1)
{
'data': {
'root': '0x30c04689dd4f6cd4d56eb78f72727d2d16d8b6346724e4a88f546875f11b750d'
}
}
Beacon.get_block_attestations(block_id)
>>> beacon.get_block_attestations(1)
{
'data': [
{
'aggregation_bits': '0x0080020004000000008208000102000905',
'data': {
'slot': '0',
'index': '7',
'beacon_block_root':
˓→'0x6a89af5df908893eedbed10ba4c13fc13d5653ce57db637e3bfded73a987bb87',
'source': {
'epoch': '0',
'root':
˓→'0x0000000000000000000000000000000000000000000000000000000000000000'
},
'target': {
'epoch': '0',
'root':
˓→'0x6a89af5df908893eedbed10ba4c13fc13d5653ce57db637e3bfded73a987bb87'
}
},
'signature':
˓→'0x967dd2946358db7e426ed19d4576bc75123520ef6a489ca50002222070ee4611f9cef394e5e3071236a93b825f1
˓→'
},
...
]
}
Beacon.get_attestations()
>>> beacon.get_attestations()
{'data': []}
Beacon.get_attester_slashings()
>>> beacon.get_attester_slashings()
{'data': []}
Beacon.get_proposer_slashings()
>>> beacon.get_proposer_slashings()
{'data': []}
Beacon.get_voluntary_exits()
>>> beacon.get_voluntary_exits()
{'data': []}
Beacon.get_fork_schedule()
>>> beacon.get_fork_schedule()
{
'data': [
{
'previous_version': '0x00002009',
'current_version': '0x00002009',
'epoch': '0'
}
]
}
Beacon.get_spec()
>>> beacon.get_spec()
{
'data': {
'DEPOSIT_CONTRACT_ADDRESS': '0x8c5fecdC472E27Bc447696F431E425D02dd46a8c',
'MIN_ATTESTATION_INCLUSION_DELAY': '1',
'SLOTS_PER_EPOCH': '32',
'SHUFFLE_ROUND_COUNT': '90',
'MAX_EFFECTIVE_BALANCE': '32000000000',
'DOMAIN_BEACON_PROPOSER': '0x00000000',
'MAX_ATTESTER_SLASHINGS': '2',
'DOMAIN_SELECTION_PROOF': '0x05000000',
...
}
}
Beacon.get_deposit_contract()
>>> beacon.get_deposit_contract()
{
'data': {
'chain_id': '5',
'address': '0x8c5fecdc472e27bc447696f431e425d02dd46a8c'
}
}
Beacon.get_beacon_state(state_id='head')
>>> beacon.get_beacon_state()
{
'data': {
'genesis_time': '1',
'genesis_validators_root':
˓→'0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2',
(continues on next page)
'state_root':
˓→'0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2',
'body_root':
˓→'0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2'
},
'block_roots': [
˓→'0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2'],
'state_roots': [
˓→'0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2'],
'historical_roots': [
˓→'0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2'],
'eth1_data': {
'deposit_root':
˓→'0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2',
'deposit_count': '1',
'block_hash':
˓→'0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2'
},
'eth1_data_votes': [...],
'eth1_deposit_index': '1',
'validators': [...],
'balances': [...],
'randao_mixes': [...],
'slashings': [...],
'previous_epoch_attestations': [...],
'current_epoch_attestations': [...],
'justification_bits': '0x0f',
'previous_justified_checkpoint': {
'epoch': '5736',
'root': '0xec7ef54f1fd81bada8170dd0cb6be8216f8ee2f445e6936f95f5c6894a4a3b38'
},
'current_justified_checkpoint': {
'epoch': '5737',
'root': '0x781f0166e34c361ce2c88070c1389145abba2836edcb446338a2ca2b0054826e'
},
'finalized_checkpoint': {
'epoch': '5736',
'root': '0xec7ef54f1fd81bada8170dd0cb6be8216f8ee2f445e6936f95f5c6894a4a3b38'
}
}
}
Beacon.get_beacon_heads()
>>> beacon.get_beacon_heads()
{
'data': [
{
'slot': '221600',
'root': '0x9987754077fe6100a60c75d81a51b1ef457d019404d1546a66f4f5d6c23fae45'
}
]
}
Beacon.get_node_identity()
>>> beacon.get_node_identity()
{
'data': {
'peer_id': '16Uiu2HAmLZ1CYVFKpa3wwn4cnknZqosum8HX3GHDhUpEULQc9ixE',
'enr': 'enr:-KG4QCIp6eCZ6hG_
˓→fd93qsw12qmbfsl2rUTfQvwVP4FOTlWeNXYo0Gg9y3WVYIdF6FQC6R0E8CbK0Ywq_
˓→6TKMx1BpGlAhGV0aDKQOwiHlQAAIAn__________4JpZIJ2NIJpcIR_
˓→AAABiXNlY3AyNTZrMaEDdVT4g1gw86BfbrtLCq2fRBlG0AnMxsXtAQgA327S5FeDdGNwgiMog3VkcIIjKA
˓→',
'p2p_addresses': ['/ip4/127.0.0.1/tcp/9000/p2p/
˓→16Uiu2HAmLZ1CYVFKpa3wwn4cnknZqosum8HX3GHDhUpEULQc9ixE'],
'discovery_addresses': ['/ip4/127.0.0.1/udp/9000/p2p/
˓→16Uiu2HAmLZ1CYVFKpa3wwn4cnknZqosum8HX3GHDhUpEULQc9ixE'],
Beacon.get_peers()
>>> beacon.get_peers()
{
'data': [
{
'peer_id': '16Uiu2HAkw1yVqF3RtMCBHMbkLZbNhfGcTUdD6Uo4X3wfzPhGVnqv',
'address': '/ip4/3.127.23.51/tcp/9000',
'state': 'connected',
'direction': 'outbound'
},
{
'peer_id': '16Uiu2HAmEJHiCzgS8GwiEYLyM3d148mzvZ9iZzsz8yqayWVPANMG',
'address': '/ip4/3.88.7.240/tcp/9000',
'state': 'connected',
'direction': 'outbound'
}
]
}
Beacon.get_peer(peer_id)
>>> beacon.get_peer('16Uiu2HAkw1yVqF3RtMCBHMbkLZbNhfGcTUdD6Uo4X3wfzPhGVnqv')
{
'data': {
(continues on next page)
Beacon.get_health()
>>> beacon.get_health()
200
Beacon.get_version()
>>> beacon.get_version()
{
'data': {
'version': 'teku/v20.12.0+9-g9392008/osx-x86_64/adoptopenjdk-java-15'
}
}
Beacon.get_syncing()
>>> beacon.get_syncing()
{
'data': {
'head_slot': '222270',
'sync_distance': '190861'
}
}
The web3.pm object exposes methods to interact with Packages as defined by ERC 1123.
• To learn more about the EthPM spec, visit the spec or the documentation.
Warning: The web3.pm API is still under development and likely to change quickly.
Now is a great time to get familiar with the API, and test out writing code that uses some of the great upcoming
features.
By default, access to this module has been turned off in the stable version of Web3.py:
>>> from web3.auto import w3
>>> w3.pm
...
AttributeError: The Package Management feature is disabled by default ...
>>> web3.enable_unstable_package_management_api()
>>> w3.pm
<web3.pm.PM at 0x....>
2.21.1 Methods
w3.ens.setup_address(ens_name, w3.pm.registry.address)
• Parameters:
– package_name: Must be a valid package name, matching the given manifest.
– version: Must be a valid package version, matching the given manifest.
– manifest_uri: Must be a valid content-addressed URI. Currently, only IPFS and Github
content-addressed URIs are supported.
get_all_package_names() → Iterable[str]
Returns a tuple containing all the package names available on the current registry.
get_package_count() → int
Returns the number of packages available on the current registry.
get_release_count(package_name: str) → int
Returns the number of releases of the given package name available on the current registry.
get_release_id(package_name: str, version: str) → bytes
Returns the 32 byte identifier of a release for the given package name and version, if they are available on
the current registry.
get_all_package_releases(package_name: str) → Iterable[Tuple[str, str]]
Returns a tuple of release data (version, manifest_ur) for every release of the given package name available
on the current registry.
get_release_id_data(release_id: bytes) → web3.pm.ReleaseData
Returns (package_name, version, manifest_uri) associated with the given release id, if it
is available on the current registry.
• Parameters:
– release_id: 32 byte release identifier
get_release_data(package_name: str, version: str) → web3.pm.ReleaseData
Returns (package_name, version, manifest_uri) associated with the given package name
and version, if they are published to the currently set registry.
• Parameters:
– name: Must be a valid package name.
– version: Must be a valid package version.
get_package(package_name: str, version: str) → ethpm.package.Package
Returns a Package instance, generated by the manifest_uri associated with the given package name
and version, if they are published to the currently set registry.
• Parameters:
– name: Must be a valid package name.
– version: Must be a valid package version.
class web3.pm.ERC1319Registry(address: Address, w3: web3.main.Web3)
The ERC1319Registry class is a base class for all registry implementations to inherit from. It defines the
methods specified in ERC 1319. All of these methods are prefixed with an underscore, since they are not
intended to be accessed directly, but rather through the methods on web3.pm. They are unlikely to change,
but must be implemented in a ERC1319Registry subclass in order to be compatible with the PM module. Any
custom methods (eg. not definied in ERC1319) in a subclass should not be prefixed with an underscore.
All of these methods must be implemented in any subclass in order to work with web3.pm.PM. Any implemen-
tation specific logic should be handled in a subclass.
If you want to implement your own registry and use it with web3.pm, you must create a subclass that inherits
from ERC1319Registry, and implements all the ERC 1319 standard methods prefixed with an underscore in
ERC1319Registry. Then, you have to manually set it as the registry attribute on web3.pm.
One reason a user might want to create their own Registry class is if they build a custom Package Registry smart
contract that has features beyond those specified in ERC 1319. For example, the ability to delete a release or some
micropayment feature. Rather than accessing those functions directly on the contract instance, they can create a custom
ERC1319Registry subclass to easily call both the standard & custom methods.
The web3.net object exposes methods to interact with the RPC APIs under the net_ namespace.
2.22.1 Properties
property web3.net.listening
• Delegates to net_listening RPC method
Returns true if client is actively listening for network connections.
>>> web3.net.listening
True
property web3.net.peer_count
• Delegates to net_peerCount RPC method
Returns number of peers currently connected to the client.
>>> web3.net.peer_count
1
property web3.net.peerCount
property web3.net.version
• Delegates to net_version RPC Method
Returns the current network id.
>>> web3.net.version
'8996'
The web3.geth.miner object exposes methods to interact with the RPC APIs under the miner_ namespace that
are supported by the Geth client.
2.23.1 Methods
>>> web3.geth.miner.make_dag(10000)
GethMiner.makeDAG(number)
GethMiner.set_extra(extra)
• Delegates to miner_setExtra RPC Method
Set the 32 byte value extra as the extra data that will be included when this node mines a block.
>>> web3.geth.miner.set_extra('abcdefghijklmnopqrstuvwxyzABCDEF')
GethMiner.setExtra(extra)
GethMiner.set_gas_price(gas_price)
• Delegates to miner_setGasPrice RPC Method
Sets the minimum accepted gas price that this node will accept when mining transactions. Any transactions with
a gas price below this value will be ignored.
>>> web3.geth.miner.set_gas_price(19999999999)
GethMiner.setGasPrice(gas_price)
GethMiner.start(num_threads)
• Delegates to miner_start RPC Method
Start the CPU mining process using the given number of threads.
>>> web3.geth.miner.start(2)
GethMiner.stop()
• Delegates to miner_stop RPC Method
Stop the CPU mining operation
>>> web3.geth.miner.stop()
GethMiner.start_auto_dag()
• Delegates to miner_startAutoDag RPC Method
Enable automatic DAG generation.
>>> web3.geth.miner.start_auto_dag()
GethMiner.startAutoDag()
GethMiner.stop_auto_dag()
• Delegates to miner_stopAutoDag RPC Method
Disable automatic DAG generation.
>>> web3.geth.miner.stop_auto_dag()
GethMiner.stopAutoDag()
The web3.geth object exposes modules that enable you to interact with the JSON-RPC endpoints supported by
Geth that are not defined in the standard set of Ethereum JSONRPC endpoints according to EIP 1474.
web3.geth.admin.node_info()
• Delegates to admin_nodeInfo RPC Method
Returns information about the currently running node.
>>> web3.geth.admin.node_info()
{
'enode': 'enode://
˓→e54eebad24dce1f6d246bea455ffa756d97801582420b9ed681a2ea84bf376d0bd87ae8dd6dc06cdb862a2ca89ecab
˓→',
'id':
˓→'e54eebad24dce1f6d246bea455ffa756d97801582420b9ed681a2ea84bf376d0bd87ae8dd6dc06cdb862a2ca89eca
˓→',
'ip': '::',
'listenAddr': '[::]:30303',
'name': 'Geth/v1.4.11-stable-fed692f6/darwin/go1.7',
'ports': {'discovery': 30303, 'listener': 30303},
'protocols': {
'eth': {
'difficulty': 57631175724744612603,
'genesis':
˓→'0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3',
'head':
˓→'0xaaef6b9dd0d34088915f4c62b6c166379da2ad250a88f76955508f7cc81fb796',
'network': 1,
},
},
}
web3.geth.admin.nodeInfo()
web3.geth.admin.peers()
>>> web3.geth.admin.peers()
[
{
'caps': ['eth/63'],
'id':
˓→'146e8e3e2460f1e18939a5da37c4a79f149c8b9837240d49c7d94c122f30064e07e4a42ae2c2992d0f8e7e6f68a30
˓→',
'name': 'Geth/v1.4.10-stable/windows/go1.6.2',
'network': {
'localAddress': '10.0.3.115:64478',
'remoteAddress': '72.208.167.127:30303',
},
'protocols': {
'eth': {
'difficulty': 17179869184,
'head':
˓→'0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3',
'version': 63,
},
}
},
{
'caps': ['eth/62', 'eth/63'],
'id':
˓→'76cb6cd3354be081923a90dfd4cda40aa78b307cc3cf4d5733dc32cc171d00f7c08356e9eb2ea47eab5aad7a15a34
˓→',
'name': 'Geth/v1.4.10-stable-5f55d95a/linux/go1.5.1',
'network': {
'localAddress': '10.0.3.115:64784',
'remoteAddress': '60.205.92.119:30303',
},
'protocols': {
'eth': {
'difficulty': 57631175724744612603,
'head':
˓→'0xaaef6b9dd0d34088915f4c62b6c166379da2ad250a88f76955508f7cc81fb796',
'version': 63,
},
},
},
...
]
web3.geth.admin.add_peer(node_url)
• Delegates to admin_addPeer RPC Method
Requests adding a new remote node to the list of tracked static nodes.
>>> web3.geth.admin.add_peer('enode://
˓→e54eebad24dce1f6d246bea455ffa756d97801582420b9ed681a2ea84bf376d0bd87ae8dd6dc06cdb862a2ca89ecab
˓→71.255.237:30303')
True
web3.geth.admin.addPeer(node_url)
web3.geth.admin.setSolc(solc_path)
>>> web3.geth.admin.start_rpc()
True
>>> web3.geth.admin.start_ws()
True
web3.geth.admin.stop_rpc()
• Delegates to admin_stopRPC RPC Method
Stops the HTTP based JSON RPC server.
>>> web3.geth.admin.stop_rpc()
True
web3.geth.admin.stopRPC()
web3.geth.admin.stop_ws()
• Delegates to admin_stopWS RPC Method
Stops the Websocket based JSON RPC server.
>>> web3.geth.admin.stop_ws()
True
web3.geth.admin.stopWS()
>>> web3.geth.personal.list_accounts()
['0xd3CdA913deB6f67967B99D67aCDFa1712C293601']
web3.geth.personal.listAccounts()
web3.geth.personal.list_wallets()
• Delegates to personal_listWallets RPC Method
Returns the list of wallets managed by Geth.
>>> web3.geth.personal.list_wallets()
[{
accounts: [{
address: "0x44f705f3c31017856777f2931c2f09f240dd800b",
url: "keystore:///path/to/keystore/UTC--2020-03-30T23-24-43.133883000Z--
˓→44f705f3c31017856777f2931c2f09f240dd800b"
}],
status: "Unlocked",
url: "keystore:///path/to/keystore/UTC--2020-03-30T23-24-43.133883000Z--
˓→44f705f3c31017856777f2931c2f09f240dd800b"
}]
web3.geth.personal.importRawKey()
web3.geth.personal.new_account(self, passphrase)
• Delegates to personal_newAccount RPC Method
Generates a new account in the node’s keychain encrypted with the given passphrase. Returns the address
of the created account.
>>> web3.geth.personal.new_account('the-passphrase')
'0xd3CdA913deB6f67967B99D67aCDFa1712C293601'
web3.geth.personal.newAccount()
web3.geth.personal.lock_account(self, account)
• Delegates to personal_lockAccount RPC Method
Locks the given account.
>>> web3.geth.personal.lock_account('0xd3CdA913deB6f67967B99D67aCDFa1712C293601')
web3.geth.personal.lockAccount()
False
>>> web3.geth.personal.unlock_account('0xd3CdA913deB6f67967B99D67aCDFa1712C293601
˓→', 'the-passphrase')
True
web3.geth.personal.unlockAccount()
The web3.geth.txpool object exposes methods to interact with the RPC APIs under the txpool_ namespace.
These methods are only exposed under the geth namespace since they are not standard nor supported in Parity.
The following methods are available on the web3.geth.txpool namespace.
TxPool.inspect()
• Delegates to txpool_inspect RPC Method
Returns a textual summary of all transactions currently pending for inclusing in the next block(s) as will as ones
that are scheduled for future execution.
>>> web3.geth.txpool.inspect()
{
'pending': {
'0x26588a9301b0428d95e6Fc3A5024fcE8BEc12D51': {
31813: ["0x3375Ee30428b2A71c428afa5E89e427905F95F7e: 0 wei + 500000 ×
˓→20000000000 gas"]
},
'0x2a65Aca4D5fC5B5C859090a6c34d164135398226': {
563662: ["0x958c1Fa64B34db746925c6F8a3Dd81128e40355E:
˓→1051546810000000000 wei + 90000 × 20000000000 gas"],
563663: ["0x77517B1491a0299A44d668473411676f94e97E34:
˓→1051190740000000000 wei + 90000 × 20000000000 gas"],
563664: ["0x3E2A7Fe169c8F8eee251BB00d9fb6d304cE07d3A:
˓→1050828950000000000 wei + 90000 × 20000000000 gas"],
563665: ["0xAF6c4695da477F8C663eA2D8B768Ad82Cb6A8522:
˓→1050544770000000000 wei + 90000 × 20000000000 gas"],
563666: ["0x139B148094C50F4d20b01cAf21B85eDb711574dB:
˓→1048598530000000000 wei + 90000 × 20000000000 gas"],
563667: ["0x48B3Bd66770b0D1EeceFCe090daFeE36257538aE:
˓→1048367260000000000 wei + 90000 × 20000000000 gas"],
563668: ["0x468569500925D53e06Dd0993014aD166fD7Dd381:
˓→1048126690000000000 wei + 90000 × 20000000000 gas"],
563669: ["0x3DcB4C90477a4b8Ff7190b79b524773CbE3bE661:
˓→1047965690000000000 wei + 90000 × 20000000000 gas"],
563670: ["0x6DfeF5BC94b031407FFe71ae8076CA0FbF190963:
˓→1047859050000000000 wei + 90000 × 20000000000 gas"] (continues on next page)
},
'0xb18F9d01323e150096650ab989CfecD39D757Aec': {
777: ["0xcD79c72690750F079ae6AB6ccd7e7aEDC03c7720: 0 wei + 1000000 ×
˓→20000000000 gas"]
},
'0xB2916C870Cf66967B6510B76c07E9d13a5D23514': {
2: ["0x576f25199D60982A8f31A8DfF4da8aCB982e6ABa: 26000000000000000000
˓→wei + 90000 × 20000000000 gas"]
},
'0xBc0CA4f217E052753614d6B019948824d0d8688B': {
0: ["0x2910543Af39abA0Cd09dBb2D50200b3E800A63D2: 1000000000000000000
˓→wei + 50000 × 1171602790622 gas"]
},
'0xea674fdde714fd979de3edf0f56aa9716b898ec8': {
70148: ["0xe39c55ead9f997f7fa20ebe40fb4649943d7db66:
˓→1000767667434026200 wei + 90000 × 20000000000 gas"]
}
},
'queued': {
'0x0F6000De1578619320aBA5e392706b131FB1dE6f': {
6: ["0x8383534d0bcd0186d326C993031311c0Ac0D9B2d: 9000000000000000000
˓→wei + 21000 × 20000000000 gas"]
},
'0x5b30608c678e1ac464A8994C3B33E5CdF3497112': {
6: ["0x9773547e27f8303C87089dc42D9288aa2B9d8F06: 50000000000000000000
˓→wei + 90000 × 50000000000 gas"]
},
'0x976A3Fc5d6f7d259EBfb4cc2Ae75115475E9867C': {
3: ["0x346FB27dE7E7370008f5da379f74dd49F5f2F80F: 140000000000000000 wei
˓→+ 90000 × 20000000000 gas"]
},
'0x9B11bF0459b0c4b2f87f8CEBca4cfc26f294B63A': {
2: ["0x24a461f25eE6a318BDef7F33De634A67bb67Ac9D: 17000000000000000000
˓→wei + 90000 × 50000000000 gas"],
6: ["0x6368f3f8c2B42435D6C136757382E4A59436a681: 17990000000000000000
˓→wei + 90000 × 20000000000 gas", "0x8db7b4e0ecb095fbd01dffa62010801296a9ac78:
7: ["0x6368f3f8c2B42435D6C136757382E4A59436a681: 17900000000000000000
˓→wei + 90000 × 20000000000 gas"]
}
}
}
TxPool.status()
• Delegates to txpool_status RPC Method
Returns a textual summary of all transactions currently pending for inclusing in the next block(s) as will as ones
that are scheduled for future execution.
{
pending: 10,
queued: 7,
}
TxPool.content()
• Delegates to txpool_content RPC Method
Returns the exact details of all transactions that are pending or queued.
>>> web3.geth.txpool.content()
{
'pending': {
'0x0216D5032f356960Cd3749C31Ab34eEFF21B3395': {
806: [{
'blockHash':
˓→"0x0000000000000000000000000000000000000000000000000000000000000000",
'blockNumber': None,
'from': "0x0216D5032f356960Cd3749C31Ab34eEFF21B3395",
'gas': "0x5208",
'gasPrice': None,
'hash':
˓→"0xaf953a2d01f55cfe080c0c94150a60105e8ac3d51153058a1f03dd239dd08586",
'input': "0x",
'maxFeePerGas': '0x77359400',
'maxPriorityFeePerGas': '0x3b9aca00',
'nonce': "0x326",
'to': "0x7f69a91A3CF4bE60020fB58B893b7cbb65376db8",
'transactionIndex': None,
'value': "0x19a99f0cf456000"
}]
},
'0x24d407e5A0B506E1Cb2fae163100B5DE01F5193C': {
34: [{
'blockHash':
˓→"0x0000000000000000000000000000000000000000000000000000000000000000",
'blockNumber': None,
'from': "0x24d407e5A0B506E1Cb2fae163100B5DE01F5193C",
'gas': "0x44c72",
'gasPrice': None,
'hash':
˓→"0xb5b8b853af32226755a65ba0602f7ed0e8be2211516153b75e9ed640a7d359fe",
'input':
˓→"0xb61d27f600000000000000000000000024d407e5a0b506e1cb2fae163100b5de01f5193c0000000000000000000
˓→",
'maxFeePerGas': '0x77359400',
'maxPriorityFeePerGas': '0x3b9aca00',
'nonce': "0x22",
'to': "0x7320785200f74861B69C49e4ab32399a71b34f1a",
'transactionIndex': None,
'value': "0x0"
}]
}
},
'queued': {
'0x976A3Fc5d6f7d259EBfb4cc2Ae75115475E9867C': {
3: [{
'blockHash':
˓→"0x0000000000000000000000000000000000000000000000000000000000000000",
'blockNumber': None,
'from': "0x976A3Fc5d6f7d259EBfb4cc2Ae75115475E9867C",
'gas': "0x15f90",
'gasPrice': None,
(continues on next page)
'input': "0x",
'maxFeePerGas': '0x77359400',
'maxPriorityFeePerGas': '0x3b9aca00',
'nonce': "0x3",
'to': "0x346FB27dE7E7370008f5da379f74dd49F5f2F80F",
'transactionIndex': None,
'value': "0x1f161421c8e0000"
}]
},
'0x9B11bF0459b0c4b2f87f8CEBca4cfc26f294B63A': {
2: [{
'blockHash':
˓→"0x0000000000000000000000000000000000000000000000000000000000000000",
'blockNumber': None,
'from': "0x9B11bF0459b0c4b2f87f8CEBca4cfc26f294B63A",
'gas': "0x15f90",
'gasPrice': None,
'hash':
˓→"0x3a3c0698552eec2455ed3190eac3996feccc806970a4a056106deaf6ceb1e5e3",
'input': "0x",
'maxFeePerGas': '0x77359400',
'maxPriorityFeePerGas': '0x3b9aca00',
'nonce': "0x2",
'to': "0x24a461f25eE6a318BDef7F33De634A67bb67Ac9D",
'transactionIndex': None,
'value': "0xebec21ee1da40000"
}],
6: [{
'blockHash':
˓→"0x0000000000000000000000000000000000000000000000000000000000000000",
'blockNumber': None,
'from': "0x9B11bF0459b0c4b2f87f8CEBca4cfc26f294B63A",
'gas': "0x15f90",
'gasPrice': None,
'hash':
˓→"0xbbcd1e45eae3b859203a04be7d6e1d7b03b222ec1d66dfcc8011dd39794b147e",
'input': "0x",
'maxFeePerGas': '0x77359400',
'maxPriorityFeePerGas': '0x3b9aca00',
'nonce': "0x6",
'to': "0x6368f3f8c2B42435D6C136757382E4A59436a681",
'transactionIndex': None,
'value': "0xf9a951af55470000"
}, {
'blockHash':
˓→"0x0000000000000000000000000000000000000000000000000000000000000000",
'blockNumber': None,
'from': "0x9B11bF0459b0c4b2f87f8CEBca4cfc26f294B63A",
'gas': "0x15f90",
'gasPrice': None,
'hash':
˓→"0x60803251d43f072904dc3a2d6a084701cd35b4985790baaf8a8f76696041b272",
'input': "0x",
'maxFeePerGas': '0x77359400',
'maxPriorityFeePerGas': '0x3b9aca00',
(continues on next page)
The web3.parity object exposes modules that enable you to interact with the JSON-RPC endpoints supported by
Parity that are not defined in the standard set of Ethereum JSONRPC endpoints according to EIP 1474.
2.25.1 ParityPersonal
>>> web3.parity.personal.list_accounts()
['0xd3CdA913deB6f67967B99D67aCDFa1712C293601']
web3.parity.personal.listAccounts()
web3.parity.personal.new_account(self, password)
• Delegates to personal_newAccount RPC Method
Generates a new account in the node’s keychain encrypted with the given passphrase. Returns the address
of the created account.
>>> web3.parity.personal.new_account('the-passphrase')
'0xd3CdA913deB6f67967B99D67aCDFa1712C293601'
web3.parity.personal.newAccount(self, password)
>>> web3.parity.personal.unlock_account(
˓→'0xd3CdA913deB6f67967B99D67aCDFa1712C293601', 'wrong-passphrase')
True
>>> web3.parity.personal.unlock_account(
˓→'0xd3CdA913deB6f67967B99D67aCDFa1712C293601', 'the-passphrase')
True
Warning: Gas price strategy is only supported for legacy transactions. The London fork intro-
duced maxFeePerGas and maxPriorityFeePerGas transaction parameters which should be used over
gasPrice whenever possible.
For Ethereum (legacy) transactions, gas price is a delicate property. For this reason, Web3 includes an API for config-
uring it.
The Gas Price API allows you to define Web3’s behaviour for populating the gas price. This is done using a “Gas Price
Strategy” - a method which takes the Web3 object and a transaction dictionary and returns a gas price (denominated
in wei).
To retrieve the gas price using the selected strategy simply call generate_gas_price()
>>> web3.eth.generate_gas_price()
20000000000
A gas price strategy is implemented as a python method with the following signature:
The method must return a positive integer representing the gas price in wei.
To demonstrate, here is a rudimentary example of a gas price strategy that returns a higher gas price when the value of
the transaction is higher than 1 Ether.
w3 = Web3(...)
w3.eth.set_gas_price_strategy(value_based_gas_price_strategy)
web3.gas_strategies.rpc.rpc_gas_price_strategy(web3, transaction_params=None)
Makes a call to the JSON-RPC eth_gasPrice method which returns the gas price configured by the connected
Ethereum node.
web3.gas_strategies.time_based.construct_time_based_gas_price_strategy(max_wait_seconds,
sam-
ple_size=120,
prob-
a-
bil-
ity=98,
weighted=False)
Constructs a strategy which will compute a gas price such that the transaction will be mined within a number
of seconds defined by max_wait_seconds with a probability defined by probability. The gas price is
computed by sampling sample_size of the most recently mined blocks. If weighted=True, the block
time will be weighted towards more recently mined blocks.
• max_wait_seconds The desired maxiumum number of seconds the transaction should take to mine.
• sample_size The number of recent blocks to sample
• probability An integer representation of the desired probability that the transaction will be mined
within max_wait_seconds. 0 means 0% and 100 means 100%.
The following ready to use versions of this strategy are available.
• web3.gas_strategies.time_based.fast_gas_price_strategy: Transaction mined
within 60 seconds.
• web3.gas_strategies.time_based.medium_gas_price_strategy: Transaction mined
within 5 minutes.
• web3.gas_strategies.time_based.slow_gas_price_strategy: Transaction mined
within 1 hour.
• web3.gas_strategies.time_based.glacial_gas_price_strategy: Transaction mined
within 24 hours.
Warning: Due to the overhead of sampling the recent blocks it is recommended that a caching solution be
used to reduce the amount of chain data that needs to be re-fetched for each request.
w3 = Web3()
w3.eth.set_gas_price_strategy(medium_gas_price_strategy)
w3.middleware_onion.add(middleware.time_based_cache_middleware)
w3.middleware_onion.add(middleware.latest_block_based_cache_middleware)
w3.middleware_onion.add(middleware.simple_cache_middleware)
exception ens.exceptions.AddressMismatch
Bases: ValueError
In order to set up reverse resolution correctly, the ENS name should first point to the address. This exception is
raised if the name does not currently point to the address.
exception ens.exceptions.InvalidName
Bases: idna.core.IDNAError
This exception is raised if the provided name does not meet the syntax standards specified in EIP 137 name
syntax.
For example: names may not start with a dot, or include a space.
exception ens.exceptions.UnauthorizedError
Bases: Exception
Raised if the sending account is not the owner of the name you are trying to modify. Make sure to set from in
the transact keyword argument to the owner of the name.
exception ens.exceptions.UnownedName
Bases: Exception
Raised if you are trying to modify a name that no one owns.
If working on a subdomain, make sure the subdomain gets created first with setup_address().
exception ens.exceptions.BidTooLow
Bases: ValueError
Raised if you bid less than the minimum amount
exception ens.exceptions.InvalidBidHash
Bases: ValueError
Raised if you supply incorrect data to generate the bid hash.
exception ens.exceptions.InvalidLabel
Bases: ValueError
Raised if you supply an invalid label
exception ens.exceptions.OversizeTransaction
Bases: ValueError
Raised if a transaction you are trying to create would cost so much gas that it could not fit in a block.
For example: when you try to start too many auctions at once.
exception ens.exceptions.UnderfundedBid
Bases: ValueError
Raised if you send less wei with your bid than you declared as your intent to bid.
2.28 Contributing
Thanks for your interest in contributing to Web3.py! Read on to learn what would be helpful and how to go about it.
If you get stuck along the way, reach for help in the Python Discord server.
Without code:
• Answer user questions within GitHub issues, Stack Overflow, or the Python Discord server.
• Write or record tutorial content.
• Improve our documentation (including typo fixes).
• Open an issue on GitHub to document a bug. Include as much detail as possible, e.g., how to reproduce the
issue and any exception messages.
With code:
• Fix a bug that has been reported in an issue.
• Add a feature that has been documented in an issue.
• Add a missing test case.
Warning: Before you start: always ask if a change would be desirable or let us know that you plan to work on
something! We don’t want to waste your time on changes we can’t accept or duplicated effort.
Note: Use of a virtual environment is strongly advised for minimizing dependency issues. See this article for usage
patterns.
All pull requests are made from a fork of the repository; use the GitHub UI to create a fork. Web3.py depends on
submodules, so when you clone your fork to your local machine, include the --recursive flag:
Using Docker
Developing within Docker is not required, but if you prefer that workflow, use the sandbox container provided in the
docker-compose.yml file.
To start up the test environment, run:
$ docker-compose up -d
This will build a Docker container set up with an environment to run the Python test code.
Note: This container does not have go-ethereum installed, so you cannot run the go-ethereum test suite.
You can run arbitrary commands inside the Docker container by using the bash -c prefix.
We value code consistency. To ensure your contribution conforms to the style being used in this project, we encourage
you to read our style guide.
This code base makes use of type hints. Type hints make it easy to prevent certain types of bugs, enable richer tooling,
and enhance the documentation, making the code easier to follow.
All new code is required to include type hints, with the exception of tests.
All parameters, as well as the return type of functions, are expected to be typed, with the exception of self and cls
as seen in the following example.
$ pytest
However, running the entire test suite takes a very long time and is generally impractical. Typically, you’ll just want
to run a subset instead, like:
$ pytest tests/core/eth-module/test_accounts.py
You can use tox to run all the tests for a given version of Python:
$ tox -e py37-core
Linting is also performed by the CI. You can save yourself some time by checking for linting errors locally:
$ make lint
It is important to understand that each pull request must pass the full test suite as part of the CI check. This test suite
will run in the CI anytime a pull request is opened or updated.
We strongly encourage contributors to write good tests for their code as part of the code review process. This helps
ensure that your code is doing what it should be doing.
We strongly encourage you to use our existing tests for both guidance and homogeneity / consistency across our tests.
We use pytest for our tests. For more specific pytest guidance, please refer to the pytest documentation.
Within the pytest scope, conftest.py files are used for common code shared between modules that exist within
the same directory as that particular conftest.py file.
Unit Testing
Unit tests are meant to test the logic of smaller chunks (or units) of the codebase without having to be wired up to a
client. Most of the time this means testing selected methods on their own. They are meant to test the logic of your
code and make sure that you get expected outputs out of selected inputs.
Our unit tests live under appropriately named child directories within the /tests directory. The core of the unit tests
live under /tests/core. Do your best to follow the existing structure when choosing where to add your unit test.
Integration Testing
Our integration test suite setup lives under the /tests/integration directory. The integration test suite is
dependent on what we call “fixtures” (not to be confused with pytest fixtures). These zip file fixtures, which also live
in the /tests/integration directory, are configured to run the specific client we are testing against along with
a genesis configuration that gives our tests some pre-determined useful objects (like unlocked, pre-loaded accounts) to
be able to interact with the client and run our tests.
Though the setup lives in /tests/integration, our integration module tests are written across different files
within /web3/_utils/module_testing. The tests are written there but run configurations exist across the
different files within /tests/integration/. The parent /integration directory houses some common con-
figuration shared across all client tests, whereas the /go_ethereum and /parity directories house common code
to be shared among each respective client tests.
• common.py files within the client directories contain code that is shared across all provider tests (http, ipc, and
ws). This is mostly used to override tests that span across all providers.
• conftest.py files within each of these directories contain mostly code that can be used by all test files that
exist within the same directory as the conftest.py file. This is mostly used to house pytest fixtures to be
shared among our tests. Refer to the pytest documentation on fixtures for more information.
• test_client_provider.py (e.g. test_goethereum_http.py) files are where client-and-provider-
specific test configurations exist. This is mostly used to override tests specific to the provider type for the
respective client.
To import and test an unreleased version of Web3.py in another context, you can install it from your development
directory:
2.28.8 Documentation
Good documentation will lead to quicker adoption and happier users. Please check out our guide on how to create
documentation for the Python Ethereum ecosystem.
Pull requests generate their own preview of the latest documentation at https://web3py--<pr-number>.
org.readthedocs.build/en/<pr-number>/.
It’s a good idea to make pull requests early on. A pull request represents the start of a discussion, and doesn’t
necessarily need to be the final, finished submission.
See GitHub’s documentation for working on pull requests.
Once you’ve made a pull request take a look at the Circle CI build status in the GitHub interface and make sure all tests
are passing. In general, pull requests that do not pass the CI build yet won’t get reviewed unless explicitly requested.
If the pull request introduces changes that should be reflected in the release notes, please add a newsfragment file as
explained here.
If possible, the change to the release notes file should be included in the commit that introduces the feature or bugfix.
Our integration tests make use of Geth and Parity/OpenEthereum private networks. When new versions of the client
software are introduced, new fixtures should be generated.
Before generating new fixtures, make sure you have the test dependencies installed:
Note: A “fixture” is a pre-synced network. It’s the result of configuring and running a client, deploying the test
contracts, and saving the resulting state for testing Web3.py functionality against.
Geth Fixtures
1. Install the desired Geth version on your machine locally. We recommend py-geth for this purpose, because it
enables you to easily manage multiple versions of Geth.
Note that py-geth will need updating to support each new Geth version as well. Adding newer Geth versions
to py-geth is straightforward; see past commits for a template.
If py-geth has the Geth version you need, install that version locally. For example:
2. Specify the Geth binary and run the fixture creation script (from within the web3.py directory):
3. The output of this script is your fixture, a zip file, which is now stored in /tests/integration/. Update
the /tests/integration/go_ethereum/conftest.py file to point to this new fixture. Delete the
old fixture.
4. Run the tests. To ensure that the tests run with the correct Geth version locally, you may again include the
GETH_BINARY environment variable.
Occasionally you’ll want to have CI run the test suite against an unreleased version of Geth, for example, to test
upcoming hard fork changes. The workflow described below is for testing only, i.e., open a PR, let CI run the tests,
but the changes should only be merged into master once the Geth release is published or you have some workaround
that doesn’t require test fixtures built from an unstable client.
1. Configure tests/integration/generate_fixtures/go_ethereum/common.py as needed.
2. Geth automagically compiles new builds for every commit that gets merged into the codebase. Download the
desired build from the develop builds.
3. Build your test fixture, passing in the binary you just downloaded via GETH_BINARY. Don’t forget to update
the /tests/integration/go_ethereum/conftest.py file to point to your new fixture.
4. Our CI runs on Ubuntu, so download the corresponding 64-bit Linux develop build, then add it to the root of
your Web3.py directory. Rename the binary custom_geth.
5. In .circleci/config.yml, update jobs relying on geth_steps, to instead use
custom_geth_steps.
6. Create a PR and let CI do its thing.
Parity/OpenEthereum Fixtures
1. The most reliable way to get a specific Parity/OE binary is to download the source code via GitHub releases.
2. Build the binary from source. (This is will take a few minutes.)
3. Specify the path to this binary in the get_parity_binary function of the /tests/integration/
generate_fixtures/parity.py file.
4. Run the fixture generation script:
$ python /tests/integration/generate_fixtures/parity.py /tests/integration/parity-X.Y.
˓→Z-fixture
5. The output of this script is your fixture, a zip file. Store the fixture in the /tests/integration/ directory
and update the /tests/integration/parity/conftest.py file to point the new fixture.
6. By this point, you may have noticed that Parity fixture generation relies on a Geth network to sync from. In the
output of the generation script are the hashes of the various contracts that it mined. Update the corresponding
values in the /parity/conftest.py file with those hashes.
7. Run the tests.
2.28.11 Releasing
Before releasing a new version, build and test the package that will be released. There’s a script to build and install
the wheel locally, then generate a temporary virtualenv for smoke testing:
$ git checkout master && git pull
$ make package
$ make docs
$ towncrier --draft
After confirming that the release package looks okay, compile the release notes:
You may need to fix up any broken release note fragments before committing. Keep running make build-docs
until it passes, then commit and carry on.
After committing the compiled release notes and pushing them to the master branch, release a new version:
The version format for this repo is {major}.{minor}.{patch} for stable, and {major}.{minor}.
{patch}-{stage}.{devnum} for unstable (stage can be alpha or beta).
During a release, specify which part to bump, like make release bump=minor or make release
bump=devnum.
If you are in an alpha version, make release bump=stage will bump to beta. If you are in a beta version, make
release bump=stage will bump to a stable version.
To issue an unstable version when the current version is stable, specify the new version explicitly, like make
release bump="--new-version 4.0.0-alpha.1 devnum".
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making
participation in our project and our community a harassment-free experience for everyone, regardless of age, body size,
disability, ethnicity, gender identity and expression, level of experience, education, socio-economic status, nationality,
personal appearance, race, religion, or sexual identity and orientation.
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appro-
priate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits,
issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any
contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
2.29.4 Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the
project or its community. Examples of representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed representative at an online or offline
event. Representation of a project may be further defined and clarified by project maintainers.
2.29.5 Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team
at [email protected]. All complaints will be reviewed and investigated and will result in a response that is
deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with
regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent
repercussions as determined by other members of the project’s leadership.
2.29.6 Attribution
This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at https://www.
contributor-covenant.org/version/1/4/code-of-conduct.html
THREE
• genindex
• modindex
• search
231
Populus Documentation, Release 5.23.0
e
ens, 218
ens.exceptions, 220
ens.main, 218
w
web3, 160
web3.contract, 104
web3.eth, 165
web3.gas_strategies.rpc, 217
web3.gas_strategies.time_based, 217
web3.geth, 205
web3.geth.admin, 205
web3.geth.miner, 203
web3.geth.personal, 208
web3.geth.txpool, 210
web3.net, 202
web3.parity, 214
web3.parity.personal, 214
web3.utils.filters, 99
233
Populus Documentation, Release 5.23.0
Symbols buffered_gas_estimate_middleware()
__init__() (web3.pm.ERC1319Registry method), 200 (web3.middleware method), 125
__repr__() (ethpm.Package method), 135 build_dependencies (ethpm.Package attribute),
_generate_release_id() 136
(web3.pm.ERC1319Registry method), 201 build_dependency()
_get_all_package_ids() built-in function, 151
(web3.pm.ERC1319Registry method), 201 build_filter() (web3.contract.Contract.events.your_event_name
_get_all_release_ids() class method), 108
(web3.pm.ERC1319Registry method), 201 buildTransaction()
_get_package_name() (web3.pm.ERC1319Registry (web3.contract.Contract.fallback method),
method), 201 116
_get_release_data() (web3.pm.ERC1319Registry buildTransaction()
method), 201 (web3.contract.ContractFunction method),
_get_release_id() (web3.pm.ERC1319Registry 115
method), 201 built-in function
_num_package_ids() (web3.pm.ERC1319Registry build_dependency(), 151
method), 202 deployment(), 149
_num_release_ids() (web3.pm.ERC1319Registry deployment_type(), 149
method), 202 bytecode (web3.contract.Contract attribute), 107
_release() (web3.pm.ERC1319Registry method), 201 bytecode_runtime (web3.contract.Contract at-
tribute), 107
A
abi (web3.contract.Contract attribute), 107
C
accounts (web3.eth.Eth attribute), 167 call() (web3.contract.Contract.fallback method), 116
add() (Web3.middleware_onion method), 127 call() (web3.contract.ContractFunction method), 114
add_peer() (in module web3.geth.admin), 206 call() (web3.eth.Eth method), 182
addPeer() (in module web3.geth.admin), 206 can_resolve_uri() (BaseURIBackend method),
address (web3.contract.Contract attribute), 107 138
address() (ens.main.ENS method), 219 can_translate_uri() (BaseURIBackend method),
AddressMismatch, 220 138
all_functions() (web3.contract.Contract class chain_id (web3.eth.Eth attribute), 168
method), 109 chainId (web3.eth.Eth attribute), 168
api (web3.Web3 attribute), 160 chainId() (in module web3.net), 202
attrdict_middleware() (web3.middleware clear() (Web3.middleware_onion method), 128
method), 124 clientVersion (web3.Web3 attribute), 160
coinbase (web3.eth.Eth attribute), 166
B ConciseContract (class in web3.contract), 106
construct_latest_block_based_cache_middleware()
BidTooLow, 220
(web3.middleware method), 129
block_number (web3.eth.Eth attribute), 167
construct_sign_and_send_raw_middleware()
BlockFilter (class in web3.utils.filters), 101
(web3.middleware method), 131
blockNumber (web3.eth.Eth attribute), 167
235
Populus Documentation, Release 5.23.0
236 Index
Populus Documentation, Release 5.23.0
Index 237
Populus Documentation, Release 5.23.0
238 Index
Populus Documentation, Release 5.23.0
peers() (in module web3.geth.admin), 205 setSolc() (in module web3.geth.admin), 207
pin_assets() (BaseIPFSBackend method), 139 setup_address() (ens.main.ENS method), 219
PM (class in web3.pm), 199 setup_name() (ens.main.ENS method), 219
pm (web3.Web3 attribute), 165 setup_owner() (ens.main.ENS method), 220
protocol_version (web3.eth.Eth attribute), 167 sha3() (web3.Web3 class method), 163
protocolVersion (web3.eth.Eth attribute), 168 sign() (web3.eth.Eth method), 181
pythonic_middleware() (web3.middleware sign_transaction() (web3.eth.Eth method), 179
method), 125 sign_typed_data() (in module
web3.parity.personal), 215
R sign_typed_data() (web3.eth.Eth method), 182
release_package() (web3.pm.PM method), 199 signTransaction() (web3.eth.Eth method), 179
remove() (Web3.middleware_onion method), 127 signTypedData() (in module web3.parity.personal),
replace() (Web3.middleware_onion method), 127 215
replace_transaction() (web3.eth.Eth method), signTypedData() (web3.eth.Eth method), 182
180 solidityKeccak() (web3.Web3 class method), 163
replaceTransaction() (web3.eth.Eth method), soliditySha3() (web3.Web3 class method), 164
181 start() (web3.geth.miner.GethMiner method), 204
rpc_gas_price_strategy() (in module start_auto_dag() (web3.geth.miner.GethMiner
web3.gas_strategies.rpc), 217 method), 204
start_rpc() (in module web3.geth.admin), 207
S start_ws() (in module web3.geth.admin), 207
send_raw_transaction() (web3.eth.Eth method), startAutoDag() (web3.geth.miner.GethMiner
179 method), 204
send_transaction() (in module startRPC() (in module web3.geth.admin), 207
web3.geth.personal), 210 startWS() (in module web3.geth.admin), 207
send_transaction() (in module status() (web3.geth.txpool.TxPool method), 211
web3.parity.personal), 215 stop() (web3.geth.miner.GethMiner method), 204
send_transaction() (web3.eth.Eth method), 178 stop_auto_dag() (web3.geth.miner.GethMiner
sendRawTransaction() (web3.eth.Eth method), method), 204
180 stop_rpc() (in module web3.geth.admin), 207
sendTransaction() (in module stop_ws() (in module web3.geth.admin), 208
web3.geth.personal), 210 stopAutoDag() (web3.geth.miner.GethMiner
sendTransaction() (in module method), 204
web3.parity.personal), 215 stopRPC() (in module web3.geth.admin), 207
sendTransaction() (web3.eth.Eth method), 179 stopWS() (in module web3.geth.admin), 208
set_contract_factory() (web3.eth.Eth method), submit_hashrate() (web3.eth.Eth method), 187
188 submit_work() (web3.eth.Eth method), 187
set_data_filters() (web3.utils.filters.LogFilter submitHashrate() (web3.eth.Eth method), 187
method), 102 submitWork() (web3.eth.Eth method), 187
set_extra() (web3.geth.miner.GethMiner method), syncing (web3.eth.Eth attribute), 166
203
set_gas_price() (web3.geth.miner.GethMiner
T
method), 203 toBytes() (web3.Web3 method), 161
set_gas_price_strategy() (web3.eth.Eth toChecksumAddress() (web3.Web3 method), 162
method), 184 toHex() (web3.Web3 method), 160
set_registry() (web3.pm.PM method), 199 toInt() (web3.Web3 method), 161
setContractFactory() (web3.eth.Eth method), toJSON() (web3.Web3 method), 162
188 toText() (web3.Web3 method), 161
setExtra() (web3.geth.miner.GethMiner method), toWei() (web3.Web3 method), 162
203 transact() (web3.contract.Contract.fallback
setGasPrice() (web3.geth.miner.GethMiner method), 116
method), 204 transact() (web3.contract.ContractFunction
setGasPriceStrategy() (web3.eth.Eth method), method), 114
184 TransactionFilter (class in web3.utils.filters), 101
Index 239
Populus Documentation, Release 5.23.0
U web3.parity.personal
UnauthorizedError, 220 module, 214
UnderfundedBid, 221 web3.providers.async_rpc.AsyncHTTPProvider
uninstall_filter() (web3.eth.Eth method), 186 (class in web3.providers.eth_tester), 63
uninstallFilter() (web3.eth.Eth method), 186 web3.providers.ipc.IPCProvider (built-in
unlinked_references (LinkableContract at- class), 61
tribute), 138 web3.providers.rpc.HTTPProvider (built-in
unlock_account() (in module web3.geth.personal), class), 61
209 web3.providers.websocket.WebsocketProvider
unlock_account() (in module (built-in class), 62
web3.parity.personal), 215 web3.utils.filters
unlockAccount() (in module web3.geth.personal), module, 99
209
unlockAccount() (in module web3.parity.personal),
215
UnownedName, 220
uri() (ethpm.Package property), 136
V
version() (ethpm.Package property), 135
version() (in module web3.net), 203
W
w3 (Package attribute), 136
wait_for_transaction_receipt()
(web3.eth.Eth method), 176
waitForTransactionReceipt() (web3.eth.Eth
method), 176
web3
module, 160
Web3 (class in web3), 160
web3.contract
module, 104
web3.eth
module, 165
web3.gas_strategies.rpc
module, 217
web3.gas_strategies.time_based
module, 217
web3.geth
module, 205
web3.geth.admin
module, 205
web3.geth.miner
module, 203
web3.geth.personal
module, 208
web3.geth.txpool
module, 210
web3.net
module, 202
web3.parity
module, 214
240 Index