## Multicallable: Simplified Interface for Multicall
`Multicallable` provides a streamlined way to work with the Multicall package, allowing you to batch multiple contract calls into a single request.
### Installation
Install the package using the following command:
```shell
pip install -U multicallable
```
### Getting Started
#### Initialize Web3 or AsyncWeb3
First, import the Web3 library and set up a Web3 instance. The setup differs depending on whether you are using synchronous or asynchronous operations.
For synchronous operations:
```python
from web3 import Web3
# Specify Ethereum RPC URL
ETH_RPC_URL = 'https://rpc.ankr.com/eth'
# Initialize Web3 instance
w3 = Web3(Web3.HTTPProvider(ETH_RPC_URL))
```
For asynchronous operations:
```python
from web3 import AsyncWeb3
# Initialize AsyncWeb3 instance
w3 = AsyncWeb3(AsyncWeb3.AsyncHTTPProvider(ETH_RPC_URL))
```
#### Import and Initialize Multicallable
Next, import the `Multicallable` class and initialize it for a specific token:
```python
from multicallable import Multicallable
# Truncated ERC20 ABI for demonstration
ERC20_ABI = '[{"constant":true,"inputs":[],"name":"name", ...'
# sample token contract address
TOKEN = '0xDE5ed76E7c05eC5e4572CfC88d1ACEA165109E44'
# Initialize Multicallable instance
multicallable = Multicallable(TOKEN, ERC20_ABI, w3)
```
#### AsyncMulticallable: The Asynchronous Alternative
For asynchronous use-cases, `AsyncMulticallable` is available. Unlike `Multicallable`, its constructor is empty, and it includes an asynchronous `setup` function that takes the same parameters:
```python
from multicallable import AsyncMulticallable
# Initialize AsyncMulticallable instance
async_multicallable = AsyncMulticallable()
await async_multicallable.setup(TOKEN, ERC20_ABI, w3) # Make sure w3 is an AsyncWeb3 instance
```
### Basic Operations
#### Querying Multiple Balances
For synchronous operations:
```python
addresses = [
# List of addresses
]
balances = multicallable.balanceOf(addresses).call()
```
For asynchronous operations:
```python
addresses = [
# List of addresses
]
balances = await async_multicallable.balanceOf(addresses).call()
```
#### Detailed Call Information
For synchronous operations:
```python
detailed_info = multicallable.balanceOf(addresses).detailed_call()
```
For asynchronous operations:
```python
detailed_info = await async_multicallable.balanceOf(addresses).detailed_call()
```
### Advanced Features
#### Handling Failed Calls
By default, all calls must succeed for the batch call to return successfully. Use `require_success=False` to allow partial success:
```python
mc = Multicallable(contract_address, contract_abi, w3)
partial_result = mc.getNum(list(range(7))).call(require_success=False)
```
#### Batching Large Number of Calls
For large number of calls, you can specify the number of buckets using the `n` parameter:
```python
result = mc.getNum(list(range(70000))).call(require_success=False, n=100)
```
#### Progress Indicator
Enable a progress bar for better visibility into the batch processing:
```python
result = mc.getNum(list(range(70000))).call(n=100, progress_bar=True, require_success=False)
```
#### Custom Multicall Instance
You can also use a custom Multicall instance with a custom address and ABI:
```python
from multicallable.multicall import Multicall
multicall = Multicall(w3, custom_address, custom_abi)
mc = Multicallable(contract_address, contract_abi, multicall=multicall)
```
## Authors
- **[MiKO](https://github.com/MiKoronjoo)** - *Initial work*
- **[Naveed](https://github.com/Navid-Fkh)** - *Contributor*
Raw data
{
"_id": null,
"home_page": "https://github.com/deusfinance/multicallable",
"name": "multicallable",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0.0,>=3.8.0",
"maintainer_email": null,
"keywords": null,
"author": "MiKO, Naveed",
"author_email": "mikoronjoo@gmail.com, naveedinno@proton.me",
"download_url": "https://files.pythonhosted.org/packages/18/3b/a2358c6c2a14ae56aa21bff3c498ceaa8cf4863ca66a2bda9e348d648b31/multicallable-7.1.0.tar.gz",
"platform": null,
"description": "## Multicallable: Simplified Interface for Multicall\n\n`Multicallable` provides a streamlined way to work with the Multicall package, allowing you to batch multiple contract calls into a single request.\n\n### Installation\n\nInstall the package using the following command:\n\n```shell\npip install -U multicallable\n```\n\n### Getting Started\n\n#### Initialize Web3 or AsyncWeb3\n\nFirst, import the Web3 library and set up a Web3 instance. The setup differs depending on whether you are using synchronous or asynchronous operations.\n\nFor synchronous operations:\n\n```python\nfrom web3 import Web3\n\n# Specify Ethereum RPC URL\nETH_RPC_URL = 'https://rpc.ankr.com/eth'\n\n# Initialize Web3 instance\nw3 = Web3(Web3.HTTPProvider(ETH_RPC_URL))\n```\n\nFor asynchronous operations:\n\n```python\nfrom web3 import AsyncWeb3\n\n# Initialize AsyncWeb3 instance\nw3 = AsyncWeb3(AsyncWeb3.AsyncHTTPProvider(ETH_RPC_URL))\n```\n\n#### Import and Initialize Multicallable\n\nNext, import the `Multicallable` class and initialize it for a specific token:\n\n```python\nfrom multicallable import Multicallable\n\n# Truncated ERC20 ABI for demonstration\nERC20_ABI = '[{\"constant\":true,\"inputs\":[],\"name\":\"name\", ...'\n\n# sample token contract address\nTOKEN = '0xDE5ed76E7c05eC5e4572CfC88d1ACEA165109E44'\n\n# Initialize Multicallable instance\nmulticallable = Multicallable(TOKEN, ERC20_ABI, w3)\n```\n\n#### AsyncMulticallable: The Asynchronous Alternative\n\nFor asynchronous use-cases, `AsyncMulticallable` is available. Unlike `Multicallable`, its constructor is empty, and it includes an asynchronous `setup` function that takes the same parameters:\n\n```python\nfrom multicallable import AsyncMulticallable\n\n# Initialize AsyncMulticallable instance\nasync_multicallable = AsyncMulticallable()\nawait async_multicallable.setup(TOKEN, ERC20_ABI, w3) # Make sure w3 is an AsyncWeb3 instance\n```\n\n### Basic Operations\n\n#### Querying Multiple Balances\n\nFor synchronous operations:\n\n```python\naddresses = [\n # List of addresses\n]\nbalances = multicallable.balanceOf(addresses).call()\n```\n\nFor asynchronous operations:\n\n```python\naddresses = [\n # List of addresses\n]\nbalances = await async_multicallable.balanceOf(addresses).call()\n```\n\n#### Detailed Call Information\n\nFor synchronous operations:\n\n```python\ndetailed_info = multicallable.balanceOf(addresses).detailed_call()\n```\n\nFor asynchronous operations:\n\n```python\ndetailed_info = await async_multicallable.balanceOf(addresses).detailed_call()\n```\n\n### Advanced Features\n\n#### Handling Failed Calls\n\nBy default, all calls must succeed for the batch call to return successfully. Use `require_success=False` to allow partial success:\n\n```python\nmc = Multicallable(contract_address, contract_abi, w3)\npartial_result = mc.getNum(list(range(7))).call(require_success=False)\n```\n\n#### Batching Large Number of Calls\n\nFor large number of calls, you can specify the number of buckets using the `n` parameter:\n\n```python\nresult = mc.getNum(list(range(70000))).call(require_success=False, n=100)\n```\n\n#### Progress Indicator\n\nEnable a progress bar for better visibility into the batch processing:\n\n```python\nresult = mc.getNum(list(range(70000))).call(n=100, progress_bar=True, require_success=False)\n```\n\n#### Custom Multicall Instance\n\nYou can also use a custom Multicall instance with a custom address and ABI:\n\n```python\nfrom multicallable.multicall import Multicall\n\nmulticall = Multicall(w3, custom_address, custom_abi)\nmc = Multicallable(contract_address, contract_abi, multicall=multicall)\n```\n\n## Authors\n\n- **[MiKO](https://github.com/MiKoronjoo)** - *Initial work*\n- **[Naveed](https://github.com/Navid-Fkh)** - *Contributor*\n",
"bugtrack_url": null,
"license": null,
"summary": "Easy way to work with Multicall package",
"version": "7.1.0",
"project_urls": {
"Bug Tracker": "https://github.com/deusfinance/multicallable/issues",
"Homepage": "https://github.com/deusfinance/multicallable"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "cfa1b5f55b4e1ac0dfdebf50afcf470520bb35e5a4efe4c23d2cb5d3842d0351",
"md5": "50b4a20be2685bf497fa4392f46723ee",
"sha256": "f99e52b66781278524019d7ee6cecef066005b11d3285a5f26a32ff8a94288c4"
},
"downloads": -1,
"filename": "multicallable-7.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "50b4a20be2685bf497fa4392f46723ee",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0.0,>=3.8.0",
"size": 14906,
"upload_time": "2024-12-13T12:54:33",
"upload_time_iso_8601": "2024-12-13T12:54:33.718574Z",
"url": "https://files.pythonhosted.org/packages/cf/a1/b5f55b4e1ac0dfdebf50afcf470520bb35e5a4efe4c23d2cb5d3842d0351/multicallable-7.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "183ba2358c6c2a14ae56aa21bff3c498ceaa8cf4863ca66a2bda9e348d648b31",
"md5": "525d866688452de3c484bd88fe3a6d3c",
"sha256": "c0cd60a6a02ae08fc36603fc5a793851c64ac422a0d2c02fad4b7bb1594eb39c"
},
"downloads": -1,
"filename": "multicallable-7.1.0.tar.gz",
"has_sig": false,
"md5_digest": "525d866688452de3c484bd88fe3a6d3c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0.0,>=3.8.0",
"size": 13138,
"upload_time": "2024-12-13T12:54:35",
"upload_time_iso_8601": "2024-12-13T12:54:35.232135Z",
"url": "https://files.pythonhosted.org/packages/18/3b/a2358c6c2a14ae56aa21bff3c498ceaa8cf4863ca66a2bda9e348d648b31/multicallable-7.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-13 12:54:35",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "deusfinance",
"github_project": "multicallable",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "web3",
"specs": [
[
">=",
"7.0.0"
],
[
"<",
"8.0.0"
]
]
}
],
"lcname": "multicallable"
}