From ba6d040266ada56990a654affab5f28949928869 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 20 Jan 2012 16:43:53 -0800 Subject: [PATCH] Infrastructure for "tx" RPC command to track transactions. --- LocalTransaction.cpp | 18 ++++++++++++++++++ LocalTransaction.h | 4 ++++ RPCServer.cpp | 26 ++++++++++++++++++++++++++ RPCServer.h | 1 + Transaction.cpp | 21 ++++++++++++++++++++- Transaction.h | 4 +++- 6 files changed, 72 insertions(+), 2 deletions(-) diff --git a/LocalTransaction.cpp b/LocalTransaction.cpp index 195f750c8..5a1196956 100644 --- a/LocalTransaction.cpp +++ b/LocalTransaction.cpp @@ -1,4 +1,6 @@ +#include + #include "json/writer.h" #include "LocalTransaction.h" @@ -36,3 +38,19 @@ void LocalTransaction::performTransaction() { mTransaction=theApp->getOPs().processTransaction(mTransaction); } + +Json::Value LocalTransaction::getJson() const +{ + if(!mTransaction) + { // has no corresponding transaction + Json::Value ret(Json::objectValue); + ret["Status"]="unfunded"; + ret["Amount"]=boost::lexical_cast(mAmount); + Json::Value destination(Json::objectValue); + destination["AccountID"]=NewcoinAddress(mDestAcctID).GetString(); + ret["Destination"]=destination; + return ret; + } + + return mTransaction->getJson(true, isPaid(), isCredited()); +} diff --git a/LocalTransaction.h b/LocalTransaction.h index 0a719c415..051d12929 100644 --- a/LocalTransaction.h +++ b/LocalTransaction.h @@ -7,6 +7,8 @@ #include +#include "json/value.h" + #include "uint256.h" #include "Transaction.h" @@ -49,6 +51,8 @@ public: void performTransaction(); // perform this transaction as if we received it from the network bool makeTransaction(); // create a transaction object according to these rules + + Json::Value getJson() const; }; #endif diff --git a/RPCServer.cpp b/RPCServer.cpp index 16dd4d00c..e4931060a 100644 --- a/RPCServer.cpp +++ b/RPCServer.cpp @@ -383,6 +383,31 @@ Json::Value RPCServer::doSendTo(Json::Value& params) return lt->getTransaction()->getJson(true); } +Json::Value RPCServer::doTx(Json::Value& params) +{ + // tx + // tx + // tx + // tx + + std::string param1, param2; + if(!extractString(param1, params, 0)) + { // all local transactions + } + + if(Transaction::isHexTxID(param1)) + { // transaction by ID + } + + if(extractString(param2, params, 1)) + { // family seq + } + + // account + + return "not implemented"; +} + Json::Value RPCServer::doCommand(const std::string& command, Json::Value& params) { std::cerr << "RPC:" << command << std::endl; @@ -416,6 +441,7 @@ Json::Value RPCServer::doCommand(const std::string& command, Json::Value& params if(command=="unlock") return doUnlock(params); if(command=="sendto") return doSendTo(params); if(command=="connect") return doConnect(params); + if(command=="tx") return doTx(params); return "unknown command"; } diff --git a/RPCServer.h b/RPCServer.h index c2ab74e6c..658414d94 100644 --- a/RPCServer.h +++ b/RPCServer.h @@ -41,6 +41,7 @@ class RPCServer : public boost::enable_shared_from_this Json::Value doUnlock(Json::Value& params); Json::Value doSendTo(Json::Value& params); Json::Value doConnect(Json::Value& params); + Json::Value doTx(Json::Value& params); // parses a string account name into a uint160 // can be local or remote diff --git a/Transaction.cpp b/Transaction.cpp index b1f6fb9a9..44c2dd229 100644 --- a/Transaction.cpp +++ b/Transaction.cpp @@ -318,7 +318,23 @@ bool Transaction::convertToTransactions(uint32 firstLedgerSeq, uint32 secondLedg return ret; } -Json::Value Transaction::getJson(bool decorate) const +static bool isHex(char j) +{ + if((j>='0') && (j<='9')) return true; + if((j>='A') && (j<='F')) return true; + if((j>='a') && (j<='f')) return true; + return false; +} + +bool Transaction::isHexTxID(const std::string& txid) +{ + if(txid.size()!=64) return false; + for(int i=0; i<64; i++) + if(!isHex(txid[i])) return false; + return true; +} + +Json::Value Transaction::getJson(bool decorate, bool paid, bool credited) const { Json::Value ret(Json::objectValue); ret["TransactionID"]=mTransactionID.GetHex(); @@ -356,7 +372,10 @@ Json::Value Transaction::getJson(bool decorate) const lac=theApp->getWallet().getLocalAccount(mAccountTo); if(!!lac) destination=lac->getJson(); } + if(paid) source["Paid"]=true; + if(credited) destination["Credited"]=true; ret["Source"]=source; ret["Destination"]=destination; return ret; } + diff --git a/Transaction.h b/Transaction.h index 2eaa86579..7de515084 100644 --- a/Transaction.h +++ b/Transaction.h @@ -99,7 +99,9 @@ public: bool operator<=(const Transaction&) const; bool operator>=(const Transaction&) const; - Json::Value getJson(bool decorate) const; + Json::Value getJson(bool decorate, bool paid_local=false, bool credited_local=false) const; + + static bool isHexTxID(const std::string&); protected: static Transaction::pointer transactionFromSQL(const std::string& statement);