Progress #98: restrict withdrawal rate of vesting genesis balances

This commit is contained in:
Nathan Hourt 2015-07-02 15:35:58 -04:00
parent 256b95ac5e
commit 9cb9d2e07f
4 changed files with 11 additions and 3 deletions

View file

@ -389,7 +389,7 @@ void database::init_genesis(const genesis_state_type& genesis_state)
{ {
create<balance_object>([&](balance_object& b) { create<balance_object>([&](balance_object& b) {
b.owner = vest.owner; b.owner = vest.owner;
b.balance = asset( vest.amount, assets_by_symbol.find( vest.asset_symbol )->get_id() ); b.balance = asset(vest.amount, assets_by_symbol.find(vest.asset_symbol)->get_id());
linear_vesting_policy policy; linear_vesting_policy policy;
policy.begin_timestamp = vest.begin_timestamp; policy.begin_timestamp = vest.begin_timestamp;
@ -397,7 +397,7 @@ void database::init_genesis(const genesis_state_type& genesis_state)
policy.vesting_duration_seconds = vest.vesting_duration_seconds; policy.vesting_duration_seconds = vest.vesting_duration_seconds;
policy.begin_balance = vest.begin_balance; policy.begin_balance = vest.begin_balance;
b.vesting_policy = std::move( policy ); b.vesting_policy = std::move(policy);
}); });
total_allocation += vest.amount; total_allocation += vest.amount;
} }

View file

@ -5,6 +5,7 @@
#include <graphene/chain/transaction_evaluation_state.hpp> #include <graphene/chain/transaction_evaluation_state.hpp>
#include <graphene/chain/balance_object.hpp> #include <graphene/chain/balance_object.hpp>
#include <graphene/chain/evaluator.hpp> #include <graphene/chain/evaluator.hpp>
#include <graphene/chain/exceptions.hpp>
namespace graphene { namespace chain { namespace graphene { namespace chain {
@ -34,6 +35,9 @@ public:
if( balance->vesting_policy.valid() ) { if( balance->vesting_policy.valid() ) {
FC_ASSERT(op.total_claimed.amount == 0); FC_ASSERT(op.total_claimed.amount == 0);
if( d.head_block_time() - balance->last_claim_date < fc::days(1) )
FC_THROW_EXCEPTION(balance_claimed_too_often,
"Genesis vesting balances may not be claimed more than once per day.");
return amount_withdrawn = balance->vesting_policy->get_allowed_withdraw({balance->balance, return amount_withdrawn = balance->vesting_policy->get_allowed_withdraw({balance->balance,
d.head_block_time(), d.head_block_time(),
{}}); {}});
@ -55,6 +59,7 @@ public:
d.modify(*balance, [&](balance_object& b) { d.modify(*balance, [&](balance_object& b) {
b.vesting_policy->on_withdraw({b.balance, d.head_block_time(), amount_withdrawn}); b.vesting_policy->on_withdraw({b.balance, d.head_block_time(), amount_withdrawn});
b.balance -= amount_withdrawn; b.balance -= amount_withdrawn;
b.last_claim_date = d.head_block_time();
}); });
else else
d.remove(*balance); d.remove(*balance);

View file

@ -13,6 +13,7 @@ namespace graphene { namespace chain {
address owner; address owner;
asset balance; asset balance;
optional<linear_vesting_policy> vesting_policy; optional<linear_vesting_policy> vesting_policy;
time_point_sec last_claim_date;
asset_id_type asset_type()const { return balance.asset_id; } asset_id_type asset_type()const { return balance.asset_id; }
}; };
@ -39,4 +40,5 @@ namespace graphene { namespace chain {
using balance_index = generic_index<balance_object, balance_multi_index_type>; using balance_index = generic_index<balance_object, balance_multi_index_type>;
} } } }
FC_REFLECT_DERIVED( graphene::chain::balance_object, (graphene::db::object), (owner)(balance)(vesting_policy) ) FC_REFLECT_DERIVED( graphene::chain::balance_object, (graphene::db::object),
(owner)(balance)(vesting_policy)(last_claim_date) )

View file

@ -63,6 +63,7 @@ namespace graphene { namespace chain {
FC_DECLARE_DERIVED_EXCEPTION( expired_transaction, graphene::chain::evaluation_error, 31010, "expired transaction" ); FC_DECLARE_DERIVED_EXCEPTION( expired_transaction, graphene::chain::evaluation_error, 31010, "expired transaction" );
FC_DECLARE_DERIVED_EXCEPTION( invalid_transaction_expiration, graphene::chain::evaluation_error, 31011, "invalid transaction expiration" ); FC_DECLARE_DERIVED_EXCEPTION( invalid_transaction_expiration, graphene::chain::evaluation_error, 31011, "invalid transaction expiration" );
FC_DECLARE_DERIVED_EXCEPTION( oversized_transaction, graphene::chain::evaluation_error, 31012, "transaction exceeded the maximum transaction size" ); FC_DECLARE_DERIVED_EXCEPTION( oversized_transaction, graphene::chain::evaluation_error, 31012, "transaction exceeded the maximum transaction size" );
FC_DECLARE_DERIVED_EXCEPTION( balance_claimed_too_often, graphene::chain::evaluation_error, 31013, "balance claimed too often" );
FC_DECLARE_DERIVED_EXCEPTION( invalid_account_name, graphene::chain::evaluation_error, 32001, "invalid account name" ); FC_DECLARE_DERIVED_EXCEPTION( invalid_account_name, graphene::chain::evaluation_error, 32001, "invalid account name" );
FC_DECLARE_DERIVED_EXCEPTION( unknown_account_id, graphene::chain::evaluation_error, 32002, "unknown account id" ); FC_DECLARE_DERIVED_EXCEPTION( unknown_account_id, graphene::chain::evaluation_error, 32002, "unknown account id" );