Prechádzať zdrojové kódy

Restructured & Merged: development and master

Herman Schoenfeld 7 rokov pred
rodič
commit
b5a0869ff0
100 zmenil súbory, kde vykonal 17516 pridanie a 1243 odobranie
  1. 49 40
      PIP/PIP-0009.md
  2. 23 4
      PIP/PIP-0015.md
  3. 6 2
      PIP/PIP-0016.md
  4. 72 16
      PIP/PIP-0017.md
  5. 0 1
      PascalCoinWallet.app/Contents/MacOS/PascalCoinWallet
  6. BIN
      PascalCoinWallet.ico
  7. BIN
      PascalCoinWallet.res
  8. 0 625
      Units/Utils/UCache.pas
  9. 0 1
      Units/Utils/UVisualGrid.rc
  10. 1 0
      build/README.md
  11. 0 0
      build/osx/PascalCoinWallet.app/Contents/Info.plist
  12. 1 0
      build/osx/PascalCoinWallet.app/Contents/MacOS/PascalCoinWallet
  13. 0 0
      build/osx/PascalCoinWallet.app/Contents/PkgInfo
  14. BIN
      resources/icons/PascalCoinWallet.ico
  15. 0 0
      src/PascalCoinMiner.pp
  16. 3 1
      src/common/UAppParams.pas
  17. 0 0
      src/common/UAutoScope.pas
  18. 39 6
      src/common/UFolderHelper.pas
  19. 86 63
      src/common/UGridUtils.pas
  20. 77 1
      src/common/UJSONFunctions.pas
  21. 34 11
      src/config.inc
  22. 12 1
      src/core/UAES.pas
  23. 0 0
      src/core/UAccountKeyStorage.pas
  24. 36 23
      src/core/UAccounts.pas
  25. 7 4
      src/core/UBaseTypes.pas
  26. 213 50
      src/core/UBlockChain.pas
  27. 5 2
      src/core/UChunk.pas
  28. 13 8
      src/core/UConst.pas
  29. 37 18
      src/core/UCrypto.pas
  30. 0 0
      src/core/UDataSources.pas
  31. 23 1
      src/core/UECIES.pas
  32. 3 1
      src/core/UFileStorage.pas
  33. 0 0
      src/core/UGPUMining.pas
  34. 6 6
      src/core/ULog.pas
  35. 524 250
      src/core/UNetProtocol.pas
  36. 3 1
      src/core/UNode.pas
  37. 70 24
      src/core/UOpTransaction.pas
  38. 17 7
      src/core/UOpenSSL.pas
  39. 3 1
      src/core/UOpenSSLdef.pas
  40. 0 0
      src/core/UPoolMinerThreads.pas
  41. 11 4
      src/core/UPoolMining.pas
  42. 6 3
      src/core/URPC.pas
  43. 3 1
      src/core/UServerApp.pas
  44. 28 21
      src/core/USettings.pas
  45. 0 0
      src/core/USha256.pas
  46. 14 1
      src/core/UTCPIP.pas
  47. 8 2
      src/core/UThread.pas
  48. 43 2
      src/core/UTime.pas
  49. 3 1
      src/core/UWallet.pas
  50. 2 2
      src/core/upcdaemon.pas
  51. 308 0
      src/gui-classic/UFRMAbout.dfm
  52. 283 0
      src/gui-classic/UFRMAbout.lfm
  53. 106 0
      src/gui-classic/UFRMAbout.pas
  54. 101 0
      src/gui-classic/UFRMAccountInfo.dfm
  55. 29 0
      src/gui-classic/UFRMAccountInfo.pas
  56. 268 0
      src/gui-classic/UFRMAccountSelect.dfm
  57. 270 0
      src/gui-classic/UFRMAccountSelect.lfm
  58. 578 0
      src/gui-classic/UFRMAccountSelect.pas
  59. 66 0
      src/gui-classic/UFRMMemoText.dfm
  60. 58 0
      src/gui-classic/UFRMMemoText.lfm
  61. 46 0
      src/gui-classic/UFRMMemoText.pas
  62. 86 0
      src/gui-classic/UFRMNewPrivateKeyType.dfm
  63. 97 0
      src/gui-classic/UFRMNewPrivateKeyType.lfm
  64. 106 0
      src/gui-classic/UFRMNewPrivateKeyType.pas
  65. 86 0
      src/gui-classic/UFRMNodesIp.dfm
  66. 87 0
      src/gui-classic/UFRMNodesIp.lfm
  67. 138 0
      src/gui-classic/UFRMNodesIp.pas
  68. 1100 0
      src/gui-classic/UFRMOperation.dfm
  69. 1041 0
      src/gui-classic/UFRMOperation.lfm
  70. 1425 0
      src/gui-classic/UFRMOperation.pas
  71. 381 0
      src/gui-classic/UFRMPascalCoinWalletConfig.dfm
  72. 400 0
      src/gui-classic/UFRMPascalCoinWalletConfig.lfm
  73. 277 0
      src/gui-classic/UFRMPascalCoinWalletConfig.pas
  74. 426 0
      src/gui-classic/UFRMPayloadDecoder.dfm
  75. 0 0
      src/gui-classic/UFRMPayloadDecoder.lfm
  76. 440 0
      src/gui-classic/UFRMPayloadDecoder.pas
  77. 220 0
      src/gui-classic/UFRMSaleAccounts.dfm
  78. 245 0
      src/gui-classic/UFRMSaleAccounts.pas
  79. 1716 0
      src/gui-classic/UFRMWallet.dfm
  80. 1511 0
      src/gui-classic/UFRMWallet.lfm
  81. 1942 0
      src/gui-classic/UFRMWallet.pas
  82. 800 0
      src/gui-classic/UFRMWalletKeys.dfm
  83. 793 0
      src/gui-classic/UFRMWalletKeys.lfm
  84. 575 0
      src/gui-classic/UFRMWalletKeys.pas
  85. 0 0
      src/gui/UCTRLBanner.lfm
  86. 1 1
      src/gui/UCTRLBanner.pas
  87. 0 0
      src/gui/UCTRLSyncronization.lfm
  88. 1 1
      src/gui/UCTRLSyncronization.pas
  89. 20 28
      src/gui/UCTRLWallet.lfm
  90. 1 2
      src/gui/UCTRLWallet.pas
  91. 2 1
      src/gui/UFRMAbout.lfm
  92. 1 1
      src/gui/UFRMAbout.pas
  93. 0 0
      src/gui/UFRMAccountExplorer.lfm
  94. 1 1
      src/gui/UFRMAccountExplorer.pas
  95. 0 0
      src/gui/UFRMAccountInfo.lfm
  96. 1 1
      src/gui/UFRMAccountInfo.pas
  97. 0 0
      src/gui/UFRMAccountSelect.lfm
  98. 1 1
      src/gui/UFRMAccountSelect.pas
  99. 0 0
      src/gui/UFRMBlockExplorer.lfm
  100. 1 1
      src/gui/UFRMBlockExplorer.pas

+ 49 - 40
PIP/PIP-0009.md

@@ -37,12 +37,12 @@ A low-memory, GPU and ASIC-resistant hash algorithm called **Random Hash** is pr
 
 1. Hashing a nonce requires ```N``` iterations (called rounds)
 2. Each round selects a random hash function from a set of 16 well-known hash algorithms
-3. The input at round ```x``` depends on round ```x-1```
-4. The input at round x depends on round ```x-1``` **of a different nonce** determined based on the output from round ```x-1``` for the current nonce
-5. The input at round ```x``` is a compression of the outputs of every contributing stage to ```100 bytes```
+3. The input at round ```x``` is salted with the outputs of all prior rounds
+4. The input at round ```x``` is salted with the output of all prior rounds **of a different nonce**, randomly determined
+5. The input at round ```x``` is a compression of the transitive closure of prior/neighbouring round outputs to the size of ```100 bytes```
 6. The output of every round is expanded for memory-hardness
 7. Randomness is generated using ```Mersenne Twister``` algorithm
-8. Randomness is seeded via ```MurMur3``` checksum of previous round
+8. Randomness is seeded via ```MurMur3``` checksum of current round
 9. The final round is then hashed again via ```SHA2_256```, in keeping with traditional cryptocurrency approaches.
 
 ### RandomHash Design
@@ -56,16 +56,18 @@ A low-memory, GPU and ASIC-resistant hash algorithm called **Random Hash** is pr
             SHA2_256
             SHA2_384
             SHA2_512
-            SHA3,
+            SHA3_256,
+            SHA3_384,
+            SHA3_512,
             RIPEMD160,
             RIPEMD256,
             RIPEMD320,
             Blake2b, 
             Blake2s,
-            Tiger2,
-            Snerfu,
+            Tiger2_5_192,
+            Snefru_8_256,
             Grindahl512,
-            Haval,
+            Haval_5_256,
             MD5
             RadioGatun32
             Whirlpool
@@ -73,54 +75,56 @@ A low-memory, GPU and ASIC-resistant hash algorithm called **Random Hash** is pr
         N = 5           // Number of hashing rounds required to compute a nonce (total rounds = 2^N - 1)
         M = 10KB        // The memory expansion unit (in bytes)
 
-        Function RandomHash(blockHeader : ByteArray)
+        Function RandomHash(blockHeader : ByteArray) : ByteArray
         begin
-            let AllOutputs = RandomHash( blockHeader, N)
-            seed = Checksum(neighborOutputs[Length(AllOutputs) - 1])
-            Result := SHA2_256( Compress(AllOutputs, RandomNumberGenerator(seed)) )
+            let allOutputs = RandomHash( blockHeader, N)
+            Result := SHA2_256( Compress( allOutputs ) )
         end
 
-        Function RandomHash(blockHeader : ByteArray, Round : Integer) : list of ByteArray
+        Function RandomHash(blockHeader : ByteArray, Round : Integer) : List of ByteArray
         begin
-            let RoundOutputs = list of ByteArray;
+            if Round < 1 or Round > N then
+                Error 'Round must be between 0 and N inclusive'
+
+            let roundOutputs = new List of ByteArray;
             
             if Round = 1 then
                 let seed = Checksum(blockHeader)      // can hash blockHeader first, but not required
                 let gen = RandomNumberGenerator(seed)
-                let input = blockHeader
+                let roundInput = blockHeader
             else
                 let parentOutputs = RandomHash(blockHeader, Round - 1)
-                RoundOutputs.addAll(parentOutputs)
-                let seed = Checksum(neighborOutputs[Length(neighborOutputs) - 1])
+                let seed = Checksum(parentOutputs)
                 let gen = RandomNumberGenerator(seed)
+
+                roundOutputs.AddMany(parentOutputs)
                 
                 let otherNonceHeader = ChangeNonce(blockHeader, gen.NextDWord)
                 let neighborOutputs = RandomHash(blockHeader, Round - 1)
-                RoundOutputs.addAll(neighborOutput)
+                roundOutputs.AddMany(neighborOutputs)
                 
-                // re-seed RNG based on random other nonce output
-                seed = Checksum(neighborOutputs[Length(neighborOutputs) - 1])
-                gen = RandomNumberGenerator(seed)
-                let input = Compress(RoundOutputs, gen)
+                let roundInput = Compress(roundOutputs)
             
-            let hashFunc = HASH_ALGO[gen.NextDWord % 16]   
-            let output = hashFunc(input)                
-            output = Expand( output, N - i, gen )
-            RoundOutputs.add(output)
+            let hashFunc = HASH_ALGO[gen.NextDWord % 18]   
+            let output = hashFunc(roundInput)                
+            output = Expand( output, N - Round )
+            roundOutputs.Add(output)
 
-            Result := RoundOutputs
+            Result := roundOutputs
         end
 
 
-        function Expand(input : ByteArray, ExpansionFactor : Integer, gen : RandomNumberGenerator) : ByteArray
+        function Expand(input : ByteArray, ExpansionFactor : Integer) : ByteArray
         begin
-            let Size = Length(input) + ExpansionFactor*M;
+            let seed = Checksum(input)
+            let gen = RandomNumberGenerator(seed)
+            let size = Length(input) + ExpansionFactor*M;
             let output = input.Clone
-            let bytesToAdd = Size - Length(input)
-            while output < Size do
+            let bytesToAdd = size - Length(input)
+            while bytesToAdd > 0 do
                 let nextChunk = output.Clone
-                if Length(output) + Length(nextChunk) > Size then
-                    SetLength(nextChunk, Size - Length(output))
+                if Length(nextChunk) > bytesToAdd then
+                    SetLength(nextChunk, bytesToAdd)
 
                 let random = gen.NextDWord
                 case random % 8 do
@@ -130,31 +134,35 @@ A low-memory, GPU and ASIC-resistant hash algorithm called **Random Hash** is pr
                                 .
                                 .
                     7: output = output ++ MemTransform8(nextChunk)
-
+                bytesToAdd = bytesToAdd - Length(nextChunk)
             Result = output
         end
 
-        function Compress(inputs : list of ByteArray, gen : RandomNumberGenerator) : ByteArray
+        function Compress(inputs : list of ByteArray) : ByteArray
         begin
+            let seed = Checksum(inputs)
+            let gen = RandomNumberGenerator(seed)
             let output = Byte[0..99]
-
             for i = 0 to 99 do
                 let source = inputs[ gen.NextDWord % Length(inputs) ]
                 output[i] = source[ gen.NextDWord % Length(source) ]
-
             Result := output
         end 
 
         function ChangeNonce(blockHeader : ByteArray, nonce : Integer) : ByteArray
         begin
-            // changes nonce in blockHeader by knowing offset of nonce
+            // clones and changes nonce in blockHeader (by determining offset of nonce)
         end
 
-
         Function Checksum(input : ByteArray) : DWord
         begin
             // standard MurMu3 algorithm
         end
+    
+        Function Checksum(inputs : List of ByteArray) : DWord
+        begin
+            // standard MurMu3 algorithm run over list of inputs
+        end
 
         Function RandomNumberGenerator(seed : DWord) : TMersenneTwister
             // standard Mersenne Twister random number generator (or other suitably chosen algorithm)
@@ -163,7 +171,7 @@ A low-memory, GPU and ASIC-resistant hash algorithm called **Random Hash** is pr
 
 #### Memory transform methods
 
-These methods are iteratively and randomly applied to a hash output in order to rapidly expand it for compression in the next round
+These methods are iteratively and randomly applied to a hash output in order to rapidly expand it for compression in the next round. **Note**: the length of the output is always the same as the length of the input.
 ```
      - Method 1: No-Op         (e.g. input = 123456   output = 123456)
      - Method 2: Swap-LR       (e.g. input = 123456   output = 456123)   
@@ -341,6 +349,7 @@ This PIP is not backwards compatible and requires a hard-fork activation. Previo
 A reference implementation will be provided in the coming weeks.
  
 ## Acknowledgements
+
 Refinements to improve GPU-hardness were provided by Ian Muldoon.
  
 ## Links

+ 23 - 4
PIP/PIP-0015.md

@@ -40,7 +40,7 @@ function GetOpRef(operation : Operation) : QWord
 begin
   let accountNumber = operation.Account
   let n_operation = operation.n_operation
-  Result = (QWord(accountNumber) SHL 31) BIT-OR QWord(n_operation))
+  Result = (QWord(accountNumber) SHL 32) BIT-OR QWord(n_operation))
 end
 ```
 
@@ -81,17 +81,23 @@ end
 
 ### New Network Operation: NET_OP_PULL_ACCOUNT_OPS
 
-This network operation allows a node to fetch specific operations from other nodes that it does not have. It is used when rebuilding the block from the block skeleton. If the node does not have the operations referenced in the skeleton, it uses this network operation to fetch them from other peers. This operation will be used sparingly since most nodes will already have most of the operations most of the time.
+This network operation allows a node to fetch specific block operations from other nodes that it does not have. It is used for rebuilding the full block from the block skeleton. The requesting node references the desired block operation using a ```BLOCK_OP_REF``` which is a QWord structure defined as follows:
+
+```
+    BLOCK_OP_REF = (QWord(BlockNumber) SHL 32) BIT-OR QWord(OperationIndex)
+```
+
+ If the receiving node does not have this operation, the requesting node re-sends the request to other nodes until one is found (or abandoned). This operation will be used in-frequently since most nodes have most of the operations most of the time.
 
 **Arguments**
 - N: DWord - the number of operations being requested
-- OP_REF_1: QWord - the first operation being requested
+- BLOCK_OP_REF_1: QWord - the first operation being requested
 
     .
     .
     .
     
-- OP_REF_N: QWord - the N'th operation being requested
+- BLOCK_OP_REF_N: QWord - the N'th operation being requested
 
 **Output**
 - M: DWord - the number of operations being returned
@@ -105,6 +111,19 @@ This network operation allows a node to fetch specific operations from other nod
 - OP_SIZE_M : DWord - the size of the M'th operation being returned
 - OP_M - the raw data of M'th operation being returned
 
+### Block Propagation Workflow
+
+Suppose Bob and Alice run nodes and Alice encounters a new valid block B.
+
+- Alice sends B to Bob in the form of a Block Skeleton
+- Bob reconstructs block by pulling missing operations from Alice using NET_OP_PULL_ACCOUNT_OPS
+- Bob validates block B
+  + If invalid, Bob reconstructs B again by pulling **all** the operations from Alice, including ones he already had.
+    * If invalid, Bob discards B and blacklists Alice
+    * Otherwise Bob accepts B as the next block
+  + Otherwise Bob accepts B as the next block
+  
+**NOTE**: other network operations will need to be modified to support Block Skeleton pushing.
 ## Rationale
 
 This provides a 95% reduction in the block data being transmitted increasing propagation efficiency. As a result, orphan rates are expected to proportionally reduce resulting a dramatically less number of orphans. In combination with other PIPs that improve SafeBox rollback efficiency, PascalCoin will be able to seamlessly support CPU-mining such as proposed in [PIP-0009][1].

+ 6 - 2
PIP/PIP-0016.md

@@ -28,6 +28,7 @@ A new operation called DATA is proposed that allows accounts to send data to ano
 - **Sequence**: this is used by Layer-2 protocol to envelope it's message into many Layer-1 messages, just as HTTP response is enveloped over many TCP messages. 
 - **Account**: this is the account authoring the operation
 - **Destination**: this is the account receiving the operation
+- **Quantity**: this is an **optional** PASC quantity to transfer (can be 0)
 - **Fee**: the network fee payable to miner
 - **Payload**: the 256 byte operation payload containing Layer-2 data
 - **Signer**: this is the signer account which pays the fee
@@ -37,10 +38,13 @@ A new operation called DATA is proposed that allows accounts to send data to ano
 - The Signer Account balance must greater than or equal to Fee
 - The public keys for Signer Account and Account must be identical
 - The Signature must be well-formed ECDSA signature verifiable using Signer Account's public key
+- Account balance >= Quantity + Fee
 
 **Mutation Rules**
-- Only the usual N_OPERATION and Fee mutations are made to Account and Signer.
-- Destination account state is **not changed**.
+- Account Balance = Account Balance - Quantity
+- Signer Balance = Signer Balance - Fee
+- Account NOperation = Account NOperation + 1
+- Destination Balance = Destination Balance + Quantity  
 
 **NOTE**
 It's important to note that this operation only transfers data between accounts, not PASC or PASA. Since nodes delete these operations after 100 blocks, it's up to Layer-2 applications to ensure they are persisted separately. 

+ 72 - 16
PIP/PIP-0017.md

@@ -11,7 +11,7 @@
 
 ## Summary
 
-A new operation called MULTI-TRANSACTION is proposed that allows a transfer of funds from N accounts to M accounts within in a single operation. This will immediately provide DASH-level anonymity and serve as foundational component for subsequent full anonymity. 
+A new operation called MULTI-TRANSACTION is proposed that allows a transfer of PASC from N accounts to M accounts and a transfer of U PASA to U new keys. This will immediately provide "better-than-DASH-level" anonymity and serve as foundational component for subsequent full anonymity. It will also facilitate Layer-2 applications such as decentralized exchanges in a manner that other cryptocurrencies cannot achieve!
 
 ## Motivation
 
@@ -27,7 +27,11 @@ As phase-2 of anonymity, the network protocol will be upgraded via soft-fork to
 
 **Chaining Multi-Transactions**
 
-Immediately and improved in phase-2, users will be able to chain multiple Multi-Transactions together delivering indecipherable complexity between transfers.
+Immediately and improved in phase-2, users will be able to chain multiple Multi-Transactions together delivering indecipherable complexity between transfers
+
+**Decentralized Exchanging**
+
+This operation, in combination with PascalCoin Asset Tokens (to be added in future), will facilitate Layer-2 decentralized cryptocurrency exchange protocols. This is because a MULTI-TRANSACTION allows market makers and market makers to negotiate and orechestrate an exchange of PASC/PASA/Tokens between themselves in a trust-free and off-line manner. As a result, a MULTI-TRANSACTION operation will serve as a fundamental building block for an infinitely-scalable Layer-2 decentralised exchange protocol running over the PascalCoin network planned by Sphere 10 Software (company of Author).
 
 **Monetized-API Mixing**
 
@@ -49,9 +53,9 @@ A new operation called MULTI-TRANSACTION is proposed as follows:
     .
 
 - SenderAccount_N : DWord - N'th sender account
-- SenderQuantity_N : DWord - amount N'th sender is sending
+- SenderQuantity_N : QWord - amount N'th sender is sending
 - SenderNOperation_N: DWord - the new N_OPERATION value of N'th senders account 
-- RecipientCount: Word - number of recipient accounts (M)
+- RecipientCount: DWord - number of recipient accounts (M)
 - RecipientAccount_1: DWord - first recipient account
 - RecipientQuantity_1 : QWord - amount first recipient is receiving
 
@@ -61,21 +65,58 @@ A new operation called MULTI-TRANSACTION is proposed as follows:
 
 - RecipientAccount_M : DWord - M'th recipient
 - RecipientQuantity_M : QWord - amount M'th recipient is receiving
-- SenderFee: network fee payable to miners **per sender**
+- Fee: QWORD - network fee payable to the miner
+- ChangeKeyCount : DWord - the number of accounts that will be changing key (U)
+- ChangeKeyAccount_1 : DWord - the first account that will have key changed
+- ChangeKeyAccountNOperation_1 : DWord - resulting NOperation of ChangeKeyAccount_1
+
+    .
+    .
+    .
+
+- ChangeKeyAccount_U : DWord - the U'th account that will have key changed
+- ChangeKeyAccountNOperation_U : DWord - resulting NOperation of ChangeKeyAccount_U
+- NewKey_1 - the new key associated to ChangeKeyAccount_1
+
+    .
+    .
+    .
+
+- NewKey_U - the new key associated to ChangeKeyAccount_U
 - Payload: operation payload
-- SenderSignature_1: signature of first sender
+- SenderSignature_1: signature blob of first sender
 
     .
     .
     .
 
-- SenderSignature_N: signature of N'th sender
+- SenderSignature_N: signature blob of N'th sender
+- ChangeKeySignature_1: signature blob of first sender
+
+    .
+    .
+    .
+
+- ChangeKeySignature_N: signature blob of N'th sender
 
 **Consensus Rules**
-- Ensure fee per sender is non-zero
+
+- Ensure no duplicate sender or change key accounts
 ```
-SenderFee > 0
+Length( SELECT SenderAccount FROM MULTI-TRANSACTION ) = Length( SELECT DISTINCT SenderAccount FROM MULTI-TRANSACTION )
+
+Length( SELECT ChangeKeyAccount FROM MULTI-TRANSACTION ) = Length( SELECT DISTINCT ChangeKeyAccount FROM MULTI-TRANSACTION )
 ```
+**NOTE** The above protocol does allow a sender X and then change key of X, but only 1 of each.
+
+- Ensure fee covers all operations
+```
+Fee >= (SenderCount + RecipientCount + ChangeKeyCount) * MIN_FEE   
+where
+   MIN_FEE = 0.0001 (current protocol)
+```
+
+**NOTE**: ChangeAccountKey entries do **not** pay a fee directly. In practice, their fee portion is covered by a separate SenderAccount entry that pays the fee for both itself and the ChangeKeyAccount entry. Alternatively, a single user could decide to cover someone/everyone elses fee's. The Fee is merely the difference between SUM(SenderQuantity) - SUM(ReceiverQuantity) and must account for all the entries in the multi-transaction. 
 
 - Ensure at least 1 sender
 ```
@@ -87,15 +128,15 @@ SenderCount > 0
 RecipientCount > 0
 ```
 
-- Ensure all senders have enough to send and pay fee
+- Ensure all senders have enough to send
 ```
 for-all s in Senders 
-    SafeBox.Accounts[s.Account].Balance >= s.Quantity + SenderFee
+    SafeBox.Accounts[s.Account].Balance >= s.Quantity
 ```
 
 - Ensure the amount being spent balances the amount being received
 ```
-SUM( select Quantity from Senders ) = SUM( select Quantity from Recipients ) + Count( Senders ) * SenderFee
+SUM( select Quantity from Senders ) = SUM( select Quantity from Recipients ) + Fee
 ```
 
 - Ensure the sender N_OPERATION values are correct 
@@ -104,11 +145,26 @@ for-all s in Senders
     s.NOperation = SafeBox.Accounts[s.Account].NOperation + 1
 ```
 
-- Ensure that all senders sign the entire message **except the signature portion**
+- Ensure the change key N_OPERATION values are correct 
+```
+for-all c in ChangeKeyAccounts
+    var expectedNOperation = SafeBox.Accounts[c.Account].NOperation + 1
+    if Senders.Contains(c.Account)
+       expectedNOperation = expectedNOperation + 1
+    
+    c.NOperation = expectedNOperation
+```
+
+- Ensure that all senders and key changers sign the entire message **except the signature portion**
 ```
-let signedPortion = select bytes from (SenderCount...Payload) of Multi-Transaction
-for-all s in Senders    
-    ECDSA_VerifySignature(s.Signature, signedPortion, SafeBox[s.Account].PublicKey) = True 
+let signedPortion = select bytes from (SenderCount...Payload) portion of MULTI-TRANSACTION
+for i := 1 to SenderCount
+    let sender := SafeBox[SenderAccount_i]
+    ECDSA_VerifySignature(SenderSignature_i, signedPortion, sender.PublicKey) = True 
+
+for i := 1 to ChangeKeyCount
+    let changer = SafeBox[ChangeKeyAccount_i]
+    ECDSA_VerifySignature(ChangeKeySignature_i, signedPortion, changer.PublicKey) = True     
 ```
 
 #### Segregated Signatures during OPHASH ###

+ 0 - 1
PascalCoinWallet.app/Contents/MacOS/PascalCoinWallet

@@ -1 +0,0 @@
-../../../PascalCoinWallet

BIN
PascalCoinWallet.ico


BIN
PascalCoinWallet.res


+ 0 - 625
Units/Utils/UCache.pas

@@ -1,625 +0,0 @@
-unit UCache;
-
-{$ifdef FPC}
-  {$mode Delphi}
-{$endif}
-
-{$modeswitch nestedprocvars}
-
-interface
-
-uses
-  syncobjs, Classes, SysUtils, UCommon, Generics.Collections, LCLIntf;
-
-type
-  TCachedItem<TValue> = class(TInterfacedObject)
-    public
-      FInvalidated : boolean;
-      FFetchedOn : TDateTime;
-      FLastAccessedOn : TDateTime;
-      FAccessedCount : DWord;
-      FSize : DWord;
-      FDisposePolicy : TItemDisposePolicy;
-      FValue : TValue;
-    public
-      constructor Create(const AValue : TValue; ASize: DWord; ADisposePolicy : TItemDisposePolicy);
-      destructor Destroy; override;
-      property Invalidated : boolean read FInvalidated;
-      property FetchedOn : TDateTime read FFetchedOn;
-      property LastAccessedOn : TDateTime read FLastAccessedOn;
-      property AccessedCount : DWord read FAccessedCount;
-      property Size : DWord read FSize;
-      property Value : TValue read FValue;
-  end;
-
-  TCacheBase<TKey, TValue> = class(TComponent)
-    public type
-        TExpirationPolicy = (epSinceFetchedTime, epSinceLastAccessedTime, epNone);
-        TCacheReapPolicy = (crpLeastUsed, crpLargest, crpSmallest, crpOldest, crpIdle, crpASAP, crpNone);
-        TNullValuePolicy = (nvpCacheNormally, nvpReturnButDontCache, nvpThrow);
-    private type
-       __TPair_TKey_TValue = TPair<TKey, TValue>;
-       __TCachedItem_TValue = TCachedItem<TValue>;
-    private
-      FItemFetched: TNotifyManyEventEx; { Args = TKey, TValue }
-      FItemRemoved: TNotifyManyEventEx; { Args = TKey, TValue }
-      function ByExpiredCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-      function ByAccessedCountCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-      function ByIdleCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-      function ByIdleDescendingCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-      function ByFetchedOnCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-      function ByAccessedOnCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-      function BySizeCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-      function BySizeDescendingCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-      function IsExpiredFilter(const Item : __TPair_TKey_TValue) : boolean;
-    protected type
-      __TDictionary_TKey_TCachedItem_TValue = TDictionary<TKey, __TCachedItem_TValue>;
-    protected
-      FCurrentSize : SizeInt;
-      FMaxCapacity : SizeInt;
-      FItemDisposePolicy : TItemDisposePolicy;
-      FExpirationDuration : TTimeSpan;
-      FExpirationPolicy : TExpirationPolicy;
-      FReapPolicy : TCacheReapPolicy;
-      FNullValuePolicy : TNullValuePolicy;
-      FInternalStorage : __TDictionary_TKey_TCachedItem_TValue;
-      FLock : TSimpleRWSync;
-      function EstimateSize(const AVal: TValue) : SizeInt; virtual; abstract;
-      function Fetch(const AKey: TKey): TValue; virtual; abstract;
-      function IsExpired(ACachedItem: TCachedItem<TValue>) : boolean;
-      procedure MakeSpace(const requestedSpace: SizeInt);
-      procedure MakeSpaceFast(const requestedSpace: SizeInt);
-      procedure OnItemFetched(const AKey: TKey; const AVal: TValue); virtual;
-      procedure OnItemRemoved(const AKey: TKey; const AVal: TValue); virtual;
-      procedure NotifyItemFetched(const AKey: TKey; const AVal: TValue);
-      procedure NotifyItemRemoved(const AKey: TKey; const AVal: TValue);
-      function AddItemInternal(const Key: TKey; const AVal: TValue) : TCachedItem<TValue>;
-      procedure RemoveItemInternal(const AKey: TKey);
-    public
-      constructor Create(AOwner:TComponent; const AItemDisposePolicy : TItemDisposePolicy; const AReapPolicy : TCacheReapPolicy; const AExpirationPolicy : TExpirationPolicy; const ANullValuePolicy : TNullValuePolicy; const AMaxCapacity : Cardinal; const AExpirationDuration : TTimeSpan); overload;
-      destructor Destroy; override;
-      property ItemFetched : TNotifyManyEventEx read FItemFetched;
-      property ItemRemoved : TNotifyManyEventEx read FItemRemoved;
-      property CurrentSize : SizeInt read FCurrentSize;
-      property MaxCapacity : SizeInt read FMaxCapacity;
-      property ExpirationDuration : TTimeSpan read FExpirationDuration;
-      property ExpirationPolicy : TExpirationPolicy read FExpirationPolicy;
-      property ReapPolicy : TCacheReapPolicy read FReapPolicy;
-      property NullValuePolicy : TNullValuePolicy read FNullValuePolicy;
-      function Get(const AKey: TKey) : TCachedItem<TValue>;
-      function ContainsCachedItem(const AKey : TKey) : boolean;
-      procedure BulkLoad(const ABulkValues : TEnumerable<__TPair_TKey_TValue>);
-      procedure Invalidate(const AKey: TKey);
-      procedure Remove(const AKey: TKey);
-      procedure Flush;
-  end;
-
-{ TActionCache }
-
-  TActionCache<TKey, TValue> = class(TCacheBase<TKey, TValue>)
-    public type
-      { IValueFetcher }
-      IValueFetcher = interface
-        function Fetch(const AKey: TKey): TValue;
-      end;
-
-      { ISizeEstimator }
-      ISizeEstimator = interface
-        function Estimate(const AKey: TKey) : SizeInt;
-      end;
-
-      { TNestedFetchFunc }
-      TNestedFetchFunc = function (const AKey : TKey) : TValue is nested;
-
-      { TObjectFetchFunc }
-      TObjectFetchFunc = function (const AKey : TKey) : TValue of object;
-
-      { TGlobalFetchFunc }
-      TGlobalFetchFunc = function (const AKey : TKey) : TValue;
-
-      { TValueFetcher }
-      TValueFetcher = class (TInterfacedObject, IValueFetcher)
-        private
-          FFetcher : IValueFetcher;
-        public
-          function Fetch(const AKey: TKey): TValue;
-          constructor Create(const AFetcher: IValueFetcher);
-          class function FromNestedFunction(const AFunc: TNestedFetchFunc) : IValueFetcher;
-          class function FromObjectFunction(const AFunc: TObjectFetchFunc) : IValueFetcher;
-          class function FromGlobalFunction(const AFunc: TGlobalFetchFunc) : IValueFetcher;
-      end;
-
-      { TNestedEstimateFunc }
-      TNestedEstimateFunc = function (const AKey : TKey) : SizeInt is nested;
-
-      { TObjectEstimateFunc }
-      TObjectEstimateFunc = function (const AKey : TKey) : SizeInt of object;
-
-      { TGlobalEstimateFunc }
-      TGlobalEstimateFunc = function (const AKey : TKey) : SizeInt;
-
-      { TSizeEstimator }
-      TSizeEstimator = class (TInterfacedObject, ISizeEstimator)
-        private
-          FEstimator : ISizeEstimator;
-        public
-          function Estimate(const AKey: TKey) : SizeInt;
-          constructor Create(const AEstimator: ISizeEstimator);
-          class function FromNestedFunction(const AFunc: TNestedEstimateFunc) : ISizeEstimator;
-          class function FromObjectFunction(const AFunc: TObjectEstimateFunc) : ISizeEstimator;
-          class function FromGlobalFunction(const AFunc: TGlobalEstimateFunc) : ISizeEstimator;
-      end;
-
-   private type
-     { GlobalFunctionValueFetcher }
-     GlobalFunctionValueFetcher = class (TInterfacedObject, IValueFetcher)
-        private
-          FFunc : TGlobalFetchFunc;
-        public
-          constructor Create(const AFunc: TGlobalFetchFunc);
-          function Fetch(const AKey: TKey): TValue;
-      end;
-
-      { ObjectFunctionValueFetcher }
-      ObjectFunctionValueFetcher = class (TInterfacedObject, IValueFetcher)
-        private
-          FFunc : TObjectFetchFunc;
-        public
-          constructor Create(const AFunc: TGlobalFetchFunc);
-          function Fetch(const AKey: TKey): TValue;
-      end;
-
-      { NestedFunctionValueFetcher }
-      NestedFunctionValueFetcher = class (TInterfacedObject, IValueFetcher)
-        private
-          FFunc : TNestedFetchFunc;
-        public
-          constructor Create(const AFunc: TNestedFetchFunc);
-          function Fetch(const AKey: TKey): TValue;
-      end;
-
-     { GlobalSizeEstimator }
-     GlobalFunctionEstimator = class (TInterfacedObject, ISizeEstimator)
-        private
-          FFunc : TGlobalEstimateFunc;
-        public
-          constructor Create(const AFunc: TGlobalEstimateFunc);
-          function Estimate(const AKey: TKey): SizeInt;
-      end;
-
-      { ObjectFunctionValueFetcher }
-      ObjectFunctionEstimator = class (TInterfacedObject, ISizeEstimator)
-        private
-          FFunc : TObjectEstimateFunc;
-        public
-          constructor Create(const AFunc: TObjectEstimateFunc);
-          function Estimate(const AKey: TKey): SizeInt;
-      end;
-
-      { NestedFunctionValueFetcher }
-      NestedFunctionEstimator = class (TInterfacedObject, ISizeEstimator)
-        private
-          FFunc : TNestedEstimateFunc;
-        public
-          constructor Create(const TNestedEstimateFunc);
-          function Estimate(const AKey: TKey): SizeInt;
-      end;
-
-    private
-      FValueFetcher : IValueFetcher;
-      FSizeEstimator : ISizeEstimator;
-    protected
-      function EstimateSize(const AVal: TValue) : SizeInt; override;
-      function Fetch(const AKey: TKey): TValue; override;
-    public
-      constructor Create(
-            AOwner:TComponent;
-            const AValueFetcher : IValueFetcher;
-            const ASizeEstimator : ISizeEstimator;
-            const AItemDisposePolicy : TItemDisposePolicy;
-            const AReapPolicy : TCacheReapPolicy;
-            const AExpirationPolicy : TExpirationPolicy;
-            const ANullPolicy : TNullValuePolicy;
-            const AMaxCapacity : Integer;
-            const AExpirationDuration : TTimeSpan); overload;
-  end;
-
-implementation
-
-uses
-  Generics.Defaults, UAutoScope, UCommon.Collections;
-
-
-{ TCachedItem }
-
-constructor TCachedItem<TValue>.Create(const AValue : TValue; ASize: DWord; ADisposePolicy : TItemDisposePolicy);
-begin
-  FInvalidated := false;
-  FFetchedOn := Now;
-  FLastAccessedOn := Now;
-  FFetchedOn := Now;
-  FAccessedCount := 0;
-  FSize := ASize;
-  FDisposePolicy := TItemDisposePolicy;
-  FValue :=  AValue;
-end;
-
-destructor TCachedItem<TValue>.Destroy;
-begin
-  case FDisposePolicy of
-    idpFreeAndNil: FreeAndNil(FValue);
-    idpNil: FValue := nil;
-    idpNone: // do nothing
-  end;
-  inherited;
-end;
-
-{ TCacheBase }
-
-constructor TCacheBase<TKey, TValue>.Create(AOwner:TComponent; const AItemDisposePolicy : TItemDisposePolicy; const AReapPolicy : TCacheReapPolicy; const AExpirationPolicy : TExpirationPolicy; const ANullValuePolicy : TNullValuePolicy; const AMaxCapacity : Cardinal; const AExpirationDuration : TTimeSpan);
-begin
-  inherited Create(AOwner);
-  FItemDisposePolicy := AItemDisposePolicy;
-  FNullValuePolicy := ANullValuePolicy;
-  FInternalStorage := __TDictionary_TKey_TCachedItem_TValue.Create;
-  FCurrentSize := 0;
-  FReapPolicy := AReapPolicy;
-  FExpirationPolicy := AExpirationPolicy;
-  FMaxCapacity := AMaxCapacity;
-  FExpirationDuration := AExpirationDuration;
-  FLock := TSimpleRWSync.Create;
-end;
-
-destructor TCacheBase<TKey, TValue>.Destroy;
-begin
-  Flush;
-  FreeAndNil(FInternalStorage);
-  FreeAndNil(FLock);
-  inherited;
-end;
-
-function TCacheBase<TKey, TValue>.Get(const AKey: TKey) : TCachedItem<TValue>;
-var
-  item: TCachedItem<TValue>;
-begin
-  if NOT FInternalStorage.TryGetValue(AKey, item) then begin
-      try
-        FLock.BeginWrite;
-        if NOT FInternalStorage.TryGetValue(AKey, item) then
-            item := AddItemInternal(AKey, Fetch(AKey));
-      finally
-        FLock.EndWrite;
-      end
-  end else if IsExpired(item) then begin
-    try
-      FLock.BeginWrite;
-      RemoveItemInternal(AKey);
-      item := AddItemInternal(AKey, Fetch(AKey));
-    finally
-      FLock.EndWrite;
-    end
-  end;
-  inc(item.FAccessedCount);
-  item.FLastAccessedOn := Now;
-  if not Assigned(item.Value) then begin
-    case NullValuePolicy of
-      nvpThrow: raise Exception.Create('Cache fetched a null value and this cache NullValuePolicy prohibits null values.');
-      nvpReturnButDontCache: Invalidate(AKey);
-      nvpCacheNormally: ;
-    end
-  end;
-  Result := item;
-end;
-
-function TCacheBase<TKey, TValue>.ContainsCachedItem(const AKey : TKey) : boolean;
-var
- item : TCachedItem<TValue>;
-begin
-  Result := FInternalStorage.TryGetValue(AKey, item) AND (NOT IsExpired(item));
-end;
-
-function TCacheBase<TKey, TValue>.IsExpired(ACachedItem: TCachedItem<TValue>) : boolean;
-var
-  from : TDateTime;
-begin
-  if ACachedItem.Invalidated then begin
-    Result := true;
-    exit;
-  end;
-
-  case FExpirationPolicy of
-    epSinceFetchedTime: from := ACachedItem.FetchedOn;
-    epSinceLastAccessedTime: from := ACachedItem.LastAccessedOn;
-    else from := Now;
-  end;
-
-  Result := (FExpirationPolicy <> epNone) AND (TTimeSpan.Subtract(Now, from) > FExpirationDuration);
-end;
-
-procedure TCacheBase<TKey, TValue>.Remove(const AKey: TKey);
-begin
-  try
-    FLock.BeginWrite;
-    RemoveItemInternal(AKey);
-  finally
-    FLock.EndWrite;
-  end;
-end;
-
-procedure TCacheBase<TKey, TValue>.Flush;
-var
-  key: TKey;
-begin
-  try
-    FLock.BeginWrite;
-    for key in FInternalStorage.Keys do
-      RemoveItemInternal(FInternalStorage[key]);
-    FInternalStorage.Clear;
-  finally
-    FLock.EndWrite;
-  end
-end;
-
-procedure TCacheBase<TKey, TValue>.BulkLoad(const ABulkValues: TEnumerable<__TPair_TKey_TValue>);
-var
-  kvp: __TPair_TKey_TValue;
-begin
-  try
-    FLock.BeginWrite;
-    for kvp in ABulkValues do begin
-      if FInternalStorage.ContainsKey(kvp.Key) then begin
-        RemoveItemInternal(kvp.Key);
-        AddItemInternal(kvp.Key, kvp.Value);
-      end else AddItemInternal(kvp.Key, kvp.Value);
-    end
-  finally
-    FLock.EndWrite;
-  end
-end;
-
-procedure TCacheBase<TKey, TValue>.Invalidate;
-begin
-  raise Exception.Create('Not implemented');
-end;
-
-
-procedure TCacheBase<TKey, TValue>.OnItemFetched(const AKey : TKey; const AVal: TValue);
-begin
-end;
-
-procedure TCacheBase<TKey, TValue>.OnItemRemoved(const AKey : TKey; const AVal: TValue);
-begin
-end;
-
-procedure TCacheBase<TKey, TValue>.MakeSpace(const requestedSpace: SizeInt);
-type
-  TSortFunc = TOnComparison<__TPair_TKey_TValue>;
-var
-  candidate : __TPair_TKey_TValue;
-  deathRow: TList<__TPair_TKey_TValue>;
-  sortOrder: array of TSortFunc;
-  reapAll: boolean;
-  GC : TScoped;
-begin
-  try
-    FLock.BeginWrite;
-    if requestedSpace > FMaxCapacity then
-      raise Exception.Create(Format('Cache capacity insufficient for requested space [%0:d].',[requestedSpace]));
-
-    // If need space
-    if FReapPolicy = crpASAP then begin
-      MakeSpaceFast(requestedSpace);
-      exit;
-    end;
-
-    // Get elements to be purged (deathrow)
-    deathRow := GC.AddObject(TList<__TPair_TKey_TValue>.Create) as TList<__TPair_TKey_TValue>;
-    deathRow.AddRange(FInternalStorage.ToArray);
-    case FReapPolicy of
-      crpLeastUsed: sortOrder := TArrayTool<TSortFunc>.Create(ByExpiredCompare, ByAccessedCountCompare, BySizeDescendingCompare);
-      crpOldest: sortOrder := TArrayTool<TSortFunc>.Create(ByExpiredCompare, ByFetchedOnCompare);
-      crpIdle: sortOrder := TArrayTool<TSortFunc>.Create(ByExpiredCompare, ByAccessedOnCompare);
-      crpLargest: sortOrder := TArrayTool<TSortFunc>.Create(ByExpiredCompare, BySizeDescendingCompare);
-      crpSmallest: sortOrder := TArrayTool<TSortFunc>.Create(ByExpiredCompare, BySizeCompare);
-      crpNone: begin
-        if FExpirationPolicy <> epNone then begin
-          TListTool<__TPair_TKey_TValue>.Filter(deathRow, TPredicateTool<__TPair_TKey_TValue>.FromFunc(IsExpiredFilter));
-          sortOrder := nil;
-        end else begin
-          deathRow.Clear;
-          sortOrder := nil;
-        end;
-        reapAll := true;
-      end
-      else raise ENotSupportedException(Format('FReapPolicy: [%d]', [FReapPolicy]));
-    end;
-
-    if Length(sortOrder) > 0 then
-      deathRow.Sort(TComparerTool<__TPair_TKey_TValue>.Many(sortOrder));
-
-    // remove items from cache until enough space
-    for candidate in deathRow do
-      if reapAll OR ((MaxCapacity - CurrentSize) < requestedSpace) then
-        RemoveItemInternal(candidate.Key)
-      else break;
-
-    // check enough space was created
-    if (MaxCapacity - CurrentSize) < requestedSpace then
-      raise Exception.Create(Format('Insufficient cache memory (requested space [%d])', [requestedSpace]));
-
-  finally
-    FLock.EndWrite;
-  end
-end;
-
-procedure TCacheBase<TKey, TValue>.MakeSpaceFast(const requestedSpace: SizeInt);
-type
-  THashSet_Key = THashSet<TKey>;
-var
-  savedSpace: SizeInt;
-  deathRow: THashSet_Key;
-  item: __TPair_TKey_TValue;
-  GC : TScoped;
-begin
-  try
-    FLock.BeginWrite;
-    savedSpace := 0;
-    deathRow := GC.AddObject(THashSet<TKey>.Create) as THashSet_Key;
-    for item in FInternalStorage do begin
-      if NOT IsExpired(item.Value) then
-          continue;
-      deathRow.Add(item.Key);
-      inc(savedSpace, item.Value.Size);
-      if requestedSpace >= savedSpace then
-          break;
-    end;
-    if savedSpace < requestedSpace then begin
-      for item in FInternalStorage do begin
-          if (IsExpired(item.Value)) OR (deathRow.Contains(item.Key)) then
-              continue;
-          deathRow.Add(item.Key);
-          inc(savedSpace, item.Value.Size);
-          if requestedSpace >= savedSpace then
-              break;
-      end
-    end;
-    for item in deathRow do
-      RemoveItemInternal(item);
-  finally
-    FLock.EndWrite;
-  end
-end;
-
-function TCacheBase<TKey, TValue>.AddItemInternal(const Key: TKey; const AVal: TValue) : TCachedItem<TValue>;
-var
-  item : TCachedItem<TValue>;
-  size : Cardinal;
-begin
-  item := TCachedItem<TValue>.Create(AVal, EstimateSize(AVal), FItemDisposePolicy);
-
-  if (MaxCapacity - CurrentSize) < item.Size then
-    MakeSpace(item.Size);
-
-  FInternalStorage.Add(key, item);
-  inc(FCurrentSize, item.Size);
-  Result := item;
-end;
-
-procedure TCacheBase<TKey, TValue>.RemoveItemInternal(const AKey: TKey);
-var
-  item : TValue;
-begin
-    item := FInternalStorage[AKey];
-    FInternalStorage.Remove(AKey);
-    dec(FCurrentSize, item.Size);
-    OnItemRemoved(AKey, item);
-    NotifyItemRemoved(AKey, item);
-end;
-
-procedure TCacheBase<TKey, TValue>.NotifyItemFetched(const AKey: TKey; const AVal: TValue);
-begin
-  OnItemFetched(AKey, AVal);
-  ItemFetched.Invoke(Self, [AKey, AVal]);
-end;
-
-procedure TCacheBase<TKey, TValue>.NotifyItemRemoved(const AKey: TKey; const AVal: TValue);
-begin
-  OnItemRemoved(AKey, AVal);
-  ItemRemoved.Invoke(Self, [AKey, AVal]);
-end;
-
-{%region Sort Functions }
-
-function TCacheBase<TKey, TValue>.ByExpiredCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-var
-  leftExp, rightExp : boolean;
-begin
-  leftExp := IsExpired(Left.Value);
-  rightExp := IsExpired(Right.Value);
-  if leftExp <> rightExp then
-    Result := 0
-  else
-    if not leftExp then Result := 1 else Result := -1
-end;
-
-function TCacheBase<TKey, TValue>.ByAccessedCountCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-begin
-  Result := TCompare.Int32(Left.Value.AccessedCount, Right.Value.AccessedCount);
-end;
-
-function TCacheBase<TKey, TValue>.ByIdleCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-begin
-  Result := TCompare.Int32(TTimeSpan.Subtract(Now,Left.Value.AccessedOn), TTimeSpan.Subtract(Now,Right.Value.AccessedOn));
-end;
-
-function TCacheBase<TKey, TValue>.ByIdleDescendingCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-begin
-  Result := -ByIdleCompare(Left, Right);
-end;
-
-function TCacheBase<TKey, TValue>.ByFetchedOnCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-begin
-  Result := TCompare.Int32(Left.Value.FetchedOn, Right.Value.FetchedOn);
-end;
-
-function TCacheBase<TKey, TValue>.ByAccessedOnCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-begin
-  Result := TCompare.Int32(Left.Value.AccessedOn, Right.Value.AccessedOn);
-end;
-
-function TCacheBase<TKey, TValue>.BySizeCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-begin
-  Result := TCompare.Int32(Left.Value.Size, Right.Value.Size);
-end;
-
-function TCacheBase<TKey, TValue>.BySizeDescendingCompare(constref Left, Right: __TPair_TKey_TValue): Integer;
-begin
-  Result := -BySizeCompare(Left, Right);
-end;
-
-function TCacheBase<TKey, TValue>.IsExpiredFilter(const Item : __TPair_TKey_TValue) : boolean;
-begin
-  Result := IsExpired(Item.Value);
-end;
-
-{%endregion}
-
-
-{ ActionCache }
-
-//  const AItemDisposePolicy : TItemDisposePolicy; const AReapPolicy : TCacheReapPolicy; const AExpirationPolicy : TExpirationPolicy; const ANullValuePolicy : TNullValuePolicy; const AMaxCapacity : Cardinal; const AExpirationDuration : TTimeSpan
-constructor TActionCache<TKey, TValue>.Create(
-            AOwner:TComponent;
-            const AValueFetcher : IValueFetcher;
-            const ASizeEstimator : ISizeEstimator;
-            const AItemDisposePolicy : TItemDisposePolicy;
-            const AReapPolicy : TCacheReapPolicy;
-            const AExpirationPolicy : TExpirationPolicy;
-            const ANullPolicy : TNullValuePolicy;
-            const AMaxCapacity : Integer;
-            const AExpirationDuration : TTimeSpan);
-begin
-  Inherited Create(AOwner, AItemDisposePolicy, AReapPolicy, AExpirationPolicy, ANullPolicy, AMaxCapacity, AExpirationDuration);
-  FValueFetcher := AValueFetcher;
-  FSizeEstimator := ASizeEstimator;
-end;
-
-function TActionCache<TKey, TValue>.Fetch(const AKey: TKey): TValue;
-var
-  val : TValue;
-begin
-  val := FValueFetcher.Fetch(AKey);
-  NotifyItemFetched(AKey, val);
-  result := val;
-end;
-
-function TActionCache<TKey, TValue>.EstimateSize(const AVal: TValue) : SizeInt;
-begin
-  if Assigned(FSizeEstimator) then
-    Result := FSizeEstimator.Estimate(AVal)
-  else
-    Result := 0;
-end;
-
-end.
-

+ 0 - 1
Units/Utils/UVisualGrid.rc

@@ -1 +0,0 @@
-VISUALGRID_SEARCH RCDATA "..\\..\\Resources\\WalletImages\\search-16x16.png"

+ 1 - 0
build/README.md

@@ -0,0 +1 @@
+This folder contains platform specific build configurations.

+ 0 - 0
PascalCoinWallet.app/Contents/Info.plist → build/osx/PascalCoinWallet.app/Contents/Info.plist


+ 1 - 0
build/osx/PascalCoinWallet.app/Contents/MacOS/PascalCoinWallet

@@ -0,0 +1 @@
+../../../PascalCoinWallet

+ 0 - 0
PascalCoinWallet.app/Contents/PkgInfo → build/osx/PascalCoinWallet.app/Contents/PkgInfo


BIN
resources/icons/PascalCoinWallet.ico


+ 0 - 0
src/PascalCoinMiner.pp


+ 3 - 1
Units/Utils/UAppParams.pas → src/common/UAppParams.pas

@@ -1,6 +1,8 @@
 unit UAppParams;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 

+ 0 - 0
Units/Utils/UAutoScope.pas → src/common/UAutoScope.pas


+ 39 - 6
Units/Utils/UFolderHelper.pas → src/common/UFolderHelper.pas

@@ -1,6 +1,8 @@
 unit UFolderHelper;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -39,6 +41,9 @@ Type TFileVersionInfo = record
 
   TFolderHelper = record
   strict private
+    {$IFnDEF FPC}
+    class function GetFolder(const aCSIDL: Integer): string; static;
+    {$ENDIF}
     class function GetAppDataFolder : string; static;
   public
     class function GetPascalCoinDataFolder : string; static;
@@ -48,23 +53,51 @@ Type TFileVersionInfo = record
 implementation
 
 uses
-  {$IF not (Defined(LINUX) or Defined(DARWIN))}
+{$IFnDEF FPC}
+  Windows, ShlObj,
+  {$DEFINE FILEVERSIONINFO}
+{$ELSE}
+  {$IFDEF WIN}
   Windows,
   {$DEFINE FILEVERSIONINFO}
-  {$IFEND}
+  {$ENDIF}
+  {LCLIntf, LCLType, LMessages,}
+{$ENDIF}
   SysUtils;
 
-{$I .\..\PascalCoin\config.inc}
+{$I config.inc}
+
+{$IFnDEF FPC}
+function SHGetFolderPath(hwnd: HWND; csidl: Integer; hToken: THandle;
+  dwFlags: DWord; pszPath: LPWSTR): HRESULT; stdcall;
+  forward;
+function SHGetFolderPath; external 'SHFolder.dll' name 'SHGetFolderPathW';
+{$ENDIF}
 
 class function TFolderHelper.GetAppDataFolder: string;
 begin
-  {$IFDEF UNIX}
+  {$IFDEF FPC}
+  {$IFDEF WINDOWS}
+  Result :=GetEnvironmentVariable('APPDATA');
+  {$ELSE}
   Result :=GetEnvironmentVariable('HOME');
+  {$ENDIF}
   {$ELSE}
-  Result :=GetEnvironmentVariable('APPDATA');
+  Result := GetFolder(CSIDL_APPDATA); // c:\Users\(User Name)\AppData\Roaming
   {$ENDIF}
 end;
 
+{$IFnDEF FPC}
+class function TFolderHelper.GetFolder(const aCSIDL: Integer): string;
+var
+  FolderPath: array[0 .. MAX_PATH] of Char;
+begin
+  Result := '';
+  if SHGetFolderPath(0, aCSIDL, 0, 0, @FolderPath) = S_OK then
+    Result := FolderPath;
+end;
+{$ENDIF}
+
 class function TFolderHelper.GetPascalCoinDataFolder: string;
 begin
   {$IFDEF TESTNET}

+ 86 - 63
Units/Utils/UGridUtils.pas → src/common/UGridUtils.pas

@@ -1,6 +1,8 @@
 unit UGridUtils;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -18,14 +20,18 @@ unit UGridUtils;
 interface
 
 uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
   LCLIntf, LCLType, LMessages,
+{$ENDIF}
   Classes, Grids, UNode, UAccounts, UBlockChain, UAppParams,
   UWallet, UCrypto, UPoolMining, URPC;
 
 Type
   // TAccountsGrid implements a visual integration of TDrawGrid
   // to show accounts information
-  TAccountColumnType = (act_account_number,act_account_key,act_balance,act_updated,act_n_operation,act_updated_state,act_name,act_type);
+  TAccountColumnType = (act_account_number,act_account_key,act_balance,act_updated,act_n_operation,act_updated_state,act_name,act_type,act_saleprice);
   TAccountColumn = Record
     ColumnType : TAccountColumnType;
     width : Integer;
@@ -69,7 +75,6 @@ Type
     Property OnUpdated : TNotifyEvent read FOnUpdated write FOnUpdated;
     Property AllowMultiSelect : Boolean read FAllowMultiSelect write SetAllowMultiSelect;
     Function SelectedAccounts(accounts : TOrderedCardinalList) : Integer;
-    Function SelectedAccountsCount : Integer;
   End;
 
   TOperationsGrid = Class(TComponent)
@@ -99,19 +104,20 @@ Type
   protected
     procedure Notification(AComponent: TComponent; Operation: TOperation); Override;
   public
-    constructor Create(AOwner : TComponent); override;
-    destructor Destroy; override;
-    property DrawGrid : TDrawGrid read FDrawGrid write SetDrawGrid;
-    property PendingOperations : Boolean read FPendingOperations write SetPendingOperations;
     property SelectedOperation : TOperationResume read GetSelectedOperation;
-    property AccountNumber : Int64 read FAccountNumber write SetAccountNumber;
-    property MustShowAlwaysAnAccount : Boolean read FMustShowAlwaysAnAccount write SetMustShowAlwaysAnAccount;
-    property Node : TNode read GetNode write SetNode;
-    procedure UpdateAccountOperations; virtual;
-    property BlockStart : Int64 read FBlockStart write SetBlockStart;
-    property BlockEnd : Int64 read FBlockEnd write SetBlockEnd;
-    procedure SetBlocks(bstart,bend : Int64);
-    property OperationsResume : TOperationsResumeList read FOperationsResume;
+    Constructor Create(AOwner : TComponent); override;
+    Destructor Destroy; override;
+    Property DrawGrid : TDrawGrid read FDrawGrid write SetDrawGrid;
+    Property PendingOperations : Boolean read FPendingOperations write SetPendingOperations;
+    Property AccountNumber : Int64 read FAccountNumber write SetAccountNumber;
+    Property MustShowAlwaysAnAccount : Boolean read FMustShowAlwaysAnAccount write SetMustShowAlwaysAnAccount;
+    Property Node : TNode read GetNode write SetNode;
+    Procedure UpdateAccountOperations; virtual;
+    Procedure ShowModalDecoder(WalletKeys: TWalletKeys; AppParams : TAppParams);
+    Property BlockStart : Int64 read FBlockStart write SetBlockStart;
+    Property BlockEnd : Int64 read FBlockEnd write SetBlockEnd;
+    Procedure SetBlocks(bstart,bend : Int64);
+    Property OperationsResume : TOperationsResumeList read FOperationsResume;
   End;
 
   TBlockChainData = Record
@@ -191,7 +197,7 @@ uses
 { TAccountsGrid }
 
 Const CT_ColumnHeader : Array[TAccountColumnType] Of String =
-  ('Account N.','Key','Balance','Updated','N Oper.','State','Name','Type');
+  ('Account N.','Key','Balance','Updated','N Op.','S','Name','Type','Price');
 
 function TAccountsGrid.AccountNumber(GridRow: Integer): Int64;
 begin
@@ -216,17 +222,21 @@ begin
   FShowAllAccounts := false;
   FAccountsList := TOrderedCardinalList.Create;
   FDrawGrid := Nil;
-  SetLength(FColumns,5);
+  SetLength(FColumns,7);
   FColumns[0].ColumnType := act_account_number;
-  FColumns[0].width := 70;
+  FColumns[0].width := 65;
   FColumns[1].ColumnType := act_name;
-  FColumns[1].width := 110;
+  FColumns[1].width := 80;
   FColumns[2].ColumnType := act_balance;
-  FColumns[2].width := 70;
+  FColumns[2].width := 80;
   FColumns[3].ColumnType := act_n_operation;
-  FColumns[3].width := 50;
-  FColumns[4].ColumnType := act_updated_state;
-  FColumns[4].width := 50;
+  FColumns[3].width := 40;
+  FColumns[4].ColumnType := act_type;
+  FColumns[4].width := 40;
+  FColumns[5].ColumnType := act_saleprice;
+  FColumns[5].width := 45;
+  FColumns[6].ColumnType := act_updated_state;
+  FColumns[6].width := 25;
   FNodeNotifyEvents := TNodeNotifyEvents.Create(Self);
   FNodeNotifyEvents.OnOperationsChanged := OnNodeNewOperation;
 end;
@@ -277,7 +287,7 @@ begin
   DrawGrid.Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,
     {goRangeSelect, }goDrawFocusSelected, {goRowSizing, }goColSizing, {goRowMoving,}
     {goColMoving, goEditing, }goTabs, goRowSelect, {goAlwaysShowEditor,}
-    goThumbTracking];
+    goThumbTracking{$IFnDEF FPC}, goFixedColClick, goFixedRowClick, goFixedHotTrack{$ENDIF}];
   if FAllowMultiSelect then DrawGrid.Options := DrawGrid.Options + [goRangeSelect];
   FDrawGrid.Invalidate;
   if Assigned(FOnUpdated) then FOnUpdated(Self);
@@ -356,6 +366,7 @@ begin
   end;
 end;
 
+{$IFDEF FPC}
 Type
 TTextFormats = (tfBottom, tfCalcRect, tfCenter, tfEditControl, tfEndEllipsis,
   tfPathEllipsis, tfExpandTabs, tfExternalLeading, tfLeft, tfModifyString,
@@ -384,6 +395,12 @@ Begin
   ts.SystemFont:=false;
   Canvas.TextRect(Rect,Rect.Left,Rect.Top,Text,ts);
 end;
+{$ELSE}
+Procedure Canvas_TextRect(Canvas : TCanvas; var Rect: TRect; var Text: string; State: TGridDrawState; TextFormat: TTextFormat = []);
+Begin
+  Canvas.TextRect(Rect,Text,TextFormat);
+end;
+{$ENDIF}
 
 procedure TAccountsGrid.OnGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
   Function FromColorToColor(colorstart,colordest : Integer; step,totalsteps : Integer) : Integer;
@@ -417,7 +434,9 @@ begin
     C.ColumnType := act_account_number;
     C.width := -1;
   end;
+  {.$IFDEF FPC}
   DrawGrid.Canvas.Font.Color:=clBlack;
+  {.$ENDIF}
   if (ARow=0) then begin
     // Header
     s := CT_ColumnHeader[C.ColumnType];
@@ -465,6 +484,26 @@ begin
           Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
         End;
         act_updated_state : Begin
+          if TAccountComp.IsAccountBlockedByProtocol(account.account,Node.Bank.BlocksCount) then begin
+            DrawGrid.Canvas.Brush.Color := clRed;
+          end else if ndiff=0 then begin
+            DrawGrid.Canvas.Brush.Color := RGB(255,128,0);
+          end else if ndiff<=8 then begin
+            DrawGrid.Canvas.Brush.Color := FromColorToColor(RGB(253,250,115),ColorToRGB(clGreen),ndiff-1,8-1);
+          end else begin
+            DrawGrid.Canvas.Brush.Color := clGreen;
+          end;
+          DrawGrid.Canvas.Ellipse(Rect.Left+1,Rect.Top+1,Rect.Right-1,Rect.Bottom-1);
+        End;
+        act_name : Begin
+          s := account.name;
+          Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfLeft,tfVerticalCenter,tfSingleLine]);
+        end;
+        act_type : Begin
+          s := IntToStr(account.account_type);
+          Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
+        end;
+        act_saleprice : Begin
           if TAccountComp.IsAccountForSale(account.accountInfo) then begin
             // Show price for sale
             s := TAccountComp.FormatMoney(account.accountInfo.price);
@@ -477,26 +516,7 @@ begin
             end else begin
               DrawGrid.Canvas.Font.Color := clGrayText
             end;
-            Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
-          end else begin
-            if TAccountComp.IsAccountBlockedByProtocol(account.account,Node.Bank.BlocksCount) then begin
-              DrawGrid.Canvas.Brush.Color := clRed;
-            end else if ndiff=0 then begin
-              DrawGrid.Canvas.Brush.Color := RGB(255,128,0);
-            end else if ndiff<=8 then begin
-              DrawGrid.Canvas.Brush.Color := FromColorToColor(RGB(253,250,115),ColorToRGB(clGreen),ndiff-1,8-1);
-            end else begin
-              DrawGrid.Canvas.Brush.Color := clGreen;
-            end;
-            DrawGrid.Canvas.Ellipse(Rect.Left+1,Rect.Top+1,Rect.Right-1,Rect.Bottom-1);
-          end;
-        End;
-        act_name : Begin
-          s := account.name;
-          Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfLeft,tfVerticalCenter,tfSingleLine]);
-        end;
-        act_type : Begin
-          s := IntToStr(account.account_type);
+          end else s := '';
           Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfRight,tfVerticalCenter,tfSingleLine]);
         end;
       else
@@ -531,7 +551,6 @@ begin
   Stream.Write(j,sizeof(j));
 end;
 
-// HS TODO - refactor out TOrderedCardialList. Not a necessary consideration here.
 function TAccountsGrid.SelectedAccounts(accounts: TOrderedCardinalList): Integer;
 var i64 : Int64;
   i : Integer;
@@ -552,22 +571,6 @@ begin
   Result := accounts.Count;
 end;
 
-function TAccountsGrid.SelectedAccountsCount : Integer;
-var i64 : Int64; i : Integer;
-begin
-   Result := 0;
-   if not assigned(FDrawGrid) then exit;
-   if FAllowMultiSelect then begin
-      for i := FDrawGrid.Selection.Top to FDrawGrid.Selection.Bottom do begin
-        i64 := AccountNumber(i);
-        if i64>=0 then Inc(Result);
-      end;
-    end else begin
-      i64 := AccountNumber(DrawGrid.Row);
-      if i64>=0 then Inc(Result);
-    end;
-end;
-
 procedure TAccountsGrid.SetAllowMultiSelect(const Value: Boolean);
 begin
   FAllowMultiSelect := Value;
@@ -655,7 +658,7 @@ begin
   DrawGrid.Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,
     {goRangeSelect, }goDrawFocusSelected, {goRowSizing, }goColSizing, {goRowMoving,}
     {goColMoving, goEditing, }goTabs, goRowSelect, {goAlwaysShowEditor,}
-    goThumbTracking];
+    goThumbTracking{$IFnDEF FPC}, goFixedColClick, goFixedRowClick, goFixedHotTrack{$ENDIF}];
 end;
 
 procedure TOperationsGrid.Notification(AComponent: TComponent; Operation: TOperation);
@@ -672,7 +675,9 @@ procedure TOperationsGrid.OnGridDrawCell(Sender: TObject; ACol, ARow: Integer; R
 Var s : String;
   opr : TOperationResume;
 begin
+  {.$IFDEF FPC}
   DrawGrid.Canvas.Font.Color:=clBlack;
+  {.$ENDIF}
   opr := CT_TOperationResume_NUL;
   Try
   if (ARow=0) then begin
@@ -861,6 +866,22 @@ begin
   Result := FOperationsResume.OperationResume[FDrawGrid.Row-1];
 end;
 
+procedure TOperationsGrid.ShowModalDecoder(WalletKeys: TWalletKeys; AppParams : TAppParams);
+Var i : Integer;
+  opr : TOperationResume;
+  FRM : TFRMPayloadDecoder;
+begin
+  if Not Assigned(FDrawGrid) then exit;
+  if (FDrawGrid.Row<=0) Or (FDrawGrid.Row>FOperationsResume.Count) then exit;
+  opr := FOperationsResume.OperationResume[FDrawGrid.Row-1];
+  FRM := TFRMPayloadDecoder.Create(FDrawGrid.Owner);
+  try
+    FRM.Init(opr,WalletKeys,AppParams);
+    FRM.ShowModal;
+  finally
+    FRM.Free;
+  end;
+end;
 
 procedure TOperationsGrid.UpdateAccountOperations;
 Var list : TList;
@@ -1015,7 +1036,7 @@ begin
   DrawGrid.Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,
     {goRangeSelect, }goDrawFocusSelected, {goRowSizing, }goColSizing, {goRowMoving,}
     {goColMoving, goEditing, }goTabs, goRowSelect, {goAlwaysShowEditor,}
-    goThumbTracking];
+    goThumbTracking{$IFnDEF FPC}, goFixedColClick, goFixedRowClick, goFixedHotTrack{$ENDIF}];
   UpdateBlockChainGrid;
 end;
 
@@ -1037,7 +1058,9 @@ Var s : String;
   bcd : TBlockChainData;
   deviation : Real;
 begin
+  {.$IFDEF FPC}
   DrawGrid.Canvas.Font.Color:=clBlack;
+  {.$ENDIF}
   if (ARow=0) then begin
     // Header
     case ACol of

+ 77 - 1
Units/Utils/UJSONFunctions.pas → src/common/UJSONFunctions.pas

@@ -1,6 +1,8 @@
 unit UJSONFunctions;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -18,11 +20,18 @@ unit UJSONFunctions;
 interface
 
 Uses
+  {$IFDEF FPC}
   fpjson, jsonparser,
+  {$ELSE}
+  DBXJSON,
+  {$ENDIF}
   SysUtils, DateUtils, Variants, Classes, ULog;
 
 Type
+  {$IFDEF FPC}
   TJSONValue = TJSONData;
+  {$ENDIF}
+
   TPCJSONData = Class
   private
     FParent : TPCJSONData;
@@ -201,6 +210,7 @@ constructor TPCJSONArray.CreateFromJSONArray(JSONArray: TJSONArray);
 Var i : Integer;
 begin
   Create;
+{$IFDEF FPC}
   for i := 0 to JSONArray.Count - 1 do begin
     if (JSONArray.Items[i] is TJSONArray) then begin
       Insert(i,TPCJSONArray.CreateFromJSONArray(TJSONArray(JSONArray.Items[i])));
@@ -210,6 +220,17 @@ begin
       Insert(i,TPCJSONVariantValue.CreateFromJSONValue(TJSONValue(JSONArray.Items[i])));
     end else raise EPCParametresError.Create('Invalid TJSON Data: '+JSONArray.Items[i].ClassName);
   end;
+{$ELSE}
+  for i := 0 to JSONArray.Size - 1 do begin
+    if (JSONArray.Get(i) is TJSONArray) then begin
+      Insert(i,TPCJSONArray.CreateFromJSONArray(TJSONArray(JSONArray.Get(i))));
+    end else if (JSONArray.Get(i) is TJSONObject) then begin
+      Insert(i,TPCJSONObject.CreateFromJSONObject(TJSONObject(JSONArray.Get(i))));
+    end else if (JSONArray.Get(i) is TJSONValue) then begin
+      Insert(i,TPCJSONVariantValue.CreateFromJSONValue(TJSONValue(JSONArray.Get(i))));
+    end else raise EPCParametresError.Create('Invalid TJSON Data: '+JSONArray.Get(i).ClassName);
+  end;
+{$ENDIF}
 end;
 
 
@@ -460,9 +481,37 @@ begin
 end;
 
 constructor TPCJSONVariantValue.CreateFromJSONValue(JSONValue: TJSONValue);
+{$IFnDEF FPC}
+Var d : Double;
+    i64 : Integer;
+  ds,ts : Char;
+{$ENDIF}
 begin
   Create;
+  {$IFDEF FPC}
   Value := JSONValue.Value;
+  {$ELSE}
+  if JSONValue is TJSONNumber then begin
+    d := TJSONNumber(JSONValue).AsDouble;
+    if Pos('.',JSONValue.ToString)>0 then i64 := 0
+    else i64 := TJSONNumber(JSONValue).AsInt;
+    ds := DecimalSeparator;
+    ts := ThousandSeparator;
+    DecimalSeparator := '.';
+    ThousandSeparator := ',';
+    Try
+      if FormatFloat('0.###########',d)=inttostr(i64) then
+        Value := i64
+      else Value := d;
+    Finally
+      DecimalSeparator := ds;
+      ThousandSeparator := ts;
+    End;
+  end else if JSONValue is TJSONTrue then Value := true
+  else if JSONValue is TJSONFalse then Value := false
+  else if JSONValue is TJSONNull then Value := Null
+  else Value := JSONValue.Value;
+  {$ENDIF}
 end;
 
 function TPCJSONVariantValue.IsNull: Boolean;
@@ -673,9 +722,12 @@ end;
 
 constructor TPCJSONObject.CreateFromJSONObject(JSONObject: TJSONObject);
 var i,i2 : Integer;
+  {$IFDEF FPC}
   aname : TJSONStringType;
+  {$ENDIF}
 begin
   Create;
+  {$IFDEF FPC}
   for i := 0 to JSONObject.Count - 1 do begin
     aname := JSONObject.Names[i];
     i2 := GetIndexOrCreateName(JSONObject.Names[i]);
@@ -687,6 +739,18 @@ begin
       (Items[i2] as TPCJSONNameValue).Value := TPCJSONVariantValue.CreateFromJSONValue(JSONObject.Items[i]);
     end else raise EPCParametresError.Create('Invalid TJSON Data in JSONObject.'+aname+': '+JSONObject.Items[i].ClassName);
   end;
+  {$ELSE}
+  for i := 0 to JSONObject.Size - 1 do begin
+    i2 := GetIndexOrCreateName(JSONObject.Get(i).JsonString.Value);
+    if (JSONObject.Get(i).JsonValue is TJSONArray) then begin
+      (Items[i2] as TPCJSONNameValue).Value := TPCJSONArray.CreateFromJSONArray(TJSONArray(JSONObject.Get(i).JsonValue));
+    end else if (JSONObject.Get(i).JsonValue is TJSONObject) then begin
+      (Items[i2] as TPCJSONNameValue).Value := TPCJSONObject.CreateFromJSONObject(TJSONObject(JSONObject.Get(i).JsonValue));
+    end else if (JSONObject.Get(i).JsonValue is TJSONValue) then begin
+      (Items[i2] as TPCJSONNameValue).Value := TPCJSONVariantValue.CreateFromJSONValue(TJSONValue(JSONObject.Get(i).JsonValue));
+    end else raise EPCParametresError.Create('Invalid TJSON Data in JSONObject.'+JSONObject.Get(i).JsonString.Value+': '+JSONObject.Get(i).ClassName);
+  end;
+  {$ENDIF}
 end;
 
 
@@ -924,11 +988,14 @@ end;
 
 class function TPCJSONData.ParseJSONValue(Const JSONObject: TBytes): TPCJSONData;
 Var JS : TJSONValue;
+  {$IFDEF FPC}
   jss : TJSONStringType;
   i : Integer;
+  {$ENDIF}
 begin
   Result := Nil;
   JS := Nil;
+  {$IFDEF FPC}
   SetLength(jss,length(JSONObject));
   for i:=0 to High(JSONObject) do jss[i+1] := AnsiChar( JSONObject[i] );
   Try
@@ -938,6 +1005,15 @@ begin
       TLog.NewLog(ltDebug,ClassName,'Error processing JSON: '+E.Message);
     end;
   end;
+  {$ELSE}
+  Try
+    JS := TJSONObject.ParseJSONValue(JSONObject,0);
+  Except
+    On E:Exception do begin
+      TLog.NewLog(ltDebug,ClassName,'Error processing JSON: '+E.Message);
+    end;
+  End;
+  {$ENDIF}
   if Not Assigned(JS) then exit;
   Try
     if JS is TJSONObject then begin

+ 34 - 11
Units/PascalCoin/config.inc → src/config.inc

@@ -4,7 +4,7 @@
   or visit http://www.opensource.org/licenses/mit-license.php.
 
   This unit is a part of Pascal Coin, a P2P crypto currency without need of
-  historical miPendingOperations.
+  historical operations.
 
   If you like it, consider a donation using BitCoin:
   16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
@@ -25,6 +25,7 @@
 }
 
   {$DEFINE OPTIONS_BY_DEFAULT}
+  {.$DEFINE DelphiSockets_OpenSSLv10}
   {.$DEFINE Synapse_OpenSSLv10}
   {.$DEFINE Synapse_OpenSSLv11}
 
@@ -34,7 +35,7 @@
   // For GUI: Allows to show average time on blockchain explorer
   {$DEFINE SHOW_AVERAGE_TIME_STATS}
 
-  // For special use: Allows to store in a buffer, miPendingOperations not proceded due to n_operation value invalid
+  // For special use: Allows to store in a buffer, operations not proceded due to n_operation value invalid
   {.$DEFINE BufferOfFutureOperations}
   
   // HighLog will result in a higher log generation
@@ -53,23 +54,45 @@ ERROR: You must select ONE option!
 {$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}
 {$IFDEF OPTIONS_BY_DEFAULT}
   // By default are: Delphi = Synapse + OpenSSLv10  -  FPC = Synapse + OpenSSLv11
+  {$IFDEF FPC}
     // With Free Pascal Compiler, only Synapse + OpenSSLv1.0 for Delphi or OpenSSLv1.1 for Linux
-  {$DEFINE Synapse}
-  {$IFDEF LINUX}
-  {$UNDEF OpenSSL10}
+    {$DEFINE Synapse}
+    {$IFDEF LINUX}
+    {$UNDEF OpenSSL10}
+    {$ELSE}
+    {$DEFINE OpenSSL10}
+    {$ENDIF}
   {$ELSE}
-  {$DEFINE OpenSSL10}
+    // Delphi, Synapse + OpenSSL v1.0
+    {$DEFINE Synapse}
+    {$DEFINE OpenSSL10}
   {$ENDIF}
+  {$IFDEF DelphiSockets_OpenSSLv10}ERROR: You selected more than 1 option{$ENDIF}
   {$IFDEF Synapse_OpenSSLv10}ERROR: You selected more than 1 option{$ENDIF}
   {$IFDEF Synapse_OpenSSLv11}ERROR: You selected more than 1 option{$ENDIF}
 {$ELSE}
-  {$IFDEF Synapse_OpenSSLv10}
-    {$DEFINE Synapse}
-    {$DEFINE OpenSSL10}
+  {$IFDEF DelphiSockets_OpenSSLv10}
+    {$IFDEF FPC}
+      ERROR: With Free Pascal you cannot choose compiler directive DelphiSockets_OpenSSLv10
+    {$ELSE}
+      {$UNDEF Synapse}
+      {$DEFINE OpenSSL10}
+    {$ENDIF}
+    {$IFDEF Synapse_OpenSSLv10}ERROR: You selected more than 1 option{$ENDIF}
     {$IFDEF Synapse_OpenSSLv11}ERROR: You selected more than 1 option{$ENDIF}
   {$ELSE}
-    {$DEFINE Synapse}
-    {$UNDEF OpenSSL10}
+    {$IFDEF Synapse_OpenSSLv10}
+      {$DEFINE Synapse}
+      {$DEFINE OpenSSL10}
+      {$IFDEF Synapse_OpenSSLv11}ERROR: You selected more than 1 option{$ENDIF}
+    {$ELSE}
+      {$IFDEF FPC}
+        {$DEFINE Synapse}
+        {$UNDEF OpenSSL10}
+      {$ELSE}
+        ERROR: With Delphi you cannot choose compiler directive Synapse_OpenSSLv11
+      {$ENDIF}
+    {$ENDIF}
   {$ENDIF}
 {$ENDIF}
 

+ 12 - 1
Units/PascalCoin/UAES.pas → src/core/UAES.pas

@@ -1,6 +1,8 @@
 unit UAES;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -40,17 +42,26 @@ Type
     Class function EVP_Decrypt_AES256(const EncryptedMessage: TRawBytes; APassword: AnsiString; var Decrypted : AnsiString) : Boolean; overload;
   End;
 
+{$IFDEF FPC}
 procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
+{$ENDIF}
 
 implementation
 
 uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  {LCLIntf, LCLType, LMessages,}
+{$ENDIF}
   UOpenSSL, UOpenSSLdef;
 
+{$IFDEF FPC}
 procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
 begin
   Move(Source^, Destination^, Length);
 end;
+{$ENDIF}
 
 CONST SALT_MAGIC: AnsiString = 'Salted__'; SALT_MAGIC_LEN: integer = 8; SALT_SIZE = 8;
 

+ 0 - 0
Units/PascalCoin/UAccountKeyStorage.pas → src/core/UAccountKeyStorage.pas


+ 36 - 23
Units/PascalCoin/UAccounts.pas → src/core/UAccounts.pas

@@ -1,6 +1,8 @@
 unit UAccounts;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -86,7 +88,7 @@ Type
     Class Function EqualAccountInfos(const accountInfo1,accountInfo2 : TAccountInfo) : Boolean;
     Class Function EqualAccountKeys(const account1,account2 : TAccountKey) : Boolean;
     Class Function AccountNumberToAccountTxtNumber(account_number : Cardinal) : AnsiString;
-    Class function AccountTxtNumberToAccountNumber(Const account_txt_number : AnsiString; out account_number : Cardinal) : Boolean;
+    Class function AccountTxtNumberToAccountNumber(Const account_txt_number : AnsiString; var account_number : Cardinal) : Boolean;
     Class function FormatMoney(Money : Int64) : AnsiString;
     Class function FormatMoneyDecimal(Money : Int64) : Single;
     Class Function TxtToMoney(Const moneytxt : AnsiString; var money : Int64) : Boolean;
@@ -194,11 +196,11 @@ Type
   public
     Constructor Create(AccountList : TPCSafeBox; AutoAddAll : Boolean);
     Destructor Destroy; override;
-    Function Find(Const AccountKey: TAccountKey; var Index: Integer): Boolean;
     Procedure AddAccountKey(Const AccountKey : TAccountKey);
     Procedure RemoveAccountKey(Const AccountKey : TAccountKey);
     Procedure AddAccounts(Const AccountKey : TAccountKey; const accounts : Array of Cardinal);
     Procedure RemoveAccounts(Const AccountKey : TAccountKey; const accounts : Array of Cardinal);
+    Function Find(Const AccountKey: TAccountKey; var Index: Integer): Boolean;
     Function IndexOfAccountKey(Const AccountKey : TAccountKey) : Integer;
     Property AccountKeyList[index : Integer] : TOrderedCardinalList read GetAccountKeyList;
     Property AccountKey[index : Integer] : TAccountKey read GetAccountKey;
@@ -344,12 +346,12 @@ Type
 
 Const
   CT_OperationBlock_NUL : TOperationBlock = (block:0;account_key:(EC_OpenSSL_NID:0;x:'';y:'');reward:0;fee:0;protocol_version:0;
-    protocol_available:0;timestamp:0;compact_target:0;nonce:0;block_payload:'';initial_safe_box_hash:'';operations_hash:'';proof_of_work:'');
+    protocol_available:0;timestamp:0;compact_target:0;nonce:0;block_payload:'';operations_hash:'';proof_of_work:'');
   CT_AccountInfo_NUL : TAccountInfo = (state:as_Unknown;accountKey:(EC_OpenSSL_NID:0;x:'';y:'');locked_until_block:0;price:0;account_to_pay:0;new_publicKey:(EC_OpenSSL_NID:0;x:'';y:''));
   CT_Account_NUL : TAccount = (account:0;accountInfo:(state:as_Unknown;accountKey:(EC_OpenSSL_NID:0;x:'';y:'');locked_until_block:0;price:0;account_to_pay:0;new_publicKey:(EC_OpenSSL_NID:0;x:'';y:''));balance:0;updated_block:0;n_operation:0;name:'';account_type:0;previous_updated_block:0);
   CT_BlockAccount_NUL : TBlockAccount = (
     blockchainInfo:(block:0;account_key:(EC_OpenSSL_NID:0;x:'';y:'');reward:0;fee:0;protocol_version:0;
-    protocol_available:0;timestamp:0;compact_target:0;nonce:0;block_payload:'';initial_safe_box_hash:'';operations_hash:'';proof_of_work:'');
+    protocol_available:0;timestamp:0;compact_target:0;nonce:0;block_payload:'';operations_hash:'';proof_of_work:'');
     accounts:(
     (account:0;accountInfo:(state:as_Unknown;accountKey:(EC_OpenSSL_NID:0;x:'';y:'');locked_until_block:0;price:0;account_to_pay:0;new_publicKey:(EC_OpenSSL_NID:0;x:'';y:''));balance:0;updated_block:0;n_operation:0;name:'';account_type:0;previous_updated_block:0),
     (account:0;accountInfo:(state:as_Unknown;accountKey:(EC_OpenSSL_NID:0;x:'';y:'');locked_until_block:0;price:0;account_to_pay:0;new_publicKey:(EC_OpenSSL_NID:0;x:'';y:''));balance:0;updated_block:0;n_operation:0;name:'';account_type:0;previous_updated_block:0),
@@ -366,7 +368,7 @@ Const
 implementation
 
 uses
-  SysUtils, ULog, UOpenSSLdef, UOpenSSL, UAccountKeyStorage, math;
+  SysUtils, ULog, UOpenSSLdef, UOpenSSL, UAccountKeyStorage, Math;
 
 { TPascalCoinProtocol }
 
@@ -874,7 +876,7 @@ begin
   end;
 end;
 
-class function TAccountComp.AccountTxtNumberToAccountNumber(const account_txt_number: AnsiString; out account_number: Cardinal): Boolean;
+class function TAccountComp.AccountTxtNumberToAccountNumber(const account_txt_number: AnsiString; var account_number: Cardinal): Boolean;
 Var i : Integer;
   char1 : AnsiChar;
   char2 : AnsiChar;
@@ -1127,11 +1129,11 @@ begin
     exit;
   end;
   try
-    If pos(DefaultFormatSettings.DecimalSeparator,moneytxt)<=0 then begin
+    If pos(DecimalSeparator,moneytxt)<=0 then begin
       // No decimal separator, consider ThousandSeparator as a decimal separator
-      s := StringReplace(moneytxt,DefaultFormatSettings.ThousandSeparator,DefaultFormatSettings.DecimalSeparator,[rfReplaceAll]);
+      s := StringReplace(moneytxt,ThousandSeparator,DecimalSeparator,[rfReplaceAll]);
     end else begin
-      s := StringReplace(moneytxt,DefaultFormatSettings.ThousandSeparator,'',[rfReplaceAll]);
+      s := StringReplace(moneytxt,ThousandSeparator,'',[rfReplaceAll]);
     end;
     money := Round( StrToFloat(s)*10000 );
     Result := true;
@@ -1521,7 +1523,7 @@ begin
         Result := 1;
         exit;
       end;
-      if (block_number>=FBlockAccountsList.Count) then raise Exception.Create('Invalid block number: '+inttostr(block_number));
+      if (block_number<0) Or (block_number>=FBlockAccountsList.Count) then raise Exception.Create('Invalid block number: '+inttostr(block_number));
       if (Previous_blocks_average<=0) then raise Exception.Create('Dev error 20161016-1');
       if (Previous_blocks_average>block_number) then Previous_blocks_average := block_number;
       //
@@ -1574,10 +1576,12 @@ procedure TPCSafeBox.CheckMemory;
     When compiling using Delphi it's memory manager more is efficient and does not increase, but
     When compiling using Free Pascal Compiler, is a good solution to "force" generate a new SafeBox
     in order to free memory not used. Tested with FPC 3.0 }
+{$IFDEF FPC}
 Var sb : TPCSafeBox;
   tc : QWord;
-
+{$ENDIF}
 begin
+  {$IFDEF FPC}
   StartThreadSafe;
   try
     tc := GetTickCount64;
@@ -1594,6 +1598,7 @@ begin
   finally
     EndThreadSave;
   end;
+  {$ENDIF}
 end;
 
 procedure TPCSafeBox.Clear;
@@ -1839,7 +1844,11 @@ begin
         // BufferBlocksHash fill with data
         j := (length(P^.block_hash)*(iBlock));
         for i := 1 to length(P^.block_hash) do begin
+          {$IFDEF FPC}
           FBufferBlocksHash[i+j] := AnsiChar(P^.block_hash[i-(low(FBufferBlocksHash)-low(P^.block_hash))]);
+          {$ELSE}
+          FBufferBlocksHash[i+j] := AnsiChar(P^.block_hash[i-{$IFDEF uselowmem}1{$ELSE}0{$ENDIF}]);
+          {$ENDIF}
         end;
         LastReadBlock := block;
         Inc(FWorkSum,block.blockchainInfo.compact_target);
@@ -2035,7 +2044,7 @@ begin
       exit;
     end;
     destTotalBlocks := ToBlock - FromBlock + 1;
-    TLog.NewLog(ltInfo,ClassName,Format('CopySafeBoxStream from safebox with %d to %d (of %d sbh:%s) to safebox with %d and %d',
+    TLog.NewLog(ltDebug,ClassName,Format('CopySafeBoxStream from safebox with %d to %d (of %d sbh:%s) to safebox with %d and %d',
       [sbHeader.startBlock,sbHeader.endBlock,sbHeader.BlocksCount,TCrypto.ToHexaString(sbHeader.safeBoxHash),FromBlock,ToBlock]));
     // Read Source Offset zone
     posOffsetZoneSource := Source.Position;
@@ -2053,7 +2062,7 @@ begin
     setLength(offsetsDest,destTotalBlocks+1);
     // Blocks zone
     posBlocksZoneDest := Dest.Position;
-    TLog.NewLog(ltInfo,Classname,
+    TLog.NewLog(ltDebug,Classname,
       Format('Copying Safebox Stream from source Position %d (size:%d) to dest %d bytes - OffsetSource[%d] - OffsetSource[%d]',
        [posOffsetZoneSource + offsetsSource[FromBlock - sbHeader.startBlock], Source.Size,
         offsetsSource[ToBlock - sbHeader.startBlock + 1] - offsetsSource[FromBlock - sbHeader.startBlock],
@@ -2477,7 +2486,11 @@ begin
   // Update buffer block hash
   j := (length(P^.block_hash)*(iBlock));
   for i := 1 to length(P^.block_hash) do begin
+    {$IFDEF FPC}
     FBufferBlocksHash[i+j] := AnsiChar(P^.block_hash[i-(low(FBufferBlocksHash)-low(P^.block_hash))]);
+    {$ELSE}
+    FBufferBlocksHash[i+j] := AnsiChar(P^.block_hash[i-{$IFDEF uselowmem}1{$ELSE}0{$ENDIF}]);
+    {$ENDIF}
   end;
 
   FTotalBalance := FTotalBalance - (Int64(lastbalance)-Int64(newBalance));
@@ -2511,9 +2524,9 @@ begin
     errors := 'Invalid integrity in accounts transaction';
     exit;
   end;
-  if (buyer>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) Or
-     (account_to_buy>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) Or
-     (seller>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) then begin
+  if (buyer<0) Or (buyer>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) Or
+     (account_to_buy<0) Or (account_to_buy>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) Or
+     (seller<0) Or (seller>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) then begin
      errors := 'Invalid account number on buy';
      exit;
   end;
@@ -2739,8 +2752,8 @@ begin
     errors := 'Invalid integrity in accounts transaction';
     exit;
   end;
-  if (sender>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) Or
-     (target>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) then begin
+  if (sender<0) Or (sender>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) Or
+     (target<0) Or (target>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) then begin
      errors := 'Invalid sender or target on transfer';
      exit;
   end;
@@ -2801,8 +2814,8 @@ Var i : Integer;
 begin
   Result := false;
   errors := '';
-  if (signer_account>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) Or
-     (target_account>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) Then begin
+  if (signer_account<0) Or (signer_account>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) Or
+     (target_account<0) Or (target_account>=(FFreezedAccounts.BlocksCount*CT_AccountsPerBlock)) Then begin
      errors := 'Invalid account';
      exit;
   end;
@@ -2967,7 +2980,7 @@ Type
 
 function SortOrdered(Item1, Item2: Pointer): Integer;
 begin
-   Result := PtrUInt(Item1) - PtrUInt(Item2);
+   Result := PtrInt(Item1) - PtrInt(Item2);
 end;
 
 procedure TOrderedAccountKeysList.AddAccountKey(const AccountKey: TAccountKey);
@@ -3213,7 +3226,7 @@ begin
   while L <= H do
   begin
     I := (L + H) shr 1;
-    C := PtrUInt(FOrderedList[I]) - (Value);
+    C := Int64(FOrderedList[I]) - Int64(Value);
     if C < 0 then L := I + 1 else
     begin
       H := I - 1;

+ 7 - 4
Units/PascalCoin/UBaseTypes.pas → src/core/UBaseTypes.pas

@@ -1,6 +1,8 @@
 unit UBaseTypes;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2017 by Albert Molina
 
@@ -39,7 +41,7 @@ Type
     class function T32BytesToRawBytes(const source : T32Bytes) : TDynRawBytes; overload;
     class function TRawBytesTo32Left0Padded(const source : TDynRawBytes) : T32Bytes;
     class function Copy(const source : T32bytes; start, length : Integer) : ShortString; overload;
-    class function Copy(const source: T256RawBytes; var dest: T256RawBytes):T256RawBytes;
+    class function Copy(const source : T256RawBytes; var dest : T256RawBytes) : ShortString; overload;
     class function To256RawBytes(const source : TRawBytes) : T256RawBytes; overload;
     class procedure To256RawBytes(const source : TRawBytes; var dest : T256RawBytes); overload;
     class function ToRawBytes(const source : T256RawBytes) : TRawBytes; overload;
@@ -62,10 +64,12 @@ implementation
 
 { TBaseType }
 
+{$IFnDEF FPC}
 procedure FillByte(var X; count : Integer; value : Byte);
 begin
   FillChar(X,count,value);
 end;
+{$ENDIF}
 
 class procedure TBaseType.T32BytesToRawBytes(const source: T32Bytes; var dest: TDynRawBytes);
 begin
@@ -96,14 +100,13 @@ begin
   move(source[start],Result[1],length);
 end;
 
-class function TBaseType.Copy(const source: T256RawBytes; var dest: T256RawBytes):T256RawBytes;
+class function TBaseType.Copy(const source: T256RawBytes; var dest: T256RawBytes): ShortString;
 var i : Integer;
 begin
   SetLength(dest,length(source));
   for i:=0 to high(dest) do begin
     dest[i] := source[i];
   end;
-  Exit(dest);
 end;
 
 class function TBaseType.To256RawBytes(const source: TRawBytes): T256RawBytes;

+ 213 - 50
Units/PascalCoin/UBlockChain.pas → src/core/UBlockChain.pas

@@ -1,6 +1,8 @@
 unit UBlockChain;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -18,7 +20,8 @@ unit UBlockChain;
 interface
 
 uses
-  Classes, UCrypto, UAccounts, ULog, UThread, SyncObjs, SysUtils, Generics.Collections, UCommon;
+  Generics.Collections, Classes, UCrypto, UAccounts, ULog, UThread, SyncObjs, SysUtils, UCommon;
+
 {$I config.inc}
 
 {
@@ -153,6 +156,8 @@ Type
   Private
     Ftag: integer;
   Protected
+    FSignatureChecked : Boolean; // Improvement TPCOperation speed 2.1.6
+    //
     FPrevious_Signer_updated_block: Cardinal;
     FPrevious_Destination_updated_block : Cardinal;
     FPrevious_Seller_updated_block : Cardinal;
@@ -165,9 +170,9 @@ Type
     constructor Create; virtual;
     function GetBufferForOpHash(UseProtocolV2 : Boolean): TRawBytes; virtual;
     function DoOperation(AccountTransaction : TPCSafeBoxTransaction; var errors: AnsiString): Boolean; virtual; abstract;
-    procedure AffectedAccounts(list : Classes.TList); virtual; abstract;
+    procedure AffectedAccounts(list : TList); virtual; abstract;
     class function OpType: Byte; virtual; abstract;
-    Class Function OperationToOperationResume(Block : Cardinal; Operation : TPCOperation; Affected_account_number : Cardinal; var OperationResume : TOperationResume) : Boolean; overload;
+    Class Function OperationToOperationResume(Block : Cardinal; Operation : TPCOperation; Affected_account_number : Cardinal; var OperationResume : TOperationResume) : Boolean;
     function OperationAmount : Int64; virtual; abstract;
     function OperationFee: UInt64; virtual; abstract;
     function OperationPayload : TRawBytes; virtual; abstract;
@@ -198,22 +203,27 @@ Type
 
   TOperationsHashTree = Class
   private
-    FHashTreeOperations : TPCThreadList;
+    FListOrderedByAccountsData : TList;
+    FListOrderedBySha256 : TList; // Improvement TOperationsHashTree speed 2.1.6
+    FHashTreeOperations : TPCThreadList; // Improvement TOperationsHashTree speed 2.1.6
     FHashTree: TRawBytes;
     FOnChanged: TNotifyEvent;
     FTotalAmount : Int64;
     FTotalFee : Int64;
-    Procedure InternalAddOperationToHashTree(list : Classes.TList; op : TPCOperation);
+    Procedure InternalAddOperationToHashTree(list : TList; op : TPCOperation; CalcNewHashTree : Boolean);
+    Function FindOrderedBySha(lockedThreadList : TList; const Value: TRawBytes; var Index: Integer): Boolean;
+    Function FindOrderedByAccountData(lockedThreadList : TList; const account_number : Cardinal; var Index: Integer): Boolean;
+    function GetHashTree: TRawBytes;
   public
     Constructor Create;
     Destructor Destroy; Override;
     Procedure AddOperationToHashTree(op : TPCOperation);
     Procedure ClearHastThree;
-    Property HashTree : TRawBytes read FHashTree;
+    Property HashTree : TRawBytes read GetHashTree;
     Function OperationsCount : Integer;
     Function GetOperation(index : Integer) : TPCOperation;
     Function GetOperationsAffectingAccount(account_number : Cardinal; List : Classes.TList) : Integer;
-    Function GetOperationsAffectingAccounts(const account_numbers : array of Cardinal; const AList: TList<Cardinal>) : Integer;
+    Function GetOperationsAffectingAccounts(const account_numbers : array of Cardinal; const AList: Generics.Collections.TList<Cardinal>) : Integer;
     Procedure CopyFromHashTree(Sender : TOperationsHashTree);
     Property TotalAmount : Int64 read FTotalAmount;
     Property TotalFee : Int64 read FTotalFee;
@@ -388,7 +398,7 @@ Type
     FUpgradingToV2: Boolean;
     FOnLog: TPCBankLog;
     FBankLock: TPCCriticalSection;
-    FNotifyList : Classes.TList;
+    FNotifyList : TList;
     FStorageClass: TStorageClass;
     function GetStorage: TStorage;
     procedure SetStorageClass(const Value: TStorageClass);
@@ -537,7 +547,7 @@ begin
   FIsRestoringFromFile := False;
   FOnLog := Nil;
   FSafeBox := TPCSafeBox.Create;
-  FNotifyList := Classes.TList.Create;
+  FNotifyList := TList.Create;
   FLastBlockCache := TPCOperationsComp.Create(Nil);
   FIsRestoringFromFile:=False;
   FUpgradingToV2:=False;
@@ -610,6 +620,7 @@ begin
                 Storage.DeleteBlockChainBlocks(BlocksCount);
                 break;
               end else begin
+                // To prevent continuous saving...
                 {$IFDEF TESTNET}
                 Storage.SaveBank;
                 {$ELSE}
@@ -723,7 +734,7 @@ begin
         FLastOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(CT_Genesis_Magic_String_For_Old_Block_Hash); // Genesis hash
       end;
     finally
-      FBankLock.Release; // TODO - If fast close Wallet after open this Error string
+      FBankLock.Release;
     end;
     for i := 0 to FNotifyList.Count - 1 do begin
       TPCBankNotify(FNotifyList.Items[i]).NotifyNewBlock;
@@ -1235,7 +1246,6 @@ begin
     FOperationBlock.fee := 0;
     //
     SafeBoxTransaction.CleanTransaction;
-    //
     aux := TOperationsHashTree.Create;
     Try
       lastn := FOperationsHashTree.OperationsCount;
@@ -1245,7 +1255,7 @@ begin
           inc(n);
           aux.AddOperationToHashTree(op);
           inc(FOperationBlock.fee,op.OperationFee);
-          TLog.NewLog(ltdebug,Classname,'Sanitizing (pos:'+inttostr(i+1)+'/'+inttostr(lastn)+'): '+op.ToString);
+          {$IFDEF HIGHLOG}TLog.NewLog(ltdebug,Classname,'Sanitizing (pos:'+inttostr(i+1)+'/'+inttostr(lastn)+'): '+op.ToString){$ENDIF};
         end;
       end;
     Finally
@@ -1566,22 +1576,29 @@ Type TOperationHashTreeReg = Record
        Op : TPCOperation;
      end;
      POperationHashTreeReg = ^TOperationHashTreeReg;
+     TOperationsHashAccountsData = Record
+       account_number : Cardinal;
+       account_count : Integer;
+       account_without_fee : Integer;
+     end;
+     POperationsHashAccountsData = ^TOperationsHashAccountsData;
 
 procedure TOperationsHashTree.AddOperationToHashTree(op: TPCOperation);
-Var l : Classes.TList;
+Var l : TList;
 begin
   l := FHashTreeOperations.LockList;
   try
-    InternalAddOperationToHashTree(l,op);
+    InternalAddOperationToHashTree(l,op,True);
   finally
     FHashTreeOperations.UnlockList;
   end;
 end;
 
 procedure TOperationsHashTree.ClearHastThree;
-var l : Classes.TList;
+var l : TList;
   i : Integer;
   P : POperationHashTreeReg;
+  PaccData : POperationsHashAccountsData;
 begin
   l := FHashTreeOperations.LockList;
   try
@@ -1593,9 +1610,15 @@ begin
         P^.Op.Free;
         Dispose(P);
       end;
+      for i:=0 to FListOrderedByAccountsData.Count-1 do begin
+        PaccData := FListOrderedByAccountsData[i];
+        Dispose(PaccData);
+      end;
     Finally
       l.Clear;
-      FHashTree := TCrypto.DoSha256('');
+      FListOrderedBySha256.Clear;
+      FListOrderedByAccountsData.Clear;
+      FHashTree := '';
     End;
     If Assigned(FOnChanged) then FOnChanged(Self);
   finally
@@ -1605,25 +1628,28 @@ end;
 
 procedure TOperationsHashTree.CopyFromHashTree(Sender: TOperationsHashTree);
 Var i : Integer;
-  lme, lsender : Classes.TList;
+  lme, lsender : TList;
   PSender : POperationHashTreeReg;
   lastNE : TNotifyEvent;
 begin
   if (Sender = Self) then begin
     exit;
   end;
-  ClearHastThree;
   lme := FHashTreeOperations.LockList;
   try
     lastNE := FOnChanged;
     FOnChanged := Nil;
     try
+      ClearHastThree;
       lsender := Sender.FHashTreeOperations.LockList;
       try
         for i := 0 to lsender.Count - 1 do begin
           PSender := lsender[i];
-          InternalAddOperationToHashTree(lme,PSender^.Op);
+          InternalAddOperationToHashTree(lme,PSender^.Op,False);
         end;
+        // Improvement TOperationsHashTree speed 2.1.6
+        // FHashTree value updated now, not on every for cycle
+        FHashTree:=Sender.FHashTree;
       finally
         Sender.FHashTreeOperations.UnlockList;
       end;
@@ -1639,31 +1665,60 @@ end;
 constructor TOperationsHashTree.Create;
 begin
   FOnChanged:=Nil;
+  FListOrderedBySha256 := TList.Create;
+  FListOrderedByAccountsData := TList.Create;
   FTotalAmount := 0;
   FTotalFee := 0;
-  FHashTree := TCrypto.DoSha256('');
+  FHashTree := '';
   FHashTreeOperations := TPCThreadList.Create('TOperationsHashTree_HashTreeOperations');
 end;
 
 procedure TOperationsHashTree.Delete(index: Integer);
-Var l : Classes.TList;
+Var l : TList;
   P : POperationHashTreeReg;
-  i : Integer;
+  i,iDel,iValuePosDeleted : Integer;
+  PaccData : POperationsHashAccountsData;
 begin
   l := FHashTreeOperations.LockList;
   try
     P := l[index];
+
+    // Delete from Ordered
+    If Not FindOrderedBySha(l,P^.Op.Sha256,iDel) then begin
+      TLog.NewLog(ltError,ClassName,'DEV ERROR 20180213-1 Operation not found in ordered list: '+P^.Op.ToString);
+    end else begin
+      iValuePosDeleted := PtrInt(FListOrderedBySha256[iDel]);
+      FListOrderedBySha256.Delete(iDel);
+      // Decrease values > iValuePosDeleted
+      for i := 0 to FListOrderedBySha256.Count - 1 do begin
+        if PtrInt(FListOrderedBySha256[i])>iValuePosDeleted then begin
+          FListOrderedBySha256[i] := TObject( PtrInt(FListOrderedBySha256[i]) - 1 );
+        end;
+      end;
+    end;
+    // Delete from account Data
+    If Not FindOrderedByAccountData(l,P^.Op.SignerAccount,i) then begin
+      TLog.NewLog(ltError,ClassName,Format('DEV ERROR 20180213-3 account %d not found in ordered list: %s',[P^.Op.SignerAccount,P^.Op.ToString]));
+    end else begin
+      PaccData := POperationsHashAccountsData( FListOrderedByAccountsData[i] );
+      Dec(PaccData.account_count);
+      If (P^.Op.OperationFee=0) then Dec(PaccData.account_without_fee);
+      If (PaccData.account_count<=0) then begin
+        Dispose(PaccData);
+        FListOrderedByAccountsData.Delete(i);
+      end;
+    end;
+
     l.Delete(index);
     P^.Op.Free;
     Dispose(P);
     // Recalc operations hash
     FTotalAmount := 0;
     FTotalFee := 0;
-    FHashTree := '';
+    FHashTree := ''; // Init to future recalc
     for i := 0 to l.Count - 1 do begin
       P := l[i];
       // Include to hash tree
-      FHashTree := TCrypto.DoSha256(FHashTree+P^.Op.Sha256);
       P^.Op.tag := i;
       inc(FTotalAmount,P^.Op.OperationAmount);
       inc(FTotalFee,P^.Op.OperationFee);
@@ -1680,11 +1735,34 @@ begin
   ClearHastThree;
   FreeAndNil(FHashTreeOperations);
   SetLength(FHashTree,0);
+  FreeAndNil(FListOrderedBySha256);
+  FreeAndNil(FListOrderedByAccountsData);
   inherited;
 end;
 
+function TOperationsHashTree.GetHashTree: TRawBytes;
+Var l : TList;
+  i : Integer;
+  P : POperationHashTreeReg;
+begin
+  if Length(FHashTree)<>32 then begin
+    l := FHashTreeOperations.LockList;
+    Try
+      TCrypto.DoSha256('',FHashTree);
+      for i := 0 to l.Count - 1 do begin
+        P := l[i];
+        // Include to hash tree
+        TCrypto.DoSha256(FHashTree+P^.Op.Sha256,FHashTree);
+      end;
+    Finally
+      FHashTreeOperations.UnlockList;
+    End;
+  end;
+  Result := FHashTree;
+end;
+
 function TOperationsHashTree.GetOperation(index: Integer): TPCOperation;
-Var l : Classes.TList;
+Var l : TList;
 begin
   l := FHashTreeOperations.LockList;
   try
@@ -1694,15 +1772,15 @@ begin
   end;
 end;
 
-function TOperationsHashTree.GetOperationsAffectingAccount(account_number: Cardinal; List: Classes.TList): Integer;
+function TOperationsHashTree.GetOperationsAffectingAccount(account_number: Cardinal; List: TList): Integer;
   // This function retrieves operations from HashTree that affeccts to an account_number
-Var l,intl : Classes.TList;
+Var l,intl : TList;
   i,j : Integer;
 begin
   List.Clear;
   l := FHashTreeOperations.LockList;
   try
-    intl := Classes.TList.Create;
+    intl := TList.Create;
     try
       for i := 0 to l.Count - 1 do begin
         intl.Clear;
@@ -1744,41 +1822,47 @@ begin
 end;
 
 function TOperationsHashTree.IndexOfOperation(op: TPCOperation): Integer;
-Var
-  l : Classes.TList;
+Var iPosInOrdered : Integer;
+  l : TList;
   OpSha256 : TRawBytes;
 begin
   OpSha256 := op.Sha256;
   l := FHashTreeOperations.LockList;
   Try
-    for Result := 0 to l.Count - 1 do begin
-      if POperationHashTreeReg(l[Result])^.Op.Sha256=OpSha256 then exit;
-    end;
-    Result := -1;
+    // Improvement TOperationsHashTree speed 2.1.5.1
+    // Use ordered search
+    If FindOrderedBySha(l,OpSha256,iPosInOrdered) then begin
+      Result := PtrInt(FListOrderedBySha256.Items[iPosInOrdered]);
+    end else Result := -1;
   Finally
     FHashTreeOperations.UnlockList;
   End;
 end;
 
 function TOperationsHashTree.CountOperationsBySameSignerWithoutFee(account_number: Cardinal): Integer;
-Var l : Classes.TList;
+Var l : TList;
   i : Integer;
 begin
   Result := 0;
   l := FHashTreeOperations.LockList;
   Try
-    for i := 0 to l.Count - 1 do begin
-      if (POperationHashTreeReg(l[i])^.Op.SignerAccount=account_number) And (POperationHashTreeReg(l[i])^.Op.OperationFee=0) then inc(Result);
-    end;
+    // Improvement TOperationsHashTree speed 2.1.5.1
+    // Use ordered accounts Data search
+    If FindOrderedByAccountData(l,account_number,i) then begin
+      Result := POperationsHashAccountsData(FListOrderedByAccountsData[i])^.account_without_fee;
+    end else Result := 0;
   Finally
     FHashTreeOperations.UnlockList;
   End;
 end;
 
-procedure TOperationsHashTree.InternalAddOperationToHashTree(list: Classes.TList; op: TPCOperation);
+procedure TOperationsHashTree.InternalAddOperationToHashTree(list: TList; op: TPCOperation; CalcNewHashTree : Boolean);
 Var msCopy : TMemoryStream;
   h : TRawBytes;
   P : POperationHashTreeReg;
+  PaccData : POperationsHashAccountsData;
+  i,npos : Integer;
+  auxs : AnsiString;
 begin
   msCopy := TMemoryStream.Create;
   try
@@ -1791,11 +1875,36 @@ begin
     P^.Op.FPrevious_Signer_updated_block := op.Previous_Signer_updated_block;
     P^.Op.FPrevious_Destination_updated_block := op.FPrevious_Destination_updated_block;
     P^.Op.FPrevious_Seller_updated_block := op.FPrevious_Seller_updated_block;
+    P^.Op.FHasValidSignature:=op.FHasValidSignature;
+    P^.Op.FSignatureChecked:=op.FSignatureChecked;
     h := op.Sha256;
+    P^.Op.FBufferedSha256:=op.FBufferedSha256;
     P^.Op.tag := list.Count;
-    // Include to hash tree
-    FHashTree := TCrypto.DoSha256(FHashTree+h);
-    list.Add(P);
+    // Improvement TOperationsHashTree speed 2.1.6
+    // Include to hash tree (Only if CalcNewHashTree=True)
+    If (CalcNewHashTree) And (Length(FHashTree)=32) then begin
+      TCrypto.DoSha256(FHashTree+h,FHashTree);
+    end;
+    npos := list.Add(P);
+    If FindOrderedBySha(list,op.Sha256,i) then begin
+      // Is inserting a value already found!
+      auxs :=Format('MyListCount:%d OrderedBySha Pos:%d from %d Hash:%s PointsTo:%d',[list.Count,i,FListOrderedBySha256.Count,TCrypto.ToHexaString(Op.Sha256),PtrInt(FListOrderedBySha256[i])]);
+      TLog.NewLog(ltError,ClassName,'DEV ERROR 20180213-2 Inserting a duplicate Sha256! '+Op.ToString+' > '+auxs );
+    end;
+    FListOrderedBySha256.Insert(i,TObject(npos));
+    // Improvement TOperationsHashTree speed 2.1.6
+    // Mantain an ordered Accounts list with data
+    If Not FindOrderedByAccountData(list,op.SignerAccount,i) then begin
+      New(PaccData);
+      PaccData^.account_number:=op.SignerAccount;
+      PaccData^.account_count:=0;
+      PaccData^.account_without_fee:=0;
+      FListOrderedByAccountsData.Insert(i,PaccData);
+    end else PaccData := FListOrderedByAccountsData[i];
+    Inc(PaccData^.account_count);
+    If op.OperationFee=0 then begin
+      Inc(PaccData^.account_without_fee);
+    end;
   finally
     msCopy.Free;
   end;
@@ -1804,6 +1913,57 @@ begin
   If Assigned(FOnChanged) then FOnChanged(Self);
 end;
 
+function TOperationsHashTree.FindOrderedBySha(lockedThreadList : TList; const Value: TRawBytes; var Index: Integer): Boolean;
+var L, H, I : Integer;
+  iLockedThreadListPos : PtrInt;
+  C : Int64;
+  P : POperationHashTreeReg;
+begin
+  Result := False;
+  L := 0;
+  H := FListOrderedBySha256.Count - 1;
+  while L <= H do
+  begin
+    I := (L + H) shr 1;
+    iLockedThreadListPos := PtrInt(FListOrderedBySha256[I]);
+    C := BinStrComp(POperationHashTreeReg(lockedThreadList[iLockedThreadListPos])^.Op.Sha256,Value);
+    if C < 0 then L := I + 1 else
+    begin
+      H := I - 1;
+      if C = 0 then
+      begin
+        Result := True;
+        L := I;
+      end;
+    end;
+  end;
+  Index := L;
+end;
+
+function TOperationsHashTree.FindOrderedByAccountData(lockedThreadList: TList; const account_number: Cardinal; var Index: Integer): Boolean;
+var L, H, I : Integer;
+  C : Int64;
+begin
+  Result := False;
+  L := 0;
+  H := FListOrderedByAccountsData.Count - 1;
+  while L <= H do
+  begin
+    I := (L + H) shr 1;
+    C := Int64(POperationsHashAccountsData(FListOrderedByAccountsData[I])^.account_number) - Int64(account_number);
+    if C < 0 then L := I + 1 else
+    begin
+      H := I - 1;
+      if C = 0 then
+      begin
+        Result := True;
+        L := I;
+      end;
+    end;
+  end;
+  Index := L;
+end;
+
 function TOperationsHashTree.LoadOperationsHashTreeFromStream(Stream: TStream; LoadingFromStorage, LoadProtocolV2: Boolean; var errors: AnsiString): Boolean;
 Var c, i: Cardinal;
   OpType: Cardinal;
@@ -1857,7 +2017,7 @@ begin
 end;
 
 function TOperationsHashTree.OperationsCount: Integer;
-Var l : Classes.TList;
+Var l : TList;
 begin
   l := FHashTreeOperations.LockList;
   try
@@ -1870,7 +2030,7 @@ end;
 function TOperationsHashTree.SaveOperationsHashTreeToStream(Stream: TStream; SaveToStorage: Boolean): Boolean;
 Var c, i, OpType: Cardinal;
   bcop: TPCOperation;
-  l : Classes.TList;
+  l : TList;
 begin
   l := FHashTreeOperations.LockList;
   Try
@@ -2002,6 +2162,8 @@ end;
 
 constructor TPCOperation.Create;
 begin
+  FSignatureChecked := False;
+  FHasValidSignature := False;
   FBufferedSha256:='';
   InitializeData;
 end;
@@ -2100,6 +2262,7 @@ begin
   FPrevious_Seller_updated_block := 0;
   FHasValidSignature := false;
   FBufferedSha256:='';
+  FSignatureChecked := False;
 end;
 
 function TPCOperation.LoadFromNettransfer(Stream: TStream): Boolean;
@@ -2358,7 +2521,7 @@ end;
 
 function TPCOperation.Sha256: TRawBytes;
 begin
-  If FBufferedSha256='' then begin
+  If Length(FBufferedSha256)=0 then begin
     FBufferedSha256 := TCrypto.DoSha256(GetBufferForOpHash(true));
   end;
   Result := FBufferedSha256;
@@ -2379,7 +2542,7 @@ end;
 procedure TOperationsResumeList.Clear;
 Var P : POperationResume;
   i : Integer;
-  l : Classes.TList;
+  l : TList;
 begin
   l := FList.LockList;
   try
@@ -2394,7 +2557,7 @@ begin
 end;
 
 function TOperationsResumeList.Count: Integer;
-Var l : Classes.TList;
+Var l : TList;
 begin
   l := FList.LockList;
   Try
@@ -2411,7 +2574,7 @@ end;
 
 procedure TOperationsResumeList.Delete(index: Integer);
 Var P : POperationResume;
-  l : Classes.TList;
+  l : TList;
 begin
   l := FList.LockList;
   Try
@@ -2431,7 +2594,7 @@ begin
 end;
 
 function TOperationsResumeList.GetOperationResume(index: Integer): TOperationResume;
-Var l : Classes.TList;
+Var l : TList;
 begin
   l := FList.LockList;
   try

+ 5 - 2
Units/PascalCoin/UChunk.pas → src/core/UChunk.pas

@@ -1,6 +1,8 @@
 unit UChunk;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$mode delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -18,7 +20,8 @@ unit UChunk;
 interface
 
 uses
-  Classes, SysUtils,  ZLib, zStream, UAccounts, ULog, UConst, UCrypto;
+  Classes, SysUtils,  ZLib, {$IFDEF FPC} zStream, {$ENDIF}
+  UAccounts, ULog, UConst, UCrypto;
 
 type
 

+ 13 - 8
Units/PascalCoin/UConst.pas → src/core/UConst.pas

@@ -1,6 +1,8 @@
 unit UConst;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -19,10 +21,13 @@ interface
 
 {$I config.inc}
 
+{$IFNDEF FPC}
   // See http://wiki.freepascal.org/Code_Conversion_Guide
 type
   PtrInt = integer;
   PtrUInt = cardinal;
+  TThreadID = Cardinal;
+{$ENDIF}
 
 Const
   CT_Genesis_Magic_String_For_Old_Block_Hash :
@@ -69,10 +74,12 @@ Const
   CT_MaxFutureBlockTimestampOffset = 15;
   CT_MinNodesToCalcNAT = 4;
 
-  CT_MinServersConnected = 3;
+  CT_MinServersConnected = 2;
   CT_MaxServersConnected = 5;
 
-  CT_MaxClientsConnected = 100;
+  CT_MaxResendMemPoolOperations = 50000;
+
+  CT_MaxClientsConnected = {$IFDEF FPC}140{$ELSE}80{$ENDIF};
 
   CT_BankToDiskEveryNBlocks = {$IFDEF PRODUCTION}100{$ELSE}10{$ENDIF}; // Build 1.5 changed from 500 to 100;
 
@@ -136,16 +143,14 @@ Const
   CT_OpSubtype_ChangeKeySigned            = 71;
   CT_OpSubtype_ChangeAccountInfo          = 81;
 
-  CT_ClientAppVersion : AnsiString = {$IFDEF PRODUCTION}'2.1.4'{$ELSE}{$IFDEF TESTNET}'TESTNET 2.1.4'{$ELSE}{$ENDIF}{$ENDIF};
+  CT_ClientAppVersion : AnsiString = {$IFDEF PRODUCTION}'2.1.6'{$ELSE}{$IFDEF TESTNET}'TESTNET 2.1.6'{$ELSE}{$ENDIF}{$ENDIF};
 
-  CT_Discover_IPs =  'bpascal1.dynamic-dns.net;bpascal2.dynamic-dns.net;pascalcoin2.ddns.net;pascalcoin1.dynamic-dns.net;pascalcoin1.dns1.us';
+  CT_Discover_IPs =  'bpascal1.dynamic-dns.net;bpascal2.dynamic-dns.net;pascalcoin1.dynamic-dns.net;pascalcoin2.dynamic-dns.net;pascalcoin1.dns1.us;pascalcoin2.dns1.us;pascalcoin1.dns2.us;pascalcoin2.dns2.us';
 
   CT_TRUE_FALSE : Array[Boolean] Of AnsiString = ('FALSE','TRUE');
 
   CT_MAX_0_fee_operations_per_block_by_miner = {$IFDEF PRODUCTION}2000{$ELSE}{$IFDEF TESTNET}2{$ELSE}{$ENDIF}{$ENDIF};
-
-  CT_MAX_Operations_per_block_by_miner =  {$IFDEF PRODUCTION}10000{$ELSE}{$IFDEF TESTNET}50000{$ELSE}{$ENDIF}{$ENDIF};
-
+  CT_MAX_Operations_per_block_by_miner =  {$IFDEF PRODUCTION}10000{$ELSE}{$IFDEF TESTNET}50{$ELSE}{$ENDIF}{$ENDIF};
 
 implementation
 

+ 37 - 18
Units/PascalCoin/UCrypto.pas → src/core/UCrypto.pas

@@ -1,6 +1,8 @@
 unit UCrypto;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -62,25 +64,28 @@ Type
     class Function ImportFromRaw(Const raw : TRawBytes) : TECPrivateKey; static;
   End;
 
-  TCrypto = class
+  { TCrypto }
+
+  TCrypto = Class
   private
   public
     class function IsHexString(const AHexString: AnsiString) : boolean;
-    class function ToHexaString(const raw : TRawBytes) : AnsiString;
-    class function HexaToRaw(const HexaString : AnsiString) : TRawBytes;
-    class function DoSha256(p : PAnsiChar; plength : Cardinal) : TRawBytes; overload;
-    class function DoSha256(const TheMessage : AnsiString) : TRawBytes; overload;
-    class procedure DoDoubleSha256(p : PAnsiChar; plength : Cardinal; Var ResultSha256 : TRawBytes); overload;
-    class function DoRipeMD160_HEXASTRING(const TheMessage : AnsiString) : TRawBytes; overload;
-    class function DoRipeMD160AsRaw(p : PAnsiChar; plength : Cardinal) : TRawBytes; overload;
-    class function DoRipeMD160AsRaw(const TheMessage : AnsiString) : TRawBytes; overload;
-    class function PrivateKey2Hexa(Key : PEC_KEY) : AnsiString;
-    class function ECDSASign(Key : PEC_KEY; const digest : AnsiString) : TECDSA_SIG;
-    class function ECDSAVerify(EC_OpenSSL_NID : Word; PubKey : EC_POINT; const digest : AnsiString; Signature : TECDSA_SIG) : Boolean; overload;
-    class function ECDSAVerify(PubKey : TECDSA_Public; const digest : AnsiString; Signature : TECDSA_SIG) : Boolean; overload;
-    class procedure InitCrypto;
-    class function IsHumanReadable(const ReadableText : TRawBytes) : Boolean;
-  end;
+    Class function ToHexaString(const raw : TRawBytes) : AnsiString;
+    Class function HexaToRaw(const HexaString : AnsiString) : TRawBytes;
+    Class function DoSha256(p : PAnsiChar; plength : Cardinal) : TRawBytes; overload;
+    Class function DoSha256(const TheMessage : AnsiString) : TRawBytes; overload;
+    Class procedure DoSha256(const TheMessage : AnsiString; var ResultSha256 : TRawBytes);  overload;
+    Class procedure DoDoubleSha256(p : PAnsiChar; plength : Cardinal; Var ResultSha256 : TRawBytes); overload;
+    Class function DoRipeMD160_HEXASTRING(const TheMessage : AnsiString) : TRawBytes; overload;
+    Class function DoRipeMD160AsRaw(p : PAnsiChar; plength : Cardinal) : TRawBytes; overload;
+    Class function DoRipeMD160AsRaw(const TheMessage : AnsiString) : TRawBytes; overload;
+    Class function PrivateKey2Hexa(Key : PEC_KEY) : AnsiString;
+    Class function ECDSASign(Key : PEC_KEY; const digest : AnsiString) : TECDSA_SIG;
+    Class function ECDSAVerify(EC_OpenSSL_NID : Word; PubKey : EC_POINT; const digest : AnsiString; Signature : TECDSA_SIG) : Boolean; overload;
+    Class function ECDSAVerify(PubKey : TECDSA_Public; const digest : AnsiString; Signature : TECDSA_SIG) : Boolean; overload;
+    Class procedure InitCrypto;
+    Class function IsHumanReadable(Const ReadableText : TRawBytes) : Boolean;
+  End;
 
   TBigNum = Class
   private
@@ -332,7 +337,8 @@ end;
   Note: Delphi is slowly when working with Strings (allowing space)... so to
   increase speed we use a String as a pointer, and only increase speed if
   needed. Also the same with functions "GetMem" and "FreeMem" }
-class procedure TCrypto.DoDoubleSha256(p: PAnsiChar; plength: Cardinal; var ResultSha256: TRawBytes);
+class procedure TCrypto.DoDoubleSha256(p: PAnsiChar; plength: Cardinal;
+  Var ResultSha256: TRawBytes);
 Var PS : PAnsiChar;
   PC : PAnsiChar;
 begin
@@ -390,6 +396,19 @@ begin
   SHA256(PAnsiChar(TheMessage),Length(TheMessage),PS);
 end;
 
+{ New at Build 2.1.6
+  Note: Delphi is slowly when working with Strings (allowing space)... so to
+  increase speed we use a String as a pointer, and only increase speed if
+  needed. Also the same with functions "GetMem" and "FreeMem" }
+class procedure TCrypto.DoSha256(const TheMessage: AnsiString; var ResultSha256: TRawBytes);
+Var PS : PAnsiChar;
+  PC : PAnsiChar;
+begin
+  If length(ResultSha256)<>32 then SetLength(ResultSha256,32);
+  PS := @ResultSha256[1];
+  SHA256(PAnsiChar(TheMessage),Length(TheMessage),PS);
+end;
+
 class function TCrypto.ECDSASign(Key: PEC_KEY; const digest: AnsiString): TECDSA_SIG;
 Var PECS : PECDSA_SIG;
   p, pr,ps : PAnsiChar;

+ 0 - 0
Units/PascalCoin/UDataSources.pas → src/core/UDataSources.pas


+ 23 - 1
Units/PascalCoin/UECIES.pas → src/core/UECIES.pas

@@ -1,6 +1,8 @@
 unit UECIES;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -52,6 +54,9 @@ function ECIESDecrypt(EC_OpenSSL_NID : Word; PrivateKey: PEC_KEY; logErrors : Bo
 implementation
 
 uses
+{$IFnDEF FPC}
+  Windows,
+{$ENDIF}
   SysUtils, UAES;
 
 Type
@@ -244,7 +249,11 @@ begin
         exit;
       end;
       // For now we use an empty initialization vector.
+      {$IFDEF FPC}
       FillByte(iv,EVP_MAX_IV_LENGTH,0);
+      {$ELSE}
+      FillMemory(@iv,EVP_MAX_IV_LENGTH,0);
+      {$ENDIF}
       // Setup the cipher context, the body length, and store a pointer to the body buffer location.
 
       {$IFDEF OpenSSL10}
@@ -275,7 +284,11 @@ begin
           end;
           // Copy the remaining data into our partial block buffer. The memset() call ensures any extra bytes will be zero'ed out.
           //SetLength(block,EVP_MAX_BLOCK_LENGTH);
+          {$IFDEF FPC}
           FillByte(block,length(block),0);
+          {$ELSE}
+          FillMemory(@block,length(block),0);
+          {$ENDIF}
           CopyMemory(@block,Pointer(PtrInt(@MessageToEncrypt[1])+body_length),Length(MessageToEncrypt)-body_length);
           // Advance the body pointer to the location of the remaining space, and calculate just how much room is still available.
           body := Pointer(PtrInt(body)+body_length);
@@ -414,7 +427,11 @@ Begin
     // Use the intersection of the provided keys to generate the envelope data used by the ciphers below.
     // The ecies_key_derivation() function uses SHA 512 to ensure we have a sufficient amount of envelope key
     // material and that the material created is sufficiently secure.
+    {$IFDEF FPC}
     FillByte(envelope_key,length(envelope_key),0);
+    {$ELSE}
+    FillMemory(@envelope_key,length(envelope_key),0);
+    {$ENDIF}
     if (ECDH_compute_key(@envelope_key,SHA512_DIGEST_LENGTH,EC_KEY_get0_public_key(ephemeral),
       PrivateKey, ecies_key_derivation_512)<>SHA512_DIGEST_LENGTH) then begin
       if logErrors then TLog.NewLog(lterror,'ECIES',Format('An error occurred while trying to compute the envelope key. {error = %s}',[ERR_error_string(ERR_get_error, nil)]));
@@ -459,8 +476,13 @@ Begin
   block := output;
   try
     // For now we use an empty initialization vector. We also clear out the result buffer just to be on the safe side.
+    {$IFDEF FPC}
     FillByte(iv,EVP_MAX_IV_LENGTH,0);
     FillByte(output^,output_length+1,0);
+    {$ELSE}
+    FillMemory(@iv,EVP_MAX_IV_LENGTH,0);
+    FillMemory(output,output_length+1,0);
+    {$ENDIF}
     {$IFDEF OpenSSL10}
     EVP_CIPHER_CTX_init(@cipher);
     pcipher := @cipher;

+ 3 - 1
Units/PascalCoin/UFileStorage.pas → src/core/UFileStorage.pas

@@ -1,6 +1,8 @@
 unit UFileStorage;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 

+ 0 - 0
Units/PascalCoin/UGPUMining.pas → src/core/UGPUMining.pas


+ 6 - 6
Units/PascalCoin/ULog.pas → src/core/ULog.pas

@@ -1,6 +1,8 @@
 unit ULog;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -18,7 +20,7 @@ unit ULog;
 interface
 
 uses
-  Classes, UThread, SyncObjs;
+  Classes, UThread, SyncObjs, UConst;
 
 type
   TLogType = (ltinfo, ltupdate, lterror, ltdebug);
@@ -156,10 +158,8 @@ begin
   FLock.Acquire;
   try
     if assigned(FFileStream) And (logType in FSaveTypes) then begin
-      if TThread.CurrentThread.ThreadID=MainThreadID then tid := 'MAIN:' else tid:='TID:';
-      s := Format('%s %s %p [%s] <%s> %s'#13#10, [
-        FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',now), tid, Pointer(TThread.CurrentThread.ThreadID), CT_LogType[logtype], sender, logtext
-        ]);
+      if TThread.CurrentThread.ThreadID=MainThreadID then tid := ' MAIN:' else tid:=' TID:';
+      s := FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',now)+tid+IntToHex(PtrInt(TThread.CurrentThread.ThreadID),8)+' ['+CT_LogType[logtype]+'] <'+sender+'> '+logtext+#13#10;
       FFileStream.Write(s[1],length(s));
     end;
     if Assigned(FOnInThreadNewLog) then begin

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 524 - 250
src/core/UNetProtocol.pas


+ 3 - 1
Units/PascalCoin/UNode.pas → src/core/UNode.pas

@@ -1,6 +1,8 @@
 unit UNode;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 

+ 70 - 24
Units/PascalCoin/UOpTransaction.pas → src/core/UOpTransaction.pas

@@ -1,6 +1,8 @@
 unit UOpTransaction;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -507,11 +509,19 @@ begin
     end;
   end;
 
-  If Not TCrypto.ECDSAVerify(account_signer.accountInfo.accountkey,GetOperationHashToSign(FData),FData.sign) then begin
-    errors := 'Invalid sign';
-    FHasValidSignature := false;
-    exit;
-  end else FHasValidSignature := true;
+  If Not FSignatureChecked then begin
+    If Not TCrypto.ECDSAVerify(account_signer.accountInfo.accountkey,GetOperationHashToSign(FData),FData.sign) then begin
+      errors := 'Invalid sign';
+      FHasValidSignature := false;
+      exit;
+    end else FHasValidSignature := true;
+    FSignatureChecked:=True;
+  end else begin
+    If Not FHasValidSignature then begin
+      errors := 'Invalid sign';
+      exit;
+    end;
+  end;
   FPrevious_Signer_updated_block := account_signer.updated_block;
   FPrevious_Destination_updated_block := account_target.updated_block;
   If (public_key in FData.changes_type) then begin
@@ -596,7 +606,10 @@ begin
   If Not DoSignOperation(key,FData) then begin
     TLog.NewLog(lterror,Classname,'Error signing a new Change Info operation');
     FHasValidSignature := false;
-  end else FHasValidSignature := true;
+  end else begin
+    FHasValidSignature := true;
+  end;
+  FSignatureChecked:=True;
 end;
 
 function TOpChangeAccountInfo.toString: String;
@@ -644,7 +657,10 @@ begin
   If Not DoSignOperation(key,FData) then begin
     TLog.NewLog(lterror,Classname,'Error signing a new Transaction');
     FHasValidSignature := false;
-  end else FHasValidSignature := true;
+  end else begin
+    FHasValidSignature := true;
+  end;
+  FSignatureChecked:=True;
 end;
 
 function TOpTransaction.DoOperation(AccountTransaction : TPCSafeBoxTransaction; var errors : AnsiString): Boolean;
@@ -722,12 +738,20 @@ begin
   end;
 
   // Check signature
-  _h := GetTransactionHashToSign(FData);
-  if (Not TCrypto.ECDSAVerify(sender.accountInfo.accountkey,_h,FData.sign)) then begin
-    errors := 'Invalid sign';
-    FHasValidSignature := false;
-    Exit;
-  end else FHasValidSignature := true;
+  If Not FSignatureChecked then begin
+    _h := GetTransactionHashToSign(FData);
+    if (Not TCrypto.ECDSAVerify(sender.accountInfo.accountkey,_h,FData.sign)) then begin
+      errors := 'Invalid sign';
+      FHasValidSignature := false;
+      Exit;
+    end else FHasValidSignature := true;
+    FSignatureChecked:=True;
+  end else begin
+    If Not FHasValidSignature then begin
+      errors := 'Invalid sign';
+      exit;
+    end;
+  end;
   //
   FPrevious_Signer_updated_block := sender.updated_block;
   FPrevious_Destination_updated_block := target.updated_block;
@@ -1062,6 +1086,7 @@ begin
     TLog.NewLog(lterror,Classname,'Error signing a new Change key');
     FHasValidSignature := false;
   end else FHasValidSignature := true;
+  FSignatureChecked:=True;
 end;
 
 function TOpChangeKey.DoOperation(AccountTransaction : TPCSafeBoxTransaction; var errors: AnsiString): Boolean;
@@ -1145,11 +1170,20 @@ begin
     end;
   end;
 
-  If Not TCrypto.ECDSAVerify(account_signer.accountInfo.accountkey,GetOperationHashToSign(FData),FData.sign) then begin
-    errors := 'Invalid sign';
-    FHasValidSignature := false;
-    exit;
-  end else FHasValidSignature := true;
+  If Not FSignatureChecked then begin
+    If Not TCrypto.ECDSAVerify(account_signer.accountInfo.accountkey,GetOperationHashToSign(FData),FData.sign) then begin
+      errors := 'Invalid sign';
+      FHasValidSignature := false;
+      exit;
+    end else FHasValidSignature := true;
+    FSignatureChecked:=True;
+  end else begin
+    If Not FHasValidSignature then begin
+      errors := 'Invalid sign';
+      exit;
+    end;
+  end;
+
   FPrevious_Signer_updated_block := account_signer.updated_block;
   FPrevious_Destination_updated_block := account_target.updated_block;
   account_target.accountInfo.accountKey := FData.new_accountkey;
@@ -1360,6 +1394,7 @@ begin
   FData.n_operation := n_operation;
   FData.fee := fee;
   FHasValidSignature := true; // Recover founds doesn't need a signature
+  FSignatureChecked := True;
 end;
 
 function TOpRecoverFounds.DoOperation(AccountTransaction : TPCSafeBoxTransaction; var errors: AnsiString): Boolean;
@@ -1589,11 +1624,19 @@ begin
     exit;
   end;
 
-  If Not TCrypto.ECDSAVerify(account_signer.accountInfo.accountkey,GetOperationHashToSign(FData),FData.sign) then begin
-    errors := 'Invalid sign';
-    FHasValidSignature := false;
-    exit;
-  end else FHasValidSignature := true;
+  If Not FSignatureChecked then begin
+    If Not TCrypto.ECDSAVerify(account_signer.accountInfo.accountkey,GetOperationHashToSign(FData),FData.sign) then begin
+      errors := 'Invalid sign';
+      FHasValidSignature := false;
+      exit;
+    end else FHasValidSignature := true;
+    FSignatureChecked:=True;
+  end else begin
+    If Not FHasValidSignature then begin
+      errors := 'Invalid sign';
+      exit;
+    end;
+  end;
 
   FPrevious_Signer_updated_block := account_signer.updated_block;
   FPrevious_Destination_updated_block := account_target.updated_block;
@@ -1830,6 +1873,7 @@ begin
     TLog.NewLog(lterror,Classname,'Error signing a new list account for sale operation');
     FHasValidSignature := false;
   end else FHasValidSignature := true;
+  FSignatureChecked:=True;
 end;
 
 function TOpListAccountForSale.IsDelist: Boolean;
@@ -1857,6 +1901,7 @@ begin
     TLog.NewLog(lterror,Classname,'Error signing a delist account operation');
     FHasValidSignature := false;
   end else FHasValidSignature := true;
+  FSignatureChecked:=True;
 end;
 
 function TOpDelistAccountForSale.IsDelist: Boolean;
@@ -1892,6 +1937,7 @@ begin
     TLog.NewLog(lterror,Classname,'Error signing a new Buy operation');
     FHasValidSignature := false;
   end else FHasValidSignature := true;
+  FSignatureChecked:=True;
 end;
 
 procedure TOpBuyAccount.InitializeData;

+ 17 - 7
Units/PascalCoin/UOpenSSL.pas → src/core/UOpenSSL.pas

@@ -20,8 +20,9 @@ unit UOpenSSL;
 
 interface
 
-{$mode delphi}
-
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 Uses UOpenSSLdef;
 {$I config.inc}
@@ -45,12 +46,17 @@ var
   {$ENDIF}
   {$ENDIF}
 {$ELSE}
+  {$IFDEF FPC}
   // Windows + Lazarus uses a OpenSSL v1.0 32 or 64 bits
-  {$ifdef CPU32}
-      SSL_C_LIB : AnsiString = 'libeay32.dll';
-  {$ENDIF}
-  {$ifdef CPU64}
-      SSL_C_LIB : AnsiString = 'libeay64.dll';
+    {$ifdef CPU32}
+	SSL_C_LIB : AnsiString = 'libeay32.dll';
+    {$ENDIF}
+    {$ifdef CPU64}
+	SSL_C_LIB : AnsiString = 'libeay64.dll';
+    {$ENDIF}
+  {$ELSE}
+  // Windows + Delphi only allows OpenSSL v1.0 32 bits
+  SSL_C_LIB : AnsiString = 'libeay32.dll';
   {$ENDIF}
 {$ENDIF}
 
@@ -241,7 +247,11 @@ begin
   {$ENDIF}
   if ACritical then begin
     if Result = nil then begin
+    {$IFDEF FPC}
      raise Exception.CreateFmt('Error loading OpenSSL library function "%s" error: "%s". Are you sure that using OpenSSL good version?', [FceName, SysErrorMessage(GetLastOSError)]);
+    {$ELSE}
+     raise Exception.CreateFmt('Error loading OpenSSL library function "%s" error: "%s". Are you sure that using OpenSSL good version?', [FceName, SysErrorMessage(GetLastError)]);
+    {$ENDIF}
     end;
   end;
 end;

+ 3 - 1
Units/PascalCoin/UOpenSSLdef.pas → src/core/UOpenSSLdef.pas

@@ -20,7 +20,9 @@ unit UOpenSSLdef;
 
 interface
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 uses {$IFDEF UNIX}BaseUnix {$ELSE} Windows{$ENDIF};
 

+ 0 - 0
Units/PascalCoin/UPoolMinerThreads.pas → src/core/UPoolMinerThreads.pas


+ 11 - 4
Units/PascalCoin/UPoolMining.pas → src/core/UPoolMining.pas

@@ -1,6 +1,8 @@
 unit UPoolMining;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -18,6 +20,11 @@ unit UPoolMining;
 interface
 
 Uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  {LCLIntf, LCLType, LMessages,}
+{$ENDIF}
   UTCPIP, SysUtils, UThread, SyncObjs, Classes, UJSONFunctions, UAES, UNode,
   UCrypto, UAccounts, UConst, UBlockChain;
 
@@ -810,13 +817,13 @@ begin
       i := l.Count-1;
       while (i>=0) And (Not Assigned(nbOperations)) do begin
         P := l[i];
-        P^.OperationsComp.BlockPayload := _payload;
         // Best practices: Only will accept a solution if timestamp >= sent timestamp for this job (1.5.3)
         If (P^.SentMinTimestamp<=_timestamp) then begin
-          P^.OperationsComp.timestamp := _timestamp;
-          P^.OperationsComp.nonce := _nOnce;
           _targetPoW := FNodeNotifyEvents.Node.Bank.SafeBox.GetActualTargetHash(P^.OperationsComp.OperationBlock.protocol_version=CT_PROTOCOL_2);
           if (P^.OperationsComp.OperationBlock.proof_of_work<=_targetPoW) then begin
+            P^.OperationsComp.BlockPayload := _payload;
+            P^.OperationsComp.timestamp := _timestamp;
+            P^.OperationsComp.nonce := _nOnce;
             // Candidate!
             nbOperations := TPCOperationsComp.Create(Nil);
             nbOperations.bank := FNodeNotifyEvents.Node.Bank;

+ 6 - 3
Units/PascalCoin/URPC.pas → src/core/URPC.pas

@@ -1,6 +1,8 @@
 unit URPC;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -101,7 +103,8 @@ Type
 
 implementation
 
-Uses SysUtils, Synautil;
+Uses  {$IFNDEF FPC}windows,{$ENDIF}
+  SysUtils, Synautil;
 
 var _RPCServer : TRPCServer = Nil;
 
@@ -2687,7 +2690,7 @@ begin
     GetResultObject.GetAsObject('netstats').GetAsVariant('tservers').Value:=TNetData.NetData.NetStatistics.TotalServersConnections;
     GetResultObject.GetAsObject('netstats').GetAsVariant('breceived').Value:=TNetData.NetData.NetStatistics.BytesReceived;
     GetResultObject.GetAsObject('netstats').GetAsVariant('bsend').Value:=TNetData.NetData.NetStatistics.BytesSend;
-    nsaarr := TNetData.NetData.GetValidNodeServers(true,20);
+    nsaarr := TNetData.NetData.NodeServersAddresses.GetValidNodeServers(true,20);
     for i := low(nsaarr) to High(nsaarr) do begin
       jso := GetResultObject.GetAsArray('nodeservers').GetAsObject(i);
       jso.GetAsVariant('ip').Value := nsaarr[i].ip;

+ 3 - 1
Units/PascalCoin/UServerApp.pas → src/core/UServerApp.pas

@@ -1,6 +1,8 @@
 unit UServerApp;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 {$IFDEF MSWINDOWS}
   {$DEFINE OS_MSWIN}

+ 28 - 21
Units/PascalCoin/USettings.pas → src/core/USettings.pas

@@ -6,15 +6,42 @@ unit USettings;
 
   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]) - main author
+      Albert Molina - original
 }
 
-{$I ./../PascalCoin/config.inc}
+{$I config.inc}
 
 interface
 
 uses
   UAppParams, UCommon;
 
+const
+  // App Params
+  CT_PARAM_GridAccountsStream = 'GridAccountsStreamV2';
+  CT_PARAM_DefaultFee = 'DefaultFee';
+  CT_PARAM_InternetServerPort = 'InternetServerPort';
+  {$IFDEF TESTNET}CT_PARAM_AutomaticMineWhenConnectedToNodes = 'AutomaticMineWhenConnectedToNodes';{$ENDIF}
+  CT_PARAM_MinerPrivateKeyType = 'MinerPrivateKeyType';
+  CT_PARAM_MinerPrivateKeySelectedPublicKey = 'MinerPrivateKeySelectedPublicKey';
+  CT_PARAM_SaveLogFiles = 'SaveLogFiles';
+  CT_PARAM_SaveDebugLogs = 'SaveDebugLogs';
+  CT_PARAM_ShowLogs = 'ShowLogs';
+  CT_PARAM_MinerName = 'MinerName';
+  CT_PARAM_RunCount = 'RunCount';
+  CT_PARAM_FirstTime = 'FirstTime';
+  CT_PARAM_ShowModalMessages = 'ShowModalMessages';
+  {$IFDEF TESTNET}CT_PARAM_MaxCPUs = 'MaxCPUs'; {$ENDIF} //deprecated
+  CT_PARAM_PeerCache = 'PeerCache';
+  CT_PARAM_TryToConnectOnlyWithThisFixedServers = 'TryToConnectOnlyWithFixedServers';
+  CT_PARAM_JSONRPCMinerServerPort = 'JSONRPCMinerServerPort';
+  CT_PARAM_JSONRPCMinerServerActive = 'JSONRPCMinerServerActive';
+  CT_PARAM_JSONRPCEnabled = 'JSONRPCEnabled';
+  CT_PARAM_JSONRPCAllowedIPs = 'JSONRPCAllowedIPs';
+
 type
 
   { TMinerPrivateKeyType }
@@ -89,26 +116,6 @@ implementation
 uses
   Classes, SysUtils, UConst, UFolderHelper;
 
-const
-  // App Params
-  CT_PARAM_DefaultFee = 'DefaultFee';
-  CT_PARAM_InternetServerPort = 'InternetServerPort';
-  {$IFDEF TESTNET}CT_PARAM_AutomaticMineWhenConnectedToNodes = 'AutomaticMineWhenConnectedToNodes';{$ENDIF}
-  CT_PARAM_MinerPrivateKeyType = 'MinerPrivateKeyType';
-  CT_PARAM_MinerPrivateKeySelectedPublicKey = 'MinerPrivateKeySelectedPublicKey';
-  CT_PARAM_SaveLogFiles = 'SaveLogFiles';
-  CT_PARAM_SaveDebugLogs = 'SaveDebugLogs';
-  CT_PARAM_ShowLogs = 'ShowLogs';
-  CT_PARAM_MinerName = 'MinerName';
-  CT_PARAM_RunCount = 'RunCount';
-  CT_PARAM_ShowModalMessages = 'ShowModalMessages';
-  {$IFDEF TESTNET}CT_PARAM_MaxCPUs = 'MaxCPUs'; {$ENDIF} //deprecated
-  CT_PARAM_PeerCache = 'PeerCache';
-  CT_PARAM_TryToConnectOnlyWithThisFixedServers = 'TryToConnectOnlyWithFixedServers';
-  CT_PARAM_JSONRPCMinerServerPort = 'JSONRPCMinerServerPort';
-  CT_PARAM_JSONRPCMinerServerActive = 'JSONRPCMinerServerActive';
-  CT_PARAM_JSONRPCEnabled = 'JSONRPCEnabled';
-  CT_PARAM_JSONRPCAllowedIPs = 'JSONRPCAllowedIPs';
 
 { TSettings }
 

+ 0 - 0
Units/PascalCoin/USha256.pas → src/core/USha256.pas


+ 14 - 1
Units/PascalCoin/UTCPIP.pas → src/core/UTCPIP.pas

@@ -15,7 +15,9 @@ unit UTCPIP;
 
 interface
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$mode objfpc}
+{$ENDIF}
 
 {$I config.inc}
 
@@ -193,6 +195,11 @@ type
 implementation
 
 uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  {LCLIntf, LCLType, LMessages,}
+{$ENDIF}
   UConst, ULog;
 
 { TNetTcpIpClient }
@@ -304,12 +311,18 @@ end;
 procedure TNetTcpIpClient.Disconnect;
 Var DebugStep : AnsiString;
 begin
+  {$IFDEF DelphiSockets}
+  FTcpBlockSocket.Disconnect;
+  {$ENDIF}
   {$IFDEF Synapse}
   if Not FConnected then exit;
   Try
     DebugStep := '';
     FLock.Acquire;
     Try
+      if Not FConnected then begin
+        exit; // Protection inside lock thread to prevent double disconnect sessions
+      end;
       DebugStep := 'disconnecting';
       if Not FConnected then exit;
       DebugStep := 'Closing socket';

+ 8 - 2
Units/PascalCoin/UThread.pas → src/core/UThread.pas

@@ -1,6 +1,8 @@
 unit UThread;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -18,7 +20,11 @@ unit UThread;
 interface
 
 uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
   {$IFDEF LINUX}cthreads,{$ENDIF}
+{$ENDIF}
   Classes, SyncObjs;
 
 {$I config.inc}
@@ -37,7 +43,7 @@ Type
     {$IFDEF HIGHLOG}
     procedure Acquire; override;
     procedure Release; override;
-    function TryEnter: Boolean; override;
+    function TryEnter: Boolean; { HS - had 'override' in development }
     {$ENDIF}
     Property CurrentThread : Cardinal read FCurrentThread;
     Property WaitingForCounter : Integer read FWaitingForCounter;

+ 43 - 2
Units/PascalCoin/UTime.pas → src/core/UTime.pas

@@ -1,6 +1,8 @@
 unit UTime;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 
@@ -18,8 +20,18 @@ unit UTime;
 interface
 
 Uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  {LCLIntf, LCLType, LMessages,}
+{$ENDIF}
   SysUtils;
 
+{$IFnDEF FPC}
+function TzSpecificLocalTimeToSystemTime(lpTimeZoneInformation: PTimeZoneInformation; var lpLocalTime, lpUniversalTime: TSystemTime): BOOL; stdcall;
+function SystemTimeToTzSpecificLocalTime(lpTimeZoneInformation: PTimeZoneInformation; var lpUniversalTime,lpLocalTime: TSystemTime): BOOL; stdcall;
+{$ENDIF}
+
 Function DateTime2UnivDateTime(d:TDateTime):TDateTime;
 Function UnivDateTime2LocalDateTime(d:TDateTime):TDateTime;
 
@@ -30,10 +42,14 @@ function UnixTimeToLocalElapsedTime(USec : Longint) : AnsiString;
 Function DateTimeElapsedTime(dtDate : TDateTime) : AnsiString;
 
 Function UnixTimeToLocalStr(UnixTime : Longint) : AnsiString;
-
 implementation
 
+{$IFDEF FPC}
 Uses DateUtils;
+{$ELSE}
+function TzSpecificLocalTimeToSystemTime; external 'kernel32.dll' name 'TzSpecificLocalTimeToSystemTime';
+function SystemTimeToTzSpecificLocalTime; external kernel32 name 'SystemTimeToTzSpecificLocalTime';
+{$ENDIF}
 
 const
     UnixStartDate: TDateTime = 25569.0; // 01/01/1970
@@ -58,15 +74,40 @@ Begin
 End;
 
 Function DateTime2UnivDateTime(d:TDateTime):TDateTime;
+{$IFDEF FPC}
 begin
   Result := LocalTimeToUniversal(d,-GetLocalTimeOffset);
 end;
+{$ELSE}
+var
+ TZI:TTimeZoneInformation;
+ LocalTime, UniversalTime:TSystemTime;
+begin
+  GetTimeZoneInformation(tzi);
+  DateTimeToSystemTime(d,LocalTime);
+  TzSpecificLocalTimeToSystemTime(@tzi,LocalTime,UniversalTime);
+  Result := SystemTimeToDateTime(UniversalTime);
+end;
+{$ENDIF}
 
 Function UnivDateTime2LocalDateTime(d:TDateTime):TDateTime;
+{$IFDEF FPC}
 begin
   Result := UniversalTimeToLocal(d,-GetLocalTimeOffset);
 end;
 
+{$ELSE}
+var
+ TZI:TTimeZoneInformation;
+ LocalTime, UniversalTime:TSystemTime;
+begin
+  GetTimeZoneInformation(tzi);
+  DateTimeToSystemTime(d,UniversalTime);
+  SystemTimeToTzSpecificLocalTime(@tzi,UniversalTime,LocalTime);
+  Result := SystemTimeToDateTime(LocalTime);
+end;
+{$ENDIF}
+
 function UnivDateTimeToUnix(dtDate: TDateTime): Longint;
 begin
   Result := Round((dtDate - UnixStartDate) * 86400);

+ 3 - 1
Units/PascalCoin/UWallet.pas → src/core/UWallet.pas

@@ -1,6 +1,8 @@
 unit UWallet;
 
-{$mode delphi}
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
 
 { Copyright (c) 2016 by Albert Molina
 

+ 2 - 2
Units/PascalCoin/upcdaemon.pas → src/core/upcdaemon.pas

@@ -73,7 +73,7 @@ Type
   TPCDaemonMapper = Class(TCustomDaemonMapper)
   private
     FLog : TLog;
-    procedure OnPascalCoinInThreadLog(logtype : TLogType; Time : TDateTime; AThreadID : Cardinal; Const sender, logtext : AnsiString);
+    procedure OnPascalCoinInThreadLog(logtype : TLogType; Time : TDateTime; AThreadID : QWord; Const sender, logtext : AnsiString);
   protected
     Procedure DoOnCreate; override;
     Procedure DoOnDestroy; override;
@@ -323,7 +323,7 @@ end;
 { TPCDaemonMapper }
 
 procedure TPCDaemonMapper.OnPascalCoinInThreadLog(logtype: TLogType;
-  Time: TDateTime; AThreadID: Cardinal; const sender, logtext: AnsiString);
+  Time: TDateTime; AThreadID: QWord; const sender, logtext: AnsiString);
 Var s : AnsiString;
 begin
 //  If Not SameText(sender,TPCDaemonThread.ClassName) then exit;

+ 308 - 0
src/gui-classic/UFRMAbout.dfm

@@ -0,0 +1,308 @@
+object FRMAbout: TFRMAbout
+  Left = 0
+  Top = 0
+  ActiveControl = bbClose
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsDialog
+  Caption = 'About...'
+  ClientHeight = 415
+  ClientWidth = 522
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poOwnerFormCenter
+  OnCreate = FormCreate
+  PixelsPerInch = 96
+  TextHeight = 13
+  object Image1: TImage
+    Left = 15
+    Top = 15
+    Width = 60
+    Height = 60
+    AutoSize = True
+    Picture.Data = {
+      0954506E67496D61676589504E470D0A1A0A0000000D494844520000003C0000
+      003C08060000003AFCD9720000000473424954080808087C0864880000000970
+      48597300000B1200000B1201D2DD7EFC0000001C74455874536F667477617265
+      0041646F62652046697265776F726B7320435336E8BCB28C00000FBA49444154
+      78DAD59B095C55D79DC77F7779F72DF0001F48004571C17D091A318AC11D9D8C
+      4B1A6B4D9A38666BBA24699A34B669D3345A5BA78E6DDA8C33934C938989ADCD
+      A2C4246615B728EA68558C1A10104454400494F5DD77DF5DE67FEE7B1AC4FB14
+      788A99FF87F7B9EFC33DF7DDFBBDE77FFEDB3987330C033752CA8A8F0E104521
+      9317F80C4972DCEA70B9539C2E770C3BE76D69BC207B1BCB149F7C48D7F45DAA
+      AAED48491D5674239F87BBDEC047F3F6B905811B27F0C2644110D20551E84BC0
+      71F4DD61B33B05872B8A734644996DBDCD0D90BD0D865FF66A243201D768AA56
+      4ADFF769BAB64DD78C3D43D3D21BBF91C0797B733304817F90C066F38210CF0B
+      2278D10EC12641147988BC0E49E0E170D8E1B43B03C03E2F649F0F8AAA43D579
+      A874D4FC0A74D5075D53E9A35513FC464DD357A78D9DB0EB1B01BC6FE7B63B09
+      7431414EA20F389B13ECE8305AE0F4D7C2E1AF865DA985A8D483D7BCE0743FDD
+      5437AF35381E066F832E38A14AD1F049B1906DF1F0DAE8C8B918300CBFD73CD2
+      673B81AF4CBF63F22737053877CBE7B792DAFEAB20F23379C1068340ED9C0FD1
+      4A05A2E512B8E40A882A69A3A1B1DB98700001D277F6172036CFD0173DF812D8
+      3F04A8A21B2D8E24D43BFAA15E4A82CFB083F3CB04ED07A9FC67A4EEBF983075
+      C6A12E03DEB1E99317785E789EA7C109D10527E745BC52048F5C483D7ADE6CA3
+      7322410A9DEC050DBCA19ADF655B37D43906A25A1A00AF4143416D219557355D
+      D7966566DDB9F486026FFE64632F9EE3FE4A2A9C09C10151E090A41523493E02
+      BB564F903613F47A0A03E70D3F7C42342A1CC35121A442D5E8993519A4E23B74
+      C35838EDCED9E5D71D78D387EF67F03CB79EC667822E3A41EF1DA9FE0388D22A
+      49211968E77AB3FDE0D4EBF0A3414844B16D34CEC3035E35C77795AE1BDFCE9A
+      7357BB8C5ABB803FDD903D8BE7F96CB2BC924196B7378EA3BF9A0781DEBECA49
+      61C370C1316DF528E639C3FC3345341468A44525621ACAD01F5CC0A22BBAAECF
+      FBA76FCDFB286CE08FB2D7CD1278FE03907562C669080E21D9288246BD6A800F
+      8F94EE2D3A6D686DC554AFFFD21B105DF432353266E4CEC87741F5EB08D83C1D
+      02F5F6296E00F271AB69CCC89A51ECA2CF9D356FFE55A1AF0AFCE1BA77C6D198
+      FD82136C36E66AD2F8FD48C049A87084071A14816073FEB70CCBDE3A6042FFEA
+      9E34648DEB0BDDAB80B78B7861F55EE4E49D46A2C785FF7A3C13F174D4FDDAA5
+      EB45C8A8227DCBD36F0BB830CDEFA7313D71CEFC057B3A0CBCE19DBFF710383E
+      8FE3C5EE048CD1E27E2472A708D61EB8305C5AFA01C1ED40D64FDE33A1983C92
+      D90BAF3E3F833ADA8EAA730D48BC6FCDA5E69B7F7907A64E1E06D5A75FA6FB22
+      7CA834927140BD8D01C3D0D5739AA1A77D6BC177CFB41BF8ED37D6C06E177753
+      FC3B4EE31D18251D410A5F1280656AE82035A4E809E1C42C64E1412ADAE7FE35
+      283B1B881EDFFEE1282C98D90F888EC3EE8355C8787A83F97FB743C4993F4D83
+      3B211A8889A3FB923F272DD074E3127499DE0F79CA70F03AF3D7FA1E9F4F1B7F
+      CF030BDB079CBDF66FE467F9252AB99E81D2498CB01D866A4826A018E5C0EE03
+      E558BAF600C289D2C8E2435634EC3C4A563EF83B63FAC6C01361632771EABC82
+      FCF2804F774902320678E014398CE81B8749E9FD31616802ECF42C46938FC075
+      889C1F87FD2350A8F486482E8B8CD89279F7DD7F859FBE02F8DD356F0E21D823
+      BA60E7E36C8D98E8D86B46433ABD55911EE6745523463FB60ED517BC61746FF8
+      92DA231A4FCC1D8E27EE1A616A9DE60B18BB2FE4B1A8F1BB298CF511B33EFC3B
+      FFB228FF5AC05B385E98C251F03F39623F6285F3D4BB22449B00992C66C68FB3
+      71B0A4E6A6C2B696AC51C9C85E321311928DC24F2FEAF46ED8DA3C86C6B34AE3
+      59DB4AC0534302BFF3E6EAE9F4963669BC13831DE54873E69BAACCD48F8F9030
+      FFB98FB17E57E9CD66BC42EE4A4FC686E5B329F862EE4A469E77080AE45E1075
+      2F1B76590B163D986309FCD6EAD77791551EEF100DCC88DA47C98062FA5AC16D
+      C7E2553BF087EC2F6F365B48C9F96526A64D19069D54DBA7D9F079433A649563
+      567BF7BD0F3E947105F04B2B56A47B3CDDF672921B2322CA30C25964F62E0B0C
+      3EDB5582452BB74092AE6F9CDC1161B14875BD0F3E55B73CFFC81D3DF1EA5319
+      506DD1E440C88035A7E2704B0A0CA51175B575639F7CF6D97D9701AF5CB6ECF5
+      F85B6E79D0E5B46366F401440A5E6864A840EADC50DF02B1B18EFA9A453A2CBA
+      BAB165A12B60E923512032E577B9C82DAAB36C33775402DE7F662C0564026C1E
+      0F9A75173EBD300A2D5E1FAAABCEAE5EFCEBE71FBA04BCF03BF7BA060F4A3D95
+      98DCC793EABE8009EEA3A6A1BA286662AF2AD0EBCE51DEA77F1DFC0685E10BF4
+      6238DB55424D3FAB6A189D0A58D8353CF9E2494B77E08B63B5966DEEBE2D11D9
+      CFDC0E5FA30F9CDD01C913835D4DC351D440595679695D7E4161F2DAF5EFB698
+      C03F7AF87BD313136ED9D4B34F2AA6C616A29774F632E00035C1F8C9D95B40B3
+      AFAC4C535CD51CF2A17B789C8821B766E81DD70EB3870978E26F766247E13580
+      9BFDE6F3490E01A72286616BDD2094971C43456555D62BAB5FCF31817FF8D0C3
+      BF4F4848FCF9E0FEBD303BFE30C5530AAB415CF9AB046DF8AFEC69BBCB868FFF
+      5181592FEE0DF9D0B9BF9A808CC171F0C96A27FA98EEE11431F5B7B9D89A6FED
+      122F0346208F56A4687CAC4E417E51392A2B4EAFF8EF37DF78D6047E74D1035B
+      137BF69E3C616034A6C7159805B59062016D774B58F2D65758BAA1D0F292187A
+      21252BA7520F4BF06B3A3A230C781A8DE12D5FB50F98898D82E1CDC644E496CA
+      4CADB7BDF6D73553B82913EEE8D72725656B52AFFEBDE60E0346C75036A45DC3
+      1AB781B6474A98B3620F36E6555936CF48F520F7854C283EB5D3E68E69D1D465
+      3BDBDDC3E635E456F7EB23F1E109374E9F282C2F292D9DC2CDCA9AF1487CF7EE
+      7F4A4E498D5C38B219FD226B09B81DD58B203477A186525115839EDD8EB29A16
+      CBA68F4FEF8355DF4B2383A2740ED64ED92F4B349ECEC199F3720780FD28D67A
+      E16F279371F2784153F5B9734F71B367CC7C232E36EEBE3EFDFA8BDF4FBB8078
+      7BD3D555BA0DB4080D855F9DC0909F6FB99404B495F79F4CC75C824653078183
+      36A2A959C14FD71CC15FB69F0CD9F4AED109D8B078DCE52ACD6938AB7BF05A59
+      2A8E1F2F54CFD5D4AC65C0876263E3460CECDF97FBD1A83A44893EB2D0ED771E
+      22E5B41B728EE1EEDF6D0AD966DAD0EE88A571AE77D04233DE669F86BCB27A54
+      5C90AFDA767E7A12DEFD29F570AB972A703A1A8D08BC5236100545A5464DCDB9
+      C34CA5EB6363BB470D1B9882C708D841518AD611E068079EFBCF5C2C7FE760C7
+      7AEF3ACBAA85C3F1F8ACD436C00645D676BC7C62208E149D444D4D7503033608
+      182307F53681454E25D5EC003059DE998B3FC0E7074EDD34D8F8283B0AFE6D2A
+      A2C957ABADBC002BFBAB9C0D2F970D425E61396A6BAA1116308BAE7C7E0DFD1F
+      7E0B676A9BDB75CDF516365FF5C9E2DB3175E42D81F1DBEAD14301775AA5458A
+      6FF34B6B30F407EFDE14D8F47EDDF012A9F2ED2CA0611EA0CD635BAA7438464B
+      A4B4F1ED4F0B70EF8ACD21DBB8296010B9E00C1259F106EFD79156149DE3E91C
+      334E32B91DAF12A84832CD61D7B576DA46B03793631D18D3B79B992CCC18110F
+      5EE4E16B512DAB8A96462B1CB7C40CD6337FFE027F7CCF3A4FEED1CD817D4B32
+      61A7A442A0F1B52EF7141E7D3DD036292670CE21F1B091A67C77D53FF0F1A1B3
+      E6B9451392F1E7876F85D2CA0031601B017B226D00FD16A921FC5E35A42B6462
+      E9966665CDA4C023AEC381077BA1824BC2E4A7DEC3F6C315966D66520F7C4A31
+      B4410FC6915B7AF29583F8F74D818AC92452C36D4B3341D93AABA1A3FFE22D97
+      029797178DC00FE60C80D1C66FB33098552ADBEBDD2C038F4E8596AC77E96D37
+      79FDE8F7D0DF2931B72EE83D470FFDDBFB8799E38B859F3FF99F43782908BC7C
+      FE60FCE2DB83A1B5F8D142C069CF6D47497533F52287FDBF9988E1BDA32914D5
+      AEF91C5707B6082D3B9C3C5C0476D870A8F02CD21E5F1FB24DF68FC7E0EEF13D
+      4DEBC9D140F513D8FE1317CC1A597ADF1873EC328D14681C56D679517CB6D974
+      31437AB8CDB6E18A441E27476F933C74283D6C0D1CE5C09B1F1CC1032F6EB33C
+      CF0C4FFEEFA7604062247CAD8C912805868B9F7AEFD2F8A3031BE7601F1A9B17
+      DB8723AC3AA3704E7C644C47C1F153A83CD32A3D6C5701A02D70B4134FACDC82
+      FFD878D4F27CDFEE2E1398416A9D48FAC315893AED24DF17DBF5F1283FCE0A00
+      955F1700AE55E2692BA6C122956635EADD05D629A15963FAD9E5C17C5703E70A
+      93705C4D4245D9F1BAFCFCC2E4B5D9C1120F9390453C0B61AB72EA1B7DE84306
+      EB7C93CFB2CDD2BB07E1D7F70CE9744A188E0894C1357391D824FEB375118F49
+      A832AD25B0D3867D472A31965C5228D9F8F458CC1A93444141D7F7B09DE2AB43
+      C2181CE547C290EBADCBB44CAC0AF1BAC5A43733587F597F08DF5FB5C3F2862C
+      40285C31057DE25D146B876F6D3B22AC776532569B6DB321EB029B42B52EC433
+      0935D572053045588F2ECFC1AB9F1558DE742059E6A3CB279BDFBBDA60D90D19
+      07A50C1CE38742D49AAF3ED5C224D464DAA50BD844B62462CC63EBB0BFF89CE5
+      4DAD92F1AE109BA1A05648C00EC79DD055FFB527D382C0D6D3A541D56606ABF6
+      82D734588D5EEBF1B962C110FC6CDEA02E3558E6AC08C94ED71CD4C2034E95DB
+      375DCA24E4843802097FCE9E32643D177AEDC8A6C5E3303D2D013E6FD7192CC9
+      F0E24B17B921713804B5B9FD13E24CAEB6E481250C39BB4BF0DA077981D98836
+      2252A0F1E27DC3D09D5247B59335E88E8A5D6F41A9330D5F3A330996DCA9A675
+      6CC90393908B5A0CBB39390E7F23D0D418840E2EA60A8A4AD95167E7913A2A12
+      C1563806212F72065964854D84777C51CB45B9EAB22502D5EBCFC3686EB4ECE9
+      1B2F06C17A51E91C8C2FA366909162CB9694CE2F5BBA28A117A64930782108DD
+      C0A618BB0C952D3E150D1F4E45DE866351934C8B0CCD1FFEC2B48B1272E92161
+      ABBCBD4B7B5AD07DE622D652CF2494BBD2983566C0D76FE9E145B15E5CBA1F51
+      5A157482561B1A6E28349B0D64B0F5AE1494C64EC7795B2278A5E9C62C2EBD28
+      96CB87D562242947C95236107413B416EF7585662BE8055D81CF1E8B2ACF7854
+      46A59906117EEF8D5D3EDC5A2C1788FB8B112B17C1565B0283ACB74EAA1FD602
+      712D10B4F89CF1A8F38C424D741ABC7C24C07AB5AB1688B716EB2D000AA2D50A
+      B8AB0FC279BED8DCE7009D051FBC69E0CCD5B7E60459AB3D008661AE8EE57456
+      E520BFCDDBA0DA63E075A7A0A1DB303444F6838F92014E612BE11556F0EBFA2D
+      00ADC56A93077931D8D54638BC5570349F86D4520541AE85E06F06C77A4E0F96
+      70D84B102468B608688E5828AE04C8113D213B294A13DDAC27E97D7903C79BBD
+      C9A3AD586EE3B13928D1B007B6F130474663DE214970DA03CB8FBD3E19B25F81
+      A21AE4DB85C0361E85ACB0B9A1E31BBA8DA7AD5C73A3564414E77405376AB534
+      406EF97FBA512B94B47B2B9EAAEF52B51BBF15EFFF000BB1F477942997640000
+      000049454E44AE426082}
+  end
+  object Label1: TLabel
+    Left = 90
+    Top = 15
+    Width = 382
+    Height = 25
+    Caption = 'Pascal Coin Wallet, Miner && Explorer'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -21
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object lblBuild: TLabel
+    Left = 15
+    Top = 356
+    Width = 30
+    Height = 13
+    Caption = 'Build:'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object lblProtocolVersion: TLabel
+    Left = 15
+    Top = 375
+    Width = 50
+    Height = 13
+    Caption = 'Protocol:'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object Label2: TLabel
+    Left = 90
+    Top = 320
+    Width = 65
+    Height = 13
+    Caption = 'Source Code:'
+  end
+  object Label3: TLabel
+    Left = 90
+    Top = 339
+    Width = 135
+    Height = 13
+    Caption = 'Check For New Versions:'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object Label4: TLabel
+    Left = 170
+    Top = 320
+    Width = 240
+    Height = 13
+    Cursor = crHandPoint
+    Caption = 'https://github.com/PascalCoin/PascalCoin'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlue
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+    OnClick = Label4Click
+  end
+  object Label5: TLabel
+    Left = 237
+    Top = 339
+    Width = 253
+    Height = 13
+    Cursor = crHandPoint
+    Caption = 'https://sourceforge.net/projects/pascalcoin'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlue
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+    OnClick = Label5Click
+  end
+  object Memo1: TMemo
+    Left = 90
+    Top = 46
+    Width = 401
+    Height = 275
+    BevelInner = bvNone
+    BevelOuter = bvNone
+    BorderStyle = bsNone
+    Ctl3D = False
+    Lines.Strings = (
+      'Copyright (c) 2016 Albert Molina'
+      ''
+      
+        'This software is a Node of the Pascal Coin P2P Cryptocurrency. A' +
+        ' Crypto currency '
+      
+        'without need of historical operations. It can be used to Mine an' +
+        'd Explore blocks '
+      'and operations.'
+      ''
+      
+        'Distributed under the MIT software license, see the accompanying' +
+        ' file LICENSE  or '
+      'visit http://www.opensource.org/licenses/mit-license.php.'
+      ''
+      
+        'THIS IS EXPERIMENTAL SOFTWARE. Use it for educational purposes o' +
+        'nly.'
+      ''
+      
+        'This product includes software developed by the OpenSSL Project ' +
+        'and Denis '
+      
+        'Grinyuk (https://github.com/Arvur/OpenSSL-Delphi), and some cryp' +
+        'tographic '
+      
+        'functions inspirated in code written by Ladar Levison and Marco ' +
+        'Ferrante. Original '
+      'source code is written in Pascal Language and is available at '
+      'https://github.com/PascalCoin/PascalCoin'
+      ''
+      'If you like it, consider a donation using BitCoin:'
+      '16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk')
+    ParentColor = True
+    ParentCtl3D = False
+    ReadOnly = True
+    TabOrder = 0
+  end
+  object bbClose: TBitBtn
+    Left = 380
+    Top = 358
+    Width = 111
+    Height = 31
+    Caption = 'Close'
+    DoubleBuffered = True
+    Kind = bkOK
+    ParentDoubleBuffered = False
+    TabOrder = 1
+  end
+end

+ 283 - 0
src/gui-classic/UFRMAbout.lfm

@@ -0,0 +1,283 @@
+object FRMAbout: TFRMAbout
+  Left = 764
+  Height = 405
+  Top = 516
+  Width = 585
+  ActiveControl = bbClose
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsDialog
+  Caption = 'About...'
+  ClientHeight = 405
+  ClientWidth = 585
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  Position = poOwnerFormCenter
+  LCLVersion = '1.8.0.6'
+  object Image1: TImage
+    Left = 15
+    Height = 60
+    Top = 15
+    Width = 60
+    AutoSize = True
+    Picture.Data = {
+      1754506F727461626C654E6574776F726B47726170686963E20F000089504E47
+      0D0A1A0A0000000D494844520000003C0000003C08060000003AFCD972000000
+      0473424954080808087C086488000000097048597300000B1200000B1201D2DD
+      7EFC0000001C74455874536F6674776172650041646F62652046697265776F72
+      6B7320435336E8BCB28C00000F5C494441546881D59B7D8C5DC579879F7766CE
+      39F7DEFDBE8B1D7B8D61B13160B05D2F5027C68E8190409B929084006D5A42A3
+      5651D4964655152591924292A65594A66A451B45AA541250207C8990A4348921
+      14624330181BB049B0F1DAF1826D6C76D7FB79EF39673EFAC75DDB6B7BEFB26B
+      AF4DFB938E567B66CE9C79EECCBCF3CE9C772484C0A9D4AEED5BCE3346AF515A
+      AD8AE3C2F242A9A9B3586A6A05A88C0E1DAC568676656975B3777EBDB5EEA9CE
+      454BB69DCAFAC84C036FD9B4A1496B59A995BE526BBD421BBDC0187D86D6BA10
+      25455D28354BB1A11980CAC820D5CA60C8AB15E79CAB5AEBDE72D6753BE73638
+      EF9EF02E3C7351D78AA199ACDF8C016F7A76DD2AADD5A7B4D61F525ACF56DAA0
+      4C828E628C5118E589B5A25048282645002A69856A9A92598FF50A6B3D2ECFF0
+      36C53B8B776EBF73EEC7CEF93BBBDEBD7AFD4CD4F3A48137FCF2890F6AAD3EA7
+      B4BE42698D444594D614C228C5BC9742BE9F24EBC564032857417C8E040F4010
+      4550115E17B1710B69DC4E359A4D256AA72A25BC7384BC82770EEFDCFF38E7BF
+      B9E2BD573EFA8E00AF7BFC67CBB5D2FFA88DFA3DA5234254249194966C0F2DD5
+      1D94AA7B307608820384200A50040464AC90004200FCD88F104034D634315AE8
+      60A0B09081B8833424485EC5BB1C67DD4F9D775F5C7DD5359B4F1BF0533F7FF4
+      36A5F49795311A53A228156667DB28575FA590F703E0C510449F489D90E050C1
+      02508DDAE82B9CCFFEF83C2AA10876146FADF3DE7D6DCDD51FFCCAF4CB9E06F0
+      638FFEF82C2572B7D66A0DBA80D14287DB4E47F56512378097082F66BA759854
+      2A5854C849750B7B0A4BD9A317615D0057C539FF940FE1E6F77FF043BBA75ADE
+      94817FFEA31FAE524A1E545ACFF1A6481B7D2CCA37D2ECF6E289F027D89A5395
+      0A0E45CEA09ECBF6E812FA29A36C05EFDC3EEFC3C7AFFEF047A664D4A604FCDF
+      0F3F74AD52EA21A54D1C4CC2D9BCC6B976133A58ACC4270D2363637AA2AA8800
+      010E259990E1C4B0C374B18B73919A45CFBCF7D7FFFE47AFFFC9DBBEEBED807F
+      F2D003D76AA51E411BA574C4856C667ED8862322A0A689768C42C01423C65B31
+      5BC90FFF02A61483F3A01564169B7B6A36CFA3C9E991F37885E5789783B3DE79
+      7FDDB5D7DF3029F4A4C03F7AE0BE954AE449D151A4B4A64B3DCF1C7E8BA57072
+      A063D2C588B5BFDAC5D7EEDD08085FFAC32EAE5EB9005FC95089E1B63B9F65ED
+      A6D7995B2EF1EDBF5AC3EC72099FBBC3CF1BAAECE36C36F94B6B5398CB731FC2
+      E51FBEE1A667EABDB36E133D7CDF3DF308E191808A028AE5F21C73D87D18564E
+      F6129048F34F0FBDC8BAADFB58B7752F0FAEDD8284149DC4BC796098AFDDBB91
+      5FFDE64D1E7E7A275BB774A33447FA3F60293087DD2C97E70828022A2284471E
+      BEEF9E79D302FEC177EF02CF030166E51896E897982B3D58925A374C0CBA2146
+      974EE26A4C20736CDF3370F8BDEFBFE80C183D08B1A3FBCD231E6553C1B0627E
+      030CF7611A0CA621412B19834E982B3D2CD12F6131049885E7811F7CF7EE0981
+      279C43A248DD06ACCC8839DFECA45377634302014C7391A737EEE62BDFDFC8C9
+      78694A09D5CCB17BFFF0E17BDFFA593777AEEB01A5E8E9CF0EDF773E70FDBF6F
+      A46884650BCEE08A15E7B2FAA23924CD05C2708AF5319DBA9B41D3C8ABD9D918
+      AA2BA3486E038E9BA78F1BC3F7DFF5BD0B95522F7B9DA833A2212E2F3C8B10F0
+      41611A225EDF37C4257FF900FB0F564E187626B4685E0BB75EB7945B3FB20C42
+      C0A53563F764F5DDBC9537A15CEABDF74B6FFCE42DAF8C7F6EA22E7D474094C2
+      F33BF1AFD1E2F0284CACA9562DD7FDDDA3EF382CC0F63706F8EB6FAFE39A2FFC
+      98E1D4A2E2188D6579FC0A0A4F401470C7B1CF1D057CDFF7EEFC4020BC2F2762
+      61D443BBEEC50683520205C3CDFFB0961776BC75DAA0A6A29FBFD0C3CD7FFF53
+      C4809384B2EE6361D4434E0484F7DDF7BD3B3F303EFF51C0DE87DB435094A4CA
+      05C92E7C3008A01A623E77C7533CB8BEFB34A24C5D3FDCD0C363BFD8822E28BC
+      445C90ECA224557C50781F6E1F9FF7F018FED76F7C6345B9DCF6ACC44D2C6BD8
+      C5B2E2366C8831C5889FAEDFC12DDF7C9C389E593F793A1281FD0329A9F513A6
+      FFF97BCFE43FFE6615366AC1A89C974616F1D26827211BA2AFB7EFDD9FFDC217
+      36C0382B9D65D9677C8092CA3827DE4B184BB2A965C5A2596CFFD6D5283CB5A1
+      716AB7858E9500716278DFD7D7B16E5BDF84790E8C58A856F1C339A15C664161
+      1FAF563B180D9065F9678023C037DFF847A5C5172CBACE4BC4DCA88F263D820D
+      63BF850FB4B636228D31BEEF00F843D0471400AD0489267135738FF501A99F63
+      526015EBC373EF44D24A4029425A25EFEBA3B1ECE988FBD9566D21CBB3EBFEF8
+      E33796BEFFE0FDA306A0A9A9719573BE8C28CE4A0E1C5798770E7404AD67E0FA
+      0ED4FCDB711E8F085453C7F6DF8ED4ADD0BC7291D68688E0A7DF3B04887D9870
+      71719CC6A043FF01E637EC67BB2AE39C2B373535AE02D61A8010FC553E40834A
+      99150DE2C3044B3DEF218A51E559E35ABA061D1723D63EB7876BFFF9D9BAF558
+      F7A5D5AC5A7C0669D54E1B388C511B3DC5FEA11436CD690FDD9454273E2882F7
+      57016B1580736E85174D9B19A6A8527CBD8EE73D32068D5247D6735A786EE7C1
+      BAEF6F2D452C9EDB88CF27363853954C633C783114F3015A7D1F5E199CF72B00
+      D455EF5DB3D07BBF30A02947C3206F53A989A07DE0855D03751FB9685E13E596
+      02D69D04B0C8D4BAF43829F194E903D178EF175EBEF2B285AA542A5D1942282B
+      8156330253312BE3A0B5D1A4C3292FF70CD6CDDED5D902B13A61DB9E249ABC6A
+      7975EFF0DB673E4A424B38880878EFCB0D0D0D571A11591D0205AD024D268330
+      C57E33066D66BD8B1D5B77B2BBB7BEBBF9FE0B6741292299AEC11AEBC3C32319
+      7F7BD7CBBCD15FAD5F9D099ADFA36894510C9E000544561B6079001D89A7A0EC
+      D481A166B89A8ABC32A0267CE121FDDB633BB9F7D937F0D304168191D4B169D7
+      007B0ED6870588B43A6E907B84826418B184209AC0721342382704C4284FA4FC
+      F4BB9D82E75F9BDCBF7E6CEBF153DD4C6BCDF9ED13DC152271185CED1FC2390A
+      6806D012D012A60F6C3D1B5F3BF54093697673C22756CDC7558E9EF242008D1F
+      CFD57C52BB705A09D5C12A5B764DECEE9D0EC55A71CF5F5C42B925C1D6F1B3C7
+      4B0183002E082EC8B45C3F8934DDFB0679A3B7BE87752AB562611B4F7E793557
+      75CD211DC98F9B6044C0A1C6730D1A11D929C232EB95E45E519C4E9BC79A9776
+      4EDEBA4D458391B12F48213038AEDB35170D4AA4E69AE69E4A56DB91D44A682A
+      9AA3D628815A6BCE6F2FF0BB0BDAB8EEE2395CB36C36CA28D2A1ACCE6C1AC883
+      C6A2C78A909D06D82C70511E94A97A43B354A76EA995F0FCF6FAE3775E5B810D
+      B7AF218914BA6078605D0F9FFECF1701E868ADA515624594183E71C773FCD7E6
+      3701F893CBCEE45FFE6C39D9F0917DAD40CD12971B2328187081BC62C9735BD7
+      755004AA21C606834870089B4D08AC13E17AE7A571C8C6CC2E4CCD6C09403EB9
+      C15A3ABF998EB98D848A459A62B6BC7E6427F2BCB98DCCEB6884D4E1AC67EBB8
+      B4F72C6CA3B539211CB33A0A21905B8F1FCA988A149EE150C2A210A812C23A35
+      3A3AF28488F4F900076D03535DEB6AAD183E58E195DFF6D7CD7349672B0099F5
+      901FEDA15FBD64160470D6336AFDE1A55FA485CBCE2B132A3999F5475DB90B4C
+      6F2A0F0C482B218052AA6F6464E409F3F82F9FDAF1E95BFE7487E0CEEACB5B20
+      4C7110479AD7BADF62FF407D0FEBE2CE160ED5301BC9F9FAC717F3D14BE6A294
+      B062412BD9484608508C354F7CF132B6BF39C2ECE6840BE73591A5AE6EB953C7
+      55F45186504529B5E3C9679EDE6100B4D61B547057F6DB462A3E2121ABBF623A
+      A458F362776FDD64AD84256736C3D80A29844012292E5F320B803C7587BD3397
+      7BE6978BCC7F5703B8409A9D3CACC2334A03FDD2860A3D68A536D4EE0322EA71
+      2530E2130EE4CD2899C20B65728375767B91B3DB8B47CD8DCE07D2AA25ADDAA3
+      5D5181D47AD28A9D11580083E580CCA242A91677A0D4E330063C3434BC5E6BD5
+      47F0EC4E67BD6D6102905A5E98C4A55C3ABF99A421C29DC00EC74CA947CE2204
+      8FD6AA6F6870783D8C01DF7DFFBDA351143DA242CEDEBCCC906B404FB22ED646
+      31D03FCAAF7BEA1BAC8B3B5B61923DA853298D63505AD8A73A502E258EE247BE
+      FFD0FDA3306E5F3A8EE3EF2881D4C7ECCCE6224CB21513695E7D6380FEE1B46E
+      968B3B5BC0BD33AD6BC8D9A9CE25A5801288E3E83B87D20E037FF6F39FDF608C
+      79DA90D39D7650F1A5DAB6EC448A349BBBEB77E7482B2EEA68827C66C6E374A4
+      710C4B33BBF4799890618C79FAD09E341CF3E54129B95DC4331A0AFC26ED4449
+      9D56162635580B669798DF5EAC059F9C669990B3CD2C65541A50389492DBC7A7
+      1F057CD32D9F5A2BC82F227276E4F3E975ED9863A04580AA65D324DF9896CD6F
+      C6944EBFC18A42C601DDC1CE6831514801F9C54DB77C6AEDF83C137919B70AC1
+      7B142F668B71411FD5B5B556F4F68EF0EAEBF577292F3DA7754A5B63332985C7
+      89E1E5C265781442F0C0ADC7E73B46377EF2965744E4AB11965EDFC656BBF8E8
+      AE9D185EE8EE65A892D77D79D7592D604F6FEB9A90B2B5B8923E3D07137244E4
+      ABC77E1B863A110079EEBF9224EA9A986CE56BF61C9AD5309D6A079684102078
+      C70D97CEA96DD31E5BA012969ED58C9B2107622A4AFC28DDC52E7626CB886D05
+      07CFE47998304AAF6E14CFC3F7DD334F8BDA24CACC121D718979BE16E711124C
+      A4211F82E1A131E8B160AA31D98A3DE1EF48D355EC47D953B8804D8DD7105C46
+      70F6800BBEEBA3377DE28D89F29F78D89252F8817EC2C8D0842D7DEA15887D85
+      BDC5C5BCD87C0DDE3A82CB4E3C6C09E0C337DCF40C221F53780F8117E53DF4C8
+      F91852C43B544B1BD2D004FEF4CEB7121C91AFB0BBF1525E6EFB03080185F388
+      7C6C32D8DAB327137A88C3AAE4B4B6B4F6295E22BACB57B0BBD485D82ADEE633
+      177A78481307973E4FB3DB8757097670F09442AB60D13E65A0D44977FB07E88F
+      E6A2B2E153135C7A4813860FDBED74645B48FC20767018375A995168F139DA67
+      A4493BFBCA97B1B7B90BEB03E495531B3E3C5E130688E7DB69AF6E23EADD4118
+      1EC29BE4E402C45D6DDF2A2DCEA6AF7C316FB57451518D900D9FBE00F1F19AF8
+      0840468BDD43D3FE1728F66FC76403E073401194AE45DFCAA1684BA8C5050704
+      8F78077850113669A5D2D4C960DB12061B17924A11C946F136C3597FFA8F008C
+      D744873C741491D8210A957D14465E271EDD87AEF6A2F311C46547ACBAD2041D
+      E3A2065CA19DAC34876AC399548B73484D13DE5A7C5EA9FD7DA70F791CAB098F
+      F14405749CD48EF1E088B55088638A492D22B79256A9E619990D5874ED184F96
+      E2F3EAFFDD633CC7EA6D0F6A35344BB13476506B7490EAE8FFD3835AF534E5A3
+      78D6AFB7EED41FC5FB5F0935D0C88CEACBC00000000049454E44AE426082
+    }
+  end
+  object Label1: TLabel
+    Left = 90
+    Height = 25
+    Top = 15
+    Width = 382
+    Caption = 'Pascal Coin Wallet, Miner && Explorer'
+    Font.Color = clBlack
+    Font.Height = -21
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object lblBuild: TLabel
+    Left = 15
+    Height = 13
+    Top = 356
+    Width = 30
+    Caption = 'Build:'
+    Font.Color = clWindowText
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object lblProtocolVersion: TLabel
+    Left = 15
+    Height = 13
+    Top = 375
+    Width = 50
+    Caption = 'Protocol:'
+    Font.Color = clWindowText
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object Label2: TLabel
+    Left = 90
+    Height = 13
+    Top = 320
+    Width = 65
+    Caption = 'Source Code:'
+    ParentColor = False
+  end
+  object Label3: TLabel
+    Left = 90
+    Height = 13
+    Top = 339
+    Width = 135
+    Caption = 'Check For New Versions:'
+    Font.Color = clWindowText
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object Label4: TLabel
+    Cursor = crHandPoint
+    Left = 170
+    Height = 13
+    Top = 320
+    Width = 240
+    Caption = 'https://github.com/PascalCoin/PascalCoin'
+    Font.Color = clBlue
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+    OnClick = Label4Click
+  end
+  object Label5: TLabel
+    Cursor = crHandPoint
+    Left = 237
+    Height = 13
+    Top = 339
+    Width = 253
+    Caption = 'https://sourceforge.net/projects/pascalcoin'
+    Font.Color = clBlue
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+    OnClick = Label5Click
+  end
+  object Memo1: TMemo
+    Left = 90
+    Height = 266
+    Top = 46
+    Width = 478
+    BorderStyle = bsNone
+    Lines.Strings = (
+      'Copyright (c) 2016 - 2018 PascalCoin developers'
+      'Based on Albert Molina original source code'
+      ''
+      'Pascal Coin is P2P cryptocurrency without the need for historical operations. This software comprises a node within the PascalCoin network.'
+      ''
+      'Distributed under the MIT software license, see the accompanying file LICENSE  or visit http://www.opensource.org/licenses/mit-license.php.'
+      ''
+      'THIS IS EXPERIMENTAL SOFTWARE. Use it for educational purposes only.'
+      ''
+      'This product includes software developed by the OpenSSL Project and Denis Grinyuk (https://github.com/Arvur/OpenSSL-Delphi), some cryptographic functions inspirated in code written by Ladar Levison and Marco Ferrante, and Synapse Socket code copyright of Lukas Gebauer.'
+      'Original source code is written in Pascal Language and is available at https://github.com/PascalCoin/PascalCoin'
+      ''
+      'If you like it, consider a donation using BitCoin:'
+      '16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk'
+    )
+    ParentColor = True
+    ReadOnly = True
+    ScrollBars = ssVertical
+    TabOrder = 0
+  end
+  object bbClose: TBitBtn
+    Left = 456
+    Height = 31
+    Top = 358
+    Width = 111
+    Caption = 'Close'
+    Kind = bkOK
+    ModalResult = 1
+    TabOrder = 1
+  end
+end

+ 106 - 0
src/gui-classic/UFRMAbout.pas

@@ -0,0 +1,106 @@
+unit UFRMAbout;
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{ Copyright (c) 2016 by Albert Molina
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  This unit is a part of Pascal Coin, a P2P crypto currency without need of
+  historical operations.
+
+  If you like it, consider a donation using BitCoin:
+  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
+
+  }
+
+interface
+
+uses
+{$IFnDEF FPC}
+  pngimage, Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, ExtCtrls, StdCtrls, Buttons;
+
+type
+
+  { TFRMAbout }
+
+  TFRMAbout = class(TForm)
+    Image1: TImage;
+    Label1: TLabel;
+    Memo1: TMemo;
+    bbClose: TBitBtn;
+    lblBuild: TLabel;
+    lblProtocolVersion: TLabel;
+    Label2: TLabel;
+    Label3: TLabel;
+    Label4: TLabel;
+    Label5: TLabel;
+    procedure FormCreate(Sender: TObject);
+    procedure Label4Click(Sender: TObject);
+    procedure Label5Click(Sender: TObject);
+  private
+    { Private declarations }
+    Procedure OpenURL(Url : String);
+  public
+    { Public declarations }
+  end;
+
+implementation
+
+uses
+{$IFnDEF FPC}
+  ShellApi,
+{$ELSE}
+{$ENDIF}
+  UFolderHelper, UConst, UNode;
+
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
+
+procedure TFRMAbout.FormCreate(Sender: TObject);
+{$IFnDEF FPC}
+Var fvi : TFileVersionInfo;
+{$ENDIF}
+begin
+  {$IFDEF FPC}
+  lblBuild.Caption :=  'Build: '+CT_ClientAppVersion;
+  {$ELSE}
+  fvi := TFolderHelper.GetTFileVersionInfo(Application.ExeName);
+  lblBuild.Caption :=  'Build: '+fvi.FileVersion;
+  {$ENDIF}
+  lblProtocolVersion.Caption := Format('BlockChain Protocol: %d (%d)  -  Net Protocol: %d (%d)',[TNode.Node.Bank.SafeBox.CurrentProtocol,CT_BlockChain_Protocol_Available,
+    CT_NetProtocol_Version, CT_NetProtocol_Available]);
+end;
+
+procedure TFRMAbout.Label4Click(Sender: TObject);
+begin
+  OpenURL(TLabel(Sender).Caption);
+end;
+
+procedure TFRMAbout.Label5Click(Sender: TObject);
+begin
+  OpenURL(TLabel(Sender).Caption);
+end;
+
+
+procedure TFRMAbout.OpenURL(Url: String);
+begin
+  {$IFDEF FPC}
+  OpenDocument(pchar(URL))
+  {$ELSE}
+  shellexecute(0, 'open', pchar(URL), nil, nil, SW_SHOW)
+  {$ENDIF}
+end;
+
+end.

+ 101 - 0
src/gui-classic/UFRMAccountInfo.dfm

@@ -0,0 +1,101 @@
+object FRMAccountInfo: TFRMAccountInfo
+  Left = 0
+  Top = 0
+  BorderIcons = [biSystemMenu]
+  Caption = 'Account Information'
+  ClientHeight = 300
+  ClientWidth = 635
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poOwnerFormCenter
+  PixelsPerInch = 96
+  TextHeight = 13
+  object Label1: TLabel
+    Left = 25
+    Top = 26
+    Width = 39
+    Height = 13
+    Caption = 'Account'
+  end
+  object lblAccount: TLabel
+    Left = 77
+    Top = 21
+    Width = 97
+    Height = 19
+    Caption = '0000000-00'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object Label6: TLabel
+    Left = 24
+    Top = 56
+    Width = 47
+    Height = 13
+    Caption = 'Public key'
+  end
+  object lblBalance: TLabel
+    Left = 252
+    Top = 21
+    Width = 97
+    Height = 19
+    Caption = '0000000-00'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object Label3: TLabel
+    Left = 200
+    Top = 26
+    Width = 37
+    Height = 13
+    Caption = 'Balance'
+  end
+  object Label2: TLabel
+    Left = 25
+    Top = 91
+    Width = 26
+    Height = 13
+    Caption = 'State'
+  end
+  object Label4: TLabel
+    Left = 77
+    Top = 86
+    Width = 200
+    Height = 19
+    Caption = 'Normal/For sale/Private'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object ebPublicKey: TEdit
+    Left = 77
+    Top = 51
+    Width = 533
+    Height = 25
+    Ctl3D = False
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentCtl3D = False
+    ParentFont = False
+    TabOrder = 0
+    Text = 'ebPublicKey'
+  end
+end

+ 29 - 0
src/gui-classic/UFRMAccountInfo.pas

@@ -0,0 +1,29 @@
+unit UFRMAccountInfo;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls;
+
+type
+  TFRMAccountInfo = class(TForm)
+    Label1: TLabel;
+    lblAccount: TLabel;
+    Label6: TLabel;
+    lblBalance: TLabel;
+    Label3: TLabel;
+    ebPublicKey: TEdit;
+    Label2: TLabel;
+    Label4: TLabel;
+  private
+    { Private declarations }
+  public
+    { Public declarations }
+  end;
+
+implementation
+
+{$R *.dfm}
+
+end.

+ 268 - 0
src/gui-classic/UFRMAccountSelect.dfm

@@ -0,0 +1,268 @@
+object FRMAccountSelect: TFRMAccountSelect
+  Left = 332
+  Top = 227
+  BorderIcons = [biSystemMenu, biMaximize]
+  Caption = 'Accounts'
+  ClientHeight = 322
+  ClientWidth = 657
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = True
+  Position = poOwnerFormCenter
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  PixelsPerInch = 96
+  TextHeight = 13
+  object pnlAccountsTop: TPanel
+    Left = 451
+    Top = 0
+    Width = 206
+    Height = 282
+    Align = alRight
+    BevelOuter = bvNone
+    TabOrder = 0
+    object cbOnlyForSale: TCheckBox
+      Left = 10
+      Top = 65
+      Width = 81
+      Height = 19
+      Caption = 'Only for sale'
+      TabOrder = 2
+    end
+    object bbSearch: TBitBtn
+      Left = 50
+      Top = 236
+      Width = 91
+      Height = 36
+      Caption = 'Search'
+      DoubleBuffered = True
+      Glyph.Data = {
+        F6060000424DF606000000000000360000002800000018000000180000000100
+        180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFFF00FFABA7A68C8888C09596FF00FFFF00FFFF00FFFF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFACA8A786868A2A669A4B7BA0C09494FF00FFFF
+        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF9B9D9D5492C22E99FF1B7C
+        CB557A97C19595FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF3DADFF
+        57C1FF4DB1FF3196FA197CC9537997C19495FF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFFF00FF41ABFF5DBFFE4DAFFF3196FA197BC85A7A97C29594FF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF42ABFE5CC0FE4DAFFF3096FA19
+        7AC8587A96C19494FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF42AC
+        FE5CC0FE4DAFFF2E94FA187AC75F7C97BB9396FF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+        FF00FFFF00FFFF00FF44ADFE5CBFFE4DB0FF2D94F81979C6437397FF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF46AEFE5CBFFE4CB0FF3F97ED
+        577B94FF00FFFF00FFFF00FFAE837EAE837EAE837EAE837EAE837EFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF46
+        AFFE66C5FFA3CCF1BEB3AB867170A9807AAE837EE5D8BDFFFFE2FFFFE2FFFFE0
+        EEDFC6AE837EAE837EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFDCBFB8C69E8ED8BDA3FFFFDDFFFFDDFF
+        FFDBFFFFDAFFFFDBFFFFDDFFFFE9DEC9B7AE837EFF00FFFF00FFFF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFAE857FDEC0A5FFF3
+        C1FCF1C8FFFFDAFFFFD9FFFFDAFFFFE0FFFFE4FFFFEFFFFFFFDDCAC8AE837EFF
+        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+        AE837EFFEFB9F5D4A5FBF0C6FFFFDBFFFFDAFFFFDDFFFFEBFFFFF5FFFFFBFFFF
+        FDFFFFFEAE837EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFAE837EECD5B4F8D6A2F2C997FCEDC4FFFFDBFFFFDAFFFFE0FFFFF0
+        FFFFFEFFFFFDFFFFF5FFFFEBE1D3B8AE837EFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFAE837EFFF3BFF4CB95F0C18EF9E5BAFEFDD7FF
+        FFDCFFFFDFFFFFECFFFFF8FFFFF8FFFFECFFFFE0FFFFE3AE837EFF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFAE837EFFF4C0F3C994EEB8
+        84F5D5A5FDF3CBFFFFDCFFFFDDFFFFE2FFFFE8FFFFE9FFFFE2FFFFDDFFFFE3AE
+        837EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFAE837E
+        FFF5C3F6D19CEEB27DF1C593F7E0B3FDF7D0FFFFDCFFFFDDFFFFDDFFFFDDFFFF
+        DBFFFFDAFFFFE1AE837EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFAE837EECD5B4FDE6B2F3C996F2C792F3D09CF8E3B5FCF5CDFFFFDA
+        FFFFDCFFFFDBFFFFDBFFFFDCE2D3B8AE837EFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFAE837EFFFED0FCF0D6F8E0BEF4CF9DF3
+        CD9AF6D8AAFBEABFFDF4CBFCF7CFFEF8D1FFFFDEAE837EFF00FFFF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFAE837EE0CAB2FFFF
+        FFFEF9F2F8E1BEF1C48DEEBA85F1C491F4D1A1F8DEB0FFF7C6DDC7AEAE837EFF
+        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+        FF00FFAE837ED9C6C0FFFFFFFFF7D7F8DAA6F4CB95F5CD99F9D9A6FFF1BBDEC2
+        A9AE837EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFFF00FFFF00FFFF00FFAE837EAE837EE8D5B4FFF9C5FFF5C0FFF5C2
+        EED8B7AE837EAE837EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFAE837EAE
+        837EAE837EAE837EAE837EFF00FFFF00FFFF00FFFF00FFFF00FF}
+      ParentDoubleBuffered = False
+      TabOrder = 10
+      OnClick = bbSearchClick
+    end
+    object cbOnlyForPrivateSaleToMe: TCheckBox
+      Left = 10
+      Top = 111
+      Width = 148
+      Height = 19
+      Caption = 'Only for private sale to me'
+      TabOrder = 4
+    end
+    object cbAccountsBalance: TCheckBox
+      Left = 10
+      Top = 134
+      Width = 104
+      Height = 19
+      Caption = 'Accounts Balance'
+      TabOrder = 5
+    end
+    object cbMyAccounts: TCheckBox
+      Left = 10
+      Top = 10
+      Width = 81
+      Height = 19
+      Caption = 'My Accounts'
+      TabOrder = 0
+      OnClick = cbMyAccountsClick
+    end
+    object cbMyPrivateKeys: TComboBox
+      Left = 10
+      Top = 35
+      Width = 176
+      Height = 21
+      Style = csDropDownList
+      TabOrder = 1
+      OnChange = cbMyPrivateKeysChange
+    end
+    object cbOnlyForPublicSale: TCheckBox
+      Left = 10
+      Top = 88
+      Width = 111
+      Height = 19
+      Caption = 'Only for public sale'
+      TabOrder = 3
+    end
+    object ebMinBalance: TEdit
+      Left = 16
+      Top = 160
+      Width = 73
+      Height = 21
+      TabOrder = 6
+      OnExit = ebMinBalanceExit
+    end
+    object ebMaxBalance: TEdit
+      Left = 103
+      Top = 160
+      Width = 73
+      Height = 21
+      TabOrder = 7
+      OnExit = ebMaxBalanceExit
+    end
+    object cbAccountsName: TCheckBox
+      Left = 10
+      Top = 186
+      Width = 93
+      Height = 19
+      Caption = 'Accounts name'
+      TabOrder = 8
+    end
+    object ebAccountName: TEdit
+      Left = 18
+      Top = 209
+      Width = 158
+      Height = 21
+      TabOrder = 9
+    end
+  end
+  object pnlBottom: TPanel
+    Left = 0
+    Top = 282
+    Width = 657
+    Height = 40
+    Align = alBottom
+    BevelOuter = bvNone
+    TabOrder = 1
+    DesignSize = (
+      657
+      40)
+    object Label17: TLabel
+      Left = 5
+      Top = 10
+      Width = 48
+      Height = 13
+      Caption = 'Accounts:'
+      Color = clBtnFace
+      ParentColor = False
+    end
+    object lblAccountsCount: TLabel
+      Left = 60
+      Top = 10
+      Width = 18
+      Height = 13
+      Caption = '000'
+      Color = clBtnFace
+      ParentColor = False
+    end
+    object Label19: TLabel
+      Left = 136
+      Top = 10
+      Width = 41
+      Height = 13
+      Caption = 'Balance:'
+      Color = clBtnFace
+      ParentColor = False
+    end
+    object lblAccountsBalance: TLabel
+      Left = 200
+      Top = 10
+      Width = 18
+      Height = 13
+      Caption = '000'
+      Color = clBtnFace
+      ParentColor = False
+    end
+    object bbSelect: TBitBtn
+      Left = 450
+      Top = 5
+      Width = 95
+      Height = 30
+      Anchors = [akTop, akRight]
+      Caption = 'Select'
+      DoubleBuffered = True
+      Kind = bkOK
+      ParentDoubleBuffered = False
+      TabOrder = 0
+    end
+    object bbCancel: TBitBtn
+      Left = 554
+      Top = 5
+      Width = 95
+      Height = 30
+      Anchors = [akTop, akRight]
+      DoubleBuffered = True
+      Kind = bkCancel
+      ParentDoubleBuffered = False
+      TabOrder = 1
+    end
+    object bbTypeStats: TBitBtn
+      Left = 340
+      Top = 5
+      Width = 95
+      Height = 30
+      Caption = 'Type stats'
+      DoubleBuffered = True
+      ParentDoubleBuffered = False
+      TabOrder = 2
+      OnClick = bbTypeStatsClick
+    end
+  end
+  object dgAccounts: TDrawGrid
+    Left = 0
+    Top = 0
+    Width = 451
+    Height = 282
+    Align = alClient
+    TabOrder = 2
+  end
+end

+ 270 - 0
src/gui-classic/UFRMAccountSelect.lfm

@@ -0,0 +1,270 @@
+object FRMAccountSelect: TFRMAccountSelect
+  Left = 534
+  Height = 322
+  Top = 308
+  Width = 601
+  BorderIcons = [biSystemMenu, biMaximize]
+  Caption = 'Accounts'
+  ClientHeight = 322
+  ClientWidth = 601
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  Position = poOwnerFormCenter
+  LCLVersion = '1.8.0.6'
+  Visible = False
+  object pnlAccountsTop: TPanel
+    Left = 395
+    Height = 282
+    Top = 0
+    Width = 206
+    Align = alRight
+    BevelOuter = bvNone
+    ClientHeight = 282
+    ClientWidth = 206
+    TabOrder = 0
+    object cbOnlyForSale: TCheckBox
+      Left = 10
+      Height = 19
+      Top = 65
+      Width = 81
+      Caption = 'Only for sale'
+      TabOrder = 0
+    end
+    object bbSearch: TBitBtn
+      Left = 56
+      Height = 36
+      Top = 240
+      Width = 86
+      Caption = 'Search'
+      Glyph.Data = {
+        F6060000424DF606000000000000360000002800000018000000180000000100
+        180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFFF00FFABA7A68C8888C09596FF00FFFF00FFFF00FFFF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFACA8A786868A2A669A4B7BA0C09494FF00FFFF
+        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF9B9D9D5492C22E99FF1B7C
+        CB557A97C19595FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF3DADFF
+        57C1FF4DB1FF3196FA197CC9537997C19495FF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFFF00FF41ABFF5DBFFE4DAFFF3196FA197BC85A7A97C29594FF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF42ABFE5CC0FE4DAFFF3096FA19
+        7AC8587A96C19494FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF42AC
+        FE5CC0FE4DAFFF2E94FA187AC75F7C97BB9396FF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+        FF00FFFF00FFFF00FF44ADFE5CBFFE4DB0FF2D94F81979C6437397FF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF46AEFE5CBFFE4CB0FF3F97ED
+        577B94FF00FFFF00FFFF00FFAE837EAE837EAE837EAE837EAE837EFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF46
+        AFFE66C5FFA3CCF1BEB3AB867170A9807AAE837EE5D8BDFFFFE2FFFFE2FFFFE0
+        EEDFC6AE837EAE837EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFDCBFB8C69E8ED8BDA3FFFFDDFFFFDDFF
+        FFDBFFFFDAFFFFDBFFFFDDFFFFE9DEC9B7AE837EFF00FFFF00FFFF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFAE857FDEC0A5FFF3
+        C1FCF1C8FFFFDAFFFFD9FFFFDAFFFFE0FFFFE4FFFFEFFFFFFFDDCAC8AE837EFF
+        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+        AE837EFFEFB9F5D4A5FBF0C6FFFFDBFFFFDAFFFFDDFFFFEBFFFFF5FFFFFBFFFF
+        FDFFFFFEAE837EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFAE837EECD5B4F8D6A2F2C997FCEDC4FFFFDBFFFFDAFFFFE0FFFFF0
+        FFFFFEFFFFFDFFFFF5FFFFEBE1D3B8AE837EFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFAE837EFFF3BFF4CB95F0C18EF9E5BAFEFDD7FF
+        FFDCFFFFDFFFFFECFFFFF8FFFFF8FFFFECFFFFE0FFFFE3AE837EFF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFAE837EFFF4C0F3C994EEB8
+        84F5D5A5FDF3CBFFFFDCFFFFDDFFFFE2FFFFE8FFFFE9FFFFE2FFFFDDFFFFE3AE
+        837EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFAE837E
+        FFF5C3F6D19CEEB27DF1C593F7E0B3FDF7D0FFFFDCFFFFDDFFFFDDFFFFDDFFFF
+        DBFFFFDAFFFFE1AE837EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFAE837EECD5B4FDE6B2F3C996F2C792F3D09CF8E3B5FCF5CDFFFFDA
+        FFFFDCFFFFDBFFFFDBFFFFDCE2D3B8AE837EFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFAE837EFFFED0FCF0D6F8E0BEF4CF9DF3
+        CD9AF6D8AAFBEABFFDF4CBFCF7CFFEF8D1FFFFDEAE837EFF00FFFF00FFFF00FF
+        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFAE837EE0CAB2FFFF
+        FFFEF9F2F8E1BEF1C48DEEBA85F1C491F4D1A1F8DEB0FFF7C6DDC7AEAE837EFF
+        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+        FF00FFAE837ED9C6C0FFFFFFFFF7D7F8DAA6F4CB95F5CD99F9D9A6FFF1BBDEC2
+        A9AE837EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+        00FFFF00FFFF00FFFF00FFFF00FFAE837EAE837EE8D5B4FFF9C5FFF5C0FFF5C2
+        EED8B7AE837EAE837EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFAE837EAE
+        837EAE837EAE837EAE837EFF00FFFF00FFFF00FFFF00FFFF00FF
+      }
+      OnClick = bbSearchClick
+      TabOrder = 1
+    end
+    object cbOnlyForPrivateSaleToMe: TCheckBox
+      Left = 10
+      Height = 19
+      Top = 111
+      Width = 148
+      Caption = 'Only for private sale to me'
+      TabOrder = 2
+    end
+    object cbAccountsBalance: TCheckBox
+      Left = 10
+      Height = 19
+      Top = 134
+      Width = 104
+      Caption = 'Accounts Balance'
+      TabOrder = 3
+    end
+    object cbMyAccounts: TCheckBox
+      Left = 10
+      Height = 19
+      Top = 10
+      Width = 81
+      Caption = 'My Accounts'
+      OnChange = cbMyAccountsChange
+      OnClick = cbMyAccountsClick
+      TabOrder = 4
+    end
+    object cbMyPrivateKeys: TComboBox
+      Left = 10
+      Height = 21
+      Top = 35
+      Width = 176
+      ItemHeight = 13
+      OnChange = cbMyPrivateKeysChange
+      Style = csDropDownList
+      TabOrder = 5
+    end
+    object cbOnlyForPublicSale: TCheckBox
+      Left = 10
+      Height = 19
+      Top = 88
+      Width = 111
+      Caption = 'Only for public sale'
+      TabOrder = 6
+    end
+    object ebMinBalance: TEdit
+      Left = 16
+      Height = 21
+      Top = 160
+      Width = 73
+      OnExit = ebMinBalanceExit
+      TabOrder = 7
+    end
+    object ebMaxBalance: TEdit
+      Left = 103
+      Height = 21
+      Top = 160
+      Width = 73
+      OnExit = ebMaxBalanceExit
+      TabOrder = 8
+    end
+    object cbAccountsName: TCheckBox
+      Left = 10
+      Height = 19
+      Top = 186
+      Width = 93
+      Caption = 'Accounts name'
+      TabOrder = 9
+    end
+    object ebAccountName: TEdit
+      Left = 18
+      Height = 21
+      Top = 209
+      Width = 158
+      TabOrder = 10
+    end
+  end
+  object pnlBottom: TPanel
+    Left = 0
+    Height = 40
+    Top = 282
+    Width = 601
+    Align = alBottom
+    BevelOuter = bvNone
+    ClientHeight = 40
+    ClientWidth = 601
+    TabOrder = 1
+    object bbSelect: TBitBtn
+      Left = 394
+      Height = 30
+      Top = 5
+      Width = 95
+      Anchors = [akTop, akRight]
+      Caption = 'Select'
+      Kind = bkOK
+      ModalResult = 1
+      TabOrder = 0
+    end
+    object bbCancel: TBitBtn
+      Left = 498
+      Height = 30
+      Top = 5
+      Width = 95
+      Anchors = [akTop, akRight]
+      Cancel = True
+      Caption = 'Cancel'
+      Kind = bkCancel
+      ModalResult = 2
+      TabOrder = 1
+    end
+    object Label17: TLabel
+      Left = 5
+      Height = 13
+      Top = 10
+      Width = 48
+      Caption = 'Accounts:'
+      ParentColor = False
+    end
+    object lblAccountsCount: TLabel
+      Left = 60
+      Height = 13
+      Top = 10
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object Label19: TLabel
+      Left = 136
+      Height = 13
+      Top = 10
+      Width = 41
+      Caption = 'Balance:'
+      ParentColor = False
+    end
+    object lblAccountsBalance: TLabel
+      Left = 200
+      Height = 13
+      Top = 10
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object bbTypeStats: TBitBtn
+      Left = 288
+      Height = 30
+      Top = 5
+      Width = 95
+      Anchors = [akTop, akRight]
+      Caption = 'Type Stats'
+      Default = True
+      Kind = bkOK
+      ModalResult = 1
+      TabOrder = 2
+    end
+  end
+  object dgAccounts: TDrawGrid
+    Left = 0
+    Height = 282
+    Top = 0
+    Width = 395
+    Align = alClient
+    ExtendedSelect = False
+    TabOrder = 2
+    TitleFont.Color = clWindowText
+    TitleFont.Height = -11
+    TitleFont.Name = 'Tahoma'
+  end
+end

+ 578 - 0
src/gui-classic/UFRMAccountSelect.pas

@@ -0,0 +1,578 @@
+unit UFRMAccountSelect;
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{ Copyright (c) 2016 by Albert Molina
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  This unit is a part of Pascal Coin, a P2P crypto currency without need of
+  historical operations.
+
+  If you like it, consider a donation using BitCoin:
+  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
+
+  }
+
+interface
+
+uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, UAccounts, Grids, StdCtrls, Buttons, ExtCtrls, UWallet, UNode,
+  UGridUtils, UConst, UThread;
+
+const
+  CT_AS_MyAccounts = $0001;
+  CT_AS_OnlyForSale = $0002;
+
+type
+  { TSearchThread }
+  TSearchValues = Record
+    SafeBox : TPCSafeBox;
+    inWalletKeys : TWalletKeys;
+    inAccountKey : TAccountKey;
+    onlyForSale,
+    onlyForPublicSale,
+    onlyForPrivateSaleToMe : Boolean;
+    minBal,maxBal : Int64;
+    searchName : AnsiString;
+  end;
+
+  TSearchProcedure = procedure(Const searchFound : TCardinalsArray; const searchValues : TSearchValues) of object;
+
+  TSearchThread = Class(TPCThread)
+  private
+    FIsReadyForSearch: Boolean;
+    FOnSearchFinished: TSearchProcedure;
+    FDoStopSearch : Boolean;
+    FStartSearch : Boolean;
+    FAccounts : TCardinalsArray;
+    FSearchValues : TSearchValues;
+    procedure SetIsReadyForSearch(AValue: Boolean);
+  protected
+    procedure BCExecute; override;
+    Procedure DoNotifySearchFinished;
+  public
+    property IsReadyForSearch : Boolean read FIsReadyForSearch write SetIsReadyForSearch;
+    Property OnSearchFinished : TSearchProcedure read FOnSearchFinished write FOnSearchFinished;
+    Procedure DoSearch(Const newSearchValues : TSearchValues);
+    Procedure StopSearch;
+  end;
+
+  { TFRMAccountSelect }
+
+  TFRMAccountSelect = class(TForm)
+    cbAccountsName: TCheckBox;
+    ebMinBalance: TEdit;
+    ebMaxBalance: TEdit;
+    ebAccountName: TEdit;
+    Label17: TLabel;
+    Label19: TLabel;
+    lblAccountsBalance: TLabel;
+    lblAccountsCount: TLabel;
+    pnlAccountsTop: TPanel;
+    cbOnlyForSale: TCheckBox;
+    bbSearch: TBitBtn;
+    cbOnlyForPrivateSaleToMe: TCheckBox;
+    pnlBottom: TPanel;
+    dgAccounts: TDrawGrid;
+    bbSelect: TBitBtn;
+    bbCancel: TBitBtn;
+    cbAccountsBalance: TCheckBox;
+    cbMyAccounts: TCheckBox;
+    cbMyPrivateKeys: TComboBox;
+    cbOnlyForPublicSale: TCheckBox;
+    bbTypeStats: TBitBtn;
+    procedure bbSearchClick(Sender: TObject);
+    procedure cbMyAccountsChange(Sender: TObject);
+    procedure cbMyAccountsClick(Sender: TObject);
+    procedure cbMyPrivateKeysChange(Sender: TObject);
+    procedure ebMaxBalanceExit(Sender: TObject);
+    procedure ebMinBalanceExit(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+    procedure bbTypeStatsClick(Sender: TObject);
+  private
+    FAllowSelect: Boolean;
+    FDefaultAccount: Int64;
+    FFilters: Integer;
+    FWalletKeys: TWalletKeys;
+    FNode: TNode;
+    FSafeBox : TPCSafeBox;
+    FAccountsGrid : TAccountsGrid;
+    FSearchThread : TSearchThread;
+    { Private declarations }
+    procedure SetAllowSelect(AValue: Boolean);
+    procedure SetDefaultAccount(AValue: Int64);
+    procedure SetFilters(AValue: Integer);
+    procedure SetNode(const Value: TNode);
+    procedure SetWalletKeys(const Value: TWalletKeys);
+    Procedure SearchFiltered;
+    Procedure UpdateControls;
+    procedure OnSearchFinished(Const searchFound : TCardinalsArray; const searchValues : TSearchValues);
+    procedure OnAccountsGridUpdated(Sender : TObject);
+  protected
+    FAccounts : TOrderedAccountList;
+  public
+    { Public declarations }
+    Property WalletKeys : TWalletKeys read FWalletKeys write SetWalletKeys;
+    Property Node : TNode read FNode write SetNode;
+    Property Filters : Integer read FFilters write SetFilters;
+    Property DefaultAccount : Int64 read FDefaultAccount write SetDefaultAccount;
+    Function GetSelected : Int64;
+    Property AllowSelect : Boolean read FAllowSelect write SetAllowSelect;
+  end;
+
+implementation
+
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
+
+Uses strutils, UFRMMemoText;
+
+{ TSearchThread }
+
+procedure TSearchThread.SetIsReadyForSearch(AValue: Boolean);
+begin
+  if FIsReadyForSearch=AValue then Exit;
+  FIsReadyForSearch:=AValue;
+end;
+
+procedure TSearchThread.BCExecute;
+  procedure SearchFilteredInThread;
+  Var c,maxC : Cardinal;
+    account : TAccount;
+    isValid : Boolean;
+    validAccKey : Boolean;
+    errors : AnsiString;
+    i : Integer;
+  begin
+    SetLength(FAccounts,0);
+    c := 0;
+    maxC := FSearchValues.SafeBox.AccountsCount-1;
+    validAccKey := TAccountComp.IsValidAccountKey(FSearchValues.inAccountKey,errors);
+    while (c<=maxC) And (Not Terminated) And (Not FDoStopSearch) do begin
+      account := FSearchValues.SafeBox.Account(c);
+      isValid := True;
+      If validAccKey then begin
+        isValid := TAccountComp.EqualAccountKeys(account.accountInfo.accountKey,FSearchValues.inAccountKey);
+      end else if (Assigned(FSearchValues.inWalletKeys)) then begin
+        isValid := FSearchValues.inWalletKeys.IndexOfAccountKey(account.accountInfo.accountKey)>=0;
+      end;
+      If isValid And (FSearchValues.onlyForSale) then begin
+        isValid := TAccountComp.IsAccountForSale(account.accountInfo);
+      end;
+      If IsValid and (FSearchValues.onlyForPublicSale) then begin
+        isValid := (TAccountComp.IsAccountForSale(account.accountInfo)) And (Not TAccountComp.IsAccountForSaleAcceptingTransactions(account.accountInfo));
+      end;
+      If IsValid and (FSearchValues.onlyForPrivateSaleToMe) then begin
+        isValid := (TAccountComp.IsAccountForSaleAcceptingTransactions(account.accountInfo)) And
+          (Assigned(FSearchValues.inWalletKeys)) And (FSearchValues.inWalletKeys.IndexOfAccountKey(account.accountInfo.new_publicKey)>=0);
+      end;
+      If IsValid then begin
+        IsValid := (account.balance>=FSearchValues.minBal) And ((FSearchValues.maxBal<0) Or (account.balance<=FSearchValues.maxBal));
+      end;
+      If IsValid And (FSearchValues.searchName<>'') then begin
+        i := ansipos(FSearchValues.searchName,account.name);
+        IsValid := i>0;
+      end;
+      //
+      if IsValid then begin
+        setLength(FAccounts,length(FAccounts)+1);
+        FAccounts[high(FAccounts)] := c;
+      end;
+      inc(c);
+    end;
+    If (Not Terminated) And (Not FDoStopSearch) then begin
+      Synchronize(DoNotifySearchFinished);
+    end;
+  end;
+begin
+  FIsReadyForSearch := True;
+  FDoStopSearch := False;
+  FStartSearch := False;
+  while (Not Terminated) do begin
+    FIsReadyForSearch := True;
+    If (FStartSearch) then begin
+      FStartSearch := False;
+      FIsReadyForSearch:=False;
+      FDoStopSearch:=False;
+      SearchFilteredInThread;
+    end else sleep(1);
+  end;
+end;
+
+procedure TSearchThread.DoNotifySearchFinished;
+begin
+  If Assigned(FOnSearchFinished) then begin
+    FOnSearchFinished(FAccounts,FSearchValues);
+  end;
+end;
+
+procedure TSearchThread.DoSearch(const newSearchValues: TSearchValues);
+begin
+  FDoStopSearch := True;
+  FStartSearch := False;
+  While (Not FIsReadyForSearch) do sleep(1);
+  FSearchValues := newSearchValues;
+  FStartSearch := True;
+end;
+
+procedure TSearchThread.StopSearch;
+begin
+  FDoStopSearch := True;
+  FStartSearch := False;
+  While (Not FIsReadyForSearch) do sleep(1);
+end;
+
+{ TFRMAccountSelect }
+
+procedure TFRMAccountSelect.SetDefaultAccount(AValue: Int64);
+begin
+  if FDefaultAccount=AValue then Exit;
+  FDefaultAccount:=AValue;
+end;
+
+procedure TFRMAccountSelect.SetAllowSelect(AValue: Boolean);
+begin
+  FAllowSelect:=AValue;
+  bbSelect.Visible:=AValue;
+  bbSelect.Enabled:=AValue;
+end;
+
+procedure TFRMAccountSelect.SetFilters(AValue: Integer);
+begin
+  FFilters:=AValue;
+  cbMyAccounts.Checked := (AValue and CT_AS_MyAccounts) = CT_AS_MyAccounts;
+  cbOnlyForSale.Checked := (AValue and CT_AS_OnlyForSale) = CT_AS_OnlyForSale;
+  SearchFiltered;
+end;
+
+procedure TFRMAccountSelect.FormCreate(Sender: TObject);
+begin
+  FSearchThread := TSearchThread.Create(false);
+  FSearchThread.OnSearchFinished := OnSearchFinished;
+  FAccounts := TOrderedAccountList.Create;
+  FWalletKeys := Nil;
+  FNode := Nil;
+  FSafeBox:=Nil;
+  FFilters:=0;
+  FDefaultAccount:=-1;
+  FAccountsGrid := TAccountsGrid.Create(Self);
+  FAccountsGrid.DrawGrid := dgAccounts;
+  FAccountsGrid.OnUpdated:=OnAccountsGridUpdated;
+  //
+  cbMyAccounts.OnClick:=cbMyAccountsClick;
+  cbMyPrivateKeys.OnClick:=cbMyAccountsClick;
+  cbOnlyForSale.OnClick:=cbMyAccountsClick;
+  cbOnlyForPrivateSaleToMe.OnClick:=cbMyAccountsClick;
+  cbOnlyForPublicSale.OnClick:=cbMyAccountsClick;
+  cbAccountsBalance.OnClick:=cbMyAccountsClick;
+  cbAccountsName.OnClick:=cbMyAccountsClick;
+  bbTypeStats.OnClick:=bbTypeStatsClick;
+  UpdateControls;
+  AllowSelect:=False;
+end;
+
+procedure TFRMAccountSelect.bbSearchClick(Sender: TObject);
+begin
+  SearchFiltered;
+end;
+
+procedure TFRMAccountSelect.bbTypeStatsClick(Sender: TObject);
+Type
+  TAccTypeStats = Record
+    accounts:Integer;
+    balance:Int64;
+  end;
+Const
+  TAccTypeStats_NUL : TAccTypeStats = (accounts:0;balance:0);
+Var i,j,k : Integer;
+  account : TAccount;
+  c : Cardinal;
+  s_0,s_inv : TAccTypeStats;
+  s_5 : Array[0..6] of Array[1..4,0..9] of TAccTypeStats;
+  FRM : TFRMMemoText;
+  sl : TStringList;
+begin
+  c := 0;
+  s_0 := TAccTypeStats_NUL;
+  s_inv := TAccTypeStats_NUL;
+  for i := low(s_5) to high(s_5) do
+    for j := 1 to 4 do
+      for k := 0 to 9 do
+        s_5[i,j,k] := TAccTypeStats_NUL;
+
+
+  while (c<FSafeBox.AccountsCount) do begin
+    account := FSafeBox.Account(c);
+    if (account.account_type=0) then begin
+      inc(s_0.accounts);
+      inc(s_0.balance,account.balance);
+    end else if (account.account_type<10000) then begin
+      inc(s_inv.accounts);
+      inc(s_inv.balance,account.balance);
+    end;
+    k := ((account.account_type MOD 100000) DIV 10000); // k is 0..6 because account.account_type is a word 0..65535
+    if (k<0) or (k>6) then k:=0;
+    for i := 0 to 9 do begin
+      j := ((account.account_type MOD 10000) DIV 1000); // j is 0..9
+      if (j=i) then begin
+        inc(s_5[k][1][j].accounts);
+        inc(s_5[k][1][j].balance,account.balance);
+      end;
+    end;
+    for i := 0 to 9 do begin
+      j := ((account.account_type MOD 1000) DIV 100); // j is 0..9
+      if (j=i) then begin
+        inc(s_5[k][2][j].accounts);
+        inc(s_5[k][2][j].balance,account.balance);
+      end;
+    end;
+    for i := 0 to 9 do begin
+      j := ((account.account_type MOD 100) DIV 10); // j is 0..9
+      if (j=i) then begin
+        inc(s_5[k][3][j].accounts);
+        inc(s_5[k][3][j].balance,account.balance);
+      end;
+    end;
+    for i := 0 to 9 do begin
+      j := ((account.account_type MOD 10) DIV 1); // j is 0..9
+      if (j=i) then begin
+        inc(s_5[k][4][j].accounts);
+        inc(s_5[k][4][j].balance,account.balance);
+      end;
+    end;
+    inc(c);
+  end;
+  sl := TStringList.Create;
+  Try
+    sl.Add('*** Account type stats ***');
+    sl.Add(Format('Current block:%d accounts:%d coins:%s',[FSafeBox.BlocksCount,FSafeBox.AccountsCount,TAccountComp.FormatMoney(FSafeBox.TotalBalance)]));
+    sl.Add('');
+    sl.Add('** Basic stats **');
+    sl.Add(Format('Account type=0 accounts:%d coins:%s',[s_0.accounts,TAccountComp.FormatMoney(s_0.balance)]));
+    sl.Add(Format('Account type [1..9999] accounts:%d coins:%s',[s_inv.accounts,TAccountComp.FormatMoney(s_inv.balance)]));
+    sl.Add('');
+    sl.Add('*** Stats by group ***');
+    for k := 0 to 6 do begin
+      // Note: Account type is a Word [0..65535], so left digit can be only 0..6, deprecating 6 to not fill, result for stats is 0..5
+      sl.Add('');
+      sl.Add(Format('** Group [%d..%d] **',[(k)*10000,((k+1)*10000)-1]));
+      for j := 0 to 9 do begin
+        sl.Add(Format('Account type like %d%d*** accounts:%d coins:%s',[k,j,s_5[k][1][j].accounts,TAccountComp.FormatMoney(s_5[k][1][j].balance)]));
+      end;
+      for j := 0 to 9 do begin
+        sl.Add(Format('Account type like %d*%d** accounts:%d coins:%s',[k,j,s_5[k][2][j].accounts,TAccountComp.FormatMoney(s_5[k][2][j].balance)]));
+      end;
+      for j := 0 to 9 do begin
+        sl.Add(Format('Account type like %d**%d* accounts:%d coins:%s',[k,j,s_5[k][3][j].accounts,TAccountComp.FormatMoney(s_5[k][3][j].balance)]));
+      end;
+      for j := 0 to 9 do begin
+        sl.Add(Format('Account type like %d***%d accounts:%d coins:%s',[k,j,s_5[k][4][j].accounts,TAccountComp.FormatMoney(s_5[k][4][j].balance)]));
+      end;
+    end;
+    FRM := TFRMMemoText.Create(Self);
+    Try
+      FRM.InitData('Account Type Stats',sl.Text);
+      FRM.ShowModal;
+    Finally
+      FRM.Free;
+    End;
+  Finally
+    sl.Free;
+  End;
+end;
+
+procedure TFRMAccountSelect.cbMyAccountsChange(Sender: TObject);
+begin
+  SearchFiltered;
+end;
+
+procedure TFRMAccountSelect.cbMyAccountsClick(Sender: TObject);
+begin
+  SearchFiltered;
+end;
+
+procedure TFRMAccountSelect.cbMyPrivateKeysChange(Sender: TObject);
+begin
+  SearchFiltered;
+end;
+
+procedure TFRMAccountSelect.ebMaxBalanceExit(Sender: TObject);
+begin
+  if ebMaxBalance.text<>'' then begin
+    cbAccountsBalance.Checked:=True;
+    SearchFiltered;
+  end;
+end;
+
+procedure TFRMAccountSelect.ebMinBalanceExit(Sender: TObject);
+begin
+  if ebMinBalance.text<>'' then begin
+    cbAccountsBalance.Checked:=True;
+    SearchFiltered;
+  end;
+end;
+
+procedure TFRMAccountSelect.FormDestroy(Sender: TObject);
+begin
+  FSearchThread.Terminate;
+  FSearchThread.WaitFor;
+  FSearchThread.Free;
+  FAccounts.Free;
+end;
+
+procedure TFRMAccountSelect.SetNode(const Value: TNode);
+begin
+  FNode := Value;
+  FSafeBox := FNode.Bank.SafeBox;
+  UpdateControls;
+end;
+
+procedure TFRMAccountSelect.SetWalletKeys(const Value: TWalletKeys);
+begin
+  FWalletKeys := Value;
+  UpdateControls;
+  SearchFiltered;
+end;
+
+procedure TFRMAccountSelect.SearchFiltered;
+Var
+  i : Integer;
+  searchValues : TSearchValues;
+begin
+  FSearchThread.StopSearch;
+  searchValues.SafeBox := FSafeBox;
+  searchValues.inAccountKey := CT_AccountInfo_NUL.accountKey;
+  searchValues.inWalletKeys := Nil;
+  If (cbMyAccounts.Checked) And (Assigned(FWalletKeys)) then begin
+    If (cbMyPrivateKeys.ItemIndex<=0) then begin
+      // All
+      searchValues.inWalletKeys := FWalletKeys;
+    end else begin
+      i := PtrInt(cbMyPrivateKeys.Items.Objects[cbMyPrivateKeys.ItemIndex]);
+      if (i>=0) and (i<FWalletKeys.Count) then searchValues.inAccountKey := FWalletKeys.Key[i].AccountKey;
+    end;
+    cbMyPrivateKeys.ParentFont:=True;
+  end else begin
+    cbMyPrivateKeys.Font.Color := clGray;
+  end;
+  searchValues.onlyForSale := (cbOnlyForSale.Checked);
+  searchValues.onlyForPrivateSaleToMe := (cbOnlyForPrivateSaleToMe.Checked);
+  If searchValues.onlyForPrivateSaleToMe then begin
+    searchValues.inWalletKeys := FWalletKeys;
+  end;
+  searchValues.onlyForPublicSale := (cbOnlyForPublicSale.Checked);
+  If cbAccountsBalance.Checked then begin
+    If not TAccountComp.TxtToMoney(ebMinBalance.Text,searchValues.minBal) then Raise Exception.Create('Invalid Min Balance');
+    ebMinBalance.Text:=TAccountComp.FormatMoney(searchValues.minBal);
+    If Trim(ebMaxBalance.Text)='' then begin
+      ebMaxBalance.Text:='';
+      searchValues.maxBal:=-1;
+    end else begin
+      If not TAccountComp.TxtToMoney(ebMaxBalance.Text,searchValues.maxBal) then Raise Exception.Create('Invalid Max Balance');
+      ebMaxBalance.Text:=TAccountComp.FormatMoney(searchValues.maxBal);
+    end;
+    ebMinBalance.ParentFont:=True;
+    ebMaxBalance.ParentFont:=True;
+  end else begin
+    searchValues.minBal:=0;
+    searchValues.maxBal:=-1;
+    ebMinBalance.Font.Color:=clGray;
+    ebMaxBalance.Font.Color:=clGray;
+  end;
+  if (cbAccountsName.Checked) then begin
+    searchValues.searchName := LowerCase(Trim(ebAccountName.Text));
+    ebAccountName.ParentFont:=True;
+  end else begin
+    searchValues.searchName:='';
+    ebAccountName.Font.Color := clGray;
+  end;
+  If (searchValues.inAccountKey.EC_OpenSSL_NID=0) AND (searchValues.inWalletKeys=Nil) And (searchValues.maxBal<0) And (searchValues.minBal<=0) And
+     (Not searchValues.onlyForPrivateSaleToMe) And (Not searchValues.onlyForPublicSale) And (Not searchValues.onlyForSale) And
+     (searchValues.searchName='') then begin
+    FAccountsGrid.ShowAllAccounts:=True;
+    lblAccountsCount.Caption := IntToStr(FAccountsGrid.Node.Bank.SafeBox.AccountsCount);
+    lblAccountsBalance.Caption := TAccountComp.FormatMoney(FAccountsGrid.AccountsBalance);
+  end else begin
+    FAccountsGrid.ShowAllAccounts:=False;
+    FSearchThread.DoSearch(searchValues);
+  end;
+end;
+
+procedure TFRMAccountSelect.UpdateControls;
+var i : Integer;
+begin
+  cbMyAccounts.Enabled:=Assigned(FWalletKeys);
+  If not Assigned(FWalletKeys) then begin
+    cbMyAccounts.Checked:=False;
+    cbMyPrivateKeys.Enabled:=False;
+    cbMyPrivateKeys.Clear;
+  end else begin
+    cbMyPrivateKeys.Enabled:=True;
+    cbMyPrivateKeys.Items.BeginUpdate;
+    try
+      cbMyPrivateKeys.Items.Clear;
+      For i:=0 to FWalletKeys.Count-1 do begin
+        cbMyPrivateKeys.Items.AddObject(FWalletKeys.Key[i].Name,TObject(i));
+      end;
+      cbMyPrivateKeys.Sorted:=True;
+      cbMyPrivateKeys.Sorted:=False;
+      cbMyPrivateKeys.items.InsertObject(0,'(All)',TObject(-1));
+    finally
+      cbMyPrivateKeys.Items.EndUpdate;
+    end;
+  end;
+end;
+
+procedure TFRMAccountSelect.OnSearchFinished(const searchFound: TCardinalsArray; const searchValues: TSearchValues);
+Var l : TOrderedCardinalList;
+  i, foundpos : Integer;
+begin
+  foundpos := -1;
+  l := FAccountsGrid.LockAccountsList;
+  try
+    l.Clear;
+    for i:=0 to High(searchFound) do begin
+      l.Add(searchFound[i]);
+      If searchFound[i]=FDefaultAccount then foundpos := i;
+    end;
+    lblAccountsCount.Caption := inttostr(l.Count);
+  finally
+    FAccountsGrid.UnlockAccountsList;
+  end;
+  If foundpos>=0 then begin
+    FAccountsGrid.DrawGrid.Row := foundpos + 1;
+  end;
+end;
+
+procedure TFRMAccountSelect.OnAccountsGridUpdated(Sender: TObject);
+begin
+  lblAccountsBalance.Caption := TAccountComp.FormatMoney(FAccountsGrid.AccountsBalance);
+end;
+
+function TFRMAccountSelect.GetSelected: Int64;
+Var ocl : TOrderedCardinalList;
+begin
+  Result := -1;
+  ocl := TOrderedCardinalList.Create;
+  try
+    If FAccountsGrid.SelectedAccounts(ocl)=1 then Result := ocl.Get(0);
+  finally
+    ocl.Free;
+  end;
+end;
+
+end.

+ 66 - 0
src/gui-classic/UFRMMemoText.dfm

@@ -0,0 +1,66 @@
+object FRMMemoText: TFRMMemoText
+  Left = 0
+  Top = 0
+  BorderIcons = [biSystemMenu]
+  Caption = 'Information'
+  ClientHeight = 428
+  ClientWidth = 745
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poOwnerFormCenter
+  OnCreate = FormCreate
+  PixelsPerInch = 96
+  TextHeight = 13
+  object pnlBottom: TPanel
+    Left = 0
+    Top = 373
+    Width = 745
+    Height = 55
+    Align = alBottom
+    BevelOuter = bvNone
+    TabOrder = 0
+    ExplicitTop = 245
+    ExplicitWidth = 619
+    DesignSize = (
+      745
+      55)
+    object bbCancel: TBitBtn
+      Left = 620
+      Top = 14
+      Width = 116
+      Height = 31
+      Anchors = [akTop, akRight]
+      DoubleBuffered = True
+      Kind = bkCancel
+      ParentDoubleBuffered = False
+      TabOrder = 0
+      ExplicitLeft = 494
+    end
+  end
+  object Memo: TMemo
+    Left = 0
+    Top = 0
+    Width = 745
+    Height = 373
+    Align = alClient
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = []
+    Lines.Strings = (
+      'Memo')
+    ParentFont = False
+    ReadOnly = True
+    ScrollBars = ssBoth
+    TabOrder = 1
+    WordWrap = False
+    ExplicitWidth = 619
+    ExplicitHeight = 245
+  end
+end

+ 58 - 0
src/gui-classic/UFRMMemoText.lfm

@@ -0,0 +1,58 @@
+object FRMMemoText: TFRMMemoText
+  Left = 410
+  Height = 428
+  Top = 234
+  Width = 745
+  BorderIcons = [biSystemMenu, biMaximize]
+  Caption = 'Information'
+  ClientHeight = 428
+  ClientWidth = 745
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  Position = poOwnerFormCenter
+  LCLVersion = '1.8.0.6'
+  object pnlBottom: TPanel
+    Left = 0
+    Height = 55
+    Top = 373
+    Width = 745
+    Align = alBottom
+    BevelOuter = bvNone
+    ClientHeight = 55
+    ClientWidth = 745
+    TabOrder = 0
+    object bbCancel: TBitBtn
+      Left = 620
+      Height = 31
+      Top = 14
+      Width = 116
+      Anchors = [akTop, akRight]
+      Cancel = True
+      Caption = 'Close'
+      Kind = bkCancel
+      ModalResult = 2
+      TabOrder = 0
+    end
+  end
+  object Memo: TMemo
+    Left = 0
+    Height = 373
+    Top = 0
+    Width = 745
+    Align = alClient
+    Font.Color = clWindowText
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Lines.Strings = (
+      'Memo'
+    )
+    ParentFont = False
+    ReadOnly = True
+    ScrollBars = ssBoth
+    TabOrder = 1
+    WordWrap = False
+  end
+end

+ 46 - 0
src/gui-classic/UFRMMemoText.pas

@@ -0,0 +1,46 @@
+unit UFRMMemoText;
+
+interface
+
+uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls, Buttons, ExtCtrls;
+
+type
+  TFRMMemoText = class(TForm)
+    pnlBottom: TPanel;
+    Memo: TMemo;
+    bbCancel: TBitBtn;
+    procedure FormCreate(Sender: TObject);
+  private
+    { Private declarations }
+  public
+    { Public declarations }
+    Procedure InitData(const Title : String; const text : String);
+  end;
+
+implementation
+
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
+
+procedure TFRMMemoText.FormCreate(Sender: TObject);
+begin
+  Memo.Clear;
+end;
+
+procedure TFRMMemoText.InitData(const Title, text: String);
+begin
+  Caption := Title;
+  Memo.Lines.Text := text;
+end;
+
+end.

+ 86 - 0
src/gui-classic/UFRMNewPrivateKeyType.dfm

@@ -0,0 +1,86 @@
+object FRMNewPrivateKeyType: TFRMNewPrivateKeyType
+  Left = 0
+  Top = 0
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsDialog
+  Caption = 'New Private Key'
+  ClientHeight = 229
+  ClientWidth = 311
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poOwnerFormCenter
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  PixelsPerInch = 96
+  TextHeight = 13
+  object Label1: TLabel
+    Left = 30
+    Top = 25
+    Width = 27
+    Height = 13
+    Caption = 'Name'
+  end
+  object ebName: TEdit
+    Left = 70
+    Top = 22
+    Width = 206
+    Height = 21
+    TabOrder = 0
+    Text = 'ebName'
+  end
+  object rgKeyType: TRadioGroup
+    Left = 30
+    Top = 60
+    Width = 246
+    Height = 105
+    Caption = ' Key Type: '
+    Items.Strings = (
+      'asdf')
+    TabOrder = 1
+  end
+  object bbOk: TBitBtn
+    Left = 112
+    Top = 181
+    Width = 75
+    Height = 25
+    Caption = 'OK'
+    Default = True
+    DoubleBuffered = True
+    Glyph.Data = {
+      DE010000424DDE01000000000000760000002800000024000000120000000100
+      0400000000006801000000000000000000001000000000000000000000000000
+      80000080000000808000800000008000800080800000C0C0C000808080000000
+      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+      3333333333333333333333330000333333333333333333333333F33333333333
+      00003333344333333333333333388F3333333333000033334224333333333333
+      338338F3333333330000333422224333333333333833338F3333333300003342
+      222224333333333383333338F3333333000034222A22224333333338F338F333
+      8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
+      33333338F83338F338F33333000033A33333A222433333338333338F338F3333
+      0000333333333A222433333333333338F338F33300003333333333A222433333
+      333333338F338F33000033333333333A222433333333333338F338F300003333
+      33333333A222433333333333338F338F00003333333333333A22433333333333
+      3338F38F000033333333333333A223333333333333338F830000333333333333
+      333A333333333333333338330000333333333333333333333333333333333333
+      0000}
+    NumGlyphs = 2
+    ParentDoubleBuffered = False
+    TabOrder = 2
+    OnClick = bbOkClick
+  end
+  object bbCancel: TBitBtn
+    Left = 201
+    Top = 181
+    Width = 75
+    Height = 25
+    DoubleBuffered = True
+    Kind = bkCancel
+    ParentDoubleBuffered = False
+    TabOrder = 3
+  end
+end

+ 97 - 0
src/gui-classic/UFRMNewPrivateKeyType.lfm

@@ -0,0 +1,97 @@
+object FRMNewPrivateKeyType: TFRMNewPrivateKeyType
+  Left = 763
+  Height = 229
+  Top = 434
+  Width = 311
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsDialog
+  Caption = 'New Private Key'
+  ClientHeight = 229
+  ClientWidth = 311
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  Position = poOwnerFormCenter
+  LCLVersion = '1.8.0.6'
+  Visible = False
+  object Label1: TLabel
+    Left = 30
+    Height = 13
+    Top = 25
+    Width = 27
+    Caption = 'Name'
+    ParentColor = False
+  end
+  object ebName: TEdit
+    Left = 70
+    Height = 21
+    Top = 22
+    Width = 206
+    TabOrder = 0
+    Text = 'ebName'
+  end
+  object rgKeyType: TRadioGroup
+    Left = 30
+    Height = 105
+    Top = 60
+    Width = 246
+    AutoFill = True
+    Caption = ' Key Type: '
+    ChildSizing.LeftRightSpacing = 6
+    ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+    ChildSizing.EnlargeVertical = crsHomogenousChildResize
+    ChildSizing.ShrinkHorizontal = crsScaleChilds
+    ChildSizing.ShrinkVertical = crsScaleChilds
+    ChildSizing.Layout = cclLeftToRightThenTopToBottom
+    ChildSizing.ControlsPerLine = 1
+    ClientHeight = 87
+    ClientWidth = 242
+    Items.Strings = (
+      'asdf'
+    )
+    TabOrder = 1
+  end
+  object bbOk: TBitBtn
+    Left = 112
+    Height = 25
+    Top = 181
+    Width = 75
+    Caption = 'OK'
+    Default = True
+    Glyph.Data = {
+      DE010000424DDE01000000000000760000002800000024000000120000000100
+      0400000000006801000000000000000000001000000000000000000000000000
+      80000080000000808000800000008000800080800000C0C0C000808080000000
+      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+      3333333333333333333333330000333333333333333333333333F33333333333
+      00003333344333333333333333388F3333333333000033334224333333333333
+      338338F3333333330000333422224333333333333833338F3333333300003342
+      222224333333333383333338F3333333000034222A22224333333338F338F333
+      8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
+      33333338F83338F338F33333000033A33333A222433333338333338F338F3333
+      0000333333333A222433333333333338F338F33300003333333333A222433333
+      333333338F338F33000033333333333A222433333333333338F338F300003333
+      33333333A222433333333333338F338F00003333333333333A22433333333333
+      3338F38F000033333333333333A223333333333333338F830000333333333333
+      333A333333333333333338330000333333333333333333333333333333333333
+      0000
+    }
+    NumGlyphs = 2
+    OnClick = bbOkClick
+    TabOrder = 2
+  end
+  object bbCancel: TBitBtn
+    Left = 201
+    Height = 25
+    Top = 181
+    Width = 75
+    Cancel = True
+    Caption = 'Cancel'
+    Kind = bkCancel
+    ModalResult = 2
+    TabOrder = 3
+  end
+end

+ 106 - 0
src/gui-classic/UFRMNewPrivateKeyType.pas

@@ -0,0 +1,106 @@
+unit UFRMNewPrivateKeyType;
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{ Copyright (c) 2016 by Albert Molina
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  This unit is a part of Pascal Coin, a P2P crypto currency without need of
+  historical operations.
+
+  If you like it, consider a donation using BitCoin:
+  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
+
+  }
+
+interface
+
+uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls, Buttons, ExtCtrls, UWallet,UCrypto;
+
+type
+  TFRMNewPrivateKeyType = class(TForm)
+    Label1: TLabel;
+    ebName: TEdit;
+    rgKeyType: TRadioGroup;
+    bbOk: TBitBtn;
+    bbCancel: TBitBtn;
+    procedure FormCreate(Sender: TObject);
+    procedure bbOkClick(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+  private
+    FWalletKeys: TWalletKeys;
+    FGeneratedPrivateKey: TECPrivateKey;
+    procedure SetWalletKeys(const Value: TWalletKeys);
+    { Private declarations }
+  public
+    { Public declarations }
+    Property WalletKeys : TWalletKeys read FWalletKeys write SetWalletKeys;
+    Property GeneratedPrivateKey : TECPrivateKey read FGeneratedPrivateKey write FGeneratedPrivateKey;
+  end;
+
+
+implementation
+
+uses
+  UAccounts, UConst ;
+
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
+
+procedure TFRMNewPrivateKeyType.bbOkClick(Sender: TObject);
+begin
+  if Not Assigned(WalletKeys) then exit;
+  if rgKeyType.ItemIndex<0 then raise Exception.Create('Select a key type');
+
+  if Assigned(FGeneratedPrivateKey) then FGeneratedPrivateKey.Free;
+
+  FGeneratedPrivateKey := TECPrivateKey.Create;
+  FGeneratedPrivateKey.GenerateRandomPrivateKey( PtrInt(rgKeyType.Items.Objects[rgKeyType.ItemIndex]) );
+  WalletKeys.AddPrivateKey(ebName.Text,FGeneratedPrivateKey);
+  ModalResult := MrOk;
+end;
+
+procedure TFRMNewPrivateKeyType.FormCreate(Sender: TObject);
+Var l : TList;
+  i : Integer;
+begin
+  FGeneratedPrivateKey := Nil;
+  FWalletKeys := Nil;
+  ebName.Text := DateTimeToStr(now);
+  rgKeyType.Items.Clear;
+  l := TList.Create;
+  Try
+    TAccountComp.ValidsEC_OpenSSL_NID(l);
+    for i := 0 to l.Count - 1 do begin
+      rgKeyType.Items.AddObject(TAccountComp.GetECInfoTxt(PtrInt(l[i])),l[i]);
+    end;
+  Finally
+    l.free;
+  End;
+end;
+
+procedure TFRMNewPrivateKeyType.FormDestroy(Sender: TObject);
+begin
+  FreeAndNil(FGeneratedPrivateKey);
+end;
+
+procedure TFRMNewPrivateKeyType.SetWalletKeys(const Value: TWalletKeys);
+begin
+  FWalletKeys := Value;
+end;
+
+end.

+ 86 - 0
src/gui-classic/UFRMNodesIp.dfm

@@ -0,0 +1,86 @@
+object FRMNodesIp: TFRMNodesIp
+  Left = 0
+  Top = 0
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'Nodes IP'
+  ClientHeight = 367
+  ClientWidth = 334
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poOwnerFormCenter
+  OnCreate = FormCreate
+  PixelsPerInch = 96
+  TextHeight = 13
+  object Label1: TLabel
+    Left = 30
+    Top = 25
+    Width = 143
+    Height = 13
+    Caption = 'Available Nodes Ip to connect'
+  end
+  object memoNodesIp: TMemo
+    Left = 30
+    Top = 45
+    Width = 276
+    Height = 226
+    Lines.Strings = (
+      'memoNodesIp')
+    ScrollBars = ssBoth
+    TabOrder = 0
+  end
+  object bbOk: TBitBtn
+    Left = 138
+    Top = 317
+    Width = 75
+    Height = 25
+    Caption = 'OK'
+    Default = True
+    DoubleBuffered = True
+    Glyph.Data = {
+      DE010000424DDE01000000000000760000002800000024000000120000000100
+      0400000000006801000000000000000000001000000000000000000000000000
+      80000080000000808000800000008000800080800000C0C0C000808080000000
+      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+      3333333333333333333333330000333333333333333333333333F33333333333
+      00003333344333333333333333388F3333333333000033334224333333333333
+      338338F3333333330000333422224333333333333833338F3333333300003342
+      222224333333333383333338F3333333000034222A22224333333338F338F333
+      8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
+      33333338F83338F338F33333000033A33333A222433333338333338F338F3333
+      0000333333333A222433333333333338F338F33300003333333333A222433333
+      333333338F338F33000033333333333A222433333333333338F338F300003333
+      33333333A222433333333333338F338F00003333333333333A22433333333333
+      3338F38F000033333333333333A223333333333333338F830000333333333333
+      333A333333333333333338330000333333333333333333333333333333333333
+      0000}
+    NumGlyphs = 2
+    ParentDoubleBuffered = False
+    TabOrder = 1
+    OnClick = bbOkClick
+  end
+  object bbCancel: TBitBtn
+    Left = 231
+    Top = 317
+    Width = 75
+    Height = 25
+    DoubleBuffered = True
+    Kind = bkCancel
+    ParentDoubleBuffered = False
+    TabOrder = 2
+  end
+  object cbTryOnlyWithThisServers: TCheckBox
+    Left = 35
+    Top = 285
+    Width = 271
+    Height = 17
+    Caption = 'Try to connect ONLY with this servers'
+    TabOrder = 3
+    OnClick = cbTryOnlyWithThisServersClick
+  end
+end

+ 87 - 0
src/gui-classic/UFRMNodesIp.lfm

@@ -0,0 +1,87 @@
+object FRMNodesIp: TFRMNodesIp
+  Left = 716
+  Height = 367
+  Top = 383
+  Width = 334
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'Node IP Addresses'
+  ClientHeight = 367
+  ClientWidth = 334
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  Position = poOwnerFormCenter
+  LCLVersion = '1.8.0.6'
+  Visible = False
+  object Label1: TLabel
+    Left = 30
+    Height = 13
+    Top = 25
+    Width = 143
+    Caption = 'Availble Node IP''s to connect:'
+    ParentColor = False
+  end
+  object memoNodesIp: TMemo
+    Left = 30
+    Height = 226
+    Top = 45
+    Width = 276
+    Lines.Strings = (
+      'memoNodesIp'
+    )
+    ScrollBars = ssBoth
+    TabOrder = 0
+  end
+  object bbOk: TBitBtn
+    Left = 138
+    Height = 25
+    Top = 317
+    Width = 75
+    Caption = 'OK'
+    Default = True
+    Glyph.Data = {
+      DE010000424DDE01000000000000760000002800000024000000120000000100
+      0400000000006801000000000000000000001000000000000000000000000000
+      80000080000000808000800000008000800080800000C0C0C000808080000000
+      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+      3333333333333333333333330000333333333333333333333333F33333333333
+      00003333344333333333333333388F3333333333000033334224333333333333
+      338338F3333333330000333422224333333333333833338F3333333300003342
+      222224333333333383333338F3333333000034222A22224333333338F338F333
+      8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
+      33333338F83338F338F33333000033A33333A222433333338333338F338F3333
+      0000333333333A222433333333333338F338F33300003333333333A222433333
+      333333338F338F33000033333333333A222433333333333338F338F300003333
+      33333333A222433333333333338F338F00003333333333333A22433333333333
+      3338F38F000033333333333333A223333333333333338F830000333333333333
+      333A333333333333333338330000333333333333333333333333333333333333
+      0000
+    }
+    NumGlyphs = 2
+    OnClick = bbOkClick
+    TabOrder = 1
+  end
+  object bbCancel: TBitBtn
+    Left = 231
+    Height = 25
+    Top = 317
+    Width = 75
+    Cancel = True
+    Caption = 'Cancel'
+    Kind = bkCancel
+    ModalResult = 2
+    TabOrder = 2
+  end
+  object cbTryOnlyWithThisServers: TCheckBox
+    Left = 35
+    Height = 19
+    Top = 285
+    Width = 164
+    Caption = 'Connect ONLY to these nodes'
+    OnClick = cbTryOnlyWithThisServersClick
+    TabOrder = 3
+  end
+end

+ 138 - 0
src/gui-classic/UFRMNodesIp.pas

@@ -0,0 +1,138 @@
+unit UFRMNodesIp;
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+interface
+
+uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls, Buttons, UAppParams,
+  UCommon.UI;
+
+type
+  TFRMNodesIp = class(TForm)
+    memoNodesIp: TMemo;
+    Label1: TLabel;
+    bbOk: TBitBtn;
+    bbCancel: TBitBtn;
+    cbTryOnlyWithThisServers: TCheckBox;
+    procedure bbOkClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure cbTryOnlyWithThisServersClick(Sender: TObject);
+  private
+    FAppParams: TAppParams;
+    procedure SetAppParams(const Value: TAppParams);
+    { Private declarations }
+  public
+    { Public declarations }
+    Procedure PrepareData;
+    Property AppParams : TAppParams read FAppParams write SetAppParams;
+  end;
+
+implementation
+
+uses
+  UNetProtocol, UNode, UConst, USettings;
+
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
+
+{ TFRMNodesIp }
+
+procedure TFRMNodesIp.bbOkClick(Sender: TObject);
+Var nsarr : TNodeServerAddressArray;
+  ips : AnsiString;
+begin
+  TNode.DecodeIpStringToNodeServerAddressArray(memoNodesIp.Lines.Text,nsarr);
+  if (length(nsarr)=0) And (cbTryOnlyWithThisServers.Checked) then begin
+    raise Exception.Create('No valid IP in list!');
+  end;
+  // Encode
+  ips := TNode.EncodeNodeServerAddressArrayToIpString(nsarr);
+  if Assigned(FAppParams) then begin
+    FAppParams.ParamByName[CT_PARAM_PeerCache].SetAsString(ips);
+    if cbTryOnlyWithThisServers.Checked then Begin
+      FAppParams.ParamByName[CT_PARAM_TryToConnectOnlyWithThisFixedServers].SetAsString(ips);
+      TNetData.NetData.DiscoverFixedServersOnly(nsarr);
+      Application.MessageBox(PChar('Restart application to take effect'),PChar(Application.Title),MB_OK);
+    end else begin
+      FAppParams.ParamByName[CT_PARAM_TryToConnectOnlyWithThisFixedServers].SetAsString('');
+      setlength(nsarr,0);
+      TNetData.NetData.DiscoverFixedServersOnly(nsarr);
+    end;
+  end;
+  setlength(nsarr,0);
+  ModalResult := MrOk;
+end;
+
+procedure TFRMNodesIp.cbTryOnlyWithThisServersClick(Sender: TObject);
+begin
+  if cbTryOnlyWithThisServers.Checked then begin
+    cbTryOnlyWithThisServers.Font.Color := clRed;
+    cbTryOnlyWithThisServers.Font.Style := [fsBold];
+  end else begin
+    cbTryOnlyWithThisServers.ParentFont := true;
+  end;
+  if cbTryOnlyWithThisServers.Checked then begin
+    Application.MessageBox(PChar('ALERT:'+#10+
+      'If "'+cbTryOnlyWithThisServers.Caption+'" is checked '+#10+
+      'and no valid server found, you will be alone!')
+      ,PChar(Application.Title),MB_OK+MB_ICONWARNING);
+  end;
+end;
+
+procedure TFRMNodesIp.FormCreate(Sender: TObject);
+begin
+  FAppParams := Nil;
+  PrepareData;
+end;
+
+procedure TFRMNodesIp.PrepareData;
+Var
+  nsarr : TNodeServerAddressArray;
+  i : Integer;
+  ips : AnsiString;
+  aux : AnsiString;
+begin
+  memoNodesIp.Clear;
+  if Not Assigned(FAppParams) then exit;
+  setlength(nsarr,0);
+  ips := FAppParams.ParamByName[CT_PARAM_TryToConnectOnlyWithThisFixedServers].GetAsString('');
+  if trim(ips)<>'' then begin
+    cbTryOnlyWithThisServers.Checked := true;
+    TNode.DecodeIpStringToNodeServerAddressArray(ips,nsarr);
+  end else begin
+    cbTryOnlyWithThisServers.Checked := false;
+    nsarr := TNetData.NetData.NodeServersAddresses.GetValidNodeServers(false,0);
+  end;
+  for i := low(nsarr) to high(nsarr) do begin
+    aux := nsarr[i].ip;
+    if nsarr[i].port>0 then aux := aux +':'+ InttoStr(nsarr[i].port);
+    memoNodesIp.Lines.Add( aux );
+  end;
+  if cbTryOnlyWithThisServers.Checked then begin
+    cbTryOnlyWithThisServers.Font.Color := clRed;
+    cbTryOnlyWithThisServers.Font.Style := [fsBold];
+  end else begin
+    cbTryOnlyWithThisServers.ParentFont := true;
+  end;
+  setlength(nsarr,0);
+end;
+
+procedure TFRMNodesIp.SetAppParams(const Value: TAppParams);
+begin
+  FAppParams := Value;
+  PrepareData;
+end;
+
+end.

+ 1100 - 0
src/gui-classic/UFRMOperation.dfm

@@ -0,0 +1,1100 @@
+object FRMOperation: TFRMOperation
+  Left = 498
+  Top = 222
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'New Operation'
+  ClientHeight = 493
+  ClientWidth = 608
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = True
+  Position = poOwnerFormCenter
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  PixelsPerInch = 96
+  TextHeight = 13
+  object lblAccountCaption: TLabel
+    Left = 25
+    Top = 20
+    Width = 43
+    Height = 13
+    Caption = 'Account:'
+    Color = clBtnFace
+    ParentColor = False
+  end
+  object lblAccountBalance: TLabel
+    Left = 432
+    Top = 15
+    Width = 149
+    Height = 19
+    Caption = 'lblAccountBalance'
+    Color = clBtnFace
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clGreen
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object lblBalanceCaption: TLabel
+    Left = 387
+    Top = 20
+    Width = 41
+    Height = 13
+    Caption = 'Balance:'
+    Color = clBtnFace
+    ParentColor = False
+  end
+  object lblAccountsCount: TLabel
+    Left = 387
+    Top = 58
+    Width = 18
+    Height = 13
+    Caption = 'XXX'
+    Color = clBtnFace
+    ParentColor = False
+  end
+  object bbExecute: TBitBtn
+    Left = 300
+    Top = 445
+    Width = 130
+    Height = 31
+    Caption = 'Execute (F12)'
+    DoubleBuffered = True
+    Glyph.Data = {
+      DE010000424DDE01000000000000760000002800000024000000120000000100
+      0400000000006801000000000000000000001000000000000000000000000000
+      80000080000000808000800000008000800080800000C0C0C000808080000000
+      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+      3333333333333333333333330000333333333333333333333333F33333333333
+      00003333344333333333333333388F3333333333000033334224333333333333
+      338338F3333333330000333422224333333333333833338F3333333300003342
+      222224333333333383333338F3333333000034222A22224333333338F338F333
+      8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
+      33333338F83338F338F33333000033A33333A222433333338333338F338F3333
+      0000333333333A222433333333333338F338F33300003333333333A222433333
+      333333338F338F33000033333333333A222433333333333338F338F300003333
+      33333333A222433333333333338F338F00003333333333333A22433333333333
+      3338F38F000033333333333333A223333333333333338F830000333333333333
+      333A333333333333333338330000333333333333333333333333333333333333
+      0000}
+    NumGlyphs = 2
+    ParentDoubleBuffered = False
+    TabOrder = 2
+    OnClick = actExecuteExecute
+  end
+  object bbCancel: TBitBtn
+    Left = 465
+    Top = 445
+    Width = 116
+    Height = 31
+    DoubleBuffered = True
+    Kind = bkCancel
+    ParentDoubleBuffered = False
+    TabOrder = 3
+  end
+  object PageControlLocked: TPageControl
+    Left = 25
+    Top = 72
+    Width = 556
+    Height = 351
+    ActivePage = tsOperation
+    TabOrder = 1
+    object tsOperation: TTabSheet
+      TabVisible = False
+      ExplicitLeft = 0
+      ExplicitTop = 0
+      ExplicitWidth = 0
+      ExplicitHeight = 0
+      object lblFee: TLabel
+        Left = 15
+        Top = 188
+        Width = 69
+        Height = 13
+        Caption = 'Operation Fee'
+        Color = clBtnFace
+        ParentColor = False
+      end
+      object lblSignerAccount: TLabel
+        Left = 176
+        Top = 188
+        Width = 131
+        Height = 13
+        Caption = 'Signer account (Fee payer)'
+        Color = clBtnFace
+        ParentColor = False
+      end
+      object sbSearchSignerAccount: TSpeedButton
+        Left = 411
+        Top = 184
+        Width = 23
+        Height = 22
+        Glyph.Data = {
+          36030000424D3603000000000000360000002800000010000000100000000100
+          18000000000000030000120B0000120B00000000000000000000FF00FF4A667C
+          BE9596FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+          FFFF00FFFF00FFFF00FF6B9CC31E89E84B7AA3C89693FF00FFFF00FFFF00FFFF
+          00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF4BB4FE51B5FF
+          2089E94B7AA2C69592FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+          FFFF00FFFF00FFFF00FFFF00FF51B7FE51B3FF1D87E64E7AA0CA9792FF00FFFF
+          00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+          51B7FE4EB2FF1F89E64E7BA2B99497FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+          FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF52B8FE4BB1FF2787D95F6A76FF
+          00FFB0857FC09F94C09F96BC988EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+          FF00FFFF00FF55BDFFB5D6EDBF9D92BB9B8CE7DAC2FFFFE3FFFFE5FDFADAD8C3
+          B3B58D85FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFCEA795FD
+          EEBEFFFFD8FFFFDAFFFFDBFFFFE6FFFFFBEADDDCAE837FFF00FFFF00FFFF00FF
+          FF00FFFF00FFFF00FFFF00FFC1A091FBDCA8FEF7D0FFFFDBFFFFE3FFFFF8FFFF
+          FDFFFFFDC6A99CFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC1A091FEE3ACF1
+          C491FCF2CAFFFFDDFFFFE4FFFFF7FFFFF7FFFFE9EEE5CBB9948CFF00FFFF00FF
+          FF00FFFF00FFFF00FFC2A191FFE6AEEEB581F7DCAEFEFDD8FFFFDFFFFFE3FFFF
+          E4FFFFE0F3ECD2BB968EFF00FFFF00FFFF00FFFF00FFFF00FFBC978CFBE7B7F4
+          C791F2C994F8E5B9FEFCD8FFFFDDFFFFDCFFFFE0E2D2BAB68E86FF00FFFF00FF
+          FF00FFFF00FFFF00FFFF00FFD9C3A9FFFEE5F7DCB8F2C994F5D4A5FAE8BDFDF4
+          C9FDFBD6B69089FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB58D85E8
+          DEDDFFFEF2F9D8A3F4C48CF9D49FFDEAB8D0B49FB89086FF00FFFF00FFFF00FF
+          FF00FFFF00FFFF00FFFF00FFFF00FFAD827FC9AA9EEFE0B7EFDFB2E7CEACB890
+          86B89086FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+          00FFFF00FFBA968ABB988CB79188FF00FFFF00FFFF00FFFF00FF}
+        OnClick = sbSearchSignerAccountClick
+      end
+      object gbPayload: TGroupBox
+        Left = 13
+        Top = 211
+        Width = 521
+        Height = 119
+        Caption = ' Payload: '
+        TabOrder = 2
+        object lblEncryptPassword: TLabel
+          Left = 38
+          Top = 76
+          Width = 50
+          Height = 13
+          Caption = 'Password:'
+          Color = clBtnFace
+          ParentColor = False
+        end
+        object Label4: TLabel
+          Left = 255
+          Top = 15
+          Width = 67
+          Height = 13
+          Caption = 'Payload data:'
+          Color = clBtnFace
+          ParentColor = False
+        end
+        object lblEncryptionErrors: TLabel
+          Left = 255
+          Top = 96
+          Width = 246
+          Height = 13
+          AutoSize = False
+          Caption = 'Errors detected'
+          Color = clBtnFace
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clRed
+          Font.Height = -11
+          Font.Name = 'Tahoma'
+          Font.Style = []
+          ParentColor = False
+          ParentFont = False
+        end
+        object lblPayloadLength: TLabel
+          Left = 483
+          Top = 15
+          Width = 18
+          Height = 13
+          Alignment = taRightJustify
+          Caption = '000'
+          Color = clBtnFace
+          ParentColor = False
+        end
+        object rbEncryptedWithEC: TRadioButton
+          Left = 15
+          Top = 35
+          Width = 207
+          Height = 19
+          Caption = 'Encrypted with dest account public key'
+          Checked = True
+          TabOrder = 1
+          TabStop = True
+          OnClick = memoPayloadClick
+        end
+        object rbEncrptedWithPassword: TRadioButton
+          Left = 15
+          Top = 53
+          Width = 141
+          Height = 19
+          Caption = 'Encrypted with password'
+          TabOrder = 2
+          OnClick = memoPayloadClick
+        end
+        object rbNotEncrypted: TRadioButton
+          Left = 15
+          Top = 93
+          Width = 162
+          Height = 19
+          Caption = 'Dont encrypt (Public payload)'
+          TabOrder = 4
+          OnClick = memoPayloadClick
+        end
+        object ebEncryptPassword: TEdit
+          Left = 94
+          Top = 73
+          Width = 122
+          Height = 21
+          TabOrder = 3
+          OnChange = ebEncryptPasswordChange
+          OnClick = memoPayloadClick
+        end
+        object memoPayload: TMemo
+          Left = 255
+          Top = 37
+          Width = 246
+          Height = 57
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clBlack
+          Font.Height = -16
+          Font.Name = 'Tahoma'
+          Font.Style = []
+          ParentFont = False
+          TabOrder = 5
+          WantReturns = False
+          OnChange = memoPayloadClick
+          OnClick = memoPayloadClick
+        end
+        object rbEncryptedWithOldEC: TRadioButton
+          Left = 15
+          Top = 16
+          Width = 159
+          Height = 19
+          Caption = 'Encrypted with old public key'
+          TabOrder = 0
+          OnClick = memoPayloadClick
+        end
+      end
+      object ebFee: TEdit
+        Left = 90
+        Top = 184
+        Width = 70
+        Height = 21
+        TabOrder = 1
+      end
+      object PageControlOpType: TPageControl
+        Left = 13
+        Top = 11
+        Width = 521
+        Height = 167
+        ActivePage = tsChangeInfo
+        TabOrder = 0
+        OnChange = PageControlOpTypeChange
+        object tsTransaction: TTabSheet
+          Caption = 'Transaction'
+          ExplicitLeft = 0
+          ExplicitTop = 0
+          ExplicitWidth = 0
+          ExplicitHeight = 0
+          object lblDestAccount: TLabel
+            Left = 13
+            Top = 32
+            Width = 95
+            Height = 13
+            Caption = 'Destination account'
+            Color = clBtnFace
+            ParentColor = False
+          end
+          object lblAmount: TLabel
+            Left = 72
+            Top = 61
+            Width = 37
+            Height = 13
+            Caption = 'Amount'
+            Color = clBtnFace
+            ParentColor = False
+          end
+          object lblTransactionErrors: TLabel
+            Left = 13
+            Top = 10
+            Width = 331
+            Height = 13
+            AutoSize = False
+            Caption = 'Errors detected'
+            Color = clBtnFace
+            Font.Charset = DEFAULT_CHARSET
+            Font.Color = clRed
+            Font.Height = -11
+            Font.Name = 'Tahoma'
+            Font.Style = []
+            ParentColor = False
+            ParentFont = False
+          end
+          object sbSearchDestinationAccount: TSpeedButton
+            Left = 208
+            Top = 29
+            Width = 23
+            Height = 22
+            Glyph.Data = {
+              36030000424D3603000000000000360000002800000010000000100000000100
+              18000000000000030000120B0000120B00000000000000000000FF00FF4A667C
+              BE9596FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FF6B9CC31E89E84B7AA3C89693FF00FFFF00FFFF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF4BB4FE51B5FF
+              2089E94B7AA2C69592FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FF51B7FE51B3FF1D87E64E7AA0CA9792FF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              51B7FE4EB2FF1F89E64E7BA2B99497FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF52B8FE4BB1FF2787D95F6A76FF
+              00FFB0857FC09F94C09F96BC988EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              FF00FFFF00FF55BDFFB5D6EDBF9D92BB9B8CE7DAC2FFFFE3FFFFE5FDFADAD8C3
+              B3B58D85FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFCEA795FD
+              EEBEFFFFD8FFFFDAFFFFDBFFFFE6FFFFFBEADDDCAE837FFF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFC1A091FBDCA8FEF7D0FFFFDBFFFFE3FFFFF8FFFF
+              FDFFFFFDC6A99CFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC1A091FEE3ACF1
+              C491FCF2CAFFFFDDFFFFE4FFFFF7FFFFF7FFFFE9EEE5CBB9948CFF00FFFF00FF
+              FF00FFFF00FFFF00FFC2A191FFE6AEEEB581F7DCAEFEFDD8FFFFDFFFFFE3FFFF
+              E4FFFFE0F3ECD2BB968EFF00FFFF00FFFF00FFFF00FFFF00FFBC978CFBE7B7F4
+              C791F2C994F8E5B9FEFCD8FFFFDDFFFFDCFFFFE0E2D2BAB68E86FF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFD9C3A9FFFEE5F7DCB8F2C994F5D4A5FAE8BDFDF4
+              C9FDFBD6B69089FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB58D85E8
+              DEDDFFFEF2F9D8A3F4C48CF9D49FFDEAB8D0B49FB89086FF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFAD827FC9AA9EEFE0B7EFDFB2E7CEACB890
+              86B89086FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FFBA968ABB988CB79188FF00FFFF00FFFF00FFFF00FF}
+            OnClick = sbSearchDestinationAccountClick
+          end
+          object ebDestAccount: TEdit
+            Left = 115
+            Top = 29
+            Width = 87
+            Height = 21
+            TabOrder = 0
+          end
+          object ebAmount: TEdit
+            Left = 115
+            Top = 58
+            Width = 87
+            Height = 21
+            TabOrder = 1
+          end
+        end
+        object tsChangePrivateKey: TTabSheet
+          Caption = 'Change key'
+          ImageIndex = 1
+          ExplicitLeft = 0
+          ExplicitTop = 0
+          ExplicitWidth = 0
+          ExplicitHeight = 0
+          object gbChangeKey: TGroupBox
+            Left = 7
+            Top = 6
+            Width = 488
+            Height = 118
+            Caption = ' Change type: '
+            TabOrder = 0
+            object lblNewPrivateKey: TLabel
+              Left = 57
+              Top = 40
+              Width = 78
+              Height = 13
+              Caption = 'New private key'
+              Color = clBtnFace
+              ParentColor = False
+            end
+            object lblNewOwnerPublicKey: TLabel
+              Left = 24
+              Top = 90
+              Width = 109
+              Height = 13
+              Caption = 'New owners public key'
+              Color = clBtnFace
+              ParentColor = False
+            end
+            object lblNewOwnerErrors: TLabel
+              Left = 173
+              Top = 68
+              Width = 302
+              Height = 13
+              Alignment = taRightJustify
+              AutoSize = False
+              Caption = 'Errors detected'
+              Color = clBtnFace
+              Font.Charset = DEFAULT_CHARSET
+              Font.Color = clRed
+              Font.Height = -11
+              Font.Name = 'Tahoma'
+              Font.Style = []
+              ParentColor = False
+              ParentFont = False
+            end
+            object lblChangeKeyErrors: TLabel
+              Left = 145
+              Top = 15
+              Width = 331
+              Height = 13
+              Alignment = taRightJustify
+              AutoSize = False
+              Caption = 'Errors detected'
+              Color = clBtnFace
+              Font.Charset = DEFAULT_CHARSET
+              Font.Color = clRed
+              Font.Height = -11
+              Font.Name = 'Tahoma'
+              Font.Style = []
+              ParentColor = False
+              ParentFont = False
+            end
+            object rbChangeKeyWithAnother: TRadioButton
+              Left = 12
+              Top = 20
+              Width = 114
+              Height = 19
+              Caption = 'Change private key'
+              TabOrder = 0
+            end
+            object cbNewPrivateKey: TComboBox
+              Left = 145
+              Top = 37
+              Width = 294
+              Height = 21
+              Style = csDropDownList
+              Sorted = True
+              TabOrder = 1
+            end
+            object ebNewPublicKey: TEdit
+              Left = 144
+              Top = 87
+              Width = 331
+              Height = 21
+              TabOrder = 4
+            end
+            object bbChangePrivateKeyKeys: TBitBtn
+              Left = 445
+              Top = 36
+              Width = 31
+              Height = 22
+              DoubleBuffered = True
+              Glyph.Data = {
+                36050000424D3605000000000000360400002800000010000000100000000100
+                0800000000000001000000000000000000000001000000010000FF00FF008C6B
+                6C0087707000AE877C000D7FA9006F7C88006D7C94001F7ECE000E80AA001180
+                A7001081AB00048CB900078DBC000B8DBA000C8DBA00088EBC001285B0007882
+                95006092BD005EA8BE000A91C1000F9DCE002087DE0011A7D10030BCDC001F89
+                E00059A9DC0044BADD004ABFE00057AEF4004DB1F90049B2FF004EB7FF0057B1
+                F60050B6FE0022D7FC0024D7FF0024D8FD0039D7FB0035D8FD004BC6DC0046C6
+                E40048D5EE0075D3E90058E9FD006FE6FF0070E6FF0071F9FE007BFFFF008683
+                88008B8697008F989B00969594009C919000AD858000AD868500AB939500A49E
+                9900B1979400B5A09F008AA5AD00CAA08C00CDAC9300C2A69A00F3BE8000C6AE
+                A000CFB7A100D3BBA200F4C88E00F5CB9A00F5D09C00F8D09800DAC5B700E4CC
+                A900EFD2A900ECD1AC00F6DAAB00F5DEB500F5E1B600F9E1B100FEEAB900FFF2
+                BA00A1C6C8008DE6FA0081F8FE008CFAFD008DFCFE0097FCFD009BFBFD00B8ED
+                F600A7FFFF00AAFFFE00ADFFFE00B6F6FF00B1FCFD00B4FFFF00ECDDCC00E8DD
+                D600FFF7C600FCF5CD00FCF7D100FAF6D600FFFBD500FEFED600F7F2D900FEFF
+                D900FFFEDD00C6F5FF00C6FEFF00D2FFFF00FEF7E000FBFCE100FDFFE100FFFF
+                E400E3FEFF00F9F6F200FFFFF400F1FBFC00F5FFFE00FBFFFF00000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                00000000000000000605000004080408080A000000000011191A000B2A23272D
+                531B080000001116201D0B552C23272E531C1509003207201D000F552C23272B
+                3A3F41030112202000000F552C252938606771684236200000000B5F5D6B3B61
+                74676A67513D000000000B59181735716A676A63474B360000000F282C23396A
+                6A6A6A4C404D360000000B552C2534656A654F455049360000000B552C251343
+                6247446E7336000000000B552C25263C3E4B4E483636000000000F55542F3057
+                523331020000000000000B77766D5F5C5C5C2F08000000000000001476726C5C
+                5A58100000000000000000000F0F0B0F0F0F0000000000000000}
+              ParentDoubleBuffered = False
+              TabOrder = 2
+              OnClick = bbChangePrivateKeyKeysClick
+            end
+            object rbChangeKeyTransferAccountToNewOwner: TRadioButton
+              Left = 12
+              Top = 67
+              Width = 180
+              Height = 19
+              Caption = 'Transfer account to a new owner'
+              TabOrder = 3
+            end
+          end
+        end
+        object tsListForSale: TTabSheet
+          Caption = 'List account for sale'
+          ImageIndex = 3
+          ExplicitLeft = 0
+          ExplicitTop = 0
+          ExplicitWidth = 0
+          ExplicitHeight = 0
+          object gbSaleType: TGroupBox
+            Left = 7
+            Top = 5
+            Width = 499
+            Height = 131
+            Caption = ' Sale type: '
+            TabOrder = 0
+            object Label1: TLabel
+              Left = 81
+              Top = 62
+              Width = 50
+              Height = 13
+              Caption = 'Sale price:'
+              Color = clBtnFace
+              ParentColor = False
+            end
+            object Label3: TLabel
+              Left = 229
+              Top = 62
+              Width = 142
+              Height = 13
+              Caption = 'Seller account (where to pay)'
+              Color = clBtnFace
+              ParentColor = False
+            end
+            object lblSaleNewOwnerPublicKey: TLabel
+              Left = 20
+              Top = 85
+              Width = 109
+              Height = 13
+              Caption = 'New owners public key'
+              Color = clBtnFace
+              ParentColor = False
+            end
+            object lblSaleLockedUntilBlock: TLabel
+              Left = 44
+              Top = 109
+              Width = 87
+              Height = 13
+              Caption = 'Locked until block:'
+              Color = clBtnFace
+              ParentColor = False
+            end
+            object lblListAccountErrors: TLabel
+              Left = 145
+              Top = 15
+              Width = 331
+              Height = 13
+              Alignment = taRightJustify
+              AutoSize = False
+              Caption = 'Errors detected'
+              Color = clBtnFace
+              Font.Charset = DEFAULT_CHARSET
+              Font.Color = clRed
+              Font.Height = -11
+              Font.Name = 'Tahoma'
+              Font.Style = []
+              ParentColor = False
+              ParentFont = False
+            end
+            object sbSearchListerSellerAccount: TSpeedButton
+              Left = 467
+              Top = 59
+              Width = 23
+              Height = 22
+              Glyph.Data = {
+                36030000424D3603000000000000360000002800000010000000100000000100
+                18000000000000030000120B0000120B00000000000000000000FF00FF4A667C
+                BE9596FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+                FFFF00FFFF00FFFF00FF6B9CC31E89E84B7AA3C89693FF00FFFF00FFFF00FFFF
+                00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF4BB4FE51B5FF
+                2089E94B7AA2C69592FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+                FFFF00FFFF00FFFF00FFFF00FF51B7FE51B3FF1D87E64E7AA0CA9792FF00FFFF
+                00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+                51B7FE4EB2FF1F89E64E7BA2B99497FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+                FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF52B8FE4BB1FF2787D95F6A76FF
+                00FFB0857FC09F94C09F96BC988EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+                FF00FFFF00FF55BDFFB5D6EDBF9D92BB9B8CE7DAC2FFFFE3FFFFE5FDFADAD8C3
+                B3B58D85FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFCEA795FD
+                EEBEFFFFD8FFFFDAFFFFDBFFFFE6FFFFFBEADDDCAE837FFF00FFFF00FFFF00FF
+                FF00FFFF00FFFF00FFFF00FFC1A091FBDCA8FEF7D0FFFFDBFFFFE3FFFFF8FFFF
+                FDFFFFFDC6A99CFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC1A091FEE3ACF1
+                C491FCF2CAFFFFDDFFFFE4FFFFF7FFFFF7FFFFE9EEE5CBB9948CFF00FFFF00FF
+                FF00FFFF00FFFF00FFC2A191FFE6AEEEB581F7DCAEFEFDD8FFFFDFFFFFE3FFFF
+                E4FFFFE0F3ECD2BB968EFF00FFFF00FFFF00FFFF00FFFF00FFBC978CFBE7B7F4
+                C791F2C994F8E5B9FEFCD8FFFFDDFFFFDCFFFFE0E2D2BAB68E86FF00FFFF00FF
+                FF00FFFF00FFFF00FFFF00FFD9C3A9FFFEE5F7DCB8F2C994F5D4A5FAE8BDFDF4
+                C9FDFBD6B69089FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB58D85E8
+                DEDDFFFEF2F9D8A3F4C48CF9D49FFDEAB8D0B49FB89086FF00FFFF00FFFF00FF
+                FF00FFFF00FFFF00FFFF00FFFF00FFAD827FC9AA9EEFE0B7EFDFB2E7CEACB890
+                86B89086FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+                00FFFF00FFBA968ABB988CB79188FF00FFFF00FFFF00FFFF00FF}
+              OnClick = sbSearchListerSellerAccountClick
+            end
+            object rbListAccountForPublicSale: TRadioButton
+              Left = 10
+              Top = 20
+              Width = 141
+              Height = 17
+              Caption = 'List account for public sale'
+              TabOrder = 0
+            end
+            object rbListAccountForPrivateSale: TRadioButton
+              Left = 10
+              Top = 40
+              Width = 174
+              Height = 17
+              Caption = 'List account for private sale'
+              TabOrder = 1
+            end
+            object ebSalePrice: TEdit
+              Left = 137
+              Top = 59
+              Width = 86
+              Height = 21
+              TabOrder = 2
+            end
+            object ebSellerAccount: TEdit
+              Left = 378
+              Top = 59
+              Width = 83
+              Height = 21
+              TabOrder = 3
+            end
+            object ebSaleNewOwnerPublicKey: TEdit
+              Left = 137
+              Top = 82
+              Width = 324
+              Height = 21
+              TabOrder = 4
+            end
+            object ebSaleLockedUntilBlock: TEdit
+              Left = 137
+              Top = 106
+              Width = 86
+              Height = 21
+              TabOrder = 5
+            end
+          end
+        end
+        object tsDelist: TTabSheet
+          Caption = 'Delist account'
+          ImageIndex = 3
+          ExplicitLeft = 0
+          ExplicitTop = 0
+          ExplicitWidth = 0
+          ExplicitHeight = 0
+          object lblDelistErrors: TLabel
+            Left = 13
+            Top = 10
+            Width = 331
+            Height = 13
+            AutoSize = False
+            Caption = 'Errors detected'
+            Color = clBtnFace
+            Font.Charset = DEFAULT_CHARSET
+            Font.Color = clRed
+            Font.Height = -11
+            Font.Name = 'Tahoma'
+            Font.Style = []
+            ParentColor = False
+            ParentFont = False
+          end
+        end
+        object tsBuyAccount: TTabSheet
+          Caption = 'Buy account'
+          ImageIndex = 4
+          ExplicitLeft = 0
+          ExplicitTop = 0
+          ExplicitWidth = 0
+          ExplicitHeight = 0
+          object lblAccountToBuy: TLabel
+            Left = 13
+            Top = 32
+            Width = 100
+            Height = 13
+            Alignment = taRightJustify
+            AutoSize = False
+            Caption = 'Account to Buy'
+            Color = clBtnFace
+            ParentColor = False
+          end
+          object lblBuyAmount: TLabel
+            Left = 13
+            Top = 61
+            Width = 100
+            Height = 13
+            Alignment = taRightJustify
+            AutoSize = False
+            Caption = 'Amount'
+            Color = clBtnFace
+            ParentColor = False
+          end
+          object lblBuyAccountErrors: TLabel
+            Left = 13
+            Top = 10
+            Width = 331
+            Height = 13
+            AutoSize = False
+            Caption = 'Errors detected'
+            Color = clBtnFace
+            Font.Charset = DEFAULT_CHARSET
+            Font.Color = clRed
+            Font.Height = -11
+            Font.Name = 'Tahoma'
+            Font.Style = []
+            ParentColor = False
+            ParentFont = False
+          end
+          object lblBuyNewKey: TLabel
+            Left = 13
+            Top = 88
+            Width = 100
+            Height = 13
+            Alignment = taRightJustify
+            AutoSize = False
+            Caption = 'New private key'
+            Color = clBtnFace
+            ParentColor = False
+          end
+          object Label2: TLabel
+            Left = 204
+            Top = 61
+            Width = 231
+            Height = 13
+            Caption = 'excessive amount will remain on bought account'
+            Color = clBtnFace
+            Font.Charset = DEFAULT_CHARSET
+            Font.Color = clGray
+            Font.Height = -11
+            Font.Name = 'Tahoma'
+            Font.Style = []
+            ParentColor = False
+            ParentFont = False
+          end
+          object sbSearchBuyAccount: TSpeedButton
+            Left = 200
+            Top = 29
+            Width = 23
+            Height = 22
+            Glyph.Data = {
+              36030000424D3603000000000000360000002800000010000000100000000100
+              18000000000000030000120B0000120B00000000000000000000FF00FF4A667C
+              BE9596FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FF6B9CC31E89E84B7AA3C89693FF00FFFF00FFFF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF4BB4FE51B5FF
+              2089E94B7AA2C69592FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FF51B7FE51B3FF1D87E64E7AA0CA9792FF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              51B7FE4EB2FF1F89E64E7BA2B99497FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF52B8FE4BB1FF2787D95F6A76FF
+              00FFB0857FC09F94C09F96BC988EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              FF00FFFF00FF55BDFFB5D6EDBF9D92BB9B8CE7DAC2FFFFE3FFFFE5FDFADAD8C3
+              B3B58D85FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFCEA795FD
+              EEBEFFFFD8FFFFDAFFFFDBFFFFE6FFFFFBEADDDCAE837FFF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFC1A091FBDCA8FEF7D0FFFFDBFFFFE3FFFFF8FFFF
+              FDFFFFFDC6A99CFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC1A091FEE3ACF1
+              C491FCF2CAFFFFDDFFFFE4FFFFF7FFFFF7FFFFE9EEE5CBB9948CFF00FFFF00FF
+              FF00FFFF00FFFF00FFC2A191FFE6AEEEB581F7DCAEFEFDD8FFFFDFFFFFE3FFFF
+              E4FFFFE0F3ECD2BB968EFF00FFFF00FFFF00FFFF00FFFF00FFBC978CFBE7B7F4
+              C791F2C994F8E5B9FEFCD8FFFFDDFFFFDCFFFFE0E2D2BAB68E86FF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFD9C3A9FFFEE5F7DCB8F2C994F5D4A5FAE8BDFDF4
+              C9FDFBD6B69089FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB58D85E8
+              DEDDFFFEF2F9D8A3F4C48CF9D49FFDEAB8D0B49FB89086FF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFAD827FC9AA9EEFE0B7EFDFB2E7CEACB890
+              86B89086FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FFBA968ABB988CB79188FF00FFFF00FFFF00FFFF00FF}
+            OnClick = sbSearchBuyAccountClick
+          end
+          object ebAccountToBuy: TEdit
+            Left = 118
+            Top = 29
+            Width = 76
+            Height = 21
+            TabOrder = 0
+          end
+          object ebBuyAmount: TEdit
+            Left = 118
+            Top = 58
+            Width = 76
+            Height = 21
+            TabOrder = 1
+          end
+          object cbBuyNewKey: TComboBox
+            Left = 118
+            Top = 85
+            Width = 294
+            Height = 21
+            Style = csDropDownList
+            Sorted = True
+            TabOrder = 2
+          end
+          object bbBuyNewKey: TBitBtn
+            Left = 418
+            Top = 84
+            Width = 31
+            Height = 22
+            DoubleBuffered = True
+            Glyph.Data = {
+              36050000424D3605000000000000360400002800000010000000100000000100
+              0800000000000001000000000000000000000001000000010000FF00FF008C6B
+              6C0087707000AE877C000D7FA9006F7C88006D7C94001F7ECE000E80AA001180
+              A7001081AB00048CB900078DBC000B8DBA000C8DBA00088EBC001285B0007882
+              95006092BD005EA8BE000A91C1000F9DCE002087DE0011A7D10030BCDC001F89
+              E00059A9DC0044BADD004ABFE00057AEF4004DB1F90049B2FF004EB7FF0057B1
+              F60050B6FE0022D7FC0024D7FF0024D8FD0039D7FB0035D8FD004BC6DC0046C6
+              E40048D5EE0075D3E90058E9FD006FE6FF0070E6FF0071F9FE007BFFFF008683
+              88008B8697008F989B00969594009C919000AD858000AD868500AB939500A49E
+              9900B1979400B5A09F008AA5AD00CAA08C00CDAC9300C2A69A00F3BE8000C6AE
+              A000CFB7A100D3BBA200F4C88E00F5CB9A00F5D09C00F8D09800DAC5B700E4CC
+              A900EFD2A900ECD1AC00F6DAAB00F5DEB500F5E1B600F9E1B100FEEAB900FFF2
+              BA00A1C6C8008DE6FA0081F8FE008CFAFD008DFCFE0097FCFD009BFBFD00B8ED
+              F600A7FFFF00AAFFFE00ADFFFE00B6F6FF00B1FCFD00B4FFFF00ECDDCC00E8DD
+              D600FFF7C600FCF5CD00FCF7D100FAF6D600FFFBD500FEFED600F7F2D900FEFF
+              D900FFFEDD00C6F5FF00C6FEFF00D2FFFF00FEF7E000FBFCE100FDFFE100FFFF
+              E400E3FEFF00F9F6F200FFFFF400F1FBFC00F5FFFE00FBFFFF00000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              00000000000000000605000004080408080A000000000011191A000B2A23272D
+              531B080000001116201D0B552C23272E531C1509003207201D000F552C23272B
+              3A3F41030112202000000F552C252938606771684236200000000B5F5D6B3B61
+              74676A67513D000000000B59181735716A676A63474B360000000F282C23396A
+              6A6A6A4C404D360000000B552C2534656A654F455049360000000B552C251343
+              6247446E7336000000000B552C25263C3E4B4E483636000000000F55542F3057
+              523331020000000000000B77766D5F5C5C5C2F08000000000000001476726C5C
+              5A58100000000000000000000F0F0B0F0F0F0000000000000000}
+            ParentDoubleBuffered = False
+            TabOrder = 3
+            OnClick = bbBuyNewKeyClick
+          end
+        end
+        object tsChangeInfo: TTabSheet
+          Caption = 'Change Info'
+          ExplicitLeft = 0
+          ExplicitTop = 0
+          ExplicitWidth = 0
+          ExplicitHeight = 0
+          object lblChangeInfoErrors: TLabel
+            Left = 13
+            Top = 10
+            Width = 331
+            Height = 13
+            AutoSize = False
+            Caption = 'Errors detected'
+            Color = clBtnFace
+            Font.Charset = DEFAULT_CHARSET
+            Font.Color = clRed
+            Font.Height = -11
+            Font.Name = 'Tahoma'
+            Font.Style = []
+            ParentColor = False
+            ParentFont = False
+          end
+          object lblChangeName: TLabel
+            Left = 13
+            Top = 32
+            Width = 100
+            Height = 13
+            Alignment = taRightJustify
+            AutoSize = False
+            Caption = 'Change name'
+            Color = clBtnFace
+            ParentColor = False
+          end
+          object lblChangeType: TLabel
+            Left = 13
+            Top = 60
+            Width = 100
+            Height = 13
+            Alignment = taRightJustify
+            AutoSize = False
+            Caption = 'Change type'
+            Color = clBtnFace
+            ParentColor = False
+          end
+          object ebChangeName: TEdit
+            Left = 118
+            Top = 29
+            Width = 258
+            Height = 21
+            TabOrder = 0
+          end
+          object ebChangeType: TEdit
+            Left = 118
+            Top = 57
+            Width = 76
+            Height = 21
+            TabOrder = 1
+          end
+        end
+      end
+      object ebSignerAccount: TEdit
+        Left = 325
+        Top = 184
+        Width = 82
+        Height = 21
+        TabOrder = 3
+      end
+    end
+    object tsGlobalError: TTabSheet
+      ImageIndex = 1
+      TabVisible = False
+      ExplicitLeft = 0
+      ExplicitTop = 0
+      ExplicitWidth = 0
+      ExplicitHeight = 0
+      object lblGlobalErrors: TLabel
+        Left = 40
+        Top = 50
+        Width = 456
+        Height = 156
+        Alignment = taCenter
+        AutoSize = False
+        Caption = '????'
+        Color = clBtnFace
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clRed
+        Font.Height = -21
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentColor = False
+        ParentFont = False
+        WordWrap = True
+      end
+      object bbPassword: TBitBtn
+        Left = 191
+        Top = 243
+        Width = 159
+        Height = 38
+        Caption = 'Password'
+        DoubleBuffered = True
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -13
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        Glyph.Data = {
+          76060000424D7606000000000000360400002800000018000000180000000100
+          0800000000004002000000000000000000000001000000010000000000000101
+          0100020202000303030004040400050505000606060007070700080808000909
+          09000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F0F00101010001111
+          1100121212001313130014141400151515001616160017171700181818001919
+          19001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F1F00202020002121
+          2100222222002323230024242400252525002626260027272700282828002929
+          29002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F2F00303030003131
+          3100323232003333330034343400353535003636360037373700383838003939
+          39003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F3F00404040004141
+          4100424242004343430044444400454545004646460047474700484848004949
+          49004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F4F00505050005151
+          5100525252005353530054545400555555005656560057575700585858005959
+          59005A5A5A005B5B5B005C5C5C005D5D5D005E5E5E00685968007C4F7C009441
+          9400B72CB700DD15DD00F506F500FD01FD00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00F008F900D517F000BD24E800A830E1007B4B
+          D0005065C1003774B7002B7DB100237FAC001F82AD001C83AD001785AE001687
+          AF001489B100128AB300108CB6000F8EB9000D91BB000C94BF000A97C3000A99
+          C5000A9AC7000B9BC8000B9CCA000C9ECC000C9FCD000DA0CE000DA1CE000EA2
+          CF0011A3CF0015A4CF0018A5CF001CA7D10021A9D1002AAAD00035AACD0035AD
+          D00035AFD30035B1D60037B5D8003AB8DB003EB9DC0040BBDD0045BEDE004CC1
+          E00055C6E3005BC8E40061CAE40066CBE3006BCCE30072D3E60078D8EB0080D8
+          EE0083D9F10085DCF40088DBF5008BDBF6008EDAF70091DAF70095DCF70097E0
+          F7009EE3F800A4E7F900A9E9F900AEE9F900B5EBF900B2EBF800919191919191
+          919191919191919191919191919191919191919191919191D5E7E8E7E3DED591
+          919191919191919191919191919191D6DDF7F8F8F7F6F4EEE6D5919191919191
+          919191919191D7DADEF8F8F6F7F6EDF1F8F1E69191919191919191919191DADE
+          DFFAFAF8F7F7E9EDF7F7F8EB91919191919191919191DDE5E3FCFCFAFAEEE0E9
+          F3F7F7F7DC919191919191919191DEE7E4FEFEFCFCEDC5E0EFF7F6F6DC919191
+          919191919191DEEAE7FEFEFEFDFBC4C4F5F7F6F6DC919191919191919191E3EC
+          E9FEFEFEFEFEE0C3F9F7F6F6DC919191919191919191E3E9E3F8F8F1F1F8FBFB
+          FCFAF7F6DC919191919191919191DCEAEAE0E1E9E5E3DEE4EBF2FAF9DC919191
+          919191919191DBF3EEC5C5EFF3EBE5DDD9D6E6F5DC91919191919191919191D5
+          E8EDF1FAF6F0EAE4DAD1D2DBDC919191919191919191919191DBE8F0F3F3F3E4
+          D0CFE4D8DC919191919191919191919191919191D5DEE4DED2CFD4D491919191
+          91919191919191919191919191919191D2CE9191919191919191919191919191
+          91C8C89191919191D2CE919191919191919191919191919191D9D09191919191
+          D2CE919191919191919191919191919191E6E39191919191D2CE919191919191
+          919191919191919191E0F3CE91919191D2CE9191919191919191919191919191
+          9191EFF6E1C9C8CDD9CC91919191919191919191919191919191C9EDF9F3F3EB
+          DC91919191919191919191919191919191919191CBE0E1CF9191919191919191
+          9191919191919191919191919191919191919191919191919191}
+        ParentDoubleBuffered = False
+        ParentFont = False
+        TabOrder = 0
+        OnClick = bbPasswordClick
+      end
+    end
+  end
+  object memoAccounts: TMemo
+    Left = 74
+    Top = 12
+    Width = 307
+    Height = 59
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -12
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    Lines.Strings = (
+      '123456-11 (0.0000); 123456-11 (0.0000); '
+      '123456-11 (0.0000); 123456-11 (0.0000); ')
+    ParentFont = False
+    ReadOnly = True
+    ScrollBars = ssVertical
+    TabOrder = 4
+  end
+  object ebSenderAccount: TEdit
+    Left = 74
+    Top = 12
+    Width = 97
+    Height = 27
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+    TabOrder = 0
+    Text = 'ebSenderAccount'
+    OnExit = ebSenderAccountExit
+    OnKeyPress = ebSenderAccountKeyPress
+  end
+  object ActionList: TActionList
+    Left = 140
+    Top = 350
+    object actExecute: TAction
+      Caption = 'Execute (F12)'
+      ShortCut = 123
+      OnExecute = actExecuteExecute
+    end
+  end
+end

+ 1041 - 0
src/gui-classic/UFRMOperation.lfm

@@ -0,0 +1,1041 @@
+object FRMOperation: TFRMOperation
+  Left = 772
+  Height = 493
+  Top = 245
+  Width = 608
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'New Operation'
+  ClientHeight = 493
+  ClientWidth = 608
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  Position = poOwnerFormCenter
+  LCLVersion = '1.8.0.6'
+  Visible = False
+  object lblAccountCaption: TLabel
+    Left = 25
+    Height = 13
+    Top = 20
+    Width = 43
+    Caption = 'Account:'
+    ParentColor = False
+  end
+  object lblAccountBalance: TLabel
+    Left = 432
+    Height = 19
+    Top = 15
+    Width = 149
+    Caption = 'lblAccountBalance'
+    Font.Color = clGreen
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object lblBalanceCaption: TLabel
+    Left = 387
+    Height = 13
+    Top = 20
+    Width = 41
+    Caption = 'Balance:'
+    ParentColor = False
+  end
+  object lblAccountsCount: TLabel
+    Left = 387
+    Height = 13
+    Top = 58
+    Width = 18
+    Caption = 'XXX'
+    ParentColor = False
+  end
+  object bbExecute: TBitBtn
+    Left = 300
+    Height = 31
+    Top = 445
+    Width = 130
+    Caption = 'Execute (F12)'
+    Glyph.Data = {
+      DE010000424DDE01000000000000760000002800000024000000120000000100
+      0400000000006801000000000000000000001000000000000000000000000000
+      80000080000000808000800000008000800080800000C0C0C000808080000000
+      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+      3333333333333333333333330000333333333333333333333333F33333333333
+      00003333344333333333333333388F3333333333000033334224333333333333
+      338338F3333333330000333422224333333333333833338F3333333300003342
+      222224333333333383333338F3333333000034222A22224333333338F338F333
+      8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
+      33333338F83338F338F33333000033A33333A222433333338333338F338F3333
+      0000333333333A222433333333333338F338F33300003333333333A222433333
+      333333338F338F33000033333333333A222433333333333338F338F300003333
+      33333333A222433333333333338F338F00003333333333333A22433333333333
+      3338F38F000033333333333333A223333333333333338F830000333333333333
+      333A333333333333333338330000333333333333333333333333333333333333
+      0000
+    }
+    NumGlyphs = 2
+    OnClick = actExecuteExecute
+    TabOrder = 2
+  end
+  object bbCancel: TBitBtn
+    Left = 465
+    Height = 31
+    Top = 445
+    Width = 116
+    Cancel = True
+    Caption = 'Cancel'
+    Kind = bkCancel
+    ModalResult = 2
+    TabOrder = 3
+  end
+  object PageControlLocked: TPageControl
+    Left = 25
+    Height = 367
+    Top = 72
+    Width = 556
+    ActivePage = tsOperation
+    TabIndex = 0
+    TabOrder = 1
+    object tsOperation: TTabSheet
+      Caption = 'Operation'
+      ClientHeight = 341
+      ClientWidth = 548
+      TabVisible = False
+      object lblFee: TLabel
+        Left = 15
+        Height = 13
+        Top = 188
+        Width = 69
+        Caption = 'Operation Fee'
+        ParentColor = False
+      end
+      object gbPayload: TGroupBox
+        Left = 13
+        Height = 129
+        Top = 207
+        Width = 521
+        Caption = ' Payload: '
+        ClientHeight = 111
+        ClientWidth = 517
+        TabOrder = 2
+        object lblEncryptPassword: TLabel
+          Left = 38
+          Height = 13
+          Top = 67
+          Width = 50
+          Caption = 'Password:'
+          ParentColor = False
+        end
+        object Label4: TLabel
+          Left = 256
+          Height = 13
+          Top = 6
+          Width = 67
+          Caption = 'Payload data:'
+          ParentColor = False
+        end
+        object lblEncryptionErrors: TLabel
+          Left = 255
+          Height = 13
+          Top = 87
+          Width = 246
+          AutoSize = False
+          Caption = 'Errors detected'
+          Font.Color = clRed
+          Font.Height = -11
+          Font.Name = 'Tahoma'
+          ParentColor = False
+          ParentFont = False
+        end
+        object lblPayloadLength: TLabel
+          Left = 352
+          Height = 13
+          Top = 6
+          Width = 149
+          Alignment = taRightJustify
+          AutoSize = False
+          Caption = 'XXX'
+          ParentColor = False
+        end
+        object rbEncryptedWithEC: TRadioButton
+          Left = 15
+          Height = 19
+          Top = 26
+          Width = 207
+          Caption = 'Encrypted with dest account public key'
+          Checked = True
+          OnClick = memoPayloadClick
+          TabOrder = 1
+          TabStop = True
+        end
+        object rbEncrptedWithPassword: TRadioButton
+          Left = 15
+          Height = 19
+          Top = 44
+          Width = 141
+          Caption = 'Encrypted with password'
+          OnClick = memoPayloadClick
+          TabOrder = 2
+        end
+        object rbNotEncrypted: TRadioButton
+          Left = 15
+          Height = 19
+          Top = 84
+          Width = 162
+          Caption = 'Dont encrypt (Public payload)'
+          OnClick = memoPayloadClick
+          TabOrder = 4
+        end
+        object ebEncryptPassword: TEdit
+          Left = 94
+          Height = 21
+          Top = 64
+          Width = 122
+          OnChange = ebEncryptPasswordChange
+          OnClick = memoPayloadClick
+          TabOrder = 3
+        end
+        object memoPayload: TMemo
+          Left = 255
+          Height = 57
+          Top = 28
+          Width = 246
+          Font.Color = clBlack
+          Font.Height = -16
+          Font.Name = 'Tahoma'
+          OnChange = memoPayloadClick
+          OnClick = memoPayloadClick
+          ParentFont = False
+          TabOrder = 5
+          WantReturns = False
+        end
+        object rbEncryptedWithOldEC: TRadioButton
+          Left = 15
+          Height = 19
+          Top = 7
+          Width = 159
+          Caption = 'Encrypted with old public key'
+          OnClick = memoPayloadClick
+          TabOrder = 0
+        end
+      end
+      object ebFee: TEdit
+        Left = 90
+        Height = 21
+        Top = 184
+        Width = 70
+        TabOrder = 1
+      end
+      object PageControlOpType: TPageControl
+        Left = 15
+        Height = 167
+        Top = 11
+        Width = 521
+        ActivePage = tsChangeInfo
+        TabIndex = 5
+        TabOrder = 0
+        OnChange = PageControlOpTypeChange
+        object tsTransaction: TTabSheet
+          Caption = 'Transaction'
+          ClientHeight = 141
+          ClientWidth = 513
+          object lblDestAccount: TLabel
+            Left = 13
+            Height = 13
+            Top = 32
+            Width = 95
+            Caption = 'Destination account'
+            ParentColor = False
+          end
+          object lblAmount: TLabel
+            Left = 72
+            Height = 13
+            Top = 61
+            Width = 37
+            Caption = 'Amount'
+            ParentColor = False
+          end
+          object lblTransactionErrors: TLabel
+            Left = 13
+            Height = 13
+            Top = 10
+            Width = 331
+            AutoSize = False
+            Caption = 'Errors detected'
+            Font.Color = clRed
+            Font.Height = -11
+            Font.Name = 'Tahoma'
+            ParentColor = False
+            ParentFont = False
+          end
+          object ebDestAccount: TEdit
+            Left = 115
+            Height = 21
+            Top = 29
+            Width = 85
+            TabOrder = 0
+          end
+          object ebAmount: TEdit
+            Left = 115
+            Height = 21
+            Top = 58
+            Width = 86
+            TabOrder = 1
+          end
+          object sbSearchDestinationAccount: TSpeedButton
+            Left = 208
+            Height = 22
+            Top = 29
+            Width = 23
+            Glyph.Data = {
+              36030000424D3803000000000000360000002800000010000000100000000100
+              18000000000000000000120B0000120B00000000000000000000FF00FF4A667C
+              BE9596FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FF6B9CC31E89E84B7AA3C89693FF00FFFF00FFFF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF4BB4FE51B5FF
+              2089E94B7AA2C69592FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FF51B7FE51B3FF1D87E64E7AA0CA9792FF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              51B7FE4EB2FF1F89E64E7BA2B99497FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF52B8FE4BB1FF2787D95F6A76FF
+              00FFB0857FC09F94C09F96BC988EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              FF00FFFF00FF55BDFFB5D6EDBF9D92BB9B8CE7DAC2FFFFE3FFFFE5FDFADAD8C3
+              B3B58D85FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFCEA795FD
+              EEBEFFFFD8FFFFDAFFFFDBFFFFE6FFFFFBEADDDCAE837FFF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFC1A091FBDCA8FEF7D0FFFFDBFFFFE3FFFFF8FFFF
+              FDFFFFFDC6A99CFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC1A091FEE3ACF1
+              C491FCF2CAFFFFDDFFFFE4FFFFF7FFFFF7FFFFE9EEE5CBB9948CFF00FFFF00FF
+              FF00FFFF00FFFF00FFC2A191FFE6AEEEB581F7DCAEFEFDD8FFFFDFFFFFE3FFFF
+              E4FFFFE0F3ECD2BB968EFF00FFFF00FFFF00FFFF00FFFF00FFBC978CFBE7B7F4
+              C791F2C994F8E5B9FEFCD8FFFFDDFFFFDCFFFFE0E2D2BAB68E86FF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFD9C3A9FFFEE5F7DCB8F2C994F5D4A5FAE8BDFDF4
+              C9FDFBD6B69089FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB58D85E8
+              DEDDFFFEF2F9D8A3F4C48CF9D49FFDEAB8D0B49FB89086FF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFAD827FC9AA9EEFE0B7EFDFB2E7CEACB890
+              86B89086FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FFBA968ABB988CB79188FF00FFFF00FFFF00FFFF00FF
+            }
+            OnClick = sbSearchDestinationAccountClick
+          end
+        end
+        object tsChangePrivateKey: TTabSheet
+          Caption = 'Change key'
+          ClientHeight = 141
+          ClientWidth = 513
+          ImageIndex = 1
+          object gbChangeKey: TGroupBox
+            Left = 7
+            Height = 130
+            Top = 6
+            Width = 488
+            Caption = ' Change type: '
+            ClientHeight = 112
+            ClientWidth = 484
+            TabOrder = 0
+            object lblNewPrivateKey: TLabel
+              Left = 57
+              Height = 13
+              Top = 33
+              Width = 78
+              Caption = 'New private key'
+              ParentColor = False
+            end
+            object lblNewOwnerPublicKey: TLabel
+              Left = 24
+              Height = 13
+              Top = 83
+              Width = 109
+              Caption = 'New owners public key'
+              ParentColor = False
+            end
+            object lblNewOwnerErrors: TLabel
+              Left = 173
+              Height = 13
+              Top = 61
+              Width = 302
+              Alignment = taRightJustify
+              AutoSize = False
+              Caption = 'Errors detected'
+              Font.Color = clRed
+              Font.Height = -11
+              Font.Name = 'Tahoma'
+              ParentColor = False
+              ParentFont = False
+            end
+            object lblChangeKeyErrors: TLabel
+              Left = 145
+              Height = 13
+              Top = 8
+              Width = 331
+              Alignment = taRightJustify
+              AutoSize = False
+              Caption = 'Errors detected'
+              Font.Color = clRed
+              Font.Height = -11
+              Font.Name = 'Tahoma'
+              ParentColor = False
+              ParentFont = False
+            end
+            object rbChangeKeyWithAnother: TRadioButton
+              Left = 12
+              Height = 19
+              Top = 13
+              Width = 114
+              Caption = 'Change private key'
+              TabOrder = 0
+            end
+            object cbNewPrivateKey: TComboBox
+              Left = 145
+              Height = 21
+              Top = 30
+              Width = 294
+              ItemHeight = 13
+              Sorted = True
+              Style = csDropDownList
+              TabOrder = 1
+            end
+            object ebNewPublicKey: TEdit
+              Left = 144
+              Height = 21
+              Top = 80
+              Width = 331
+              TabOrder = 4
+            end
+            object bbChangePrivateKeyKeys: TBitBtn
+              Left = 445
+              Height = 22
+              Top = 29
+              Width = 31
+              Glyph.Data = {
+                36050000424D3605000000000000360400002800000010000000100000000100
+                0800000000000001000000000000000000000001000000010000FF00FF008C6B
+                6C0087707000AE877C000D7FA9006F7C88006D7C94001F7ECE000E80AA001180
+                A7001081AB00048CB900078DBC000B8DBA000C8DBA00088EBC001285B0007882
+                95006092BD005EA8BE000A91C1000F9DCE002087DE0011A7D10030BCDC001F89
+                E00059A9DC0044BADD004ABFE00057AEF4004DB1F90049B2FF004EB7FF0057B1
+                F60050B6FE0022D7FC0024D7FF0024D8FD0039D7FB0035D8FD004BC6DC0046C6
+                E40048D5EE0075D3E90058E9FD006FE6FF0070E6FF0071F9FE007BFFFF008683
+                88008B8697008F989B00969594009C919000AD858000AD868500AB939500A49E
+                9900B1979400B5A09F008AA5AD00CAA08C00CDAC9300C2A69A00F3BE8000C6AE
+                A000CFB7A100D3BBA200F4C88E00F5CB9A00F5D09C00F8D09800DAC5B700E4CC
+                A900EFD2A900ECD1AC00F6DAAB00F5DEB500F5E1B600F9E1B100FEEAB900FFF2
+                BA00A1C6C8008DE6FA0081F8FE008CFAFD008DFCFE0097FCFD009BFBFD00B8ED
+                F600A7FFFF00AAFFFE00ADFFFE00B6F6FF00B1FCFD00B4FFFF00ECDDCC00E8DD
+                D600FFF7C600FCF5CD00FCF7D100FAF6D600FFFBD500FEFED600F7F2D900FEFF
+                D900FFFEDD00C6F5FF00C6FEFF00D2FFFF00FEF7E000FBFCE100FDFFE100FFFF
+                E400E3FEFF00F9F6F200FFFFF400F1FBFC00F5FFFE00FBFFFF00000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                0000000000000000000000000000000000000000000000000000000000000000
+                00000000000000000605000004080408080A000000000011191A000B2A23272D
+                531B080000001116201D0B552C23272E531C1509003207201D000F552C23272B
+                3A3F41030112202000000F552C252938606771684236200000000B5F5D6B3B61
+                74676A67513D000000000B59181735716A676A63474B360000000F282C23396A
+                6A6A6A4C404D360000000B552C2534656A654F455049360000000B552C251343
+                6247446E7336000000000B552C25263C3E4B4E483636000000000F55542F3057
+                523331020000000000000B77766D5F5C5C5C2F08000000000000001476726C5C
+                5A58100000000000000000000F0F0B0F0F0F0000000000000000
+              }
+              OnClick = bbChangePrivateKeyKeysClick
+              TabOrder = 2
+            end
+            object rbChangeKeyTransferAccountToNewOwner: TRadioButton
+              Left = 12
+              Height = 19
+              Top = 60
+              Width = 180
+              Caption = 'Transfer account to a new owner'
+              TabOrder = 3
+            end
+          end
+        end
+        object tsListForSale: TTabSheet
+          Caption = 'List account for sale'
+          ClientHeight = 141
+          ClientWidth = 513
+          ImageIndex = 3
+          object gbSaleType: TGroupBox
+            Left = 8
+            Height = 135
+            Top = 5
+            Width = 499
+            Caption = ' Sale type: '
+            ClientHeight = 117
+            ClientWidth = 495
+            TabOrder = 0
+            object Label1: TLabel
+              Left = 81
+              Height = 13
+              Top = 44
+              Width = 50
+              Caption = 'Sale price:'
+              ParentColor = False
+            end
+            object Label3: TLabel
+              Left = 229
+              Height = 13
+              Top = 44
+              Width = 142
+              Caption = 'Seller account (where to pay)'
+              ParentColor = False
+            end
+            object lblSaleNewOwnerPublicKey: TLabel
+              Left = 20
+              Height = 13
+              Top = 67
+              Width = 109
+              Caption = 'New owners public key'
+              ParentColor = False
+            end
+            object lblSaleLockedUntilBlock: TLabel
+              Left = 44
+              Height = 13
+              Top = 91
+              Width = 87
+              Caption = 'Locked until block:'
+              ParentColor = False
+            end
+            object lblListAccountErrors: TLabel
+              Left = 145
+              Height = 13
+              Top = 0
+              Width = 331
+              Alignment = taRightJustify
+              AutoSize = False
+              Caption = 'Errors detected'
+              Font.Color = clRed
+              Font.Height = -11
+              Font.Name = 'Tahoma'
+              ParentColor = False
+              ParentFont = False
+            end
+            object rbListAccountForPublicSale: TRadioButton
+              Left = 10
+              Height = 19
+              Top = 2
+              Width = 146
+              Caption = 'List account for public sale'
+              TabOrder = 0
+            end
+            object rbListAccountForPrivateSale: TRadioButton
+              Left = 10
+              Height = 19
+              Top = 22
+              Width = 153
+              Caption = 'List account for private sale'
+              TabOrder = 1
+            end
+            object ebSalePrice: TEdit
+              Left = 137
+              Height = 21
+              Top = 41
+              Width = 86
+              TabOrder = 2
+            end
+            object ebSellerAccount: TEdit
+              Left = 378
+              Height = 21
+              Top = 41
+              Width = 82
+              TabOrder = 3
+            end
+            object ebSaleNewOwnerPublicKey: TEdit
+              Left = 137
+              Height = 21
+              Top = 64
+              Width = 323
+              TabOrder = 4
+            end
+            object ebSaleLockedUntilBlock: TEdit
+              Left = 137
+              Height = 21
+              Top = 88
+              Width = 86
+              TabOrder = 5
+            end
+            object sbSearchListerSellerAccount: TSpeedButton
+              Left = 464
+              Height = 22
+              Top = 41
+              Width = 23
+              Glyph.Data = {
+                36030000424D3803000000000000360000002800000010000000100000000100
+                18000000000000000000120B0000120B00000000000000000000FF00FF4A667C
+                BE9596FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+                FFFF00FFFF00FFFF00FF6B9CC31E89E84B7AA3C89693FF00FFFF00FFFF00FFFF
+                00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF4BB4FE51B5FF
+                2089E94B7AA2C69592FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+                FFFF00FFFF00FFFF00FFFF00FF51B7FE51B3FF1D87E64E7AA0CA9792FF00FFFF
+                00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+                51B7FE4EB2FF1F89E64E7BA2B99497FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+                FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF52B8FE4BB1FF2787D95F6A76FF
+                00FFB0857FC09F94C09F96BC988EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+                FF00FFFF00FF55BDFFB5D6EDBF9D92BB9B8CE7DAC2FFFFE3FFFFE5FDFADAD8C3
+                B3B58D85FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFCEA795FD
+                EEBEFFFFD8FFFFDAFFFFDBFFFFE6FFFFFBEADDDCAE837FFF00FFFF00FFFF00FF
+                FF00FFFF00FFFF00FFFF00FFC1A091FBDCA8FEF7D0FFFFDBFFFFE3FFFFF8FFFF
+                FDFFFFFDC6A99CFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC1A091FEE3ACF1
+                C491FCF2CAFFFFDDFFFFE4FFFFF7FFFFF7FFFFE9EEE5CBB9948CFF00FFFF00FF
+                FF00FFFF00FFFF00FFC2A191FFE6AEEEB581F7DCAEFEFDD8FFFFDFFFFFE3FFFF
+                E4FFFFE0F3ECD2BB968EFF00FFFF00FFFF00FFFF00FFFF00FFBC978CFBE7B7F4
+                C791F2C994F8E5B9FEFCD8FFFFDDFFFFDCFFFFE0E2D2BAB68E86FF00FFFF00FF
+                FF00FFFF00FFFF00FFFF00FFD9C3A9FFFEE5F7DCB8F2C994F5D4A5FAE8BDFDF4
+                C9FDFBD6B69089FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB58D85E8
+                DEDDFFFEF2F9D8A3F4C48CF9D49FFDEAB8D0B49FB89086FF00FFFF00FFFF00FF
+                FF00FFFF00FFFF00FFFF00FFFF00FFAD827FC9AA9EEFE0B7EFDFB2E7CEACB890
+                86B89086FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+                00FFFF00FFBA968ABB988CB79188FF00FFFF00FFFF00FFFF00FF
+              }
+              OnClick = sbSearchListerSellerAccountClick
+            end
+          end
+        end
+        object tsDelist: TTabSheet
+          Caption = 'Delist account'
+          ClientHeight = 141
+          ClientWidth = 513
+          ImageIndex = 3
+          object lblDelistErrors: TLabel
+            Left = 13
+            Height = 13
+            Top = 10
+            Width = 331
+            AutoSize = False
+            Caption = 'Errors detected'
+            Font.Color = clRed
+            Font.Height = -11
+            Font.Name = 'Tahoma'
+            ParentColor = False
+            ParentFont = False
+          end
+        end
+        object tsBuyAccount: TTabSheet
+          Caption = 'Buy account'
+          ClientHeight = 141
+          ClientWidth = 513
+          ImageIndex = 4
+          object lblAccountToBuy: TLabel
+            Left = 13
+            Height = 13
+            Top = 32
+            Width = 100
+            Alignment = taRightJustify
+            AutoSize = False
+            Caption = 'Account to Buy'
+            ParentColor = False
+          end
+          object lblBuyAmount: TLabel
+            Left = 13
+            Height = 13
+            Top = 61
+            Width = 100
+            Alignment = taRightJustify
+            AutoSize = False
+            Caption = 'Amount'
+            ParentColor = False
+          end
+          object lblBuyAccountErrors: TLabel
+            Left = 13
+            Height = 13
+            Top = 10
+            Width = 331
+            AutoSize = False
+            Caption = 'Errors detected'
+            Font.Color = clRed
+            Font.Height = -11
+            Font.Name = 'Tahoma'
+            ParentColor = False
+            ParentFont = False
+          end
+          object lblBuyNewKey: TLabel
+            Left = 13
+            Height = 13
+            Top = 88
+            Width = 100
+            Alignment = taRightJustify
+            AutoSize = False
+            Caption = 'New private key'
+            ParentColor = False
+          end
+          object Label2: TLabel
+            Left = 204
+            Height = 13
+            Top = 61
+            Width = 231
+            Caption = 'excessive amount will remain on bought account'
+            Font.Color = clGray
+            Font.Height = -11
+            Font.Name = 'Tahoma'
+            ParentColor = False
+            ParentFont = False
+          end
+          object ebAccountToBuy: TEdit
+            Left = 118
+            Height = 21
+            Top = 29
+            Width = 76
+            TabOrder = 0
+          end
+          object ebBuyAmount: TEdit
+            Left = 118
+            Height = 21
+            Top = 58
+            Width = 76
+            TabOrder = 1
+          end
+          object cbBuyNewKey: TComboBox
+            Left = 118
+            Height = 21
+            Top = 85
+            Width = 294
+            ItemHeight = 13
+            Sorted = True
+            Style = csDropDownList
+            TabOrder = 2
+          end
+          object bbBuyNewKey: TBitBtn
+            Left = 418
+            Height = 23
+            Top = 84
+            Width = 39
+            Glyph.Data = {
+              36050000424D3605000000000000360400002800000010000000100000000100
+              0800000000000001000000000000000000000001000000010000FF00FF008C6B
+              6C0087707000AE877C000D7FA9006F7C88006D7C94001F7ECE000E80AA001180
+              A7001081AB00048CB900078DBC000B8DBA000C8DBA00088EBC001285B0007882
+              95006092BD005EA8BE000A91C1000F9DCE002087DE0011A7D10030BCDC001F89
+              E00059A9DC0044BADD004ABFE00057AEF4004DB1F90049B2FF004EB7FF0057B1
+              F60050B6FE0022D7FC0024D7FF0024D8FD0039D7FB0035D8FD004BC6DC0046C6
+              E40048D5EE0075D3E90058E9FD006FE6FF0070E6FF0071F9FE007BFFFF008683
+              88008B8697008F989B00969594009C919000AD858000AD868500AB939500A49E
+              9900B1979400B5A09F008AA5AD00CAA08C00CDAC9300C2A69A00F3BE8000C6AE
+              A000CFB7A100D3BBA200F4C88E00F5CB9A00F5D09C00F8D09800DAC5B700E4CC
+              A900EFD2A900ECD1AC00F6DAAB00F5DEB500F5E1B600F9E1B100FEEAB900FFF2
+              BA00A1C6C8008DE6FA0081F8FE008CFAFD008DFCFE0097FCFD009BFBFD00B8ED
+              F600A7FFFF00AAFFFE00ADFFFE00B6F6FF00B1FCFD00B4FFFF00ECDDCC00E8DD
+              D600FFF7C600FCF5CD00FCF7D100FAF6D600FFFBD500FEFED600F7F2D900FEFF
+              D900FFFEDD00C6F5FF00C6FEFF00D2FFFF00FEF7E000FBFCE100FDFFE100FFFF
+              E400E3FEFF00F9F6F200FFFFF400F1FBFC00F5FFFE00FBFFFF00000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              0000000000000000000000000000000000000000000000000000000000000000
+              00000000000000000605000004080408080A000000000011191A000B2A23272D
+              531B080000001116201D0B552C23272E531C1509003207201D000F552C23272B
+              3A3F41030112202000000F552C252938606771684236200000000B5F5D6B3B61
+              74676A67513D000000000B59181735716A676A63474B360000000F282C23396A
+              6A6A6A4C404D360000000B552C2534656A654F455049360000000B552C251343
+              6247446E7336000000000B552C25263C3E4B4E483636000000000F55542F3057
+              523331020000000000000B77766D5F5C5C5C2F08000000000000001476726C5C
+              5A58100000000000000000000F0F0B0F0F0F0000000000000000
+            }
+            OnClick = bbBuyNewKeyClick
+            TabOrder = 3
+          end
+          object sbSearchBuyAccount: TSpeedButton
+            Left = 201
+            Height = 22
+            Top = 29
+            Width = 23
+            Glyph.Data = {
+              36030000424D3803000000000000360000002800000010000000100000000100
+              18000000000000000000120B0000120B00000000000000000000FF00FF4A667C
+              BE9596FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FF6B9CC31E89E84B7AA3C89693FF00FFFF00FFFF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF4BB4FE51B5FF
+              2089E94B7AA2C69592FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FF51B7FE51B3FF1D87E64E7AA0CA9792FF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              51B7FE4EB2FF1F89E64E7BA2B99497FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF52B8FE4BB1FF2787D95F6A76FF
+              00FFB0857FC09F94C09F96BC988EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              FF00FFFF00FF55BDFFB5D6EDBF9D92BB9B8CE7DAC2FFFFE3FFFFE5FDFADAD8C3
+              B3B58D85FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFCEA795FD
+              EEBEFFFFD8FFFFDAFFFFDBFFFFE6FFFFFBEADDDCAE837FFF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFC1A091FBDCA8FEF7D0FFFFDBFFFFE3FFFFF8FFFF
+              FDFFFFFDC6A99CFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC1A091FEE3ACF1
+              C491FCF2CAFFFFDDFFFFE4FFFFF7FFFFF7FFFFE9EEE5CBB9948CFF00FFFF00FF
+              FF00FFFF00FFFF00FFC2A191FFE6AEEEB581F7DCAEFEFDD8FFFFDFFFFFE3FFFF
+              E4FFFFE0F3ECD2BB968EFF00FFFF00FFFF00FFFF00FFFF00FFBC978CFBE7B7F4
+              C791F2C994F8E5B9FEFCD8FFFFDDFFFFDCFFFFE0E2D2BAB68E86FF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFD9C3A9FFFEE5F7DCB8F2C994F5D4A5FAE8BDFDF4
+              C9FDFBD6B69089FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB58D85E8
+              DEDDFFFEF2F9D8A3F4C48CF9D49FFDEAB8D0B49FB89086FF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFAD827FC9AA9EEFE0B7EFDFB2E7CEACB890
+              86B89086FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FFBA968ABB988CB79188FF00FFFF00FFFF00FFFF00FF
+            }
+            OnClick = sbSearchBuyAccountClick
+          end
+        end
+        object tsChangeInfo: TTabSheet
+          Caption = 'Change Info'
+          ClientHeight = 141
+          ClientWidth = 513
+          object lblChangeInfoErrors: TLabel
+            Left = 13
+            Height = 13
+            Top = 10
+            Width = 331
+            AutoSize = False
+            Caption = 'Errors detected'
+            Font.Color = clRed
+            Font.Height = -11
+            Font.Name = 'Tahoma'
+            ParentColor = False
+            ParentFont = False
+          end
+          object lblChangeName: TLabel
+            Left = 13
+            Height = 13
+            Top = 32
+            Width = 100
+            Alignment = taRightJustify
+            AutoSize = False
+            Caption = 'Change name'
+            ParentColor = False
+          end
+          object ebChangeName: TEdit
+            Left = 118
+            Height = 21
+            Top = 29
+            Width = 258
+            TabOrder = 0
+          end
+          object lblChangeType: TLabel
+            Left = 13
+            Height = 13
+            Top = 60
+            Width = 100
+            Alignment = taRightJustify
+            AutoSize = False
+            Caption = 'Change type'
+            ParentColor = False
+          end
+          object ebChangeType: TEdit
+            Left = 118
+            Height = 21
+            Top = 56
+            Width = 76
+            TabOrder = 1
+          end
+        end
+      end
+      object lblSignerAccount: TLabel
+        Left = 176
+        Height = 13
+        Top = 188
+        Width = 131
+        Caption = 'Signer account (Fee payer)'
+        ParentColor = False
+      end
+      object ebSignerAccount: TEdit
+        Left = 325
+        Height = 21
+        Top = 184
+        Width = 82
+        TabOrder = 3
+      end
+      object sbSearchSignerAccount: TSpeedButton
+        Left = 411
+        Height = 22
+        Top = 184
+        Width = 23
+        Glyph.Data = {
+          36030000424D3803000000000000360000002800000010000000100000000100
+          18000000000000000000120B0000120B00000000000000000000FF00FF4A667C
+          BE9596FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+          FFFF00FFFF00FFFF00FF6B9CC31E89E84B7AA3C89693FF00FFFF00FFFF00FFFF
+          00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF4BB4FE51B5FF
+          2089E94B7AA2C69592FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+          FFFF00FFFF00FFFF00FFFF00FF51B7FE51B3FF1D87E64E7AA0CA9792FF00FFFF
+          00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+          51B7FE4EB2FF1F89E64E7BA2B99497FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+          FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF52B8FE4BB1FF2787D95F6A76FF
+          00FFB0857FC09F94C09F96BC988EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+          FF00FFFF00FF55BDFFB5D6EDBF9D92BB9B8CE7DAC2FFFFE3FFFFE5FDFADAD8C3
+          B3B58D85FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFCEA795FD
+          EEBEFFFFD8FFFFDAFFFFDBFFFFE6FFFFFBEADDDCAE837FFF00FFFF00FFFF00FF
+          FF00FFFF00FFFF00FFFF00FFC1A091FBDCA8FEF7D0FFFFDBFFFFE3FFFFF8FFFF
+          FDFFFFFDC6A99CFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC1A091FEE3ACF1
+          C491FCF2CAFFFFDDFFFFE4FFFFF7FFFFF7FFFFE9EEE5CBB9948CFF00FFFF00FF
+          FF00FFFF00FFFF00FFC2A191FFE6AEEEB581F7DCAEFEFDD8FFFFDFFFFFE3FFFF
+          E4FFFFE0F3ECD2BB968EFF00FFFF00FFFF00FFFF00FFFF00FFBC978CFBE7B7F4
+          C791F2C994F8E5B9FEFCD8FFFFDDFFFFDCFFFFE0E2D2BAB68E86FF00FFFF00FF
+          FF00FFFF00FFFF00FFFF00FFD9C3A9FFFEE5F7DCB8F2C994F5D4A5FAE8BDFDF4
+          C9FDFBD6B69089FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB58D85E8
+          DEDDFFFEF2F9D8A3F4C48CF9D49FFDEAB8D0B49FB89086FF00FFFF00FFFF00FF
+          FF00FFFF00FFFF00FFFF00FFFF00FFAD827FC9AA9EEFE0B7EFDFB2E7CEACB890
+          86B89086FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+          00FFFF00FFBA968ABB988CB79188FF00FFFF00FFFF00FFFF00FF
+        }
+        OnClick = sbSearchSignerAccountClick
+      end
+    end
+    object tsGlobalError: TTabSheet
+      Caption = 'Notification'
+      ClientHeight = 325
+      ClientWidth = 548
+      ImageIndex = 1
+      TabVisible = False
+      object lblGlobalErrors: TLabel
+        Left = 40
+        Height = 156
+        Top = 50
+        Width = 456
+        Alignment = taCenter
+        AutoSize = False
+        Caption = '????'
+        Font.Color = clRed
+        Font.Height = -21
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentColor = False
+        ParentFont = False
+        WordWrap = True
+      end
+      object bbPassword: TBitBtn
+        Left = 191
+        Height = 38
+        Top = 243
+        Width = 159
+        Caption = 'Password'
+        Font.Color = clWindowText
+        Font.Height = -13
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        Glyph.Data = {
+          76060000424D7606000000000000360400002800000018000000180000000100
+          0800000000004002000000000000000000000001000000010000000000000101
+          0100020202000303030004040400050505000606060007070700080808000909
+          09000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F0F00101010001111
+          1100121212001313130014141400151515001616160017171700181818001919
+          19001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F1F00202020002121
+          2100222222002323230024242400252525002626260027272700282828002929
+          29002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F2F00303030003131
+          3100323232003333330034343400353535003636360037373700383838003939
+          39003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F3F00404040004141
+          4100424242004343430044444400454545004646460047474700484848004949
+          49004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F4F00505050005151
+          5100525252005353530054545400555555005656560057575700585858005959
+          59005A5A5A005B5B5B005C5C5C005D5D5D005E5E5E00685968007C4F7C009441
+          9400B72CB700DD15DD00F506F500FD01FD00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+          FE00FE00FE00FE00FE00FE00FE00F008F900D517F000BD24E800A830E1007B4B
+          D0005065C1003774B7002B7DB100237FAC001F82AD001C83AD001785AE001687
+          AF001489B100128AB300108CB6000F8EB9000D91BB000C94BF000A97C3000A99
+          C5000A9AC7000B9BC8000B9CCA000C9ECC000C9FCD000DA0CE000DA1CE000EA2
+          CF0011A3CF0015A4CF0018A5CF001CA7D10021A9D1002AAAD00035AACD0035AD
+          D00035AFD30035B1D60037B5D8003AB8DB003EB9DC0040BBDD0045BEDE004CC1
+          E00055C6E3005BC8E40061CAE40066CBE3006BCCE30072D3E60078D8EB0080D8
+          EE0083D9F10085DCF40088DBF5008BDBF6008EDAF70091DAF70095DCF70097E0
+          F7009EE3F800A4E7F900A9E9F900AEE9F900B5EBF900B2EBF800919191919191
+          919191919191919191919191919191919191919191919191D5E7E8E7E3DED591
+          919191919191919191919191919191D6DDF7F8F8F7F6F4EEE6D5919191919191
+          919191919191D7DADEF8F8F6F7F6EDF1F8F1E69191919191919191919191DADE
+          DFFAFAF8F7F7E9EDF7F7F8EB91919191919191919191DDE5E3FCFCFAFAEEE0E9
+          F3F7F7F7DC919191919191919191DEE7E4FEFEFCFCEDC5E0EFF7F6F6DC919191
+          919191919191DEEAE7FEFEFEFDFBC4C4F5F7F6F6DC919191919191919191E3EC
+          E9FEFEFEFEFEE0C3F9F7F6F6DC919191919191919191E3E9E3F8F8F1F1F8FBFB
+          FCFAF7F6DC919191919191919191DCEAEAE0E1E9E5E3DEE4EBF2FAF9DC919191
+          919191919191DBF3EEC5C5EFF3EBE5DDD9D6E6F5DC91919191919191919191D5
+          E8EDF1FAF6F0EAE4DAD1D2DBDC919191919191919191919191DBE8F0F3F3F3E4
+          D0CFE4D8DC919191919191919191919191919191D5DEE4DED2CFD4D491919191
+          91919191919191919191919191919191D2CE9191919191919191919191919191
+          91C8C89191919191D2CE919191919191919191919191919191D9D09191919191
+          D2CE919191919191919191919191919191E6E39191919191D2CE919191919191
+          919191919191919191E0F3CE91919191D2CE9191919191919191919191919191
+          9191EFF6E1C9C8CDD9CC91919191919191919191919191919191C9EDF9F3F3EB
+          DC91919191919191919191919191919191919191CBE0E1CF9191919191919191
+          9191919191919191919191919191919191919191919191919191
+        }
+        OnClick = bbPasswordClick
+        ParentFont = False
+        TabOrder = 0
+      end
+    end
+  end
+  object memoAccounts: TMemo
+    Left = 74
+    Height = 59
+    Top = 12
+    Width = 307
+    Font.Color = clWindowText
+    Font.Height = -12
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    Lines.Strings = (
+      '123456-11 (0.0000); 123456-11 (0.0000); '
+      '123456-11 (0.0000); 123456-11 (0.0000); '
+    )
+    ParentFont = False
+    ReadOnly = True
+    ScrollBars = ssVertical
+    TabOrder = 4
+  end
+  object ebSenderAccount: TEdit
+    Left = 74
+    Height = 27
+    Top = 12
+    Width = 97
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    OnExit = ebSenderAccountExit
+    OnKeyPress = ebSenderAccountKeyPress
+    ParentFont = False
+    TabOrder = 0
+    Text = 'ebSenderAccount'
+  end
+  object ActionList: TActionList
+    left = 140
+    top = 350
+    object actExecute: TAction
+      Caption = 'Execute (F12)'
+      OnExecute = actExecuteExecute
+      ShortCut = 123
+    end
+  end
+end

+ 1425 - 0
src/gui-classic/UFRMOperation.pas

@@ -0,0 +1,1425 @@
+unit UFRMOperation;
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{ Copyright (c) 2016 by Albert Molina
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  This unit is a part of Pascal Coin, a P2P crypto currency without need of
+  historical operations.
+
+  If you like it, consider a donation using BitCoin:
+  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
+
+  }
+
+interface
+
+uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls, UNode, UWallet, UCrypto, Buttons, UBlockChain,
+  UAccounts, UFRMAccountSelect, ActnList, ComCtrls, Types, UCommon, UFRMMemoText;
+
+Const
+  CM_PC_WalletKeysChanged = WM_USER + 1;
+
+type
+
+  { TFRMOperation }
+
+  TFRMOperation = class(TForm)
+    ebChangeName: TEdit;
+    ebChangeType: TEdit;
+    ebSignerAccount: TEdit;
+    lblSignerAccount: TLabel;
+    lblAccountCaption: TLabel;
+    bbExecute: TBitBtn;
+    bbCancel: TBitBtn;
+    lblAccountBalance: TLabel;
+    lblChangeType: TLabel;
+    lblChangeName: TLabel;
+    lblBalanceCaption: TLabel;
+    ebSenderAccount: TEdit;
+    lblChangeInfoErrors: TLabel;
+    PageControlLocked: TPageControl;
+    sbSearchBuyAccount: TSpeedButton;
+    sbSearchListerSellerAccount: TSpeedButton;
+    sbSearchDestinationAccount: TSpeedButton;
+    sbSearchSignerAccount: TSpeedButton;
+    tsChangeInfo: TTabSheet;
+    tsOperation: TTabSheet;
+    gbPayload: TGroupBox;
+    lblEncryptPassword: TLabel;
+    Label4: TLabel;
+    lblEncryptionErrors: TLabel;
+    lblPayloadLength: TLabel;
+    rbEncryptedWithEC: TRadioButton;
+    rbEncrptedWithPassword: TRadioButton;
+    rbNotEncrypted: TRadioButton;
+    ebEncryptPassword: TEdit;
+    memoPayload: TMemo;
+    rbEncryptedWithOldEC: TRadioButton;
+    ActionList: TActionList;
+    actExecute: TAction;
+    tsGlobalError: TTabSheet;
+    lblGlobalErrors: TLabel;
+    bbPassword: TBitBtn;
+    memoAccounts: TMemo;
+    lblAccountsCount: TLabel;
+    lblFee: TLabel;
+    ebFee: TEdit;
+    PageControlOpType: TPageControl;
+    tsTransaction: TTabSheet;
+    lblDestAccount: TLabel;
+    lblAmount: TLabel;
+    lblTransactionErrors: TLabel;
+    ebDestAccount: TEdit;
+    ebAmount: TEdit;
+    tsChangePrivateKey: TTabSheet;
+    gbChangeKey: TGroupBox;
+    lblNewPrivateKey: TLabel;
+    lblNewOwnerPublicKey: TLabel;
+    lblNewOwnerErrors: TLabel;
+    lblChangeKeyErrors: TLabel;
+    rbChangeKeyWithAnother: TRadioButton;
+    cbNewPrivateKey: TComboBox;
+    ebNewPublicKey: TEdit;
+    bbChangePrivateKeyKeys: TBitBtn;
+    rbChangeKeyTransferAccountToNewOwner: TRadioButton;
+    tsListForSale: TTabSheet;
+    gbSaleType: TGroupBox;
+    Label1: TLabel;
+    Label3: TLabel;
+    lblSaleNewOwnerPublicKey: TLabel;
+    lblSaleLockedUntilBlock: TLabel;
+    rbListAccountForPublicSale: TRadioButton;
+    rbListAccountForPrivateSale: TRadioButton;
+    ebSalePrice: TEdit;
+    ebSellerAccount: TEdit;
+    ebSaleNewOwnerPublicKey: TEdit;
+    ebSaleLockedUntilBlock: TEdit;
+    tsDelist: TTabSheet;
+    tsBuyAccount: TTabSheet;
+    lblListAccountErrors: TLabel;
+    lblAccountToBuy: TLabel;
+    ebAccountToBuy: TEdit;
+    lblBuyAmount: TLabel;
+    ebBuyAmount: TEdit;
+    lblBuyAccountErrors: TLabel;
+    lblBuyNewKey: TLabel;
+    cbBuyNewKey: TComboBox;
+    bbBuyNewKey: TBitBtn;
+    Label2: TLabel;
+    lblDelistErrors: TLabel;
+    procedure ebNewPublicKeyExit(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+    procedure memoPayloadClick(Sender: TObject);
+    procedure ebEncryptPasswordChange(Sender: TObject);
+    procedure bbChangePrivateKeyKeysClick(Sender: TObject);
+    procedure actExecuteExecute(Sender: TObject);
+    procedure ebSenderAccountExit(Sender: TObject);
+    procedure ebSenderAccountKeyPress(Sender: TObject; var Key: Char);
+    procedure bbPasswordClick(Sender: TObject);
+    procedure PageControlOpTypeChange(Sender: TObject);
+    procedure sbSearchBuyAccountClick(Sender: TObject);
+    procedure sbSearchDestinationAccountClick(Sender: TObject);
+    procedure sbSearchListerSellerAccountClick(Sender: TObject);
+    procedure sbSearchSignerAccountClick(Sender: TObject);
+    procedure updateInfoClick(Sender: TObject);
+    procedure bbBuyNewKeyClick(Sender: TObject);
+    procedure ebAccountNumberExit(Sender: TObject);
+    procedure ebCurrencyExit(Sender: TObject);
+  private
+    FNode : TNode;
+    FWalletKeys: TWalletKeys;
+    FDefaultFee: Int64;
+    FEncodedPayload : TRawBytes;
+    FDisabled : Boolean;
+    FSenderAccounts: TOrderedCardinalList; // TODO: TOrderedCardinalList should be replaced with a "TCardinalList" since signer account should be processed last
+    procedure SetWalletKeys(const Value: TWalletKeys);
+    Procedure UpdateWalletKeys;
+    { Private declarations }
+    Procedure UpdateAccountsInfo;
+    Function UpdateFee(var Fee : Int64; errors : AnsiString) : Boolean;
+    Function UpdateOperationOptions(var errors : AnsiString) : Boolean;
+    Function UpdatePayload(Const SenderAccount : TAccount; var errors : AnsiString) : Boolean;
+    Function UpdateOpTransaction(Const SenderAccount : TAccount; var DestAccount : TAccount; var amount : Int64; var errors : AnsiString) : Boolean;
+    Function UpdateOpChangeKey(Const TargetAccount : TAccount; var SignerAccount : TAccount; var NewPublicKey : TAccountKey; var errors : AnsiString) : Boolean;
+    Function UpdateOpListForSale(Const TargetAccount : TAccount; var SalePrice : Int64; var SellerAccount,SignerAccount : TAccount; var NewOwnerPublicKey : TAccountKey; var LockedUntilBlock : Cardinal; var errors : AnsiString) : Boolean;
+    Function UpdateOpDelist(Const TargetAccount : TAccount; var SignerAccount : TAccount; var errors : AnsiString) : Boolean;
+    Function UpdateOpBuyAccount(Const SenderAccount : TAccount; var AccountToBuy : TAccount; var amount : Int64; var NewPublicKey : TAccountKey; var errors : AnsiString) : Boolean;
+    Function UpdateOpChangeInfo(Const TargetAccount : TAccount; var SignerAccount : TAccount; var changeName : Boolean; var newName : AnsiString; var changeType : Boolean; var newType : Word; var errors : AnsiString) : Boolean;
+    procedure SetDefaultFee(const Value: Int64);
+    Procedure OnSenderAccountsChanged(Sender : TObject);
+    procedure OnWalletKeysChanged(Sender : TObject);
+    procedure CM_WalletChanged(var Msg: TMessage); message CM_PC_WalletKeysChanged;
+    Function GetDefaultSenderAccount : TAccount;
+    procedure ebAccountKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+  protected
+    procedure searchAccount(editBox : TCustomEdit);
+  public
+    { Public declarations }
+    Property SenderAccounts : TOrderedCardinalList read FSenderAccounts;
+    Property WalletKeys : TWalletKeys read FWalletKeys write SetWalletKeys;
+    Property DefaultFee : Int64 read FDefaultFee write SetDefaultFee;
+  end;
+
+implementation
+
+uses
+  UECIES, UConst, UOpTransaction, UFRMNewPrivateKeyType, UAES, UFRMWalletKeys;
+
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
+
+{ TFRMOperation }
+
+procedure TFRMOperation.actExecuteExecute(Sender: TObject);
+Var errors : AnsiString;
+  P : PAccount;
+  i,iAcc : Integer;
+  wk : TWalletKey;
+  ops : TOperationsHashTree;
+  op : TPCOperation;
+  account,signerAccount,destAccount,accountToBuy : TAccount;
+  operation_to_string, operationstxt, auxs : String;
+  _amount,_fee, _totalamount, _totalfee, _totalSignerFee, _salePrice : Int64;
+  _lockedUntil, _signer_n_ops : Cardinal;
+  dooperation : Boolean;
+  _newOwnerPublicKey : TECDSA_Public;
+  _newName : TRawBytes;
+  _newType : Word;
+  _changeName, _changeType, _V2, _executeSigner  : Boolean;
+  _senderAccounts : TCardinalsArray;
+label loop_start;
+begin
+  if Not Assigned(WalletKeys) then raise Exception.Create('No wallet keys');
+  If Not UpdateOperationOptions(errors) then raise Exception.Create(errors);
+  ops := TOperationsHashTree.Create;
+  Try
+    _V2 := FNode.Bank.SafeBox.CurrentProtocol >= CT_PROTOCOL_2;
+    _totalamount := 0;
+    _totalfee := 0;
+    _totalSignerFee := 0;
+    _signer_n_ops := 0;
+    operationstxt := '';
+    operation_to_string := '';
+
+    // Compile FSenderAccounts into a reorderable array
+    _senderAccounts := FSenderAccounts.ToArray;
+
+    // Loop through each sender account
+    for iAcc := 0 to Length(_senderAccounts) - 1 do begin
+loop_start:
+      op := Nil;
+      account := FNode.Operations.SafeBoxTransaction.Account(_senderAccounts[iAcc]);
+      If Not UpdatePayload(account, errors) then
+        raise Exception.Create('Error encoding payload of sender account '+TAccountComp.AccountNumberToAccountTxtNumber(account.account)+': '+errors);
+      i := WalletKeys.IndexOfAccountKey(account.accountInfo.accountKey);
+      if i<0 then begin
+        Raise Exception.Create('Sender account private key not found in Wallet');
+      end;
+
+      wk := WalletKeys.Key[i];
+      dooperation := true;
+      // Default fee
+      if account.balance > uint64(DefaultFee) then _fee := DefaultFee else _fee := account.balance;
+      // Determine which operation type it is
+      if PageControlOpType.ActivePage = tsTransaction then begin
+        {%region Operation: Transaction}
+        if Not UpdateOpTransaction(account,destAccount,_amount,errors) then raise Exception.Create(errors);
+        if Length(_senderAccounts) > 1 then begin
+          if account.balance>0 then begin
+            if account.balance>DefaultFee then begin
+              _amount := account.balance - DefaultFee;
+              _fee := DefaultFee;
+            end else begin
+              _amount := account.balance;
+              _fee := 0;
+            end;
+          end else dooperation := false;
+        end else begin
+        end;
+        if dooperation then begin
+          op := TOpTransaction.CreateTransaction(account.account,account.n_operation+1,destAccount.account,wk.PrivateKey,_amount,_fee,FEncodedPayload);
+          inc(_totalamount,_amount);
+          inc(_totalfee,_fee);
+        end;
+        operationstxt := 'Transaction to '+TAccountComp.AccountNumberToAccountTxtNumber(destAccount.account);
+        {%endregion}
+      end else if (PageControlOpType.ActivePage = tsChangePrivateKey) then begin
+        {%region Operation: Change Private Key}
+        if Not UpdateOpChangeKey(account,signerAccount,_newOwnerPublicKey,errors) then raise Exception.Create(errors);
+        if _V2 then begin
+          // must ensure is Signer account last if included in sender accounts (not necessarily ordered enumeration)
+          if (iAcc < Length(_senderAccounts) - 1) AND (account.account = signerAccount.account) then begin
+            TArrayTool<Cardinal>.Swap(_senderAccounts, iAcc, Length(_senderAccounts) - 1); // ensure signer account processed last
+            goto loop_start; // TODO: remove ugly hack with refactoring!
+          end;
+
+          // Maintain correct signer fee distribution
+          if uint64(_totalSignerFee) >= signerAccount.balance then _fee := 0
+          else if signerAccount.balance - uint64(_totalSignerFee) > uint64(DefaultFee) then _fee := DefaultFee
+          else _fee := signerAccount.balance - uint64(_totalSignerFee);
+          op := TOpChangeKeySigned.Create(signerAccount.account,signerAccount.n_operation+_signer_n_ops+1,account.account,wk.PrivateKey,_newOwnerPublicKey,_fee,FEncodedPayload);
+          inc(_signer_n_ops);
+          inc(_totalSignerFee, _fee);
+        end else begin
+          op := TOpChangeKey.Create(account.account,account.n_operation+1,account.account,wk.PrivateKey,_newOwnerPublicKey,_fee,FEncodedPayload);
+        end;
+        inc(_totalfee,_fee);
+        operationstxt := 'Change private key to '+TAccountComp.GetECInfoTxt(_newOwnerPublicKey.EC_OpenSSL_NID);
+        {%endregion}
+      end else if (PageControlOpType.ActivePage = tsListForSale) then begin
+        {%region Operation: List For Sale}
+        If Not UpdateOpListForSale(account,_salePrice,destAccount,signerAccount,_newOwnerPublicKey,_lockedUntil,errors) then raise Exception.Create(errors);
+        // Special fee account:
+        if signerAccount.balance>DefaultFee then _fee := DefaultFee
+        else _fee := signerAccount.balance;
+        if (rbListAccountForPublicSale.Checked) then begin
+          op := TOpListAccountForSale.CreateListAccountForSale(signerAccount.account,signerAccount.n_operation+1+iAcc, account.account,_salePrice,_fee,destAccount.account,CT_TECDSA_Public_Nul,0,wk.PrivateKey,FEncodedPayload);
+        end else if (rbListAccountForPrivateSale.Checked) then begin
+          op := TOpListAccountForSale.CreateListAccountForSale(signerAccount.account,signerAccount.n_operation+1+iAcc, account.account,_salePrice,_fee,destAccount.account,_newOwnerPublicKey,_lockedUntil,wk.PrivateKey,FEncodedPayload);
+        end else raise Exception.Create('Select Sale type');
+        {%endregion}
+      end else if (PageControlOpType.ActivePage = tsDelist) then begin
+        {%region Operation: Delist For Sale}
+        if Not UpdateOpDelist(account,signerAccount,errors) then raise Exception.Create(errors);
+        // Special fee account:
+        if signerAccount.balance>DefaultFee then _fee := DefaultFee
+        else _fee := signerAccount.balance;
+        op := TOpDelistAccountForSale.CreateDelistAccountForSale(signerAccount.account,signerAccount.n_operation+1+iAcc,account.account,_fee,wk.PrivateKey,FEncodedPayload);
+        {%endregion}
+      end else if (PageControlOpType.ActivePage = tsBuyAccount) then begin
+        {%region Operation: Buy Account}
+        if Not UpdateOpBuyAccount(account,accountToBuy,_amount,_newOwnerPublicKey,errors) then raise Exception.Create(errors);
+        op := TOpBuyAccount.CreateBuy(account.account,account.n_operation+1,accountToBuy.account,accountToBuy.accountInfo.account_to_pay,
+          accountToBuy.accountInfo.price,_amount,_fee,_newOwnerPublicKey,wk.PrivateKey,FEncodedPayload);
+        {%endregion}
+      end else if (PageControlOpType.ActivePage = tsChangeInfo) then begin
+        {%region Operation: Change Info}
+        if not UpdateOpChangeInfo(account,signerAccount,_changeName,_newName,_changeType,_newType,errors) then begin
+          If Length(_senderAccounts)=1 then raise Exception.Create(errors);
+        end else begin
+          if signerAccount.balance>DefaultFee then _fee := DefaultFee
+          else _fee := signerAccount.balance;
+          op := TOpChangeAccountInfo.CreateChangeAccountInfo(signerAccount.account,signerAccount.n_operation+1,account.account,wk.PrivateKey,false,CT_TECDSA_Public_Nul,
+             _changeName,_newName,_changeType,_newType,_fee,FEncodedPayload);
+        end;
+        {%endregion}
+      end else begin
+        raise Exception.Create('No operation selected');
+      end;
+      if Assigned(op) And (dooperation) then begin
+        ops.AddOperationToHashTree(op);
+        if operation_to_string<>'' then operation_to_string := operation_to_string + #10;
+        operation_to_string := operation_to_string + op.ToString;
+      end;
+      FreeAndNil(op);
+    end;
+
+    if (ops.OperationsCount=0) then raise Exception.Create('No valid operation to execute');
+
+    if (Length(_senderAccounts)>1) then begin
+      if PageControlOpType.ActivePage = tsTransaction then auxs := 'Total amount that dest will receive: '+TAccountComp.FormatMoney(_totalamount)+#10
+      else auxs:='';
+      if Application.MessageBox(PChar('Execute '+Inttostr(Length(_senderAccounts))+' operations?'+#10+
+        'Operation: '+operationstxt+#10+
+        auxs+
+        'Total fee: '+TAccountComp.FormatMoney(_totalfee)+#10+#10+'Note: This operation will be transmitted to the network!'),
+        PChar(Application.Title),MB_YESNO+MB_ICONINFORMATION+MB_DEFBUTTON2)<>IdYes then exit;
+    end else begin
+      if Application.MessageBox(PChar('Execute this operation:'+#10+#10+operation_to_string+#10+#10+'Note: This operation will be transmitted to the network!'),
+        PChar(Application.Title),MB_YESNO+MB_ICONINFORMATION+MB_DEFBUTTON2)<>IdYes then exit;
+    end;
+    i := FNode.AddOperations(nil,ops,Nil,errors);
+    if (i=ops.OperationsCount) then begin
+      operationstxt := 'Successfully executed '+inttostr(i)+' operations!'+#10+#10+operation_to_string;
+      If i>1 then begin
+        With TFRMMemoText.Create(Self) do
+        Try
+          InitData(Application.Title,operationstxt);
+          ShowModal;
+        finally
+          Free;
+        end;
+      end else begin
+        Application.MessageBox(PChar('Successfully executed '+inttostr(i)+' operations!'+#10+#10+operation_to_string),PChar(Application.Title),MB_OK+MB_ICONINFORMATION);
+      end;
+      ModalResult := MrOk;
+    end else if (i>0) then begin
+      operationstxt := 'One or more of your operations has not been executed:'+#10+
+        'Errors:'+#10+
+        errors+#10+#10+
+        'Total successfully executed operations: '+inttostr(i);
+      With TFRMMemoText.Create(Self) do
+      Try
+        InitData(Application.Title,operationstxt);
+        ShowModal;
+      finally
+        Free;
+      end;
+      ModalResult := MrOk;
+    end else begin
+      raise Exception.Create(errors);
+    end;
+  Finally
+    ops.Free;
+  End;
+end;
+
+procedure TFRMOperation.bbBuyNewKeyClick(Sender: TObject);
+Var FRM : TFRMWalletKeys;
+begin
+  FRM := TFRMWalletKeys.Create(Self);
+  Try
+    FRM.WalletKeys := WalletKeys;
+    FRM.ShowModal;
+    cbBuyNewKey.SetFocus;
+    UpdateWalletKeys;
+  Finally
+    FRM.Free;
+  End;
+end;
+
+procedure TFRMOperation.bbChangePrivateKeyKeysClick(Sender: TObject);
+Var FRM : TFRMWalletKeys;
+begin
+  FRM := TFRMWalletKeys.Create(Self);
+  Try
+    FRM.WalletKeys := WalletKeys;
+    FRM.ShowModal;
+    rbChangeKeyWithAnother.Checked := true;
+    cbNewPrivateKey.SetFocus;
+    UpdateWalletKeys;
+  Finally
+    FRM.Free;
+  End;
+end;
+
+procedure TFRMOperation.bbPasswordClick(Sender: TObject);
+Var s : String;
+  errors : AnsiString;
+begin
+  if FWalletKeys.IsValidPassword then begin
+  end else begin
+    s := '';
+    Repeat
+      if Not InputQuery('Wallet password','Enter wallet password',s) then exit;
+      FWalletKeys.WalletPassword := s;
+    Until FWalletKeys.IsValidPassword;
+    SetWalletKeys(WalletKeys);
+    UpdateOperationOptions(errors);
+  end;
+end;
+
+procedure TFRMOperation.CM_WalletChanged(var Msg: TMessage);
+begin
+   UpdateWalletKeys;
+end;
+
+procedure TFRMOperation.ebAccountNumberExit(Sender: TObject);
+Var an : Cardinal;
+  eb : TEdit;
+begin
+  if (Not assigned(Sender)) then exit;
+  if (Not (Sender is TEdit)) then exit;
+  eb := TEdit(Sender);
+  If TAccountComp.AccountTxtNumberToAccountNumber(eb.Text,an) then begin
+    eb.Text := TAccountComp.AccountNumberToAccountTxtNumber(an);
+  end else begin
+    eb.Text := '';
+  end;
+  updateInfoClick(Nil);
+end;
+
+procedure TFRMOperation.ebCurrencyExit(Sender: TObject);
+Var m : Int64;
+  eb : TEdit;
+begin
+  if (Not assigned(Sender)) then exit;
+  if (Not (Sender is TEdit)) then exit;
+  eb := TEdit(Sender);
+  If Not (eb.ReadOnly) then begin
+    if Not TAccountComp.TxtToMoney(eb.Text,m) then m:=0;
+    eb.Text := TAccountComp.FormatMoney(m);
+    updateInfoClick(Nil);
+  end;
+end;
+
+procedure TFRMOperation.ebEncryptPasswordChange(Sender: TObject);
+begin
+  if FDisabled then exit;
+  rbEncrptedWithPassword.Checked := true;
+  memoPayloadClick(Nil);
+end;
+
+procedure TFRMOperation.ebSenderAccountExit(Sender: TObject);
+Var an : Cardinal;
+begin
+  If TAccountComp.AccountTxtNumberToAccountNumber(ebSenderAccount.Text,an) then begin
+    SenderAccounts.Disable;
+    try
+      SenderAccounts.Clear;
+      SenderAccounts.Add(an);
+    finally
+      SenderAccounts.Enable;
+    end;
+    ebSenderAccount.Text := TAccountComp.AccountNumberToAccountTxtNumber(an);
+  end else begin
+    if SenderAccounts.Count=1 then begin
+      ebSenderAccount.Text := TAccountComp.AccountNumberToAccountTxtNumber(SenderAccounts.Get(0));
+    end else begin
+      ebSenderAccount.Text := '';
+    end;
+  end;
+end;
+
+procedure TFRMOperation.ebSenderAccountKeyPress(Sender: TObject; var Key: Char);
+begin
+  if Key=#13 then ebSenderAccountExit(Nil);
+end;
+
+procedure TFRMOperation.FormCreate(Sender: TObject);
+begin
+  FDisabled := false;
+  FWalletKeys := Nil;
+  FSenderAccounts := TOrderedCardinalList.Create;
+  FSenderAccounts.OnListChanged := OnSenderAccountsChanged;
+  FDisabled := true;
+  FNode := TNode.Node;
+  ebSenderAccount.OnKeyDown:=ebAccountKeyDown;
+  ebSenderAccount.Tag:=CT_AS_MyAccounts;
+  ebSignerAccount.Text:='';
+  ebSignerAccount.OnChange := updateInfoClick;
+  ebSignerAccount.OnExit := ebAccountNumberExit;
+  ebSignerAccount.OnKeyDown := ebAccountKeyDown;
+  ebSignerAccount.tag := CT_AS_MyAccounts;
+  sbSearchSignerAccount.OnClick := sbSearchSignerAccountClick;
+
+  //
+  lblTransactionErrors.Caption := '';
+  ebDestAccount.Text := '';
+  ebDestAccount.OnChange := updateInfoClick;
+  ebDestAccount.OnExit := ebAccountNumberExit;
+  ebDestAccount.OnKeyDown := ebAccountKeyDown;
+  ebAmount.Text := TAccountComp.FormatMoney(0);
+  ebAmount.OnChange := updateInfoClick;
+  ebAmount.OnExit := ebCurrencyExit;
+  //
+  lblChangeKeyErrors.Caption := '';
+  lblNewOwnerErrors.Caption := '';
+  rbChangeKeyWithAnother.OnClick := updateInfoClick;
+  rbChangeKeyTransferAccountToNewOwner.OnClick := updateInfoClick;
+  cbNewPrivateKey.OnChange := updateInfoClick;
+  //
+  lblListAccountErrors.Caption := '';
+  rbListAccountForPublicSale.OnClick := updateInfoClick;
+  rbListAccountForPrivateSale.OnClick := updateInfoClick;
+  ebSalePrice.Text := TAccountComp.FormatMoney(0);
+  ebSalePrice.OnChange := updateInfoClick;
+  ebSalePrice.OnExit := ebCurrencyExit;
+
+  ebSellerAccount.Text := '';
+  ebSellerAccount.OnChange := updateInfoClick;
+  ebSellerAccount.OnExit := ebAccountNumberExit;
+  ebSellerAccount.OnKeyDown := ebAccountKeyDown;
+  ebSellerAccount.tag := CT_AS_MyAccounts;
+  ebSaleNewOwnerPublicKey.Text := '';
+  ebSaleNewOwnerPublicKey.OnChange := updateInfoClick;
+  ebSaleLockedUntilBlock.Text := '';
+  ebSaleLockedUntilBlock.OnChange := updateInfoClick;
+
+  //
+  lblDelistErrors.Caption := '';
+  //
+  lblBuyAccountErrors.Caption := '';
+  ebAccountToBuy.Text := '';
+  ebAccountToBuy.OnChange :=  updateInfoClick;
+  ebAccountToBuy.OnExit := ebAccountNumberExit;
+  ebAccountToBuy.OnKeyDown := ebAccountKeyDown;
+  ebAccountToBuy.tag := CT_AS_OnlyForSale;
+  ebBuyAmount.Text := TAccountComp.FormatMoney(0);
+  ebBuyAmount.OnChange :=  updateInfoClick;
+  ebBuyAmount.OnExit := ebCurrencyExit;
+  //
+  ebChangeName.OnChange:=updateInfoClick;
+  ebChangeType.OnChange:=updateInfoClick;
+  //
+  sbSearchDestinationAccount.OnClick := sbSearchDestinationAccountClick;
+  sbSearchListerSellerAccount.OnClick := sbSearchListerSellerAccountClick;
+  sbSearchBuyAccount.OnClick := sbSearchBuyAccountClick;
+  //
+  ebFee.Text := TAccountComp.FormatMoney(0);
+  ebFee.OnExit:= ebCurrencyExit;
+  memoAccounts.Lines.Clear;
+  PageControlOpType.ActivePage := tsTransaction;
+end;
+
+procedure TFRMOperation.ebNewPublicKeyExit(Sender: TObject);
+var errors : AnsiString;
+begin
+  UpdateOperationOptions(errors);
+end;
+
+procedure TFRMOperation.FormDestroy(Sender: TObject);
+begin
+  if Assigned(FWalletKeys) then FWalletKeys.OnChanged.Remove(OnWalletKeysChanged);
+  FreeAndNil(FSenderAccounts);
+end;
+
+function TFRMOperation.GetDefaultSenderAccount: TAccount;
+begin
+  if FSenderAccounts.Count>=1 then Result := FNode.Operations.SafeBoxTransaction.Account( FSenderAccounts.Get(0) )
+  else Result := CT_Account_NUL;
+end;
+
+procedure TFRMOperation.ebAccountKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+Var eb : TCustomEdit;
+begin
+  If (key <> VK_F2) then exit;
+  If Not Assigned(Sender) then exit;
+  if Not (Sender is TCustomEdit) then exit;
+  eb := TCustomEdit(Sender);
+  searchAccount(eb);
+end;
+
+procedure TFRMOperation.searchAccount(editBox: TCustomEdit);
+Var F : TFRMAccountSelect;
+  c : Cardinal;
+begin
+  F := TFRMAccountSelect.Create(Self);
+  try
+    F.Node := FNode;
+    F.WalletKeys := FWalletKeys;
+    F.Filters:=editBox.Tag;
+    If TAccountComp.AccountTxtNumberToAccountNumber(editBox.Text,c) then F.DefaultAccount := c;
+    F.AllowSelect:=True;
+    If F.ShowModal=MrOk then begin
+      editBox.Text := TAccountComp.AccountNumberToAccountTxtNumber(F.GetSelected);
+    end;
+  finally
+    F.Free;
+  end;
+end;
+
+procedure TFRMOperation.memoPayloadClick(Sender: TObject);
+Var errors : AnsiString;
+begin
+  if SenderAccounts.Count>0 then begin
+    UpdatePayload(TNode.Node.Bank.SafeBox.Account(SenderAccounts.Get(0)),errors);
+  end;
+end;
+
+procedure TFRMOperation.OnSenderAccountsChanged(Sender: TObject);
+Var errors : AnsiString;
+begin
+  if SenderAccounts.Count>1 then begin
+    ebAmount.Text := 'ALL BALANCE';
+    ebAmount.font.Style := [fsBold];
+    ebAmount.ReadOnly := true;
+  end else begin
+    ebAmount.Text := TAccountComp.FormatMoney(0);
+    ebAmount.ReadOnly := false;
+    ebAmount.Enabled := true;
+  end;
+  If SenderAccounts.Count>=1 then begin
+    ebSignerAccount.text := TAccountComp.AccountNumberToAccountTxtNumber(SenderAccounts.Get(0));
+    ebChangeName.Text := FNode.Operations.SafeBoxTransaction.Account(SenderAccounts.Get(0)).name;
+    ebChangeType.Text := IntToStr(FNode.Operations.SafeBoxTransaction.Account(SenderAccounts.Get(0)).account_type);
+  end else begin
+    ebSignerAccount.text := '';
+    ebChangeName.Text := '';
+    ebChangeType.Text := '';
+  end;
+  UpdateAccountsInfo;
+  UpdateOperationOptions(errors);
+end;
+
+procedure TFRMOperation.OnWalletKeysChanged(Sender: TObject);
+begin
+  PostMessage(Self.Handle,CM_PC_WalletKeysChanged,0,0);
+end;
+
+procedure TFRMOperation.PageControlOpTypeChange(Sender: TObject);
+var errors : AnsiString;
+begin
+  UpdateOperationOptions(errors);
+end;
+
+procedure TFRMOperation.sbSearchBuyAccountClick(Sender: TObject);
+begin
+  searchAccount(ebAccountToBuy);
+end;
+
+procedure TFRMOperation.sbSearchDestinationAccountClick(Sender: TObject);
+begin
+  searchAccount(ebDestAccount);
+end;
+
+procedure TFRMOperation.sbSearchListerSellerAccountClick(Sender: TObject);
+begin
+  searchAccount(ebSellerAccount);
+end;
+
+procedure TFRMOperation.sbSearchSignerAccountClick(Sender: TObject);
+begin
+  searchAccount(ebSignerAccount);
+end;
+
+procedure TFRMOperation.SetDefaultFee(const Value: Int64);
+var wd : Boolean;
+begin
+  if FDefaultFee = Value then exit;
+  wd := FDisabled;
+  try
+    FDisabled := true;
+    FDefaultFee := Value;
+    ebFee.Text := TAccountComp.FormatMoney(value);
+  finally
+    FDisabled := wd;
+  end;
+end;
+
+procedure TFRMOperation.SetWalletKeys(const Value: TWalletKeys);
+begin
+  Try
+    if FWalletKeys=Value then exit;
+    if Assigned(FWalletKeys) then FWalletKeys.OnChanged.Remove(OnWalletKeysChanged);
+    FWalletKeys := Value;
+    if Assigned(FWalletKeys) then begin
+      FWalletKeys.OnChanged.Add(OnWalletKeysChanged);
+    end;
+  Finally
+    UpdateWalletKeys;
+  End;
+end;
+
+procedure TFRMOperation.UpdateAccountsInfo;
+Var ld : Boolean;
+  i : Integer;
+  balance : int64;
+  acc : TAccount;
+  accountstext : String;
+begin
+  ld := FDisabled;
+  FDisabled := true;
+  Try
+    lblAccountCaption.Caption := 'Account';
+    lblAccountsCount.Visible := false;
+    lblAccountsCount.caption := inttostr(senderAccounts.Count)+' accounts';
+    balance := 0;
+    if SenderAccounts.Count<=0 then begin
+      ebSenderAccount.Text := '';
+      memoAccounts.Visible := false;
+      ebSenderAccount.Visible := true;
+    end else if SenderAccounts.Count=1 then begin
+      ebSenderAccount.Text := TAccountComp.AccountNumberToAccountTxtNumber(SenderAccounts.Get(0));
+      memoAccounts.Visible := false;
+      ebSenderAccount.Visible := true;
+      balance := TNode.Node.Operations.SafeBoxTransaction.Account(SenderAccounts.Get(0)).balance;
+    end else begin
+      // Multiple sender accounts
+      lblAccountCaption.Caption := 'Accounts';
+      lblAccountsCount.Visible := true;
+      ebSenderAccount.Visible := false;
+      accountstext := '';
+      for i := 0 to SenderAccounts.Count - 1 do begin
+         acc := TNode.Node.Operations.SafeBoxTransaction.Account(SenderAccounts.Get(i));
+         balance := balance + acc.balance;
+         if (accountstext<>'') then accountstext:=accountstext+'; ';
+         accountstext := accountstext+TAccountComp.AccountNumberToAccountTxtNumber(acc.account)+' ('+TAccountComp.FormatMoney(acc.balance)+')';
+      end;
+      memoAccounts.Lines.Text := accountstext;
+      memoAccounts.Visible := true;
+    end;
+    ebSenderAccount.Enabled := ebSenderAccount.Visible;
+    lblAccountBalance.Caption := TAccountComp.FormatMoney(balance);
+  Finally
+    FDisabled := ld;
+  End;
+end;
+
+function TFRMOperation.UpdateFee(var Fee: Int64; errors: AnsiString): Boolean;
+begin
+  errors := '';
+  if trim(ebFee.Text)<>'' then begin
+    Result := TAccountComp.TxtToMoney(Trim(ebFee.Text),Fee);
+    if not Result then errors := 'Invalid fee value "'+ebFee.Text+'"';
+  end else begin
+    Fee := 0;
+    Result := true;
+  end;
+end;
+
+procedure TFRMOperation.updateInfoClick(Sender: TObject);
+Var errors : AnsiString;
+begin
+  UpdateOperationOptions(errors);
+end;
+
+function TFRMOperation.UpdateOpBuyAccount(const SenderAccount: TAccount; var AccountToBuy: TAccount; var amount: Int64; var NewPublicKey: TAccountKey; var errors: AnsiString): Boolean;
+var c : Cardinal;
+  i : Integer;
+begin
+  //
+  lblBuyAccountErrors.Caption := ''; c:=0;
+  errors := '';
+  Try
+    if SenderAccounts.Count<>1 then begin
+      errors := 'Cannot buy accounts with multioperations. Use only 1 account';
+      exit;
+    end;
+    If (Not TAccountComp.AccountTxtNumberToAccountNumber(ebAccountToBuy.Text,c)) then begin
+      errors := 'Invalid account to buy '+ebAccountToBuy.Text;
+      exit;
+    end;
+    If (c<0) Or (c>=FNode.Bank.AccountsCount) Or (c=SenderAccount.account) then begin
+      errors := 'Invalid account number';
+      exit;
+    end;
+    AccountToBuy := FNode.Operations.SafeBoxTransaction.Account(c);
+    If not TAccountComp.IsAccountForSale(AccountToBuy.accountInfo) then begin
+      errors := 'Account '+TAccountComp.AccountNumberToAccountTxtNumber(c)+' is not for sale';
+      exit;
+    end;
+    If Not TAccountComp.TxtToMoney(ebBuyAmount.Text,amount) then begin
+      errors := 'Invalid amount value';
+      exit;
+    end;
+    if (AccountToBuy.accountInfo.price>amount) then begin
+      errors := 'Account price '+TAccountComp.FormatMoney(AccountToBuy.accountInfo.price);
+      exit;
+    end;
+    if (amount+DefaultFee > SenderAccount.balance) then begin
+      errors := 'Insufficient funds';
+      exit;
+    end;
+    if cbBuyNewKey.ItemIndex<0 then begin
+      errors := 'Must select a new private key';
+      exit;
+    end;
+    i := PtrInt(cbBuyNewKey.Items.Objects[cbBuyNewKey.ItemIndex]);
+    if (i<0) Or (i>=WalletKeys.Count) then raise Exception.Create('Invalid selected key');
+    NewPublicKey := WalletKeys.Key[i].AccountKey;
+    If (FNode.Bank.SafeBox.CurrentProtocol=CT_PROTOCOL_1) then begin
+      errors := 'This operation needs PROTOCOL 2 active';
+      exit;
+    end;
+  Finally
+    Result := errors = '';
+    lblBuyAccountErrors.Caption := errors;
+  End;
+end;
+
+function TFRMOperation.UpdateOpChangeInfo(const TargetAccount: TAccount; var SignerAccount : TAccount;
+   var changeName : Boolean; var newName: AnsiString; var changeType : Boolean; var newType: Word; var errors: AnsiString): Boolean;
+var auxC : Cardinal;
+  i : Integer;
+  errCode : Integer;
+begin
+  Result := false;
+  errors := '';
+  lblChangeInfoErrors.Caption:='';
+  if not (PageControlOpType.ActivePage=tsChangeInfo) then exit;
+  try
+    if (TAccountComp.IsAccountLocked(TargetAccount.accountInfo,FNode.Bank.BlocksCount)) then begin
+      errors := 'Account '+TAccountComp.AccountNumberToAccountTxtNumber(TargetAccount.account)+' is locked until block '+IntToStr(TargetAccount.accountInfo.locked_until_block);
+      exit;
+    end;
+    // Signer:
+    if SenderAccounts.Count=1 then begin
+      If Not TAccountComp.AccountTxtNumberToAccountNumber(ebSignerAccount.Text,auxC) then begin
+        errors := 'Invalid signer account';
+        exit;
+      end;
+    end else begin
+       auxC := TargetAccount.account;
+    end;
+    if (auxC<0) Or (auxC >= FNode.Bank.AccountsCount) then begin
+      errors := 'Signer account does not exists '+TAccountComp.AccountNumberToAccountTxtNumber(auxC);
+      exit;
+    end;
+    SignerAccount := FNode.Operations.SafeBoxTransaction.Account(auxC);
+    if (TAccountComp.IsAccountLocked(SignerAccount.accountInfo,FNode.Bank.BlocksCount)) then begin
+      errors := 'Signer account '+TAccountComp.AccountNumberToAccountTxtNumber(SignerAccount.account)+' is locked until block '+IntToStr(SignerAccount.accountInfo.locked_until_block);
+      exit;
+    end;
+    if (Not TAccountComp.EqualAccountKeys(SignerAccount.accountInfo.accountKey,TargetAccount.accountInfo.accountKey)) then begin
+      errors := 'Signer account '+TAccountComp.AccountNumberToAccountTxtNumber(SignerAccount.account)+' is not ower of account '+TAccountComp.AccountNumberToAccountTxtNumber(TargetAccount.account);
+      exit;
+    end;
+    If (FNode.Bank.SafeBox.CurrentProtocol=CT_PROTOCOL_1) then begin
+      errors := 'This operation needs PROTOCOL 2 active';
+      exit;
+    end;
+    // New name and type (only when single operation)
+    If (SenderAccounts.Count=1) then begin
+      newName := LowerCase( Trim(ebChangeName.Text) );
+      If newName<>TargetAccount.name then begin
+        changeName:=True;
+        If newName<>'' then begin
+          if (Not TPCSafeBox.ValidAccountName(newName,errors)) then begin
+            errors := '"'+newName+'" is not a valid name: '+errors;
+            Exit;
+          end;
+          i := (FNode.Bank.SafeBox.FindAccountByName(newName));
+          if (i>=0) then begin
+            errors := 'Name "'+newName+'" is used by account '+TAccountComp.AccountNumberToAccountTxtNumber(i);
+            Exit;
+          end;
+        end;
+      end else changeName := False;
+    end else changeName := False;
+    val(ebChangeType.Text,newType,errCode);
+    if (errCode>0) then begin
+      errors := 'Invalid type '+ebChangeType.text;
+      Exit;
+    end;
+    changeType := TargetAccount.account_type<>newType;
+    //
+    If (SenderAccounts.Count=1) And (newName=TargetAccount.name) And (newType=TargetAccount.account_type) then begin
+      errors := 'Account name and type are the same. Not changed';
+      Exit;
+    end;
+  finally
+    Result := errors = '';
+    if Not Result then begin
+      lblChangeInfoErrors.Font.Color := clRed;
+      lblChangeInfoErrors.Caption := errors;
+    end else begin
+      lblChangeInfoErrors.Font.Color := clGreen;
+      If (SenderAccounts.Count=1) then
+        lblChangeInfoErrors.Caption := TAccountComp.AccountNumberToAccountTxtNumber(TargetAccount.account)+' can be updated'
+      else lblChangeInfoErrors.Caption := IntToStr(SenderAccounts.Count)+' accounts can be updated'
+    end;
+  end;
+end;
+
+function TFRMOperation.UpdateOpChangeKey(Const TargetAccount : TAccount; var SignerAccount : TAccount; var NewPublicKey: TAccountKey; var errors: AnsiString): Boolean;
+var i : Integer;
+  auxC : Cardinal;
+begin
+  Result := false;
+  errors := '';
+  lblChangeKeyErrors.Caption := '';
+  lblNewOwnerErrors.Caption := '';
+  if not (PageControlOpType.ActivePage=tsChangePrivateKey) then exit;
+  try
+    if rbChangeKeyWithAnother.Checked then begin
+      if cbNewPrivateKey.ItemIndex<0 then begin
+        errors := 'Must select a new private key';
+        lblChangeKeyErrors.Caption := errors;
+        exit;
+      end;
+      i := PtrInt(cbNewPrivateKey.Items.Objects[cbNewPrivateKey.ItemIndex]);
+      if (i<0) Or (i>=WalletKeys.Count) then raise Exception.Create('Invalid selected key');
+      NewPublicKey := WalletKeys.Key[i].AccountKey;
+    end else if rbChangeKeyTransferAccountToNewOwner.Checked then begin
+      If Not TAccountComp.AccountKeyFromImport(ebNewPublicKey.Text,NewPublicKey,errors) then begin
+        lblNewOwnerErrors.Caption := errors;
+        lblNewOwnerErrors.Font.Color := clRed;
+        exit;
+      end else begin
+        lblNewOwnerErrors.Caption := 'New key type: '+TAccountComp.GetECInfoTxt(NewPublicKey.EC_OpenSSL_NID);
+        lblNewOwnerErrors.Font.Color := clGreen;
+      end;
+    end else begin
+      errors := 'Select a change type';
+      lblChangeKeyErrors.Caption := errors;
+      exit;
+    end;
+    If FNode.Bank.SafeBox.CurrentProtocol>=1 then begin
+      // Signer:
+      If Not TAccountComp.AccountTxtNumberToAccountNumber(ebSignerAccount.Text,auxC) then begin
+        errors := 'Invalid signer account';
+        exit;
+      end;
+      if (auxC<0) Or (auxC >= FNode.Bank.AccountsCount) then begin
+        errors := 'Signer account does not exists '+TAccountComp.AccountNumberToAccountTxtNumber(auxC);
+        exit;
+      end;
+      SignerAccount := FNode.Operations.SafeBoxTransaction.Account(auxC);
+      if (TAccountComp.IsAccountLocked(SignerAccount.accountInfo,FNode.Bank.BlocksCount)) then begin
+        errors := 'Signer account '+TAccountComp.AccountNumberToAccountTxtNumber(SignerAccount.account)+' is locked until block '+IntToStr(SignerAccount.accountInfo.locked_until_block);
+        exit;
+      end;
+      if (Not TAccountComp.EqualAccountKeys(SignerAccount.accountInfo.accountKey,TargetAccount.accountInfo.accountKey)) then begin
+        errors := 'Signer account '+TAccountComp.AccountNumberToAccountTxtNumber(SignerAccount.account)+' is not ower of account '+TAccountComp.AccountNumberToAccountTxtNumber(TargetAccount.account);
+        exit;
+      end;
+    end else SignerAccount := TargetAccount;
+    if (TAccountComp.EqualAccountKeys(TargetAccount.accountInfo.accountKey,NewPublicKey)) then begin
+      errors := 'New public key is the same public key';
+      lblChangeKeyErrors.Caption := errors;
+      lblNewOwnerErrors.Caption := errors;
+      exit;
+    end;
+  finally
+    Result := errors = '';
+  end;
+end;
+
+function TFRMOperation.UpdateOpDelist(const TargetAccount : TAccount; var SignerAccount : TAccount; var errors: AnsiString): Boolean;
+Var auxC : Cardinal;
+begin
+  lblDelistErrors.Caption := '';
+  errors := '';
+  Result := false;
+  if not (PageControlOpType.ActivePage=tsDelist) then exit;
+  try
+    if Not TAccountComp.IsAccountForSale(TargetAccount.accountInfo) then begin
+      errors := 'Account '+TAccountComp.AccountNumberToAccountTxtNumber(TargetAccount.account)+' is not for sale';
+      exit;
+    end;
+    if (TAccountComp.IsAccountLocked(TargetAccount.accountInfo,FNode.Bank.BlocksCount)) then begin
+      errors := 'Account '+TAccountComp.AccountNumberToAccountTxtNumber(TargetAccount.account)+' is locked until block '+IntToStr(TargetAccount.accountInfo.locked_until_block);
+      exit;
+    end;
+    // Signer:
+    If Not TAccountComp.AccountTxtNumberToAccountNumber(ebSignerAccount.Text,auxC) then begin
+      errors := 'Invalid signer account';
+      exit;
+    end;
+    if (auxC<0) Or (auxC >= FNode.Bank.AccountsCount) then begin
+      errors := 'Signer account does not exists '+TAccountComp.AccountNumberToAccountTxtNumber(auxC);
+      exit;
+    end;
+    SignerAccount := FNode.Operations.SafeBoxTransaction.Account(auxC);
+    if (TAccountComp.IsAccountLocked(SignerAccount.accountInfo,FNode.Bank.BlocksCount)) then begin
+      errors := 'Signer account '+TAccountComp.AccountNumberToAccountTxtNumber(SignerAccount.account)+' is locked until block '+IntToStr(SignerAccount.accountInfo.locked_until_block);
+      exit;
+    end;
+    if (Not TAccountComp.EqualAccountKeys(SignerAccount.accountInfo.accountKey,TargetAccount.accountInfo.accountKey)) then begin
+      errors := 'Signer account '+TAccountComp.AccountNumberToAccountTxtNumber(SignerAccount.account)+' is not ower of delisted account '+TAccountComp.AccountNumberToAccountTxtNumber(TargetAccount.account);
+      exit;
+    end;
+    If (FNode.Bank.SafeBox.CurrentProtocol=CT_PROTOCOL_1) then begin
+      errors := 'This operation needs PROTOCOL 2 active';
+      exit;
+    end;
+  finally
+    Result := errors = '';
+    if Not Result then begin
+      lblDelistErrors.Font.Color := clRed;
+      lblDelistErrors.Caption := errors;
+    end else begin
+      lblDelistErrors.Font.Color := clGreen;
+      lblDelistErrors.Caption := TAccountComp.AccountNumberToAccountTxtNumber(TargetAccount.account)+' can be delisted';
+    end;
+  end;
+end;
+
+function TFRMOperation.UpdateOperationOptions(var errors : AnsiString) : Boolean;
+Var
+  iWallet,iAcc : Integer;
+  wk : TWalletKey;
+  e : AnsiString;
+  sender_account,dest_account,seller_account, account_to_buy, signer_account : TAccount;
+  publicKey : TAccountKey;
+  salePrice, amount : Int64;
+  auxC : Cardinal;
+  changeName,changeType : Boolean;
+  newName : AnsiString;
+  newType : Word;
+begin
+  Result := false;
+  sender_account := CT_Account_NUL;
+  errors := '';
+  if Not UpdateFee(FDefaultFee,errors) then exit;
+  try
+    bbPassword.Visible := false;
+    bbPassword.Enabled := false;
+    if Not Assigned(WalletKeys) then begin
+      errors := 'No wallet keys';
+      lblGlobalErrors.Caption := errors;
+      exit;
+    end;
+    if SenderAccounts.Count=0 then begin
+      errors := 'No sender account';
+      lblGlobalErrors.Caption := errors;
+      exit;
+    end else begin
+      for iAcc := 0 to SenderAccounts.Count - 1 do begin
+        sender_account := TNode.Node.Bank.SafeBox.Account(SenderAccounts.Get(iAcc));
+        iWallet := WalletKeys.IndexOfAccountKey(sender_account.accountInfo.accountKey);
+        if (iWallet<0) then begin
+          errors := 'Private key of account '+TAccountComp.AccountNumberToAccountTxtNumber(sender_account.account)+' not found in wallet';
+          lblGlobalErrors.Caption := errors;
+          exit;
+        end;
+        wk := WalletKeys.Key[iWallet];
+        if not assigned(wk.PrivateKey) then begin
+          if wk.CryptedKey<>'' then begin
+            errors := 'Wallet is password protected. Need password';
+            bbPassword.Visible := true;
+            bbPassword.Enabled := true;
+          end else begin
+            errors := 'Only public key of account '+TAccountComp.AccountNumberToAccountTxtNumber(sender_account.account)+' found in wallet. You cannot operate with this account';
+          end;
+          lblGlobalErrors.Caption := errors;
+          exit;
+        end;
+      end;
+    end;
+    lblGlobalErrors.Caption := '';
+  Finally
+    if lblGlobalErrors.Caption<>'' then begin
+      tsGlobalError.visible := true;
+      tsGlobalError.tabvisible := {$IFDEF LINUX}true{$ELSE}false{$ENDIF};
+      tsOperation.TabVisible := false;
+      PageControlLocked.ActivePage := tsGlobalError;
+      if bbPassword.CanFocus then begin
+        ActiveControl := bbPassword;
+      end;
+    end else begin
+      tsOperation.visible := true;
+      tsOperation.tabvisible := {$IFDEF LINUX}true{$ELSE}false{$ENDIF};
+      tsGlobalError.TabVisible := false;
+      PageControlLocked.ActivePage := tsOperation;
+    end;
+  End;
+  if (PageControlOpType.ActivePage = tsTransaction) then begin
+    Result := UpdateOpTransaction(GetDefaultSenderAccount,dest_account,amount,errors);
+  end else if (PageControlOpType.ActivePage = tsChangePrivateKey) then begin
+    Result := UpdateOpChangeKey(GetDefaultSenderAccount,signer_account,publicKey,errors);
+  end else if (PageControlOpType.ActivePage = tsListForSale) then begin
+    Result := UpdateOpListForSale(GetDefaultSenderAccount,salePrice,seller_account,signer_account,publicKey,auxC,errors);
+  end else if (PageControlOpType.ActivePage = tsDelist) then begin
+    Result := UpdateOpDelist(GetDefaultSenderAccount,signer_account,errors);
+  end else if (PageControlOpType.ActivePage = tsBuyAccount) then begin
+    Result := UpdateOpBuyAccount(GetDefaultSenderAccount,account_to_buy,amount,publicKey,errors);
+  end else if (PageControlOpType.ActivePage = tsChangeInfo) then begin
+    Result := UpdateOpChangeInfo(GetDefaultSenderAccount,signer_account,changeName,newName,changeType,newType,errors);
+  end else begin
+    errors := 'Must select an operation';
+  end;
+  if (PageControlOpType.ActivePage=tsTransaction) then begin
+    rbEncryptedWithOldEC.Caption := 'Encrypted with sender public key';
+    rbEncryptedWithEC.Caption := 'Encrypted with destination public key';
+  end else if (PageControlOpType.ActivePage=tsChangePrivateKey) then begin
+    rbEncryptedWithOldEC.Caption := 'Encrypted with old public key';
+    rbEncryptedWithEC.Caption := 'Encrypted with new public key';
+  end else if ((PageControlOpType.ActivePage=tsListForSale) Or (PageControlOpType.ActivePage=tsDelist)) then begin
+    rbEncryptedWithOldEC.Caption := 'Encrypted with target public key';
+    rbEncryptedWithEC.Caption := 'Encrypted with signer public key';
+  end else if (PageControlOpType.ActivePage=tsBuyAccount) then begin
+    rbEncryptedWithOldEC.Caption := 'Encrypted with buyer public key';
+    rbEncryptedWithEC.Caption := 'Encrypted with target public key';
+  end;
+  ebSignerAccount.Enabled:= ((PageControlOpType.ActivePage=tsChangePrivateKey) And (FNode.Bank.SafeBox.CurrentProtocol>=CT_PROTOCOL_2))
+    Or ((PageControlOpType.ActivePage=tsChangeInfo) And (SenderAccounts.Count=1))
+    Or (PageControlOpType.ActivePage=tsListForSale)
+    Or (PageControlOpType.ActivePage=tsDelist);
+  sbSearchSignerAccount.Enabled:=ebSignerAccount.Enabled;
+  lblSignerAccount.Enabled := ebSignerAccount.Enabled;
+  lblChangeName.Enabled:= (PageControlOpType.ActivePage=tsChangeInfo) And (SenderAccounts.Count=1);
+  ebChangeName.Enabled:= lblChangeName.Enabled;
+  //
+  UpdatePayload(sender_account, e);
+end;
+
+function TFRMOperation.UpdateOpListForSale(const TargetAccount: TAccount;
+  var SalePrice: Int64; var SellerAccount, SignerAccount: TAccount;
+  var NewOwnerPublicKey: TAccountKey; var LockedUntilBlock: Cardinal;
+  var errors: AnsiString): Boolean;
+var auxC : Cardinal;
+begin
+  Result := False;
+  SalePrice := 0; SellerAccount := CT_Account_NUL;
+  NewOwnerPublicKey := CT_TECDSA_Public_Nul;
+  LockedUntilBlock := 0; errors := '';
+  if (PageControlOpType.ActivePage <> tsListForSale) then exit;
+  lblListAccountErrors.Caption := '';
+  Try
+    if (rbListAccountForPublicSale.Checked) Or (rbListAccountForPrivateSale.Checked) then begin
+      if rbListAccountForPublicSale.Checked then begin
+        lblSaleNewOwnerPublicKey.Enabled := false;
+        ebSaleNewOwnerPublicKey.Enabled := false;
+        ebSaleLockedUntilBlock.Enabled := false;
+        lblSaleLockedUntilBlock.Enabled := false;
+      end else if rbListAccountForPrivateSale.Checked then begin
+        lblSaleNewOwnerPublicKey.Enabled := true;
+        ebSaleNewOwnerPublicKey.Enabled := true;
+        ebSaleLockedUntilBlock.Enabled := true;
+        lblSaleLockedUntilBlock.Enabled := true;
+      end;
+      if not TAccountComp.TxtToMoney(ebSalePrice.Text,salePrice) then begin
+        errors := 'Invalid price';
+        exit;
+      end;
+      // Signer:
+      If Not TAccountComp.AccountTxtNumberToAccountNumber(ebSignerAccount.Text,auxC) then begin
+        errors := 'Invalid signer account';
+        exit;
+      end;
+      if (auxC<0) Or (auxC >= FNode.Bank.AccountsCount) then begin
+        errors := 'Signer account does not exists '+TAccountComp.AccountNumberToAccountTxtNumber(auxC);
+        exit;
+      end;
+      SignerAccount := FNode.Operations.SafeBoxTransaction.Account(auxC);
+      // Seller
+      If Not TAccountComp.AccountTxtNumberToAccountNumber(ebSellerAccount.Text,auxC) then begin
+        errors := 'Invalid seller account';
+        exit;
+      end;
+      if (auxC<0) Or (auxC >= FNode.Bank.AccountsCount) then begin
+        errors := 'Seller account does not exists '+TAccountComp.AccountNumberToAccountTxtNumber(auxC);
+        exit;
+      end;
+      if (auxC=TargetAccount.account) then begin
+        errors := 'Seller account cannot be same account';
+        exit;
+      end;
+
+      SellerAccount := FNode.Operations.SafeBoxTransaction.Account(auxC);
+      if rbListAccountForPrivateSale.Checked then begin
+        lblSaleNewOwnerPublicKey.Enabled := true;
+        ebSaleNewOwnerPublicKey.Enabled := true;
+        ebSaleLockedUntilBlock.Enabled := true;
+        lblSaleLockedUntilBlock.Enabled := true;
+        If Not TAccountComp.AccountKeyFromImport(ebSaleNewOwnerPublicKey.Text,NewOwnerPublicKey,errors) then begin
+          errors := 'Public key: '+errors;
+          exit;
+        end else begin
+          lblListAccountErrors.Font.Color := clGreen;
+          lblListAccountErrors.Caption := 'New key type: '+TAccountComp.GetECInfoTxt(NewOwnerPublicKey.EC_OpenSSL_NID);
+        end;
+        if TAccountComp.EqualAccountKeys(NewOwnerPublicKey,TargetAccount.accountInfo.accountKey) then begin
+          errors := 'New public key for private sale is the same public key';
+          Exit;
+        end;
+        LockedUntilBlock := StrToIntDef(ebSaleLockedUntilBlock.Text,0);
+        if LockedUntilBlock=0 then begin
+          errors := 'Insert locking block';
+          exit;
+        end;
+      end;
+      If (FNode.Bank.SafeBox.CurrentProtocol=CT_PROTOCOL_1) then begin
+        errors := 'This operation needs PROTOCOL 2 active';
+        exit;
+      end;
+    end else begin
+      lblSaleNewOwnerPublicKey.Enabled := false;
+      ebSaleNewOwnerPublicKey.Enabled := false;
+      ebSaleLockedUntilBlock.Enabled := false;
+      lblSaleLockedUntilBlock.Enabled := false;
+      errors := 'Select a sale type';
+      exit;
+    end;
+  Finally
+    Result := errors='';
+    if errors<>'' then begin
+      lblListAccountErrors.Caption := errors;
+      lblListAccountErrors.Font.Color := clRed;
+    end;
+  End;
+end;
+
+function TFRMOperation.UpdateOpTransaction(const SenderAccount: TAccount;  var DestAccount: TAccount; var amount: Int64;  var errors: AnsiString): Boolean;
+Var c : Cardinal;
+begin
+  Result := False;
+  errors := '';
+  lblTransactionErrors.Caption := '';
+  if PageControlOpType.ActivePage<>tsTransaction then exit;
+  if not (TAccountComp.AccountTxtNumberToAccountNumber(ebDestAccount.Text,c)) then begin
+    errors := 'Invalid dest. account ('+ebDestAccount.Text+')';
+    lblTransactionErrors.Caption := errors;
+    exit;
+  end;
+  if (c<0) Or (c>=TNode.Node.Bank.AccountsCount) then begin
+    errors := 'Invalid dest. account ('+TAccountComp.AccountNumberToAccountTxtNumber(c)+')';
+    lblTransactionErrors.Caption := errors;
+    exit;
+  end;
+  DestAccount := TNode.Node.Operations.SafeBoxTransaction.Account(c);
+  if SenderAccounts.Count=1 then begin
+    if not TAccountComp.TxtToMoney(ebAmount.Text,amount) then begin
+      errors := 'Invalid amount ('+ebAmount.Text+')';
+      lblTransactionErrors.Caption := errors;
+      exit;
+    end;
+  end else amount := 0; // ALL BALANCE
+  if DestAccount.account=SenderAccount.account then begin
+    errors := 'Sender and dest account are the same';
+    lblTransactionErrors.Caption := errors;
+    exit;
+  end;
+  if (SenderAccounts.Count=1) then begin
+    if (SenderAccount.balance<(amount+FDefaultFee)) then begin
+       errors := 'Insufficient funds';
+       lblTransactionErrors.Caption := errors;
+       exit;
+    end;
+  end;
+  Result := True;
+end;
+
+function TFRMOperation.UpdatePayload(const SenderAccount: TAccount;
+  var errors: AnsiString): Boolean;
+Var payload_u : AnsiString;
+  payload_encrypted : TRawBytes;
+  account : TAccount;
+  public_key : TAccountKey;
+  dest_account_number : Cardinal;
+  i : Integer;
+  valid : Boolean;
+  wk : TWalletKey;
+begin
+  valid := false;
+  payload_encrypted := '';
+  FEncodedPayload := '';
+  errors := 'Unknown error';
+  payload_u := memoPayload.Lines.Text;
+  try
+    if (payload_u='') then begin
+      valid := true;
+      exit;
+    end;
+    if (rbEncryptedWithOldEC.Checked) then begin
+      // Use sender
+      errors := 'Error encrypting';
+      account := FNode.Operations.SafeBoxTransaction.Account(SenderAccount.account);
+      payload_encrypted := ECIESEncrypt(account.accountInfo.accountKey,payload_u);
+      valid := payload_encrypted<>'';
+    end else if (rbEncryptedWithEC.Checked) then begin
+      errors := 'Error encrypting';
+      if (PageControlOpType.ActivePage=tsTransaction) or (PageControlOpType.ActivePage=tsListForSale) or (PageControlOpType.ActivePage=tsDelist)
+        or (PageControlOpType.ActivePage=tsBuyAccount) then begin
+        // With dest public key
+        If (PageControlOpType.ActivePage=tsTransaction) then begin
+          If Not TAccountComp.AccountTxtNumberToAccountNumber(ebDestAccount.Text,dest_account_number) then begin
+            errors := 'Invalid dest account number';
+            exit;
+          end;
+        end else if (PageControlOpType.ActivePage=tsListForSale) then begin
+          If Not TAccountComp.AccountTxtNumberToAccountNumber(ebSignerAccount.Text,dest_account_number) then begin
+            errors := 'Invalid signer account number';
+            exit;
+          end;
+        end else if (PageControlOpType.ActivePage=tsDelist) then begin
+          If Not TAccountComp.AccountTxtNumberToAccountNumber(ebSignerAccount.Text,dest_account_number) then begin
+            errors := 'Invalid signer account number';
+            exit;
+          end;
+        end else if (PageControlOpType.ActivePage=tsBuyAccount) then begin
+          If Not TAccountComp.AccountTxtNumberToAccountNumber(ebAccountToBuy.Text,dest_account_number) then begin
+            errors := 'Invalid account to buy number';
+            exit;
+          end;
+        end else begin
+          errors := 'ERROR DEV 20170512-1';
+          exit;
+        end;
+        if (dest_account_number<0) or (dest_account_number>=FNode.Bank.AccountsCount) then begin
+          errors := 'Invalid payload encrypted account number: '+TAccountComp.AccountNumberToAccountTxtNumber(dest_account_number);
+          exit;
+        end;
+        account := FNode.Operations.SafeBoxTransaction.Account(dest_account_number);
+        payload_encrypted := ECIESEncrypt(account.accountInfo.accountKey,payload_u);
+        valid := payload_encrypted<>'';
+      end else if (PageControlOpType.ActivePage=tsChangePrivateKey) then begin
+        if (rbChangeKeyWithAnother.Checked) then begin
+          // With new key generated
+          if (cbNewPrivateKey.ItemIndex>=0) then begin
+            i := PtrInt(cbNewPrivateKey.Items.Objects[cbNewPrivateKey.ItemIndex]);
+            if (i>=0) then public_key := WalletKeys.Key[i].AccountKey;
+          end else begin
+            errors := 'Must select a private key';
+            exit;
+          end;
+        end else if (rbChangeKeyTransferAccountToNewOwner.Checked) then begin
+          If Not TAccountComp.AccountKeyFromImport(ebNewPublicKey.Text,public_key,errors) then begin
+            errors := 'Public key: '+errors;
+            exit;
+          end;
+        end else begin
+          errors := 'Must select change type';
+          exit;
+        end;
+        if public_key.EC_OpenSSL_NID<>CT_Account_NUL.accountInfo.accountKey.EC_OpenSSL_NID then begin
+          payload_encrypted := ECIESEncrypt(public_key,payload_u);
+          valid := payload_encrypted<>'';
+        end else begin
+          valid := false;
+          errors := 'Selected private key is not valid to encode';
+          exit;
+        end;
+      end else begin
+        errors := 'This operation does not allow this kind of payload';
+      end;
+    end else if (rbEncrptedWithPassword.Checked) then begin
+      payload_encrypted := TAESComp.EVP_Encrypt_AES256(payload_u,ebEncryptPassword.Text);
+      valid := payload_encrypted<>'';
+    end else if (rbNotEncrypted.Checked) then begin
+      payload_encrypted := payload_u;
+      valid := true;
+    end else begin
+      errors := 'Must select an encryption option for payload';
+    end;
+  finally
+    if valid then begin
+      if length(payload_encrypted)>CT_MaxPayloadSize then begin
+        valid := false;
+        errors := 'Payload size is bigger than '+inttostr(CT_MaxPayloadSize)+' ('+Inttostr(length(payload_encrypted))+')';
+      end;
+    end;
+    if valid then begin
+      lblEncryptionErrors.Caption := '';
+      lblPayloadLength.Caption := Format('(%db -> %db)',[length(payload_u),length(payload_encrypted)]);
+    end else begin
+      lblEncryptionErrors.Caption := errors;
+      lblPayloadLength.Caption := Format('(%db -> ?)',[length(payload_u)]);
+    end;
+    FEncodedPayload := payload_encrypted;
+    Result := valid;
+  end;
+end;
+
+procedure TFRMOperation.UpdateWalletKeys;
+Var i : Integer;
+  wk : TWalletKey;
+  s : String;
+begin
+  cbNewPrivateKey.items.BeginUpdate;
+  cbBuyNewKey.Items.BeginUpdate;
+  Try
+    cbNewPrivateKey.Items.Clear;
+    cbBuyNewKey.Items.Clear;
+    if Not Assigned(FWalletKeys) then exit;
+    For i:=0 to FWalletKeys.Count-1 do begin
+      wk := FWalletKeys.Key[i];
+      if (wk.Name='') then begin
+        s := TCrypto.ToHexaString( TAccountComp.AccountKey2RawString(wk.AccountKey));
+      end else begin
+        s := wk.Name;
+      end;
+      if Not Assigned(wk.PrivateKey) then s := s + '(*)';
+      cbNewPrivateKey.Items.AddObject(s,TObject(i));
+      cbBuyNewKey.Items.AddObject(s,TObject(i));
+    end;
+    cbNewPrivateKey.Sorted := true;
+    cbBuyNewKey.Sorted := true;
+  Finally
+    cbNewPrivateKey.Items.EndUpdate;
+    cbBuyNewKey.Items.EndUpdate;
+  End;
+  updateInfoClick(Nil);
+  memoPayloadClick(Nil);
+end;
+
+end.

+ 381 - 0
src/gui-classic/UFRMPascalCoinWalletConfig.dfm

@@ -0,0 +1,381 @@
+object FRMPascalCoinWalletConfig: TFRMPascalCoinWalletConfig
+  Left = 0
+  Top = 0
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'Options'
+  ClientHeight = 519
+  ClientWidth = 374
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poOwnerFormCenter
+  OnCreate = FormCreate
+  PixelsPerInch = 96
+  TextHeight = 13
+  object Label1: TLabel
+    Left = 30
+    Top = 390
+    Width = 120
+    Height = 13
+    Caption = 'Default fee for operation'
+  end
+  object Label2: TLabel
+    Left = 30
+    Top = 116
+    Width = 98
+    Height = 13
+    Caption = 'Internet Server Port'
+  end
+  object lblDefaultInternetServerPort: TLabel
+    Left = 248
+    Top = 116
+    Width = 70
+    Height = 13
+    Caption = '(Default XXXX)'
+  end
+  object Label3: TLabel
+    Left = 15
+    Top = 67
+    Width = 60
+    Height = 13
+    Caption = 'Miner Name:'
+  end
+  object Label4: TLabel
+    Left = 90
+    Top = 91
+    Width = 259
+    Height = 13
+    Caption = 'This name will be included in each new block you mine!'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clGray
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = []
+    ParentFont = False
+  end
+  object Label5: TLabel
+    Left = 30
+    Top = 231
+    Width = 73
+    Height = 13
+    Caption = 'JSON-RPC Port'
+  end
+  object lblDefaultJSONRPCMinerServerPort: TLabel
+    Left = 248
+    Top = 231
+    Width = 70
+    Height = 13
+    Caption = '(Default XXXX)'
+  end
+  object Label6: TLabel
+    Left = 24
+    Top = 162
+    Width = 57
+    Height = 13
+    Caption = 'Allowed IP'#39's'
+  end
+  object Label7: TLabel
+    Left = 92
+    Top = 182
+    Width = 209
+    Height = 13
+    Caption = 'Ip'#39's separated by semicolon or empty for all'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clGray
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = []
+    ParentFont = False
+  end
+  object cbJSONRPCMinerServerActive: TCheckBox
+    Left = 15
+    Top = 205
+    Width = 261
+    Height = 17
+    Caption = 'JSON-RPC Server Miner (TCP/IP, no HTTP)'
+    TabOrder = 6
+  end
+  object ebDefaultFee: TEdit
+    Left = 170
+    Top = 387
+    Width = 56
+    Height = 21
+    Alignment = taRightJustify
+    TabOrder = 10
+    Text = '0'
+  end
+  object cbSaveLogFiles: TCheckBox
+    Left = 15
+    Top = 414
+    Width = 97
+    Height = 17
+    Caption = 'Save log file'
+    TabOrder = 11
+    OnClick = cbSaveLogFilesClick
+  end
+  object cbShowLogs: TCheckBox
+    Left = 15
+    Top = 452
+    Width = 97
+    Height = 17
+    Caption = 'Show logs'
+    TabOrder = 13
+  end
+  object bbOk: TBitBtn
+    Left = 176
+    Top = 475
+    Width = 75
+    Height = 25
+    DoubleBuffered = True
+    Kind = bkOK
+    ParentDoubleBuffered = False
+    TabOrder = 16
+    OnClick = bbOkClick
+  end
+  object bbCancel: TBitBtn
+    Left = 266
+    Top = 475
+    Width = 75
+    Height = 25
+    DoubleBuffered = True
+    Kind = bkCancel
+    ParentDoubleBuffered = False
+    TabOrder = 17
+  end
+  object udInternetServerPort: TUpDown
+    Left = 226
+    Top = 113
+    Width = 16
+    Height = 21
+    Associate = ebInternetServerPort
+    Min = 1
+    Max = 40000
+    Position = 4004
+    TabOrder = 3
+    Thousands = False
+  end
+  object ebInternetServerPort: TEdit
+    Left = 170
+    Top = 113
+    Width = 56
+    Height = 21
+    Alignment = taRightJustify
+    TabOrder = 2
+    Text = '4004'
+  end
+  object bbUpdatePassword: TBitBtn
+    Left = 15
+    Top = 14
+    Width = 336
+    Height = 38
+    Caption = 'Wallet Password'
+    DoubleBuffered = True
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -13
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000000000000101
+      0100020202000303030004040400050505000606060007070700080808000909
+      09000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F0F00101010001111
+      1100121212001313130014141400151515001616160017171700181818001919
+      19001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F1F00202020002121
+      2100222222002323230024242400252525002626260027272700282828002929
+      29002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F2F00303030003131
+      3100323232003333330034343400353535003636360037373700383838003939
+      39003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F3F00404040004141
+      4100424242004343430044444400454545004646460047474700484848004949
+      49004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F4F00505050005151
+      5100525252005353530054545400555555005656560057575700585858005959
+      59005A5A5A005B5B5B005C5C5C005D5D5D005E5E5E00685968007C4F7C009441
+      9400B72CB700DD15DD00F506F500FD01FD00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00F008F900D517F000BD24E800A830E1007B4B
+      D0005065C1003774B7002B7DB100237FAC001F82AD001C83AD001785AE001687
+      AF001489B100128AB300108CB6000F8EB9000D91BB000C94BF000A97C3000A99
+      C5000A9AC7000B9BC8000B9CCA000C9ECC000C9FCD000DA0CE000DA1CE000EA2
+      CF0011A3CF0015A4CF0018A5CF001CA7D10021A9D1002AAAD00035AACD0035AD
+      D00035AFD30035B1D60037B5D8003AB8DB003EB9DC0040BBDD0045BEDE004CC1
+      E00055C6E3005BC8E40061CAE40066CBE3006BCCE30072D3E60078D8EB0080D8
+      EE0083D9F10085DCF40088DBF5008BDBF6008EDAF70091DAF70095DCF70097E0
+      F7009EE3F800A4E7F900A9E9F900AEE9F900B5EBF900B2EBF800919191919191
+      919191919191919191919191919191919191919191919191D5E7E8E7E3DED591
+      919191919191919191919191919191D6DDF7F8F8F7F6F4EEE6D5919191919191
+      919191919191D7DADEF8F8F6F7F6EDF1F8F1E69191919191919191919191DADE
+      DFFAFAF8F7F7E9EDF7F7F8EB91919191919191919191DDE5E3FCFCFAFAEEE0E9
+      F3F7F7F7DC919191919191919191DEE7E4FEFEFCFCEDC5E0EFF7F6F6DC919191
+      919191919191DEEAE7FEFEFEFDFBC4C4F5F7F6F6DC919191919191919191E3EC
+      E9FEFEFEFEFEE0C3F9F7F6F6DC919191919191919191E3E9E3F8F8F1F1F8FBFB
+      FCFAF7F6DC919191919191919191DCEAEAE0E1E9E5E3DEE4EBF2FAF9DC919191
+      919191919191DBF3EEC5C5EFF3EBE5DDD9D6E6F5DC91919191919191919191D5
+      E8EDF1FAF6F0EAE4DAD1D2DBDC919191919191919191919191DBE8F0F3F3F3E4
+      D0CFE4D8DC919191919191919191919191919191D5DEE4DED2CFD4D491919191
+      91919191919191919191919191919191D2CE9191919191919191919191919191
+      91C8C89191919191D2CE919191919191919191919191919191D9D09191919191
+      D2CE919191919191919191919191919191E6E39191919191D2CE919191919191
+      919191919191919191E0F3CE91919191D2CE9191919191919191919191919191
+      9191EFF6E1C9C8CDD9CC91919191919191919191919191919191C9EDF9F3F3EB
+      DC91919191919191919191919191919191919191CBE0E1CF9191919191919191
+      9191919191919191919191919191919191919191919191919191}
+    ParentDoubleBuffered = False
+    ParentFont = False
+    TabOrder = 0
+    OnClick = bbUpdatePasswordClick
+  end
+  object ebMinerName: TEdit
+    Left = 90
+    Top = 64
+    Width = 261
+    Height = 21
+    TabOrder = 1
+    Text = 'ebMinerName'
+  end
+  object cbShowModalMessages: TCheckBox
+    Left = 170
+    Top = 414
+    Width = 171
+    Height = 17
+    Caption = 'Show modal messages'
+    TabOrder = 14
+  end
+  object udJSONRPCMinerServerPort: TUpDown
+    Left = 226
+    Top = 228
+    Width = 16
+    Height = 21
+    Associate = ebJSONRPCMinerServerPort
+    Min = 1
+    Max = 40000
+    Position = 1
+    TabOrder = 8
+    Thousands = False
+  end
+  object ebJSONRPCMinerServerPort: TEdit
+    Left = 170
+    Top = 228
+    Width = 56
+    Height = 21
+    Alignment = taRightJustify
+    TabOrder = 7
+    Text = '1'
+  end
+  object gbMinerPrivateKey: TGroupBox
+    Left = 15
+    Top = 255
+    Width = 334
+    Height = 121
+    Caption = ' Miner Server Private Key: '
+    TabOrder = 9
+    object rbGenerateANewPrivateKeyEachBlock: TRadioButton
+      Left = 20
+      Top = 20
+      Width = 301
+      Height = 17
+      Caption = 'Generate a new private key for each generated block'
+      TabOrder = 0
+    end
+    object rbUseARandomKey: TRadioButton
+      Left = 20
+      Top = 40
+      Width = 216
+      Height = 17
+      Caption = 'Use a random existing key'
+      TabOrder = 1
+    end
+    object rbMineAllwaysWithThisKey: TRadioButton
+      Left = 20
+      Top = 61
+      Width = 216
+      Height = 17
+      Caption = 'Always mine with this key:'
+      TabOrder = 2
+    end
+    object cbPrivateKeyToMine: TComboBox
+      Left = 45
+      Top = 85
+      Width = 266
+      Height = 21
+      Style = csDropDownList
+      TabOrder = 3
+    end
+  end
+  object cbSaveDebugLogs: TCheckBox
+    Left = 31
+    Top = 432
+    Width = 97
+    Height = 17
+    Caption = 'Save debug logs too'
+    TabOrder = 12
+  end
+  object bbOpenDataFolder: TBitBtn
+    Left = 15
+    Top = 475
+    Width = 120
+    Height = 25
+    Caption = 'Open Data folder'
+    DoubleBuffered = True
+    Glyph.Data = {
+      36030000424D3603000000000000360000002800000010000000100000000100
+      18000000000000030000120B0000120B00000000000000000000FF00FF078DBE
+      078DBE078DBE078DBE078DBE078DBE078DBE078DBE078DBE078DBE078DBE078D
+      BEFF00FFFF00FFFF00FF078DBE25A1D171C6E884D7FA66CDF965CDF965CDF965
+      CDF965CDF865CDF965CDF866CEF93AADD81999C9FF00FFFF00FF078DBE4CBCE7
+      39A8D1A0E2FB6FD4FA6FD4F96ED4FA6FD4F96FD4FA6FD4FA6FD4FA6ED4F93EB1
+      D9C9F0F3078DBEFF00FF078DBE72D6FA078DBEAEE9FC79DCFB79DCFB79DCFB79
+      DCFB79DCFB7ADCFB79DCFA79DCFA44B5D9C9F0F3078DBEFF00FF078DBE79DDFB
+      1899C79ADFF392E7FC84E4FB83E4FC83E4FC84E4FC83E4FC83E4FB84E5FC48B9
+      DAC9F0F31496C4FF00FF078DBE82E3FC43B7DC65C2E0ABF0FC8DEBFC8DEBFC8D
+      EBFD8DEBFD8DEBFC8DEBFD8DEBFC4CBBDAC9F0F3C9F0F3078DBE078DBE8AEAFC
+      77DCF3219CC7FEFFFFC8F7FDC9F7FDC9F7FDC9F7FEC8F7FEC9F7FDC8F7FE9BD5
+      E6EAFEFED2F3F8078DBE078DBE93F0FE93F0FD1697C5078DBE078DBE078DBE07
+      8DBE078DBE078DBE078DBE078DBE078DBE078DBE078DBE078DBE078DBE9BF5FE
+      9AF6FE9AF6FE9BF5FD9BF6FE9AF6FE9BF5FE9AF6FD9BF5FE9AF6FE9AF6FE0989
+      BAFF00FFFF00FFFF00FF078DBEFEFEFEA0FBFFA0FBFEA0FBFEA1FAFEA1FBFEA0
+      FAFEA1FBFEA1FBFFA0FBFFA1FBFF0989BAFF00FFFF00FFFF00FFFF00FF078DBE
+      FEFEFEA5FEFFA5FEFFA5FEFF078DBE078DBE078DBE078DBE078DBE078DBEFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FF078DBE078DBE078DBE078DBEFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+    ParentDoubleBuffered = False
+    TabOrder = 15
+    OnClick = bbOpenDataFolderClick
+  end
+  object cbJSONRPCPortEnabled: TCheckBox
+    Left = 15
+    Top = 139
+    Width = 261
+    Height = 17
+    Caption = 'JSON-RPC Server port enabled (HTTP)'
+    TabOrder = 4
+    OnClick = cbJSONRPCPortEnabledClick
+  end
+  object ebJSONRPCAllowedIPs: TEdit
+    Left = 90
+    Top = 158
+    Width = 261
+    Height = 21
+    TabOrder = 5
+    Text = 'ebJSONRPCAllowedIPs'
+  end
+end

+ 400 - 0
src/gui-classic/UFRMPascalCoinWalletConfig.lfm

@@ -0,0 +1,400 @@
+object FRMPascalCoinWalletConfig: TFRMPascalCoinWalletConfig
+  Left = 462
+  Height = 524
+  Top = 234
+  Width = 374
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'Options'
+  ClientHeight = 524
+  ClientWidth = 374
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  Position = poOwnerFormCenter
+  LCLVersion = '1.8.0.6'
+  Visible = False
+  object Label1: TLabel
+    Left = 30
+    Height = 13
+    Top = 385
+    Width = 120
+    Caption = 'Default fee for operation'
+    ParentColor = False
+  end
+  object Label2: TLabel
+    Left = 30
+    Height = 13
+    Top = 116
+    Width = 98
+    Caption = 'Internet Server Port'
+    ParentColor = False
+  end
+  object lblDefaultInternetServerPort: TLabel
+    Left = 248
+    Height = 13
+    Top = 116
+    Width = 70
+    Caption = '(Default XXXX)'
+    ParentColor = False
+  end
+  object Label3: TLabel
+    Left = 15
+    Height = 13
+    Top = 67
+    Width = 60
+    Caption = 'Miner Name:'
+    ParentColor = False
+  end
+  object Label4: TLabel
+    Left = 90
+    Height = 13
+    Top = 90
+    Width = 259
+    Caption = 'This name will be included in each new block you mine!'
+    Font.CharSet = ANSI_CHARSET
+    Font.Color = clGray
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Pitch = fpVariable
+    Font.Quality = fqDraft
+    ParentColor = False
+    ParentFont = False
+  end
+  object Label5: TLabel
+    Left = 30
+    Height = 13
+    Top = 226
+    Width = 73
+    Caption = 'JSON-RPC Port'
+    ParentColor = False
+  end
+  object lblDefaultJSONRPCMinerServerPort: TLabel
+    Left = 248
+    Height = 13
+    Top = 226
+    Width = 70
+    Caption = '(Default XXXX)'
+    ParentColor = False
+  end
+  object cbJSONRPCMinerServerActive: TCheckBox
+    Left = 15
+    Height = 19
+    Top = 200
+    Width = 225
+    Caption = 'JSON-RPC Server Miner (TCP/IP, no HTTP)'
+    TabOrder = 6
+  end
+  object ebDefaultFee: TEdit
+    Left = 170
+    Height = 21
+    Top = 382
+    Width = 56
+    Alignment = taRightJustify
+    TabOrder = 10
+    Text = '0'
+  end
+  object cbSaveLogFiles: TCheckBox
+    Left = 15
+    Height = 19
+    Top = 409
+    Width = 78
+    Caption = 'Save log file'
+    OnClick = cbSaveLogFilesClick
+    TabOrder = 11
+  end
+  object cbShowLogs: TCheckBox
+    Left = 15
+    Height = 19
+    Top = 447
+    Width = 68
+    Caption = 'Show logs'
+    TabOrder = 13
+  end
+  object bbOk: TBitBtn
+    Left = 184
+    Height = 30
+    Top = 482
+    Width = 75
+    Kind = bkOK
+    ModalResult = 1
+    OnClick = bbOkClick
+    TabOrder = 16
+  end
+  object bbCancel: TBitBtn
+    Left = 274
+    Height = 30
+    Top = 482
+    Width = 75
+    Cancel = True
+    Kind = bkCancel
+    ModalResult = 2
+    TabOrder = 17
+  end
+  object udInternetServerPort: TUpDown
+    Left = 226
+    Height = 21
+    Top = 113
+    Width = 16
+    Associate = ebInternetServerPort
+    Max = 25000
+    Min = 1
+    Position = 4004
+    TabOrder = 3
+    Thousands = False
+    Wrap = False
+  end
+  object ebInternetServerPort: TEdit
+    Left = 170
+    Height = 21
+    Top = 113
+    Width = 56
+    Alignment = taRightJustify
+    TabOrder = 2
+    Text = '4004'
+  end
+  object bbUpdatePassword: TBitBtn
+    Left = 15
+    Height = 38
+    Top = 14
+    Width = 337
+    Caption = 'Wallet Password'
+    Font.Color = clWindowText
+    Font.Height = -13
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000000000000101
+      0100020202000303030004040400050505000606060007070700080808000909
+      09000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F0F00101010001111
+      1100121212001313130014141400151515001616160017171700181818001919
+      19001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F1F00202020002121
+      2100222222002323230024242400252525002626260027272700282828002929
+      29002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F2F00303030003131
+      3100323232003333330034343400353535003636360037373700383838003939
+      39003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F3F00404040004141
+      4100424242004343430044444400454545004646460047474700484848004949
+      49004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F4F00505050005151
+      5100525252005353530054545400555555005656560057575700585858005959
+      59005A5A5A005B5B5B005C5C5C005D5D5D005E5E5E00685968007C4F7C009441
+      9400B72CB700DD15DD00F506F500FD01FD00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00F008F900D517F000BD24E800A830E1007B4B
+      D0005065C1003774B7002B7DB100237FAC001F82AD001C83AD001785AE001687
+      AF001489B100128AB300108CB6000F8EB9000D91BB000C94BF000A97C3000A99
+      C5000A9AC7000B9BC8000B9CCA000C9ECC000C9FCD000DA0CE000DA1CE000EA2
+      CF0011A3CF0015A4CF0018A5CF001CA7D10021A9D1002AAAD00035AACD0035AD
+      D00035AFD30035B1D60037B5D8003AB8DB003EB9DC0040BBDD0045BEDE004CC1
+      E00055C6E3005BC8E40061CAE40066CBE3006BCCE30072D3E60078D8EB0080D8
+      EE0083D9F10085DCF40088DBF5008BDBF6008EDAF70091DAF70095DCF70097E0
+      F7009EE3F800A4E7F900A9E9F900AEE9F900B5EBF900B2EBF800919191919191
+      919191919191919191919191919191919191919191919191D5E7E8E7E3DED591
+      919191919191919191919191919191D6DDF7F8F8F7F6F4EEE6D5919191919191
+      919191919191D7DADEF8F8F6F7F6EDF1F8F1E69191919191919191919191DADE
+      DFFAFAF8F7F7E9EDF7F7F8EB91919191919191919191DDE5E3FCFCFAFAEEE0E9
+      F3F7F7F7DC919191919191919191DEE7E4FEFEFCFCEDC5E0EFF7F6F6DC919191
+      919191919191DEEAE7FEFEFEFDFBC4C4F5F7F6F6DC919191919191919191E3EC
+      E9FEFEFEFEFEE0C3F9F7F6F6DC919191919191919191E3E9E3F8F8F1F1F8FBFB
+      FCFAF7F6DC919191919191919191DCEAEAE0E1E9E5E3DEE4EBF2FAF9DC919191
+      919191919191DBF3EEC5C5EFF3EBE5DDD9D6E6F5DC91919191919191919191D5
+      E8EDF1FAF6F0EAE4DAD1D2DBDC919191919191919191919191DBE8F0F3F3F3E4
+      D0CFE4D8DC919191919191919191919191919191D5DEE4DED2CFD4D491919191
+      91919191919191919191919191919191D2CE9191919191919191919191919191
+      91C8C89191919191D2CE919191919191919191919191919191D9D09191919191
+      D2CE919191919191919191919191919191E6E39191919191D2CE919191919191
+      919191919191919191E0F3CE91919191D2CE9191919191919191919191919191
+      9191EFF6E1C9C8CDD9CC91919191919191919191919191919191C9EDF9F3F3EB
+      DC91919191919191919191919191919191919191CBE0E1CF9191919191919191
+      9191919191919191919191919191919191919191919191919191
+    }
+    OnClick = bbUpdatePasswordClick
+    ParentFont = False
+    TabOrder = 0
+  end
+  object ebMinerName: TEdit
+    Left = 90
+    Height = 21
+    Top = 64
+    Width = 261
+    TabOrder = 1
+    Text = 'ebMinerName'
+  end
+  object cbShowModalMessages: TCheckBox
+    Left = 170
+    Height = 19
+    Top = 409
+    Width = 127
+    Caption = 'Show modal messages'
+    TabOrder = 14
+  end
+  object udJSONRPCMinerServerPort: TUpDown
+    Left = 226
+    Height = 21
+    Top = 223
+    Width = 16
+    Associate = ebJSONRPCMinerServerPort
+    Max = 25000
+    Min = 1
+    Position = 4009
+    TabOrder = 8
+    Thousands = False
+    Wrap = False
+  end
+  object ebJSONRPCMinerServerPort: TEdit
+    Left = 170
+    Height = 21
+    Top = 223
+    Width = 56
+    Alignment = taRightJustify
+    TabOrder = 7
+    Text = '4009'
+  end
+  object gbMinerPrivateKey: TGroupBox
+    Left = 8
+    Height = 121
+    Top = 250
+    Width = 334
+    Caption = ' Miner Server Private Key: '
+    ClientHeight = 103
+    ClientWidth = 330
+    TabOrder = 9
+    object rbGenerateANewPrivateKeyEachBlock: TRadioButton
+      Left = 18
+      Height = 19
+      Top = 6
+      Width = 277
+      Caption = 'Generate a new private key for each generated block'
+      TabOrder = 0
+    end
+    object rbUseARandomKey: TRadioButton
+      Left = 18
+      Height = 19
+      Top = 26
+      Width = 146
+      Caption = 'Use a random existing key'
+      TabOrder = 1
+    end
+    object rbMineAllwaysWithThisKey: TRadioButton
+      Left = 18
+      Height = 19
+      Top = 47
+      Width = 146
+      Caption = 'Always mine with this key:'
+      TabOrder = 2
+    end
+    object cbPrivateKeyToMine: TComboBox
+      Left = 43
+      Height = 21
+      Top = 71
+      Width = 266
+      ItemHeight = 13
+      Style = csDropDownList
+      TabOrder = 3
+    end
+  end
+  object cbSaveDebugLogs: TCheckBox
+    Left = 31
+    Height = 19
+    Top = 427
+    Width = 118
+    Caption = 'Save debug logs too'
+    TabOrder = 12
+  end
+  object bbOpenDataFolder: TBitBtn
+    Left = 16
+    Height = 30
+    Top = 482
+    Width = 131
+    Caption = 'Open Data Folder'
+    Glyph.Data = {
+      36040000424D3604000000000000360000002800000010000000100000000100
+      2000000000000004000064000000640000000000000000000000078DBE4D078D
+      BEFF078DBEFF078DBEFF078DBEFF078DBEFF078DBEFF078DBEFF078DBEFF078D
+      BEFF078DBEFF078DBEFF078DBEFF078DBEFFFFFFFF00FFFFFF00078DBEFF25A1
+      D1FF70C6E7FF6BCFF9FF66CDF9FF65CDF9FF65CDF9FF65CDF9FF65CDF8FF65CD
+      F9FF65CDF8FF66CEF9FF39ADD8FF078DBEFF078DBE4DFFFFFF00078DBEFF4CBC
+      E7FF5EB8DAFF94DFFBFF6FD4FAFF6FD4F9FF6ED4FAFF6FD4F9FF6FD4FAFF6FD4
+      FAFF6FD4FAFF6ED4F9FF3EB1D9FF84D7EBFF078DBEFFFFFFFF00078DBEFF72D6
+      FAFF1593C2FFB6ECFDFF7DDDFBFF79DCFBFF79DCFBFF79DCFBFF79DCFBFF7ADC
+      FBFF79DCFAFF79DCFAFF44B5D9FFAEF1F9FF078DBEFFFFFFFF00078DBEFF79DD
+      FBFF1899C7FF94DDF3FFA2EBFCFF84E4FBFF83E4FCFF83E4FCFF84E4FCFF83E4
+      FCFF83E4FBFF84E5FCFF48B9DAFFB3F4F9FF078DBEFF078DBE4D078DBEFF82E3
+      FCFF43B7DCFF4BB9DBFFBFF4FDFF8EEBFCFF8DEBFCFF8DEBFDFF8DEBFDFF8DEB
+      FCFF8DEBFDFF8DEBFCFF4CBBDAFFB6F7F9FF6DCAE0FF078DBEFF078DBEFF8AEA
+      FCFF77DCF3FF1496C3FFFFFFFFFFC9F8FEFFC9F8FEFFC9F8FEFFC9F8FFFFC9F7
+      FFFFC9F8FEFFC9F8FFFF9CD6E7FFDFFAFBFFDBF7FAFF078DBEFF078DBEFF93F0
+      FEFF93F0FDFF1697C5FF078DBEFF078DBEFF078DBEFF078DBEFF078DBEFF078D
+      BEFF078DBEFF078DBEFF078DBEFF078DBEFF078DBEFF078DBEFF078DBEFF9BF5
+      FEFF9AF6FEFF9AF6FEFF9BF5FDFF9BF6FEFF9AF6FEFF9BF5FEFF9AF6FDFF9BF5
+      FEFF9AF6FEFF9AF6FEFF0989BAFFFFFFFF00FFFFFF00FFFFFF00078DBEFFFEFE
+      FEFFA0FBFFFFA0FBFEFFA0FBFEFFA1FAFEFFA1FBFEFFA0FAFEFFA1FBFEFFA1FB
+      FFFFA0FBFFFFA1FBFFFF0989BAFFFFFFFF00FFFFFF00FFFFFF00078DBE4D078D
+      BEFFFEFEFEFFA5FEFFFFA5FEFFFFA5FEFFFF078DBEFF078DBEFF078DBEFF078D
+      BEFF078DBEFF078DBEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00078D
+      BE4D078DBEFF078DBEFF078DBEFF078DBEFF078DBE4DFFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+    }
+    OnClick = bbOpenDataFolderClick
+    TabOrder = 15
+  end
+  object cbJSONRPCPortEnabled: TCheckBox
+    Left = 15
+    Height = 19
+    Top = 136
+    Width = 205
+    Caption = 'JSON-RPC Server port enabled (HTTP)'
+    OnClick = cbJSONRPCPortEnabledClick
+    TabOrder = 4
+  end
+  object Label6: TLabel
+    Left = 24
+    Height = 13
+    Top = 162
+    Width = 57
+    Caption = 'Allowed IP''s'
+    ParentColor = False
+  end
+  object ebJSONRPCAllowedIPs: TEdit
+    Left = 90
+    Height = 21
+    Top = 159
+    Width = 261
+    TabOrder = 5
+    Text = 'ebJSONRPCAllowedIPs'
+  end
+  object Label7: TLabel
+    Left = 90
+    Height = 13
+    Top = 183
+    Width = 209
+    Caption = 'Ip''s separated by semicolon or empty for all'
+    Font.CharSet = ANSI_CHARSET
+    Font.Color = clGray
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Pitch = fpVariable
+    Font.Quality = fqDraft
+    ParentColor = False
+    ParentFont = False
+  end
+end

+ 277 - 0
src/gui-classic/UFRMPascalCoinWalletConfig.pas

@@ -0,0 +1,277 @@
+unit UFRMPascalCoinWalletConfig;
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{ Copyright (c) 2016 by Albert Molina
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  This unit is a part of Pascal Coin, a P2P crypto currency without need of
+  historical operations.
+
+  If you like it, consider a donation using BitCoin:
+  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
+
+  }
+
+interface
+
+uses
+{$IFnDEF FPC}
+  Windows,
+  ShellApi,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls, Buttons, ComCtrls, UAppParams, UWallet;
+
+type
+
+  TMinerPrivateKey = (mpk_NewEachTime, mpk_Random, mpk_Selected);
+
+  { TFRMPascalCoinWalletConfig }
+
+  TFRMPascalCoinWalletConfig = class(TForm)
+    cbJSONRPCMinerServerActive: TCheckBox;
+    ebDefaultFee: TEdit;
+    Label1: TLabel;
+    cbSaveLogFiles: TCheckBox;
+    cbShowLogs: TCheckBox;
+    bbOk: TBitBtn;
+    bbCancel: TBitBtn;
+    udInternetServerPort: TUpDown;
+    ebInternetServerPort: TEdit;
+    Label2: TLabel;
+    lblDefaultInternetServerPort: TLabel;
+    bbUpdatePassword: TBitBtn;
+    Label3: TLabel;
+    ebMinerName: TEdit;
+    Label4: TLabel;
+    cbShowModalMessages: TCheckBox;
+    Label5: TLabel;
+    udJSONRPCMinerServerPort: TUpDown;
+    ebJSONRPCMinerServerPort: TEdit;
+    lblDefaultJSONRPCMinerServerPort: TLabel;
+    gbMinerPrivateKey: TGroupBox;
+    rbGenerateANewPrivateKeyEachBlock: TRadioButton;
+    rbUseARandomKey: TRadioButton;
+    rbMineAllwaysWithThisKey: TRadioButton;
+    cbPrivateKeyToMine: TComboBox;
+    cbSaveDebugLogs: TCheckBox;
+    bbOpenDataFolder: TBitBtn;
+    cbJSONRPCPortEnabled: TCheckBox;
+    ebJSONRPCAllowedIPs: TEdit;
+    Label6: TLabel;
+    Label7: TLabel;
+    procedure FormCreate(Sender: TObject);
+    procedure bbOkClick(Sender: TObject);
+    procedure bbUpdatePasswordClick(Sender: TObject);
+    procedure cbSaveLogFilesClick(Sender: TObject);
+    procedure bbOpenDataFolderClick(Sender: TObject);
+    procedure cbJSONRPCPortEnabledClick(Sender: TObject);
+  private
+    FAppParams: TAppParams;
+    FWalletKeys: TWalletKeys;
+    procedure SetAppParams(const Value: TAppParams);
+    procedure SetWalletKeys(const Value: TWalletKeys);
+    Procedure UpdateWalletConfig;
+    { Private declarations }
+  public
+    { Public declarations }
+    Property AppParams : TAppParams read FAppParams write SetAppParams;
+    Property WalletKeys : TWalletKeys read FWalletKeys write SetWalletKeys;
+  end;
+
+implementation
+
+uses UConst, UAccounts, ULog, UCrypto, UFolderHelper, USettings;
+
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
+
+procedure TFRMPascalCoinWalletConfig.bbOkClick(Sender: TObject);
+Var df : Int64;
+  mpk : TMinerPrivateKey;
+  i : Integer;
+begin
+  if udInternetServerPort.Position = udJSONRPCMinerServerPort.Position then raise Exception.Create('Server port and JSON-RPC Server miner port are equal!');
+
+  if TAccountComp.TxtToMoney(ebDefaultFee.Text,df) then begin
+    AppParams.ParamByName[CT_PARAM_DefaultFee].SetAsInt64(df);
+  end else begin
+    ebDefaultFee.Text := TAccountComp.FormatMoney(AppParams.ParamByName[CT_PARAM_DefaultFee].GetAsInteger(0));
+    raise Exception.Create('Invalid Fee value');
+  end;
+  AppParams.ParamByName[CT_PARAM_InternetServerPort].SetAsInteger(udInternetServerPort.Position );
+  if rbGenerateANewPrivateKeyEachBlock.Checked then mpk := mpk_NewEachTime
+  else if rbUseARandomKey.Checked then mpk := mpk_Random
+  else if rbMineAllwaysWithThisKey.Checked then begin
+    mpk := mpk_Selected;
+    if cbPrivateKeyToMine.ItemIndex<0 then raise Exception.Create('Must select a private key');
+    i := PtrInt(cbPrivateKeyToMine.Items.Objects[cbPrivateKeyToMine.ItemIndex]);
+    if (i<0) Or (i>=FWalletKeys.Count) then raise Exception.Create('Invalid private key');
+    AppParams.ParamByName[CT_PARAM_MinerPrivateKeySelectedPublicKey].SetAsString( TAccountComp.AccountKey2RawString( FWalletKeys.Key[i].AccountKey ) );
+  end else mpk := mpk_Random;
+
+  AppParams.ParamByName[CT_PARAM_MinerPrivateKeyType].SetAsInteger(integer(mpk));
+  AppParams.ParamByName[CT_PARAM_JSONRPCMinerServerActive].SetAsBoolean(cbJSONRPCMinerServerActive.Checked );
+  AppParams.ParamByName[CT_PARAM_SaveLogFiles].SetAsBoolean(cbSaveLogFiles.Checked );
+  AppParams.ParamByName[CT_PARAM_ShowLogs].SetAsBoolean(cbShowLogs.Checked );
+  AppParams.ParamByName[CT_PARAM_SaveDebugLogs].SetAsBoolean(cbSaveDebugLogs.Checked);
+  AppParams.ParamByName[CT_PARAM_MinerName].SetAsString(ebMinerName.Text);
+  AppParams.ParamByName[CT_PARAM_ShowModalMessages].SetAsBoolean(cbShowModalMessages.Checked);
+  AppParams.ParamByName[CT_PARAM_JSONRPCMinerServerPort].SetAsInteger(udJSONRPCMinerServerPort.Position);
+  AppParams.ParamByName[CT_PARAM_JSONRPCEnabled].SetAsBoolean(cbJSONRPCPortEnabled.Checked);
+  AppParams.ParamByName[CT_PARAM_JSONRPCAllowedIPs].SetAsString(ebJSONRPCAllowedIPs.Text);
+
+  ModalResult := MrOk;
+end;
+
+procedure TFRMPascalCoinWalletConfig.bbOpenDataFolderClick(Sender: TObject);
+begin
+  {$IFDEF FPC}
+  OpenDocument(pchar(TFolderHelper.GetPascalCoinDataFolder))
+  {$ELSE}
+  shellexecute(0, 'open', pchar(TFolderHelper.GetPascalCoinDataFolder), nil, nil, SW_SHOW)
+  {$ENDIF}
+end;
+
+procedure TFRMPascalCoinWalletConfig.bbUpdatePasswordClick(Sender: TObject);
+Var s,s2 : String;
+begin
+  if Not Assigned(FWalletKeys) then exit;
+  if Not FWalletKeys.IsValidPassword then begin
+    s := '';
+    Repeat
+      if Not InputQuery('Wallet Password','Insert Wallet Password',s) then exit;
+      FWalletKeys.WalletPassword := s;
+      if Not FWalletKeys.IsValidPassword then Application.MessageBox(PChar('Invalid password'),PChar(Application.Title),MB_ICONERROR+MB_OK);
+    Until FWalletKeys.IsValidPassword;
+  end;
+  if FWalletKeys.IsValidPassword then begin
+    s := ''; s2 := '';
+    if Not InputQuery('Change password','Type new password',s) then exit;
+    if trim(s)<>s then raise Exception.Create('Password cannot start or end with a space character');
+    if Not InputQuery('Change password','Type new password again',s2) then exit;
+    if s<>s2 then raise Exception.Create('Two passwords are different!');
+
+    FWalletKeys.WalletPassword := s;
+    Application.MessageBox(PChar('Password changed!'+#10+#10+
+      'Please note that your new password is "'+s+'"'+#10+#10+
+      '(If you lose this password, you will lose your Wallet forever !)'),
+      PChar(Application.Title),MB_ICONWARNING+MB_OK);
+  end;
+  UpdateWalletConfig;
+end;
+
+procedure TFRMPascalCoinWalletConfig.cbJSONRPCPortEnabledClick(Sender: TObject);
+begin
+  ebJSONRPCAllowedIPs.Enabled := cbJSONRPCPortEnabled.Checked;
+end;
+
+procedure TFRMPascalCoinWalletConfig.cbSaveLogFilesClick(Sender: TObject);
+begin
+  cbSaveDebugLogs.Enabled := cbSaveLogFiles.Checked;
+end;
+
+procedure TFRMPascalCoinWalletConfig.FormCreate(Sender: TObject);
+begin
+  lblDefaultInternetServerPort.Caption := Format('(Default %d)',[CT_NetServer_Port]);
+  udInternetServerPort.Position := CT_NetServer_Port;
+  ebDefaultFee.Text := TAccountComp.FormatMoney(0);
+  ebMinerName.Text := '';
+  bbUpdatePassword.Enabled := false;
+  UpdateWalletConfig;
+  lblDefaultJSONRPCMinerServerPort.Caption := Format('(Default %d)',[CT_JSONRPCMinerServer_Port]);
+end;
+
+procedure TFRMPascalCoinWalletConfig.SetAppParams(const Value: TAppParams);
+Var i : Integer;
+begin
+  FAppParams := Value;
+  if Not Assigned(Value) then exit;
+  Try
+    udInternetServerPort.Position := AppParams.ParamByName[CT_PARAM_InternetServerPort].GetAsInteger(CT_NetServer_Port);
+    ebDefaultFee.Text := TAccountComp.FormatMoney(AppParams.ParamByName[CT_PARAM_DefaultFee].GetAsInt64(0));
+    cbJSONRPCMinerServerActive.Checked := AppParams.ParamByName[CT_PARAM_JSONRPCMinerServerActive].GetAsBoolean(true);
+    case TMinerPrivateKey(AppParams.ParamByName[CT_PARAM_MinerPrivateKeyType].GetAsInteger(Integer(mpk_Random))) of
+      mpk_NewEachTime : rbGenerateANewPrivateKeyEachBlock.Checked := true;
+      mpk_Random : rbUseARandomKey.Checked := true;
+      mpk_Selected : rbMineAllwaysWithThisKey.Checked := true;
+    else rbUseARandomKey.Checked := true;
+    end;
+    UpdateWalletConfig;
+    cbSaveLogFiles.Checked := AppParams.ParamByName[CT_PARAM_SaveLogFiles].GetAsBoolean(false);
+    cbShowLogs.Checked := AppParams.ParamByName[CT_PARAM_ShowLogs].GetAsBoolean(false);
+    cbSaveDebugLogs.Checked := AppParams.ParamByName[CT_PARAM_SaveDebugLogs].GetAsBoolean(false);
+    ebMinerName.Text := AppParams.ParamByName[CT_PARAM_MinerName].GetAsString('');
+    cbShowModalMessages.Checked := AppParams.ParamByName[CT_PARAM_ShowModalMessages].GetAsBoolean(false);
+    udJSONRPCMinerServerPort.Position := AppParams.ParamByName[CT_PARAM_JSONRPCMinerServerPort].GetAsInteger(CT_JSONRPCMinerServer_Port);
+    cbJSONRPCPortEnabled.Checked := AppParams.ParamByName[CT_PARAM_JSONRPCEnabled].GetAsBoolean(false);
+    ebJSONRPCAllowedIPs.Text := AppParams.ParamByName[CT_PARAM_JSONRPCAllowedIPs].GetAsString('127.0.0.1;');
+  Except
+    On E:Exception do begin
+      TLog.NewLog(lterror,ClassName,'Exception at SetAppParams: '+E.Message);
+    end;
+  End;
+  cbSaveLogFilesClick(nil);
+  cbJSONRPCPortEnabledClick(nil);
+end;
+
+procedure TFRMPascalCoinWalletConfig.SetWalletKeys(const Value: TWalletKeys);
+begin
+  FWalletKeys := Value;
+  UpdateWalletConfig;
+end;
+
+
+procedure TFRMPascalCoinWalletConfig.UpdateWalletConfig;
+Var i, iselected : Integer;
+  s : String;
+  wk : TWalletKey;
+begin
+  if Assigned(FWalletKeys) then begin
+    if FWalletKeys.IsValidPassword then begin
+      if FWalletKeys.WalletPassword='' then begin
+        bbUpdatePassword.Caption := 'Wallet without password, protect it!';
+      end else begin
+        bbUpdatePassword.Caption := 'Change Wallet password';
+      end;
+    end else begin
+        bbUpdatePassword.Caption := 'Wallet with password, change it!';
+    end;
+    cbPrivateKeyToMine.Items.Clear;
+    for i := 0 to FWalletKeys.Count - 1 do begin
+      wk := FWalletKeys.Key[i];
+      if (wk.Name='') then begin
+        s := TCrypto.ToHexaString( TAccountComp.AccountKey2RawString(wk.AccountKey));
+      end else begin
+        s := wk.Name;
+      end;
+      if wk.CryptedKey<>'' then begin
+        cbPrivateKeyToMine.Items.AddObject(s,TObject(i));
+      end;
+    end;
+    cbPrivateKeyToMine.Sorted := true;
+    if Assigned(FAppParams) then begin
+      s := FAppParams.ParamByName[CT_PARAM_MinerPrivateKeySelectedPublicKey].GetAsString('');
+      iselected := FWalletKeys.IndexOfAccountKey(TAccountComp.RawString2Accountkey(s));
+      if iselected>=0 then begin
+        iselected :=  cbPrivateKeyToMine.Items.IndexOfObject(TObject(iselected));
+        cbPrivateKeyToMine.ItemIndex := iselected;
+      end;
+
+    end;
+
+  end else bbUpdatePassword.Caption := '(Wallet password)';
+  bbUpdatePassword.Enabled := Assigned(FWAlletKeys);
+end;
+
+end.

+ 426 - 0
src/gui-classic/UFRMPayloadDecoder.dfm

@@ -0,0 +1,426 @@
+object FRMPayloadDecoder: TFRMPayloadDecoder
+  Left = 0
+  Top = 0
+  ActiveControl = ebOphash
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'Operation Information/Decoder'
+  ClientHeight = 406
+  ClientWidth = 674
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poOwnerFormCenter
+  OnCreate = FormCreate
+  PixelsPerInch = 96
+  TextHeight = 13
+  object Label1: TLabel
+    Left = 20
+    Top = 56
+    Width = 46
+    Height = 13
+    Caption = 'Block/Op:'
+  end
+  object lblBlock: TLabel
+    Left = 72
+    Top = 51
+    Width = 109
+    Height = 19
+    Caption = '000000/0000'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object lblDateTime: TLabel
+    Left = 255
+    Top = 51
+    Width = 30
+    Height = 19
+    Caption = '000'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object Label6: TLabel
+    Left = 195
+    Top = 56
+    Width = 52
+    Height = 13
+    Caption = 'Date Time:'
+  end
+  object Label2: TLabel
+    Left = 20
+    Top = 106
+    Width = 52
+    Height = 13
+    Caption = 'Operation:'
+  end
+  object lblOperationTxt: TLabel
+    Left = 90
+    Top = 101
+    Width = 561
+    Height = 22
+    AutoSize = False
+    Caption = '000'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+    WordWrap = True
+  end
+  object lblAmountCaption: TLabel
+    Left = 220
+    Top = 81
+    Width = 41
+    Height = 13
+    Caption = 'Amount:'
+  end
+  object lblAmount: TLabel
+    Left = 270
+    Top = 76
+    Width = 30
+    Height = 19
+    Caption = '000'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object lblFeeCaption: TLabel
+    Left = 517
+    Top = 56
+    Width = 22
+    Height = 13
+    Caption = 'Fee:'
+  end
+  object lblFee: TLabel
+    Left = 547
+    Top = 51
+    Width = 30
+    Height = 19
+    Caption = '000'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object Label4: TLabel
+    Left = 20
+    Top = 24
+    Width = 38
+    Height = 13
+    Caption = 'OpHash'
+  end
+  object lblSenderCaption: TLabel
+    Left = 20
+    Top = 81
+    Width = 38
+    Height = 13
+    Caption = 'Sender:'
+  end
+  object lblSender: TLabel
+    Left = 64
+    Top = 76
+    Width = 97
+    Height = 19
+    Caption = '9999999-99'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object lblReceiverCaption: TLabel
+    Left = 411
+    Top = 81
+    Width = 46
+    Height = 13
+    Caption = 'Receiver:'
+  end
+  object lblReceiver: TLabel
+    Left = 463
+    Top = 76
+    Width = 30
+    Height = 19
+    Caption = '000'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object lblReceiverInfo: TLabel
+    Left = 481
+    Top = 50
+    Width = 121
+    Height = 19
+    Caption = '(Receiver info)'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clRed
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object PageControl: TPageControl
+    Left = 20
+    Top = 140
+    Width = 631
+    Height = 206
+    ActivePage = tsDecoded
+    TabOrder = 2
+    OnChanging = PageControlChanging
+    object tsDecoded: TTabSheet
+      Caption = 'Payload'
+      object Label7: TLabel
+        Left = 15
+        Top = 94
+        Width = 87
+        Height = 13
+        Caption = 'Decoded Payload:'
+      end
+      object lblDecodedMethod: TLabel
+        Left = 562
+        Top = 94
+        Width = 44
+        Height = 13
+        Alignment = taRightJustify
+        Caption = '(Method)'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clGray
+        Font.Height = -11
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentFont = False
+      end
+      object Label3: TLabel
+        Left = 15
+        Top = 9
+        Width = 155
+        Height = 13
+        Caption = 'Original Payload in Hexadecimal:'
+      end
+      object memoDecoded: TMemo
+        Left = 15
+        Top = 111
+        Width = 591
+        Height = 55
+        TabStop = False
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clBlack
+        Font.Height = -13
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        Lines.Strings = (
+          'memoDecoded')
+        ParentFont = False
+        ReadOnly = True
+        TabOrder = 0
+        OnKeyDown = memoDecodedKeyDown
+      end
+      object memoOriginalPayloadInHexa: TMemo
+        Left = 15
+        Top = 28
+        Width = 591
+        Height = 55
+        TabStop = False
+        Color = clBtnFace
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clBlack
+        Font.Height = -13
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        Lines.Strings = (
+          'memoDecoded')
+        ParentFont = False
+        ReadOnly = True
+        TabOrder = 1
+        OnKeyDown = memoDecodedKeyDown
+      end
+      object cbShowAsHexadecimal: TCheckBox
+        Left = 115
+        Top = 93
+        Width = 136
+        Height = 17
+        Caption = 'Show as hexadecimal'
+        TabOrder = 2
+        OnClick = cbShowAsHexadecimalClick
+      end
+    end
+    object tsDecodeMethods: TTabSheet
+      Caption = 'Decode methods'
+      ImageIndex = 1
+      object lblPasswordsInfo: TLabel
+        Left = 235
+        Top = 162
+        Width = 81
+        Height = 13
+        Caption = 'lblPasswordsInfo'
+      end
+      object cbMethodPublicPayload: TCheckBox
+        Left = 16
+        Top = 15
+        Width = 225
+        Height = 17
+        Caption = 'Not encrypted (Public payload)'
+        TabOrder = 0
+        OnClick = cbMethodPublicPayloadClick
+      end
+      object cbUsingPrivateKeys: TCheckBox
+        Left = 16
+        Top = 38
+        Width = 225
+        Height = 17
+        Caption = 'Using Private keys of my Wallet'
+        TabOrder = 1
+        OnClick = cbMethodPublicPayloadClick
+      end
+      object cbUsingPasswords: TCheckBox
+        Left = 16
+        Top = 61
+        Width = 225
+        Height = 17
+        Caption = 'Using Passwords of the list'
+        TabOrder = 2
+        OnClick = cbMethodPublicPayloadClick
+      end
+      object memoPasswords: TMemo
+        Left = 235
+        Top = 10
+        Width = 371
+        Height = 146
+        ScrollBars = ssBoth
+        TabOrder = 3
+        OnChange = cbMethodPublicPayloadClick
+      end
+      object bbSaveMethods: TBitBtn
+        Left = 60
+        Top = 110
+        Width = 75
+        Height = 25
+        Caption = 'Save'
+        DoubleBuffered = True
+        Glyph.Data = {
+          DE010000424DDE01000000000000760000002800000024000000120000000100
+          0400000000006801000000000000000000001000000000000000000000000000
+          80000080000000808000800000008000800080800000C0C0C000808080000000
+          FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+          3333333333333333333333330000333333333333333333333333F33333333333
+          00003333344333333333333333388F3333333333000033334224333333333333
+          338338F3333333330000333422224333333333333833338F3333333300003342
+          222224333333333383333338F3333333000034222A22224333333338F338F333
+          8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
+          33333338F83338F338F33333000033A33333A222433333338333338F338F3333
+          0000333333333A222433333333333338F338F33300003333333333A222433333
+          333333338F338F33000033333333333A222433333333333338F338F300003333
+          33333333A222433333333333338F338F00003333333333333A22433333333333
+          3338F38F000033333333333333A223333333333333338F830000333333333333
+          333A333333333333333338330000333333333333333333333333333333333333
+          0000}
+        NumGlyphs = 2
+        ParentDoubleBuffered = False
+        TabOrder = 4
+        OnClick = bbSaveMethodsClick
+      end
+    end
+  end
+  object bbClose: TBitBtn
+    Left = 572
+    Top = 362
+    Width = 79
+    Height = 25
+    Cancel = True
+    Caption = 'Close'
+    DoubleBuffered = True
+    Glyph.Data = {
+      76010000424D7601000000000000760000002800000020000000100000000100
+      04000000000000010000120B0000120B00001000000000000000000000000000
+      800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
+      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00555555555555
+      555555555555555555555555555555555555555555FF55555555555559055555
+      55555555577FF5555555555599905555555555557777F5555555555599905555
+      555555557777FF5555555559999905555555555777777F555555559999990555
+      5555557777777FF5555557990599905555555777757777F55555790555599055
+      55557775555777FF5555555555599905555555555557777F5555555555559905
+      555555555555777FF5555555555559905555555555555777FF55555555555579
+      05555555555555777FF5555555555557905555555555555777FF555555555555
+      5990555555555555577755555555555555555555555555555555}
+    ModalResult = 2
+    NumGlyphs = 2
+    ParentDoubleBuffered = False
+    TabOrder = 3
+  end
+  object bbFind: TBitBtn
+    Left = 599
+    Top = 19
+    Width = 52
+    Height = 25
+    Caption = '&Find'
+    DoubleBuffered = True
+    Glyph.Data = {
+      36030000424D3603000000000000360000002800000010000000100000000100
+      18000000000000030000120B0000120B00000000000000000000FF00FF4A667C
+      BE9596FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FF6B9CC31E89E84B7AA3C89693FF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF4BB4FE51B5FF
+      2089E94B7AA2C69592FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF51B7FE51B3FF1D87E64E7AA0CA9792FF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      51B7FE4EB2FF1F89E64E7BA2B99497FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF52B8FE4BB1FF2787D95F6A76FF
+      00FFB0857FC09F94C09F96BC988EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FF55BDFFB5D6EDBF9D92BB9B8CE7DAC2FFFFE3FFFFE5FDFADAD8C3
+      B3B58D85FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFCEA795FD
+      EEBEFFFFD8FFFFDAFFFFDBFFFFE6FFFFFBEADDDCAE837FFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFC1A091FBDCA8FEF7D0FFFFDBFFFFE3FFFFF8FFFF
+      FDFFFFFDC6A99CFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC1A091FEE3ACF1
+      C491FCF2CAFFFFDDFFFFE4FFFFF7FFFFF7FFFFE9EEE5CBB9948CFF00FFFF00FF
+      FF00FFFF00FFFF00FFC2A191FFE6AEEEB581F7DCAEFEFDD8FFFFDFFFFFE3FFFF
+      E4FFFFE0F3ECD2BB968EFF00FFFF00FFFF00FFFF00FFFF00FFBC978CFBE7B7F4
+      C791F2C994F8E5B9FEFCD8FFFFDDFFFFDCFFFFE0E2D2BAB68E86FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFD9C3A9FFFEE5F7DCB8F2C994F5D4A5FAE8BDFDF4
+      C9FDFBD6B69089FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB58D85E8
+      DEDDFFFEF2F9D8A3F4C48CF9D49FFDEAB8D0B49FB89086FF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFAD827FC9AA9EEFE0B7EFDFB2E7CEACB890
+      86B89086FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFBA968ABB988CB79188FF00FFFF00FFFF00FFFF00FF}
+    ParentDoubleBuffered = False
+    TabOrder = 1
+    TabStop = False
+    OnClick = bbFindClick
+  end
+  object ebOphash: TEdit
+    Left = 64
+    Top = 20
+    Width = 529
+    Height = 22
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -12
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+    TabOrder = 0
+    Text = '12345678901234567890123456789012345678901234567890123456789012'
+    OnExit = ebOphashExit
+    OnKeyPress = ebOphashKeyPress
+  end
+end

+ 0 - 0
Units/Forms/UFRMPayloadDecoder.lfm → src/gui-classic/UFRMPayloadDecoder.lfm


+ 440 - 0
src/gui-classic/UFRMPayloadDecoder.pas

@@ -0,0 +1,440 @@
+unit UFRMPayloadDecoder;
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{ Copyright (c) 2016 by Albert Molina
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  This unit is a part of Pascal Coin, a P2P crypto currency without need of
+  historical operations.
+
+  If you like it, consider a donation using BitCoin:
+  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
+
+  }
+
+interface
+
+uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls, UBlockChain, UCrypto, UWallet, Buttons, ComCtrls,
+  UAppParams;
+
+type
+
+  { TFRMPayloadDecoder }
+
+  TFRMPayloadDecoder = class(TForm)
+    Label1: TLabel;
+    lblBlock: TLabel;
+    lblDateTime: TLabel;
+    Label6: TLabel;
+    Label2: TLabel;
+    lblOperationTxt: TLabel;
+    PageControl: TPageControl;
+    tsDecoded: TTabSheet;
+    tsDecodeMethods: TTabSheet;
+    cbMethodPublicPayload: TCheckBox;
+    cbUsingPrivateKeys: TCheckBox;
+    cbUsingPasswords: TCheckBox;
+    memoPasswords: TMemo;
+    Label7: TLabel;
+    lblDecodedMethod: TLabel;
+    Label3: TLabel;
+    bbSaveMethods: TBitBtn;
+    bbClose: TBitBtn;
+    memoDecoded: TMemo;
+    memoOriginalPayloadInHexa: TMemo;
+    lblPasswordsInfo: TLabel;
+    lblAmountCaption: TLabel;
+    lblAmount: TLabel;
+    lblFeeCaption: TLabel;
+    lblFee: TLabel;
+    Label4: TLabel;
+    bbFind: TBitBtn;
+    ebOphash: TEdit;
+    lblSenderCaption: TLabel;
+    lblSender: TLabel;
+    lblReceiverCaption: TLabel;
+    lblReceiver: TLabel;
+    lblReceiverInfo: TLabel;
+    cbShowAsHexadecimal: TCheckBox;
+    procedure FormCreate(Sender: TObject);
+    procedure PageControlChanging(Sender: TObject; var AllowChange: Boolean);
+    procedure cbMethodPublicPayloadClick(Sender: TObject);
+    procedure bbSaveMethodsClick(Sender: TObject);
+    procedure memoDecodedKeyDown(Sender: TObject; var Key: Word;
+      Shift: TShiftState);
+    procedure bbFindClick(Sender: TObject);
+    procedure ebOphashExit(Sender: TObject);
+    procedure ebOphashKeyPress(Sender: TObject; var Key: Char);
+    procedure cbShowAsHexadecimalClick(Sender: TObject);
+  private
+    FOpResume : TOperationResume;
+    FWalletKeys : TWalletKeys;
+    FSavedDecodeMethods : boolean;
+    FAppParams : TAppParams;
+    FSemaphor : Boolean;
+    { Private declarations }
+    Procedure TryToDecode;
+    Procedure SaveMethods;
+    procedure SetOpResume(const Value: TOperationResume);
+  public
+    { Public declarations }
+    Procedure Init(Const AOperationResume : TOperationResume; WalletKeys : TWalletKeys; AppParams : TAppParams);
+    Property OpResume : TOperationResume read FOpResume write SetOpResume;
+    Procedure DoFind(Const OpHash : String);
+  end;
+
+implementation
+
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
+
+Uses UNode, UTime, UECIES, UAES, UAccounts, UCommon, UFRMMemoText;
+
+{ TFRMPayloadDecoder }
+
+procedure TFRMPayloadDecoder.bbSaveMethodsClick(Sender: TObject);
+begin
+  SaveMethods;
+  PageControl.ActivePage := tsDecoded;
+  TryToDecode;
+end;
+
+procedure TFRMPayloadDecoder.bbFindClick(Sender: TObject);
+Var oph : String;
+begin
+  oph := TCrypto.ToHexaString( FOpResume.OperationHash );
+  if Not InputQuery('Search operation by OpHash','Insert Operation Hash value (OpHash)',oph) then exit;
+  DoFind(oph);
+end;
+
+procedure TFRMPayloadDecoder.cbMethodPublicPayloadClick(Sender: TObject);
+begin
+  FSavedDecodeMethods := false;
+  lblPasswordsInfo.Caption := Format('Possible passwords: %d',[memoPasswords.Lines.Count]);
+end;
+
+procedure TFRMPayloadDecoder.cbShowAsHexadecimalClick(Sender: TObject);
+begin
+  TryToDecode;
+end;
+
+procedure TFRMPayloadDecoder.DoFind(Const OpHash : String);
+Var
+  r,md160 : TRawBytes;
+  pcops : TPCOperationsComp;
+  nBlock,nAccount,nN_Operation : Cardinal;
+  opbi : Integer;
+  opr : TOperationResume;
+  strings : TStrings;
+  FRM : TFRMMemoText;
+begin
+  // Search for an operation based on "ophash"
+  if (trim(OpHash)='') then begin
+    OpResume := CT_TOperationResume_NUL;
+    exit;
+  end;
+  try
+    r := TCrypto.HexaToRaw(trim(OpHash));
+    if (r='') then begin
+      raise Exception.Create('Value is not an hexadecimal string');
+    end;
+    // Build 2.1.4 new decoder option: Check if OpHash is a posible double spend
+    If not TPCOperation.DecodeOperationHash(r,nBlock,nAccount,nN_Operation,md160) then begin
+      raise Exception.Create('Value is not a valid OPHASH because can''t extract Block/Account/N_Operation info');
+    end;
+    Case TNode.Node.FindNOperation(nBlock,nAccount,nN_Operation,opr) of
+      invalid_params : raise Exception.Create(Format('Not a valid OpHash searching at Block:%d Account:%d N_Operation:%d',[nBlock,nAccount,nN_Operation]));
+      blockchain_block_not_found : raise Exception.Create('Your blockchain file does not contain all blocks to find');
+      found : ;
+    else raise Exception.Create('ERROR DEV 20171120-6');
+    end;
+    If (TPCOperation.EqualOperationHashes(opr.OperationHash,r)) Or
+       (TPCOperation.EqualOperationHashes(opr.OperationHash_OLD,r)) then begin
+      // Found!
+      OpResume := opr;
+    end else begin
+      // Not found!
+      strings := TStringList.Create;
+      try
+        strings.Add('Posible double spend detected!');
+        strings.Add(Format('OpHash: %s',[OpHash]));
+        strings.Add(Format('Decode OpHash info: Block:%d Account:%s N_Operation:%d',[nBlock,TAccountComp.AccountNumberToAccountTxtNumber(nAccount),nN_Operation]));
+        strings.Add('');
+        strings.Add('Real OpHash found in PascalCoin Blockchain:');
+        strings.Add(Format('OpHash: %s',[TCrypto.ToHexaString(opr.OperationHash)]));
+        strings.Add(Format('Decode OpHash info: Block:%d Account:%s N_Operation:%d',[opr.Block,TAccountComp.AccountNumberToAccountTxtNumber(opr.SignerAccount),opr.n_operation]));
+        If (opr.Block=0) then begin
+          strings.Add('* Note: This is a pending operation not included on Blockchain');
+        end;
+        OpResume := opr; // Do show operation resume!
+        FRM := TFRMMemoText.Create(Self);
+        try
+          FRM.InitData('Posible double spend detected',strings.Text);
+          FRM.ShowModal;
+        finally
+          FRM.Free;
+        end;
+      finally
+        strings.Free;
+      end;
+    end;
+  Except
+    OpResume := CT_TOperationResume_NUL;
+    try
+      FSemaphor := true;
+      ebOphash.Text := trim(ophash);
+    finally
+      FSemaphor := false;
+    end;
+    Raise;
+  end;
+end;
+
+procedure TFRMPayloadDecoder.ebOphashExit(Sender: TObject);
+begin
+  DoFind(ebOphash.Text);
+end;
+
+procedure TFRMPayloadDecoder.ebOphashKeyPress(Sender: TObject; var Key: Char);
+begin
+  if Key=#13 then DoFind(ebOphash.Text);
+end;
+
+procedure TFRMPayloadDecoder.FormCreate(Sender: TObject);
+begin
+  FSemaphor := true;
+  try
+    FWalletKeys := Nil;
+    FAppParams := Nil;
+    memoDecoded.Lines.Clear;
+    memoOriginalPayloadInHexa.Lines.Clear;
+    lblPasswordsInfo.Caption := '';
+    OpResume := CT_TOperationResume_NUL;
+  finally
+    FSemaphor := false;
+  end;
+end;
+
+procedure TFRMPayloadDecoder.Init(Const AOperationResume : TOperationResume; WalletKeys : TWalletKeys; AppParams : TAppParams);
+begin
+  FWalletKeys := WalletKeys;
+  FAppParams := AppParams;
+  OpResume := AOperationResume;
+  FSavedDecodeMethods := true;
+  PageControl.ActivePage := tsDecoded;
+  TryToDecode;
+end;
+
+procedure TFRMPayloadDecoder.memoDecodedKeyDown(Sender: TObject; var Key: Word;
+  Shift: TShiftState);
+begin
+  if key=VK_ESCAPE then Close;
+
+end;
+
+procedure TFRMPayloadDecoder.PageControlChanging(Sender: TObject; var AllowChange: Boolean);
+begin
+  //
+  if PageControl.ActivePage=tsDecodeMethods then begin
+    If not FSavedDecodeMethods then begin
+      case Application.MessageBox(PChar('Save new decode methods?'),PChar(Application.Title),MB_YESNOCANCEL+MB_ICONQUESTION) of
+        IDYES : Begin
+          SaveMethods;
+        End;
+        IDCANCEL : begin
+          AllowChange := false;
+        end;
+      end;
+
+    end;
+  end else begin
+    FSavedDecodeMethods := true;
+  end;
+end;
+
+procedure TFRMPayloadDecoder.SaveMethods;
+begin
+  FAppParams.ParamByName['PayloadDecoder.notencrypted'].SetAsBoolean(cbMethodPublicPayload.Checked);
+  FAppParams.ParamByName['PayloadDecoder.usingprivatekeys'].SetAsBoolean(cbUsingPrivateKeys.Checked);
+  FAppParams.ParamByName['PayloadDecoder.usingpasswords'].SetAsBoolean(cbUsingPasswords.Checked);
+  FAppParams.ParamByName['PayloadDecoder.passwords'].SetAsString(memoPasswords.Lines.Text);
+  FAppParams.ParamByName['PayloadDecoder.showashexadecimal'].SetAsBoolean(cbShowAsHexadecimal.Checked);
+  FSavedDecodeMethods := true;
+end;
+
+procedure TFRMPayloadDecoder.SetOpResume(const Value: TOperationResume);
+Var sem : Boolean;
+begin
+  sem := FSemaphor;
+  Try
+    FSemaphor := false;
+    FOpResume := Value;
+    if Not Value.valid then begin
+      lblBlock.Caption := '';
+      lblDateTime.Caption := '';
+      lblOperationTxt.Caption := '';
+      lblDecodedMethod.Caption := '';
+      lblFee.Caption := '';
+      lblPasswordsInfo.Caption := '';
+      lblAmount.Caption := '';
+      lblSender.Caption := '';
+      lblReceiver.Caption := '';
+      lblReceiverInfo.Visible := false;
+      exit;
+    end;
+    If (Value.NOpInsideBlock>=0) then
+      lblBlock.Caption := inttostr(Value.Block)+'/'+inttostr(Value.NOpInsideBlock+1)+' '+IntToStr(Value.n_operation)
+    else lblBlock.Caption := inttostr(Value.Block)+' '+IntToStr(Value.n_operation);
+    if Value.time>10000 then begin
+      lblDateTime.Caption := DateTimeToStr(UnivDateTime2LocalDateTime(UnixToUnivDateTime(Value.time)));
+      lblDateTime.Font.Color := clBlack;
+    end else begin
+      lblDateTime.Caption := '(Pending block)';
+      lblDateTime.Font.Color := clRed;
+    end;
+    lblOperationTxt.Caption := Value.OperationTxt;
+    lblAmount.Caption := TAccountComp.FormatMoney(value.Amount);
+    if Value.Amount>0 then lblAmount.Font.Color := clGreen
+    else if Value.Amount=0 then lblAmount.Font.Color := clGray
+    else lblAmount.Font.Color := clRed;
+    If (Value.SignerAccount>=0) And (Value.DestAccount>=0) then begin
+      lblSenderCaption.Caption := 'Sender:';
+      lblSender.Caption := TAccountComp.AccountNumberToAccountTxtNumber(Value.SignerAccount);
+      lblReceiverCaption.Visible := true;
+      lblReceiver.Caption := TAccountComp.AccountNumberToAccountTxtNumber(Value.DestAccount);
+      lblReceiver.Visible := true;
+      lblFeeCaption.Visible := Value.AffectedAccount=Value.SignerAccount;
+      lblFee.Visible := lblFeeCaption.Visible;
+      lblReceiverInfo.Visible := Not lblFee.Visible;
+    end else begin
+      lblSenderCaption.Caption := 'Account:';
+      lblSender.caption := TAccountComp.AccountNumberToAccountTxtNumber(Value.AffectedAccount);
+      lblReceiverCaption.Visible := false;
+      lblReceiver.Visible := false;
+      lblFeeCaption.Visible := true;
+      lblFee.Visible := true;
+      lblReceiverInfo.Visible := false;
+    end;
+    lblFee.Caption := TAccountComp.FormatMoney(value.Fee);
+    if Value.Fee>0 then lblFee.Font.Color := clGreen
+    else if Value.Fee=0 then lblFee.Font.Color := clGray
+    else lblFee.Font.Color := clRed;
+    ebOpHash.text := TCrypto.ToHexaString(Value.OperationHash);
+    memoOriginalPayloadInHexa.Lines.Text := TCrypto.ToHexaString(Value.OriginalPayload);
+    if Assigned(FWalletKeys) then begin
+      cbMethodPublicPayload.Checked := FAppParams.ParamByName['PayloadDecoder.notencrypted'].GetAsBoolean(true);
+      cbUsingPrivateKeys.Checked := FAppParams.ParamByName['PayloadDecoder.usingprivatekeys'].GetAsBoolean(true);
+      cbUsingPasswords.Checked := FAppParams.ParamByName['PayloadDecoder.usingpasswords'].GetAsBoolean(true);
+      memoPasswords.Lines.Text := FAppParams.ParamByName['PayloadDecoder.passwords'].GetAsString('');
+      cbShowAsHexadecimal.Checked := FAppParams.ParamByName['PayloadDecoder.showashexadecimal'].GetAsBoolean(false);
+    end else begin
+      cbMethodPublicPayload.Checked := true;
+      cbUsingPrivateKeys.Checked := true;
+      cbUsingPasswords.Checked := true;
+      memoPasswords.Lines.Text := '';
+    end;
+    FSavedDecodeMethods := true;
+    PageControl.ActivePage := tsDecoded;
+    TryToDecode;
+  Finally
+    FSemaphor := sem;
+  End;
+end;
+
+procedure TFRMPayloadDecoder.TryToDecode;
+  Function UseWallet(Const raw : TRawBytes; var Decrypted : AnsiString; var WalletKey : TWalletKey) : Boolean;
+  Var i : Integer;
+  begin
+    Result := false;
+    if Not assigned(FWalletKeys) then exit;
+
+    for i := 0 to FWalletKeys.Count - 1 do begin
+      WalletKey := FWalletKeys.Key[i];
+      If Assigned(WalletKey.PrivateKey) then begin
+        If ECIESDecrypt(WalletKey.PrivateKey.EC_OpenSSL_NID,WalletKey.PrivateKey.PrivateKey,false,raw,Decrypted) then begin
+          Result := true;
+          exit;
+        end;
+      end;
+    end;
+
+  end;
+
+  Function  UsePassword(const raw : TRawBytes; var Decrypted,PasswordUsed : AnsiString) : Boolean;
+  Var i : Integer;
+  Begin
+    Result := false;
+    for i := 0 to memoPasswords.Lines.Count - 1 do begin
+      if (TAESComp.EVP_Decrypt_AES256(raw,memoPasswords.Lines[i],Decrypted)) then begin
+        if (TCrypto.IsHumanReadable(Decrypted)) then begin
+          Result := true;
+          PasswordUsed := memoPasswords.Lines[i];
+          exit;
+        end;
+      end;
+    end;
+  End;
+
+
+Var raw : TRawBytes;
+  WalletKey : TWalletKey;
+  Decrypted,PasswordUsed : AnsiString;
+  ok : boolean;
+begin
+  ok := true;
+  if Assigned(FWalletKeys) And Assigned(FAppParams) then begin
+    raw := FOpResume.OriginalPayload;
+    if raw<>'' then begin
+      // First try to a human readable...
+      if (cbMethodPublicPayload.Checked) and (TCrypto.IsHumanReadable(raw)) then begin
+        if cbShowAsHexadecimal.Checked then memoDecoded.Lines.Text := TCrypto.ToHexaString(raw)
+        else memoDecoded.Lines.Text := raw;
+        lblDecodedMethod.Caption := 'Not encrypted payload';
+      end else if (cbUsingPrivateKeys.Checked) And (UseWallet(raw,Decrypted,WalletKey)) then begin
+        if cbShowAsHexadecimal.Checked then memoDecoded.Lines.Text := TCrypto.ToHexaString(Decrypted)
+        else memoDecoded.Lines.Text := Decrypted;
+        lblDecodedMethod.Caption := 'Encrypted with EC '+TAccountComp.GetECInfoTxt(WalletKey.PrivateKey.EC_OpenSSL_NID);
+      end else if (cbUsingPasswords.Checked) And (UsePassword(raw,Decrypted,PasswordUsed)) then begin
+        if cbShowAsHexadecimal.Checked then memoDecoded.Lines.Text := TCrypto.ToHexaString(Decrypted)
+        else memoDecoded.Lines.Text := Decrypted;
+        lblDecodedMethod.Caption := 'Encrypted with pwd:"'+PasswordUsed+'"';
+      end else begin
+        memoDecoded.Lines.Text := 'CANNOT DECRYPT';
+        lblDecodedMethod.Caption := '';
+        ok := false;
+      end;
+      if ok then begin
+        memoDecoded.Font.Color := clBlack;
+        memoDecoded.Color := clWhite;
+      end else begin
+        memoDecoded.Font.Color := clRed;
+        memoDecoded.Color := clBtnFace;
+      end;
+    end else begin
+      memoDecoded.Lines.Text := '(No payload)';
+      memoDecoded.Font.Color := clDkGray;
+      memoDecoded.Color := clLtGray;
+      lblDecodedMethod.Caption := '';
+    end;
+  end else begin
+    memoDecoded.Lines.Text := '';
+    lblDecodedMethod.Caption := '';
+  end;
+end;
+
+end.

+ 220 - 0
src/gui-classic/UFRMSaleAccounts.dfm

@@ -0,0 +1,220 @@
+object FRMSaleAccounts: TFRMSaleAccounts
+  Left = 0
+  Top = 0
+  BorderStyle = bsSingle
+  Caption = 'Sale accounts'
+  ClientHeight = 312
+  ClientWidth = 604
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poOwnerFormCenter
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  PixelsPerInch = 96
+  TextHeight = 13
+  object lblAccountCaption: TLabel
+    Left = 25
+    Top = 20
+    Width = 43
+    Height = 13
+    Caption = 'Account:'
+  end
+  object Label1: TLabel
+    Left = 25
+    Top = 95
+    Width = 50
+    Height = 13
+    Caption = 'Sale price:'
+  end
+  object Label2: TLabel
+    Left = 202
+    Top = 95
+    Width = 87
+    Height = 13
+    Caption = 'Locked until block:'
+  end
+  object Label3: TLabel
+    Left = 25
+    Top = 119
+    Width = 142
+    Height = 13
+    Caption = 'Seller account (where to pay)'
+  end
+  object lblAccountBalance: TLabel
+    Left = 432
+    Top = 15
+    Width = 149
+    Height = 19
+    Caption = 'lblAccountBalance'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clGreen
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object lblAccountsCount: TLabel
+    Left = 387
+    Top = 58
+    Width = 18
+    Height = 13
+    Caption = 'XXX'
+  end
+  object lblBalanceCaption: TLabel
+    Left = 387
+    Top = 20
+    Width = 41
+    Height = 13
+    Caption = 'Balance:'
+  end
+  object memoAccounts: TMemo
+    Left = 74
+    Top = 12
+    Width = 307
+    Height = 59
+    Ctl3D = False
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -12
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    Lines.Strings = (
+      '123456-11 (0.0000); 123456-11 (0.0000); '
+      '123456-11 (0.0000); 123456-11 (0.0000); ')
+    ParentCtl3D = False
+    ParentFont = False
+    ReadOnly = True
+    ScrollBars = ssVertical
+    TabOrder = 1
+  end
+  object ebSenderAccount: TEdit
+    Left = 74
+    Top = 12
+    Width = 97
+    Height = 27
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+    TabOrder = 0
+    Text = 'ebSenderAccount'
+  end
+  object ebSalePrice: TEdit
+    Left = 81
+    Top = 92
+    Width = 86
+    Height = 21
+    TabOrder = 2
+    Text = 'Edit1'
+  end
+  object ebLockedUntilBlock: TEdit
+    Left = 295
+    Top = 92
+    Width = 86
+    Height = 21
+    TabOrder = 3
+    Text = 'ebLockedUntilBlock'
+  end
+  object gbSellOptions: TGroupBox
+    Left = 25
+    Top = 150
+    Width = 516
+    Height = 101
+    Caption = ' Sell options: '
+    TabOrder = 4
+    object lblNewOwnerPublicKey: TLabel
+      Left = 25
+      Top = 66
+      Width = 111
+      Height = 13
+      Caption = 'New owner'#39's public key'
+    end
+    object rbEveryoneCanBuy: TRadioButton
+      Left = 10
+      Top = 20
+      Width = 113
+      Height = 17
+      Caption = 'Everyone can buy'
+      TabOrder = 0
+    end
+    object rbReservedForAPublickKey: TRadioButton
+      Left = 10
+      Top = 43
+      Width = 301
+      Height = 17
+      Caption = 'Reserved for only one public key (private)'
+      TabOrder = 1
+    end
+    object ebNewOwnerPublicKey: TEdit
+      Left = 148
+      Top = 63
+      Width = 331
+      Height = 21
+      TabOrder = 2
+      Text = 'ebDestAccount'
+    end
+  end
+  object ebSellerAccount: TEdit
+    Left = 181
+    Top = 116
+    Width = 86
+    Height = 21
+    TabOrder = 5
+    Text = 'Edit1'
+  end
+  object bbExecute: TBitBtn
+    Left = 277
+    Top = 261
+    Width = 130
+    Height = 31
+    Action = actExecute
+    Caption = 'Execute (F12)'
+    DoubleBuffered = True
+    Glyph.Data = {
+      DE010000424DDE01000000000000760000002800000024000000120000000100
+      0400000000006801000000000000000000001000000000000000000000000000
+      80000080000000808000800000008000800080800000C0C0C000808080000000
+      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+      3333333333333333333333330000333333333333333333333333F33333333333
+      00003333344333333333333333388F3333333333000033334224333333333333
+      338338F3333333330000333422224333333333333833338F3333333300003342
+      222224333333333383333338F3333333000034222A22224333333338F338F333
+      8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
+      33333338F83338F338F33333000033A33333A222433333338333338F338F3333
+      0000333333333A222433333333333338F338F33300003333333333A222433333
+      333333338F338F33000033333333333A222433333333333338F338F300003333
+      33333333A222433333333333338F338F00003333333333333A22433333333333
+      3338F38F000033333333333333A223333333333333338F830000333333333333
+      333A333333333333333338330000333333333333333333333333333333333333
+      0000}
+    NumGlyphs = 2
+    ParentDoubleBuffered = False
+    TabOrder = 6
+  end
+  object bbCancel: TBitBtn
+    Left = 425
+    Top = 261
+    Width = 116
+    Height = 31
+    DoubleBuffered = True
+    Kind = bkCancel
+    ParentDoubleBuffered = False
+    TabOrder = 7
+  end
+  object ActionList: TActionList
+    Left = 140
+    Top = 350
+    object actExecute: TAction
+      Caption = 'Execute (F12)'
+      ShortCut = 123
+      OnExecute = actExecuteExecute
+    end
+  end
+end

+ 245 - 0
src/gui-classic/UFRMSaleAccounts.pas

@@ -0,0 +1,245 @@
+unit UFRMSaleAccounts;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls, UAccounts, Buttons, ActnList;
+
+type
+  TFRMSaleAccounts = class(TForm)
+    lblAccountCaption: TLabel;
+    ebSenderAccount: TEdit;
+    memoAccounts: TMemo;
+    Label1: TLabel;
+    ebSalePrice: TEdit;
+    Label2: TLabel;
+    ebLockedUntilBlock: TEdit;
+    gbSellOptions: TGroupBox;
+    rbEveryoneCanBuy: TRadioButton;
+    rbReservedForAPublickKey: TRadioButton;
+    lblNewOwnerPublicKey: TLabel;
+    ebNewOwnerPublicKey: TEdit;
+    Label3: TLabel;
+    ebSellerAccount: TEdit;
+    bbExecute: TBitBtn;
+    bbCancel: TBitBtn;
+    lblAccountBalance: TLabel;
+    lblAccountsCount: TLabel;
+    lblBalanceCaption: TLabel;
+    ActionList: TActionList;
+    actExecute: TAction;
+    procedure FormCreate(Sender: TObject);
+    procedure actExecuteExecute(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+  private
+    FDisabled : Boolean;
+    FSenderAccounts: TOrderedCardinalList;
+    FWalletKeys: TWalletKeys;
+    FOldOnChanged : TNotifyEvent;
+    { Private declarations }
+    Procedure UpdateAccountsInfo;
+    procedure SetWalletKeys(const Value: TWalletKeys);
+  public
+    { Public declarations }
+    Property SenderAccounts : TOrderedCardinalList read FSenderAccounts;
+    Property WalletKeys : TWalletKeys read FWalletKeys write SetWalletKeys;
+  end;
+
+
+implementation
+
+uses UNode;
+
+{$R *.dfm}
+
+procedure TFRMSaleAccounts.actExecuteExecute(Sender: TObject);
+Var errors : AnsiString;
+  P : PAccount;
+  i,iAcc : Integer;
+  wk : TWalletKey;
+  ops : TOperationsHashTree;
+  op : TPCOperation;
+  account : TAccount;
+  operation_to_string, operationstxt, auxs : String;
+  _amount,_fee, _totalamount, _totalfee : Int64;
+  dooperation : Boolean;
+begin
+  if Not Assigned(WalletKeys) then raise Exception.Create('No wallet keys');
+  If Not UpdateOperationOptions(errors) then raise Exception.Create(errors);
+  ops := TOperationsHashTree.Create;
+  Try
+    _totalamount := 0;
+    _totalfee := 0;
+    operationstxt := '';
+    operation_to_string := '';
+    for iAcc := 0 to FSenderAccounts.Count - 1 do begin
+      op := Nil;
+      account := FNode.Operations.SafeBoxTransaction.Account(FSenderAccounts.Get(iAcc));
+      If Not UpdatePayload(account, errors) then
+        raise Exception.Create('Error encoding payload of sender account '+TAccountComp.AccountNumberToAccountTxtNumber(account.account)+': '+errors);
+      i := WalletKeys.IndexOfAccountKey(account.accountInfo.accountKey);
+      if i<0 then begin
+        Raise Exception.Create('Sender account private key not found in Wallet');
+      end;
+
+      wk := WalletKeys.Key[i];
+      dooperation := true;
+      //
+      if rbTransaction.Checked then begin
+        // Amount
+        _amount := 0;
+        _fee := 0;
+        if FSenderAccounts.Count>1 then begin
+          if account.balance>0 then begin
+            if account.balance>fee then begin
+              _amount := account.balance - fee;
+              _fee := fee;
+            end else begin
+              _amount := account.balance;
+              _fee := 0;
+            end;
+          end else dooperation := false;
+        end else begin
+          _amount := FTxAmount;
+          _fee := fee;
+        end;
+        if dooperation then begin
+          op := TOpTransaction.CreateTransaction(account.account,account.n_operation+1,FTxDestAccount,wk.PrivateKey,_amount,_fee,FEncodedPayload);
+          inc(_totalamount,_amount);
+          inc(_totalfee,_fee);
+        end;
+        operationstxt := 'Transaction to '+TAccountComp.AccountNumberToAccountTxtNumber(FTxDestAccount);
+      end else if rbChangeKey.Checked then begin
+        i := PtrInt(cbNewPrivateKey.Items.Objects[cbNewPrivateKey.ItemIndex]);
+        if (i<0) Or (i>=WalletKeys.Count) then raise Exception.Create('Invalid selected key');
+        FNewAccountPublicKey := WalletKeys.Key[i].AccountKey;
+        if account.balance>fee then _fee := fee
+        else _fee := 0;
+        op := TOpChangeKey.Create(account.account,account.n_operation+1,wk.PrivateKey,FNewAccountPublicKey,_fee,FEncodedPayload);
+        inc(_totalfee,_fee);
+        operationstxt := 'Change private key to '+wk.Name;
+      end else if rbTransferToANewOwner.Checked then begin
+        if account.balance>fee then _fee := fee
+        else _fee := 0;
+        op := TOpChangeKey.Create(account.account,account.n_operation+1,wk.PrivateKey,FNewAccountPublicKey,_fee,FEncodedPayload);
+        operationstxt := 'Transfer to a new owner with key type '+TAccountComp.GetECInfoTxt(FNewAccountPublicKey.EC_OpenSSL_NID);
+        inc(_totalfee,_fee);
+      end else begin
+        raise Exception.Create('No operation selected');
+      end;
+      if Assigned(op) And (dooperation) then begin
+        ops.AddOperationToHashTree(op);
+        if operation_to_string<>'' then operation_to_string := operation_to_string + #10;
+        operation_to_string := operation_to_string + op.ToString;
+      end;
+      FreeAndNil(op);
+    end;
+    if (ops.OperationsCount=0) then raise Exception.Create('No valid operation to execute');
+
+    if (FSenderAccounts.Count>1) then begin
+      if rbTransaction.Checked then auxs := 'Total amount that dest will receive: '+TAccountComp.FormatMoney(_totalamount)+#10
+      else auxs:='';
+      if Application.MessageBox(PChar('Execute '+Inttostr(FSenderAccounts.Count)+' operations?'+#10+
+        'Operation: '+operationstxt+#10+
+        auxs+
+        'Total fee: '+TAccountComp.FormatMoney(_totalfee)+#10+#10+'Note: This operation will be transmitted to the network!'),
+        PChar(Application.Title),MB_YESNO+MB_ICONINFORMATION+MB_DEFBUTTON2)<>IdYes then exit;
+    end else begin
+      if Application.MessageBox(PChar('Execute this operation:'+#10+#10+operation_to_string+#10+#10+'Note: This operation will be transmitted to the network!'),
+        PChar(Application.Title),MB_YESNO+MB_ICONINFORMATION+MB_DEFBUTTON2)<>IdYes then exit;
+    end;
+    i := FNode.AddOperations(nil,ops,Nil,errors);
+    if (i=ops.OperationsCount) then begin
+      Application.MessageBox(PChar('Successfully executed '+inttostr(i)+' operations!'+#10+#10+operation_to_string),PChar(Application.Title),MB_OK+MB_ICONINFORMATION);
+      ModalResult := MrOk;
+    end else if (i>0) then begin
+      Application.MessageBox(PChar('One or more of your operations has not been executed:'+#10+
+        'Errors:'+#10+
+        errors+#10+#10+
+        'Total successfully executed operations: '+inttostr(i)),PChar(Application.Title),MB_OK+MB_ICONWARNING);
+      ModalResult := MrOk;
+    end else begin
+      raise Exception.Create(errors);
+    end;
+  Finally
+    ops.Free;
+  End;
+end;
+
+procedure TFRMSaleAccounts.FormCreate(Sender: TObject);
+begin
+  FSenderAccounts := TOrderedCardinalList.Create;
+  ebSenderAccount.Text := '';
+  ebSalePrice.Text := '';
+  ebLockedUntilBlock.Text := '';
+  ebSellerAccount.Text := '';
+  ebNewOwnerPublicKey.Text := '';
+  memoAccounts.lines.Clear;
+  FDisabled := false;
+
+end;
+
+procedure TFRMSaleAccounts.FormDestroy(Sender: TObject);
+begin
+  FSenderAccounts.Free;
+end;
+
+procedure TFRMSaleAccounts.SetWalletKeys(const Value: TWalletKeys);
+begin
+  if FWalletKeys=Value then exit;
+  if Assigned(FWalletKeys) then FWalletKeys.OnChanged := FOldOnChanged;
+  FWalletKeys := Value;
+  if Assigned(FWalletKeys) then begin
+    FOldOnChanged := FWalletKeys.OnChanged;
+    FWalletKeys.OnChanged := OnWalletKeysChanged;
+  end;
+  UpdateWalletKeys;
+end;
+
+procedure TFRMSaleAccounts.UpdateAccountsInfo;
+Var ld : Boolean;
+  i : Integer;
+  balance : int64;
+  acc : TAccount;
+  accountstext : String;
+begin
+  ld := FDisabled;
+  FDisabled := true;
+  Try
+    lblAccountCaption.Caption := 'Account';
+    lblAccountsCount.Visible := false;
+    lblAccountsCount.caption := inttostr(senderAccounts.Count)+' accounts';
+    balance := 0;
+    if SenderAccounts.Count<=0 then begin
+      ebSenderAccount.Text := '';
+      memoAccounts.Visible := false;
+      ebSenderAccount.Visible := true;
+    end else if SenderAccounts.Count=1 then begin
+      ebSenderAccount.Text := TAccountComp.AccountNumberToAccountTxtNumber(SenderAccounts.Get(0));
+      memoAccounts.Visible := false;
+      ebSenderAccount.Visible := true;
+      balance := TNode.Node.Operations.SafeBoxTransaction.Account(SenderAccounts.Get(0)).balance;
+    end else begin
+      // Multiple sender accounts
+      lblAccountCaption.Caption := 'Accounts';
+      lblAccountsCount.Visible := true;
+      ebSenderAccount.Visible := false;
+      accountstext := '';
+      for i := 0 to SenderAccounts.Count - 1 do begin
+         acc := TNode.Node.Operations.SafeBoxTransaction.Account(SenderAccounts.Get(i));
+         balance := balance + acc.balance;
+         if (accountstext<>'') then accountstext:=accountstext+'; ';
+         accountstext := accountstext+TAccountComp.AccountNumberToAccountTxtNumber(acc.account)+' ('+TAccountComp.FormatMoney(acc.balance)+')';
+      end;
+      memoAccounts.Lines.Text := accountstext;
+      memoAccounts.Visible := true;
+    end;
+    ebSenderAccount.Enabled := ebSenderAccount.Visible;
+    lblAccountBalance.Caption := TAccountComp.FormatMoney(balance);
+  Finally
+    FDisabled := ld;
+  End;
+end;
+
+end.

+ 1716 - 0
src/gui-classic/UFRMWallet.dfm

@@ -0,0 +1,1716 @@
+object FRMWallet: TFRMWallet
+  Left = 360
+  Top = 328
+  Caption = 'Pascal Coin Wallet, JSON-RPC Miner & Explorer'
+  ClientHeight = 542
+  ClientWidth = 849
+  Color = clBtnFace
+  Constraints.MinHeight = 600
+  Constraints.MinWidth = 865
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  Menu = MainMenu
+  OldCreateOrder = False
+  Position = poOwnerFormCenter
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  PixelsPerInch = 96
+  TextHeight = 13
+  object pnlTop: TPanel
+    Left = 0
+    Top = 0
+    Width = 849
+    Height = 91
+    Align = alTop
+    BevelOuter = bvNone
+    TabOrder = 0
+    object Image1: TImage
+      Left = 15
+      Top = 15
+      Width = 60
+      Height = 60
+      AutoSize = True
+      Picture.Data = {
+        0954506E67496D61676589504E470D0A1A0A0000000D494844520000003C0000
+        003C08060000003AFCD9720000000473424954080808087C0864880000000970
+        48597300000B1200000B1201D2DD7EFC0000001C74455874536F667477617265
+        0041646F62652046697265776F726B7320435336E8BCB28C00000FBA49444154
+        78DAD59B095C55D79DC77F7779F72DF0001F48004571C17D091A318AC11D9D8C
+        4B1A6B4D9A38666BBA24699A34B669D3345A5BA78E6DDA8C33934C938989ADCD
+        A2C4246615B728EA68558C1A10104454400494F5DD77DF5DE67FEE7B1AC4FB14
+        788A99FF87F7B9EFC33DF7DDFBBDE77FFEDB3987330C033752CA8A8F0E104521
+        9317F80C4972DCEA70B9539C2E770C3BE76D69BC207B1BCB149F7C48D7F45DAA
+        AAED48491D5674239F87BBDEC047F3F6B905811B27F0C2644110D20551E84BC0
+        71F4DD61B33B05872B8A734644996DBDCD0D90BD0D865FF66A243201D768AA56
+        4ADFF769BAB64DD78C3D43D3D21BBF91C0797B733304817F90C066F38210CF0B
+        2278D10EC12641147988BC0E49E0E170D8E1B43B03C03E2F649F0F8AAA43D579
+        A874D4FC0A74D5075D53E9A35513FC464DD357A78D9DB0EB1B01BC6FE7B63B09
+        7431414EA20F389B13ECE8305AE0F4D7C2E1AF865DA985A8D483D7BCE0743FDD
+        5437AF35381E066F832E38A14AD1F049B1906DF1F0DAE8C8B918300CBFD73CD2
+        673B81AF4CBF63F22737053877CBE7B792DAFEAB20F23379C1068340ED9C0FD1
+        4A05A2E512B8E40A882A69A3A1B1DB98700001D277F6172036CFD0173DF812D8
+        3F04A8A21B2D8E24D43BFAA15E4A82CFB083F3CB04ED07A9FC67A4EEBF983075
+        C6A12E03DEB1E99317785E789EA7C109D10527E745BC52048F5C483D7ADE6CA3
+        7322410A9DEC050DBCA19ADF655B37D43906A25A1A00AF4143416D219557355D
+        D7966566DDB9F486026FFE64632F9EE3FE4A2A9C09C10151E090A41523493E02
+        BB564F903613F47A0A03E70D3F7C42342A1CC35121A442D5E8993519A4E23B74
+        C35838EDCED9E5D71D78D387EF67F03CB79EC667822E3A41EF1DA9FE0388D22A
+        49211968E77AB3FDE0D4EBF0A3414844B16D34CEC3035E35C77795AE1BDFCE9A
+        7357BB8C5ABB803FDD903D8BE7F96CB2BC924196B7378EA3BF9A0781DEBECA49
+        61C370C1316DF528E639C3FC3345341468A44525621ACAD01F5CC0A22BBAAECF
+        FBA76FCDFB286CE08FB2D7CD1278FE03907562C669080E21D9288246BD6A800F
+        8F94EE2D3A6D686DC554AFFFD21B105DF432353266E4CEC87741F5EB08D83C1D
+        02F5F6296E00F271AB69CCC89A51ECA2CF9D356FFE55A1AF0AFCE1BA77C6D198
+        FD82136C36E66AD2F8FD48C049A87084071A14816073FEB70CCBDE3A6042FFEA
+        9E34648DEB0BDDAB80B78B7861F55EE4E49D46A2C785FF7A3C13F174D4FDDAA5
+        EB45C8A8227DCBD36F0BB830CDEFA7313D71CEFC057B3A0CBCE19DBFF710383E
+        8FE3C5EE048CD1E27E2472A708D61EB8305C5AFA01C1ED40D64FDE33A1983C92
+        D90BAF3E3F833ADA8EAA730D48BC6FCDA5E69B7F7907A64E1E06D5A75FA6FB22
+        7CA834927140BD8D01C3D0D5739AA1A77D6BC177CFB41BF8ED37D6C06E177753
+        FC3B4EE31D18251D410A5F1280656AE82035A4E809E1C42C64E1412ADAE7FE35
+        283B1B881EDFFEE1282C98D90F888EC3EE8355C8787A83F97FB743C4993F4D83
+        3B211A8889A3FB923F272DD074E3127499DE0F79CA70F03AF3D7FA1E9F4F1B7F
+        CF030BDB079CBDF66FE467F9252AB99E81D2498CB01D866A4826A018E5C0EE03
+        E558BAF600C289D2C8E2435634EC3C4A563EF83B63FAC6C01361632771EABC82
+        FCF2804F774902320678E014398CE81B8749E9FD31616802ECF42C46938FC075
+        889C1F87FD2350A8F486482E8B8CD89279F7DD7F859FBE02F8DD356F0E21D823
+        BA60E7E36C8D98E8D86B46433ABD55911EE6745523463FB60ED517BC61746FF8
+        92DA231A4FCC1D8E27EE1A616A9DE60B18BB2FE4B1A8F1BB298CF511B33EFC3B
+        FFB228FF5AC05B385E98C251F03F39623F6285F3D4BB22449B00992C66C68FB3
+        71B0A4E6A6C2B696AC51C9C85E321311928DC24F2FEAF46ED8DA3C86C6B34AE3
+        59DB4AC0534302BFF3E6EAE9F4963669BC13831DE54873E69BAACCD48F8F9030
+        FFB98FB17E57E9CD66BC42EE4A4FC686E5B329F862EE4A469E77080AE45E1075
+        2F1B76590B163D986309FCD6EAD77791551EEF100DCC88DA47C98062FA5AC16D
+        C7E2553BF087EC2F6F365B48C9F96526A64D19069D54DBA7D9F079433A649563
+        567BF7BD0F3E947105F04B2B56A47B3CDDF672921B2322CA30C25964F62E0B0C
+        3EDB5582452BB74092AE6F9CDC1161B14875BD0F3E55B73CFFC81D3DF1EA5319
+        506DD1E440C88035A7E2704B0A0CA51175B575639F7CF6D97D9701AF5CB6ECF5
+        F85B6E79D0E5B46366F401440A5E6864A840EADC50DF02B1B18EFA9A453A2CBA
+        BAB165A12B60E923512032E577B9C82DAAB36C33775402DE7F662C0564026C1E
+        0F9A75173EBD300A2D5E1FAAABCEAE5EFCEBE71FBA04BCF03BF7BA060F4A3D95
+        98DCC793EABE8009EEA3A6A1BA286662AF2AD0EBCE51DEA77F1DFC0685E10BF4
+        6238DB55424D3FAB6A189D0A58D8353CF9E2494B77E08B63B5966DEEBE2D11D9
+        CFDC0E5FA30F9CDD01C913835D4DC351D440595679695D7E4161F2DAF5EFB698
+        C03F7AF87BD313136ED9D4B34F2AA6C616A29774F632E00035C1F8C9D95B40B3
+        AFAC4C535CD51CF2A17B789C8821B766E81DD70EB3870978E26F766247E13580
+        9BFDE6F3490E01A72286616BDD2094971C43456555D62BAB5FCF31817FF8D0C3
+        BF4F4848FCF9E0FEBD303BFE30C5530AAB415CF9AB046DF8AFEC69BBCB868FFF
+        5181592FEE0DF9D0B9BF9A808CC171F0C96A27FA98EEE11431F5B7B9D89A6FED
+        122F0346208F56A4687CAC4E417E51392A2B4EAFF8EF37DF78D6047E74D1035B
+        137BF69E3C616034A6C7159805B59062016D774B58F2D65758BAA1D0F292187A
+        21252BA7520F4BF06B3A3A230C781A8DE12D5FB50F98898D82E1CDC644E496CA
+        4CADB7BDF6D73553B82913EEE8D72725656B52AFFEBDE60E0346C75036A45DC3
+        1AB781B6474A98B3620F36E6555936CF48F520F7854C283EB5D3E68E69D1D465
+        3BDBDDC3E635E456F7EB23F1E109374E9F282C2F292D9DC2CDCA9AF1487CF7EE
+        7F4A4E498D5C38B219FD226B09B81DD58B203477A186525115839EDD8EB29A16
+        CBA68F4FEF8355DF4B2383A2740ED64ED92F4B349ECEC199F3720780FD28D67A
+        E16F279371F2784153F5B9734F71B367CC7C232E36EEBE3EFDFA8BDF4FBB8078
+        7BD3D555BA0DB4080D855F9DC0909F6FB99404B495F79F4CC75C824653078183
+        36A2A959C14FD71CC15FB69F0CD9F4AED109D8B078DCE52ACD6938AB7BF05A59
+        2A8E1F2F54CFD5D4AC65C0876263E3460CECDF97FBD1A83A44893EB2D0ED771E
+        22E5B41B728EE1EEDF6D0AD966DAD0EE88A571AE77D04233DE669F86BCB27A54
+        5C90AFDA767E7A12DEFD29F570AB972A703A1A8D08BC5236100545A5464DCDB9
+        C34CA5EB6363BB470D1B9882C708D841518AD611E068079EFBCF5C2C7FE760C7
+        7AEF3ACBAA85C3F1F8ACD436C00645D676BC7C62208E149D444D4D7503033608
+        182307F53681454E25D5EC003059DE998B3FC0E7074EDD34D8F8283B0AFE6D2A
+        A2C957ABADBC002BFBAB9C0D2F970D425E61396A6BAA1116308BAE7C7E0DFD1F
+        7E0B676A9BDB75CDF516365FF5C9E2DB3175E42D81F1DBEAD14301775AA5458A
+        6FF34B6B30F407EFDE14D8F47EDDF012A9F2ED2CA0611EA0CD635BAA7438464B
+        A4B4F1ED4F0B70EF8ACD21DBB8296010B9E00C1259F106EFD79156149DE3E91C
+        334E32B91DAF12A84832CD61D7B576DA46B03793631D18D3B79B992CCC18110F
+        5EE4E16B512DAB8A96462B1CB7C40CD6337FFE027F7CCF3A4FEED1CD817D4B32
+        61A7A442A0F1B52EF7141E7D3DD036292670CE21F1B091A67C77D53FF0F1A1B3
+        E6B9451392F1E7876F85D2CA0031601B017B226D00FD16A921FC5E35A42B6462
+        E9966665CDA4C023AEC381077BA1824BC2E4A7DEC3F6C315966D66520F7C4A31
+        B4410FC6915B7AF29583F8F74D818AC92452C36D4B3341D93AABA1A3FFE22D97
+        029797178DC00FE60C80D1C66FB33098552ADBEBDD2C038F4E8596AC77E96D37
+        79FDE8F7D0DF2931B72EE83D470FFDDBFB8799E38B859F3FF99F43782908BC7C
+        FE60FCE2DB83A1B5F8D142C069CF6D47497533F52287FDBF9988E1BDA32914D5
+        AEF91C5707B6082D3B9C3C5C0476D870A8F02CD21E5F1FB24DF68FC7E0EEF13D
+        4DEBC9D140F513D8FE1317CC1A597ADF1873EC328D14681C56D679517CB6D974
+        31437AB8CDB6E18A441E27476F933C74283D6C0D1CE5C09B1F1CC1032F6EB33C
+        CF0C4FFEEFA7604062247CAD8C912805868B9F7AEFD2F8A3031BE7601F1A9B17
+        DB8723AC3AA3704E7C644C47C1F153A83CD32A3D6C5701A02D70B4134FACDC82
+        FFD878D4F27CDFEE2E1398416A9D48FAC315893AED24DF17DBF5F1283FCE0A00
+        955F1700AE55E2692BA6C122956635EADD05D629A15963FAD9E5C17C5703E70A
+        93705C4D4245D9F1BAFCFCC2E4B5D9C1120F9390453C0B61AB72EA1B7DE84306
+        EB7C93CFB2CDD2BB07E1D7F70CE9744A188E0894C1357391D824FEB375118F49
+        A832AD25B0D3867D472A31965C5228D9F8F458CC1A93444141D7F7B09DE2AB43
+        C2181CE547C290EBADCBB44CAC0AF1BAC5A43733587F597F08DF5FB5C3F2862C
+        40285C31057DE25D146B876F6D3B22AC776532569B6DB321EB029B42B52EC433
+        0935D572053045588F2ECFC1AB9F1558DE742059E6A3CB279BDFBBDA60D90D19
+        07A50C1CE38742D49AAF3ED5C224D464DAA50BD844B62462CC63EBB0BFF89CE5
+        4DAD92F1AE109BA1A05648C00EC79DD055FFB527D382C0D6D3A541D56606ABF6
+        82D734588D5EEBF1B962C110FC6CDEA02E3558E6AC08C94ED71CD4C2034E95DB
+        375DCA24E4843802097FCE9E32643D177AEDC8A6C5E3303D2D013E6FD7192CC9
+        F0E24B17B921713804B5B9FD13E24CAEB6E481250C39BB4BF0DA077981D98836
+        2252A0F1E27DC3D09D5247B59335E88E8A5D6F41A9330D5F3A330996DCA9A675
+        6CC90393908B5A0CBB39390E7F23D0D418840E2EA60A8A4AD95167E7913A2A12
+        C1563806212F72065964854D84777C51CB45B9EAB22502D5EBCFC3686EB4ECE9
+        1B2F06C17A51E91C8C2FA366909162CB9694CE2F5BBA28A117A64930782108DD
+        C0A618BB0C952D3E150D1F4E45DE866351934C8B0CCD1FFEC2B48B1272E92161
+        ABBCBD4B7B5AD07DE622D652CF2494BBD2983566C0D76FE9E145B15E5CBA1F51
+        5A157482561B1A6E28349B0D64B0F5AE1494C64EC7795B2278A5E9C62C2EBD28
+        96CB87D562242947C95236107413B416EF7585662BE8055D81CF1E8B2ACF7854
+        46A59906117EEF8D5D3EDC5A2C1788FB8B112B17C1565B0283ACB74EAA1FD602
+        712D10B4F89CF1A8F38C424D741ABC7C24C07AB5AB1688B716EB2D000AA2D50A
+        B8AB0FC279BED8DCE7009D051FBC69E0CCD5B7E60459AB3D008661AE8EE57456
+        E520BFCDDBA0DA63E075A7A0A1DB303444F6838F92014E612BE11556F0EBFA2D
+        00ADC56A93077931D8D54638BC5570349F86D4520541AE85E06F06C77A4E0F96
+        70D84B102468B608688E5828AE04C8113D213B294A13DDAC27E97D7903C79BBD
+        C9A3AD586EE3B13928D1B007B6F130474663DE214970DA03CB8FBD3E19B25F81
+        A21AE4DB85C0361E85ACB0B9A1E31BBA8DA7AD5C73A3564414E77405376AB534
+        406EF97FBA512B94B47B2B9EAAEF52B51BBF15EFFF000BB1F477942997640000
+        000049454E44AE426082}
+    end
+    object lblCurrentBlockCaption: TLabel
+      Left = 90
+      Top = 11
+      Width = 60
+      Height = 13
+      Caption = 'Total Blocks:'
+    end
+    object lblCurrentBlock: TLabel
+      Left = 156
+      Top = 11
+      Width = 18
+      Height = 13
+      Caption = '000'
+    end
+    object lblCurrentBlockTimeCaption: TLabel
+      Left = 90
+      Top = 26
+      Width = 89
+      Height = 13
+      Caption = 'Current Block age:'
+    end
+    object lblCurrentBlockTime: TLabel
+      Left = 188
+      Top = 26
+      Width = 81
+      Height = 13
+      Caption = '000 seconds ago'
+    end
+    object lblOperationsPendingCaption: TLabel
+      Left = 90
+      Top = 41
+      Width = 98
+      Height = 13
+      Caption = 'Pending Operations:'
+    end
+    object lblOperationsPending: TLabel
+      Left = 194
+      Top = 41
+      Width = 18
+      Height = 13
+      Caption = '000'
+    end
+    object lblMiningStatusCaption: TLabel
+      Left = 90
+      Top = 56
+      Width = 68
+      Height = 13
+      Caption = 'Miners clients:'
+    end
+    object lblMinersClients: TLabel
+      Left = 163
+      Top = 56
+      Width = 18
+      Height = 13
+      Caption = '000'
+    end
+    object lblCurrentDifficultyCaption: TLabel
+      Left = 429
+      Top = 11
+      Width = 76
+      Height = 13
+      Caption = 'Current Target:'
+    end
+    object lblCurrentDifficulty: TLabel
+      Left = 511
+      Top = 11
+      Width = 18
+      Height = 13
+      Caption = '000'
+    end
+    object lblTimeAverage: TLabel
+      Left = 360
+      Top = 26
+      Width = 18
+      Height = 13
+      Caption = '000'
+    end
+    object Label4: TLabel
+      Left = 285
+      Top = 26
+      Width = 69
+      Height = 13
+      Caption = 'Time average:'
+    end
+    object Label8: TLabel
+      Left = 90
+      Top = 70
+      Width = 63
+      Height = 13
+      Caption = 'Node Status:'
+    end
+    object lblNodeStatus: TLabel
+      Left = 163
+      Top = 70
+      Width = 15
+      Height = 13
+      Caption = '???'
+    end
+    object Label5: TLabel
+      Left = 285
+      Top = 11
+      Width = 48
+      Height = 13
+      Caption = 'Accounts:'
+    end
+    object lblCurrentAccounts: TLabel
+      Left = 337
+      Top = 11
+      Width = 18
+      Height = 13
+      Caption = '000'
+    end
+    object lblTimeAverageAux: TLabel
+      Left = 360
+      Top = 41
+      Width = 18
+      Height = 13
+      Caption = '000'
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clGray
+      Font.Height = -11
+      Font.Name = 'Tahoma'
+      Font.Style = []
+      ParentFont = False
+    end
+    object Label16: TLabel
+      Left = 360
+      Top = 56
+      Width = 74
+      Height = 13
+      Caption = 'Blocks found:'
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWindowText
+      Font.Height = -11
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentFont = False
+    end
+    object lblBlocksFound: TLabel
+      Left = 440
+      Top = 56
+      Width = 21
+      Height = 13
+      Hint = 'Blocks found while Miner is running...'
+      Caption = '000'
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWindowText
+      Font.Height = -11
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentFont = False
+      ParentShowHint = False
+      ShowHint = True
+    end
+    object lblReceivedMessages: TLabel
+      Left = 360
+      Top = 66
+      Width = 185
+      Height = 23
+      Cursor = crHandPoint
+      Caption = 'Received messages'
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clRed
+      Font.Height = -19
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentFont = False
+      OnClick = lblReceivedMessagesClick
+    end
+    object lblBuild: TLabel
+      Left = 586
+      Top = 3
+      Width = 49
+      Height = 23
+      Caption = 'Build'
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWindowText
+      Font.Height = -19
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentFont = False
+    end
+  end
+  object StatusBar: TStatusBar
+    Left = 0
+    Top = 523
+    Width = 849
+    Height = 19
+    Panels = <
+      item
+        Alignment = taCenter
+        Text = 'Server Active'
+        Width = 130
+      end
+      item
+        Text = 'Connection status'
+        Width = 430
+      end
+      item
+        Text = 'Blocks'
+        Width = 50
+      end>
+  end
+  object PageControl: TPageControl
+    Left = 0
+    Top = 91
+    Width = 849
+    Height = 432
+    ActivePage = tsMyAccounts
+    Align = alClient
+    TabOrder = 2
+    OnChange = PageControlChange
+    object tsMyAccounts: TTabSheet
+      Caption = 'Accounts Explorer'
+      object Splitter1: TSplitter
+        Left = 411
+        Top = 66
+        Height = 338
+        ExplicitLeft = 380
+      end
+      object pnlMyAccountsTop: TPanel
+        Left = 0
+        Top = 0
+        Width = 841
+        Height = 66
+        Align = alTop
+        TabOrder = 0
+        object Label18: TLabel
+          Left = 11
+          Top = 35
+          Width = 61
+          Height = 13
+          Caption = 'Find account'
+        end
+        object sbSearchAccount: TSpeedButton
+          Left = 176
+          Top = 33
+          Width = 23
+          Height = 22
+          Glyph.Data = {
+            36030000424D3603000000000000360000002800000010000000100000000100
+            18000000000000030000120B0000120B00000000000000000000FF00FF4A667C
+            BE9596FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+            FFFF00FFFF00FFFF00FF6B9CC31E89E84B7AA3C89693FF00FFFF00FFFF00FFFF
+            00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF4BB4FE51B5FF
+            2089E94B7AA2C69592FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+            FFFF00FFFF00FFFF00FFFF00FF51B7FE51B3FF1D87E64E7AA0CA9792FF00FFFF
+            00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+            51B7FE4EB2FF1F89E64E7BA2B99497FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+            FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF52B8FE4BB1FF2787D95F6A76FF
+            00FFB0857FC09F94C09F96BC988EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+            FF00FFFF00FF55BDFFB5D6EDBF9D92BB9B8CE7DAC2FFFFE3FFFFE5FDFADAD8C3
+            B3B58D85FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFCEA795FD
+            EEBEFFFFD8FFFFDAFFFFDBFFFFE6FFFFFBEADDDCAE837FFF00FFFF00FFFF00FF
+            FF00FFFF00FFFF00FFFF00FFC1A091FBDCA8FEF7D0FFFFDBFFFFE3FFFFF8FFFF
+            FDFFFFFDC6A99CFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC1A091FEE3ACF1
+            C491FCF2CAFFFFDDFFFFE4FFFFF7FFFFF7FFFFE9EEE5CBB9948CFF00FFFF00FF
+            FF00FFFF00FFFF00FFC2A191FFE6AEEEB581F7DCAEFEFDD8FFFFDFFFFFE3FFFF
+            E4FFFFE0F3ECD2BB968EFF00FFFF00FFFF00FFFF00FFFF00FFBC978CFBE7B7F4
+            C791F2C994F8E5B9FEFCD8FFFFDDFFFFDCFFFFE0E2D2BAB68E86FF00FFFF00FF
+            FF00FFFF00FFFF00FFFF00FFD9C3A9FFFEE5F7DCB8F2C994F5D4A5FAE8BDFDF4
+            C9FDFBD6B69089FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB58D85E8
+            DEDDFFFEF2F9D8A3F4C48CF9D49FFDEAB8D0B49FB89086FF00FFFF00FFFF00FF
+            FF00FFFF00FFFF00FFFF00FFFF00FFAD827FC9AA9EEFE0B7EFDFB2E7CEACB890
+            86B89086FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+            00FFFF00FFBA968ABB988CB79188FF00FFFF00FFFF00FFFF00FF}
+          OnClick = sbSearchAccountClick
+        end
+        object cbMyPrivateKeys: TComboBox
+          Left = 260
+          Top = 7
+          Width = 411
+          Height = 21
+          Style = csDropDownList
+          TabOrder = 0
+          OnChange = cbMyPrivateKeysChange
+        end
+        object cbExploreMyAccounts: TCheckBox
+          Left = 11
+          Top = 10
+          Width = 235
+          Height = 17
+          Caption = 'Explore accounts with one of my Wallet Keys'
+          TabOrder = 1
+          OnClick = cbExploreMyAccountsClick
+        end
+        object ebFindAccountNumber: TEdit
+          Left = 87
+          Top = 33
+          Width = 83
+          Height = 21
+          TabOrder = 3
+          OnChange = ebFindAccountNumberChange
+          OnExit = ebFindAccountNumberExit
+        end
+        object bbChangeKeyName: TBitBtn
+          Left = 685
+          Top = 5
+          Width = 126
+          Height = 25
+          Caption = 'Change Key name'
+          DoubleBuffered = True
+          ParentDoubleBuffered = False
+          TabOrder = 2
+          OnClick = bbChangeKeyNameClick
+        end
+        object cbFilterAccounts: TCheckBox
+          Left = 260
+          Top = 35
+          Width = 151
+          Height = 17
+          Caption = 'Filter accounts by balance'
+          TabOrder = 4
+          OnClick = cbFilterAccountsClick
+        end
+        object ebFilterAccountByBalanceMin: TEdit
+          Left = 412
+          Top = 33
+          Width = 83
+          Height = 21
+          Hint = 'Min balance'
+          TabOrder = 5
+          OnExit = ebFilterAccountByBalanceMinExit
+          OnKeyPress = ebFilterAccountByBalanceMinKeyPress
+        end
+        object ebFilterAccountByBalanceMax: TEdit
+          Left = 503
+          Top = 33
+          Width = 83
+          Height = 21
+          Hint = 'Max balance'
+          TabOrder = 6
+          OnExit = ebFilterAccountByBalanceMinExit
+          OnKeyPress = ebFilterAccountByBalanceMinKeyPress
+        end
+      end
+      object pnlAccounts: TPanel
+        Left = 0
+        Top = 66
+        Width = 411
+        Height = 338
+        Align = alLeft
+        BevelOuter = bvNone
+        TabOrder = 1
+        object dgAccounts: TDrawGrid
+          Left = 0
+          Top = 0
+          Width = 411
+          Height = 304
+          Align = alClient
+          TabOrder = 0
+          OnClick = dgAccountsClick
+          OnColumnMoved = dgAccountsColumnMoved
+          OnFixedCellClick = dgAccountsFixedCellClick
+          ExplicitWidth = 401
+          ColWidths = (
+            64
+            64
+            64
+            64
+            64)
+        end
+        object pnlAccountsInfo: TPanel
+          Left = 0
+          Top = 304
+          Width = 411
+          Height = 34
+          Align = alBottom
+          BevelOuter = bvNone
+          TabOrder = 1
+          ExplicitWidth = 401
+          DesignSize = (
+            411
+            34)
+          object Label17: TLabel
+            Left = 5
+            Top = 10
+            Width = 48
+            Height = 13
+            Caption = 'Accounts:'
+          end
+          object Label19: TLabel
+            Left = 120
+            Top = 10
+            Width = 88
+            Height = 13
+            Caption = 'Accounts Balance:'
+          end
+          object lblAccountsCount: TLabel
+            Left = 60
+            Top = 10
+            Width = 18
+            Height = 13
+            Caption = '000'
+          end
+          object lblAccountsBalance: TLabel
+            Left = 214
+            Top = 10
+            Width = 18
+            Height = 13
+            Caption = '000'
+          end
+          object bbAccountsRefresh: TBitBtn
+            Left = 333
+            Top = 6
+            Width = 75
+            Height = 25
+            Anchors = [akTop, akRight]
+            Caption = 'Refresh'
+            DoubleBuffered = True
+            Glyph.Data = {
+              36030000424D3603000000000000360000002800000010000000100000000100
+              18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+              C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6
+              A4C2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FEFCFBFEFCFBFEFCFBFEFCFBFE
+              FCFBFEFCFBFEFCFBFEFCFBFEFCFBFEFCFBC2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FEFCFBFEFCFBFEFCFBFEFCFBD8EBD6018A02018A02D8EBD6FEFCFBFEFC
+              FBC2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FEFBF7FEFBF7018A02D8EAD201
+              8A02D8EAD2D8EAD2018A02FEFBF7FEFBF7C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FEF9F4FEF9F4018A02018A02D8E8D0FEF9F4FEF9F4D8E8D0FEF9F4FEF9
+              F4C2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FEF7F0FEF7F0018A02018A0201
+              8A02FEF7F0FEF7F0FEF7F0FEF7F0FEF7F0C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FEF5ECFEF5ECFEF5ECFEF5ECFEF5EC018A02018A02018A02FEF5ECFEF5
+              ECC2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FEF3E9FEF3E9D8E3C7FEF3E9FE
+              F3E9D8E3C7018A02018A02FEF3E9FEF3E9C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FFF1E5FFF1E5018A02D9E2C3D9E2C3018A02D9E2C3018A02FFF1E5FFF1
+              E5C2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FFF0E2FFF0E2D9E1C1018A0201
+              8A02D9E1C1DDCFC2DDCFC2DDCFC2DDCFC2C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FFEEDEFFEEDEFFEEDEFFEEDEFFEEDEFFEEDEC5B5A9C3B4A8C2B3A7C1B2
+              A6C2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FFECDAFFECDAFFECDAFFECDAFF
+              ECDAFFECDAB0A296B0A296B0A296B0A296C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FFEAD7FFEAD7FFEAD7FFEAD7FFEAD7C9B9ACFBF8F4FBF8F4E6DAD9C2A6
+              A4FF00FFFF00FFFF00FFFF00FFFF00FFC2A6A4FFE8D3FFE8D3FFE8D3FFE8D3FF
+              E8D3C9B9ACFBF8F4DFCEC7C2A6A4FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              C2A6A4FFE6D0FFE6D0FFE6D0FFE6D0FFE6D0C9B9ACDFCEC7C2A6A4FF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFC2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2
+              A6A4C2A6A4C2A6A4FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+            ParentDoubleBuffered = False
+            TabOrder = 0
+            OnClick = bbAccountsRefreshClick
+            ExplicitLeft = 323
+          end
+        end
+      end
+      object pcAccountsOptions: TPageControl
+        Left = 414
+        Top = 66
+        Width = 427
+        Height = 338
+        ActivePage = tsAccountOperations
+        Align = alClient
+        TabOrder = 2
+        ExplicitLeft = 404
+        ExplicitWidth = 437
+        object tsAccountOperations: TTabSheet
+          Caption = 'Operations of selected Account'
+          ExplicitWidth = 429
+          object dgAccountOperations: TDrawGrid
+            Left = 0
+            Top = 0
+            Width = 419
+            Height = 310
+            Align = alClient
+            TabOrder = 0
+            OnDblClick = MiDecodePayloadClick
+            ExplicitWidth = 429
+            RowHeights = (
+              24
+              24
+              24
+              24
+              24)
+          end
+        end
+        object tsMultiSelectAccounts: TTabSheet
+          Caption = 'Selected accounts for massive operations'
+          ImageIndex = 1
+          ExplicitWidth = 429
+          object dgSelectedAccounts: TDrawGrid
+            Left = 41
+            Top = 31
+            Width = 310
+            Height = 253
+            Align = alLeft
+            TabOrder = 0
+            RowHeights = (
+              24
+              24
+              24
+              24
+              24)
+          end
+          object pnlSelectedAccountsTop: TPanel
+            Left = 0
+            Top = 0
+            Width = 419
+            Height = 31
+            Align = alTop
+            BevelOuter = bvNone
+            Font.Charset = DEFAULT_CHARSET
+            Font.Color = clWindowText
+            Font.Height = -13
+            Font.Name = 'Tahoma'
+            Font.Style = [fsBold]
+            ParentFont = False
+            TabOrder = 1
+            ExplicitWidth = 429
+            object Label15: TLabel
+              Left = 41
+              Top = 4
+              Width = 361
+              Height = 16
+              Caption = 'Select multiple accounts to execute massive operations'
+            end
+          end
+          object pnlSelectedAccountsBottom: TPanel
+            Left = 0
+            Top = 284
+            Width = 419
+            Height = 26
+            Align = alBottom
+            BevelOuter = bvNone
+            TabOrder = 2
+            ExplicitWidth = 429
+            object Label20: TLabel
+              Left = 41
+              Top = 6
+              Width = 48
+              Height = 13
+              Caption = 'Accounts:'
+            end
+            object lblSelectedAccountsCount: TLabel
+              Left = 96
+              Top = 6
+              Width = 18
+              Height = 13
+              Caption = '000'
+            end
+            object Label22: TLabel
+              Left = 156
+              Top = 6
+              Width = 88
+              Height = 13
+              Caption = 'Accounts Balance:'
+            end
+            object lblSelectedAccountsBalance: TLabel
+              Left = 250
+              Top = 6
+              Width = 18
+              Height = 13
+              Caption = '000'
+            end
+          end
+          object pnlSelectedAccountsLeft: TPanel
+            Left = 0
+            Top = 31
+            Width = 41
+            Height = 253
+            Align = alLeft
+            BevelOuter = bvNone
+            TabOrder = 3
+            object sbSelectedAccountsAdd: TSpeedButton
+              Left = 2
+              Top = 0
+              Width = 33
+              Height = 31
+              Caption = '>'
+              OnClick = sbSelectedAccountsAddClick
+            end
+            object sbSelectedAccountsAddAll: TSpeedButton
+              Left = 2
+              Top = 37
+              Width = 33
+              Height = 31
+              Caption = '>>'
+              OnClick = sbSelectedAccountsAddAllClick
+            end
+            object sbSelectedAccountsDel: TSpeedButton
+              Left = 2
+              Top = 74
+              Width = 33
+              Height = 31
+              Caption = '<'
+              OnClick = sbSelectedAccountsDelClick
+            end
+            object sbSelectedAccountsDelAll: TSpeedButton
+              Left = 2
+              Top = 111
+              Width = 33
+              Height = 31
+              Caption = '<<'
+              OnClick = sbSelectedAccountsDelAllClick
+            end
+          end
+          object bbSelectedAccountsOperation: TBitBtn
+            Left = 357
+            Top = 31
+            Width = 75
+            Height = 61
+            Caption = 'Operations'
+            DoubleBuffered = True
+            Glyph.Data = {
+              F6060000424DF606000000000000360000002800000018000000180000000100
+              180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C8518FF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+              9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C8518
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+              FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+              00FF0C85181399220C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+              34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF0C85180C85180C85180C85
+              180C85180C85180C85180C85181DAC31139A220C8518FF00FFFF00FFFF00FFFF
+              00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE0C8518
+              57E38851DD7E4AD77443D0693BC95E34C1522BBA4725B33C1EAE33149B230C85
+              18FF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+              DEFE77DEFE0C85185EE89059E48953DE804CD87645D16C3DCA6035C2542DBB49
+              26B53F1FAF35149B250C8518FF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+              F38FE8FF7CE2FE7CE3FE7CE3FE0C851861EB955FE9925AE58B54DF824DD97846
+              D26D3ECB6237C4562FBD4C27B64021B037159B250C8518FF00FFFF00FF019ACF
+              60CAEF1FA8D85EC1E1C2E6ED8ACEE08FCFE18ECFE10C851861EB9561EB955FEA
+              935CE58D56E0844FDB7A48D47040CD6538C65931BF4D1DA3320C8518FF00FFFF
+              00FFFF00FF019ACF65CFF53EB7E52CA9D4C5EFF8ACF3FEA5F2FFA5F2FF0C8518
+              61EB9561EB9561EB9561EB945CE68E57E18650DC7C49D57242CE6727AD410C85
+              18FF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F32A9CC673CBE7D6FEFDB1
+              FBFDB2FBFD0C85180C85180C85180C85180C85180C85180C85180C851852DD7F
+              32B6500C851898FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB748E
+              A224A8D5B9E7F3D5F5F9D5F6F9D6F6FADCFAFBCDFDFCB9FCFCAFFAFCB0FAFCB1
+              FAFC0C85183ABE5C0C85189FFCFFA4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+              8BDBFF5FCDFFB7898973C3DD18A2D218A2D216A2D215A1D21AA4D391D7EBEBFE
+              FDDBFDFCC5FBFBC2FBFB0C85180C851883E4F3B6FDFFBAFFFFB5FCFD019ACFFF
+              00FFFF00FF019ACF99E2FF67D3FFB88989FEF5ECFDF3EBF0EFEAE5EBE8D6E5E6
+              A4D2E025A6D34DB9DDE5F8FBF5FDFCEBFCFB0C8518C4FBFF9CE4F2DAFEFFD9FE
+              FFE3FFFFADE9F5019ACFFF00FF019ACF9FE9FF70DCFFB88989FEF3E9FFF2E6FE
+              F3E9FEF3E9FEF3E9FEF3E9D4E4E439ADD422A5D49DD8ECF1F9FBEEEFEFE9FDFF
+              CEEEF7F8FFFFF7FFFFFEFFFFE9F9FD019ACFFF00FF019ACFA7EFFF76E5FFB889
+              89FFF2E5FFF0E2FFF2E5FFF2E5FFF2E5FFF2E5FFF2E5EAEBE38EC9DA44B0D501
+              9ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACFFF00FF019ACF
+              ABF6FF7EEDFFB88989FFF0E2FFEFDFFFF0E2FFF0E2FFF0E2FFF0E2FFF0E2FEEE
+              E0FBECDEFAEBDEF6E6D9B8898993F7FF019ACFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FF019ACFC7FFFF82F5FFB88989FFEEDFFFECDBFFEEDFFFEEDFFFEEDF
+              FFEEDFF9E8D9DECCC1D9CABDCFBDB4C8B3ACB88989B5FFFF019ACFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFFB88989FFECDBFFEBD8FF
+              ECDBFFECDBFFECDBFFECDBF5E2D2C4ABA7C2A8A5BBA39FC2AFA9B88989019ACF
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFB889
+              89FFEBD8FFEAD5FFEBD8FFEBD8FFEBD8FFEBD8FFEBD8D9C8C5FEFEFDFEF6EFDE
+              C9C0B88989FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              FF00FF019ACFB88989FFE9D5FFE8D3FFE9D5FFE9D5FFE9D5FFE9D5FFE9D5C6AD
+              A9FEF8F2E8D4CACD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFB88989FFE7D1FFE7D0FFE7D1FFE7D1FFE7D1
+              FFE7D1E7CEBFD3BFB9E8D5CCCD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB88989FFE6CFFFE6CFFF
+              E6CFFFE6CFFFE6CFFFE6CFD5BBB2E0CCC5CD9999FF00FFFF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB889
+              89B88989B88989B88989B88989B88989B88989B88989B88989FF00FFFF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+            Layout = blGlyphTop
+            ParentDoubleBuffered = False
+            TabOrder = 4
+            OnClick = bbSelectedAccountsOperationClick
+          end
+        end
+      end
+    end
+    object tsPendingOperations: TTabSheet
+      Caption = 'Pending Operations'
+      ImageIndex = 5
+      object dgPendingOperations: TDrawGrid
+        Left = 0
+        Top = 86
+        Width = 841
+        Height = 318
+        Align = alClient
+        TabOrder = 0
+        OnDblClick = MiDecodePayloadClick
+      end
+      object pnlPendingOperations: TPanel
+        Left = 0
+        Top = 0
+        Width = 841
+        Height = 86
+        Align = alTop
+        BevelOuter = bvNone
+        BorderWidth = 10
+        TabOrder = 1
+        object Label10: TLabel
+          Left = 10
+          Top = 10
+          Width = 821
+          Height = 66
+          Align = alClient
+          AutoSize = False
+          Caption = 
+            'Here you can see Operations transmited/received from other nodes' +
+            ' that will be included in next block. There is no guarantee that' +
+            ' other nodes will include them when mining, so it'#39's important th' +
+            'at you mine too to help include Operations to the main BlockChai' +
+            'n'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -16
+          Font.Name = 'Tahoma'
+          Font.Style = []
+          ParentFont = False
+          WordWrap = True
+          ExplicitLeft = 36
+          ExplicitWidth = 765
+          ExplicitHeight = 41
+        end
+      end
+    end
+    object tsBlockChain: TTabSheet
+      Caption = 'BlockChain Explorer'
+      ImageIndex = 1
+      object Panel2: TPanel
+        Left = 0
+        Top = 0
+        Width = 841
+        Height = 41
+        Align = alTop
+        TabOrder = 0
+        object Label9: TLabel
+          Left = 11
+          Top = 10
+          Width = 102
+          Height = 13
+          Caption = 'Filter by blocks range'
+        end
+        object ebBlockChainBlockStart: TEdit
+          Left = 125
+          Top = 7
+          Width = 57
+          Height = 21
+          TabOrder = 0
+          OnExit = ebBlockChainBlockStartExit
+          OnKeyPress = ebBlockChainBlockStartKeyPress
+        end
+        object ebBlockChainBlockEnd: TEdit
+          Left = 185
+          Top = 7
+          Width = 57
+          Height = 21
+          TabOrder = 1
+          OnExit = ebBlockChainBlockStartExit
+          OnKeyPress = ebBlockChainBlockStartKeyPress
+        end
+      end
+      object dgBlockChainExplorer: TDrawGrid
+        Left = 0
+        Top = 41
+        Width = 841
+        Height = 363
+        Align = alClient
+        TabOrder = 1
+      end
+    end
+    object tsOperations: TTabSheet
+      Caption = 'Operations Explorer'
+      ImageIndex = 1
+      object Panel1: TPanel
+        Left = 0
+        Top = 0
+        Width = 841
+        Height = 41
+        Align = alTop
+        TabOrder = 0
+        object Label2: TLabel
+          Left = 11
+          Top = 10
+          Width = 102
+          Height = 13
+          Caption = 'Filter by blocks range'
+        end
+        object ebFilterOperationsStartBlock: TEdit
+          Left = 125
+          Top = 7
+          Width = 57
+          Height = 21
+          TabOrder = 0
+          OnExit = ebFilterOperationsAccountExit
+          OnKeyPress = ebFilterOperationsAccountKeyPress
+        end
+        object ebFilterOperationsEndBlock: TEdit
+          Left = 185
+          Top = 7
+          Width = 57
+          Height = 21
+          TabOrder = 1
+          OnExit = ebFilterOperationsAccountExit
+          OnKeyPress = ebFilterOperationsAccountKeyPress
+        end
+      end
+      object dgOperationsExplorer: TDrawGrid
+        Left = 0
+        Top = 41
+        Width = 841
+        Height = 363
+        Align = alClient
+        TabOrder = 1
+      end
+    end
+    object tsLogs: TTabSheet
+      Caption = 'Logs'
+      ImageIndex = 2
+      object pnlTopLogs: TPanel
+        Left = 0
+        Top = 0
+        Width = 841
+        Height = 41
+        Align = alTop
+        TabOrder = 0
+        object cbShowDebugLogs: TCheckBox
+          Left = 15
+          Top = 10
+          Width = 97
+          Height = 17
+          Caption = 'Show Debug logs'
+          TabOrder = 0
+        end
+      end
+      object memoLogs: TMemo
+        Left = 0
+        Top = 41
+        Width = 841
+        Height = 363
+        Align = alClient
+        ScrollBars = ssBoth
+        TabOrder = 1
+      end
+    end
+    object tsNodeStats: TTabSheet
+      Caption = 'Node Stats'
+      ImageIndex = 3
+      DesignSize = (
+        841
+        404)
+      object Label3: TLabel
+        Left = 15
+        Top = 15
+        Width = 177
+        Height = 13
+        Caption = 'Active Net Connections of this Node:'
+      end
+      object Label6: TLabel
+        Left = 15
+        Top = 250
+        Width = 169
+        Height = 13
+        Anchors = [akLeft, akBottom]
+        Caption = 'Available or possible Node Servers:'
+        ExplicitTop = 266
+      end
+      object Label7: TLabel
+        Left = 15
+        Top = 146
+        Width = 86
+        Height = 13
+        Anchors = [akLeft, akBottom]
+        Caption = 'BlackList of Nodes'
+        ExplicitTop = 162
+      end
+      object memoNetConnections: TMemo
+        Left = 15
+        Top = 34
+        Width = 810
+        Height = 106
+        Anchors = [akLeft, akTop, akRight, akBottom]
+        ReadOnly = True
+        ScrollBars = ssBoth
+        TabOrder = 0
+        WordWrap = False
+      end
+      object memoNetServers: TMemo
+        Left = 15
+        Top = 269
+        Width = 810
+        Height = 116
+        Anchors = [akLeft, akRight, akBottom]
+        ReadOnly = True
+        ScrollBars = ssBoth
+        TabOrder = 1
+        WordWrap = False
+      end
+      object memoNetBlackLists: TMemo
+        Left = 15
+        Top = 165
+        Width = 810
+        Height = 79
+        Anchors = [akLeft, akRight, akBottom]
+        ReadOnly = True
+        ScrollBars = ssBoth
+        TabOrder = 2
+        WordWrap = False
+      end
+    end
+    object tsMessages: TTabSheet
+      Caption = 'Messages'
+      ImageIndex = 6
+      DesignSize = (
+        841
+        404)
+      object Label11: TLabel
+        Left = 15
+        Top = 151
+        Width = 51
+        Height = 13
+        Caption = 'Messages:'
+      end
+      object Label12: TLabel
+        Left = 315
+        Top = 11
+        Width = 85
+        Height = 13
+        Caption = 'Message to send:'
+      end
+      object Label13: TLabel
+        Left = 15
+        Top = 11
+        Width = 107
+        Height = 13
+        Caption = 'Available connections:'
+      end
+      object Label14: TLabel
+        Left = 410
+        Top = 11
+        Width = 361
+        Height = 13
+        Caption = 
+          '(Messages will be encrypted, so only dest connection will be abl' +
+          'e to read it)'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clGrayText
+        Font.Height = -11
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentFont = False
+      end
+      object lbNetConnections: TListBox
+        Left = 15
+        Top = 30
+        Width = 275
+        Height = 96
+        ItemHeight = 13
+        MultiSelect = True
+        TabOrder = 0
+      end
+      object bbSendAMessage: TButton
+        Left = 315
+        Top = 101
+        Width = 456
+        Height = 25
+        Caption = 'Send a Message'
+        TabOrder = 1
+        OnClick = bbSendAMessageClick
+      end
+      object memoMessages: TMemo
+        Left = 15
+        Top = 170
+        Width = 810
+        Height = 215
+        Anchors = [akLeft, akTop, akRight, akBottom]
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -16
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        Lines.Strings = (
+          'dsfa '#241'ldsaf '#241'lk dasf'
+          'dsfklda'#241'fs '#241'l')
+        ParentFont = False
+        ReadOnly = True
+        ScrollBars = ssBoth
+        TabOrder = 2
+        WordWrap = False
+      end
+      object memoMessageToSend: TMemo
+        Left = 315
+        Top = 30
+        Width = 456
+        Height = 61
+        Lines.Strings = (
+          'memoMessageToSend')
+        TabOrder = 3
+        WantReturns = False
+      end
+    end
+  end
+  object TrayIcon: TTrayIcon
+    Icon.Data = {
+      0000010001001010000001002000680400001600000028000000100000002000
+      0000010020000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000053000000BE000000E8000000F70000
+      00F7000000E9000000B20000004A000000000000000000000000000000000000
+      00000000000000000015000000B6070D16CE3E6C9BC860A8F0F166B3FFFF66B3
+      FFFF66B3FFFF3E6C9BC8070F16CC000000BA0000002600000000000000000000
+      000000000028000000CC2A4A6BC05391CFFF4C86BFFF599DDFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF2A4D6BC0000000C90000001D000000000000
+      0000000000B62A4D6BC066B3FFFF33597FFF000000FF33597FFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF2A4D6BC0000000B1000000000000
+      0050070F16CC66B3FFFF66B3FFFF40709FFF000000FF22394FFF6FB7FFFF68B4
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF070F16CC000000470000
+      00C13E6C9BC866B3FFFF66B3FFFF5D96CFFF000000FF11181FFF5A7D9FFF5A81
+      A8FF4A759FFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF3E6C9BC8000000BA0000
+      00ED60A8F0F166B3FFFF6FB7FFFF8BC5FFFF000000FF000000FF43515FFF2631
+      3BFF161F27FF5180AFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF000000EF0000
+      00FD66B3FFFF66B3FFFF7DBFFFFF9DCEFFFF22292FFF000000FF000000FF0000
+      00FF000000FF000000FF0C161FFF5391CFFF66B3FFFF66B3FFFF000000FD0000
+      00FD66B3FFFF66B3FFFF84C2FFFFA6D3FFFF3E474FFF000000FF686C6FFF262B
+      2FFF1A2127FF1A242FFF000000FF192C3FFF66B3FFFF66B3FFFF000000FB0000
+      00F666B3FFFF66B3FFFF82C1FFFFA3D1FFFF61707FFF000000FF62686FFF3238
+      3FFF4A5D6FFF6895C2FF000000FF000000FF5391CFFF60A8F0F1000000ED0000
+      00CA3E6C9BC866B3FFFF76BBFFFF94CAFFFF82A0BFFF000000FF30373FFF4251
+      5FFF4B647DFF406283FF000000FF000000FF4C86BFFF3E6C9BC8000000BF0000
+      005B070D12CE66B3FFFF66B3FFFF7DBFFFFF80B0DFFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF0C161FFF66B3FFFF070F16CC000000500000
+      0000000000CF2A4A6BC066B3FFFF66B3FFFF73BAFFFF1F2F3FFF1F2F3FFF1622
+      2FFF0C141DFF080E14FF2C4E6FFF599DDFFF2A4D6BC0000000B6000000000000
+      000000000030000000CF2A4D6BC066B3FFFF66B3FFFF66B3FFFF66B3FFFF599D
+      DFFF39648FFF2C4E6FFF66B3FFFF2A4D6BC0000000CF00000022000000000000
+      0000000000000000002B000000C4070D16CD3E6C9BC866B3FFFF66B3FFFF66B3
+      FFFF60A8F0F13E6C9BC8070D16CD000000C00000002600000000000000000000
+      00000000000000000000000000000000005D000000CE000000F4000000FE0000
+      00FE000000F6000000C60000005600000000000000000000000000000000FFFF
+      0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
+      0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000}
+    Icons = ImageListIcons
+    Visible = True
+    OnDblClick = TrayIconDblClick
+    Left = 45
+    Top = 20
+  end
+  object TimerUpdateStatus: TTimer
+    OnTimer = TimerUpdateStatusTimer
+    Left = 25
+    Top = 45
+  end
+  object MainMenu: TMainMenu
+    Left = 165
+    Top = 155
+    object miProject: TMenuItem
+      Caption = 'Project'
+      object miPrivatekeys: TMenuItem
+        Caption = 'Private keys'
+        ShortCut = 16464
+        OnClick = miPrivatekeysClick
+      end
+      object miN1: TMenuItem
+        Caption = '-'
+      end
+      object miOptions: TMenuItem
+        Caption = 'Options'
+        ShortCut = 16463
+        OnClick = miOptionsClick
+      end
+      object IPnodes1: TMenuItem
+        Caption = 'IP nodes'
+        OnClick = IPnodes1Click
+      end
+      object N1: TMenuItem
+        Caption = '-'
+      end
+      object MiClose: TMenuItem
+        Caption = 'Close'
+        OnClick = MiCloseClick
+      end
+    end
+    object MiOperations: TMenuItem
+      Caption = 'Operations'
+      object miNewOperation: TMenuItem
+        Caption = 'New single Operation'
+        ShortCut = 120
+        OnClick = miNewOperationClick
+      end
+      object MiFindOperationbyOpHash: TMenuItem
+        Caption = 'Find Operation by OpHash'
+        ShortCut = 116
+        OnClick = MiFindOperationbyOpHashClick
+      end
+      object MiDecodePayload: TMenuItem
+        Caption = 'Decode Payload'
+        ShortCut = 113
+        OnClick = MiDecodePayloadClick
+      end
+      object MiFindaccount: TMenuItem
+        Caption = 'Find account'
+        ShortCut = 16454
+        OnClick = MiFindaccountClick
+      end
+      object MiAccountInformation: TMenuItem
+        Caption = 'Account Information'
+        ShortCut = 112
+        OnClick = MiAccountInformationClick
+      end
+      object N2: TMenuItem
+        Caption = '-'
+      end
+      object MiAddaccounttoSelected: TMenuItem
+        Caption = 'Add account to selected'
+        ShortCut = 117
+        OnClick = MiAddaccounttoSelectedClick
+      end
+      object MiRemoveaccountfromselected: TMenuItem
+        Caption = 'Remove account from selected'
+        ShortCut = 118
+        OnClick = MiRemoveaccountfromselectedClick
+      end
+      object MiMultiaccountoperation: TMenuItem
+        Caption = 'Multi account operation'
+        OnClick = MiMultiaccountoperationClick
+      end
+      object N3: TMenuItem
+        Caption = '-'
+      end
+      object MiFindpreviousaccountwithhighbalance: TMenuItem
+        Caption = 'Find previous account with high balance'
+        ShortCut = 16498
+        OnClick = MiFindpreviousaccountwithhighbalanceClick
+      end
+      object MiFindnextaccountwithhighbalance: TMenuItem
+        Caption = 'Find next account with high balance'
+        ShortCut = 114
+        OnClick = MiFindnextaccountwithhighbalanceClick
+      end
+    end
+    object miAbout: TMenuItem
+      Caption = 'About'
+      object miAboutPascalCoin: TMenuItem
+        Caption = 'About Pascal Coin...'
+        OnClick = miAboutPascalCoinClick
+      end
+    end
+  end
+  object ImageListIcons: TImageList
+    Height = 48
+    Left = 105
+    Top = 180
+    Bitmap = {
+      494C0101020008002C0210003000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+      0000000000003600000028000000400000003000000001002000000000000030
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000002A292929D60B0B0BF4111111EE0000006B000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000002A292929D60B0B0BF4111111EE0000006B000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00002A2B2ED766B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF5E768FC00000
+      0032000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000006D6D
+      6D9266B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF292A
+      2DD8000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000006D6D
+      6D9266B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF292A
+      2DD8000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000000000007866B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF2C3032D50000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000002B2F31D666B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF68ACF0F10000000B00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000002B2F31D666B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF68ACF0F10000000B00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000007F7F7F8066B3FFFF66B3
+      FFFF000000FF000000FF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF2B2F30D600000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000141415EB66B3FFFF66B3
+      FFFF000000FF000000FF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF68ACF0F100000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000141415EB66B3FFFF66B3
+      FFFF000000FF000000FF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF68ACF0F100000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000066B3FFFF66B3FFFF66B3
+      FFFF000000FF000000FF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF68686897000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000003566B3FFFF66B3FFFF66B3
+      FFFF000000FF000000FF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF202222E0000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000003566B3FFFF66B3FFFF66B3
+      FFFF000000FF000000FF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF202222E0000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000202222E066B3FFFF66B3FFFF66B3
+      FFFF000000FF000000FF79BCFFFF73BAFFFF68B4FFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000586D7FBF66B3FFFF66B3FFFF67B4
+      FFFF000000FF000000FF83C1FFFF3E5F7FFF5C96CFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000586D7FBF66B3FFFF66B3FFFF67B4
+      FFFF000000FF000000FF83C1FFFF3E5F7FFF5C96CFFF66B3FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF66B3FFFF66B3FFFF77BC
+      FFFF19242FFF000000FF7198BFFF12181FFF83C2FFFF70B8FFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF0000002E0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF66B3FFFF68B4FFFF7FC0
+      FFFF2D3E4FFF000000FF65829FFF26333FFF8CC6FFFF70B0EFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF0000007F0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF66B3FFFF68B4FFFF7FC0
+      FFFF2D3E4FFF000000FF65829FFF26333FFF8CC6FFFF70B0EFFF66B3FFFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF0000007F0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF66B3FFFF74BAFFFF8EC7
+      FFFF7A9DBFFF000000FF000000FF000000FF000000FF000000FF0D161FFF66B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF232323DC0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF66B3FFFF79BDFFFF94CA
+      FFFF96BADFFF000000FF000000FF000000FF000000FF000000FF000000FF3964
+      8FFF66B3FFFF66B3FFFF66B3FFFF111111EE0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF66B3FFFF79BDFFFF94CA
+      FFFF96BADFFF000000FF000000FF000000FF000000FF000000FF000000FF3964
+      8FFF66B3FFFF66B3FFFF66B3FFFF111111EE0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF66B3FFFF82C1FFFF9ECF
+      FFFFB9DCFFFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF60A8EFFF66B3FFFF66B3FFFF050505FA0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF67B3FFFF85C2FFFFA3D1
+      FFFFBFDFFFFF000000FF000000FF33393FFF2A323BFF000000FF000000FF0000
+      00FF20374FFF66B3FFFF66B3FFFF020202FD0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF67B3FFFF85C2FFFFA3D1
+      FFFFBFDFFFFF000000FF000000FF33393FFF2A323BFF000000FF000000FF0000
+      00FF20374FFF66B3FFFF66B3FFFF020202FD0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF69B4FFFF88C4FFFFA7D3
+      FFFFC6E3FFFF000000FF000000FFD9ECFFFF697C8FFF000000FF659ACFFF0000
+      00FF000000FF66B3FFFF66B3FFFF0D0D0DF20000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF6AB5FFFF89C4FFFFA8D4
+      FFFFC7E3FFFF000000FF000000FFDAEDFFFF51606FFF000000FF7DBFFFFF0000
+      00FF000000FF66B3FFFF66B3FFFF232323DC0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF6AB5FFFF89C4FFFFA8D4
+      FFFFC7E3FFFF000000FF000000FFDAEDFFFF51606FFF000000FF7DBFFFFF0000
+      00FF000000FF66B3FFFF66B3FFFF232323DC0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF68B4FFFF87C3FFFFA6D3
+      FFFFC3E1FFFF000000FF000000FFD5EAFFFF0B0D0FFF13191FFF7CBEFFFF0000
+      00FF000000FF66B3FFFF66B3FFFF000000780000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF67B3FFFF85C2FFFFA3D1
+      FFFFBFDFFFFF000000FF000000FFCFE7FFFF000000FF25323FFF7ABDFFFF0000
+      00FF000000FF66B3FFFF66B3FFFF000000280000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000066B3FFFF67B3FFFF85C2FFFFA3D1
+      FFFFBFDFFFFF000000FF000000FFCFE7FFFF000000FF25323FFF7ABDFFFF0000
+      00FF000000FF66B3FFFF66B3FFFF000000280000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000005E768FC066B3FFFF7EBFFFFF9ACD
+      FFFFB3D9FFFF000000FF000000FFC0E0FFFF000000FF597D9FFF73BAFFFF0000
+      00FF000000FF66B3FFFF66B3FFFF000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000212223DF66B3FFFF79BDFFFF94CA
+      FFFFACD6FFFF000000FF000000FFB7DBFFFF000000FF6894BFFF375B7FFF0000
+      00FF000000FF66B3FFFF66B3FFFF000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000212223DF66B3FFFF79BDFFFF94CA
+      FFFFACD6FFFF000000FF000000FFB7DBFFFF000000FF6894BFFF375B7FFF0000
+      00FF000000FF66B3FFFF66B3FFFF000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000003F66B3FFFF6EB7FFFF87C3
+      FFFF9BCDFFFF34424FFF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF66B3FFFF2B2C2FD6000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000066B3FFFF68B4FFFF7FC0
+      FFFF92C9FFFF4F677FFF000000FF000000FF000000FF000000FF000000FF0000
+      00FF13212FFF66B3FFFF6E6E6E91000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000066B3FFFF68B4FFFF7FC0
+      FFFF92C9FFFF4F677FFF000000FF000000FF000000FF000000FF000000FF0000
+      00FF13212FFF66B3FFFF6E6E6E91000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000002B2F30D666B3FFFF70B8
+      FFFF80C0FFFF7AACDFFF000000FF000000FF000000FF000000FF000000FF2C4E
+      6FFF66B3FFFF68ACF0F100000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000007474748B66B3FFFF67B4
+      FFFF77BBFFFF80C0FFFF83C1FFFF7DBFFFFF558BBFFF66B3FFFF2C4E6FFF66B3
+      FFFF66B3FFFF323438D100000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000007474748B66B3FFFF67B4
+      FFFF77BBFFFF80C0FFFF83C1FFFF7DBFFFFF558BBFFF66B3FFFF2C4E6FFF66B3
+      FFFF66B3FFFF323438D100000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000002B2F30D666B3
+      FFFF66B3FFFF6CB6FFFF6EB7FFFF6AB5FFFF66B3FFFF66B3FFFF060B0FFF66B3
+      FFFF68ACF0F10000000A00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000007878788766B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF33597FFF66B3
+      FFFF1D1E1FE20000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000007878788766B3
+      FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF33597FFF66B3
+      FFFF1D1E1FE20000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005252
+      52AD66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF2526
+      27DB000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000232425DD66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF586D7FBF0000
+      0035000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000232425DD66B3FFFF66B3FFFF66B3FFFF66B3FFFF66B3FFFF586D7FBF0000
+      0035000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000003D161616E9010101FE0C0C0CF37171718E000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000424D3E000000000000003E000000
+      2800000040000000300000000100010000000000800100000000000000000000
+      000000000000000000000000FFFFFF00FC7F000000000000FC7F000000000000
+      F01F000000000000E00F000000000000E00F000000000000E007000000000000
+      C007000000000000C00700000000000080030000000000008003000000000000
+      8003000000000000800100000000000080010000000000008001000000000000
+      0001000000000000000100000000000000010000000000000001000000000000
+      0001000000000000000100000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000001000000000000
+      0001000000000000000100000000000000010000000000000001000000000000
+      0001000000000000800100000000000080010000000000008001000000000000
+      800300000000000080030000000000008003000000000000C007000000000000
+      C007000000000000C007000000000000E00F000000000000F01F000000000000
+      F01F000000000000FC3F00000000000000000000000000000000000000000000
+      000000000000}
+  end
+  object ApplicationEvents: TApplicationEvents
+    OnMinimize = ApplicationEventsMinimize
+    Left = 145
+    Top = 225
+  end
+end

+ 1511 - 0
src/gui-classic/UFRMWallet.lfm

@@ -0,0 +1,1511 @@
+object FRMWallet: TFRMWallet
+  Left = 389
+  Height = 580
+  Top = 201
+  Width = 865
+  Caption = 'Pascal Coin Wallet, JSON-RPC Miner & Explorer'
+  ClientHeight = 580
+  ClientWidth = 865
+  Color = clBtnFace
+  Constraints.MinHeight = 600
+  Constraints.MinWidth = 865
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Menu = MainMenu
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  Position = poOwnerFormCenter
+  LCLVersion = '1.8.0.6'
+  Visible = False
+  object pnlTop: TPanel
+    Left = 0
+    Height = 91
+    Top = 0
+    Width = 865
+    Align = alTop
+    BevelOuter = bvNone
+    ClientHeight = 91
+    ClientWidth = 865
+    TabOrder = 0
+    object Image1: TImage
+      Left = 15
+      Height = 60
+      Top = 15
+      Width = 60
+      AutoSize = True
+      Picture.Data = {
+        1754506F727461626C654E6574776F726B47726170686963E20F000089504E47
+        0D0A1A0A0000000D494844520000003C0000003C08060000003AFCD972000000
+        0473424954080808087C086488000000097048597300000B1200000B1201D2DD
+        7EFC0000001C74455874536F6674776172650041646F62652046697265776F72
+        6B7320435336E8BCB28C00000F5C494441546881D59B7D8C5DC579879F7766CE
+        39F7DEFDBE8B1D7B8D61B13160B05D2F5027C68E8190409B929084006D5A42A3
+        5651D4964655152591924292A65594A66A451B45AA541250207C8990A4348921
+        14624330181BB049B0F1DAF1826D6C76D7FB79EF39673EFAC75DDB6B7BEFB26B
+        AF4DFB938E567B66CE9C79EECCBCF3CE9C772484C0A9D4AEED5BCE3346AF515A
+        AD8AE3C2F242A9A9B3586A6A05A88C0E1DAC568676656975B3777EBDB5EEA9CE
+        454BB69DCAFAC84C036FD9B4A1496B59A995BE526BBD421BBDC0187D86D6BA10
+        25455D28354BB1A11980CAC820D5CA60C8AB15E79CAB5AEBDE72D6753BE73638
+        EF9EF02E3C7351D78AA199ACDF8C016F7A76DD2AADD5A7B4D61F525ACF56DAA0
+        4C828E628C5118E589B5A25048282645002A69856A9A92598FF50A6B3D2ECFF0
+        36C53B8B776EBF73EEC7CEF93BBBDEBD7AFD4CD4F3A48137FCF2890F6AAD3EA7
+        B4BE42698D444594D614C228C5BC9742BE9F24EBC564032857417C8E040F4010
+        4550115E17B1710B69DC4E359A4D256AA72A25BC7384BC82770EEFDCFF38E7BF
+        B9E2BD573EFA8E00AF7BFC67CBB5D2FFA88DFA3DA5234254249194966C0F2DD5
+        1D94AA7B307608820384200A50040464AC90004200FCD88F104034D634315AE8
+        60A0B09081B8833424485EC5BB1C67DD4F9D775F5C7DD5359B4F1BF0533F7FF4
+        36A5F49795311A53A228156667DB28575FA590F703E0C510449F489D90E050C1
+        02508DDAE82B9CCFFEF83C2AA10876146FADF3DE7D6DCDD51FFCCAF4CB9E06F0
+        638FFEF82C2572B7D66A0DBA80D14287DB4E47F56512378097082F66BA759854
+        2A5854C849750B7B0A4BD9A317615D0057C539FF940FE1E6F77FF043BBA75ADE
+        94817FFEA31FAE524A1E545ACFF1A6481B7D2CCA37D2ECF6E289F027D89A5395
+        0A0E45CEA09ECBF6E812FA29A36C05EFDC3EEFC3C7AFFEF047A664D4A604FCDF
+        0F3F74AD52EA21A54D1C4CC2D9BCC6B976133A58ACC4270D2363637AA2AA8800
+        010E259990E1C4B0C374B18B73919A45CFBCF7D7FFFE47AFFFC9DBBEEBED807F
+        F2D003D76AA51E411BA574C4856C667ED8862322A0A689768C42C01423C65B31
+        5BC90FFF02A61483F3A01564169B7B6A36CFA3C9E991F37885E5789783B3DE79
+        7FDDB5D7DF3029F4A4C03F7AE0BE954AE449D151A4B4A64B3DCF1C7E8BA57072
+        A063D2C588B5BFDAC5D7EEDD08085FFAC32EAE5EB9005FC95089E1B63B9F65ED
+        A6D7995B2EF1EDBF5AC3EC72099FBBC3CF1BAAECE36C36F94B6B5398CB731FC2
+        E51FBEE1A667EABDB36E133D7CDF3DF308E191808A028AE5F21C73D87D18564E
+        F6129048F34F0FBDC8BAADFB58B7752F0FAEDD8284149DC4BC796098AFDDBB91
+        5FFDE64D1E7E7A275BB774A33447FA3F60293087DD2C97E70828022A2284471E
+        BEEF9E79D302FEC177EF02CF030166E51896E897982B3D58925A374C0CBA2146
+        974EE26A4C20736CDF3370F8BDEFBFE80C183D08B1A3FBCD231E6553C1B0627E
+        030CF7611A0CA621412B19834E982B3D2CD12F6131049885E7811F7CF7EE0981
+        279C43A248DD06ACCC8839DFECA45377634302014C7391A737EEE62BDFDFC8C9
+        78694A09D5CCB17BFFF0E17BDFFA593777AEEB01A5E8E9CF0EDF773E70FDBF6F
+        A46884650BCEE08A15E7B2FAA23924CD05C2708AF5319DBA9B41D3C8ABD9D918
+        AA2BA3486E038E9BA78F1BC3F7DFF5BD0B95522F7B9DA833A2212E2F3C8B10F0
+        41611A225EDF37C4257FF900FB0F564E187626B4685E0BB75EB7945B3FB20C42
+        C0A53563F764F5DDBC9537A15CEABDF74B6FFCE42DAF8C7F6EA22E7D474094C2
+        F33BF1AFD1E2F0284CACA9562DD7FDDDA3EF382CC0F63706F8EB6FAFE39A2FFC
+        98E1D4A2E2188D6579FC0A0A4F401470C7B1CF1D057CDFF7EEFC4020BC2F2762
+        61D443BBEEC50683520205C3CDFFB0961776BC75DAA0A6A29FBFD0C3CD7FFF53
+        C4809384B2EE6361D4434E0484F7DDF7BD3B3F303EFF51C0DE87DB435094A4CA
+        05C92E7C3008A01A623E77C7533CB8BEFB34A24C5D3FDCD0C363BFD8822E28BC
+        445C90ECA224557C50781F6E1F9FF7F018FED76F7C6345B9DCF6ACC44D2C6BD8
+        C5B2E2366C8831C5889FAEDFC12DDF7C9C389E593F793A1281FD0329A9F513A6
+        FFF97BCFE43FFE6615366AC1A89C974616F1D26827211BA2AFB7EFDD9FFDC217
+        36C0382B9D65D9677C8092CA3827DE4B184BB2A965C5A2596CFFD6D5283CB5A1
+        716AB7858E9500716278DFD7D7B16E5BDF84790E8C58A856F1C339A15C664161
+        1FAF563B180D9065F9678023C037DFF847A5C5172CBACE4BC4DCA88F263D820D
+        63BF850FB4B636228D31BEEF00F843D0471400AD0489267135738FF501A99F63
+        526015EBC373EF44D24A4029425A25EFEBA3B1ECE988FBD9566D21CBB3EBFEF8
+        E33796BEFFE0FDA306A0A9A9719573BE8C28CE4A0E1C5798770E7404AD67E0FA
+        0ED4FCDB711E8F085453C7F6DF8ED4ADD0BC7291D68688E0A7DF3B04887D9870
+        71719CC6A043FF01E637EC67BB2AE39C2B373535AE02D61A8010FC553E40834A
+        99150DE2C3044B3DEF218A51E559E35ABA061D1723D63EB7876BFFF9D9BAF558
+        F7A5D5AC5A7C0669D54E1B388C511B3DC5FEA11436CD690FDD9454273E2882F7
+        57016B1580736E85174D9B19A6A8527CBD8EE73D32068D5247D6735A786EE7C1
+        BAEF6F2D452C9EDB88CF27363853954C633C783114F3015A7D1F5E199CF72B00
+        D455EF5DB3D07BBF30A02947C3206F53A989A07DE0855D03751FB9685E13E596
+        02D69D04B0C8D4BAF43829F194E903D178EF175EBEF2B285AA542A5D1942282B
+        8156330253312BE3A0B5D1A4C3292FF70CD6CDDED5D902B13A61DB9E249ABC6A
+        7975EFF0DB673E4A424B38880878EFCB0D0D0D571A11591D0205AD024D268330
+        C57E33066D66BD8B1D5B77B2BBB7BEBBF9FE0B6741292299AEC11AEBC3C32319
+        7F7BD7CBBCD15FAD5F9D099ADFA36894510C9E000544561B6079001D89A7A0EC
+        D481A166B89A8ABC32A0267CE121FDDB633BB9F7D937F0D304168191D4B169D7
+        007B0ED6870588B43A6E907B84826418B184209AC0721342382704C4284FA4FC
+        F4BB9D82E75F9BDCBF7E6CEBF153DD4C6BCDF9ED13DC152271185CED1FC2390A
+        6806D012D012A60F6C3D1B5F3BF54093697673C22756CDC7558E9EF242008D1F
+        CFD57C52BB705A09D5C12A5B764DECEE9D0EC55A71CF5F5C42B925C1D6F1B3C7
+        4B0183002E082EC8B45C3F8934DDFB0679A3B7BE87752AB562611B4F7E793557
+        75CD211DC98F9B6044C0A1C6730D1A11D929C232EB95E45E519C4E9BC79A9776
+        4EDEBA4D458391B12F48213038AEDB35170D4AA4E69AE69E4A56DB91D44A682A
+        9AA3D628815A6BCE6F2FF0BB0BDAB8EEE2395CB36C36CA28D2A1ACCE6C1AC883
+        C6A2C78A909D06D82C70511E94A97A43B354A76EA995F0FCF6FAE3775E5B810D
+        B7AF218914BA6078605D0F9FFECF1701E868ADA515624594183E71C773FCD7E6
+        3701F893CBCEE45FFE6C39D9F0917DAD40CD12971B2328187081BC62C9735BD7
+        755004AA21C606834870089B4D08AC13E17AE7A571C8C6CC2E4CCD6C09403EB9
+        C15A3ABF998EB98D848A459A62B6BC7E6427F2BCB98DCCEB6884D4E1AC67EBB8
+        B4F72C6CA3B539211CB33A0A21905B8F1FCA988A149EE150C2A210A812C23A35
+        3A3AF28488F4F900076D03535DEB6AAD183E58E195DFF6D7CD7349672B0099F5
+        901FEDA15FBD64160470D6336AFDE1A55FA485CBCE2B132A3999F5475DB90B4C
+        6F2A0F0C482B218052AA6F6464E409F3F82F9FDAF1E95BFE7487E0CEEACB5B20
+        4C7110479AD7BADF62FF407D0FEBE2CE160ED5301BC9F9FAC717F3D14BE6A294
+        B062412BD9484608508C354F7CF132B6BF39C2ECE6840BE73591A5AE6EB953C7
+        55F45186504529B5E3C9679EDE6100B4D61B547057F6DB462A3E2121ABBF623A
+        A458F362776FDD64AD84256736C3D80A29844012292E5F320B803C7587BD3397
+        7BE6978BCC7F5703B8409A9D3CACC2334A03FDD2860A3D68A536D4EE0322EA71
+        2530E2130EE4CD2899C20B65728375767B91B3DB8B47CD8DCE07D2AA25ADDAA3
+        5D5181D47AD28A9D11580083E580CCA242A91677A0D4E330063C3434BC5E6BD5
+        47F0EC4E67BD6D6102905A5E98C4A55C3ABF99A421C29DC00EC74CA947CE2204
+        8FD6AA6F6870783D8C01DF7DFFBDA351143DA242CEDEBCCC906B404FB22ED646
+        31D03FCAAF7BEA1BAC8B3B5B61923DA853298D63505AD8A73A502E258EE247BE
+        FFD0FDA3306E5F3A8EE3EF2881D4C7ECCCE6224CB21513695E7D6380FEE1B46E
+        968B3B5BC0BD33AD6BC8D9A9CE25A5801288E3E83B87D20E037FF6F39FDF608C
+        79DA90D39D7650F1A5DAB6EC448A349BBBEB77E7482B2EEA68827C66C6E374A4
+        710C4B33BBF4799890618C79FAD09E341CF3E54129B95DC4331A0AFC26ED4449
+        9D56162635580B669798DF5EAC059F9C669990B3CD2C65541A50389492DBC7A7
+        1F057CD32D9F5A2BC82F227276E4F3E975ED9863A04580AA65D324DF9896CD6F
+        C6944EBFC18A42C601DDC1CE6831514801F9C54DB77C6AEDF83C137919B70AC1
+        7B142F668B71411FD5B5B556F4F68EF0EAEBF577292F3DA7754A5B63332985C7
+        89E1E5C265781442F0C0ADC7E73B46377EF2965744E4AB11965EDFC656BBF8E8
+        AE9D185EE8EE65A892D77D79D7592D604F6FEB9A90B2B5B8923E3D07137244E4
+        ABC77E1B863A110079EEBF9224EA9A986CE56BF61C9AD5309D6A079684102078
+        C70D97CEA96DD31E5BA012969ED58C9B2107622A4AFC28DDC52E7626CB886D05
+        07CFE47998304AAF6E14CFC3F7DD334F8BDA24CACC121D718979BE16E711124C
+        A4211F82E1A131E8B160AA31D98A3DE1EF48D355EC47D953B8804D8DD7105C46
+        70F6800BBEEBA3377DE28D89F29F78D89252F8817EC2C8D0842D7DEA15887D85
+        BDC5C5BCD87C0DDE3A82CB4E3C6C09E0C337DCF40C221F53780F8117E53DF4C8
+        F91852C43B544B1BD2D004FEF4CEB7121C91AFB0BBF1525E6EFB03080185F388
+        7C6C32D8DAB327137A88C3AAE4B4B6B4F6295E22BACB57B0BBD485D82ADEE633
+        177A78481307973E4FB3DB8757097670F09442AB60D13E65A0D44977FB07E88F
+        E6A2B2E153135C7A4813860FDBED74645B48FC20767018375A995168F139DA67
+        A4493BFBCA97B1B7B90BEB03E495531B3E3C5E130688E7DB69AF6E23EADD4118
+        1EC29BE4E402C45D6DDF2A2DCEA6AF7C316FB57451518D900D9FBE00F1F19AF8
+        0840468BDD43D3FE1728F66FC76403E073401194AE45DFCAA1684BA8C5050704
+        8F78077850113669A5D2D4C960DB12061B17924A11C946F136C3597FFA8F008C
+        D744873C741491D8210A957D14465E271EDD87AEF6A2F311C46547ACBAD2041D
+        E3A2065CA19DAC34876AC399548B73484D13DE5A7C5EA9FD7DA70F791CAB098F
+        F14405749CD48EF1E088B55088638A492D22B79256A9E619990D5874ED184F96
+        E2F3EAFFDD633CC7EA6D0F6A35344BB13476506B7490EAE8FFD3835AF534E5A3
+        78D6AFB7EED41FC5FB5F0935D0C88CEACBC00000000049454E44AE426082
+      }
+    end
+    object lblCurrentBlockCaption: TLabel
+      Left = 90
+      Height = 13
+      Top = 11
+      Width = 60
+      Caption = 'Total Blocks:'
+      ParentColor = False
+    end
+    object lblCurrentBlock: TLabel
+      Left = 166
+      Height = 13
+      Top = 11
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object lblCurrentBlockTimeCaption: TLabel
+      Left = 90
+      Height = 13
+      Top = 26
+      Width = 90
+      Caption = 'Current Block Age:'
+      ParentColor = False
+    end
+    object lblCurrentBlockTime: TLabel
+      Left = 198
+      Height = 13
+      Top = 26
+      Width = 81
+      Caption = '000 seconds ago'
+      ParentColor = False
+    end
+    object lblOperationsPendingCaption: TLabel
+      Left = 90
+      Height = 13
+      Top = 41
+      Width = 98
+      Caption = 'Pending Operations:'
+      ParentColor = False
+    end
+    object lblOperationsPending: TLabel
+      Left = 207
+      Height = 13
+      Top = 41
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object lblMiningStatusCaption: TLabel
+      Left = 90
+      Height = 13
+      Top = 56
+      Width = 65
+      Caption = 'Miner Clients:'
+      ParentColor = False
+    end
+    object lblMinersClients: TLabel
+      Left = 177
+      Height = 13
+      Top = 56
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object lblCurrentDifficultyCaption: TLabel
+      Left = 429
+      Height = 13
+      Top = 11
+      Width = 76
+      Caption = 'Current Target:'
+      ParentColor = False
+    end
+    object lblCurrentDifficulty: TLabel
+      Left = 518
+      Height = 13
+      Top = 11
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object lblTimeAverage: TLabel
+      Left = 370
+      Height = 13
+      Top = 26
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object Label4: TLabel
+      Left = 285
+      Height = 13
+      Top = 26
+      Width = 69
+      Caption = 'Time average:'
+      ParentColor = False
+    end
+    object Label8: TLabel
+      Left = 90
+      Height = 13
+      Top = 70
+      Width = 63
+      Caption = 'Node Status:'
+      ParentColor = False
+    end
+    object lblNodeStatus: TLabel
+      Left = 168
+      Height = 13
+      Top = 70
+      Width = 15
+      Caption = '???'
+      ParentColor = False
+    end
+    object Label5: TLabel
+      Left = 285
+      Height = 13
+      Top = 11
+      Width = 48
+      Caption = 'Accounts:'
+      ParentColor = False
+    end
+    object lblCurrentAccounts: TLabel
+      Left = 344
+      Height = 13
+      Top = 11
+      Width = 18
+      Caption = '000'
+      ParentColor = False
+    end
+    object lblTimeAverageAux: TLabel
+      Left = 370
+      Height = 13
+      Top = 41
+      Width = 18
+      Caption = '000'
+      Font.Color = clGray
+      Font.Height = -11
+      Font.Name = 'Tahoma'
+      ParentColor = False
+      ParentFont = False
+    end
+    object Label16: TLabel
+      Left = 360
+      Height = 13
+      Top = 56
+      Width = 76
+      Caption = 'Blocks Found:'
+      Font.Color = clWindowText
+      Font.Height = -11
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+    end
+    object lblBlocksFound: TLabel
+      Left = 450
+      Height = 13
+      Hint = 'Blocks found while Miner is running...'
+      Top = 56
+      Width = 21
+      Caption = '000'
+      Font.Color = clWindowText
+      Font.Height = -11
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+      ParentShowHint = False
+      ShowHint = True
+    end
+    object lblReceivedMessages: TLabel
+      Cursor = crHandPoint
+      Left = 360
+      Height = 23
+      Top = 66
+      Width = 184
+      Caption = 'Received Messages'
+      Font.Color = clRed
+      Font.Height = -19
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+      OnClick = lblReceivedMessagesClick
+    end
+    object lblBuild: TLabel
+      Left = 586
+      Height = 23
+      Top = 3
+      Width = 49
+      Caption = 'Build'
+      Font.Color = clWindowText
+      Font.Height = -19
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+    end
+  end
+  object StatusBar: TStatusBar
+    Left = 0
+    Height = 23
+    Top = 537
+    Width = 865
+    Panels = <    
+      item
+        Alignment = taCenter
+        Text = 'Server Active'
+        Width = 130
+      end    
+      item
+        Text = 'Connection status'
+        Width = 430
+      end    
+      item
+        Text = 'Blocks'
+        Width = 50
+      end>
+    SimplePanel = False
+  end
+  object PageControl: TPageControl
+    Left = 0
+    Height = 446
+    Top = 91
+    Width = 865
+    ActivePage = tsMyAccounts
+    Align = alClient
+    TabIndex = 0
+    TabOrder = 2
+    OnChange = PageControlChange
+    object tsMyAccounts: TTabSheet
+      Caption = 'Account Explorer'
+      ClientHeight = 420
+      ClientWidth = 857
+      object Splitter1: TSplitter
+        Left = 400
+        Height = 354
+        Top = 66
+        Width = 5
+      end
+      object pnlMyAccountsTop: TPanel
+        Left = 0
+        Height = 66
+        Top = 0
+        Width = 857
+        Align = alTop
+        BevelOuter = bvNone
+        ClientHeight = 66
+        ClientWidth = 857
+        TabOrder = 0
+        object Label18: TLabel
+          Left = 11
+          Height = 13
+          Top = 35
+          Width = 61
+          Caption = 'Find account'
+          ParentColor = False
+        end
+        object cbMyPrivateKeys: TComboBox
+          Left = 260
+          Height = 21
+          Top = 7
+          Width = 411
+          ItemHeight = 13
+          OnChange = cbMyPrivateKeysChange
+          Style = csDropDownList
+          TabOrder = 0
+        end
+        object cbExploreMyAccounts: TCheckBox
+          Left = 11
+          Height = 19
+          Top = 10
+          Width = 235
+          Caption = 'Explore accounts with one of my Wallet Keys'
+          OnClick = cbExploreMyAccountsClick
+          TabOrder = 1
+        end
+        object ebFindAccountNumber: TEdit
+          Left = 87
+          Height = 21
+          Top = 33
+          Width = 83
+          OnChange = ebFindAccountNumberChange
+          OnExit = ebFindAccountNumberExit
+          TabOrder = 3
+        end
+        object bbChangeKeyName: TBitBtn
+          Left = 685
+          Height = 25
+          Top = 5
+          Width = 126
+          Caption = 'Change Key name'
+          OnClick = bbChangeKeyNameClick
+          TabOrder = 2
+        end
+        object cbFilterAccounts: TCheckBox
+          Left = 260
+          Height = 19
+          Top = 35
+          Width = 145
+          Caption = 'Filter accounts by balance'
+          OnClick = cbFilterAccountsClick
+          TabOrder = 4
+        end
+        object ebFilterAccountByBalanceMin: TEdit
+          Left = 412
+          Height = 21
+          Hint = 'Min balance'
+          Top = 33
+          Width = 83
+          OnExit = ebFilterAccountByBalanceMinExit
+          OnKeyPress = ebFilterAccountByBalanceMinKeyPress
+          TabOrder = 5
+        end
+        object ebFilterAccountByBalanceMax: TEdit
+          Left = 503
+          Height = 21
+          Hint = 'Max balance'
+          Top = 33
+          Width = 83
+          OnExit = ebFilterAccountByBalanceMinExit
+          OnKeyPress = ebFilterAccountByBalanceMinKeyPress
+          TabOrder = 6
+        end
+        object sbSearchAccount: TSpeedButton
+          Left = 176
+          Height = 22
+          Top = 32
+          Width = 23
+          Glyph.Data = {
+            36030000424D3803000000000000360000002800000010000000100000000100
+            18000000000000000000120B0000120B00000000000000000000FF00FF4A667C
+            BE9596FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+            FFFF00FFFF00FFFF00FF6B9CC31E89E84B7AA3C89693FF00FFFF00FFFF00FFFF
+            00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF4BB4FE51B5FF
+            2089E94B7AA2C69592FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+            FFFF00FFFF00FFFF00FFFF00FF51B7FE51B3FF1D87E64E7AA0CA9792FF00FFFF
+            00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+            51B7FE4EB2FF1F89E64E7BA2B99497FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+            FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF52B8FE4BB1FF2787D95F6A76FF
+            00FFB0857FC09F94C09F96BC988EFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+            FF00FFFF00FF55BDFFB5D6EDBF9D92BB9B8CE7DAC2FFFFE3FFFFE5FDFADAD8C3
+            B3B58D85FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFCEA795FD
+            EEBEFFFFD8FFFFDAFFFFDBFFFFE6FFFFFBEADDDCAE837FFF00FFFF00FFFF00FF
+            FF00FFFF00FFFF00FFFF00FFC1A091FBDCA8FEF7D0FFFFDBFFFFE3FFFFF8FFFF
+            FDFFFFFDC6A99CFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC1A091FEE3ACF1
+            C491FCF2CAFFFFDDFFFFE4FFFFF7FFFFF7FFFFE9EEE5CBB9948CFF00FFFF00FF
+            FF00FFFF00FFFF00FFC2A191FFE6AEEEB581F7DCAEFEFDD8FFFFDFFFFFE3FFFF
+            E4FFFFE0F3ECD2BB968EFF00FFFF00FFFF00FFFF00FFFF00FFBC978CFBE7B7F4
+            C791F2C994F8E5B9FEFCD8FFFFDDFFFFDCFFFFE0E2D2BAB68E86FF00FFFF00FF
+            FF00FFFF00FFFF00FFFF00FFD9C3A9FFFEE5F7DCB8F2C994F5D4A5FAE8BDFDF4
+            C9FDFBD6B69089FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB58D85E8
+            DEDDFFFEF2F9D8A3F4C48CF9D49FFDEAB8D0B49FB89086FF00FFFF00FFFF00FF
+            FF00FFFF00FFFF00FFFF00FFFF00FFAD827FC9AA9EEFE0B7EFDFB2E7CEACB890
+            86B89086FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+            00FFFF00FFBA968ABB988CB79188FF00FFFF00FFFF00FFFF00FF
+          }
+          OnClick = sbSearchAccountClick
+        end
+      end
+      object pnlAccounts: TPanel
+        Left = 0
+        Height = 354
+        Top = 66
+        Width = 400
+        Align = alLeft
+        BevelOuter = bvNone
+        ClientHeight = 354
+        ClientWidth = 400
+        TabOrder = 1
+        object dgAccounts: TDrawGrid
+          Left = 0
+          Height = 320
+          Top = 0
+          Width = 400
+          Align = alClient
+          ExtendedSelect = False
+          TabOrder = 0
+          TitleFont.Color = clWindowText
+          TitleFont.Height = -11
+          TitleFont.Name = 'Tahoma'
+          OnClick = dgAccountsClick
+        end
+        object pnlAccountsInfo: TPanel
+          Left = 0
+          Height = 34
+          Top = 320
+          Width = 400
+          Align = alBottom
+          BevelOuter = bvNone
+          ClientHeight = 34
+          ClientWidth = 400
+          TabOrder = 1
+          object Label17: TLabel
+            Left = 5
+            Height = 13
+            Top = 10
+            Width = 48
+            Caption = 'Accounts:'
+            ParentColor = False
+          end
+          object Label19: TLabel
+            Left = 136
+            Height = 13
+            Top = 10
+            Width = 41
+            Caption = 'Balance:'
+            ParentColor = False
+          end
+          object lblAccountsCount: TLabel
+            Left = 60
+            Height = 13
+            Top = 10
+            Width = 18
+            Caption = '000'
+            ParentColor = False
+          end
+          object lblAccountsBalance: TLabel
+            Left = 200
+            Height = 13
+            Top = 10
+            Width = 18
+            Caption = '000'
+            ParentColor = False
+          end
+          object bbAccountsRefresh: TBitBtn
+            Left = 322
+            Height = 25
+            Top = 6
+            Width = 75
+            Anchors = [akTop, akRight]
+            Caption = 'Refresh'
+            Glyph.Data = {
+              36030000424D3603000000000000360000002800000010000000100000000100
+              18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+              C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2A6
+              A4C2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FEFCFBFEFCFBFEFCFBFEFCFBFE
+              FCFBFEFCFBFEFCFBFEFCFBFEFCFBFEFCFBC2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FEFCFBFEFCFBFEFCFBFEFCFBD8EBD6018A02018A02D8EBD6FEFCFBFEFC
+              FBC2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FEFBF7FEFBF7018A02D8EAD201
+              8A02D8EAD2D8EAD2018A02FEFBF7FEFBF7C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FEF9F4FEF9F4018A02018A02D8E8D0FEF9F4FEF9F4D8E8D0FEF9F4FEF9
+              F4C2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FEF7F0FEF7F0018A02018A0201
+              8A02FEF7F0FEF7F0FEF7F0FEF7F0FEF7F0C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FEF5ECFEF5ECFEF5ECFEF5ECFEF5EC018A02018A02018A02FEF5ECFEF5
+              ECC2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FEF3E9FEF3E9D8E3C7FEF3E9FE
+              F3E9D8E3C7018A02018A02FEF3E9FEF3E9C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FFF1E5FFF1E5018A02D9E2C3D9E2C3018A02D9E2C3018A02FFF1E5FFF1
+              E5C2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FFF0E2FFF0E2D9E1C1018A0201
+              8A02D9E1C1DDCFC2DDCFC2DDCFC2DDCFC2C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FFEEDEFFEEDEFFEEDEFFEEDEFFEEDEFFEEDEC5B5A9C3B4A8C2B3A7C1B2
+              A6C2A6A4FF00FFFF00FFFF00FFFF00FFC2A6A4FFECDAFFECDAFFECDAFFECDAFF
+              ECDAFFECDAB0A296B0A296B0A296B0A296C2A6A4FF00FFFF00FFFF00FFFF00FF
+              C2A6A4FFEAD7FFEAD7FFEAD7FFEAD7FFEAD7C9B9ACFBF8F4FBF8F4E6DAD9C2A6
+              A4FF00FFFF00FFFF00FFFF00FFFF00FFC2A6A4FFE8D3FFE8D3FFE8D3FFE8D3FF
+              E8D3C9B9ACFBF8F4DFCEC7C2A6A4FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              C2A6A4FFE6D0FFE6D0FFE6D0FFE6D0FFE6D0C9B9ACDFCEC7C2A6A4FF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFC2A6A4C2A6A4C2A6A4C2A6A4C2A6A4C2
+              A6A4C2A6A4C2A6A4FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+            }
+            OnClick = bbAccountsRefreshClick
+            TabOrder = 0
+          end
+        end
+      end
+      object pcAccountsOptions: TPageControl
+        Left = 405
+        Height = 354
+        Top = 66
+        Width = 452
+        ActivePage = tsAccountOperations
+        Align = alClient
+        TabIndex = 0
+        TabOrder = 2
+        object tsAccountOperations: TTabSheet
+          Caption = 'Operations of selected Account'
+          ClientHeight = 328
+          ClientWidth = 444
+          object dgAccountOperations: TDrawGrid
+            Left = 0
+            Height = 328
+            Top = 0
+            Width = 444
+            Align = alClient
+            ExtendedSelect = False
+            TabOrder = 0
+            TitleFont.Color = clWindowText
+            TitleFont.Height = -11
+            TitleFont.Name = 'Tahoma'
+            OnDblClick = MiDecodePayloadClick
+          end
+        end
+        object tsMultiSelectAccounts: TTabSheet
+          Caption = 'Selected accounts for massive operations'
+          ClientHeight = 348
+          ClientWidth = 444
+          ImageIndex = 1
+          object dgSelectedAccounts: TDrawGrid
+            Left = 41
+            Height = 291
+            Top = 31
+            Width = 320
+            Align = alLeft
+            ExtendedSelect = False
+            TabOrder = 0
+            TitleFont.Color = clWindowText
+            TitleFont.Height = -11
+            TitleFont.Name = 'Tahoma'
+          end
+          object pnlSelectedAccountsTop: TPanel
+            Left = 0
+            Height = 31
+            Top = 0
+            Width = 444
+            Align = alTop
+            BevelOuter = bvNone
+            ClientHeight = 31
+            ClientWidth = 444
+            Font.Color = clWindowText
+            Font.Height = -13
+            Font.Name = 'Tahoma'
+            Font.Style = [fsBold]
+            ParentFont = False
+            TabOrder = 1
+            object Label15: TLabel
+              Left = 41
+              Height = 16
+              Top = 4
+              Width = 361
+              Caption = 'Select multiple accounts to execute massive operations'
+              ParentColor = False
+            end
+          end
+          object pnlSelectedAccountsBottom: TPanel
+            Left = 0
+            Height = 26
+            Top = 322
+            Width = 444
+            Align = alBottom
+            BevelOuter = bvNone
+            ClientHeight = 26
+            ClientWidth = 444
+            TabOrder = 2
+            object Label20: TLabel
+              Left = 41
+              Height = 13
+              Top = 6
+              Width = 48
+              Caption = 'Accounts:'
+              ParentColor = False
+            end
+            object lblSelectedAccountsCount: TLabel
+              Left = 96
+              Height = 13
+              Top = 6
+              Width = 18
+              Caption = '000'
+              ParentColor = False
+            end
+            object Label22: TLabel
+              Left = 156
+              Height = 13
+              Top = 6
+              Width = 88
+              Caption = 'Accounts Balance:'
+              ParentColor = False
+            end
+            object lblSelectedAccountsBalance: TLabel
+              Left = 250
+              Height = 13
+              Top = 6
+              Width = 18
+              Caption = '000'
+              ParentColor = False
+            end
+          end
+          object pnlSelectedAccountsLeft: TPanel
+            Left = 0
+            Height = 291
+            Top = 31
+            Width = 41
+            Align = alLeft
+            BevelOuter = bvNone
+            ClientHeight = 291
+            ClientWidth = 41
+            TabOrder = 3
+            object sbSelectedAccountsAdd: TSpeedButton
+              Left = 2
+              Height = 31
+              Top = 0
+              Width = 33
+              Caption = '>'
+              OnClick = sbSelectedAccountsAddClick
+            end
+            object sbSelectedAccountsAddAll: TSpeedButton
+              Left = 2
+              Height = 31
+              Top = 37
+              Width = 33
+              Caption = '>>'
+              OnClick = sbSelectedAccountsAddAllClick
+            end
+            object sbSelectedAccountsDel: TSpeedButton
+              Left = 2
+              Height = 31
+              Top = 74
+              Width = 33
+              Caption = '<'
+              OnClick = sbSelectedAccountsDelClick
+            end
+            object sbSelectedAccountsDelAll: TSpeedButton
+              Left = 2
+              Height = 31
+              Top = 111
+              Width = 33
+              Caption = '<<'
+              OnClick = sbSelectedAccountsDelAllClick
+            end
+          end
+          object bbSelectedAccountsOperation: TBitBtn
+            Left = 367
+            Height = 61
+            Top = 31
+            Width = 75
+            Caption = 'Operations'
+            Glyph.Data = {
+              F6060000424DF606000000000000360000002800000018000000180000000100
+              180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C8518FF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+              9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C8518
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+              FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+              00FF0C85181399220C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+              34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF0C85180C85180C85180C85
+              180C85180C85180C85180C85181DAC31139A220C8518FF00FFFF00FFFF00FFFF
+              00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE0C8518
+              57E38851DD7E4AD77443D0693BC95E34C1522BBA4725B33C1EAE33149B230C85
+              18FF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+              DEFE77DEFE0C85185EE89059E48953DE804CD87645D16C3DCA6035C2542DBB49
+              26B53F1FAF35149B250C8518FF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+              F38FE8FF7CE2FE7CE3FE7CE3FE0C851861EB955FE9925AE58B54DF824DD97846
+              D26D3ECB6237C4562FBD4C27B64021B037159B250C8518FF00FFFF00FF019ACF
+              60CAEF1FA8D85EC1E1C2E6ED8ACEE08FCFE18ECFE10C851861EB9561EB955FEA
+              935CE58D56E0844FDB7A48D47040CD6538C65931BF4D1DA3320C8518FF00FFFF
+              00FFFF00FF019ACF65CFF53EB7E52CA9D4C5EFF8ACF3FEA5F2FFA5F2FF0C8518
+              61EB9561EB9561EB9561EB945CE68E57E18650DC7C49D57242CE6727AD410C85
+              18FF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F32A9CC673CBE7D6FEFDB1
+              FBFDB2FBFD0C85180C85180C85180C85180C85180C85180C85180C851852DD7F
+              32B6500C851898FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB748E
+              A224A8D5B9E7F3D5F5F9D5F6F9D6F6FADCFAFBCDFDFCB9FCFCAFFAFCB0FAFCB1
+              FAFC0C85183ABE5C0C85189FFCFFA4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+              8BDBFF5FCDFFB7898973C3DD18A2D218A2D216A2D215A1D21AA4D391D7EBEBFE
+              FDDBFDFCC5FBFBC2FBFB0C85180C851883E4F3B6FDFFBAFFFFB5FCFD019ACFFF
+              00FFFF00FF019ACF99E2FF67D3FFB88989FEF5ECFDF3EBF0EFEAE5EBE8D6E5E6
+              A4D2E025A6D34DB9DDE5F8FBF5FDFCEBFCFB0C8518C4FBFF9CE4F2DAFEFFD9FE
+              FFE3FFFFADE9F5019ACFFF00FF019ACF9FE9FF70DCFFB88989FEF3E9FFF2E6FE
+              F3E9FEF3E9FEF3E9FEF3E9D4E4E439ADD422A5D49DD8ECF1F9FBEEEFEFE9FDFF
+              CEEEF7F8FFFFF7FFFFFEFFFFE9F9FD019ACFFF00FF019ACFA7EFFF76E5FFB889
+              89FFF2E5FFF0E2FFF2E5FFF2E5FFF2E5FFF2E5FFF2E5EAEBE38EC9DA44B0D501
+              9ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACFFF00FF019ACF
+              ABF6FF7EEDFFB88989FFF0E2FFEFDFFFF0E2FFF0E2FFF0E2FFF0E2FFF0E2FEEE
+              E0FBECDEFAEBDEF6E6D9B8898993F7FF019ACFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FF019ACFC7FFFF82F5FFB88989FFEEDFFFECDBFFEEDFFFEEDFFFEEDF
+              FFEEDFF9E8D9DECCC1D9CABDCFBDB4C8B3ACB88989B5FFFF019ACFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFFB88989FFECDBFFEBD8FF
+              ECDBFFECDBFFECDBFFECDBF5E2D2C4ABA7C2A8A5BBA39FC2AFA9B88989019ACF
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFB889
+              89FFEBD8FFEAD5FFEBD8FFEBD8FFEBD8FFEBD8FFEBD8D9C8C5FEFEFDFEF6EFDE
+              C9C0B88989FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+              FF00FF019ACFB88989FFE9D5FFE8D3FFE9D5FFE9D5FFE9D5FFE9D5FFE9D5C6AD
+              A9FEF8F2E8D4CACD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFB88989FFE7D1FFE7D0FFE7D1FFE7D1FFE7D1
+              FFE7D1E7CEBFD3BFB9E8D5CCCD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+              FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB88989FFE6CFFFE6CFFF
+              E6CFFFE6CFFFE6CFFFE6CFD5BBB2E0CCC5CD9999FF00FFFF00FFFF00FFFF00FF
+              FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB889
+              89B88989B88989B88989B88989B88989B88989B88989B88989FF00FFFF00FFFF
+              00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+            }
+            Layout = blGlyphTop
+            OnClick = bbSelectedAccountsOperationClick
+            TabOrder = 4
+          end
+        end
+      end
+    end
+    object tsPendingOperations: TTabSheet
+      Caption = 'Pending Operations'
+      ClientHeight = 440
+      ClientWidth = 857
+      ImageIndex = 5
+      object dgPendingOperations: TDrawGrid
+        Left = 0
+        Height = 354
+        Top = 86
+        Width = 857
+        Align = alClient
+        ExtendedSelect = False
+        TabOrder = 0
+        TitleFont.Color = clWindowText
+        TitleFont.Height = -11
+        TitleFont.Name = 'Tahoma'
+        OnDblClick = MiDecodePayloadClick
+      end
+      object pnlPendingOperations: TPanel
+        Left = 0
+        Height = 86
+        Top = 0
+        Width = 857
+        Align = alTop
+        BevelOuter = bvNone
+        BorderWidth = 10
+        ClientHeight = 86
+        ClientWidth = 857
+        TabOrder = 1
+        object Label10: TLabel
+          Left = 10
+          Height = 66
+          Top = 10
+          Width = 837
+          Align = alClient
+          AutoSize = False
+          Caption = 'Here you can see Operations transmited/received from other nodes that will be included in next block. There is no guarantee that other nodes will include them when mining, so it''s important that you mine too to help include Operations to the main BlockChain'
+          Font.Color = clWindowText
+          Font.Height = -16
+          Font.Name = 'Tahoma'
+          ParentColor = False
+          ParentFont = False
+          WordWrap = True
+        end
+      end
+    end
+    object tsBlockChain: TTabSheet
+      Caption = 'Block Explorer'
+      ClientHeight = 440
+      ClientWidth = 857
+      ImageIndex = 1
+      object Panel2: TPanel
+        Left = 0
+        Height = 41
+        Top = 0
+        Width = 857
+        Align = alTop
+        BevelOuter = bvNone
+        ClientHeight = 41
+        ClientWidth = 857
+        TabOrder = 0
+        object Label9: TLabel
+          Left = 11
+          Height = 13
+          Top = 10
+          Width = 102
+          Caption = 'Filter by blocks range'
+          ParentColor = False
+        end
+        object ebBlockChainBlockStart: TEdit
+          Left = 125
+          Height = 21
+          Top = 7
+          Width = 57
+          OnExit = ebBlockChainBlockStartExit
+          OnKeyPress = ebBlockChainBlockStartKeyPress
+          TabOrder = 0
+        end
+        object ebBlockChainBlockEnd: TEdit
+          Left = 185
+          Height = 21
+          Top = 7
+          Width = 57
+          OnExit = ebBlockChainBlockStartExit
+          OnKeyPress = ebBlockChainBlockStartKeyPress
+          TabOrder = 1
+        end
+      end
+      object dgBlockChainExplorer: TDrawGrid
+        Left = 0
+        Height = 399
+        Top = 41
+        Width = 857
+        Align = alClient
+        ExtendedSelect = False
+        TabOrder = 1
+        TitleFont.Color = clWindowText
+        TitleFont.Height = -11
+        TitleFont.Name = 'Tahoma'
+      end
+    end
+    object tsOperations: TTabSheet
+      Caption = 'Operations Explorer'
+      ClientHeight = 440
+      ClientWidth = 857
+      ImageIndex = 1
+      object Panel1: TPanel
+        Left = 0
+        Height = 41
+        Top = 0
+        Width = 857
+        Align = alTop
+        BevelOuter = bvNone
+        ClientHeight = 41
+        ClientWidth = 857
+        TabOrder = 0
+        object Label2: TLabel
+          Left = 11
+          Height = 13
+          Top = 10
+          Width = 102
+          Caption = 'Filter by blocks range'
+          ParentColor = False
+        end
+        object ebFilterOperationsStartBlock: TEdit
+          Left = 125
+          Height = 21
+          Top = 7
+          Width = 57
+          OnExit = ebFilterOperationsAccountExit
+          OnKeyPress = ebFilterOperationsAccountKeyPress
+          TabOrder = 0
+        end
+        object ebFilterOperationsEndBlock: TEdit
+          Left = 185
+          Height = 21
+          Top = 7
+          Width = 57
+          OnExit = ebFilterOperationsAccountExit
+          OnKeyPress = ebFilterOperationsAccountKeyPress
+          TabOrder = 1
+        end
+      end
+      object dgOperationsExplorer: TDrawGrid
+        Left = 0
+        Height = 399
+        Top = 41
+        Width = 857
+        Align = alClient
+        ExtendedSelect = False
+        TabOrder = 1
+        TitleFont.Color = clWindowText
+        TitleFont.Height = -11
+        TitleFont.Name = 'Tahoma'
+      end
+    end
+    object tsLogs: TTabSheet
+      Caption = 'Logs'
+      ClientHeight = 440
+      ClientWidth = 857
+      ImageIndex = 2
+      object pnlTopLogs: TPanel
+        Left = 0
+        Height = 41
+        Top = 0
+        Width = 857
+        Align = alTop
+        BevelOuter = bvNone
+        ClientHeight = 41
+        ClientWidth = 857
+        TabOrder = 0
+        object cbShowDebugLogs: TCheckBox
+          Left = 15
+          Height = 19
+          Top = 10
+          Width = 102
+          Caption = 'Show Debug Logs'
+          TabOrder = 0
+        end
+      end
+      object memoLogs: TMemo
+        Left = 0
+        Height = 399
+        Top = 41
+        Width = 857
+        Align = alClient
+        ScrollBars = ssBoth
+        TabOrder = 1
+        WordWrap = False
+      end
+    end
+    object tsNodeStats: TTabSheet
+      Caption = 'Node Stats'
+      ClientHeight = 440
+      ClientWidth = 857
+      ImageIndex = 3
+      object Label3: TLabel
+        Left = 15
+        Height = 13
+        Top = 15
+        Width = 177
+        Caption = 'Active Connections:'
+        ParentColor = False
+      end
+      object Label6: TLabel
+        Left = 15
+        Height = 13
+        Top = 291
+        Width = 198
+        Anchors = [akLeft, akRight, akBottom]
+        Caption = 'Known Node Servers:'
+        ParentColor = False
+      end
+      object Label7: TLabel
+        Left = 15
+        Height = 13
+        Top = 187
+        Width = 99
+        Anchors = [akLeft, akRight, akBottom]
+        Caption = 'Blacklisted Nodes'
+        ParentColor = False
+      end
+      object memoNetConnections: TMemo
+        Left = 15
+        Height = 145
+        Top = 34
+        Width = 830
+        Anchors = [akTop, akLeft, akRight, akBottom]
+        ReadOnly = True
+        ScrollBars = ssBoth
+        TabOrder = 0
+        WordWrap = False
+      end
+      object memoNetServers: TMemo
+        Left = 15
+        Height = 116
+        Top = 310
+        Width = 830
+        Anchors = [akLeft, akRight, akBottom]
+        ReadOnly = True
+        ScrollBars = ssBoth
+        TabOrder = 1
+        WordWrap = False
+      end
+      object memoNetBlackLists: TMemo
+        Left = 16
+        Height = 79
+        Top = 206
+        Width = 829
+        Anchors = [akLeft, akRight, akBottom]
+        ReadOnly = True
+        ScrollBars = ssBoth
+        TabOrder = 2
+        WordWrap = False
+      end
+    end
+    object tsMessages: TTabSheet
+      Caption = 'Messages'
+      ClientHeight = 440
+      ClientWidth = 857
+      ImageIndex = 6
+      object Label11: TLabel
+        Left = 15
+        Height = 13
+        Top = 151
+        Width = 51
+        Caption = 'Messages:'
+        ParentColor = False
+      end
+      object Label12: TLabel
+        Left = 315
+        Height = 13
+        Top = 11
+        Width = 85
+        Caption = 'Message to send:'
+        ParentColor = False
+      end
+      object Label13: TLabel
+        Left = 15
+        Height = 13
+        Top = 11
+        Width = 107
+        Caption = 'Available Connections:'
+        ParentColor = False
+      end
+      object Label14: TLabel
+        Left = 410
+        Height = 13
+        Top = 11
+        Width = 361
+        Caption = '(Messages will be encrypted, so only dest connection will be able to read it)'
+        Font.Color = clGrayText
+        Font.Height = -11
+        Font.Name = 'Tahoma'
+        ParentColor = False
+        ParentFont = False
+      end
+      object lbNetConnections: TListBox
+        Left = 15
+        Height = 96
+        Top = 30
+        Width = 275
+        ItemHeight = 0
+        MultiSelect = True
+        ScrollWidth = 273
+        TabOrder = 0
+      end
+      object bbSendAMessage: TButton
+        Left = 315
+        Height = 25
+        Top = 101
+        Width = 525
+        Caption = 'Send a Message'
+        OnClick = bbSendAMessageClick
+        TabOrder = 1
+      end
+      object memoMessages: TMemo
+        Left = 15
+        Height = 249
+        Top = 170
+        Width = 821
+        Anchors = [akTop, akLeft, akRight, akBottom]
+        Font.Color = clWindowText
+        Font.Height = -16
+        Font.Name = 'Tahoma'
+        Lines.Strings = (
+          'dsfa ñldsaf ñlk dasf'
+          'dsfkldañfs ñl'
+        )
+        ParentFont = False
+        ReadOnly = True
+        ScrollBars = ssBoth
+        TabOrder = 2
+      end
+      object memoMessageToSend: TMemo
+        Left = 315
+        Height = 61
+        Top = 30
+        Width = 525
+        Lines.Strings = (
+          'memoMessageToSend'
+        )
+        TabOrder = 3
+        WantReturns = False
+      end
+    end
+  end
+  object TrayIcon: TTrayIcon
+    Visible = True
+    OnDblClick = TrayIconDblClick
+    left = 45
+    top = 20
+  end
+  object TimerUpdateStatus: TTimer
+    OnTimer = TimerUpdateStatusTimer
+    left = 25
+    top = 45
+  end
+  object MainMenu: TMainMenu
+    left = 165
+    top = 160
+    object miProject: TMenuItem
+      Caption = 'Project'
+      object miPrivatekeys: TMenuItem
+        Caption = 'Private Keys'
+        ShortCut = 16464
+        OnClick = miPrivatekeysClick
+      end
+      object miN1: TMenuItem
+        Caption = '-'
+      end
+      object miOptions: TMenuItem
+        Caption = 'Options'
+        ShortCut = 16463
+        OnClick = miOptionsClick
+      end
+      object IPnodes1: TMenuItem
+        Caption = 'Available Node List'
+        OnClick = IPnodes1Click
+      end
+      object N1: TMenuItem
+        Caption = '-'
+      end
+      object MiClose: TMenuItem
+        Caption = 'Close'
+        OnClick = MiCloseClick
+      end
+    end
+    object MiOperations: TMenuItem
+      Caption = 'Operations'
+      object miNewOperation: TMenuItem
+        Caption = 'New single Operation'
+        ShortCut = 120
+        OnClick = miNewOperationClick
+      end
+      object MiFindOperationbyOpHash: TMenuItem
+        Caption = 'Find Operation by OpHash'
+        ShortCut = 116
+        OnClick = MiFindOperationbyOpHashClick
+      end
+      object MiDecodePayload: TMenuItem
+        Caption = 'Decode Payload'
+        ShortCut = 113
+        OnClick = MiDecodePayloadClick
+      end
+      object MiFindaccount: TMenuItem
+        Caption = 'Find account'
+        ShortCut = 16454
+        OnClick = MiFindaccountClick
+      end
+      object MiAccountInformation: TMenuItem
+        Caption = 'Account Information'
+        ShortCut = 112
+        OnClick = MiAccountInformationClick
+      end
+      object N2: TMenuItem
+        Caption = '-'
+      end
+      object MiAddaccounttoSelected: TMenuItem
+        Caption = 'Add account to selected'
+        ShortCut = 117
+        OnClick = MiAddaccounttoSelectedClick
+      end
+      object MiRemoveaccountfromselected: TMenuItem
+        Caption = 'Remove account from selected'
+        ShortCut = 118
+        OnClick = MiRemoveaccountfromselectedClick
+      end
+      object MiMultiaccountoperation: TMenuItem
+        Caption = 'Multi account operation'
+        OnClick = MiMultiaccountoperationClick
+      end
+      object N3: TMenuItem
+        Caption = '-'
+      end
+      object MiFindpreviousaccountwithhighbalance: TMenuItem
+        Caption = 'Find previous account with high balance'
+        ShortCut = 16498
+        OnClick = MiFindpreviousaccountwithhighbalanceClick
+      end
+      object MiFindnextaccountwithhighbalance: TMenuItem
+        Caption = 'Find next account with high balance'
+        ShortCut = 114
+        OnClick = MiFindnextaccountwithhighbalanceClick
+      end
+    end
+    object miAbout: TMenuItem
+      Caption = 'About'
+      object miAboutPascalCoin: TMenuItem
+        Caption = 'About Pascal Coin...'
+        OnClick = miAboutPascalCoinClick
+      end
+    end
+  end
+  object ImageListIcons: TImageList
+    Height = 48
+    left = 105
+    top = 180
+    Bitmap = {
+      4C69020000001000000030000000000000000000000000000000000000000000
+      00000000000016161616010101010C0C0C0C7171717100000000000000000000
+      0000000000000000000000000000000000000000000000000000000000002324
+      252266B3FF0066B3FF0066B3FF0066B3FF0066B3FF00586D7F40000000000000
+      0000000000000000000000000000000000000000000000000000000000002324
+      252266B3FF0066B3FF0066B3FF0066B3FF0066B3FF00586D7F40000000000000
+      00000000000000000000000000000000000000000000000000005252525266B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF00252627240000
+      000000000000000000000000000000000000000000007878787866B3FF0066B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0033597F0066B3FF001D1E
+      1F1D00000000000000000000000000000000000000007878787866B3FF0066B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0033597F0066B3FF001D1E
+      1F1D00000000000000000000000000000000000000002B2F302966B3FF0066B3
+      FF006CB6FF006EB7FF006AB5FF0066B3FF0066B3FF00060B0F0066B3FF0068AC
+      F00E000000000000000000000000000000007474747466B3FF0067B4FF0077BB
+      FF0080C0FF0083C1FF007DBFFF00558BBF0066B3FF002C4E6F0066B3FF0066B3
+      FF003234382E0000000000000000000000007474747466B3FF0067B4FF0077BB
+      FF0080C0FF0083C1FF007DBFFF00558BBF0066B3FF002C4E6F0066B3FF0066B3
+      FF003234382E0000000000000000000000002B2F302966B3FF0070B8FF0080C0
+      FF007AACDF0000000000000000000000000000000000000000002C4E6F0066B3
+      FF0068ACF00E00000000000000000000000066B3FF0068B4FF007FC0FF0092C9
+      FF004F677F000000000000000000000000000000000000000000000000001321
+      2F0066B3FF006E6E6E6E000000000000000066B3FF0068B4FF007FC0FF0092C9
+      FF004F677F000000000000000000000000000000000000000000000000001321
+      2F0066B3FF006E6E6E6E000000000000000066B3FF006EB7FF0087C3FF009BCD
+      FF0034424F000000000000000000000000000000000000000000000000000000
+      000066B3FF002B2C2F29000000002122232066B3FF0079BDFF0094CAFF00ACD6
+      FF000000000000000000B7DBFF00000000006894BF00375B7F00000000000000
+      000066B3FF0066B3FF00000000002122232066B3FF0079BDFF0094CAFF00ACD6
+      FF000000000000000000B7DBFF00000000006894BF00375B7F00000000000000
+      000066B3FF0066B3FF00000000005E768F3F66B3FF007EBFFF009ACDFF00B3D9
+      FF000000000000000000C0E0FF0000000000597D9F0073BAFF00000000000000
+      000066B3FF0066B3FF000000000066B3FF0067B3FF0085C2FF00A3D1FF00BFDF
+      FF000000000000000000CFE7FF000000000025323F007ABDFF00000000000000
+      000066B3FF0066B3FF000000000066B3FF0067B3FF0085C2FF00A3D1FF00BFDF
+      FF000000000000000000CFE7FF000000000025323F007ABDFF00000000000000
+      000066B3FF0066B3FF000000000066B3FF0068B4FF0087C3FF00A6D3FF00C3E1
+      FF000000000000000000D5EAFF000B0D0F0013191F007CBEFF00000000000000
+      000066B3FF0066B3FF000000000066B3FF006AB5FF0089C4FF00A8D4FF00C7E3
+      FF000000000000000000DAEDFF0051606F00000000007DBFFF00000000000000
+      000066B3FF0066B3FF002323232366B3FF006AB5FF0089C4FF00A8D4FF00C7E3
+      FF000000000000000000DAEDFF0051606F00000000007DBFFF00000000000000
+      000066B3FF0066B3FF002323232366B3FF0069B4FF0088C4FF00A7D3FF00C6E3
+      FF000000000000000000D9ECFF00697C8F0000000000659ACF00000000000000
+      000066B3FF0066B3FF000D0D0D0D66B3FF0067B3FF0085C2FF00A3D1FF00BFDF
+      FF00000000000000000033393F002A323B000000000000000000000000002037
+      4F0066B3FF0066B3FF000202020266B3FF0067B3FF0085C2FF00A3D1FF00BFDF
+      FF00000000000000000033393F002A323B000000000000000000000000002037
+      4F0066B3FF0066B3FF000202020266B3FF0066B3FF0082C1FF009ECFFF00B9DC
+      FF000000000000000000000000000000000000000000000000000000000060A8
+      EF0066B3FF0066B3FF000505050566B3FF0066B3FF0079BDFF0094CAFF0096BA
+      DF0000000000000000000000000000000000000000000000000039648F0066B3
+      FF0066B3FF0066B3FF001111111166B3FF0066B3FF0079BDFF0094CAFF0096BA
+      DF0000000000000000000000000000000000000000000000000039648F0066B3
+      FF0066B3FF0066B3FF001111111166B3FF0066B3FF0074BAFF008EC7FF007A9D
+      BF0000000000000000000000000000000000000000000D161F0066B3FF0066B3
+      FF0066B3FF0066B3FF002323232366B3FF0066B3FF0068B4FF007FC0FF002D3E
+      4F000000000065829F0026333F008CC6FF0070B0EF0066B3FF0066B3FF0066B3
+      FF0066B3FF0066B3FF000000000066B3FF0066B3FF0068B4FF007FC0FF002D3E
+      4F000000000065829F0026333F008CC6FF0070B0EF0066B3FF0066B3FF0066B3
+      FF0066B3FF0066B3FF000000000066B3FF0066B3FF0066B3FF0077BCFF001924
+      2F00000000007198BF0012181F0083C2FF0070B8FF0066B3FF0066B3FF0066B3
+      FF0066B3FF0066B3FF0000000000586D7F4066B3FF0066B3FF0067B4FF000000
+      00000000000083C1FF003E5F7F005C96CF0066B3FF0066B3FF0066B3FF0066B3
+      FF0066B3FF0066B3FF0000000000586D7F4066B3FF0066B3FF0067B4FF000000
+      00000000000083C1FF003E5F7F005C96CF0066B3FF0066B3FF0066B3FF0066B3
+      FF0066B3FF0066B3FF00000000002022221F66B3FF0066B3FF0066B3FF000000
+      00000000000079BCFF0073BAFF0068B4FF0066B3FF0066B3FF0066B3FF0066B3
+      FF0066B3FF0066B3FF00000000000000000066B3FF0066B3FF0066B3FF000000
+      00000000000066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3
+      FF0066B3FF002022221F000000000000000066B3FF0066B3FF0066B3FF000000
+      00000000000066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3
+      FF0066B3FF002022221F000000000000000066B3FF0066B3FF0066B3FF000000
+      00000000000066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3
+      FF0066B3FF006868686800000000000000001414151466B3FF0066B3FF000000
+      00000000000066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3
+      FF0068ACF00E0000000000000000000000001414151466B3FF0066B3FF000000
+      00000000000066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3
+      FF0068ACF00E0000000000000000000000007F7F7F7F66B3FF0066B3FF000000
+      00000000000066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3
+      FF002B2F3029000000000000000000000000000000002B2F312966B3FF0066B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0068AC
+      F00E00000000000000000000000000000000000000002B2F312966B3FF0066B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0068AC
+      F00E00000000000000000000000000000000000000000000000066B3FF0066B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF002C30
+      322A0000000000000000000000000000000000000000000000006D6D6D6D66B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF00292A2D270000
+      00000000000000000000000000000000000000000000000000006D6D6D6D66B3
+      FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF0066B3FF00292A2D270000
+      0000000000000000000000000000000000000000000000000000000000002A2B
+      2E2866B3FF0066B3FF0066B3FF0066B3FF0066B3FF005E768F3F000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000292929290B0B0B0B111111110000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000292929290B0B0B0B111111110000000000000000000000000000
+      0000000000000000000000000000000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF
+    }
+  end
+end

+ 1942 - 0
src/gui-classic/UFRMWallet.pas

@@ -0,0 +1,1942 @@
+unit UFRMWallet;
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{ Copyright (c) 2016 by Albert Molina
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  This unit is a part of Pascal Coin, a P2P crypto currency without need of
+  historical operations.
+
+  If you like it, consider a donation using BitCoin:
+  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
+
+  }
+
+interface
+
+{$I ../config.inc}
+
+uses
+{$IFnDEF FPC}
+  pngimage, Windows, AppEvnts, ShlObj,
+{$ELSE}
+  LCLIntf, LCLType, LMessages,
+{$ENDIF}
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, ExtCtrls, ComCtrls, UWallet, StdCtrls,
+  ULog, Grids, UAppParams,
+  UBlockChain, UNode, UGridUtils, UAccounts, Menus, ImgList,
+  UNetProtocol, UCrypto, Buttons, UPoolMining, URPC, UFRMAccountSelect,
+  UConst;
+
+Const
+  CM_PC_WalletKeysChanged = WM_USER + 1;
+  CM_PC_NetConnectionUpdated = WM_USER + 2;
+
+type
+  TMinerPrivateKey = (mpk_NewEachTime, mpk_Random, mpk_Selected);
+
+  { TFRMWallet }
+
+  TFRMWallet = class(TForm)
+    pnlTop: TPanel;
+    Image1: TImage;
+    sbSearchAccount: TSpeedButton;
+    StatusBar: TStatusBar;
+    PageControl: TPageControl;
+    tsMyAccounts: TTabSheet;
+    tsOperations: TTabSheet;
+    TrayIcon: TTrayIcon;
+    TimerUpdateStatus: TTimer;
+    tsLogs: TTabSheet;
+    pnlTopLogs: TPanel;
+    cbShowDebugLogs: TCheckBox;
+    memoLogs: TMemo;
+    pnlMyAccountsTop: TPanel;
+    dgAccounts: TDrawGrid;
+    cbMyPrivateKeys: TComboBox;
+    Splitter1: TSplitter;
+    MainMenu: TMainMenu;
+    miProject: TMenuItem;
+    miOptions: TMenuItem;
+    miPrivatekeys: TMenuItem;
+    miN1: TMenuItem;
+    miAbout: TMenuItem;
+    miAboutPascalCoin: TMenuItem;
+    miNewOperation: TMenuItem;
+    Panel1: TPanel;
+    Label2: TLabel;
+    ebFilterOperationsStartBlock: TEdit;
+    ebFilterOperationsEndBlock: TEdit;
+    tsNodeStats: TTabSheet;
+    memoNetConnections: TMemo;
+    memoNetServers: TMemo;
+    memoNetBlackLists: TMemo;
+    Label3: TLabel;
+    Label6: TLabel;
+    Label7: TLabel;
+    lblCurrentBlockCaption: TLabel;
+    lblCurrentBlock: TLabel;
+    lblCurrentBlockTimeCaption: TLabel;
+    lblCurrentBlockTime: TLabel;
+    lblOperationsPendingCaption: TLabel;
+    lblOperationsPending: TLabel;
+    lblMiningStatusCaption: TLabel;
+    lblMinersClients: TLabel;
+    lblCurrentDifficultyCaption: TLabel;
+    lblCurrentDifficulty: TLabel;
+    lblTimeAverage: TLabel;
+    Label4: TLabel;
+    tsBlockChain: TTabSheet;
+    Panel2: TPanel;
+    Label9: TLabel;
+    ebBlockChainBlockStart: TEdit;
+    ebBlockChainBlockEnd: TEdit;
+    Label8: TLabel;
+    lblNodeStatus: TLabel;
+    tsPendingOperations: TTabSheet;
+    dgPendingOperations: TDrawGrid;
+    pnlPendingOperations: TPanel;
+    Label10: TLabel;
+    cbExploreMyAccounts: TCheckBox;
+    N1: TMenuItem;
+    MiClose: TMenuItem;
+    MiDecodePayload: TMenuItem;
+    ImageListIcons: TImageList;
+    ApplicationEvents: {$IFDEF FPC}TApplicationProperties{$ELSE}TApplicationEvents{$ENDIF};
+    Label5: TLabel;
+    lblCurrentAccounts: TLabel;
+    lblTimeAverageAux: TLabel;
+    tsMessages: TTabSheet;
+    lbNetConnections: TListBox;
+    bbSendAMessage: TButton;
+    Label11: TLabel;
+    memoMessages: TMemo;
+    memoMessageToSend: TMemo;
+    Label12: TLabel;
+    Label13: TLabel;
+    Label14: TLabel;
+    Label16: TLabel;
+    lblBlocksFound: TLabel;
+    pnlAccounts: TPanel;
+    pnlAccountsInfo: TPanel;
+    Label17: TLabel;
+    Label19: TLabel;
+    lblAccountsCount: TLabel;
+    lblAccountsBalance: TLabel;
+    lblReceivedMessages: TLabel;
+    lblBuild: TLabel;
+    ebFindAccountNumber: TEdit;
+    Label18: TLabel;
+    IPnodes1: TMenuItem;
+    bbChangeKeyName: TBitBtn;
+    pcAccountsOptions: TPageControl;
+    tsAccountOperations: TTabSheet;
+    dgAccountOperations: TDrawGrid;
+    tsMultiSelectAccounts: TTabSheet;
+    dgSelectedAccounts: TDrawGrid;
+    pnlSelectedAccountsTop: TPanel;
+    pnlSelectedAccountsBottom: TPanel;
+    pnlSelectedAccountsLeft: TPanel;
+    sbSelectedAccountsAdd: TSpeedButton;
+    sbSelectedAccountsAddAll: TSpeedButton;
+    sbSelectedAccountsDel: TSpeedButton;
+    sbSelectedAccountsDelAll: TSpeedButton;
+    Label20: TLabel;
+    lblSelectedAccountsCount: TLabel;
+    Label22: TLabel;
+    lblSelectedAccountsBalance: TLabel;
+    bbSelectedAccountsOperation: TBitBtn;
+    Label15: TLabel;
+    MiOperations: TMenuItem;
+    MiAddaccounttoSelected: TMenuItem;
+    MiRemoveaccountfromselected: TMenuItem;
+    N2: TMenuItem;
+    MiMultiaccountoperation: TMenuItem;
+    N3: TMenuItem;
+    MiFindnextaccountwithhighbalance: TMenuItem;
+    MiFindpreviousaccountwithhighbalance: TMenuItem;
+    MiFindaccount: TMenuItem;
+    cbFilterAccounts: TCheckBox;
+    ebFilterAccountByBalanceMin: TEdit;
+    ebFilterAccountByBalanceMax: TEdit;
+    bbAccountsRefresh: TBitBtn;
+    dgBlockChainExplorer: TDrawGrid;
+    dgOperationsExplorer: TDrawGrid;
+    MiFindOperationbyOpHash: TMenuItem;
+    MiAccountInformation: TMenuItem;
+    procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+    procedure sbSearchAccountClick(Sender: TObject);
+    procedure TimerUpdateStatusTimer(Sender: TObject);
+    procedure cbMyPrivateKeysChange(Sender: TObject);
+    procedure dgAccountsClick(Sender: TObject);
+    procedure miOptionsClick(Sender: TObject);
+    procedure miAboutPascalCoinClick(Sender: TObject);
+    procedure miNewOperationClick(Sender: TObject);
+    procedure miPrivatekeysClick(Sender: TObject);
+    procedure dgAccountsColumnMoved(Sender: TObject; FromIndex,
+      ToIndex: Integer);
+    procedure dgAccountsFixedCellClick(Sender: TObject; ACol, ARow: Integer);
+    procedure PageControlChange(Sender: TObject);
+    procedure ebFilterOperationsAccountExit(Sender: TObject);
+    procedure ebFilterOperationsAccountKeyPress(Sender: TObject; var Key: Char);
+    procedure ebBlockChainBlockStartExit(Sender: TObject);
+    procedure ebBlockChainBlockStartKeyPress(Sender: TObject; var Key: Char);
+    procedure cbExploreMyAccountsClick(Sender: TObject);
+    procedure MiCloseClick(Sender: TObject);
+    procedure MiDecodePayloadClick(Sender: TObject);
+    procedure TrayIconDblClick(Sender: TObject);
+    procedure ApplicationEventsMinimize(Sender: TObject);
+    procedure bbSendAMessageClick(Sender: TObject);
+    procedure lblReceivedMessagesClick(Sender: TObject);
+    procedure ebFindAccountNumberChange(Sender: TObject);
+    procedure ebFindAccountNumberExit(Sender: TObject);
+    procedure IPnodes1Click(Sender: TObject);
+    procedure bbChangeKeyNameClick(Sender: TObject);
+    procedure sbSelectedAccountsAddClick(Sender: TObject);
+    procedure sbSelectedAccountsAddAllClick(Sender: TObject);
+    procedure sbSelectedAccountsDelClick(Sender: TObject);
+    procedure sbSelectedAccountsDelAllClick(Sender: TObject);
+    procedure bbSelectedAccountsOperationClick(Sender: TObject);
+    procedure MiAddaccounttoSelectedClick(Sender: TObject);
+    procedure MiRemoveaccountfromselectedClick(Sender: TObject);
+    procedure MiMultiaccountoperationClick(Sender: TObject);
+    procedure MiFindnextaccountwithhighbalanceClick(Sender: TObject);
+    procedure MiFindpreviousaccountwithhighbalanceClick(Sender: TObject);
+    procedure MiFindaccountClick(Sender: TObject);
+    procedure bbAccountsRefreshClick(Sender: TObject);
+    procedure ebFilterAccountByBalanceMinExit(Sender: TObject);
+    procedure ebFilterAccountByBalanceMinKeyPress(Sender: TObject;
+      var Key: Char);
+    procedure cbFilterAccountsClick(Sender: TObject);
+    procedure MiFindOperationbyOpHashClick(Sender: TObject);
+    procedure MiAccountInformationClick(Sender: TObject);
+  private
+    FLastNodesCacheUpdatedTS : TDateTime;
+    FBackgroundPanel : TPanel;
+    FMinersBlocksFound: Integer;
+    procedure SetMinersBlocksFound(const Value: Integer);
+    Procedure CheckIsReady;
+    Procedure FinishedLoadingApp;
+    Procedure FillAccountInformation(Const Strings : TStrings; Const AccountNumber : Cardinal);
+    Procedure FillOperationInformation(Const Strings : TStrings; Const OperationResume : TOperationResume);
+  protected
+    { Private declarations }
+    FNode : TNode;
+    FIsActivated : Boolean;
+    FWalletKeys : TWalletKeysExt;
+    FLog : TLog;
+    FAppParams : TAppParams;
+    FNodeNotifyEvents : TNodeNotifyEvents;
+    FAccountsGrid : TAccountsGrid;
+    FSelectedAccountsGrid : TAccountsGrid;
+    FOperationsAccountGrid : TOperationsGrid;
+    FPendingOperationsGrid : TOperationsGrid;
+    FOrderedAccountsKeyList : TOrderedAccountKeysList;
+    FOperationsExplorerGrid : TOperationsGrid;
+    FBlockChainGrid : TBlockChainGrid;
+    FMinerPrivateKeyType : TMinerPrivateKey;
+    FUpdating : Boolean;
+    FMessagesUnreadCount : Integer;
+    FMinAccountBalance : Int64;
+    FMaxAccountBalance : Int64;
+    FPoolMiningServer : TPoolMiningServer;
+    FRPCServer : TRPCServer;
+    FMustProcessWalletChanged : Boolean;
+    FMustProcessNetConnectionUpdated : Boolean;
+    Procedure OnNewAccount(Sender : TObject);
+    Procedure OnReceivedHelloMessage(Sender : TObject);
+    Procedure OnNetStatisticsChanged(Sender : TObject);
+    procedure OnNewLog(logtype : TLogType; Time : TDateTime; ThreadID : TThreadID; Const sender, logtext : AnsiString);
+    procedure OnWalletChanged(Sender : TObject);
+    procedure OnNetConnectionsUpdated(Sender : TObject);
+    procedure OnNetNodeServersUpdated(Sender : TObject);
+    procedure OnNetBlackListUpdated(Sender : TObject);
+    Procedure OnNodeMessageEvent(NetConnection : TNetConnection; MessageData : TRawBytes);
+    Procedure OnSelectedAccountsGridUpdated(Sender : TObject);
+    Procedure OnMiningServerNewBlockFound(Sender : TObject);
+    Procedure UpdateConnectionStatus;
+    Procedure UpdateAccounts(RefreshData : Boolean);
+    Procedure UpdateBlockChainState;
+    Procedure UpdatePrivateKeys;
+    Procedure UpdateOperations;
+    Procedure LoadAppParams;
+    Procedure SaveAppParams;
+    Procedure UpdateConfigChanged;
+    Procedure UpdateNodeStatus;
+    Procedure UpdateAvailableConnections;
+    procedure Activate; override;
+    Function ForceMining : Boolean; virtual;
+    Function GetAccountKeyForMiner : TAccountKey;
+    Procedure DoUpdateAccounts;
+    Function DoUpdateAccountsFilter : Boolean;
+    procedure CM_WalletChanged(var Msg: TMessage); message CM_PC_WalletKeysChanged;
+    procedure CM_NetConnectionUpdated(var Msg: TMessage); message CM_PC_NetConnectionUpdated;
+  public
+    { Public declarations }
+    Property WalletKeys : TWalletKeysExt read FWalletKeys;
+    Property MinersBlocksFound : Integer read FMinersBlocksFound write SetMinersBlocksFound;
+  end;
+
+var
+  FRMWallet: TFRMWallet;
+
+implementation
+
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
+
+Uses UFolderHelper, UOpenSSL, UOpenSSLdef, UTime, UFileStorage,
+  UThread, UOpTransaction, UECIES, UFRMPascalCoinWalletConfig,
+  UFRMAbout, UFRMOperation, UFRMWalletKeys, UFRMPayloadDecoder, UFRMNodesIp, UFRMMemoText, USettings, UCommon;
+
+Type
+  TThreadActivate = Class(TPCThread)
+  protected
+    procedure BCExecute; override;
+  End;
+
+{ TThreadActivate }
+
+procedure TThreadActivate.BCExecute;
+begin
+  // Read Operations saved from disk
+  TNode.Node.InitSafeboxAndOperations; // New Build 2.1.4 to load pending operations buffer
+  TNode.Node.AutoDiscoverNodes(CT_Discover_IPs);
+  TNode.Node.NetServer.Active := true;
+  Synchronize( FRMWallet.DoUpdateAccounts );
+  Synchronize( FRMWallet.FinishedLoadingApp );
+end;
+
+{ TFRMWallet }
+
+procedure TFRMWallet.Activate;
+Var ips : AnsiString;
+  nsarr : TNodeServerAddressArray;
+begin
+  inherited;
+  if FIsActivated then exit;
+  FIsActivated := true;
+  try
+    // Check OpenSSL dll
+    if Not LoadSSLCrypt then raise Exception.Create('Cannot load '+SSL_C_LIB+#10+'To use this software make sure this file is available on you system or reinstall the application');
+    TCrypto.InitCrypto;
+    // Read Wallet
+    Try
+      FWalletKeys.WalletFileName := TFolderHelper.GetPascalCoinDataFolder+PathDelim+'WalletKeys.dat';
+    Except
+      On E:Exception do begin
+        E.Message := 'Cannot open your wallet... Perhaps another instance of Pascal Coin is active!'+#10+#10+E.Message;
+        Raise;
+      end;
+    End;
+    ips := FAppParams.ParamByName[CT_PARAM_TryToConnectOnlyWithThisFixedServers].GetAsString('');
+    TNode.DecodeIpStringToNodeServerAddressArray(ips,nsarr);
+    TNetData.NetData.DiscoverFixedServersOnly(nsarr);
+    setlength(nsarr,0);
+    // Creating Node:
+    FNode := TNode.Node;
+    FNode.NetServer.Port := FAppParams.ParamByName[CT_PARAM_InternetServerPort].GetAsInteger(CT_NetServer_Port);
+    FNode.PeerCache := FAppParams.ParamByName[CT_PARAM_PeerCache].GetAsString('')+';'+CT_Discover_IPs;
+    // Create RPC server
+    FRPCServer := TRPCServer.Create;
+    FRPCServer.WalletKeys := WalletKeys;
+    FRPCServer.Active := FAppParams.ParamByName[CT_PARAM_JSONRPCEnabled].GetAsBoolean(false);
+    FRPCServer.ValidIPs := FAppParams.ParamByName[CT_PARAM_JSONRPCAllowedIPs].GetAsString('127.0.0.1');
+    WalletKeys.SafeBox := FNode.Bank.SafeBox;
+    // Check Database
+    FNode.Bank.StorageClass := TFileStorage;
+    TFileStorage(FNode.Bank.Storage).DatabaseFolder := TFolderHelper.GetPascalCoinDataFolder+PathDelim+'Data';
+    TFileStorage(FNode.Bank.Storage).Initialize;
+    // Init Grid
+    //FAccountsGrid.Node := FNode;
+    FSelectedAccountsGrid.Node := FNode;
+    FWalletKeys.OnChanged.Add( OnWalletChanged );
+    FAccountsGrid.Node := FNode;
+    FOperationsAccountGrid.Node := FNode;
+    // Reading database
+    TThreadActivate.Create(false).FreeOnTerminate := true;
+    FNodeNotifyEvents.Node := FNode;
+    // Init
+    TNetData.NetData.OnReceivedHelloMessage := OnReceivedHelloMessage;
+    TNetData.NetData.OnStatisticsChanged := OnNetStatisticsChanged;
+    TNetData.NetData.OnNetConnectionsUpdated := onNetConnectionsUpdated;
+    TNetData.NetData.OnNodeServersUpdated := OnNetNodeServersUpdated;
+    TNetData.NetData.OnBlackListUpdated := OnNetBlackListUpdated;
+    //
+    TimerUpdateStatus.Interval := 1000;
+    TimerUpdateStatus.Enabled := true;
+    UpdateConfigChanged;
+  Except
+    On E:Exception do begin
+      E.Message := 'An error occurred during initialization. Application cannot continue:'+#10+#10+E.Message+#10+#10+'Application will close...';
+      Application.MessageBox(PChar(E.Message),PChar(Application.Title),MB_ICONERROR+MB_OK);
+      Halt;
+    end;
+  end;
+  UpdatePrivateKeys;
+  UpdateAccounts(false);
+  if FAppParams.ParamByName[CT_PARAM_FirstTime].GetAsBoolean(true) then begin
+    FAppParams.ParamByName[CT_PARAM_FirstTime].SetAsBoolean(false);
+    miAboutPascalCoinClick(Nil);
+  end;
+
+end;
+
+procedure TFRMWallet.ApplicationEventsMinimize(Sender: TObject);
+begin
+  {$IFnDEF FPC}
+  Hide();
+  WindowState := wsMinimized;
+  TimerUpdateStatus.Enabled := false;
+  { Show the animated tray icon and also a hint balloon. }
+  TrayIcon.Visible := True;
+  TrayIcon.ShowBalloonHint;
+  {$ENDIF}
+end;
+
+procedure TFRMWallet.bbAccountsRefreshClick(Sender: TObject);
+begin
+  UpdateAccounts(true);
+end;
+
+procedure TFRMWallet.bbChangeKeyNameClick(Sender: TObject);
+var i : Integer;
+  name : String;
+begin
+  if (cbMyPrivateKeys.ItemIndex<0) then  exit;
+  i := PtrInt(cbMyPrivateKeys.Items.Objects[cbMyPrivateKeys.ItemIndex]);
+  if (i<0) Or (i>=FWalletKeys.Count) then raise Exception.Create('Must select a Key');
+  name := FWalletKeys.Key[i].Name;
+  if InputQuery('Change Key name','Input new name',name) then begin
+    FWalletKeys.SetName(i,name);
+  end;
+  UpdatePrivateKeys;
+end;
+
+procedure TFRMWallet.bbSelectedAccountsOperationClick(Sender: TObject);
+var l : TOrderedCardinalList;
+begin
+  CheckIsReady;
+  if FSelectedAccountsGrid.AccountsCount<=0 then raise Exception.Create('Must select at least 1 account');
+  With TFRMOperation.Create(Self) do
+  Try
+    l := FSelectedAccountsGrid.LockAccountsList;
+    try
+      SenderAccounts.CopyFrom(l);
+    finally
+      FSelectedAccountsGrid.UnlockAccountsList;
+    end;
+    DefaultFee := FAppParams.ParamByName[CT_PARAM_DefaultFee].GetAsInt64(0);
+    WalletKeys := FWalletKeys;
+    ShowModal;
+  Finally
+    Free;
+  End;
+end;
+
+procedure TFRMWallet.bbSendAMessageClick(Sender: TObject);
+Var basem,m : String;
+  them, errors : AnsiString;
+  i,n : Integer;
+  nc : TNetConnection;
+begin
+  CheckIsReady;
+  if (lbNetConnections.SelCount<=0) Or (lbNetConnections.ItemIndex<0) then raise Exception.Create('Select at least one connection');
+  if lbNetConnections.SelCount<=0 then n := 1
+  else n := lbNetConnections.SelCount;
+
+  basem := memoMessageToSend.Lines.Text;
+  m := '';
+  // Clear non valid characters:
+  for i := 1 to length(basem) do begin
+    if basem[i] in [#32..#127] then m := m + basem[i]
+    else m:=m+'.';
+  end;
+
+  if trim(m)='' then raise Exception.Create('No message');
+
+  if Application.MessageBox(PChaR('Send this message to '+inttostr(n)+' nodes?'+#10+
+    'NOTE: Sending unauthorized messages will be considered spam and you will be banned'+#10+
+    #10+
+    'Message: '+#10+
+    m),PChar(Application.Title),MB_ICONQUESTION+MB_YESNO+MB_DEFBUTTON1)<>IdYes then exit;
+  them := m;
+  if n>1 then begin
+    for i := 0 to lbNetConnections.Items.Count - 1 do begin
+      if lbNetConnections.Selected[i] then begin
+        nc := TNetConnection(lbNetconnections.Items.Objects[i]);
+        if TNetData.NetData.ConnectionExistsAndActive(nc) then begin
+          FNode.SendNodeMessage(nc,m,errors);
+          memoMessages.Lines.Add(DateTimeToStr(now)+' Sent to '+nc.ClientRemoteAddr+' > '+m);
+        end;
+      end;
+    end;
+  end else begin
+    nc := TNetConnection(lbNetconnections.Items.Objects[lbNetconnections.ItemIndex]);
+    if TNetData.NetData.ConnectionExistsAndActive(nc) then begin
+      FNode.SendNodeMessage(nc,m,errors);
+      memoMessages.Lines.Add(DateTimeToStr(now)+' Sent to '+nc.ClientRemoteAddr+' > '+m);
+    end;
+  end;
+
+  Application.MessageBox(PChaR('Message sent to '+inttostr(n)+' nodes'+#10+
+    'Message: '+#10+m),PChar(Application.Title),MB_ICONINFORMATION+MB_OK);
+end;
+
+procedure TFRMWallet.cbExploreMyAccountsClick(Sender: TObject);
+begin
+  cbMyPrivateKeys.Enabled := cbExploreMyAccounts.Checked;
+  UpdateAccounts(true);
+  UpdateOperations;
+end;
+
+procedure TFRMWallet.cbFilterAccountsClick(Sender: TObject);
+begin
+  If not DoUpdateAccountsFilter then UpdateAccounts(true);
+end;
+
+procedure TFRMWallet.cbMyPrivateKeysChange(Sender: TObject);
+begin
+  UpdateAccounts(true);
+end;
+
+procedure TFRMWallet.CheckIsReady;
+Var isready : AnsiString;
+begin
+  if Not Assigned(FNode) then Abort;
+
+  if Not FNode.IsReady(isready) then begin
+    Raise Exception.Create('You cannot do this operation now:'+#10+#10+isready);
+  end;
+end;
+
+procedure TFRMWallet.CM_NetConnectionUpdated(var Msg: TMessage);
+Const CT_BooleanToString : Array[Boolean] of String = ('False','True');
+Var i : integer;
+ NC : TNetConnection;
+ l : TList;
+ sClientApp, sLastConnTime : String;
+ strings, sNSC, sRS, sDisc : TStrings;
+ hh,nn,ss,ms : Word;
+begin
+  Try
+    if Not TNetData.NetData.NetConnections.TryLockList(100,l) then exit;
+    try
+      strings := memoNetConnections.Lines;
+      sNSC := TStringList.Create;
+      sRS := TStringList.Create;
+      sDisc := TStringList.Create;
+      strings.BeginUpdate;
+      Try
+        for i := 0 to l.Count - 1 do begin
+          NC := l[i];
+          If NC.Client.BytesReceived>0 then begin
+            sClientApp := '['+IntToStr(NC.NetProtocolVersion.protocol_version)+'-'+IntToStr(NC.NetProtocolVersion.protocol_available)+'] '+NC.ClientAppVersion;
+          end else begin
+            sClientApp := '(no data)';
+          end;
+
+          if NC.Connected then begin
+            if NC.Client.LastCommunicationTime>1000 then begin
+              DecodeTime(now - NC.Client.LastCommunicationTime,hh,nn,ss,ms);
+              if (hh=0) and (nn=0) And (ss<10) then begin
+                sLastConnTime := ' - Last comunication <10 sec.';
+              end else begin
+                sLastConnTime := Format(' - Last comunication %.2dm%.2ds',[(hh*60)+nn,ss]);
+              end;
+            end else begin
+              sLastConnTime := '';
+            end;
+            if NC is TNetServerClient then begin
+              sNSC.Add(Format('Client: IP:%s Block:%d Sent/Received:%d/%d Bytes - %s - Time offset %d - Active since %s %s',
+                [NC.ClientRemoteAddr,NC.RemoteOperationBlock.block,NC.Client.BytesSent,NC.Client.BytesReceived,sClientApp,NC.TimestampDiff,DateTimeElapsedTime(NC.CreatedTime),sLastConnTime]));
+            end else begin
+              if NC.IsMyselfServer then sNSC.Add(Format('MySelf IP:%s Sent/Received:%d/%d Bytes - %s - Time offset %d - Active since %s %s',
+                [NC.ClientRemoteAddr,NC.Client.BytesSent,NC.Client.BytesReceived,sClientApp,NC.TimestampDiff,DateTimeElapsedTime(NC.CreatedTime),sLastConnTime]))
+              else begin
+                sRS.Add(Format('Remote Server: IP:%s Block:%d Sent/Received:%d/%d Bytes - %s - Time offset %d - Active since %s %s',
+                [NC.ClientRemoteAddr,NC.RemoteOperationBlock.block,NC.Client.BytesSent,NC.Client.BytesReceived,sClientApp,NC.TimestampDiff,DateTimeElapsedTime(NC.CreatedTime),sLastConnTime]));
+              end;
+            end;
+          end else begin
+            if NC is TNetServerClient then begin
+              sDisc.Add(Format('Disconnected client: IP:%s - %s',[NC.ClientRemoteAddr,sClientApp]));
+            end else if NC.IsMyselfServer then begin
+              sDisc.Add(Format('Disconnected MySelf IP:%s - %s',[NC.ClientRemoteAddr,sClientApp]));
+            end else begin
+              sDisc.Add(Format('Disconnected Remote Server: IP:%s %s - %s',[NC.ClientRemoteAddr,CT_BooleanToString[NC.Connected],sClientApp]));
+            end;
+          end;
+        end;
+        strings.Clear;
+        strings.Add(Format('Connections Updated %s Clients:%d Servers:%d (valid servers:%d)',[DateTimeToStr(now),sNSC.Count,sRS.Count,TNetData.NetData.NetStatistics.ServersConnectionsWithResponse]));
+        strings.AddStrings(sRS);
+        strings.AddStrings(sNSC);
+        if sDisc.Count>0 then begin
+          strings.Add('');
+          strings.Add('Disconnected connections: '+Inttostr(sDisc.Count));
+          strings.AddStrings(sDisc);
+        end;
+      Finally
+        strings.EndUpdate;
+        sNSC.Free;
+        sRS.Free;
+        sDisc.Free;
+      End;
+      //CheckMining;
+    finally
+      TNetData.NetData.NetConnections.UnlockList;
+    end;
+  Finally
+    FMustProcessNetConnectionUpdated := false;
+  End;
+end;
+
+procedure TFRMWallet.CM_WalletChanged(var Msg: TMessage);
+begin
+  UpdatePrivateKeys;
+  FMustProcessWalletChanged := false;
+end;
+
+procedure TFRMWallet.dgAccountsClick(Sender: TObject);
+begin
+  UpdateOperations;
+end;
+
+procedure TFRMWallet.dgAccountsColumnMoved(Sender: TObject; FromIndex, ToIndex: Integer);
+begin
+  SaveAppParams;
+end;
+
+procedure TFRMWallet.dgAccountsFixedCellClick(Sender: TObject; ACol,
+  ARow: Integer);
+begin
+  SaveAppParams;
+end;
+
+procedure TFRMWallet.DoUpdateAccounts;
+begin
+  UpdateAccounts(true);
+end;
+
+function TFRMWallet.DoUpdateAccountsFilter: Boolean;
+Var m,bmin,bmax:Int64;
+  doupd : Boolean;
+begin
+  if FUpdating then exit;
+  FUpdating := true;
+  Try
+    If Not TAccountComp.TxtToMoney(ebFilterAccountByBalanceMin.Text,bmin) then bmin := 0;
+    If not TAccountComp.TxtToMoney(ebFilterAccountByBalanceMax.Text,bmax) then bmax := CT_MaxWalletAmount;
+    if (bmax<bmin) or (bmax=0) then bmax := CT_MaxWalletAmount;
+    if bmin>bmax then bmin := 0;
+    doupd := (bmin<>FMinAccountBalance) Or (bmax<>FMaxAccountBalance);
+    FMinAccountBalance := bmin;
+    FMaxAccountBalance := bmax;
+    if bmin>0 then
+      ebFilterAccountByBalanceMin.Text:=TAccountComp.FormatMoney(bmin)
+    else ebFilterAccountByBalanceMin.Text := '';
+    if bmax<CT_MaxWalletAmount then
+      ebFilterAccountByBalanceMax.Text := TAccountComp.FormatMoney(bmax)
+    else ebFilterAccountByBalanceMax.Text := '';
+    if cbFilterAccounts.Checked then begin
+      ebFilterAccountByBalanceMin.ParentFont := true;
+      ebFilterAccountByBalanceMax.ParentFont := true;
+    end else begin
+      ebFilterAccountByBalanceMin.font.Color := clDkGray;
+      ebFilterAccountByBalanceMax.font.Color := clDkGray;
+    end;
+  Finally
+    FUpdating := false;
+  End;
+  if doupd then UpdateAccounts(true);
+  Result := doupd;
+end;
+
+procedure TFRMWallet.ebBlockChainBlockStartExit(Sender: TObject);
+var bstart,bend : Int64;
+begin
+  If FUpdating then exit;
+  FUpdating := True;
+  Try
+    bstart := StrToInt64Def(ebBlockChainBlockStart.Text,-1);
+    bend := StrToInt64Def(ebBlockChainBlockEnd.Text,-1);
+    FBlockChainGrid.SetBlocks(bstart,bend);
+    if FBlockChainGrid.BlockStart>=0 then ebBlockChainBlockStart.Text := Inttostr(FBlockChainGrid.BlockStart) else ebBlockChainBlockStart.Text := '';
+    if FBlockChainGrid.BlockEnd>=0 then ebBlockChainBlockEnd.Text := Inttostr(FBlockChainGrid.BlockEnd) else ebBlockChainBlockEnd.Text := '';
+  Finally
+    FUpdating := false;
+  End;
+end;
+
+procedure TFRMWallet.ebBlockChainBlockStartKeyPress(Sender: TObject;
+  var Key: Char);
+begin
+  if key=#13 then  ebBlockChainBlockStartExit(Nil);
+end;
+
+procedure TFRMWallet.ebFilterAccountByBalanceMinExit(Sender: TObject);
+begin
+  DoUpdateAccountsFilter;
+end;
+
+procedure TFRMWallet.ebFilterAccountByBalanceMinKeyPress(Sender: TObject;
+  var Key: Char);
+begin
+  if key=#13 then DoUpdateAccountsFilter;
+end;
+
+procedure TFRMWallet.ebFilterOperationsAccountExit(Sender: TObject);
+Var bstart,bend : Int64;
+begin
+  If FUpdating then exit;
+  FUpdating := True;
+  Try
+    bstart := StrToInt64Def(ebFilterOperationsStartBlock.Text,-1);
+    if bstart>=0 then ebFilterOperationsStartBlock.Text := Inttostr(bstart) else ebFilterOperationsStartBlock.Text := '';
+    bend := StrToInt64Def(ebFilterOperationsEndBlock.Text,-1);
+    if bend>=0 then ebFilterOperationsEndBlock.Text := Inttostr(bend) else ebFilterOperationsEndBlock.Text := '';
+    FOperationsExplorerGrid.SetBlocks(bstart,bend);
+  Finally
+    FUpdating := false;
+  End;
+end;
+
+procedure TFRMWallet.ebFilterOperationsAccountKeyPress(Sender: TObject;
+  var Key: Char);
+begin
+  if key=#13 then  ebFilterOperationsAccountExit(Nil);
+end;
+
+procedure TFRMWallet.ebFindAccountNumberChange(Sender: TObject);
+Var an : Cardinal;
+begin
+  if Trim(ebFindAccountNumber.Text)='' then begin
+    ebFindAccountNumber.Color := clWindow;
+    ebFindAccountNumber.Font.Color := clDkGray;
+  end else if TAccountComp.AccountTxtNumberToAccountNumber(ebFindAccountNumber.Text,an) then begin
+    ebFindAccountNumber.Color := clWindow;
+    if FAccountsGrid.MoveRowToAccount(an) then begin
+      ebFindAccountNumber.Font.Color := clWindowText;
+    end else begin
+      ebFindAccountNumber.Font.Color := clRed;
+    end;
+  end else begin
+    // Invalid value
+    ebFindAccountNumber.Color := clRed;
+    ebFindAccountNumber.Font.Color := clWindowText;
+  end;
+end;
+
+procedure TFRMWallet.ebFindAccountNumberExit(Sender: TObject);
+begin
+  ebFindAccountNumber.Text := '';
+end;
+
+procedure TFRMWallet.FinishedLoadingApp;
+begin
+  FPoolMiningServer := TPoolMiningServer.Create;
+  FPoolMiningServer.Port := FAppParams.ParamByName[CT_PARAM_JSONRPCMinerServerPort].GetAsInteger(CT_JSONRPCMinerServer_Port);
+  FPoolMiningServer.MinerAccountKey := GetAccountKeyForMiner;
+  FPoolMiningServer.MinerPayload := FAppParams.ParamByName[CT_PARAM_MinerName].GetAsString('');
+  FNode.Operations.AccountKey := GetAccountKeyForMiner;
+  FPoolMiningServer.Active := FAppParams.ParamByName[CT_PARAM_JSONRPCMinerServerActive].GetAsBoolean(true);
+  FPoolMiningServer.OnMiningServerNewBlockFound := OnMiningServerNewBlockFound;
+  If Assigned(FBackgroundPanel) then begin
+    FreeAndNil(FBackgroundPanel);
+  end;
+  PageControl.Visible:=True;
+  PageControl.Enabled:=True;
+end;
+
+procedure TFRMWallet.FillAccountInformation(const Strings: TStrings; Const AccountNumber: Cardinal);
+Var account : TAccount;
+  s : String;
+begin
+  if AccountNumber<0 then exit;
+  account := FNode.Operations.SafeBoxTransaction.Account(AccountNumber);
+  if account.name<>'' then s:='Name: '+account.name
+  else s:='';
+  Strings.Add(Format('Account: %s %s Type:%d',[TAccountComp.AccountNumberToAccountTxtNumber(AccountNumber),s,account.account_type]));
+  Strings.Add('');
+  Strings.Add(Format('Current balance: %s',[TAccountComp.FormatMoney(account.balance)]));
+  Strings.Add('');
+  Strings.Add(Format('Updated on block: %d  (%d blocks ago)',[account.updated_block,FNode.Bank.BlocksCount-account.updated_block]));
+  Strings.Add(Format('Public key type: %s',[TAccountComp.GetECInfoTxt(account.accountInfo.accountKey.EC_OpenSSL_NID)]));
+  Strings.Add(Format('Base58 Public key: %s',[TAccountComp.AccountPublicKeyExport(account.accountInfo.accountKey)]));
+  if TAccountComp.IsAccountForSale(account.accountInfo) then begin
+    Strings.Add('');
+    Strings.Add('** Account is for sale: **');
+    Strings.Add(Format('Price: %s',[TAccountComp.FormatMoney(account.accountInfo.price)]));
+    Strings.Add(Format('Seller account (where to pay): %s',[TAccountComp.AccountNumberToAccountTxtNumber(account.accountInfo.account_to_pay)]));
+    if TAccountComp.IsAccountForSaleAcceptingTransactions(account.accountInfo) then begin
+      Strings.Add('');
+      Strings.Add('** Private sale **');
+      Strings.Add(Format('New Base58 Public key: %s',[TAccountComp.AccountPublicKeyExport(account.accountInfo.new_publicKey)]));
+      Strings.Add('');
+      if TAccountComp.IsAccountLocked(account.accountInfo,FNode.Bank.BlocksCount) then begin
+        Strings.Add(Format('PURCHASE IS SECURE UNTIL BLOCK %d (current %d, remains %d)',
+          [account.accountInfo.locked_until_block,FNode.Bank.BlocksCount,account.accountInfo.locked_until_block-FNode.Bank.BlocksCount]));
+      end else begin
+        Strings.Add(Format('PURCHASE IS NOT SECURE (Expired on block %d, current %d)',
+          [account.accountInfo.locked_until_block,FNode.Bank.BlocksCount]));
+      end;
+    end;
+  end;
+end;
+
+procedure TFRMWallet.FillOperationInformation(const Strings: TStrings; Const OperationResume: TOperationResume);
+begin
+  If (not OperationResume.valid) then exit;
+  If OperationResume.Block<FNode.Bank.BlocksCount then
+    if (OperationResume.NOpInsideBlock>=0) then begin
+      Strings.Add(Format('Block: %d/%d',[OperationResume.Block,OperationResume.NOpInsideBlock]))
+    end else begin
+      Strings.Add(Format('Block: %d',[OperationResume.Block]))
+    end
+  else Strings.Add('** Pending operation not included on blockchain **');
+  Strings.Add(Format('%s',[OperationResume.OperationTxt]));
+  Strings.Add(Format('OpType:%d Subtype:%d',[OperationResume.OpType,OperationResume.OpSubtype]));
+  Strings.Add(Format('Operation Hash (ophash): %s',[TCrypto.ToHexaString(OperationResume.OperationHash)]));
+  If (OperationResume.OperationHash_OLD<>'') then begin
+    Strings.Add(Format('Old Operation Hash (old_ophash): %s',[TCrypto.ToHexaString(OperationResume.OperationHash_OLD)]));
+  end;
+  if (OperationResume.OriginalPayload<>'') then begin
+    Strings.Add(Format('Payload length:%d',[length(OperationResume.OriginalPayload)]));
+    If OperationResume.PrintablePayload<>'' then begin
+      Strings.Add(Format('Payload (human): %s',[OperationResume.PrintablePayload]));
+    end;
+    Strings.Add(Format('Payload (Hexadecimal): %s',[TCrypto.ToHexaString(OperationResume.OriginalPayload)]));
+  end;
+  If OperationResume.Balance>=0 then begin
+    Strings.Add(Format('Final balance: %s',[TAccountComp.FormatMoney(OperationResume.Balance)]));
+  end;
+end;
+
+function TFRMWallet.ForceMining: Boolean;
+begin
+  Result := false;
+end;
+
+procedure TFRMWallet.FormCreate(Sender: TObject);
+Var i : Integer;
+begin
+  FLastNodesCacheUpdatedTS := Now;
+  FBackgroundPanel := Nil;
+  FMustProcessWalletChanged := false;
+  FMustProcessNetConnectionUpdated := false;
+  FRPCServer := Nil;
+  FNode := Nil;
+  FPoolMiningServer := Nil;
+  FMinAccountBalance := 0;
+  FMaxAccountBalance := CT_MaxWalletAmount;
+  FMessagesUnreadCount := 0;
+  lblReceivedMessages.Visible := false;
+  memoNetConnections.Lines.Clear;
+  memoNetServers.Lines.Clear;
+  memoNetBlackLists.Lines.Clear;
+  memoMessages.Lines.Clear;
+  memoMessageToSend.Lines.Clear;
+  FUpdating := false;
+  FOrderedAccountsKeyList := Nil;
+  TimerUpdateStatus.Enabled := false;
+  FIsActivated := false;
+  FWalletKeys := TWalletKeysExt.Create(Self);
+  for i := 0 to StatusBar.Panels.Count - 1 do begin
+    StatusBar.Panels[i].Text := '';
+  end;
+  FLog := TLog.Create(Self);
+  FLog.OnNewLog := OnNewLog;
+  FLog.SaveTypes := [];
+  If Not ForceDirectories(TFolderHelper.GetPascalCoinDataFolder) then raise Exception.Create('Cannot create dir: '+TFolderHelper.GetPascalCoinDataFolder);
+  FAppParams := TAppParams.Create(self);
+  FAppParams.FileName := TFolderHelper.GetPascalCoinDataFolder+PathDelim+'AppParams.prm';
+  FNodeNotifyEvents := TNodeNotifyEvents.Create(Self);
+  FNodeNotifyEvents.OnBlocksChanged := OnNewAccount;
+  FNodeNotifyEvents.OnNodeMessageEvent := OnNodeMessageEvent;
+  FAccountsGrid := TAccountsGrid.Create(Self);
+  FAccountsGrid.DrawGrid := dgAccounts;
+  FAccountsGrid.AllowMultiSelect := True;
+  FSelectedAccountsGrid := TAccountsGrid.Create(Self);
+  FSelectedAccountsGrid.DrawGrid := dgSelectedAccounts;
+  FSelectedAccountsGrid.OnUpdated := OnSelectedAccountsGridUpdated;
+  FOperationsAccountGrid := TOperationsGrid.Create(Self);
+  FOperationsAccountGrid.DrawGrid := dgAccountOperations;
+  FOperationsAccountGrid.MustShowAlwaysAnAccount := true;
+  FPendingOperationsGrid := TOperationsGrid.Create(Self);
+  FPendingOperationsGrid.DrawGrid := dgPendingOperations;
+  FPendingOperationsGrid.AccountNumber := -1; // all
+  FPendingOperationsGrid.PendingOperations := true;
+  FOperationsExplorerGrid := TOperationsGrid.Create(Self);
+  FOperationsExplorerGrid.DrawGrid := dgOperationsExplorer;
+  FOperationsExplorerGrid.AccountNumber := -1;
+  FOperationsExplorerGrid.PendingOperations := False;
+  FBlockChainGrid := TBlockChainGrid.Create(Self);
+  FBlockChainGrid.DrawGrid := dgBlockChainExplorer;
+  // FWalletKeys.OnChanged.Add( OnWalletChanged );
+  LoadAppParams;
+  UpdatePrivateKeys;
+  UpdateBlockChainState;
+  UpdateConnectionStatus;
+  PageControl.ActivePage := tsMyAccounts;
+  pcAccountsOptions.ActivePage := tsAccountOperations;
+  ebFilterOperationsStartBlock.Text := '';
+  ebFilterOperationsEndBlock.Text := '';
+  cbExploreMyAccountsClick(nil);
+
+  TrayIcon.Visible := true;
+  TrayIcon.Hint := Self.Caption;
+  TrayIcon.BalloonTitle := 'Restoring the window.';
+  TrayIcon.BalloonHint :=
+    'Double click the system tray icon to restore Pascal Coin';
+  TrayIcon.BalloonFlags := bfInfo;
+  MinersBlocksFound := 0;
+  lblBuild.Caption := 'Build: '+CT_ClientAppVersion;
+  {$IFDEF TESTNET}
+  Image1.visible := false;
+  {$ENDIF}
+  PageControl.Enabled := False;
+  PageControl.Visible := False;
+  FBackgroundPanel := TPanel.Create(Self);
+  FBackgroundPanel.Parent:=Self;
+  FBackgroundPanel.Align:=alClient;
+  FBackgroundPanel.Font.Size:=15;
+end;
+
+procedure TFRMWallet.FormDestroy(Sender: TObject);
+Var i : Integer;
+  step : String;
+begin
+  TLog.NewLog(ltinfo,Classname,'Destroying form - START');
+  Try
+  FreeAndNil(FRPCServer);
+  FreeAndNil(FPoolMiningServer);
+  step := 'Saving params';
+  SaveAppParams;
+  FreeAndNil(FAppParams);
+  //
+  step := 'Assigning nil events';
+  FLog.OnNewLog :=Nil;
+  FNodeNotifyEvents.Node := Nil;
+  FOperationsAccountGrid.Node := Nil;
+  FOperationsExplorerGrid.Node := Nil;
+  FPendingOperationsGrid.Node := Nil;
+  FAccountsGrid.Node := Nil;
+  FSelectedAccountsGrid.Node := Nil;
+  TNetData.NetData.OnReceivedHelloMessage := Nil;
+  TNetData.NetData.OnStatisticsChanged := Nil;
+  TNetData.NetData.OnNetConnectionsUpdated := Nil;
+  TNetData.NetData.OnNodeServersUpdated := Nil;
+  TNetData.NetData.OnBlackListUpdated := Nil;
+  //
+
+  step := 'Destroying NodeNotifyEvents';
+  FreeAndNil(FNodeNotifyEvents);
+  //
+  step := 'Assigning Nil to TNetData';
+  TNetData.NetData.OnReceivedHelloMessage := Nil;
+  TNetData.NetData.OnStatisticsChanged := Nil;
+
+  step := 'Destroying grids operators';
+  FreeAndNil(FOperationsAccountGrid);
+  FreeAndNil(FOperationsExplorerGrid);
+  FreeAndNil(FBlockChainGrid);
+
+  step := 'Ordered Accounts Key list';
+  FreeAndNil(FOrderedAccountsKeyList);
+
+  step := 'Desactivating Node';
+  TNode.Node.NetServer.Active := false;
+  FNode := Nil;
+
+  TNetData.NetData.Free;
+
+  step := 'Processing messages 1';
+  Application.ProcessMessages;
+
+  step := 'Destroying Node';
+  TNode.Node.Free;
+
+  step := 'Destroying Wallet';
+  FreeAndNil(FWalletKeys);
+  step := 'Processing messages 2';
+  Application.ProcessMessages;
+  step := 'Destroying stringslist';
+  Except
+    On E:Exception do begin
+      TLog.NewLog(lterror,Classname,'Error destroying Form step: '+step+' Errors ('+E.ClassName+'): ' +E.Message);
+    end;
+  End;
+  TLog.NewLog(ltinfo,Classname,'Destroying form - END');
+  FreeAndNil(FLog);
+  Sleep(100);
+end;
+
+procedure TFRMWallet.sbSearchAccountClick(Sender: TObject);
+Var F : TFRMAccountSelect;
+begin
+  F := TFRMAccountSelect.Create(Self);
+  try
+    F.Node := FNode;
+    F.WalletKeys := FWalletKeys;
+    F.ShowModal;
+  finally
+    F.Free;
+  end;
+end;
+
+function TFRMWallet.GetAccountKeyForMiner: TAccountKey;
+Var PK : TECPrivateKey;
+  i : Integer;
+  PublicK : TECDSA_Public;
+begin
+  Result := CT_TECDSA_Public_Nul;
+  if Not Assigned(FWalletKeys) then exit;
+  if Not Assigned(FAppParams) then exit;
+  case FMinerPrivateKeyType of
+    mpk_NewEachTime: PublicK := CT_TECDSA_Public_Nul;
+    mpk_Selected: begin
+      PublicK := TAccountComp.RawString2Accountkey(FAppParams.ParamByName[CT_PARAM_MinerPrivateKeySelectedPublicKey].GetAsString(''));
+    end;
+  else
+    // Random
+    PublicK := CT_TECDSA_Public_Nul;
+    if FWalletKeys.Count>0 then PublicK := FWalletKeys.Key[Random(FWalletKeys.Count)].AccountKey;
+  end;
+  i := FWalletKeys.IndexOfAccountKey(PublicK);
+  if i>=0 then begin
+    if (FWalletKeys.Key[i].CryptedKey='') then i:=-1;
+  end;
+  if i<0 then begin
+    PK := TECPrivateKey.Create;
+    try
+      PK.GenerateRandomPrivateKey(CT_Default_EC_OpenSSL_NID);
+      FWalletKeys.AddPrivateKey('New for miner '+DateTimeToStr(Now), PK);
+      PublicK := PK.PublicKey;
+    finally
+      PK.Free;
+    end;
+  end;
+  Result := PublicK;
+end;
+
+procedure TFRMWallet.IPnodes1Click(Sender: TObject);
+Var FRM : TFRMNodesIp;
+begin
+  FRM := TFRMNodesIp.Create(Self);
+  Try
+    FRM.AppParams := FAppParams;
+    FRM.ShowModal;
+  Finally
+    FRM.Free;
+  End;
+end;
+
+procedure TFRMWallet.lblReceivedMessagesClick(Sender: TObject);
+begin
+  PageControl.ActivePage := tsMessages;
+end;
+
+procedure TFRMWallet.LoadAppParams;
+Var ms : TMemoryStream;
+  s : AnsiString;
+  fvi : TFileVersionInfo;
+begin
+  ms := TMemoryStream.Create;
+  Try
+    s := FAppParams.ParamByName[CT_PARAM_GridAccountsStream].GetAsString('');
+    ms.WriteBuffer(s[1],length(s));
+    ms.Position := 0;
+    // Disabled on V2: FAccountsGrid.LoadFromStream(ms);
+  Finally
+    ms.Free;
+  End;
+  If FAppParams.FindParam(CT_PARAM_MinerName)=Nil then begin
+    // New configuration... assigning a new random value
+    fvi := TFolderHelper.GetTFileVersionInfo(Application.ExeName);
+    FAppParams.ParamByName[CT_PARAM_MinerName].SetAsString('New Node '+DateTimeToStr(Now)+' - '+
+      fvi.InternalName+' Build:'+fvi.FileVersion);
+  end;
+  FBlockChainGrid.ShowTimeAverageColumns:={$IFDEF SHOW_AVERAGE_TIME_STATS}True;{$ELSE}False;{$ENDIF}
+  UpdateConfigChanged;
+end;
+
+procedure TFRMWallet.miAboutPascalCoinClick(Sender: TObject);
+begin
+  With TFRMAbout.Create(Self) do
+  try
+    showmodal;
+  finally
+    free;
+  end;
+end;
+
+procedure TFRMWallet.MiAccountInformationClick(Sender: TObject);
+Var F : TFRMMemoText;
+  accn : Int64;
+  s,title : String;
+  account : TAccount;
+  strings : TStrings;
+  i : Integer;
+  opr : TOperationResume;
+begin
+  accn := -1;
+  title := '';
+  strings := TStringList.Create;
+  try
+    opr := CT_TOperationResume_NUL;
+    if PageControl.ActivePage=tsOperations then begin
+      i := FOperationsExplorerGrid.DrawGrid.Row;
+      if (i>0) and (i<=FOperationsExplorerGrid.OperationsResume.Count) then begin
+        opr := FOperationsExplorerGrid.OperationsResume.OperationResume[i-1];
+      end;
+    end else if PageControl.ActivePage=tsPendingOperations then begin
+      i := FPendingOperationsGrid.DrawGrid.Row;
+      if (i>0) and (i<=FPendingOperationsGrid.OperationsResume.Count) then begin
+        opr := FPendingOperationsGrid.OperationsResume.OperationResume[i-1];
+      end;
+    end else if PageControl.ActivePage=tsMyAccounts then begin
+      accn := FAccountsGrid.AccountNumber(dgAccounts.Row);
+      if accn<0 then raise Exception.Create('Select an account');
+      FillAccountInformation(strings,accn);
+      title := 'Account '+TAccountComp.AccountNumberToAccountTxtNumber(accn)+' info';
+      i := FOperationsAccountGrid.DrawGrid.Row;
+      if (i>0) and (i<=FOperationsAccountGrid.OperationsResume.Count) then begin
+        opr := FOperationsAccountGrid.OperationsResume.OperationResume[i-1];
+      end;
+    end;
+    If (opr.valid) then begin
+      if accn>=0 then strings.Add('')
+      else title := 'Operation info';
+      strings.Add('Operation info:');
+      FillOperationInformation(strings,opr);
+    end else if accn<0 then Raise Exception.Create('No info available');
+    F := TFRMMemoText.Create(Self);
+    Try
+      F.Caption := title;
+      F.Memo.Lines.Assign(strings);
+      F.ShowModal;
+    Finally
+      F.Free;
+    End;
+  finally
+    strings.free;
+  end;
+end;
+
+procedure TFRMWallet.MiAddaccounttoSelectedClick(Sender: TObject);
+begin
+  PageControl.ActivePage := tsMyAccounts;
+  PageControlChange(Nil);
+  pcAccountsOptions.ActivePage := tsMultiSelectAccounts;
+  sbSelectedAccountsAddClick(Sender);
+end;
+
+procedure TFRMWallet.MiCloseClick(Sender: TObject);
+begin
+  Close;
+end;
+
+procedure TFRMWallet.MiDecodePayloadClick(Sender: TObject);
+begin
+  if PageControl.ActivePage=tsOperations then begin
+    FOperationsExplorerGrid.ShowModalDecoder(FWalletKeys,FAppParams);
+  end else if PageControl.ActivePage=tsPendingOperations then begin
+    FPendingOperationsGrid.ShowModalDecoder(FWalletKeys,FAppParams);
+  end else if PageControl.ActivePage=tsMyAccounts then begin
+    FOperationsAccountGrid.ShowModalDecoder(FWalletKeys,FAppParams);
+  end;
+end;
+
+procedure TFRMWallet.MiFindaccountClick(Sender: TObject);
+begin
+  PageControl.ActivePage := tsMyAccounts;
+  PageControlChange(Nil);
+  ebFindAccountNumber.SetFocus;
+end;
+
+procedure TFRMWallet.MiFindnextaccountwithhighbalanceClick(Sender: TObject);
+Var an  : Cardinal;
+  an64 : Int64;
+  start : TAccount;
+begin
+  PageControl.ActivePage := tsMyAccounts;
+  PageControlChange(Nil);
+  an64 := FAccountsGrid.AccountNumber(dgAccounts.Row);
+  if an64<0 then an := 0
+  else an := an64;
+  If an>=FNode.Bank.SafeBox.AccountsCount then exit;
+  start := FNode.Bank.SafeBox.Account(an);
+  while (an<FNode.Bank.SafeBox.AccountsCount)  do begin
+    if FNode.Bank.SafeBox.Account(an).balance>start.balance then break
+    else inc(an);
+  end;
+  if (an<FNode.Bank.SafeBox.AccountsCount) then FAccountsGrid.MoveRowToAccount(an)
+  else raise Exception.Create('Not found any account higher than '+TAccountComp.AccountNumberToAccountTxtNumber(start.account)+' with balance higher than '+
+    TAccountComp.FormatMoney(start.balance));
+end;
+
+procedure TFRMWallet.MiFindOperationbyOpHashClick(Sender: TObject);
+Var FRM : TFRMPayloadDecoder;
+  oph : String;
+begin
+  oph := '';
+  if Not InputQuery('Search operation by OpHash','Insert Operation Hash value (OpHash)',oph) then exit;
+  //
+  FRM := TFRMPayloadDecoder.Create(Self);
+  try
+    FRM.Init(CT_TOperationResume_NUL,WalletKeys,FAppParams);
+    FRM.DoFind(oph);
+    FRM.ShowModal;
+  finally
+    FRM.Free;
+  end;
+end;
+
+procedure TFRMWallet.MiFindpreviousaccountwithhighbalanceClick(Sender: TObject);
+Var an  : Cardinal;
+  an64 : Int64;
+  start : TAccount;
+begin
+  PageControl.ActivePage := tsMyAccounts;
+  PageControlChange(Nil);
+  an64 := FAccountsGrid.AccountNumber(dgAccounts.Row);
+  if an64<0 then an := FNode.Bank.SafeBox.AccountsCount-1
+  else an := an64;
+  If an>=FNode.Bank.SafeBox.AccountsCount then exit;
+  start := FNode.Bank.SafeBox.Account(an);
+  while (an>0)  do begin
+    if FNode.Bank.SafeBox.Account(an).balance>start.balance then break
+    else dec(an);
+  end;
+  if (FNode.Bank.SafeBox.Account(an).balance>start.balance) then FAccountsGrid.MoveRowToAccount(an)
+  else raise Exception.Create('Not found any account lower than '+TAccountComp.AccountNumberToAccountTxtNumber(start.account)+' with balance higher than '+
+    TAccountComp.FormatMoney(start.balance));
+end;
+
+procedure TFRMWallet.MiMultiaccountoperationClick(Sender: TObject);
+begin
+  PageControl.ActivePage := tsMyAccounts;
+  pcAccountsOptions.ActivePage := tsMultiSelectAccounts;
+  bbSelectedAccountsOperationClick(Sender);
+end;
+
+procedure TFRMWallet.miNewOperationClick(Sender: TObject);
+var l : TOrderedCardinalList;
+begin
+  CheckIsReady;
+  With TFRMOperation.Create(Self) do
+  Try
+    l := TOrderedCardinalList.Create;
+    try
+      If FAccountsGrid.SelectedAccounts(l)<1 then raise Exception.Create('No row selected');
+      SenderAccounts.CopyFrom(l);
+    finally
+      l.Free;
+    end;
+    DefaultFee := FAppParams.ParamByName[CT_PARAM_DefaultFee].GetAsInt64(0);
+    WalletKeys := FWalletKeys;
+    ShowModal;
+  Finally
+    Free;
+  End;
+end;
+
+procedure TFRMWallet.miOptionsClick(Sender: TObject);
+begin
+  With TFRMPascalCoinWalletConfig.Create(Self) do
+  try
+    AppParams := Self.FAppParams;
+    WalletKeys := Self.FWalletKeys;
+    if ShowModal=MrOk then begin
+      SaveAppParams;
+      UpdateConfigChanged;
+    end;
+  finally
+    free;
+  end;
+end;
+
+procedure TFRMWallet.miPrivatekeysClick(Sender: TObject);
+Var FRM : TFRMWalletKeys;
+begin
+  FRM := TFRMWalletKeys.Create(Self);
+  Try
+    FRM.WalletKeys := FWalletKeys;
+    FRM.ShowModal;
+    UpdatePrivateKeys;
+  Finally
+    FRM.Free;
+  End;
+end;
+
+procedure TFRMWallet.MiRemoveaccountfromselectedClick(Sender: TObject);
+begin
+  PageControl.ActivePage := tsMyAccounts;
+  PageControlChange(Nil);
+  pcAccountsOptions.ActivePage := tsMultiSelectAccounts;
+  sbSelectedAccountsDelClick(Sender);
+end;
+
+procedure TFRMWallet.OnMiningServerNewBlockFound(Sender: TObject);
+begin
+  FPoolMiningServer.MinerAccountKey := GetAccountKeyForMiner;
+end;
+
+procedure TFRMWallet.OnNetBlackListUpdated(Sender: TObject);
+Const CT_TRUE_FALSE : Array[Boolean] Of AnsiString = ('FALSE','TRUE');
+Var i,j,n : integer;
+ P : PNodeServerAddress;
+ l : TList;
+ strings : TStrings;
+begin
+  l := TNetData.NetData.NodeServersAddresses.LockList;
+  try
+    strings := memoNetBlackLists.Lines;
+    strings.BeginUpdate;
+    Try
+      strings.Clear;
+      strings.Add('BlackList Updated: '+DateTimeToStr(now)+' by TID:'+IntToHex(PtrInt(TThread.CurrentThread.ThreadID),8));
+      j := 0; n:=0;
+      for i := 0 to l.Count - 1 do begin
+        P := l[i];
+        if (P^.is_blacklisted) then begin
+          inc(n);
+          if Not P^.its_myself then begin
+            inc(j);
+            strings.Add(Format('Blacklist IP:%s:%d LastConnection:%s Reason: %s',
+              [
+               P^.ip,P^.port,
+               DateTimeToStr(UnivDateTime2LocalDateTime( UnixToUnivDateTime(P^.last_connection))),P^.BlackListText]));
+          end;
+        end;
+      end;
+      Strings.Add(Format('Total Blacklisted IPs: %d (Total %d)',[j,n]));
+    Finally
+      strings.EndUpdate;
+    End;
+  finally
+    TNetData.NetData.NodeServersAddresses.UnlockList;
+  end;
+end;
+
+procedure TFRMWallet.OnNetConnectionsUpdated(Sender: TObject);
+begin
+  if FMustProcessNetConnectionUpdated then exit;
+  FMustProcessNetConnectionUpdated := true;
+  PostMessage(Self.Handle,CM_PC_NetConnectionUpdated,0,0);
+end;
+
+procedure TFRMWallet.OnNetNodeServersUpdated(Sender: TObject);
+Var i : integer;
+ P : PNodeServerAddress;
+ l : TList;
+ strings : TStrings;
+ s : String;
+begin
+  l := TNetData.NetData.NodeServersAddresses.LockList;
+  try
+    strings := memoNetServers.Lines;
+    strings.BeginUpdate;
+    Try
+      strings.Clear;
+      strings.Add('NodeServers Updated: '+DateTimeToStr(now) +' Count: '+inttostr(l.Count));
+      for i := 0 to l.Count - 1 do begin
+        P := l[i];
+        if Not (P^.is_blacklisted) then begin
+          s := Format('Server IP:%s:%d',[P^.ip,P^.port]);
+          if (P^.last_connection_by_me>0) then begin
+            s := s + ' [Server] ';
+          end;
+
+          if Assigned(P.netConnection) then begin
+            If P.last_connection>0 then  s := s+ ' ** ACTIVE **'
+            else s := s+' ** TRYING TO CONNECT **';
+          end;
+          if P.its_myself then begin
+            s := s+' ** NOT VALID ** '+P.BlackListText;
+          end;
+          if P.last_connection>0 then begin
+            s := s + ' Last connection: '+DateTimeToStr(UnivDateTime2LocalDateTime( UnixToUnivDateTime(P^.last_connection)));
+          end;
+          if P.last_connection_by_server>0 then begin
+            s := s + ' Last server connection: '+DateTimeToStr(UnivDateTime2LocalDateTime( UnixToUnivDateTime(P^.last_connection_by_server)));
+          end;
+          if (P.last_attempt_to_connect>0) then begin
+            s := s + ' Last attempt to connect: '+DateTimeToStr(P^.last_attempt_to_connect);
+          end;
+          if (P.total_failed_attemps_to_connect>0) then begin
+            s := s + ' (Attempts: '+inttostr(P^.total_failed_attemps_to_connect)+')';
+          end;
+
+          strings.Add(s);
+        end;
+      end;
+    Finally
+      strings.EndUpdate;
+    End;
+  finally
+    TNetData.NetData.NodeServersAddresses.UnlockList;
+  end;
+end;
+
+procedure TFRMWallet.OnNetStatisticsChanged(Sender: TObject);
+Var NS : TNetStatistics;
+begin
+  //CheckMining;
+  if Assigned(FNode) then begin
+    If FNode.NetServer.Active then begin
+      StatusBar.Panels[0].Text := 'Active (Port '+Inttostr(FNode.NetServer.Port)+')';
+    end else StatusBar.Panels[0].Text := 'Server stopped';
+    NS := TNetData.NetData.NetStatistics;
+    StatusBar.Panels[1].Text := Format('Connections:%d Clients:%d Servers:%d - Rcvd:%d Kb Send:%d Kb',
+      [NS.ActiveConnections,NS.ClientsConnections,NS.ServersConnections,NS.BytesReceived DIV 1024,NS.BytesSend DIV 1024]);
+  end else begin
+    StatusBar.Panels[0].Text := '';
+    StatusBar.Panels[1].Text := '';
+  end;
+end;
+
+procedure TFRMWallet.OnNewAccount(Sender: TObject);
+begin
+  Try
+    UpdateAccounts(false);
+    UpdateBlockChainState;
+  Except
+    On E:Exception do begin
+      E.Message := 'Error at OnNewAccount '+E.Message;
+      Raise;
+    end;
+  end;
+end;
+
+procedure TFRMWallet.OnNewLog(logtype: TLogType; Time : TDateTime; ThreadID : TThreadID; const sender,logtext: AnsiString);
+Var s : AnsiString;
+begin
+  if (logtype=ltdebug) And (Not cbShowDebugLogs.Checked) then exit;
+  if ThreadID=MainThreadID then s := ' MAIN:' else s:=' TID:';
+  if MemoLogs.Lines.Count>300 then begin
+    // Limit max lines in logs...
+    memoLogs.Lines.BeginUpdate;
+    try
+      while memoLogs.Lines.Count>250 do memoLogs.Lines.Delete(0);
+    finally
+      memoLogs.Lines.EndUpdate;
+    end;
+  end;
+  memoLogs.Lines.Add(formatDateTime('dd/mm/yyyy hh:nn:ss.zzz',Time)+s+IntToHex(PtrInt(ThreadID),8)+' ['+CT_LogType[Logtype]+'] <'+sender+'> '+logtext);
+  //
+end;
+
+procedure TFRMWallet.OnNodeMessageEvent(NetConnection: TNetConnection; MessageData: TRawBytes);
+Var s : String;
+begin
+  inc(FMessagesUnreadCount);
+  if Assigned(NetConnection) then begin
+    s := DateTimeToStr(now)+' Message received from '+NetConnection.ClientRemoteAddr;
+    memoMessages.Lines.Add(DateTimeToStr(now)+' Message received from '+NetConnection.ClientRemoteAddr+' Length '+inttostr(Length(MessageData))+' bytes');
+    memoMessages.Lines.Add('RECEIVED> '+MessageData);
+    if FAppParams.ParamByName[CT_PARAM_ShowModalMessages].GetAsBoolean(false) then begin
+      s := DateTimeToStr(now)+' Message from '+NetConnection.ClientRemoteAddr+#10+
+         'Length '+inttostr(length(MessageData))+' bytes'+#10+#10;
+      if TCrypto.IsHumanReadable(MessageData) then begin
+         s := s + MessageData;
+      end else begin
+         s := s +'Value in hexadecimal:'+#10+
+              TCrypto.ToHexaString(MessageData);
+      end;
+      Application.MessageBox(PChar(s),PChar(Application.Title),MB_ICONINFORMATION+MB_OK);
+    end;
+  end else begin
+    memoMessages.Lines.Add(DateTimeToStr(now)+' Internal message: '+MessageData);
+  end;
+  if FMessagesUnreadCount>1 then lblReceivedMessages.Caption := Format('You have received %d messages',[FMessagesUnreadCount])
+  else lblReceivedMessages.Caption := 'You have received 1 message';
+  lblReceivedMessages.Visible := true;
+end;
+
+procedure TFRMWallet.OnReceivedHelloMessage(Sender: TObject);
+Var nsarr : TNodeServerAddressArray;
+  i : Integer;
+  s : AnsiString;
+begin
+  If (FLastNodesCacheUpdatedTS + EncodeTime(0,5,0,0) > Now) then exit; // Prevent continuous saving
+  FLastNodesCacheUpdatedTS := Now;
+  // Update node servers Peer Cache
+  nsarr := TNetData.NetData.NodeServersAddresses.GetValidNodeServers(true,0);
+  s := '';
+  for i := low(nsarr) to High(nsarr) do begin
+    if (s<>'') then s := s+';';
+    s := s + nsarr[i].ip+':'+IntToStr( nsarr[i].port );
+  end;
+  FAppParams.ParamByName[CT_PARAM_PeerCache].SetAsString(s);
+  TNode.Node.PeerCache := s;
+end;
+
+procedure TFRMWallet.OnSelectedAccountsGridUpdated(Sender: TObject);
+begin
+  lblSelectedAccountsCount.Caption := Inttostr(FSelectedAccountsGrid.AccountsCount);
+  lblSelectedAccountsBalance.Caption := TAccountComp.FormatMoney( FSelectedAccountsGrid.AccountsBalance );
+end;
+
+procedure TFRMWallet.OnWalletChanged(Sender: TObject);
+begin
+  if FMustProcessWalletChanged then exit;
+  FMustProcessWalletChanged := true;
+  PostMessage(Self.Handle,CM_PC_WalletKeysChanged,0,0);
+end;
+
+procedure TFRMWallet.PageControlChange(Sender: TObject);
+begin
+  MiDecodePayload.Enabled := false;
+  if PageControl.ActivePage=tsMyAccounts then begin
+    //FAccountsGrid.Node := FNode;
+    MiDecodePayload.Enabled := true;
+    FSelectedAccountsGrid.Node := FNode;
+  end else begin
+    //FAccountsGrid.Node := Nil;
+    FSelectedAccountsGrid.Node := Nil;
+  end;
+  if PageControl.ActivePage=tsPendingOperations then begin
+    FPendingOperationsGrid.Node := FNode;
+    MiDecodePayload.Enabled := true;
+  end else FPendingOperationsGrid.Node := Nil;
+  if PageControl.ActivePage=tsBlockChain then FBlockChainGrid.Node := FNode
+  else FBlockChainGrid.Node := Nil;
+  if PageControl.ActivePage=tsOperations then begin
+    FOperationsExplorerGrid.Node := FNode;
+    MiDecodePayload.Enabled := true;
+  end else FOperationsExplorerGrid.Node := Nil;
+  if PageControl.ActivePage=tsMessages then begin
+    UpdateAvailableConnections;
+    FMessagesUnreadCount := 0;
+    lblReceivedMessages.Visible := false;
+  end;
+end;
+
+procedure TFRMWallet.SaveAppParams;
+Var ms : TMemoryStream;
+  s : AnsiString;
+begin
+  ms := TMemoryStream.Create;
+  Try
+    FAccountsGrid.SaveToStream(ms);
+    ms.Position := 0;
+    setlength(s,ms.Size);
+    ms.ReadBuffer(s[1],ms.Size);
+    FAppParams.ParamByName[CT_PARAM_GridAccountsStream].SetAsString(s);
+  Finally
+    ms.Free;
+  End;
+end;
+
+procedure TFRMWallet.sbSelectedAccountsAddAllClick(Sender: TObject);
+Var lsource,ltarget : TOrderedCardinalList;
+  i : Integer;
+begin
+  lsource := FAccountsGrid.LockAccountsList;
+  Try
+    ltarget := FSelectedAccountsGrid.LockAccountsList;
+    Try
+      for i := 0 to lsource.Count-1 do begin
+        if FWalletKeys.IndexOfAccountKey(FNode.Bank.SafeBox.Account(lsource.Get(i)).accountInfo.accountKey)<0 then raise Exception.Create(Format('You cannot operate with account %d because private key not found in your wallet',[lsource.Get(i)]));
+        ltarget.Add(lsource.Get(i));
+      end;
+    Finally
+      FSelectedAccountsGrid.UnlockAccountsList;
+    End;
+  Finally
+    FAccountsGrid.UnlockAccountsList;
+  End;
+end;
+
+procedure TFRMWallet.sbSelectedAccountsAddClick(Sender: TObject);
+Var l, selected : TOrderedCardinalList;
+  an : Int64;
+  i : Integer;
+begin
+  an := FAccountsGrid.AccountNumber(dgAccounts.Row);
+  if (an<0) then raise Exception.Create('No account selected');
+  if FWalletKeys.IndexOfAccountKey(FNode.Bank.SafeBox.Account(an).accountInfo.accountkey)<0 then
+    raise Exception.Create(Format('You cannot add %s account because private key not found in your wallet.'#10+#10+'You''re not the owner!',
+      [TAccountComp.AccountNumberToAccountTxtNumber(an)]));
+  // Add
+  l := FSelectedAccountsGrid.LockAccountsList;
+  selected := TOrderedCardinalList.Create;
+  Try
+    FAccountsGrid.SelectedAccounts(selected);
+    for i := 0 to selected.Count-1 do begin
+      l.Add(selected.Get(i));
+    end;
+  Finally
+    selected.Free;
+    FSelectedAccountsGrid.UnlockAccountsList;
+  End;
+end;
+
+procedure TFRMWallet.sbSelectedAccountsDelAllClick(Sender: TObject);
+Var l : TOrderedCardinalList;
+begin
+  l := FSelectedAccountsGrid.LockAccountsList;
+  try
+    l.Clear;
+  finally
+    FSelectedAccountsGrid.UnlockAccountsList;
+  end;
+end;
+
+procedure TFRMWallet.sbSelectedAccountsDelClick(Sender: TObject);
+Var an : Int64;
+  l : TOrderedCardinalList;
+begin
+  l := FSelectedAccountsGrid.LockAccountsList;
+  try
+    an := FSelectedAccountsGrid.AccountNumber(dgSelectedAccounts.Row);
+    if an>=0 then l.Remove(an);
+  finally
+    FSelectedAccountsGrid.UnlockAccountsList;
+  end;
+end;
+
+procedure TFRMWallet.SetMinersBlocksFound(const Value: Integer);
+begin
+  FMinersBlocksFound := Value;
+  lblBlocksFound.Caption := Inttostr(Value);
+  if Value>0 then lblBlocksFound.Font.Color := clGreen
+  else lblBlocksFound.Font.Color := clDkGray;
+end;
+
+procedure TFRMWallet.TimerUpdateStatusTimer(Sender: TObject);
+begin
+  Try
+    UpdateConnectionStatus;
+    UpdateBlockChainState;
+    UpdateNodeStatus;
+  Except
+    On E:Exception do begin
+      E.Message := 'Exception at TimerUpdate '+E.ClassName+': '+E.Message;
+      TLog.NewLog(lterror,ClassName,E.Message);
+    end;
+  End;
+end;
+
+procedure TFRMWallet.TrayIconDblClick(Sender: TObject);
+begin
+  TrayIcon.Visible := False;
+  TimerUpdateStatus.Enabled := true;
+  Show();
+  WindowState := wsNormal;
+  Application.BringToFront();
+end;
+
+procedure TFRMWallet.UpdateAccounts(RefreshData : Boolean);
+Var accl : TOrderedCardinalList;
+  l : TOrderedCardinalList;
+  i,j,k : Integer;
+  c  : Cardinal;
+  applyfilter : Boolean;
+  acc : TAccount;
+begin
+  If Not Assigned(FOrderedAccountsKeyList) Then exit;
+  if Not RefreshData then begin
+    dgAccounts.Invalidate;
+    exit;
+  end;
+  applyfilter := (cbFilterAccounts.Checked) and ((FMinAccountBalance>0) Or (FMaxAccountBalance<CT_MaxWalletAmount));
+  FAccountsGrid.ShowAllAccounts := (Not cbExploreMyAccounts.Checked) And (not applyfilter);
+  if Not FAccountsGrid.ShowAllAccounts then begin
+    accl := FAccountsGrid.LockAccountsList;
+    Try
+      accl.Clear;
+      if cbExploreMyAccounts.Checked then begin
+        if cbMyPrivateKeys.ItemIndex<0 then exit;
+        if cbMyPrivateKeys.ItemIndex=0 then begin
+          // All keys in the wallet
+          for i := 0 to FWalletKeys.Count - 1 do begin
+            j := FOrderedAccountsKeyList.IndexOfAccountKey(FWalletKeys[i].AccountKey);
+            if (j>=0) then begin
+              l := FOrderedAccountsKeyList.AccountKeyList[j];
+              for k := 0 to l.Count - 1 do begin
+                if applyfilter then begin
+                  acc := FNode.Bank.SafeBox.Account(l.Get(k));
+                  if (acc.balance>=FMinAccountBalance) And (acc.balance<=FMaxAccountBalance) then accl.Add(acc.account);
+                end else accl.Add(l.Get(k));
+              end;
+            end;
+          end;
+        end else begin
+          i := PtrInt(cbMyPrivateKeys.Items.Objects[cbMyPrivateKeys.ItemIndex]);
+          if (i>=0) And (i<FWalletKeys.Count) then begin
+            j := FOrderedAccountsKeyList.IndexOfAccountKey(FWalletKeys[i].AccountKey);
+            if (j>=0) then begin
+              l := FOrderedAccountsKeyList.AccountKeyList[j];
+              for k := 0 to l.Count - 1 do begin
+                if applyfilter then begin
+                  acc := FNode.Bank.SafeBox.Account(l.Get(k));
+                  if (acc.balance>=FMinAccountBalance) And (acc.balance<=FMaxAccountBalance) then accl.Add(acc.account);
+                end else accl.Add(l.Get(k));
+              end;
+            end;
+          end;
+        end;
+      end else begin
+        // There is a filter... check every account...
+        c := 0;
+        while (c<FNode.Bank.SafeBox.AccountsCount) do begin
+          acc := FNode.Bank.SafeBox.Account(c);
+          if (acc.balance>=FMinAccountBalance) And (acc.balance<=FMaxAccountBalance) then accl.Add(acc.account);
+          inc(c);
+        end;
+      end;
+    Finally
+      FAccountsGrid.UnlockAccountsList;
+    End;
+    lblAccountsCount.Caption := inttostr(accl.Count);
+  end else begin
+    lblAccountsCount.Caption := inttostr(FNode.Bank.AccountsCount);
+  end;
+  bbChangeKeyName.Enabled := cbExploreMyAccounts.Checked;
+  // Show Totals:
+  lblAccountsBalance.Caption := TAccountComp.FormatMoney(FAccountsGrid.AccountsBalance);
+  UpdateOperations;
+end;
+
+procedure TFRMWallet.UpdateAvailableConnections;
+Var i : integer;
+ NC : TNetConnection;
+ l : TList;
+begin
+  if Not TNetData.NetData.NetConnections.TryLockList(100,l) then exit;
+  try
+    lbNetConnections.Items.BeginUpdate;
+    Try
+      lbNetConnections.Items.Clear;
+      for i := 0 to l.Count - 1 do begin
+        NC := l[i];
+        if NC.Connected then begin
+          if NC is TNetServerClient then begin
+            if Not NC.IsMyselfServer then begin
+              lbNetConnections.Items.AddObject(Format('Client: IP:%s',[NC.ClientRemoteAddr]),NC);
+            end;
+          end else begin
+            if Not NC.IsMyselfServer then begin
+              lbNetConnections.Items.AddObject(Format('Server: IP:%s',[NC.ClientRemoteAddr]),NC);
+            end;
+          end;
+        end;
+      end;
+    Finally
+      lbNetConnections.Items.EndUpdate;
+    End;
+  finally
+    TNetData.NetData.NetConnections.UnlockList;
+  end;
+end;
+
+procedure TFRMWallet.UpdateBlockChainState;
+Var isMining : boolean;
+//  hr : Int64;
+  i,mc : Integer;
+  s : String;
+  mtl : TList;
+  f, favg : real;
+begin
+  UpdateNodeStatus;
+  mc := 0;
+//  hr := 0;
+  if Assigned(FNode) then begin
+    if FNode.Bank.BlocksCount>0 then begin
+      lblCurrentBlock.Caption :=  Inttostr(FNode.Bank.BlocksCount)+' (0..'+Inttostr(FNode.Bank.BlocksCount-1)+')'; ;
+    end else lblCurrentBlock.Caption :=  '(none)';
+    lblCurrentAccounts.Caption := Inttostr(FNode.Bank.AccountsCount);
+    lblCurrentBlockTime.Caption := UnixTimeToLocalElapsedTime(FNode.Bank.LastOperationBlock.timestamp);
+    lblOperationsPending.Caption := Inttostr(FNode.Operations.Count);
+    lblCurrentDifficulty.Caption := InttoHex(FNode.Operations.OperationBlock.compact_target,8);
+    favg := FNode.Bank.GetActualTargetSecondsAverage(CT_CalcNewTargetBlocksAverage);
+    f := (CT_NewLineSecondsAvg - favg) / CT_NewLineSecondsAvg;
+    lblTimeAverage.Caption := 'Last '+Inttostr(CT_CalcNewTargetBlocksAverage)+': '+FormatFloat('0.0',favg)+' sec. (Optimal '+Inttostr(CT_NewLineSecondsAvg)+'s) Deviation '+FormatFloat('0.00%',f*100);
+    if favg>=CT_NewLineSecondsAvg then begin
+      lblTimeAverage.Font.Color := clNavy;
+    end else begin
+      lblTimeAverage.Font.Color := clOlive;
+    end;
+    lblTimeAverageAux.Caption := Format('Last %d: %s sec. - %d: %s sec. - %d: %s sec. - %d: %s sec. - %d: %s sec.',[
+        CT_CalcNewTargetBlocksAverage * 2 ,FormatFloat('0.0',FNode.Bank.GetActualTargetSecondsAverage(CT_CalcNewTargetBlocksAverage * 2)),
+        ((CT_CalcNewTargetBlocksAverage * 3) DIV 2) ,FormatFloat('0.0',FNode.Bank.GetActualTargetSecondsAverage((CT_CalcNewTargetBlocksAverage * 3) DIV 2)),
+        ((CT_CalcNewTargetBlocksAverage DIV 4)*3),FormatFloat('0.0',FNode.Bank.GetActualTargetSecondsAverage(((CT_CalcNewTargetBlocksAverage DIV 4)*3))),
+        CT_CalcNewTargetBlocksAverage DIV 2,FormatFloat('0.0',FNode.Bank.GetActualTargetSecondsAverage(CT_CalcNewTargetBlocksAverage DIV 2)),
+        CT_CalcNewTargetBlocksAverage DIV 4,FormatFloat('0.0',FNode.Bank.GetActualTargetSecondsAverage(CT_CalcNewTargetBlocksAverage DIV 4))]);
+  end else begin
+    isMining := false;
+    lblCurrentBlock.Caption := '';
+    lblCurrentAccounts.Caption := '';
+    lblCurrentBlockTime.Caption := '';
+    lblOperationsPending.Caption := '';
+    lblCurrentDifficulty.Caption := '';
+    lblTimeAverage.Caption := '';
+    lblTimeAverageAux.Caption := '';
+  end;
+  if (Assigned(FPoolMiningServer)) And (FPoolMiningServer.Active) then begin
+    If FPoolMiningServer.ClientsCount>0 then begin
+      lblMinersClients.Caption := IntToStr(FPoolMiningServer.ClientsCount)+' connected JSON-RPC clients';
+      lblMinersClients.Font.Color := clNavy;
+    end else begin
+      lblMinersClients.Caption := 'No JSON-RPC clients';
+      lblMinersClients.Font.Color := clDkGray;
+    end;
+    MinersBlocksFound := FPoolMiningServer.ClientsWins;
+  end else begin
+    MinersBlocksFound := 0;
+    lblMinersClients.Caption := 'JSON-RPC server not active';
+    lblMinersClients.Font.Color := clRed;
+  end;
+end;
+
+procedure TFRMWallet.UpdateConfigChanged;
+Var wa : Boolean;
+  i : Integer;
+begin
+  tsLogs.TabVisible := FAppParams.ParamByName[CT_PARAM_ShowLogs].GetAsBoolean(false);
+  if (Not tsLogs.TabVisible) then begin
+    FLog.OnNewLog := Nil;
+    if PageControl.ActivePage = tsLogs then PageControl.ActivePage := tsMyAccounts;
+  end else FLog.OnNewLog := OnNewLog;
+  if FAppParams.ParamByName[CT_PARAM_SaveLogFiles].GetAsBoolean(false) then begin
+    if FAppParams.ParamByName[CT_PARAM_SaveDebugLogs].GetAsBoolean(false) then FLog.SaveTypes := CT_TLogTypes_ALL
+    else FLog.SaveTypes := CT_TLogTypes_DEFAULT;
+    FLog.FileName := TFolderHelper.GetPascalCoinDataFolder+PathDelim+'PascalCointWallet.log';
+  end else begin
+    FLog.SaveTypes := [];
+    FLog.FileName := '';
+  end;
+  if Assigned(FNode) then begin
+    wa := FNode.NetServer.Active;
+    FNode.NetServer.Port := FAppParams.ParamByName[CT_PARAM_InternetServerPort].GetAsInteger(CT_NetServer_Port);
+    FNode.NetServer.Active := wa;
+    FNode.Operations.BlockPayload := FAppParams.ParamByName[CT_PARAM_MinerName].GetAsString('');
+    FNode.NodeLogFilename := TFolderHelper.GetPascalCoinDataFolder+PathDelim+'blocks.log';
+  end;
+  if Assigned(FPoolMiningServer) then begin
+    if FPoolMiningServer.Port<>FAppParams.ParamByName[CT_PARAM_JSONRPCMinerServerPort].GetAsInteger(CT_JSONRPCMinerServer_Port) then begin
+      FPoolMiningServer.Active := false;
+      FPoolMiningServer.Port := FAppParams.ParamByName[CT_PARAM_JSONRPCMinerServerPort].GetAsInteger(CT_JSONRPCMinerServer_Port);
+    end;
+    FPoolMiningServer.Active :=FAppParams.ParamByName[CT_PARAM_JSONRPCMinerServerActive].GetAsBoolean(true);
+    FPoolMiningServer.UpdateAccountAndPayload(GetAccountKeyForMiner,FAppParams.ParamByName[CT_PARAM_MinerName].GetAsString(''));
+  end;
+  if Assigned(FRPCServer) then begin
+    FRPCServer.Active := FAppParams.ParamByName[CT_PARAM_JSONRPCEnabled].GetAsBoolean(false);
+    FRPCServer.ValidIPs := FAppParams.ParamByName[CT_PARAM_JSONRPCAllowedIPs].GetAsString('127.0.0.1');
+  end;
+  i := FAppParams.ParamByName[CT_PARAM_MinerPrivateKeyType].GetAsInteger(Integer(mpk_Random));
+  if (i>=Integer(Low(TMinerPrivatekey))) And (i<=Integer(High(TMinerPrivatekey))) then FMinerPrivateKeyType := TMinerPrivateKey(i)
+  else FMinerPrivateKeyType := mpk_Random;
+end;
+
+procedure TFRMWallet.UpdateConnectionStatus;
+var errors : AnsiString;
+begin
+  UpdateNodeStatus;
+  OnNetStatisticsChanged(Nil);
+  if Assigned(FNode) then begin
+    if FNode.IsBlockChainValid(errors) then begin
+      StatusBar.Panels[2].Text := Format('Last account time:%s',
+       [FormatDateTime('dd/mm/yyyy hh:nn:ss',UnivDateTime2LocalDateTime(UnixToUnivDateTime( FNode.Bank.LastOperationBlock.timestamp )))]);
+    end else begin
+      StatusBar.Panels[2].Text := 'NO BLOCKCHAIN: '+errors;
+    end;
+  end else begin
+    StatusBar.Panels[2].Text := '';
+  end;
+end;
+
+procedure TFRMWallet.UpdateNodeStatus;
+Var status : AnsiString;
+begin
+  If Not Assigned(FNode) then begin
+    lblNodeStatus.Font.Color := clRed;
+    lblNodeStatus.Caption := 'Initializing...';
+  end else begin
+    If FNode.IsReady(status) then begin
+      if TNetData.NetData.NetStatistics.ActiveConnections>0 then begin
+        lblNodeStatus.Font.Color := clGreen;
+        if TNetData.NetData.IsDiscoveringServers then begin
+          lblNodeStatus.Caption := 'Discovering servers';
+        end else if TNetData.NetData.IsGettingNewBlockChainFromClient then begin
+          lblNodeStatus.Caption := 'Obtaining new blockchain';
+        end else begin
+          lblNodeStatus.Caption := 'Running';
+        end;
+      end else begin
+        lblNodeStatus.Font.Color := clRed;
+        lblNodeStatus.Caption := 'Alone in the world...';
+      end;
+    end else begin
+      lblNodeStatus.Font.Color := clRed;
+      lblNodeStatus.Caption := status;
+    end;
+  end;
+  If Assigned(FBackgroundPanel) then begin
+    FBackgroundPanel.Font.Color:=lblNodeStatus.Font.Color;
+    FBackgroundPanel.Caption:='Please wait until finished: '+lblNodeStatus.Caption;
+  end;
+end;
+
+procedure TFRMWallet.UpdateOperations;
+Var accn : Int64;
+begin
+  accn := FAccountsGrid.AccountNumber(dgAccounts.Row);
+  FOperationsAccountGrid.AccountNumber := accn;
+end;
+
+procedure TFRMWallet.UpdatePrivateKeys;
+Var i,last_i : Integer;
+  wk : TWalletKey;
+  s : AnsiString;
+begin
+  If (Not Assigned(FOrderedAccountsKeyList)) And (Assigned(FNode)) Then begin
+    FOrderedAccountsKeyList := TOrderedAccountKeysList.Create(FNode.Bank.SafeBox,false);
+  end;
+  if (cbMyPrivateKeys.ItemIndex>=0) then last_i := PtrInt(cbMyPrivateKeys.Items.Objects[cbMyPrivateKeys.ItemIndex])
+  else last_i := -1;
+  cbMyPrivateKeys.items.BeginUpdate;
+  Try
+    cbMyPrivateKeys.Items.Clear;
+    For i:=0 to FWalletKeys.Count-1 do begin
+      wk := FWalletKeys.Key[i];
+      if assigned(FOrderedAccountsKeyList) then begin
+        FOrderedAccountsKeyList.AddAccountKey(wk.AccountKey);
+      end;
+      if (wk.Name='') then begin
+        s := 'Sha256='+TCrypto.ToHexaString( TCrypto.DoSha256( TAccountComp.AccountKey2RawString(wk.AccountKey) ) );
+      end else begin
+        s := wk.Name;
+      end;
+      if Not Assigned(wk.PrivateKey) then s := s + '(*)';
+      cbMyPrivateKeys.Items.AddObject(s,TObject(i));
+    end;
+    cbMyPrivateKeys.Sorted := true;
+    cbMyPrivateKeys.Sorted := false;
+    cbMyPrivateKeys.Items.InsertObject(0,'(All my private keys)',TObject(-1));
+  Finally
+    cbMyPrivateKeys.Items.EndUpdate;
+  End;
+  last_i := cbMyPrivateKeys.Items.IndexOfObject(TObject(last_i));
+  if last_i<0 then last_i := 0;
+  if cbMyPrivateKeys.Items.Count>last_i then cbMyPrivateKeys.ItemIndex := last_i
+  else if cbMyPrivateKeys.Items.Count>=0 then cbMyPrivateKeys.ItemIndex := 0;
+end;
+
+initialization
+  FRMWallet := Nil;
+end.

+ 800 - 0
src/gui-classic/UFRMWalletKeys.dfm

@@ -0,0 +1,800 @@
+object FRMWalletKeys: TFRMWalletKeys
+  Left = 0
+  Top = 0
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'Wallet keys'
+  ClientHeight = 478
+  ClientWidth = 569
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poOwnerFormCenter
+  OnCreate = FormCreate
+  PixelsPerInch = 96
+  TextHeight = 13
+  object lblEncryptionTypeCaption: TLabel
+    Left = 30
+    Top = 298
+    Width = 80
+    Height = 13
+    Caption = 'Encryption type:'
+  end
+  object lblEncryptionType: TLabel
+    Left = 125
+    Top = 298
+    Width = 54
+    Height = 13
+    Caption = '000000000'
+  end
+  object lblKeyNameCaption: TLabel
+    Left = 30
+    Top = 317
+    Width = 51
+    Height = 13
+    Caption = 'Key name:'
+  end
+  object lblKeyName: TLabel
+    Left = 125
+    Top = 317
+    Width = 329
+    Height = 13
+    AutoSize = False
+    Caption = '000000000'
+  end
+  object lblPrivateKeyCaption: TLabel
+    Left = 30
+    Top = 336
+    Width = 58
+    Height = 13
+    Caption = 'Private key:'
+  end
+  object lblPrivateKeyCaption2: TLabel
+    Left = 30
+    Top = 355
+    Width = 80
+    Height = 13
+    Caption = '(In hexa format)'
+  end
+  object lblKeysEncrypted: TLabel
+    Left = 30
+    Top = 15
+    Width = 274
+    Height = 39
+    AutoSize = False
+    Caption = 'lblKeysEncrypted'
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentFont = False
+    WordWrap = True
+  end
+  object lbWalletKeys: TListBox
+    Left = 30
+    Top = 60
+    Width = 346
+    Height = 227
+    ItemHeight = 13
+    TabOrder = 0
+    OnClick = lbWalletKeysClick
+  end
+  object bbExportPrivateKey: TBitBtn
+    Left = 382
+    Top = 136
+    Width = 159
+    Height = 36
+    Caption = 'Export Private key'
+    DoubleBuffered = True
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000FF00FF005251
+      5100565758005A5958005B5D5D005D5E5E006361610066666600696969006C6B
+      6B0073706F0072707000747271000E80AA001788AF000B86B2000C85B000098A
+      B700078CBA00198EB7000E91BE001E94BC002898BA003E99BB000493C4000997
+      C7000A9ECF00229BC20035A0C30030AACA0032AACE003DAACC003FB0CB0036A9
+      D0003BB1D9003DBDDA0039B8DE0029BBE0004DBBD90068B0CA0019C7F1001BD4
+      FE002FC6E7003ECDE9002CD3F9002ED8FE003CE0FE0054C0D40059C4D70059C2
+      DD006FC2D6007CC0D50078C1D80049DDFE0054DFFE0061C6E5006CD4EE0064D9
+      E90076DFE9007DDFE90055E0FF0058E0FE006BE3F40063E6FE0060ECFE0075E2
+      FA0077E6FF007BE8FF0071F2FE0088828000928E8C0096908F00969291009794
+      94009E969400A09C9B00A19F9E00ACA09E00A6A2A100A6A4A400ADA5A300AAA5
+      A400ABA8A800ADAAA900B0A5A300B2A7A500B2ABAB00B4ABA900BBB1AE00BEB1
+      AF00BAB3B200BAB4B200BEB6B400C4B8B600C1BCBB0083DFE9008ADAEB0094DF
+      E90089DDF100A4DFEA009AE2F40095EBFD0095EDFE009EEDFF0084F3F90080F5
+      FC008FF6FB0083F8FE0093F2FE0097F9FE0094FDFE0099FFFE009EFFFE00AAEF
+      FD00B4EEF300A4FFFE00A8F9FE00ADFBFE00AAFFFE00B6F1FF00BCF2F800B3F9
+      FF00B3FFFE00B9FFFE00C7C2C100C7C6C600CCC4C200CAC7C600CFCCCC00D1C7
+      C500D4CBC900D1CDCD00D5CFCE00D8D0CE00D7D1D000D9D5D400DCD7D600DFD8
+      D600E3DEDD00C3DFEA00CCF6FF00C9FFFE00CFFFFF00D1F7FF00DBF8FE00DFFF
+      FF00E7E3E200E9E5E500ECE9E900EFEEED00F1EBEA00F1EFEE00E5FFFF00F3F1
+      F100F6F2F000F8F5F300F8F5F400F0F7FA00F5FFFF00FBF8F800FAFFFF00FFFE
+      FE00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0007070707000000000000000000000000000000000000000746967E07000000
+      0000000000000000000000000000000D085E489A5E080D0D0000000000000000
+      00000000000D0D2626075E48A1071F130D0D000000000000000000000D163940
+      3F35075E4C93070707100D000000000000000000123A6B402E353D075E519580
+      4E0707070707000000000000123A6B402E293D42075E4EA19289858281550700
+      00000000123A6B402E292D4266075E4C9689865A475D4D0700000000123A6B40
+      2E292D3C6671077D928A7D0A0A58580700000000123A6B402E292D3C4371079A
+      958007035151550700000000123A6D6C6667778C8F90079A860701574C024A07
+      0000000012727860311E1B151C3407A17E0B534C000445070000000011322023
+      2A282C36426407539A8882040404570700000000103169402E292D3643716207
+      5393825A515A5A0700000000123A6B402E292D3C436662370707070708070700
+      00000000123A6B402E292D3C43663837222117000000000000000000123A6B40
+      2E292D3C436638231A180D000000000000000000123A6B402E292D3C43663822
+      1A180D000000000000000000123A6B402E292D3C436638231A180D0000000000
+      00000000123B757975756F6F6F6F6A3E25190D000000000000000000128BA190
+      8E79736F6F6F6F6D442B0D00000000000000000012279D9D908E796F6F6F6F6F
+      691E0D000000000000000000001214333363615F3B3A2F2F0E0D000000000000
+      0000000000000014121212121212121200000000000000000000}
+    ParentDoubleBuffered = False
+    TabOrder = 4
+    OnClick = bbExportPrivateKeyClick
+  end
+  object memoPrivateKey: TMemo
+    Left = 125
+    Top = 336
+    Width = 416
+    Height = 80
+    TabStop = False
+    BevelInner = bvNone
+    BevelOuter = bvNone
+    Color = clBtnFace
+    Ctl3D = False
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = []
+    Lines.Strings = (
+      'memoPrivateKey')
+    ParentCtl3D = False
+    ParentFont = False
+    ReadOnly = True
+    TabOrder = 9
+  end
+  object bbChangeName: TBitBtn
+    Left = 460
+    Top = 305
+    Width = 81
+    Height = 25
+    Caption = 'Change Name'
+    DoubleBuffered = True
+    ParentDoubleBuffered = False
+    TabOrder = 8
+    OnClick = bbChangeNameClick
+  end
+  object bbImportPrivateKey: TBitBtn
+    Left = 382
+    Top = 98
+    Width = 159
+    Height = 36
+    Caption = 'Import Private key'
+    DoubleBuffered = True
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000FF00FF000571
+      0A0008750D0024B53B0029B942002ABA44002EBD4A002FBF4C0033C1500034C2
+      520035C3540037C5570039C659003BC85C003CC95E003FCC630040CC650045D0
+      6B0046D16C0049D472004BD675004ED8790050D97B0051DA7E000E80AA001788
+      AF000B86B200098AB700078CBA00198EB700118EB9000E91BE001E94BC002898
+      BA0055DD810056DF850058E087000493C4000997C7000C9BCB000A9DCE00229B
+      C20015AFD90026A0C80021AACF0035A0C30030AACA0032AACE003DAACC003FB0
+      CB0031AED7003DBDDA0039B8DE0029BBE00056B1CE0052BDDB0068B0CA006BBD
+      D70019C7F1001BD4FE002FC6E70026C2E9003ECDE9002CD3F9002ED8FE003CE0
+      FE0054C0D40059C4D70059C2DD006FC2D60062C3DE007CC0D5007AC6DF0043C8
+      E90054DFFE0060CEEA0079CFE9006CD4EE0064D9E90076DFE9007DDFE90055E0
+      FF006BE3F40060ECFE0075E2FA007BE8FF0071F2FE008FD0E60083DFE9008ADA
+      EB0094DFE90081DBF100A4DFEA0095EBFD0095EEFE009EEDFF0084F3F90080F5
+      FC008FF6FB0083F8FE0093F2FE0097F9FE0094FDFE0099FFFE009EFFFE00AFE8
+      F600B4EEF300A4FFFE00A8F9FE00ADFBFE00AAFFFE00B6F1FF00BCF2F800B3F9
+      FF00B3FFFE00B9FFFE00C3DFEA00CCF6FF00C9FFFE00CFFFFF00D1F6FE00DFFF
+      FF00E5FFFF00F0F7FA00F5FFFF00FAFFFF000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000202020200000000000000000000000000000000000000
+      0002040302000000000000000000001818181818181818180002060402000000
+      000000000018182C2C2A3D494B46301D18020906020000000000000018214E53
+      413B4051555D4D3427020D0902000000000000001C4F6353413B405102020202
+      02020F0D02020202020200001C4F6353413B405102242317151311100D090906
+      040200001C4F6353413B40510224242323151311100F0D09060200001C4F6353
+      413B4051020101010102171302010101020100001C4F6353413B4051555D4D34
+      2702231702000000000000001C4F65645D5F6F757878694C3202242302000000
+      000000001C6A7059442F29202D3639485702242402000000000000001B453134
+      3C3A3F4A545B372B1E02242402000000000000001A436153413B4051555D4D34
+      2701020202000000000000001C4F6353413B4051555D4D342725180000000000
+      000000001C4F6353413B4051555D4D342725180000000000000000001C4F6353
+      413B4051555D4D342725180000000000000000001C4F6353413B4051555D4D34
+      2825180000000000000000001C4F6353413B4051555D4D342725180000000000
+      000000001C506D716D6D6767676762523527180000000000000000001C747D7A
+      77716B6767676765563E180000000000000000001C387B7C7977716767676767
+      612F18000000000000000000001C1F47475C5A58504F42421918000000000000
+      000000000000001C1C1C1C1C1C1C1C1C00000000000000000000}
+    ParentDoubleBuffered = False
+    TabOrder = 3
+    OnClick = bbImportPrivateKeyClick
+  end
+  object bbExportPublicKey: TBitBtn
+    Left = 382
+    Top = 212
+    Width = 159
+    Height = 36
+    Caption = 'Export Public key'
+    DoubleBuffered = True
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C8518FF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+      9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C8518
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+      FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+      00FF0C85181399220C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF0C85180C85180C85180C85
+      180C85180C85180C85180C85181DAC31139A220C8518FF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE0C8518
+      57E38851DD7E4AD77443D0693BC95E34C1522BBA4725B33C1EAE33149B230C85
+      18FF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+      DEFE77DEFE0C85185EE89059E48953DE804CD87645D16C3DCA6035C2542DBB49
+      26B53F1FAF35149B250C8518FF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+      F38FE8FF7CE2FE7CE3FE7CE3FE0C851861EB955FE9925AE58B54DF824DD97846
+      D26D3ECB6237C4562FBD4C27B64021B037159B250C8518FF00FFFF00FF019ACF
+      60CAEF1FA8D85EC1E1C2E6ED8ACEE08FCFE18ECFE10C851861EB9561EB955FEA
+      935CE58D56E0844FDB7A48D47040CD6538C65931BF4D1DA3320C8518FF00FFFF
+      00FFFF00FF019ACF65CFF53EB7E52CA9D4C5EFF8ACF3FEA5F2FFA5F2FF0C8518
+      61EB9561EB9561EB9561EB945CE68E57E18650DC7C49D57242CE6727AD410C85
+      18FF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F32A9CC673CBE7D6FEFDB1
+      FBFDB2FBFD0C85180C85180C85180C85180C85180C85180C85180C851852DD7F
+      32B6500C851898FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB748E
+      A224A8D5B9E7F3D5F5F9D5F6F9D6F6FADCFAFBCDFDFCB9FCFCAFFAFCB0FAFCB1
+      FAFC0C85183ABE5C0C85189FFCFFA4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+      8BDBFF5FCDFFB7898973C3DD18A2D218A2D216A2D215A1D21AA4D391D7EBEBFE
+      FDDBFDFCC5FBFBC2FBFB0C85180C851883E4F3B6FDFFBAFFFFB5FCFD019ACFFF
+      00FFFF00FF019ACF99E2FF67D3FFB88989FEF5ECFDF3EBF0EFEAE5EBE8D6E5E6
+      A4D2E025A6D34DB9DDE5F8FBF5FDFCEBFCFB0C8518C4FBFF9CE4F2DAFEFFD9FE
+      FFE3FFFFADE9F5019ACFFF00FF019ACF9FE9FF70DCFFB88989FEF3E9FFF2E6FE
+      F3E9FEF3E9FEF3E9FEF3E9D4E4E439ADD422A5D49DD8ECF1F9FBEEEFEFE9FDFF
+      CEEEF7F8FFFFF7FFFFFEFFFFE9F9FD019ACFFF00FF019ACFA7EFFF76E5FFB889
+      89FFF2E5FFF0E2FFF2E5FFF2E5FFF2E5FFF2E5FFF2E5EAEBE38EC9DA44B0D501
+      9ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACFFF00FF019ACF
+      ABF6FF7EEDFFB88989FFF0E2FFEFDFFFF0E2FFF0E2FFF0E2FFF0E2FFF0E2FEEE
+      E0FBECDEFAEBDEF6E6D9B8898993F7FF019ACFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACFC7FFFF82F5FFB88989FFEEDFFFECDBFFEEDFFFEEDFFFEEDF
+      FFEEDFF9E8D9DECCC1D9CABDCFBDB4C8B3ACB88989B5FFFF019ACFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFFB88989FFECDBFFEBD8FF
+      ECDBFFECDBFFECDBFFECDBF5E2D2C4ABA7C2A8A5BBA39FC2AFA9B88989019ACF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFB889
+      89FFEBD8FFEAD5FFEBD8FFEBD8FFEBD8FFEBD8FFEBD8D9C8C5FEFEFDFEF6EFDE
+      C9C0B88989FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FF019ACFB88989FFE9D5FFE8D3FFE9D5FFE9D5FFE9D5FFE9D5FFE9D5C6AD
+      A9FEF8F2E8D4CACD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFB88989FFE7D1FFE7D0FFE7D1FFE7D1FFE7D1
+      FFE7D1E7CEBFD3BFB9E8D5CCCD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB88989FFE6CFFFE6CFFF
+      E6CFFFE6CFFFE6CFFFE6CFD5BBB2E0CCC5CD9999FF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB889
+      89B88989B88989B88989B88989B88989B88989B88989B88989FF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+    ParentDoubleBuffered = False
+    TabOrder = 6
+    OnClick = bbExportPublicKeyClick
+  end
+  object bbImportPublicKey: TBitBtn
+    Left = 382
+    Top = 174
+    Width = 159
+    Height = 36
+    Caption = 'Import Public key'
+    DoubleBuffered = True
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+      9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+      FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF74DBFF7ADEFF79DDFF73D9
+      FF5CCCF522ACDD019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE71D9FE
+      71D9FE71D9FE73DAFE76DCFF7BDFFF7ADEFF78DCFF77DCFF019ACFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+      DEFE77DEFE77DEFE77DEFE77DEFE77DEFE76DEFE76DEFE76DEFE78DFFF7CE1FF
+      65D2F8019ACFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+      F38FE8FF7CE2FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7C
+      E3FE7DE4FE7DE3FE5ED1F3019ACFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      60CAEF1FA8D85EC1E2BBF4FE7DE7FE82E8FE81E8FE81E8FE81E8FE81E8FE81E8
+      FE81E8FE81E8FE81E8FE82E8FE84E9FE5ED3F18DEEFF019ACFFF00FFFF00FFFF
+      00FFFF00FF019ACF65CFF53EB7E529ACD8BFEEF88DEFFF85EDFF85EDFF85EDFF
+      85EDFF86EDFF86EDFF86EDFF86EDFF86EDFF87EDFF89EEFF65D9F396F5FF019A
+      CFFF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F31FA7D773CBE7C5FCFF93
+      F7FF93F7FF92F6FF8DF4FF89F3FF89F2FF8BF2FF8BF2FF8BF2FF8BF2FF8EF3FF
+      6ADEF395F8FF98FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB3EB8
+      E920A7D5B6E6F3D0F4FAD1F5FAD2F6FAD5F9FCB9FBFE9BF8FF8FF6FF91F6FF92
+      F6FF93F7FF6BD0B70C85188BEAE0A4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+      8BDBFF5FCDFF64CDFE2CAFE30D9FD30FA0D310A0D310A0D317A3D38ED7ECE2FD
+      FEC3FAFFA5F8FFA3F8FF84DDCF0C851838B5570C8518ABF3EBB5FCFD019ACFFF
+      00FFFF00FF019ACF99E2FF67D3FF6DD4FE6CD4FE69D1FE64CEFB61CDF95BC9F5
+      48BEEB17A3D54BB8DDDFF7FBE8FCFFB1E7DD0C85184ACE7361EB9541C1640C85
+      18D6F6F0ADE9F5019ACFFF00FF019ACF9FE9FF70DCFF76DDFE76DDFE76DDFE75
+      DCFE74DCFE73DCFE73DBFE61CEF61CA8D91CA5D58CCED70C851842C5665BE68C
+      59E1895DE78F3EBD600C8518DBF1EF019ACFFF00FF019ACFA7EFFF76E5FF7CE5
+      FF7CE5FF7CE5FF7CE5FF7DE5FF7DE5FF7DE5FF7DE3FF72DDFB40B8D20C85182D
+      AD474AD47250D97B55DE8359E1885AE38B33AF510C85180197C3FF00FF019ACF
+      ABF6FF7EEDFF85ECFF85ECFF85ECFF85ECFF84ECFF80ECFF7CECFF7DECFF7EEC
+      FF0C85180C85180C85180C851840C7634FDA7A55DF830C85180C85180C85180C
+      8518FF00FF019ACFC7FFFF82F5FF8FF5FF8FF5FF8FF5FF8EF5FF8DF4FFA0FDFF
+      B7FFFFAFFFFFAEFFFFA6F9F4A5FBF8A3FCFA4CB07732B74F48D6704AD3720C85
+      18FF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFF8AFCFF90FCFF90FCFF90
+      FCFF99FDFF86E8F5019ACF019ACF019ACF019ACF019ACF019ACF0486642CB347
+      41D16636BC540C8518FF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFBCFF
+      FFBCFFFFBCFFFFC0FFFF9DF5FB019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FF0C85182BB74538C9580C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FF019ACF019ACF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FF0C851828BB4126B13E0C8518FF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FF0C851814A4241CAE310C8518FF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C85180C96170D991A0C8518
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C85180C85180C85180C
+      8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+    ParentDoubleBuffered = False
+    TabOrder = 5
+    OnClick = bbImportPublicKeyClick
+  end
+  object bbGenerateNewKey: TBitBtn
+    Left = 382
+    Top = 60
+    Width = 159
+    Height = 36
+    Caption = 'Generate a new Key'
+    DoubleBuffered = True
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000FF00FF007D33
+      2F00993300000C35EB000335FB001342FB00224EFB00325BFC005274FC000E80
+      AA001788AF000B86B200098AB700078CBA00078EBD00118EB9000E91BE001E94
+      BC002898BA000493C4000997C7000A9DCE00229BC20015AFD90026A0C80021AA
+      CF0035A0C30030AACA0032AACE003FB0CB003DBDDA0039B8DE0029BBE00046A6
+      C90056B1CE0052BDDB0068B0CA006BBDD700718DFC0019C7F1001BD4FE002FC6
+      E70026C2E9003ECDE9002CD3F9002ED8FE003CE0FE0054C0D40059C4D70059C2
+      DD006FC2D6007CC0D50076C4DF007AC6DF0043C8E90054DFFE0060CEEA006CD4
+      EE0064D9E90076DFE9007DDFE90055E0FF006BE3F40060ECFE0075E2FA007BE8
+      FF0071F2FE008099FC00A0B2FD00AFBFFD008FD0E60083DFE9008ADAEB0094DF
+      E90081DBF100A4DFEA0095EBFD0095EEFE009EEDFF0084F3F90080F5FC008FF6
+      FB0083F8FE0093F2FE0097F9FE0094FDFE0099FFFE009EFFFE00B4EEF300A4FF
+      FE00A8F9FE00ADFBFE00AAFFFE00B6F1FF00BCF2F800B3F9FF00B3FFFE00B9FF
+      FE00C3DFEA00CFD8FD00DFE5FE00CCF6FF00C9FFFE00CFFFFF00D1F7FF00DFFF
+      FF00EEF1FE00E5FFFF00F0F7FA00F5FFFF00FAFFFF00FEFEFE00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000020202020202020202020200000000000000000000000000026F6F6F6F
+      64076A6F6F0200000000000000090909090909026F6F6F450504446F6F020000
+      00000009091919172A3638026F6F26040404066F6F020000000009123A3F2E28
+      2D3D41026A070404260504456F02000000000D3B523F2E282D3D410206040545
+      6F4304066F02000000000D3B523F2E282D3D41024407636F6F6A050443020000
+      00000D3B523F2E282D3D41026F6F6F6F6F6F44040401000000000D3B523F2E28
+      2D3D41026F6F6F6F6F6F6F080403000000000D3B523F2E282D3D41026F6F6F6F
+      6F6F6F6A0704040000000D3B54534D4E5D656802020202020202020201030404
+      00000D585E48311C16111A2225354634090000000000040404000C321D1E2927
+      2C37404A23180F21090000000000000404040B30503F2E282D3D414D391E150D
+      090000000000000000000D3B523F2E282D3D414D391E15130900000000000000
+      00000D3B523F2E282D3D414D391F1513090000000000000000000D3B523F2E28
+      2D3D414D391F1513090000000000000000000D3B523F2E282D3D414D391E1513
+      090000000000000000000D3B523F2E282D3D414D391F15130900000000000000
+      00000D3C5B5F5B5B56565656513E2014090000000000000000000D626F69675F
+      595656565654422B090000000000000000000D246C6D69675F5656565656501C
+      09000000000000000000000D1033334B49473C3B2F2F0A090000000000000000
+      00000000000D0D0D0D0D0D0D0D0D000000000000000000000000}
+    ParentDoubleBuffered = False
+    TabOrder = 2
+    OnClick = bbGenerateNewKeyClick
+  end
+  object bbDelete: TBitBtn
+    Left = 382
+    Top = 251
+    Width = 159
+    Height = 36
+    Caption = 'Delete'
+    DoubleBuffered = True
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A00009A00039D020DA4020D
+      A400039D00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A020DA4041FB3072FC0
+      0732C20732C20732C20732C2072FC0041FB3020DA400009AFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A01079F0526B807
+      32C20732C20732C20732C20732C20732C20732C20732C20732C20732C20526B8
+      01079F00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0210
+      A7062FC50732C50732C20732C20732C20732C20732C20732C20732C20732C207
+      32C20732C20732C2072FC00210A700009AFF00FFFF00FFFF00FFFF00FFFF00FF
+      00009A0210A80633D00633CF0632CA0732C60732C20732C20732C20732C20732
+      C20732C20732C20732C20732C20732C20732C20732C20210A700009AFF00FFFF
+      00FFFF00FFFF00FF01079F0530D70533DA0633D50633D00632CB0732C70732C3
+      0732C20732C20732C20732C20732C20732C20732C20732C20732C20732C2072F
+      C001079FFF00FFFF00FFFF00FF00009A0427CC0534E40533DF0533DB022FD512
+      3DD44868DA042FC70430C30732C20732C20631C2002BC03E5FD01F46C8012CC0
+      0732C20732C20732C20526B800009AFF00FFFF00FF010DA90434EC0434EA0534
+      E50533E1113ADDB3C1F3FEFEFF7F95E50029C7042FC40631C20026BE5F7BD7F9
+      FAFDCED6F32146C80732C20732C20732C20732C2020DA4FF00FF00009A0321CB
+      0335F50434F00434EB0534E6224AE5EFF2FDFFFFFFFFFFFF7E95E60029C80024
+      C25F7AD7F9FAFEFFFFFFFFFFFF4464D10732C20732C20732C20732C2041FB300
+      009A00009A0431E90335FA0335F60434F10434EC002DE64164EAEBEEFCFFFFFF
+      FFFFFF718AE35875DCF9FAFEFFFFFFFCFCFE6781D9022CC00732C20732C20732
+      C20732C2072FC000009A00039E0737F30839FB0537FB0335F70434F20434ED00
+      28E64063EAEAEEFDFFFFFFFDFDFFFCFCFFFFFFFFFBFBFE6781DA0027BE0531C2
+      0732C20732C20732C20732C20732C200039D010DAC1241FB1E4AFB0C3CFB0335
+      FB0335F80435F30434EE0027E7385EEBE9EDFDFFFFFFFFFFFFF8F9FE5F7CDF00
+      25C50631C30732C20732C20732C20732C20732C20732C2020DA4020EAD224EFB
+      456AFC204CFB0335FB0335FB0335F90333F50029EF5272F1ECF0FDFFFFFFFFFF
+      FFF8F9FE718BE5002ACD0430CA0732C50732C20732C20732C20732C20732C202
+      0DA400039F2852F86785FD3E65FC0738FB0335FB0234FB002AFA5D7CF9F9FAFF
+      FFFFFFF4F6FEEEF1FDFFFFFFFFFFFF7E96E8002ACE0430CB0732C60732C30732
+      C20732C20732C200039D00009A2048F37792FD6B88FD1946FB0335FB0130FB5D
+      7DFDF9FAFFFFFFFFFCFCFF5978F3395DEDEBEEFDFFFFFFFFFFFF7F96E90631D1
+      0632CC0732C80732C30732C2072FC000009A00009A112ED76B88FD9AAEFD466B
+      FC093AFB214CFBFAFBFFFFFFFFFCFCFF6482FB002AF20027EC4063EEEBEEFDFF
+      FFFFFFFFFF4466E00633D20633CD0732C90732C4041FB300009AFF00FF0511B2
+      456AFCA8B9FE8FA5FD2E58FC0835FB92A7FDF1F4FF6583FD002AFB0234F90435
+      F40028ED4064EFE6EBFCABBAF5113ADE0633D80633D30633CF0632C9020DA4FF
+      00FFFF00FF00009A1B3DE57A94FDBFCCFE89A1FD2A54FC0637FB2652FC0030FB
+      0234FB0335FB0335FA0335F6002DF01F4AEE0A39E70130E20533DE0533D90633
+      D40526BF00009AFF00FFFF00FFFF00FF0108A72F56F792A8FDCDD7FE97ACFD45
+      6AFC1745FB0637FB0335FB0335FB0335FB0335FA0335F70434F20535ED0535E8
+      0534E40533DF0530D301079FFF00FFFF00FFFF00FFFF00FF00009A0717BA3A61
+      FC95AAFDCFD8FEB6C4FE7A94FD456AFC2752FC1745FB103FFB103FFB1543FB1B
+      48F91A46F40D3BEF0434E90533DF0210A900009AFF00FFFF00FFFF00FFFF00FF
+      FF00FF00009A0717BA3158F7839CFDC0CCFECDD7FEB8C6FE99ADFD7E97FD6C89
+      FD6583FD607FFC5073FC2E58FA0F3DF40431E60210AB00009AFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FF00009A0209A81F40E65073FC819AFDA1B4FE
+      AEBEFEA9BAFE9AAEFD839CFD6281FD3860FC1644F90529D90107A200009AFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A07
+      13B41733DA2C53F73A61FB4066FC3961FC2A54F81741F00826D2010DAD00009A
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FF00009A00009A0105A0020EB1010DB00003A000009A00
+      009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+    ParentDoubleBuffered = False
+    TabOrder = 7
+    OnClick = bbDeleteClick
+  end
+  object bbUpdatePassword: TBitBtn
+    Left = 382
+    Top = 8
+    Width = 159
+    Height = 38
+    Caption = 'Password'
+    DoubleBuffered = True
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -13
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000000000000101
+      0100020202000303030004040400050505000606060007070700080808000909
+      09000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F0F00101010001111
+      1100121212001313130014141400151515001616160017171700181818001919
+      19001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F1F00202020002121
+      2100222222002323230024242400252525002626260027272700282828002929
+      29002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F2F00303030003131
+      3100323232003333330034343400353535003636360037373700383838003939
+      39003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F3F00404040004141
+      4100424242004343430044444400454545004646460047474700484848004949
+      49004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F4F00505050005151
+      5100525252005353530054545400555555005656560057575700585858005959
+      59005A5A5A005B5B5B005C5C5C005D5D5D005E5E5E00685968007C4F7C009441
+      9400B72CB700DD15DD00F506F500FD01FD00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00F008F900D517F000BD24E800A830E1007B4B
+      D0005065C1003774B7002B7DB100237FAC001F82AD001C83AD001785AE001687
+      AF001489B100128AB300108CB6000F8EB9000D91BB000C94BF000A97C3000A99
+      C5000A9AC7000B9BC8000B9CCA000C9ECC000C9FCD000DA0CE000DA1CE000EA2
+      CF0011A3CF0015A4CF0018A5CF001CA7D10021A9D1002AAAD00035AACD0035AD
+      D00035AFD30035B1D60037B5D8003AB8DB003EB9DC0040BBDD0045BEDE004CC1
+      E00055C6E3005BC8E40061CAE40066CBE3006BCCE30072D3E60078D8EB0080D8
+      EE0083D9F10085DCF40088DBF5008BDBF6008EDAF70091DAF70095DCF70097E0
+      F7009EE3F800A4E7F900A9E9F900AEE9F900B5EBF900B2EBF800919191919191
+      919191919191919191919191919191919191919191919191D5E7E8E7E3DED591
+      919191919191919191919191919191D6DDF7F8F8F7F6F4EEE6D5919191919191
+      919191919191D7DADEF8F8F6F7F6EDF1F8F1E69191919191919191919191DADE
+      DFFAFAF8F7F7E9EDF7F7F8EB91919191919191919191DDE5E3FCFCFAFAEEE0E9
+      F3F7F7F7DC919191919191919191DEE7E4FEFEFCFCEDC5E0EFF7F6F6DC919191
+      919191919191DEEAE7FEFEFEFDFBC4C4F5F7F6F6DC919191919191919191E3EC
+      E9FEFEFEFEFEE0C3F9F7F6F6DC919191919191919191E3E9E3F8F8F1F1F8FBFB
+      FCFAF7F6DC919191919191919191DCEAEAE0E1E9E5E3DEE4EBF2FAF9DC919191
+      919191919191DBF3EEC5C5EFF3EBE5DDD9D6E6F5DC91919191919191919191D5
+      E8EDF1FAF6F0EAE4DAD1D2DBDC919191919191919191919191DBE8F0F3F3F3E4
+      D0CFE4D8DC919191919191919191919191919191D5DEE4DED2CFD4D491919191
+      91919191919191919191919191919191D2CE9191919191919191919191919191
+      91C8C89191919191D2CE919191919191919191919191919191D9D09191919191
+      D2CE919191919191919191919191919191E6E39191919191D2CE919191919191
+      919191919191919191E0F3CE91919191D2CE9191919191919191919191919191
+      9191EFF6E1C9C8CDD9CC91919191919191919191919191919191C9EDF9F3F3EB
+      DC91919191919191919191919191919191919191CBE0E1CF9191919191919191
+      9191919191919191919191919191919191919191919191919191}
+    ParentDoubleBuffered = False
+    ParentFont = False
+    TabOrder = 1
+    OnClick = bbUpdatePasswordClick
+  end
+  object bbExportAllWalletKeys: TBitBtn
+    Left = 30
+    Top = 425
+    Width = 201
+    Height = 36
+    Caption = 'Export all Wallet Keys to a file'
+    DoubleBuffered = True
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C8518FF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+      9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C8518
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+      FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+      00FF0C85181399220C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF0C85180C85180C85180C85
+      180C85180C85180C85180C85181DAC31139A220C8518FF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE0C8518
+      57E38851DD7E4AD77443D0693BC95E34C1522BBA4725B33C1EAE33149B230C85
+      18FF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+      DEFE77DEFE0C85185EE89059E48953DE804CD87645D16C3DCA6035C2542DBB49
+      26B53F1FAF35149B250C8518FF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+      F38FE8FF7CE2FE7CE3FE7CE3FE0C851861EB955FE9925AE58B54DF824DD97846
+      D26D3ECB6237C4562FBD4C27B64021B037159B250C8518FF00FFFF00FF019ACF
+      60CAEF1FA8D85EC1E1C2E6ED8ACEE08FCFE18ECFE10C851861EB9561EB955FEA
+      935CE58D56E0844FDB7A48D47040CD6538C65931BF4D1DA3320C8518FF00FFFF
+      00FFFF00FF019ACF65CFF53EB7E52CA9D4C5EFF8ACF3FEA5F2FFA5F2FF0C8518
+      61EB9561EB9561EB9561EB945CE68E57E18650DC7C49D57242CE6727AD410C85
+      18FF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F32A9CC673CBE7D6FEFDB1
+      FBFDB2FBFD0C85180C85180C85180C85180C85180C85180C85180C851852DD7F
+      32B6500C851898FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB748E
+      A224A8D5B9E7F3D5F5F9D5F6F9D6F6FADCFAFBCDFDFCB9FCFCAFFAFCB0FAFCB1
+      FAFC0C85183ABE5C0C85189FFCFFA4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+      8BDBFF5FCDFFB7898973C3DD18A2D218A2D216A2D215A1D21AA4D391D7EBEBFE
+      FDDBFDFCC5FBFBC2FBFB0C85180C851883E4F3B6FDFFBAFFFFB5FCFD019ACFFF
+      00FFFF00FF019ACF99E2FF67D3FFB88989FEF5ECFDF3EBF0EFEAE5EBE8D6E5E6
+      A4D2E025A6D34DB9DDE5F8FBF5FDFCEBFCFB0C8518C4FBFF9CE4F2DAFEFFD9FE
+      FFE3FFFFADE9F5019ACFFF00FF019ACF9FE9FF70DCFFB88989FEF3E9FFF2E6FE
+      F3E9FEF3E9FEF3E9FEF3E9D4E4E439ADD422A5D49DD8ECF1F9FBEEEFEFE9FDFF
+      CEEEF7F8FFFFF7FFFFFEFFFFE9F9FD019ACFFF00FF019ACFA7EFFF76E5FFB889
+      89FFF2E5FFF0E2FFF2E5FFF2E5FFF2E5FFF2E5FFF2E5EAEBE38EC9DA44B0D501
+      9ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACFFF00FF019ACF
+      ABF6FF7EEDFFB88989FFF0E2FFEFDFFFF0E2FFF0E2FFF0E2FFF0E2FFF0E2FEEE
+      E0FBECDEFAEBDEF6E6D9B8898993F7FF019ACFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACFC7FFFF82F5FFB88989FFEEDFFFECDBFFEEDFFFEEDFFFEEDF
+      FFEEDFF9E8D9DECCC1D9CABDCFBDB4C8B3ACB88989B5FFFF019ACFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFFB88989FFECDBFFEBD8FF
+      ECDBFFECDBFFECDBFFECDBF5E2D2C4ABA7C2A8A5BBA39FC2AFA9B88989019ACF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFB889
+      89FFEBD8FFEAD5FFEBD8FFEBD8FFEBD8FFEBD8FFEBD8D9C8C5FEFEFDFEF6EFDE
+      C9C0B88989FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FF019ACFB88989FFE9D5FFE8D3FFE9D5FFE9D5FFE9D5FFE9D5FFE9D5C6AD
+      A9FEF8F2E8D4CACD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFB88989FFE7D1FFE7D0FFE7D1FFE7D1FFE7D1
+      FFE7D1E7CEBFD3BFB9E8D5CCCD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB88989FFE6CFFFE6CFFF
+      E6CFFFE6CFFFE6CFFFE6CFD5BBB2E0CCC5CD9999FF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB889
+      89B88989B88989B88989B88989B88989B88989B88989B88989FF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+    ParentDoubleBuffered = False
+    TabOrder = 10
+    OnClick = bbExportAllWalletKeysClick
+  end
+  object bbImportKeysFile: TBitBtn
+    Left = 247
+    Top = 425
+    Width = 174
+    Height = 36
+    Caption = 'Import a Wallet Keys File'
+    DoubleBuffered = True
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+      9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+      FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF74DBFF7ADEFF79DDFF73D9
+      FF5CCCF522ACDD019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE71D9FE
+      71D9FE71D9FE73DAFE76DCFF7BDFFF7ADEFF78DCFF77DCFF019ACFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+      DEFE77DEFE77DEFE77DEFE77DEFE77DEFE76DEFE76DEFE76DEFE78DFFF7CE1FF
+      65D2F8019ACFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+      F38FE8FF7CE2FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7C
+      E3FE7DE4FE7DE3FE5ED1F3019ACFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      60CAEF1FA8D85EC1E2BBF4FE7DE7FE82E8FE81E8FE81E8FE81E8FE81E8FE81E8
+      FE81E8FE81E8FE81E8FE82E8FE84E9FE5ED3F18DEEFF019ACFFF00FFFF00FFFF
+      00FFFF00FF019ACF65CFF53EB7E529ACD8BFEEF88DEFFF85EDFF85EDFF85EDFF
+      85EDFF86EDFF86EDFF86EDFF86EDFF86EDFF87EDFF89EEFF65D9F396F5FF019A
+      CFFF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F31FA7D773CBE7C5FCFF93
+      F7FF93F7FF92F6FF8DF4FF89F3FF89F2FF8BF2FF8BF2FF8BF2FF8BF2FF8EF3FF
+      6ADEF395F8FF98FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB3EB8
+      E920A7D5B6E6F3D0F4FAD1F5FAD2F6FAD5F9FCB9FBFE9BF8FF8FF6FF91F6FF92
+      F6FF93F7FF6BD0B70C85188BEAE0A4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+      8BDBFF5FCDFF64CDFE2CAFE30D9FD30FA0D310A0D310A0D317A3D38ED7ECE2FD
+      FEC3FAFFA5F8FFA3F8FF84DDCF0C851838B5570C8518ABF3EBB5FCFD019ACFFF
+      00FFFF00FF019ACF99E2FF67D3FF6DD4FE6CD4FE69D1FE64CEFB61CDF95BC9F5
+      48BEEB17A3D54BB8DDDFF7FBE8FCFFB1E7DD0C85184ACE7361EB9541C1640C85
+      18D6F6F0ADE9F5019ACFFF00FF019ACF9FE9FF70DCFF76DDFE76DDFE76DDFE75
+      DCFE74DCFE73DCFE73DBFE61CEF61CA8D91CA5D58CCED70C851842C5665BE68C
+      59E1895DE78F3EBD600C8518DBF1EF019ACFFF00FF019ACFA7EFFF76E5FF7CE5
+      FF7CE5FF7CE5FF7CE5FF7DE5FF7DE5FF7DE5FF7DE3FF72DDFB40B8D20C85182D
+      AD474AD47250D97B55DE8359E1885AE38B33AF510C85180197C3FF00FF019ACF
+      ABF6FF7EEDFF85ECFF85ECFF85ECFF85ECFF84ECFF80ECFF7CECFF7DECFF7EEC
+      FF0C85180C85180C85180C851840C7634FDA7A55DF830C85180C85180C85180C
+      8518FF00FF019ACFC7FFFF82F5FF8FF5FF8FF5FF8FF5FF8EF5FF8DF4FFA0FDFF
+      B7FFFFAFFFFFAEFFFFA6F9F4A5FBF8A3FCFA4CB07732B74F48D6704AD3720C85
+      18FF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFF8AFCFF90FCFF90FCFF90
+      FCFF99FDFF86E8F5019ACF019ACF019ACF019ACF019ACF019ACF0486642CB347
+      41D16636BC540C8518FF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFBCFF
+      FFBCFFFFBCFFFFC0FFFF9DF5FB019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FF0C85182BB74538C9580C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FF019ACF019ACF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FF0C851828BB4126B13E0C8518FF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FF0C851814A4241CAE310C8518FF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C85180C96170D991A0C8518
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C85180C85180C85180C
+      8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+    ParentDoubleBuffered = False
+    TabOrder = 11
+    OnClick = bbImportKeysFileClick
+  end
+  object bbLock: TBitBtn
+    Left = 310
+    Top = 8
+    Width = 66
+    Height = 36
+    Caption = 'Lock'
+    DoubleBuffered = True
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000000000000101
+      0100020202000303030004040400050505000606060007070700080808000909
+      09000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F0F00101010001111
+      1100121212001313130014141400151515001616160017171700181818001919
+      19001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F1F00202020002121
+      2100222222002323230024242400252525002626260027272700282828002929
+      29002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F2F00303030003131
+      3100323232003333330034343400353535003636360037373700383838003939
+      39003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F3F00404040004141
+      4100424242004343430044444400454545004646460047474700484848004949
+      49004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F4F00505050005151
+      5100525252005353530054545400555555006A4B6A00853F8500B626B600E30F
+      E300F803F800FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00F51CFE00E841FC00DE5FFC00D492FB00CDB6FA00CACDFA00CADCFA00CAE5
+      FA00CAEAFA00CDEEFA00CDF1FA00C7F0FA00BBEEF900B1EAF800AAE8F800A5E6
+      F8009EE2F7009BE0F70098E0F70095DCF70093DBF80091DAF80090DAF7008EDC
+      F6008BDDF50088DDF40085DDF40082DDF3007FDCF3007ADCF20079DAF10077D6
+      EE0076D1EB0074CCE8006FC6E40069C5E20063C4E1005CC1DF0056C1E00050C0
+      E0004DC1E10048C0E00045BEDF0042BBDE0040BBDE003DB9DD003AB9DD0037B8
+      DC0035B6DB0033B5DA0031B3D9002EB1D8002AAFD70025ACD4001EA9D30019A6
+      D10015A5D00013A3CF0011A2CE0010A0CC00109ECA00119ECA00139DC800169B
+      C4001999C1001B94BB001A91B8001C8DB4001E90B7002092B8008A8A8A8A8A8A
+      8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A
+      8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8AF6E7E4E7ECEFF78A8A8A8A8A8A8A8A8A
+      8A8A8A8A8A8A8AF5F0CECECECED0D4DCE7F68A8A8A8A8A8A8A8A8A8A8A8AF5F2
+      EFCDCDD0CFD0DDDACDD6E78A8A8A8A8A8A8A8A8A8A8AF3EEEECACACDD0D0E1DE
+      CECECEDF8A8A8A8A8A8A8A8A8A8AF1E9EDC8C8CACBDDF9E0D4CFD0CEF28A8A8A
+      8A8A8A8A8A8AF0E6EAC6C6C8C8DEFDE7DBCED0D0F28A8A8A8A8A8A8A8A8AEFE2
+      E7C4C4C6C7C9FDFED0D0D0D0F28A8A8A8A8A8A8A8A8AEDD9E3C4C4C4C4C6DFFF
+      CCCFD0D0F28A8A8A8A8A8A8A8A8AEDE2EDCBCDD2D2CDC9C9C8CACED0F28A8A8A
+      8A8A8A8A8A8AF2E3E2E7E6E6ECEFECE1D9CAC9E2F28A8A8A8A8A8A8A8A8AF3D3
+      DEF6F9D6D7E2E9F2F5EEDAE1F28A8A8A8A8A8A8A8A8A8AF1EFF6FACCD2D7E2EF
+      F8F9EBF1F28A8A8A8A8A8A8A8A8A8A8AFDF5FBDFD6D7D9FAF9FBEBF68A8A8A8A
+      8A8A8A8A8A8A8A8A8AF4FC8A8AF1EFFAF8FBF58A8A8A8A8A8A8A8A8A8A8A8A8A
+      8AE8F98A8A8A8AFDF6FD8A8A8A8A8A8A8A8A8A8A8A8A8A8A8AE0D9FD8A8A8AFD
+      F5FD8A8A8A8A8A8A8A8A8A8A8A8A8A8A8AFED2D9FF8AFDFAF68A8A8A8A8A8A8A
+      8A8A8A8A8A8A8A8A8A8AFFD7D1D7DAE6FC8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A
+      8A8A8A8AFFE5E7FD8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A
+      8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A
+      8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A}
+    ParentDoubleBuffered = False
+    TabOrder = 12
+    OnClick = bbLockClick
+  end
+  object SaveDialog: TSaveDialog
+    DefaultExt = 'dat'
+    Filter = 'Wallet keys file|*.dat|All files|*.*'
+    FilterIndex = 0
+    Left = 150
+    Top = 150
+  end
+  object OpenDialog: TOpenDialog
+    DefaultExt = 'dat'
+    Filter = 'Wallet keys file (*.dat)|*.dat|All files (*.*)|*.*'
+    FilterIndex = 0
+    Left = 205
+    Top = 155
+  end
+end

+ 793 - 0
src/gui-classic/UFRMWalletKeys.lfm

@@ -0,0 +1,793 @@
+object FRMWalletKeys: TFRMWalletKeys
+  Left = 628
+  Height = 478
+  Top = 282
+  Width = 569
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = 'Wallet keys'
+  ClientHeight = 478
+  ClientWidth = 569
+  Color = clBtnFace
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  OnCreate = FormCreate
+  Position = poOwnerFormCenter
+  LCLVersion = '1.8.0.6'
+  Visible = False
+  object lblEncryptionTypeCaption: TLabel
+    Left = 30
+    Height = 13
+    Top = 298
+    Width = 80
+    Caption = 'Encryption type:'
+    ParentColor = False
+  end
+  object lblEncryptionType: TLabel
+    Left = 125
+    Height = 13
+    Top = 298
+    Width = 54
+    Caption = '000000000'
+    ParentColor = False
+  end
+  object lblKeyNameCaption: TLabel
+    Left = 30
+    Height = 13
+    Top = 317
+    Width = 51
+    Caption = 'Key name:'
+    ParentColor = False
+  end
+  object lblKeyName: TLabel
+    Left = 125
+    Height = 13
+    Top = 317
+    Width = 313
+    AutoSize = False
+    Caption = '000000000'
+    ParentColor = False
+  end
+  object lblPrivateKeyCaption: TLabel
+    Left = 30
+    Height = 13
+    Top = 336
+    Width = 58
+    Caption = 'Private key:'
+    ParentColor = False
+  end
+  object lblPrivateKeyCaption2: TLabel
+    Left = 30
+    Height = 13
+    Top = 355
+    Width = 80
+    Caption = '(In hexa format)'
+    ParentColor = False
+  end
+  object lblKeysEncrypted: TLabel
+    Left = 30
+    Height = 39
+    Top = 15
+    Width = 259
+    AutoSize = False
+    Caption = 'lblKeysEncrypted'
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+    WordWrap = True
+  end
+  object lbWalletKeys: TListBox
+    Left = 30
+    Height = 227
+    Top = 60
+    Width = 346
+    ItemHeight = 0
+    OnClick = lbWalletKeysClick
+    ScrollWidth = 344
+    TabOrder = 0
+  end
+  object bbExportPrivateKey: TBitBtn
+    Left = 382
+    Height = 36
+    Top = 136
+    Width = 159
+    Caption = 'Export Private key'
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000FF00FF005251
+      5100565758005A5958005B5D5D005D5E5E006361610066666600696969006C6B
+      6B0073706F0072707000747271000E80AA001788AF000B86B2000C85B000098A
+      B700078CBA00198EB7000E91BE001E94BC002898BA003E99BB000493C4000997
+      C7000A9ECF00229BC20035A0C30030AACA0032AACE003DAACC003FB0CB0036A9
+      D0003BB1D9003DBDDA0039B8DE0029BBE0004DBBD90068B0CA0019C7F1001BD4
+      FE002FC6E7003ECDE9002CD3F9002ED8FE003CE0FE0054C0D40059C4D70059C2
+      DD006FC2D6007CC0D50078C1D80049DDFE0054DFFE0061C6E5006CD4EE0064D9
+      E90076DFE9007DDFE90055E0FF0058E0FE006BE3F40063E6FE0060ECFE0075E2
+      FA0077E6FF007BE8FF0071F2FE0088828000928E8C0096908F00969291009794
+      94009E969400A09C9B00A19F9E00ACA09E00A6A2A100A6A4A400ADA5A300AAA5
+      A400ABA8A800ADAAA900B0A5A300B2A7A500B2ABAB00B4ABA900BBB1AE00BEB1
+      AF00BAB3B200BAB4B200BEB6B400C4B8B600C1BCBB0083DFE9008ADAEB0094DF
+      E90089DDF100A4DFEA009AE2F40095EBFD0095EDFE009EEDFF0084F3F90080F5
+      FC008FF6FB0083F8FE0093F2FE0097F9FE0094FDFE0099FFFE009EFFFE00AAEF
+      FD00B4EEF300A4FFFE00A8F9FE00ADFBFE00AAFFFE00B6F1FF00BCF2F800B3F9
+      FF00B3FFFE00B9FFFE00C7C2C100C7C6C600CCC4C200CAC7C600CFCCCC00D1C7
+      C500D4CBC900D1CDCD00D5CFCE00D8D0CE00D7D1D000D9D5D400DCD7D600DFD8
+      D600E3DEDD00C3DFEA00CCF6FF00C9FFFE00CFFFFF00D1F7FF00DBF8FE00DFFF
+      FF00E7E3E200E9E5E500ECE9E900EFEEED00F1EBEA00F1EFEE00E5FFFF00F3F1
+      F100F6F2F000F8F5F300F8F5F400F0F7FA00F5FFFF00FBF8F800FAFFFF00FFFE
+      FE00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0007070707000000000000000000000000000000000000000746967E07000000
+      0000000000000000000000000000000D085E489A5E080D0D0000000000000000
+      00000000000D0D2626075E48A1071F130D0D000000000000000000000D163940
+      3F35075E4C93070707100D000000000000000000123A6B402E353D075E519580
+      4E0707070707000000000000123A6B402E293D42075E4EA19289858281550700
+      00000000123A6B402E292D4266075E4C9689865A475D4D0700000000123A6B40
+      2E292D3C6671077D928A7D0A0A58580700000000123A6B402E292D3C4371079A
+      958007035151550700000000123A6D6C6667778C8F90079A860701574C024A07
+      0000000012727860311E1B151C3407A17E0B534C000445070000000011322023
+      2A282C36426407539A8882040404570700000000103169402E292D3643716207
+      5393825A515A5A0700000000123A6B402E292D3C436662370707070708070700
+      00000000123A6B402E292D3C43663837222117000000000000000000123A6B40
+      2E292D3C436638231A180D000000000000000000123A6B402E292D3C43663822
+      1A180D000000000000000000123A6B402E292D3C436638231A180D0000000000
+      00000000123B757975756F6F6F6F6A3E25190D000000000000000000128BA190
+      8E79736F6F6F6F6D442B0D00000000000000000012279D9D908E796F6F6F6F6F
+      691E0D000000000000000000001214333363615F3B3A2F2F0E0D000000000000
+      0000000000000014121212121212121200000000000000000000
+    }
+    OnClick = bbExportPrivateKeyClick
+    TabOrder = 4
+  end
+  object memoPrivateKey: TMemo
+    Left = 125
+    Height = 80
+    Top = 336
+    Width = 416
+    Color = clBtnFace
+    Font.Color = clBlack
+    Font.Height = -16
+    Font.Name = 'Tahoma'
+    Lines.Strings = (
+      'memoPrivateKey'
+    )
+    ParentFont = False
+    ReadOnly = True
+    TabOrder = 9
+    TabStop = False
+  end
+  object bbChangeName: TBitBtn
+    Left = 440
+    Height = 25
+    Top = 305
+    Width = 101
+    Caption = 'Change Name'
+    OnClick = bbChangeNameClick
+    TabOrder = 8
+  end
+  object bbImportPrivateKey: TBitBtn
+    Left = 382
+    Height = 36
+    Top = 98
+    Width = 159
+    Caption = 'Import Private key'
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000FF00FF000571
+      0A0008750D0024B53B0029B942002ABA44002EBD4A002FBF4C0033C1500034C2
+      520035C3540037C5570039C659003BC85C003CC95E003FCC630040CC650045D0
+      6B0046D16C0049D472004BD675004ED8790050D97B0051DA7E000E80AA001788
+      AF000B86B200098AB700078CBA00198EB700118EB9000E91BE001E94BC002898
+      BA0055DD810056DF850058E087000493C4000997C7000C9BCB000A9DCE00229B
+      C20015AFD90026A0C80021AACF0035A0C30030AACA0032AACE003DAACC003FB0
+      CB0031AED7003DBDDA0039B8DE0029BBE00056B1CE0052BDDB0068B0CA006BBD
+      D70019C7F1001BD4FE002FC6E70026C2E9003ECDE9002CD3F9002ED8FE003CE0
+      FE0054C0D40059C4D70059C2DD006FC2D60062C3DE007CC0D5007AC6DF0043C8
+      E90054DFFE0060CEEA0079CFE9006CD4EE0064D9E90076DFE9007DDFE90055E0
+      FF006BE3F40060ECFE0075E2FA007BE8FF0071F2FE008FD0E60083DFE9008ADA
+      EB0094DFE90081DBF100A4DFEA0095EBFD0095EEFE009EEDFF0084F3F90080F5
+      FC008FF6FB0083F8FE0093F2FE0097F9FE0094FDFE0099FFFE009EFFFE00AFE8
+      F600B4EEF300A4FFFE00A8F9FE00ADFBFE00AAFFFE00B6F1FF00BCF2F800B3F9
+      FF00B3FFFE00B9FFFE00C3DFEA00CCF6FF00C9FFFE00CFFFFF00D1F6FE00DFFF
+      FF00E5FFFF00F0F7FA00F5FFFF00FAFFFF000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000202020200000000000000000000000000000000000000
+      0002040302000000000000000000001818181818181818180002060402000000
+      000000000018182C2C2A3D494B46301D18020906020000000000000018214E53
+      413B4051555D4D3427020D0902000000000000001C4F6353413B405102020202
+      02020F0D02020202020200001C4F6353413B405102242317151311100D090906
+      040200001C4F6353413B40510224242323151311100F0D09060200001C4F6353
+      413B4051020101010102171302010101020100001C4F6353413B4051555D4D34
+      2702231702000000000000001C4F65645D5F6F757878694C3202242302000000
+      000000001C6A7059442F29202D3639485702242402000000000000001B453134
+      3C3A3F4A545B372B1E02242402000000000000001A436153413B4051555D4D34
+      2701020202000000000000001C4F6353413B4051555D4D342725180000000000
+      000000001C4F6353413B4051555D4D342725180000000000000000001C4F6353
+      413B4051555D4D342725180000000000000000001C4F6353413B4051555D4D34
+      2825180000000000000000001C4F6353413B4051555D4D342725180000000000
+      000000001C506D716D6D6767676762523527180000000000000000001C747D7A
+      77716B6767676765563E180000000000000000001C387B7C7977716767676767
+      612F18000000000000000000001C1F47475C5A58504F42421918000000000000
+      000000000000001C1C1C1C1C1C1C1C1C00000000000000000000
+    }
+    OnClick = bbImportPrivateKeyClick
+    TabOrder = 3
+  end
+  object bbExportPublicKey: TBitBtn
+    Left = 382
+    Height = 36
+    Top = 212
+    Width = 159
+    Caption = 'Export Public key'
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C8518FF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+      9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C8518
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+      FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+      00FF0C85181399220C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF0C85180C85180C85180C85
+      180C85180C85180C85180C85181DAC31139A220C8518FF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE0C8518
+      57E38851DD7E4AD77443D0693BC95E34C1522BBA4725B33C1EAE33149B230C85
+      18FF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+      DEFE77DEFE0C85185EE89059E48953DE804CD87645D16C3DCA6035C2542DBB49
+      26B53F1FAF35149B250C8518FF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+      F38FE8FF7CE2FE7CE3FE7CE3FE0C851861EB955FE9925AE58B54DF824DD97846
+      D26D3ECB6237C4562FBD4C27B64021B037159B250C8518FF00FFFF00FF019ACF
+      60CAEF1FA8D85EC1E1C2E6ED8ACEE08FCFE18ECFE10C851861EB9561EB955FEA
+      935CE58D56E0844FDB7A48D47040CD6538C65931BF4D1DA3320C8518FF00FFFF
+      00FFFF00FF019ACF65CFF53EB7E52CA9D4C5EFF8ACF3FEA5F2FFA5F2FF0C8518
+      61EB9561EB9561EB9561EB945CE68E57E18650DC7C49D57242CE6727AD410C85
+      18FF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F32A9CC673CBE7D6FEFDB1
+      FBFDB2FBFD0C85180C85180C85180C85180C85180C85180C85180C851852DD7F
+      32B6500C851898FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB748E
+      A224A8D5B9E7F3D5F5F9D5F6F9D6F6FADCFAFBCDFDFCB9FCFCAFFAFCB0FAFCB1
+      FAFC0C85183ABE5C0C85189FFCFFA4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+      8BDBFF5FCDFFB7898973C3DD18A2D218A2D216A2D215A1D21AA4D391D7EBEBFE
+      FDDBFDFCC5FBFBC2FBFB0C85180C851883E4F3B6FDFFBAFFFFB5FCFD019ACFFF
+      00FFFF00FF019ACF99E2FF67D3FFB88989FEF5ECFDF3EBF0EFEAE5EBE8D6E5E6
+      A4D2E025A6D34DB9DDE5F8FBF5FDFCEBFCFB0C8518C4FBFF9CE4F2DAFEFFD9FE
+      FFE3FFFFADE9F5019ACFFF00FF019ACF9FE9FF70DCFFB88989FEF3E9FFF2E6FE
+      F3E9FEF3E9FEF3E9FEF3E9D4E4E439ADD422A5D49DD8ECF1F9FBEEEFEFE9FDFF
+      CEEEF7F8FFFFF7FFFFFEFFFFE9F9FD019ACFFF00FF019ACFA7EFFF76E5FFB889
+      89FFF2E5FFF0E2FFF2E5FFF2E5FFF2E5FFF2E5FFF2E5EAEBE38EC9DA44B0D501
+      9ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACFFF00FF019ACF
+      ABF6FF7EEDFFB88989FFF0E2FFEFDFFFF0E2FFF0E2FFF0E2FFF0E2FFF0E2FEEE
+      E0FBECDEFAEBDEF6E6D9B8898993F7FF019ACFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACFC7FFFF82F5FFB88989FFEEDFFFECDBFFEEDFFFEEDFFFEEDF
+      FFEEDFF9E8D9DECCC1D9CABDCFBDB4C8B3ACB88989B5FFFF019ACFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFFB88989FFECDBFFEBD8FF
+      ECDBFFECDBFFECDBFFECDBF5E2D2C4ABA7C2A8A5BBA39FC2AFA9B88989019ACF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFB889
+      89FFEBD8FFEAD5FFEBD8FFEBD8FFEBD8FFEBD8FFEBD8D9C8C5FEFEFDFEF6EFDE
+      C9C0B88989FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FF019ACFB88989FFE9D5FFE8D3FFE9D5FFE9D5FFE9D5FFE9D5FFE9D5C6AD
+      A9FEF8F2E8D4CACD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFB88989FFE7D1FFE7D0FFE7D1FFE7D1FFE7D1
+      FFE7D1E7CEBFD3BFB9E8D5CCCD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB88989FFE6CFFFE6CFFF
+      E6CFFFE6CFFFE6CFFFE6CFD5BBB2E0CCC5CD9999FF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB889
+      89B88989B88989B88989B88989B88989B88989B88989B88989FF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+    }
+    OnClick = bbExportPublicKeyClick
+    TabOrder = 6
+  end
+  object bbImportPublicKey: TBitBtn
+    Left = 382
+    Height = 36
+    Top = 174
+    Width = 159
+    Caption = 'Import Public key'
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+      9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+      FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF74DBFF7ADEFF79DDFF73D9
+      FF5CCCF522ACDD019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE71D9FE
+      71D9FE71D9FE73DAFE76DCFF7BDFFF7ADEFF78DCFF77DCFF019ACFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+      DEFE77DEFE77DEFE77DEFE77DEFE77DEFE76DEFE76DEFE76DEFE78DFFF7CE1FF
+      65D2F8019ACFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+      F38FE8FF7CE2FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7C
+      E3FE7DE4FE7DE3FE5ED1F3019ACFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      60CAEF1FA8D85EC1E2BBF4FE7DE7FE82E8FE81E8FE81E8FE81E8FE81E8FE81E8
+      FE81E8FE81E8FE81E8FE82E8FE84E9FE5ED3F18DEEFF019ACFFF00FFFF00FFFF
+      00FFFF00FF019ACF65CFF53EB7E529ACD8BFEEF88DEFFF85EDFF85EDFF85EDFF
+      85EDFF86EDFF86EDFF86EDFF86EDFF86EDFF87EDFF89EEFF65D9F396F5FF019A
+      CFFF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F31FA7D773CBE7C5FCFF93
+      F7FF93F7FF92F6FF8DF4FF89F3FF89F2FF8BF2FF8BF2FF8BF2FF8BF2FF8EF3FF
+      6ADEF395F8FF98FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB3EB8
+      E920A7D5B6E6F3D0F4FAD1F5FAD2F6FAD5F9FCB9FBFE9BF8FF8FF6FF91F6FF92
+      F6FF93F7FF6BD0B70C85188BEAE0A4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+      8BDBFF5FCDFF64CDFE2CAFE30D9FD30FA0D310A0D310A0D317A3D38ED7ECE2FD
+      FEC3FAFFA5F8FFA3F8FF84DDCF0C851838B5570C8518ABF3EBB5FCFD019ACFFF
+      00FFFF00FF019ACF99E2FF67D3FF6DD4FE6CD4FE69D1FE64CEFB61CDF95BC9F5
+      48BEEB17A3D54BB8DDDFF7FBE8FCFFB1E7DD0C85184ACE7361EB9541C1640C85
+      18D6F6F0ADE9F5019ACFFF00FF019ACF9FE9FF70DCFF76DDFE76DDFE76DDFE75
+      DCFE74DCFE73DCFE73DBFE61CEF61CA8D91CA5D58CCED70C851842C5665BE68C
+      59E1895DE78F3EBD600C8518DBF1EF019ACFFF00FF019ACFA7EFFF76E5FF7CE5
+      FF7CE5FF7CE5FF7CE5FF7DE5FF7DE5FF7DE5FF7DE3FF72DDFB40B8D20C85182D
+      AD474AD47250D97B55DE8359E1885AE38B33AF510C85180197C3FF00FF019ACF
+      ABF6FF7EEDFF85ECFF85ECFF85ECFF85ECFF84ECFF80ECFF7CECFF7DECFF7EEC
+      FF0C85180C85180C85180C851840C7634FDA7A55DF830C85180C85180C85180C
+      8518FF00FF019ACFC7FFFF82F5FF8FF5FF8FF5FF8FF5FF8EF5FF8DF4FFA0FDFF
+      B7FFFFAFFFFFAEFFFFA6F9F4A5FBF8A3FCFA4CB07732B74F48D6704AD3720C85
+      18FF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFF8AFCFF90FCFF90FCFF90
+      FCFF99FDFF86E8F5019ACF019ACF019ACF019ACF019ACF019ACF0486642CB347
+      41D16636BC540C8518FF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFBCFF
+      FFBCFFFFBCFFFFC0FFFF9DF5FB019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FF0C85182BB74538C9580C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FF019ACF019ACF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FF0C851828BB4126B13E0C8518FF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FF0C851814A4241CAE310C8518FF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C85180C96170D991A0C8518
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C85180C85180C85180C
+      8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+    }
+    OnClick = bbImportPublicKeyClick
+    TabOrder = 5
+  end
+  object bbGenerateNewKey: TBitBtn
+    Left = 382
+    Height = 36
+    Top = 60
+    Width = 159
+    Caption = 'Generate a new Key'
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000FF00FF007D33
+      2F00993300000C35EB000335FB001342FB00224EFB00325BFC005274FC000E80
+      AA001788AF000B86B200098AB700078CBA00078EBD00118EB9000E91BE001E94
+      BC002898BA000493C4000997C7000A9DCE00229BC20015AFD90026A0C80021AA
+      CF0035A0C30030AACA0032AACE003FB0CB003DBDDA0039B8DE0029BBE00046A6
+      C90056B1CE0052BDDB0068B0CA006BBDD700718DFC0019C7F1001BD4FE002FC6
+      E70026C2E9003ECDE9002CD3F9002ED8FE003CE0FE0054C0D40059C4D70059C2
+      DD006FC2D6007CC0D50076C4DF007AC6DF0043C8E90054DFFE0060CEEA006CD4
+      EE0064D9E90076DFE9007DDFE90055E0FF006BE3F40060ECFE0075E2FA007BE8
+      FF0071F2FE008099FC00A0B2FD00AFBFFD008FD0E60083DFE9008ADAEB0094DF
+      E90081DBF100A4DFEA0095EBFD0095EEFE009EEDFF0084F3F90080F5FC008FF6
+      FB0083F8FE0093F2FE0097F9FE0094FDFE0099FFFE009EFFFE00B4EEF300A4FF
+      FE00A8F9FE00ADFBFE00AAFFFE00B6F1FF00BCF2F800B3F9FF00B3FFFE00B9FF
+      FE00C3DFEA00CFD8FD00DFE5FE00CCF6FF00C9FFFE00CFFFFF00D1F7FF00DFFF
+      FF00EEF1FE00E5FFFF00F0F7FA00F5FFFF00FAFFFF00FEFEFE00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000020202020202020202020200000000000000000000000000026F6F6F6F
+      64076A6F6F0200000000000000090909090909026F6F6F450504446F6F020000
+      00000009091919172A3638026F6F26040404066F6F020000000009123A3F2E28
+      2D3D41026A070404260504456F02000000000D3B523F2E282D3D410206040545
+      6F4304066F02000000000D3B523F2E282D3D41024407636F6F6A050443020000
+      00000D3B523F2E282D3D41026F6F6F6F6F6F44040401000000000D3B523F2E28
+      2D3D41026F6F6F6F6F6F6F080403000000000D3B523F2E282D3D41026F6F6F6F
+      6F6F6F6A0704040000000D3B54534D4E5D656802020202020202020201030404
+      00000D585E48311C16111A2225354634090000000000040404000C321D1E2927
+      2C37404A23180F21090000000000000404040B30503F2E282D3D414D391E150D
+      090000000000000000000D3B523F2E282D3D414D391E15130900000000000000
+      00000D3B523F2E282D3D414D391F1513090000000000000000000D3B523F2E28
+      2D3D414D391F1513090000000000000000000D3B523F2E282D3D414D391E1513
+      090000000000000000000D3B523F2E282D3D414D391F15130900000000000000
+      00000D3C5B5F5B5B56565656513E2014090000000000000000000D626F69675F
+      595656565654422B090000000000000000000D246C6D69675F5656565656501C
+      09000000000000000000000D1033334B49473C3B2F2F0A090000000000000000
+      00000000000D0D0D0D0D0D0D0D0D000000000000000000000000
+    }
+    OnClick = bbGenerateNewKeyClick
+    TabOrder = 2
+  end
+  object bbDelete: TBitBtn
+    Left = 382
+    Height = 36
+    Top = 251
+    Width = 159
+    Caption = 'Delete'
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A00009A00039D020DA4020D
+      A400039D00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A020DA4041FB3072FC0
+      0732C20732C20732C20732C2072FC0041FB3020DA400009AFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A01079F0526B807
+      32C20732C20732C20732C20732C20732C20732C20732C20732C20732C20526B8
+      01079F00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0210
+      A7062FC50732C50732C20732C20732C20732C20732C20732C20732C20732C207
+      32C20732C20732C2072FC00210A700009AFF00FFFF00FFFF00FFFF00FFFF00FF
+      00009A0210A80633D00633CF0632CA0732C60732C20732C20732C20732C20732
+      C20732C20732C20732C20732C20732C20732C20732C20210A700009AFF00FFFF
+      00FFFF00FFFF00FF01079F0530D70533DA0633D50633D00632CB0732C70732C3
+      0732C20732C20732C20732C20732C20732C20732C20732C20732C20732C2072F
+      C001079FFF00FFFF00FFFF00FF00009A0427CC0534E40533DF0533DB022FD512
+      3DD44868DA042FC70430C30732C20732C20631C2002BC03E5FD01F46C8012CC0
+      0732C20732C20732C20526B800009AFF00FFFF00FF010DA90434EC0434EA0534
+      E50533E1113ADDB3C1F3FEFEFF7F95E50029C7042FC40631C20026BE5F7BD7F9
+      FAFDCED6F32146C80732C20732C20732C20732C2020DA4FF00FF00009A0321CB
+      0335F50434F00434EB0534E6224AE5EFF2FDFFFFFFFFFFFF7E95E60029C80024
+      C25F7AD7F9FAFEFFFFFFFFFFFF4464D10732C20732C20732C20732C2041FB300
+      009A00009A0431E90335FA0335F60434F10434EC002DE64164EAEBEEFCFFFFFF
+      FFFFFF718AE35875DCF9FAFEFFFFFFFCFCFE6781D9022CC00732C20732C20732
+      C20732C2072FC000009A00039E0737F30839FB0537FB0335F70434F20434ED00
+      28E64063EAEAEEFDFFFFFFFDFDFFFCFCFFFFFFFFFBFBFE6781DA0027BE0531C2
+      0732C20732C20732C20732C20732C200039D010DAC1241FB1E4AFB0C3CFB0335
+      FB0335F80435F30434EE0027E7385EEBE9EDFDFFFFFFFFFFFFF8F9FE5F7CDF00
+      25C50631C30732C20732C20732C20732C20732C20732C2020DA4020EAD224EFB
+      456AFC204CFB0335FB0335FB0335F90333F50029EF5272F1ECF0FDFFFFFFFFFF
+      FFF8F9FE718BE5002ACD0430CA0732C50732C20732C20732C20732C20732C202
+      0DA400039F2852F86785FD3E65FC0738FB0335FB0234FB002AFA5D7CF9F9FAFF
+      FFFFFFF4F6FEEEF1FDFFFFFFFFFFFF7E96E8002ACE0430CB0732C60732C30732
+      C20732C20732C200039D00009A2048F37792FD6B88FD1946FB0335FB0130FB5D
+      7DFDF9FAFFFFFFFFFCFCFF5978F3395DEDEBEEFDFFFFFFFFFFFF7F96E90631D1
+      0632CC0732C80732C30732C2072FC000009A00009A112ED76B88FD9AAEFD466B
+      FC093AFB214CFBFAFBFFFFFFFFFCFCFF6482FB002AF20027EC4063EEEBEEFDFF
+      FFFFFFFFFF4466E00633D20633CD0732C90732C4041FB300009AFF00FF0511B2
+      456AFCA8B9FE8FA5FD2E58FC0835FB92A7FDF1F4FF6583FD002AFB0234F90435
+      F40028ED4064EFE6EBFCABBAF5113ADE0633D80633D30633CF0632C9020DA4FF
+      00FFFF00FF00009A1B3DE57A94FDBFCCFE89A1FD2A54FC0637FB2652FC0030FB
+      0234FB0335FB0335FA0335F6002DF01F4AEE0A39E70130E20533DE0533D90633
+      D40526BF00009AFF00FFFF00FFFF00FF0108A72F56F792A8FDCDD7FE97ACFD45
+      6AFC1745FB0637FB0335FB0335FB0335FB0335FA0335F70434F20535ED0535E8
+      0534E40533DF0530D301079FFF00FFFF00FFFF00FFFF00FF00009A0717BA3A61
+      FC95AAFDCFD8FEB6C4FE7A94FD456AFC2752FC1745FB103FFB103FFB1543FB1B
+      48F91A46F40D3BEF0434E90533DF0210A900009AFF00FFFF00FFFF00FFFF00FF
+      FF00FF00009A0717BA3158F7839CFDC0CCFECDD7FEB8C6FE99ADFD7E97FD6C89
+      FD6583FD607FFC5073FC2E58FA0F3DF40431E60210AB00009AFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FF00009A0209A81F40E65073FC819AFDA1B4FE
+      AEBEFEA9BAFE9AAEFD839CFD6281FD3860FC1644F90529D90107A200009AFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A07
+      13B41733DA2C53F73A61FB4066FC3961FC2A54F81741F00826D2010DAD00009A
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FF00009A00009A0105A0020EB1010DB00003A000009A00
+      009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+    }
+    OnClick = bbDeleteClick
+    TabOrder = 7
+  end
+  object bbUpdatePassword: TBitBtn
+    Left = 382
+    Height = 38
+    Top = 8
+    Width = 159
+    Caption = 'Password'
+    Font.Color = clWindowText
+    Font.Height = -13
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000000000000101
+      0100020202000303030004040400050505000606060007070700080808000909
+      09000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F0F00101010001111
+      1100121212001313130014141400151515001616160017171700181818001919
+      19001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F1F00202020002121
+      2100222222002323230024242400252525002626260027272700282828002929
+      29002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F2F00303030003131
+      3100323232003333330034343400353535003636360037373700383838003939
+      39003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F3F00404040004141
+      4100424242004343430044444400454545004646460047474700484848004949
+      49004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F4F00505050005151
+      5100525252005353530054545400555555005656560057575700585858005959
+      59005A5A5A005B5B5B005C5C5C005D5D5D005E5E5E00685968007C4F7C009441
+      9400B72CB700DD15DD00F506F500FD01FD00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00F008F900D517F000BD24E800A830E1007B4B
+      D0005065C1003774B7002B7DB100237FAC001F82AD001C83AD001785AE001687
+      AF001489B100128AB300108CB6000F8EB9000D91BB000C94BF000A97C3000A99
+      C5000A9AC7000B9BC8000B9CCA000C9ECC000C9FCD000DA0CE000DA1CE000EA2
+      CF0011A3CF0015A4CF0018A5CF001CA7D10021A9D1002AAAD00035AACD0035AD
+      D00035AFD30035B1D60037B5D8003AB8DB003EB9DC0040BBDD0045BEDE004CC1
+      E00055C6E3005BC8E40061CAE40066CBE3006BCCE30072D3E60078D8EB0080D8
+      EE0083D9F10085DCF40088DBF5008BDBF6008EDAF70091DAF70095DCF70097E0
+      F7009EE3F800A4E7F900A9E9F900AEE9F900B5EBF900B2EBF800919191919191
+      919191919191919191919191919191919191919191919191D5E7E8E7E3DED591
+      919191919191919191919191919191D6DDF7F8F8F7F6F4EEE6D5919191919191
+      919191919191D7DADEF8F8F6F7F6EDF1F8F1E69191919191919191919191DADE
+      DFFAFAF8F7F7E9EDF7F7F8EB91919191919191919191DDE5E3FCFCFAFAEEE0E9
+      F3F7F7F7DC919191919191919191DEE7E4FEFEFCFCEDC5E0EFF7F6F6DC919191
+      919191919191DEEAE7FEFEFEFDFBC4C4F5F7F6F6DC919191919191919191E3EC
+      E9FEFEFEFEFEE0C3F9F7F6F6DC919191919191919191E3E9E3F8F8F1F1F8FBFB
+      FCFAF7F6DC919191919191919191DCEAEAE0E1E9E5E3DEE4EBF2FAF9DC919191
+      919191919191DBF3EEC5C5EFF3EBE5DDD9D6E6F5DC91919191919191919191D5
+      E8EDF1FAF6F0EAE4DAD1D2DBDC919191919191919191919191DBE8F0F3F3F3E4
+      D0CFE4D8DC919191919191919191919191919191D5DEE4DED2CFD4D491919191
+      91919191919191919191919191919191D2CE9191919191919191919191919191
+      91C8C89191919191D2CE919191919191919191919191919191D9D09191919191
+      D2CE919191919191919191919191919191E6E39191919191D2CE919191919191
+      919191919191919191E0F3CE91919191D2CE9191919191919191919191919191
+      9191EFF6E1C9C8CDD9CC91919191919191919191919191919191C9EDF9F3F3EB
+      DC91919191919191919191919191919191919191CBE0E1CF9191919191919191
+      9191919191919191919191919191919191919191919191919191
+    }
+    OnClick = bbUpdatePasswordClick
+    ParentFont = False
+    TabOrder = 1
+  end
+  object bbExportAllWalletKeys: TBitBtn
+    Left = 30
+    Height = 36
+    Top = 425
+    Width = 225
+    Caption = 'Export all Wallet Keys to a file'
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C8518FF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+      9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C8518
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+      FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+      00FF0C85181399220C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF0C85180C85180C85180C85
+      180C85180C85180C85180C85181DAC31139A220C8518FF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE0C8518
+      57E38851DD7E4AD77443D0693BC95E34C1522BBA4725B33C1EAE33149B230C85
+      18FF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+      DEFE77DEFE0C85185EE89059E48953DE804CD87645D16C3DCA6035C2542DBB49
+      26B53F1FAF35149B250C8518FF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+      F38FE8FF7CE2FE7CE3FE7CE3FE0C851861EB955FE9925AE58B54DF824DD97846
+      D26D3ECB6237C4562FBD4C27B64021B037159B250C8518FF00FFFF00FF019ACF
+      60CAEF1FA8D85EC1E1C2E6ED8ACEE08FCFE18ECFE10C851861EB9561EB955FEA
+      935CE58D56E0844FDB7A48D47040CD6538C65931BF4D1DA3320C8518FF00FFFF
+      00FFFF00FF019ACF65CFF53EB7E52CA9D4C5EFF8ACF3FEA5F2FFA5F2FF0C8518
+      61EB9561EB9561EB9561EB945CE68E57E18650DC7C49D57242CE6727AD410C85
+      18FF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F32A9CC673CBE7D6FEFDB1
+      FBFDB2FBFD0C85180C85180C85180C85180C85180C85180C85180C851852DD7F
+      32B6500C851898FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB748E
+      A224A8D5B9E7F3D5F5F9D5F6F9D6F6FADCFAFBCDFDFCB9FCFCAFFAFCB0FAFCB1
+      FAFC0C85183ABE5C0C85189FFCFFA4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+      8BDBFF5FCDFFB7898973C3DD18A2D218A2D216A2D215A1D21AA4D391D7EBEBFE
+      FDDBFDFCC5FBFBC2FBFB0C85180C851883E4F3B6FDFFBAFFFFB5FCFD019ACFFF
+      00FFFF00FF019ACF99E2FF67D3FFB88989FEF5ECFDF3EBF0EFEAE5EBE8D6E5E6
+      A4D2E025A6D34DB9DDE5F8FBF5FDFCEBFCFB0C8518C4FBFF9CE4F2DAFEFFD9FE
+      FFE3FFFFADE9F5019ACFFF00FF019ACF9FE9FF70DCFFB88989FEF3E9FFF2E6FE
+      F3E9FEF3E9FEF3E9FEF3E9D4E4E439ADD422A5D49DD8ECF1F9FBEEEFEFE9FDFF
+      CEEEF7F8FFFFF7FFFFFEFFFFE9F9FD019ACFFF00FF019ACFA7EFFF76E5FFB889
+      89FFF2E5FFF0E2FFF2E5FFF2E5FFF2E5FFF2E5FFF2E5EAEBE38EC9DA44B0D501
+      9ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACF019ACFFF00FF019ACF
+      ABF6FF7EEDFFB88989FFF0E2FFEFDFFFF0E2FFF0E2FFF0E2FFF0E2FFF0E2FEEE
+      E0FBECDEFAEBDEF6E6D9B8898993F7FF019ACFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACFC7FFFF82F5FFB88989FFEEDFFFECDBFFEEDFFFEEDFFFEEDF
+      FFEEDFF9E8D9DECCC1D9CABDCFBDB4C8B3ACB88989B5FFFF019ACFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFFB88989FFECDBFFEBD8FF
+      ECDBFFECDBFFECDBFFECDBF5E2D2C4ABA7C2A8A5BBA39FC2AFA9B88989019ACF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFB889
+      89FFEBD8FFEAD5FFEBD8FFEBD8FFEBD8FFEBD8FFEBD8D9C8C5FEFEFDFEF6EFDE
+      C9C0B88989FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FF019ACFB88989FFE9D5FFE8D3FFE9D5FFE9D5FFE9D5FFE9D5FFE9D5C6AD
+      A9FEF8F2E8D4CACD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFB88989FFE7D1FFE7D0FFE7D1FFE7D1FFE7D1
+      FFE7D1E7CEBFD3BFB9E8D5CCCD9999FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB88989FFE6CFFFE6CFFF
+      E6CFFFE6CFFFE6CFFFE6CFD5BBB2E0CCC5CD9999FF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB889
+      89B88989B88989B88989B88989B88989B88989B88989B88989FF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+    }
+    OnClick = bbExportAllWalletKeysClick
+    TabOrder = 10
+  end
+  object bbImportKeysFile: TBitBtn
+    Left = 264
+    Height = 36
+    Top = 424
+    Width = 209
+    Caption = 'Import a Wallet Keys File'
+    Glyph.Data = {
+      F6060000424DF606000000000000360000002800000018000000180000000100
+      180000000000C0060000120B0000120B00000000000000000000FF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF0D9FD18BD4EE6BD3F845C0ED28B0E0019ACF01
+      9ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF069CD076C8E5A9E9FE6DD8
+      FF75DBFF77DCFF77DBFF63D1F930B3E3029BD0019ACF019ACF019ACF019ACFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      34AFD9BCE9F86ED8FF6FD8FE70D8FE70D8FE71D8FF74DBFF7ADEFF79DDFF73D9
+      FF5CCCF522ACDD019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FF019ACF1FA9D68FD3EB97E4FF6FD9FE71D9FE71D9FE71D9FE71D9FE
+      71D9FE71D9FE73DAFE76DCFF7BDFFF7ADEFF78DCFF77DCFF019ACFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FF019ACF31B1DC49B7DEBDEEFB71DDFE77DEFE77
+      DEFE77DEFE77DEFE77DEFE77DEFE77DEFE76DEFE76DEFE76DEFE78DFFF7CE1FF
+      65D2F8019ACFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF52C2E71DA7D5ADE2
+      F38FE8FF7CE2FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7CE3FE7C
+      E3FE7DE4FE7DE3FE5ED1F3019ACFFF00FFFF00FFFF00FFFF00FFFF00FF019ACF
+      60CAEF1FA8D85EC1E2BBF4FE7DE7FE82E8FE81E8FE81E8FE81E8FE81E8FE81E8
+      FE81E8FE81E8FE81E8FE82E8FE84E9FE5ED3F18DEEFF019ACFFF00FFFF00FFFF
+      00FFFF00FF019ACF65CFF53EB7E529ACD8BFEEF88DEFFF85EDFF85EDFF85EDFF
+      85EDFF86EDFF86EDFF86EDFF86EDFF86EDFF87EDFF89EEFF65D9F396F5FF019A
+      CFFF00FFFF00FFFF00FFFF00FF019ACF69D1F855C4F31FA7D773CBE7C5FCFF93
+      F7FF93F7FF92F6FF8DF4FF89F3FF89F2FF8BF2FF8BF2FF8BF2FF8BF2FF8EF3FF
+      6ADEF395F8FF98FAFF019ACFFF00FFFF00FFFF00FF019ACF77D5FC5CC8FB3EB8
+      E920A7D5B6E6F3D0F4FAD1F5FAD2F6FAD5F9FCB9FBFE9BF8FF8FF6FF91F6FF92
+      F6FF93F7FF6BD0B70C85188BEAE0A4FFFF43C1E2019ACFFF00FFFF00FF019ACF
+      8BDBFF5FCDFF64CDFE2CAFE30D9FD30FA0D310A0D310A0D317A3D38ED7ECE2FD
+      FEC3FAFFA5F8FFA3F8FF84DDCF0C851838B5570C8518ABF3EBB5FCFD019ACFFF
+      00FFFF00FF019ACF99E2FF67D3FF6DD4FE6CD4FE69D1FE64CEFB61CDF95BC9F5
+      48BEEB17A3D54BB8DDDFF7FBE8FCFFB1E7DD0C85184ACE7361EB9541C1640C85
+      18D6F6F0ADE9F5019ACFFF00FF019ACF9FE9FF70DCFF76DDFE76DDFE76DDFE75
+      DCFE74DCFE73DCFE73DBFE61CEF61CA8D91CA5D58CCED70C851842C5665BE68C
+      59E1895DE78F3EBD600C8518DBF1EF019ACFFF00FF019ACFA7EFFF76E5FF7CE5
+      FF7CE5FF7CE5FF7CE5FF7DE5FF7DE5FF7DE5FF7DE3FF72DDFB40B8D20C85182D
+      AD474AD47250D97B55DE8359E1885AE38B33AF510C85180197C3FF00FF019ACF
+      ABF6FF7EEDFF85ECFF85ECFF85ECFF85ECFF84ECFF80ECFF7CECFF7DECFF7EEC
+      FF0C85180C85180C85180C851840C7634FDA7A55DF830C85180C85180C85180C
+      8518FF00FF019ACFC7FFFF82F5FF8FF5FF8FF5FF8FF5FF8EF5FF8DF4FFA0FDFF
+      B7FFFFAFFFFFAEFFFFA6F9F4A5FBF8A3FCFA4CB07732B74F48D6704AD3720C85
+      18FF00FFFF00FFFF00FFFF00FF019ACFA4E0F0A0FDFF8AFCFF90FCFF90FCFF90
+      FCFF99FDFF86E8F5019ACF019ACF019ACF019ACF019ACF019ACF0486642CB347
+      41D16636BC540C8518FF00FFFF00FFFF00FFFF00FFFF00FF019ACFECFFFFBCFF
+      FFBCFFFFBCFFFFC0FFFF9DF5FB019ACFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FF0C85182BB74538C9580C8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FF019ACF019ACF019ACF019ACF019ACF019ACFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FF0C851828BB4126B13E0C8518FF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+      FF00FFFF00FFFF00FFFF00FFFF00FF0C851814A4241CAE310C8518FF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+      00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C85180C96170D991A0C8518
+      FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+      FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C85180C85180C85180C85180C
+      8518FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+    }
+    OnClick = bbImportKeysFileClick
+    TabOrder = 11
+  end
+  object bbLock: TBitBtn
+    Left = 296
+    Height = 38
+    Top = 8
+    Width = 79
+    Caption = 'Lock'
+    Font.Color = clWindowText
+    Font.Height = -13
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    Glyph.Data = {
+      76060000424D7606000000000000360400002800000018000000180000000100
+      0800000000004002000000000000000000000001000000010000000000000101
+      0100020202000303030004040400050505000606060007070700080808000909
+      09000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F0F00101010001111
+      1100121212001313130014141400151515001616160017171700181818001919
+      19001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F1F00202020002121
+      2100222222002323230024242400252525002626260027272700282828002929
+      29002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F2F00303030003131
+      3100323232003333330034343400353535003636360037373700383838003939
+      39003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F3F00404040004141
+      4100424242004343430044444400454545004646460047474700484848004949
+      49004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F4F00505050005151
+      5100525252005353530054545400555555005656560057575700585858005959
+      59005A5A5A005B5B5B005C5C5C005D5D5D005E5E5E00685968007C4F7C009441
+      9400B72CB700DD15DD00F506F500FD01FD00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00
+      FE00FE00FE00FE00FE00FE00FE00F008F900D517F000BD24E800A830E1007B4B
+      D0005065C1003774B7002B7DB100237FAC001F82AD001C83AD001785AE001687
+      AF001489B100128AB300108CB6000F8EB9000D91BB000C94BF000A97C3000A99
+      C5000A9AC7000B9BC8000B9CCA000C9ECC000C9FCD000DA0CE000DA1CE000EA2
+      CF0011A3CF0015A4CF0018A5CF001CA7D10021A9D1002AAAD00035AACD0035AD
+      D00035AFD30035B1D60037B5D8003AB8DB003EB9DC0040BBDD0045BEDE004CC1
+      E00055C6E3005BC8E40061CAE40066CBE3006BCCE30072D3E60078D8EB0080D8
+      EE0083D9F10085DCF40088DBF5008BDBF6008EDAF70091DAF70095DCF70097E0
+      F7009EE3F800A4E7F900A9E9F900AEE9F900B5EBF900B2EBF800919191919191
+      919191919191919191919191919191919191919191919191D5E7E8E7E3DED591
+      919191919191919191919191919191D6DDF7F8F8F7F6F4EEE6D5919191919191
+      919191919191D7DADEF8F8F6F7F6EDF1F8F1E69191919191919191919191DADE
+      DFFAFAF8F7F7E9EDF7F7F8EB91919191919191919191DDE5E3FCFCFAFAEEE0E9
+      F3F7F7F7DC919191919191919191DEE7E4FEFEFCFCEDC5E0EFF7F6F6DC919191
+      919191919191DEEAE7FEFEFEFDFBC4C4F5F7F6F6DC919191919191919191E3EC
+      E9FEFEFEFEFEE0C3F9F7F6F6DC919191919191919191E3E9E3F8F8F1F1F8FBFB
+      FCFAF7F6DC919191919191919191DCEAEAE0E1E9E5E3DEE4EBF2FAF9DC919191
+      919191919191DBF3EEC5C5EFF3EBE5DDD9D6E6F5DC91919191919191919191D5
+      E8EDF1FAF6F0EAE4DAD1D2DBDC919191919191919191919191DBE8F0F3F3F3E4
+      D0CFE4D8DC919191919191919191919191919191D5DEE4DED2CFD4D491919191
+      91919191919191919191919191919191D2CE9191919191919191919191919191
+      91C8C89191919191D2CE919191919191919191919191919191D9D09191919191
+      D2CE919191919191919191919191919191E6E39191919191D2CE919191919191
+      919191919191919191E0F3CE91919191D2CE9191919191919191919191919191
+      9191EFF6E1C9C8CDD9CC91919191919191919191919191919191C9EDF9F3F3EB
+      DC91919191919191919191919191919191919191CBE0E1CF9191919191919191
+      9191919191919191919191919191919191919191919191919191
+    }
+    OnClick = bbLockClick
+    ParentFont = False
+    TabOrder = 12
+  end
+  object SaveDialog: TSaveDialog
+    DefaultExt = '.dat'
+    Filter = 'Wallet keys file|*.dat|All files|*.*'
+    FilterIndex = 0
+    left = 150
+    top = 150
+  end
+  object OpenDialog: TOpenDialog
+    DefaultExt = '.dat'
+    Filter = 'Wallet keys file (*.dat)|*.dat|All files (*.*)|*.*'
+    FilterIndex = 0
+    left = 205
+    top = 155
+  end
+end

+ 575 - 0
src/gui-classic/UFRMWalletKeys.pas

@@ -0,0 +1,575 @@
+unit UFRMWalletKeys;
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{ Copyright (c) 2016 by Albert Molina
+
+  Distributed under the MIT software license, see the accompanying file LICENSE
+  or visit http://www.opensource.org/licenses/mit-license.php.
+
+  This unit is a part of Pascal Coin, a P2P crypto currency without need of
+  historical operations.
+
+  If you like it, consider a donation using BitCoin:
+  16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
+
+  }
+
+interface
+
+uses
+  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls, UWallet, Buttons,
+  {$IFDEF FPC}LMessages,{$ENDIF}
+  clipbrd, UConst;
+
+Const
+  CM_PC_WalletKeysChanged = {$IFDEF FPC}LM_USER{$ELSE}WM_USER{$ENDIF} + 1;
+
+type
+  TFRMWalletKeys = class(TForm)
+    lbWalletKeys: TListBox;
+    bbExportPrivateKey: TBitBtn;
+    lblEncryptionTypeCaption: TLabel;
+    lblEncryptionType: TLabel;
+    lblKeyNameCaption: TLabel;
+    lblKeyName: TLabel;
+    lblPrivateKeyCaption: TLabel;
+    memoPrivateKey: TMemo;
+    bbChangeName: TBitBtn;
+    bbImportPrivateKey: TBitBtn;
+    bbExportPublicKey: TBitBtn;
+    bbImportPublicKey: TBitBtn;
+    bbGenerateNewKey: TBitBtn;
+    lblPrivateKeyCaption2: TLabel;
+    bbDelete: TBitBtn;
+    lblKeysEncrypted: TLabel;
+    bbUpdatePassword: TBitBtn;
+    bbExportAllWalletKeys: TBitBtn;
+    SaveDialog: TSaveDialog;
+    bbImportKeysFile: TBitBtn;
+    OpenDialog: TOpenDialog;
+    bbLock: TBitBtn;
+    procedure FormCreate(Sender: TObject);
+    procedure bbChangeNameClick(Sender: TObject);
+    procedure bbExportPrivateKeyClick(Sender: TObject);
+    procedure bbImportPrivateKeyClick(Sender: TObject);
+    procedure lbWalletKeysClick(Sender: TObject);
+    procedure bbGenerateNewKeyClick(Sender: TObject);
+    procedure bbExportPublicKeyClick(Sender: TObject);
+    procedure bbDeleteClick(Sender: TObject);
+    procedure bbImportPublicKeyClick(Sender: TObject);
+    procedure bbUpdatePasswordClick(Sender: TObject);
+    procedure bbExportAllWalletKeysClick(Sender: TObject);
+    procedure bbImportKeysFileClick(Sender: TObject);
+    procedure bbLockClick(Sender: TObject);
+  private
+    FWalletKeys: TWalletKeys;
+    procedure SetWalletKeys(const Value: TWalletKeys);
+    procedure OnWalletKeysChanged(Sender : TObject);
+    { Private declarations }
+    Procedure UpdateWalletKeys;
+    Procedure UpdateSelectedWalletKey;
+    Function GetSelectedWalletKey(var WalletKey : TWalletKey) : Boolean;
+    Function GetSelectedWalletKeyAndIndex(var WalletKey : TWalletKey; var index : Integer) : Boolean;
+    Procedure CheckIsWalletKeyValidPassword;
+    procedure CM_WalletChanged(var Msg: TMessage); message CM_PC_WalletKeysChanged;
+  public
+    { Public declarations }
+    Property WalletKeys : TWalletKeys read FWalletKeys write SetWalletKeys;
+    Destructor Destroy; override;
+  end;
+
+implementation
+
+uses
+{$IFnDEF FPC}
+  Windows,
+{$ELSE}
+  LCLIntf, LCLType,
+{$ENDIF}
+  UCrypto, UAccounts, UFRMNewPrivateKeyType, UAES, UCommon;
+
+{$IFnDEF FPC}
+  {$R *.dfm}
+{$ELSE}
+  {$R *.lfm}
+{$ENDIF}
+
+{ TFRMWalletKeys }
+
+procedure TFRMWalletKeys.bbChangeNameClick(Sender: TObject);
+Var wk : TWalletKey;
+  s : String;
+  index : integer;
+begin
+  if not GetSelectedWalletKeyAndIndex(wk,index) then exit;
+  s := wk.Name;
+  if InputQuery('Change name','Input new key name:',s) then begin
+    WalletKeys.SetName(index,s);
+    UpdateWalletKeys;
+  end;
+end;
+
+procedure TFRMWalletKeys.bbDeleteClick(Sender: TObject);
+Var wk : TWalletKey;
+  index : Integer;
+  s : String;
+begin
+  if Not GetSelectedWalletKeyAndIndex(wk,index) then exit;
+  s := 'Are you sure you want to delete the selected private key?'+#10+wk.Name+#10+#10+
+    'Please note that this will forever remove access to accounts using this key...';
+  if Application.MessageBox(Pchar(s),PChar('Delete key'),
+    MB_YESNO+MB_DEFBUTTON2+MB_ICONWARNING)<>Idyes then exit;
+  if Application.MessageBox(PChar('Are you sure you want to delete?'),PChar('Delete key'),
+    MB_YESNO+MB_DEFBUTTON2+MB_ICONWARNING)<>Idyes then exit;
+  WalletKeys.Delete(index);
+  UpdateWalletKeys;
+end;
+
+procedure TFRMWalletKeys.bbExportAllWalletKeysClick(Sender: TObject);
+Var efn : String;
+  fs : TFileStream;
+begin
+  if WalletKeys.Count<=0 then raise Exception.Create('Your wallet is empty. No keys!');
+  if ((WalletKeys.IsValidPassword) And (WalletKeys.WalletPassword='')) then begin
+    if Application.MessageBox(PChar('Your wallet has NO PASSWORD'+#10+#10+
+      'It is recommend to protect your wallet with a password prior to exporting it!'+#10+#10+
+      'Continue without password protection?'),PChar(Application.Title),MB_YESNO+MB_ICONWARNING+MB_DEFBUTTON2)<>IdYes then exit;
+  end;
+
+  if Not SaveDialog.Execute then exit;
+  efn := SaveDialog.FileName;
+  if FileExists(efn) then begin
+    if Application.MessageBox(PChar('This file exists:'+#10+efn+#10#10+'Overwrite?'),PChar(Application.Title),MB_YESNO+MB_ICONQUESTION+MB_DEFBUTTON2)<>IdYes then exit;
+  end;
+  fs := TFileStream.Create(efn,fmCreate);
+  try
+    fs.Size := 0;
+    WalletKeys.SaveToStream(fs);
+  finally
+    fs.Free;
+  end;
+  Application.MessageBox(PChar('Wallet key exported to a file:'+#10+efn),PChar(Application.Title),MB_OK+MB_ICONINFORMATION);
+end;
+
+procedure TFRMWalletKeys.bbExportPrivateKeyClick(Sender: TObject);
+Var wk : TWalletKey;
+  pwd1,pwd2, enc : String;
+begin
+  CheckIsWalletKeyValidPassword;
+  if Not GetSelectedWalletKey(wk) then exit;
+  if Assigned(wk.PrivateKey) then begin
+    if InputQuery('Export private key','Insert a password to export',pwd1) then begin
+      if InputQuery('Export private key','Repeat the password to export',pwd2) then begin
+        if pwd1<>pwd2 then raise Exception.Create('Passwords does not match!');
+        enc := TCrypto.ToHexaString( TAESComp.EVP_Encrypt_AES256( wk.PrivateKey.ExportToRaw,pwd1) );
+        Clipboard.AsText := enc;
+        Application.MessageBox(PChar('The password has been encrypted with your password and copied to the clipboard.'+
+          #10+#10+
+          'Password: "'+pwd1+'"'+#10+
+          #10+
+          'Encrypted key value (Copied to the clipboard):'+#10+
+          enc+
+          #10+#10+'Length='+Inttostr(length(enc))+' bytes'),
+          PChar(Application.Title),MB_OK+MB_ICONINFORMATION);
+      end else raise Exception.Create('Cancelled operation');
+    end;
+  end;
+end;
+
+procedure TFRMWalletKeys.bbExportPublicKeyClick(Sender: TObject);
+Var wk : TWalletKey;
+  s : String;
+begin
+  CheckIsWalletKeyValidPassword;
+  if Not GetSelectedWalletKey(wk) then exit;
+  s := TAccountComp.AccountPublicKeyExport(wk.AccountKey);
+  Clipboard.AsText := s;
+  Application.MessageBox(PChar('The public key has been copied to the clipboard'+#10+#10+
+    'Public key value:'+#10+
+    s+#10+#10+
+    'Length='+Inttostr(length(s))+' bytes'),
+          PChar(Application.Title),MB_OK+MB_ICONINFORMATION);
+end;
+
+procedure TFRMWalletKeys.bbGenerateNewKeyClick(Sender: TObject);
+Var FRM : TFRMNewPrivateKeyType;
+begin
+  CheckIsWalletKeyValidPassword;
+  FRM := TFRMNewPrivateKeyType.Create(Self);
+  try
+    FRM.WalletKeys := WalletKeys;
+    FRM.ShowModal;
+    UpdateWalletKeys;
+  finally
+    FRM.Free;
+  end;
+end;
+
+procedure TFRMWalletKeys.bbImportKeysFileClick(Sender: TObject);
+Var wki : TWalletKeys;
+  ifn,pwd : String;
+  i : Integer;
+  cPrivatekeys, cPublicKeys : Integer;
+begin
+  if Not OpenDialog.Execute then exit;
+  ifn := OpenDialog.FileName;
+  if Not FileExists(ifn) then raise Exception.Create('Cannot find file '+ifn);
+
+  wki := TWalletKeys.Create(Self);
+  try
+    wki.WalletFileName := ifn;
+    if wki.Count<=0 then raise Exception.Create('Wallet file has no valid data');
+    pwd := '';
+    While (Not wki.IsValidPassword) do begin
+      if Not InputQuery('Import','Enter the wallet file password:',pwd) then exit;
+      wki.WalletPassword := pwd;
+      if not wki.IsValidPassword then begin
+        If Application.MessageBox(PChar('Password entered is not valid, retry?'),PChar(Application.Title),MB_ICONERROR+MB_YESNO)<>Idyes then exit;
+      end;
+    end;
+    cPrivatekeys := 0;
+    cPublicKeys := 0;
+    if wki.IsValidPassword then begin
+      for i := 0 to wki.Count - 1 do begin
+        if WalletKeys.IndexOfAccountKey(wki.Key[i].AccountKey)<0 then begin
+          If Assigned(wki.Key[i].PrivateKey) then begin
+            WalletKeys.AddPrivateKey(wki.Key[i].Name,wki.Key[i].PrivateKey);
+            inc(cPrivatekeys);
+          end else begin
+            WalletKeys.AddPublicKey(wki.Key[i].Name,wki.Key[i].AccountKey);
+            inc(cPublicKeys);
+          end;
+        end;
+      end;
+    end;
+    if (cPrivatekeys>0) Or (cPublicKeys>0) then begin
+      Application.MessageBox(PChar('Wallet file imported successfully'+#10+#10+
+        'File:'+ifn+#10+#10+
+        'Total keys in wallet: '+inttostr(wki.Count)+#10+
+        'Imported private keys: '+IntToStr(cPrivatekeys)+#10+
+        'Imported public keys only: '+IntToStr(cPublicKeys)+#10+
+        'Duplicated (not imported): '+InttoStr(wki.Count - cPrivatekeys - cPublicKeys)),
+        PChar(Application.Title),MB_OK+MB_ICONINFORMATION);
+    end else begin
+      Application.MessageBox(PChar('Wallet file keys were already in your wallet. Nothing imported'+#10+#10+
+        'File:'+ifn+#10+#10+
+        'Total keys in wallet: '+inttostr(wki.Count)),
+        PChar(Application.Title),MB_OK+MB_ICONWARNING);
+    end;
+  finally
+    wki.Free;
+  end;
+end;
+
+procedure TFRMWalletKeys.bbImportPrivateKeyClick(Sender: TObject);
+var s : String;
+ desenc, enc : AnsiString;
+ EC : TECPrivateKey;
+ i : Integer;
+ wk : TWalletKey;
+ parseResult : Boolean;
+
+  function ParseRawKey(EC_OpenSSL_NID : Word) : boolean;
+  begin
+    FreeAndNil(EC); ParseRawKey := False;
+    EC := TECPrivateKey.Create;
+    Try
+      EC.SetPrivateKeyFromHexa(EC_OpenSSL_NID, TCrypto.ToHexaString(enc));
+      ParseRawKey := True;
+    Except
+      On E:Exception do begin
+        FreeAndNil(EC);
+        Raise;
+      end;
+    end;
+  end;
+
+  function ParseEncryptedKey : boolean;
+  begin
+      Repeat
+        s := '';
+        desenc := '';
+        if InputQuery('Import private key','Enter the password:',s) then begin
+          If (TAESComp.EVP_Decrypt_AES256(enc,s,desenc)) then begin
+            if (desenc<>'') then begin
+              EC := TECPrivateKey.ImportFromRaw(desenc);
+              ParseEncryptedKey := True;
+              Exit;
+            end else begin
+              if Application.MessageBox(PChar('Invalid password!'),'',MB_RETRYCANCEL+MB_ICONERROR)<>IDRETRY then begin
+                ParseEncryptedKey := False;
+                Exit;
+              end;
+              desenc := '';
+            end;
+          end else begin
+            if Application.MessageBox(PChar('Invalid password or corrupted data!'),'',MB_RETRYCANCEL+MB_ICONERROR)<>IDRETRY then begin
+              ParseEncryptedKey := False;
+              Exit;
+            end;
+          end;
+        end else begin
+          ParseEncryptedKey := false;
+          Exit;
+        end;
+      Until (desenc<>'');
+  end;
+
+begin
+  EC := Nil;
+  CheckIsWalletKeyValidPassword;
+  if Not Assigned(WalletKeys) then exit;
+  if InputQuery('Import private key','Insert the password protected private key or raw private key',s) then begin
+    s := trim(s);
+    if (s='') then raise Exception.Create('No valid key');
+    enc := TCrypto.HexaToRaw(s);
+    if (enc='') then raise Exception.Create('Invalid text... You must enter an hexadecimal value ("0".."9" or "A".."F")');
+    case Length(enc) of
+         32: parseResult := ParseRawKey(CT_NID_secp256k1);
+         35,36: parseResult := ParseRawKey(CT_NID_sect283k1);
+         48: parseResult := ParseRawKey(CT_NID_secp384r1);
+         65,66: parseResult := ParseRawKey(CT_NID_secp521r1);
+         64, 80, 96: parseResult := ParseEncryptedKey;
+         else Exception.Create('Invalidly formatted private key string. Ensure it is an encrypted private key export or raw private key hexstring.');
+    end;
+    if (parseResult = False) then
+       exit;
+    Try
+      // EC is assigned by ParseRawKey/ImportEncryptedKey
+      if Not Assigned(EC) then begin
+        Application.MessageBox(PChar('Invalid password and/or corrupted data!'),'', MB_OK);
+        exit;
+      end;
+      i := WalletKeys.IndexOfAccountKey(EC.PublicKey);
+      if (i>=0) then begin
+        wk := WalletKeys.Key[i];
+        if Assigned(wk.PrivateKey) And (Assigned(wk.PrivateKey.PrivateKey)) then raise Exception.Create('This key is already in your wallet!');
+      end;
+      s := 'Imported '+DateTimeToStr(now);
+      s := InputBox('Set a name','Name for this private key:',s);
+      i := WalletKeys.AddPrivateKey(s,EC);
+      Application.MessageBox(PChar('Imported private key'),PChar(Application.Title),MB_OK+MB_ICONINFORMATION);
+    Finally
+      EC.Free;
+    End;
+    UpdateWalletKeys;
+  end;
+end;
+
+procedure TFRMWalletKeys.bbImportPublicKeyClick(Sender: TObject);
+var s : String;
+ raw : AnsiString;
+ EC : TECPrivateKey;
+ account : TAccountKey;
+ errors : AnsiString;
+begin
+  CheckIsWalletKeyValidPassword;
+  if Not Assigned(WalletKeys) then exit;
+  if Not InputQuery('Import publick key','Insert the public key in hexa format or imported format',s) then exit;
+  If not TAccountComp.AccountPublicKeyImport(s,account,errors) then begin
+    raw := TCrypto.HexaToRaw(s);
+    if trim(raw)='' then raise Exception.Create('Invalid public key value (Not hexa or not an imported format)'+#10+errors);
+    account := TAccountComp.RawString2Accountkey(raw);
+  end;
+  If not TAccountComp.IsValidAccountKey(account,errors) then raise Exception.Create('This data is not a valid public key'+#10+errors);
+  if WalletKeys.IndexOfAccountKey(account)>=0 then raise exception.Create('This key exists on your wallet');
+  s := 'Imported public key '+DateTimeToStr(now);
+  if InputQuery('Set a name','Name for this private key:',s) then begin
+    WalletKeys.AddPublicKey(s,account);
+    UpdateWalletKeys;
+    Application.MessageBox(PChar('Imported public key'),PChar(Application.Title),MB_OK+MB_ICONINFORMATION);
+  end;
+end;
+
+procedure TFRMWalletKeys.bbLockClick(Sender: TObject);
+begin
+  FWalletKeys.LockWallet;
+end;
+
+procedure TFRMWalletKeys.bbUpdatePasswordClick(Sender: TObject);
+Var s,s2 : String;
+begin
+  if FWalletKeys.IsValidPassword then begin
+    s := ''; s2 := '';
+    if Not InputQuery('Change password','Enter new password',s) then exit;
+    if trim(s)<>s then raise Exception.Create('Password cannot start or end with a space character');
+    if Not InputQuery('Change password','Enter new password again',s2) then exit;
+    if s<>s2 then raise Exception.Create('Two passwords are different!');
+
+    FWalletKeys.WalletPassword := s;
+    Application.MessageBox(PChar('Password changed!'+#10+#10+
+      'Please note that your new password is "'+s+'"'+#10+#10+
+      '(If you lose this password, you will lose your wallet forever!)'),
+      PChar(Application.Title),MB_ICONWARNING+MB_OK);
+    UpdateWalletKeys;
+  end else begin
+    s := '';
+    Repeat
+      if Not InputQuery('Wallet password','Enter wallet password',s) then exit;
+      FWalletKeys.WalletPassword := s;
+      if Not FWalletKeys.IsValidPassword then Application.MessageBox(PChar('Invalid password'),PChar(Application.Title),MB_ICONERROR+MB_OK);
+    Until FWalletKeys.IsValidPassword;
+    UpdateWalletKeys;
+  end;
+end;
+
+procedure TFRMWalletKeys.CheckIsWalletKeyValidPassword;
+begin
+  if Not Assigned(FWalletKeys) then exit;
+
+  if Not FWalletKeys.IsValidPassword then begin
+    Application.MessageBox(PChar('Wallet key is encrypted!'+#10+#10+'You must enter password to continue...'),
+      PCHar(Application.Title),MB_OK+MB_ICONWARNING);
+    bbUpdatePasswordClick(Nil);
+    if Not FWalletKeys.IsValidPassword then raise Exception.Create('Cannot continue without valid password');
+  end;
+end;
+
+procedure TFRMWalletKeys.CM_WalletChanged(var Msg: TMessage);
+begin
+  UpdateWalletKeys;
+end;
+
+destructor TFRMWalletKeys.Destroy;
+begin
+  FWalletKeys.OnChanged.Remove ( OnWalletKeysChanged );
+  inherited;
+end;
+
+procedure TFRMWalletKeys.FormCreate(Sender: TObject);
+begin
+  lbWalletKeys.Sorted := true;
+  FWalletKeys := Nil;
+  UpdateWalletKeys;
+end;
+
+function TFRMWalletKeys.GetSelectedWalletKey(var WalletKey: TWalletKey): Boolean;
+Var i : Integer;
+begin
+  Result := GetSelectedWalletKeyAndIndex(WalletKey,i);
+end;
+
+function TFRMWalletKeys.GetSelectedWalletKeyAndIndex(var WalletKey: TWalletKey; var index: Integer): Boolean;
+begin
+  index := -1;
+  Result := false;
+  if Not Assigned(WalletKeys) then exit;
+  if lbWalletKeys.ItemIndex<0 then exit;
+  index := Integer(lbWalletKeys.Items.Objects[ lbWalletKeys.ItemIndex ]);
+  if (index>=0) And (index<WalletKeys.Count) then begin
+    WalletKey := WalletKeys.Key[index];
+    Result := true;
+  end;
+end;
+
+procedure TFRMWalletKeys.lbWalletKeysClick(Sender: TObject);
+begin
+  UpdateSelectedWalletKey;
+end;
+
+procedure TFRMWalletKeys.OnWalletKeysChanged(Sender : TObject);
+begin
+  PostMessage(Self.Handle,CM_PC_WalletKeysChanged,0,0);
+end;
+
+procedure TFRMWalletKeys.SetWalletKeys(const Value: TWalletKeys);
+begin
+  if FWalletKeys=Value then exit;
+  if Assigned(FWalletKeys) then
+     FWalletKeys.OnChanged.Remove ( OnWalletKeysChanged );
+  FWalletKeys := Value;
+  if Assigned(FWalletKeys) then begin
+    FWalletKeys.OnChanged.Add( OnWalletKeysChanged );
+  end;
+  UpdateWalletKeys;
+end;
+
+procedure TFRMWalletKeys.UpdateSelectedWalletKey;
+Var
+  wk : TWalletKey;
+  ok : Boolean;
+begin
+  ok := false;
+  wk := CT_TWalletKey_NUL;
+  try
+    if Not GetSelectedWalletKey(wk) then exit;
+    ok := true;
+    lblEncryptionType.Caption := TAccountComp.GetECInfoTxt( wk.AccountKey.EC_OpenSSL_NID );
+    if wk.Name='' then lblKeyName.Caption := '(No name)'
+    else lblKeyName.Caption := wk.Name;
+    if Assigned(wk.PrivateKey) then begin
+      memoPrivateKey.Lines.Text :=  TCrypto.PrivateKey2Hexa(wk.PrivateKey.PrivateKey);
+      memoPrivateKey.Font.Color := clBlack;
+    end else begin
+      memoPrivateKey.Lines.Text := '(No private key)';
+      memoPrivateKey.Font.Color := clRed;
+    end;
+  finally
+    lblEncryptionTypeCaption.Enabled := ok;
+    lblEncryptionType.Enabled := ok;
+    lblKeyNameCaption.Enabled := ok;
+    lblKeyName.Enabled := (ok) And (wk.Name<>'');
+    lblPrivateKeyCaption.Enabled := ok;
+    memoPrivateKey.Enabled := ok;
+    bbExportPrivateKey.Enabled := ok;
+    bbExportPublicKey.Enabled := ok;
+    bbChangeName.Enabled := ok;
+    lblPrivateKeyCaption2.Enabled := ok;
+    bbDelete.Enabled := ok;
+    if not ok then begin
+      lblEncryptionType.Caption := '';
+      lblKeyName.Caption := '';
+      memoPrivateKey.Lines.Clear;
+    end;
+  end;
+
+end;
+
+procedure TFRMWalletKeys.UpdateWalletKeys;
+Var lasti,i : Integer;
+  selected_wk,wk : TWalletKey;
+  s : AnsiString;
+begin
+  GetSelectedWalletKeyAndIndex(wk,lasti);
+  lbWalletKeys.Items.BeginUpdate;
+  Try
+    lbWalletKeys.Items.Clear;
+    lblKeysEncrypted.Caption := '';
+    if not assigned(FWalletKeys) then exit;
+    bbLock.Enabled := (FWalletKeys.IsValidPassword) And (FWalletKeys.WalletPassword<>'');
+    If FWalletKeys.IsValidPassword then begin
+      if FWalletKeys.WalletPassword='' then lblKeysEncrypted.Caption := 'Wallet without password'
+      else lblKeysEncrypted.Caption := 'Wallet is password protected';
+      lblKeysEncrypted.font.Color := clGreen;
+      bbUpdatePassword.Caption := 'Change password';
+    end else begin
+      lblKeysEncrypted.Caption := 'Wallet is encrypted... need password!';
+      lblKeysEncrypted.font.Color := clRed;
+      bbUpdatePassword.Caption := 'Input password';
+    end;
+    for i := 0 to WalletKeys.Count - 1 do begin
+      wk := WalletKeys.Key[i];
+      if (wk.Name='') then begin
+        s := 'Sha256='+TCrypto.ToHexaString( TCrypto.DoSha256( TAccountComp.AccountKey2RawString(wk.AccountKey) ) );
+      end else begin
+        s := wk.Name;
+      end;
+      if Not Assigned(wk.PrivateKey) then begin
+        if wk.CryptedKey<>'' then s:=s+' (Encrypted, need password)';
+        s:=s+' (* without key)';
+      end;
+      lbWalletKeys.Items.AddObject(s,TObject(i));
+    end;
+    i := lbWalletKeys.Items.IndexOfObject(TObject(lasti));
+    lbWalletKeys.ItemIndex := i;
+  Finally
+    lbWalletKeys.Items.EndUpdate;
+  End;
+  UpdateSelectedWalletKey;
+end;
+
+end.

+ 0 - 0
Units/Forms/UCTRLBanner.lfm → src/gui/UCTRLBanner.lfm


+ 1 - 1
Units/Forms/UCTRLBanner.pas → src/gui/UCTRLBanner.pas

@@ -11,7 +11,7 @@ unit UCTRLBanner;
 
 interface
 
-{$I ./../PascalCoin/config.inc}
+{$I ..\config.inc}
 
 uses
   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,

+ 0 - 0
Units/Forms/UCTRLSyncronization.lfm → src/gui/UCTRLSyncronization.lfm


+ 1 - 1
Units/Forms/UCTRLSyncronization.pas → src/gui/UCTRLSyncronization.pas

@@ -13,7 +13,7 @@ unit UCTRLSyncronization;
 
 interface
 
-{$I ./../PascalCoin/config.inc}
+{$I ..\config.inc}
 
 uses
   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,

+ 20 - 28
Units/Forms/UCTRLWallet.lfm → src/gui/UCTRLWallet.lfm

@@ -18,24 +18,24 @@ object CTRLWallet: TCTRLWallet
     Top = 0
     Width = 1151
     Align = alClient
-    Position = 500
+    Position = 424
     object PairSplitterSide1: TPairSplitterSide
       Cursor = crArrow
       Left = 0
       Height = 571
       Top = 0
-      Width = 500
-      ClientWidth = 500
+      Width = 424
+      ClientWidth = 424
       ClientHeight = 571
       object GroupBox1: TGroupBox
         Left = 8
         Height = 105
         Top = 8
-        Width = 484
+        Width = 408
         Anchors = [akTop, akLeft, akRight]
         Caption = 'Overview'
         ClientHeight = 85
-        ClientWidth = 480
+        ClientWidth = 404
         TabOrder = 0
         object Label1: TLabel
           Left = 16
@@ -58,7 +58,7 @@ object CTRLWallet: TCTRLWallet
           ParentFont = False
         end
         object lblTotalPASA: TLabel
-          Left = 360
+          Left = 284
           Height = 15
           Top = 48
           Width = 108
@@ -71,7 +71,7 @@ object CTRLWallet: TCTRLWallet
           ParentFont = False
         end
         object lblTotalPASC: TLabel
-          Left = 360
+          Left = 284
           Height = 15
           Top = 16
           Width = 106
@@ -88,17 +88,17 @@ object CTRLWallet: TCTRLWallet
         Left = 8
         Height = 440
         Top = 120
-        Width = 484
+        Width = 408
         Anchors = [akTop, akLeft, akRight, akBottom]
         Caption = 'My Accounts'
         ClientHeight = 420
-        ClientWidth = 480
+        ClientWidth = 404
         TabOrder = 1
         object cbAccounts: TComboBox
           Left = 8
           Height = 23
           Top = 8
-          Width = 460
+          Width = 384
           Anchors = [akTop, akLeft, akRight]
           ItemHeight = 15
           ItemIndex = 0
@@ -115,7 +115,7 @@ object CTRLWallet: TCTRLWallet
           Left = 8
           Height = 376
           Top = 40
-          Width = 460
+          Width = 384
           Anchors = [akTop, akLeft, akRight, akBottom]
           BorderSpacing.Around = 3
           BevelOuter = bvNone
@@ -127,41 +127,33 @@ object CTRLWallet: TCTRLWallet
     end
     object PairSplitterSide2: TPairSplitterSide
       Cursor = crArrow
-      Left = 505
+      Left = 429
       Height = 571
       Top = 0
-      Width = 646
-      ClientWidth = 646
+      Width = 722
+      ClientWidth = 722
       ClientHeight = 571
       object gpRecentOps: TGroupBox
         Left = 8
         Height = 552
         Top = 8
-        Width = 636
+        Width = 712
         Anchors = [akTop, akLeft, akRight, akBottom]
         Caption = 'Recent Operations'
         ClientHeight = 532
-        ClientWidth = 632
+        ClientWidth = 708
         TabOrder = 0
-        object cbShowSelectedOps: TCheckBox
-          Left = 8
-          Height = 19
-          Top = 12
-          Width = 255
-          Caption = 'Show operations from selected account only'
-          TabOrder = 0
-        end
         object paOperations: TPanel
           Left = 8
-          Height = 488
-          Top = 40
-          Width = 620
+          Height = 512
+          Top = 16
+          Width = 696
           Anchors = [akTop, akLeft, akRight, akBottom]
           BorderSpacing.Around = 3
           BevelOuter = bvNone
           Caption = 'OPERATIONS PANEL'
           ParentColor = False
-          TabOrder = 1
+          TabOrder = 0
         end
       end
     end

+ 1 - 2
Units/Forms/UCTRLWallet.pas → src/gui/UCTRLWallet.pas

@@ -18,7 +18,6 @@ type
 
   TCTRLWallet = class(TApplicationForm)
     cbAccounts: TComboBox;
-    cbShowSelectedOps: TCheckBox;
     gpMyAccounts: TGroupBox;
     gpRecentOps: TGroupBox;
     GroupBox1: TGroupBox;
@@ -127,6 +126,7 @@ begin
     cmbDuration.AddItem('Maximum', TObject(wdFullHistory));
   finally
     cmbDuration.Items.EndUpdate;
+    cmbDuration.ItemIndex:=0;;
   end;
   cmbDuration.OnChange:=cmbDurationChange;
 
@@ -153,7 +153,6 @@ begin
   end;
 end;
 
-
 procedure TCTRLWallet.OnOperationsGridColumnInitialize(Sender: TObject; AColIndex:Integer; AColumn: TVisualColumn);
 begin
   case AColIndex of

+ 2 - 1
Units/Forms/UFRMAbout.lfm → src/gui/UFRMAbout.lfm

@@ -15,7 +15,8 @@ object FRMAbout: TFRMAbout
   Font.Name = 'Tahoma'
   OnCreate = FormCreate
   Position = poOwnerFormCenter
-  LCLVersion = '1.6.4.0'
+  LCLVersion = '1.8.0.6'
+  Visible = False
   object Image1: TImage
     Left = 15
     Height = 62

+ 1 - 1
Units/Forms/UFRMAbout.pas → src/gui/UFRMAbout.pas

@@ -17,7 +17,7 @@ unit UFRMAbout;
 
 interface
 
-{$I ./../PascalCoin/config.inc}
+{$I ../config.inc}
 
 uses
   LCLIntf, LCLType, LMessages,

+ 0 - 0
Units/Forms/UFRMAccountExplorer.lfm → src/gui/UFRMAccountExplorer.lfm


+ 1 - 1
Units/Forms/UFRMAccountExplorer.pas → src/gui/UFRMAccountExplorer.pas

@@ -13,7 +13,7 @@ unit UFRMAccountExplorer;
 
 interface
 
-{$I ./../PascalCoin/config.inc}
+{$I ..\config.inc}
 
 uses
   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,

+ 0 - 0
Units/Forms/UFRMAccountInfo.lfm → src/gui/UFRMAccountInfo.lfm


+ 1 - 1
Units/Forms/UFRMAccountInfo.pas → src/gui/UFRMAccountInfo.pas

@@ -2,7 +2,7 @@ unit UFRMAccountInfo;
 
 interface
 
-{$I ./../PascalCoin/config.inc}
+{$I ..\config.inc}
 
 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

+ 0 - 0
Units/Forms/UFRMAccountSelect.lfm → src/gui/UFRMAccountSelect.lfm


+ 1 - 1
Units/Forms/UFRMAccountSelect.pas → src/gui/UFRMAccountSelect.pas

@@ -17,7 +17,7 @@ unit UFRMAccountSelect;
 
 interface
 
-{$I ./../PascalCoin/config.inc}
+{$I ..\config.inc}
 
 uses
   LCLIntf, LCLType, LMessages,

+ 0 - 0
Units/Forms/UFRMBlockExplorer.lfm → src/gui/UFRMBlockExplorer.lfm


+ 1 - 1
Units/Forms/UFRMBlockExplorer.pas → src/gui/UFRMBlockExplorer.pas

@@ -14,7 +14,7 @@ interface
 }
 
 
-{$I ./../PascalCoin/config.inc}
+{$I ..\config.inc}
 
 uses
   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov