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 () { preCompute(); // If the transactor requires a valid account and the transaction doesn't // list one, preflight will have already a flagged a failure. auto const sle = view().peek (keylet::account(account_)); // sle must exist except for transactions // that allow zero account. assert(sle != nullptr || account_ == beast::zero); if (sle) { mPriorBalance = STAmount ((*sle)[sfBalance]).xrp (); mSourceBalance = mPriorBalance; setSeq(); auto result = payFee (); if (result != tesSUCCESS) return result; view().update (sle); } 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 (); }