From adf0313ab85ad0afb850eeee2af009f0beeb767a Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sun, 22 Apr 2012 16:27:55 -0700 Subject: [PATCH] Transaction fee handling. --- src/TransactionEngine.cpp | 52 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/src/TransactionEngine.cpp b/src/TransactionEngine.cpp index 34a77ace8d..7d5d8b62d0 100644 --- a/src/TransactionEngine.cpp +++ b/src/TransactionEngine.cpp @@ -15,7 +15,12 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran // check signature if (!txn.checkSign(acctKey)) return terINVALID; - // WRITEME: Check fee + uint64 txnFee = txn.getTransactionFee(); + if ( (params & tepNO_CHECK_FEE) != tepNONE) + { + // WRITEME: Check if fee is adequate + if (txnFee == 0) return terINSUF_FEE_P; + } // get source account ID uint160 srcAccount = txn.getSigningAccount(); @@ -26,7 +31,14 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran // find source account LedgerStateParms qry = lepNONE; SerializedLedgerEntry::pointer src = mLedger->getAccountRoot(qry, srcAccount); - if(!src) return terNO_ACCOUNT; + if (!src) return terNO_ACCOUNT; + + // deduct the fee, so it's not available during the transaction + // we only write the account back if the transaction succeeds + uint64 balance = src->getIFieldU64(sfBalance); + if (balance < txnFee) + return terINSUF_FEE_B; + src->setIFieldU64(sfBalance, balance - txnFee); // validate sequence uint32 t_seq = txn.getSequence(); @@ -81,3 +93,39 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran return result; } + +TransactionEngineResult TransactionEngine::doPayment(const SerializedTransaction& txn, SerializedLedgerEntry& source) +{ + return terUNKNOWN; +} + +TransactionEngineResult TransactionEngine::doInvoice(const SerializedTransaction&, SerializedLedgerEntry& source) +{ + return terUNKNOWN; +} + +TransactionEngineResult TransactionEngine::doOffer(const SerializedTransaction&, SerializedLedgerEntry& source) +{ + return terUNKNOWN; +} + +TransactionEngineResult TransactionEngine::doTake(const SerializedTransaction&, SerializedLedgerEntry& source) +{ + return terUNKNOWN; +} + +TransactionEngineResult TransactionEngine::doCancel(const SerializedTransaction&, SerializedLedgerEntry& source) +{ + return terUNKNOWN; +} + +TransactionEngineResult TransactionEngine::doStore(const SerializedTransaction&, SerializedLedgerEntry& source) +{ + return terUNKNOWN; +} + +TransactionEngineResult TransactionEngine::doDelete(const SerializedTransaction&, SerializedLedgerEntry& source) +{ + return terUNKNOWN; +} +