rippled
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 <ripple/app/tx/impl/NFTokenMint.h>
24 #include <ripple/protocol/SField.h>
25 #include <ripple/protocol/jss.h>
26 
27 namespace ripple {
28 namespace test {
29 namespace jtx {
30 namespace token {
31 
33 mint(jtx::Account const& account, std::uint32_t nfTokenTaxon)
34 {
35  Json::Value jv;
36  jv[sfAccount.jsonName] = account.human();
37  jv[sfNFTokenTaxon.jsonName] = nfTokenTaxon;
38  jv[sfTransactionType.jsonName] = jss::NFTokenMint;
39  return jv;
40 }
41 
42 void
43 xferFee::operator()(Env& env, JTx& jt) const
44 {
46 }
47 
48 void
49 issuer::operator()(Env& env, JTx& jt) const
50 {
52 }
53 
54 void
55 uri::operator()(Env& env, JTx& jt) const
56 {
57  jt.jv[sfURI.jsonName] = uri_;
58 }
59 
60 uint256
62  jtx::Env const& env,
63  jtx::Account const& issuer,
64  std::uint32_t nfTokenTaxon,
67 {
68  // Get the nftSeq from the account root of the issuer.
69  std::uint32_t const nftSeq = {
70  env.le(issuer)->at(~sfMintedNFTokens).value_or(0)};
71  return token::getID(env, issuer, nfTokenTaxon, nftSeq, flags, xferFee);
72 }
73 
74 uint256
76  jtx::Env const& env,
77  jtx::Account const& issuer,
78  std::uint32_t nfTokenTaxon,
79  std::uint32_t nftSeq,
82 {
83  if (env.current()->rules().enabled(fixNFTokenRemint))
84  {
85  // If fixNFTokenRemint is enabled, we must add issuer's
86  // FirstNFTokenSequence to offset the starting NFT sequence number.
87  nftSeq += env.le(issuer)
89  .value_or(env.seq(issuer));
90  }
92  flags, xferFee, issuer, nft::toTaxon(nfTokenTaxon), nftSeq);
93 }
94 
96 burn(jtx::Account const& account, uint256 const& nftokenID)
97 {
98  Json::Value jv;
99  jv[sfAccount.jsonName] = account.human();
100  jv[sfNFTokenID.jsonName] = to_string(nftokenID);
101  jv[jss::TransactionType] = jss::NFTokenBurn;
102  return jv;
103 }
104 
107  jtx::Account const& account,
108  uint256 const& nftokenID,
109  STAmount const& amount)
110 {
111  Json::Value jv;
112  jv[sfAccount.jsonName] = account.human();
113  jv[sfNFTokenID.jsonName] = to_string(nftokenID);
115  jv[jss::TransactionType] = jss::NFTokenCreateOffer;
116  return jv;
117 }
118 
119 void
120 owner::operator()(Env& env, JTx& jt) const
121 {
122  jt.jv[sfOwner.jsonName] = owner_;
123 }
124 
125 void
127 {
129 }
130 
131 void
133 {
135 }
136 
137 template <typename T>
138 static Json::Value
139 cancelOfferImpl(jtx::Account const& account, T const& nftokenOffers)
140 {
141  Json::Value jv;
142  jv[sfAccount.jsonName] = account.human();
143  if (!empty(nftokenOffers))
144  {
146  for (uint256 const& nftokenOffer : nftokenOffers)
147  jv[sfNFTokenOffers.jsonName].append(to_string(nftokenOffer));
148  }
149  jv[jss::TransactionType] = jss::NFTokenCancelOffer;
150  return jv;
151 }
152 
155  jtx::Account const& account,
156  std::initializer_list<uint256> const& nftokenOffers)
157 {
158  return cancelOfferImpl(account, nftokenOffers);
159 }
160 
163  jtx::Account const& account,
164  std::vector<uint256> const& nftokenOffers)
165 {
166  return cancelOfferImpl(account, nftokenOffers);
167 }
168 
169 void
170 rootIndex::operator()(Env& env, JTx& jt) const
171 {
173 }
174 
176 acceptBuyOffer(jtx::Account const& account, uint256 const& offerIndex)
177 {
178  Json::Value jv;
179  jv[sfAccount.jsonName] = account.human();
180  jv[sfNFTokenBuyOffer.jsonName] = to_string(offerIndex);
181  jv[jss::TransactionType] = jss::NFTokenAcceptOffer;
182  return jv;
183 }
184 
186 acceptSellOffer(jtx::Account const& account, uint256 const& offerIndex)
187 {
188  Json::Value jv;
189  jv[sfAccount.jsonName] = account.human();
190  jv[sfNFTokenSellOffer.jsonName] = to_string(offerIndex);
191  jv[jss::TransactionType] = jss::NFTokenAcceptOffer;
192  return jv;
193 }
194 
197  jtx::Account const& account,
198  uint256 const& buyOfferIndex,
199  uint256 const& sellOfferIndex)
200 {
201  Json::Value jv;
202  jv[sfAccount.jsonName] = account.human();
203  jv[sfNFTokenBuyOffer.jsonName] = to_string(buyOfferIndex);
204  jv[sfNFTokenSellOffer.jsonName] = to_string(sellOfferIndex);
205  jv[jss::TransactionType] = jss::NFTokenAcceptOffer;
206  return jv;
207 }
208 
209 void
210 brokerFee::operator()(Env& env, JTx& jt) const
211 {
213 }
214 
216 setMinter(jtx::Account const& account, jtx::Account const& minter)
217 {
219  jt[sfNFTokenMinter.fieldName] = minter.human();
220  return jt;
221 }
222 
224 clearMinter(jtx::Account const& account)
225 {
226  return fclear(account, asfAuthorizedNFTokenMinter);
227 }
228 
229 } // namespace token
230 } // namespace jtx
231 } // namespace test
232 } // namespace ripple
ripple::sfFirstNFTokenSequence
const SF_UINT32 sfFirstNFTokenSequence
ripple::test::jtx::token::cancelOfferImpl
static Json::Value cancelOfferImpl(jtx::Account const &account, T const &nftokenOffers)
Definition: token.cpp:139
ripple::sfRootIndex
const SF_UINT256 sfRootIndex
ripple::test::jtx::token::uri::operator()
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:55
ripple::test::jtx::token::acceptBuyOffer
Json::Value acceptBuyOffer(jtx::Account const &account, uint256 const &offerIndex)
Accept an NFToken buy offer.
Definition: token.cpp:176
ripple::sfNFTokenOffers
const SF_VECTOR256 sfNFTokenOffers
ripple::sfDestination
const SF_ACCOUNT sfDestination
ripple::sfAmount
const SF_AMOUNT sfAmount
ripple::sfNFTokenID
const SF_UINT256 sfNFTokenID
ripple::test::jtx::token::rootIndex::rootIndex_
std::string rootIndex_
Definition: token.h:176
Json::arrayValue
@ arrayValue
array value (ordered list)
Definition: json_value.h:42
ripple::test::jtx::token::issuer::issuer_
std::string issuer_
Definition: token.h:60
ripple::sfOwner
const SF_ACCOUNT sfOwner
ripple::test::jtx::token::brokerOffers
Json::Value brokerOffers(jtx::Account const &account, uint256 const &buyOfferIndex, uint256 const &sellOfferIndex)
Broker two NFToken offers.
Definition: token.cpp:196
std::vector
STL class.
ripple::test::jtx::token::issuer
Sets the optional Issuer on an NFTokenMint.
Definition: token.h:57
ripple::SField::fieldName
const std::string fieldName
Definition: SField.h:132
ripple::STAmount::getJson
Json::Value getJson(JsonOptions) const override
Definition: STAmount.cpp:655
ripple::sfMintedNFTokens
const SF_UINT32 sfMintedNFTokens
ripple::test::jtx::Account::human
std::string const & human() const
Returns the human readable public key.
Definition: Account.h:113
ripple::test::jtx::token::acceptSellOffer
Json::Value acceptSellOffer(jtx::Account const &account, uint256 const &offerIndex)
Accept an NFToken sell offer.
Definition: token.cpp:186
ripple::nft::toTaxon
Taxon toTaxon(std::uint32_t i)
Definition: NFTokenUtils.h:40
ripple::test::jtx::token::rootIndex::operator()
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:170
ripple::test::jtx::token::getNextID
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:61
ripple::SField::jsonName
const Json::StaticString jsonName
Definition: SField.h:136
ripple::test::jtx::token::brokerFee::operator()
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:210
ripple::sfTransferFee
const SF_UINT16 sfTransferFee
ripple::test::jtx::token::uri::uri_
std::string uri_
Definition: token.h:75
ripple::fixNFTokenRemint
const uint256 fixNFTokenRemint
ripple::sfExpiration
const SF_UINT32 sfExpiration
ripple::test::jtx::token::cancelOffer
Json::Value cancelOffer(jtx::Account const &account, std::initializer_list< uint256 > const &nftokenOffers)
Cancel NFTokenOffers.
Definition: token.cpp:154
ripple::base_uint
Integers of any length that is a multiple of 32-bits.
Definition: base_uint.h:82
ripple::sfTransactionType
const SF_UINT16 sfTransactionType
ripple::test::jtx::token::xferFee
Sets the optional TransferFee on an NFTokenMint.
Definition: token.h:42
Json::Value::append
Value & append(const Value &value)
Append value to array at the end.
Definition: json_value.cpp:882
ripple::test::jtx::token::brokerFee::brokerFee_
const STAmount brokerFee_
Definition: token.h:206
ripple::test::jtx::token::xferFee::xferFee_
std::uint16_t xferFee_
Definition: token.h:45
ripple::sfNFTokenMinter
const SF_ACCOUNT sfNFTokenMinter
ripple::test::jtx::token::burn
Json::Value burn(jtx::Account const &account, uint256 const &nftokenID)
Burn an NFToken.
Definition: token.cpp:96
ripple::JsonOptions::none
@ none
ripple::test::jtx::JTx
Execution context for applying a JSON transaction.
Definition: JTx.h:42
ripple::test::jtx::JTx::jv
Json::Value jv
Definition: JTx.h:44
ripple::test::jtx::fset
Json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
Definition: flags.cpp:28
ripple::NFTokenMint::createNFTokenID
static uint256 createNFTokenID(std::uint16_t flags, std::uint16_t fee, AccountID const &issuer, nft::Taxon taxon, std::uint32_t tokenSeq)
Definition: NFTokenMint.cpp:87
ripple::STAmount
Definition: STAmount.h:45
ripple::test::jtx::token::issuer::operator()
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:49
std::uint32_t
ripple::test::jtx::token::mint
Json::Value mint(jtx::Account const &account, std::uint32_t nfTokenTaxon)
Mint an NFToken.
Definition: token.cpp:33
ripple::test::jtx::Env::seq
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
Definition: Env.cpp:207
ripple::test::jtx::fclear
Json::Value fclear(Account const &account, std::uint32_t off)
Remove account flag.
Definition: flags.h:40
ripple::test::jtx::token::xferFee::operator()
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:43
ripple::sfNFTokenBuyOffer
const SF_UINT256 sfNFTokenBuyOffer
ripple::test::jtx::token::createOffer
Json::Value createOffer(jtx::Account const &account, uint256 const &nftokenID, STAmount const &amount)
Create an NFTokenOffer.
Definition: token.cpp:106
ripple::sfURI
const SF_VL sfURI
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::test::jtx::token::destination::dest_
std::string dest_
Definition: token.h:150
ripple::test::jtx::flags
Match set account flags.
Definition: flags.h:108
ripple::test::jtx::token::destination::operator()
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:132
ripple::sfIssuer
const SF_ACCOUNT sfIssuer
ripple::test::jtx::Env::le
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
Definition: Env.cpp:216
ripple::test::jtx::token::expiration::expires_
std::uint32_t expires_
Definition: token.h:135
ripple::to_string
std::string to_string(Manifest const &m)
Format the specified manifest to a string for debugging purposes.
Definition: app/misc/impl/Manifest.cpp:41
ripple::sfNFTokenTaxon
const SF_UINT32 sfNFTokenTaxon
ripple::test::jtx::Account
Immutable cryptographic account descriptor.
Definition: Account.h:37
ripple::sfAccount
const SF_ACCOUNT sfAccount
ripple::test::jtx::token::owner::operator()
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:120
ripple::sfNFTokenSellOffer
const SF_UINT256 sfNFTokenSellOffer
ripple::test::jtx::Env::current
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
Definition: Env.h:300
ripple::test::jtx::token::getID
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:75
ripple::test::jtx::Env
A transaction testing environment.
Definition: Env.h:116
ripple::test::jtx::token::clearMinter
Json::Value clearMinter(jtx::Account const &account)
Clear any authorized minter from an account root.
Definition: token.cpp:224
ripple::sfNFTokenBrokerFee
const SF_AMOUNT sfNFTokenBrokerFee
ripple::test::jtx::token::owner::owner_
std::string owner_
Definition: token.h:120
ripple::test::jtx::token::setMinter
Json::Value setMinter(jtx::Account const &account, jtx::Account const &minter)
Set the authorized minter on an account root.
Definition: token.cpp:216
Json::Value
Represents a JSON value.
Definition: json_value.h:145
std::initializer_list
ripple::asfAuthorizedNFTokenMinter
constexpr std::uint32_t asfAuthorizedNFTokenMinter
Definition: TxFlags.h:83
ripple::test::jtx::token::expiration::operator()
void operator()(Env &, JTx &jtx) const
Definition: token.cpp:126