2
0
mirror of synced 2025-01-27 16:56:04 +00:00

80 lines
2.6 KiB
C#
Raw Normal View History

2023-04-25 11:31:15 +02:00
using Logging;
2023-04-18 13:22:41 +02:00
using Nethereum.Contracts;
2023-09-19 11:51:59 +02:00
using Nethereum.RPC.Eth.DTOs;
2023-04-14 10:51:35 +02:00
using Nethereum.Web3;
using Utils;
namespace NethereumWorkflow
{
2023-04-14 12:37:05 +02:00
public class NethereumInteraction
2023-04-14 10:51:35 +02:00
{
2023-09-15 16:27:08 +02:00
private readonly ILog log;
2023-04-14 10:51:35 +02:00
private readonly Web3 web3;
2023-09-15 16:27:08 +02:00
internal NethereumInteraction(ILog log, Web3 web3)
2023-04-14 10:51:35 +02:00
{
2023-04-25 11:31:15 +02:00
this.log = log;
2023-04-14 10:51:35 +02:00
this.web3 = web3;
}
2023-09-19 11:51:59 +02:00
public void SendEth(string toAddress, decimal ethAmount)
{
log.Debug();
2023-09-19 11:51:59 +02:00
var receipt = Time.Wait(web3.Eth.GetEtherTransferService().TransferEtherAndWaitForReceiptAsync(toAddress, ethAmount));
if (!receipt.Succeeded()) throw new Exception("Unable to send Eth");
}
public decimal GetEthBalance()
{
log.Debug();
2023-09-19 11:51:59 +02:00
return GetEthBalance(web3.TransactionManager.Account.Address);
}
public decimal GetEthBalance(string address)
{
log.Debug();
2023-09-19 11:51:59 +02:00
var balance = Time.Wait(web3.Eth.GetBalance.SendRequestAsync(address));
return Web3.Convert.FromWei(balance.Value);
}
2023-09-19 13:39:24 +02:00
public TResult Call<TFunction, TResult>(string contractAddress, TFunction function) where TFunction : FunctionMessage, new()
2023-04-18 13:22:41 +02:00
{
log.Debug(typeof(TFunction).ToString());
2023-09-19 13:39:24 +02:00
var handler = web3.Eth.GetContractQueryHandler<TFunction>();
return Time.Wait(handler.QueryAsync<TResult>(contractAddress, function));
}
2023-09-19 13:39:24 +02:00
public void SendTransaction<TFunction>(string contractAddress, TFunction function) where TFunction : FunctionMessage, new()
{
log.Debug();
2023-09-19 13:39:24 +02:00
var handler = web3.Eth.GetContractTransactionHandler<TFunction>();
var receipt = Time.Wait(handler.SendRequestAndWaitForReceiptAsync(contractAddress, function));
if (!receipt.Succeeded()) throw new Exception("Unable to perform contract transaction.");
}
2023-09-19 13:58:45 +02:00
public decimal? GetSyncedBlockNumber()
{
log.Debug();
var sync = Time.Wait(web3.Eth.Syncing.SendRequestAsync());
var number = Time.Wait(web3.Eth.Blocks.GetBlockNumber.SendRequestAsync());
var numberOfBlocks = number.ToDecimal();
if (sync.IsSyncing) return null;
return numberOfBlocks;
}
2023-09-19 13:39:24 +02:00
2023-09-19 13:58:45 +02:00
public bool IsContractAvailable(string abi, string contractAddress)
{
log.Debug();
try
{
var contract = web3.Eth.GetContract(abi, contractAddress);
return contract != null;
}
catch
{
return false;
}
}
}
2023-04-14 10:51:35 +02:00
}