enhancing tournament_payout operation according issues 8 9

This commit is contained in:
Roman Olearski 2016-11-23 11:33:24 +01:00
parent 2320be1f55
commit a66af8b072
4 changed files with 56 additions and 17 deletions

View file

@ -224,7 +224,7 @@ struct get_impacted_account_visitor
} }
void operator()( const tournament_payout_operation& op ) void operator()( const tournament_payout_operation& op )
{ {
_impacted.insert( op.winner_account_id ); _impacted.insert( op.payout_account_id );
} }
}; };

View file

@ -36,6 +36,13 @@
namespace graphene { namespace chain { namespace graphene { namespace chain {
enum class payout_type
{
prize_award,
buyin_refund,
rake_fee
};
typedef fc::static_variant<rock_paper_scissors_game_options> game_specific_options; typedef fc::static_variant<rock_paper_scissors_game_options> game_specific_options;
/** /**
@ -169,24 +176,32 @@ namespace graphene { namespace chain {
asset fee; asset fee;
/// The account of the the tournament winner /// The account received payout
account_id_type winner_account_id; account_id_type payout_account_id;
/// The won tournament /// The tournament generated payout
tournament_id_type tournament_id; tournament_id_type tournament_id;
/// The buy-in paid by the `payer_account_id` /// The payout amount
asset won_prize; asset payout_amount;
payout_type type;
extensions_type extensions; extensions_type extensions;
account_id_type fee_payer()const { return winner_account_id; } account_id_type fee_payer()const { return payout_account_id; }
share_type calculate_fee(const fee_parameters_type&)const { return 0; } share_type calculate_fee(const fee_parameters_type&)const { return 0; }
void validate()const {} void validate()const {}
}; };
} } } }
FC_REFLECT_ENUM(graphene::chain::payout_type,
(prize_award)
(buyin_refund)
(rake_fee)
)
FC_REFLECT_TYPENAME( graphene::chain::game_specific_options ) FC_REFLECT_TYPENAME( graphene::chain::game_specific_options )
FC_REFLECT_TYPENAME( graphene::chain::game_specific_moves ) FC_REFLECT_TYPENAME( graphene::chain::game_specific_moves )
FC_REFLECT( graphene::chain::tournament_options, FC_REFLECT( graphene::chain::tournament_options,
@ -220,9 +235,10 @@ FC_REFLECT( graphene::chain::game_move_operation,
(extensions)) (extensions))
FC_REFLECT( graphene::chain::tournament_payout_operation, FC_REFLECT( graphene::chain::tournament_payout_operation,
(fee) (fee)
(winner_account_id) (payout_account_id)
(tournament_id) (tournament_id)
(won_prize) (payout_amount)
(type)
(extensions)) (extensions))
FC_REFLECT( graphene::chain::tournament_create_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::tournament_create_operation::fee_parameters_type, (fee) )

View file

@ -198,6 +198,7 @@ namespace graphene { namespace chain {
}); });
} }
} }
} }
void on_entry(const match_completed& event, tournament_state_machine_& fsm) void on_entry(const match_completed& event, tournament_state_machine_& fsm)
{ {
@ -266,7 +267,16 @@ namespace graphene { namespace chain {
// for a period of time, not as a transfer back to the user; it doesn't matter // for a period of time, not as a transfer back to the user; it doesn't matter
// if they are currently authorized to transfer this asset, they never really // if they are currently authorized to transfer this asset, they never really
// transferred it in the first place // transferred it in the first place
event.db.adjust_balance(payer_pair.first, asset(payer_pair.second, fsm.tournament_obj->options.buy_in.asset_id)); asset amount(payer_pair.second, fsm.tournament_obj->options.buy_in.asset_id);
event.db.adjust_balance(payer_pair.first, amount);
// Generating a virtual operation that shows the payment
tournament_payout_operation op;
op.tournament_id = fsm.tournament_obj->id;
op.payout_amount = amount;
op.payout_account_id = payer_pair.first;
op.type = payout_type::buyin_refund;
event.db.push_applied_operation(op);
} }
} }
}; };
@ -294,17 +304,25 @@ namespace graphene { namespace chain {
const account_id_type& winner = *event.match.match_winners.begin(); const account_id_type& winner = *event.match.match_winners.begin();
uint16_t rake_fee_percentage = event.db.get_global_properties().parameters.rake_fee_percentage; uint16_t rake_fee_percentage = event.db.get_global_properties().parameters.rake_fee_percentage;
share_type rake_amount = (fc::uint128_t(tournament_obj.prize_pool.value) * rake_fee_percentage / GRAPHENE_1_PERCENT / 100).to_uint64(); share_type rake_amount = (fc::uint128_t(tournament_obj.prize_pool.value) * rake_fee_percentage / GRAPHENE_1_PERCENT / 100).to_uint64();
event.db.adjust_balance(account_id_type(TOURNAMENT_RAKE_FEE_ACCOUNT_ID),
asset(rake_amount, tournament_obj.options.buy_in.asset_id)); asset rake(rake_amount, tournament_obj.options.buy_in.asset_id);
event.db.adjust_balance(account_id_type(TOURNAMENT_RAKE_FEE_ACCOUNT_ID), rake);
asset won_prize(tournament_obj.prize_pool - rake_amount, tournament_obj.options.buy_in.asset_id); asset won_prize(tournament_obj.prize_pool - rake_amount, tournament_obj.options.buy_in.asset_id);
event.db.adjust_balance(winner, won_prize); event.db.adjust_balance(winner, won_prize);
tournament_obj.end_time = event.db.head_block_time(); tournament_obj.end_time = event.db.head_block_time();
// Generating a virtual operation that shows the payment // Generating a virtual operations that show the payments
tournament_payout_operation op; tournament_payout_operation op;
op.tournament_id = tournament_obj.id; op.tournament_id = tournament_obj.id;
op.won_prize = won_prize; op.payout_amount = won_prize;
op.winner_account_id = winner; op.payout_account_id = winner;
op.type = payout_type::prize_award;
event.db.push_applied_operation(op);
op.payout_amount = rake;
op.payout_account_id = TOURNAMENT_RAKE_FEE_ACCOUNT_ID;
op.type = payout_type::rake_fee;
event.db.push_applied_operation(op); event.db.push_applied_operation(op);
} }
}; };

View file

@ -3208,8 +3208,13 @@ std::string operation_printer::operator()(const asset_dividend_distribution_oper
std::string operation_printer::operator()(const tournament_payout_operation& op)const std::string operation_printer::operator()(const tournament_payout_operation& op)const
{ {
out << "Tournament Payout Account '" << wallet.get_account(op.winner_account_id).name asset_object payout_asset = wallet.get_asset(op.payout_amount.asset_id);
<< "', Amount " << std::to_string(op.won_prize.amount.value) << " " << wallet.get_asset(op.won_prize.asset_id).symbol;
out << "Tournament #" << std::string(object_id_type(op.tournament_id)) << " Payout : "
<< "Account '" << wallet.get_account(op.payout_account_id).name
<< "', Amount " << payout_asset.amount_to_pretty_string(op.payout_amount) << ", Type "
<< (op.type == payout_type::buyin_refund ? "buyin refund" : (op.type == payout_type::rake_fee ? "rake fee" : "prize award"))
<< ".";
return ""; return "";
} }