30 namespace graphene {
namespace chain {
34 if( a == 0 || p == 0 )
39 fc::uint128_t r = a.
value;
42 return static_cast<uint64_t
>(r);
55 if( pending_fees > 0 || pending_vested_fees > 0 )
67 assert( network_cut <= core_fee_total );
70 share_type referral = core_fee_total - network_cut - lifetime_cut;
80 share_type registrar_cut = referral - referrer_cut;
86 assert( referrer_cut + registrar_cut + network_cut + lifetime_cut == core_fee_total );
89 pay_out_fees(a, pending_fees,
true);
90 pay_out_fees(a, pending_vested_fees,
false);
102 if( core_fee > cashback_vesting_threshold )
103 pending_fees += core_fee;
105 pending_vested_fees += core_fee;
110 set<account_id_type> result;
112 result.insert(auth.first);
114 result.insert(auth.first);
119 set<public_key_type, pubkey_comparator> result;
121 result.insert(auth.first);
123 result.insert(auth.first);
131 result.insert(auth.first);
133 result.insert(auth.first);
140 assert( dynamic_cast<const account_object*>(&obj) );
143 auto account_members = get_account_members(a);
144 for(
auto item : account_members )
145 account_to_account_memberships[item].insert(obj.
id);
147 auto key_members = get_key_members(a);
148 for(
auto item : key_members )
149 account_to_key_memberships[item].insert(obj.
id);
151 auto address_members = get_address_members(a);
152 for(
auto item : address_members )
153 account_to_address_memberships[item].insert(obj.
id);
158 assert( dynamic_cast<const account_object*>(&obj) );
161 auto key_members = get_key_members(a);
162 for(
auto item : key_members )
163 account_to_key_memberships[item].erase( obj.
id );
165 auto address_members = get_address_members(a);
166 for(
auto item : address_members )
167 account_to_address_memberships[item].erase( obj.
id );
169 auto account_members = get_account_members(a);
170 for(
auto item : account_members )
171 account_to_account_memberships[item].erase( obj.
id );
176 before_key_members.clear();
177 before_account_members.clear();
178 assert( dynamic_cast<const account_object*>(&before) );
180 before_key_members = get_key_members(a);
181 before_address_members = get_address_members(a);
182 before_account_members = get_account_members(a);
187 assert( dynamic_cast<const account_object*>(&after) );
191 set<account_id_type> after_account_members = get_account_members(a);
192 vector<account_id_type> removed; removed.reserve(before_account_members.size());
193 std::set_difference(before_account_members.begin(), before_account_members.end(),
194 after_account_members.begin(), after_account_members.end(),
195 std::inserter(removed, removed.end()));
197 for(
auto itr = removed.begin(); itr != removed.end(); ++itr )
198 account_to_account_memberships[*itr].erase(after.
id);
200 vector<object_id_type> added; added.reserve(after_account_members.size());
201 std::set_difference(after_account_members.begin(), after_account_members.end(),
202 before_account_members.begin(), before_account_members.end(),
203 std::inserter(added, added.end()));
205 for(
auto itr = added.begin(); itr != added.end(); ++itr )
206 account_to_account_memberships[*itr].insert(after.
id);
211 set<public_key_type, pubkey_comparator> after_key_members = get_key_members(a);
213 vector<public_key_type> removed; removed.reserve(before_key_members.size());
214 std::set_difference(before_key_members.begin(), before_key_members.end(),
215 after_key_members.begin(), after_key_members.end(),
216 std::inserter(removed, removed.end()));
218 for(
auto itr = removed.begin(); itr != removed.end(); ++itr )
219 account_to_key_memberships[*itr].erase(after.
id);
221 vector<public_key_type> added; added.reserve(after_key_members.size());
222 std::set_difference(after_key_members.begin(), after_key_members.end(),
223 before_key_members.begin(), before_key_members.end(),
224 std::inserter(added, added.end()));
226 for(
auto itr = added.begin(); itr != added.end(); ++itr )
227 account_to_key_memberships[*itr].insert(after.
id);
231 set<address> after_address_members = get_address_members(a);
233 vector<address> removed; removed.reserve(before_address_members.size());
234 std::set_difference(before_address_members.begin(), before_address_members.end(),
235 after_address_members.begin(), after_address_members.end(),
236 std::inserter(removed, removed.end()));
238 for(
auto itr = removed.begin(); itr != removed.end(); ++itr )
239 account_to_address_memberships[*itr].erase(after.
id);
241 vector<address> added; added.reserve(after_address_members.size());
242 std::set_difference(after_address_members.begin(), after_address_members.end(),
243 before_address_members.begin(), before_address_members.end(),
244 std::inserter(added, added.end()));
246 for(
auto itr = added.begin(); itr != added.end(); ++itr )
247 account_to_address_memberships[*itr].insert(after.
id);
252 const uint8_t balances_by_account_index::bits = 20;
253 const uint64_t balances_by_account_index::mask = (1ULL << balances_by_account_index::bits) - 1;
258 while( balances.size() < (abo.owner.instance.value >> bits) + 1 )
260 balances.reserve( (abo.owner.instance.value >> bits) + 1 );
261 balances.resize( balances.size() + 1 );
262 balances.back().resize( 1ULL << bits );
264 balances[abo.owner.instance.value >> bits][abo.owner.instance.value & mask][abo.asset_type] = &abo;
270 if( balances.size() < (abo.owner.instance.value >> bits) + 1 )
return;
271 balances[abo.owner.instance.value >> bits][abo.owner.instance.value & mask].erase( abo.asset_type );
276 ids_being_modified.emplace( before.
id );
281 FC_ASSERT( ids_being_modified.top() == after.
id,
"Modification of ID is not supported!");
282 ids_being_modified.pop();
287 static const map< asset_id_type, const account_balance_object* > _empty;
289 if( balances.size() < (acct.instance.value >> bits) + 1 )
return _empty;
290 return balances[acct.instance.value >> bits][acct.instance.value & mask];
295 if( balances.size() < (acct.instance.value >> bits) + 1 )
return nullptr;
296 const auto& mine = balances[acct.instance.value >> bits][acct.instance.value & mask];
297 const auto itr = mine.find( asset );
298 if( mine.end() == itr )
return nullptr;
306 (membership_expiration_date)(registrar)(referrer)(lifetime_referrer)
307 (network_fee_percentage)(lifetime_referrer_fee_percentage)(referrer_rewards_percentage)
308 (name)(
owner)(active)(options)(num_committee_voted)(statistics)
309 (whitelisting_accounts)(blacklisting_accounts)
310 (whitelisted_accounts)(blacklisted_accounts)
312 (owner_special_authority)(active_special_authority)
313 (top_n_control_flags)
325 (total_ops)(removed_ops)
326 (total_core_in_orders)
327 (total_core_inactive)(total_core_pob)(total_core_pol)
328 (total_pob_value)(total_pol_value)
333 (vp_all)(vp_active)(vp_committee)(vp_witness)(vp_worker)
336 (pending_fees)(pending_vested_fees)
Tracks the balance of a single account/asset pairThis object is indexed on owner and asset_type so th...
const account_balance_object * get_account_balance(const account_id_type &acct, const asset_id_type &asset) const
void modify(const T &obj, const Lambda &m)
virtual void about_to_modify(const object &before) override
const map< asset_id_type, const account_balance_object * > & get_account_balances(const account_id_type &acct) const
This class represents an account on the object graphAccounts are the primary unit of authority on the...
tracks the blockchain state in an extensible manner
virtual void object_modified(const object &after) override
flat_map< address, weight_type > address_auths
#define FC_REFLECT_DERIVED_NO_TYPENAME(TYPE, INHERITS, MEMBERS)
uint16_t network_fee_percentage
Percentage of fee which should go to network.
bool maintenance_flag
Whether need to process this balance object in maintenance interval.
const T & get(object_id_type id) const
flat_map< public_key_type, weight_type > key_auths
virtual void object_removed(const object &obj) override
virtual void object_inserted(const object &obj) override
set< address > get_address_members(const account_object &a) const
uint16_t lifetime_referrer_fee_percentage
Percentage of fee which should go to lifetime referrer.
#define GRAPHENE_100_PERCENT
virtual void object_modified(const object &after) override
time_point_sec head_block_time() const
flat_map< account_id_type, weight_type > account_auths
account_id_type lifetime_referrer
The lifetime member at the top of the referral tree. Receives a percentage of referral rewards...
share_type cut_fee(share_type a, uint16_t p)
#define FC_ASSERT(TEST,...)
Checks a condition and throws an assert_exception if the test is FALSE.
virtual void about_to_modify(const object &before) override
tracks the asset information that changes frequentlyBecause the asset_object is very large it doesn't...
#define GRAPHENE_IMPLEMENT_EXTERNAL_SERIALIZATION(type)
void pay_fee(share_type core_fee, share_type cashback_vesting_threshold)
virtual void object_inserted(const object &obj) override
set< public_key_type, pubkey_comparator > get_key_members(const account_object &a) const
share_type accumulated_fees
fees accumulate to be paid out over time
const asset_dynamic_data_object & get_core_dynamic_data() const
set< account_id_type > get_account_members(const account_object &a) const
void process_fees(const account_object &a, database &d) const
Split up and pay out pending_fees and pending_vested_fees.
virtual void object_removed(const object &obj) override
void deposit_cashback(const account_object &acct, share_type amount, bool require_vesting=true)
uint16_t referrer_rewards_percentage
account_id_type registrar
The account that paid the fee to register this account. Receives a percentage of referral rewards...
base for all database objects
share_type lifetime_fees_paid
account_id_type referrer
The account credited as referring this account. Receives a percentage of referral rewards...
share_type pending_vested_fees
void adjust_balance(const asset &delta)