ethers-multicall-provider-fork-lumi
v3.1.5
Published
⚡🕰️ Drop-in solution to batch smart contract RPC calls in a single RPC query via Multicall!
Downloads
8
Maintainers
Readme
ethers-multicall-provider
⚡🚀 Call any set of functions from any set of smart contracts in a single RPC query, seamlessly using ethers' providers API!
Querying an RPC endpoint can be very costly (100+ queries) when loading data from multiple smart contracts. With multicall, batch these queries into a single, on-chain query, without additional over-head!
- Integrates both Multicall2 & Multicall3, enabling faster queries up to block #12_336_033 on mainnet
- Natively supports 25+ EVM-compatible chains on which Multicall3 & Multicall2 are deployed
- Enables 10x faster off-chain data queries, making UIs faster to render and reload
- Built-in support for blockTag-specific contract calls, batching all calls made at the same block tag (if applicable)
- Only fails specific failing smart contract calls when batching, which makes debugging as easy as with native ethers
ethers-multicall-provider
is a drop-in solution batching ALL smart contract calls!
- const provider = getDefaultProvider("...");
+ const provider = MulticallWrapper.wrap(getDefaultProvider("..."));
Installation
npm install ethers-multicall-provider
yarn add ethers-multicall-provider
Usage
Wrap any ethers provider using MulticallWrapper.wrap
and use the wrapped provider anywhere you want to batch calls!
import { ethers } from "ethers";
import { MulticallWrapper } from "ethers-multicall-provider";
const provider = MulticallWrapper.wrap(getDefaultProvider("..."));
MulticallWrapper.isMulticallProvider(provider); // Returns true, only useful for type safety.
let uni = new ethers.Contract("0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", UniAbi, provider);
// Calls performed simultaneously are automatically batched when using the multicall provider.
Promise.all([
uni.name(),
uni.symbol(),
uni.decimals(),
uni.inexistantFunction().catch(() => "default value"),
]).then(console.log);
// When batching calls is no longer expected, just disable it.
provider.isMulticallEnabled = false;
// Calls performed simultaneously will still perform 2 separate on-chain calls.
Promise.all([uni.name(), uni.symbol()]).then(console.log);
Limits
Because calls are batched through the Multicall contract, all calls will inherently have the Multicall contract as msg.sender
. This has no impact on most queries, because most of the time msg.sender
is not used in view functions ; but it may introduce unexpected behaviors in specific smart contracts.
To circumvent this, just use the default ethers provider in places where you don't want msg.sender
to be overriden.