QtIotaBlock 0.4.1
Library with block types on IOTA
qoutputs.hpp
1 #pragma once
2 
3 #include "block/carray.hpp"
4 #include "block/qfeatures.hpp"
5 #include "block/qnative_tokens.hpp"
6 #include "block/qtoken_scheme.hpp"
7 #include "block/qunlock_conditions.hpp"
8 #include <QByteArray>
9 #include <QDataStream>
10 #include <QJsonArray>
11 #include <QJsonObject>
12 #include <QJsonValue>
13 namespace qiota
14 {
15 namespace qblocks
16 {
17 
18 class Output
19 {
20  public:
21  enum types : quint8
22  {
23  All_typ = 0,
24  Basic_typ = 3,
25  NFT_typ = 6,
27  Alias_typ = 4
28  };
29  Output(types typ, const quint64 &amount_m, const pset<const Unlock_Condition> &unlock_conditions_m,
30  const pset<const Feature> &features_m = {}, const pset<const Native_Token> &native_tokens_m = {},
31  const pset<const Feature> &immutable_features_m = {});
32 
33  Output(types typ, const QJsonValue &val);
34  Output(types typ) : type_m(typ){};
35 
36  template <class from_type> static std::shared_ptr<Output> from_(from_type &val);
37 
39  {
40  QByteArray var;
41  auto wBuffer = QDataStream(&var, QIODevice::WriteOnly | QIODevice::Append);
42  wBuffer.setByteOrder(QDataStream::LittleEndian);
43  serialize(wBuffer);
44  auto rBuffer = QDataStream(&var, QIODevice::ReadOnly);
45  rBuffer.setByteOrder(QDataStream::LittleEndian);
46  return from_<QDataStream>(rBuffer);
47  }
48  static std::shared_ptr<Output> Basic(const quint64 &amount_m,
49  const pset<const Unlock_Condition> &unlock_conditions_m,
50  const pset<const Native_Token> &native_tokens_m = {},
51  const pset<const Feature> &features_m = {});
52  static std::shared_ptr<Output> NFT(const quint64 &amount_m, const pset<const Unlock_Condition> &unlock_conditions_m,
53  const pset<const Native_Token> &native_tokens_m = {},
54  const pset<const Feature> &immutable_features_m = {},
55  const pset<const Feature> &features_m = {});
56  static std::shared_ptr<Output> Foundry(const quint64 &amount_m,
57  const pset<const Unlock_Condition> &unlock_conditions_m,
58  const std::shared_ptr<Token_Scheme> &token_scheme_m,
59  const quint32 &serial_number_m,
60  const pset<const Native_Token> &native_tokens_m = {},
61  const pset<const Feature> &immutable_features_m = {},
62  const pset<const Feature> &features_m = {});
63  static std::shared_ptr<Output> Alias(const quint64 &amount_m,
64  const pset<const Unlock_Condition> &unlock_conditions_m,
65  const fl_array<quint16> &state_metadata_m = "",
66  const quint32 &foundry_counter_m = 0, const quint32 &state_index_m = 0,
67  const pset<const Native_Token> &native_tokens_m = {},
68  const pset<const Feature> &immutable_features_m = {},
69  const pset<const Feature> &features_m = {});
70 
71  virtual void serialize(QDataStream &out) const;
72  virtual QJsonObject get_Json(void) const;
73  virtual void set_id(const c_array &id);
74  virtual c_array get_id(void) const
75  {
76  return c_array(32, 0);
77  };
78  virtual void consume(void);
79  quint64 min_deposit_of_output(const quint64 &wkey, const quint64 &wdata, const quint64 &v_byte_cost) const;
80 
82  {
83  const auto found = std::find_if(unlock_conditions_.begin(), unlock_conditions_.end(),
84  [typ](const auto &it) { return (it->type() == typ); });
85  return (found == unlock_conditions_.end()) ? nullptr : *found;
86  }
87 
89  {
90  const auto found =
91  std::find_if(features_.begin(), features_.end(), [typ](const auto &it) { return (it->type() == typ); });
92  return (found == features_.end()) ? nullptr : *found;
93  }
95  {
96  const auto found = std::find_if(immutable_features_.begin(), immutable_features_.end(),
97  [typ](const auto &it) { return (it->type() == typ); });
98  return (found == immutable_features_.end()) ? nullptr : *found;
99  }
100 
101  quint64 amount_;
106  types type(void) const
107  {
108  return type_m;
109  }
110  QBLOCK_EXPORT const static QHash<types, QString> typesstr;
111 
112  private:
113  const types type_m;
114 };
115 
116 class Basic_Output : public Output
117 {
118  public:
119  Basic_Output(const quint64 &amount_m, const pset<const Unlock_Condition> &unlock_conditions_m,
120  const pset<const Native_Token> &native_tokens_m = {}, const pset<const Feature> &features_m = {});
121  Basic_Output(const QJsonValue &val);
123  void serialize(QDataStream &out) const;
124  QJsonObject get_Json(void) const;
125 };
126 class NFT_Output : public Output
127 {
128  public:
129  NFT_Output(const quint64 &amount_m, const pset<const Unlock_Condition> &unlock_conditions_m,
130  const pset<const Native_Token> &native_tokens_m = {},
131  const pset<const Feature> &immutable_features_m = {}, const pset<const Feature> &features_m = {});
132  NFT_Output(const QJsonValue &val);
133  NFT_Output(QDataStream &in);
134  void serialize(QDataStream &out) const;
135 
136  QJsonObject get_Json(void) const;
137  void set_id(const c_array &outputid)
138  {
139  if (nft_id_ == c_array(32, 0))
140  nft_id_ = outputid.hash<QCryptographicHash::Blake2b_256>();
141  };
142  c_array get_id(void) const
143  {
144  return nft_id_;
145  }
146 
147  private:
148  NFT_ID nft_id_;
149 };
150 
151 class Foundry_Output : public Output
152 {
153  public:
154  Foundry_Output(const quint64 &amount_m, const pset<const Unlock_Condition> &unlock_conditions_m,
155  const std::shared_ptr<Token_Scheme> &token_scheme_m, const quint32 &serial_number_m,
156  const pset<const Native_Token> &native_tokens_m = {},
157  const pset<const Feature> &immutable_features_m = {}, const pset<const Feature> &features_m = {});
158  Foundry_Output(const QJsonValue &val);
160  void serialize(QDataStream &out) const;
161  c_array get_id(void) const
162  {
163  c_array var;
164  var = unlock_conditions_.begin()->get()->address()->addr();
165  var.append(serial_number_);
166  var.append(token_scheme_->type());
167  return var;
168  }
169  void consume(void);
170  QJsonObject get_Json(void) const;
172  quint32 serial_number_;
173 
174  private:
175 };
176 
177 class Alias_Output : public Output
178 {
179  public:
180  Alias_Output(const quint64 &amount_m, const pset<const Unlock_Condition> &unlock_conditions_m,
181  const fl_array<quint16> &state_metadata_m = "", const quint32 &foundry_counter_m = 0,
182  const quint32 &state_index_m = 0, const pset<const Native_Token> &native_tokens_m = {},
183  const pset<const Feature> &immutable_features_m = {}, const pset<const Feature> &features_m = {});
184  Alias_Output(const QJsonValue &val);
186  void serialize(QDataStream &out) const;
187 
188  QJsonObject get_Json(void) const;
189  void set_id(const c_array &outputid)
190  {
191  if (alias_id_ == c_array(32, 0))
192  alias_id_ = outputid.hash<QCryptographicHash::Blake2b_256>();
193  };
194  c_array get_id(void) const
195  {
196  return alias_id_;
197  }
200 
201  private:
202  Alias_ID alias_id_;
203 };
204 
205 }; // namespace qblocks
206 
207 }; // namespace qiota
Definition: qoutputs.hpp:178
Alias_Output(const quint64 &amount_m, const pset< const Unlock_Condition > &unlock_conditions_m, const fl_array< quint16 > &state_metadata_m="", const quint32 &foundry_counter_m=0, const quint32 &state_index_m=0, const pset< const Native_Token > &native_tokens_m={}, const pset< const Feature > &immutable_features_m={}, const pset< const Feature > &features_m={})
Definition: qoutputs.cpp:245
void serialize(QDataStream &out) const
Definition: qoutputs.cpp:283
c_array get_id(void) const
Definition: qoutputs.hpp:194
void set_id(const c_array &outputid)
Definition: qoutputs.hpp:189
fl_array< quint16 > state_metadata_
Definition: qoutputs.hpp:199
quint32 foundry_counter_
Definition: qoutputs.hpp:198
quint32 state_index_
Definition: qoutputs.hpp:198
QJsonObject get_Json(void) const
Definition: qoutputs.cpp:273
Definition: qoutputs.hpp:117
Basic_Output(const quint64 &amount_m, const pset< const Unlock_Condition > &unlock_conditions_m, const pset< const Native_Token > &native_tokens_m={}, const pset< const Feature > &features_m={})
Definition: qoutputs.cpp:107
QJsonObject get_Json(void) const
Definition: qoutputs.cpp:128
void serialize(QDataStream &out) const
Definition: qoutputs.cpp:120
types
Definition: qfeatures.hpp:16
Definition: qoutputs.hpp:152
c_array get_id(void) const
Definition: qoutputs.hpp:161
Foundry_Output(const quint64 &amount_m, const pset< const Unlock_Condition > &unlock_conditions_m, const std::shared_ptr< Token_Scheme > &token_scheme_m, const quint32 &serial_number_m, const pset< const Native_Token > &native_tokens_m={}, const pset< const Feature > &immutable_features_m={}, const pset< const Feature > &features_m={})
Definition: qoutputs.cpp:192
QJsonObject get_Json(void) const
Definition: qoutputs.cpp:216
std::shared_ptr< Token_Scheme > token_scheme_
Definition: qoutputs.hpp:171
quint32 serial_number_
Definition: qoutputs.hpp:172
void serialize(QDataStream &out) const
Definition: qoutputs.cpp:223
void consume(void)
Definition: qoutputs.cpp:18
Definition: qoutputs.hpp:127
void serialize(QDataStream &out) const
Definition: qoutputs.cpp:170
NFT_Output(const quint64 &amount_m, const pset< const Unlock_Condition > &unlock_conditions_m, const pset< const Native_Token > &native_tokens_m={}, const pset< const Feature > &immutable_features_m={}, const pset< const Feature > &features_m={})
Definition: qoutputs.cpp:142
void set_id(const c_array &outputid)
Definition: qoutputs.hpp:137
QJsonObject get_Json(void) const
Definition: qoutputs.cpp:163
c_array get_id(void) const
Definition: qoutputs.hpp:142
Definition: qoutputs.hpp:19
pset< const Unlock_Condition > unlock_conditions_
Definition: qoutputs.hpp:102
Output(types typ)
Definition: qoutputs.hpp:34
quint64 min_deposit_of_output(const quint64 &wkey, const quint64 &wdata, const quint64 &v_byte_cost) const
Definition: qoutputs.cpp:85
static std::shared_ptr< Output > Alias(const quint64 &amount_m, const pset< const Unlock_Condition > &unlock_conditions_m, const fl_array< quint16 > &state_metadata_m="", const quint32 &foundry_counter_m=0, const quint32 &state_index_m=0, const pset< const Native_Token > &native_tokens_m={}, const pset< const Feature > &immutable_features_m={}, const pset< const Feature > &features_m={})
Definition: qoutputs.cpp:235
pset< const Feature > features_
Definition: qoutputs.hpp:103
types
Definition: qoutputs.hpp:22
@ Foundry_typ
Definition: qoutputs.hpp:26
@ NFT_typ
Definition: qoutputs.hpp:25
@ Basic_typ
Definition: qoutputs.hpp:24
@ Alias_typ
Definition: qoutputs.hpp:27
@ All_typ
Definition: qoutputs.hpp:23
virtual c_array get_id(void) const
Definition: qoutputs.hpp:74
Output(types typ, const quint64 &amount_m, const pset< const Unlock_Condition > &unlock_conditions_m, const pset< const Feature > &features_m={}, const pset< const Native_Token > &native_tokens_m={}, const pset< const Feature > &immutable_features_m={})
Definition: qoutputs.cpp:56
static std::shared_ptr< Output > Basic(const quint64 &amount_m, const pset< const Unlock_Condition > &unlock_conditions_m, const pset< const Native_Token > &native_tokens_m={}, const pset< const Feature > &features_m={})
Definition: qoutputs.cpp:101
std::shared_ptr< const Feature > get_feature_(const Feature::types &typ) const
Definition: qoutputs.hpp:88
std::shared_ptr< const Unlock_Condition > get_unlock_(const Unlock_Condition::types &typ) const
Definition: qoutputs.hpp:81
types type(void) const
Definition: qoutputs.hpp:106
virtual QJsonObject get_Json(void) const
Definition: qoutputs.cpp:23
std::shared_ptr< const Feature > get_immutable_feature_(const Feature::types &typ) const
Definition: qoutputs.hpp:94
pset< const Feature > immutable_features_
Definition: qoutputs.hpp:104
virtual void set_id(const c_array &id)
Definition: qoutputs.cpp:11
quint64 amount_
Definition: qoutputs.hpp:101
virtual void serialize(QDataStream &out) const
Definition: qoutputs.cpp:10
QBLOCK_EXPORT static const QHash< types, QString > typesstr
Definition: qoutputs.hpp:110
static std::shared_ptr< Output > from_(from_type &val)
Definition: qoutputs.cpp:63
pset< const Native_Token > native_tokens_
Definition: qoutputs.hpp:105
std::shared_ptr< Output > clone(void) const
Definition: qoutputs.hpp:38
static std::shared_ptr< Output > NFT(const quint64 &amount_m, const pset< const Unlock_Condition > &unlock_conditions_m, const pset< const Native_Token > &native_tokens_m={}, const pset< const Feature > &immutable_features_m={}, const pset< const Feature > &features_m={})
Definition: qoutputs.cpp:133
static std::shared_ptr< Output > Foundry(const quint64 &amount_m, const pset< const Unlock_Condition > &unlock_conditions_m, const std::shared_ptr< Token_Scheme > &token_scheme_m, const quint32 &serial_number_m, const pset< const Native_Token > &native_tokens_m={}, const pset< const Feature > &immutable_features_m={}, const pset< const Feature > &features_m={})
Definition: qoutputs.cpp:181
virtual void consume(void)
Definition: qoutputs.cpp:12
types
Definition: qunlock_conditions.hpp:16
Byte Array that takes care of storing the objects in serialized form.
Definition: carray.hpp:30
void append(const obj_type &obj)
Append obj data to the end. For objects that implement QDataStream & operator <<.
Definition: carray.hpp:64
c_array hash(void) const
Get the hash of the data.
Definition: carray.hpp:73
T find_if(T... args)
Definition: carray.hpp:22