2
0
Эх сурвалжийг харах

major restructuring of SendPASC UI according to specification.

Ugochukwu Mmaduekwe 7 жил өмнө
parent
commit
0b9dc9b15f
33 өөрчлөгдсөн 1538 нэмэгдсэн , 705 устгасан
  1. 1 1
      src/gui/UCTRLWallet.lfm
  2. 21 5
      src/gui/UCTRLWallet.pas
  3. 2 2
      src/gui/wizards/UWIZChangeAccountPrivateKey.pas
  4. 0 1
      src/gui/wizards/UWIZChangeAccountPrivateKey_TransactionPayload.lfm
  5. 2 2
      src/gui/wizards/UWIZChangeAccountPrivateKey_TransactionPayload.pas
  6. 82 71
      src/gui/wizards/UWIZModels.pas
  7. 31 25
      src/gui/wizards/UWIZSendPASC.pas
  8. 3 3
      src/gui/wizards/UWIZSendPASC_ConfirmSender.lfm
  9. 11 11
      src/gui/wizards/UWIZSendPASC_ConfirmSender.pas
  10. 0 1
      src/gui/wizards/UWIZSendPASC_Confirmation.lfm
  11. 7 3
      src/gui/wizards/UWIZSendPASC_Confirmation.pas
  12. 62 0
      src/gui/wizards/UWIZSendPASC_EnterQuantity.lfm
  13. 138 0
      src/gui/wizards/UWIZSendPASC_EnterQuantity.pas
  14. 56 90
      src/gui/wizards/UWIZSendPASC_EnterRecipient.lfm
  15. 168 0
      src/gui/wizards/UWIZSendPASC_EnterRecipient.pas
  16. 19 0
      src/gui/wizards/UWIZSendPASC_FeeOverride.lfm
  17. 0 259
      src/gui/wizards/UWIZSendPASC_Transaction.pas
  18. 0 98
      src/gui/wizards/UWIZSendPASC_TransactionPayload.lfm
  19. 0 84
      src/gui/wizards/UWIZSendPASC_TransactionPayload.pas
  20. 2 2
      src/gui/wizards/UWIZTransferAccount.pas
  21. 1 1
      src/gui/wizards/UWIZTransferAccount_TransactionPayload.lfm
  22. 2 2
      src/gui/wizards/UWIZTransferAccount_TransactionPayload.pas
  23. 79 0
      src/gui/wizards/generic wizards/UWIZFeeOverride.lfm
  24. 105 0
      src/gui/wizards/generic wizards/UWIZFeeOverride.pas
  25. 48 0
      src/gui/wizards/generic wizards/UWIZPayloadContentOverride.lfm
  26. 53 0
      src/gui/wizards/generic wizards/UWIZPayloadContentOverride.pas
  27. 107 0
      src/gui/wizards/generic wizards/UWIZPayloadOverride.lfm
  28. 101 0
      src/gui/wizards/generic wizards/UWIZPayloadOverride.pas
  29. 56 0
      src/gui/wizards/generic wizards/UWIZPayloadPasswordOverride.lfm
  30. 66 0
      src/gui/wizards/generic wizards/UWIZPayloadPasswordOverride.pas
  31. 71 0
      src/gui/wizards/generic wizards/UWIZSelectSignerOverride.lfm
  32. 126 0
      src/gui/wizards/generic wizards/UWIZSelectSignerOverride.pas
  33. 118 44
      src/pascalcoin_wallet.lpi

+ 1 - 1
src/gui/UCTRLWallet.lfm

@@ -10,7 +10,7 @@ object CTRLWallet: TCTRLWallet
   ClientWidth = 1151
   OnCreate = FormCreate
   OnResize = FormResize
-  LCLVersion = '1.8.2.0'
+  LCLVersion = '1.8.1.0'
   Visible = False
   object PairSplitter1: TPairSplitter
     Left = 0

+ 21 - 5
src/gui/UCTRLWallet.pas

@@ -609,20 +609,36 @@ end;
 
 procedure TCTRLWallet.OnPrepareAccountPopupMenu(Sender: TObject;
   constref ASelection: TVisualGridSelection; out APopupMenu: TPopupMenu);
+var
+  accNo: cardinal;
+  account: TAccount;
 begin
   miSep1.Visible := ASelection.RowCount = 1;
   miAccountInfo.Visible := ASelection.RowCount = 1;
+  miSendPASC.Caption :=
+    IIF(ASelection.RowCount = 1, 'Send PASC', 'Send All PASC');
   miTransferAccounts.Caption :=
-    IIF(ASelection.RowCount = 1, 'Transfer Account', 'Transfer Accounts');
+    IIF(ASelection.RowCount = 1, 'Transfer Account', 'Transfer All Account');
   miChangeAccountsPrivateKey.Caption :=
-    IIF(ASelection.RowCount = 1, 'Change Account Private Key',
-    'Change Accounts Private Key');
+    IIF(ASelection.RowCount = 1, 'Change Account Private Key', 'Change All Account Private Key');
   miEnlistAccountsForSale.Caption :=
     IIF(ASelection.RowCount = 1, 'Enlist Account For Sale',
-    'Enlist Accounts For Sale');
+    'Enlist All Account For Sale');
   miDelistAccountsFromSale.Caption :=
     IIF(ASelection.RowCount = 1, 'Delist Account From Sale',
-    'Delist Accounts From Sale');
+    'Delist All Account From Sale');
+  if ASelection.RowCount = 1 then
+  begin
+    if not TAccountComp.AccountTxtNumberToAccountNumber(
+      FAccountsGrid.Rows[ASelection.Row].Account, accNo) then
+    begin
+      raise Exception.Create('Error Parsing Account Number From Grid');
+    end;
+    account := TNode.Node.Operations.SafeBoxTransaction.Account(accNo);
+    miEnlistAccountsForSale.Visible :=
+      IIF(TAccountComp.IsAccountForSale(account.accountInfo), False, True);
+    miDelistAccountsFromSale.Visible := not miEnlistAccountsForSale.Visible;
+  end;
   APopupMenu := mnuAccountsPopup;
 end;
 

+ 2 - 2
src/gui/wizards/UWIZChangeAccountPrivateKey.pas

@@ -69,7 +69,7 @@ begin
     end;
     case Model.ChangeAccountPrivateKeyModel.PayloadEncryptionMode of
 
-      akaEncryptWithOldEC:
+      akaEncryptWithSender:
       begin
         // Use sender
         errors := 'Error encrypting';
@@ -78,7 +78,7 @@ begin
         valid := payload_encrypted <> '';
       end;
 
-      akaEncryptWithEC:
+      akaEncryptWithReceiver:
       begin
         errors := 'Error encrypting';
 

+ 0 - 1
src/gui/wizards/UWIZChangeAccountPrivateKey_TransactionPayload.lfm

@@ -7,7 +7,6 @@ object WIZChangeAccountPrivateKey_TransactionPayload: TWIZChangeAccountPrivateKe
   Caption = 'Form1'
   ClientHeight = 253
   ClientWidth = 429
-  LCLVersion = '1.8.2.0'
   Visible = False
   object grpPayload: TGroupBox
     Left = 8

+ 2 - 2
src/gui/wizards/UWIZChangeAccountPrivateKey_TransactionPayload.pas

@@ -51,12 +51,12 @@ begin
   Model.ChangeAccountPrivateKeyModel.Payload := mmoPayload.Lines.Text;
   if rbEncryptedWithOldEC.Checked then
   begin
-    Model.ChangeAccountPrivateKeyModel.PayloadEncryptionMode := akaEncryptWithOldEC;
+    Model.ChangeAccountPrivateKeyModel.PayloadEncryptionMode := akaEncryptWithSender;
   end
   else
   if rbEncryptedWithEC.Checked then
   begin
-    Model.ChangeAccountPrivateKeyModel.PayloadEncryptionMode := akaEncryptWithEC;
+    Model.ChangeAccountPrivateKeyModel.PayloadEncryptionMode := akaEncryptWithReceiver;
   end
   else
   if rbEncryptedWithPassword.Checked then

+ 82 - 71
src/gui/wizards/UWIZModels.pas

@@ -7,7 +7,8 @@ unit UWIZModels;
 
 interface
 
-uses Classes, SysUtils, UWizard, UAccounts, UBlockChain, UWallet, UBaseTypes, Generics.Defaults;
+uses Classes, SysUtils, UWizard, UAccounts, UBlockChain, UWallet,
+  UBaseTypes, Generics.Defaults;
 
 type
 
@@ -18,84 +19,95 @@ type
   { TFRMAddKeyModel }
 
   TWIZAddKeyModel = class(TComponent)
-    public
-      Name : String;
-      KeyText : String;
-      Password : String;
-      EncryptionTypeNID : word;
-      Action : TWIZAddKeyAction;
+  public
+    Name: string;
+    KeyText: string;
+    Password: string;
+    EncryptionTypeNID: word;
+    Action: TWIZAddKeyAction;
   end;
 
   { TWIZOperationsModel }
 
-  TWIZOperationsModel = class (TComponent)
-    public type
-
-       { TModelType }
-
-       TModelType = (omtSendPasc, omtTransferAccount, omtChangeAccountPrivateKey, omtAddKey);
-
-       { TPayloadEncryptionMode }
-
-       TPayloadEncryptionMode = (akaEncryptWithOldEC, akaEncryptWithEC, akaEncryptWithPassword, akaNotEncrypt);
-
-       { TSendPASCModel }
-
-       TSendPASCModel = class(TComponent)
-       public
-         SelectedIndex: integer;
-         DefaultFee: int64;
-         AmountToSend, Payload, EncryptionPassword: string;
-         EncodedPayload: TRawBytes;
-         SignerAccount, DestinationAccount: TAccount;
-         SelectedAccounts: TArray<TAccount>;
-         PayloadEncryptionMode: TPayloadEncryptionMode;
-       end;
-
-       { TTransferAccountModel }
-
-       TTransferAccountModel = class(TComponent)
-       public
-         DefaultFee: int64;
-         NewPublicKey, Payload, EncryptionPassword: string;
-         SelectedIndex: integer;
-         AccountKey: TAccountKey;
-         EncodedPayload: TRawBytes;
-         SignerAccount: TAccount;
-         SelectedAccounts: TArray<TAccount>;
-         PayloadEncryptionMode: TPayloadEncryptionMode;
-       end;
-
-       { TChangeAccountPrivateKeyModel }
-
-       TChangeAccountPrivateKeyModel = class(TComponent)
-       public
-         DefaultFee: int64;
-         NewPublicKey, Payload, EncryptionPassword: string;
-         SelectedIndex, PrivateKeySelectedIndex: integer;
-         NewWalletKey: TWalletKey;
-         EncodedPayload: TRawBytes;
-         SignerAccount: TAccount;
-         SelectedAccounts: TArray<TAccount>;
-         PayloadEncryptionMode: TPayloadEncryptionMode;
-       end;
-
-    private
-      FModelType : TModelType;
-      FSendModel : TSendPASCModel;
-      FTransferAccountModel : TTransferAccountModel;
-      FChangeAccountPrivateKeyModel : TChangeAccountPrivateKeyModel;
+  TWIZOperationsModel = class(TComponent)
+  public
+    type
+
+    { TModelType }
+
+    TModelType = (omtSendPasc, omtTransferAccount, omtChangeAccountPrivateKey,
+      omtAddKey);
+
+    { TPayloadEncryptionMode }
+
+    TPayloadEncryptionMode = (akaEncryptWithSender, akaEncryptWithReceiver,
+      akaEncryptWithPassword, akaNotEncrypt);
+
+    { TOperationSigningMode }
+
+    TOperationSigningMode = (akaPrimary, akaSecondary);
+
+    { TSendPASCModel }
+
+    TSendPASCModel = class(TComponent)
     public
-      constructor Create(AOwner : TComponent; AType : TModelType);  overload;
-      property ModelType : TModelType read FModelType;
-      property SendPASCModel : TSendPASCModel read FSendModel;
-      property TransferAccountModel : TTransferAccountModel read FTransferAccountModel;
-      property ChangeAccountPrivateKeyModel : TChangeAccountPrivateKeyModel read FChangeAccountPrivateKeyModel;
+      SelectedIndex: integer;
+      SingleOperationFee, SingleAmountToSend: int64;
+      HasPayload: boolean;
+      PayloadContent, EncryptionPassword: string;
+      EncodedPayload: TRawBytes;
+      SignerAccount, DestinationAccount: TAccount;
+      SelectedAccounts: TArray<TAccount>;
+      PayloadEncryptionMode: TPayloadEncryptionMode;
+      OperationSigningMode: TOperationSigningMode;
+    end;
+
+    { TTransferAccountModel }
+
+    TTransferAccountModel = class(TComponent)
+    public
+      DefaultFee: int64;
+      NewPublicKey, Payload, EncryptionPassword: string;
+      SelectedIndex: integer;
+      AccountKey: TAccountKey;
+      EncodedPayload: TRawBytes;
+      SignerAccount: TAccount;
+      SelectedAccounts: TArray<TAccount>;
+      PayloadEncryptionMode: TPayloadEncryptionMode;
+    end;
+
+    { TChangeAccountPrivateKeyModel }
+
+    TChangeAccountPrivateKeyModel = class(TComponent)
+    public
+      DefaultFee: int64;
+      NewPublicKey, Payload, EncryptionPassword: string;
+      SelectedIndex, PrivateKeySelectedIndex: integer;
+      NewWalletKey: TWalletKey;
+      EncodedPayload: TRawBytes;
+      SignerAccount: TAccount;
+      SelectedAccounts: TArray<TAccount>;
+      PayloadEncryptionMode: TPayloadEncryptionMode;
+    end;
+
+  private
+    FModelType: TModelType;
+    FSendModel: TSendPASCModel;
+    FTransferAccountModel: TTransferAccountModel;
+    FChangeAccountPrivateKeyModel: TChangeAccountPrivateKeyModel;
+  public
+    constructor Create(AOwner: TComponent; AType: TModelType); overload;
+    property ModelType: TModelType read FModelType;
+    property SendPASCModel: TSendPASCModel read FSendModel;
+    property TransferAccountModel: TTransferAccountModel read FTransferAccountModel;
+    property ChangeAccountPrivateKeyModel: TChangeAccountPrivateKeyModel
+      read FChangeAccountPrivateKeyModel;
   end;
 
 implementation
 
-constructor TWIZOperationsModel.Create(AOwner : TComponent; AType : TWIZOperationsModel.TModelType);
+constructor TWIZOperationsModel.Create(AOwner: TComponent;
+  AType: TWIZOperationsModel.TModelType);
 begin
   inherited Create(AOwner);
   FModelType := AType;
@@ -105,4 +117,3 @@ begin
 end;
 
 end.
-

+ 31 - 25
src/gui/wizards/UWIZSendPASC.pas

@@ -22,9 +22,11 @@ type
 
   TWIZSendPASCWizard = class(TWizard<TWIZOperationsModel>)
   private
-    function UpdatePayload(const SenderAccount: TAccount; var errors: string): boolean;
+    function UpdatePayload(const SenderAccount: TAccount;
+      var errors: string): boolean;
     function UpdateOperationOptions(var errors: string): boolean;
-    function UpdateOpTransaction(const SenderAccount: TAccount; var DestAccount: TAccount; var amount: int64; var errors: string): boolean;
+    function UpdateOpTransaction(const SenderAccount: TAccount;
+      var DestAccount: TAccount; var amount: int64; var errors: string): boolean;
     procedure SendPASC();
   public
     constructor Create(AOwner: TComponent); override;
@@ -44,7 +46,7 @@ uses
   UWallet,
   UECIES,
   UAES,
-  UWIZSendPASC_Start,
+  UWIZSendPASC_ConfirmSender,
   UWIZSendPASC_Confirmation;
 
 { TWIZSendPASCWizard }
@@ -79,7 +81,9 @@ begin
       iWallet := TWallet.Keys.IndexOfAccountKey(sender_account.accountInfo.accountKey);
       if (iWallet < 0) then
       begin
-        errors := 'Private key of account ' + TAccountComp.AccountNumberToAccountTxtNumber(sender_account.account) + ' not found in wallet';
+        errors := 'Private key of account ' +
+          TAccountComp.AccountNumberToAccountTxtNumber(sender_account.account) +
+          ' not found in wallet';
         Exit;
       end;
       wk := TWallet.Keys.Key[iWallet];
@@ -93,7 +97,8 @@ begin
         else
         begin
           errors := 'Only public key of account ' +
-            TAccountComp.AccountNumberToAccountTxtNumber(sender_account.account) + ' found in wallet. You cannot operate with this account';
+            TAccountComp.AccountNumberToAccountTxtNumber(sender_account.account) +
+            ' found in wallet. You cannot operate with this account';
         end;
         Exit;
       end;
@@ -104,7 +109,8 @@ begin
   UpdatePayload(sender_account, e);
 end;
 
-function TWIZSendPASCWizard.UpdateOpTransaction(const SenderAccount: TAccount; var DestAccount: TAccount; var amount: int64; var errors: string): boolean;
+function TWIZSendPASCWizard.UpdateOpTransaction(const SenderAccount: TAccount;
+  var DestAccount: TAccount; var amount: int64; var errors: string): boolean;
 var
   c: cardinal;
 begin
@@ -115,11 +121,7 @@ begin
 
   if Length(Model.SendPASCModel.SelectedAccounts) = 1 then
   begin
-    if not TAccountComp.TxtToMoney(Model.SendPASCModel.AmountToSend, amount) then
-    begin
-      errors := 'Invalid amount (' + Model.SendPASCModel.AmountToSend + ')';
-      Exit;
-    end;
+    amount := Model.SendPASCModel.SingleAmountToSend;
   end
   else
   begin
@@ -134,7 +136,7 @@ begin
 
   if (Length(Model.SendPASCModel.SelectedAccounts) = 1) then
   begin
-    if (SenderAccount.balance < (amount + Model.SendPASCModel.DefaultFee)) then
+    if (SenderAccount.balance < (amount + Model.SendPASCModel.SingleOperationFee)) then
     begin
       errors := 'Insufficient funds';
       Exit;
@@ -186,8 +188,8 @@ begin
       wk := TWallet.Keys.Key[i];
       dooperation := True;
       // Default fee
-      if account.balance > uint64(Model.SendPASCModel.DefaultFee) then
-        _fee := Model.SendPASCModel.DefaultFee
+      if account.balance > uint64(Model.SendPASCModel.SingleOperationFee) then
+        _fee := Model.SendPASCModel.SingleOperationFee
       else
         _fee := account.balance;
 
@@ -197,10 +199,10 @@ begin
       begin
         if account.balance > 0 then
         begin
-          if account.balance > Model.SendPASCModel.DefaultFee then
+          if account.balance > Model.SendPASCModel.SingleOperationFee then
           begin
-            _amount := account.balance - Model.SendPASCModel.DefaultFee;
-            _fee := Model.SendPASCModel.DefaultFee;
+            _amount := account.balance - Model.SendPASCModel.SingleOperationFee;
+            _fee := Model.SendPASCModel.SingleOperationFee;
           end
           else
           begin
@@ -222,7 +224,8 @@ begin
         Inc(_totalamount, _amount);
         Inc(_totalfee, _fee);
       end;
-      operationstxt := 'Transaction to ' + TAccountComp.AccountNumberToAccountTxtNumber(destAccount.account);
+      operationstxt := 'Transaction to ' + TAccountComp.AccountNumberToAccountTxtNumber(
+        destAccount.account);
 
       if Assigned(op) and (dooperation) then
       begin
@@ -239,7 +242,8 @@ begin
 
     if (Length(Model.SendPASCModel.SelectedAccounts) > 1) then
     begin
-      auxs := 'Total amount that dest will receive: ' + TAccountComp.FormatMoney(_totalamount) + #10;
+      auxs := 'Total amount that dest will receive: ' + TAccountComp.FormatMoney(
+        _totalamount) + #10;
       if Application.MessageBox(
         PChar('Execute ' + IntToStr(Length(Model.SendPASCModel.SelectedAccounts)) +
         ' operations?' + #10 + 'Operation: ' + operationstxt + #10 +
@@ -312,7 +316,8 @@ begin
   end;
 end;
 
-function TWIZSendPASCWizard.UpdatePayload(const SenderAccount: TAccount; var errors: string): boolean;
+function TWIZSendPASCWizard.UpdatePayload(const SenderAccount: TAccount;
+  var errors: string): boolean;
 var
   valid: boolean;
   payload_encrypted, payload_u: string;
@@ -322,7 +327,7 @@ begin
   payload_encrypted := '';
   Model.SendPASCModel.EncodedPayload := '';
   errors := 'Unknown error';
-  payload_u := Model.SendPASCModel.Payload;
+  payload_u := Model.SendPASCModel.PayloadContent;
 
   try
     if (payload_u = '') then
@@ -332,7 +337,7 @@ begin
     end;
     case Model.SendPASCModel.PayloadEncryptionMode of
 
-      akaEncryptWithOldEC:
+      akaEncryptWithSender:
       begin
         // Use sender
         errors := 'Error encrypting';
@@ -341,7 +346,7 @@ begin
         valid := payload_encrypted <> '';
       end;
 
-      akaEncryptWithEC:
+      akaEncryptWithReceiver:
       begin
         // With dest public key
         errors := 'Error encrypting';
@@ -352,7 +357,8 @@ begin
 
       akaEncryptWithPassword:
       begin
-        payload_encrypted := TAESComp.EVP_Encrypt_AES256(payload_u, Model.SendPASCModel.EncryptionPassword);
+        payload_encrypted := TAESComp.EVP_Encrypt_AES256(
+          payload_u, Model.SendPASCModel.EncryptionPassword);
         valid := payload_encrypted <> '';
       end;
 
@@ -387,7 +393,7 @@ end;
 
 constructor TWIZSendPASCWizard.Create(AOwner: TComponent);
 begin
-  inherited Create(AOwner, [TWIZSendPASC_Start, TWIZSendPASC_Confirmation]);
+  inherited Create(AOwner, [TWIZSendPASC_ConfirmSender, TWIZSendPASC_Confirmation]);
   TitleText := 'Send PASC';
   FinishText := 'Send PASC';
 end;

+ 3 - 3
src/gui/wizards/UWIZSendPASC_Start.lfm → src/gui/wizards/UWIZSendPASC_ConfirmSender.lfm

@@ -1,12 +1,12 @@
-object WIZSendPASC_Start: TWIZSendPASC_Start
+object WIZSendPASC_ConfirmSender: TWIZSendPASC_ConfirmSender
   Left = 0
   Height = 261
   Top = 0
   Width = 429
-  Caption = 'WIZSendPASC_Start'
+  Caption = 'WIZSendPASC_ConfirmSender'
   ClientHeight = 261
   ClientWidth = 429
-  LCLVersion = '1.8.2.0'
+  LCLVersion = '1.8.1.0'
   Visible = False
   object gpSender: TGroupBox
     Left = 4

+ 11 - 11
src/gui/wizards/UWIZSendPASC_Start.pas → src/gui/wizards/UWIZSendPASC_ConfirmSender.pas

@@ -1,15 +1,15 @@
-unit UWIZSendPASC_Start;
+unit UWIZSendPASC_ConfirmSender;
 
 {$mode delphi}
 
-{ Copyright (c) 2018 by Ugochukwu Mmaduekwe
+{ Copyright (c) 2018 Sphere 10 Software (http://www.sphere10.com/)
 
   Distributed under the MIT software license, see the accompanying file LICENSE
   or visit http://www.opensource.org/licenses/mit-license.php.
 
   Acknowledgements:
-    Herman Schoenfeld <[email protected]>: added grid-based layout
-
+  Ugochukwu Mmaduekwe - main developer
+  Herman Schoenfeld - designer
 }
 
 interface
@@ -17,13 +17,13 @@ interface
 uses
   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
   ExtCtrls, UVisualGrid, UCommon.Data, UCellRenderers,
-  UWizard, UWIZSendPASC, UWIZSendPASC_Transaction, UWIZSendPASC_Confirmation, UWIZModels;
+  UWizard, UWIZSendPASC, UWIZSendPASC_EnterRecipient, UWIZSendPASC_Confirmation, UWIZModels;
 
 type
 
-  { TWIZSendPASC_Start }
+  { TWIZSendPASC_ConfirmSender }
 
-  TWIZSendPASC_Start = class(TWizardForm<TWIZOperationsModel>)
+  TWIZSendPASC_ConfirmSender = class(TWizardForm<TWIZOperationsModel>)
     gpSender: TGroupBox;
     paGrid: TPanel;
   private
@@ -53,9 +53,9 @@ type
       procedure FetchAll(const AContainer : TList<TAccount>); override;
   end;
 
-{ TWIZSendPASC_Start }
+{ TWIZSendPASC_ConfirmSender }
 
-procedure TWIZSendPASC_Start.OnPresent;
+procedure TWIZSendPASC_ConfirmSender.OnPresent;
 var
   data : TAccountSenderDataSource;
 begin
@@ -92,9 +92,9 @@ begin
   paGrid.AddControlDockCenter(FSendersGrid);
 end;
 
-procedure TWIZSendPASC_Start.OnNext;
+procedure TWIZSendPASC_ConfirmSender.OnNext;
 begin
-  UpdatePath(ptReplaceAllNext, [TWIZSendPASC_Transaction, TWIZSendPASC_Confirmation]);
+  UpdatePath(ptReplaceAllNext, [TWIZSendPASC_EnterRecipient, TWIZSendPASC_Confirmation]);
 end;
 
 { TAccountSenderDataSource }

+ 0 - 1
src/gui/wizards/UWIZSendPASC_Confirmation.lfm

@@ -6,7 +6,6 @@ object WIZSendPASC_Confirmation: TWIZSendPASC_Confirmation
   Caption = 'WIZSendPASC_Confirmation'
   ClientHeight = 253
   ClientWidth = 429
-  LCLVersion = '1.8.2.0'
   Visible = False
   object GroupBox1: TGroupBox
     Left = 10

+ 7 - 3
src/gui/wizards/UWIZSendPASC_Confirmation.pas

@@ -3,10 +3,14 @@ unit UWIZSendPASC_Confirmation;
 {$mode delphi}
 {$modeswitch nestedprocvars}
 
-{ Copyright (c) 2018 by Ugochukwu Mmaduekwe
+{ Copyright (c) 2018 Sphere 10 Software (http://www.sphere10.com/)
 
   Distributed under the MIT software license, see the accompanying file LICENSE
   or visit http://www.opensource.org/licenses/mit-license.php.
+
+  Acknowledgements:
+  Ugochukwu Mmaduekwe - main developer
+  Herman Schoenfeld - designer
 }
 
 interface
@@ -118,9 +122,9 @@ begin
    else if ABindingName = 'Balance' then
      Result := TAccountComp.FormatMoney(AItem.Balance)
    else if ABindingName = 'AmountToSend' then
-     Result := Model.AmountToSend
+     Result := TAccountComp.FormatMoney(Model.SingleAmountToSend)
      else if ABindingName = 'Fee' then
-     Result := TAccountComp.FormatMoney(Model.DefaultFee)
+     Result := TAccountComp.FormatMoney(Model.SingleOperationFee)
    else raise Exception.Create(Format('Field not found [%s]', [ABindingName]));
 end;
 

+ 62 - 0
src/gui/wizards/UWIZSendPASC_EnterQuantity.lfm

@@ -0,0 +1,62 @@
+object WIZSendPASC_EnterQuantity: TWIZSendPASC_EnterQuantity
+  Left = 0
+  Height = 253
+  Top = 0
+  Width = 429
+  ActiveControl = edtAmt
+  Caption = 'WIZSendPASC_EnterQuantity'
+  ClientHeight = 253
+  ClientWidth = 429
+  Visible = False
+  object gbQuantity: TGroupBox
+    Left = 16
+    Height = 232
+    Top = 8
+    Width = 400
+    Caption = 'Transaction Quantity'
+    ClientHeight = 212
+    ClientWidth = 396
+    TabOrder = 0
+    object edtAmt: TEdit
+      Left = 8
+      Height = 23
+      Top = 40
+      Width = 160
+      TabOrder = 0
+    end
+    object lblQuantityNotice: TLabel
+      Left = 8
+      Height = 15
+      Top = 7
+      Width = 217
+      Caption = 'Please enter the quantity of PASC to send'
+      ParentColor = False
+    end
+    object chkallfunds: TCheckBox
+      Left = 184
+      Height = 19
+      Top = 42
+      Width = 166
+      Caption = 'Send all funds in account(s)'
+      OnChange = chkallfundsChange
+      TabOrder = 1
+    end
+    object chkChooseFee: TCheckBox
+      Left = 8
+      Height = 19
+      Top = 80
+      Width = 226
+      Caption = 'Let me choose fee''s for this transaction'
+      TabOrder = 2
+    end
+    object chkAttachPayload: TCheckBox
+      Left = 8
+      Height = 19
+      Top = 110
+      Width = 303
+      Caption = 'I want to attach a message payload to this transaction'
+      OnChange = chkAttachPayloadChange
+      TabOrder = 3
+    end
+  end
+end

+ 138 - 0
src/gui/wizards/UWIZSendPASC_EnterQuantity.pas

@@ -0,0 +1,138 @@
+unit UWIZSendPASC_EnterQuantity;
+
+{$mode delphi}
+{$modeswitch nestedprocvars}
+
+{ Copyright (c) 2018 Sphere 10 Software (http://www.sphere10.com/)
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  Acknowledgements:
+  Ugochukwu Mmaduekwe - main developer
+  Herman Schoenfeld - designer
+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+  ExtCtrls, Buttons, UCommon, UCommon.Collections, UWallet,
+  UFRMAccountSelect, UNode, UWizard, UWIZSendPASC, UWIZFeeOverride, UWIZPayloadOverride, UWIZSelectSignerOverride,
+  UWIZSendPASC_Confirmation, UWIZModels;
+
+type
+
+  { TWIZSendPASC_EnterQuantity }
+
+  TWIZSendPASC_EnterQuantity = class(TWizardForm<TWIZOperationsModel>)
+    chkChooseFee: TCheckBox;
+    chkAttachPayload: TCheckBox;
+    chkallfunds: TCheckBox;
+    edtAmt: TEdit;
+    gbQuantity: TGroupBox;
+    lblQuantityNotice: TLabel;
+    procedure chkAttachPayloadChange(Sender: TObject);
+    procedure UpdateUI();
+    procedure chkallfundsChange(Sender: TObject);
+
+
+  public
+    procedure OnPresent; override;
+    procedure OnNext; override;
+    function Validate(out message: ansistring): boolean; override;
+  end;
+
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UAccounts, UUserInterface, USettings;
+
+{ TWIZSendPASC_EnterQuantity }
+
+procedure TWIZSendPASC_EnterQuantity.UpdateUI();
+begin
+  if chkallfunds.Checked then
+  begin
+    edtAmt.Text := 'ALL BALANCE';
+    edtAmt.Enabled := False;
+  end
+  else
+  begin
+    edtAmt.Text := TAccountComp.FormatMoney(0);
+    edtAmt.Enabled := True;
+  end;
+
+  Model.SendPASCModel.HasPayload := IIF(chkAttachPayload.Checked, True, False);
+
+end;
+
+procedure TWIZSendPASC_EnterQuantity.chkallfundsChange(Sender: TObject);
+begin
+  UpdateUI();
+end;
+
+procedure TWIZSendPASC_EnterQuantity.OnPresent;
+begin
+  edtAmt.Text := TAccountComp.FormatMoney(0);
+end;
+
+procedure TWIZSendPASC_EnterQuantity.chkAttachPayloadChange(Sender: TObject);
+begin
+  UpdateUI();
+end;
+
+procedure TWIZSendPASC_EnterQuantity.OnNext;
+var
+  amount: Int64;
+begin
+  Model.SendPASCModel.HasPayload := chkAttachPayload.Checked;
+  if chkallfunds.Checked then
+  begin
+    Model.SendPASCModel.SingleAmountToSend := 0; // all balance
+  end
+  else
+  begin
+    TAccountComp.TxtToMoney(edtAmt.Text, Model.SendPASCModel.SingleAmountToSend);
+  end;
+
+  if chkChooseFee.Checked then
+  begin
+    UpdatePath(ptReplaceAllNext, [TWIZFeeOverride, TWIZSendPASC_Confirmation]);
+  end
+  else
+  begin
+    Model.SendPASCModel.SingleOperationFee := TSettings.DefaultFee;
+    if Model.SendPASCModel.HasPayload then
+    begin
+      UpdatePath(ptReplaceAllNext, [TWIZPayloadOverride, TWIZSendPASC_Confirmation]);
+    end
+    else
+    begin
+      UpdatePath(ptReplaceAllNext, [TWIZSelectSignerOverride, TWIZSendPASC_Confirmation]);
+    end;
+  end;
+
+end;
+
+function TWIZSendPASC_EnterQuantity.Validate(out message: ansistring): boolean;
+var
+  amount: int64;
+begin
+  Result := True;
+  if not chkallfunds.Checked then
+  begin
+    if not TAccountComp.TxtToMoney(edtAmt.Text, amount) then
+    begin
+      message := 'Invalid amount (' + edtAmt.Text + ')';
+      Result := False;
+      Exit;
+    end;
+  end;
+
+end;
+
+end.

+ 56 - 90
src/gui/wizards/UWIZSendPASC_Transaction.lfm → src/gui/wizards/UWIZSendPASC_EnterRecipient.lfm

@@ -1,80 +1,34 @@
-object WIZSendPASC_Transaction: TWIZSendPASC_Transaction
+object WIZSendPASC_EnterRecipient: TWIZSendPASC_EnterRecipient
   Left = 0
   Height = 253
   Top = 0
   Width = 429
-  ActiveControl = cbSignerAccount
-  Caption = 'WIZSendPASC_Transaction'
+  ActiveControl = edtDestAcc
+  Caption = 'WIZSendPASC_EnterRecipient'
   ClientHeight = 253
   ClientWidth = 429
-  LCLVersion = '1.8.2.0'
   Visible = False
-  object gbTransaction: TGroupBox
-    Left = 22
-    Height = 192
-    Top = 40
-    Width = 384
-    Caption = 'Transaction Details'
-    ClientHeight = 172
-    ClientWidth = 380
+  object gbRecipient: TGroupBox
+    Left = 16
+    Height = 232
+    Top = 8
+    Width = 398
+    Caption = 'Destination Account'
+    ClientHeight = 212
+    ClientWidth = 394
     TabOrder = 0
-    object cbSignerAccount: TComboBox
-      Left = 8
-      Height = 23
-      Top = 8
-      Width = 168
-      ItemHeight = 15
-      Items.Strings = (
-        ''
-      )
-      OnChange = cbSignerAccountChange
-      TabOrder = 0
-      Text = 'Select Signer Account'
-    end
-    object lblBalance: TLabel
-      Left = 200
-      Height = 15
-      Top = 12
-      Width = 151
-      Caption = 'Please Select Signer Account'
-      Font.Color = clRed
-      ParentColor = False
-      ParentFont = False
-    end
-    object lblDestAcc: TLabel
-      Left = 8
-      Height = 15
-      Top = 48
-      Width = 108
-      Caption = 'Destination Account'
-      ParentColor = False
-    end
     object edtDestAcc: TEdit
       Left = 8
       Height = 23
-      Top = 74
+      Top = 40
       Width = 136
-      TabOrder = 1
-    end
-    object lblAmount: TLabel
-      Left = 8
-      Height = 15
-      Top = 116
-      Width = 44
-      Caption = 'Amount'
-      ParentColor = False
-    end
-    object edtAmt: TEdit
-      Left = 8
-      Height = 23
-      Top = 143
-      Width = 136
-      TabOrder = 2
+      OnChange = edtDestAccChange
+      TabOrder = 0
     end
     object btnSearch: TSpeedButton
       Left = 152
       Height = 22
-      Top = 75
+      Top = 41
       Width = 23
       Glyph.Data = {
         36040000424D3604000000000000360000002800000010000000100000000100
@@ -114,38 +68,50 @@ object WIZSendPASC_Transaction: TWIZSendPASC_Transaction
       }
       OnClick = btnSearchClick
     end
-    object edtOpFee: TEdit
-      Left = 232
-      Height = 23
-      Top = 144
-      Width = 136
-      TabOrder = 3
+    object lblDestNotice: TLabel
+      Left = 8
+      Height = 15
+      Top = 8
+      Width = 313
+      Caption = 'Please enter the recipient address that will receive the funds'
+      ParentColor = False
+      ParentFont = False
     end
-    object lblOpFee: TLabel
-      Left = 232
+    object lblDestAccNumber: TLabel
+      Left = 8
       Height = 15
-      Top = 116
-      Width = 74
-      Caption = 'Operation Fee'
+      Top = 80
+      Width = 158
+      Caption = 'Destination Account Number:'
       ParentColor = False
+      ParentFont = False
+    end
+    object lblDestAccNumberName: TLabel
+      Left = 8
+      Height = 15
+      Top = 108
+      Width = 193
+      Caption = 'Destination Account Number Name:'
+      ParentColor = False
+      ParentFont = False
+    end
+    object lblDestAccNumberValue: TLabel
+      Left = 224
+      Height = 15
+      Top = 80
+      Width = 92
+      Caption = 'Account Number'
+      ParentColor = False
+      ParentFont = False
+    end
+    object lblDestAccNumberNameValue: TLabel
+      Left = 224
+      Height = 15
+      Top = 108
+      Width = 121
+      Caption = 'AccountNumberName'
+      ParentColor = False
+      ParentFont = False
     end
-  end
-  object lblTotalBalances: TLabel
-    Left = 24
-    Height = 15
-    Top = 16
-    Width = 176
-    Caption = 'Selected Accounts Total Balance: '
-    ParentColor = False
-  end
-  object lblTotalBalanceValue: TLabel
-    Left = 208
-    Height = 15
-    Top = 16
-    Width = 70
-    Caption = 'Total Balance'
-    Font.Color = clGreen
-    ParentColor = False
-    ParentFont = False
   end
 end

+ 168 - 0
src/gui/wizards/UWIZSendPASC_EnterRecipient.pas

@@ -0,0 +1,168 @@
+unit UWIZSendPASC_EnterRecipient;
+
+{$mode delphi}
+{$modeswitch nestedprocvars}
+
+{ Copyright (c) 2018 Sphere 10 Software (http://www.sphere10.com/)
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  Acknowledgements:
+  Ugochukwu Mmaduekwe - main developer
+  Herman Schoenfeld - designer
+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+  ExtCtrls, Buttons, UCommon, UCommon.Collections, UWallet,
+  UFRMAccountSelect, UNode, UWizard, UWIZSendPASC, UWIZSendPASC_EnterQuantity,
+  UWIZSendPASC_Confirmation, UWIZModels;
+
+type
+
+  { TWIZSendPASC_EnterRecipient }
+
+  TWIZSendPASC_EnterRecipient = class(TWizardForm<TWIZOperationsModel>)
+    edtDestAcc: TEdit;
+    gbRecipient: TGroupBox;
+    lblDestAccNumber: TLabel;
+    lblDestAccNumberValue: TLabel;
+    lblDestAccNumberName: TLabel;
+    lblDestAccNumberNameValue: TLabel;
+    lblDestNotice: TLabel;
+    btnSearch: TSpeedButton;
+    procedure btnSearchClick(Sender: TObject);
+    procedure edtDestAccChange(Sender: TObject);
+    procedure UpdateUI();
+
+
+  public
+    procedure OnPresent; override;
+    procedure OnNext; override;
+    function Validate(out message: ansistring): boolean; override;
+  end;
+
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UAccounts, UUserInterface, USettings;
+
+{ TWIZSendPASC_EnterRecipient }
+
+procedure TWIZSendPASC_EnterRecipient.edtDestAccChange(Sender: TObject);
+begin
+  UpdateUI();
+end;
+
+procedure TWIZSendPASC_EnterRecipient.UpdateUI();
+var
+  tempAcc: TAccount;
+  c: Cardinal;
+begin
+  if TAccountComp.AccountTxtNumberToAccountNumber(edtDestAcc.Text, c) then
+  begin
+    if (c < 0) or (c >= TNode.Node.Bank.AccountsCount) then
+    begin
+      lblDestAccNumberValue.Caption := 'unknown';
+      lblDestAccNumberNameValue.Caption := 'unknown';
+      Exit;
+    end;
+    tempAcc := TNode.Node.Operations.SafeBoxTransaction.account(c);
+    lblDestAccNumberValue.Caption := edtDestAcc.Text;
+    lblDestAccNumberNameValue.Caption := tempAcc.Name;
+  end
+  else
+  begin
+    lblDestAccNumberValue.Caption := 'unknown';
+    lblDestAccNumberNameValue.Caption := 'unknown';
+  end;
+
+end;
+
+procedure TWIZSendPASC_EnterRecipient.OnPresent;
+begin
+  UpdateUI();
+end;
+
+procedure TWIZSendPASC_EnterRecipient.btnSearchClick(Sender: TObject);
+var
+  F: TFRMAccountSelect;
+  c: cardinal;
+begin
+  F := TFRMAccountSelect.Create(Self);
+  F.Position := poMainFormCenter;
+  try
+    F.Node := TNode.Node;
+    F.WalletKeys := TWallet.Keys;
+    F.Filters := edtDestAcc.Tag;
+    if TAccountComp.AccountTxtNumberToAccountNumber(edtDestAcc.Text, c) then
+      F.DefaultAccount := c;
+    F.AllowSelect := True;
+    if F.ShowModal = mrOk then
+    begin
+      edtDestAcc.Text := TAccountComp.AccountNumberToAccountTxtNumber(F.GetSelected);
+    end;
+  finally
+    F.Free;
+  end;
+end;
+
+
+procedure TWIZSendPASC_EnterRecipient.OnNext;
+var
+  c: cardinal;
+  aa: TAccount;
+begin
+  TAccountComp.AccountTxtNumberToAccountNumber(edtDestAcc.Text, c);
+  Model.SendPASCModel.DestinationAccount := TNode.Node.Operations.SafeBoxTransaction.account(c);
+  UpdatePath(ptReplaceAllNext, [TWIZSendPASC_EnterQuantity,
+    TWIZSendPASC_Confirmation]);
+end;
+
+function TWIZSendPASC_EnterRecipient.Validate(out message: ansistring): boolean;
+
+  function GetAccNoWithChecksum(constref AAccount: TAccount): string;
+  begin
+    Result := TAccountComp.AccountNumberToAccountTxtNumber(AAccount.account);
+  end;
+
+var
+  AccountNumbersWithChecksum: TArray<string>;
+  c: cardinal;
+begin
+  Result := True;
+
+  if not (TAccountComp.AccountTxtNumberToAccountNumber(edtDestAcc.Text, c)) then
+  begin
+    message := 'Invalid destination account (' + edtDestAcc.Text + ')';
+    Result := False;
+    Exit;
+  end;
+
+  if (c < 0) or (c >= TNode.Node.Bank.AccountsCount) then
+  begin
+    message := 'Invalid destination account (' +
+      TAccountComp.AccountNumberToAccountTxtNumber(c) + ')';
+    Result := False;
+    Exit;
+  end;
+
+  AccountNumbersWithChecksum :=
+    TListTool<TAccount, string>.Transform(Model.SendPASCModel.SelectedAccounts, GetAccNoWithCheckSum);
+
+  if TArrayTool<string>.Contains(AccountNumbersWithChecksum, edtDestAcc.Text) then
+  begin
+    message := 'Sender and destination account are the same';
+    Result := False;
+    Exit;
+  end;
+
+end;
+
+end.

+ 19 - 0
src/gui/wizards/UWIZSendPASC_FeeOverride.lfm

@@ -0,0 +1,19 @@
+object WIZFeeOverride: TWIZFeeOverride
+  Left = 0
+  Height = 253
+  Top = 0
+  Width = 429
+  Caption = 'WIZFeeOverride'
+  ClientHeight = 253
+  ClientWidth = 429
+  LCLVersion = '1.8.1.0'
+  Visible = False
+  object gbTransactionFee: TGroupBox
+    Left = 14
+    Height = 232
+    Top = 8
+    Width = 400
+    Caption = 'Transaction Fee'
+    TabOrder = 0
+  end
+end

+ 0 - 259
src/gui/wizards/UWIZSendPASC_Transaction.pas

@@ -1,259 +0,0 @@
-unit UWIZSendPASC_Transaction;
-
-{$mode delphi}
-{$modeswitch nestedprocvars}
-
-{ Copyright (c) 2018 by Ugochukwu Mmaduekwe
-
-  Distributed under the MIT software license, see the accompanying file LICENSE
-  or visit http://www.opensource.org/licenses/mit-license.php.
-}
-
-interface
-
-uses
-  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
-  ExtCtrls, Buttons, UCommon, UCommon.Collections, UWallet,
-  UFRMAccountSelect, UNode, UWizard, UWIZSendPASC, UWIZSendPASC_Confirmation, UWIZSendPASC_TransactionPayload, UWIZModels;
-
-type
-
-  { TWIZSendPASC_Transaction }
-
-  TWIZSendPASC_Transaction = class(TWizardForm<TWIZOperationsModel>)
-    cbSignerAccount: TComboBox;
-    edtOpFee: TEdit;
-    edtAmt: TEdit;
-    edtDestAcc: TEdit;
-    gbTransaction: TGroupBox;
-    lblOpFee: TLabel;
-    lblAmount: TLabel;
-    lblDestAcc: TLabel;
-    lblTotalBalanceValue: TLabel;
-    lblTotalBalances: TLabel;
-    lblBalance: TLabel;
-    btnSearch: TSpeedButton;
-    procedure btnSearchClick(Sender: TObject);
-    procedure cbSignerAccountChange(Sender: TObject);
-
-  public
-    procedure OnPresent; override;
-    procedure OnNext; override;
-    function Validate(out message: ansistring): boolean; override;
-  end;
-
-
-implementation
-
-{$R *.lfm}
-
-uses
-  UAccounts, UUserInterface, USettings;
-
-{ TWIZSendPASC_Transaction }
-
-procedure TWIZSendPASC_Transaction.cbSignerAccountChange(Sender: TObject);
-begin
-  if cbSignerAccount.ItemIndex < 1 then
-  begin
-    lblBalance.Font.Color := clRed;
-    lblBalance.Caption := 'Please Select Signer Account';
-  end
-  else
-  begin
-    lblBalance.Font.Color := clGreen;
-    lblBalance.Caption := Format('%s PASC',
-      [TAccountComp.FormatMoney(Model.SendPASCModel.SelectedAccounts[PtrInt(
-      cbSignerAccount.Items.Objects[cbSignerAccount.ItemIndex])].Balance)]);
-  end;
-end;
-
-procedure TWIZSendPASC_Transaction.btnSearchClick(Sender: TObject);
-var
-  F: TFRMAccountSelect;
-  c: cardinal;
-begin
-  F := TFRMAccountSelect.Create(Self);
-  F.Position := poMainFormCenter;
-  try
-    F.Node := TNode.Node;
-    F.WalletKeys := TWallet.Keys;
-    F.Filters := edtDestAcc.Tag;
-    if TAccountComp.AccountTxtNumberToAccountNumber(edtDestAcc.Text, c) then
-      F.DefaultAccount := c;
-    F.AllowSelect := True;
-    if F.ShowModal = mrOk then
-    begin
-      edtDestAcc.Text := TAccountComp.AccountNumberToAccountTxtNumber(F.GetSelected);
-    end;
-  finally
-    F.Free;
-  end;
-end;
-
-procedure TWIZSendPASC_Transaction.OnPresent;
-
-  function GetAccNoWithChecksum(AAccountNumber: cardinal): string;
-  begin
-    Result := TAccountComp.AccountNumberToAccountTxtNumber(AAccountNumber);
-  end;
-
-var
-  acc: TAccount;
-  accNumberwithChecksum: string;
-  totalBalance: int64;
-  i: integer;
-begin
-  cbSignerAccount.Items.BeginUpdate;
-  totalBalance := 0;
-  try
-    cbSignerAccount.Items.Clear;
-    cbSignerAccount.Items.Add('Select Signer Account');
-    for i := 0 to High(Model.SendPASCModel.SelectedAccounts) do
-    begin
-      acc := Model.SendPASCModel.SelectedAccounts[i];
-      accNumberwithChecksum := GetAccNoWithChecksum(acc.account);
-      totalBalance := totalBalance + acc.balance;
-      cbSignerAccount.Items.AddObject(accNumberwithChecksum, TObject(i));
-    end;
-  finally
-    cbSignerAccount.Items.EndUpdate;
-  end;
-  cbSignerAccount.ItemIndex := Model.SendPASCModel.SelectedIndex;
-  cbSignerAccountChange(Self);
-  lblTotalBalanceValue.Caption :=
-    Format('%s PASC', [TAccountComp.FormatMoney(totalBalance)]);
-
-  if Length(Model.SendPASCModel.SelectedAccounts) > 1 then
-  begin
-    edtAmt.Text := 'ALL BALANCE';
-    edtAmt.Enabled := False;
-  end
-  else
-  begin
-    edtAmt.Text := TAccountComp.FormatMoney(0);
-  end;
-  edtOpFee.Text := TAccountComp.FormatMoney(TSettings.DefaultFee);
-end;
-
-procedure TWIZSendPASC_Transaction.OnNext;
-
-  function GetAccNoWithoutChecksum(const AAccount: string): cardinal;
-  begin
-    if not TAccountComp.AccountTxtNumberToAccountNumber(AAccount, Result) then
-    begin
-      raise Exception.Create(
-        'Internal Error: Unable to parse account number from input');
-    end;
-  end;
-
-  function GetAccounts(AccountNumber: cardinal): TAccount;
-  var
-    acc: TAccount;
-    safeBox: TPCSafeBox;
-    keys: TOrderedAccountKeysList;
-    i: integer;
-  begin
-    keys := TWallet.keys.AccountsKeyList;
-    safeBox := TUserInterface.Node.Bank.safeBox;
-    safeBox.StartThreadSafe;
-    try
-      acc := safeBox.Account(AccountNumber);
-      if keys.IndexOfAccountKey(acc.accountInfo.accountKey) >= 0 then
-      begin
-        Result := acc;
-      end;
-    finally
-      safeBox.EndThreadSave;
-    end;
-
-  end;
-
-begin
-  Model.SendPASCModel.SelectedIndex := cbSignerAccount.ItemIndex;
-  Model.SendPASCModel.SignerAccount := Model.SendPASCModel.SelectedAccounts[PtrInt(
-    cbSignerAccount.Items.Objects[cbSignerAccount.ItemIndex])];
-  Model.SendPASCModel.DestinationAccount := GetAccounts(GetAccNoWithoutChecksum(edtDestAcc.Text));
-  Model.SendPASCModel.AmountToSend := edtAmt.Text;
-  UpdatePath(ptReplaceAllNext, [TWIZSendPASC_TransactionPayload, TWIZSendPASC_Confirmation]);
-end;
-
-function TWIZSendPASC_Transaction.Validate(out message: ansistring): boolean;
-
-  function GetAccNoWithChecksum(constref AAccount: TAccount): string;
-  begin
-    Result := TAccountComp.AccountNumberToAccountTxtNumber(AAccount.account);
-  end;
-
-var
-  AccountNumbersWithChecksum: TArray<string>;
-  Accounts: TArray<TAccount>;
-  c: cardinal;
-  DestAccount: TAccount;
-  amount, opfee: int64;
-  i: integer;
-begin
-  Accounts := Model.SendPASCModel.SelectedAccounts;
-  Result := True;
-  if cbSignerAccount.ItemIndex < 1 then
-  begin
-    message := 'A signer account must be selected';
-    Result := False;
-    Exit;
-  end;
-
-  if not (TAccountComp.AccountTxtNumberToAccountNumber(edtDestAcc.Text, c)) then
-  begin
-    message := 'Invalid destination account (' + edtDestAcc.Text + ')';
-    Result := False;
-    Exit;
-  end;
-
-  if (c < 0) or (c >= TNode.Node.Bank.AccountsCount) then
-  begin
-    message := 'Invalid destination account (' +
-      TAccountComp.AccountNumberToAccountTxtNumber(c) + ')';
-    Result := False;
-    Exit;
-  end;
-
-  DestAccount := TNode.Node.Operations.SafeBoxTransaction.account(c);
-  if Length(Accounts) = 1 then
-  begin
-    if not TAccountComp.TxtToMoney(edtAmt.Text, amount) then
-    begin
-      message := 'Invalid amount (' + edtAmt.Text + ')';
-      Result := False;
-      Exit;
-    end;
-  end;
-
-  AccountNumbersWithChecksum := TListTool<TAccount, string>.Transform(Accounts, GetAccNoWithCheckSum);
-
-  if TArrayTool<string>.Contains(AccountNumbersWithChecksum, edtDestAcc.Text) then
-  begin
-    message := 'Sender and destination account are the same';
-    Result := False;
-    Exit;
-  end;
-
-  if not TAccountComp.TxtToMoney(Trim(edtOpFee.Text), Model.SendPASCModel.DefaultFee) then
-  begin
-    message := 'Invalid fee value "' + edtOpFee.Text + '"';
-    Result := False;
-    Exit;
-  end;
-
-  //for i := Low(Accounts) to High(Accounts) do
-  //begin
-  //  if (Accounts[i].balance < (amount + opfee)) then
-  //  begin
-  //    message := 'Insufficient funds';
-  //    Result := False;
-  //    Exit;
-  //  end;
-  //end;
-
-end;
-
-end.

+ 0 - 98
src/gui/wizards/UWIZSendPASC_TransactionPayload.lfm

@@ -1,98 +0,0 @@
-object WIZSendPASC_TransactionPayload: TWIZSendPASC_TransactionPayload
-  Left = 0
-  Height = 253
-  Top = 0
-  Width = 429
-  ActiveControl = mmoPayload
-  Caption = 'Form1'
-  ClientHeight = 253
-  ClientWidth = 429
-  LCLVersion = '1.8.2.0'
-  Visible = False
-  object grpPayload: TGroupBox
-    Left = 8
-    Height = 244
-    Top = 2
-    Width = 416
-    Anchors = [akTop, akLeft, akRight, akBottom]
-    Caption = 'Transaction Payload'
-    ClientHeight = 224
-    ClientWidth = 412
-    TabOrder = 0
-    object paPayload: TPanel
-      Left = 8
-      Height = 214
-      Top = 2
-      Width = 396
-      Anchors = [akTop, akLeft, akRight, akBottom]
-      BevelOuter = bvNone
-      ClientHeight = 214
-      ClientWidth = 396
-      TabOrder = 0
-      object mmoPayload: TMemo
-        Left = 0
-        Height = 70
-        Top = 136
-        Width = 386
-        TabOrder = 0
-      end
-      object Label1: TLabel
-        Left = 0
-        Height = 15
-        Top = 118
-        Width = 69
-        Caption = 'Payload Data'
-        ParentColor = False
-      end
-      object rbEncryptedWithOldEC: TRadioButton
-        Left = 3
-        Height = 19
-        Top = 0
-        Width = 194
-        Caption = 'Encrypted with sender public key'
-        TabOrder = 1
-      end
-      object rbEncryptedWithEC: TRadioButton
-        Left = 3
-        Height = 19
-        Top = 24
-        Width = 227
-        Caption = 'Encrypted with dest account public key'
-        Checked = True
-        TabOrder = 2
-        TabStop = True
-      end
-      object rbEncryptedWithPassword: TRadioButton
-        Left = 3
-        Height = 19
-        Top = 48
-        Width = 152
-        Caption = 'Encrypted with password'
-        TabOrder = 3
-      end
-      object lblPassword: TLabel
-        Left = 3
-        Height = 15
-        Top = 73
-        Width = 53
-        Caption = 'Password:'
-        ParentColor = False
-      end
-      object rbNotEncrypted: TRadioButton
-        Left = 3
-        Height = 19
-        Top = 94
-        Width = 181
-        Caption = 'Don''t encrypt (public payload)'
-        TabOrder = 4
-      end
-      object edtPassword: TEdit
-        Left = 64
-        Height = 23
-        Top = 70
-        Width = 160
-        TabOrder = 5
-      end
-    end
-  end
-end

+ 0 - 84
src/gui/wizards/UWIZSendPASC_TransactionPayload.pas

@@ -1,84 +0,0 @@
-unit UWIZSendPASC_TransactionPayload;
-
-{$mode delphi}
-{$modeswitch nestedprocvars}
-
-{ Copyright (c) 2018 by Ugochukwu Mmaduekwe
-
-  Distributed under the MIT software license, see the accompanying file LICENSE
-  or visit http://www.opensource.org/licenses/mit-license.php.
-}
-
-interface
-
-uses
-  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
-  ExtCtrls, Buttons, UCommon, UCommon.Collections,
-  UWizard, UWIZSendPASC, UWIZModels;
-
-type
-
-  { TWIZSendPASC_TransactionPayload }
-
-  TWIZSendPASC_TransactionPayload = class(TWizardForm<TWIZOperationsModel>)
-    edtPassword: TEdit;
-    grpPayload: TGroupBox;
-    Label1: TLabel;
-    lblPassword: TLabel;
-    mmoPayload: TMemo;
-    paPayload: TPanel;
-    rbEncryptedWithOldEC: TRadioButton;
-    rbEncryptedWithEC: TRadioButton;
-    rbEncryptedWithPassword: TRadioButton;
-    rbNotEncrypted: TRadioButton;
-  public
-    procedure OnNext; override;
-    function Validate(out message: ansistring): boolean; override;
-  end;
-
-
-implementation
-
-{$R *.lfm}
-
-uses
-  UAccounts, UUserInterface;
-
-{ TWIZSendPASC_TransactionPayload }
-
-procedure TWIZSendPASC_TransactionPayload.OnNext;
-begin
-  Model.SendPASCModel.Payload := mmoPayload.Lines.Text;
-  if rbEncryptedWithOldEC.Checked then
-  begin
-    Model.SendPASCModel.PayloadEncryptionMode := akaEncryptWithOldEC;
-  end
-  else
-  if rbEncryptedWithEC.Checked then
-  begin
-    Model.SendPASCModel.PayloadEncryptionMode := akaEncryptWithEC;
-  end
-  else
-  if rbEncryptedWithPassword.Checked then
-  begin
-    Model.SendPASCModel.PayloadEncryptionMode := akaEncryptWithPassword;
-  end
-  else
-  if rbNotEncrypted.Checked then
-  begin
-    Model.SendPASCModel.PayloadEncryptionMode := akaNotEncrypt;
-  end;
-end;
-
-function TWIZSendPASC_TransactionPayload.Validate(out message: ansistring): boolean;
-begin
-  if (not rbNotEncrypted.Checked) and (not rbEncryptedWithEC.Checked) and
-    (not rbEncryptedWithOldEC.Checked) and (not rbEncryptedWithPassword.Checked) then
-  begin
-    message := 'you must select an encryption option for payload';
-    Result := False;
-    Exit;
-  end;
-end;
-
-end.

+ 2 - 2
src/gui/wizards/UWIZTransferAccount.pas

@@ -67,7 +67,7 @@ begin
     end;
     case Model.TransferAccountModel.PayloadEncryptionMode of
 
-      akaEncryptWithOldEC:
+      akaEncryptWithSender:
       begin
         // Use sender
         errors := 'Error encrypting';
@@ -76,7 +76,7 @@ begin
         valid := payload_encrypted <> '';
       end;
 
-      akaEncryptWithEC:
+      akaEncryptWithReceiver:
       begin
         errors := 'Public key: ' + 'Error encrypting';
 

+ 1 - 1
src/gui/wizards/UWIZTransferAccount_TransactionPayload.lfm

@@ -7,7 +7,7 @@ object WIZTransferAccount_TransactionPayload: TWIZTransferAccount_TransactionPay
   Caption = 'Form1'
   ClientHeight = 253
   ClientWidth = 429
-  LCLVersion = '1.8.2.0'
+  LCLVersion = '1.8.1.0'
   Visible = False
   object grpPayload: TGroupBox
     Left = 8

+ 2 - 2
src/gui/wizards/UWIZTransferAccount_TransactionPayload.pas

@@ -51,12 +51,12 @@ begin
   Model.TransferAccountModel.Payload := mmoPayload.Lines.Text;
   if rbEncryptedWithOldEC.Checked then
   begin
-    Model.TransferAccountModel.PayloadEncryptionMode := akaEncryptWithOldEC;
+    Model.TransferAccountModel.PayloadEncryptionMode := akaEncryptWithSender;
   end
   else
   if rbEncryptedWithEC.Checked then
   begin
-    Model.TransferAccountModel.PayloadEncryptionMode := akaEncryptWithEC;
+    Model.TransferAccountModel.PayloadEncryptionMode := akaEncryptWithReceiver;
   end
   else
   if rbEncryptedWithPassword.Checked then

+ 79 - 0
src/gui/wizards/generic wizards/UWIZFeeOverride.lfm

@@ -0,0 +1,79 @@
+object WIZFeeOverride: TWIZFeeOverride
+  Left = 0
+  Height = 253
+  Top = 0
+  Width = 429
+  ActiveControl = fseFee
+  Caption = 'WIZFeeOverride'
+  ClientHeight = 253
+  ClientWidth = 429
+  Visible = False
+  object gbTransactionFee: TGroupBox
+    Left = 14
+    Height = 232
+    Top = 8
+    Width = 400
+    Caption = 'Transaction Fee'
+    ClientHeight = 212
+    ClientWidth = 396
+    TabOrder = 0
+    object fseFee: TFloatSpinEdit
+      Left = 11
+      Height = 23
+      Top = 35
+      Width = 173
+      Increment = 1
+      MaxValue = 1000000000000
+      MinValue = 0
+      OnChange = fseFeeChange
+      TabOrder = 0
+      Value = 0
+    end
+    object lblNote1: TLabel
+      Left = 11
+      Height = 15
+      Top = 8
+      Width = 207
+      Caption = 'Please enter the fee for this transaction.'
+      ParentColor = False
+    end
+    object lblNote2: TLabel
+      Left = 11
+      Height = 30
+      Top = 88
+      Width = 378
+      Caption = 'NOTE: if you are sending from multiple accounts, the fee is required for '#13#10'each sender account '
+      ParentColor = False
+    end
+    object lblPASC: TLabel
+      Left = 192
+      Height = 15
+      Top = 40
+      Width = 28
+      Caption = 'PASC'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+    end
+    object lbltotalfee: TLabel
+      Left = 11
+      Height = 15
+      Top = 66
+      Width = 162
+      Caption = 'Total Fee For All Transcations:'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+    end
+    object lblTotalFeeValue: TLabel
+      Left = 192
+      Height = 15
+      Top = 64
+      Width = 28
+      Caption = 'xxxx'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+    end
+  end
+end

+ 105 - 0
src/gui/wizards/generic wizards/UWIZFeeOverride.pas

@@ -0,0 +1,105 @@
+unit UWIZFeeOverride;
+
+{$mode delphi}
+{$modeswitch nestedprocvars}
+
+{ Copyright (c) 2018 Sphere 10 Software (http://www.sphere10.com/)
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  Acknowledgements:
+  Ugochukwu Mmaduekwe - main developer
+  Herman Schoenfeld - designer
+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+  ExtCtrls, Buttons, Spin, UCommon, UCommon.Collections, UWallet,
+  UFRMAccountSelect, UNode, UWizard, UWIZSendPASC, UWIZPayloadOverride, UWIZSelectSignerOverride, UWIZSendPASC_Confirmation, UWIZModels;
+
+type
+
+  { TWIZFeeOverride }
+
+  TWIZFeeOverride = class(TWizardForm<TWIZOperationsModel>)
+    fseFee: TFloatSpinEdit;
+    gbTransactionFee: TGroupBox;
+    lbltotalfee: TLabel;
+    lblPASC: TLabel;
+    lblNote1: TLabel;
+    lblNote2: TLabel;
+    lblTotalFeeValue: TLabel;
+    procedure UpdateUI();
+    procedure fseFeeChange(Sender: TObject);
+
+
+  public
+    procedure OnPresent; override;
+    procedure OnNext; override;
+    function Validate(out message: ansistring): boolean; override;
+  end;
+
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UAccounts, UUserInterface, USettings;
+
+{ TWIZFeeOverride }
+
+procedure TWIZFeeOverride.UpdateUI();
+var
+  opfee: int64;
+begin
+  TAccountComp.TxtToMoney(Trim(fseFee.ValueToStr(fseFee.Value)), opfee);
+  lblTotalFeeValue.Caption := Format('%s PASC', [TAccountComp.FormatMoney(opfee *
+    Length(Model.SendPASCModel.SelectedAccounts))]);
+end;
+
+procedure TWIZFeeOverride.fseFeeChange(Sender: TObject);
+begin
+  UpdateUI();
+end;
+
+procedure TWIZFeeOverride.OnPresent;
+begin
+  UpdateUI();
+end;
+
+procedure TWIZFeeOverride.OnNext;
+begin
+  TAccountComp.TxtToMoney(Trim(fseFee.ValueToStr(fseFee.Value)),
+    Model.SendPASCModel.SingleOperationFee);
+  if Model.SendPASCModel.HasPayload then
+  begin
+    UpdatePath(ptReplaceAllNext, [TWIZPayloadOverride,
+      TWIZSendPASC_Confirmation]);
+  end
+  else
+  begin
+    UpdatePath(ptReplaceAllNext, [TWIZSelectSignerOverride,
+      TWIZSendPASC_Confirmation]);
+  end;
+end;
+
+function TWIZFeeOverride.Validate(out message: ansistring): boolean;
+var
+  opfee: int64;
+begin
+  Result := True;
+
+  if not TAccountComp.TxtToMoney(Trim(fseFee.ValueToStr(fseFee.Value)), opfee) then
+  begin
+    message := 'Invalid fee value "' + fseFee.ValueToStr(fseFee.Value) + '"';
+    Result := False;
+    Exit;
+  end;
+
+end;
+
+end.

+ 48 - 0
src/gui/wizards/generic wizards/UWIZPayloadContentOverride.lfm

@@ -0,0 +1,48 @@
+object WIZPayloadContentOverride: TWIZPayloadContentOverride
+  Left = 0
+  Height = 253
+  Top = 0
+  Width = 429
+  ActiveControl = mmoPayload
+  Caption = 'Form1'
+  ClientHeight = 253
+  ClientWidth = 429
+  Visible = False
+  object grpPayload: TGroupBox
+    Left = 8
+    Height = 244
+    Top = 2
+    Width = 416
+    Anchors = [akTop, akLeft, akRight, akBottom]
+    Caption = 'Payload Content'
+    ClientHeight = 224
+    ClientWidth = 412
+    TabOrder = 0
+    object paPayload: TPanel
+      Left = 8
+      Height = 214
+      Top = 2
+      Width = 396
+      Anchors = [akTop, akLeft, akRight, akBottom]
+      BevelOuter = bvNone
+      ClientHeight = 214
+      ClientWidth = 396
+      TabOrder = 0
+      object mmoPayload: TMemo
+        Left = 0
+        Height = 128
+        Top = 32
+        Width = 386
+        TabOrder = 0
+      end
+      object Label1: TLabel
+        Left = 0
+        Height = 15
+        Top = 6
+        Width = 153
+        Caption = 'Enter Payload Content Below'
+        ParentColor = False
+      end
+    end
+  end
+end

+ 53 - 0
src/gui/wizards/generic wizards/UWIZPayloadContentOverride.pas

@@ -0,0 +1,53 @@
+unit UWIZPayloadContentOverride;
+
+{$mode delphi}
+{$modeswitch nestedprocvars}
+
+{ Copyright (c) 2018 Sphere 10 Software (http://www.sphere10.com/)
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  Acknowledgements:
+  Ugochukwu Mmaduekwe - main developer
+  Herman Schoenfeld - designer
+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+  ExtCtrls, Buttons, UCommon, UCommon.Collections,
+  UWizard, UWIZSendPASC, UWIZSelectSignerOverride, UWIZSendPASC_Confirmation, UWIZModels;
+
+type
+
+  { TWIZPayloadContentOverride }
+
+  TWIZPayloadContentOverride = class(TWizardForm<TWIZOperationsModel>)
+    grpPayload: TGroupBox;
+    Label1: TLabel;
+    mmoPayload: TMemo;
+    paPayload: TPanel;
+  public
+    procedure OnNext; override;
+  end;
+
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UAccounts, UUserInterface;
+
+{ TWIZPayloadContentOverride }
+
+procedure TWIZPayloadContentOverride.OnNext;
+begin
+  Model.SendPASCModel.PayloadContent := mmoPayload.Lines.Text;
+   UpdatePath(ptReplaceAllNext, [TWIZSelectSignerOverride,
+      TWIZSendPASC_Confirmation]);
+end;
+
+end.

+ 107 - 0
src/gui/wizards/generic wizards/UWIZPayloadOverride.lfm

@@ -0,0 +1,107 @@
+object WIZPayloadOverride: TWIZPayloadOverride
+  Left = 0
+  Height = 253
+  Top = 0
+  Width = 429
+  ActiveControl = rbEncryptedWithSender
+  Caption = 'Form1'
+  ClientHeight = 253
+  ClientWidth = 429
+  Visible = False
+  object grpPayload: TGroupBox
+    Left = 8
+    Height = 244
+    Top = 2
+    Width = 416
+    Anchors = [akTop, akLeft, akRight, akBottom]
+    Caption = 'Transaction Payload'
+    ClientHeight = 224
+    ClientWidth = 412
+    TabOrder = 0
+    object paPayload: TPanel
+      Left = 8
+      Height = 214
+      Top = 2
+      Width = 396
+      Anchors = [akTop, akLeft, akRight, akBottom]
+      BevelOuter = bvNone
+      ClientHeight = 214
+      ClientWidth = 396
+      TabOrder = 0
+      object rbEncryptedWithRecipient: TRadioButton
+        Left = 3
+        Height = 19
+        Top = 64
+        Width = 156
+        Caption = 'Encrypt with recipient key'
+        TabOrder = 0
+      end
+      object rbEncryptedWithSender: TRadioButton
+        Left = 3
+        Height = 19
+        Top = 112
+        Width = 145
+        Caption = 'Encrypt with sender key'
+        Checked = True
+        TabOrder = 1
+        TabStop = True
+      end
+      object rbEncryptedWithPassword: TRadioButton
+        Left = 3
+        Height = 19
+        Top = 176
+        Width = 139
+        Caption = 'Encrypt with password'
+        TabOrder = 2
+      end
+      object rbNotEncrypted: TRadioButton
+        Left = 3
+        Height = 19
+        Top = 24
+        Width = 96
+        Caption = 'No Encryption'
+        TabOrder = 3
+      end
+      object lblNote1: TLabel
+        Left = 3
+        Height = 15
+        Top = 3
+        Width = 343
+        Caption = 'What type of payload would you like to attach to your operation?'
+        ParentColor = False
+      end
+      object lblNoEncryption: TLabel
+        Left = 19
+        Height = 15
+        Top = 46
+        Width = 366
+        Caption = 'Use this option to specify a publicly visible message anyone can view.'
+        ParentColor = False
+      end
+      object lblNoEncryption1: TLabel
+        Left = 19
+        Height = 15
+        Top = 88
+        Width = 373
+        Caption = 'Use this option to specify a message which only the recipient can view.'
+        ParentColor = False
+      end
+      object lblNoEncryption2: TLabel
+        Left = 19
+        Height = 30
+        Top = 136
+        Width = 377
+        Caption = 'Only you will be able to decrypt this message. This is useful for tagging '#13#10'transactions for your own record keeping purposes.'
+        ParentColor = False
+      end
+      object Label1: TLabel
+        Left = 19
+        Height = 15
+        Top = 198
+        Width = 313
+        Caption = 'Only those with password will be able to view this message.'
+        ParentColor = False
+      end
+    end
+  end
+end

+ 101 - 0
src/gui/wizards/generic wizards/UWIZPayloadOverride.pas

@@ -0,0 +1,101 @@
+unit UWIZPayloadOverride;
+
+{$mode delphi}
+{$modeswitch nestedprocvars}
+
+{ Copyright (c) 2018 Sphere 10 Software (http://www.sphere10.com/)
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  Acknowledgements:
+  Ugochukwu Mmaduekwe - main developer
+  Herman Schoenfeld - designer
+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+  ExtCtrls, Buttons, UCommon, UCommon.Collections,
+  UWizard, UWIZSendPASC, UWIZPayloadContentOverride, UWIZPayloadPasswordOverride, UWIZSendPASC_Confirmation, UWIZModels;
+
+type
+
+  { TWIZPayloadOverride }
+
+  TWIZPayloadOverride = class(TWizardForm<TWIZOperationsModel>)
+    grpPayload: TGroupBox;
+    Label1: TLabel;
+    lblNoEncryption: TLabel;
+    lblNoEncryption1: TLabel;
+    lblNoEncryption2: TLabel;
+    lblNote1: TLabel;
+    paPayload: TPanel;
+    rbEncryptedWithRecipient: TRadioButton;
+    rbEncryptedWithSender: TRadioButton;
+    rbEncryptedWithPassword: TRadioButton;
+    rbNotEncrypted: TRadioButton;
+  public
+    procedure OnNext; override;
+    function Validate(out message: ansistring): boolean; override;
+  end;
+
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UAccounts, UUserInterface;
+
+{ TWIZPayloadOverride }
+
+procedure TWIZPayloadOverride.OnNext;
+begin
+  if rbEncryptedWithRecipient.Checked then
+  begin
+    Model.SendPASCModel.PayloadEncryptionMode := akaEncryptWithSender;
+  end
+  else
+  if rbEncryptedWithSender.Checked then
+  begin
+    Model.SendPASCModel.PayloadEncryptionMode := akaEncryptWithReceiver;
+  end
+  else
+  if rbEncryptedWithPassword.Checked then
+  begin
+    Model.SendPASCModel.PayloadEncryptionMode := akaEncryptWithPassword;
+  end
+  else
+  if rbNotEncrypted.Checked then
+  begin
+    Model.SendPASCModel.PayloadEncryptionMode := akaNotEncrypt;
+  end;
+  case Model.SendPASCModel.PayloadEncryptionMode of
+    akaEncryptWithPassword:
+    begin
+      UpdatePath(ptReplaceAllNext, [TWIZPayloadPasswordOverride,
+        TWIZSendPASC_Confirmation]);
+    end
+    else
+    begin
+      UpdatePath(ptReplaceAllNext, [TWIZPayloadContentOverride,
+        TWIZSendPASC_Confirmation]);
+    end;
+  end;
+end;
+
+function TWIZPayloadOverride.Validate(out message: ansistring): boolean;
+begin
+  Result := True;
+  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';
+    Result := False;
+    Exit;
+  end;
+end;
+
+end.

+ 56 - 0
src/gui/wizards/generic wizards/UWIZPayloadPasswordOverride.lfm

@@ -0,0 +1,56 @@
+object WIZPayloadPasswordOverride: TWIZPayloadPasswordOverride
+  Left = 0
+  Height = 253
+  Top = 0
+  Width = 429
+  Caption = 'Form1'
+  ClientHeight = 253
+  ClientWidth = 429
+  LCLVersion = '1.8.1.0'
+  Visible = False
+  object grpPayload: TGroupBox
+    Left = 8
+    Height = 244
+    Top = 2
+    Width = 416
+    Anchors = [akTop, akLeft, akRight, akBottom]
+    Caption = 'Payload Password'
+    ClientHeight = 224
+    ClientWidth = 412
+    TabOrder = 0
+    object paPayload: TPanel
+      Left = 8
+      Height = 214
+      Top = 2
+      Width = 396
+      Anchors = [akTop, akLeft, akRight, akBottom]
+      BevelOuter = bvNone
+      ClientHeight = 214
+      ClientWidth = 396
+      TabOrder = 0
+      object lblPassword: TLabel
+        Left = 3
+        Height = 15
+        Top = 8
+        Width = 341
+        Caption = 'Enter the shared secret that will enable decryption of the payload'
+        ParentColor = False
+      end
+      object edtPassword: TEdit
+        Left = 3
+        Height = 23
+        Top = 40
+        Width = 160
+        TabOrder = 0
+      end
+      object lblNote: TLabel
+        Left = 8
+        Height = 45
+        Top = 80
+        Width = 384
+        Caption = 'NOTE: only the bearers of the password will be able to decrypt the '#13#10'payload contents of this operation(s). Please ensure only the appropriate '#13#10'parties are given this password.'
+        ParentColor = False
+      end
+    end
+  end
+end

+ 66 - 0
src/gui/wizards/generic wizards/UWIZPayloadPasswordOverride.pas

@@ -0,0 +1,66 @@
+unit UWIZPayloadPasswordOverride;
+
+{$mode delphi}
+{$modeswitch nestedprocvars}
+
+{ Copyright (c) 2018 Sphere 10 Software (http://www.sphere10.com/)
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  Acknowledgements:
+  Ugochukwu Mmaduekwe - main developer
+  Herman Schoenfeld - designer
+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+  ExtCtrls, Buttons, UCommon, UCommon.Collections,
+  UWizard, UWIZSendPASC, UWIZSelectSignerOverride, UWIZSendPASC_Confirmation, UWIZModels;
+
+type
+
+  { TWIZPayloadPasswordOverride }
+
+  TWIZPayloadPasswordOverride = class(TWizardForm<TWIZOperationsModel>)
+    edtPassword: TEdit;
+    grpPayload: TGroupBox;
+    lblNote: TLabel;
+    lblPassword: TLabel;
+    paPayload: TPanel;
+  public
+    procedure OnNext; override;
+    function Validate(out message: ansistring): boolean; override;
+  end;
+
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UAccounts, UUserInterface;
+
+{ TWIZPayloadPasswordOverride }
+
+procedure TWIZPayloadPasswordOverride.OnNext;
+begin
+  Model.SendPASCModel.EncryptionPassword := edtPassword.Text;
+  UpdatePath(ptReplaceAllNext, [TWIZSelectSignerOverride,
+    TWIZSendPASC_Confirmation]);
+end;
+
+function TWIZPayloadPasswordOverride.Validate(out message: ansistring): boolean;
+begin
+  Result := True;
+  if Length(Trim(edtPassword.Text)) = 0 then
+  begin
+    message := 'password cannot be empty';
+    Result := False;
+    Exit;
+  end;
+end;
+
+end.

+ 71 - 0
src/gui/wizards/generic wizards/UWIZSelectSignerOverride.lfm

@@ -0,0 +1,71 @@
+object WIZSelectSignerOverride: TWIZSelectSignerOverride
+  Left = 0
+  Height = 253
+  Top = 0
+  Width = 429
+  ActiveControl = cbSignerAccount
+  Caption = 'WIZSelectSignerOverride'
+  ClientHeight = 253
+  ClientWidth = 429
+  LCLVersion = '1.8.1.0'
+  Visible = False
+  object gbTransaction: TGroupBox
+    Left = 16
+    Height = 232
+    Top = 8
+    Width = 400
+    Caption = 'Fee Payer'
+    ClientHeight = 212
+    ClientWidth = 396
+    TabOrder = 0
+    object cbSignerAccount: TComboBox
+      Left = 8
+      Height = 23
+      Top = 40
+      Width = 168
+      ItemHeight = 15
+      Items.Strings = (
+        ''
+      )
+      OnChange = cbSignerAccountChange
+      TabOrder = 0
+      Text = 'Select Signer Account'
+    end
+    object lblBalance: TLabel
+      Left = 200
+      Height = 15
+      Top = 45
+      Width = 151
+      Caption = 'Please Select Signer Account'
+      Font.Color = clRed
+      ParentColor = False
+      ParentFont = False
+    end
+    object lblNote: TLabel
+      Left = 8
+      Height = 15
+      Top = 8
+      Width = 214
+      Caption = 'Select the account which will pay the fee'
+      ParentColor = False
+    end
+    object rbPrimary: TRadioButton
+      Left = 8
+      Height = 19
+      Top = 88
+      Width = 219
+      Caption = 'Sign all transactions with this account'
+      Checked = True
+      TabOrder = 2
+      TabStop = True
+    end
+    object rbSecondary: TRadioButton
+      Left = 8
+      Height = 19
+      Top = 124
+      Width = 307
+      Caption = 'Only Sign with this account if sender cannot afford fee'
+      TabOrder = 1
+    end
+  end
+end

+ 126 - 0
src/gui/wizards/generic wizards/UWIZSelectSignerOverride.pas

@@ -0,0 +1,126 @@
+unit UWIZSelectSignerOverride;
+
+{$mode delphi}
+{$modeswitch nestedprocvars}
+
+{ Copyright (c) 2018 Sphere 10 Software (http://www.sphere10.com/)
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  Acknowledgements:
+  Ugochukwu Mmaduekwe - main developer
+  Herman Schoenfeld - designer
+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+  ExtCtrls, Buttons, UCommon, UCommon.Collections, UWallet,
+  UFRMAccountSelect, UNode, UWizard, UWIZSendPASC, UWIZSendPASC_Confirmation, UWIZModels;
+
+type
+
+  { TWIZSelectSignerOverride }
+
+  TWIZSelectSignerOverride = class(TWizardForm<TWIZOperationsModel>)
+    cbSignerAccount: TComboBox;
+    gbTransaction: TGroupBox;
+    lblNote: TLabel;
+    lblBalance: TLabel;
+    rbPrimary: TRadioButton;
+    rbSecondary: TRadioButton;
+    procedure cbSignerAccountChange(Sender: TObject);
+
+
+
+  public
+    procedure OnPresent; override;
+    procedure OnNext; override;
+    function Validate(out message: ansistring): boolean; override;
+  end;
+
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UAccounts, UUserInterface, USettings;
+
+{ TWIZSelectSignerOverride }
+
+procedure TWIZSelectSignerOverride.cbSignerAccountChange(Sender: TObject);
+begin
+  if cbSignerAccount.ItemIndex < 1 then
+  begin
+    lblBalance.Font.Color := clRed;
+    lblBalance.Caption := 'Please Select Signer Account';
+  end
+  else
+  begin
+    lblBalance.Font.Color := clGreen;
+    lblBalance.Caption := Format('%s PASC',
+      [TAccountComp.FormatMoney(Model.SendPASCModel.SelectedAccounts[PtrInt(
+      cbSignerAccount.Items.Objects[cbSignerAccount.ItemIndex])].Balance)]);
+  end;
+end;
+
+procedure TWIZSelectSignerOverride.OnPresent;
+
+  function GetAccNoWithChecksum(AAccountNumber: cardinal): string;
+  begin
+    Result := TAccountComp.AccountNumberToAccountTxtNumber(AAccountNumber);
+  end;
+
+var
+  acc: TAccount;
+  accNumberwithChecksum: string;
+  i: integer;
+begin
+  cbSignerAccount.Items.BeginUpdate;
+  try
+    cbSignerAccount.Items.Clear;
+    cbSignerAccount.Items.Add('Select Signer Account');
+    for i := Low(Model.SendPASCModel.SelectedAccounts) to High(Model.SendPASCModel.SelectedAccounts) do
+    begin
+      acc := Model.SendPASCModel.SelectedAccounts[i];
+      accNumberwithChecksum := GetAccNoWithChecksum(acc.account);
+      cbSignerAccount.Items.AddObject(accNumberwithChecksum, TObject(i));
+    end;
+  finally
+    cbSignerAccount.Items.EndUpdate;
+  end;
+  cbSignerAccount.ItemIndex := Model.SendPASCModel.SelectedIndex;
+  cbSignerAccountChange(Self);
+end;
+
+procedure TWIZSelectSignerOverride.OnNext;
+begin
+  Model.SendPASCModel.SelectedIndex := cbSignerAccount.ItemIndex;
+  Model.SendPASCModel.SignerAccount := Model.SendPASCModel.SelectedAccounts[PtrInt(
+    cbSignerAccount.Items.Objects[cbSignerAccount.ItemIndex])];
+  if rbPrimary.Checked then
+  begin
+    Model.SendPASCModel.OperationSigningMode := akaPrimary;
+  end
+  else if rbSecondary.Checked then
+  begin
+    Model.SendPASCModel.OperationSigningMode := akaSecondary;
+  end;
+end;
+
+function TWIZSelectSignerOverride.Validate(out message: ansistring): boolean;
+begin
+  Result := True;
+  if cbSignerAccount.ItemIndex < 1 then
+  begin
+    message := 'A signer account must be selected';
+    Result := False;
+    Exit;
+  end;
+
+end;
+
+end.

+ 118 - 44
src/pascalcoin_wallet.lpi

@@ -33,7 +33,7 @@
         <PackageName Value="LCL"/>
       </Item1>
     </RequiredPackages>
-    <Units Count="89">
+    <Units Count="100">
       <Unit0>
         <Filename Value="pascalcoin_wallet.dpr"/>
         <IsPartOfProject Value="True"/>
@@ -372,137 +372,211 @@
         <IsPartOfProject Value="True"/>
       </Unit64>
       <Unit65>
-        <Filename Value="gui\wizards\UWIZSendPASC_Confirmation.pas"/>
+        <Filename Value="gui\wizards\UWIZSendPASC_ConfirmSender.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZSendPASC_Confirmation"/>
+        <ComponentName Value="WIZSendPASC_ConfirmSender"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit65>
       <Unit66>
-        <Filename Value="gui\wizards\UWIZSendPASC_Start.pas"/>
+        <Filename Value="gui\wizards\UWIZSendPASC_EnterRecipient.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZSendPASC_Start"/>
+        <ComponentName Value="WIZSendPASC_EnterRecipient"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit66>
       <Unit67>
-        <Filename Value="gui\wizards\UWIZSendPASC_Transaction.pas"/>
+        <Filename Value="libraries\sphere10\UMemory.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZSendPASC_Transaction"/>
-        <HasResources Value="True"/>
-        <ResourceBaseClass Value="Form"/>
       </Unit67>
       <Unit68>
-        <Filename Value="libraries\sphere10\UMemory.pas"/>
+        <Filename Value="gui\UCellRenderers.pas"/>
         <IsPartOfProject Value="True"/>
       </Unit68>
       <Unit69>
-        <Filename Value="gui\UCellRenderers.pas"/>
+        <Filename Value="libraries\generics.collections\inc\generics.dictionaries.inc"/>
         <IsPartOfProject Value="True"/>
       </Unit69>
       <Unit70>
-        <Filename Value="libraries\generics.collections\inc\generics.dictionaries.inc"/>
+        <Filename Value="libraries\pascalcoin\UAppParams.pas"/>
         <IsPartOfProject Value="True"/>
       </Unit70>
       <Unit71>
-        <Filename Value="libraries\pascalcoin\UAppParams.pas"/>
+        <Filename Value="libraries\pascalcoin\UFolderHelper.pas"/>
         <IsPartOfProject Value="True"/>
       </Unit71>
       <Unit72>
-        <Filename Value="libraries\pascalcoin\UFolderHelper.pas"/>
+        <Filename Value="libraries\pascalcoin\UGridUtils.pas"/>
         <IsPartOfProject Value="True"/>
       </Unit72>
       <Unit73>
-        <Filename Value="libraries\pascalcoin\UGridUtils.pas"/>
+        <Filename Value="libraries\pascalcoin\UJSONFunctions.pas"/>
         <IsPartOfProject Value="True"/>
       </Unit73>
       <Unit74>
-        <Filename Value="libraries\pascalcoin\UJSONFunctions.pas"/>
+        <Filename Value="core.utils\UCoreUtils.pas"/>
         <IsPartOfProject Value="True"/>
       </Unit74>
       <Unit75>
-        <Filename Value="core.utils\UCoreUtils.pas"/>
+        <Filename Value="core.utils\UDataSources.pas"/>
         <IsPartOfProject Value="True"/>
       </Unit75>
       <Unit76>
-        <Filename Value="core.utils\UDataSources.pas"/>
+        <Filename Value="gui\wizards\UWIZTransferAccount.pas"/>
         <IsPartOfProject Value="True"/>
       </Unit76>
       <Unit77>
-        <Filename Value="gui\wizards\UWIZSendPASC_TransactionPayload.pas"/>
+        <Filename Value="gui\wizards\UWIZTransferAccount_Start.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZSendPASC_TransactionPayload"/>
+        <ComponentName Value="WIZTransferAccount_Start"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit77>
       <Unit78>
-        <Filename Value="gui\wizards\UWIZTransferAccount.pas"/>
+        <Filename Value="gui\wizards\UWIZTransferAccount_Transaction.pas"/>
         <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZTransferAccount_Transaction"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
       </Unit78>
       <Unit79>
-        <Filename Value="gui\wizards\UWIZTransferAccount_Start.pas"/>
+        <Filename Value="gui\wizards\UWIZTransferAccount_Confirmation.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZTransferAccount_Start"/>
+        <ComponentName Value="WIZTransferAccount_Confirmation"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit79>
       <Unit80>
-        <Filename Value="gui\wizards\UWIZTransferAccount_Transaction.pas"/>
+        <Filename Value="gui\wizards\UWIZTransferAccount_TransactionPayload.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZTransferAccount_Transaction"/>
+        <ComponentName Value="WIZTransferAccount_TransactionPayload"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit80>
       <Unit81>
-        <Filename Value="gui\wizards\UWIZTransferAccount_Confirmation.pas"/>
+        <Filename Value="gui\wizards\UWIZChangeAccountPrivateKey.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZTransferAccount_Confirmation"/>
-        <HasResources Value="True"/>
-        <ResourceBaseClass Value="Form"/>
       </Unit81>
       <Unit82>
-        <Filename Value="gui\wizards\UWIZTransferAccount_TransactionPayload.pas"/>
+        <Filename Value="gui\wizards\UWIZChangeAccountPrivateKey_Confirmation.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZTransferAccount_TransactionPayload"/>
+        <ComponentName Value="WIZChangeAccountPrivateKey_Confirmation"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit82>
       <Unit83>
-        <Filename Value="gui\wizards\UWIZChangeAccountPrivateKey.pas"/>
+        <Filename Value="gui\wizards\UWIZChangeAccountPrivateKey_Start.pas"/>
         <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZChangeAccountPrivateKey_Start"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
       </Unit83>
       <Unit84>
-        <Filename Value="gui\wizards\UWIZChangeAccountPrivateKey_Confirmation.pas"/>
+        <Filename Value="gui\wizards\UWIZChangeAccountPrivateKey_Transaction.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZChangeAccountPrivateKey_Confirmation"/>
+        <ComponentName Value="WIZChangeAccountPrivateKey_Transaction"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit84>
       <Unit85>
-        <Filename Value="gui\wizards\UWIZChangeAccountPrivateKey_Start.pas"/>
+        <Filename Value="gui\wizards\UWIZChangeAccountPrivateKey_TransactionPayload.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZChangeAccountPrivateKey_Start"/>
+        <ComponentName Value="WIZChangeAccountPrivateKey_TransactionPayload"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit85>
       <Unit86>
-        <Filename Value="gui\wizards\UWIZChangeAccountPrivateKey_Transaction.pas"/>
+        <Filename Value="gui\wizards\UWIZEnlistAccountForSale.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZChangeAccountPrivateKey_Transaction"/>
-        <HasResources Value="True"/>
-        <ResourceBaseClass Value="Form"/>
       </Unit86>
       <Unit87>
-        <Filename Value="gui\wizards\UWIZChangeAccountPrivateKey_TransactionPayload.pas"/>
+        <Filename Value="gui\wizards\UWIZEnlistAccountForSale_Confirmation.pas"/>
         <IsPartOfProject Value="True"/>
-        <ComponentName Value="WIZChangeAccountPrivateKey_TransactionPayload"/>
+        <ComponentName Value="WIZEnlistAccountForSale_Confirmation"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
       </Unit87>
       <Unit88>
-        <Filename Value="gui\wizards\UWIZModels.pas"/>
+        <Filename Value="gui\wizards\UWIZEnlistAccountForSale_Start.pas"/>
         <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZEnlistAccountForSale_Start"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
       </Unit88>
+      <Unit89>
+        <Filename Value="gui\wizards\UWIZEnlistAccountForSale_Transaction.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZEnlistAccountForSale_Transaction"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit89>
+      <Unit90>
+        <Filename Value="gui\wizards\UWIZEnlistAccountForSale_TransactionPayload.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZEnlistAccountForSale_TransactionPayload"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit90>
+      <Unit91>
+        <Filename Value="gui\wizards\UWIZEnlistAccountForSale_List.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZEnlistAccountForSale_List"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit91>
+      <Unit92>
+        <Filename Value="gui\wizards\UWIZEnlistAccountForSale_PrivateSaleConfig.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZEnlistAccountForSale_PrivateSaleConfig"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit92>
+      <Unit93>
+        <Filename Value="gui\wizards\UWIZSendPASC_EnterQuantity.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZSendPASC_EnterQuantity"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit93>
+      <Unit94>
+        <Filename Value="gui\wizards\generic wizards\UWIZFeeOverride.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZFeeOverride"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit94>
+      <Unit95>
+        <Filename Value="gui\wizards\generic wizards\UWIZPayloadOverride.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZPayloadOverride"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit95>
+      <Unit96>
+        <Filename Value="gui\wizards\generic wizards\UWIZPayloadContentOverride.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZPayloadContentOverride"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit96>
+      <Unit97>
+        <Filename Value="gui\wizards\generic wizards\UWIZPayloadPasswordOverride.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZPayloadPasswordOverride"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit97>
+      <Unit98>
+        <Filename Value="gui\wizards\generic wizards\UWIZSelectSignerOverride.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="WIZSelectSignerOverride"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit98>
+      <Unit99>
+        <Filename Value="gui\wizards\UWIZModels.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit99>
     </Units>
   </ProjectOptions>
   <CompilerOptions>
@@ -513,7 +587,7 @@
     </Target>
     <SearchPaths>
       <IncludeFiles Value="$(ProjOutDir);libraries\generics.collections\inc"/>
-      <OtherUnitFiles Value="core;gui;gui\wizards;libraries\synapse;libraries\sphere10;libraries\generics.collections;libraries\pascalcoin;core.utils"/>
+      <OtherUnitFiles Value="core;gui;gui\wizards;libraries\synapse;libraries\sphere10;libraries\generics.collections;libraries\pascalcoin;core.utils;gui\wizards\generic wizards"/>
       <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
     </SearchPaths>
     <Parsing>