ABI Encoding
Encode function data, event topics, errors, and return values for contract calls in viem-go
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 ( "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ChefBingbong/viem-go/abi")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(a *ABI) EncodeFunctionData(functionName string, args ...any) ([]byte, error)data.Encode only the arguments (no selector). Useful for constructor args or when you prepend a custom selector.
argsOnly, err := parsed.EncodeFunctionArgs("transfer", to, amount)
Encode arguments and prepend a custom 4-byte selector:
var customSelector [4]byte
copy(customSelector[:], ...)
data, err := parsed.EncodeFunctionDataWithSelector(customSelector, "transfer", to, amount)
Encode constructor arguments (no selector):
ctorData, err := parsed.EncodeConstructor(arg1, arg2)
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(a *ABI) EncodeEventTopics(eventName string, indexedArgs ...any) ([][]byte, error)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(a *ABI) EncodeErrorResult(errorName string, args ...any) ([]byte, error)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))
(a *ABI) EncodeFunctionResult(functionName string, values ...any) ([]byte, error)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)
0x when you need a hex string.