npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ethers-multicall-provider

v6.3.0

Published

⚡🕰️ Drop-in solution to batch smart contract RPC calls in a single RPC query via Multicall!

Downloads

59,408

Readme

ethers-multicall-provider

npm package Build Status Downloads Issues Commitizen Friendly Semantic Release

⚡🚀 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

Using ethers-v6

[!WARNING]
Ethers made changes to their Provider & Signer classes throughout v6, that are breaking types. For versions v6.7 to v6.10, use [email protected]. For later versions, use [email protected].

npm install ethers-multicall-provider
yarn add ethers-multicall-provider

Using ethers-v5

[!WARNING]
This version is deprecated and probably is not as efficient as with v6.

npm install [email protected]
yarn add [email protected]

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

msg.sender override

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.

Network cache

Starting from ethers-v6, network is no longer cached in the provider, so that each RPC call first requests the network and updates the provider consequently. Using ethers-multicall-provider, the first network the provider is connected to is cached and can only be changed by calling fetchNetwork().