2022-08-02 15:24:07 -05:00
|
|
|
using System.Globalization;
|
|
|
|
using System.Numerics;
|
|
|
|
using Ethereum.MetaMask.Blazor;
|
|
|
|
using Nethereum.Hex.HexTypes;
|
2022-03-31 22:16:43 +02:00
|
|
|
using NftFaucet.Models.Enums;
|
2022-04-04 22:56:08 +02:00
|
|
|
using NftFaucet.Services;
|
2022-03-31 22:16:43 +02:00
|
|
|
using NftFaucet.Utils;
|
|
|
|
using Serilog;
|
|
|
|
|
|
|
|
namespace NftFaucet.Models;
|
|
|
|
|
|
|
|
public class MetamaskInfo
|
|
|
|
{
|
|
|
|
private readonly RefreshMediator _refreshMediator;
|
|
|
|
|
2022-08-02 15:24:07 -05:00
|
|
|
public MetamaskInfo(IMetaMaskService service, MetamaskSigningService signingService, RefreshMediator refreshMediator)
|
2022-03-31 22:16:43 +02:00
|
|
|
{
|
|
|
|
Service = service;
|
2022-08-02 15:24:07 -05:00
|
|
|
SigningService = signingService;
|
2022-03-31 22:16:43 +02:00
|
|
|
_refreshMediator = refreshMediator;
|
|
|
|
}
|
|
|
|
|
2022-08-02 15:24:07 -05:00
|
|
|
public IMetaMaskService Service { get; }
|
|
|
|
public MetamaskSigningService SigningService { get; }
|
2022-03-31 22:16:43 +02:00
|
|
|
|
|
|
|
public bool? HasMetaMask { get; private set; }
|
|
|
|
public bool? IsMetaMaskConnected { get; private set; }
|
|
|
|
|
|
|
|
public string Address { get; private set; }
|
2022-08-02 15:24:07 -05:00
|
|
|
public BigInteger ChainId { get; private set; }
|
2022-07-21 21:34:42 +03:00
|
|
|
public NetworkChain? Network { get; private set; }
|
2022-03-31 22:16:43 +02:00
|
|
|
|
|
|
|
public async Task<bool> IsConnected()
|
|
|
|
{
|
2022-08-02 15:24:07 -05:00
|
|
|
HasMetaMask ??= await Service.IsMetaMaskAvailableAsync();
|
|
|
|
IsMetaMaskConnected ??= await Service.IsSiteConnectedAsync();
|
2022-03-31 22:16:43 +02:00
|
|
|
|
|
|
|
return HasMetaMask.Value && IsMetaMaskConnected.Value;
|
|
|
|
}
|
|
|
|
|
|
|
|
public async Task<bool> IsReady()
|
|
|
|
{
|
|
|
|
if (!await IsConnected())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(Address) || ChainId == 0)
|
|
|
|
{
|
|
|
|
await RefreshAddress();
|
|
|
|
SubscribeToEvents();
|
|
|
|
}
|
|
|
|
|
|
|
|
return HasMetaMask!.Value && IsMetaMaskConnected!.Value && !string.IsNullOrEmpty(Address) && ChainId != 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
public async Task<bool> Connect()
|
|
|
|
{
|
2022-08-02 15:24:07 -05:00
|
|
|
var result = await ResultWrapper.Wrap(() => Service.ConnectAsync());
|
2022-03-31 22:16:43 +02:00
|
|
|
if (result.IsFailure)
|
|
|
|
{
|
|
|
|
Log.Error(result.Error);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
HasMetaMask = true;
|
|
|
|
IsMetaMaskConnected = true;
|
|
|
|
await RefreshAddress();
|
|
|
|
SubscribeToEvents();
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public async Task RefreshAddress()
|
|
|
|
{
|
2022-08-02 15:24:07 -05:00
|
|
|
Address = await Service.GetSelectedAccountAsync();
|
|
|
|
var chainIdHex = await Service.GetSelectedChainAsync();
|
|
|
|
ChainId = !string.IsNullOrEmpty(chainIdHex) ? new HexBigInteger(chainIdHex).Value : BigInteger.Zero;
|
|
|
|
Network = long.TryParse(ChainId.ToString(), out var longChainId) && Enum.IsDefined(typeof(NetworkChain), longChainId) ? (NetworkChain) longChainId : null;
|
2022-03-31 22:16:43 +02:00
|
|
|
_refreshMediator.NotifyStateHasChangedSafe();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void SubscribeToEvents()
|
|
|
|
{
|
2022-08-02 15:24:07 -05:00
|
|
|
Service.AccountsChanged += OnAccountChangedEvent;
|
|
|
|
Service.ChainChanged += OnChainChangedEvent;
|
2022-03-31 22:16:43 +02:00
|
|
|
}
|
|
|
|
|
2022-08-02 15:24:07 -05:00
|
|
|
private void OnAccountChangedEvent(object sender, string[] args)
|
2022-03-31 22:16:43 +02:00
|
|
|
{
|
2022-08-02 15:24:07 -05:00
|
|
|
Address = args.FirstOrDefault();
|
2022-03-31 22:16:43 +02:00
|
|
|
_refreshMediator.NotifyStateHasChangedSafe();
|
|
|
|
}
|
|
|
|
|
2022-08-02 15:24:07 -05:00
|
|
|
private void OnChainChangedEvent(object sender, string chainIdHex)
|
2022-03-31 22:16:43 +02:00
|
|
|
{
|
2022-08-02 15:24:07 -05:00
|
|
|
ChainId = !string.IsNullOrEmpty(chainIdHex) ? new HexBigInteger(chainIdHex).Value : BigInteger.Zero;
|
|
|
|
Network = long.TryParse(ChainId.ToString(), out var longChainId) && Enum.IsDefined(typeof(NetworkChain), longChainId) ? (NetworkChain) longChainId : null;
|
2022-03-31 22:16:43 +02:00
|
|
|
_refreshMediator.NotifyStateHasChangedSafe();
|
|
|
|
}
|
|
|
|
}
|