505 lines
30 KiB
XML
505 lines
30 KiB
XML
<Window x:Class="WpfApp1TRC20.Views.MainWindow"
|
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
|
xmlns:vm="clr-namespace:WpfApp1TRC20.ViewModels"
|
|
Title="TRC20 Token Manager"
|
|
Height="800"
|
|
Width="1200"
|
|
WindowStartupLocation="CenterScreen"
|
|
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
|
TextElement.FontWeight="Regular"
|
|
TextElement.FontSize="13"
|
|
TextOptions.TextFormattingMode="Ideal"
|
|
TextOptions.TextRenderingMode="Auto"
|
|
Background="{DynamicResource MaterialDesignPaper}"
|
|
FontFamily="{DynamicResource MaterialDesignFont}">
|
|
|
|
<Window.Resources>
|
|
<BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
|
|
</Window.Resources>
|
|
|
|
<Grid>
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
<RowDefinition Height="Auto"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<!-- Header -->
|
|
<materialDesign:ColorZone Grid.Row="0"
|
|
Mode="PrimaryMid"
|
|
Padding="16">
|
|
<Grid>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<TextBlock Grid.Column="0"
|
|
Text="TRC20 Token Manager"
|
|
Style="{DynamicResource MaterialDesignHeadline5TextBlock}"
|
|
VerticalAlignment="Center"/>
|
|
|
|
<StackPanel Grid.Column="1"
|
|
Orientation="Horizontal">
|
|
<Button Command="{Binding RefreshDataCommand}"
|
|
Style="{DynamicResource MaterialDesignIconButton}"
|
|
ToolTip="Refresh Data">
|
|
<materialDesign:PackIcon Kind="Refresh"/>
|
|
</Button>
|
|
</StackPanel>
|
|
</Grid>
|
|
</materialDesign:ColorZone>
|
|
|
|
<!-- Main Content -->
|
|
<TabControl Grid.Row="1"
|
|
SelectedValue="{Binding SelectedTabItem}"
|
|
Style="{DynamicResource MaterialDesignTabControl}">
|
|
|
|
<!-- Dashboard Tab -->
|
|
<TabItem Header="Dashboard" Name="DashboardTab">
|
|
<Grid Margin="16">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<!-- Stats Cards -->
|
|
<UniformGrid Grid.Row="0"
|
|
Rows="1"
|
|
Columns="3"
|
|
Margin="0,0,0,16">
|
|
|
|
<materialDesign:Card Margin="8">
|
|
<StackPanel Margin="16">
|
|
<TextBlock Text="Active Tokens"
|
|
Style="{DynamicResource MaterialDesignSubtitle1TextBlock}"/>
|
|
<TextBlock Text="{Binding Tokens.Count}"
|
|
Style="{DynamicResource MaterialDesignHeadline4TextBlock}"
|
|
Foreground="{DynamicResource PrimaryHueMidBrush}"/>
|
|
</StackPanel>
|
|
</materialDesign:Card>
|
|
|
|
<materialDesign:Card Margin="8">
|
|
<StackPanel Margin="16">
|
|
<TextBlock Text="Wallets"
|
|
Style="{DynamicResource MaterialDesignSubtitle1TextBlock}"/>
|
|
<TextBlock Text="{Binding Wallets.Count}"
|
|
Style="{DynamicResource MaterialDesignHeadline4TextBlock}"
|
|
Foreground="{DynamicResource PrimaryHueMidBrush}"/>
|
|
</StackPanel>
|
|
</materialDesign:Card>
|
|
|
|
<materialDesign:Card Margin="8">
|
|
<StackPanel Margin="16">
|
|
<TextBlock Text="Transactions"
|
|
Style="{DynamicResource MaterialDesignSubtitle1TextBlock}"/>
|
|
<TextBlock Text="{Binding Transactions.Count}"
|
|
Style="{DynamicResource MaterialDesignHeadline4TextBlock}"
|
|
Foreground="{DynamicResource PrimaryHueMidBrush}"/>
|
|
</StackPanel>
|
|
</materialDesign:Card>
|
|
</UniformGrid>
|
|
|
|
<!-- Recent Activity -->
|
|
<materialDesign:Card Grid.Row="1">
|
|
<StackPanel>
|
|
<TextBlock Text="Recent Transactions"
|
|
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
|
|
Margin="16,16,16,8"/>
|
|
|
|
<DataGrid ItemsSource="{Binding Transactions}"
|
|
MaxHeight="300"
|
|
AutoGenerateColumns="False"
|
|
CanUserAddRows="False"
|
|
CanUserDeleteRows="False"
|
|
IsReadOnly="True"
|
|
Style="{DynamicResource MaterialDesignDataGrid}">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Hash"
|
|
Binding="{Binding TransactionHash}"
|
|
Width="200"/>
|
|
<DataGridTextColumn Header="From"
|
|
Binding="{Binding FromAddress}"
|
|
Width="150"/>
|
|
<DataGridTextColumn Header="To"
|
|
Binding="{Binding ToAddress}"
|
|
Width="150"/>
|
|
<DataGridTextColumn Header="Amount"
|
|
Binding="{Binding Amount}"
|
|
Width="100"/>
|
|
<DataGridTextColumn Header="Token"
|
|
Binding="{Binding TokenSymbol}"
|
|
Width="80"/>
|
|
<DataGridTextColumn Header="Status"
|
|
Binding="{Binding Status}"
|
|
Width="100"/>
|
|
<DataGridTextColumn Header="Time"
|
|
Binding="{Binding Timestamp, StringFormat={}{0:MM/dd/yyyy HH:mm}}"
|
|
Width="120"/>
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
</StackPanel>
|
|
</materialDesign:Card>
|
|
</Grid>
|
|
</TabItem>
|
|
|
|
<!-- Tokens Tab -->
|
|
<TabItem Header="Tokens" Name="TokensTab">
|
|
<Grid Margin="16">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="300"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<!-- Token List -->
|
|
<materialDesign:Card Grid.Column="0" Margin="0,0,8,0">
|
|
<StackPanel>
|
|
<TextBlock Text="My Tokens"
|
|
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
|
|
Margin="16,16,16,8"/>
|
|
|
|
<DataGrid ItemsSource="{Binding Tokens}"
|
|
SelectedItem="{Binding SelectedToken}"
|
|
AutoGenerateColumns="False"
|
|
CanUserAddRows="False"
|
|
CanUserDeleteRows="False"
|
|
IsReadOnly="True"
|
|
Style="{DynamicResource MaterialDesignDataGrid}">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Name"
|
|
Binding="{Binding Name}"
|
|
Width="120"/>
|
|
<DataGridTextColumn Header="Symbol"
|
|
Binding="{Binding Symbol}"
|
|
Width="80"/>
|
|
<DataGridTextColumn Header="Supply"
|
|
Binding="{Binding TotalSupply}"
|
|
Width="120"/>
|
|
<DataGridTextColumn Header="Created"
|
|
Binding="{Binding CreationDate, StringFormat={}{0:MM/dd/yyyy}}"
|
|
Width="100"/>
|
|
<DataGridTextColumn Header="Expires"
|
|
Binding="{Binding ExpiryDate, StringFormat={}{0:MM/dd/yyyy}}"
|
|
Width="100"/>
|
|
<DataGridTextColumn Header="Status"
|
|
Binding="{Binding Status}"
|
|
Width="80"/>
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
</StackPanel>
|
|
</materialDesign:Card>
|
|
|
|
<!-- Create Token Panel -->
|
|
<materialDesign:Card Grid.Column="1" Margin="8,0,0,0">
|
|
<StackPanel Margin="16">
|
|
<TextBlock Text="Create New Token"
|
|
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
|
|
Margin="0,0,0,16"/>
|
|
|
|
<TextBox materialDesign:HintAssist.Hint="Token Name"
|
|
Text="{Binding NewTokenName}"
|
|
Margin="0,0,0,16"
|
|
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
|
|
|
|
<TextBox materialDesign:HintAssist.Hint="Symbol"
|
|
Text="{Binding NewTokenSymbol}"
|
|
Margin="0,0,0,16"
|
|
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
|
|
|
|
<TextBox materialDesign:HintAssist.Hint="Decimals"
|
|
Text="{Binding NewTokenDecimals}"
|
|
Margin="0,0,0,16"
|
|
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
|
|
|
|
<TextBox materialDesign:HintAssist.Hint="Total Supply"
|
|
Text="{Binding NewTokenSupply}"
|
|
Margin="0,0,0,16"
|
|
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
|
|
|
|
<TextBox materialDesign:HintAssist.Hint="Expiry Days (10-90)"
|
|
Text="{Binding NewTokenExpiryDays}"
|
|
Margin="0,0,0,16"
|
|
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
|
|
|
|
<ComboBox materialDesign:HintAssist.Hint="Owner Wallet"
|
|
ItemsSource="{Binding Wallets}"
|
|
SelectedItem="{Binding SelectedWallet}"
|
|
DisplayMemberPath="Name"
|
|
Margin="0,0,0,16"
|
|
Style="{DynamicResource MaterialDesignFloatingHintComboBox}"/>
|
|
|
|
<Button Content="CREATE TOKEN"
|
|
Command="{Binding CreateTokenCommand}"
|
|
IsEnabled="{Binding IsLoading, Converter={StaticResource InverseBooleanConverter}}"
|
|
Style="{DynamicResource MaterialDesignRaisedButton}"
|
|
Margin="0,8,0,0"/>
|
|
</StackPanel>
|
|
</materialDesign:Card>
|
|
</Grid>
|
|
</TabItem>
|
|
|
|
<!-- Wallets Tab -->
|
|
<TabItem Header="Wallets" Name="WalletsTab">
|
|
<Grid Margin="16">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="300"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<!-- Wallet List -->
|
|
<materialDesign:Card Grid.Column="0" Margin="0,0,8,0">
|
|
<StackPanel>
|
|
<TextBlock Text="My Wallets"
|
|
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
|
|
Margin="16,16,16,8"/>
|
|
|
|
<DataGrid ItemsSource="{Binding Wallets}"
|
|
SelectedItem="{Binding SelectedWallet}"
|
|
AutoGenerateColumns="False"
|
|
CanUserAddRows="False"
|
|
CanUserDeleteRows="False"
|
|
IsReadOnly="True"
|
|
Style="{DynamicResource MaterialDesignDataGrid}">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Name"
|
|
Binding="{Binding Name}"
|
|
Width="120"/>
|
|
<DataGridTextColumn Header="Address"
|
|
Binding="{Binding Address}"
|
|
Width="200"/>
|
|
<DataGridTextColumn Header="TRX Balance"
|
|
Binding="{Binding TrxBalance, StringFormat={}{0:F2}}"
|
|
Width="100"/>
|
|
<DataGridTextColumn Header="Created"
|
|
Binding="{Binding CreatedDate, StringFormat={}{0:MM/dd/yyyy}}"
|
|
Width="100"/>
|
|
<DataGridCheckBoxColumn Header="Imported"
|
|
Binding="{Binding IsImported}"
|
|
Width="80"/>
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
|
|
<!-- Token Balances -->
|
|
<TextBlock Text="Token Balances"
|
|
Style="{DynamicResource MaterialDesignSubtitle1TextBlock}"
|
|
Margin="16,16,16,8"/>
|
|
|
|
<DataGrid ItemsSource="{Binding TokenBalances}"
|
|
AutoGenerateColumns="False"
|
|
CanUserAddRows="False"
|
|
CanUserDeleteRows="False"
|
|
IsReadOnly="True"
|
|
MaxHeight="200"
|
|
Style="{DynamicResource MaterialDesignDataGrid}">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Token"
|
|
Binding="{Binding TokenSymbol}"
|
|
Width="80"/>
|
|
<DataGridTextColumn Header="Balance"
|
|
Binding="{Binding Balance, StringFormat={}{0:F4}}"
|
|
Width="120"/>
|
|
<DataGridTextColumn Header="Contract"
|
|
Binding="{Binding ContractAddress}"
|
|
Width="200"/>
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
</StackPanel>
|
|
</materialDesign:Card>
|
|
|
|
<!-- Wallet Actions Panel -->
|
|
<materialDesign:Card Grid.Column="1" Margin="8,0,0,0">
|
|
<StackPanel Margin="16">
|
|
<TextBlock Text="Wallet Actions"
|
|
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
|
|
Margin="0,0,0,16"/>
|
|
|
|
<!-- Create Wallet -->
|
|
<GroupBox Header="Create New Wallet" Margin="0,0,0,16">
|
|
<StackPanel Margin="8">
|
|
<TextBox materialDesign:HintAssist.Hint="Wallet Name"
|
|
Text="{Binding NewWalletName}"
|
|
Margin="0,0,0,8"
|
|
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
|
|
|
|
<Button Content="CREATE WALLET"
|
|
Command="{Binding CreateWalletCommand}"
|
|
Style="{DynamicResource MaterialDesignOutlinedButton}"/>
|
|
</StackPanel>
|
|
</GroupBox>
|
|
|
|
<!-- Import Wallet -->
|
|
<GroupBox Header="Import Wallet">
|
|
<StackPanel Margin="8">
|
|
<TextBox materialDesign:HintAssist.Hint="Wallet Name"
|
|
Text="{Binding NewWalletName}"
|
|
Margin="0,0,0,8"
|
|
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
|
|
|
|
<PasswordBox materialDesign:HintAssist.Hint="Private Key"
|
|
x:Name="PrivateKeyBox"
|
|
Margin="0,0,0,8"
|
|
Style="{DynamicResource MaterialDesignFloatingHintPasswordBox}"/>
|
|
|
|
<Button Content="IMPORT WALLET"
|
|
Command="{Binding ImportWalletCommand}"
|
|
Style="{DynamicResource MaterialDesignOutlinedButton}"/>
|
|
</StackPanel>
|
|
</GroupBox>
|
|
</StackPanel>
|
|
</materialDesign:Card>
|
|
</Grid>
|
|
</TabItem>
|
|
|
|
<!-- Transfer Tab -->
|
|
<TabItem Header="Transfer" Name="TransferTab">
|
|
<Grid Margin="16">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="400"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<!-- Transaction History -->
|
|
<materialDesign:Card Grid.Column="0" Margin="0,0,8,0">
|
|
<StackPanel>
|
|
<TextBlock Text="Transaction History"
|
|
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
|
|
Margin="16,16,16,8"/>
|
|
|
|
<DataGrid ItemsSource="{Binding Transactions}"
|
|
AutoGenerateColumns="False"
|
|
CanUserAddRows="False"
|
|
CanUserDeleteRows="False"
|
|
IsReadOnly="True"
|
|
Style="{DynamicResource MaterialDesignDataGrid}">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Hash"
|
|
Binding="{Binding TransactionHash}"
|
|
Width="180">
|
|
<DataGridTextColumn.ElementStyle>
|
|
<Style TargetType="TextBlock">
|
|
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
|
|
<Setter Property="ToolTip" Value="{Binding TransactionHash}"/>
|
|
</Style>
|
|
</DataGridTextColumn.ElementStyle>
|
|
</DataGridTextColumn>
|
|
<DataGridTextColumn Header="From"
|
|
Binding="{Binding FromAddress}"
|
|
Width="120">
|
|
<DataGridTextColumn.ElementStyle>
|
|
<Style TargetType="TextBlock">
|
|
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
|
|
</Style>
|
|
</DataGridTextColumn.ElementStyle>
|
|
</DataGridTextColumn>
|
|
<DataGridTextColumn Header="To"
|
|
Binding="{Binding ToAddress}"
|
|
Width="120">
|
|
<DataGridTextColumn.ElementStyle>
|
|
<Style TargetType="TextBlock">
|
|
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
|
|
</Style>
|
|
</DataGridTextColumn.ElementStyle>
|
|
</DataGridTextColumn>
|
|
<DataGridTextColumn Header="Amount"
|
|
Binding="{Binding Amount, StringFormat={}{0:F4}}"
|
|
Width="100"/>
|
|
<DataGridTextColumn Header="Token"
|
|
Binding="{Binding TokenSymbol}"
|
|
Width="80"/>
|
|
<DataGridTemplateColumn Header="Status" Width="100">
|
|
<DataGridTemplateColumn.CellTemplate>
|
|
<DataTemplate>
|
|
<Border CornerRadius="10"
|
|
Padding="8,4">
|
|
<Border.Style>
|
|
<Style TargetType="Border">
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding Status}" Value="Confirmed">
|
|
<Setter Property="Background" Value="LightGreen"/>
|
|
</DataTrigger>
|
|
<DataTrigger Binding="{Binding Status}" Value="Pending">
|
|
<Setter Property="Background" Value="LightYellow"/>
|
|
</DataTrigger>
|
|
<DataTrigger Binding="{Binding Status}" Value="Failed">
|
|
<Setter Property="Background" Value="LightCoral"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</Border.Style>
|
|
<TextBlock Text="{Binding Status}"
|
|
FontWeight="Bold"
|
|
HorizontalAlignment="Center"/>
|
|
</Border>
|
|
</DataTemplate>
|
|
</DataGridTemplateColumn.CellTemplate>
|
|
</DataGridTemplateColumn>
|
|
<DataGridTextColumn Header="Time"
|
|
Binding="{Binding Timestamp, StringFormat={}{0:MM/dd/yyyy HH:mm}}"
|
|
Width="120"/>
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
</StackPanel>
|
|
</materialDesign:Card>
|
|
|
|
<!-- Transfer Panel -->
|
|
<materialDesign:Card Grid.Column="1" Margin="8,0,0,0">
|
|
<StackPanel Margin="16">
|
|
<TextBlock Text="Transfer Tokens"
|
|
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
|
|
Margin="0,0,0,16"/>
|
|
|
|
<ComboBox materialDesign:HintAssist.Hint="From Wallet"
|
|
ItemsSource="{Binding Wallets}"
|
|
SelectedItem="{Binding SelectedWallet}"
|
|
DisplayMemberPath="Name"
|
|
Margin="0,0,0,16"
|
|
Style="{DynamicResource MaterialDesignFloatingHintComboBox}"/>
|
|
|
|
<ComboBox materialDesign:HintAssist.Hint="Token"
|
|
ItemsSource="{Binding TokenBalances}"
|
|
SelectedItem="{Binding SelectedTokenBalance}"
|
|
DisplayMemberPath="TokenSymbol"
|
|
Margin="0,0,0,16"
|
|
Style="{DynamicResource MaterialDesignFloatingHintComboBox}"/>
|
|
|
|
<TextBlock Text="{Binding SelectedTokenBalance.Balance, StringFormat='Available: {0:F4}'}"
|
|
Style="{DynamicResource MaterialDesignCaptionTextBlock}"
|
|
Margin="0,0,0,8"
|
|
Foreground="{DynamicResource MaterialDesignBodyLight}"/>
|
|
|
|
<TextBox materialDesign:HintAssist.Hint="To Address"
|
|
Text="{Binding TransferToAddress}"
|
|
Margin="0,0,0,16"
|
|
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
|
|
|
|
<TextBox materialDesign:HintAssist.Hint="Amount"
|
|
Text="{Binding TransferAmount}"
|
|
Margin="0,0,0,16"
|
|
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
|
|
|
|
<Button Content="TRANSFER"
|
|
Command="{Binding TransferTokenCommand}"
|
|
IsEnabled="{Binding IsLoading, Converter={StaticResource InverseBooleanConverter}}"
|
|
Style="{DynamicResource MaterialDesignRaisedButton}"
|
|
Margin="0,8,0,0"/>
|
|
|
|
<ProgressBar IsIndeterminate="True"
|
|
Visibility="{Binding IsLoading, Converter={StaticResource BoolToVisibilityConverter}}"
|
|
Margin="0,16,0,0"/>
|
|
</StackPanel>
|
|
</materialDesign:Card>
|
|
</Grid>
|
|
</TabItem>
|
|
</TabControl>
|
|
|
|
<!-- Status Bar -->
|
|
<materialDesign:ColorZone Grid.Row="2"
|
|
Mode="PrimaryDark"
|
|
Padding="16,8">
|
|
<TextBlock Text="{Binding StatusMessage}"
|
|
Style="{DynamicResource MaterialDesignCaptionTextBlock}"/>
|
|
</materialDesign:ColorZone>
|
|
</Grid>
|
|
</Window> |