mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
126 lines
3.5 KiB
C++
126 lines
3.5 KiB
C++
//------------------------------------------------------------------------------
|
|
/*
|
|
Copyright (c) 2011-2013, OpenCoin, Inc.
|
|
*/
|
|
//==============================================================================
|
|
|
|
SETUP_LOG (ChangeTransactor)
|
|
|
|
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 ())
|
|
{
|
|
WriteLog (lsWARNING, ChangeTransactor) << "Change transaction had bad source account";
|
|
return temBAD_SRC_ACCOUNT;
|
|
}
|
|
|
|
if (!mTxn.getSigningPubKey ().empty () || !mTxn.getSignature ().empty ())
|
|
{
|
|
WriteLog (lsWARNING, ChangeTransactor) << "Change transaction had bad signature";
|
|
return temBAD_SIGNATURE;
|
|
}
|
|
|
|
return tesSUCCESS;
|
|
}
|
|
|
|
TER ChangeTransactor::checkSeq ()
|
|
{
|
|
if ((mTxn.getSequence () != 0) || mTxn.isFieldPresent (sfPreviousTxnID))
|
|
{
|
|
WriteLog (lsWARNING, ChangeTransactor) << "Change transaction had bad sequence";
|
|
return temBAD_SEQUENCE;
|
|
}
|
|
|
|
return tesSUCCESS;
|
|
}
|
|
|
|
TER ChangeTransactor::payFee ()
|
|
{
|
|
if (mTxn.getTransactionFee () != STAmount ())
|
|
{
|
|
WriteLog (lsWARNING, ChangeTransactor) << "Change transaction with non-zero fee";
|
|
return temBAD_FEE;
|
|
}
|
|
|
|
return tesSUCCESS;
|
|
}
|
|
|
|
TER ChangeTransactor::preCheck ()
|
|
{
|
|
mTxnAccountID = mTxn.getSourceAccount ().getAccountID ();
|
|
|
|
if (mTxnAccountID.isNonZero ())
|
|
{
|
|
WriteLog (lsWARNING, ChangeTransactor) << "applyTransaction: bad source id";
|
|
|
|
return temBAD_SRC_ACCOUNT;
|
|
}
|
|
|
|
if (isSetBit (mParams, tapOPEN_LEDGER))
|
|
{
|
|
WriteLog (lsWARNING, ChangeTransactor) << "Change transaction against open ledger";
|
|
return temINVALID;
|
|
}
|
|
|
|
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);
|
|
|
|
getApp().getFeatureTable ().enableFeature (feature);
|
|
|
|
if (!getApp().getFeatureTable ().isFeatureSupported (feature))
|
|
getApp().getOPs ().setFeatureBlocked ();
|
|
|
|
return tesSUCCESS;
|
|
}
|
|
|
|
TER ChangeTransactor::applyFee ()
|
|
{
|
|
|
|
SLE::pointer feeObject = mEngine->entryCache (ltFEE_SETTINGS, Ledger::getLedgerFeeIndex ());
|
|
|
|
if (!feeObject)
|
|
feeObject = mEngine->entryCreate (ltFEE_SETTINGS, Ledger::getLedgerFeeIndex ());
|
|
|
|
WriteLog (lsINFO, ChangeTransactor) << "Previous fee object: " << feeObject->getJson (0);
|
|
|
|
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);
|
|
|
|
WriteLog (lsINFO, ChangeTransactor) << "New fee object: " << feeObject->getJson (0);
|
|
WriteLog (lsWARNING, ChangeTransactor) << "Fees have been changed";
|
|
return tesSUCCESS;
|
|
}
|