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
23#include <xrpld/app/tx/detail/NFTokenMint.h>
24
25#include <xrpl/protocol/SField.h>
26#include <xrpl/protocol/jss.h>
27
28namespace ripple {
29namespace test {
30namespace jtx {
31namespace token {
32
34mint(jtx::Account const& account, std::uint32_t nfTokenTaxon)
35{
36 Json::Value jv;
37 jv[sfAccount.jsonName] = account.human();
38 jv[sfNFTokenTaxon.jsonName] = nfTokenTaxon;
39 jv[sfTransactionType.jsonName] = jss::NFTokenMint;
40 return jv;
41}
42
43void
44xferFee::operator()(Env& env, JTx& jt) const
45{
46 jt.jv[sfTransferFee.jsonName] = xferFee_;
47}
48
49void
50issuer::operator()(Env& env, JTx& jt) const
51{
52 jt.jv[sfIssuer.jsonName] = issuer_;
53}
54
55void
56uri::operator()(Env& env, JTx& jt) const
57{
58 jt.jv[sfURI.jsonName] = uri_;
59}
60
61void
62amount::operator()(Env& env, JTx& jt) const
63{
64 jt.jv[sfAmount.jsonName] = amount_.getJson(JsonOptions::none);
65}
66
69 jtx::Env const& env,
70 jtx::Account const& issuer,
71 std::uint32_t nfTokenTaxon,
74{
75 // Get the nftSeq from the account root of the issuer.
76 std::uint32_t const nftSeq = {
77 env.le(issuer)->at(~sfMintedNFTokens).value_or(0)};
78 return token::getID(env, issuer, nfTokenTaxon, nftSeq, flags, xferFee);
79}
80
83 jtx::Env const& env,
84 jtx::Account const& issuer,
85 std::uint32_t nfTokenTaxon,
86 std::uint32_t nftSeq,
89{
90 if (env.current()->rules().enabled(fixNFTokenRemint))
91 {
92 // If fixNFTokenRemint is enabled, we must add issuer's
93 // FirstNFTokenSequence to offset the starting NFT sequence number.
94 nftSeq += env.le(issuer)
95 ->at(~sfFirstNFTokenSequence)
96 .value_or(env.seq(issuer));
97 }
99 flags, xferFee, issuer, nft::toTaxon(nfTokenTaxon), nftSeq);
100}
101
103burn(jtx::Account const& account, uint256 const& nftokenID)
104{
105 Json::Value jv;
106 jv[sfAccount.jsonName] = account.human();
107 jv[sfNFTokenID.jsonName] = to_string(nftokenID);
108 jv[jss::TransactionType] = jss::NFTokenBurn;
109 return jv;
110}
111
114 jtx::Account const& account,
115 uint256 const& nftokenID,
116 STAmount const& amount)
117{
118 Json::Value jv;
119 jv[sfAccount.jsonName] = account.human();
120 jv[sfNFTokenID.jsonName] = to_string(nftokenID);
121 jv[sfAmount.jsonName] = amount.getJson(JsonOptions::none);
122 jv[jss::TransactionType] = jss::NFTokenCreateOffer;
123 return jv;
124}
125
126void
127owner::operator()(Env& env, JTx& jt) const
128{
129 jt.jv[sfOwner.jsonName] = owner_;
130}
131
132void
134{
135 jt.jv[sfExpiration.jsonName] = expires_;
136}
137
138void
140{
141 jt.jv[sfDestination.jsonName] = dest_;
142}
143
144template <typename T>
145static Json::Value
146cancelOfferImpl(jtx::Account const& account, T const& nftokenOffers)
147{
148 Json::Value jv;
149 jv[sfAccount.jsonName] = account.human();
150 if (!empty(nftokenOffers))
151 {
152 jv[sfNFTokenOffers.jsonName] = Json::arrayValue;
153 for (uint256 const& nftokenOffer : nftokenOffers)
154 jv[sfNFTokenOffers.jsonName].append(to_string(nftokenOffer));
155 }
156 jv[jss::TransactionType] = jss::NFTokenCancelOffer;
157 return jv;
158}
159
162 jtx::Account const& account,
163 std::initializer_list<uint256> const& nftokenOffers)
164{
165 return cancelOfferImpl(account, nftokenOffers);
166}
167
170 jtx::Account const& account,
171 std::vector<uint256> const& nftokenOffers)
172{
173 return cancelOfferImpl(account, nftokenOffers);
174}
175
176void
178{
179 jt.jv[sfRootIndex.jsonName] = rootIndex_;
180}
181
183acceptBuyOffer(jtx::Account const& account, uint256 const& offerIndex)
184{
185 Json::Value jv;
186 jv[sfAccount.jsonName] = account.human();
187 jv[sfNFTokenBuyOffer.jsonName] = to_string(offerIndex);
188 jv[jss::TransactionType] = jss::NFTokenAcceptOffer;
189 return jv;
190}
191
193acceptSellOffer(jtx::Account const& account, uint256 const& offerIndex)
194{
195 Json::Value jv;
196 jv[sfAccount.jsonName] = account.human();
197 jv[sfNFTokenSellOffer.jsonName] = to_string(offerIndex);
198 jv[jss::TransactionType] = jss::NFTokenAcceptOffer;
199 return jv;
200}
201
204 jtx::Account const& account,
205 uint256 const& buyOfferIndex,
206 uint256 const& sellOfferIndex)
207{
208 Json::Value jv;
209 jv[sfAccount.jsonName] = account.human();
210 jv[sfNFTokenBuyOffer.jsonName] = to_string(buyOfferIndex);
211 jv[sfNFTokenSellOffer.jsonName] = to_string(sellOfferIndex);
212 jv[jss::TransactionType] = jss::NFTokenAcceptOffer;
213 return jv;
214}
215
216void
218{
219 jt.jv[sfNFTokenBrokerFee.jsonName] = brokerFee_.getJson(JsonOptions::none);
220}
221
223setMinter(jtx::Account const& account, jtx::Account const& minter)
224{
226 jt[sfNFTokenMinter.fieldName] = minter.human();
227 return jt;
228}
229
232{
233 return fclear(account, asfAuthorizedNFTokenMinter);
234}
235
237modify(jtx::Account const& account, uint256 const& nftokenID)
238{
239 Json::Value jv;
240 jv[sfAccount.jsonName] = account.human();
241 jv[sfNFTokenID.jsonName] = to_string(nftokenID);
242 jv[jss::TransactionType] = jss::NFTokenModify;
243 return jv;
244}
245
246} // namespace token
247} // namespace jtx
248} // namespace test
249} // namespace ripple
Represents a JSON value.
Definition: json_value.h:150
Value & append(Value const &value)
Append value to array at the end.
Definition: json_value.cpp:910
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=JsonOptions::none) const override
Definition: STAmount.cpp:639
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:121
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
Definition: Env.cpp:212
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
Definition: Env.h:331
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
Definition: Env.cpp:221
Match set account flags.
Definition: flags.h:125
Sets the optional amount field on an NFTokenMint.
Definition: token.h:88
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:62
STAmount const amount_
Definition: token.h:90
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:217
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:139
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:133
Sets the optional Issuer on an NFTokenMint.
Definition: token.h:58
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:50
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:127
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:177
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:56
Sets the optional TransferFee on an NFTokenMint.
Definition: token.h:43
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:44
@ arrayValue
array value (ordered list)
Definition: json_value.h:45
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:231
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:68
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:82
Json::Value setMinter(jtx::Account const &account, jtx::Account const &minter)
Set the authorized minter on an account root.
Definition: token.cpp:223
Json::Value createOffer(jtx::Account const &account, uint256 const &nftokenID, STAmount const &amount)
Create an NFTokenOffer.
Definition: token.cpp:113
Json::Value acceptSellOffer(jtx::Account const &account, uint256 const &offerIndex)
Accept an NFToken sell offer.
Definition: token.cpp:193
Json::Value modify(jtx::Account const &account, uint256 const &nftokenID)
Modify an NFToken.
Definition: token.cpp:237
Json::Value acceptBuyOffer(jtx::Account const &account, uint256 const &offerIndex)
Accept an NFToken buy offer.
Definition: token.cpp:183
static Json::Value cancelOfferImpl(jtx::Account const &account, T const &nftokenOffers)
Definition: token.cpp:146
Json::Value mint(jtx::Account const &account, std::uint32_t nfTokenTaxon)
Mint an NFToken.
Definition: token.cpp:34
Json::Value burn(jtx::Account const &account, uint256 const &nftokenID)
Burn an NFToken.
Definition: token.cpp:103
Json::Value cancelOffer(jtx::Account const &account, std::initializer_list< uint256 > const &nftokenOffers)
Cancel NFTokenOffers.
Definition: token.cpp:161
Json::Value brokerOffers(jtx::Account const &account, uint256 const &buyOfferIndex, uint256 const &sellOfferIndex)
Broker two NFToken offers.
Definition: token.cpp:203
Json::Value fclear(Account const &account, std::uint32_t off)
Remove account flag.
Definition: flags.h:41
Json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
Definition: flags.cpp:29
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:45
Json::Value jv
Definition: JTx.h:46