mirror of
https://github.com/XRPLF/rippled.git
synced 2026-07-28 09:30:34 +00:00
110 lines
3.1 KiB
C++
110 lines
3.1 KiB
C++
#include <xrpl/ledger/helpers/SponsorHelpers.h>
|
|
|
|
#include <xrpl/beast/utility/instrumentation.h>
|
|
#include <xrpl/ledger/ApplyView.h>
|
|
#include <xrpl/ledger/ReadView.h>
|
|
#include <xrpl/protocol/AccountID.h>
|
|
#include <xrpl/protocol/Indexes.h>
|
|
#include <xrpl/protocol/LedgerFormats.h>
|
|
#include <xrpl/protocol/SField.h>
|
|
#include <xrpl/protocol/STLedgerEntry.h>
|
|
#include <xrpl/protocol/STTx.h>
|
|
#include <xrpl/protocol/TER.h>
|
|
|
|
#include <expected>
|
|
#include <optional>
|
|
|
|
namespace xrpl {
|
|
|
|
std::optional<AccountID>
|
|
getTxReserveSponsorAccountID(STTx const& tx)
|
|
{
|
|
if (tx.isFieldPresent(sfSponsor) && isReserveSponsored(tx))
|
|
{
|
|
return tx.getAccountID(sfSponsor);
|
|
}
|
|
return {};
|
|
}
|
|
|
|
std::expected<SLE::pointer, TER>
|
|
getTxReserveSponsor(ApplyViewContext ctx)
|
|
{
|
|
auto const sponsorID = getTxReserveSponsorAccountID(ctx.tx);
|
|
if (sponsorID)
|
|
{
|
|
auto sle = ctx.view.peek(keylet::account(*sponsorID));
|
|
|
|
// already checked in Transactor::checkSponsor
|
|
if (!sle)
|
|
return std::unexpected(tecINTERNAL);
|
|
return sle;
|
|
}
|
|
return SLE::pointer();
|
|
}
|
|
|
|
std::expected<SLE::const_pointer, TER>
|
|
getTxReserveSponsor(ReadView const& view, STTx const& tx)
|
|
{
|
|
auto const sponsorID = getTxReserveSponsorAccountID(tx);
|
|
if (sponsorID)
|
|
{
|
|
auto sle = view.read(keylet::account(*sponsorID));
|
|
|
|
// already checked in Transactor::checkSponsor
|
|
if (!sle)
|
|
return std::unexpected(tecINTERNAL);
|
|
return sle;
|
|
}
|
|
return SLE::pointer();
|
|
}
|
|
|
|
std::optional<AccountID>
|
|
getLedgerEntryReserveSponsorAccountID(SLE::const_ref sle, SF_ACCOUNT const& field)
|
|
{
|
|
if (sle->isFieldPresent(field))
|
|
return sle->getAccountID(field);
|
|
return {};
|
|
}
|
|
|
|
SLE::pointer
|
|
getLedgerEntryReserveSponsor(ApplyView& view, SLE::const_ref sle, SF_ACCOUNT const& field)
|
|
{
|
|
auto const sponsorID = getLedgerEntryReserveSponsorAccountID(sle, field);
|
|
if (sponsorID)
|
|
return view.peek(keylet::account(*sponsorID));
|
|
return {};
|
|
}
|
|
|
|
SLE::const_pointer
|
|
getLedgerEntryReserveSponsor(ReadView const& view, SLE::const_ref sle, SF_ACCOUNT const& field)
|
|
{
|
|
auto const sponsorID = getLedgerEntryReserveSponsorAccountID(sle, field);
|
|
if (sponsorID)
|
|
return view.read(keylet::account(*sponsorID));
|
|
return {};
|
|
}
|
|
|
|
void
|
|
addSponsorToLedgerEntry(SLE::ref sle, SLE::const_ref sponsorSle, SF_ACCOUNT const& field)
|
|
{
|
|
XRPL_ASSERT(
|
|
(sle->getType() == ltRIPPLE_STATE && (field == sfHighSponsor || field == sfLowSponsor)) ||
|
|
(sle->getType() != ltRIPPLE_STATE && field == sfSponsor),
|
|
"addSponsorToLedgerEntry : Invalid field to the LedgerEntry");
|
|
if (sponsorSle)
|
|
sle->setAccountID(field, sponsorSle->getAccountID(sfAccount));
|
|
}
|
|
|
|
void
|
|
removeSponsorFromLedgerEntry(SLE::ref sle, SF_ACCOUNT const& field)
|
|
{
|
|
XRPL_ASSERT(
|
|
(sle->getType() == ltRIPPLE_STATE && (field == sfHighSponsor || field == sfLowSponsor)) ||
|
|
(sle->getType() != ltRIPPLE_STATE && field == sfSponsor),
|
|
"removeSponsorFromLedgerEntry : Invalid field to the LedgerEntry");
|
|
if (sle->isFieldPresent(field))
|
|
sle->makeFieldAbsent(field);
|
|
}
|
|
|
|
} // namespace xrpl
|