nft-faucet/NftFaucet/Models/MetamaskInfo.cs

100 lines
3.1 KiB
C#
Raw Normal View History

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();
}
}