viem-goviem-go

simulateCalls

Simulates multiple calls and returns their results

Import

Import the public actions package so you can call this action.

import "github.com/ChefBingbong/viem-go/actions/public"

Usage

An example showing how to set up and run multiple simulated contract calls.

import (
"context"
"log"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ChefBingbong/viem-go/actions/public"
"github.com/ChefBingbong/viem-go/abi"
"github.com/ChefBingbong/viem-go/client"
"github.com/ChefBingbong/viem-go/client/transport"
"github.com/ChefBingbong/viem-go/chain/definitions"
)
ctx := context.Background()
publicClient, err := client.CreatePublicClient(client.PublicClientConfig{
Chain: definitions.Mainnet,
Transport: transport.HTTP("https://eth.llamarpc.com"),
})
if err != nil {
log.Fatal(err)
}
defer func() { _ = publicClient.Close() }()
tokenAddr := common.HexToAddress("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48")
erc20ABI, _ := abi.ParseABI(`[{"inputs":[],"name":"totalSupply","outputs":[{"type":"uint256"}],"type":"function"}]`)
result, err := public.SimulateCalls(ctx, publicClient, public.SimulateCallsParameters{
Calls: []public.SimulateCall{
{
To: &tokenAddr,
ABI: erc20ABI,
FunctionName: "totalSupply",
},
},
})
if err != nil {
log.Fatal(err)
}
log.Printf("Results: %d calls simulated", len(result.Results))

Returns

*SimulateCallsReturnType

An object containing:

  • Results []SimulateCallResult - The results of each call
  • AssetChanges []AssetChange - Asset balance changes (if TraceAssetChanges was enabled)
  • Block formatters.Block - The simulated block data

Parameters

Configuration options accepted by this action.

Calls

  • Type: []SimulateCall
  • Required

The calls to simulate.

result, err := public.SimulateCalls(ctx, publicClient, public.SimulateCallsParameters{
Calls: []public.SimulateCall{
{
To: &tokenAddr,
ABI: erc20ABI,
FunctionName: "totalSupply",
},
},
})

Account

  • Type: *common.Address
  • Optional

The account attached to the calls (msg.sender).

senderAddr := common.HexToAddress("0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266")
result, err := public.SimulateCalls(ctx, publicClient, public.SimulateCallsParameters{
Account: &senderAddr,
Calls: []public.SimulateCall{...},
})

BlockNumber

  • Type: *uint64
  • Optional

The block number to simulate at.

blockNum := uint64(12345)
result, err := public.SimulateCalls(ctx, publicClient, public.SimulateCallsParameters{
Calls: []public.SimulateCall{...},
BlockNumber: &blockNum,
})

BlockTag

  • Type: BlockTag
  • Optional

The block tag to simulate at (e.g., "latest", "pending").

result, err := public.SimulateCalls(ctx, publicClient, public.SimulateCallsParameters{
Calls: []public.SimulateCall{...},
BlockTag: public.BlockTagSafe,
})

TraceAssetChanges

  • Type: bool
  • Default: false
  • Optional

Enables tracing of asset (ETH/ERC20) balance changes.

result, err := public.SimulateCalls(ctx, publicClient, public.SimulateCallsParameters{
Calls: []public.SimulateCall{...},
TraceAssetChanges: true,
})

TraceTransfers

  • Type: bool
  • Default: false
  • Optional

Enables transfer tracing.

result, err := public.SimulateCalls(ctx, publicClient, public.SimulateCallsParameters{
Calls: []public.SimulateCall{...},
TraceTransfers: true,
})

Validation

  • Type: bool
  • Default: false
  • Optional

Enables validation mode.

result, err := public.SimulateCalls(ctx, publicClient, public.SimulateCallsParameters{
Calls: []public.SimulateCall{...},
Validation: true,
})

StateOverrides

  • Type: types.StateOverride
  • Optional

State overrides for the simulation.

JSON-RPC Method

Underlying JSON-RPC methods used by this action.

Uses eth_call or eth_simulateV1 (if supported) for advanced simulation features.