Scorum
create_nft_evaluator.cpp
Go to the documentation of this file.
2 
5 
11 
12 namespace scorum {
13 namespace chain {
14 create_nft_evaluator::create_nft_evaluator(data_service_factory_i& services,
17  : evaluator_impl<data_service_factory_i, create_nft_evaluator>(services)
18  , _account_dba(account_dba)
19  , _nft_dba(nft_dba)
20  , _dprop_service(services.dynamic_global_property_service())
21  , _hardfork_service(services.hardfork_property_service())
22 {
23 }
24 
26 {
27  FC_ASSERT(_hardfork_service.has_hardfork(SCORUM_HARDFORK_0_5), "Hardfork #5 is required");
28 
29  FC_ASSERT(!_nft_dba.is_exists_by<by_name>(op.name), R"(NFT with name "${name}" already exists.)",
30  ("name", op.name));
31  FC_ASSERT(!_nft_dba.is_exists_by<by_uuid>(op.uuid), R"(NFT with uuid "${uuid}" already exists.)",
32  ("uuid", op.uuid));
33  FC_ASSERT(_account_dba.is_exists_by<by_name>(op.owner), R"(Account "${owner}" must exist.)", ("owner", op.owner));
34 
35  auto& account = _account_dba.get_by<by_name>(op.owner);
36  const auto available_power = account.scorumpower - account.nft_spend_scorumpower;
37 
38  share_type requested_sp = static_cast<share_type>(op.initial_power) * pow(10, SCORUM_CURRENCY_PRECISION);
39 
40  FC_ASSERT(available_power.amount >= requested_sp,
41  R"(Account available power "${available_power}" is less than requested "${requested_sp}".)",
42  ("available_power", available_power.amount)("requested_sp", requested_sp));
43 
44  _account_dba.update(account, [&](auto& obj) {
45  obj.nft_spend_scorumpower.amount += requested_sp;
46  });
47 
48  _nft_dba.create([&](auto& obj) {
49  obj.uuid = op.uuid;
50  obj.name = op.name;
51  obj.owner = op.owner;
52  obj.initial_power = op.initial_power;
53  obj.created = _dprop_service.head_block_time();
54 
55 #ifndef IS_LOW_MEM
56  fc::from_string(obj.json_metadata, op.json_metadata);
57 #endif
58  });
59 }
60 
61 } // namespace chain
62 } // namespace scorum
void do_apply(const operation_type &op)
create_nft_evaluator(data_service_factory_i &, dba::db_accessor< account_object > &, dba::db_accessor< nft_object > &)
const object_type & get_by(const Key &arg) const
bool is_exists_by(const Key &arg) const
const object_type & update(modifier_type modifier)
#define SCORUM_CURRENCY_PRECISION
Definition: config.hpp:97
fc::safe< share_value_type > share_type
Definition: types.hpp:73
Definition: asset.cpp:15
virtual fc::time_point_sec head_block_time() const =0
virtual bool has_hardfork(uint32_t hardfork) const =0