Rename Provider to Wallet

This commit is contained in:
Ivan Yaremenchuk 2022-10-02 20:55:07 -05:00
parent 1f97ff7935
commit eceb53d2fe
45 changed files with 191 additions and 193 deletions

View File

@ -4,7 +4,7 @@ public class AppStateDto
{
public Guid Id { get; set; } = Guid.Parse("621a252e-1d8d-4225-a045-b470469730cb");
public Guid? SelectedNetwork { get; set; }
public Guid? SelectedProvider { get; set; }
public Guid? SelectedWallet { get; set; }
public Guid? SelectedContract { get; set; }
public Guid? SelectedToken { get; set; }
public Guid? SelectedUploadLocation { get; set; }

View File

@ -1,6 +1,6 @@
namespace NftFaucet.Infrastructure.Models.Dto;
public class ProviderStateDto
public class WalletStateDto
{
public Guid Id { get; set; }
public string State { get; set; }

View File

@ -6,7 +6,7 @@ namespace NftFaucet.Infrastructure.Models.State;
public class PluginStateStorage
{
public ICollection<INetwork> Networks { get; set; }
public ICollection<IProvider> Providers { get; set; }
public ICollection<IWallet> Wallets { get; set; }
public ICollection<IUploader> Uploaders { get; set; }
public ICollection<IContract> Contracts { get; set; }
}

View File

@ -9,7 +9,7 @@ public class ScopedAppState
public UserStateStorage UserStorage { get; private set; } = new();
public INetwork SelectedNetwork => PluginStorage?.Networks?.FirstOrDefault(x => x.Id == UserStorage?.SelectedNetworks?.FirstOrDefault());
public IProvider SelectedProvider => PluginStorage?.Providers?.FirstOrDefault(x => x.Id == UserStorage?.SelectedProviders?.FirstOrDefault());
public IWallet SelectedWallet => PluginStorage?.Wallets?.FirstOrDefault(x => x.Id == UserStorage?.SelectedWallets?.FirstOrDefault());
public IContract SelectedContract => PluginStorage?.Contracts?.FirstOrDefault(x => x.Id == UserStorage?.SelectedContracts?.FirstOrDefault());
public IToken SelectedToken => UserStorage?.Tokens?.FirstOrDefault(x => x.Id == UserStorage?.SelectedTokens?.FirstOrDefault());
public ITokenUploadLocation SelectedUploadLocation => UserStorage?.UploadLocations?.FirstOrDefault(x => x.Id == UserStorage?.SelectedUploadLocations?.FirstOrDefault());

View File

@ -8,7 +8,7 @@ public class UserStateStorage
public ICollection<ITokenUploadLocation> UploadLocations { get; set; }
public Guid[] SelectedNetworks { get; set; }
public Guid[] SelectedProviders { get; set; }
public Guid[] SelectedWallets { get; set; }
public Guid[] SelectedContracts { get; set; }
public Guid[] SelectedTokens { get; set; }
public Guid[] SelectedUploadLocations { get; set; }

View File

@ -10,12 +10,12 @@ public interface IStateRepository
public Task SaveAppState(ScopedAppState appState);
public Task SaveToken(IToken token);
public Task SaveUploadLocation(ITokenUploadLocation uploadLocation);
public Task SaveProviderState(IProvider provider);
public Task SaveWalletState(IWallet wallet);
public Task SaveUploaderState(IUploader uploader);
public Task LoadAppState(ScopedAppState appState);
public Task<IToken[]> LoadTokens();
public Task<ITokenUploadLocation[]> LoadUploadLocations();
public Task<UploaderStateDto[]> LoadUploaderStates();
public Task<ProviderStateDto[]> LoadProviderStates();
public Task<WalletStateDto[]> LoadWalletStates();
}

View File

@ -14,7 +14,7 @@ public class StateRepository : IStateRepository
private const string AppStateStoreName = "AppState";
private const string TokensStoreName = "Tokens";
private const string UploadLocationsStoreName = "UploadLocations";
private const string ProviderStatesStoreName = "ProviderStates";
private const string WalletStatesStoreName = "WalletStates";
private const string UploaderStatesStoreName = "UploaderStates";
public StateRepository(IndexedDBManager dbManager, Mapper mapper)
@ -108,21 +108,21 @@ public class StateRepository : IStateRepository
return existingUploadLocations.Select(_mapper.ToDomain).ToArray();
}
public async Task SaveProviderState(IProvider provider)
public async Task SaveWalletState(IWallet wallet)
{
var state = await provider.GetState();
var stateDto = new ProviderStateDto
var state = await wallet.GetState();
var stateDto = new WalletStateDto
{
Id = provider.Id,
Id = wallet.Id,
State = state,
};
var record = new StoreRecord<ProviderStateDto>
var record = new StoreRecord<WalletStateDto>
{
Storename = ProviderStatesStoreName,
Storename = WalletStatesStoreName,
Data = stateDto,
};
var existingStateDto = await _dbManager.GetRecordById<Guid, ProviderStateDto>(ProviderStatesStoreName, stateDto.Id);
var existingStateDto = await _dbManager.GetRecordById<Guid, WalletStateDto>(WalletStatesStoreName, stateDto.Id);
if (existingStateDto == null)
{
await _dbManager.AddRecord(record);
@ -167,13 +167,13 @@ public class StateRepository : IStateRepository
}
}
public async Task<ProviderStateDto[]> LoadProviderStates()
public async Task<WalletStateDto[]> LoadWalletStates()
{
var existingProviderStates = await _dbManager.GetRecords<ProviderStateDto>(ProviderStatesStoreName);
if (existingProviderStates == null || existingProviderStates.Count == 0)
return Array.Empty<ProviderStateDto>();
var existingWalletStates = await _dbManager.GetRecords<WalletStateDto>(WalletStatesStoreName);
if (existingWalletStates == null || existingWalletStates.Count == 0)
return Array.Empty<WalletStateDto>();
return existingProviderStates.ToArray();
return existingWalletStates.ToArray();
}
private async Task<T> GetFirst<T>(string storeName)

View File

@ -11,7 +11,7 @@ public class Mapper
=> appState == null ? null : new AppStateDto
{
SelectedNetwork = appState.SelectedNetwork?.Id,
SelectedProvider = appState.SelectedProvider?.Id,
SelectedWallet = appState.SelectedWallet?.Id,
SelectedContract = appState.SelectedContract?.Id,
SelectedToken = appState.SelectedToken?.Id,
SelectedUploadLocation = appState.SelectedUploadLocation?.Id,
@ -53,7 +53,7 @@ public class Mapper
UserStorage =
{
SelectedNetworks = ToGuidArray(appStateDto.SelectedNetwork),
SelectedProviders = ToGuidArray(appStateDto.SelectedProvider),
SelectedWallets = ToGuidArray(appStateDto.SelectedWallet),
SelectedContracts = ToGuidArray(appStateDto.SelectedContract),
SelectedTokens = ToGuidArray(appStateDto.SelectedToken),
SelectedUploadLocations = ToGuidArray(appStateDto.SelectedUploadLocation),

View File

@ -1,8 +0,0 @@
using NftFaucet.Plugins.Models.Abstraction;
namespace NftFaucet.Plugins;
public interface IProviderPlugin
{
public IReadOnlyCollection<IProvider> Providers { get; }
}

View File

@ -0,0 +1,8 @@
using NftFaucet.Plugins.Models.Abstraction;
namespace NftFaucet.Plugins;
public interface IWalletPlugin
{
public IReadOnlyCollection<IWallet> Wallets { get; }
}

View File

@ -2,7 +2,7 @@ using NftFaucet.Domain.Models;
namespace NftFaucet.Plugins.Models.Abstraction;
public interface IProvider : INamedEntity, IStateful, IInitializable, IEntityWithProperties, IConfigurable
public interface IWallet : INamedEntity, IStateful, IInitializable, IEntityWithProperties, IConfigurable
{
public bool IsNetworkSupported(INetwork network);
public Task<string> GetAddress();

View File

@ -5,7 +5,7 @@ namespace NftFaucet.Plugins.Models;
public record MintRequest(
INetwork Network,
IProvider Provider,
IWallet Wallet,
IContract Contract,
IToken Token,
ITokenUploadLocation UploadLocation,

View File

@ -3,7 +3,7 @@ using NftFaucet.Plugins.Models.Abstraction;
namespace NftFaucet.Plugins.Models;
public abstract class Provider : DefaultEntity, IProvider
public abstract class Wallet : DefaultEntity, IWallet
{
public abstract bool IsNetworkSupported(INetwork network);
public abstract Task<string> GetAddress();

View File

@ -8,17 +8,17 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{926C
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetworkPlugins", "NetworkPlugins", "{E29C020E-A3FD-4756-ACB3-3828F915EB40}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProviderPlugins", "ProviderPlugins", "{9DE3CDEC-37AE-4FB0-B115-984EB47F57C5}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WalletPlugins", "WalletPlugins", "{9DE3CDEC-37AE-4FB0-B115-984EB47F57C5}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UploadPlugins", "UploadPlugins", "{5FA46262-EDA0-43BB-A1E5-57F50AD7EE00}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.ProviderPlugins.Keygens", "plugins\provider-plugins\NftFaucet.ProviderPlugins.Keygens\NftFaucet.ProviderPlugins.Keygens.csproj", "{B1D73FDE-0ECD-4917-8B9A-AEFD8C8C39C5}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.WalletPlugins.Keygens", "plugins\wallet-plugins\NftFaucet.WalletPlugins.Keygens\NftFaucet.WalletPlugins.Keygens.csproj", "{B1D73FDE-0ECD-4917-8B9A-AEFD8C8C39C5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.Domain", "NftFaucet.Domain\NftFaucet.Domain.csproj", "{384ECEAB-40B1-4F22-AFBD-F710B935E23A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.ProviderPlugins.Metamask", "plugins\provider-plugins\NftFaucet.ProviderPlugins.Metamask\NftFaucet.ProviderPlugins.Metamask.csproj", "{3028C0A8-073A-4160-92C7-34D148F1D19C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.WalletPlugins.Metamask", "plugins\wallet-plugins\NftFaucet.WalletPlugins.Metamask\NftFaucet.WalletPlugins.Metamask.csproj", "{3028C0A8-073A-4160-92C7-34D148F1D19C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.ProviderPlugins.Phantom", "plugins\provider-plugins\NftFaucet.ProviderPlugins.Phantom\NftFaucet.ProviderPlugins.Phantom.csproj", "{D6522592-0719-479F-AD8E-D58D4D7B207C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.WalletPlugins.Phantom", "plugins\wallet-plugins\NftFaucet.WalletPlugins.Phantom\NftFaucet.WalletPlugins.Phantom.csproj", "{D6522592-0719-479F-AD8E-D58D4D7B207C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.UploadPlugins.Crust", "plugins\upload-plugins\NftFaucet.UploadPlugins.Crust\NftFaucet.UploadPlugins.Crust.csproj", "{BA56B8D0-B2BD-4170-9D95-D2A1ED29E334}"
EndProject

View File

@ -25,13 +25,13 @@
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="providers" style=@(SelectedProviderName != null ? $"color: {(AppState.SelectedProvider.IsConfigured ? "lime" : "#FBBD08")};" : string.Empty)>
<NavLink class="nav-link" href="wallets" style=@(SelectedWalletName != null ? $"color: {(AppState.SelectedWallet.IsConfigured ? "lime" : "#FBBD08")};" : string.Empty)>
<span class="oi oi-key" aria-hidden="true"></span>
<div style="display: flex; flex-direction: column;">
<span style="line-height: 1rem; font-size: 1.1rem;">Provider</span>
@if (SelectedProviderName != null)
<span style="line-height: 1rem; font-size: 1.1rem;">Wallet</span>
@if (SelectedWalletName != null)
{
<span style="line-height: 1rem; font-size: 0.7rem; color: #bbb;">@SelectedProviderName</span>
<span style="line-height: 1rem; font-size: 0.7rem; color: #bbb;">@SelectedWalletName</span>
}
</div>
</NavLink>

View File

@ -3,7 +3,7 @@ namespace NftFaucet.Components.NavMenu;
public partial class NavMenu : BasicComponent
{
protected string SelectedNetworkName => AppState?.SelectedNetwork?.ShortName;
protected string SelectedProviderName => AppState?.SelectedProvider?.ShortName;
protected string SelectedWalletName => AppState?.SelectedWallet?.ShortName;
protected string SelectedContractName => AppState?.SelectedContract?.Symbol;
protected string SelectedTokenName => AppState?.SelectedToken?.Name;
protected string SelectedUploadName => AppState?.SelectedUploadLocation?.Name;

View File

@ -31,9 +31,9 @@
<ProjectReference Include="..\plugins\network-plugins\NftFaucet.NetworkPlugins.Optimism\NftFaucet.NetworkPlugins.Optimism.csproj" />
<ProjectReference Include="..\plugins\network-plugins\NftFaucet.NetworkPlugins.Polygon\NftFaucet.NetworkPlugins.Polygon.csproj" />
<ProjectReference Include="..\plugins\network-plugins\NftFaucet.NetworkPlugins.Solana\NftFaucet.NetworkPlugins.Solana.csproj" />
<ProjectReference Include="..\plugins\provider-plugins\NftFaucet.ProviderPlugins.Keygens\NftFaucet.ProviderPlugins.Keygens.csproj" />
<ProjectReference Include="..\plugins\provider-plugins\NftFaucet.ProviderPlugins.Metamask\NftFaucet.ProviderPlugins.Metamask.csproj" />
<ProjectReference Include="..\plugins\provider-plugins\NftFaucet.ProviderPlugins.Phantom\NftFaucet.ProviderPlugins.Phantom.csproj" />
<ProjectReference Include="..\plugins\wallet-plugins\NftFaucet.WalletPlugins.Keygens\NftFaucet.WalletPlugins.Keygens.csproj" />
<ProjectReference Include="..\plugins\wallet-plugins\NftFaucet.WalletPlugins.Metamask\NftFaucet.WalletPlugins.Metamask.csproj" />
<ProjectReference Include="..\plugins\wallet-plugins\NftFaucet.WalletPlugins.Phantom\NftFaucet.WalletPlugins.Phantom.csproj" />
<ProjectReference Include="..\NftFaucet.Plugins\NftFaucet.Plugins.csproj" />
<ProjectReference Include="..\plugins\upload-plugins\NftFaucet.UploadPlugins.Crust\NftFaucet.UploadPlugins.Crust.csproj" />
<ProjectReference Include="..\plugins\upload-plugins\NftFaucet.UploadPlugins.Infura\NftFaucet.UploadPlugins.Infura.csproj" />

View File

@ -3,6 +3,6 @@ namespace NftFaucet.Options;
public class Settings
{
public Guid[] RecommendedNetworks { get; set; }
public Guid[] RecommendedProviders { get; set; }
public Guid[] RecommendedWallets { get; set; }
public Guid[] RecommendedUploaders { get; set; }
}

View File

@ -17,8 +17,8 @@ else if (State == MintingState.CheckingNetwork)
<text style="color: green;">@(AppState?.SelectedNetwork?.Name ?? "<unknown>")</text>
</p>
<p>
<text style="font-weight: bold;">Provider network: </text>
<text style="color: red;">@(ProviderNetwork?.Name ?? "<unknown>")</text>
<text style="font-weight: bold;">Wallet network: </text>
<text style="color: red;">@(WalletNetwork?.Name ?? "<unknown>")</text>
</p>
<div style="display: flex; justify-content: end;">
<RadzenButton Click="@(async (args) => await CheckNetwork())" Text="Try again" Disabled="@(!string.IsNullOrEmpty(ProgressBarText))" />
@ -29,7 +29,7 @@ else if (State == MintingState.CheckingNetwork)
<RadzenContent Container="main">
<h3>Address is not available!</h3>
<p>
<text style="font-weight: bold;">Provider address: </text>
<text style="font-weight: bold;">Wallet address: </text>
<text style="color: red;">&lt;null&gt;</text>
</p>
<div style="display: flex; justify-content: end;">

View File

@ -15,7 +15,7 @@ public partial class MintDialog : BasicComponent
private string ProgressBarText { get; set; } = "Checking network...";
private MintingState State { get; set; } = MintingState.CheckingNetwork;
private INetwork ProviderNetwork { get; set; }
private INetwork WalletNetwork { get; set; }
private string SourceAddress { get; set; }
private Balance Balance { get; set; }
private string TransactionHash { get; set; }
@ -34,16 +34,16 @@ public partial class MintDialog : BasicComponent
ProgressBarText = "Checking network...";
RefreshMediator.NotifyStateHasChangedSafe();
var providerNetworkResult = await ResultWrapper.Wrap(async () =>
var walletNetworkResult = await ResultWrapper.Wrap(async () =>
{
var task1 = AppState.SelectedProvider.GetNetwork(AppState.PluginStorage.Networks.ToArray(), AppState.SelectedNetwork);
var task1 = AppState.SelectedWallet.GetNetwork(AppState.PluginStorage.Networks.ToArray(), AppState.SelectedNetwork);
var task2 = Task.Delay(TimeSpan.FromMilliseconds(MinDelayInMilliseconds));
await Task.WhenAll(task1, task2);
return task1.Result;
});
ProviderNetwork = providerNetworkResult.IsSuccess ? providerNetworkResult.Value : null;
WalletNetwork = walletNetworkResult.IsSuccess ? walletNetworkResult.Value : null;
if (ProviderNetwork?.Id == AppState.SelectedNetwork.Id)
if (WalletNetwork?.Id == AppState.SelectedNetwork.Id)
{
CheckAddress();
}
@ -62,7 +62,7 @@ public partial class MintDialog : BasicComponent
var sourceAddressResult = await ResultWrapper.Wrap(async () =>
{
var task1 = AppState.SelectedProvider.GetAddress();
var task1 = AppState.SelectedWallet.GetAddress();
var task2 = Task.Delay(TimeSpan.FromMilliseconds(MinDelayInMilliseconds));
await Task.WhenAll(task1, task2);
return task1.Result;
@ -88,7 +88,7 @@ public partial class MintDialog : BasicComponent
var balanceResult = await ResultWrapper.Wrap(async () =>
{
var task1 = AppState.SelectedProvider.GetBalance(AppState.SelectedNetwork);
var task1 = AppState.SelectedWallet.GetBalance(AppState.SelectedNetwork);
var task2 = Task.Delay(TimeSpan.FromMilliseconds(MinDelayInMilliseconds));
await Task.WhenAll(task1, task2);
return task1.Result;
@ -120,10 +120,10 @@ public partial class MintDialog : BasicComponent
var sendTransactionResult = await ResultWrapper.Wrap(async () =>
{
var mintRequest = new MintRequest(AppState.SelectedNetwork, AppState.SelectedProvider,
var mintRequest = new MintRequest(AppState.SelectedNetwork, AppState.SelectedWallet,
AppState.SelectedContract, AppState.SelectedToken, AppState.SelectedUploadLocation,
AppState.UserStorage.DestinationAddress, AppState.UserStorage.TokenAmount);
var task1 = AppState.SelectedProvider.Mint(mintRequest);
var task1 = AppState.SelectedWallet.Mint(mintRequest);
var task2 = Task.Delay(TimeSpan.FromMilliseconds(MinDelayInMilliseconds));
await Task.WhenAll(task1, task2);
return task1.Result;

View File

@ -17,12 +17,12 @@
}
</p>
<p>
<text style="font-weight: bold;">Provider: </text>
@if (AppState?.SelectedProvider == null)
<text style="font-weight: bold;">Wallet: </text>
@if (AppState?.SelectedWallet == null)
{
@:<text style="color: red;">NOT SELECTED</text>
}
else if (!AppState.SelectedProvider.IsConfigured)
else if (!AppState.SelectedWallet.IsConfigured)
{
@:<text style="color: red;">NOT CONFIGURED</text>
}

View File

@ -10,8 +10,8 @@ public partial class MintPage : BasicComponent
private string SourceAddress { get; set; }
private bool IsReadyToMint => AppState != null &&
AppState.SelectedNetwork != null &&
AppState.SelectedProvider != null &&
AppState.SelectedProvider.IsConfigured &&
AppState.SelectedWallet != null &&
AppState.SelectedWallet.IsConfigured &&
AppState.SelectedContract != null &&
AppState.SelectedToken != null &&
AppState.SelectedUploadLocation != null &&
@ -19,9 +19,9 @@ public partial class MintPage : BasicComponent
protected override async Task OnInitializedAsync()
{
if (AppState?.SelectedProvider?.IsConfigured ?? false)
if (AppState?.SelectedWallet?.IsConfigured ?? false)
{
SourceAddress = await ResultWrapper.Wrap(() => AppState.SelectedProvider.GetAddress()).Match(x => x, _ => null);
SourceAddress = await ResultWrapper.Wrap(() => AppState.SelectedWallet.GetAddress()).Match(x => x, _ => null);
AppState.UserStorage.DestinationAddress = SourceAddress;
}
}

View File

@ -45,10 +45,10 @@ public partial class NetworksPage : BasicComponent
var currentNetwork = AppState.SelectedNetwork;
AppState.UserStorage.SelectedContracts = Array.Empty<Guid>();
var currentProvider = AppState.SelectedProvider;
if (currentNetwork == null || (currentProvider != null && !currentProvider.IsNetworkSupported(currentNetwork)))
var currentWallet = AppState.SelectedWallet;
if (currentNetwork == null || (currentWallet != null && !currentWallet.IsNetworkSupported(currentNetwork)))
{
AppState.UserStorage.SelectedProviders = Array.Empty<Guid>();
AppState.UserStorage.SelectedWallets = Array.Empty<Guid>();
}
await SaveAppState();

View File

@ -1,15 +0,0 @@
@page "/providers"
@inherits BasicComponent
<PageTitle>Providers</PageTitle>
<RadzenContent Container="main">
<RadzenHeading Size="H1" Text="Select network provider" />
@if (AppState.SelectedNetwork == null)
{
<RadzenHeading Size="H3" Text="Please choose network first!" />
}
else
{
<CardList Data="@ProviderCards" OnSelectedChange="@(async _ => await OnProviderChange())" @bind-SelectedItems="@AppState.UserStorage.SelectedProviders" />
}
</RadzenContent>

View File

@ -0,0 +1,15 @@
@page "/wallets"
@inherits BasicComponent
<PageTitle>Wallets</PageTitle>
<RadzenContent Container="main">
<RadzenHeading Size="H1" Text="Select wallet" />
@if (AppState.SelectedNetwork == null)
{
<RadzenHeading Size="H3" Text="Please choose network first!" />
}
else
{
<CardList Data="@WalletCards" OnSelectedChange="@(async _ => await OnWalletChange())" @bind-SelectedItems="@AppState.UserStorage.SelectedWallets" />
}
</RadzenContent>

View File

@ -10,50 +10,50 @@ using Radzen;
namespace NftFaucet.Pages;
public partial class ProvidersPage : BasicComponent
public partial class WalletsPage : BasicComponent
{
[Inject]
public IServiceProvider ServiceProvider { get; set; }
protected override async Task OnInitializedAsync()
{
Providers = AppState.PluginStorage.Providers.Where(x => AppState.SelectedNetwork != null && x.IsNetworkSupported(AppState.SelectedNetwork)).ToArray();
foreach (var provider in Providers)
Wallets = AppState.PluginStorage.Wallets.Where(x => AppState.SelectedNetwork != null && x.IsNetworkSupported(AppState.SelectedNetwork)).ToArray();
foreach (var wallet in Wallets)
{
if (!provider.IsInitialized)
if (!wallet.IsInitialized)
{
await provider.InitializeAsync(ServiceProvider);
await wallet.InitializeAsync(ServiceProvider);
}
}
RefreshCards();
RefreshMediator.NotifyStateHasChangedSafe();
}
private IProvider[] Providers { get; set; }
private CardListItem[] ProviderCards { get; set; }
private IWallet[] Wallets { get; set; }
private CardListItem[] WalletCards { get; set; }
private void RefreshCards()
{
ProviderCards = Providers.Select(MapCardListItem).ToArray();
WalletCards = Wallets.Select(MapCardListItem).ToArray();
}
private CardListItem MapCardListItem(IProvider provider)
private CardListItem MapCardListItem(IWallet wallet)
{
var configurationItems = provider.GetConfigurationItems();
var configurationItems = wallet.GetConfigurationItems();
return new CardListItem
{
Id = provider.Id,
ImageLocation = provider.ImageName != null ? "./images/" + provider.ImageName : null,
Header = provider.Name,
IsDisabled = !provider.IsSupported,
Properties = provider.GetProperties().Select(Map).ToArray(),
SelectionIcon = provider.IsConfigured ? CardListItemSelectionIcon.Checkmark : CardListItemSelectionIcon.Warning,
Id = wallet.Id,
ImageLocation = wallet.ImageName != null ? "./images/" + wallet.ImageName : null,
Header = wallet.Name,
IsDisabled = !wallet.IsSupported,
Properties = wallet.GetProperties().Select(Map).ToArray(),
SelectionIcon = wallet.IsConfigured ? CardListItemSelectionIcon.Checkmark : CardListItemSelectionIcon.Warning,
Badges = new[]
{
(Settings?.RecommendedProviders?.Contains(provider.Id) ?? false)
(Settings?.RecommendedWallets?.Contains(wallet.Id) ?? false)
? new CardListItemBadge {Style = BadgeStyle.Success, Text = "Recommended"}
: null,
!provider.IsSupported
!wallet.IsSupported
? new CardListItemBadge {Style = BadgeStyle.Light, Text = "Not Supported"}
: null,
}.Where(x => x != null).ToArray(),
@ -66,11 +66,11 @@ public partial class ProvidersPage : BasicComponent
Style = ButtonStyle.Secondary,
Action = async () =>
{
var result = await OpenConfigurationDialog(provider);
var result = await OpenConfigurationDialog(wallet);
RefreshCards();
if (result.IsSuccess)
{
await StateRepository.SaveProviderState(provider);
await StateRepository.SaveWalletState(wallet);
}
}
}
@ -79,14 +79,14 @@ public partial class ProvidersPage : BasicComponent
};
}
private async Task OnProviderChange()
private async Task OnWalletChange()
{
await SaveAppState();
}
private async Task<Result> OpenConfigurationDialog(IProvider provider)
private async Task<Result> OpenConfigurationDialog(IWallet wallet)
{
var configurationItems = provider.GetConfigurationItems();
var configurationItems = wallet.GetConfigurationItems();
foreach (var configurationItem in configurationItems)
{
var prevClickHandler = configurationItem.ClickAction;
@ -104,7 +104,7 @@ public partial class ProvidersPage : BasicComponent
new Dictionary<string, object>
{
{ nameof(ConfigurationDialog.ConfigurationItems), configurationItems },
{ nameof(ConfigurationDialog.ConfigureAction), provider.Configure },
{ nameof(ConfigurationDialog.ConfigureAction), wallet.Configure },
},
new DialogOptions() {Width = "700px", Height = "570px", Resizable = true, Draggable = true});

View File

@ -49,7 +49,7 @@ builder.Services.AddIndexedDB(dbStore =>
Indexes = new List<IndexSpec>
{
new IndexSpec {Name = "selectedNetwork", KeyPath = "selectedNetwork", Auto = false},
new IndexSpec {Name = "selectedProvider", KeyPath = "selectedProvider", Auto = false},
new IndexSpec {Name = "selectedWallet", KeyPath = "selectedWallet", Auto = false},
new IndexSpec {Name = "selectedContract", KeyPath = "selectedContract", Auto = false},
new IndexSpec {Name = "selectedToken", KeyPath = "selectedToken", Auto = false},
new IndexSpec {Name = "selectedUploadLocation", KeyPath = "selectedUploadLocation", Auto = false},
@ -94,7 +94,7 @@ builder.Services.AddIndexedDB(dbStore =>
dbStore.Stores.Add(new StoreSchema
{
Name = "ProviderStates",
Name = "WalletStates",
PrimaryKey = new IndexSpec { Name = "id", KeyPath = "id", Auto = true },
Indexes = new List<IndexSpec>
{

View File

@ -23,27 +23,27 @@ public class InitializationService : IInitializationService
{
LoadDataFromPlugins();
await LoadDataFromIndexedDb();
await InitializeProviders();
await InitializeWallets();
}
private async Task InitializeProviders()
private async Task InitializeWallets()
{
var providers = _appState.PluginStorage.Providers.Where(x => _appState.SelectedNetwork != null && x.IsNetworkSupported(_appState.SelectedNetwork)).ToArray();
foreach (var provider in providers)
var wallets = _appState.PluginStorage.Wallets.Where(x => _appState.SelectedNetwork != null && x.IsNetworkSupported(_appState.SelectedNetwork)).ToArray();
foreach (var wallet in wallets)
{
await provider.InitializeAsync(_serviceProvider);
await wallet.InitializeAsync(_serviceProvider);
}
}
private void LoadDataFromPlugins()
{
var isFirstRun = _appState.PluginStorage.Networks == null &&
_appState.PluginStorage.Providers == null &&
_appState.PluginStorage.Wallets == null &&
_appState.PluginStorage.Uploaders == null &&
_appState.PluginStorage.Contracts == null;
_appState.PluginStorage.Networks ??= _pluginLoader.NetworkPlugins.SelectMany(x => x.Networks).Where(x => x != null).ToArray();
_appState.PluginStorage.Providers ??= _pluginLoader.ProviderPlugins.SelectMany(x => x.Providers).Where(x => x != null).ToArray();
_appState.PluginStorage.Wallets ??= _pluginLoader.WalletPlugins.SelectMany(x => x.Wallets).Where(x => x != null).ToArray();
_appState.PluginStorage.Uploaders ??= _pluginLoader.UploaderPlugins.SelectMany(x => x.Uploaders).Where(x => x != null).ToArray();
_appState.PluginStorage.Contracts ??= _appState.PluginStorage.Networks.SelectMany(x => x.DeployedContracts).Where(x => x != null).ToArray();
@ -58,15 +58,15 @@ public class InitializationService : IInitializationService
await _stateRepository.LoadAppState(_appState);
_appState.UserStorage.Tokens = (await _stateRepository.LoadTokens()).ToList();
_appState.UserStorage.UploadLocations = (await _stateRepository.LoadUploadLocations()).ToList();
var providerStates = await _stateRepository.LoadProviderStates();
foreach (var providerState in providerStates)
var walletStates = await _stateRepository.LoadWalletStates();
foreach (var walletState in walletStates)
{
var provider = _appState.PluginStorage.Providers.FirstOrDefault(x => x.Id == providerState.Id);
if (provider == null)
var wallet = _appState.PluginStorage.Wallets.FirstOrDefault(x => x.Id == walletState.Id);
if (wallet == null)
{
continue;
}
await provider.SetState(providerState.State);
await wallet.SetState(walletState.State);
}
var uploaderStates = await _stateRepository.LoadUploaderStates();
foreach (var uploaderState in uploaderStates)
@ -83,7 +83,7 @@ public class InitializationService : IInitializationService
private void ValidatePluginsData()
{
var networkIds = _appState.PluginStorage.Networks.Select(x => x.Id).ToArray();
var providerIds = _appState.PluginStorage.Providers.Select(x => x.Id).ToArray();
var walletIds = _appState.PluginStorage.Wallets.Select(x => x.Id).ToArray();
var uploaderIds = _appState.PluginStorage.Uploaders.Select(x => x.Id).ToArray();
var contractIds = _appState.PluginStorage.Contracts.Select(x => x.Id).ToArray();
@ -93,10 +93,10 @@ public class InitializationService : IInitializationService
throw new ApplicationException($"[{nameof(ValidatePluginsData)}] There are networks with same ids: {string.Join(", ", networkIdDuplicates)}");
}
var providerIdDuplicates = providerIds.Duplicates().ToArray();
if (providerIdDuplicates.Any())
var walletIdDuplicates = walletIds.Duplicates().ToArray();
if (walletIdDuplicates.Any())
{
throw new ApplicationException($"[{nameof(ValidatePluginsData)}] There are providers with same ids: {string.Join(", ", providerIdDuplicates)}");
throw new ApplicationException($"[{nameof(ValidatePluginsData)}] There are wallets with same ids: {string.Join(", ", walletIdDuplicates)}");
}
var uploaderIdDuplicates = uploaderIds.Duplicates().ToArray();
@ -111,11 +111,11 @@ public class InitializationService : IInitializationService
throw new ApplicationException($"[{nameof(ValidatePluginsData)}] There are contracts with same ids: {string.Join(", ", contractIdDuplicates)}");
}
var allIds = networkIds.Concat(providerIds).Concat(uploaderIds).Concat(contractIds).ToArray();
var allIds = networkIds.Concat(walletIds).Concat(uploaderIds).Concat(contractIds).ToArray();
var allIdDuplicates = allIds.Duplicates().ToArray();
if (allIdDuplicates.Any())
{
throw new ApplicationException($"[{nameof(ValidatePluginsData)}] There are plugin data items (networks/providers/uploaders/contracts) with same ids: {string.Join(", ", allIdDuplicates)}");
throw new ApplicationException($"[{nameof(ValidatePluginsData)}] There are plugin data items (networks/wallets/uploaders/contracts) with same ids: {string.Join(", ", allIdDuplicates)}");
}
var networkShortNames = _appState.PluginStorage.Networks.Select(x => x.ShortName).Where(x => x != null).ToArray();
@ -125,11 +125,11 @@ public class InitializationService : IInitializationService
throw new ApplicationException($"[{nameof(ValidatePluginsData)}] There are networks with same short name: {string.Join(", ", networkShortNameDuplicates)}");
}
var providerShortNames = _appState.PluginStorage.Providers.Select(x => x.ShortName).Where(x => x != null).ToArray();
var providerShortNameDuplicates = providerShortNames.Duplicates().ToArray();
if (providerShortNameDuplicates.Any())
var walletShortNames = _appState.PluginStorage.Wallets.Select(x => x.ShortName).Where(x => x != null).ToArray();
var walletShortNameDuplicates = walletShortNames.Duplicates().ToArray();
if (walletShortNameDuplicates.Any())
{
throw new ApplicationException($"[{nameof(ValidatePluginsData)}] There are providers with same short name: {string.Join(", ", providerShortNameDuplicates)}");
throw new ApplicationException($"[{nameof(ValidatePluginsData)}] There are wallets with same short name: {string.Join(", ", walletShortNameDuplicates)}");
}
var uploaderShortNames = _appState.PluginStorage.Uploaders.Select(x => x.ShortName).Where(x => x != null).ToArray();

View File

@ -7,11 +7,9 @@ using NftFaucet.NetworkPlugins.Optimism;
using NftFaucet.NetworkPlugins.Polygon;
using NftFaucet.NetworkPlugins.Solana;
using NftFaucet.Plugins;
using NftFaucet.Plugins.Models.Abstraction;
using NftFaucet.ProviderPlugins.EthereumKeygen;
using NftFaucet.ProviderPlugins.Keygens;
using NftFaucet.ProviderPlugins.Metamask;
using NftFaucet.ProviderPlugins.Phantom;
using NftFaucet.WalletPlugins.Keygens;
using NftFaucet.WalletPlugins.Metamask;
using NftFaucet.WalletPlugins.Phantom;
using NftFaucet.UploadPlugins.Crust;
using NftFaucet.UploadPlugins.Infura;
using NftFaucet.UploadPlugins.NftStorage;
@ -32,11 +30,11 @@ public class PluginLoader
new SolanaNetworkPlugin(),
};
public IReadOnlyCollection<IProviderPlugin> ProviderPlugins { get; } = new IProviderPlugin[]
public IReadOnlyCollection<IWalletPlugin> WalletPlugins { get; } = new IWalletPlugin[]
{
new MetamaskProviderPlugin(),
new PhantomProviderPlugin(),
new KeygenProviderPlugin(),
new MetamaskWalletPlugin(),
new PhantomWalletPlugin(),
new KeygenWalletPlugin(),
};
public IReadOnlyCollection<IUploaderPlugin> UploaderPlugins { get; } = new IUploaderPlugin[]

View File

@ -2,7 +2,7 @@
"RecommendedNetworks": [
"ac7858ff-b5c7-44f9-bf60-d81470531e56"
],
"RecommendedProviders": [
"RecommendedWallets": [
"ded55b2b-8139-4251-a0fc-ba620f9727c9",
"4c1a8ac5-60ca-4024-aae6-3c9852a6535c"
],

View File

@ -1,14 +0,0 @@
using NftFaucet.Plugins;
using NftFaucet.Plugins.Models.Abstraction;
using NftFaucet.ProviderPlugins.EthereumKeygen;
namespace NftFaucet.ProviderPlugins.Keygens;
public class KeygenProviderPlugin : IProviderPlugin
{
public IReadOnlyCollection<IProvider> Providers { get; } = new IProvider[]
{
new EthereumKeygenProvider(),
new SolanaKeygenProvider(),
};
}

View File

@ -1,12 +0,0 @@
using NftFaucet.Plugins;
using NftFaucet.Plugins.Models.Abstraction;
namespace NftFaucet.ProviderPlugins.Metamask;
public class MetamaskProviderPlugin : IProviderPlugin
{
public IReadOnlyCollection<IProvider> Providers { get; } = new IProvider[]
{
new MetamaskProvider(),
};
}

View File

@ -1,12 +0,0 @@
using NftFaucet.Plugins;
using NftFaucet.Plugins.Models.Abstraction;
namespace NftFaucet.ProviderPlugins.Phantom;
public class PhantomProviderPlugin : IProviderPlugin
{
public IReadOnlyCollection<IProvider> Providers { get; } = new IProvider[]
{
new PhantomProvider(),
};
}

View File

@ -2,7 +2,7 @@ using Cryptography.ECDSA;
using Nethereum.Hex.HexConvertors.Extensions;
using Nethereum.Util;
namespace NftFaucet.ProviderPlugins.Keygens;
namespace NftFaucet.WalletPlugins.Keygens;
public class EthereumKey
{

View File

@ -14,9 +14,9 @@ using NftFaucet.Plugins.Models;
using NftFaucet.Plugins.Models.Abstraction;
using NftFaucet.Plugins.Models.Enums;
namespace NftFaucet.ProviderPlugins.Keygens;
namespace NftFaucet.WalletPlugins.Keygens;
public sealed class EthereumKeygenProvider : Provider
public sealed class EthereumKeygenWallet : Wallet
{
public override Guid Id { get; } = Guid.Parse("ded55b2b-8139-4251-a0fc-ba620f9727c9");
public override string Name { get; } = "Ethereum keygen";
@ -106,7 +106,7 @@ public sealed class EthereumKeygenProvider : Provider
{
if (mintRequest.Network.Type != NetworkType.Ethereum)
{
throw new InvalidOperationException("Invalid network type for this provider");
throw new InvalidOperationException("Invalid network type for this wallet");
}
Function transfer =

View File

@ -0,0 +1,13 @@
using NftFaucet.Plugins;
using NftFaucet.Plugins.Models.Abstraction;
namespace NftFaucet.WalletPlugins.Keygens;
public class KeygenWalletPlugin : IWalletPlugin
{
public IReadOnlyCollection<IWallet> Wallets { get; } = new IWallet[]
{
new EthereumKeygenWallet(),
new SolanaKeygenWallet(),
};
}

View File

@ -1,7 +1,7 @@
using Solnet.Wallet;
using Solnet.Wallet.Bip39;
namespace NftFaucet.ProviderPlugins.EthereumKeygen;
namespace NftFaucet.WalletPlugins.Keygens;
public class SolanaKey
{

View File

@ -14,10 +14,11 @@ using Solnet.Rpc.Builders;
using Solnet.Rpc.Models;
using Solnet.Rpc.Utilities;
using Solnet.Wallet;
using Wallet = NftFaucet.Plugins.Models.Wallet;
namespace NftFaucet.ProviderPlugins.EthereumKeygen;
namespace NftFaucet.WalletPlugins.Keygens;
public class SolanaKeygenProvider : Provider
public class SolanaKeygenWallet : Wallet
{
public override Guid Id { get; } = Guid.Parse("4c1a8ac5-60ca-4024-aae6-3c9852a6535c");
public override string Name { get; } = "Solana keygen";
@ -120,9 +121,9 @@ public class SolanaKeygenProvider : Provider
var client = ClientFactory.GetClient(mintRequest.Network.PublicRpcUrl.OriginalString);
var rentExemption = await client.GetMinimumBalanceForRentExemptionAsync(TokenProgram.MintAccountDataSize);
var wallet = new Wallet(Key.MnemonicPhrase);
var wallet = new Solnet.Wallet.Wallet(Key.MnemonicPhrase);
var walletAddress = wallet.Account.PublicKey;
var mintWallet = new Wallet(SolanaKey.GenerateNew().MnemonicPhrase);
var mintWallet = new Solnet.Wallet.Wallet(SolanaKey.GenerateNew().MnemonicPhrase);
var mint = mintWallet.GetAccount(0);
var metadataAddress = GetMetadataAddress(mint.PublicKey);
var masterEditionAddress = GetMasterEditionAddress(mint.PublicKey);

View File

@ -7,9 +7,9 @@ using NftFaucet.Plugins.Models;
using NftFaucet.Plugins.Models.Abstraction;
using NftFaucet.Plugins.Models.Enums;
namespace NftFaucet.ProviderPlugins.Metamask;
namespace NftFaucet.WalletPlugins.Metamask;
public class MetamaskProvider : Provider
public class MetamaskWallet : Wallet
{
public override Guid Id { get; } = Guid.Parse("3367b9bb-f50c-4768-aeb3-9ac14d4c3987");
public override string Name { get; } = "Metamask";
@ -142,7 +142,7 @@ public class MetamaskProvider : Provider
{
if (mintRequest.Network.Type != NetworkType.Ethereum)
{
throw new InvalidOperationException("Invalid network type for this provider");
throw new InvalidOperationException("Invalid network type for this wallet");
}
Function transfer = mintRequest.Contract.Type switch

View File

@ -0,0 +1,12 @@
using NftFaucet.Plugins;
using NftFaucet.Plugins.Models.Abstraction;
namespace NftFaucet.WalletPlugins.Metamask;
public class MetamaskWalletPlugin : IWalletPlugin
{
public IReadOnlyCollection<IWallet> Wallets { get; } = new IWallet[]
{
new MetamaskWallet(),
};
}

View File

@ -3,9 +3,9 @@ using NftFaucet.Domain.Models.Enums;
using NftFaucet.Plugins.Models;
using NftFaucet.Plugins.Models.Abstraction;
namespace NftFaucet.ProviderPlugins.Phantom;
namespace NftFaucet.WalletPlugins.Phantom;
public class PhantomProvider : Provider
public class PhantomWallet : Wallet
{
public override Guid Id { get; } = Guid.Parse("ae860901-5441-463c-a16e-4786f041500d");
public override string Name { get; } = "Phantom";

View File

@ -0,0 +1,12 @@
using NftFaucet.Plugins;
using NftFaucet.Plugins.Models.Abstraction;
namespace NftFaucet.WalletPlugins.Phantom;
public class PhantomWalletPlugin : IWalletPlugin
{
public IReadOnlyCollection<IWallet> Wallets { get; } = new IWallet[]
{
new PhantomWallet(),
};
}