xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
libxrpl
tx
transactors
nft
NFTokenModify.cpp
1
#include <xrpl/tx/transactors/nft/NFTokenModify.h>
2
3
#include <xrpl/basics/base_uint.h>
4
#include <xrpl/beast/utility/Journal.h>
5
#include <xrpl/ledger/helpers/NFTokenHelpers.h>
6
#include <xrpl/protocol/AccountID.h>
7
#include <xrpl/protocol/Indexes.h>
8
#include <xrpl/protocol/Protocol.h>
9
#include <xrpl/protocol/SField.h>
10
#include <xrpl/protocol/STLedgerEntry.h>
11
#include <xrpl/protocol/STTx.h>
12
#include <xrpl/protocol/TER.h>
13
#include <xrpl/protocol/XRPAmount.h>
14
#include <xrpl/protocol/nft.h>
15
#include <xrpl/tx/Transactor.h>
16
17
namespace
xrpl
{
18
19
NotTEC
20
NFTokenModify::preflight
(
PreflightContext
const
& ctx)
21
{
22
if
(
auto
owner = ctx.
tx
[~sfOwner]; owner == ctx.
tx
[sfAccount])
23
return
temMALFORMED
;
24
25
if
(
auto
uri = ctx.
tx
[~sfURI])
26
{
27
if
(uri->empty() || uri->length() >
kMaxTokenUriLength
)
28
return
temMALFORMED
;
29
}
30
31
return
tesSUCCESS
;
32
}
33
34
TER
35
NFTokenModify::preclaim
(
PreclaimContext
const
& ctx)
36
{
37
AccountID
const
account = ctx.
tx
[sfAccount];
38
AccountID
const
owner = ctx.
tx
[ctx.
tx
.
isFieldPresent
(sfOwner) ? sfOwner : sfAccount];
39
40
if
(!
nft::findToken
(ctx.
view
, owner, ctx.
tx
[sfNFTokenID]))
41
return
tecNO_ENTRY
;
42
43
// Check if the NFT is mutable
44
if
((
nft::getFlags
(ctx.
tx
[sfNFTokenID]) &
nft::kFlagMutable
) == 0)
45
return
tecNO_PERMISSION
;
46
47
// Verify permissions for the issuer
48
if
(
AccountID
const
issuer =
nft::getIssuer
(ctx.
tx
[sfNFTokenID]); issuer != account)
49
{
50
auto
const
sle = ctx.
view
.
read
(
keylet::account
(issuer));
51
if
(!sle)
52
return
tecINTERNAL
;
// LCOV_EXCL_LINE
53
if
(
auto
const
minter = (*sle)[~sfNFTokenMinter]; minter != account)
54
return
tecNO_PERMISSION
;
55
}
56
57
return
tesSUCCESS
;
58
}
59
60
TER
61
NFTokenModify::doApply
()
62
{
63
UInt256
const
nftokenID =
ctx_
.tx[sfNFTokenID];
64
AccountID
const
owner =
ctx_
.tx[
ctx_
.tx.isFieldPresent(sfOwner) ? sfOwner : sfAccount];
65
66
return
nft::changeTokenURI
(
view
(), owner, nftokenID,
ctx_
.tx[~sfURI]);
67
}
68
69
void
70
NFTokenModify::visitInvariantEntry
(
bool
,
SLE::ConstRef
,
SLE::ConstRef
)
71
{
72
// No transaction-specific invariants yet (future work).
73
}
74
75
bool
76
NFTokenModify::finalizeInvariants
(
77
STTx
const
&,
78
TER
,
79
XRPAmount
,
80
ReadView
const
&,
81
beast::Journal
const
&)
82
{
83
// No transaction-specific invariants yet (future work).
84
return
true
;
85
}
86
87
}
// namespace xrpl
beast::Journal
A generic endpoint for log messages.
Definition
Journal.h:44
xrpl::NFTokenModify::preclaim
static TER preclaim(PreclaimContext const &ctx)
Definition
NFTokenModify.cpp:35
xrpl::NFTokenModify::visitInvariantEntry
void visitInvariantEntry(bool isDelete, SLE::ConstRef before, SLE::ConstRef after) override
Inspect a single ledger entry modified by this transaction.
Definition
NFTokenModify.cpp:70
xrpl::NFTokenModify::finalizeInvariants
bool finalizeInvariants(STTx const &tx, TER result, XRPAmount fee, ReadView const &view, beast::Journal const &j) override
Check transaction-specific post-conditions after all entries have been visited.
Definition
NFTokenModify.cpp:76
xrpl::NFTokenModify::preflight
static NotTEC preflight(PreflightContext const &ctx)
Definition
NFTokenModify.cpp:20
xrpl::NFTokenModify::doApply
TER doApply() override
Definition
NFTokenModify.cpp:61
xrpl::ReadView
A view into a ledger.
Definition
ReadView.h:41
xrpl::ReadView::read
virtual SLE::const_pointer read(Keylet const &k) const =0
Return the state item associated with a key.
xrpl::STLedgerEntry::ConstRef
std::shared_ptr< STLedgerEntry const > const & ConstRef
Definition
STLedgerEntry.h:37
xrpl::STObject::isFieldPresent
bool isFieldPresent(SField const &field) const
Definition
STObject.cpp:464
xrpl::STTx
Definition
STTx.h:43
xrpl::Transactor::view
ApplyView & view()
Definition
Transactor.h:184
xrpl::Transactor::ctx_
ApplyContext & ctx_
Definition
Transactor.h:162
xrpl::XRPAmount
Definition
XRPAmount.h:28
xrpl::keylet::account
Keylet account(AccountID const &id) noexcept
AccountID root.
Definition
Indexes.cpp:220
xrpl::nft::findToken
std::optional< STObject > findToken(ReadView const &view, AccountID const &owner, UInt256 const &nftokenID)
Finds the specified token in the owner's token directory.
Definition
NFTokenHelpers.cpp:526
xrpl::nft::changeTokenURI
TER changeTokenURI(ApplyView &view, AccountID const &owner, UInt256 const &nftokenID, std::optional< xrpl::Slice > const &uri)
Definition
NFTokenHelpers.cpp:229
xrpl::nft::kFlagMutable
constexpr std::uint16_t const kFlagMutable
Definition
nft.h:36
xrpl::nft::getFlags
std::uint16_t getFlags(UInt256 const &id)
Definition
nft.h:39
xrpl::nft::getIssuer
AccountID getIssuer(UInt256 const &id)
Definition
nft.h:99
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
xrpl::kMaxTokenUriLength
constexpr std::size_t kMaxTokenUriLength
The maximum length of a URI inside an NFT.
Definition
Protocol.h:246
xrpl::UInt256
BaseUInt< 256 > UInt256
Definition
base_uint.h:580
xrpl::NotTEC
TERSubset< CanCvtToNotTEC > NotTEC
Definition
TER.h:614
xrpl::AccountID
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Definition
AccountID.h:34
xrpl::temMALFORMED
@ temMALFORMED
Definition
TER.h:75
xrpl::TER
TERSubset< CanCvtToTER > TER
Definition
TER.h:654
xrpl::tecNO_ENTRY
@ tecNO_ENTRY
Definition
TER.h:314
xrpl::tecINTERNAL
@ tecINTERNAL
Definition
TER.h:318
xrpl::tecNO_PERMISSION
@ tecNO_PERMISSION
Definition
TER.h:313
xrpl::tesSUCCESS
@ tesSUCCESS
Definition
TER.h:250
xrpl::PreclaimContext
State information when determining if a tx is likely to claim a fee.
Definition
Transactor.h:92
xrpl::PreclaimContext::view
ReadView const & view
Definition
Transactor.h:95
xrpl::PreclaimContext::tx
STTx const & tx
Definition
Transactor.h:98
xrpl::PreflightContext
State information when preflighting a tx.
Definition
Transactor.h:39
xrpl::PreflightContext::tx
STTx const & tx
Definition
Transactor.h:42
Generated by
1.17.0