private void DispatchRequest(Request request, Action <Response, ResultCode> sendResponse) { if (request is GetAccountRequest) { var message = (GetAccountRequest)request; var command = new GetAccountCommand(message.Address, (acc, rc) => sendResponse(ResponseHelper.CreateGetAccountResponse(acc), rc)); LiveService.AddCommand(command); } else if (request is GetTransactionsRequest) { var message = (GetTransactionsRequest)request; if (!RequestHelper.TryReadTransactionHashes(message, out var hashes)) { sendResponse.Call(ResponseHelper.CreateGetTransactionResponse(), ResultCode.InvalidInputParam); return; } LiveService.AddCommand(new GetTransactionsCommand(hashes, sendResponse)); } else if (request is SendTransactionRequest) { var message = (SendTransactionRequest)request; if (!RequestHelper.TryReadSignedTransaction(message, out var signed)) { sendResponse.Call(new SendTransactionResponse(), ResultCode.CannotReadSignedTransaction); return; } LiveService.AddCommand(new SendTransactionCommand(signed, sendResponse)); } else if (request is GetSignedLedgerRequest) { var message = (GetSignedLedgerRequest)request; if (message.Height < 0) { sendResponse.Call(ResponseHelper.CreateGetSignedLedgerResponseFromZip(null), ResultCode.InvalidInputParam); return; } var height = LedgerService.LedgerManager.GetSignedLedger().GetHeight(); if (message.Height > height) { sendResponse.Call(ResponseHelper.CreateGetSignedLedgerResponseFromZip(null), ResultCode.LedgerDoesnotExist); return; } if (message.Height == height) { var ledger = LedgerService.LedgerManager.GetSignedLedger(); var zipped = LedgerCompressionEngine.ZipSignedLedger(ledger); sendResponse.Call(ResponseHelper.CreateGetSignedLedgerResponseFromZip(zipped), ResultCode.Success); return; } var signed = DatabaseService.ReadDatabaseManager.GetRawLedger(message.Height); if (signed == null) { sendResponse.Call(ResponseHelper.CreateGetSignedLedgerResponseFromZip(null), ResultCode.LedgerDoesnotExist); } sendResponse.Call(ResponseHelper.CreateGetSignedLedgerResponseFromZip(signed), ResultCode.Success); } else if (request is GetCurrentLedgerHeightRequest) { var height = LedgerService.LedgerManager.GetSignedLedger().GetHeight(); sendResponse.Call(ResponseHelper.CreateGetCurrentLedgerHeightResponse(height), ResultCode.Success); } else { sendResponse.Call(new Response(), ResultCode.UnknownMessage); } }