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'
       OnClick = miChangeKeyClick
     end
+    object miChangeAccountInfo: TMenuItem
+      Caption = 'Change Account Info'
+      OnClick = miChangeAccountInfoClick
+    end
     object miAccountsMarket: TMenuItem
       Caption = 'Account Market'
       object miEnlistAccountsForSale: TMenuItem

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

@@ -40,6 +40,7 @@ type
     Label2: TLabel;
     lblTotalPASA: TLabel;
     lblTotalPASC: TLabel;
+    miChangeAccountInfo: TMenuItem;
     miCopyOphash: TMenuItem;
     miOperationInfo: TMenuItem;
     miSendPASC: TMenuItem;
@@ -63,6 +64,7 @@ type
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormResize(Sender: TObject);
+    procedure miChangeAccountInfoClick(Sender: TObject);
     procedure miAccountInfoClick(Sender: TObject);
     procedure miChangeKeyClick(Sender: TObject);
     procedure miCopyOphashClick(Sender: TObject);
@@ -520,7 +522,7 @@ begin
   RefreshMyAccountsCombo;
 end;
 
-procedure TCTRLWallet.OnUserKeyActivityDetected;
+procedure TCTRLWallet.OnUserKeyActivityDetected(Sender: TObject);
 begin
   // 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
@@ -619,6 +621,7 @@ begin
   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');
   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 not TAccountComp.AccountTxtNumberToAccountNumber(FAccountsGrid.Rows[ASelection.Row].Account, accNo) then
       raise Exception.Create('Error Parsing Account Number From Grid');
@@ -655,6 +658,11 @@ begin
   TUserInterface.ShowDelistAccountsDialog(SelectedAccounts);
 end;
 
+procedure TCTRLWallet.miChangeAccountInfoClick(Sender: TObject);
+begin
+  TUserInterface.ShowChangeAccountInfoDialog(SelectedAccounts);
+end;
+
 procedure TCTRLWallet.OnPrepareOperationsPopupMenu(Sender: TObject; constref ASelection: TVisualGridSelection; out APopupMenu: TPopupMenu);
 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
   OnDestroy = FormDestroy
   Position = poOwnerFormCenter
+  LCLVersion = '1.8.2.0'
   Visible = False
   object Splitter1: TSplitter
     Left = 380
-    Height = 385
+    Height = 365
     Top = 66
     Width = 5
   end
@@ -140,17 +141,17 @@ object FRMAccountExplorer: TFRMAccountExplorer
   end
   object pnlAccounts: TPanel
     Left = 0
-    Height = 385
+    Height = 365
     Top = 66
     Width = 380
     Align = alLeft
     BevelOuter = bvNone
-    ClientHeight = 385
+    ClientHeight = 365
     ClientWidth = 380
     TabOrder = 1
     object dgAccounts: TDrawGrid
       Left = 0
-      Height = 351
+      Height = 331
       Top = 0
       Width = 380
       Align = alClient
@@ -164,7 +165,7 @@ object FRMAccountExplorer: TFRMAccountExplorer
     object pnlAccountsInfo: TPanel
       Left = 0
       Height = 34
-      Top = 351
+      Top = 331
       Width = 380
       Align = alBottom
       BevelOuter = bvNone
@@ -245,7 +246,7 @@ object FRMAccountExplorer: TFRMAccountExplorer
   end
   object pcAccountsOptions: TPageControl
     Left = 385
-    Height = 385
+    Height = 365
     Top = 66
     Width = 483
     ActivePage = tsAccountOperations
@@ -254,11 +255,11 @@ object FRMAccountExplorer: TFRMAccountExplorer
     TabOrder = 2
     object tsAccountOperations: TTabSheet
       Caption = 'Operations of selected Account'
-      ClientHeight = 357
+      ClientHeight = 337
       ClientWidth = 475
       object dgAccountOperations: TDrawGrid
         Left = 0
-        Height = 357
+        Height = 337
         Top = 0
         Width = 475
         Align = alClient

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

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

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

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

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

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

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

@@ -27,8 +27,7 @@ uses
   Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, UCommon.UI,
   UNode, UWallet, UCrypto, Buttons, UBlockChain, UBaseTypes,
-  UAccounts, UFRMAccountSelect, ActnList, ComCtrls, Types, UCommon,
-  UPCOrderedLists;
+  UAccounts, UFRMAccountSelect, ActnList, ComCtrls, Types, UCommon, UPCOrderedLists;
 
 Const
   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,
   ULog, UThread, UNetProtocol, UCrypto, UBaseTypes,
   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
   { Forward Declarations }
@@ -163,6 +162,7 @@ type
       class procedure ShowChangeKeyDialog(const AAccounts : array of Cardinal);
       class procedure ShowSellAccountsDialog(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 ShowOptionsDialog(parentForm: TForm);
       class procedure ShowAccountInfoDialog(parentForm: TForm; const account : Cardinal); overload;
@@ -218,7 +218,7 @@ implementation
 uses
   UFRMAbout, UFRMNodesIp, UFRMPascalCoinWalletConfig, UFRMPayloadDecoder, UFRMMemoText,
   UOpenSSL, UFileStorage, UTime, USettings, UCoreUtils, UMemory,
-  UWIZOperation, UWIZSendPASC, UWIZChangeKey, UWIZEnlistAccountForSale, UWIZDelistAccountFromSale, UCoreObjects;
+  UWIZOperation, UWIZSendPASC, UWIZChangeKey, UWIZEnlistAccountForSale, UWIZDelistAccountFromSale, UWIZChangeAccountInfo, UCoreObjects;
 
 {%region UI Lifecyle}
 
@@ -640,6 +640,19 @@ begin
   wiz.Start(model);
 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);
 begin
   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(out Balance: TBalanceSummary; IncludePending: boolean = False): TArray<TAccount>; overload;
     class function GetUserAccountNumbers: TArray<cardinal>;
+    class function AreAccountBalancesGreaterThan(const ACandidates: array of TAccount; AAmount: int64; var AFaultyAccount: TAccount): boolean; static;
   end;
 
   { 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 OthersFinalizeAndDisplayMessage(const AOperationsTxt, AOperationToString: string; ANoOfOperations: integer; ATotalFee: int64; AOperationsHashTree: TOperationsHashTree; var AErrorMessage: string): boolean; static;
   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 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 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;
 
 
@@ -275,6 +277,23 @@ begin
   Result := LAccs.ToArray;
 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 }
 
@@ -871,7 +890,7 @@ begin
     Result := False;
 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
   LWalletKey: TWalletKey;
   LWalletKeys: TWalletKeys;
@@ -904,8 +923,8 @@ begin
       LPCOperation := nil; // reset LPCOperation to Nil
       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
       begin
@@ -921,28 +940,30 @@ begin
 
       LDoOperation := True;
 
-      if LCurrentAccount.balance > 0 then
-        case ASendPASCMode of
-          akaAllBalance:
+      case ASendPASCMode of
+        akaAllBalance:
+          if LCurrentAccount.balance > 0 then
           begin
-            LAmount := LCurrentAccount.balance - AFee;
-            LFee := AFee;
-          end;
-
-          akaSpecifiedAmount:
-            if LCurrentAccount.balance >= UInt64(AAmount + AFee) then
+            if LCurrentAccount.balance > AFee then
             begin
-              LAmount := AAmount;
+              LAmount := LCurrentAccount.balance - AFee;
               LFee := AFee;
             end
             else
             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
-      else
-        LDoOperation := False;
+          end
+          else
+            LDoOperation := False;
+
+        akaSpecifiedAmount:
+          if LCurrentAccount.balance > UInt64(AFee) then
+            LFee := AFee
+          else
+            LFee := LCurrentAccount.balance;
+      end;
 
       if LDoOperation then
       begin
@@ -1003,6 +1024,7 @@ begin
 
   LWalletKeys := TWallet.Keys;
   LNode := TNode.Node;
+  LSignerAccount := ASignerAccount;
 
   if not TWIZOperationsHelper.ValidateOperationsInput(ASelectedAccounts, LWalletKeys, LNode, AErrorMessage) then
     Exit(False);
@@ -1017,11 +1039,11 @@ begin
     for LAccountIdx := Low(ASelectedAccounts) to High(ASelectedAccounts) do
     begin
       loop_start:
-      LPCOperation := nil; // reset LPCOperation to Nil
+        LPCOperation := nil; // reset LPCOperation to Nil
       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,
         APublicKey)) then
@@ -1070,7 +1092,7 @@ begin
         // Maintain correct signer fee distribution
         if UInt64(LTotalSignerFee) >= LSignerAccount.balance then
           LFee := 0
-        else if LSignerAccount.balance - uint64(LTotalSignerFee) >
+        else if LSignerAccount.balance - UInt64(LTotalSignerFee) >
           UInt64(AFee) then
           LFee := AFee
         else
@@ -1134,6 +1156,7 @@ begin
 
   LWalletKeys := TWallet.Keys;
   LNode := TNode.Node;
+  LSignerAccount := ASignerAccount;
 
   if not TWIZOperationsHelper.ValidateOperationsInput(ASelectedAccounts, LWalletKeys, LNode, AErrorMessage) then
     Exit(False);
@@ -1151,7 +1174,7 @@ begin
       LCurrentAccount := ASelectedAccounts[LAccountIdx];
 
       if not TWIZOperationsHelper.IsOwnerOfWallet(LCurrentAccount, LWalletKeys, LWalletKey, AErrorMessage) then
-         Exit(False);
+        Exit(False);
 
       if TAccountComp.IsAccountForSale(LCurrentAccount.accountInfo) then
       begin
@@ -1184,33 +1207,33 @@ begin
 
       if (LNode.Bank.SafeBox.CurrentProtocol = CT_PROTOCOL_1) then
       begin
-          AErrorMessage := 'This Operation Needs PROTOCOL 2 Active';
-          Exit(False);
+        AErrorMessage := 'This Operation Needs PROTOCOL 2 Active';
+        Exit(False);
       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
         AErrorMessage := Format('Error Encoding Payload Of Selected Account "%s. ", Specific Error Is "%s"', [LCurrentAccount.AccountString, AErrorMessage]);
         Exit(False);
       end;
 
-      if ASignerAccount.balance > AFee then
+      if LSignerAccount.balance > UInt64(AFee) then
         LFee := AFee
       else
-        LFee := ASignerAccount.balance;
+        LFee := LSignerAccount.balance;
 
       case AAccountSaleMode of
         akaPublicSale:
 
           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,
             APublicKey, 0, LWalletKey.PrivateKey, LPayloadEncodedBytes);
 
         akaPrivateSale:
 
           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,
             APublicKey, ALockedUntilBlock, LWalletKey.PrivateKey, LPayloadEncodedBytes)
         else
@@ -1268,6 +1291,7 @@ begin
 
   LWalletKeys := TWallet.Keys;
   LNode := TNode.Node;
+  LSignerAccount := ASignerAccount;
 
   if not TWIZOperationsHelper.ValidateOperationsInput(ASelectedAccounts, LWalletKeys, LNode, AErrorMessage) then
     Exit(False);
@@ -1285,7 +1309,7 @@ begin
       LCurrentAccount := ASelectedAccounts[LAccountIdx];
 
       if not TWIZOperationsHelper.IsOwnerOfWallet(LCurrentAccount, LWalletKeys, LWalletKey, AErrorMessage) then
-         Exit(False);
+        Exit(False);
 
       if not TAccountComp.IsAccountForSale(LCurrentAccount.accountInfo) then
       begin
@@ -1295,41 +1319,41 @@ begin
 
       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);
+        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);
+        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 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;
 
       if (LNode.Bank.SafeBox.CurrentProtocol = CT_PROTOCOL_1) then
       begin
-          AErrorMessage := 'This Operation Needs PROTOCOL 2 Active';
-          Exit(False);
+        AErrorMessage := 'This Operation Needs PROTOCOL 2 Active';
+        Exit(False);
       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
         AErrorMessage := Format('Error Encoding Payload Of Selected Account "%s. ", Specific Error Is "%s"', [LCurrentAccount.AccountString, AErrorMessage]);
         Exit(False);
       end;
 
-      if ASignerAccount.balance > AFee then
+      if LSignerAccount.balance > UInt64(AFee) then
         LFee := AFee
       else
-        LFee := ASignerAccount.balance;
+        LFee := LSignerAccount.balance;
 
       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);
 
       try
@@ -1367,4 +1391,170 @@ begin
   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.

+ 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'
   ClientHeight = 291
   ClientWidth = 510
-  LCLVersion = '1.8.4.0'
   Visible = False
   object gbNewPublicKey: TGroupBox
     Left = 4

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

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

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

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

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

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

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

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

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

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

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

@@ -74,12 +74,9 @@ begin
     Model.Fee.SingleOperationFee := TSettings.DefaultFee;
     if Model.Payload.HasPayload then
       UpdatePath(ptInject, [TWIZOperationPayload_Encryption])
-    else if Length(Model.Account.SelectedAccounts) > 1 then
-      UpdatePath(ptInject, [TWIZOperationSigner_Select])
     else
     begin
-      Model.Signer.SignerAccount := Model.Account.SelectedAccounts[0];
-      Model.Signer.OperationSigningMode := akaPrimary;
+      UpdatePath(ptInject, [TWIZOperationSigner_Select]);
     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'
   ClientHeight = 253
   ClientWidth = 429
-  LCLVersion = '1.8.4.0'
   Visible = False
   object gbTransaction: TGroupBox
     Left = 4

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

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

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

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

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

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

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

@@ -1,94 +1,460 @@
 object WIZEnlistAccountForSale_EnterSeller: TWIZEnlistAccountForSale_EnterSeller
   Left = 0
-  Height = 253
+  Height = 286
   Top = 0
-  Width = 429
-  ActiveControl = edtSellerAcc
+  Width = 450
+  ActiveControl = edtBeneficiaryAcc
   Caption = 'WIZEnlistAccountForSale_EnterSeller'
-  ClientHeight = 253
-  ClientWidth = 429
-  LCLVersion = '1.8.4.0'
+  ClientHeight = 286
+  ClientWidth = 450
   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]
-    Caption = 'Beneficiary Account'
-    ClientHeight = 224
-    ClientWidth = 418
+    Caption = 'Beneficiary'
+    ClientHeight = 104
+    ClientWidth = 427
     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
     end
     object btnSearch: TSpeedButton
-      Left = 152
-      Height = 22
-      Top = 49
-      Width = 23
+      Left = 354
+      Height = 56
+      Top = 32
+      Width = 56
+      Anchors = [akTop, akRight]
       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
     end
-    object lblDestNotice: TLabel
-      Left = 8
+    object lblBeneficiaryDetails: TLabel
+      Left = 304
       Height = 15
       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]
       ParentColor = False
       ParentFont = False
-      Visible = False
     end
   end
 end

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

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

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

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

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

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

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

@@ -6,6 +6,7 @@ object WIZOperationConfirmation: TWIZOperationConfirmation
   Caption = 'WIZOperationConfirmation'
   ClientHeight = 320
   ClientWidth = 511
+  LCLVersion = '1.8.2.0'
   Visible = False
   object gpConfirmOperation: TGroupBox
     Left = 10
@@ -27,24 +28,6 @@ object WIZOperationConfirmation: TWIZOperationConfirmation
       Caption = 'GRID PANEL'
       TabOrder = 0
     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
       Left = 8
       Height = 82
@@ -67,7 +50,7 @@ object WIZOperationConfirmation: TWIZOperationConfirmation
       ParentFont = False
     end
     object lblBeneficiaryAccount: TLabel
-      Left = 280
+      Left = 8
       Height = 15
       Top = 2
       Width = 115
@@ -77,7 +60,7 @@ object WIZOperationConfirmation: TWIZOperationConfirmation
       ParentFont = False
     end
     object lblBenAcc: TLabel
-      Left = 408
+      Left = 130
       Height = 15
       Top = 2
       Width = 53

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

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

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

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

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

@@ -40,10 +40,10 @@ type
     procedure fseFeeChange(Sender: TObject);
   private
     procedure UpdateUI();
-    procedure SetFee(const AValue : int64);
-    function GetFee : Int64;
+    procedure SetFee(const AValue: int64);
+    function GetFee: int64;
   public
-    property Fee : Int64 read GetFee write SetFee;
+    property Fee: int64 read GetFee write SetFee;
     procedure Initialize; override;
     procedure OnPresent; override;
     procedure OnNext; override;
@@ -77,50 +77,70 @@ begin
 end;
 
 procedure TWIZOperationFee_Custom.OnNext;
+var
+  LAllUserAccountsExcludingPending: TArray<TAccount>;
 begin
-  if cbOverrideDefaultFee.Checked then begin
+  if cbOverrideDefaultFee.Checked then
+  begin
     TSettings.DefaultFee := Fee;
     TSettings.Save;
   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;
 
   // TODO: move this out -- inappropriate to have payload/signer considerations here
+
   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
   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;
 
 function TWIZOperationFee_Custom.Validate(out message: ansistring): boolean;
+var
+  LAcc: TAccount;
 begin
   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.';
-    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;
 
-procedure TWIZOperationFee_Custom.SetFee(const AValue : int64);
+procedure TWIZOperationFee_Custom.SetFee(const AValue: int64);
 begin
   fseFee.Value := TAccountComp.FormatMoneyDecimal(AValue);
 end;
 
-function TWIZOperationFee_Custom.GetFee : Int64;
+function TWIZOperationFee_Custom.GetFee: int64;
 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;
 
 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'
   ClientHeight = 253
   ClientWidth = 429
-  LCLVersion = '1.8.4.0'
   Visible = False
   object grpPayload: TGroupBox
     Left = 8

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

@@ -60,13 +60,26 @@ end;
 procedure TWIZOperationPayload_Content.OnNext;
 begin
   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;
 
 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
     (not rbEncryptedWithRecipient.Checked) and (not rbEncryptedWithPassword.Checked) then
   begin
-    message := 'You Must Select An Encryption Option For Payload';
+    message := 'You must select an encryption option for payload';
     Result := False;
     Exit;
   end;
@@ -106,9 +106,11 @@ begin
   case Model.ExecuteOperationType of
     omtChangeInfo:
     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;

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

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

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

@@ -37,6 +37,7 @@ type
     FSelectedAccountsGrid: TVisualGrid;
   public
     procedure OnPresent; override;
+    procedure OnNext; override;
     function Validate(out message: ansistring): boolean; override;
   end;
 
@@ -48,6 +49,7 @@ implementation
 
 uses
   UCommon,
+  USettings,
   UAccounts,
   UCommon.UI,
   UCoreUtils,
@@ -125,6 +127,14 @@ begin
     Format('%s PASC', [TAccountComp.FormatMoney(LTotalBalance)]);
 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;
 var
   LIdx: integer;
@@ -133,6 +143,16 @@ begin
   Result := True;
 
   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:
       for LIdx := Low(model.Account.SelectedAccounts) to High(model.Account.SelectedAccounts) do
       begin
@@ -158,15 +178,6 @@ begin
       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;
 
 { TOperationSelectedDataSource }

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

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

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

@@ -73,7 +73,7 @@ end;
 function TWIZSendPASCWizard.FinishRequested(out message: ansistring): boolean;
 begin
   // 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
   TWallet.Keys.LockWallet;
 end;

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

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

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

@@ -47,8 +47,6 @@ type
     procedure txtRecipientChange(Sender: TObject);
     procedure UpdateUI();
 
-
-
   public
     procedure OnPresent; override;
     procedure OnNext; override;
@@ -73,7 +71,6 @@ uses
   UCommon.Collections,
   Generics.Collections,
   UWIZOperationFee_Custom,
-  UWIZOperationSigner_Select,
   UWIZOperationPayload_Encryption;
 
 { TWIZSendPASC_Details }
@@ -91,7 +88,8 @@ begin
   txtRecipient.SetFocus;
 
   // Quantity section
-  if Length(Model.Account.SelectedAccounts) > 1 then begin
+  if Length(Model.Account.SelectedAccounts) > 1 then
+  begin
     chkCustomFee.Checked := True;
     chkCustomFee.Enabled := False;
   end;
@@ -104,19 +102,23 @@ var
 begin
   // Recipient section
   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
-  if chkSendAll.Checked then begin
+  if chkSendAll.Checked then
+  begin
     txtAmount.Text := 'ALL BALANCE';
     txtAmount.Enabled := False;
     Model.SendPASC.SendPASCMode := akaAllBalance;
-  end else begin
+  end
+  else
+  begin
     txtAmount.Enabled := True;
     txtAmount.Text := IIF(Model.SendPASC.SingleAmountToSend = 0, '', TAccountComp.FormatMoney(Model.SendPASC.SingleAmountToSend));
     Model.SendPASC.SendPASCMode := akaSpecifiedAmount;
@@ -127,20 +129,23 @@ procedure TWIZSendPASC_Details.OnNext;
 var
   LAccountNumber: cardinal;
   LAccount: TAccount;
-  LWizStepsToInject : TList<TComponentClass>;
-  LDisposables : TDisposables;
+  LWizStepsToInject: TList<TComponentClass>;
+  LDisposables: TDisposables;
 begin
-  LWizStepsToInject := LDisposables.AddObject( TList<TComponentClass>.Create ) as TList<TComponentClass>;
+  LWizStepsToInject := LDisposables.AddObject(TList<TComponentClass>.Create) as TList<TComponentClass>;
 
   // Recipient section
   TAccountComp.AccountTxtNumberToAccountNumber(txtRecipient.Text, LAccountNumber);
   Model.SendPASC.DestinationAccount := TNode.Node.Operations.SafeBoxTransaction.account(LAccountNumber);
 
   // Quantity section
-  if chkSendAll.Checked then begin
+  if chkSendAll.Checked then
+  begin
     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;
     TAccountComp.TxtToMoney(txtAmount.Text, Model.SendPASC.SingleAmountToSend);
   end;
@@ -156,9 +161,8 @@ begin
     LWizStepsToInject.Add(TWIZOperationPayload_Encryption);
 
   // 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.OperationSigningMode := akaPrimary;
   end;
@@ -183,48 +187,49 @@ var
   LAccount: TAccount;
 begin
   Result := True;
-  message := '';
   // 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;
 
-  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;
 
   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;
 
   // 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;
 
-    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;
 
-    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];
-      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;

+ 12 - 1
src/pascalcoin_wallet_experimental.lpi

@@ -82,7 +82,7 @@
         <PackageName Value="LCL"/>
       </Item1>
     </RequiredPackages>
-    <Units Count="100">
+    <Units Count="102">
       <Unit0>
         <Filename Value="pascalcoin_wallet_experimental.dpr"/>
         <IsPartOfProject Value="True"/>
@@ -625,6 +625,17 @@
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </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>
   </ProjectOptions>
   <CompilerOptions>