From 9696fcae17be3dbb3686bc2a0fbc32035ee5564c Mon Sep 17 00:00:00 2001 From: Casey Gardiner Date: Fri, 27 Aug 2021 10:32:19 -0400 Subject: [PATCH] Add FIP11b (transfer_tokens_fio_add) to chain and api plugins --- plugins/chain_api_plugin/chain_api_plugin.cpp | 2 + plugins/chain_plugin/chain_plugin.cpp | 51 +++++++++++++++++++ .../eosio/chain_plugin/chain_plugin.hpp | 13 +++++ 3 files changed, 66 insertions(+) diff --git a/plugins/chain_api_plugin/chain_api_plugin.cpp b/plugins/chain_api_plugin/chain_api_plugin.cpp index 377fa58327..001dc64814 100644 --- a/plugins/chain_api_plugin/chain_api_plugin.cpp +++ b/plugins/chain_api_plugin/chain_api_plugin.cpp @@ -179,6 +179,8 @@ namespace eosio { chain_apis::read_write::renew_fio_domain_results, 202), CHAIN_RW_CALL_ASYNC(renew_fio_address, chain_apis::read_write::renew_fio_address_results, 202), + CHAIN_RW_CALL_ASYNC(transfer_tokens_fio_add, + chain_apis::read_write::transfer_tokens_fio_add_results, 202), CHAIN_RW_CALL_ASYNC(record_obt_data, chain_apis::read_write::record_obt_data_results, 202), CHAIN_RW_CALL_ASYNC(reject_funds_request, diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index a99a927fe0..3b9b3a2205 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -4003,6 +4003,57 @@ if( options.count(name) ) { \ } CATCH_AND_CALL(next); } + void read_write::transfer_tokens_fio_add(const read_write::transfer_tokens_fio_add_params ¶ms, + next_function next) { + try { + FIO_403_ASSERT(params.size() == 4, + fioio::ErrorTransaction); // variant object contains authorization, account, name, data + auto pretty_input = std::make_shared(); + auto resolver = make_resolver(this, abi_serializer_max_time); + transaction_metadata_ptr ptrx; + dlog("transfer_tokens_fio_add called"); + + try { + abi_serializer::from_variant(params, *pretty_input, resolver, abi_serializer_max_time); + ptrx = std::make_shared(pretty_input); + } EOS_RETHROW_EXCEPTIONS(chain::fio_invalid_trans_exception, "Invalid transaction") + + transaction trx = pretty_input->get_transaction(); + vector &actions = trx.actions; + dlog("\n"); + dlog(actions[0].name.to_string()); + FIO_403_ASSERT(trx.total_actions() == 1, fioio::InvalidAccountOrAction); + + FIO_403_ASSERT(actions[0].authorization.size() > 0, fioio::ErrorTransaction); + FIO_403_ASSERT(actions[0].account.to_string() == "fio.reqobt", fioio::InvalidAccountOrAction); + FIO_403_ASSERT(actions[0].name.to_string() == "trnsfiopubad", fioio::InvalidAccountOrAction); + + app().get_method()(ptrx, true, [this, next]( + const fc::static_variant &result) -> void { + if (result.contains()) { + next(result.get()); + } else { + auto trx_trace_ptr = result.get(); + + try { + fc::variant output; + try { + output = db.to_variant_with_abi(*trx_trace_ptr, abi_serializer_max_time); + } catch (chain::abi_exception &) { + output = *trx_trace_ptr; + } + + const chain::transaction_id_type &id = trx_trace_ptr->id; + next(read_write::transfer_tokens_fio_add_results{id, output}); + } CATCH_AND_CALL(next); + } + }); + + + } catch (boost::interprocess::bad_alloc &) { + chain_plugin::handle_db_exhaustion(); + } CATCH_AND_CALL(next); + } /*** * record_obt_data - This api method will invoke the fio.request.obt smart contract for recordobt. this api method is diff --git a/plugins/chain_plugin/include/eosio/chain_plugin/chain_plugin.hpp b/plugins/chain_plugin/include/eosio/chain_plugin/chain_plugin.hpp index 6375293d6b..0656e4101a 100644 --- a/plugins/chain_plugin/include/eosio/chain_plugin/chain_plugin.hpp +++ b/plugins/chain_plugin/include/eosio/chain_plugin/chain_plugin.hpp @@ -1241,6 +1241,18 @@ namespace eosio { chain::plugin_interface::next_function next); //end added for cancel request + //Begin Added for transfer_tokens_fio_add api method + using transfer_tokens_fio_add_params = fc::variant_object; + + struct transfer_tokens_fio_add_results { + chain::transaction_id_type transaction_id; + fc::variant processed; + }; + + void transfer_tokens_fio_add(const transfer_tokens_fio_add_params ¶ms, + chain::plugin_interface::next_function next); + //end + //Begin Added for record send api method using record_obt_data_params = fc::variant_object; @@ -1547,6 +1559,7 @@ FC_REFLECT(eosio::chain_apis::read_write::set_fio_domain_public_results, (transa FC_REFLECT(eosio::chain_apis::read_write::register_fio_domain_results, (transaction_id)(processed)); FC_REFLECT(eosio::chain_apis::read_write::reject_funds_request_results, (transaction_id)(processed)); FC_REFLECT(eosio::chain_apis::read_write::cancel_funds_request_results, (transaction_id)(processed)); +FC_REFLECT(eosio::chain_apis::read_write::transfer_tokens_fio_add_results, (transaction_id)(processed)); FC_REFLECT(eosio::chain_apis::read_write::record_obt_data_results, (transaction_id)(processed)); FC_REFLECT(eosio::chain_apis::read_write::record_send_results, (transaction_id)(processed)); FC_REFLECT(eosio::chain_apis::read_write::submit_bundled_transaction_results, (transaction_id)(processed));