package main
import (
"context"
"crypto/tls"
"encoding/json"
"fmt"
"github.com/fbsobreira/gotron-sdk/pkg/client"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)
// QuickNode endpoints consist of two crucial components: the endpoint name and the corresponding token
// For eg: QN Endpoint: https://docs-demo.tron-mainnet.quiknode.pro/abcde123456789
// endpoint will be: docs-demo.tron-mainnet.quiknode.pro:50051 {50051 is the port number for Tron gRPC}
// token will be : abcde123456789
var token = "YOUR_TOKEN"
var endpoint = "YOUR_ENDPOINT:50051"
type auth struct {
token string
}
func (a *auth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
return map[string]string{
"x-token": a.token,
}, nil
}
func (a *auth) RequireTransportSecurity() bool {
return false
}
func main() {
opts := []grpc.DialOption{
grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})),
grpc.WithPerRPCCredentials(&auth{token}),
}
conn := client.NewGrpcClient(endpoint)
if err := conn.Start(opts...); err != nil {
panic(err)
}
defer conn.Conn.Close()
from := "TTGhREx2pDSxFX555NWz1YwGpiBVPvQA7e"
contractAddress := "TVSvjZdyDSNocHm7dP3jvCmMNsCnMTPa5W"
method := "transfer(address,uint256)"
jsonString := `[{"address": "TE4c73WubeWPhSF1nAovQDmQytjcaLZyY9"},{"uint256": "100"}]`
tAmount := int64(0)
tTokenID := ""
tTokenAmount := int64(0)
fmt.Println("Estimating energy for contract call...")
energy, err := conn.EstimateEnergy(
from, // Caller's address
contractAddress, // Contract address
method, // Function selector
jsonString, // Parameters in JSON format
tAmount, // TRX value to send
tTokenID, // Token ID (if applicable)
tTokenAmount, // Token value (if applicable)
)
if err != nil {
fmt.Printf("Error estimating energy: %v\n", err)
return
}
fmt.Println("Energy estimation successful! Results:")
jsonData, _ := json.MarshalIndent(energy, "", " ")
fmt.Println(string(jsonData))
if !energy.Result.Result {
fmt.Println("Energy estimation failed!")
if len(energy.Result.Message) > 0 {
fmt.Printf("Error message: %s\n", energy.Result.Message)
}
return
}
energyRequired := energy.EnergyRequired
energyBuffer := energyRequired / 5 // Add 20% buffer
recommendedFeeLimit := (energyRequired + energyBuffer) * 420
fmt.Printf("\nEstimated energy required: %d\n", energyRequired)
fmt.Printf("Recommended fee limit (with 20%% buffer): %d SUN\n", recommendedFeeLimit)
fmt.Println("\nYou can use this fee limit when making the actual transaction.")
}