Files
rippled/src/libxrpl/tx/transactors/account/SetRegularKey.cpp
Mayukha Vadari 9d11ba0ca7 migrate
2026-07-10 10:51:08 -04:00

102 lines
2.5 KiB
C++

#include <xrpl/tx/transactors/account/SetRegularKey.h>
#include <xrpl/basics/Slice.h>
#include <xrpl/beast/utility/Journal.h>
#include <xrpl/ledger/ReadView.h>
#include <xrpl/ledger/helpers/SLEWrappers.h>
#include <xrpl/protocol/Indexes.h>
#include <xrpl/protocol/LedgerFormats.h>
#include <xrpl/protocol/PublicKey.h>
#include <xrpl/protocol/SField.h>
#include <xrpl/protocol/STLedgerEntry.h>
#include <xrpl/protocol/STTx.h>
#include <xrpl/protocol/TER.h>
#include <xrpl/protocol/XRPAmount.h>
#include <xrpl/tx/Transactor.h>
namespace xrpl {
XRPAmount
SetRegularKey::calculateBaseFee(ReadView const& view, STTx const& tx)
{
auto const id = tx.getAccountID(sfAccount);
auto const spk = tx.getSigningPubKey();
if (publicKeyType(makeSlice(spk)))
{
if (calcAccountID(PublicKey(makeSlice(spk))) == id)
{
AccountRootEntry<ReadView> const sle{keylet::account(id), view};
if (sle && !sle->isFlag(lsfPasswordSpent))
{
// flag is armed and they signed with the right account
return XRPAmount{0};
}
}
}
return Transactor::calculateBaseFee(view, tx);
}
NotTEC
SetRegularKey::preflight(PreflightContext const& ctx)
{
if (ctx.tx.isFieldPresent(sfRegularKey) &&
(ctx.tx.getAccountID(sfRegularKey) == ctx.tx.getAccountID(sfAccount)))
{
return temBAD_REGKEY;
}
return tesSUCCESS;
}
TER
SetRegularKey::doApply()
{
AccountRootEntry<ApplyView> sle{keylet::account(accountID_), view()};
if (!sle)
return tefINTERNAL; // LCOV_EXCL_LINE
if (!minimumFee(ctx_.registry, ctx_.baseFee, view().fees(), view().flags()))
sle->setFlag(lsfPasswordSpent);
if (ctx_.tx.isFieldPresent(sfRegularKey))
{
sle->setAccountID(sfRegularKey, ctx_.tx.getAccountID(sfRegularKey));
}
else
{
// Account has disabled master key and no multi-signer signer list.
if (sle->isFlag(lsfDisableMaster) &&
!SignerListEntry<ApplyView>{keylet::signerList(accountID_), view()})
return tecNO_ALTERNATIVE_KEY;
sle->makeFieldAbsent(sfRegularKey);
}
sle.update();
return tesSUCCESS;
}
void
SetRegularKey::visitInvariantEntry(bool, SLE::const_ref, SLE::const_ref)
{
// No transaction-specific invariants yet (future work).
}
bool
SetRegularKey::finalizeInvariants(
STTx const&,
TER,
XRPAmount,
ReadView const&,
beast::Journal const&)
{
// No transaction-specific invariants yet (future work).
return true;
}
} // namespace xrpl