Sending $USDT on Unity

Hi there, my developer trying to send $USDT from one wallet to another on Unity C#.

He uses the following code to send MATIC & it works:

public async Task<string> SendFunds(string toAddress, float amountInUSDT)
    {	
		Account newaccount = UserWalletInfo.Instance.GetAccount(); 
		Web3 NewWeb3 = new Web3(newaccount, Web3Authentication.Instance.GetRpcURL());
		BigInteger amountInWei = Web3.Convert.ToWei(0.1, UnitConversion.EthUnit.Ether);
		var receipt = await NewWeb3.TransactionManager.SendTransactionAsync(newaccount.Address,toAddress, new HexBigInteger(amountInWei));
		Debug.Log(receipt);
		return receipt;
    }

with NewWeb3.Eth
https://polygonscan.com/tx/0x1b4932a51d97c00aa6d4ee5fb9f39e2a9f8402c857b8fe923be0e4814633e73b

only NewWeb3

https://polygonscan.com/tx/0x283fa356640ef33f8551de6ca7ee16899cbea87783842217c1c9e1c1dfc6e655

But $USDT is not a native coin on the Polygon, so we have $USDT contract address(string contractAddress) & ABI file(string contractABI)

He uses the following code:

public async Task<string> SendToken(string toAddress, decimal amountInTokens)
{
    Account senderAccount = UserWalletInfo.Instance.GetAccount();
    Web3 web3 = new Web3(senderAccount, Web3Authentication.Instance.GetRpcURL());

    string contractAddress = GetContractAddress() ;
    string abi = "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]";

    var erc20Contract = web3.Eth.GetContract(abi, contractAddress);
    BigInteger amountInWei = Web3.Convert.ToWei(amountInTokens, UnitConversion.EthUnit.Ether);

    var transferFunction = erc20Contract.GetFunction("transfer");

    string data = transferFunction.GetData(toAddress, amountInWei);
    var transactionInput = new TransactionInput { To = contractAddress, Data = data };
    var transactionHash = await web3.Eth.Transactions.SendTransaction.SendRequestAsync(transactionInput);

    Debug.Log($"Transaction Hash: {transactionHash}");

    return transactionHash;
}```

We have RPCUrl from Infura.

And all of our in-game currency works on the $USDT, but for this use-case, we get the following error:

"RpcResponseException: The method eth_sendTransaction does not exist/is not available: eth_sendTransaction"

Seems like eth_sendTransaction is for a web protocol.

Can you please help us fix that, so it works on our Unity game?

Thanks.

@partners Your request has been forwarded to our Dev team and we will get back with further updates.

Hi there, thanks for the response.

is there any update on that yet?

Hi vjgee,

Can you please check the status from the dev team?

We are expecting this to be solved to launch the game.

Thanks in advance!

@partners Thanks for your patience.

Our Dev team informed that this is out of the scope of our SDK. I was able to find some online resource that you can check for the error you get and probably report it there :

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.