2015-06-08 15:50:35 +00:00
/*
2015-10-12 17:48:40 +00:00
* Copyright ( c ) 2015 Cryptonomex , Inc . , and contributors .
*
2016-01-06 09:51:18 +00:00
* The MIT License
2015-10-12 17:48:40 +00:00
*
2016-01-06 09:51:18 +00:00
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the " Software " ) , to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
2015-10-12 17:48:40 +00:00
*
2016-01-06 09:51:18 +00:00
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
2015-10-12 17:02:59 +00:00
*
2016-01-06 09:51:18 +00:00
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
2015-06-08 15:50:35 +00:00
*/
# include <graphene/chain/database.hpp>
# include <graphene/chain/evaluator.hpp>
2015-07-08 18:26:59 +00:00
# include <graphene/chain/exceptions.hpp>
2015-10-30 18:22:02 +00:00
# include <graphene/chain/hardfork.hpp>
2015-06-08 15:50:35 +00:00
# include <graphene/chain/transaction_evaluation_state.hpp>
2015-07-08 18:26:59 +00:00
2015-06-08 15:50:35 +00:00
# include <graphene/chain/asset_object.hpp>
# include <graphene/chain/account_object.hpp>
2015-07-13 20:06:02 +00:00
# include <graphene/chain/committee_member_object.hpp>
2015-07-08 20:39:23 +00:00
# include <graphene/chain/market_evaluator.hpp>
# include <graphene/chain/protocol/fee_schedule.hpp>
2015-06-08 15:50:35 +00:00
# include <fc/uint128.hpp>
namespace graphene { namespace chain {
2015-06-30 20:42:41 +00:00
database & generic_evaluator : : db ( ) const { return trx_state - > db ( ) ; }
2015-06-08 15:50:35 +00:00
operation_result generic_evaluator : : start_evaluate ( transaction_evaluation_state & eval_state , const operation & op , bool apply )
2015-06-30 19:11:26 +00:00
{ try {
2015-06-08 15:50:35 +00:00
trx_state = & eval_state ;
2015-07-16 22:13:11 +00:00
//check_required_authorities(op);
2015-06-08 15:50:35 +00:00
auto result = evaluate ( op ) ;
if ( apply ) result = this - > apply ( op ) ;
return result ;
2015-06-30 19:11:26 +00:00
} FC_CAPTURE_AND_RETHROW ( ) }
2015-06-08 15:50:35 +00:00
void generic_evaluator : : prepare_fee ( account_id_type account_id , asset fee )
{
2015-10-30 18:22:02 +00:00
const database & d = db ( ) ;
2015-06-08 15:50:35 +00:00
fee_from_account = fee ;
FC_ASSERT ( fee . amount > = 0 ) ;
2015-10-30 18:22:02 +00:00
fee_paying_account = & account_id ( d ) ;
fee_paying_account_statistics = & fee_paying_account - > statistics ( d ) ;
2015-06-08 15:50:35 +00:00
2015-10-30 18:22:02 +00:00
fee_asset = & fee . asset_id ( d ) ;
fee_asset_dyn_data = & fee_asset - > dynamic_asset_data_id ( d ) ;
if ( d . head_block_time ( ) > HARDFORK_419_TIME )
{
FC_ASSERT ( fee_paying_account - > is_authorized_asset ( * fee_asset , d ) , " Account ${acct} '${name}' attempted to pay fee by using asset ${a} '${sym}', which is unauthorized due to whitelist / blacklist " ,
( " acct " , fee_paying_account - > id ) ( " name " , fee_paying_account - > name ) ( " a " , fee_asset - > id ) ( " sym " , fee_asset - > symbol ) ) ;
}
2015-06-08 15:50:35 +00:00
if ( fee_from_account . asset_id = = asset_id_type ( ) )
core_fee_paid = fee_from_account . amount ;
2015-10-30 18:22:02 +00:00
else
{
2015-06-08 15:50:35 +00:00
asset fee_from_pool = fee_from_account * fee_asset - > options . core_exchange_rate ;
FC_ASSERT ( fee_from_pool . asset_id = = asset_id_type ( ) ) ;
core_fee_paid = fee_from_pool . amount ;
2015-07-09 20:05:57 +00:00
FC_ASSERT ( core_fee_paid < = fee_asset_dyn_data - > fee_pool , " Fee pool balance of '${b}' is less than the ${r} required to convert ${c} " ,
( " r " , db ( ) . to_pretty_string ( fee_from_pool ) ) ( " b " , db ( ) . to_pretty_string ( fee_asset_dyn_data - > fee_pool ) ) ( " c " , db ( ) . to_pretty_string ( fee ) ) ) ;
2015-06-08 15:50:35 +00:00
}
}
2015-12-03 20:48:52 +00:00
void generic_evaluator : : convert_fee ( )
{
2015-06-08 15:50:35 +00:00
if ( fee_asset - > get_id ( ) ! = asset_id_type ( ) )
2015-12-03 20:48:52 +00:00
{
2015-06-09 20:46:00 +00:00
db ( ) . modify ( * fee_asset_dyn_data , [ this ] ( asset_dynamic_data_object & d ) {
2015-06-08 15:50:35 +00:00
d . accumulated_fees + = fee_from_account . amount ;
d . fee_pool - = core_fee_paid ;
} ) ;
2015-12-03 20:48:52 +00:00
}
return ;
}
void generic_evaluator : : pay_fee ( )
{ try {
database & d = db ( ) ;
/// TODO: db().pay_fee( account_id, core_fee );
d . modify ( * fee_paying_account_statistics , [ & ] ( account_statistics_object & s )
{
s . pay_fee ( core_fee_paid , d . get_global_properties ( ) . parameters . cashback_vesting_threshold ) ;
2015-06-08 15:50:35 +00:00
} ) ;
} FC_CAPTURE_AND_RETHROW ( ) }
} }