From bb8d334e6ce5f43ac038eecee639894d24fb07fa Mon Sep 17 00:00:00 2001 From: Srdjan Obucina Date: Wed, 5 Feb 2020 14:07:00 +0100 Subject: [PATCH] Add son_wallet_transfer_process_operation --- libraries/app/impacted.cpp | 3 +++ libraries/chain/db_notify.cpp | 3 +++ .../graphene/chain/protocol/operations.hpp | 1 + .../chain/protocol/son_wallet_transfer.hpp | 16 +++++++++++++ .../chain/son_wallet_transfer_evaluator.hpp | 9 +++++++ .../chain/son_wallet_transfer_evaluator.cpp | 24 +++++++++++++++++++ 6 files changed, 56 insertions(+) diff --git a/libraries/app/impacted.cpp b/libraries/app/impacted.cpp index 21dccf3b..d3e8eb8c 100644 --- a/libraries/app/impacted.cpp +++ b/libraries/app/impacted.cpp @@ -325,6 +325,9 @@ struct get_impacted_account_visitor void operator()( const son_wallet_transfer_create_operation& op ){ _impacted.insert( op.payer ); } + void operator()( const son_wallet_transfer_process_operation& op ){ + _impacted.insert( op.payer ); + } void operator()( const sidechain_address_add_operation& op ){ _impacted.insert( op.sidechain_address_account ); } diff --git a/libraries/chain/db_notify.cpp b/libraries/chain/db_notify.cpp index 4185f1bf..299cd9d0 100644 --- a/libraries/chain/db_notify.cpp +++ b/libraries/chain/db_notify.cpp @@ -312,6 +312,9 @@ struct get_impacted_account_visitor void operator()( const son_wallet_transfer_create_operation& op ) { _impacted.insert( op.payer ); } + void operator()( const son_wallet_transfer_process_operation& op ) { + _impacted.insert( op.payer ); + } void operator()( const sidechain_address_add_operation& op ) { _impacted.insert( op.sidechain_address_account ); } diff --git a/libraries/chain/include/graphene/chain/protocol/operations.hpp b/libraries/chain/include/graphene/chain/protocol/operations.hpp index ce0fa5c2..27980ae2 100644 --- a/libraries/chain/include/graphene/chain/protocol/operations.hpp +++ b/libraries/chain/include/graphene/chain/protocol/operations.hpp @@ -149,6 +149,7 @@ namespace graphene { namespace chain { son_wallet_recreate_operation, son_wallet_update_operation, son_wallet_transfer_create_operation, + son_wallet_transfer_process_operation, sidechain_address_add_operation, sidechain_address_update_operation, sidechain_address_delete_operation diff --git a/libraries/chain/include/graphene/chain/protocol/son_wallet_transfer.hpp b/libraries/chain/include/graphene/chain/protocol/son_wallet_transfer.hpp index 1b799822..2d9f1234 100644 --- a/libraries/chain/include/graphene/chain/protocol/son_wallet_transfer.hpp +++ b/libraries/chain/include/graphene/chain/protocol/son_wallet_transfer.hpp @@ -22,8 +22,24 @@ namespace graphene { namespace chain { share_type calculate_fee(const fee_parameters_type& k)const { return 0; } }; + struct son_wallet_transfer_process_operation : public base_operation + { + struct fee_parameters_type { uint64_t fee = 0; }; + + asset fee; + account_id_type payer; + + son_wallet_transfer_id_type son_wallet_transfer_id; + + account_id_type fee_payer()const { return payer; } + share_type calculate_fee(const fee_parameters_type& k)const { return 0; } + }; + } } // namespace graphene::chain FC_REFLECT(graphene::chain::son_wallet_transfer_create_operation::fee_parameters_type, (fee) ) FC_REFLECT(graphene::chain::son_wallet_transfer_create_operation, (fee)(payer) (uid) (timestamp) (sidechain) (transaction_id) (from) (to) (amount)) +FC_REFLECT(graphene::chain::son_wallet_transfer_process_operation::fee_parameters_type, (fee) ) +FC_REFLECT(graphene::chain::son_wallet_transfer_process_operation, (fee)(payer) + (son_wallet_transfer_id)) diff --git a/libraries/chain/include/graphene/chain/son_wallet_transfer_evaluator.hpp b/libraries/chain/include/graphene/chain/son_wallet_transfer_evaluator.hpp index 7e72a347..68fd0ad5 100644 --- a/libraries/chain/include/graphene/chain/son_wallet_transfer_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/son_wallet_transfer_evaluator.hpp @@ -12,4 +12,13 @@ public: object_id_type do_apply(const son_wallet_transfer_create_operation& o); }; +class process_son_wallet_transfer_evaluator : public evaluator +{ +public: + typedef son_wallet_transfer_process_operation operation_type; + + void_result do_evaluate(const son_wallet_transfer_process_operation& o); + object_id_type do_apply(const son_wallet_transfer_process_operation& o); +}; + } } // namespace graphene::chain diff --git a/libraries/chain/son_wallet_transfer_evaluator.cpp b/libraries/chain/son_wallet_transfer_evaluator.cpp index 6776e07b..5cbb194e 100644 --- a/libraries/chain/son_wallet_transfer_evaluator.cpp +++ b/libraries/chain/son_wallet_transfer_evaluator.cpp @@ -31,4 +31,28 @@ object_id_type create_son_wallet_transfer_evaluator::do_apply(const son_wallet_t return new_son_wallet_transfer_object.id; } FC_CAPTURE_AND_RETHROW( (op) ) } +void_result process_son_wallet_transfer_evaluator::do_evaluate(const son_wallet_transfer_process_operation& op) +{ try{ + FC_ASSERT(db().head_block_time() >= HARDFORK_SON_TIME, "Not allowed until SON HARDFORK"); + //FC_ASSERT(db().get_global_properties().parameters.get_son_btc_account_id() != GRAPHENE_NULL_ACCOUNT, "SON paying account not set."); + FC_ASSERT( op.payer == db().get_global_properties().parameters.get_son_btc_account_id() ); + + const auto& idx = db().get_index_type().indices().get(); + FC_ASSERT(idx.find(op.son_wallet_transfer_id) != idx.end(), "Son wallet transfer not found"); + return void_result(); +} FC_CAPTURE_AND_RETHROW( (op) ) } + +object_id_type process_son_wallet_transfer_evaluator::do_apply(const son_wallet_transfer_process_operation& op) +{ try { + const auto& idx = db().get_index_type().indices().get(); + auto itr = idx.find(op.son_wallet_transfer_id); + if(itr != idx.end()) + { + db().modify(*itr, [&op](son_wallet_transfer_object &swto) { + swto.processed = true; + }); + } + return op.son_wallet_transfer_id; +} FC_CAPTURE_AND_RETHROW( (op) ) } + } } // namespace graphene::chain