Browse Source

Some updates to GUI for EPASA

Pascal Coin 4 years ago
parent
commit
b19d041633

+ 2 - 1
src/core/UEPasa.pas

@@ -390,11 +390,12 @@ var
   LPayloadContent: String;
   LPayloadContent: String;
 begin
 begin
   Result := string.Empty;
   Result := string.Empty;
-  if (Not Account.HasValue) then Exit;
   if PayloadType.HasTrait(ptNonDeterministic) then Exit;
   if PayloadType.HasTrait(ptNonDeterministic) then Exit;
+
   if (PayloadType.HasTrait(ptAddressedByName)) then begin
   if (PayloadType.HasTrait(ptAddressedByName)) then begin
     Result := Result + TPascal64Encoding.Escape(AccountName);
     Result := Result + TPascal64Encoding.Escape(AccountName);
   end else begin
   end else begin
+    if (Not Account.HasValue) then Exit;
     Result := Result + Account.Value.ToString();
     Result := Result + Account.Value.ToString();
     if (AccountChecksum.HasValue) then begin
     if (AccountChecksum.HasValue) then begin
       Result := Result + String.Format('-%u', [AccountChecksum.Value]);
       Result := Result + String.Format('-%u', [AccountChecksum.Value]);

+ 2 - 2
src/core/UOpTransaction.pas

@@ -1205,12 +1205,12 @@ begin
     buy_account, transaction_with_auto_buy_account, transaction_with_auto_atomic_swap : begin
     buy_account, transaction_with_auto_buy_account, transaction_with_auto_atomic_swap : begin
       SetLength(OperationResume.Receivers,2);
       SetLength(OperationResume.Receivers,2);
       OperationResume.Receivers[0] := CT_TMultiOpReceiver_NUL;
       OperationResume.Receivers[0] := CT_TMultiOpReceiver_NUL;
-      OperationResume.Receivers[0].AccountEPASA.Clear;
+      OperationResume.Receivers[0].AccountEPASA:=TAccountComp.DecodeEPASAPartial(FData.target, FData.payload.payload_raw, FData.payload.payload_type, TEPasa.Empty);
       OperationResume.Receivers[0].Account:=FData.target;
       OperationResume.Receivers[0].Account:=FData.target;
       OperationResume.Receivers[0].Amount:= (FData.amount - FData.AccountPrice);
       OperationResume.Receivers[0].Amount:= (FData.amount - FData.AccountPrice);
       OperationResume.Receivers[0].Payload:=FData.payload;
       OperationResume.Receivers[0].Payload:=FData.payload;
       OperationResume.Receivers[1] := CT_TMultiOpReceiver_NUL;
       OperationResume.Receivers[1] := CT_TMultiOpReceiver_NUL;
-      OperationResume.Receivers[1].AccountEPASA.Clear;
+      OperationResume.Receivers[1].AccountEPASA:=TAccountComp.DecodeEPASAPartial(FData.SellerAccount, FData.payload.payload_raw, FData.payload.payload_type, TEPasa.Empty);
       OperationResume.Receivers[1].Account:=FData.SellerAccount;
       OperationResume.Receivers[1].Account:=FData.SellerAccount;
       OperationResume.Receivers[1].Amount:= FData.AccountPrice;
       OperationResume.Receivers[1].Amount:= FData.AccountPrice;
       OperationResume.Receivers[1].Payload:=FData.payload;
       OperationResume.Receivers[1].Payload:=FData.payload;

+ 32 - 15
src/gui-classic/UFRMOperation.dfm

@@ -90,7 +90,7 @@ object FRMOperation: TFRMOperation
   object bbCancel: TBitBtn
   object bbCancel: TBitBtn
     Left = 461
     Left = 461
     Top = 476
     Top = 476
-    Width = 116
+    Width = 120
     Height = 31
     Height = 31
     Kind = bkCancel
     Kind = bkCancel
     NumGlyphs = 2
     NumGlyphs = 2
@@ -185,7 +185,7 @@ object FRMOperation: TFRMOperation
         object lblEncryptionErrors: TLabel
         object lblEncryptionErrors: TLabel
           Left = 255
           Left = 255
           Top = 96
           Top = 96
-          Width = 187
+          Width = 152
           Height = 33
           Height = 33
           AutoSize = False
           AutoSize = False
           Caption = 'Errors detected'
           Caption = 'Errors detected'
@@ -211,7 +211,7 @@ object FRMOperation: TFRMOperation
         object rbEncryptedWithEC: TRadioButton
         object rbEncryptedWithEC: TRadioButton
           Left = 15
           Left = 15
           Top = 35
           Top = 35
-          Width = 207
+          Width = 234
           Height = 19
           Height = 19
           Caption = 'Encrypted with dest account public key'
           Caption = 'Encrypted with dest account public key'
           Checked = True
           Checked = True
@@ -222,7 +222,7 @@ object FRMOperation: TFRMOperation
         object rbEncrptedWithPassword: TRadioButton
         object rbEncrptedWithPassword: TRadioButton
           Left = 15
           Left = 15
           Top = 53
           Top = 53
-          Width = 141
+          Width = 234
           Height = 19
           Height = 19
           Caption = 'Encrypted with password'
           Caption = 'Encrypted with password'
           TabOrder = 2
           TabOrder = 2
@@ -232,7 +232,7 @@ object FRMOperation: TFRMOperation
         object rbNotEncrypted: TRadioButton
         object rbNotEncrypted: TRadioButton
           Left = 15
           Left = 15
           Top = 93
           Top = 93
-          Width = 162
+          Width = 234
           Height = 19
           Height = 19
           Caption = 'Dont encrypt (Public payload)'
           Caption = 'Dont encrypt (Public payload)'
           TabOrder = 4
           TabOrder = 4
@@ -266,21 +266,25 @@ object FRMOperation: TFRMOperation
         end
         end
         object rbEncryptedWithOldEC: TRadioButton
         object rbEncryptedWithOldEC: TRadioButton
           Left = 15
           Left = 15
-          Top = 16
-          Width = 159
+          Top = 12
+          Width = 234
           Height = 19
           Height = 19
           Caption = 'Encrypted with old public key'
           Caption = 'Encrypted with old public key'
           TabOrder = 0
           TabOrder = 0
           TabStop = True
           TabStop = True
           OnClick = memoPayloadClick
           OnClick = memoPayloadClick
         end
         end
-        object cbPayloadAsHex: TCheckBox
-          Left = 448
+        object cbPayloadDataInputType: TComboBox
+          Left = 413
           Top = 96
           Top = 96
-          Width = 97
-          Height = 17
-          Caption = 'As Hex'
+          Width = 89
+          Height = 21
+          Style = csDropDownList
           TabOrder = 6
           TabOrder = 6
+          Items.Strings = (
+            'As String'#11
+            'As Hexadecimal'#11
+            'As Base58')
         end
         end
       end
       end
       object ebFee: TEdit
       object ebFee: TEdit
@@ -373,20 +377,33 @@ object FRMOperation: TFRMOperation
             OnClick = sbSearchDestinationAccountClick
             OnClick = sbSearchDestinationAccountClick
           end
           end
           object ebDestAccount: TEdit
           object ebDestAccount: TEdit
-            Left = 114
+            Left = 115
             Top = 29
             Top = 29
-            Width = 370
+            Width = 369
             Height = 21
             Height = 21
             Anchors = [akLeft, akTop, akRight]
             Anchors = [akLeft, akTop, akRight]
             TabOrder = 0
             TabOrder = 0
           end
           end
           object ebAmount: TEdit
           object ebAmount: TEdit
             Left = 115
             Left = 115
-            Top = 58
+            Top = 56
             Width = 87
             Width = 87
             Height = 21
             Height = 21
             TabOrder = 1
             TabOrder = 1
           end
           end
+          object memoEPASA: TMemo
+            Left = 13
+            Top = 96
+            Width = 492
+            Height = 65
+            TabStop = False
+            BorderStyle = bsNone
+            ReadOnly = True
+            TabOrder = 2
+            WantReturns = False
+            OnChange = memoPayloadClick
+            OnClick = memoPayloadClick
+          end
         end
         end
         object tsChangePrivateKey: TTabSheet
         object tsChangePrivateKey: TTabSheet
           Caption = 'Change Key'
           Caption = 'Change Key'

+ 39 - 16
src/gui-classic/UFRMOperation.lfm

@@ -15,7 +15,7 @@ object FRMOperation: TFRMOperation
   OnCreate = FormCreate
   OnCreate = FormCreate
   OnDestroy = FormDestroy
   OnDestroy = FormDestroy
   Position = poOwnerFormCenter
   Position = poOwnerFormCenter
-  LCLVersion = '2.0.2.0'
+  LCLVersion = '2.0.10.0'
   object lblAccountCaption: TLabel
   object lblAccountCaption: TLabel
     Left = 25
     Left = 25
     Height = 13
     Height = 13
@@ -142,7 +142,7 @@ object FRMOperation: TFRMOperation
           Left = 255
           Left = 255
           Height = 33
           Height = 33
           Top = 87
           Top = 87
-          Width = 182
+          Width = 153
           AutoSize = False
           AutoSize = False
           Caption = 'Errors detected'
           Caption = 'Errors detected'
           Font.Color = clRed
           Font.Color = clRed
@@ -223,12 +223,18 @@ object FRMOperation: TFRMOperation
           OnClick = memoPayloadClick
           OnClick = memoPayloadClick
           TabOrder = 0
           TabOrder = 0
         end
         end
-        object cbPayloadAsHex: TCheckBox
-          Left = 444
-          Height = 19
-          Top = 92
-          Width = 54
-          Caption = 'As Hex'
+        object cbPayloadDataInputType: TComboBox
+          Left = 412
+          Height = 21
+          Top = 88
+          Width = 89
+          ItemHeight = 13
+          Items.Strings = (
+            'As String'#11
+            'As Hexadecimal'#11
+            'As Base58'
+          )
+          Style = csDropDownList
           TabOrder = 6
           TabOrder = 6
         end
         end
       end
       end
@@ -244,8 +250,8 @@ object FRMOperation: TFRMOperation
         Height = 167
         Height = 167
         Top = 11
         Top = 11
         Width = 521
         Width = 521
-        ActivePage = tsListAccount
-        TabIndex = 2
+        ActivePage = tsTransaction
+        TabIndex = 0
         TabOrder = 0
         TabOrder = 0
         OnChange = PageControlOpTypeChange
         OnChange = PageControlOpTypeChange
         object tsTransaction: TTabSheet
         object tsTransaction: TTabSheet
@@ -285,7 +291,7 @@ object FRMOperation: TFRMOperation
             Left = 115
             Left = 115
             Height = 21
             Height = 21
             Top = 29
             Top = 29
-            Width = 85
+            Width = 357
             TabOrder = 0
             TabOrder = 0
           end
           end
           object ebAmount: TEdit
           object ebAmount: TEdit
@@ -296,9 +302,9 @@ object FRMOperation: TFRMOperation
             TabOrder = 1
             TabOrder = 1
           end
           end
           object sbSearchDestinationAccount: TSpeedButton
           object sbSearchDestinationAccount: TSpeedButton
-            Left = 208
+            Left = 480
             Height = 22
             Height = 22
-            Top = 29
+            Top = 28
             Width = 23
             Width = 23
             Glyph.Data = {
             Glyph.Data = {
               36030000424D3803000000000000360000002800000010000000100000000100
               36030000424D3803000000000000360000002800000010000000100000000100
@@ -330,6 +336,23 @@ object FRMOperation: TFRMOperation
             }
             }
             OnClick = sbSearchDestinationAccountClick
             OnClick = sbSearchDestinationAccountClick
           end
           end
+          object memoEPASA: TMemo
+            Left = 13
+            Height = 48
+            Top = 88
+            Width = 492
+            BorderStyle = bsNone
+            Font.Color = clBlack
+            Font.Height = -16
+            Font.Name = 'Tahoma'
+            OnChange = memoPayloadClick
+            OnClick = memoPayloadClick
+            ParentFont = False
+            ReadOnly = True
+            TabOrder = 2
+            TabStop = False
+            WantReturns = False
+          end
         end
         end
         object tsChangePrivateKey: TTabSheet
         object tsChangePrivateKey: TTabSheet
           Caption = 'Change key'
           Caption = 'Change key'
@@ -1024,7 +1047,7 @@ object FRMOperation: TFRMOperation
     end
     end
     object tsGlobalError: TTabSheet
     object tsGlobalError: TTabSheet
       Caption = 'Notification'
       Caption = 'Notification'
-      ClientHeight = 325
+      ClientHeight = 357
       ClientWidth = 548
       ClientWidth = 548
       ImageIndex = 1
       ImageIndex = 1
       TabVisible = False
       TabVisible = False
@@ -1148,8 +1171,8 @@ object FRMOperation: TFRMOperation
     Text = 'ebSenderAccount'
     Text = 'ebSenderAccount'
   end
   end
   object ActionList: TActionList
   object ActionList: TActionList
-    left = 140
-    top = 350
+    Left = 140
+    Top = 350
     object actExecute: TAction
     object actExecute: TAction
       Caption = 'Execute (F12)'
       Caption = 'Execute (F12)'
       OnExecute = actExecuteExecute
       OnExecute = actExecuteExecute

+ 133 - 75
src/gui-classic/UFRMOperation.pas

@@ -32,7 +32,7 @@ uses
   Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, UNode, UWallet, UCrypto, Buttons, UBlockChain,
   Dialogs, StdCtrls, UNode, UWallet, UCrypto, Buttons, UBlockChain,
   UAccounts, UFRMAccountSelect, ActnList, ComCtrls, Types, UFRMMemoText,
   UAccounts, UFRMAccountSelect, ActnList, ComCtrls, Types, UFRMMemoText,
-  UPCEncryption, UBaseTypes, UPCDataTypes, UPCOrderedLists, UEPasa;
+  UPCEncryption, UBaseTypes, UPCDataTypes, UPCOrderedLists, UEPasa, UEncoding;
 
 
 Const
 Const
   CM_PC_WalletKeysChanged = WM_USER + 1;
   CM_PC_WalletKeysChanged = WM_USER + 1;
@@ -129,9 +129,10 @@ type
     ebHashLock: TEdit;
     ebHashLock: TEdit;
     btnHashLock: TSpeedButton;
     btnHashLock: TSpeedButton;
     sbTimeLock: TSpeedButton;
     sbTimeLock: TSpeedButton;
-    cbPayloadAsHex: TCheckBox;
     lblChangeAccountData: TLabel;
     lblChangeAccountData: TLabel;
     ebChangeAccountData: TEdit;
     ebChangeAccountData: TEdit;
+    cbPayloadDataInputType: TComboBox;
+    memoEPASA: TMemo;
     procedure ebNewPublicKeyExit(Sender: TObject);
     procedure ebNewPublicKeyExit(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
@@ -159,6 +160,7 @@ type
     FDefaultFee: Int64;
     FDefaultFee: Int64;
     FEncodedPayload : TOperationPayload;
     FEncodedPayload : TOperationPayload;
     FDisabled : Boolean;
     FDisabled : Boolean;
+    FUpdating : Boolean;
     FSenderAccounts: TOrderedCardinalList; // TODO: TOrderedCardinalList should be replaced with a "TCardinalList" since signer account should be processed last
     FSenderAccounts: TOrderedCardinalList; // TODO: TOrderedCardinalList should be replaced with a "TCardinalList" since signer account should be processed last
     procedure SetWalletKeys(const Value: TWalletKeys);
     procedure SetWalletKeys(const Value: TWalletKeys);
     Procedure UpdateWalletKeys;
     Procedure UpdateWalletKeys;
@@ -167,7 +169,7 @@ type
     Function UpdateFee(var Fee : Int64; errors : String) : Boolean;
     Function UpdateFee(var Fee : Int64; errors : String) : Boolean;
     Function UpdateOperationOptions(var errors : String) : Boolean;
     Function UpdateOperationOptions(var errors : String) : Boolean;
     Function UpdatePayload(Const ASenderAccount : TAccount; var AErrors : String) : Boolean;
     Function UpdatePayload(Const ASenderAccount : TAccount; var AErrors : String) : Boolean;
-    Function UpdateOpTransaction(const ASenderAccount: TAccount; out LTargetEPASA : TEPasa;  out ATargetAccount : TAccount; out AResolvedTargetKey : TAccountKey; out ATargetRequiresPurchase : Boolean; out AAmount: Int64; out AErrors: String) : Boolean;
+    Function UpdateOpTransaction(const ASenderAccount: TAccount; out ATargetEPASA : TEPasa;  out ATargetAccount : TAccount; out AResolvedTargetKey : TAccountKey; out ATargetRequiresPurchase : Boolean; out AAmount: Int64; out AErrors: String) : Boolean;
     Function UpdateOpChangeKey(Const TargetAccount : TAccount; var SignerAccount : TAccount; var NewPublicKey : TAccountKey; var errors : String) : Boolean;
     Function UpdateOpChangeKey(Const TargetAccount : TAccount; var SignerAccount : TAccount; var NewPublicKey : TAccountKey; var errors : String) : Boolean;
     Function UpdateOpListAccount(Const TargetAccount : TAccount; var SalePrice : Int64; var SellerAccount,SignerAccount : TAccount; var NewOwnerPublicKey : TAccountKey; var LockedUntilBlock : Cardinal; var HashLock : T32Bytes; var errors : String) : Boolean;
     Function UpdateOpListAccount(Const TargetAccount : TAccount; var SalePrice : Int64; var SellerAccount,SignerAccount : TAccount; var NewOwnerPublicKey : TAccountKey; var LockedUntilBlock : Cardinal; var HashLock : T32Bytes; var errors : String) : Boolean;
     Function UpdateOpDelist(Const TargetAccount : TAccount; var SignerAccount : TAccount; var errors : String) : Boolean;
     Function UpdateOpDelist(Const TargetAccount : TAccount; var SignerAccount : TAccount; var errors : String) : Boolean;
@@ -179,6 +181,7 @@ type
     procedure CM_WalletChanged(var Msg: TMessage); message CM_PC_WalletKeysChanged;
     procedure CM_WalletChanged(var Msg: TMessage); message CM_PC_WalletKeysChanged;
     Function GetDefaultSenderAccount : TAccount;
     Function GetDefaultSenderAccount : TAccount;
     procedure ebAccountKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
     procedure ebAccountKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+    function CaptureEPasa(const AEPasaTxt : String; out AEPasa : TEPasa) : Boolean;
   protected
   protected
     procedure searchAccount(editBox : TCustomEdit);
     procedure searchAccount(editBox : TCustomEdit);
   public
   public
@@ -470,6 +473,41 @@ begin
 end;
 end;
 
 
 
 
+function TFRMOperation.CaptureEPasa(const AEPasaTxt: String; out AEPasa: TEPasa): Boolean;
+begin
+  Result := TEPasa.TryParse(AEPasaTxt,AEPasa);
+  //
+  if ((FUpdating) or (Not Result)) then Exit;
+  FUpdating := True;
+  try
+    if AEPasa.PayloadType.HasTrait(ptPublic) then rbNotEncrypted.Checked := True
+    else if AEPasa.PayloadType.HasTrait(ptSenderKeyEncrypted) then rbEncryptedWithOldEC.Checked := True
+    else if AEPasa.PayloadType.HasTrait(ptRecipientKeyEncrypted) then rbEncryptedWithEC.Checked := True
+    else if AEPasa.PayloadType.HasTrait(ptPasswordEncrypted) then begin
+      rbEncrptedWithPassword.Checked := True;
+      ebEncryptPassword.Text := AEPasa.Password;
+    end;
+    if AEPasa.PayloadType.HasTrait(ptAsciiFormatted) then cbPayloadDataInputType.ItemIndex := 0
+    else if AEPasa.PayloadType.HasTrait(ptHexFormatted) then cbPayloadDataInputType.ItemIndex := 1
+    else if AEPasa.PayloadType.HasTrait(ptBase58Formatted) then cbPayloadDataInputType.ItemIndex := 2;
+    if (AEPasa.PayloadType.HasTrait(ptAsciiFormatted) or AEPasa.PayloadType.HasTrait(ptHexFormatted) or AEPasa.PayloadType.HasTrait(ptBase58Formatted)) then begin
+      memoPayload.Lines.Text := AEPasa.Payload;
+    end;
+
+    memoEPASA.Lines.Clear;
+    if AEPasa.IsPayToKey then memoEPASA.Lines.Add('PayToKey EPASA');
+    if AEPasa.IsAddressedByName then memoEPASA.Lines.Add('Addressed by name: '+AEPasa.AccountName);
+    memoEPASA.Lines.Add( AEPasa.ToString );
+    if AEPasa.PayloadType.HasTrait(ptAsciiFormatted) or AEPasa.PayloadType.HasTrait(ptBase58Formatted) or AEPasa.PayloadType.HasTrait(ptHexFormatted) then begin
+      memoEPasa.Lines.Add( 'AS BYTES: 0x'+AEPasa.GetRawPayloadBytes.ToHexaString);
+      memoEPasa.Lines.Add( 'AS PRINTABLE: '+AEPasa.GetRawPayloadBytes.ToPrintable);
+    end;
+
+  finally
+    FUpdating := False;
+  end;
+end;
+
 procedure TFRMOperation.CM_WalletChanged(var Msg: TMessage);
 procedure TFRMOperation.CM_WalletChanged(var Msg: TMessage);
 begin
 begin
    UpdateWalletKeys;
    UpdateWalletKeys;
@@ -479,14 +517,14 @@ procedure TFRMOperation.ebAccountNumberExit(Sender: TObject);
 Var LEPasa : TEPASA;
 Var LEPasa : TEPASA;
   eb : TEdit;
   eb : TEdit;
 begin
 begin
-  if (Not assigned(Sender)) then exit;
+  if (Not assigned(Sender)) or (FUpdating) then exit;
   if (Not (Sender is TEdit)) then exit;
   if (Not (Sender is TEdit)) then exit;
   eb := TEdit(Sender);
   eb := TEdit(Sender);
-  If TEPasa.TryParse(eb.Text,LEPasa) then begin
+  if CaptureEPasa(eb.Text,LEPasa) then begin
     if LEPasa.IsClassicPASA then
     if LEPasa.IsClassicPASA then
       eb.Text := LEPasa.ToClassicPASAString()
       eb.Text := LEPasa.ToClassicPASAString()
     else
     else
-      eb.Text := LEPasa.ToString();
+      eb.Text := LEPasa.ToString(True);
   end else begin
   end else begin
     eb.Text := '';
     eb.Text := '';
   end;
   end;
@@ -497,7 +535,7 @@ procedure TFRMOperation.ebCurrencyExit(Sender: TObject);
 Var m : Int64;
 Var m : Int64;
   eb : TEdit;
   eb : TEdit;
 begin
 begin
-  if (Not assigned(Sender)) then exit;
+  if (Not assigned(Sender)) or (FUpdating) then exit;
   if (Not (Sender is TEdit)) then exit;
   if (Not (Sender is TEdit)) then exit;
   eb := TEdit(Sender);
   eb := TEdit(Sender);
   If Not (eb.ReadOnly) then begin
   If Not (eb.ReadOnly) then begin
@@ -544,10 +582,10 @@ procedure TFRMOperation.FormCreate(Sender: TObject);
 begin
 begin
   {$IFDEF USE_GNUGETTEXT}TranslateComponent(self);{$ENDIF}
   {$IFDEF USE_GNUGETTEXT}TranslateComponent(self);{$ENDIF}
   FDisabled := false;
   FDisabled := false;
+  FUpdating := False;
   FWalletKeys := Nil;
   FWalletKeys := Nil;
   FSenderAccounts := TOrderedCardinalList.Create;
   FSenderAccounts := TOrderedCardinalList.Create;
   FSenderAccounts.OnListChanged := OnSenderAccountsChanged;
   FSenderAccounts.OnListChanged := OnSenderAccountsChanged;
-  FDisabled := true;
   FNode := TNode.Node;
   FNode := TNode.Node;
   ebSenderAccount.OnKeyDown:=ebAccountKeyDown;
   ebSenderAccount.OnKeyDown:=ebAccountKeyDown;
   ebSenderAccount.Tag:=CT_AS_MyAccounts;
   ebSenderAccount.Tag:=CT_AS_MyAccounts;
@@ -620,6 +658,24 @@ begin
   ebFee.OnExit:= ebCurrencyExit;
   ebFee.OnExit:= ebCurrencyExit;
   memoAccounts.Lines.Clear;
   memoAccounts.Lines.Clear;
   PageControlOpType.ActivePage := tsTransaction;
   PageControlOpType.ActivePage := tsTransaction;
+  cbPayloadDataInputType.Items.Clear;
+  cbPayloadDataInputType.Items.Add('As String');
+  cbPayloadDataInputType.Items.Add('As Hexadecimal');
+  cbPayloadDataInputType.Items.Add('As Base58');
+  cbPayloadDataInputType.ItemIndex := 0;
+  cbPayloadDataInputType.OnChange := memoPayloadClick;
+  memoPayload.OnChange := memoPayloadClick;
+  memoPayload.OnClick := memoPayloadClick;
+  memoEPASA.ScrollBars := ssBoth;
+  memoEPASA.ReadOnly := False;
+  memoEPASA.TabStop := False;
+  memoEPASA.ParentFont := True;
+  {$IFDEF TESTNET}
+  memoEPASA.Visible := True;
+  {$ELSE}
+  memoEPASA.Visible := False;
+  {$ENDIF}
+  memoEPASA.Enabled := memoEPASA.Visible;
 end;
 end;
 
 
 procedure TFRMOperation.ebNewPublicKeyExit(Sender: TObject);
 procedure TFRMOperation.ebNewPublicKeyExit(Sender: TObject);
@@ -852,17 +908,15 @@ begin
   end;
   end;
 end;
 end;
 
 
-var GInUpdateInfoClick : boolean;
 procedure TFRMOperation.updateInfoClick(Sender: TObject);
 procedure TFRMOperation.updateInfoClick(Sender: TObject);
 Var errors : String;
 Var errors : String;
 begin
 begin
-  if NOT GInUpdateInfoClick then begin
-    GInUpdateInfoClick := true;
-    try
-      UpdateOperationOptions(errors);
-    finally
-    GInUpdateInfoClick := false;
-    end;
+  if FDisabled or FUpdating then Exit;
+  FDisabled := True;
+  try
+    UpdateOperationOptions(errors);
+  finally
+    FDisabled := False;
   end;
   end;
 end;
 end;
 
 
@@ -1261,8 +1315,6 @@ begin
   lblSignerAccount.Enabled := ebSignerAccount.Enabled;
   lblSignerAccount.Enabled := ebSignerAccount.Enabled;
   lblChangeName.Enabled:= (PageControlOpType.ActivePage=tsChangeInfo) And (SenderAccounts.Count=1);
   lblChangeName.Enabled:= (PageControlOpType.ActivePage=tsChangeInfo) And (SenderAccounts.Count=1);
   ebChangeName.Enabled:= lblChangeName.Enabled;
   ebChangeName.Enabled:= lblChangeName.Enabled;
-  //
-  UpdatePayload(sender_account, e);
 end;
 end;
 
 
 function TFRMOperation.UpdateOpListAccount(const TargetAccount: TAccount;
 function TFRMOperation.UpdateOpListAccount(const TargetAccount: TAccount;
@@ -1522,20 +1574,28 @@ begin
   End;
   End;
 end;
 end;
 
 
-function TFRMOperation.UpdateOpTransaction(const ASenderAccount: TAccount; out LTargetEPASA : TEPasa; out ATargetAccount : TAccount; out AResolvedTargetKey : TECDSA_Public; out ATargetRequiresPurchase : Boolean; out AAmount: Int64; out AErrors: String): Boolean;
+function TFRMOperation.UpdateOpTransaction(const ASenderAccount: TAccount; out ATargetEPASA : TEPasa; out ATargetAccount : TAccount; out AResolvedTargetKey : TECDSA_Public; out ATargetRequiresPurchase : Boolean; out AAmount: Int64; out AErrors: String): Boolean;
 Var
 Var
   LResolvedAccountNo : Cardinal;
   LResolvedAccountNo : Cardinal;
 begin
 begin
   AErrors := '';
   AErrors := '';
   lblTransactionErrors.Caption := '';
   lblTransactionErrors.Caption := '';
   if PageControlOpType.ActivePage<>tsTransaction then exit;
   if PageControlOpType.ActivePage<>tsTransaction then exit;
-  if not TEPasa.TryParse(ebDestAccount.Text, LTargetEPASA) then begin
-    AErrors := 'Invalid dest. EPASA ('+ebDestAccount.Text+')';
+
+  if (Trim(ebDestAccount.Text)='') then begin
+    AErrors := 'Need a destintation or EPASA';
     lblTransactionErrors.Caption := AErrors;
     lblTransactionErrors.Caption := AErrors;
     Exit(False);
     Exit(False);
   end;
   end;
 
 
-  Result := TNode.Node.TryResolveEPASA(LTargetEPASA, LResolvedAccountNo, AResolvedTargetKey, ATargetRequiresPurchase, AErrors);
+
+  if Not CaptureEPasa(ebDestAccount.Text,ATargetEPasa) then begin
+    AErrors := 'Invalid EPASA value: '+ebDestAccount.Text;
+    lblTransactionErrors.Caption := AErrors;
+    Exit(False);
+  end;
+
+  Result := TNode.Node.TryResolveEPASA(ATargetEPASA, LResolvedAccountNo, AResolvedTargetKey, ATargetRequiresPurchase, AErrors);
   if NOT Result then begin
   if NOT Result then begin
     lblTransactionErrors.Caption := AErrors;
     lblTransactionErrors.Caption := AErrors;
     Exit(False);
     Exit(False);
@@ -1583,6 +1643,7 @@ Var
   LPayloadBytes : TRawBytes;
   LPayloadBytes : TRawBytes;
 begin
 begin
   LValid := false;
   LValid := false;
+  LPayloadBytes := Nil;
   LEncryptedPayloadBytes := Nil;
   LEncryptedPayloadBytes := Nil;
   FEncodedPayload := CT_TOperationPayload_NUL;
   FEncodedPayload := CT_TOperationPayload_NUL;
   LUserPayloadString := memoPayload.Lines.Text;
   LUserPayloadString := memoPayload.Lines.Text;
@@ -1590,55 +1651,53 @@ begin
   AErrors := 'Unknown error';
   AErrors := 'Unknown error';
   try
   try
     LTargetEPASA := TEPasa.Empty;
     LTargetEPASA := TEPasa.Empty;
-    If (PageControlOpType.ActivePage=tsTransaction) then begin
-      if NOT TEPasa.TryParse(ebDestAccount.Text, LTargetEPASA) then begin
-        AErrors := 'Indeterminable target';
-        Exit(False);
-      end;
-
-      if LTargetEPASA.IsPayToKey then begin
-        LValid := true;
-        Exit;
-      end;
 
 
-      if LTargetEPASA.HasPayload then begin
-        if LUserPayloadString <> '' then begin
-          AErrors := 'Ambiguous payload. Payload already specified by target EPASA.';
-          LValid := False;
-          Exit;
-        end;
-
-        if ebEncryptPassword.Text <> '' then begin
-          AErrors := 'Ambiguous payload. Password cannot be specified.';
-          LValid := False;
-          Exit;
-        end;
-      end;
-      FEncodedPayload.payload_type := LTargetEPASA.PayloadType.ToProtocolValue;
+    if NOT TEPasa.TryParse(ebDestAccount.Text, LTargetEPASA) then begin
+      AErrors := 'Indeterminable target';
+      Exit(False);
     end;
     end;
 
 
-    if (LUserPayloadString='') AND (LTargetEPASA.Payload.IsEmpty) then begin
-      LValid := true;
-      exit;
+    if (LUserPayloadString='') then begin
+      LValid := True;
+      Exit(True);
     end;
     end;
-    if LTargetEPASA.HasPayload then begin
-      LPayloadBytes := LTargetEPASA.GetRawPayloadBytes;
-    end else if cbPayloadAsHex.Checked then begin
-      if NOT TCrypto.HexaToRaw(LUserPayloadString, LPayloadBytes) then begin
-        LValid := false;
-        AErrors := 'Payload not hex-formatted';
-        exit;
+
+    LTargetEPASA.PayloadType := LTargetEPASA.PayloadType - [ptPublic] - [ptRecipientKeyEncrypted] - [ptSenderKeyEncrypted]
+      - [ptPasswordEncrypted] - [ptAsciiFormatted] - [ptHexFormatted] - [ptBase58Formatted];
+
+    case cbPayloadDataInputType.ItemIndex of
+      0 : begin
+           LTargetEPASA.PayloadType := LTargetEPASA.PayloadType + [ptAsciiFormatted];
+           LPayloadBytes := TEncoding.ASCII.GetBytes(LUserPayloadString);
+      end;
+      1 : begin
+         LTargetEPASA.PayloadType := LTargetEPASA.PayloadType + [ptHexFormatted];
+         if Not THexEncoding.TryDecode(LUserPayloadString,LPayloadBytes) then begin
+           AErrors := 'Payload is not an Hexadecimal string';
+           Exit(False);
+         end;
       end;
       end;
-    end else LPayloadBytes := TEncoding.ANSI.GetBytes(LUserPayloadString);
+      2 : begin
+         LTargetEPASA.PayloadType := LTargetEPASA.PayloadType + [ptBase58Formatted];
+         if Not TPascalBase58Encoding.TryDecode(LUserPayloadString,LPayloadBytes) then begin
+           AErrors := 'Payload is not a Base 58 string';
+           Exit(False);
+         end;
+      end
+    else
+    end;
+    LTargetEPASA.Payload := LUserPayloadString;
 
 
-    if (NOT LTargetEPasa.HasPayload AND rbEncryptedWithOldEC.Checked) OR LTargetEPASA.PayloadType.HasTrait(ptSenderKeyEncrypted) then begin
+    if (Length(LPayloadBytes)>0) and (rbEncryptedWithOldEC.Checked) then begin
       // Use sender
       // Use sender
-      AErrors := 'Error encrypting';
+      LTargetEPASA.PayloadType := LTargetEPASA.PayloadType + [ptSenderKeyEncrypted];
+      AErrors := 'Error encrypting by sender';
       LAccount := FNode.GetMempoolAccount(ASenderAccount.account);
       LAccount := FNode.GetMempoolAccount(ASenderAccount.account);
       TPCEncryption.DoPascalCoinECIESEncrypt(LAccount.accountInfo.accountKey,LPayloadBytes,LEncryptedPayloadBytes);
       TPCEncryption.DoPascalCoinECIESEncrypt(LAccount.accountInfo.accountKey,LPayloadBytes,LEncryptedPayloadBytes);
       LValid := Length(LEncryptedPayloadBytes)>0;
       LValid := Length(LEncryptedPayloadBytes)>0;
-    end else if (NOT LTargetEPasa.HasPayload AND rbEncryptedWithEC.Checked) or LTargetEPASA.PayloadType.HasTrait(ptRecipientKeyEncrypted) then begin
-      AErrors := 'Error encrypting';
+    end else if (Length(LPayloadBytes)>0) and (rbEncryptedWithEC.Checked) then begin
+      AErrors := 'Error encrypting by recipient';
+      LTargetEPASA.PayloadType := LTargetEPASA.PayloadType + [ptRecipientKeyEncrypted];
       if (PageControlOpType.ActivePage=tsTransaction) or (PageControlOpType.ActivePage=tsListAccount) or (PageControlOpType.ActivePage=tsDelistAccount)
       if (PageControlOpType.ActivePage=tsTransaction) or (PageControlOpType.ActivePage=tsListAccount) or (PageControlOpType.ActivePage=tsDelistAccount)
         or (PageControlOpType.ActivePage=tsBuyAccount) then begin
         or (PageControlOpType.ActivePage=tsBuyAccount) then begin
 
 
@@ -1704,14 +1763,14 @@ begin
       end else begin
       end else begin
         AErrors := 'This operation does not allow this kind of payload';
         AErrors := 'This operation does not allow this kind of payload';
       end;
       end;
-    end else if (NOT LTargetEPasa.HasPayload AND rbEncrptedWithPassword.Checked) OR LTargetEPASA.PayloadType.HasTrait(ptPasswordEncrypted) then begin
-      if LTargetEPASA.PayloadType.HasTrait(ptPasswordEncrypted) then
-        LPassword := LTargetEPASA.Password
-      else
-        LPassword := ebEncryptPassword.Text;
+    end else if (Length(LPayloadBytes)>0) AND (rbEncrptedWithPassword.Checked) then begin
+      LTargetEPASA.PayloadType := LTargetEPASA.PayloadType + [ptPasswordEncrypted];
+      LPassword := ebEncryptPassword.Text;
       LEncryptedPayloadBytes := TPCEncryption.DoPascalCoinAESEncrypt(LPayloadBytes,TEncoding.ANSI.GetBytes(LPassword));
       LEncryptedPayloadBytes := TPCEncryption.DoPascalCoinAESEncrypt(LPayloadBytes,TEncoding.ANSI.GetBytes(LPassword));
+      LTargetEPASA.Password := LPassword;
       LValid := Length(LEncryptedPayloadBytes)>0;
       LValid := Length(LEncryptedPayloadBytes)>0;
-    end else if (NOT LTargetEPasa.HasPayload AND rbNotEncrypted.Checked) or LTargetEPASA.PayloadType.HasTrait(ptPublic) then begin
+    end else if (Length(LPayloadBytes)>0) AND (rbNotEncrypted.Checked) then begin
+      LTargetEPASA.PayloadType := LTargetEPASA.PayloadType + [ptPublic];
       LEncryptedPayloadBytes := LPayloadBytes;
       LEncryptedPayloadBytes := LPayloadBytes;
       LValid := true;
       LValid := true;
     end else begin
     end else begin
@@ -1726,19 +1785,18 @@ begin
     end;
     end;
     if LValid then begin
     if LValid then begin
       lblEncryptionErrors.Caption := '';
       lblEncryptionErrors.Caption := '';
-      if LTargetEPASA.HasPayload then
-        lblPayloadLength.Caption := Format('(%db -> %db)',[length(LTargetEPASA.Payload),length(LEncryptedPayloadBytes)])
-      else
-        lblPayloadLength.Caption := Format('(%db -> %db)',[length(LUserPayloadString),length(LEncryptedPayloadBytes)]);
+      lblPayloadLength.Caption := Format('(%db -> %db)',[length(LTargetEPASA.Payload),length(LEncryptedPayloadBytes)])
     end else begin
     end else begin
+      if Trim(AErrors)='' then AErrors := 'Undefined';
       lblEncryptionErrors.Caption := AErrors;
       lblEncryptionErrors.Caption := AErrors;
-      if LTargetEPASA.HasPayload then
-        lblPayloadLength.Caption := Format('(%db -> ?)',[length(LTargetEPASA.Payload)])
-      else
-        lblPayloadLength.Caption := Format('(%db -> ?)',[length(LUserPayloadString)]);
+      lblPayloadLength.Caption := Format('(%db -> ?)',[length(LTargetEPASA.Payload)])
     end;
     end;
+    FEncodedPayload.payload_type := LTargetEPASA.PayloadType.ToProtocolValue;
     FEncodedPayload.payload_raw := LEncryptedPayloadBytes;
     FEncodedPayload.payload_raw := LEncryptedPayloadBytes;
     Result := LValid;
     Result := LValid;
+    if (LValid) And (Not FUpdating) then begin
+      ebDestAccount.Text := LTargetEPASA.ToClassicPASAString;
+    end;
   end;
   end;
 end;
 end;
 
 

+ 5 - 1
src/gui-classic/UFRMWallet.pas

@@ -35,7 +35,7 @@ uses
   UNode, UGridUtils, UJSONFunctions, UAccounts, Menus, ImgList, UNetProtocol,
   UNode, UGridUtils, UJSONFunctions, UAccounts, Menus, ImgList, UNetProtocol,
   UCrypto, Buttons, UPoolMining, URPC, UFRMAccountSelect, UConst,
   UCrypto, Buttons, UPoolMining, URPC, UFRMAccountSelect, UConst,
   UAccountKeyStorage, UBaseTypes, UPCDataTypes, UOrderedList,
   UAccountKeyStorage, UBaseTypes, UPCDataTypes, UOrderedList,
-  UFRMRPCCalls, UTxMultiOperation, USettings,
+  UFRMRPCCalls, UTxMultiOperation, USettings, UEPasa,
   {$IFNDEF FPC}System.Generics.Collections{$ELSE}Generics.Collections{$ENDIF};
   {$IFNDEF FPC}System.Generics.Collections{$ELSE}Generics.Collections{$ENDIF};
 
 
 Const
 Const
@@ -981,6 +981,7 @@ procedure TFRMWallet.FillOperationInformation(const Strings: TStrings;
   const OperationResume: TOperationResume);
   const OperationResume: TOperationResume);
 var i : Integer;
 var i : Integer;
   jsonObj : TPCJSONObject;
   jsonObj : TPCJSONObject;
+  LEPASA : TEPasa;
 begin
 begin
   If (not OperationResume.valid) then exit;
   If (not OperationResume.valid) then exit;
   If OperationResume.Block<FNode.Bank.BlocksCount then
   If OperationResume.Block<FNode.Bank.BlocksCount then
@@ -1009,6 +1010,9 @@ begin
   If (Length(OperationResume.OperationHash_OLD)>0) then begin
   If (Length(OperationResume.OperationHash_OLD)>0) then begin
     Strings.Add(Format('Old Operation Hash (old_ophash): %s',[TCrypto.ToHexaString(OperationResume.OperationHash_OLD)]));
     Strings.Add(Format('Old Operation Hash (old_ophash): %s',[TCrypto.ToHexaString(OperationResume.OperationHash_OLD)]));
   end;
   end;
+  if TAccountComp.TryDecodeEPASAPartial(OperationResume.DestAccount,OperationResume.OriginalPayload.payload_raw,OperationResume.OriginalPayload.payload_type,LEPASA) then begin
+    Strings.Add('EPASA: '+LEPASA.ToString);
+  end else Strings.Add('No EPASA format');
   Strings.Add(Format('Payload type:%d length:%d',[OperationResume.OriginalPayload.payload_type, length(OperationResume.OriginalPayload.payload_raw)]));
   Strings.Add(Format('Payload type:%d length:%d',[OperationResume.OriginalPayload.payload_type, length(OperationResume.OriginalPayload.payload_raw)]));
   if (Length(OperationResume.OriginalPayload.payload_raw)>0) then begin
   if (Length(OperationResume.OriginalPayload.payload_raw)>0) then begin
     If OperationResume.PrintablePayload<>'' then begin
     If OperationResume.PrintablePayload<>'' then begin

+ 4 - 1
src/gui-classic/UGridUtils.pas

@@ -1208,7 +1208,10 @@ begin
         end;
         end;
         Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
         Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
       end else if ACol=7 then begin
       end else if ACol=7 then begin
-        s := opr.PrintablePayload;
+        if Length(opr.Receivers)>0 then begin
+          s := opr.Receivers[0].AccountEPASA.ToString();
+          if s='' then s := opr.PrintablePayload;
+        end else s := opr.PrintablePayload;
         Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfLeft,tfVerticalCenter,tfSingleLine]);
         Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfLeft,tfVerticalCenter,tfSingleLine]);
       end else begin
       end else begin
         s := '(???)';
         s := '(???)';