Categorygithub.com/jbrower95/multicall-go
modulepackage
0.0.0-20241012224745-7e9c19976cb5
Repository: https://github.com/jbrower95/multicall-go.git
Documentation: pkg.go.dev

# README

Multicall Client for Ethereum

Tests Passing codecov

This package provides a Go implementation of the Ethereum Multicall3 contract, enabling efficient batched calls to on-chain contracts using the Ethereum JSON-RPC API. It simplifies making multiple contract read-only (view) calls in a single network request.

Features

  • Multicall Support: Aggregate multiple contract calls into a single request, saving on network requests and gas.
  • Batching: Automatically handles batching of requests when the size exceeds a defined limit.
  • Customizable: Supports custom block height, batching sizes, and deserialization functions.

Table of Contents

Installation

Install the Go package via:

go get github.com/jbrower95/multicall-go

Usage

Creating the Client

To create a MulticallClient, pass a context.Context, an ethclient.Client, and optional settings.

client, _ := ethclient.Dial("https://your_rpc_url")
ctx := context.Background()
mc, _ := multicall.NewMulticallClient(ctx, client, nil)

Performing two RPC calls at once

You can perform three kinds of actions;

  • Checking the balance of an address
  • Fetching the block number that the multicall was read from, and
  • Performing an arbitrary smart contract read

In this example, we fetch the balance of 0xdeadbeefdeadbeef while also fetching the current block number. We use Do() for this.

balanceCall := multicallClient.GetBalance(common.HexToAddress("0xdeadbeefdeadbeef"))
blockNumberCall := multicallClient.GetBlockNumber()

balance, blockNumber, _ := multicall.Do(multicallClient, balanceCall, blockNumberCall)
fmt.Println("Balance:", balance, "Block Number:", blockNumber)

Performing list of RPC calls

Use DoMany to perform many similarly-typed RPC calls at once:

calls := []*multicall.MultiCallMetaData[big.Int]{
    multicallClient.GetBalance(common.HexToAddress("0xAddress1")),
    multicallClient.GetBalance(common.HexToAddress("0xAddress2")),
}

results, _ := multicall.DoMany(multicallClient, calls...)
for i, result := range *results {
    fmt.Printf("Call %d result: %v\n", i+1, result)
}

Testing

go test is run automatically in CI.

# Functions

Describes a call that invokes the (constant) contract method with params as input values and sets the output to result.
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
//////////////////////.
No description provided by the author
No description provided by the author
* * Initializes a multicall client.

# Structs

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author