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);
139 assert( dynamic_cast<const account_object*>(&obj) );
141 const account_id_type account_id = a.
get_id();
143 auto account_members = get_account_members(a);
144 for(
auto item : account_members )
145 account_to_account_memberships[item].insert(account_id);
147 auto key_members = get_key_members(a);
148 for(
auto item : key_members )
149 account_to_key_memberships[item].insert(account_id);
151 auto address_members = get_address_members(a);
152 for(
auto item : address_members )
153 account_to_address_memberships[item].insert(account_id);
158 assert( dynamic_cast<const account_object*>(&obj) );
160 const account_id_type account_id = a.
get_id();
162 auto key_members = get_key_members(a);
163 for(
auto item : key_members )
164 account_to_key_memberships[item].erase( account_id );
166 auto address_members = get_address_members(a);
167 for(
auto item : address_members )
168 account_to_address_memberships[item].erase( account_id );
170 auto account_members = get_account_members(a);
171 for(
auto item : account_members )
172 account_to_account_memberships[item].erase( account_id );
177 before_key_members.clear();
178 before_account_members.clear();
179 assert( dynamic_cast<const account_object*>(&before) );
181 before_key_members = get_key_members(a);
182 before_address_members = get_address_members(a);
183 before_account_members = get_account_members(a);
188 assert( dynamic_cast<const account_object*>(&after) );
190 const account_id_type account_id = a.
get_id();
193 set<account_id_type> after_account_members = get_account_members(a);
194 vector<account_id_type> removed;
195 removed.reserve(before_account_members.size());
196 std::set_difference(before_account_members.begin(), before_account_members.end(),
197 after_account_members.begin(), after_account_members.end(),
198 std::inserter(removed, removed.end()));
200 for(
auto itr = removed.begin(); itr != removed.end(); ++itr )
201 account_to_account_memberships[*itr].erase(account_id);
203 vector<account_id_type> added;
204 added.reserve(after_account_members.size());
205 std::set_difference(after_account_members.begin(), after_account_members.end(),
206 before_account_members.begin(), before_account_members.end(),
207 std::inserter(added, added.end()));
209 for(
auto itr = added.begin(); itr != added.end(); ++itr )
210 account_to_account_memberships[*itr].insert(account_id);
215 set<public_key_type, pubkey_comparator> after_key_members = get_key_members(a);
217 vector<public_key_type> removed;
218 removed.reserve(before_key_members.size());
219 std::set_difference(before_key_members.begin(), before_key_members.end(),
220 after_key_members.begin(), after_key_members.end(),
221 std::inserter(removed, removed.end()));
223 for(
auto itr = removed.begin(); itr != removed.end(); ++itr )
224 account_to_key_memberships[*itr].erase(account_id);
226 vector<public_key_type> added;
227 added.reserve(after_key_members.size());
228 std::set_difference(after_key_members.begin(), after_key_members.end(),
229 before_key_members.begin(), before_key_members.end(),
230 std::inserter(added, added.end()));
232 for(
auto itr = added.begin(); itr != added.end(); ++itr )
233 account_to_key_memberships[*itr].insert(account_id);
237 set<address> after_address_members = get_address_members(a);
239 vector<address> removed;
240 removed.reserve(before_address_members.size());
241 std::set_difference(before_address_members.begin(), before_address_members.end(),
242 after_address_members.begin(), after_address_members.end(),
243 std::inserter(removed, removed.end()));
245 for(
auto itr = removed.begin(); itr != removed.end(); ++itr )
246 account_to_address_memberships[*itr].erase(account_id);
248 vector<address> added;
249 added.reserve(after_address_members.size());
250 std::set_difference(after_address_members.begin(), after_address_members.end(),
251 before_address_members.begin(), before_address_members.end(),
252 std::inserter(added, added.end()));
254 for(
auto itr = added.begin(); itr != added.end(); ++itr )
255 account_to_address_memberships[*itr].insert(account_id);
260 const uint8_t balances_by_account_index::bits = 20;
261 const uint64_t balances_by_account_index::mask = (1ULL << balances_by_account_index::bits) - 1;
266 while( balances.size() < (abo.owner.instance.value >> bits) + 1 )
268 balances.reserve( (abo.owner.instance.value >> bits) + 1 );
269 balances.resize( balances.size() + 1 );
270 balances.back().resize( 1ULL << bits );
272 balances[abo.owner.instance.value >> bits][abo.owner.instance.value & mask][abo.asset_type] = &abo;
278 if( balances.size() < (abo.owner.instance.value >> bits) + 1 )
return;
279 balances[abo.owner.instance.value >> bits][abo.owner.instance.value & mask].erase( abo.asset_type );
284 ids_being_modified.emplace( before.
id );
289 FC_ASSERT( ids_being_modified.top() == after.
id,
"Modification of ID is not supported!");
290 ids_being_modified.pop();
295 static const map< asset_id_type, const account_balance_object* > _empty;
297 if( balances.size() < (acct.instance.value >> bits) + 1 )
return _empty;
298 return balances[acct.instance.value >> bits][acct.instance.value & mask];
303 if( balances.size() < (acct.instance.value >> bits) + 1 )
return nullptr;
304 const auto& mine = balances[acct.instance.value >> bits][acct.instance.value & mask];
305 const auto itr = mine.find( asset );
306 if( mine.end() == itr )
return nullptr;
314 (membership_expiration_date)(registrar)(referrer)(lifetime_referrer)
315 (network_fee_percentage)(lifetime_referrer_fee_percentage)(referrer_rewards_percentage)
316 (name)(
owner)(active)(options)(num_committee_voted)(statistics)
317 (whitelisting_accounts)(blacklisting_accounts)
318 (whitelisted_accounts)(blacklisted_accounts)
320 (owner_special_authority)(active_special_authority)
321 (top_n_control_flags)
323 (creation_block_num)(creation_time)
334 (total_ops)(removed_ops)
335 (total_core_in_orders)
336 (total_core_inactive)(total_core_pob)(total_core_pol)
337 (total_pob_value)(total_pol_value)
342 (vp_all)(vp_active)(vp_committee)(vp_witness)(vp_worker)
345 (pending_fees)(pending_vested_fees)
set< account_id_type > get_account_members(const account_object &a) const
Tracks the balance of a single account/asset pairThis object is indexed on owner and asset_type so th...
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
time_point_sec head_block_time() 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
set< address > get_address_members(const account_object &a) const
#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.
flat_map< public_key_type, weight_type > key_auths
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
virtual void object_inserted(const object &obj) override
object_id< SpaceID, TypeID > get_id() const
const T & get(const object_id_type &id) 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
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)
const asset_dynamic_data_object & get_core_dynamic_data() const
void pay_fee(share_type core_fee, share_type cashback_vesting_threshold)
virtual void object_inserted(const object &obj) override
const account_balance_object * get_account_balance(const account_id_type &acct, const asset_id_type &asset) const
share_type accumulated_fees
fees accumulate to be paid out over time
virtual void object_removed(const object &obj) override
void deposit_cashback(const account_object &acct, share_type amount, bool require_vesting=true)
helper to handle cashback rewards
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
set< public_key_type, pubkey_comparator > get_key_members(const account_object &a) const
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)