From 5d6091e58190cfa8ab1d8cf224d603c5242fc670 Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Tue, 27 Oct 2015 11:05:59 -0400 Subject: [PATCH] HARDFORK - adding operation to claim asset fees #413 --- libraries/app/impacted.cpp | 1 + libraries/chain/asset_evaluator.cpp | 27 +++++++++++++++++++ libraries/chain/db_init.cpp | 1 + .../graphene/chain/asset_evaluator.hpp | 9 +++++++ .../chain/include/graphene/chain/hardfork.hpp | 2 -- .../graphene/chain/protocol/asset_ops.hpp | 22 +++++++++++++++ .../graphene/chain/protocol/operations.hpp | 4 +-- libraries/chain/market_evaluator.cpp | 1 + libraries/chain/protocol/asset_ops.cpp | 5 ++++ 9 files changed, 68 insertions(+), 4 deletions(-) diff --git a/libraries/app/impacted.cpp b/libraries/app/impacted.cpp index f5ed1051..e928a369 100644 --- a/libraries/app/impacted.cpp +++ b/libraries/app/impacted.cpp @@ -39,6 +39,7 @@ struct get_impacted_account_visitor _impacted.insert( op.to ); } + void operator()( const asset_claim_fees_operation& op ){} void operator()( const limit_order_create_operation& op ) {} void operator()( const limit_order_cancel_operation& op ) { diff --git a/libraries/chain/asset_evaluator.cpp b/libraries/chain/asset_evaluator.cpp index 2fe586da..bc84cefd 100644 --- a/libraries/chain/asset_evaluator.cpp +++ b/libraries/chain/asset_evaluator.cpp @@ -514,4 +514,31 @@ void_result asset_publish_feeds_evaluator::do_apply(const asset_publish_feed_ope return void_result(); } FC_CAPTURE_AND_RETHROW((o)) } + + +void_result asset_claim_fees_evaluator::do_evaluate( const asset_claim_fees_operation& o ) +{ try { + FC_ASSERT( o.amount_to_claim.asset_id(db()).issuer == o.issuer, "Asset fees may only be claimed by the issuer" ); + return void_result(); +} FC_CAPTURE_AND_RETHROW( (o) ) } + + +void_result asset_claim_fees_evaluator::do_apply( const asset_claim_fees_operation& o ) +{ try { + database& d = db(); + + const asset_object& a = o.amount_to_claim.asset_id(d); + const asset_dynamic_data_object& addo = a.dynamic_asset_data_id(d); + FC_ASSERT( o.amount_to_claim.amount <= addo.accumulated_fees, "Attempt to claim more fees than have accumulated", ("addo",addo) ); + + d.modify( addo, [&]( asset_dynamic_data_object& _addo ) { + _addo.accumulated_fees -= o.amount_to_claim.amount; + }); + + d.adjust_balance( o.issuer, o.amount_to_claim ); + + return void_result(); +} FC_CAPTURE_AND_RETHROW( (o) ) } + + } } // graphene::chain diff --git a/libraries/chain/db_init.cpp b/libraries/chain/db_init.cpp index 2d06aa94..ba2d07a6 100644 --- a/libraries/chain/db_init.cpp +++ b/libraries/chain/db_init.cpp @@ -158,6 +158,7 @@ void database::initialize_evaluators() register_evaluator(); register_evaluator(); register_evaluator(); + register_evaluator(); } void database::initialize_indexes() diff --git a/libraries/chain/include/graphene/chain/asset_evaluator.hpp b/libraries/chain/include/graphene/chain/asset_evaluator.hpp index 7e5b9268..d302450e 100644 --- a/libraries/chain/include/graphene/chain/asset_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/asset_evaluator.hpp @@ -133,4 +133,13 @@ namespace graphene { namespace chain { std::map,price_feed> median_feed_values; }; + class asset_claim_fees_evaluator : public evaluator + { + public: + typedef asset_claim_fees_operation operation_type; + + void_result do_evaluate( const asset_claim_fees_operation& o ); + void_result do_apply( const asset_claim_fees_operation& o ); + }; + } } // graphene::chain diff --git a/libraries/chain/include/graphene/chain/hardfork.hpp b/libraries/chain/include/graphene/chain/hardfork.hpp index 01907932..e5da0a01 100644 --- a/libraries/chain/include/graphene/chain/hardfork.hpp +++ b/libraries/chain/include/graphene/chain/hardfork.hpp @@ -20,5 +20,3 @@ */ #pragma once -#define HARDFORK_357_TIME (fc::time_point_sec( 1444416300 )) -#define HARDFORK_359_TIME (fc::time_point_sec( 1444416300 )) diff --git a/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp b/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp index e0cd26eb..f81f39f7 100644 --- a/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp +++ b/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp @@ -420,8 +420,30 @@ namespace graphene { namespace chain { void validate()const; }; + /** + * @brief used to transfer accumulated fees back to the issuer's balance. + */ + struct asset_claim_fees_operation : public base_operation + { + struct fee_parameters_type { + uint64_t fee = 20 * GRAPHENE_BLOCKCHAIN_PRECISION; + }; + + asset fee; + account_id_type issuer; + asset amount_to_claim; /// amount_to_claim.asset_id->issuer must == issuer + extensions_type extensions; + + account_id_type fee_payer()const { return issuer; } + void validate()const; + }; + + } } // graphene::chain +FC_REFLECT( graphene::chain::asset_claim_fees_operation, (fee)(issuer)(amount_to_claim)(extensions) ) +FC_REFLECT( graphene::chain::asset_claim_fees_operation::fee_parameters_type, (fee) ) + FC_REFLECT( graphene::chain::asset_options, (max_supply) (market_fee_percent) diff --git a/libraries/chain/include/graphene/chain/protocol/operations.hpp b/libraries/chain/include/graphene/chain/protocol/operations.hpp index 9ef0c549..55cfdf93 100644 --- a/libraries/chain/include/graphene/chain/protocol/operations.hpp +++ b/libraries/chain/include/graphene/chain/protocol/operations.hpp @@ -85,8 +85,8 @@ namespace graphene { namespace chain { transfer_to_blind_operation, blind_transfer_operation, transfer_from_blind_operation, - - asset_settle_cancel_operation // VIRTUAL + asset_settle_cancel_operation, // VIRTUAL + asset_claim_fees_operation > operation; /// @} // operations group diff --git a/libraries/chain/market_evaluator.cpp b/libraries/chain/market_evaluator.cpp index a0eeac97..723735fa 100644 --- a/libraries/chain/market_evaluator.cpp +++ b/libraries/chain/market_evaluator.cpp @@ -95,6 +95,7 @@ asset limit_order_cancel_evaluator::do_apply(const limit_order_cancel_operation& auto quote_asset = _order->sell_price.quote.asset_id; auto refunded = _order->amount_for_sale(); + /// TODO... implement this refund in a better way if( true ) // HARD FORK d.head_block_time() > { const auto& fees = d.current_fee_schedule(); diff --git a/libraries/chain/protocol/asset_ops.cpp b/libraries/chain/protocol/asset_ops.cpp index b73a0b82..bf0c126a 100644 --- a/libraries/chain/protocol/asset_ops.cpp +++ b/libraries/chain/protocol/asset_ops.cpp @@ -224,4 +224,9 @@ void asset_options::validate()const } } +void asset_claim_fees_operation::validate()const { + FC_ASSERT( fee.amount >= 0 ); + FC_ASSERT( amount_to_claim.amount > 0 ); +} + } } // namespace graphene::chain