• This repository has been archived on 08/Jun/2024
  • Stars
    star
    177
  • Rank 215,985 (Top 5 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created almost 5 years ago
  • Updated 7 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

ethers.js-compatible wrapper around Multicall

ethcall

Utility library to make calls to Ethereum blockchain.

Uses MakerDAO's Multicall contracts to make multiple requests in a single HTTP query. Encodes and decodes data automatically.

Powered by abi-coder and ethers.js.

npm install ethcall

This package requires ethers V6. If you use ethers V5, you need to install ethcall V5.

This package uses Import Assertions, which is supported by Vite 4+, Rollup 3+, and Node 16+.

This package is a pure ESM package. Follow this guide for more info.

API

  • Contract
    • constructor(address, abi): creates Contract instance
    • CALL_FUNC_NAME: yields a call object; usage is similar to ethers Contract class
  • Provider
    • constructor(chainId, provider, config): creates a Provider instance
    • all(calls): executes all calls in a single request
    • tryAll(calls): executes all calls in a single request. Ignores reverted calls and returns null value in place of return data (wrapper on top of tryAggregate method)
    • tryEach(calls, canFail): executes all calls in a single request. Ignores reverted calls and returns null value in place of return data for the calls that are allowed to fail (wrapper on top of aggregate3 method)
    • getEthBalance(address): returns account ether balance

Example

Also see examples for reference.

import { Contract, Provider } from 'ethcall';
import { InfuraProvider } from 'ethers';

import erc20Abi from './abi/erc20.json' assert { type: 'json' };

const infuraKey = 'INSERT_YOUR_KEY_HERE';
const provider = new InfuraProvider('mainnet', infuraKey);

const daiAddress = '0x6b175474e89094c44da98b954eedeac495271d0f';

async function call() {
  const ethcallProvider = new Provider(1, provider);

  const daiContract = new Contract(daiAddress, erc20Abi);

  const uniswapDaiPool = '0x2a1530c4c41db0b0b2bb646cb5eb1a67b7158667';

  const ethBalanceCall = ethcallProvider.getEthBalance(uniswapDaiPool);
  const daiBalanceCall = daiContract.balanceOf(uniswapDaiPool);

  const data = await ethcallProvider.all([ethBalanceCall, daiBalanceCall], {
    blockTag: 'latest',
  });

  const ethBalance = data[0];
  const daiBalance = data[1];

  console.log('eth balance', ethBalance.toString());
  console.log('dai balance', daiBalance.toString());
}

call();

Contributing

All Mulitcall contracts are stored in src/multicall.ts file. There are three getMulticall methods corresponding to three Multicall versions. To add a new contract, you need to know its version, address, chain id of the underlying chain, and (optionally) block at which the Multicall contract was deployed.

Deployless Multicall

If you query a chain on which Multicall is not deployed, or if you query a historical block before the deployment of the contract, the deployless version will be used instead. In short, deployless Multicall "emulates" the deployed contract and returns the exact same data. Note that you can't query ETH balance using deployless version.

You can read more about deployless Multicall here.

More Repositories

1

blocksmith

Bitcoin/Ethereum key manipulation
Python
255
star
2

mev-inspect-js

A JS port of "mev-inspect-py" optimised for ease of use.
TypeScript
129
star
3

astro-analytics

Astro components for site analytics
Astro
110
star
4

hollander-core

ERC20 token swaps via gradual dutch auctions
Solidity
43
star
5

deployless-multicall

Solidity
28
star
6

catflip

MakerDAO system parameters
Vue
16
star
7

bag-app

Onchain Farcaster Frames
TypeScript
15
star
8

ethereum-json-rpc

An interactive reference of the Ethereum node API
Vue
13
star
9

abi-coder

Ethereum ABI encoding and decoding utils
TypeScript
11
star
10

metablock-page

Vue
10
star
11

astro-head

Batteries-included Astro component for your `<head>`
Astro
8
star
12

brickwork-vue

Customizable and accessible UI components with sane defaults for Vue 3
Vue
8
star
13

ethlabel

Ethereum address to labels mapping database
TypeScript
7
star
14

telegame

Library for Telegram Gaming Platform
Python
6
star
15

module-frame

FC frames + ERC7579 modules
Solidity
6
star
16

sandpack-vue

Vue components for Sandpack
TypeScript
6
star
17

astro-latex

LaTeX component for Astro
Astro
4
star
18

module-airdrop-claim

TypeScript
4
star
19

evmbeat

Live stats for 20+ EVM networks
Vue
4
star
20

mev-explorer

Vue
3
star
21

sublime-astro

Astro syntax highlighting for Sublime Text
3
star
22

hollander-react

TypeScript
2
star
23

compound-governance-dashboard

Compound Governance Dashboard (currently Ropsten)
Vue
2
star
24

starter-app

Bare-bones app template using Vue, Vite, and Vercel
Vue
2
star
25

ethdev

Ethereum dapp development utilities
JavaScript
2
star
26

eip-7702

TypeScript
2
star
27

balancer-toolbox

Vue
1
star
28

hollander-subgraph

https://thegraph.com/hosted-service/subgraph/destiner/hollander-goerli
TypeScript
1
star
29

sor

JavaScript
1
star
30

hyperlane-hook-scroll

Solidity
1
star
31

hollander-app

Vue
1
star
32

block-subgraph

Block indexing subgraph
TypeScript
1
star
33

astro-alpha

Bold, but minimal blog theme for Astro.
Vue
1
star
34

reports

1
star
35

telegram-bot

TypeScript
1
star