Browse Source

Merge upstream

Herman Schoenfeld 6 years ago
parent
commit
42826c7c34
41 changed files with 1373 additions and 307 deletions
  1. 4 0
      src/gui-experimental/UCTRLWallet.lfm
  2. 9 1
      src/gui-experimental/UCTRLWallet.pas
  3. 9 8
      src/gui-experimental/UFRMAccountExplorer.lfm
  4. 1 2
      src/gui-experimental/UFRMAccountExplorer.pas
  5. 1 1
      src/gui-experimental/UFRMAccountSelect.lfm
  6. 1 1
      src/gui-experimental/UFRMOperation.lfm
  7. 1 2
      src/gui-experimental/UFRMOperation.pas
  8. 16 3
      src/gui-experimental/UUserInterface.pas
  9. 234 44
      src/gui-experimental/core.utils/UCoreUtils.pas
  10. 98 0
      src/gui-experimental/wizards/operations/UWIZChangeAccountInfo.pas
  11. 130 0
      src/gui-experimental/wizards/operations/UWIZChangeAccountInfo_Details.lfm
  12. 197 0
      src/gui-experimental/wizards/operations/UWIZChangeAccountInfo_Details.pas
  13. 0 1
      src/gui-experimental/wizards/operations/UWIZChangeKey_EnterKey.lfm
  14. 1 4
      src/gui-experimental/wizards/operations/UWIZChangeKey_EnterKey.pas
  15. 0 1
      src/gui-experimental/wizards/operations/UWIZChangeKey_SelectKey.lfm
  16. 1 4
      src/gui-experimental/wizards/operations/UWIZChangeKey_SelectKey.pas
  17. 0 1
      src/gui-experimental/wizards/operations/UWIZChangeKey_SelectOption.lfm
  18. 1 0
      src/gui-experimental/wizards/operations/UWIZDelistAccountFromSale_Options.lfm
  19. 1 4
      src/gui-experimental/wizards/operations/UWIZDelistAccountFromSale_Options.pas
  20. 0 1
      src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_EnterPublicKey.lfm
  21. 2 5
      src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_EnterPublicKey.pas
  22. 0 1
      src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_EnterSaleAmount.lfm
  23. 2 4
      src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_EnterSaleAmount.pas
  24. 438 72
      src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_EnterSeller.lfm
  25. 22 23
      src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_EnterSeller.pas
  26. 0 1
      src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_SelectOption.lfm
  27. 11 0
      src/gui-experimental/wizards/operations/UWIZOperation.pas
  28. 3 20
      src/gui-experimental/wizards/operations/UWIZOperationConfirmation.lfm
  29. 36 7
      src/gui-experimental/wizards/operations/UWIZOperationConfirmation.pas
  30. 0 1
      src/gui-experimental/wizards/operations/UWIZOperationFee_Custom.lfm
  31. 42 22
      src/gui-experimental/wizards/operations/UWIZOperationFee_Custom.pas
  32. 0 1
      src/gui-experimental/wizards/operations/UWIZOperationPayload_Content.lfm
  33. 19 6
      src/gui-experimental/wizards/operations/UWIZOperationPayload_Content.pas
  34. 6 4
      src/gui-experimental/wizards/operations/UWIZOperationPayload_Encryption.pas
  35. 1 1
      src/gui-experimental/wizards/operations/UWIZOperationSelected.lfm
  36. 20 9
      src/gui-experimental/wizards/operations/UWIZOperationSelected.pas
  37. 0 1
      src/gui-experimental/wizards/operations/UWIZOperationSigner_Select.lfm
  38. 1 1
      src/gui-experimental/wizards/operations/UWIZSendPASC.pas
  39. 0 1
      src/gui-experimental/wizards/operations/UWIZSendPASC_Details.lfm
  40. 53 48
      src/gui-experimental/wizards/operations/UWIZSendPASC_Details.pas
  41. 12 1
      src/pascalcoin_wallet_experimental.lpi

+ 4 - 0
src/gui-experimental/UCTRLWallet.lfm

@@ -170,6 +170,10 @@ object CTRLWallet: TCTRLWallet
       Caption = 'Change Key'
       Caption = 'Change Key'
       OnClick = miChangeKeyClick
       OnClick = miChangeKeyClick
     end
     end
+    object miChangeAccountInfo: TMenuItem
+      Caption = 'Change Account Info'
+      OnClick = miChangeAccountInfoClick
+    end
     object miAccountsMarket: TMenuItem
     object miAccountsMarket: TMenuItem
       Caption = 'Account Market'
       Caption = 'Account Market'
       object miEnlistAccountsForSale: TMenuItem
       object miEnlistAccountsForSale: TMenuItem

+ 9 - 1
src/gui-experimental/UCTRLWallet.pas

@@ -40,6 +40,7 @@ type
     Label2: TLabel;
     Label2: TLabel;
     lblTotalPASA: TLabel;
     lblTotalPASA: TLabel;
     lblTotalPASC: TLabel;
     lblTotalPASC: TLabel;
+    miChangeAccountInfo: TMenuItem;
     miCopyOphash: TMenuItem;
     miCopyOphash: TMenuItem;
     miOperationInfo: TMenuItem;
     miOperationInfo: TMenuItem;
     miSendPASC: TMenuItem;
     miSendPASC: TMenuItem;
@@ -63,6 +64,7 @@ type
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormResize(Sender: TObject);
     procedure FormResize(Sender: TObject);
+    procedure miChangeAccountInfoClick(Sender: TObject);
     procedure miAccountInfoClick(Sender: TObject);
     procedure miAccountInfoClick(Sender: TObject);
     procedure miChangeKeyClick(Sender: TObject);
     procedure miChangeKeyClick(Sender: TObject);
     procedure miCopyOphashClick(Sender: TObject);
     procedure miCopyOphashClick(Sender: TObject);
@@ -520,7 +522,7 @@ begin
   RefreshMyAccountsCombo;
   RefreshMyAccountsCombo;
 end;
 end;
 
 
-procedure TCTRLWallet.OnUserKeyActivityDetected;
+procedure TCTRLWallet.OnUserKeyActivityDetected(Sender: TObject);
 begin
 begin
   // This handler is called every time a block is downloaded. If we refreshed GUI here it would
   // This handler is called every time a block is downloaded. If we refreshed GUI here it would
   // result in severe back-end blocking and slow-down, as the GUI refreshed on every block during
   // result in severe back-end blocking and slow-down, as the GUI refreshed on every block during
@@ -619,6 +621,7 @@ begin
   miChangeKey.Caption := IIF(ASelection.RowCount = 1, 'Change Key', 'Change All Key');
   miChangeKey.Caption := IIF(ASelection.RowCount = 1, 'Change Key', 'Change All Key');
   miEnlistAccountsForSale.Caption := IIF(ASelection.RowCount = 1, 'Enlist Account For Sale', 'Enlist All Account For Sale');
   miEnlistAccountsForSale.Caption := IIF(ASelection.RowCount = 1, 'Enlist Account For Sale', 'Enlist All Account For Sale');
   miDelistAccountsFromSale.Caption := IIF(ASelection.RowCount = 1, 'Delist Account From Sale', 'Delist All Account From Sale');
   miDelistAccountsFromSale.Caption := IIF(ASelection.RowCount = 1, 'Delist Account From Sale', 'Delist All Account From Sale');
+  miChangeAccountInfo.Caption := IIF(ASelection.RowCount = 1, 'Change Account Information', 'Change Accounts Information');
   if ASelection.RowCount = 1 then begin
   if ASelection.RowCount = 1 then begin
     if not TAccountComp.AccountTxtNumberToAccountNumber(FAccountsGrid.Rows[ASelection.Row].Account, accNo) then
     if not TAccountComp.AccountTxtNumberToAccountNumber(FAccountsGrid.Rows[ASelection.Row].Account, accNo) then
       raise Exception.Create('Error Parsing Account Number From Grid');
       raise Exception.Create('Error Parsing Account Number From Grid');
@@ -655,6 +658,11 @@ begin
   TUserInterface.ShowDelistAccountsDialog(SelectedAccounts);
   TUserInterface.ShowDelistAccountsDialog(SelectedAccounts);
 end;
 end;
 
 
+procedure TCTRLWallet.miChangeAccountInfoClick(Sender: TObject);
+begin
+  TUserInterface.ShowChangeAccountInfoDialog(SelectedAccounts);
+end;
+
 procedure TCTRLWallet.OnPrepareOperationsPopupMenu(Sender: TObject; constref ASelection: TVisualGridSelection; out APopupMenu: TPopupMenu);
 procedure TCTRLWallet.OnPrepareOperationsPopupMenu(Sender: TObject; constref ASelection: TVisualGridSelection; out APopupMenu: TPopupMenu);
 begin
 begin
   if (ASelection.RowCount <> 1) or ((ASelection.RowCount = 1) and (FOperationsGrid.SelectedRows[0].__KEY <> variant(nil))) then begin
   if (ASelection.RowCount <> 1) or ((ASelection.RowCount = 1) and (FOperationsGrid.SelectedRows[0].__KEY <> variant(nil))) then begin

+ 9 - 8
src/gui-experimental/UFRMAccountExplorer.lfm

@@ -11,10 +11,11 @@ object FRMAccountExplorer: TFRMAccountExplorer
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnDestroy = FormDestroy
   OnDestroy = FormDestroy
   Position = poOwnerFormCenter
   Position = poOwnerFormCenter
+  LCLVersion = '1.8.2.0'
   Visible = False
   Visible = False
   object Splitter1: TSplitter
   object Splitter1: TSplitter
     Left = 380
     Left = 380
-    Height = 385
+    Height = 365
     Top = 66
     Top = 66
     Width = 5
     Width = 5
   end
   end
@@ -140,17 +141,17 @@ object FRMAccountExplorer: TFRMAccountExplorer
   end
   end
   object pnlAccounts: TPanel
   object pnlAccounts: TPanel
     Left = 0
     Left = 0
-    Height = 385
+    Height = 365
     Top = 66
     Top = 66
     Width = 380
     Width = 380
     Align = alLeft
     Align = alLeft
     BevelOuter = bvNone
     BevelOuter = bvNone
-    ClientHeight = 385
+    ClientHeight = 365
     ClientWidth = 380
     ClientWidth = 380
     TabOrder = 1
     TabOrder = 1
     object dgAccounts: TDrawGrid
     object dgAccounts: TDrawGrid
       Left = 0
       Left = 0
-      Height = 351
+      Height = 331
       Top = 0
       Top = 0
       Width = 380
       Width = 380
       Align = alClient
       Align = alClient
@@ -164,7 +165,7 @@ object FRMAccountExplorer: TFRMAccountExplorer
     object pnlAccountsInfo: TPanel
     object pnlAccountsInfo: TPanel
       Left = 0
       Left = 0
       Height = 34
       Height = 34
-      Top = 351
+      Top = 331
       Width = 380
       Width = 380
       Align = alBottom
       Align = alBottom
       BevelOuter = bvNone
       BevelOuter = bvNone
@@ -245,7 +246,7 @@ object FRMAccountExplorer: TFRMAccountExplorer
   end
   end
   object pcAccountsOptions: TPageControl
   object pcAccountsOptions: TPageControl
     Left = 385
     Left = 385
-    Height = 385
+    Height = 365
     Top = 66
     Top = 66
     Width = 483
     Width = 483
     ActivePage = tsAccountOperations
     ActivePage = tsAccountOperations
@@ -254,11 +255,11 @@ object FRMAccountExplorer: TFRMAccountExplorer
     TabOrder = 2
     TabOrder = 2
     object tsAccountOperations: TTabSheet
     object tsAccountOperations: TTabSheet
       Caption = 'Operations of selected Account'
       Caption = 'Operations of selected Account'
-      ClientHeight = 357
+      ClientHeight = 337
       ClientWidth = 475
       ClientWidth = 475
       object dgAccountOperations: TDrawGrid
       object dgAccountOperations: TDrawGrid
         Left = 0
         Left = 0
-        Height = 357
+        Height = 337
         Top = 0
         Top = 0
         Width = 475
         Width = 475
         Align = alClient
         Align = alClient

+ 1 - 2
src/gui-experimental/UFRMAccountExplorer.pas

@@ -212,8 +212,7 @@ implementation
 {$R *.lfm}
 {$R *.lfm}
 
 
 uses UFRMAccountSelect, UConst, USettings, UFRMOperation,
 uses UFRMAccountSelect, UConst, USettings, UFRMOperation,
-     UWallet, UCrypto, UFRMMemoText, UUserInterface, UCommon,
-     UPCOrderedLists;
+     UWallet, UCrypto, UFRMMemoText, UUserInterface, UCommon, UPCOrderedLists;
 
 
 { TFRMAccountExplorer }
 { TFRMAccountExplorer }
 
 

+ 1 - 1
src/gui-experimental/UFRMAccountSelect.lfm

@@ -15,7 +15,7 @@ object FRMAccountSelect: TFRMAccountSelect
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnDestroy = FormDestroy
   OnDestroy = FormDestroy
   Position = poOwnerFormCenter
   Position = poOwnerFormCenter
-  LCLVersion = '1.8.4.0'
+  LCLVersion = '1.8.2.0'
   Visible = False
   Visible = False
   object pnlAccountsTop: TPanel
   object pnlAccountsTop: TPanel
     Left = 395
     Left = 395

+ 1 - 1
src/gui-experimental/UFRMOperation.lfm

@@ -16,7 +16,7 @@ object FRMOperation: TFRMOperation
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnDestroy = FormDestroy
   OnDestroy = FormDestroy
   Position = poOwnerFormCenter
   Position = poOwnerFormCenter
-  LCLVersion = '1.8.4.0'
+  LCLVersion = '1.8.2.0'
   Visible = False
   Visible = False
   object lblAccountCaption: TLabel
   object lblAccountCaption: TLabel
     Left = 25
     Left = 25

+ 1 - 2
src/gui-experimental/UFRMOperation.pas

@@ -27,8 +27,7 @@ uses
   Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, UCommon.UI,
   Dialogs, StdCtrls, UCommon.UI,
   UNode, UWallet, UCrypto, Buttons, UBlockChain, UBaseTypes,
   UNode, UWallet, UCrypto, Buttons, UBlockChain, UBaseTypes,
-  UAccounts, UFRMAccountSelect, ActnList, ComCtrls, Types, UCommon,
-  UPCOrderedLists;
+  UAccounts, UFRMAccountSelect, ActnList, ComCtrls, Types, UCommon, UPCOrderedLists;
 
 
 Const
 Const
   CM_PC_WalletKeysChanged = WM_USER + 1;
   CM_PC_WalletKeysChanged = WM_USER + 1;

+ 16 - 3
src/gui-experimental/UUserInterface.pas

@@ -29,8 +29,7 @@ uses
   UBlockChain, UAccounts, UNode, UWallet, UConst, UFolderHelper, UGridUtils, URPC, UPoolMining,
   UBlockChain, UAccounts, UNode, UWallet, UConst, UFolderHelper, UGridUtils, URPC, UPoolMining,
   ULog, UThread, UNetProtocol, UCrypto, UBaseTypes,
   ULog, UThread, UNetProtocol, UCrypto, UBaseTypes,
   UFRMMainForm, UCTRLSyncronization, UFRMAccountExplorer, UFRMOperationExplorer, UFRMPendingOperations, UFRMOperation,
   UFRMMainForm, UCTRLSyncronization, UFRMAccountExplorer, UFRMOperationExplorer, UFRMPendingOperations, UFRMOperation,
-  UFRMLogs, UFRMMessages, UFRMNodes, UFRMBlockExplorer, UFRMWalletKeys,
-  UPCOrderedLists {$IFDEF TESTNET},UFRMRandomOperations, UAccountKeyStorage{$ENDIF};
+  UFRMLogs, UFRMMessages, UFRMNodes, UFRMBlockExplorer, UFRMWalletKeys, UPCOrderedLists {$IFDEF TESTNET},UFRMRandomOperations, UAccountKeyStorage{$ENDIF};
 
 
 type
 type
   { Forward Declarations }
   { Forward Declarations }
@@ -163,6 +162,7 @@ type
       class procedure ShowChangeKeyDialog(const AAccounts : array of Cardinal);
       class procedure ShowChangeKeyDialog(const AAccounts : array of Cardinal);
       class procedure ShowSellAccountsDialog(const AAccounts : array of Cardinal);
       class procedure ShowSellAccountsDialog(const AAccounts : array of Cardinal);
       class procedure ShowDelistAccountsDialog(const AAccounts : array of Cardinal);
       class procedure ShowDelistAccountsDialog(const AAccounts : array of Cardinal);
+      class procedure ShowChangeAccountInfoDialog(const AAccounts : array of Cardinal);
       class procedure ShowAboutBox(parentForm : TForm);
       class procedure ShowAboutBox(parentForm : TForm);
       class procedure ShowOptionsDialog(parentForm: TForm);
       class procedure ShowOptionsDialog(parentForm: TForm);
       class procedure ShowAccountInfoDialog(parentForm: TForm; const account : Cardinal); overload;
       class procedure ShowAccountInfoDialog(parentForm: TForm; const account : Cardinal); overload;
@@ -218,7 +218,7 @@ implementation
 uses
 uses
   UFRMAbout, UFRMNodesIp, UFRMPascalCoinWalletConfig, UFRMPayloadDecoder, UFRMMemoText,
   UFRMAbout, UFRMNodesIp, UFRMPascalCoinWalletConfig, UFRMPayloadDecoder, UFRMMemoText,
   UOpenSSL, UFileStorage, UTime, USettings, UCoreUtils, UMemory,
   UOpenSSL, UFileStorage, UTime, USettings, UCoreUtils, UMemory,
-  UWIZOperation, UWIZSendPASC, UWIZChangeKey, UWIZEnlistAccountForSale, UWIZDelistAccountFromSale, UCoreObjects;
+  UWIZOperation, UWIZSendPASC, UWIZChangeKey, UWIZEnlistAccountForSale, UWIZDelistAccountFromSale, UWIZChangeAccountInfo, UCoreObjects;
 
 
 {%region UI Lifecyle}
 {%region UI Lifecyle}
 
 
@@ -640,6 +640,19 @@ begin
   wiz.Start(model);
   wiz.Start(model);
 end;
 end;
 
 
+class procedure TUserInterface.ShowChangeAccountInfoDialog(
+  const AAccounts: array of Cardinal);
+var
+  Scoped: TDisposables;
+  wiz: TWIZChangeAccountInfoWizard;
+  model: TWIZOperationsModel;
+begin
+  wiz := Scoped.AddObject(TWIZChangeAccountInfoWizard.Create(nil)) as TWIZChangeAccountInfoWizard;
+  model := TWIZOperationsModel.Create(wiz, omtChangeInfo);
+  model.Account.SelectedAccounts := TNode.Node.GetAccounts(AAccounts, True);
+  wiz.Start(model);
+end;
+
 class procedure TUserInterface.ShowAboutBox(parentForm : TForm);
 class procedure TUserInterface.ShowAboutBox(parentForm : TForm);
 begin
 begin
   with TFRMAbout.Create(parentForm) do
   with TFRMAbout.Create(parentForm) do

+ 234 - 44
src/gui-experimental/core.utils/UCoreUtils.pas

@@ -71,6 +71,7 @@ type
     class function GetUserAccounts(IncludePending: boolean = False): TArray<TAccount>; overload;
     class function GetUserAccounts(IncludePending: boolean = False): TArray<TAccount>; overload;
     class function GetUserAccounts(out Balance: TBalanceSummary; IncludePending: boolean = False): TArray<TAccount>; overload;
     class function GetUserAccounts(out Balance: TBalanceSummary; IncludePending: boolean = False): TArray<TAccount>; overload;
     class function GetUserAccountNumbers: TArray<cardinal>;
     class function GetUserAccountNumbers: TArray<cardinal>;
+    class function AreAccountBalancesGreaterThan(const ACandidates: array of TAccount; AAmount: int64; var AFaultyAccount: TAccount): boolean; static;
   end;
   end;
 
 
   { TNodeHelper }
   { TNodeHelper }
@@ -117,10 +118,11 @@ type
     class function SendPASCFinalizeAndDisplayMessage(const AOperationsTxt, AOperationToString: string; ANoOfOperations: integer; ATotalAmount, ATotalFee: int64; AOperationsHashTree: TOperationsHashTree; var AErrorMessage: string): boolean; static;
     class function SendPASCFinalizeAndDisplayMessage(const AOperationsTxt, AOperationToString: string; ANoOfOperations: integer; ATotalAmount, ATotalFee: int64; AOperationsHashTree: TOperationsHashTree; var AErrorMessage: string): boolean; static;
     class function OthersFinalizeAndDisplayMessage(const AOperationsTxt, AOperationToString: string; ANoOfOperations: integer; ATotalFee: int64; AOperationsHashTree: TOperationsHashTree; var AErrorMessage: string): boolean; static;
     class function OthersFinalizeAndDisplayMessage(const AOperationsTxt, AOperationToString: string; ANoOfOperations: integer; ATotalFee: int64; AOperationsHashTree: TOperationsHashTree; var AErrorMessage: string): boolean; static;
   public
   public
-    class function ExecuteSendPASC(const ASelectedAccounts: TArray<TAccount>; const ADestinationAccount, ASignerAccount: TAccount; AAmount, AFee: int64; const ASendPASCMode: TSendPASCMode; const APayloadEncryptionMode: TPayloadEncryptionMode; const APayloadContent, APayloadEncryptionPassword: string; var AErrorMessage: string): boolean; static;
+    class function ExecuteSendPASC(const ASelectedAccounts: TArray<TAccount>; const ADestinationAccount: TAccount; AAmount, AFee: int64; const ASendPASCMode: TSendPASCMode; const APayloadEncryptionMode: TPayloadEncryptionMode; const APayloadContent, APayloadEncryptionPassword: string; var AErrorMessage: string): boolean; static;
     class function ExecuteChangeKey(const ASelectedAccounts: TArray<TAccount>; const ASignerAccount: TAccount; APublicKey: TAccountKey; AFee: int64; const APayloadEncryptionMode: TPayloadEncryptionMode; const APayloadContent, APayloadEncryptionPassword: string; var AErrorMessage: string): boolean; static;
     class function ExecuteChangeKey(const ASelectedAccounts: TArray<TAccount>; const ASignerAccount: TAccount; APublicKey: TAccountKey; AFee: int64; const APayloadEncryptionMode: TPayloadEncryptionMode; const APayloadContent, APayloadEncryptionPassword: string; var AErrorMessage: string): boolean; static;
     class function ExecuteEnlistAccountForSale(const ASelectedAccounts: TArray<TAccount>; const ASignerAccount, ASellerAccount: TAccount; const APublicKey: TAccountKey; AFee, ASalePrice: int64; ALockedUntilBlock: UInt32; const AAccountSaleMode: TAccountSaleMode; const APayloadEncryptionMode: TPayloadEncryptionMode; const APayloadContent, APayloadEncryptionPassword: string; var AErrorMessage: string): boolean; static;
     class function ExecuteEnlistAccountForSale(const ASelectedAccounts: TArray<TAccount>; const ASignerAccount, ASellerAccount: TAccount; const APublicKey: TAccountKey; AFee, ASalePrice: int64; ALockedUntilBlock: UInt32; const AAccountSaleMode: TAccountSaleMode; const APayloadEncryptionMode: TPayloadEncryptionMode; const APayloadContent, APayloadEncryptionPassword: string; var AErrorMessage: string): boolean; static;
     class function ExecuteDelistAccountFromSale(const ASelectedAccounts: TArray<TAccount>; const ASignerAccount: TAccount; AFee: int64; const APayloadEncryptionMode: TPayloadEncryptionMode; const APayloadContent, APayloadEncryptionPassword: string; var AErrorMessage: string): boolean; static;
     class function ExecuteDelistAccountFromSale(const ASelectedAccounts: TArray<TAccount>; const ASignerAccount: TAccount; AFee: int64; const APayloadEncryptionMode: TPayloadEncryptionMode; const APayloadContent, APayloadEncryptionPassword: string; var AErrorMessage: string): boolean; static;
+    class function ExecuteChangeAccountInfo(const ASelectedAccounts, ASignerAccounts: TArray<TAccount>; AFee: int64; const APayloadEncryptionMode: TPayloadEncryptionMode; const APayloadContent, APayloadEncryptionPassword: string; const ANewName: string; const ANewType: word; var AErrorMessage: string): boolean; static;
   end;
   end;
 
 
 
 
@@ -275,6 +277,23 @@ begin
   Result := LAccs.ToArray;
   Result := LAccs.ToArray;
 end;
 end;
 
 
+class function TCoreTool.AreAccountBalancesGreaterThan(const ACandidates: array of TAccount; AAmount: int64; var AFaultyAccount: TAccount): boolean;
+var
+  LIdx: integer;
+  LAcc: TAccount;
+begin
+  Result := True;
+  for LIdx := Low(ACandidates) to High(ACandidates) do
+  begin
+    LAcc := ACandidates[LIdx];
+    if not (LAcc.Balance > AAmount) then
+    begin
+      AFaultyAccount := LAcc;
+      Exit(False);
+    end;
+  end;
+end;
+
 
 
 { TNodeHelper }
 { TNodeHelper }
 
 
@@ -871,7 +890,7 @@ begin
     Result := False;
     Result := False;
 end;
 end;
 
 
-class function TWIZOperationsHelper.ExecuteSendPASC(const ASelectedAccounts: TArray<TAccount>; const ADestinationAccount, ASignerAccount: TAccount; AAmount, AFee: int64; const ASendPASCMode: TSendPASCMode; const APayloadEncryptionMode: TPayloadEncryptionMode; const APayloadContent, APayloadEncryptionPassword: string; var AErrorMessage: string): boolean;
+class function TWIZOperationsHelper.ExecuteSendPASC(const ASelectedAccounts: TArray<TAccount>; const ADestinationAccount: TAccount; AAmount, AFee: int64; const ASendPASCMode: TSendPASCMode; const APayloadEncryptionMode: TPayloadEncryptionMode; const APayloadContent, APayloadEncryptionPassword: string; var AErrorMessage: string): boolean;
 var
 var
   LWalletKey: TWalletKey;
   LWalletKey: TWalletKey;
   LWalletKeys: TWalletKeys;
   LWalletKeys: TWalletKeys;
@@ -904,8 +923,8 @@ begin
       LPCOperation := nil; // reset LPCOperation to Nil
       LPCOperation := nil; // reset LPCOperation to Nil
       LCurrentAccount := ASelectedAccounts[LAccountIdx];
       LCurrentAccount := ASelectedAccounts[LAccountIdx];
 
 
-    if not TWIZOperationsHelper.IsOwnerOfWallet(LCurrentAccount, LWalletKeys, LWalletKey, AErrorMessage) then
-       Exit(False);
+      if not TWIZOperationsHelper.IsOwnerOfWallet(LCurrentAccount, LWalletKeys, LWalletKey, AErrorMessage) then
+        Exit(False);
 
 
       if LCurrentAccount.account = ADestinationAccount.account then
       if LCurrentAccount.account = ADestinationAccount.account then
       begin
       begin
@@ -921,28 +940,30 @@ begin
 
 
       LDoOperation := True;
       LDoOperation := True;
 
 
-      if LCurrentAccount.balance > 0 then
-        case ASendPASCMode of
-          akaAllBalance:
+      case ASendPASCMode of
+        akaAllBalance:
+          if LCurrentAccount.balance > 0 then
           begin
           begin
-            LAmount := LCurrentAccount.balance - AFee;
-            LFee := AFee;
-          end;
-
-          akaSpecifiedAmount:
-            if LCurrentAccount.balance >= UInt64(AAmount + AFee) then
+            if LCurrentAccount.balance > AFee then
             begin
             begin
-              LAmount := AAmount;
+              LAmount := LCurrentAccount.balance - AFee;
               LFee := AFee;
               LFee := AFee;
             end
             end
             else
             else
             begin
             begin
-              AErrorMessage := Format('Insufficient Funds In "%s". %s < (%s + %s = %s)', [LCurrentAccount.AccountString, TAccountComp.FormatMoney(LCurrentAccount.balance), TAccountComp.FormatMoney(AAmount), TAccountComp.FormatMoney(AFee), TAccountComp.FormatMoney(AAmount + AFee)]);
-              Exit(False);
+              LAmount := LCurrentAccount.balance;
+              LFee := 0;
             end;
             end;
-        end
-      else
-        LDoOperation := False;
+          end
+          else
+            LDoOperation := False;
+
+        akaSpecifiedAmount:
+          if LCurrentAccount.balance > UInt64(AFee) then
+            LFee := AFee
+          else
+            LFee := LCurrentAccount.balance;
+      end;
 
 
       if LDoOperation then
       if LDoOperation then
       begin
       begin
@@ -1003,6 +1024,7 @@ begin
 
 
   LWalletKeys := TWallet.Keys;
   LWalletKeys := TWallet.Keys;
   LNode := TNode.Node;
   LNode := TNode.Node;
+  LSignerAccount := ASignerAccount;
 
 
   if not TWIZOperationsHelper.ValidateOperationsInput(ASelectedAccounts, LWalletKeys, LNode, AErrorMessage) then
   if not TWIZOperationsHelper.ValidateOperationsInput(ASelectedAccounts, LWalletKeys, LNode, AErrorMessage) then
     Exit(False);
     Exit(False);
@@ -1017,11 +1039,11 @@ begin
     for LAccountIdx := Low(ASelectedAccounts) to High(ASelectedAccounts) do
     for LAccountIdx := Low(ASelectedAccounts) to High(ASelectedAccounts) do
     begin
     begin
       loop_start:
       loop_start:
-      LPCOperation := nil; // reset LPCOperation to Nil
+        LPCOperation := nil; // reset LPCOperation to Nil
       LCurrentAccount := ASelectedAccounts[LAccountIdx];
       LCurrentAccount := ASelectedAccounts[LAccountIdx];
 
 
-    if not TWIZOperationsHelper.IsOwnerOfWallet(LCurrentAccount, LWalletKeys, LWalletKey, AErrorMessage) then
-       Exit(False);
+      if not TWIZOperationsHelper.IsOwnerOfWallet(LCurrentAccount, LWalletKeys, LWalletKey, AErrorMessage) then
+        Exit(False);
 
 
       if (TAccountComp.EqualAccountKeys(LCurrentAccount.accountInfo.accountKey,
       if (TAccountComp.EqualAccountKeys(LCurrentAccount.accountInfo.accountKey,
         APublicKey)) then
         APublicKey)) then
@@ -1070,7 +1092,7 @@ begin
         // Maintain correct signer fee distribution
         // Maintain correct signer fee distribution
         if UInt64(LTotalSignerFee) >= LSignerAccount.balance then
         if UInt64(LTotalSignerFee) >= LSignerAccount.balance then
           LFee := 0
           LFee := 0
-        else if LSignerAccount.balance - uint64(LTotalSignerFee) >
+        else if LSignerAccount.balance - UInt64(LTotalSignerFee) >
           UInt64(AFee) then
           UInt64(AFee) then
           LFee := AFee
           LFee := AFee
         else
         else
@@ -1134,6 +1156,7 @@ begin
 
 
   LWalletKeys := TWallet.Keys;
   LWalletKeys := TWallet.Keys;
   LNode := TNode.Node;
   LNode := TNode.Node;
+  LSignerAccount := ASignerAccount;
 
 
   if not TWIZOperationsHelper.ValidateOperationsInput(ASelectedAccounts, LWalletKeys, LNode, AErrorMessage) then
   if not TWIZOperationsHelper.ValidateOperationsInput(ASelectedAccounts, LWalletKeys, LNode, AErrorMessage) then
     Exit(False);
     Exit(False);
@@ -1151,7 +1174,7 @@ begin
       LCurrentAccount := ASelectedAccounts[LAccountIdx];
       LCurrentAccount := ASelectedAccounts[LAccountIdx];
 
 
       if not TWIZOperationsHelper.IsOwnerOfWallet(LCurrentAccount, LWalletKeys, LWalletKey, AErrorMessage) then
       if not TWIZOperationsHelper.IsOwnerOfWallet(LCurrentAccount, LWalletKeys, LWalletKey, AErrorMessage) then
-         Exit(False);
+        Exit(False);
 
 
       if TAccountComp.IsAccountForSale(LCurrentAccount.accountInfo) then
       if TAccountComp.IsAccountForSale(LCurrentAccount.accountInfo) then
       begin
       begin
@@ -1184,33 +1207,33 @@ begin
 
 
       if (LNode.Bank.SafeBox.CurrentProtocol = CT_PROTOCOL_1) then
       if (LNode.Bank.SafeBox.CurrentProtocol = CT_PROTOCOL_1) then
       begin
       begin
-          AErrorMessage := 'This Operation Needs PROTOCOL 2 Active';
-          Exit(False);
+        AErrorMessage := 'This Operation Needs PROTOCOL 2 Active';
+        Exit(False);
       end;
       end;
 
 
-      if not UpdatePayload(LCurrentAccount.accountInfo.accountKey, ASignerAccount.accountInfo.accountKey, APayloadEncryptionMode, APayloadContent, LPayloadEncodedBytes, APayloadEncryptionPassword, AErrorMessage) then
+      if not UpdatePayload(LCurrentAccount.accountInfo.accountKey, LSignerAccount.accountInfo.accountKey, APayloadEncryptionMode, APayloadContent, LPayloadEncodedBytes, APayloadEncryptionPassword, AErrorMessage) then
       begin
       begin
         AErrorMessage := Format('Error Encoding Payload Of Selected Account "%s. ", Specific Error Is "%s"', [LCurrentAccount.AccountString, AErrorMessage]);
         AErrorMessage := Format('Error Encoding Payload Of Selected Account "%s. ", Specific Error Is "%s"', [LCurrentAccount.AccountString, AErrorMessage]);
         Exit(False);
         Exit(False);
       end;
       end;
 
 
-      if ASignerAccount.balance > AFee then
+      if LSignerAccount.balance > UInt64(AFee) then
         LFee := AFee
         LFee := AFee
       else
       else
-        LFee := ASignerAccount.balance;
+        LFee := LSignerAccount.balance;
 
 
       case AAccountSaleMode of
       case AAccountSaleMode of
         akaPublicSale:
         akaPublicSale:
 
 
           LPCOperation := TOpListAccountForSale.CreateListAccountForSale(
           LPCOperation := TOpListAccountForSale.CreateListAccountForSale(
-            TNode.Node.Bank.Safebox.CurrentProtocol, ASignerAccount.account, ASignerAccount.n_operation + 1 + LAccountIdx,
+            TNode.Node.Bank.Safebox.CurrentProtocol, LSignerAccount.account, LSignerAccount.n_operation + 1 + LAccountIdx,
             LCurrentAccount.account, ASalePrice, LFee, ASellerAccount.account,
             LCurrentAccount.account, ASalePrice, LFee, ASellerAccount.account,
             APublicKey, 0, LWalletKey.PrivateKey, LPayloadEncodedBytes);
             APublicKey, 0, LWalletKey.PrivateKey, LPayloadEncodedBytes);
 
 
         akaPrivateSale:
         akaPrivateSale:
 
 
           LPCOperation := TOpListAccountForSale.CreateListAccountForSale(
           LPCOperation := TOpListAccountForSale.CreateListAccountForSale(
-            TNode.Node.Bank.Safebox.CurrentProtocol, ASignerAccount.account, ASignerAccount.n_operation + 1 + LAccountIdx,
+            TNode.Node.Bank.Safebox.CurrentProtocol, LSignerAccount.account, LSignerAccount.n_operation + 1 + LAccountIdx,
             LCurrentAccount.account, ASalePrice, LFee, ASellerAccount.account,
             LCurrentAccount.account, ASalePrice, LFee, ASellerAccount.account,
             APublicKey, ALockedUntilBlock, LWalletKey.PrivateKey, LPayloadEncodedBytes)
             APublicKey, ALockedUntilBlock, LWalletKey.PrivateKey, LPayloadEncodedBytes)
         else
         else
@@ -1268,6 +1291,7 @@ begin
 
 
   LWalletKeys := TWallet.Keys;
   LWalletKeys := TWallet.Keys;
   LNode := TNode.Node;
   LNode := TNode.Node;
+  LSignerAccount := ASignerAccount;
 
 
   if not TWIZOperationsHelper.ValidateOperationsInput(ASelectedAccounts, LWalletKeys, LNode, AErrorMessage) then
   if not TWIZOperationsHelper.ValidateOperationsInput(ASelectedAccounts, LWalletKeys, LNode, AErrorMessage) then
     Exit(False);
     Exit(False);
@@ -1285,7 +1309,7 @@ begin
       LCurrentAccount := ASelectedAccounts[LAccountIdx];
       LCurrentAccount := ASelectedAccounts[LAccountIdx];
 
 
       if not TWIZOperationsHelper.IsOwnerOfWallet(LCurrentAccount, LWalletKeys, LWalletKey, AErrorMessage) then
       if not TWIZOperationsHelper.IsOwnerOfWallet(LCurrentAccount, LWalletKeys, LWalletKey, AErrorMessage) then
-         Exit(False);
+        Exit(False);
 
 
       if not TAccountComp.IsAccountForSale(LCurrentAccount.accountInfo) then
       if not TAccountComp.IsAccountForSale(LCurrentAccount.accountInfo) then
       begin
       begin
@@ -1295,41 +1319,41 @@ begin
 
 
       if (TAccountComp.IsAccountLocked(LCurrentAccount.accountInfo, LNode.Bank.BlocksCount)) then
       if (TAccountComp.IsAccountLocked(LCurrentAccount.accountInfo, LNode.Bank.BlocksCount)) then
       begin
       begin
-          AErrorMessage := Format('Target Account "%s"  Is Locked Until Block %u', [LCurrentAccount.AccountString, LCurrentAccount.accountInfo.locked_until_block]);
-          Exit(False);
+        AErrorMessage := Format('Target Account "%s"  Is Locked Until Block %u', [LCurrentAccount.AccountString, LCurrentAccount.accountInfo.locked_until_block]);
+        Exit(False);
       end;
       end;
 
 
       if (TAccountComp.IsAccountLocked(LSignerAccount.accountInfo, LNode.Bank.BlocksCount)) then
       if (TAccountComp.IsAccountLocked(LSignerAccount.accountInfo, LNode.Bank.BlocksCount)) then
       begin
       begin
-          AErrorMessage := Format('Signer Account "%s"  Is Locked Until Block %u', [LSignerAccount.AccountString, LSignerAccount.accountInfo.locked_until_block]);
-          Exit(False);
+        AErrorMessage := Format('Signer Account "%s"  Is Locked Until Block %u', [LSignerAccount.AccountString, LSignerAccount.accountInfo.locked_until_block]);
+        Exit(False);
       end;
       end;
 
 
       if (not TAccountComp.EqualAccountKeys(LSignerAccount.accountInfo.accountKey, LCurrentAccount.accountInfo.accountKey)) then
       if (not TAccountComp.EqualAccountKeys(LSignerAccount.accountInfo.accountKey, LCurrentAccount.accountInfo.accountKey)) then
       begin
       begin
-          AErrorMessage := Format('Signer Account %s Is Not The Owner Of Delisted Account %s', [LSignerAccount.AccountString, LCurrentAccount.AccountString]);
-          Exit(False);
+        AErrorMessage := Format('Signer Account %s Is Not The Owner Of Delisted Account %s', [LSignerAccount.AccountString, LCurrentAccount.AccountString]);
+        Exit(False);
       end;
       end;
 
 
       if (LNode.Bank.SafeBox.CurrentProtocol = CT_PROTOCOL_1) then
       if (LNode.Bank.SafeBox.CurrentProtocol = CT_PROTOCOL_1) then
       begin
       begin
-          AErrorMessage := 'This Operation Needs PROTOCOL 2 Active';
-          Exit(False);
+        AErrorMessage := 'This Operation Needs PROTOCOL 2 Active';
+        Exit(False);
       end;
       end;
 
 
-      if not UpdatePayload(LCurrentAccount.accountInfo.accountKey, ASignerAccount.accountInfo.accountKey, APayloadEncryptionMode, APayloadContent, LPayloadEncodedBytes, APayloadEncryptionPassword, AErrorMessage) then
+      if not UpdatePayload(LCurrentAccount.accountInfo.accountKey, LSignerAccount.accountInfo.accountKey, APayloadEncryptionMode, APayloadContent, LPayloadEncodedBytes, APayloadEncryptionPassword, AErrorMessage) then
       begin
       begin
         AErrorMessage := Format('Error Encoding Payload Of Selected Account "%s. ", Specific Error Is "%s"', [LCurrentAccount.AccountString, AErrorMessage]);
         AErrorMessage := Format('Error Encoding Payload Of Selected Account "%s. ", Specific Error Is "%s"', [LCurrentAccount.AccountString, AErrorMessage]);
         Exit(False);
         Exit(False);
       end;
       end;
 
 
-      if ASignerAccount.balance > AFee then
+      if LSignerAccount.balance > UInt64(AFee) then
         LFee := AFee
         LFee := AFee
       else
       else
-        LFee := ASignerAccount.balance;
+        LFee := LSignerAccount.balance;
 
 
       LPCOperation := TOpDelistAccountForSale.CreateDelistAccountForSale(TNode.Node.Bank.Safebox.CurrentProtocol,
       LPCOperation := TOpDelistAccountForSale.CreateDelistAccountForSale(TNode.Node.Bank.Safebox.CurrentProtocol,
-        ASignerAccount.account, ASignerAccount.n_operation + 1 + LAccountIdx, LCurrentAccount.account, LFee, LWalletKey.PrivateKey,
+        LSignerAccount.account, LSignerAccount.n_operation + 1 + LAccountIdx, LCurrentAccount.account, LFee, LWalletKey.PrivateKey,
         LPayloadEncodedBytes);
         LPayloadEncodedBytes);
 
 
       try
       try
@@ -1367,4 +1391,170 @@ begin
   end;
   end;
 end;
 end;
 
 
+class function TWIZOperationsHelper.ExecuteChangeAccountInfo(const ASelectedAccounts, ASignerAccounts: TArray<TAccount>; AFee: int64; const APayloadEncryptionMode: TPayloadEncryptionMode; const APayloadContent, APayloadEncryptionPassword: string; const ANewName: string; const ANewType: word; var AErrorMessage: string): boolean;
+var
+  LWalletKey: TWalletKey;
+  LWalletKeys: TWalletKeys;
+  LNode: TNode;
+  LPCOperation: TPCOperation;
+  LOperationsHashTree: TOperationsHashTree;
+  LTotalSignerFee, LFee: int64;
+  LOperationsTxt, LOperationToString, LTemp, LNewName: string;
+  LAccountIdx, LNoOfOperations, LAccNumberIndex: integer;
+  LCurrentAccount, LSignerAccount: TAccount;
+  LPayloadEncodedBytes: TRawBytes;
+  LChangeType, LChangeName: boolean;
+begin
+
+  LWalletKeys := TWallet.Keys;
+  LNode := TNode.Node;
+  LChangeName := False;
+  LChangeType := False;
+
+  if not TWIZOperationsHelper.ValidateOperationsInput(ASelectedAccounts, LWalletKeys, LNode, AErrorMessage) then
+    Exit(False);
+
+  LOperationsHashTree := TOperationsHashTree.Create;
+  try
+    LTotalSignerFee := 0;
+    LNoOfOperations := 0;
+    LOperationsTxt := '';
+    LOperationToString := '';
+
+    for LAccountIdx := Low(ASelectedAccounts) to High(ASelectedAccounts) do
+    begin
+      LPCOperation := nil; // reset LPCOperation to Nil
+      LCurrentAccount := ASelectedAccounts[LAccountIdx];
+
+      if Length(ASelectedAccounts) = 1 then
+      begin
+        LSignerAccount := ASignerAccounts[0];
+
+        LNewName := LowerCase(Trim(ANewName));
+
+        if LNewName <> LCurrentAccount.Name then
+        begin
+          LChangeName := True;
+          if LNewName <> '' then
+          begin
+            if (not TPCSafeBox.ValidAccountName(LNewName, AErrorMessage)) then
+            begin
+              AErrorMessage := Format('New name "%s" is not a valid name: %s ', [LNewName, AErrorMessage]);
+              Exit(False);
+            end;
+            LAccNumberIndex := (TNode.Node.Bank.SafeBox.FindAccountByName(LNewName));
+            if (LAccNumberIndex >= 0) then
+            begin
+              AErrorMessage := Format('Name "%s" is used by account %s ', [LNewName, TAccountComp.AccountNumberToAccountTxtNumber(LAccNumberIndex)]);
+              Exit(False);
+            end;
+          end;
+        end;
+
+        if (LNewName = LCurrentAccount.Name) and (ANewType = LCurrentAccount.account_type) then
+        begin
+          AErrorMessage := 'New account name and type are same as former.';
+          Exit(False);
+        end;
+
+      end
+      else
+      begin
+        LSignerAccount := LCurrentAccount;
+      end;
+
+      LChangeType := ANewType <> LCurrentAccount.account_type;
+
+      if not TWIZOperationsHelper.IsOwnerOfWallet(LCurrentAccount, LWalletKeys, LWalletKey, AErrorMessage) then
+        Exit(False);
+
+      if (TAccountComp.IsAccountLocked(LCurrentAccount.accountInfo, LNode.Bank.BlocksCount)) then
+      begin
+        AErrorMessage := Format('Target Account "%s" Is Locked Until Block %u', [LCurrentAccount.AccountString, LCurrentAccount.accountInfo.locked_until_block]);
+        Exit(False);
+      end;
+
+      if (TAccountComp.IsAccountLocked(LSignerAccount.accountInfo, LNode.Bank.BlocksCount)) then
+      begin
+        AErrorMessage := Format('Signer Account "%s" Is Locked Until Block %u', [LSignerAccount.AccountString, LSignerAccount.accountInfo.locked_until_block]);
+        Exit(False);
+      end;
+
+      if (not TAccountComp.EqualAccountKeys(LSignerAccount.accountInfo.accountKey, LCurrentAccount.accountInfo.accountKey)) then
+      begin
+        AErrorMessage := Format('Signer Account %s Is Not The Owner Of Target Account %s', [LSignerAccount.AccountString, LCurrentAccount.AccountString]);
+        Exit(False);
+      end;
+
+      if (LNode.Bank.SafeBox.CurrentProtocol = CT_PROTOCOL_1) then
+      begin
+        AErrorMessage := 'This Operation Needs PROTOCOL 2 Active';
+        Exit(False);
+      end;
+
+      if not UpdatePayload(LCurrentAccount.accountInfo.accountKey, LSignerAccount.accountInfo.accountKey, APayloadEncryptionMode, APayloadContent, LPayloadEncodedBytes, APayloadEncryptionPassword, AErrorMessage) then
+      begin
+        AErrorMessage := Format('Error Encoding Payload Of Selected Account "%s. ", Specific Error Is "%s"', [LCurrentAccount.AccountString, AErrorMessage]);
+        Exit(False);
+      end;
+
+      if LSignerAccount.balance > UInt64(AFee) then
+        LFee := AFee
+      else
+        LFee := LSignerAccount.balance;
+
+
+      LPCOperation := TOpChangeAccountInfo.CreateChangeAccountInfo(TNode.Node.Bank.Safebox.CurrentProtocol,
+        LSignerAccount.account, LSignerAccount.n_operation + 1, LCurrentAccount.account, LWalletKey.PrivateKey, False, CT_TECDSA_Public_Nul,
+        LChangeName, LNewName, LChangeType, ANewType, LFee, LPayloadEncodedBytes);
+
+      try
+        if (LChangeName) and (LChangeType) then
+        begin
+          LTemp := Format('%d. Change Account %s Name and Type from [%s, %d] To [%s, %d] %s', [LNoOfOperations + 1, LCurrentAccount.DisplayString, LCurrentAccount.Name, LCurrentAccount.account_type, LNewName, ANewType, sLineBreak]);
+        end
+        else if LChangeName then
+        begin
+          LTemp := Format('%d. Change Account %s Name from [%s] To [%s] %s', [LNoOfOperations + 1, LCurrentAccount.DisplayString, LCurrentAccount.Name, LNewName, sLineBreak]);
+        end
+        else if LChangeType then
+        begin
+          LTemp := Format('%d. Change Account %s Type from [%d] To [%d] %s', [LNoOfOperations + 1, LCurrentAccount.DisplayString, LCurrentAccount.account_type, ANewType, sLineBreak]);
+        end;
+
+        if LOperationsTxt <> '' then
+          LOperationsTxt := LOperationsTxt + LTemp + sLineBreak
+        else
+          LOperationsTxt := sLineBreak + LTemp;
+
+        if Assigned(LPCOperation) then
+        begin
+          LOperationsHashTree.AddOperationToHashTree(LPCOperation);
+          Inc(LNoOfOperations);
+          Inc(LTotalSignerFee, LFee);
+          if LOperationToString <> '' then
+            LOperationToString := LOperationToString + #10;
+          LOperationToString := LOperationToString + LPCOperation.ToString;
+        end;
+      finally
+        FreeAndNil(LPCOperation);
+      end;
+
+    end;
+
+    if (LOperationsHashTree.OperationsCount = 0) then
+    begin
+      AErrorMessage := 'No Valid Operation to Execute';
+      Exit(False);
+    end;
+
+    Exit(TWIZOperationsHelper.OthersFinalizeAndDisplayMessage(LOperationsTxt, LOperationToString, LNoOfOperations, LTotalSignerFee, LOperationsHashTree, AErrorMessage));
+
+  finally
+    LOperationsHashTree.Free;
+  end;
+end;
+
+
+
 end.
 end.

+ 98 - 0
src/gui-experimental/wizards/operations/UWIZChangeAccountInfo.pas

@@ -0,0 +1,98 @@
+unit UWIZChangeAccountInfo;
+
+{ Copyright (c) 2018 by 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.
+
+  This unit is a part of the PascalCoin Project, an infinitely scalable
+  cryptocurrency. Find us here:
+  Web: https://www.pascalcoin.org
+  Source: https://github.com/PascalCoin/PascalCoin
+
+  Acknowledgements:
+  - Ugochukwu Mmaduekwe - main developer
+  - Herman Schoenfeld - designer
+
+  THIS LICENSE HEADER MUST NOT BE REMOVED.
+}
+
+{$mode delphi}
+
+interface
+
+uses
+  SysUtils, Classes, UWizard, UWIZOperation;
+
+type
+
+  { TWIZChangeAccountInfoWizard }
+
+  TWIZChangeAccountInfoWizard = class(TWizard<TWIZOperationsModel>)
+  public
+    constructor Create(AOwner: TComponent); override;
+    function DetermineHasNext: boolean; override;
+    function DetermineHasPrevious: boolean; override;
+    function FinishRequested(out message: ansistring): boolean; override;
+    function CancelRequested(out message: ansistring): boolean; override;
+  end;
+
+implementation
+
+uses
+  UWallet,
+  UCommon,
+  UAccounts,
+  UCoreUtils,
+  UWIZOperationSelected,
+  UWIZChangeAccountInfo_Details,
+  UWIZOperationConfirmation;
+
+{ TWIZChangeAccountInfoWizard }
+
+constructor TWIZChangeAccountInfoWizard.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner, [
+    TWIZOperationSelected,
+    TWIZChangeAccountInfo_Details,
+    TWIZOperationConfirmation
+    ]);
+  TitleText := 'Change Account Info';
+  FinishText := 'Change Account Info';
+end;
+
+function TWIZChangeAccountInfoWizard.DetermineHasNext: boolean;
+begin
+  Result := not (CurrentScreen is TWIZOperationConfirmation);
+end;
+
+function TWIZChangeAccountInfoWizard.DetermineHasPrevious: boolean;
+begin
+  Result := inherited DetermineHasPrevious;
+end;
+
+function TWIZChangeAccountInfoWizard.FinishRequested(out message: ansistring): boolean;
+var
+  LAccountArray: array of TAccount;
+begin
+  if Length(Model.Account.SelectedAccounts) = 1 then
+  begin
+    SetLength(LAccountArray, 1);
+    LAccountArray[0] := Model.Signer.SignerAccount;
+  end
+  else
+  begin
+    LAccountArray := Model.Account.SelectedAccounts;
+  end;
+  // Execute the Change Account Info here
+  Result := TWIZOperationsHelper.ExecuteChangeAccountInfo(Model.Account.SelectedAccounts, LAccountArray, Model.Fee.SingleOperationFee, Model.Payload.PayloadEncryptionMode, IIF(Model.Payload.HasPayload, Model.Payload.Content, ''), Model.Payload.Password, Model.ChangeAccountInfo.NewName, Model.ChangeAccountInfo.NewType, message);
+  if TWIZOperationsModel.RelockOnFinish then
+    TWallet.Keys.LockWallet;
+end;
+
+function TWIZChangeAccountInfoWizard.CancelRequested(out message: ansistring): boolean;
+begin
+  Result := True;
+end;
+
+end.

+ 130 - 0
src/gui-experimental/wizards/operations/UWIZChangeAccountInfo_Details.lfm

@@ -0,0 +1,130 @@
+object WIZChangeAccountInfo_Details: TWIZChangeAccountInfo_Details
+  Left = 0
+  Height = 379
+  Top = 0
+  Width = 450
+  ActiveControl = txtName
+  Anchors = [akTop, akLeft, akBottom]
+  Caption = 'WIZChangeAccountInfo_Details'
+  ClientHeight = 379
+  ClientWidth = 450
+  Visible = False
+  object gbName: TGroupBox
+    Left = 8
+    Height = 124
+    Top = 8
+    Width = 431
+    Anchors = [akTop, akLeft, akRight]
+    Caption = 'Name'
+    ClientHeight = 104
+    ClientWidth = 427
+    TabOrder = 0
+    object txtName: TEdit
+      Left = 16
+      Height = 56
+      Top = 32
+      Width = 394
+      Alignment = taRightJustify
+      Anchors = [akTop, akLeft, akRight]
+      AutoSize = False
+      Font.Height = -43
+      Font.Style = [fsBold]
+      OnChange = txtNameChange
+      ParentFont = False
+      TabOrder = 0
+    end
+    object lblNameNotice: TLabel
+      Left = 16
+      Height = 15
+      Top = 8
+      Width = 141
+      Caption = 'Please enter the new name'
+      ParentColor = False
+      ParentFont = False
+    end
+    object lblNameDetails: TLabel
+      Left = 333
+      Height = 15
+      Top = 8
+      Width = 74
+      Anchors = [akTop, akRight]
+      Caption = 'Name Details'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+    end
+  end
+  object gpType: TGroupBox
+    Left = 8
+    Height = 122
+    Top = 144
+    Width = 431
+    Anchors = [akTop, akLeft, akRight]
+    Caption = 'Type'
+    ClientHeight = 102
+    ClientWidth = 427
+    ParentFont = False
+    TabOrder = 1
+    object txtType: TEdit
+      Left = 16
+      Height = 56
+      Top = 32
+      Width = 394
+      Alignment = taRightJustify
+      Anchors = [akTop, akLeft, akRight]
+      AutoSize = False
+      Font.Height = -43
+      Font.Style = [fsBold]
+      NumbersOnly = True
+      OnChange = txtTypeChange
+      ParentFont = False
+      TabOrder = 0
+    end
+    object lblTypeNotice: TLabel
+      Left = 16
+      Height = 15
+      Top = 11
+      Width = 134
+      Caption = 'Please enter the new type'
+      ParentColor = False
+    end
+    object lblTypeDetails: TLabel
+      Left = 340
+      Height = 15
+      Top = 8
+      Width = 67
+      Anchors = [akTop, akRight]
+      Caption = 'Type Details'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+    end
+  end
+  object gpOptions: TGroupBox
+    Left = 8
+    Height = 89
+    Top = 280
+    Width = 431
+    Anchors = [akTop, akLeft, akRight, akBottom]
+    Caption = 'Options'
+    ClientHeight = 69
+    ClientWidth = 427
+    TabOrder = 2
+    object chkCustomFee: TCheckBox
+      Left = 16
+      Height = 19
+      Top = 8
+      Width = 164
+      Caption = 'Allow me to choose the fee'
+      TabOrder = 0
+    end
+    object chkPayload: TCheckBox
+      Left = 16
+      Height = 19
+      Top = 40
+      Width = 158
+      Caption = 'Attach a message payload'
+      TabOrder = 1
+    end
+  end
+end

+ 197 - 0
src/gui-experimental/wizards/operations/UWIZChangeAccountInfo_Details.pas

@@ -0,0 +1,197 @@
+unit UWIZChangeAccountInfo_Details;
+
+{ Copyright (c) 2018 by 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.
+
+  This unit is a part of the PascalCoin Project, an infinitely scalable
+  cryptocurrency. Find us here:
+  Web: https://www.pascalcoin.org
+  Source: https://github.com/PascalCoin/PascalCoin
+
+  Acknowledgements:
+  - Ugochukwu Mmaduekwe - main developer
+  - Herman Schoenfeld - designer
+
+  THIS LICENSE HEADER MUST NOT BE REMOVED.
+}
+
+{$mode delphi}
+{$modeswitch nestedprocvars}
+
+interface
+
+uses
+  Classes, SysUtils, Forms, Dialogs, Controls, StdCtrls, ExtCtrls, Buttons, UWizard, UWIZOperation;
+
+type
+
+  { TWIZChangeAccountInfo_Details }
+
+  TWIZChangeAccountInfo_Details = class(TWizardForm<TWIZOperationsModel>)
+    chkPayload: TCheckBox;
+    chkCustomFee: TCheckBox;
+    lblTypeDetails: TLabel;
+    txtType: TEdit;
+    txtName: TEdit;
+    gbName: TGroupBox;
+    gpType: TGroupBox;
+    gpOptions: TGroupBox;
+    lblNameDetails: TLabel;
+    lblNameNotice: TLabel;
+    lblTypeNotice: TLabel;
+    procedure txtNameChange(Sender: TObject);
+    procedure txtTypeChange(Sender: TObject);
+    procedure UpdateUI();
+
+  public
+    procedure OnPresent; override;
+    procedure OnNext; override;
+    function Validate(out message: ansistring): boolean; override;
+  end;
+
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UNode,
+  UWallet,
+  UCommon,
+  UMemory,
+  UAccounts,
+  USettings,
+  UCoreUtils,
+  UCoreObjects,
+  UFRMAccountSelect,
+  UCommon.Collections,
+  Generics.Collections,
+  UWIZOperationFee_Custom,
+  UWIZOperationSigner_Select,
+  UWIZOperationPayload_Encryption;
+
+{ TWIZChangeAccountInfo_Details }
+
+procedure TWIZChangeAccountInfo_Details.txtNameChange(Sender: TObject);
+begin
+  UpdateUI();
+end;
+
+procedure TWIZChangeAccountInfo_Details.txtTypeChange(Sender: TObject);
+begin
+  UpdateUI();
+end;
+
+procedure TWIZChangeAccountInfo_Details.OnPresent;
+begin
+  UpdateUI();
+  txtType.Text := '0';
+
+  if Length(Model.Account.SelectedAccounts) > 1 then
+  begin
+    gbName.Enabled := False;
+  end
+  else
+  begin
+    txtName.SetFocus;
+  end;
+end;
+
+procedure TWIZChangeAccountInfo_Details.UpdateUI();
+begin
+  if txtName.Enabled then
+  begin
+    lblNameDetails.Caption := txtName.Text;
+  end;
+  lblTypeDetails.Caption := txtType.Text;
+end;
+
+procedure TWIZChangeAccountInfo_Details.OnNext;
+var
+  LWizStepsToInject: TList<TComponentClass>;
+  LDisposables: TDisposables;
+begin
+  LWizStepsToInject := LDisposables.AddObject(TList<TComponentClass>.Create) as TList<TComponentClass>;
+
+  // Fee Section
+  Model.Fee.SingleOperationFee := TSettings.DefaultFee;
+  if chkCustomFee.Checked then
+    LWizStepsToInject.Add(TWIZOperationFee_Custom);
+
+  // Payload Section
+  Model.Payload.HasPayload := IIF(chkPayload.Checked, True, False);
+  if Model.Payload.HasPayload then
+    LWizStepsToInject.Add(TWIZOperationPayload_Encryption);
+
+  // Signer section
+  if Length(Model.Account.SelectedAccounts) = 1 then
+  begin
+    LWizStepsToInject.Add(TWIZOperationSigner_Select); // special case for changeaccount info wizard
+  end;
+
+  // Update wizard flow if applicable
+  if LWizStepsToInject.Count > 0 then
+    UpdatePath(ptInject, LWizStepsToInject.ToArray);
+end;
+
+function TWIZChangeAccountInfo_Details.Validate(out message: ansistring): boolean;
+var
+  LAccNumberIndex, LIdx, LErrCode: integer;
+  LCurrentAccount: TAccount;
+  LNewName: string;
+  LNewType: word;
+begin
+  Result := True;
+
+  for LIdx := Low(Model.Account.SelectedAccounts) to High(Model.Account.SelectedAccounts) do
+  begin
+    LCurrentAccount := Model.Account.SelectedAccounts[LIdx];
+
+    Val(Trim(txtType.Text), LNewType, LErrCode);
+    if LErrCode > 0 then
+    begin
+      message := Format('New type "%s" is not a valid numeric value', [txtType.Text]);
+      Exit(False);
+    end;
+
+    // New name (only for single operations)
+    if Length(Model.Account.SelectedAccounts) = 1 then
+    begin
+      LNewName := LowerCase(Trim(txtName.Text));
+
+      if LNewName <> LCurrentAccount.Name then
+      begin
+
+        if LNewName <> '' then
+        begin
+          if (not TPCSafeBox.ValidAccountName(LNewName, message)) then
+          begin
+            message := Format('New name "%s" is not a valid name: %s ', [LNewName, message]);
+            Exit(False);
+          end;
+          LAccNumberIndex := (TNode.Node.Bank.SafeBox.FindAccountByName(LNewName));
+          if (LAccNumberIndex >= 0) then
+          begin
+            message := Format('Name "%s" is used by account %s ', [LNewName, TAccountComp.AccountNumberToAccountTxtNumber(LAccNumberIndex)]);
+            Exit(False);
+          end;
+        end;
+      end;
+
+      if (LNewName = LCurrentAccount.Name) and (LNewType = LCurrentAccount.account_type) then
+      begin
+        message := 'New account name and type are same as former.';
+        Exit(False);
+      end;
+
+    end;
+
+  end;
+
+  Model.ChangeAccountInfo.NewName := LNewName;
+  Model.ChangeAccountInfo.NewType := LNewType;
+end;
+
+end.

+ 0 - 1
src/gui-experimental/wizards/operations/UWIZChangeKey_EnterKey.lfm

@@ -7,7 +7,6 @@ object WIZChangeKey_EnterKey: TWIZChangeKey_EnterKey
   Caption = 'ChangeKey_EnterKey'
   Caption = 'ChangeKey_EnterKey'
   ClientHeight = 291
   ClientHeight = 291
   ClientWidth = 510
   ClientWidth = 510
-  LCLVersion = '1.8.4.0'
   Visible = False
   Visible = False
   object gbNewPublicKey: TGroupBox
   object gbNewPublicKey: TGroupBox
     Left = 4
     Left = 4

+ 1 - 4
src/gui-experimental/wizards/operations/UWIZChangeKey_EnterKey.pas

@@ -80,12 +80,9 @@ begin
     Model.Fee.SingleOperationFee := TSettings.DefaultFee;
     Model.Fee.SingleOperationFee := TSettings.DefaultFee;
     if Model.Payload.HasPayload then
     if Model.Payload.HasPayload then
       UpdatePath(ptInject, [TWIZOperationPayload_Encryption])
       UpdatePath(ptInject, [TWIZOperationPayload_Encryption])
-    else if Length(Model.Account.SelectedAccounts) > 1 then
-      UpdatePath(ptInject, [TWIZOperationSigner_Select])
     else
     else
     begin
     begin
-      Model.Signer.SignerAccount := Model.Account.SelectedAccounts[0];
-      Model.Signer.OperationSigningMode := akaPrimary;
+      UpdatePath(ptInject, [TWIZOperationSigner_Select]);
     end;
     end;
   end;
   end;
 
 

+ 0 - 1
src/gui-experimental/wizards/operations/UWIZChangeKey_SelectKey.lfm

@@ -7,7 +7,6 @@ object WIZChangeKey_SelectKey: TWIZChangeKey_SelectKey
   Caption = 'WIZChangeKey_SelectKey'
   Caption = 'WIZChangeKey_SelectKey'
   ClientHeight = 253
   ClientHeight = 253
   ClientWidth = 429
   ClientWidth = 429
-  LCLVersion = '1.8.4.0'
   Visible = False
   Visible = False
   object gbNewPrivateKey: TGroupBox
   object gbNewPrivateKey: TGroupBox
     Left = 4
     Left = 4

+ 1 - 4
src/gui-experimental/wizards/operations/UWIZChangeKey_SelectKey.pas

@@ -139,12 +139,9 @@ begin
     Model.Fee.SingleOperationFee := TSettings.DefaultFee;
     Model.Fee.SingleOperationFee := TSettings.DefaultFee;
     if Model.Payload.HasPayload then
     if Model.Payload.HasPayload then
       UpdatePath(ptInject, [TWIZOperationPayload_Encryption])
       UpdatePath(ptInject, [TWIZOperationPayload_Encryption])
-    else if Length(Model.Account.SelectedAccounts) > 1 then
-      UpdatePath(ptInject, [TWIZOperationSigner_Select])
     else
     else
     begin
     begin
-      Model.Signer.SignerAccount := Model.Account.SelectedAccounts[0];
-      Model.Signer.OperationSigningMode := akaPrimary;
+      UpdatePath(ptInject, [TWIZOperationSigner_Select]);
     end;
     end;
   end;
   end;
 
 

+ 0 - 1
src/gui-experimental/wizards/operations/UWIZChangeKey_SelectOption.lfm

@@ -7,7 +7,6 @@ object WIZChangeKey_SelectOption: TWIZChangeKey_SelectOption
   Caption = 'WIZChangeKey_SelectOption'
   Caption = 'WIZChangeKey_SelectOption'
   ClientHeight = 253
   ClientHeight = 253
   ClientWidth = 429
   ClientWidth = 429
-  LCLVersion = '1.8.4.0'
   Visible = False
   Visible = False
   object gbChangeKeyOptions: TGroupBox
   object gbChangeKeyOptions: TGroupBox
     Left = 4
     Left = 4

+ 1 - 0
src/gui-experimental/wizards/operations/UWIZDelistAccountFromSale_Options.lfm

@@ -3,6 +3,7 @@ object WIZDelistAccountFromSale_Options: TWIZDelistAccountFromSale_Options
   Height = 263
   Height = 263
   Top = 0
   Top = 0
   Width = 429
   Width = 429
+  ActiveControl = chkChooseFee
   Caption = 'WIZDelistAccountFromSale_Options'
   Caption = 'WIZDelistAccountFromSale_Options'
   ClientHeight = 263
   ClientHeight = 263
   ClientWidth = 429
   ClientWidth = 429

+ 1 - 4
src/gui-experimental/wizards/operations/UWIZDelistAccountFromSale_Options.pas

@@ -74,12 +74,9 @@ begin
     Model.Fee.SingleOperationFee := TSettings.DefaultFee;
     Model.Fee.SingleOperationFee := TSettings.DefaultFee;
     if Model.Payload.HasPayload then
     if Model.Payload.HasPayload then
       UpdatePath(ptInject, [TWIZOperationPayload_Encryption])
       UpdatePath(ptInject, [TWIZOperationPayload_Encryption])
-    else if Length(Model.Account.SelectedAccounts) > 1 then
-      UpdatePath(ptInject, [TWIZOperationSigner_Select])
     else
     else
     begin
     begin
-      Model.Signer.SignerAccount := Model.Account.SelectedAccounts[0];
-      Model.Signer.OperationSigningMode := akaPrimary;
+      UpdatePath(ptInject, [TWIZOperationSigner_Select]);
     end;
     end;
   end;
   end;
 end;
 end;

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

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

+ 2 - 5
src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_EnterPublicKey.pas

@@ -71,9 +71,7 @@ begin
     Model.EnlistAccountForSale.NewOwnerPublicKey, message) then
     Model.EnlistAccountForSale.NewOwnerPublicKey, message) then
   begin
   begin
     message := Format('Error Importing Public Key, Specific Error: %s', [message]);
     message := Format('Error Importing Public Key, Specific Error: %s', [message]);
-    Result := False;
-    Exit;
-
+    Exit(False);
   end;
   end;
 
 
   for LIdx := Low(Model.Account.SelectedAccounts) to High(Model.Account.SelectedAccounts) do
   for LIdx := Low(Model.Account.SelectedAccounts) to High(Model.Account.SelectedAccounts) do
@@ -81,8 +79,7 @@ begin
       Model.Account.SelectedAccounts[LIdx].accountInfo.accountKey) then
       Model.Account.SelectedAccounts[LIdx].accountInfo.accountKey) then
     begin
     begin
       message := 'You Cannot Sell To An Account That You Want To Enlist For Sale.';
       message := 'You Cannot Sell To An Account That You Want To Enlist For Sale.';
-      Result := False;
-      Exit;
+      Exit(False);
     end;
     end;
 
 
 end;
 end;

+ 0 - 1
src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_EnterSaleAmount.lfm

@@ -7,7 +7,6 @@ object WIZEnlistAccountForSale_EnterSaleAmount: TWIZEnlistAccountForSale_EnterSa
   Caption = 'WIZEnlistAccountForSale_EnterSaleAmount'
   Caption = 'WIZEnlistAccountForSale_EnterSaleAmount'
   ClientHeight = 253
   ClientHeight = 253
   ClientWidth = 429
   ClientWidth = 429
-  LCLVersion = '1.8.4.0'
   Visible = False
   Visible = False
   object gbSalePrice: TGroupBox
   object gbSalePrice: TGroupBox
     Left = 4
     Left = 4

+ 2 - 4
src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_EnterSaleAmount.pas

@@ -39,6 +39,7 @@ type
     procedure UpdateUI();
     procedure UpdateUI();
 
 
 
 
+
   public
   public
     procedure OnPresent; override;
     procedure OnPresent; override;
     procedure OnNext; override;
     procedure OnNext; override;
@@ -88,12 +89,9 @@ begin
     Model.Fee.SingleOperationFee := TSettings.DefaultFee;
     Model.Fee.SingleOperationFee := TSettings.DefaultFee;
     if Model.Payload.HasPayload then
     if Model.Payload.HasPayload then
       UpdatePath(ptInject, [TWIZOperationPayload_Encryption])
       UpdatePath(ptInject, [TWIZOperationPayload_Encryption])
-    else if Length(Model.Account.SelectedAccounts) > 1 then
-      UpdatePath(ptInject, [TWIZOperationSigner_Select])
     else
     else
     begin
     begin
-      Model.Signer.SignerAccount := Model.Account.SelectedAccounts[0];
-      Model.Signer.OperationSigningMode := akaPrimary;
+      UpdatePath(ptInject, [TWIZOperationSigner_Select]);
     end;
     end;
   end;
   end;
 
 

+ 438 - 72
src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_EnterSeller.lfm

@@ -1,94 +1,460 @@
 object WIZEnlistAccountForSale_EnterSeller: TWIZEnlistAccountForSale_EnterSeller
 object WIZEnlistAccountForSale_EnterSeller: TWIZEnlistAccountForSale_EnterSeller
   Left = 0
   Left = 0
-  Height = 253
+  Height = 286
   Top = 0
   Top = 0
-  Width = 429
-  ActiveControl = edtSellerAcc
+  Width = 450
+  ActiveControl = edtBeneficiaryAcc
   Caption = 'WIZEnlistAccountForSale_EnterSeller'
   Caption = 'WIZEnlistAccountForSale_EnterSeller'
-  ClientHeight = 253
-  ClientWidth = 429
-  LCLVersion = '1.8.4.0'
+  ClientHeight = 286
+  ClientWidth = 450
   Visible = False
   Visible = False
-  object gbSeller: TGroupBox
-    Left = 4
-    Height = 244
-    Top = 4
-    Width = 422
+  object gbBeneficiary: TGroupBox
+    Left = 8
+    Height = 124
+    Top = 8
+    Width = 431
     Anchors = [akTop, akLeft, akRight, akBottom]
     Anchors = [akTop, akLeft, akRight, akBottom]
-    Caption = 'Beneficiary Account'
-    ClientHeight = 224
-    ClientWidth = 418
+    Caption = 'Beneficiary'
+    ClientHeight = 104
+    ClientWidth = 427
     TabOrder = 0
     TabOrder = 0
-    object edtSellerAcc: TEdit
-      Left = 8
-      Height = 23
-      Top = 48
-      Width = 136
-      OnChange = edtSellerAccChange
+    object lblBeneficiaryNotice: TLabel
+      Left = 16
+      Height = 15
+      Top = 8
+      Width = 190
+      Caption = 'Please enter the beneficiary account'
+      ParentColor = False
+      ParentFont = False
+    end
+    object edtBeneficiaryAcc: TEdit
+      Left = 16
+      Height = 56
+      Top = 32
+      Width = 316
+      Alignment = taRightJustify
+      Anchors = [akTop, akLeft, akRight]
+      AutoSize = False
+      Font.Height = -43
+      Font.Style = [fsBold]
+      OnChange = edtBeneficiaryAccChange
+      ParentFont = False
       TabOrder = 0
       TabOrder = 0
     end
     end
     object btnSearch: TSpeedButton
     object btnSearch: TSpeedButton
-      Left = 152
-      Height = 22
-      Top = 49
-      Width = 23
+      Left = 354
+      Height = 56
+      Top = 32
+      Width = 56
+      Anchors = [akTop, akRight]
       Glyph.Data = {
       Glyph.Data = {
-        36040000424D3604000000000000360000002800000010000000100000000100
-        2000000000000004000064000000640000000000000000000000000000000000
-        0000000000000000000F00000010000000100000001000000010000000100000
-        001000000010000000100000000F000000000000000000000000000000003509
-        033190370DEBA6410FFFA6410FFFA6410FFFA6410FFFA6410FFFA6410FFFA641
-        0FFFA6410FFFA6410FFFA6410FFF90370DEB350903310000000000000000953A
-        0EE6B14B10FFB04B10FFB04B10FFB04B10FFB04B10FFB04B10FFB04B10FFB04B
-        10FFB14B11FFAE460CFFB14B11FFB14B10FF953A0EE60000000000000001AA47
-        12FFB24D11FFB24D11FFB24D11FFB24D11FFB34E12FFB34E12FFB24D11FFB34E
-        12FFAB440DFFE1C19FFFAC4914FFB34E12FFAA4712FF0000000100000001AD4A
-        13FFB65113FFB65113FFB55113FFB14A0EFFAA3F05FFAA3F05FFB14A0EFFAE48
-        0EFFEEDCBCFFFFFFE2FFE6C6A1FFB44E0FFFAD4A13FF0000000100000001AF4D
-        14FFB85414FFB85414FFB75A25FFE5C8A7FFFFFFEBFFFFFFEAFFE3C3A1FFECD7
-        B8FFFFFFE4FFF1DFBEFFB55011FFB85414FFAF4D14FF0000000100000001B251
-        15FFBB5816FFBB6027FFFFFFEAFFEBCFABFFCC814BFFCC824CFFECD1AEFFFFFF
-        E8FFEFDAB9FFB95412FFBB5816FFBB5816FFB25115FF0000000100000001B555
-        16FFBC5712FFEACDAAFFEBCEAAFFBB540EFFBF5E19FFBF5E19FFBB550FFFEDD2
-        B0FFE7C7A5FFBC5712FFBE5C16FFBE5C16FFB55516FF0000000100000001B859
-        19FFBD5915FFFFFFFCFFD08857FFC56B29FFC46B29FFC46A29FFC56B29FFD18B
-        5BFFFFFFF9FFBF5D1BFFC46A27FFC36623FFB85919FF0000000100000001C170
-        35FFC66B2BFFFFFFFFFFD38F64FFCB7839FFCA7739FFCA7739FFCB7839FFD492
-        67FFFFFFFFFFC66C2CFFCA7739FFCB7739FFC17035FF0000000100000001C77F
-        46FFCF8248FFF1DBCCFFEED3C5FFCC7A40FFD1864CFFD1864CFFCC7A40FFEFD5
-        C8FFF1D9C9FFCF8348FFD0864CFFD0864CFFC77F46FF0000000100000001CD8D
-        59FFD79561FFDA9D6EFFFFFFFFFFF0D7C8FFDA9F79FFDAA079FFF0D8CAFFFFFF
-        FFFFD99C6DFFD79561FFD69460FFD69460FFCD8D59FF0000000100000000D29A
-        6CFFDCA373FFDCA373FFDEA97FFFF5E5D8FFFFFFFFFFFFFFFFFFF5E5D7FFDEA9
-        7EFFDCA373FFDCA373FFDCA373FFDCA373FFD29A6CFF0000000000000000C99C
-        75E0E1AE83FFE1AE84FFE1AE84FFE0AC80FFDFA87AFFDEA87AFFE0AC80FFE1AE
-        84FFE1AE84FFE1AE84FFE1AE84FFE1AE83FFC99C75E000000000FFFFFE007960
-        4721D0AA87DCDCB58FFFDDB590FFDDB590FFDDB590FFDDB590FFDDB590FFDDB5
-        90FFDDB590FFDDB590FFDCB58FFFD0AA87DC79604821FFFFFA0000000000FFFF
-        FF00000000000000000000000000000000000000000000000000000000000000
-        000000000000000000000000000000000000FFFFFF0000000000
+        36310000424D3631000000000000360000002800000038000000380000000100
+        2000000000000031000064000000640000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000002395F9572293F6CA2293F6E62294F6BA2094
+        F537000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000002194F8732294F6FE2294F7FF2294F7FF2294F7FF2294
+        F7F62094F5370000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000002093F6742294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F6BA0000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00002093F6742294F6FE2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7E50000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000002094
+        F6752294F6FE2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2293F6CA0000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000000000002292F6762294
+        F6FE2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F9590000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000000000000000000000000000002293F6772294F6FE2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2194
+        F67A000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000007FFF042192F5362094F6752293F7A22294F6BF2194F6D22193F6DB2294
+        F7D02193F6BE2194F7A02193F6722396FA3300AAFF0300000000000000000000
+        0000000000000000000000000000000000002292F6782294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2193F6790000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000000000002096F8272193
+        F7912293F6E82294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7E52294F58D2491F7230000
+        00000000000000000000000000002193F6792294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2193F679000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000002394F7242294F6AA2293F6FE2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2293F6FC2193
+        F69F1D93FE1A000000002193F6792294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2193F67900000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000003F7FFF042094F67C2194F6F82294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2194F6F12193F7A62294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2193F6790000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000002491F2152293F7C02294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2192F67A000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00002094F61F2194F6DA2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2194F67A00000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000002190
+        F3172194F6DC2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2194F67A0000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000000000002A7FFF062194
+        F7C42294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F6FE2193F7CC2194F7812193F5532391F63A1F91F4312294
+        F63C2395F6572193F5892194F6D52294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2194
+        F67A000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000000000002294F7862294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F6FE2294F6AC2195F92E00000000000000000000000000000000000000000000
+        000000000000000000000000FF012292F63B2193F6BD2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2193F7A60000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000000000000000000000000000002195F32E2193F6FA2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2293F6ED2195
+        F84D000000000000000000000000000000000000000000000000000000000000
+        000000000000000000000000000000000000000000002192F7632294F6F62294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2194F6F11D93
+        F51A000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000000000000000000000000000002193F6B72294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2193F7E12193F8260000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000000000002094F5372293
+        F7EE2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2193
+        F69F000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000002192F5362294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2194F7EA2394F724000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000002094
+        F5372294F6F62294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2293
+        F6FC2491F0230000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000002293F7A32294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F6FE2093F44700000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00002192F7632294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2293F78C0000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000178BE70B2294F6F42294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2194F7A00000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000002193F6BD2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7E500AAFF0300000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000002093F54E2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2293F6FC1F97F7200000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000002292F63B2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2396F53300000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000002193F58A2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2194F7B6000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000012194F6D52294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2193F67200000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000002193F6BC2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2393F56D000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000002193F5892294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2194F7A000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000002194F6DC2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF1F91F538000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000002392F6572294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2194F6BD00000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000002293F6F02294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2491F51C000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000002292FA3B2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F6D000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000FFFF012194F6FB2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF1E96FF11000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000001F94F9302294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2193F6DB00000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000000000FF012193F6F22294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF1D93F51A000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000002393F6392294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2194F6D200000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000002293F6DF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2293F534000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000002193F5532294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2194F6BF00000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000002293F7C12294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2094F765000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000002194F7812294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2293F7A200000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000002194F7902294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2193F7AD000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000002193F6CC2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2094F67500000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000002193F6552294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2194F6F82190F3170000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000002195F92E2294F6FE2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2192F53600000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000001E96F0112193F6F92294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2194F68F0000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000002294F6AC2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2293F6E8007FFF0400000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000002193F6AF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2193F6FB2293FA3400000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00002195F84D2294F6FE2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2193F7910000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000002294F7432294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F6DE2296F316000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000002193
+        F8262293F6ED2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2293
+        F6FE2096F8270000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000000000000000000000000000002193F6C72294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2293F6D12296F3160000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000000000002290F1252194
+        F7E12294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7AA000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000000000000000000000000000002294F63C2294F6FD2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F6DE2293
+        FA34000000000000000000000000000000000000000000000000000000000000
+        000000000000000000000000000000000000000000002093F4472193F6EB2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2194F6F82394
+        F724000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000000000002193F69A2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2193
+        F7FA2194F68F2190F31700000000000000000000000000000000000000000000
+        00000000000000000000000000001F97F7202194F7A02294F6FE2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2094F67C0000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000000000002789EB0D2193
+        F6D62294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2194F6F82193F7AD2092F7652396FA331D93F51A1E96F0112491
+        F51C1F91F5382393F56D2194F7B62293F6FC2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2293F7C0007FFF040000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000002394
+        F7242194F7EA2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2194F7DA2491F215000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00002092F42F2194F7EA2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2194F6DC2094F61F00000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000002394F7242193F6D62294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2194F7C42190F3170000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000002789EB0D2193F69A2294F6FD2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2193F6FA2294F7862A7FFF06000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000002294F63C2193F6C72294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2193
+        F6B72195F32E0000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000000000002294F7432193
+        F6AF2193F6F92294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294F7FF2294
+        F7FF2294F7FF2294F7FF2294F7FF2294F7FF2293F6F42293F7A22195FA350000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00001F9FFF102193F6552194F7902293F7C12293F6DF2193F6F22194F6FB2293
+        F6F02194F6DC2193F6BC2193F58A2195F84D178BE70B00000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000000000000000000000000000000000000000000000000FF0100FFFF010000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000000000000000000000000000000000000
       }
       }
       OnClick = btnSearchClick
       OnClick = btnSearchClick
     end
     end
-    object lblDestNotice: TLabel
-      Left = 8
+    object lblBeneficiaryDetails: TLabel
+      Left = 304
       Height = 15
       Height = 15
       Top = 8
       Top = 8
-      Width = 380
-      Caption = 'Please enter the seller account that will receive the payments for the sale'
-      ParentColor = False
-      ParentFont = False
-    end
-    object lblSellerAccount: TLabel
-      Left = 192
-      Height = 15
-      Top = 52
-      Width = 95
-      Caption = 'Account Number'
+      Width = 104
+      Anchors = [akTop, akRight]
+      Caption = 'Beneficiary Details'
       Font.Style = [fsBold]
       Font.Style = [fsBold]
       ParentColor = False
       ParentColor = False
       ParentFont = False
       ParentFont = False
-      Visible = False
     end
     end
   end
   end
 end
 end

+ 22 - 23
src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_EnterSeller.pas

@@ -23,20 +23,20 @@ unit UWIZEnlistAccountForSale_EnterSeller;
 interface
 interface
 
 
 uses
 uses
-  SysUtils, Forms, StdCtrls, Buttons, Controls, Graphics, UWizard, UWIZOperation;
+  SysUtils, Forms, StdCtrls, Buttons, Controls, Graphics, UWizard, UWIZOperation, Classes;
 
 
 type
 type
 
 
   { TWIZEnlistAccountForSale_EnterSeller }
   { TWIZEnlistAccountForSale_EnterSeller }
 
 
   TWIZEnlistAccountForSale_EnterSeller = class(TWizardForm<TWIZOperationsModel>)
   TWIZEnlistAccountForSale_EnterSeller = class(TWizardForm<TWIZOperationsModel>)
-    edtSellerAcc: TEdit;
-    gbSeller: TGroupBox;
-    lblSellerAccount: TLabel;
-    lblDestNotice: TLabel;
     btnSearch: TSpeedButton;
     btnSearch: TSpeedButton;
+    edtBeneficiaryAcc: TEdit;
+    gbBeneficiary: TGroupBox;
+    lblBeneficiaryDetails: TLabel;
+    lblBeneficiaryNotice: TLabel;
     procedure btnSearchClick(Sender: TObject);
     procedure btnSearchClick(Sender: TObject);
-    procedure edtSellerAccChange(Sender: TObject);
+    procedure edtBeneficiaryAccChange(Sender: TObject);
     procedure UpdateUI();
     procedure UpdateUI();
 
 
   public
   public
@@ -59,34 +59,29 @@ uses
 
 
 { TWIZEnlistAccountForSale_EnterSeller }
 { TWIZEnlistAccountForSale_EnterSeller }
 
 
-procedure TWIZEnlistAccountForSale_EnterSeller.edtSellerAccChange(Sender: TObject);
-begin
-  UpdateUI();
-end;
-
 procedure TWIZEnlistAccountForSale_EnterSeller.UpdateUI();
 procedure TWIZEnlistAccountForSale_EnterSeller.UpdateUI();
 var
 var
   LAccount: TAccount;
   LAccount: TAccount;
   LAccountNumber: cardinal;
   LAccountNumber: cardinal;
 begin
 begin
-  if TAccountComp.AccountTxtNumberToAccountNumber(edtSellerAcc.Text, LAccountNumber) then
+  if TAccountComp.AccountTxtNumberToAccountNumber(edtBeneficiaryAcc.Text, LAccountNumber) then
     if (LAccountNumber < 0) or (LAccountNumber >= TNode.Node.Bank.AccountsCount) then
     if (LAccountNumber < 0) or (LAccountNumber >= TNode.Node.Bank.AccountsCount) then
     begin
     begin
-      lblSellerAccount.Caption := '';
-      lblSellerAccount.Visible := False;
+      lblBeneficiaryDetails.Caption := '';
+      lblBeneficiaryDetails.Visible := False;
     end
     end
     else
     else
     begin
     begin
       LAccount := TNode.Node.Operations.SafeBoxTransaction.account(LAccountNumber);
       LAccount := TNode.Node.Operations.SafeBoxTransaction.account(LAccountNumber);
-      lblSellerAccount.Caption := LAccount.DisplayString;
-      lblSellerAccount.Visible := True;
+      lblBeneficiaryDetails.Caption := LAccount.Name;
+      lblBeneficiaryDetails.Visible := True;
     end;
     end;
 end;
 end;
 
 
 procedure TWIZEnlistAccountForSale_EnterSeller.OnPresent;
 procedure TWIZEnlistAccountForSale_EnterSeller.OnPresent;
 begin
 begin
   UpdateUI();
   UpdateUI();
-  edtSellerAcc.SetFocus;
+  edtBeneficiaryAcc.SetFocus;
 end;
 end;
 
 
 procedure TWIZEnlistAccountForSale_EnterSeller.btnSearchClick(Sender: TObject);
 procedure TWIZEnlistAccountForSale_EnterSeller.btnSearchClick(Sender: TObject);
@@ -99,24 +94,28 @@ begin
   try
   try
     LFRMAccountSelect.Node := TNode.Node;
     LFRMAccountSelect.Node := TNode.Node;
     LFRMAccountSelect.WalletKeys := TWallet.Keys;
     LFRMAccountSelect.WalletKeys := TWallet.Keys;
-    LFRMAccountSelect.Filters := edtSellerAcc.Tag;
-    if TAccountComp.AccountTxtNumberToAccountNumber(edtSellerAcc.Text, LAccountNumber) then
+    LFRMAccountSelect.Filters := edtBeneficiaryAcc.Tag;
+    if TAccountComp.AccountTxtNumberToAccountNumber(edtBeneficiaryAcc.Text, LAccountNumber) then
       LFRMAccountSelect.DefaultAccount := LAccountNumber;
       LFRMAccountSelect.DefaultAccount := LAccountNumber;
     LFRMAccountSelect.AllowSelect := True;
     LFRMAccountSelect.AllowSelect := True;
     if LFRMAccountSelect.ShowModal = mrOk then
     if LFRMAccountSelect.ShowModal = mrOk then
-      edtSellerAcc.Text := TAccountComp.AccountNumberToAccountTxtNumber(LFRMAccountSelect.GetSelected);
+      edtBeneficiaryAcc.Text := TAccountComp.AccountNumberToAccountTxtNumber(LFRMAccountSelect.GetSelected);
   finally
   finally
     LFRMAccountSelect.Free;
     LFRMAccountSelect.Free;
   end;
   end;
 end;
 end;
 
 
+procedure TWIZEnlistAccountForSale_EnterSeller.edtBeneficiaryAccChange(Sender: TObject);
+begin
+  UpdateUI();
+end;
 
 
 procedure TWIZEnlistAccountForSale_EnterSeller.OnNext;
 procedure TWIZEnlistAccountForSale_EnterSeller.OnNext;
 var
 var
   LAccountNumber: cardinal;
   LAccountNumber: cardinal;
   LAccount: TAccount;
   LAccount: TAccount;
 begin
 begin
-  TAccountComp.AccountTxtNumberToAccountNumber(edtSellerAcc.Text, LAccountNumber);
+  TAccountComp.AccountTxtNumberToAccountNumber(edtBeneficiaryAcc.Text, LAccountNumber);
   Model.SendPASC.DestinationAccount := TNode.Node.Operations.SafeBoxTransaction.account(LAccountNumber);
   Model.SendPASC.DestinationAccount := TNode.Node.Operations.SafeBoxTransaction.account(LAccountNumber);
 end;
 end;
 
 
@@ -127,9 +126,9 @@ var
 begin
 begin
   Result := True;
   Result := True;
 
 
-  if not (TAccountComp.AccountTxtNumberToAccountNumber(edtSellerAcc.Text, LAccountNumber)) then
+  if not (TAccountComp.AccountTxtNumberToAccountNumber(edtBeneficiaryAcc.Text, LAccountNumber)) then
   begin
   begin
-    message := Format('Invalid Seller Account "%s"', [edtSellerAcc.Text]);
+    message := Format('Invalid Seller Account "%s"', [edtBeneficiaryAcc.Text]);
     Result := False;
     Result := False;
     Exit;
     Exit;
   end;
   end;

+ 0 - 1
src/gui-experimental/wizards/operations/UWIZEnlistAccountForSale_SelectOption.lfm

@@ -7,7 +7,6 @@ object WIZEnlistAccountForSale_SelectOption: TWIZEnlistAccountForSale_SelectOpti
   Caption = 'WIZEnlistAccountForSale_SelectOption'
   Caption = 'WIZEnlistAccountForSale_SelectOption'
   ClientHeight = 253
   ClientHeight = 253
   ClientWidth = 429
   ClientWidth = 429
-  LCLVersion = '1.8.4.0'
   Visible = False
   Visible = False
   object Label1: TLabel
   object Label1: TLabel
     Left = 24
     Left = 24

+ 11 - 0
src/gui-experimental/wizards/operations/UWIZOperation.pas

@@ -112,6 +112,14 @@ type
         EncodedBytes: TRawBytes;
         EncodedBytes: TRawBytes;
       end;
       end;
 
 
+      { TChangeAccountInfoModel }
+
+      TChangeAccountInfoModel = class(TComponent)
+      public
+        NewName: string;
+        NewType: Word;
+      end;
+
     private
     private
       FExecuteOperationType: TExecuteOperationType;
       FExecuteOperationType: TExecuteOperationType;
       FRelockOnFinish: Boolean; static;
       FRelockOnFinish: Boolean; static;
@@ -124,6 +132,7 @@ type
       FFee: TFeeModel;
       FFee: TFeeModel;
       FSigner: TSignerModel;
       FSigner: TSignerModel;
       FPayload: TPayloadModel;
       FPayload: TPayloadModel;
+      FChangeAccountInfo: TChangeAccountInfoModel;
     public
     public
       constructor Create(AOwner: TComponent; AType: TExecuteOperationType); overload;
       constructor Create(AOwner: TComponent; AType: TExecuteOperationType); overload;
       property ExecuteOperationType: TExecuteOperationType read FExecuteOperationType;
       property ExecuteOperationType: TExecuteOperationType read FExecuteOperationType;
@@ -136,6 +145,7 @@ type
       property Fee: TFeeModel read FFee;
       property Fee: TFeeModel read FFee;
       property Signer: TSignerModel read FSigner;
       property Signer: TSignerModel read FSigner;
       property Payload: TPayloadModel read FPayload;
       property Payload: TPayloadModel read FPayload;
+      property ChangeAccountInfo: TChangeAccountInfoModel read FChangeAccountInfo;
       class property RelockOnFinish: Boolean read FRelockOnFinish write FRelockOnFinish;
       class property RelockOnFinish: Boolean read FRelockOnFinish write FRelockOnFinish;
   end;
   end;
 
 
@@ -157,6 +167,7 @@ begin
   FFee := TFeeModel.Create(Self);
   FFee := TFeeModel.Create(Self);
   FSigner := TSignerModel.Create(Self);
   FSigner := TSignerModel.Create(Self);
   FPayload := TPayloadModel.Create(Self);
   FPayload := TPayloadModel.Create(Self);
+  FChangeAccountInfo := TChangeAccountInfoModel.Create(Self);
 end;
 end;
 
 
 end.
 end.

+ 3 - 20
src/gui-experimental/wizards/operations/UWIZOperationConfirmation.lfm

@@ -6,6 +6,7 @@ object WIZOperationConfirmation: TWIZOperationConfirmation
   Caption = 'WIZOperationConfirmation'
   Caption = 'WIZOperationConfirmation'
   ClientHeight = 320
   ClientHeight = 320
   ClientWidth = 511
   ClientWidth = 511
+  LCLVersion = '1.8.2.0'
   Visible = False
   Visible = False
   object gpConfirmOperation: TGroupBox
   object gpConfirmOperation: TGroupBox
     Left = 10
     Left = 10
@@ -27,24 +28,6 @@ object WIZOperationConfirmation: TWIZOperationConfirmation
       Caption = 'GRID PANEL'
       Caption = 'GRID PANEL'
       TabOrder = 0
       TabOrder = 0
     end
     end
-    object lblSignerAccount: TLabel
-      Left = 8
-      Height = 15
-      Top = 2
-      Width = 88
-      Caption = 'Signer Account:'
-      Font.Style = [fsBold]
-      ParentColor = False
-      ParentFont = False
-    end
-    object lblSgnAcc: TLabel
-      Left = 112
-      Height = 15
-      Top = 2
-      Width = 53
-      Caption = 'lblSgnAcc'
-      ParentColor = False
-    end
     object mmoPayload: TMemo
     object mmoPayload: TMemo
       Left = 8
       Left = 8
       Height = 82
       Height = 82
@@ -67,7 +50,7 @@ object WIZOperationConfirmation: TWIZOperationConfirmation
       ParentFont = False
       ParentFont = False
     end
     end
     object lblBeneficiaryAccount: TLabel
     object lblBeneficiaryAccount: TLabel
-      Left = 280
+      Left = 8
       Height = 15
       Height = 15
       Top = 2
       Top = 2
       Width = 115
       Width = 115
@@ -77,7 +60,7 @@ object WIZOperationConfirmation: TWIZOperationConfirmation
       ParentFont = False
       ParentFont = False
     end
     end
     object lblBenAcc: TLabel
     object lblBenAcc: TLabel
-      Left = 408
+      Left = 130
       Height = 15
       Height = 15
       Top = 2
       Top = 2
       Width = 53
       Width = 53

+ 36 - 7
src/gui-experimental/wizards/operations/UWIZOperationConfirmation.pas

@@ -34,9 +34,7 @@ type
     lblPayload: TLabel;
     lblPayload: TLabel;
     lblPayload1: TLabel;
     lblPayload1: TLabel;
     lblPayload2: TLabel;
     lblPayload2: TLabel;
-    lblSignerAccount: TLabel;
     lblBeneficiaryAccount: TLabel;
     lblBeneficiaryAccount: TLabel;
-    lblSgnAcc: TLabel;
     lblBenAcc: TLabel;
     lblBenAcc: TLabel;
     mmoPayload: TMemo;
     mmoPayload: TMemo;
     mmoPayload1: TMemo;
     mmoPayload1: TMemo;
@@ -93,7 +91,6 @@ begin
 
 
   lblBeneficiaryAccount.Visible := False;
   lblBeneficiaryAccount.Visible := False;
   lblBenAcc.Visible := False;
   lblBenAcc.Visible := False;
-  lblSgnAcc.Caption := Model.Signer.SignerAccount.AccountString;
 
 
   FConfirmationGrid := TVisualGrid.Create(Self);
   FConfirmationGrid := TVisualGrid.Create(Self);
   FConfirmationGrid.CanSearch := False;
   FConfirmationGrid.CanSearch := False;
@@ -123,6 +120,15 @@ begin
     HeaderAlignment := taRightJustify;
     HeaderAlignment := taRightJustify;
     DataAlignment := taRightJustify;
     DataAlignment := taRightJustify;
   end;
   end;
+  with FConfirmationGrid.AddColumn('Signer') do
+  begin
+    StretchedToFill := True;
+    Filters := SORTABLE_TEXT_FILTER;
+    HeaderFontStyles := [fsBold];
+    DataFontStyles := [fsBold];
+    HeaderAlignment := taRightJustify;
+    DataAlignment := taRightJustify;
+  end;
   with FConfirmationGrid.AddColumn('Operation') do
   with FConfirmationGrid.AddColumn('Operation') do
   begin
   begin
     StretchedToFill := True;
     StretchedToFill := True;
@@ -155,8 +161,6 @@ begin
   paGrid.AddControlDockCenter(FConfirmationGrid);
   paGrid.AddControlDockCenter(FConfirmationGrid);
 
 
   case Model.ExecuteOperationType of
   case Model.ExecuteOperationType of
-    omtChangeInfo:
-      lblSgnAcc.Caption := IIF(Length(Model.Account.SelectedAccounts) > 1, '**Signer Account *is* Processed Account**', lblSgnAcc.Caption);
     omtEnlistAccountForSale:
     omtEnlistAccountForSale:
     begin
     begin
       lblBeneficiaryAccount.Visible := True;
       lblBeneficiaryAccount.Visible := True;
@@ -197,11 +201,12 @@ end;
 function TOperationConfirmationDataSource.GetColumns: TDataColumns;
 function TOperationConfirmationDataSource.GetColumns: TDataColumns;
 begin
 begin
   Result := TArrayTool<TDataColumn>.Concat([
   Result := TArrayTool<TDataColumn>.Concat([
-      Inherited,
+     Inherited,
     // Additional columns
     // Additional columns
     TDataColumns.Create(
     TDataColumns.Create(
     TDataColumn.From('Operation'),
     TDataColumn.From('Operation'),
     TDataColumn.From('Recipient'),
     TDataColumn.From('Recipient'),
+    TDataColumn.From('Signer'),
     TDataColumn.From('Fee')
     TDataColumn.From('Fee')
     )
     )
     ]);
     ]);
@@ -242,6 +247,8 @@ begin
         Result := Format('%s', [TCoreTool.GetOperationShortText(CT_Op_ListAccountForSale, IIF(Model.EnlistAccountForSale.AccountSaleMode = akaPrivateSale, CT_OpSubtype_ListAccountForPrivateSale, CT_OpSubtype_ListAccountForPublicSale))]);
         Result := Format('%s', [TCoreTool.GetOperationShortText(CT_Op_ListAccountForSale, IIF(Model.EnlistAccountForSale.AccountSaleMode = akaPrivateSale, CT_OpSubtype_ListAccountForPrivateSale, CT_OpSubtype_ListAccountForPublicSale))]);
       omtDelistAccountFromSale:
       omtDelistAccountFromSale:
         Result := Format('%s', [TCoreTool.GetOperationShortText(CT_Op_DelistAccount, CT_OpSubtype_DelistAccount)]);
         Result := Format('%s', [TCoreTool.GetOperationShortText(CT_Op_DelistAccount, CT_OpSubtype_DelistAccount)]);
+      omtChangeInfo:
+        Result := Format('%s', [TCoreTool.GetOperationShortText(CT_Op_ChangeAccountInfo, CT_OpSubtype_ChangeAccountInfo)]);
 
 
     end
     end
   else if ABindingName = 'Recipient' then
   else if ABindingName = 'Recipient' then
@@ -277,10 +284,32 @@ begin
         Result := IIF(Model.EnlistAccountForSale.AccountSaleMode = akaPrivateSale, TAccountComp.AccountPublicKeyExport(Model.EnlistAccountForSale.NewOwnerPublicKey), '');
         Result := IIF(Model.EnlistAccountForSale.AccountSaleMode = akaPrivateSale, TAccountComp.AccountPublicKeyExport(Model.EnlistAccountForSale.NewOwnerPublicKey), '');
         Result := TCellRenderers.OperationShortHash(Result);
         Result := TCellRenderers.OperationShortHash(Result);
       end;
       end;
-      omtDelistAccountFromSale:
+      omtDelistAccountFromSale, omtChangeInfo:
         Result := '';
         Result := '';
 
 
     end
     end
+  else if ABindingName = 'Signer' then
+    case Model.ExecuteOperationType of
+      omtSendPasc:
+      begin
+        Result := inherited GetItemField(AItem, 'Account');
+      end;
+      omtChangeInfo:
+      begin
+        if Length(Model.Account.SelectedAccounts) = 1 then
+        begin
+          Result := Model.Signer.SignerAccount.AccountString;
+        end
+        else
+        begin
+          Result := inherited GetItemField(AItem, 'Account');
+        end;
+      end
+      else
+      begin
+        Result := Model.Signer.SignerAccount.AccountString;
+      end;
+    end
   else if ABindingName = 'Fee' then
   else if ABindingName = 'Fee' then
     Result := -Model.Fee.SingleOperationFee
     Result := -Model.Fee.SingleOperationFee
   else
   else

+ 0 - 1
src/gui-experimental/wizards/operations/UWIZOperationFee_Custom.lfm

@@ -7,7 +7,6 @@ object WIZOperationFee_Custom: TWIZOperationFee_Custom
   Caption = 'WIZOperationFee_Custom'
   Caption = 'WIZOperationFee_Custom'
   ClientHeight = 253
   ClientHeight = 253
   ClientWidth = 429
   ClientWidth = 429
-  LCLVersion = '1.8.4.0'
   Visible = False
   Visible = False
   object gbTransactionFee: TGroupBox
   object gbTransactionFee: TGroupBox
     Left = 0
     Left = 0

+ 42 - 22
src/gui-experimental/wizards/operations/UWIZOperationFee_Custom.pas

@@ -40,10 +40,10 @@ type
     procedure fseFeeChange(Sender: TObject);
     procedure fseFeeChange(Sender: TObject);
   private
   private
     procedure UpdateUI();
     procedure UpdateUI();
-    procedure SetFee(const AValue : int64);
-    function GetFee : Int64;
+    procedure SetFee(const AValue: int64);
+    function GetFee: int64;
   public
   public
-    property Fee : Int64 read GetFee write SetFee;
+    property Fee: int64 read GetFee write SetFee;
     procedure Initialize; override;
     procedure Initialize; override;
     procedure OnPresent; override;
     procedure OnPresent; override;
     procedure OnNext; override;
     procedure OnNext; override;
@@ -77,50 +77,70 @@ begin
 end;
 end;
 
 
 procedure TWIZOperationFee_Custom.OnNext;
 procedure TWIZOperationFee_Custom.OnNext;
+var
+  LAllUserAccountsExcludingPending: TArray<TAccount>;
 begin
 begin
-  if cbOverrideDefaultFee.Checked then begin
+  if cbOverrideDefaultFee.Checked then
+  begin
     TSettings.DefaultFee := Fee;
     TSettings.DefaultFee := Fee;
     TSettings.Save;
     TSettings.Save;
   end;
   end;
-
-  Model.Signer.SignerCandidates := TCoreTool.GetSignerCandidates(Length(Model.Account.SelectedAccounts), Fee, Model.Account.SelectedAccounts);
+  LAllUserAccountsExcludingPending := TCoreTool.GetUserAccounts(False);
+  Model.Signer.SignerCandidates := TCoreTool.GetSignerCandidates(Length(Model.Account.SelectedAccounts), Fee, LAllUserAccountsExcludingPending);
   Model.Fee.SingleOperationFee := Fee;
   Model.Fee.SingleOperationFee := Fee;
 
 
   // TODO: move this out -- inappropriate to have payload/signer considerations here
   // TODO: move this out -- inappropriate to have payload/signer considerations here
+
   if Model.Payload.HasPayload then
   if Model.Payload.HasPayload then
-    UpdatePath(ptInject, [TWIZOperationPayload_Encryption])
-  else if Length(Model.Account.SelectedAccounts) > 1 then
-    UpdatePath(ptInject, [TWIZOperationSigner_Select])
+  begin
+    UpdatePath(ptInject, [TWIZOperationPayload_Encryption]);
+  end
   else
   else
   begin
   begin
-    Model.Signer.SignerAccount := Model.Account.SelectedAccounts[0];
-    Model.Signer.OperationSigningMode := akaPrimary;
+    case Model.ExecuteOperationType of
+      omtSendPasc:
+      begin
+        // do nothing
+      end;
+
+      omtChangeInfo:
+      begin
+        if Length(Model.Account.SelectedAccounts) = 1 then
+        begin
+          UpdatePath(ptInject, [TWIZOperationSigner_Select]);
+        end;
+      end
+      else
+      begin
+        UpdatePath(ptInject, [TWIZOperationSigner_Select]);
+      end;
+    end;
+
   end;
   end;
+
 end;
 end;
 
 
 function TWIZOperationFee_Custom.Validate(out message: ansistring): boolean;
 function TWIZOperationFee_Custom.Validate(out message: ansistring): boolean;
+var
+  LAcc: TAccount;
 begin
 begin
   Result := True;
   Result := True;
-  if (Length(Model.Account.SelectedAccounts) > 1) AND (Fee = 0) then begin
+  if (Length(Model.Account.SelectedAccounts) > 1) and (Fee = 0) then
+  begin
     message := 'Zero fees only allowed for a single operation.';
     message := 'Zero fees only allowed for a single operation.';
-    Exit(false);
-  end;
-
-  if Length(TCoreTool.GetSignerCandidates(Length(Model.Account.SelectedAccounts), Fee, Model.Account.SelectedAccounts)) = 0 then begin
-    message := 'Insufficient funds in selected account(s) to cover the total fee.';
-    Exit(false);
+    Exit(False);
   end;
   end;
 end;
 end;
 
 
-procedure TWIZOperationFee_Custom.SetFee(const AValue : int64);
+procedure TWIZOperationFee_Custom.SetFee(const AValue: int64);
 begin
 begin
   fseFee.Value := TAccountComp.FormatMoneyDecimal(AValue);
   fseFee.Value := TAccountComp.FormatMoneyDecimal(AValue);
 end;
 end;
 
 
-function TWIZOperationFee_Custom.GetFee : Int64;
+function TWIZOperationFee_Custom.GetFee: int64;
 begin
 begin
-  if NOT TAccountComp.TxtToMoney(Trim(fseFee.ValueToStr(fseFee.Value)), Result) then
-    raise Exception.Create('Illegal value in fee selector');
+  if not TAccountComp.TxtToMoney(Trim(fseFee.ValueToStr(fseFee.Value)), Result) then
+    raise Exception.Create('Invalid value in fee selector');
 end;
 end;
 
 
 procedure TWIZOperationFee_Custom.UpdateUI();
 procedure TWIZOperationFee_Custom.UpdateUI();

+ 0 - 1
src/gui-experimental/wizards/operations/UWIZOperationPayload_Content.lfm

@@ -7,7 +7,6 @@ object WIZOperationPayload_Content: TWIZOperationPayload_Content
   Caption = 'Form1'
   Caption = 'Form1'
   ClientHeight = 253
   ClientHeight = 253
   ClientWidth = 429
   ClientWidth = 429
-  LCLVersion = '1.8.4.0'
   Visible = False
   Visible = False
   object grpPayload: TGroupBox
   object grpPayload: TGroupBox
     Left = 8
     Left = 8

+ 19 - 6
src/gui-experimental/wizards/operations/UWIZOperationPayload_Content.pas

@@ -60,13 +60,26 @@ end;
 procedure TWIZOperationPayload_Content.OnNext;
 procedure TWIZOperationPayload_Content.OnNext;
 begin
 begin
   Model.Payload.Content := mmoPayload.Lines.Text;
   Model.Payload.Content := mmoPayload.Lines.Text;
-  if Length(Model.Account.SelectedAccounts) > 1 then
-    UpdatePath(ptInject, [TWIZOperationSigner_Select])
-  else
-  begin
-    Model.Signer.SignerAccount := Model.Account.SelectedAccounts[0];
-    Model.Signer.OperationSigningMode := akaPrimary;
+
+  case Model.ExecuteOperationType of
+    omtSendPasc:
+    begin
+      // do nothing
+    end;
+
+    omtChangeInfo:
+    begin
+      if Length(Model.Account.SelectedAccounts) = 1 then
+      begin
+        UpdatePath(ptInject, [TWIZOperationSigner_Select]);
+      end;
+    end
+    else
+    begin
+      UpdatePath(ptInject, [TWIZOperationSigner_Select]);
+    end;
   end;
   end;
+
 end;
 end;
 
 
 function TWIZOperationPayload_Content.Validate(out message: ansistring): boolean;
 function TWIZOperationPayload_Content.Validate(out message: ansistring): boolean;

+ 6 - 4
src/gui-experimental/wizards/operations/UWIZOperationPayload_Encryption.pas

@@ -98,7 +98,7 @@ begin
   if (not rbNotEncrypted.Checked) and (not rbEncryptedWithSender.Checked) and
   if (not rbNotEncrypted.Checked) and (not rbEncryptedWithSender.Checked) and
     (not rbEncryptedWithRecipient.Checked) and (not rbEncryptedWithPassword.Checked) then
     (not rbEncryptedWithRecipient.Checked) and (not rbEncryptedWithPassword.Checked) then
   begin
   begin
-    message := 'You Must Select An Encryption Option For Payload';
+    message := 'You must select an encryption option for payload';
     Result := False;
     Result := False;
     Exit;
     Exit;
   end;
   end;
@@ -106,9 +106,11 @@ begin
   case Model.ExecuteOperationType of
   case Model.ExecuteOperationType of
     omtChangeInfo:
     omtChangeInfo:
     begin
     begin
-      message := 'This operation does not support this type of payload encryption';
-      Result := False;
-      Exit;
+      if rbEncryptedWithRecipient.Checked then
+      begin
+        message := 'This operation does not support this type of payload encryption';
+        Exit(False);
+      end;
     end;
     end;
   end;
   end;
 end;
 end;

+ 1 - 1
src/gui-experimental/wizards/operations/UWIZOperationSelected.lfm

@@ -6,7 +6,7 @@ object WIZOperationSelected: TWIZOperationSelected
   Caption = 'OperationSelected'
   Caption = 'OperationSelected'
   ClientHeight = 261
   ClientHeight = 261
   ClientWidth = 429
   ClientWidth = 429
-  LCLVersion = '1.8.4.0'
+  LCLVersion = '1.8.2.0'
   Visible = False
   Visible = False
   object gpSelectedAccount: TGroupBox
   object gpSelectedAccount: TGroupBox
     Left = 4
     Left = 4

+ 20 - 9
src/gui-experimental/wizards/operations/UWIZOperationSelected.pas

@@ -37,6 +37,7 @@ type
     FSelectedAccountsGrid: TVisualGrid;
     FSelectedAccountsGrid: TVisualGrid;
   public
   public
     procedure OnPresent; override;
     procedure OnPresent; override;
+    procedure OnNext; override;
     function Validate(out message: ansistring): boolean; override;
     function Validate(out message: ansistring): boolean; override;
   end;
   end;
 
 
@@ -48,6 +49,7 @@ implementation
 
 
 uses
 uses
   UCommon,
   UCommon,
+  USettings,
   UAccounts,
   UAccounts,
   UCommon.UI,
   UCommon.UI,
   UCoreUtils,
   UCoreUtils,
@@ -125,6 +127,14 @@ begin
     Format('%s PASC', [TAccountComp.FormatMoney(LTotalBalance)]);
     Format('%s PASC', [TAccountComp.FormatMoney(LTotalBalance)]);
 end;
 end;
 
 
+procedure TWIZOperationSelected.OnNext;
+var
+  LAllUserAccountsExcludingPending: TArray<TAccount>;
+begin
+  LAllUserAccountsExcludingPending := TCoreTool.GetUserAccounts(False);
+  Model.Signer.SignerCandidates := TCoreTool.GetSignerCandidates(Length(Model.Account.SelectedAccounts), IIF(TSettings.DefaultFee = 0, 1, TSettings.DefaultFee), LAllUserAccountsExcludingPending);
+end;
+
 function TWIZOperationSelected.Validate(out message: ansistring): boolean;
 function TWIZOperationSelected.Validate(out message: ansistring): boolean;
 var
 var
   LIdx: integer;
   LIdx: integer;
@@ -133,6 +143,16 @@ begin
   Result := True;
   Result := True;
 
 
   case Model.ExecuteOperationType of
   case Model.ExecuteOperationType of
+
+    omtSendPasc:
+    begin
+        if not (TCoreTool.AreAccountBalancesGreaterThan(Model.Account.SelectedAccounts, 0, LAccount)) then
+        begin
+          message := Format('Account %s has zero balance so it cannot be part of a send operation.', [LAccount.AccountString]);
+          Exit(False);
+        end;
+    end;
+
     omtEnlistAccountForSale:
     omtEnlistAccountForSale:
       for LIdx := Low(model.Account.SelectedAccounts) to High(model.Account.SelectedAccounts) do
       for LIdx := Low(model.Account.SelectedAccounts) to High(model.Account.SelectedAccounts) do
       begin
       begin
@@ -158,15 +178,6 @@ begin
       end;
       end;
   end;
   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;
 end;
 
 
 { TOperationSelectedDataSource }
 { TOperationSelectedDataSource }

+ 0 - 1
src/gui-experimental/wizards/operations/UWIZOperationSigner_Select.lfm

@@ -7,7 +7,6 @@ object WIZOperationSigner_Select: TWIZOperationSigner_Select
   Caption = 'WIZOperationSigner_Select'
   Caption = 'WIZOperationSigner_Select'
   ClientHeight = 253
   ClientHeight = 253
   ClientWidth = 429
   ClientWidth = 429
-  LCLVersion = '1.8.4.0'
   Visible = False
   Visible = False
   object gbTransaction: TGroupBox
   object gbTransaction: TGroupBox
     Left = 16
     Left = 16

+ 1 - 1
src/gui-experimental/wizards/operations/UWIZSendPASC.pas

@@ -73,7 +73,7 @@ end;
 function TWIZSendPASCWizard.FinishRequested(out message: ansistring): boolean;
 function TWIZSendPASCWizard.FinishRequested(out message: ansistring): boolean;
 begin
 begin
   // Execute the PASC Sending here
   // Execute the PASC Sending here
-  Result := TWIZOperationsHelper.ExecuteSendPASC(Model.Account.SelectedAccounts, Model.SendPASC.DestinationAccount, Model.Signer.SignerAccount, Model.SendPASC.SingleAmountToSend, Model.Fee.SingleOperationFee, Model.SendPASC.SendPASCMode, Model.Payload.PayloadEncryptionMode, IIF(Model.Payload.HasPayload, Model.Payload.Content, ''), Model.Payload.Password, message);
+  Result := TWIZOperationsHelper.ExecuteSendPASC(Model.Account.SelectedAccounts, Model.SendPASC.DestinationAccount, Model.SendPASC.SingleAmountToSend, Model.Fee.SingleOperationFee, Model.SendPASC.SendPASCMode, Model.Payload.PayloadEncryptionMode, IIF(Model.Payload.HasPayload, Model.Payload.Content, ''), Model.Payload.Password, message);
   if TWIZOperationsModel.RelockOnFinish then
   if TWIZOperationsModel.RelockOnFinish then
   TWallet.Keys.LockWallet;
   TWallet.Keys.LockWallet;
 end;
 end;

+ 0 - 1
src/gui-experimental/wizards/operations/UWIZSendPASC_Details.lfm

@@ -8,7 +8,6 @@ object WIZSendPASC_Details: TWIZSendPASC_Details
   Caption = 'WIZSendPASC_Details'
   Caption = 'WIZSendPASC_Details'
   ClientHeight = 379
   ClientHeight = 379
   ClientWidth = 450
   ClientWidth = 450
-  LCLVersion = '1.8.4.0'
   Visible = False
   Visible = False
   object gbRecipient: TGroupBox
   object gbRecipient: TGroupBox
     Left = 8
     Left = 8

+ 53 - 48
src/gui-experimental/wizards/operations/UWIZSendPASC_Details.pas

@@ -47,8 +47,6 @@ type
     procedure txtRecipientChange(Sender: TObject);
     procedure txtRecipientChange(Sender: TObject);
     procedure UpdateUI();
     procedure UpdateUI();
 
 
-
-
   public
   public
     procedure OnPresent; override;
     procedure OnPresent; override;
     procedure OnNext; override;
     procedure OnNext; override;
@@ -73,7 +71,6 @@ uses
   UCommon.Collections,
   UCommon.Collections,
   Generics.Collections,
   Generics.Collections,
   UWIZOperationFee_Custom,
   UWIZOperationFee_Custom,
-  UWIZOperationSigner_Select,
   UWIZOperationPayload_Encryption;
   UWIZOperationPayload_Encryption;
 
 
 { TWIZSendPASC_Details }
 { TWIZSendPASC_Details }
@@ -91,7 +88,8 @@ begin
   txtRecipient.SetFocus;
   txtRecipient.SetFocus;
 
 
   // Quantity section
   // Quantity section
-  if Length(Model.Account.SelectedAccounts) > 1 then begin
+  if Length(Model.Account.SelectedAccounts) > 1 then
+  begin
     chkCustomFee.Checked := True;
     chkCustomFee.Checked := True;
     chkCustomFee.Enabled := False;
     chkCustomFee.Enabled := False;
   end;
   end;
@@ -104,19 +102,23 @@ var
 begin
 begin
   // Recipient section
   // Recipient section
   if TAccountComp.AccountTxtNumberToAccountNumber(txtRecipient.Text, LAccountNumber) then
   if TAccountComp.AccountTxtNumberToAccountNumber(txtRecipient.Text, LAccountNumber) then
-   if ((LAccountNumber < 0) or (LAccountNumber >= TNode.Node.Bank.AccountsCount)) then
-     lblRecipientDetails.Caption := ''
-  else begin
-    LTempAccount := TNode.Node.Operations.SafeBoxTransaction.account(LAccountNumber);
-    lblRecipientDetails.Caption := LTempAccount.name;
-  end;
+    if ((LAccountNumber < 0) or (LAccountNumber >= TNode.Node.Bank.AccountsCount)) then
+      lblRecipientDetails.Caption := ''
+    else
+    begin
+      LTempAccount := TNode.Node.Operations.SafeBoxTransaction.account(LAccountNumber);
+      lblRecipientDetails.Caption := LTempAccount.Name;
+    end;
 
 
   // Quantity section
   // Quantity section
-  if chkSendAll.Checked then begin
+  if chkSendAll.Checked then
+  begin
     txtAmount.Text := 'ALL BALANCE';
     txtAmount.Text := 'ALL BALANCE';
     txtAmount.Enabled := False;
     txtAmount.Enabled := False;
     Model.SendPASC.SendPASCMode := akaAllBalance;
     Model.SendPASC.SendPASCMode := akaAllBalance;
-  end else begin
+  end
+  else
+  begin
     txtAmount.Enabled := True;
     txtAmount.Enabled := True;
     txtAmount.Text := IIF(Model.SendPASC.SingleAmountToSend = 0, '', TAccountComp.FormatMoney(Model.SendPASC.SingleAmountToSend));
     txtAmount.Text := IIF(Model.SendPASC.SingleAmountToSend = 0, '', TAccountComp.FormatMoney(Model.SendPASC.SingleAmountToSend));
     Model.SendPASC.SendPASCMode := akaSpecifiedAmount;
     Model.SendPASC.SendPASCMode := akaSpecifiedAmount;
@@ -127,20 +129,23 @@ procedure TWIZSendPASC_Details.OnNext;
 var
 var
   LAccountNumber: cardinal;
   LAccountNumber: cardinal;
   LAccount: TAccount;
   LAccount: TAccount;
-  LWizStepsToInject : TList<TComponentClass>;
-  LDisposables : TDisposables;
+  LWizStepsToInject: TList<TComponentClass>;
+  LDisposables: TDisposables;
 begin
 begin
-  LWizStepsToInject := LDisposables.AddObject( TList<TComponentClass>.Create ) as TList<TComponentClass>;
+  LWizStepsToInject := LDisposables.AddObject(TList<TComponentClass>.Create) as TList<TComponentClass>;
 
 
   // Recipient section
   // Recipient section
   TAccountComp.AccountTxtNumberToAccountNumber(txtRecipient.Text, LAccountNumber);
   TAccountComp.AccountTxtNumberToAccountNumber(txtRecipient.Text, LAccountNumber);
   Model.SendPASC.DestinationAccount := TNode.Node.Operations.SafeBoxTransaction.account(LAccountNumber);
   Model.SendPASC.DestinationAccount := TNode.Node.Operations.SafeBoxTransaction.account(LAccountNumber);
 
 
   // Quantity section
   // Quantity section
-  if chkSendAll.Checked then begin
+  if chkSendAll.Checked then
+  begin
     Model.SendPASC.SendPASCMode := akaAllBalance;
     Model.SendPASC.SendPASCMode := akaAllBalance;
-    Model.SendPASC.SingleAmountToSend := 0 // all balance
-  end else begin
+    Model.SendPASC.SingleAmountToSend := 0; // all balance
+  end
+  else
+  begin
     Model.SendPASC.SendPASCMode := akaSpecifiedAmount;
     Model.SendPASC.SendPASCMode := akaSpecifiedAmount;
     TAccountComp.TxtToMoney(txtAmount.Text, Model.SendPASC.SingleAmountToSend);
     TAccountComp.TxtToMoney(txtAmount.Text, Model.SendPASC.SingleAmountToSend);
   end;
   end;
@@ -156,9 +161,8 @@ begin
     LWizStepsToInject.Add(TWIZOperationPayload_Encryption);
     LWizStepsToInject.Add(TWIZOperationPayload_Encryption);
 
 
   // Signer section
   // Signer section
-  if Length(Model.Account.SelectedAccounts) > 1 then
-    LWizStepsToInject.Add(TWIZOperationSigner_Select)
-  else begin
+  if Length(Model.Account.SelectedAccounts) = 1 then
+  begin
     Model.Signer.SignerAccount := Model.Account.SelectedAccounts[0];
     Model.Signer.SignerAccount := Model.Account.SelectedAccounts[0];
     Model.Signer.OperationSigningMode := akaPrimary;
     Model.Signer.OperationSigningMode := akaPrimary;
   end;
   end;
@@ -183,48 +187,49 @@ var
   LAccount: TAccount;
   LAccount: TAccount;
 begin
 begin
   Result := True;
   Result := True;
-  message := '';
   // Recipient section
   // Recipient section
-  if not (TAccountComp.AccountTxtNumberToAccountNumber(txtRecipient.Text, LAccountNumber)) then begin
-    message := message + Format('Invalid Destination Account "%s"', [txtRecipient.Text]) + LineEnding;
-    Result := False;
-    Exit;
+  if not (TAccountComp.AccountTxtNumberToAccountNumber(txtRecipient.Text, LAccountNumber)) then
+  begin
+    message := Format('Invalid destination account "%s"', [txtRecipient.Text]);
+    Exit(False);
   end;
   end;
 
 
-  if (LAccountNumber < 0) or (LAccountNumber >= TNode.Node.Bank.AccountsCount) then begin
-    message := message + Format('Invalid Destination Account "%s"', [TAccountComp.AccountNumberToAccountTxtNumber(LAccountNumber)]) + LineEnding;
-    Result := False;
-    Exit;
+  if (LAccountNumber < 0) or (LAccountNumber >= TNode.Node.Bank.AccountsCount) then
+  begin
+    message := Format('Invalid destination account "%s"', [TAccountComp.AccountNumberToAccountTxtNumber(LAccountNumber)]);
+    Exit(False);
   end;
   end;
 
 
   LAccountNumbersWithChecksum := TListTool<TAccount, string>.Transform(Model.Account.SelectedAccounts, GetAccountNumberWithChecksum);
   LAccountNumbersWithChecksum := TListTool<TAccount, string>.Transform(Model.Account.SelectedAccounts, GetAccountNumberWithChecksum);
 
 
-  if TArrayTool<string>.Contains(LAccountNumbersWithChecksum, txtRecipient.Text) then begin
-    message := message + 'Sender And Destination Account Are Same' + LineEnding;
-    Result := False;
-    Exit;
+  if TArrayTool<string>.Contains(LAccountNumbersWithChecksum, txtRecipient.Text) then
+  begin
+    message := 'Sender and destination account are same';
+    Exit(False);
   end;
   end;
 
 
   // Quantity section
   // Quantity section
-  if not chkSendAll.Checked then begin
-    if not TAccountComp.TxtToMoney(txtAmount.Text, LAmount) then  begin
-      message := message + Format('Invalid quantity to send "%s"', [txtAmount.Text]) + LineEnding;
-      Result := False;
-      Exit;
+  if not chkSendAll.Checked then
+  begin
+    if not TAccountComp.TxtToMoney(txtAmount.Text, LAmount) then
+    begin
+      message := Format('Invalid quantity to send "%s"', [txtAmount.Text]);
+      Exit(False);
     end;
     end;
 
 
-    if LAmount < 1 then begin
-      message := message + 'You Must Send An Amount Greater Than Zero.' + LineEnding;
-      Result := False;
-      Exit;
+    if LAmount < 1 then
+    begin
+      message := 'You Must Send An Amount Greater Than Zero.';
+      Exit(False);
     end;
     end;
 
 
-    for LIdx := Low(Model.Account.SelectedAccounts) to High(Model.Account.SelectedAccounts) do begin
+    for LIdx := Low(Model.Account.SelectedAccounts) to High(Model.Account.SelectedAccounts) do
+    begin
       LAccount := Model.Account.SelectedAccounts[LIdx];
       LAccount := Model.Account.SelectedAccounts[LIdx];
-      if LAccount.balance < LAmount then begin
-        message := message + 'Insufficient Funds In One Or More Accounts.' + LineEnding;
-        Result := False;
-        Exit;
+      if LAccount.balance < LAmount then
+      begin
+        message := Format('Account balance in %s (%s PASC) is less than specified amount (%s PASC) to send', [LAccount.AccountString, TAccountComp.FormatMoney(LAccount.balance), TAccountComp.FormatMoney(LAmount)]);
+        Exit(False);
       end;
       end;
     end;
     end;
   end;
   end;

+ 12 - 1
src/pascalcoin_wallet_experimental.lpi

@@ -82,7 +82,7 @@
         <PackageName Value="LCL"/>
         <PackageName Value="LCL"/>
       </Item1>
       </Item1>
     </RequiredPackages>
     </RequiredPackages>
-    <Units Count="100">
+    <Units Count="102">
       <Unit0>
       <Unit0>
         <Filename Value="pascalcoin_wallet_experimental.dpr"/>
         <Filename Value="pascalcoin_wallet_experimental.dpr"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
@@ -625,6 +625,17 @@
         <HasResources Value="True"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
         <ResourceBaseClass Value="Form"/>
       </Unit99>
       </Unit99>
+      <Unit100>
+        <Filename Value="gui-experimental\wizards\operations\UWIZChangeAccountInfo.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit100>
+      <Unit101>
+        <Filename Value="gui-experimental\wizards\operations\UWIZChangeAccountInfo_Details.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZChangeAccountInfo_Details"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit101>
     </Units>
     </Units>
   </ProjectOptions>
   </ProjectOptions>
   <CompilerOptions>
   <CompilerOptions>