Skip to content

Instantly share code, notes, and snippets.

@farukterzioglu
Last active October 12, 2020 21:36
Show Gist options
  • Save farukterzioglu/bfc1f67dc61a7959b65dbdd5f284e27f to your computer and use it in GitHub Desktop.
Save farukterzioglu/bfc1f67dc61a7959b65dbdd5f284e27f to your computer and use it in GitHub Desktop.

Revisions

  1. farukterzioglu revised this gist Oct 12, 2020. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions gistfile2.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    <PackageReference Include="HDWallet.Tron" Version="0.1.2" />
  2. farukterzioglu revised this gist Oct 12, 2020. 1 changed file with 11 additions and 0 deletions.
    11 changes: 11 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,11 @@
    <ItemGroup>
    <PackageReference Include="Nethereum.Web3" Version="3.8.0" />
    <PackageReference Include="Nethereum.ABI" Version="3.8.0" />
    <PackageReference Include="nunit" Version="3.12.0" />
    <PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
    <PackageReference Include="NBitcoin.Secp256k1" Version="1.0.1" />
    <PackageReference Include="NBitcoin" Version="5.0.27" />
    <PackageReference Include="RestSharp" Version="106.10.1" />
    <PackageReference Include="Moq" Version="4.14.6" />
    </ItemGroup>
  3. farukterzioglu created this gist Oct 12, 2020.
    125 changes: 125 additions & 0 deletions unittest.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,125 @@
    using System;
    using System.Net.Http;
    using System.Text;
    using System.Threading.Tasks;
    using HDWallet.Core;
    using HDWallet.Tron;
    using NBitcoin.DataEncoders;
    using Nethereum.Contracts;
    using Nethereum.RPC.Eth.DTOs;
    using Newtonsoft.Json;
    using NUnit.Framework;

    namespace TronSharp.Tests.SmartContract
    {
    public static class AddressHelper
    {
    public static byte[] ToHexByteArray(this string tronAddress)
    {
    return Encoders.Base58Check.DecodeData(tronAddress);
    }

    public static string ToHexString(this string tronAddress)
    {
    return ToHexByteArray(tronAddress).ToHexString();
    }

    public static string ToVisibleAddress(this string tronAddress)
    {
    if (string.IsNullOrWhiteSpace(tronAddress))
    {
    return null;
    }

    byte[] bytes = tronAddress.FromHexToByteArray();
    return Encoders.Base58Check.EncodeData(bytes);
    }
    }

    public class BroadCastTrc20
    {
    [Test]
    public async Task ShouldBroadCast()
    {
    IHDWallet<TronWallet> wallet = new TronHDWallet("push wrong tribe amazing again cousin hill belt silent found sketch monitor");
    TronWallet wallet0 = wallet.GetAccount(0).GetExternalWallet(0);
    string wallet0Address = wallet0.Address;

    TronWallet wallet1 = wallet.GetAccount(0).GetExternalWallet(1);
    string wallet1Address = wallet1.Address;

    var ownerAddress = AddressHelper.ToHexString(wallet0Address);
    var fromAddress = AddressHelper.ToHexString(wallet0Address).Substring(2);
    var toAddress = AddressHelper.ToHexString(wallet1Address).Substring(2);

    var abi = "[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_upgradedAddress\",\"type\":\"address\"}],\"name\":\"deprecate\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"deprecated\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_evilUser\",\"type\":\"address\"}],\"name\":\"addBlackList\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"upgradedAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maximumFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_maker\",\"type\":\"address\"}],\"name\":\"getBlackListStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"who\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"calcFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"who\",\"type\":\"address\"}],\"name\":\"oldBalanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newBasisPoints\",\"type\":\"uint256\"},{\"name\":\"newMaxFee\",\"type\":\"uint256\"}],\"name\":\"setParams\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"issue\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"remaining\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"basisPointsRate\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isBlackListed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_clearedUser\",\"type\":\"address\"}],\"name\":\"removeBlackList\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_UINT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blackListedUser\",\"type\":\"address\"}],\"name\":\"destroyBlackFunds\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_initialSupply\",\"type\":\"uint256\"},{\"name\":\"_name\",\"type\":\"string\"},{\"name\":\"_symbol\",\"type\":\"string\"},{\"name\":\"_decimals\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_blackListedUser\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_balance\",\"type\":\"uint256\"}],\"name\":\"DestroyedBlackFunds\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Issue\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Redeem\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"newAddress\",\"type\":\"address\"}],\"name\":\"Deprecate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"AddedBlackList\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"RemovedBlackList\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"feeBasisPoints\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"maxFee\",\"type\":\"uint256\"}],\"name\":\"Params\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}]";
    var contractAddress = AddressHelper.ToHexString("TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK");

    ContractBuilder contractBuilder = new ContractBuilder(abi, contractAddress);
    var functionSignature = contractBuilder.GetFunctionAbi("transfer").Sha3Signature;

    Nethereum.Contracts.Contract contract = new Nethereum.Contracts.Contract(null, abi, contractAddress);

    Function transferFunction = contract.GetFunction("transfer");
    TransactionInput input = transferFunction.CreateTransactionInput(string.Empty, toAddress, 50000000000);
    string inputData = input.Data;
    string parameter = input.Data.Replace($"0x{functionSignature}", "");

    var url = "https://api.shasta.trongrid.io";
    string resultContent;
    using (var client = new HttpClient(){ BaseAddress = new Uri(url)})
    {
    TriggerSmartContractRequest req = new TriggerSmartContractRequest()
    {
    owner_address = ownerAddress,
    contract_address = contractAddress,
    function_selector = "transfer(address,uint256)",
    parameter = parameter,
    fee_limit = 1000000
    };

    var serializedData = JsonConvert.SerializeObject(req);

    var requestData = new StringContent(
    serializedData,
    System.Text.Encoding.UTF8,
    "application/json");

    var result = await client.PostAsync("wallet/triggersmartcontract", requestData);
    resultContent = await result.Content.ReadAsStringAsync();
    }

    var response = JsonConvert.DeserializeObject<TriggerTrc20TokenResponse>(resultContent);
    Assert.True(response.result.result);
    Assert.NotNull(response.transaction);

    var transaction = response.transaction;

    // Sign
    var txId = transaction.txID.FromHexToByteArray();
    Signature signature = wallet0.Sign(txId);
    TronSignature tronSignature = new TronSignature(signature);
    var signatureHex = Helper.ToHexString(tronSignature.SignatureBytes);
    transaction.signature.Add(signatureHex);

    // Broadcast
    using (var client = new HttpClient(){ BaseAddress = new Uri(url)})
    {
    BroadcastHexRequest req = new BroadcastHexRequest()
    {
    raw_data = JsonConvert.SerializeObject(transaction.raw_data),
    };
    req.signature.Add(transaction.signature.First());

    var serializedData = JsonConvert.SerializeObject(req);

    var requestData = new StringContent(serializedData, Encoding.UTF8, "application/json");
    var result = await client.PostAsync("wallet/broadcasttransaction", requestData);
    resultContent = await result.Content.ReadAsStringAsync();

    var broadcastTransactionResponse = JsonConvert.DeserializeObject<BroadcastTransactionResponse>(resultContent);
    Assert.True(broadcastTransactionResponse.result);
    }
    }
    }
    }