/// <summary> /// Handle MicroCoin RPC error /// </summary> /// <param name="controller"></param> /// <param name="e">RPC Exception</param> /// <returns>API Response</returns> public static ObjectResult HandlerError(this Controller controller, MicroCoinRPCException e) { MicroCoinError error = new MicroCoinError(e.Error.ErrorCode, e.Message, ""); switch (e.Error.ErrorCode) { case ErrorCode.NotFound: return(controller.NotFound(error)); case ErrorCode.InvalidAccount: return(controller.BadRequest(error)); case ErrorCode.InternalError: return(controller.StatusCode(500, error)); case ErrorCode.InvalidBlock: return(controller.BadRequest(error)); case ErrorCode.InvalidData: return(controller.BadRequest(error)); case ErrorCode.InvalidOperation: return(controller.BadRequest(error)); case ErrorCode.InvalidPubKey: return(controller.BadRequest(error)); case ErrorCode.MethodNotFound: return(controller.BadRequest(error)); case ErrorCode.WalletPasswordProtected: return(controller.BadRequest(error)); default: return(controller.BadRequest(error)); } }
public ActionResult <Transaction> CommitTransaction([FromBody] TransactionRequest data) { var transaction = TransactionRequestToTransaction(data); Hash hash = transaction.GetHash(); if (data.Signature != null) { transaction.Signature = new ECSignature() { R = (Hash)data.Signature.R.ToUpper().PadLeft(64, '0'), S = (Hash)data.Signature.S.ToUpper().PadLeft(64, '0') }; var b = Utils.ValidateSignature(hash, transaction.Signature, transaction.AccountKey); if (!b) { return(StatusCode(403, MicroCoinError.Error(ErrorCode.InvalidSignature))); } using (var ms = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(ms, System.Text.Encoding.Default, true)) { bw.Write(1); bw.Write(1); } transaction.SaveToStream(ms); ms.Position = 0; Hash h = ms.ToArray(); var resp = client.ExecuteOperations(h); if (resp.First().Errors == null) { var op = resp.First(); var tr = new Transaction { Amount = op.Amount, Balance = op.Balance, Confirmations = op.Maturation.HasValue ? op.Maturation.Value : 0, Fee = op.Fee, OpHash = op.Ophash, Sender = op.SenderAccount, Target = op.DestAccount, Payload = new ByteString(op.PayLoad), Signer = (uint)op.SignerAccount, SubType = op.SubType.ToString(), Type = op.Type.ToString() }; return(Ok(tr)); } else { return(BadRequest(new MicroCoinError(ErrorCode.InvalidData, resp.First().Errors, "Check your data"))); } } } return(BadRequest(new MicroCoinError(ErrorCode.InvalidData, "Missing signature", "Please sign your transaction hash"))); }
public async Task <IActionResult> CommitPurchaseAccount([FromBody] PurchaseAccountRequest data) { MicroCoin.Transactions.TransferTransaction transaction = null; try { transaction = PurchaseAccountRequestToTransaction(data); } catch (MicroCoinRPCException e) { return(this.HandlerError(e)); } catch (Exception e) { return(StatusCode(500, new MicroCoinError(ErrorCode.UnknownError, e.Message, ""))); } Hash hash = transaction.GetHash(); if (data.Signature != null) { transaction.Signature = new ECSignature { R = (Hash)data.Signature.R.PadLeft(64, '0'), S = (Hash)data.Signature.S.PadLeft(64, '0') }; if (Utils.ValidateSignature(hash, 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(6); } transaction.SaveToStream(ms); ms.Position = 0; Hash h = ms.ToArray(); var resp = await client.ExecuteOperationsAsync(h); if (resp.Count() > 0 && resp.First().Errors == null) { var r = resp.First(); var tr = new PurchaseAccount { FounderAccount = (uint)r.Account, AccountNumber = (uint)r.DestAccount, Type = r.Type.ToString(), SubType = r.SubType.ToString(), Fee = r.Fee, Confirmations = r.Maturation, OpHash = r.Ophash, Balance = r.Balance }; return(Ok(tr)); } else { return(BadRequest(new MicroCoinError(ErrorCode.InvalidOperation, resp.Count() > 0 ? resp.First().Errors : "Invalid transaction", "Your transaction is invalid" ))); } } } else { return(StatusCode(403, MicroCoinError.Error(ErrorCode.InvalidSignature))); } } return(BadRequest("Missing signature")); }