#ifndef __TRANSACTIONENGINE__ #define __TRANSACTIONENGINE__ #include "Ledger.h" #include "SerializedTransaction.h" #include "SerializedLedger.h" // A TransactionEngine applies serialized transactions to a ledger // It can also, verify signatures, verify fees, and give rejection reasons enum TransactionEngineResult { // tenCAN_NEVER_SUCCEED = <0 // Malformed: Fee claimed tenGEN_IN_USE = -300, tenCREATEXNS, tenEXPLICITXNS, tenDST_NEEDED, tenDST_IS_SRC, tenBAD_GEN_AUTH, tenBAD_ADD_AUTH, tenBAD_CLAIM_ID, tenBAD_SET_ID, tenDIRECT_XNS_ONLY, tenRIPPLE_EMPTY, // Invalid: Ledger won't allow. tenCLAIMED = -200, tenCREATED, tenMSG_SET, tenBAD_AUTH_MASTER, tenBAD_RIPPLE, terALREADY, // Other tenFAILED = -100, tenUNKNOWN, tenINSUF_FEE_P, tenINVALID, terSUCCESS = 0, // terFAILED_BUT_COULD_SUCCEED = >0 // Conflict with ledger database: Fee claimed // Might succeed if not conflict is not caused by transaction ordering. terBAD_SEQ, terCREATED, terDIR_FULL, terINSUF_FEE_B, terINSUF_FEE_T, terNODE_NOT_FOUND, terNODE_NOT_MENTIONED, terNODE_NO_ROOT, terNO_ACCOUNT, terNO_DST, terNO_PATH, terPAST_LEDGER, terPAST_SEQ, terPRE_SEQ, terUNFUNDED, terNO_LINE_NO_ZERO, terSET_MISSING_DST, terFUNDS_SPENT, terUNCLAIMED, terBAD_AUTH, terBAD_RIPPLE, }; bool transResultInfo(TransactionEngineResult terCode, std::string& strToken, std::string& strHuman); enum TransactionEngineParams { tepNONE = 0, tepNO_CHECK_SIGN = 1, // Signature already checked tepNO_CHECK_FEE = 2, // It was voted into a ledger anyway tepUPDATE_TOTAL = 4, // Update the total coins }; enum TransactionAccountAction { taaACCESS, taaCREATE, taaMODIFY, taaDELETE }; typedef std::pair AffectedAccount; class TransactionEngine { private: TransactionEngineResult dirAdd( std::vector& accounts, uint64& uNodeDir, // Node of entry. const uint256& uBase, const uint256& uLedgerIndex); TransactionEngineResult dirDelete( std::vector& accounts, const uint64& uNodeDir, // Node item is mentioned in. const uint256& uBase, // Key of item. const uint256& uLedgerIndex); // Item being deleted TransactionEngineResult setAuthorized(const SerializedTransaction& txn, std::vector& accounts, bool bMustSetGenerator); protected: Ledger::pointer mDefaultLedger, mAlternateLedger; Ledger::pointer mLedger; TransactionEngineResult doAccountSet(const SerializedTransaction& txn, std::vector& accounts); TransactionEngineResult doClaim(const SerializedTransaction& txn, std::vector& accounts); TransactionEngineResult doCreditSet(const SerializedTransaction& txn, std::vector& accounts, const uint160& uSrcAccountID); TransactionEngineResult doDelete(const SerializedTransaction& txn, std::vector& accounts); TransactionEngineResult doInvoice(const SerializedTransaction& txn, std::vector& accounts); TransactionEngineResult doOffer(const SerializedTransaction& txn, std::vector& accounts); TransactionEngineResult doNicknameSet(const SerializedTransaction& txn, std::vector& accounts, const uint160& uSrcAccountID); TransactionEngineResult doPasswordFund(const SerializedTransaction& txn, std::vector& accounts, const uint160& uSrcAccountID); TransactionEngineResult doPasswordSet(const SerializedTransaction& txn, std::vector& accounts); TransactionEngineResult doPayment(const SerializedTransaction& txn, std::vector& accounts, const uint160& uSrcAccountID); TransactionEngineResult doStore(const SerializedTransaction& txn, std::vector& accounts); TransactionEngineResult doTake(const SerializedTransaction& txn, std::vector& accounts); TransactionEngineResult doTransitSet(const SerializedTransaction& txn, std::vector& accounts); TransactionEngineResult doWalletAdd(const SerializedTransaction& txn, std::vector& accounts); public: TransactionEngine() { ; } TransactionEngine(Ledger::pointer ledger) : mDefaultLedger(ledger) { ; } Ledger::pointer getDefaultLedger() { return mDefaultLedger; } void setDefaultLedger(Ledger::pointer ledger) { mDefaultLedger = ledger; } Ledger::pointer getAlternateLedger() { return mAlternateLedger; } void setAlternateLedger(Ledger::pointer ledger) { mAlternateLedger = ledger; } void setLedger(Ledger::pointer ledger) { mDefaultLedger = ledger; mAlternateLedger = Ledger::pointer(); } Ledger::pointer getTransactionLedger(uint32 targetLedger); TransactionEngineResult applyTransaction(const SerializedTransaction&, TransactionEngineParams, Ledger::pointer ledger); TransactionEngineResult applyTransaction(const SerializedTransaction&, TransactionEngineParams, uint32 targetLedger); }; inline TransactionEngineParams operator|(const TransactionEngineParams& l1, const TransactionEngineParams& l2) { return static_cast(static_cast(l1) | static_cast(l2)); } inline TransactionEngineParams operator&(const TransactionEngineParams& l1, const TransactionEngineParams& l2) { return static_cast(static_cast(l1) & static_cast(l2)); } #endif // vim:ts=4