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
- Send USDT on TRON with Go — TRC20 token transfers
- Staking TRX for Energy and Bandwidth — Get energy for contract calls
- GoTRON API Reference — Full API documentation