TER Transactor::apply () { TER terResult (preCheck ()); if (terResult != tesSUCCESS) return (terResult); // Restructure this to avoid the dependency on LedgerBase::mLock Ledger::ScopedLockType sl (mEngine->getLedger ()->mLock); mTxnAccount = mEngine->entryCache (ltACCOUNT_ROOT, Ledger::getAccountRootIndex (mTxnAccountID)); calculateFee (); // Find source account // If are only forwarding, due to resource limitations, we might verifying // only some transactions, this would be probabilistic. if (!mTxnAccount) { if (mustHaveValidAccount ()) { m_journal.trace << "apply: delay transaction: source account does not exist " << mTxn.getSourceAccount ().humanAccountID (); return terNO_ACCOUNT; } } else { mPriorBalance = mTxnAccount->getFieldAmount (sfBalance); mSourceBalance = mPriorBalance; mHasAuthKey = mTxnAccount->isFieldPresent (sfRegularKey); } terResult = checkSeq (); if (terResult != tesSUCCESS) return (terResult); terResult = payFee (); if (terResult != tesSUCCESS) return (terResult); terResult = checkSig (); if (terResult != tesSUCCESS) return (terResult); terResult = precheckAgainstLedger(); if (terResult != tesSUCCESS) return (terResult); if (!mEngine->mClosingLedger) { return tesSUCCESS; } if (mTxnAccount) mEngine->entryModify (mTxnAccount); return doApply (); }
TER Transactor::apply () { TER terResult = tesSUCCESS; terResult = preCheck (); if (terResult != tesSUCCESS) return (terResult); Ledger::ScopedLockType sl (mEngine->getLedger ()->mLock, __FILE__, __LINE__); mTxnAccount = mEngine->entryCache (ltACCOUNT_ROOT, Ledger::getAccountRootIndex (mTxnAccountID)); calculateFee (); // Find source account // If are only forwarding, due to resource limitations, we might verifying only some transactions, this would be probabilistic. if (!mTxnAccount) { if (mustHaveValidAccount ()) { WriteLog (lsTRACE, Transactor) << boost::str (boost::format ("applyTransaction: Delay transaction: source account does not exist: %s") % mTxn.getSourceAccount ().humanAccountID ()); return terNO_ACCOUNT; } } else { mPriorBalance = mTxnAccount->getFieldAmount (sfBalance); mSourceBalance = mPriorBalance; mHasAuthKey = mTxnAccount->isFieldPresent (sfRegularKey); } terResult = checkSeq (); if (terResult != tesSUCCESS) return (terResult); terResult = payFee (); if (terResult != tesSUCCESS) return (terResult); terResult = checkSig (); if (terResult != tesSUCCESS) return (terResult); if (mTxnAccount) mEngine->entryModify (mTxnAccount); return doApply (); }