64 lines
1.6 KiB
Go
64 lines
1.6 KiB
Go
|
package eth;
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"math/big"
|
||
|
|
||
|
"github.com/ethereum/go-ethereum/common"
|
||
|
"github.com/ethereum/go-ethereum/core/types"
|
||
|
"github.com/ethereum/go-ethereum/crypto"
|
||
|
"github.com/ethereum/go-ethereum/ethclient"
|
||
|
)
|
||
|
|
||
|
func (e *EthAccount) ApproveUSDTSpender(spender string, amount string) (string, error) {
|
||
|
client, err := ethclient.Dial(ethNode.rpcNode)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
metodId := crypto.Keccak256Hash([]byte("approve(address,uint256)")).Bytes()[:4]
|
||
|
paddedAddress := common.LeftPadBytes(common.HexToAddress(spender).Bytes(), 32)
|
||
|
|
||
|
amountToSend := floatStringToDec(amount, ethNode.usdtContractDecimals)
|
||
|
paddedAmount := common.LeftPadBytes(amountToSend.Bytes(), 32)
|
||
|
|
||
|
var data []byte
|
||
|
data = append(data, metodId...)
|
||
|
data = append(data, paddedAddress...)
|
||
|
data = append(data, paddedAmount...)
|
||
|
|
||
|
nonce, err := client.PendingNonceAt(context.Background(), e.address)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
gasLimit := uint64(60000)
|
||
|
gasTipCap, err := client.SuggestGasTipCap(context.Background())
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
chainId, _ := client.ChainID(context.Background())
|
||
|
toAddress := common.HexToAddress(ethNode.usdtContractAddress)
|
||
|
tx := types.NewTx(&types.DynamicFeeTx{
|
||
|
ChainID: chainId,
|
||
|
To: &toAddress,
|
||
|
Nonce: nonce,
|
||
|
Value: big.NewInt(0),
|
||
|
Gas: gasLimit,
|
||
|
Data: data,
|
||
|
GasTipCap: gasTipCap,
|
||
|
GasFeeCap: big.NewInt(20000000000),
|
||
|
})
|
||
|
|
||
|
signedTx, err := e.SignTx(tx)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
err = client.SendTransaction(context.Background(), signedTx)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
return signedTx.Hash().Hex(), nil
|
||
|
}
|