rippled
Loading...
Searching...
No Matches
token.cpp
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright (c) 2012, 2013 Ripple Labs Inc.
5
6 Permission to use, copy, modify, and/or distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#include <test/jtx/flags.h>
21#include <test/jtx/token.h>
22#include <xrpld/app/tx/detail/NFTokenMint.h>
23#include <xrpl/protocol/SField.h>
24#include <xrpl/protocol/jss.h>
25
26namespace ripple {
27namespace test {
28namespace jtx {
29namespace token {
30
32mint(jtx::Account const& account, std::uint32_t nfTokenTaxon)
33{
34 Json::Value jv;
35 jv[sfAccount.jsonName] = account.human();
36 jv[sfNFTokenTaxon.jsonName] = nfTokenTaxon;
37 jv[sfTransactionType.jsonName] = jss::NFTokenMint;
38 return jv;
39}
40
41void
42xferFee::operator()(Env& env, JTx& jt) const
43{
44 jt.jv[sfTransferFee.jsonName] = xferFee_;
45}
46
47void
48issuer::operator()(Env& env, JTx& jt) const
49{
50 jt.jv[sfIssuer.jsonName] = issuer_;
51}
52
53void
54uri::operator()(Env& env, JTx& jt) const
55{
56 jt.jv[sfURI.jsonName] = uri_;
57}
58
59void
60amount::operator()(Env& env, JTx& jt) const
61{
62 jt.jv[sfAmount.jsonName] = amount_.getJson(JsonOptions::none);
63}
64
67 jtx::Env const& env,
68 jtx::Account const& issuer,
69 std::uint32_t nfTokenTaxon,
72{
73 // Get the nftSeq from the account root of the issuer.
74 std::uint32_t const nftSeq = {
75 env.le(issuer)->at(~sfMintedNFTokens).value_or(0)};
76 return token::getID(env, issuer, nfTokenTaxon, nftSeq, flags, xferFee);
77}
78
81 jtx::Env const& env,
82 jtx::Account const& issuer,
83 std::uint32_t nfTokenTaxon,
84 std::uint32_t nftSeq,
87{
88 if (env.current()->rules().enabled(fixNFTokenRemint))
89 {
90 // If fixNFTokenRemint is enabled, we must add issuer's
91 // FirstNFTokenSequence to offset the starting NFT sequence number.
92 nftSeq += env.le(issuer)
93 ->at(~sfFirstNFTokenSequence)
94 .value_or(env.seq(issuer));
95 }
97 flags, xferFee, issuer, nft::toTaxon(nfTokenTaxon), nftSeq);
98}
99
101burn(jtx::Account const& account, uint256 const& nftokenID)
102{
103 Json::Value jv;
104 jv[sfAccount.jsonName] = account.human();
105 jv[sfNFTokenID.jsonName] = to_string(nftokenID);
106 jv[jss::TransactionType] = jss::NFTokenBurn;
107 return jv;
108}
109
112 jtx::Account const& account,
113 uint256 const& nftokenID,
114 STAmount const& amount)
115{
116 Json::Value jv;
117 jv[sfAccount.jsonName] = account.human();
118 jv[sfNFTokenID.jsonName] = to_string(nftokenID);
119 jv[sfAmount.jsonName] = amount.getJson(JsonOptions::none);
120 jv[jss::TransactionType] = jss::NFTokenCreateOffer;
121 return jv;
122}
123
124void
125owner::operator()(Env& env, JTx& jt) const
126{
127 jt.jv[sfOwner.jsonName] = owner_;
128}
129
130void
132{
133 jt.jv[sfExpiration.jsonName] = expires_;
134}
135
136void
138{
139 jt.jv[sfDestination.jsonName] = dest_;
140}
141
142template <typename T>
143static Json::Value
144cancelOfferImpl(jtx::Account const& account, T const& nftokenOffers)
145{
146 Json::Value jv;
147 jv[sfAccount.jsonName] = account.human();
148 if (!empty(nftokenOffers))
149 {
150 jv[sfNFTokenOffers.jsonName] = Json::arrayValue;
151 for (uint256 const& nftokenOffer : nftokenOffers)
152 jv[sfNFTokenOffers.jsonName].append(to_string(nftokenOffer));
153 }
154 jv[jss::TransactionType] = jss::NFTokenCancelOffer;
155 return jv;
156}
157
160 jtx::Account const& account,
161 std::initializer_list<uint256> const& nftokenOffers)
162{
163 return cancelOfferImpl(account, nftokenOffers);
164}
165
168 jtx::Account const& account,
169 std::vector<uint256> const& nftokenOffers)
170{
171 return cancelOfferImpl(account, nftokenOffers);
172}
173
174void
176{
177 jt.jv[sfRootIndex.jsonName] = rootIndex_;
178}
179
181acceptBuyOffer(jtx::Account const& account, uint256 const& offerIndex)
182{
183 Json::Value jv;
184 jv[sfAccount.jsonName] = account.human();
185 jv[sfNFTokenBuyOffer.jsonName] = to_string(offerIndex);
186 jv[jss::TransactionType] = jss::NFTokenAcceptOffer;
187 return jv;
188}
189
191acceptSellOffer(jtx::Account const& account, uint256 const& offerIndex)
192{
193 Json::Value jv;
194 jv[sfAccount.jsonName] = account.human();
195 jv[sfNFTokenSellOffer.jsonName] = to_string(offerIndex);
196 jv[jss::TransactionType] = jss::NFTokenAcceptOffer;
197 return jv;
198}
199
202 jtx::Account const& account,
203 uint256 const& buyOfferIndex,
204 uint256 const& sellOfferIndex)
205{
206 Json::Value jv;
207 jv[sfAccount.jsonName] = account.human();
208 jv[sfNFTokenBuyOffer.jsonName] = to_string(buyOfferIndex);
209 jv[sfNFTokenSellOffer.jsonName] = to_string(sellOfferIndex);
210 jv[jss::TransactionType] = jss::NFTokenAcceptOffer;
211 return jv;
212}
213
214void
216{
217 jt.jv[sfNFTokenBrokerFee.jsonName] = brokerFee_.getJson(JsonOptions::none);
218}
219
221setMinter(jtx::Account const& account, jtx::Account const& minter)
222{
224 jt[sfNFTokenMinter.fieldName] = minter.human();
225 return jt;
226}
227
230{
231 return fclear(account, asfAuthorizedNFTokenMinter);
232}
233
235modify(jtx::Account const& account, uint256 const& nftokenID)
236{
237 Json::Value jv;
238 jv[sfAccount.jsonName] = account.human();
239 jv[sfNFTokenID.jsonName] = to_string(nftokenID);
240 jv[jss::TransactionType] = jss::NFTokenModify;
241 return jv;
242}
243
244} // namespace token
245} // namespace jtx
246} // namespace test
247} // namespace ripple
Represents a JSON value.
Definition: json_value.h:148
Value & append(const Value &value)
Append value to array at the end.
Definition: json_value.cpp:897
static uint256 createNFTokenID(std::uint16_t flags, std::uint16_t fee, AccountID const &issuer, nft::Taxon taxon, std::uint32_t tokenSeq)
Json::Value getJson(JsonOptions) const override
Definition: STAmount.cpp:636
Immutable cryptographic account descriptor.
Definition: Account.h:39
std::string const & human() const
Returns the human readable public key.
Definition: Account.h:114
A transaction testing environment.
Definition: Env.h:118
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
Definition: Env.cpp:210
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
Definition: Env.h:326
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
Definition: Env.cpp:219
Match set account flags.
Definition: flags.h:112
Sets the optional amount field on an NFTokenMint.
Definition: token.h:87
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:60
STAmount const amount_
Definition: token.h:89
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:215
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:137
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:131
Sets the optional Issuer on an NFTokenMint.
Definition: token.h:57
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:48
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:125
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:175
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:54
Sets the optional TransferFee on an NFTokenMint.
Definition: token.h:42
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:42
@ arrayValue
array value (ordered list)
Definition: json_value.h:43
Taxon toTaxon(std::uint32_t i)
Definition: nft.h:42
Json::Value clearMinter(jtx::Account const &account)
Clear any authorized minter from an account root.
Definition: token.cpp:229
uint256 getNextID(jtx::Env const &env, jtx::Account const &issuer, std::uint32_t nfTokenTaxon, std::uint16_t flags, std::uint16_t xferFee)
Get the next NFTokenID that will be issued.
Definition: token.cpp:66
uint256 getID(jtx::Env const &env, jtx::Account const &issuer, std::uint32_t nfTokenTaxon, std::uint32_t nftSeq, std::uint16_t flags, std::uint16_t xferFee)
Get the NFTokenID for a particular nftSequence.
Definition: token.cpp:80
Json::Value setMinter(jtx::Account const &account, jtx::Account const &minter)
Set the authorized minter on an account root.
Definition: token.cpp:221
Json::Value createOffer(jtx::Account const &account, uint256 const &nftokenID, STAmount const &amount)
Create an NFTokenOffer.
Definition: token.cpp:111
Json::Value acceptSellOffer(jtx::Account const &account, uint256 const &offerIndex)
Accept an NFToken sell offer.
Definition: token.cpp:191
Json::Value modify(jtx::Account const &account, uint256 const &nftokenID)
Modify an NFToken.
Definition: token.cpp:235
Json::Value acceptBuyOffer(jtx::Account const &account, uint256 const &offerIndex)
Accept an NFToken buy offer.
Definition: token.cpp:181
static Json::Value cancelOfferImpl(jtx::Account const &account, T const &nftokenOffers)
Definition: token.cpp:144
Json::Value mint(jtx::Account const &account, std::uint32_t nfTokenTaxon)
Mint an NFToken.
Definition: token.cpp:32
Json::Value burn(jtx::Account const &account, uint256 const &nftokenID)
Burn an NFToken.
Definition: token.cpp:101
Json::Value cancelOffer(jtx::Account const &account, std::initializer_list< uint256 > const &nftokenOffers)
Cancel NFTokenOffers.
Definition: token.cpp:159
Json::Value brokerOffers(jtx::Account const &account, uint256 const &buyOfferIndex, uint256 const &sellOfferIndex)
Broker two NFToken offers.
Definition: token.cpp:201
Json::Value fclear(Account const &account, std::uint32_t off)
Remove account flag.
Definition: flags.h:40
Json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
Definition: flags.cpp:28
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
constexpr std::uint32_t asfAuthorizedNFTokenMinter
Definition: TxFlags.h:85
std::string to_string(base_uint< Bits, Tag > const &a)
Definition: base_uint.h:630
Execution context for applying a JSON transaction.
Definition: JTx.h:44
Json::Value jv
Definition: JTx.h:45