From 148b5b42a5a73118fc247c72d4ec070f5bacf0a5 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 16 Apr 2013 11:16:52 -0700 Subject: [PATCH] Transactor for change/fee. --- src/cpp/ripple/ChangeTransactor.cpp | 74 +++++++++++++++++++++++++++++ src/cpp/ripple/ChangeTransactor.h | 21 ++++++++ 2 files changed, 95 insertions(+) create mode 100644 src/cpp/ripple/ChangeTransactor.cpp create mode 100644 src/cpp/ripple/ChangeTransactor.h diff --git a/src/cpp/ripple/ChangeTransactor.cpp b/src/cpp/ripple/ChangeTransactor.cpp new file mode 100644 index 000000000..1d3a80f27 --- /dev/null +++ b/src/cpp/ripple/ChangeTransactor.cpp @@ -0,0 +1,74 @@ +#include "ChangeTransactor.h" + +TER ChangeTransactor::doApply() +{ + if (mTxn.getTxnType() == ttFEATURE) + return applyFeature(); + + if (mTxn.getTxnType() == ttFEE) + return applyFee(); + + return temUNKNOWN; +} + +TER ChangeTransactor::checkSig() +{ + if (mTxn.getFieldAccount160(sfAccount).isNonZero()) + return temBAD_SRC_ACCOUNT; + + if (!mTxn.getSigningPubKey().empty() || !mTxn.getSignature().empty()) + return temBAD_SIGNATURE; + + return tesSUCCESS; +} + +TER ChangeTransactor::checkSeq() +{ + if (mTxn.getSequence() != 0) + return temBAD_SEQUENCE; + + return tesSUCCESS; +} + +TER ChangeTransactor::payFee() +{ + if (mTxn.getTransactionFee() != STAmount()) + return temBAD_FEE; + + return tesSUCCESS; +} + +TER ChangeTransactor::applyFeature() +{ + uint256 feature = mTxn.getFieldH256(sfFeature); + + SLE::pointer featureObject = mEngine->entryCache(ltFEATURES, Ledger::getLedgerFeatureIndex()); + if (!featureObject) + featureObject = mEngine->entryCreate(ltFEATURES, Ledger::getLedgerFeatureIndex()); + + STVector256 features = featureObject->getFieldV256(sfFeatures); + if (features.hasValue(feature)) + return tefALREADY; + + features.addValue(feature); + featureObject->setFieldV256(sfFeatures, features); + mEngine->entryModify(featureObject); + + return tesSUCCESS; +} + +TER ChangeTransactor::applyFee() +{ + + SLE::pointer feeObject = mEngine->entryCache(ltFEE_SETTINGS, Ledger::getLedgerFeeIndex()); + if (!feeObject) + feeObject = mEngine->entryCreate(ltFEE_SETTINGS, Ledger::getLedgerFeeIndex()); + + feeObject->setFieldU64(sfBaseFee, mTxn.getFieldU64(sfBaseFee)); + feeObject->setFieldU32(sfReferenceFeeUnits, mTxn.getFieldU32(sfReferenceFeeUnits)); + feeObject->setFieldU32(sfReserveBase, mTxn.getFieldU32(sfReserveBase)); + feeObject->setFieldU32(sfReserveIncrement, mTxn.getFieldU32(sfReserveIncrement)); + + mEngine->entryModify(feeObject); + return tesSUCCESS; +} diff --git a/src/cpp/ripple/ChangeTransactor.h b/src/cpp/ripple/ChangeTransactor.h new file mode 100644 index 000000000..6c850d5fc --- /dev/null +++ b/src/cpp/ripple/ChangeTransactor.h @@ -0,0 +1,21 @@ +#include "Transactor.h" + +class ChangeTransactor : public Transactor +{ +protected: + + TER applyFeature(); + TER applyFee(); + +public: + ChangeTransactor(const SerializedTransaction& txn, TransactionEngineParams params, TransactionEngine *engine) + : Transactor(txn, params, engine) + { ; } + + TER doApply(); + TER checkSig(); + TER checkSeq(); + TER payFee(); +}; + +// vim:ts=4