Skip to main content

Simple Web3 Multicall

A multicall for use with pure Web3.py library. It uses MakerDao Multicall smart contract by default, but also can use any custom multicall smart contract that implements "aggregate" function.

Main urge for developmenet such a package was when I was needed to use multicall in my project based on Web3.py, but found only libraries which work with Brownie, not on pure Web3.py.

pip install simple-multicall

Package Content

  • class Multicall - The main multicall class that executes a multicall itself.

  • constants file makerdao_multicall - contains a default MakerDao multicall smart contract ABI and a dictionary of addresses of multicall contracts deployed on different chains.

class Multicall

The main multicall class. Should be initialized by passing a Web3 instance with specified chain RPC provider.

Has two methods:

call - executes a multicall

create_call - prepare a tuple for a list of calls to be passed to a call method

Attributes

w3 : Web3 class instanse

chain: str The name of one of defined chains where MakerDao Multicall smart contract is deployed. Can be one of the followings

  • 'mainnet'
  • 'kovan'
  • 'rinkeby'
  • 'goerli'
  • 'ropsten'
  • 'xdai'
  • 'polygon'
  • 'mumbai'
  • 'bsc-mainnet'
  • 'bsc-testnet'

custom_address: str - An address of custom multicall smart contract. If specified, MakerDao Multicall smart contract will be omited.

custom_abi: str - An ABI of custom multicall smart contract. If omited, MakerDao Multicall smart contract ABI will be used.

Methods

call() - Executes multicall for specified list of smart contracts functions.

Parameters:

calls: list(tuple) - list of tuples (target contract address, encoded function name with parameters) Can be easy prepared via using Multicall.create_cal' method.

Returns:

tuple(block number, list(results)) for default MakerDao multicall. May vary for custom multicalls.

create_call() - Prepares a tuple for passing to Multicall.call list.

Parameters:

contract: web3.eth.Contract - A web3.eth.Contract instance of a contract that is to be called via multicall.

fn_name: str - The name of a contract function to be called.

args: list - a list of arguments to be passed to a called contract function.

Returns:

tuple(target contract address, encoded function name with parameters)

Example

Multicall of three ERC20 tokens of a specified EthDev address.

Importing Web3

>>> from web3 import Web3

Defining constants: ERC20 token ABI token mainnet addresses.

# ERC20 ABI string is cropped for readability
>>> ERC20_ABI = '[{"constant":true,"inputs":[],"name":"name", ...

>>> USDT_ADDRESS = Web3.toChecksumAddress('0xdAC17F958D2ee523a2206206994597C13D831ec7')
>>> USDC_ADDRESS = Web3.toChecksumAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48')
>>> BNB_ADDRESS = Web3.toChecksumAddress('0xB8c77482e45F1F44dE1745F52C74426C631bDD52')

Initializing web3 instance.

>>> ETH_PROVIDER_URL = 'https://rpc.ankr.com/eth'
>>> w3 = Web3(Web3.HTTPProvider(ETH_PROVIDER_URL))    

Creating token Web3 contracts.

>>> USDT = w3.eth.contract(address=USDT_ADDRESS, abi=ERC20_ABI)
>>> USDC = w3.eth.contract(address=USDC_ADDRESS, abi=ERC20_ABI)
>>> BNB = w3.eth.contract(address=BNB_ADDRESS, abi=ERC20_ABI)

Target user address.

>>> address = '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'

Initializing Multicall for mainnet.

>>> from simple_multicall import Multicall
>>> 
>>> multicall = Multicall(w3, 'mainnet')

Creating a list of calls via 'Multicall.create_call()' method.

>>> calls = [
...     multicall.create_call(USDT, 'balanceOf', [address]),
...     multicall.create_call(USDC, 'balanceOf', [address]),
...     multicall.create_call(BNB, 'balanceOf', [address])
... ]

Executing multicall.

>>> result= multicall.call(calls)

>>> result
[15442332, [b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\    
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?D#\xde' b'\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00;\x9a\xf1\x10', b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0
0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02HA>\xf1\xd3\xf2\x00\x00']]

Interpreting results.

>>> print('Block number: ', result[0])
Block number:  15442332

>>> print('USDT: ', int(result[1][0].hex(), 16) / 10 ** 6)
USDT:  1061.430238

>>> print('USDC: ', int(result[1][1].hex(), 16) / 10 ** 6)
USDC:  1000.01

>>> print('BNB: ', int(result[1][2].hex(), 16) / 10 ** 18)
BNB:  42.1

Metadata

Release files for simple-multicall-v6 0.1.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for simple-multicall-v6 0.1.6
File Size Uploaded Provenance Actions
simple_multicall_v6-0.1.6.tar.gz 5.5 kB Without provenance Details for simple_multicall_v6-0.1.6.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for simple-multicall-v6 0.1.6
File Interpreter ABI Platform Actions
simple_multicall_v6-0.1.6-py3-none-any.whl Python 3 none any Details for simple_multicall_v6-0.1.6-py3-none-any.whl

Total release size: 11.8 kB

Release files / simple_multicall_v6-0.1.6.tar.gz

Download URL simple_multicall_v6-0.1.6.tar.gz
Size 5.5 kB
Tags Source
SHA-256 checksum
How to use checksums
a7e15b26a11db40d07b551851080e70ce5133b6ae18ef06163a917021f6b3fb0
BLAKE2b-256 checksum
How to use checksums
14b758caf8bf9538ff61b4286749ed7993cf5b4f75ab2a4756a746438d6a64f9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.11.8

Release files / simple_multicall_v6-0.1.6-py3-none-any.whl

Download URL simple_multicall_v6-0.1.6-py3-none-any.whl
Size 6.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
05e39f6f8072eef5f676c555cff270f54376a1c31851688436b62ccd0748ee72
BLAKE2b-256 checksum
How to use checksums
5410c55c105cc969ffff5b6f9a1635d9160597d12554af5a057f5afceb1fd7ef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.11.8

Security for simple-multicall-v6 0.1.6

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.6 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page