ABI Encoding
Encode function data, event topics, errors, and return values for contract calls in viem-go
Encode function calldata (with selector), event topics, custom errors, and function return values using a parsed ABI. For standalone parameter encoding without a contract ABI, see Encode Parameters and Encode Packed.
Import
import ("math/big""github.com/ethereum/go-ethereum/common""github.com/ChefBingbong/viem-go/abi")
EncodeFunctionData
Encode a function call including the 4-byte selector. Use a parsed ABI and the function name plus arguments.
import ("math/big""github.com/ethereum/go-ethereum/common""github.com/ChefBingbong/viem-go/abi")// parsed is *abi.ABI from abi.Parse(...)data, err := parsed.EncodeFunctionData("transfer",common.HexToAddress("0xRecipient..."),big.NewInt(1000000),)if err != nil {log.Fatal(err)}// data is []byte (selector + ABI-encoded args); use as tx data
- Signature:
(a *ABI) EncodeFunctionData(functionName string, args ...any) ([]byte, error) - Returns selector (4 bytes) + ABI-encoded arguments. Use for transaction
data.
EncodeFunctionArgs
Encode only the arguments (no selector). Useful for constructor args or when you prepend a custom selector.
argsOnly, err := parsed.EncodeFunctionArgs("transfer", to, amount)
EncodeFunctionDataWithSelector
Encode arguments and prepend a custom 4-byte selector:
var customSelector [4]byte
copy(customSelector[:], ...)
data, err := parsed.EncodeFunctionDataWithSelector(customSelector, "transfer", to, amount)
EncodeConstructor
Encode constructor arguments (no selector):
ctorData, err := parsed.EncodeConstructor(arg1, arg2)
EncodeEventTopics
Encode indexed event parameters as topic hashes. First topic is the event signature (unless anonymous); then one topic per indexed argument.
import ("github.com/ethereum/go-ethereum/common""github.com/ChefBingbong/viem-go/abi")// Event Transfer(address indexed from, address indexed to, uint256 value)topics, err := parsed.EncodeEventTopics("Transfer",common.HexToAddress("0xFrom..."),common.HexToAddress("0xTo..."),)if err != nil {log.Fatal(err)}// topics[0] = event sig, topics[1]=from, topics[2]=to// Use topics for eth_getLogs filter
- Signature:
(a *ABI) EncodeEventTopics(eventName string, indexedArgs ...any) ([][]byte, error) - Pass nil for an indexed argument to mean “match any” (wildcard).
EncodeErrorResult
Encode a custom error (selector + arguments). Used when building revert data.
import "github.com/ChefBingbong/viem-go/abi"// Error InsufficientBalance(uint256 balance, uint256 required)encoded, err := parsed.EncodeErrorResult("InsufficientBalance", balance, required)if err != nil {log.Fatal(err)}// encoded = selector + ABI-encoded args
- Signature:
(a *ABI) EncodeErrorResult(errorName string, args ...any) ([]byte, error) - Errors with no inputs return only the 4-byte selector.
EncodeFunctionResult
Encode return values for a function (e.g. for testing or off-chain simulation). Inverse of DecodeFunctionResult.
encoded, err := parsed.EncodeFunctionResult("balanceOf", big.NewInt(1000))
- Signature:
(a *ABI) EncodeFunctionResult(functionName string, values ...any) ([]byte, error)
PrepareEncodeFunctionData
Resolve an overloaded function by name and arguments, and get the selector and resolved name. Useful before encoding the same function many times.
prepared, err := parsed.PrepareEncodeFunctionData("transfer", to, amount)
if err != nil {
log.Fatal(err)
}
// prepared.FunctionName, prepared.FunctionSelector
data, err := parsed.EncodeWithPrepared(prepared, to, amount)
- *PrepareEncodeFunctionData(functionName string, args ...any) (PreparedFunctionData, error)
- *PrepareEncodeFunctionDataBySelector(selector [4]byte) (PreparedFunctionData, error)
- *EncodeWithPrepared(prepared PreparedFunctionData, args ...any) ([]byte, error)
Go notes
- All encode functions return []byte; prefix with
0xwhen you need a hex string. - EncodeFunctionData and Pack are equivalent; EncodeFunctionData is the preferred name.
- Addresses: use common.Address or a hex string; the package converts as needed for encoding.
See also
- Decoding — decode calldata, return data, events, errors
- Encode Parameters — standalone EncodeAbiParameters
- Encode Packed — standalone EncodePacked
- Types — AbiParam and Solidity → Go type mapping