Interact with TRON Smart Contracts in Go

GoTRON SDK provides full smart contract interaction: trigger state-changing methods, call read-only functions, and decode return values.

Read-Only Calls (Constant)

Read contract state without broadcasting a transaction:

package main

import (
    "fmt"
    "log"

    "github.com/fbsobreira/gotron-sdk/pkg/client"
)

func main() {
    conn := client.NewGrpcClient("grpc.trongrid.io:50051")
    if err := conn.Start(); err != nil {
        log.Fatal(err)
    }
    defer conn.Stop()

    // Call a read-only method
    tx, err := conn.TriggerConstantContract(
        "CALLER_ADDRESS",
        "CONTRACT_ADDRESS",
        "balanceOf(address)",
        `[{"address": "HOLDER_ADDRESS"}]`,
    )
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Result: %x\n", tx.GetConstantResult())
}

State-Changing Calls (Trigger)

Execute a contract method that modifies state:

tx, err := conn.TriggerContract(
    "CALLER_ADDRESS",
    "CONTRACT_ADDRESS",
    "transfer(address,uint256)",
    `[{"address": "RECIPIENT"}, {"uint256": "1000000"}]`,
    100_000_000, // fee limit (100 TRX)
    0,           // call value (TRX to send)
    "",          // token ID (empty for TRX)
    0,           // token amount
)
if err != nil {
    log.Fatal(err)
}

// Sign and broadcast tx.Transaction...

TRC20 Token Operations

GoTRON provides dedicated helper methods for TRC20 contracts:

// Get token metadata
name, _ := conn.TRC20GetName("TOKEN_CONTRACT")
symbol, _ := conn.TRC20GetSymbol("TOKEN_CONTRACT")
decimals, _ := conn.TRC20GetDecimals("TOKEN_CONTRACT")

fmt.Printf("Token: %s (%s), Decimals: %s\n", name, symbol, decimals)

// Get balance
balance, _ := conn.TRC20ContractBalance("HOLDER", "TOKEN_CONTRACT")
fmt.Printf("Balance: %s\n", balance.String())

// Transfer
tx, err := conn.TRC20Send("FROM", "TO", "TOKEN_CONTRACT", amount, feeLimit)

Estimate Energy

Before calling a contract, estimate the energy cost:

resource, err := conn.GetAccountResource("CALLER_ADDRESS")
if err != nil {
    log.Fatal(err)
}

energyAvailable := resource.GetEnergyLimit() - resource.GetEnergyUsed()
fmt.Printf("Energy available: %d\n", energyAvailable)

Using tronctl CLI

# Call a read-only contract method
tronctl contract call \
  --contract CONTRACT_ADDRESS \
  --method "balanceOf(address)" \
  --params '["HOLDER_ADDRESS"]'

# Trigger a state-changing method
tronctl contract trigger \
  --from CALLER_ADDRESS \
  --contract CONTRACT_ADDRESS \
  --method "transfer(address,uint256)" \
  --params '["RECIPIENT", "1000000"]' \
  --fee-limit 100000000

Next Steps