113 lines
3 KiB
Go
113 lines
3 KiB
Go
package tron
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"math/big"
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/ethereum/go-ethereum/crypto"
|
|
"github.com/fbsobreira/gotron-sdk/pkg/address"
|
|
"github.com/fbsobreira/gotron-sdk/pkg/client"
|
|
"github.com/fbsobreira/gotron-sdk/pkg/proto/api"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/credentials/insecure"
|
|
)
|
|
|
|
type TronAccountBalance struct {
|
|
Address string `json:"address"`
|
|
USDT string `json:"usdt"`
|
|
TRX string `json:"trx"`
|
|
USDTRaw int64 `json:"usdtRaw"`
|
|
TRXRaw int64 `json:"trxRaw"`
|
|
TxFee string `json:"txFee"`
|
|
}
|
|
|
|
func TronBalance(address string) (*TronAccountBalance, error) {
|
|
var accountBalance TronAccountBalance = TronAccountBalance{
|
|
Address: address,
|
|
USDT: "0",
|
|
TRX: "0",
|
|
USDTRaw: 0,
|
|
TRXRaw: 0,
|
|
TxFee: "0",
|
|
}
|
|
conn := client.NewGrpcClient(tronNode.grpcNode)
|
|
err := conn.Start(grpc.WithTransportCredentials(insecure.NewCredentials()))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
balance, err := conn.TRC20ContractBalance(address, tronNode.contractAddress)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
decimals, err := conn.TRC20GetDecimals(tronNode.contractAddress)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
fmtUsdtBalance, _ := FormatSum(balance.Int64(), decimals.Int64())
|
|
accountBalance.USDT = fmtUsdtBalance
|
|
accountBalance.USDTRaw = balance.Int64()
|
|
|
|
account, err := conn.GetAccount(address)
|
|
if err != nil {
|
|
if err.Error() == "account not found" {
|
|
return &accountBalance, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
params, _ := conn.Client.GetChainParameters(context.Background(), &api.EmptyMessage{})
|
|
txFee := 0
|
|
for _, el := range params.GetChainParameter() {
|
|
if el.Key == "getTotalEnergyTargetLimit" {
|
|
txFee += int(el.Value)
|
|
}
|
|
if el.Key == "getTransactionFee" {
|
|
txFee += int(el.Value)
|
|
}
|
|
}
|
|
accountBalance.TxFee, _ = FormatSum(int64(txFee), 6)
|
|
fmtTrxBalance, _ := FormatSum(account.Balance, 6)
|
|
accountBalance.TRX = fmtTrxBalance
|
|
accountBalance.TRXRaw = account.Balance
|
|
conn.Stop()
|
|
return &accountBalance, nil
|
|
}
|
|
|
|
func TronAllowance(owner, spender string) (int64, error) {
|
|
conn := client.NewGrpcClient(tronNode.grpcNode)
|
|
err := conn.Start(grpc.WithTransportCredentials(insecure.NewCredentials()))
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
data := crypto.Keccak256Hash([]byte("allowance(address,address)")).Bytes()[:4]
|
|
ownerAddress, _ := address.Base58ToAddress(owner)
|
|
spenderAddress, _ := address.Base58ToAddress(spender)
|
|
|
|
req := ""
|
|
req += common.Bytes2Hex(data)
|
|
req += "0000000000000000000000000000000000000000000000000000000000000000"[len(ownerAddress.Hex())-4:] + ownerAddress.Hex()[4:]
|
|
req += "0000000000000000000000000000000000000000000000000000000000000000"[len(spenderAddress.Hex())-4:] + spenderAddress.Hex()[4:]
|
|
|
|
res, err := conn.TRC20Call("", tronNode.contractAddress, req, true, 0)
|
|
|
|
if err != nil {
|
|
fmt.Println("TRC20Call error: ", err)
|
|
return 0, err
|
|
}
|
|
|
|
allowance := new(big.Int)
|
|
//fmt.Println("res", res)
|
|
if len(res.GetConstantResult()) > 0 {
|
|
allowance.SetBytes(res.GetConstantResult()[0])
|
|
}
|
|
|
|
conn.Stop()
|
|
return allowance.Int64(), nil
|
|
|
|
}
|