wallet api now returns the memo and a human readable description
This commit is contained in:
parent
30ae8e4f34
commit
93c72b0595
3 changed files with 69 additions and 27 deletions
|
|
@ -1 +1 @@
|
||||||
Subproject commit 483b348878f284c474511db05e120466ffbfc132
|
Subproject commit d19f67d94f2d0b8d4ab04fd29c9df324d053396f
|
||||||
|
|
@ -242,6 +242,12 @@ namespace detail {
|
||||||
class wallet_api_impl;
|
class wallet_api_impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct operation_detail {
|
||||||
|
string memo;
|
||||||
|
string description;
|
||||||
|
operation_history_object op;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This wallet assumes it is connected to the database server with a high-bandwidth, low-latency connection and
|
* This wallet assumes it is connected to the database server with a high-bandwidth, low-latency connection and
|
||||||
* performs minimal caching. This API could be provided locally to be used by a web interface.
|
* performs minimal caching. This API could be provided locally to be used by a web interface.
|
||||||
|
|
@ -310,7 +316,7 @@ class wallet_api
|
||||||
* @param limit the number of entries to return (starting from the most recent) (max 100)
|
* @param limit the number of entries to return (starting from the most recent) (max 100)
|
||||||
* @returns a list of \c operation_history_objects
|
* @returns a list of \c operation_history_objects
|
||||||
*/
|
*/
|
||||||
vector<operation_history_object> get_account_history(string name, int limit)const;
|
vector<operation_detail> get_account_history(string name, int limit)const;
|
||||||
|
|
||||||
|
|
||||||
vector<bucket_object> get_market_history(string symbol, string symbol2, uint32_t bucket)const;
|
vector<bucket_object> get_market_history(string symbol, string symbol2, uint32_t bucket)const;
|
||||||
|
|
@ -1370,6 +1376,9 @@ FC_REFLECT_DERIVED( graphene::wallet::signed_block_with_info, (graphene::chain::
|
||||||
FC_REFLECT_DERIVED( graphene::wallet::vesting_balance_object_with_info, (graphene::chain::vesting_balance_object),
|
FC_REFLECT_DERIVED( graphene::wallet::vesting_balance_object_with_info, (graphene::chain::vesting_balance_object),
|
||||||
(allowed_withdraw)(allowed_withdraw_time) )
|
(allowed_withdraw)(allowed_withdraw_time) )
|
||||||
|
|
||||||
|
FC_REFLECT( graphene::wallet::operation_detail,
|
||||||
|
(memo)(description)(op) )
|
||||||
|
|
||||||
FC_API( graphene::wallet::wallet_api,
|
FC_API( graphene::wallet::wallet_api,
|
||||||
(help)
|
(help)
|
||||||
(gethelp)
|
(gethelp)
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ private:
|
||||||
const wallet_api_impl& wallet;
|
const wallet_api_impl& wallet;
|
||||||
operation_result result;
|
operation_result result;
|
||||||
|
|
||||||
void fee(const asset& a) const;
|
std::string fee(const asset& a) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
operation_printer( ostream& out, const wallet_api_impl& wallet, const operation_result& r = operation_result() )
|
operation_printer( ostream& out, const wallet_api_impl& wallet, const operation_result& r = operation_result() )
|
||||||
|
|
@ -84,17 +84,17 @@ public:
|
||||||
wallet(wallet),
|
wallet(wallet),
|
||||||
result(r)
|
result(r)
|
||||||
{}
|
{}
|
||||||
typedef void result_type;
|
typedef std::string result_type;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void operator()(const T& op)const;
|
std::string operator()(const T& op)const;
|
||||||
|
|
||||||
void operator()(const transfer_operation& op)const;
|
std::string operator()(const transfer_operation& op)const;
|
||||||
void operator()(const transfer_from_blind_operation& op)const;
|
std::string operator()(const transfer_from_blind_operation& op)const;
|
||||||
void operator()(const transfer_to_blind_operation& op)const;
|
std::string operator()(const transfer_to_blind_operation& op)const;
|
||||||
void operator()(const account_create_operation& op)const;
|
std::string operator()(const account_create_operation& op)const;
|
||||||
void operator()(const account_update_operation& op)const;
|
std::string operator()(const account_update_operation& op)const;
|
||||||
void operator()(const asset_create_operation& op)const;
|
std::string operator()(const asset_create_operation& op)const;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
|
|
@ -1865,11 +1865,12 @@ public:
|
||||||
|
|
||||||
m["get_account_history"] = [this](variant result, const fc::variants& a)
|
m["get_account_history"] = [this](variant result, const fc::variants& a)
|
||||||
{
|
{
|
||||||
auto r = result.as<vector<operation_history_object>>();
|
auto r = result.as<vector<operation_detail>>();
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
|
|
||||||
for( const operation_history_object& i : r )
|
for( operation_detail& d : r )
|
||||||
{
|
{
|
||||||
|
operation_history_object& i = d.op;
|
||||||
auto b = _remote_db->get_block_header(i.block_num);
|
auto b = _remote_db->get_block_header(i.block_num);
|
||||||
FC_ASSERT(b);
|
FC_ASSERT(b);
|
||||||
ss << b->timestamp.to_iso_string() << " ";
|
ss << b->timestamp.to_iso_string() << " ";
|
||||||
|
|
@ -2175,12 +2176,13 @@ public:
|
||||||
mutable map<asset_id_type, asset_object> _asset_cache;
|
mutable map<asset_id_type, asset_object> _asset_cache;
|
||||||
};
|
};
|
||||||
|
|
||||||
void operation_printer::fee(const asset& a)const {
|
std::string operation_printer::fee(const asset& a)const {
|
||||||
out << " (Fee: " << wallet.get_asset(a.asset_id).amount_to_pretty_string(a) << ")";
|
out << " (Fee: " << wallet.get_asset(a.asset_id).amount_to_pretty_string(a) << ")";
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void operation_printer::operator()(const T& op)const
|
std::string operation_printer::operator()(const T& op)const
|
||||||
{
|
{
|
||||||
//balance_accumulator acc;
|
//balance_accumulator acc;
|
||||||
//op.get_balance_delta( acc, result );
|
//op.get_balance_delta( acc, result );
|
||||||
|
|
@ -2193,16 +2195,18 @@ void operation_printer::operator()(const T& op)const
|
||||||
out << op_name <<" ";
|
out << op_name <<" ";
|
||||||
// out << "balance delta: " << fc::json::to_string(acc.balance) <<" ";
|
// out << "balance delta: " << fc::json::to_string(acc.balance) <<" ";
|
||||||
out << payer.name << " fee: " << a.amount_to_pretty_string( op.fee );
|
out << payer.name << " fee: " << a.amount_to_pretty_string( op.fee );
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
void operation_printer::operator()(const transfer_from_blind_operation& op)const
|
std::string operation_printer::operator()(const transfer_from_blind_operation& op)const
|
||||||
{
|
{
|
||||||
auto a = wallet.get_asset( op.fee.asset_id );
|
auto a = wallet.get_asset( op.fee.asset_id );
|
||||||
auto receiver = wallet.get_account( op.to );
|
auto receiver = wallet.get_account( op.to );
|
||||||
|
|
||||||
out << receiver.name
|
out << receiver.name
|
||||||
<< " received " << a.amount_to_pretty_string( op.amount ) << " from blinded balance";
|
<< " received " << a.amount_to_pretty_string( op.amount ) << " from blinded balance";
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
void operation_printer::operator()(const transfer_to_blind_operation& op)const
|
std::string operation_printer::operator()(const transfer_to_blind_operation& op)const
|
||||||
{
|
{
|
||||||
auto fa = wallet.get_asset( op.fee.asset_id );
|
auto fa = wallet.get_asset( op.fee.asset_id );
|
||||||
auto a = wallet.get_asset( op.amount.asset_id );
|
auto a = wallet.get_asset( op.amount.asset_id );
|
||||||
|
|
@ -2211,11 +2215,13 @@ void operation_printer::operator()(const transfer_to_blind_operation& op)const
|
||||||
out << sender.name
|
out << sender.name
|
||||||
<< " sent " << a.amount_to_pretty_string( op.amount ) << " to " << op.outputs.size() << " blinded balance" << (op.outputs.size()>1?"s":"")
|
<< " sent " << a.amount_to_pretty_string( op.amount ) << " to " << op.outputs.size() << " blinded balance" << (op.outputs.size()>1?"s":"")
|
||||||
<< " fee: " << fa.amount_to_pretty_string( op.fee );
|
<< " fee: " << fa.amount_to_pretty_string( op.fee );
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
void operation_printer::operator()(const transfer_operation& op) const
|
string operation_printer::operator()(const transfer_operation& op) const
|
||||||
{
|
{
|
||||||
out << "Transfer " << wallet.get_asset(op.amount.asset_id).amount_to_pretty_string(op.amount)
|
out << "Transfer " << wallet.get_asset(op.amount.asset_id).amount_to_pretty_string(op.amount)
|
||||||
<< " from " << wallet.get_account(op.from).name << " to " << wallet.get_account(op.to).name;
|
<< " from " << wallet.get_account(op.from).name << " to " << wallet.get_account(op.to).name;
|
||||||
|
std::string memo;
|
||||||
if( op.memo )
|
if( op.memo )
|
||||||
{
|
{
|
||||||
if( wallet.is_locked() )
|
if( wallet.is_locked() )
|
||||||
|
|
@ -2227,7 +2233,8 @@ void operation_printer::operator()(const transfer_operation& op) const
|
||||||
("k", op.memo->to));
|
("k", op.memo->to));
|
||||||
auto my_key = wif_to_key(wallet._keys.at(op.memo->to));
|
auto my_key = wif_to_key(wallet._keys.at(op.memo->to));
|
||||||
FC_ASSERT(my_key, "Unable to recover private key to decrypt memo. Wallet may be corrupted.");
|
FC_ASSERT(my_key, "Unable to recover private key to decrypt memo. Wallet may be corrupted.");
|
||||||
out << " -- Memo: " << op.memo->get_message(*my_key, op.memo->from);
|
memo = op.memo->get_message(*my_key, op.memo->from);
|
||||||
|
out << " -- Memo: " << memo;
|
||||||
} catch (const fc::exception& e) {
|
} catch (const fc::exception& e) {
|
||||||
out << " -- could not decrypt memo";
|
out << " -- could not decrypt memo";
|
||||||
elog("Error when decrypting memo: ${e}", ("e", e.to_detail_string()));
|
elog("Error when decrypting memo: ${e}", ("e", e.to_detail_string()));
|
||||||
|
|
@ -2235,21 +2242,22 @@ void operation_printer::operator()(const transfer_operation& op) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fee(op.fee);
|
fee(op.fee);
|
||||||
|
return memo;
|
||||||
}
|
}
|
||||||
|
|
||||||
void operation_printer::operator()(const account_create_operation& op) const
|
std::string operation_printer::operator()(const account_create_operation& op) const
|
||||||
{
|
{
|
||||||
out << "Create Account '" << op.name << "'";
|
out << "Create Account '" << op.name << "'";
|
||||||
fee(op.fee);
|
return fee(op.fee);
|
||||||
}
|
}
|
||||||
|
|
||||||
void operation_printer::operator()(const account_update_operation& op) const
|
std::string operation_printer::operator()(const account_update_operation& op) const
|
||||||
{
|
{
|
||||||
out << "Update Account '" << wallet.get_account(op.account).name << "'";
|
out << "Update Account '" << wallet.get_account(op.account).name << "'";
|
||||||
fee(op.fee);
|
return fee(op.fee);
|
||||||
}
|
}
|
||||||
|
|
||||||
void operation_printer::operator()(const asset_create_operation& op) const
|
std::string operation_printer::operator()(const asset_create_operation& op) const
|
||||||
{
|
{
|
||||||
out << "Create ";
|
out << "Create ";
|
||||||
if( op.bitasset_opts.valid() )
|
if( op.bitasset_opts.valid() )
|
||||||
|
|
@ -2257,7 +2265,7 @@ void operation_printer::operator()(const asset_create_operation& op) const
|
||||||
else
|
else
|
||||||
out << "User-Issue Asset ";
|
out << "User-Issue Asset ";
|
||||||
out << "'" << op.symbol << "' with issuer " << wallet.get_account(op.issuer).name;
|
out << "'" << op.symbol << "' with issuer " << wallet.get_account(op.issuer).name;
|
||||||
fee(op.fee);
|
return fee(op.fee);
|
||||||
}
|
}
|
||||||
|
|
||||||
}}}
|
}}}
|
||||||
|
|
@ -2312,11 +2320,36 @@ vector<asset_object> wallet_api::list_assets(const string& lowerbound, uint32_t
|
||||||
return my->_remote_db->list_assets( lowerbound, limit );
|
return my->_remote_db->list_assets( lowerbound, limit );
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<operation_history_object> wallet_api::get_account_history(string name, int limit)const
|
vector<operation_detail> wallet_api::get_account_history(string name, int limit)const
|
||||||
{
|
{
|
||||||
return my->_remote_hist->get_account_history(get_account(name).get_id(), operation_history_id_type(), limit, operation_history_id_type());
|
vector<operation_detail> result;
|
||||||
|
auto account_id = get_account(name).get_id();
|
||||||
|
|
||||||
|
while( limit > 0 )
|
||||||
|
{
|
||||||
|
operation_history_id_type start;
|
||||||
|
if( result.size() )
|
||||||
|
{
|
||||||
|
start = result.back().op.id;
|
||||||
|
start = start + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<operation_history_object> current = my->_remote_hist->get_account_history(account_id, operation_history_id_type(), std::min(100,limit), start);
|
||||||
|
for( auto& o : current ) {
|
||||||
|
std::stringstream ss;
|
||||||
|
auto memo = o.op.visit(detail::operation_printer(ss, *my, o.result));
|
||||||
|
result.push_back( operation_detail{ memo, ss.str(), o } );
|
||||||
|
}
|
||||||
|
if( current.size() < std::min(100,limit) )
|
||||||
|
break;
|
||||||
|
limit -= current.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
vector<bucket_object> wallet_api::get_market_history( string symbol1, string symbol2, uint32_t bucket )const
|
vector<bucket_object> wallet_api::get_market_history( string symbol1, string symbol2, uint32_t bucket )const
|
||||||
{
|
{
|
||||||
return my->_remote_hist->get_market_history( get_asset_id(symbol1), get_asset_id(symbol2), bucket, fc::time_point_sec(), fc::time_point::now() );
|
return my->_remote_hist->get_market_history( get_asset_id(symbol1), get_asset_id(symbol2), bucket, fc::time_point_sec(), fc::time_point::now() );
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue