public ActionResult StartChangeKey([FromBody] ChangeKeyRequest changeKey)
 {
     try
     {
         var transaction = ChangeKeyRequestToTransaction(changeKey);
         changeKey.Hash = (Hash)transaction.GetHash();
         return(Ok(changeKey));
     }
     catch (MicroCoinRPCException e)
     {
         return(this.HandlerError(e));
     }
 }
 public ActionResult CommitChangeKey([FromBody] ChangeKeyRequest changeKey)
 {
     MicroCoin.Transactions.ChangeKeyTransaction transaction = null;
     try
     {
         transaction = ChangeKeyRequestToTransaction(changeKey);
     }
     catch (MicroCoinRPCException e)
     {
         return(this.HandlerError(e));
     }
     if (changeKey.Signature == null)
     {
         return(BadRequest(new MicroCoinError(ErrorCode.InvalidOperation, "Missing signature", "You must sign the hash and set the signature")));
     }
     transaction.Signature = new ECSignature
     {
         R = (Hash)changeKey.Signature.R.PadLeft(64, '0'),
         S = (Hash)changeKey.Signature.S.PadLeft(64, '0')
     };
     if (Utils.ValidateSignature(transaction.GetHash(), transaction.Signature, transaction.AccountKey))
     {
         using (var ms = new MemoryStream())
         {
             using (BinaryWriter bw = new BinaryWriter(ms, System.Text.Encoding.Default, true))
             {
                 bw.Write(1);
                 bw.Write(7);
             }
             transaction.SaveToStream(ms);
             ms.Position = 0;
             Hash h = ms.ToArray();
             try
             {
                 var resp = client.ExecuteOperations(h);
                 var r    = resp.First();
                 var tr   = new ChangeKey
                 {
                     AccountNumber     = (uint)r.Account,
                     Balance           = r.Balance,
                     OpHash            = r.Ophash,
                     Signer            = (uint)r.SignerAccount,
                     SubType           = r.SubType.ToString(),
                     Type              = r.Type.ToString(),
                     Confirmations     = r.Maturation,
                     NewOwnerPublicKey = changeKey.NewOwnerPublicKey,
                     Signature         = changeKey.Signature
                 };
                 return(Ok(tr));
             }
             catch (MicroCoinRPCException e)
             {
                 return(this.HandlerError(e));
             }
         }
     }
     else
     {
         return(StatusCode(403, new MicroCoinError(ErrorCode.InvalidData, "Invalid signature", "Your signature is invalid")));
     }
 }
        private MicroCoin.Transactions.ChangeKeyTransaction ChangeKeyRequestToTransaction(ChangeKeyRequest changeKey)
        {
            var    account = client.GetAccount(changeKey.AccountNumber);
            string pubkey  = account.EncPubKey;
            var    key     = client.DecodePubKey(pubkey, null);

            return(new MicroCoin.Transactions.ChangeKeyTransaction
            {
                NewAccountKey = new ECKeyPair
                {
                    CurveType = Enum.Parse <CurveType>(changeKey.NewOwnerPublicKey.CurveType, true),
                    PublicKey = new ECPoint
                    {
                        X = (Hash)changeKey.NewOwnerPublicKey.X.PadLeft(64, '0'),
                        Y = (Hash)changeKey.NewOwnerPublicKey.Y.PadLeft(64, '0')
                    }
                },
                TargetAccount = changeKey.AccountNumber,
                SignerAccount = changeKey.AccountNumber,
                TransactionType = MicroCoin.Transactions.TransactionType.ChangeKeySigned,
                NumberOfOperations = account.NumOperations + 1,
                Fee = (ulong)(changeKey.Fee * 10000M),
                AccountKey = new ECKeyPair
                {
                    CurveType = (CurveType)key.KeyType,
                    PublicKey = new ECPoint
                    {
                        X = (Hash)key.X,
                        Y = (Hash)key.Y
                    }
                }
            });
        }