wallet/pkg/tron/tron_withdraw.go
Anton Nesterov 1382da92a3
[init]
2024-08-31 16:46:20 +02:00

185 lines
5.1 KiB
Go

package tron
import (
"encoding/hex"
"fmt"
"strconv"
"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"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
const trc20TransferFromSig = "0x23b872dd"
func (ta *TronAccount) WithdrawUSDTByCommissionContract(contractAddr string, from string, to string, amount string, camount string) (string, error) {
amountFloat, _ := strconv.ParseFloat(amount, 64)
comissionFloat, _ := strconv.ParseFloat(camount, 64)
conn := client.NewGrpcClient(tronNode.grpcNode)
err := conn.Start(grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
return "", err
}
dec, err := conn.TRC20GetDecimals(tronNode.contractAddress)
if err != nil {
return "", err
}
metodId := crypto.Keccak256Hash([]byte("chargeTransfer(address,address,address,uint256,uint256)")).Bytes()[:4]
token, _ := address.Base58ToAddress(tronNode.contractAddress)
fromAddress, _ := address.Base58ToAddress(from)
toAddress, _ := address.Base58ToAddress(to)
amountToSend := Float64ToDecimals(amountFloat, dec.Int64())
paddedAmount := common.LeftPadBytes(amountToSend.Bytes(), 32)
comissionToSend := Float64ToDecimals(comissionFloat, dec.Int64())
paddedComission := common.LeftPadBytes(comissionToSend.Bytes(), 32)
req := ""
req += common.Bytes2Hex(metodId)
fmt.Println("req: ", req)
req += "0000000000000000000000000000000000000000000000000000000000000000"[len(token.Hex())-4:] + token.Hex()[4:]
req += "0000000000000000000000000000000000000000000000000000000000000000"[len(fromAddress.Hex())-4:] + fromAddress.Hex()[4:]
req += "0000000000000000000000000000000000000000000000000000000000000000"[len(toAddress.Hex())-4:] + toAddress.Hex()[4:]
req += common.Bytes2Hex(paddedAmount)
req += common.Bytes2Hex(paddedComission)
txe, err := conn.TRC20Call(ta.Address(), contractAddr, req, false, tronNode.feeLimit)
if err != nil {
fmt.Println("TRC20Call error: ", err)
return "", err
}
tx, err := ta.SignTx(txe.Transaction)
if err != nil {
return "", err
}
_, err = conn.Broadcast(tx)
if err != nil {
fmt.Println("Broadcast error: ", err)
return "", err
}
conn.Stop()
return hex.EncodeToString(txe.GetTxid()), nil
}
func (ta *TronAccount) WithdrawUSDTBySpender(from string, to string, amount string) (string, error) {
amountFloat, _ := strconv.ParseFloat(amount, 64)
conn := client.NewGrpcClient(tronNode.grpcNode)
err := conn.Start(grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
return "", err
}
dec, err := conn.TRC20GetDecimals(tronNode.contractAddress)
if err != nil {
return "", err
}
addrA, _ := address.Base58ToAddress(from)
addrB, _ := address.Base58ToAddress(to)
amountToSend := Float64ToDecimals(amountFloat, dec.Int64())
paddedAmount := common.LeftPadBytes(amountToSend.Bytes(), 32)
req := trc20TransferFromSig
req += "0000000000000000000000000000000000000000000000000000000000000000"[len(addrA.Hex())-4:] + addrA.Hex()[4:]
req += "0000000000000000000000000000000000000000000000000000000000000000"[len(addrB.Hex())-4:] + addrB.Hex()[4:]
req += common.Bytes2Hex(paddedAmount)
txe, err := conn.TRC20Call(ta.Address(), tronNode.contractAddress, req, false, tronNode.feeLimit)
if err != nil {
return "", err
}
tx, err := ta.SignTx(txe.Transaction)
if err != nil {
return "", err
}
_, err = conn.Broadcast(tx)
if err != nil {
fmt.Println("Broadcast error: ", err)
return "", err
}
conn.Stop()
return hex.EncodeToString(txe.GetTxid()), nil
}
func (ta *TronAccount) WithdrawUSDT(recipient string, amount string) (string, error) {
amountFloat, _ := strconv.ParseFloat(amount, 64)
sender := ta.Address()
conn := client.NewGrpcClient(tronNode.grpcNode)
err := conn.Start(grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
return "", err
}
dec, err := conn.TRC20GetDecimals(tronNode.contractAddress)
if err != nil {
return "", err
}
amountToSend := Float64ToDecimals(amountFloat, dec.Int64())
txe, err := conn.TRC20Send(sender, recipient, tronNode.contractAddress, amountToSend, tronNode.feeLimit)
if err != nil {
return "", err
}
tx, err := ta.SignTx(txe.Transaction)
if err != nil {
return "", err
}
_, err = conn.Broadcast(tx)
if err != nil {
fmt.Println("Broadcast error: ", err)
return "", err
}
conn.Stop()
return hex.EncodeToString(txe.GetTxid()), nil
}
func (ta *TronAccount) WithdrawTRX(recipient string, amount string) (string, error) {
amountFloat, _ := strconv.ParseFloat(amount, 64)
sender := ta.Address()
conn := client.NewGrpcClient(tronNode.grpcNode)
err := conn.Start(grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
return "", err
}
amountToSend := Float64ToDecimals(amountFloat, 6)
txe, err := conn.Transfer(sender, recipient, amountToSend.Int64())
if err != nil {
return "", err
}
tx, err := ta.SignTx(txe.Transaction)
if err != nil {
return "", err
}
_, err = conn.Broadcast(tx)
if err != nil {
fmt.Println("Broadcast error: ", err)
return "", err
}
conn.Stop()
return hex.EncodeToString(txe.GetTxid()), nil
}