Procházet zdrojové kódy

some more refactorings.

deleted some more unneeded files.
Ugochukwu Mmaduekwe před 7 roky
rodič
revize
f5e34ab3c5

+ 2 - 2
src/gui/wizards/operations/UWIZChangeKey.pas

@@ -34,7 +34,7 @@ implementation
 
 uses
   UCoreUtils,
-  UWIZChangeKey_ConfirmAccount,
+  UWIZOperationSelected,
   UWIZChangeKey_SelectOption,
   UWIZOperationConfirmation;
 
@@ -44,7 +44,7 @@ constructor TWIZChangeKeyWizard.Create(AOwner: TComponent);
 begin
   inherited Create(AOwner,
     [
-    TWIZChangeKey_ConfirmAccount,
+    TWIZOperationSelected,
     TWIZChangeKey_SelectOption,
     TWIZOperationConfirmation
     ]

+ 0 - 70
src/gui/wizards/operations/UWIZChangeKey_Confirmation.lfm

@@ -1,70 +0,0 @@
-object WIZChangeKey_Confirmation: TWIZChangeKey_Confirmation
-  Left = 0
-  Height = 320
-  Top = 0
-  Width = 511
-  Caption = 'WIZChangeKey_Confirmation'
-  ClientHeight = 320
-  ClientWidth = 511
-  Visible = False
-  object GroupBox1: TGroupBox
-    Left = 4
-    Height = 308
-    Top = 4
-    Width = 500
-    Anchors = [akTop, akLeft, akRight, akBottom]
-    Caption = 'Confirm'
-    ClientHeight = 288
-    ClientWidth = 496
-    TabOrder = 0
-    object paGrid: TPanel
-      Left = 8
-      Height = 124
-      Top = 48
-      Width = 482
-      Anchors = [akTop, akLeft, akRight, akBottom]
-      BevelOuter = bvNone
-      Caption = 'GRID PANEL'
-      TabOrder = 0
-    end
-    object lblSgnAcc: TLabel
-      Left = 112
-      Height = 15
-      Top = 10
-      Width = 53
-      Caption = 'lblSgnAcc'
-      ParentColor = False
-    end
-    object Label1: TLabel
-      Left = 8
-      Height = 15
-      Top = 10
-      Width = 88
-      Caption = 'Signer Account:'
-      Font.Style = [fsBold]
-      ParentColor = False
-      ParentFont = False
-    end
-    object lblPayload: TLabel
-      Left = 8
-      Height = 15
-      Top = 172
-      Width = 42
-      Anchors = [akLeft, akBottom]
-      Caption = 'Payload'
-      Font.Style = [fsBold]
-      ParentColor = False
-      ParentFont = False
-    end
-    object mmoPayload: TMemo
-      Left = 8
-      Height = 82
-      Top = 192
-      Width = 480
-      Anchors = [akLeft, akRight, akBottom]
-      Enabled = False
-      ScrollBars = ssBoth
-      TabOrder = 1
-    end
-  end
-end

+ 0 - 177
src/gui/wizards/operations/UWIZChangeKey_Confirmation.pas

@@ -1,177 +0,0 @@
-unit UWIZChangeKey_Confirmation;
-
-{$mode delphi}
-{$modeswitch nestedprocvars}
-
-{ Copyright (c) 2018 Sphere 10 Software (http://www.sphere10.com/)
-
-  Distributed under the MIT software license, see the accompanying file LICENSE
-  or visit http://www.opensource.org/licenses/mit-license.php.
-
-  Acknowledgements:
-  Ugochukwu Mmaduekwe - main developer
-  Herman Schoenfeld - designer
-}
-
-interface
-
-uses
-  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
-  ExtCtrls, UVisualGrid, UCellRenderers, UCommon.Data, UWizard, UWIZChangeKey, UWIZModels;
-
-type
-
-  { TWIZChangeKey_Confirmation }
-
-  TWIZChangeKey_Confirmation = class(TWizardForm<TWIZOperationsModel>)
-    GroupBox1: TGroupBox;
-    Label1: TLabel;
-    lblPayload: TLabel;
-    lblSgnAcc: TLabel;
-    mmoPayload: TMemo;
-    paGrid: TPanel;
-  private
-    FChangeKeyGrid: TVisualGrid;
-  public
-    procedure OnPresent; override;
-    procedure OnNext; override;
-  end;
-
-
-implementation
-
-{$R *.lfm}
-
-uses UAccounts, UWallet, UUserInterface, UCrypto, UDataSources, UCommon, UCommon.UI, Generics.Collections;
-
-type
-
-  { TAccountChangeKeyDataSource }
-
-  TAccountChangeKeyDataSource = class(TAccountsDataSourceBase)
-  private
-    FModel: TWIZOperationsModel;
-  protected
-    function GetColumns: TDataColumns; override;
-  public
-    property Model: TWIZOperationsModel read FModel write FModel;
-    procedure FetchAll(const AContainer: TList<TAccount>); override;
-    function GetItemField(constref AItem: TAccount; const ABindingName: ansistring): variant; override;
-  end;
-
-{ TWIZChangeKey_Confirmation }
-
-procedure TWIZChangeKey_Confirmation.OnPresent;
-var
-  Data: TAccountChangeKeyDataSource;
-begin
-  FChangeKeyGrid := TVisualGrid.Create(Self);
-  FChangeKeyGrid.CanSearch := False;
-  FChangeKeyGrid.SortMode := smMultiColumn;
-  FChangeKeyGrid.FetchDataInThread := False;
-  FChangeKeyGrid.AutoPageSize := True;
-  FChangeKeyGrid.SelectionType := stNone;
-  FChangeKeyGrid.Options := [vgoColAutoFill, vgoColSizing, vgoSortDirectionAllowNone, vgoAutoHidePaging];
-
-  with FChangeKeyGrid.AddColumn('Account') do
-  begin
-    StretchedToFill := true;
-    Binding := 'Account';
-    SortBinding := 'AccountNumber';
-    DisplayBinding := 'Display';
-    Filters := SORTABLE_NUMERIC_FILTER;
-    HeaderFontStyles := [fsBold];
-    DataFontStyles := [fsBold];
-  end;
-
-  with FChangeKeyGrid.AddColumn('Current Key') do
-  begin
-    Binding := 'Key';
-    Filters := SORTABLE_TEXT_FILTER;
-    Width := 130;
-  end;
-
-  with FChangeKeyGrid.AddColumn('New Key') do
-  begin
-    Binding := 'NewKey';
-    Filters := SORTABLE_TEXT_FILTER;
-    Width := 130;
-  end;
-
-  with FChangeKeyGrid.AddColumn('Fee') do
-  begin
-    Binding := 'FeeDecimal';
-    SortBinding := 'Fee';
-    DisplayBinding := 'Fee';
-    Filters := SORTABLE_TEXT_FILTER;
-    Width := 50;
-    Renderer := TCellRenderers.PASC;
-    HeaderAlignment := taRightJustify;
-    DataAlignment := taRightJustify;
-  end;
-
-  Data := TAccountChangeKeyDataSource.Create(FChangeKeyGrid);
-  Data.Model := Model;
-  FChangeKeyGrid.DataSource := Data;
-  paGrid.AddControlDockCenter(FChangeKeyGrid);
-  lblSgnAcc.Caption := TAccountComp.AccountNumberToAccountTxtNumber(Model.Signer.SignerAccount.account);
-  mmoPayload.Lines.Text := Model.Payload.Content;
-end;
-
-procedure TWIZChangeKey_Confirmation.OnNext;
-var
-  locked: boolean;
-begin
-  locked := (not TWallet.Keys.HasPassword) or (not TWallet.Keys.IsValidPassword);
-  if locked then
-    TUserInterface.UnlockWallet(Self);
-end;
-
-{ TAccountChangeKeyDataSource }
-
-function TAccountChangeKeyDataSource.GetColumns: TDataColumns;
-begin
-  Result := TArrayTool<TDataColumn>.Concat([
-    Inherited,
-    // Additional Columns
-    TDataColumns.Create(
-      TDataColumn.From('NewKey'),
-      TDataColumn.From('Fee'),
-      TDataColumn.From('FeeDecimal')
-    )
-  ]);
-end;
-
-function TAccountChangeKeyDataSource.GetItemField(constref AItem: TAccount; const ABindingName: ansistring): variant;
-begin
-  if ABindingName = 'Fee' then
-    Result := -Model.Fee.SingleOperationFee
-  else if ABindingName = 'FeeDecimal' then
-    Result := TAccountComp.FormatMoneyDecimal(-Model.Fee.SingleOperationFee)
-  else if ABindingName = 'NewKey' then
-    case Model.ChangeKey.ChangeKeyMode of
-      akaTransferAccountOwnership: Result := TAccountComp.AccountPublicKeyExport(Model.TransferAccount.AccountKey);
-      akaChangeAccountPrivateKey: begin
-        Result := IIF(
-          Model.ChangeAccountPrivateKey.NewWalletKey.Name = '',
-          TCrypto.ToHexaString(TAccountComp.AccountKey2RawString(Model.ChangeAccountPrivateKey.NewWalletKey.AccountKey)),
-          Model.ChangeAccountPrivateKey.NewWalletKey.Name
-        );
-        if not Assigned(Model.ChangeAccountPrivateKey.NewWalletKey.PrivateKey) then
-          Result := Result + '(*)';
-      end
-      else raise ENotSupportedException.Create('ChangeKeyMode');
-    end
-  else Result := Inherited GetItemField(AItem, ABindingName);
-end;
-
-
-procedure TAccountChangeKeyDataSource.FetchAll(const AContainer: TList<TAccount>);
-var
-  i: integer;
-begin
-  for i := Low(Model.Account.SelectedAccounts) to High(Model.Account.SelectedAccounts) do
-    AContainer.Add(Model.Account.SelectedAccounts[i]);
-end;
-
-end.

+ 5 - 5
src/gui/wizards/operations/UWIZEnlistAccountForSale.pas

@@ -45,11 +45,11 @@ uses
   UWallet,
   UECIES,
   UAES,
-  UWIZEnlistAccountForSale_ConfirmAccount,
+  UWIZOperationSelected,
   UWIZEnlistAccountForSale_SelectOption,
   UWIZEnlistAccountForSale_EnterSeller,
   UWIZEnlistAccountForSale_EnterSaleAmount,
-  UWIZEnlistAccountForSale_Confirmation;
+  UWIZOperationConfirmation;
 
 { TWIZEnlistAccountForSaleWizard }
 
@@ -370,11 +370,11 @@ constructor TWIZEnlistAccountForSaleWizard.Create(AOwner: TComponent);
 begin
   inherited Create(AOwner,
     [
-    TWIZEnlistAccountForSale_ConfirmAccount,
+    TWIZOperationSelected,
     TWIZEnlistAccountForSale_SelectOption,
     TWIZEnlistAccountForSale_EnterSeller,
     TWIZEnlistAccountForSale_EnterSaleAmount,
-    TWIZEnlistAccountForSale_Confirmation
+    TWIZOperationConfirmation
     ]
     );
   TitleText := 'Enlist Account';
@@ -383,7 +383,7 @@ end;
 
 function TWIZEnlistAccountForSaleWizard.DetermineHasNext: boolean;
 begin
-  Result := not (CurrentScreen is TWIZEnlistAccountForSale_Confirmation);
+  Result := not (CurrentScreen is TWIZOperationConfirmation);
 end;
 
 function TWIZEnlistAccountForSaleWizard.DetermineHasPrevious: boolean;

+ 0 - 32
src/gui/wizards/operations/UWIZEnlistAccountForSale_ConfirmAccount.lfm

@@ -1,32 +0,0 @@
-object WIZEnlistAccountForSale_ConfirmAccount: TWIZEnlistAccountForSale_ConfirmAccount
-  Left = 0
-  Height = 274
-  Top = 0
-  Width = 429
-  Caption = 'WIZEnlistAccountForSale_ConfirmAccount'
-  ClientHeight = 274
-  ClientWidth = 429
-  LCLVersion = '1.8.2.0'
-  Visible = False
-  object grpEnlistAccount: TGroupBox
-    Left = 4
-    Height = 266
-    Top = 4
-    Width = 416
-    Anchors = [akTop, akLeft, akRight, akBottom]
-    Caption = 'Accounts To Sell'
-    ClientHeight = 246
-    ClientWidth = 412
-    TabOrder = 0
-    object paGrid: TPanel
-      Left = 6
-      Height = 226
-      Top = 8
-      Width = 402
-      Anchors = [akTop, akLeft, akRight, akBottom]
-      BevelOuter = bvNone
-      Caption = 'GRID PANEL'
-      TabOrder = 0
-    end
-  end
-end

+ 0 - 128
src/gui/wizards/operations/UWIZEnlistAccountForSale_ConfirmAccount.pas

@@ -1,128 +0,0 @@
-unit UWIZEnlistAccountForSale_ConfirmAccount;
-
-{$mode delphi}
-{$modeswitch nestedprocvars}
-
-{ Copyright (c) 2018 by Ugochukwu Mmaduekwe
-
-  Distributed under the MIT software license, see the accompanying file LICENSE
-  or visit http://www.opensource.org/licenses/mit-license.php.
-}
-
-interface
-
-uses
-  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
-  ExtCtrls, UVisualGrid, UCommon.Data, UCellRenderers, UWizard, UWIZModels;
-
-type
-
-  { TWIZEnlistAccountForSale_ConfirmAccount }
-
-  TWIZEnlistAccountForSale_ConfirmAccount = class(TWizardForm<TWIZOperationsModel>)
-    grpEnlistAccountForSale: TGroupBox;
-    grpEnlistAccount: TGroupBox;
-    paGrid: TPanel;
-  private
-    FEnlistAccountsGrid: TVisualGrid;
-  public
-    procedure OnPresent; override;
-    function Validate(out message: ansistring): boolean; override;
-  end;
-
-
-
-implementation
-
-{$R *.lfm}
-
-uses UAccounts, USettings, UCoreUtils, UDataSources, UCommon, UCommon.UI, Generics.Collections;
-
-type
-
-  { TAccountSenderDataSource }
-
-  TAccountSenderDataSource = class(TAccountsDataSourceBase)
-  private
-    FModel: TWIZOperationsModel;
-  public
-    property Model: TWIZOperationsModel read FModel write FModel;
-    procedure FetchAll(const AContainer: TList<TAccount>); override;
-  end;
-
-{ TWIZEnlistAccountForSale_ConfirmAccount }
-
-procedure TWIZEnlistAccountForSale_ConfirmAccount.OnPresent;
-var
-  Data: TAccountSenderDataSource;
-begin
-  FEnlistAccountsGrid := TVisualGrid.Create(Self);
-  FEnlistAccountsGrid.CanSearch := False;
-  FEnlistAccountsGrid.SortMode := smMultiColumn;
-  FEnlistAccountsGrid.FetchDataInThread := False;
-  FEnlistAccountsGrid.AutoPageSize := True;
-  FEnlistAccountsGrid.SelectionType := stNone;
-  FEnlistAccountsGrid.Options := [vgoColAutoFill, vgoColSizing, vgoSortDirectionAllowNone,
-    vgoAutoHidePaging];
-  with FEnlistAccountsGrid.AddColumn('Account') do
-  begin
-    StretchedToFill := True;
-    Binding := 'AccountNumber';
-    SortBinding := 'AccountNumber';
-    DisplayBinding := 'Account';
-    Width := 100;
-    HeaderFontStyles := [fsBold];
-    DataFontStyles := [fsBold];
-    Filters := SORTABLE_NUMERIC_FILTER;
-  end;
-  with FEnlistAccountsGrid.AddColumn('Balance') do
-  begin
-    Binding := 'BalanceDecimal';
-    SortBinding := 'Balance';
-    DisplayBinding := 'Balance';
-    Width := 100;
-    HeaderAlignment := taRightJustify;
-    DataAlignment := taRightJustify;
-    Renderer := TCellRenderers.PASC;
-    Filters := SORTABLE_NUMERIC_FILTER;
-  end;
-  Data := TAccountSenderDataSource.Create(FEnlistAccountsGrid);
-  Data.Model := Model;
-  FEnlistAccountsGrid.DataSource := Data;
-  paGrid.AddControlDockCenter(FEnlistAccountsGrid);
-end;
-
-function TWIZEnlistAccountForSale_ConfirmAccount.Validate(out message: ansistring): boolean;
-var
-  i: integer;
-begin
-  Result := True;
-  for i := Low(model.Account.SelectedAccounts) to High(model.Account.SelectedAccounts) do
-    if TAccountComp.IsAccountForSale(model.Account.SelectedAccounts[i].accountInfo) then
-    begin
-      Result := False;
-      message := 'Account ' + TAccountComp.AccountNumberToAccountTxtNumber(
-        model.Account.SelectedAccounts[i].account) + ' is already enlisted for sale';
-      Exit;
-    end;
-
-  // get signer accounts from selected accounts
-  Model.Signer.SignerCandidates := TCoreTool.GetSignerCandidates(Length(Model.Account.SelectedAccounts), Model.Fee.SingleOperationFee, Model.Account.SelectedAccounts);
-
-  if Length(Model.Signer.SignerCandidates) < 1 then
-  begin
-    Result := False;
-    message := 'no valid signer account was found.';
-  end;
-end;
-
-procedure TAccountSenderDataSource.FetchAll(const AContainer: TList<TAccount>);
-var
-  i: integer;
-begin
-  for i := Low(Model.Account.SelectedAccounts) to High(Model.Account.SelectedAccounts) do
-    AContainer.Add(Model.Account.SelectedAccounts[i]);
-end;
-
-
-end.

+ 0 - 88
src/gui/wizards/operations/UWIZEnlistAccountForSale_Confirmation.lfm

@@ -1,88 +0,0 @@
-object WIZEnlistAccountForSale_Confirmation: TWIZEnlistAccountForSale_Confirmation
-  Left = 0
-  Height = 320
-  Top = 0
-  Width = 511
-  Caption = 'WIZEnlistAccountForSale_Confirmation'
-  ClientHeight = 320
-  ClientWidth = 511
-  Visible = False
-  object GroupBox1: TGroupBox
-    Left = 4
-    Height = 308
-    Top = 4
-    Width = 490
-    Anchors = [akTop, akLeft, akRight, akBottom]
-    Caption = 'Confirm Sale'
-    ClientHeight = 288
-    ClientWidth = 486
-    TabOrder = 0
-    object paGrid: TPanel
-      Left = 8
-      Height = 120
-      Top = 56
-      Width = 464
-      Anchors = [akTop, akLeft, akRight, akBottom]
-      BevelOuter = bvNone
-      Caption = 'GRID PANEL'
-      TabOrder = 0
-    end
-    object Label1: TLabel
-      Left = 8
-      Height = 15
-      Top = 8
-      Width = 36
-      Caption = 'Signer'
-      Font.Style = [fsBold]
-      ParentColor = False
-      ParentFont = False
-    end
-    object lblSgnAcc: TLabel
-      Left = 80
-      Height = 15
-      Top = 8
-      Width = 53
-      Caption = 'lblSgnAcc'
-      ParentColor = False
-    end
-    object Label2: TLabel
-      Left = 8
-      Height = 15
-      Top = 32
-      Width = 32
-      Caption = 'Seller'
-      Font.Style = [fsBold]
-      ParentColor = False
-      ParentFont = False
-    end
-    object lblSellerAcc: TLabel
-      Left = 80
-      Height = 15
-      Top = 32
-      Width = 61
-      Caption = 'lblSellerAcc'
-      ParentColor = False
-    end
-    object lblPayload: TLabel
-      Left = 8
-      Height = 15
-      Top = 181
-      Width = 42
-      Anchors = [akLeft, akBottom]
-      Caption = 'Payload'
-      Font.Style = [fsBold]
-      ParentColor = False
-      ParentFont = False
-    end
-    object mmoPayload: TMemo
-      Left = 8
-      Height = 82
-      Top = 201
-      Width = 472
-      Anchors = [akLeft, akRight, akBottom]
-      Enabled = False
-      ScrollBars = ssBoth
-      TabOrder = 1
-    end
-  end
-end

+ 0 - 166
src/gui/wizards/operations/UWIZEnlistAccountForSale_Confirmation.pas

@@ -1,166 +0,0 @@
-unit UWIZEnlistAccountForSale_Confirmation;
-
-{$mode delphi}
-{$modeswitch nestedprocvars}
-
-{ Copyright (c) 2018 by Ugochukwu Mmaduekwe
-
-  Distributed under the MIT software license, see the accompanying file LICENSE
-  or visit http://www.opensource.org/licenses/mit-license.php.
-}
-
-interface
-
-uses
-  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
-  ExtCtrls, UVisualGrid, UCellRenderers, UCommon.Data, UWizard, UWIZModels;
-
-type
-
-  { TWIZEnlistAccountForSale_Confirmation }
-
-  TWIZEnlistAccountForSale_Confirmation = class(TWizardForm<TWIZOperationsModel>)
-    GroupBox1: TGroupBox;
-    Label1: TLabel;
-    Label2: TLabel;
-    lblSgnAcc: TLabel;
-    lblSellerAcc: TLabel;
-    paGrid: TPanel;
-  private
-    FEnlistAccountsGrid : TVisualGrid;
-  public
-    procedure OnPresent; override;
-    procedure OnNext; override;
-  end;
-
-
-implementation
-
-{$R *.lfm}
-
-uses UAccounts, UWallet, UUserInterface, UDataSources, UCommon, UCommon.UI,
-  Generics.Collections, UCoreUtils;
-
-type
-
-  { TAccountSenderDataSource }
-
-  TAccountSenderDataSource = class(TAccountsDataSourceBase)
-    private
-      FModel : TWIZOperationsModel;
-    protected
-      function GetColumns : TDataColumns; override;
-    public
-      property Model : TWIZOperationsModel read FModel write FModel;
-      procedure FetchAll(const AContainer : TList<TAccount>); override;
-      function GetItemField(constref AItem: TAccount; const ABindingName : AnsiString) : Variant; override;
-  end;
-
-{ TWIZEnlistAccountForSale_Confirmation }
-
-procedure TWIZEnlistAccountForSale_Confirmation.OnPresent;
-var
-  data : TAccountSenderDataSource;
-begin
-  FEnlistAccountsGrid := TVisualGrid.Create(Self);
-  FEnlistAccountsGrid.CanSearch:= False;
-  FEnlistAccountsGrid.SortMode := smMultiColumn;
-  FEnlistAccountsGrid.FetchDataInThread := False;
-  FEnlistAccountsGrid.AutoPageSize := True;
-  FEnlistAccountsGrid.SelectionType := stNone;
-  FEnlistAccountsGrid.Options := [vgoColAutoFill, vgoColSizing, vgoSortDirectionAllowNone, vgoAutoHidePaging];
-  with FEnlistAccountsGrid.AddColumn('Account') do begin
-    Binding := 'AccountNumber';
-    SortBinding := 'AccountNumber';
-    DisplayBinding := 'Display';
-    Filters := SORTABLE_NUMERIC_FILTER;
-    StretchedToFill := true;
-    HeaderFontStyles := [fsBold];
-    DataFontStyles := [fsBold];
-  end;
-
-  with FEnlistAccountsGrid.AddColumn('Sale Price') do begin
-    Binding := 'SalePriceDecimal';
-    SortBinding := 'SalePrice';
-    DisplayBinding := 'SalePrice';
-    Filters := SORTABLE_NUMERIC_FILTER;
-    Width := 100;
-    Renderer := TCellRenderers.PASC;
-    HeaderAlignment := taRightJustify;
-    DataAlignment := taRightJustify;
-  end;
-
-  with FEnlistAccountsGrid.AddColumn('Fee') do begin
-    Binding := 'FeeDecimal';
-    SortBinding := 'Fee';
-    DisplayBinding := 'Fee';
-    Filters := SORTABLE_NUMERIC_FILTER;
-    Width := 50;
-    Renderer := TCellRenderers.PASC;
-    HeaderAlignment := taRightJustify;
-    DataAlignment := taRightJustify;
-  end;
-
-  data := TAccountSenderDataSource.Create(FEnlistAccountsGrid);
-  data.Model := Model;
-  FEnlistAccountsGrid.DataSource := data;
-  paGrid.AddControlDockCenter(FEnlistAccountsGrid);
-  lblSgnAcc.Caption := Model.Signer.SignerAccount.DisplayString;
-  lblSellerAcc.Caption := Model.EnlistAccountForSale.SellerAccount.DisplayString;
-end;
-
-procedure TWIZEnlistAccountForSale_Confirmation.OnNext;
-var
-  locked: Boolean;
-begin
-  locked := (NOT TWallet.Keys.HasPassword) OR (NOT TWallet.Keys.IsValidPassword);
-  if locked then
-  begin
-    TUserInterface.UnlockWallet(Self);
-  end;
-end;
-
-{ TAccountSenderDataSource }
-
-function TAccountSenderDataSource.GetColumns : TDataColumns;
-begin
-  Result := TArrayTool<TDataColumn>.Concat([
-    Inherited,
-    // Additional columns
-    TDataColumns.Create(
-      TDataColumn.From('SalePrice'),
-      TDataColumn.From('SalePriceDecimal'),
-      TDataColumn.From('Fee'),
-      TDataColumn.From('FeeDecimal')
-    )]
-  );
-end;
-
-function TAccountSenderDataSource.GetItemField(constref AItem: TAccount; const ABindingName : AnsiString) : Variant;
-var
-  index : Integer;
-begin
-   if ABindingName = 'Account' then
-     Result := TAccountComp.AccountNumberToAccountTxtNumber(AItem.account)
-   else if ABindingName = 'SalePrice' then
-     Result := Model.EnlistAccountForSale.SalePrice
-   else if ABindingName = 'SalePriceDecimal' then
-     Result := TAccountComp.FormatMoneyDecimal(Model.EnlistAccountForSale.SalePrice)
-   else if ABindingName = 'Fee' then
-     Result := -Model.Fee.SingleOperationFee
-   else if ABindingName = 'FeeDecimal' then
-     Result := TAccountComp.FormatMoneyDecimal(-Model.Fee.SingleOperationFee)
-   else Result := Inherited GetItemField(AItem, ABindingName);
-end;
-
-procedure TAccountSenderDataSource.FetchAll(const AContainer : TList<TAccount>);
-var
-  i: Integer;
-begin
-  for i := Low(Model.Account.SelectedAccounts) to High(Model.Account.SelectedAccounts) do
-  begin
-    AContainer.Add( Model.Account.SelectedAccounts[i] );
-  end;
-end;
-
-end.

+ 1 - 0
src/gui/wizards/operations/UWIZEnlistAccountForSale_EnterPublicKey.lfm

@@ -7,6 +7,7 @@ object WIZEnlistAccountForSale_EnterPublicKey: TWIZEnlistAccountForSale_EnterPub
   Caption = 'WIZEnlistAccountForSale_EnterPublicKey'
   ClientHeight = 253
   ClientWidth = 429
+  LCLVersion = '1.8.2.0'
   Visible = False
   object gbTransaction: TGroupBox
     Left = 4

+ 1 - 1
src/gui/wizards/operations/UWIZEnlistAccountForSale_EnterPublicKey.pas

@@ -56,7 +56,7 @@ var
 begin
   Result := True;
 
-  if not TAccountComp.AccountKeyFromImport(mmoPublicKey.Text,
+  if not TAccountComp.AccountKeyFromImport(Trim(mmoPublicKey.Lines.Text),
     Model.EnlistAccountForSale.NewOwnerPublicKey, message) then
   begin
     message := 'Public key: ' + message;

+ 4 - 5
src/gui/wizards/operations/UWIZEnlistAccountForSale_EnterSaleAmount.pas

@@ -18,8 +18,7 @@ interface
 uses
   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
   ExtCtrls, Buttons, UCommon, UCommon.Collections, UWallet,
-  UFRMAccountSelect, UNode, UWizard, UWIZOperationFee_Custom, UWIZOperationPayload_Encryption, UWIZOperationSigner_Select,
-  UWIZEnlistAccountForSale_Confirmation, UWIZModels;
+  UFRMAccountSelect, UNode, UWizard, UWIZOperationFee_Custom, UWIZOperationPayload_Encryption, UWIZOperationSigner_Select, UWIZModels;
 
 type
 
@@ -76,14 +75,14 @@ begin
   TAccountComp.TxtToMoney(edtAmt.Text, Model.EnlistAccountForSale.SalePrice);
 
   if chkChooseFee.Checked then
-    UpdatePath(ptReplaceAllNext, [TWIZOperationFee_Custom, TWIZEnlistAccountForSale_Confirmation])
+    UpdatePath(ptInject, [TWIZOperationFee_Custom])
   else
   begin
     Model.Fee.SingleOperationFee := TSettings.DefaultFee;
     if Model.Payload.HasPayload then
-      UpdatePath(ptReplaceAllNext, [TWIZOperationPayload_Encryption, TWIZEnlistAccountForSale_Confirmation])
+      UpdatePath(ptInject, [TWIZOperationPayload_Encryption])
     else if Length(Model.Account.SelectedAccounts) > 1 then
-      UpdatePath(ptReplaceAllNext, [TWIZOperationSigner_Select, TWIZEnlistAccountForSale_Confirmation])
+      UpdatePath(ptInject, [TWIZOperationSigner_Select])
     else
     begin
       Model.Signer.SignerAccount := Model.Account.SelectedAccounts[0];

+ 3 - 3
src/gui/wizards/operations/UWIZEnlistAccountForSale_EnterSeller.lfm

@@ -21,7 +21,7 @@ object WIZEnlistAccountForSale_EnterSeller: TWIZEnlistAccountForSale_EnterSeller
     object edtSellerAcc: TEdit
       Left = 8
       Height = 23
-      Top = 32
+      Top = 48
       Width = 136
       OnChange = edtSellerAccChange
       TabOrder = 0
@@ -29,7 +29,7 @@ object WIZEnlistAccountForSale_EnterSeller: TWIZEnlistAccountForSale_EnterSeller
     object btnSearch: TSpeedButton
       Left = 152
       Height = 22
-      Top = 33
+      Top = 49
       Width = 23
       Glyph.Data = {
         36040000424D3604000000000000360000002800000010000000100000000100
@@ -81,7 +81,7 @@ object WIZEnlistAccountForSale_EnterSeller: TWIZEnlistAccountForSale_EnterSeller
     object lblSellerAccount: TLabel
       Left = 192
       Height = 15
-      Top = 37
+      Top = 52
       Width = 95
       Caption = 'Account Number'
       Font.Style = [fsBold]

+ 4 - 4
src/gui/wizards/operations/UWIZEnlistAccountForSale_SelectOption.lfm

@@ -32,9 +32,9 @@ object WIZEnlistAccountForSale_SelectOption: TWIZEnlistAccountForSale_SelectOpti
     TabStop = True
   end
   object Label2: TLabel
-    Left = 32
+    Left = 24
     Height = 48
-    Top = 80
+    Top = 88
     Width = 352
     Anchors = [akTop, akLeft, akRight]
     AutoSize = False
@@ -53,9 +53,9 @@ object WIZEnlistAccountForSale_SelectOption: TWIZEnlistAccountForSale_SelectOpti
     TabOrder = 1
   end
   object Label3: TLabel
-    Left = 32
+    Left = 24
     Height = 48
-    Top = 168
+    Top = 176
     Width = 350
     Anchors = [akTop, akLeft, akRight]
     AutoSize = False

+ 8 - 8
src/gui/wizards/operations/UWIZOperationConfirmation.pas

@@ -46,9 +46,9 @@ uses UAccounts, UCrypto, UConst, UWallet, UUserInterface, UDataSources, UCommon,
 
 type
 
-  { TAccountSenderDataSource }
+  { TOperationConfirmationDataSource }
 
-  TAccountSenderDataSource = class(TAccountsDataSourceBase)
+  TOperationConfirmationDataSource = class(TAccountsDataSourceBase)
   private
     FModel: TWIZOperationsModel;
 
@@ -64,7 +64,7 @@ type
 
 procedure TWIZOperationConfirmation.OnPresent;
 var
-  Data: TAccountSenderDataSource;
+  Data: TOperationConfirmationDataSource;
 begin
   FConfirmationGrid := TVisualGrid.Create(Self);
   FConfirmationGrid.CanSearch := False;
@@ -118,7 +118,7 @@ begin
     DataAlignment := taRightJustify;
   end;
 
-  Data := TAccountSenderDataSource.Create(FConfirmationGrid);
+  Data := TOperationConfirmationDataSource.Create(FConfirmationGrid);
   Data.Model := Model;
   FConfirmationGrid.DataSource := Data;
   paGrid.AddControlDockCenter(FConfirmationGrid);
@@ -135,9 +135,9 @@ begin
     TUserInterface.UnlockWallet(Self);
 end;
 
-{ TAccountSenderDataSource }
+{ TOperationConfirmationDataSource }
 
-function TAccountSenderDataSource.GetColumns: TDataColumns;
+function TOperationConfirmationDataSource.GetColumns: TDataColumns;
 begin
   Result := TArrayTool<TDataColumn>.Concat([
      Inherited,
@@ -150,7 +150,7 @@ begin
     ]);
 end;
 
-function TAccountSenderDataSource.GetItemField(constref AItem: TAccount; const ABindingName: ansistring): variant;
+function TOperationConfirmationDataSource.GetItemField(constref AItem: TAccount; const ABindingName: ansistring): variant;
 var
   LAmount: string;
   LCurrentAccountKey, LDestinationAccountKey: TAccountKey;
@@ -211,7 +211,7 @@ begin
 end;
 
 
-procedure TAccountSenderDataSource.FetchAll(const AContainer: TList<TAccount>);
+procedure TOperationConfirmationDataSource.FetchAll(const AContainer: TList<TAccount>);
 var
   i: integer;
 begin

+ 4 - 5
src/gui/wizards/operations/UWIZChangeKey_ConfirmAccount.lfm → src/gui/wizards/operations/UWIZOperationSelected.lfm

@@ -1,20 +1,19 @@
-object WIZChangeKey_ConfirmAccount: TWIZChangeKey_ConfirmAccount
+object WIZOperationSelected: TWIZOperationSelected
   Left = 0
   Height = 261
   Top = 0
   Width = 429
-  Caption = 'ChangeKey_ConfirmAccount'
+  Caption = 'OperationSelected'
   ClientHeight = 261
   ClientWidth = 429
-  LCLVersion = '1.8.2.0'
   Visible = False
-  object gpChangeKey: TGroupBox
+  object gpSelectedAccounts: TGroupBox
     Left = 4
     Height = 256
     Top = 4
     Width = 420
     Anchors = [akTop, akLeft, akRight, akBottom]
-    Caption = 'Confirm Accounts'
+    Caption = 'Selected Accounts'
     ClientHeight = 236
     ClientWidth = 416
     TabOrder = 0

+ 39 - 27
src/gui/wizards/operations/UWIZChangeKey_ConfirmAccount.pas → src/gui/wizards/operations/UWIZOperationSelected.pas

@@ -1,4 +1,4 @@
-unit UWIZChangeKey_ConfirmAccount;
+unit UWIZOperationSelected;
 
 {$mode delphi}
 
@@ -21,15 +21,15 @@ uses
 
 type
 
-  { TWIZChangeKey_ConfirmAccount }
+  { TWIZOperationSelected }
 
-  TWIZChangeKey_ConfirmAccount = class(TWizardForm<TWIZOperationsModel>)
-    gpChangeKey: TGroupBox;
+  TWIZOperationSelected = class(TWizardForm<TWIZOperationsModel>)
+    gpSelectedAccounts: TGroupBox;
     lblTotalBalances: TLabel;
     lblTotalBalanceValue: TLabel;
     paGrid: TPanel;
   private
-    FChangeKeyGrid: TVisualGrid;
+    FSelectedAccountsGrid: TVisualGrid;
   public
     procedure OnPresent; override;
     function Validate(out message: ansistring): boolean; override;
@@ -45,9 +45,9 @@ uses UAccounts, UCoreUtils, UDataSources, UCommon, UCommon.UI, Generics.Collecti
 
 type
 
-  { TAccountChangeKeyDataSource }
+  { TOperationSelectedDataSource }
 
-  TAccountChangeKeyDataSource = class(TAccountsDataSourceBase)
+  TOperationSelectedDataSource = class(TAccountsDataSourceBase)
   private
     FModel: TWIZOperationsModel;
   public
@@ -55,23 +55,23 @@ type
     procedure FetchAll(const AContainer: TList<TAccount>); override;
   end;
 
-{ TWIZChangeKey_ConfirmAccount }
+{ TWIZOperationSelected }
 
-procedure TWIZChangeKey_ConfirmAccount.OnPresent;
+procedure TWIZOperationSelected.OnPresent;
 var
-  Data: TAccountChangeKeyDataSource;
+  Data: TOperationSelectedDataSource;
   i: integer;
   acc: TAccount;
   totalBalance: int64;
 begin
-  FChangeKeyGrid := TVisualGrid.Create(Self);
-  FChangeKeyGrid.CanSearch := False;
-  FChangeKeyGrid.SortMode := smMultiColumn;
-  FChangeKeyGrid.FetchDataInThread := False;
-  FChangeKeyGrid.AutoPageSize := True;
-  FChangeKeyGrid.SelectionType := stNone;
-  FChangeKeyGrid.Options := [vgoColAutoFill, vgoColSizing, vgoSortDirectionAllowNone, vgoAutoHidePaging];
-  with FChangeKeyGrid.AddColumn('Account') do
+  FSelectedAccountsGrid := TVisualGrid.Create(Self);
+  FSelectedAccountsGrid.CanSearch := False;
+  FSelectedAccountsGrid.SortMode := smMultiColumn;
+  FSelectedAccountsGrid.FetchDataInThread := False;
+  FSelectedAccountsGrid.AutoPageSize := True;
+  FSelectedAccountsGrid.SelectionType := stNone;
+  FSelectedAccountsGrid.Options := [vgoColAutoFill, vgoColSizing, vgoSortDirectionAllowNone, vgoAutoHidePaging];
+  with FSelectedAccountsGrid.AddColumn('Account') do
   begin
     StretchedToFill := True;
     Binding := 'AccountNumber';
@@ -82,7 +82,7 @@ begin
     DataFontStyles := [fsBold];
     Filters := SORTABLE_NUMERIC_FILTER;
   end;
-  with FChangeKeyGrid.AddColumn('Balance') do
+  with FSelectedAccountsGrid.AddColumn('Balance') do
   begin
     Binding := 'BalanceDecimal';
     SortBinding := 'Balance';
@@ -93,10 +93,10 @@ begin
     Renderer := TCellRenderers.PASC;
     Filters := SORTABLE_NUMERIC_FILTER;
   end;
-  Data := TAccountChangeKeyDataSource.Create(FChangeKeyGrid);
+  Data := TOperationSelectedDataSource.Create(FSelectedAccountsGrid);
   Data.Model := Model;
-  FChangeKeyGrid.DataSource := Data;
-  paGrid.AddControlDockCenter(FChangeKeyGrid);
+  FSelectedAccountsGrid.DataSource := Data;
+  paGrid.AddControlDockCenter(FSelectedAccountsGrid);
 
   totalBalance := 0;
   for i := Low(Model.Account.SelectedAccounts) to High(Model.Account.SelectedAccounts) do
@@ -109,9 +109,22 @@ begin
     Format('%s PASC', [TAccountComp.FormatMoney(totalBalance)]);
 end;
 
-function TWIZChangeKey_ConfirmAccount.Validate(out message: ansistring): boolean;
+function TWIZOperationSelected.Validate(out message: ansistring): boolean;
+var
+  i: integer;
 begin
   Result := True;
+
+  if Model.ModelType = omtEnlistAccountForSale then
+    for i := Low(model.Account.SelectedAccounts) to High(model.Account.SelectedAccounts) do
+      if TAccountComp.IsAccountForSale(model.Account.SelectedAccounts[i].accountInfo) then
+      begin
+        Result := False;
+        message := 'Account ' + TAccountComp.AccountNumberToAccountTxtNumber(
+          model.Account.SelectedAccounts[i].account) + ' is already enlisted for sale';
+        Exit;
+      end;
+
   // get signer accounts from selected accounts
   Model.Signer.SignerCandidates := TCoreTool.GetSignerCandidates(Length(Model.Account.SelectedAccounts), Model.Fee.SingleOperationFee, Model.Account.SelectedAccounts);
 
@@ -123,16 +136,15 @@ begin
 
 end;
 
-{ TAccountChangeKeyDataSource }
+{ TOperationSelectedDataSource }
 
-procedure TAccountChangeKeyDataSource.FetchAll(const AContainer: TList<TAccount>);
+procedure TOperationSelectedDataSource.FetchAll(const AContainer: TList<TAccount>);
 var
   i: integer;
 begin
   for i := Low(Model.Account.SelectedAccounts) to High(Model.Account.SelectedAccounts) do
-  begin
     AContainer.Add(Model.Account.SelectedAccounts[i]);
-  end;
+
 end;
 
 end.

+ 2 - 2
src/gui/wizards/operations/UWIZSendPASC.pas

@@ -34,7 +34,7 @@ implementation
 
 uses
   UCoreUtils,
-  UWIZSendPASC_ConfirmSender,
+  UWIZOperationSelected,
   UWIZSendPASC_EnterRecipient,
   UWIZSendPASC_EnterQuantity,
   UWIZOperationConfirmation;
@@ -45,7 +45,7 @@ constructor TWIZSendPASCWizard.Create(AOwner: TComponent);
 begin
   inherited Create(AOwner,
     [
-    TWIZSendPASC_ConfirmSender,
+    TWIZOperationSelected,
     TWIZSendPASC_EnterRecipient,
     TWIZSendPASC_EnterQuantity,
     TWIZOperationConfirmation

+ 0 - 32
src/gui/wizards/operations/UWIZSendPASC_ConfirmSender.lfm

@@ -1,32 +0,0 @@
-object WIZSendPASC_ConfirmSender: TWIZSendPASC_ConfirmSender
-  Left = 0
-  Height = 261
-  Top = 0
-  Width = 429
-  Caption = 'WIZSendPASC_ConfirmSender'
-  ClientHeight = 261
-  ClientWidth = 429
-  LCLVersion = '1.8.2.0'
-  Visible = False
-  object gpSender: TGroupBox
-    Left = 4
-    Height = 256
-    Top = 0
-    Width = 420
-    Anchors = [akTop, akLeft, akRight, akBottom]
-    Caption = 'Sender Accounts'
-    ClientHeight = 236
-    ClientWidth = 416
-    TabOrder = 0
-    object paGrid: TPanel
-      Left = 8
-      Height = 192
-      Top = 24
-      Width = 400
-      Anchors = [akTop, akLeft, akRight, akBottom]
-      BevelOuter = bvNone
-      Caption = 'GRID PANEL'
-      TabOrder = 0
-    end
-  end
-end

+ 0 - 114
src/gui/wizards/operations/UWIZSendPASC_ConfirmSender.pas

@@ -1,114 +0,0 @@
-unit UWIZSendPASC_ConfirmSender;
-
-{$mode delphi}
-
-{ Copyright (c) 2018 Sphere 10 Software (http://www.sphere10.com/)
-
-  Distributed under the MIT software license, see the accompanying file LICENSE
-  or visit http://www.opensource.org/licenses/mit-license.php.
-
-  Acknowledgements:
-  Ugochukwu Mmaduekwe - main developer
-  Herman Schoenfeld - designer
-}
-
-interface
-
-uses
-  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
-  ExtCtrls, UVisualGrid, UCommon.Data, UCellRenderers,
-  UWizard, UWIZSendPASC, UWIZSendPASC_EnterRecipient, UWIZModels;
-
-type
-
-  { TWIZSendPASC_ConfirmSender }
-
-  TWIZSendPASC_ConfirmSender = class(TWizardForm<TWIZOperationsModel>)
-    gpSender: TGroupBox;
-    paGrid: TPanel;
-  private
-    FSendersGrid: TVisualGrid;
-  public
-    procedure OnPresent; override;
-    procedure OnNext; override;
-  end;
-
-
-
-implementation
-
-{$R *.lfm}
-
-uses UAccounts, UCoreUtils, UDataSources, UCommon, UCommon.UI, Generics.Collections;
-
-type
-
-  { TAccountSenderDataSource }
-
-  TAccountSenderDataSource = class(TAccountsDataSourceBase)
-  private
-    FModel: TWIZOperationsModel;
-  public
-    property Model: TWIZOperationsModel read FModel write FModel;
-    procedure FetchAll(const AContainer: TList<TAccount>); override;
-  end;
-
-{ TWIZSendPASC_ConfirmSender }
-
-procedure TWIZSendPASC_ConfirmSender.OnPresent;
-var
-  Data: TAccountSenderDataSource;
-begin
-  FSendersGrid := TVisualGrid.Create(Self);
-  FSendersGrid.CanSearch := False;
-  FSendersGrid.SortMode := smMultiColumn;
-  FSendersGrid.FetchDataInThread := False;
-  FSendersGrid.AutoPageSize := True;
-  FSendersGrid.SelectionType := stNone;
-  FSendersGrid.Options := [vgoColAutoFill, vgoColSizing, vgoSortDirectionAllowNone, vgoAutoHidePaging];
-  with FSendersGrid.AddColumn('Account') do
-  begin
-    StretchedToFill := True;
-    Binding := 'AccountNumber';
-    SortBinding := 'AccountNumber';
-    DisplayBinding := 'Display';
-    Width := 100;
-    HeaderFontStyles := [fsBold];
-    DataFontStyles := [fsBold];
-    Filters := SORTABLE_NUMERIC_FILTER;
-  end;
-  with FSendersGrid.AddColumn('Balance') do
-  begin
-    Binding := 'BalanceDecimal';
-    SortBinding := 'Balance';
-    DisplayBinding := 'Balance';
-    Width := 100;
-    HeaderAlignment := taRightJustify;
-    DataAlignment := taRightJustify;
-    Renderer := TCellRenderers.PASC;
-    Filters := SORTABLE_NUMERIC_FILTER;
-  end;
-  Data := TAccountSenderDataSource.Create(FSendersGrid);
-  Data.Model := Model;
-  FSendersGrid.DataSource := Data;
-  paGrid.AddControlDockCenter(FSendersGrid);
-end;
-
-procedure TWIZSendPASC_ConfirmSender.OnNext;
-begin
-  UpdatePath(ptInject, [TWIZSendPASC_EnterRecipient]);
-end;
-
-{ TAccountSenderDataSource }
-
-procedure TAccountSenderDataSource.FetchAll(const AContainer: TList<TAccount>);
-var
-  i: integer;
-begin
-  for i := Low(Model.Account.SelectedAccounts) to High(Model.Account.SelectedAccounts) do
-  begin
-    AContainer.Add(Model.Account.SelectedAccounts[i]);
-  end;
-end;
-
-end.

+ 45 - 59
src/pascalcoin_wallet.lpi

@@ -36,7 +36,7 @@
         <PackageName Value="LCL"/>
       </Item2>
     </RequiredPackages>
-    <Units Count="97">
+    <Units Count="95">
       <Unit0>
         <Filename Value="pascalcoin_wallet.dpr"/>
         <IsPartOfProject Value="True"/>
@@ -411,154 +411,140 @@
         <IsPartOfProject Value="True"/>
       </Unit73>
       <Unit74>
-        <Filename Value="gui\wizards\operations\UWIZEnlistAccountForSale_Confirmation.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZOperationFee_Custom.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZEnlistAccountForSale_Confirmation"/>
+        <ComponentName Value="WIZOperationFee_Custom"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit74>
       <Unit75>
-        <Filename Value="gui\wizards\operations\UWIZOperationFee_Custom.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZOperationPayload_Content.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZOperationFee_Custom"/>
+        <ComponentName Value="WIZOperationPayload_Content"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit75>
       <Unit76>
-        <Filename Value="gui\wizards\operations\UWIZOperationPayload_Content.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZOperationPayload_Encryption.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZOperationPayload_Content"/>
+        <ComponentName Value="WIZOperationPayload_Encryption"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit76>
       <Unit77>
-        <Filename Value="gui\wizards\operations\UWIZOperationPayload_Encryption.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZOperationPayload_Password.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZOperationPayload_Encryption"/>
+        <ComponentName Value="WIZOperationPayload_Password"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit77>
       <Unit78>
-        <Filename Value="gui\wizards\operations\UWIZOperationPayload_Password.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZOperationSigner_Select.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZOperationPayload_Password"/>
+        <ComponentName Value="WIZOperationSigner_Select"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit78>
       <Unit79>
-        <Filename Value="gui\wizards\operations\UWIZOperationSigner_Select.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZSendPASC.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZOperationSigner_Select"/>
-        <HasResources Value="True"/>
-        <ResourceBaseClass Value="Form"/>
       </Unit79>
       <Unit80>
-        <Filename Value="gui\wizards\operations\UWIZSendPASC.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZSendPASC_EnterQuantity.pas"/>
         <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZSendPASC_EnterQuantity"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
       </Unit80>
       <Unit81>
-        <Filename Value="gui\wizards\operations\UWIZSendPASC_ConfirmSender.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZSendPASC_EnterRecipient.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZSendPASC_ConfirmSender"/>
+        <ComponentName Value="WIZSendPASC_EnterRecipient"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit81>
       <Unit82>
-        <Filename Value="gui\wizards\operations\UWIZSendPASC_EnterQuantity.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZChangeKey.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZSendPASC_EnterQuantity"/>
-        <HasResources Value="True"/>
-        <ResourceBaseClass Value="Form"/>
       </Unit82>
       <Unit83>
-        <Filename Value="gui\wizards\operations\UWIZSendPASC_EnterRecipient.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZChangeKey_SelectOption.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZSendPASC_EnterRecipient"/>
+        <ComponentName Value="WIZChangeKey_SelectOption"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit83>
       <Unit84>
-        <Filename Value="gui\wizards\operations\UWIZChangeKey.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZChangeKey_EnterKey.pas"/>
         <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZChangeKey_EnterKey"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
       </Unit84>
       <Unit85>
-        <Filename Value="gui\wizards\operations\UWIZChangeKey_SelectOption.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZChangeKey_SelectKey.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZChangeKey_SelectOption"/>
+        <ComponentName Value="WIZChangeKey_SelectKey"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit85>
       <Unit86>
-        <Filename Value="gui\wizards\operations\UWIZChangeKey_EnterKey.pas"/>
+        <Filename Value="gui-classic\UGridUtils.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZChangeKey_EnterKey"/>
-        <HasResources Value="True"/>
-        <ResourceBaseClass Value="Form"/>
       </Unit86>
       <Unit87>
-        <Filename Value="gui\wizards\operations\UWIZChangeKey_SelectKey.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZEnlistAccountForSale_EnterSeller.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZChangeKey_SelectKey"/>
+        <ComponentName Value="WIZEnlistAccountForSale_EnterSeller"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit87>
       <Unit88>
-        <Filename Value="gui\wizards\operations\UWIZChangeKey_ConfirmAccount.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZEnlistAccountForSale_EnterSaleAmount.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZChangeKey_ConfirmAccount"/>
+        <ComponentName Value="WIZEnlistAccountForSale_EnterSaleAmount"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit88>
       <Unit89>
-        <Filename Value="gui-classic\UGridUtils.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZEnlistAccountForSale_SelectOption.pas"/>
         <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZEnlistAccountForSale_SelectOption"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
       </Unit89>
       <Unit90>
-        <Filename Value="gui\wizards\operations\UWIZEnlistAccountForSale_EnterSeller.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZEnlistAccountForSale_EnterLockingBlock.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZEnlistAccountForSale_EnterSeller"/>
+        <ComponentName Value="WIZEnlistAccountForSale_EnterLockingBlock"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit90>
       <Unit91>
-        <Filename Value="gui\wizards\operations\UWIZEnlistAccountForSale_EnterSaleAmount.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZEnlistAccountForSale_EnterPublicKey.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZEnlistAccountForSale_EnterSaleAmount"/>
+        <ComponentName Value="WIZEnlistAccountForSale_EnterPublicKey"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit91>
       <Unit92>
-        <Filename Value="gui\wizards\operations\UWIZEnlistAccountForSale_SelectOption.pas"/>
+        <Filename Value="core.utils\UCoreObjects.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZEnlistAccountForSale_SelectOption"/>
-        <HasResources Value="True"/>
-        <ResourceBaseClass Value="Form"/>
       </Unit92>
       <Unit93>
-        <Filename Value="gui\wizards\operations\UWIZEnlistAccountForSale_EnterLockingBlock.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZOperationConfirmation.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZEnlistAccountForSale_EnterLockingBlock"/>
+        <ComponentName Value="WIZOperationConfirmation"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit93>
       <Unit94>
-        <Filename Value="gui\wizards\operations\UWIZEnlistAccountForSale_EnterPublicKey.pas"/>
+        <Filename Value="gui\wizards\operations\UWIZOperationSelected.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZEnlistAccountForSale_EnterPublicKey"/>
+        <ComponentName Value="WIZOperationSelected"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit94>
-      <Unit95>
-        <Filename Value="gui\wizards\operations\UWIZEnlistAccountForSale_ConfirmAccount.pas"/>
-        <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZEnlistAccountForSale_ConfirmAccount"/>
-        <HasResources Value="True"/>
-        <ResourceBaseClass Value="Form"/>
-      </Unit95>
-      <Unit96>
-        <Filename Value="core.utils\UCoreObjects.pas"/>
-        <IsPartOfProject Value="True"/>
-      </Unit96>
     </Units>
   </ProjectOptions>
   <CompilerOptions>