ContractCall
ContractCall calls a contract method. It is used for read-only methods.
Factory Pattern
info
you can use factory pattern for more type safety.
func ContractCall[T any](
w wallet.Wallet,
contractAddress string,
opts *bind.CallOpts,
callData []byte,
unpack func([]byte) (T, error),
) (T, error)
func main() {
setting := gas.AlchemySetting{
ApiKey: "api-key",
Network: types.EthMainnet,
}
alchemy := gas.NewAlchemy(setting)
w, _ := wallet.New("<privateKey>")
w.Connect(alchemy.GetProvider())
// Create contract instance
contract := abi.NewYourContract()
contractAddress := "0x1234567890123456789012345678901234567890"
// Prepare call data
data := abi.PackXXX(<data>)
// Unpack function
unpack := func(b []byte) (*big.Int, error) {
return contract.UnpackXXX(b)
}
// Execute call
result, err := factory.ContractCall(w, contractAddress, nil, data, unpack)
if err != nil {
panic(err)
}
fmt.Printf("Result: %v\n", result) // 100% *big.Int
}
Call from Wallet
warning
- It requires connected wallet.
- It does not work on non-Ethereum compatible networks.
func ContractCall(
contractAddress string,
opts *bind.CallOpts,
callData []byte,
unpack func([]byte) (any, error),
) (any, error)
func main() {
setting := gas.AlchemySetting{
ApiKey: "api-key",
Network: types.EthMainnet,
}
alchemy := gas.NewAlchemy(setting)
w, _ := wallet.New("<privateKey>")
w.Connect(alchemy.GetProvider())
// Create contract instance
contract := abi.NewYourContract()
contractAddress := "0x1234567890123456789012345678901234567890"
// Prepare call data
data := abi.PackXXX(<data>)
// Unpack function
unpack := func(b []byte) (any, error) {
return contract.UnpackXXX(b)
}
// Execute call
result, err := w.ContractCall(contractAddress, nil, data, unpack)
if err != nil {
panic(err)
}
fmt.Printf("Result: %v\n", result)
}