diff --git a/libraries/wallet/include/graphene/wallet/wallet.hpp b/libraries/wallet/include/graphene/wallet/wallet.hpp index 78669eb9..230b016e 100644 --- a/libraries/wallet/include/graphene/wallet/wallet.hpp +++ b/libraries/wallet/include/graphene/wallet/wallet.hpp @@ -583,7 +583,1605 @@ class wallet_api /** * @param role - active | owner | memo */ - pair get_private_key_from_password( string account, string role, string password )const; + pair get_private_key_from_password( string password, string account, string role )const; + + /** Converts a signed_transaction in JSON form to its binary representation. + * + * TODO: I don't see a broadcast_transaction() function, do we need one? + * + * @param tx the transaction to serialize + * @returns the binary form of the transaction. It will not be hex encoded, + * this returns a raw string that may have null characters embedded + * in it + */ + string serialize_transaction(signed_transaction tx) const; + + /** Imports the private key for an existing account. + * + * The private key must match either an owner key or an active key for the + * named account. + * + * @see dump_private_keys() + * + * @param account_name_or_id the account owning the key + * @param wif_key the private key in WIF format + * @returns true if the key was imported + */ + bool import_key(string account_name_or_id, string wif_key); + + map import_accounts( string filename, string password ); + + bool import_account_keys( string filename, string password, string src_account_name, string dest_account_name ); + + /** + * This call will construct transaction(s) that will claim all balances controled + * by wif_keys and deposit them into the given account. + */ + vector< signed_transaction > import_balance( string account_name_or_id, const vector& wif_keys, bool broadcast ); + + /** Transforms a brain key to reduce the chance of errors when re-entering the key from memory. + * + * This takes a user-supplied brain key and normalizes it into the form used + * for generating private keys. In particular, this upper-cases all ASCII characters + * and collapses multiple spaces into one. + * @param s the brain key as supplied by the user + * @returns the brain key in its normalized form + */ + string normalize_brain_key(string s) const; + + /** Registers a third party's account on the blockckain. + * + * This function is used to register an account for which you do not own the private keys. + * When acting as a registrar, an end user will generate their own private keys and send + * you the public keys. The registrar will use this function to register the account + * on behalf of the end user. + * + * @see create_account_with_brain_key() + * + * @param name the name of the account, must be unique on the blockchain. Shorter names + * are more expensive to register; the rules are still in flux, but in general + * names of more than 8 characters with at least one digit will be cheap. + * @param owner the owner key for the new account + * @param active the active key for the new account + * @param registrar_account the account which will pay the fee to register the user + * @param referrer_account the account who is acting as a referrer, and may receive a + * portion of the user's transaction fees. This can be the + * same as the registrar_account if there is no referrer. + * @param referrer_percent the percentage (0 - 100) of the new user's transaction fees + * not claimed by the blockchain that will be distributed to the + * referrer; the rest will be sent to the registrar. Will be + * multiplied by GRAPHENE_1_PERCENT when constructing the transaction. + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction registering the account + */ + signed_transaction register_account(string name, + public_key_type owner, + public_key_type active, + string registrar_account, + string referrer_account, + uint32_t referrer_percent, + bool broadcast = false); + + /** + * Upgrades an account to prime status. + * This makes the account holder a 'lifetime member'. + * + * @todo there is no option for annual membership + * @param name the name or id of the account to upgrade + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction upgrading the account + */ + signed_transaction upgrade_account(string name, bool broadcast); + + /** Creates a new account and registers it on the blockchain. + * + * @todo why no referrer_percent here? + * + * @see suggest_brain_key() + * @see register_account() + * + * @param brain_key the brain key used for generating the account's private keys + * @param account_name the name of the account, must be unique on the blockchain. Shorter names + * are more expensive to register; the rules are still in flux, but in general + * names of more than 8 characters with at least one digit will be cheap. + * @param registrar_account the account which will pay the fee to register the user + * @param referrer_account the account who is acting as a referrer, and may receive a + * portion of the user's transaction fees. This can be the + * same as the registrar_account if there is no referrer. + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction registering the account + */ + signed_transaction create_account_with_brain_key(string brain_key, + string account_name, + string registrar_account, + string referrer_account, + bool broadcast = false); + + /** Transfer an amount from one account to another. + * @param from the name or id of the account sending the funds + * @param to the name or id of the account receiving the funds + * @param amount the amount to send (in nominal units -- to send half of a BTS, specify 0.5) + * @param asset_symbol the symbol or id of the asset to send + * @param memo a memo to attach to the transaction. The memo will be encrypted in the + * transaction and readable for the receiver. There is no length limit + * other than the limit imposed by maximum transaction size, but transaction + * increase with transaction size + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction transferring funds + */ + signed_transaction transfer(string from, + string to, + string amount, + string asset_symbol, + string memo, + bool broadcast = false); + + /** + * This method works just like transfer, except it always broadcasts and + * returns the transaction ID along with the signed transaction. + */ + pair transfer2(string from, + string to, + string amount, + string asset_symbol, + string memo ) { + auto trx = transfer( from, to, amount, asset_symbol, memo, true ); + return std::make_pair(trx.id(),trx); + } + + + /** + * This method is used to convert a JSON transaction to its transactin ID. + */ + transaction_id_type get_transaction_id( const signed_transaction& trx )const { return trx.id(); } + + + /** These methods are used for stealth transfers */ + ///@{ + /** + * This method can be used to set the label for a public key + * + * @note No two keys can have the same label. + * + * @return true if the label was set, otherwise false + */ + bool set_key_label( public_key_type, string label ); + string get_key_label( public_key_type )const; + + /** + * Generates a new blind account for the given brain key and assigns it the given label. + */ + public_key_type create_blind_account( string label, string brain_key ); + + /** + * @return the total balance of all blinded commitments that can be claimed by the + * given account key or label + */ + vector get_blind_balances( string key_or_label ); + /** @return all blind accounts */ + map get_blind_accounts()const; + /** @return all blind accounts for which this wallet has the private key */ + map get_my_blind_accounts()const; + /** @return the public key associated with the given label */ + public_key_type get_public_key( string label )const; + ///@} + + /** + * @return all blind receipts to/form a particular account + */ + vector blind_history( string key_or_account ); + + /** + * Given a confirmation receipt, this method will parse it for a blinded balance and confirm + * that it exists in the blockchain. If it exists then it will report the amount received and + * who sent it. + * + * @param opt_from - if not empty and the sender is a unknown public key, then the unknown public key will be given the label opt_from + * @param confirmation_receipt - a base58 encoded stealth confirmation + */ + blind_receipt receive_blind_transfer( string confirmation_receipt, string opt_from, string opt_memo ); + + /** + * Transfers a public balance from @from to one or more blinded balances using a + * stealth transfer. + */ + blind_confirmation transfer_to_blind( string from_account_id_or_name, + string asset_symbol, + /** map from key or label to amount */ + vector> to_amounts, + bool broadcast = false ); + + /** + * Transfers funds from a set of blinded balances to a public account balance. + */ + blind_confirmation transfer_from_blind( + string from_blind_account_key_or_label, + string to_account_id_or_name, + string amount, + string asset_symbol, + bool broadcast = false ); + + /** + * Used to transfer from one set of blinded balances to another + */ + blind_confirmation blind_transfer( string from_key_or_label, + string to_key_or_label, + string amount, + string symbol, + bool broadcast = false ); + + /** Place a limit order attempting to sell one asset for another. + * + * Buying and selling are the same operation on Graphene; if you want to buy BTS + * with USD, you should sell USD for BTS. + * + * The blockchain will attempt to sell the \c symbol_to_sell for as + * much \c symbol_to_receive as possible, as long as the price is at + * least \c min_to_receive / \c amount_to_sell. + * + * In addition to the transaction fees, market fees will apply as specified + * by the issuer of both the selling asset and the receiving asset as + * a percentage of the amount exchanged. + * + * If either the selling asset or the receiving asset is whitelist + * restricted, the order will only be created if the seller is on + * the whitelist of the restricted asset type. + * + * Market orders are matched in the order they are included + * in the block chain. + * + * @todo Allow order expiration to be set here. Document default/max expiration time + * + * @param seller_account the account providing the asset being sold, and which will + * receive the proceeds of the sale. + * @param amount_to_sell the amount of the asset being sold to sell (in nominal units) + * @param symbol_to_sell the name or id of the asset to sell + * @param min_to_receive the minimum amount you are willing to receive in return for + * selling the entire amount_to_sell + * @param symbol_to_receive the name or id of the asset you wish to receive + * @param timeout_sec if the order does not fill immediately, this is the length of + * time the order will remain on the order books before it is + * cancelled and the un-spent funds are returned to the seller's + * account + * @param fill_or_kill if true, the order will only be included in the blockchain + * if it is filled immediately; if false, an open order will be + * left on the books to fill any amount that cannot be filled + * immediately. + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction selling the funds + */ + signed_transaction sell_asset(string seller_account, + string amount_to_sell, + string symbol_to_sell, + string min_to_receive, + string symbol_to_receive, + uint32_t timeout_sec = 0, + bool fill_or_kill = false, + bool broadcast = false); + + /** Place a limit order attempting to sell one asset for another. + * + * This API call abstracts away some of the details of the sell_asset call to be more + * user friendly. All orders placed with sell never timeout and will not be killed if they + * cannot be filled immediately. If you wish for one of these parameters to be different, + * then sell_asset should be used instead. + * + * @param seller_account the account providing the asset being sold, and which will + * receive the processed of the sale. + * @param base The name or id of the asset to sell. + * @param quote The name or id of the asset to recieve. + * @param rate The rate in base:quote at which you want to sell. + * @param amount The amount of base you want to sell. + * @param broadcast true to broadcast the transaction on the network. + * @returns The signed transaction selling the funds. + */ + signed_transaction sell( string seller_account, + string base, + string quote, + double rate, + double amount, + bool broadcast ); + + /** Place a limit order attempting to buy one asset with another. + * + * This API call abstracts away some of the details of the sell_asset call to be more + * user friendly. All orders placed with buy never timeout and will not be killed if they + * cannot be filled immediately. If you wish for one of these parameters to be different, + * then sell_asset should be used instead. + * + * @param buyer_account The account buying the asset for another asset. + * @param base The name or id of the asset to buy. + * @param quote The name or id of the assest being offered as payment. + * @param rate The rate in base:quote at which you want to buy. + * @param amount the amount of base you want to buy. + * @param broadcast true to broadcast the transaction on the network. + * @param The signed transaction selling the funds. + */ + signed_transaction buy( string buyer_account, + string base, + string quote, + double rate, + double amount, + bool broadcast ); + + /** Borrow an asset or update the debt/collateral ratio for the loan. + * + * This is the first step in shorting an asset. Call \c sell_asset() to complete the short. + * + * @param borrower_name the name or id of the account associated with the transaction. + * @param amount_to_borrow the amount of the asset being borrowed. Make this value + * negative to pay back debt. + * @param asset_symbol the symbol or id of the asset being borrowed. + * @param amount_of_collateral the amount of the backing asset to add to your collateral + * position. Make this negative to claim back some of your collateral. + * The backing asset is defined in the \c bitasset_options for the asset being borrowed. + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction borrowing the asset + */ + signed_transaction borrow_asset(string borrower_name, string amount_to_borrow, string asset_symbol, + string amount_of_collateral, bool broadcast = false); + + /** Cancel an existing order + * + * @param order_id the id of order to be cancelled + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction canceling the order + */ + signed_transaction cancel_order(object_id_type order_id, bool broadcast = false); + + /** Creates a new user-issued or market-issued asset. + * + * Many options can be changed later using \c update_asset() + * + * Right now this function is difficult to use because you must provide raw JSON data + * structures for the options objects, and those include prices and asset ids. + * + * @param issuer the name or id of the account who will pay the fee and become the + * issuer of the new asset. This can be updated later + * @param symbol the ticker symbol of the new asset + * @param precision the number of digits of precision to the right of the decimal point, + * must be less than or equal to 12 + * @param common asset options required for all new assets. + * Note that core_exchange_rate technically needs to store the asset ID of + * this new asset. Since this ID is not known at the time this operation is + * created, create this price as though the new asset has instance ID 1, and + * the chain will overwrite it with the new asset's ID. + * @param bitasset_opts options specific to BitAssets. This may be null unless the + * \c market_issued flag is set in common.flags + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction creating a new asset + */ + signed_transaction create_asset(string issuer, + string symbol, + uint8_t precision, + asset_options common, + fc::optional bitasset_opts, + bool broadcast = false); + + /** Issue new shares of an asset. + * + * @param to_account the name or id of the account to receive the new shares + * @param amount the amount to issue, in nominal units + * @param symbol the ticker symbol of the asset to issue + * @param memo a memo to include in the transaction, readable by the recipient + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction issuing the new shares + */ + signed_transaction issue_asset(string to_account, string amount, + string symbol, + string memo, + bool broadcast = false); + + /** Update the core options on an asset. + * There are a number of options which all assets in the network use. These options are + * enumerated in the asset_object::asset_options struct. This command is used to update + * these options for an existing asset. + * + * @note This operation cannot be used to update BitAsset-specific options. For these options, + * \c update_bitasset() instead. + * + * @param symbol the name or id of the asset to update + * @param new_issuer if changing the asset's issuer, the name or id of the new issuer. + * null if you wish to remain the issuer of the asset + * @param new_options the new asset_options object, which will entirely replace the existing + * options. + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction updating the asset + */ + signed_transaction update_asset(string symbol, + optional new_issuer, + asset_options new_options, + bool broadcast = false); + + /** Update the options specific to a BitAsset. + * + * BitAssets have some options which are not relevant to other asset types. This operation is used to update those + * options an an existing BitAsset. + * + * @see update_asset() + * + * @param symbol the name or id of the asset to update, which must be a market-issued asset + * @param new_options the new bitasset_options object, which will entirely replace the existing + * options. + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction updating the bitasset + */ + signed_transaction update_bitasset(string symbol, + bitasset_options new_options, + bool broadcast = false); + + + /** Update the given asset's dividend asset options. + * + * If the asset is not already a dividend-paying asset, it will be converted into one. + * + * @param symbol the name or id of the asset to update, which must be a market-issued asset + * @param new_options the new dividend_asset_options object, which will entirely replace the existing + * options. + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction updating the asset + */ + signed_transaction update_dividend_asset(string symbol, + dividend_asset_options new_options, + bool broadcast = false); + + /** Update the set of feed-producing accounts for a BitAsset. + * + * BitAssets have price feeds selected by taking the median values of recommendations from a set of feed producers. + * This command is used to specify which accounts may produce feeds for a given BitAsset. + * @param symbol the name or id of the asset to update + * @param new_feed_producers a list of account names or ids which are authorized to produce feeds for the asset. + * this list will completely replace the existing list + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction updating the bitasset's feed producers + */ + signed_transaction update_asset_feed_producers(string symbol, + flat_set new_feed_producers, + bool broadcast = false); + + /** Publishes a price feed for the named asset. + * + * Price feed providers use this command to publish their price feeds for market-issued assets. A price feed is + * used to tune the market for a particular market-issued asset. For each value in the feed, the median across all + * committee_member feeds for that asset is calculated and the market for the asset is configured with the median of that + * value. + * + * The feed object in this command contains three prices: a call price limit, a short price limit, and a settlement price. + * The call limit price is structured as (collateral asset) / (debt asset) and the short limit price is structured + * as (asset for sale) / (collateral asset). Note that the asset IDs are opposite to eachother, so if we're + * publishing a feed for USD, the call limit price will be CORE/USD and the short limit price will be USD/CORE. The + * settlement price may be flipped either direction, as long as it is a ratio between the market-issued asset and + * its collateral. + * + * @param publishing_account the account publishing the price feed + * @param symbol the name or id of the asset whose feed we're publishing + * @param feed the price_feed object containing the three prices making up the feed + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction updating the price feed for the given asset + */ + signed_transaction publish_asset_feed(string publishing_account, + string symbol, + price_feed feed, + bool broadcast = false); + + /** Pay into the fee pool for the given asset. + * + * User-issued assets can optionally have a pool of the core asset which is + * automatically used to pay transaction fees for any transaction using that + * asset (using the asset's core exchange rate). + * + * This command allows anyone to deposit the core asset into this fee pool. + * + * @param from the name or id of the account sending the core asset + * @param symbol the name or id of the asset whose fee pool you wish to fund + * @param amount the amount of the core asset to deposit + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction funding the fee pool + */ + signed_transaction fund_asset_fee_pool(string from, + string symbol, + string amount, + bool broadcast = false); + + /** Burns the given user-issued asset. + * + * This command burns the user-issued asset to reduce the amount in circulation. + * @note you cannot burn market-issued assets. + * @param from the account containing the asset you wish to burn + * @param amount the amount to burn, in nominal units + * @param symbol the name or id of the asset to burn + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction burning the asset + */ + signed_transaction reserve_asset(string from, + string amount, + string symbol, + bool broadcast = false); + + /** Forces a global settling of the given asset (black swan or prediction markets). + * + * In order to use this operation, asset_to_settle must have the global_settle flag set + * + * When this operation is executed all balances are converted into the backing asset at the + * settle_price and all open margin positions are called at the settle price. If this asset is + * used as backing for other bitassets, those bitassets will be force settled at their current + * feed price. + * + * @note this operation is used only by the asset issuer, \c settle_asset() may be used by + * any user owning the asset + * + * @param symbol the name or id of the asset to force settlement on + * @param settle_price the price at which to settle + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction settling the named asset + */ + signed_transaction global_settle_asset(string symbol, + price settle_price, + bool broadcast = false); + + /** Schedules a market-issued asset for automatic settlement. + * + * Holders of market-issued assests may request a forced settlement for some amount of their asset. This means that + * the specified sum will be locked by the chain and held for the settlement period, after which time the chain will + * choose a margin posision holder and buy the settled asset using the margin's collateral. The price of this sale + * will be based on the feed price for the market-issued asset being settled. The exact settlement price will be the + * feed price at the time of settlement with an offset in favor of the margin position, where the offset is a + * blockchain parameter set in the global_property_object. + * + * @param account_to_settle the name or id of the account owning the asset + * @param amount_to_settle the amount of the named asset to schedule for settlement + * @param symbol the name or id of the asset to settlement on + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction settling the named asset + */ + signed_transaction settle_asset(string account_to_settle, + string amount_to_settle, + string symbol, + bool broadcast = false); + + /** Whitelist and blacklist accounts, primarily for transacting in whitelisted assets. + * + * Accounts can freely specify opinions about other accounts, in the form of either whitelisting or blacklisting + * them. This information is used in chain validation only to determine whether an account is authorized to transact + * in an asset type which enforces a whitelist, but third parties can use this information for other uses as well, + * as long as it does not conflict with the use of whitelisted assets. + * + * An asset which enforces a whitelist specifies a list of accounts to maintain its whitelist, and a list of + * accounts to maintain its blacklist. In order for a given account A to hold and transact in a whitelisted asset S, + * A must be whitelisted by at least one of S's whitelist_authorities and blacklisted by none of S's + * blacklist_authorities. If A receives a balance of S, and is later removed from the whitelist(s) which allowed it + * to hold S, or added to any blacklist S specifies as authoritative, A's balance of S will be frozen until A's + * authorization is reinstated. + * + * @param authorizing_account the account who is doing the whitelisting + * @param account_to_list the account being whitelisted + * @param new_listing_status the new whitelisting status + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction changing the whitelisting status + */ + signed_transaction whitelist_account(string authorizing_account, + string account_to_list, + account_whitelist_operation::account_listing new_listing_status, + bool broadcast = false); + + /** Creates a committee_member object owned by the given account. + * + * An account can have at most one committee_member object. + * + * @param owner_account the name or id of the account which is creating the committee_member + * @param url a URL to include in the committee_member record in the blockchain. Clients may + * display this when showing a list of committee_members. May be blank. + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction registering a committee_member + */ + signed_transaction create_committee_member(string owner_account, + string url, + bool broadcast = false); + + /** Lists all witnesses registered in the blockchain. + * This returns a list of all account names that own witnesses, and the associated witness id, + * sorted by name. This lists witnesses whether they are currently voted in or not. + * + * Use the \c lowerbound and limit parameters to page through the list. To retrieve all witnesss, + * start by setting \c lowerbound to the empty string \c "", and then each iteration, pass + * the last witness name returned as the \c lowerbound for the next \c list_witnesss() call. + * + * @param lowerbound the name of the first witness to return. If the named witness does not exist, + * the list will start at the witness that comes after \c lowerbound + * @param limit the maximum number of witnesss to return (max: 1000) + * @returns a list of witnesss mapping witness names to witness ids + */ + map list_witnesses(const string& lowerbound, uint32_t limit); + + /** Lists all committee_members registered in the blockchain. + * This returns a list of all account names that own committee_members, and the associated committee_member id, + * sorted by name. This lists committee_members whether they are currently voted in or not. + * + * Use the \c lowerbound and limit parameters to page through the list. To retrieve all committee_members, + * start by setting \c lowerbound to the empty string \c "", and then each iteration, pass + * the last committee_member name returned as the \c lowerbound for the next \c list_committee_members() call. + * + * @param lowerbound the name of the first committee_member to return. If the named committee_member does not exist, + * the list will start at the committee_member that comes after \c lowerbound + * @param limit the maximum number of committee_members to return (max: 1000) + * @returns a list of committee_members mapping committee_member names to committee_member ids + */ + map list_committee_members(const string& lowerbound, uint32_t limit); + + /** Returns information about the given witness. + * @param owner_account the name or id of the witness account owner, or the id of the witness + * @returns the information about the witness stored in the block chain + */ + witness_object get_witness(string owner_account); + + /** Returns information about the given committee_member. + * @param owner_account the name or id of the committee_member account owner, or the id of the committee_member + * @returns the information about the committee_member stored in the block chain + */ + committee_member_object get_committee_member(string owner_account); + + /** Creates a witness object owned by the given account. + * + * An account can have at most one witness object. + * + * @param owner_account the name or id of the account which is creating the witness + * @param url a URL to include in the witness record in the blockchain. Clients may + * display this when showing a list of witnesses. May be blank. + * @param broadcast true to broadcast the transaction on the network + * @returns the signed transaction registering a witness + */ + signed_transaction create_witness(string owner_account, + string url, + bool broadcast = false); + + /** + * Update a witness object owned by the given account. + * + * @param witness The name of the witness's owner account. Also accepts the ID of the owner account or the ID of the witness. + * @param url Same as for create_witness. The empty string makes it remain the same. + * @param block_signing_key The new block signing public key. The empty string makes it remain the same. + * @param broadcast true if you wish to broadcast the transaction. + */ + signed_transaction update_witness(string witness_name, + string url, + string block_signing_key, + bool broadcast = false); + + + /** + * Create a worker object. + * + * @param owner_account The account which owns the worker and will be paid + * @param work_begin_date When the work begins + * @param work_end_date When the work ends + * @param daily_pay Amount of pay per day (NOT per maint interval) + * @param name Any text + * @param url Any text + * @param worker_settings {"type" : "burn"|"refund"|"vesting", "pay_vesting_period_days" : x} + * @param broadcast true if you wish to broadcast the transaction. + */ + signed_transaction create_worker( + string owner_account, + time_point_sec work_begin_date, + time_point_sec work_end_date, + share_type daily_pay, + string name, + string url, + variant worker_settings, + bool broadcast = false + ); + + /** + * Update your votes for a worker + * + * @param account The account which will pay the fee and update votes. + * @param worker_vote_delta {"vote_for" : [...], "vote_against" : [...], "vote_abstain" : [...]} + * @param broadcast true if you wish to broadcast the transaction. + */ + signed_transaction update_worker_votes( + string account, + worker_vote_delta delta, + bool broadcast = false + ); + + /** + * Get information about a vesting balance object. + * + * @param account_name An account name, account ID, or vesting balance object ID. + */ + vector< vesting_balance_object_with_info > get_vesting_balances( string account_name ); + + /** + * Withdraw a vesting balance. + * + * @param witness_name The account name of the witness, also accepts account ID or vesting balance ID type. + * @param amount The amount to withdraw. + * @param asset_symbol The symbol of the asset to withdraw. + * @param broadcast true if you wish to broadcast the transaction + */ + signed_transaction withdraw_vesting( + string witness_name, + string amount, + string asset_symbol, + bool broadcast = false); + + /** Vote for a given committee_member. + * + * An account can publish a list of all committee_memberes they approve of. This + * command allows you to add or remove committee_memberes from this list. + * Each account's vote is weighted according to the number of shares of the + * core asset owned by that account at the time the votes are tallied. + * + * @note you cannot vote against a committee_member, you can only vote for the committee_member + * or not vote for the committee_member. + * + * @param voting_account the name or id of the account who is voting with their shares + * @param committee_member the name or id of the committee_member' owner account + * @param approve true if you wish to vote in favor of that committee_member, false to + * remove your vote in favor of that committee_member + * @param broadcast true if you wish to broadcast the transaction + * @return the signed transaction changing your vote for the given committee_member + */ + signed_transaction vote_for_committee_member(string voting_account, + string committee_member, + bool approve, + bool broadcast = false); + + /** Vote for a given witness. + * + * An account can publish a list of all witnesses they approve of. This + * command allows you to add or remove witnesses from this list. + * Each account's vote is weighted according to the number of shares of the + * core asset owned by that account at the time the votes are tallied. + * + * @note you cannot vote against a witness, you can only vote for the witness + * or not vote for the witness. + * + * @param voting_account the name or id of the account who is voting with their shares + * @param witness the name or id of the witness' owner account + * @param approve true if you wish to vote in favor of that witness, false to + * remove your vote in favor of that witness + * @param broadcast true if you wish to broadcast the transaction + * @return the signed transaction changing your vote for the given witness + */ + signed_transaction vote_for_witness(string voting_account, + string witness, + bool approve, + bool broadcast = false); + + /** Set the voting proxy for an account. + * + * If a user does not wish to take an active part in voting, they can choose + * to allow another account to vote their stake. + * + * Setting a vote proxy does not remove your previous votes from the blockchain, + * they remain there but are ignored. If you later null out your vote proxy, + * your previous votes will take effect again. + * + * This setting can be changed at any time. + * + * @param account_to_modify the name or id of the account to update + * @param voting_account the name or id of an account authorized to vote account_to_modify's shares, + * or null to vote your own shares + * + * @param broadcast true if you wish to broadcast the transaction + * @return the signed transaction changing your vote proxy settings + */ + signed_transaction set_voting_proxy(string account_to_modify, + optional voting_account, + bool broadcast = false); + + /** Set your vote for the number of witnesses and committee_members in the system. + * + * Each account can voice their opinion on how many committee_members and how many + * witnesses there should be in the active committee_member/active witness list. These + * are independent of each other. You must vote your approval of at least as many + * committee_members or witnesses as you claim there should be (you can't say that there should + * be 20 committee_members but only vote for 10). + * + * There are maximum values for each set in the blockchain parameters (currently + * defaulting to 1001). + * + * This setting can be changed at any time. If your account has a voting proxy + * set, your preferences will be ignored. + * + * @param account_to_modify the name or id of the account to update + * @param number_of_committee_members the number + * + * @param broadcast true if you wish to broadcast the transaction + * @return the signed transaction changing your vote proxy settings + */ + signed_transaction set_desired_witness_and_committee_member_count(string account_to_modify, + uint16_t desired_number_of_witnesses, + uint16_t desired_number_of_committee_members, + bool broadcast = false); + + /** Signs a transaction. + * + * Given a fully-formed transaction that is only lacking signatures, this signs + * the transaction with the necessary keys and optionally broadcasts the transaction + * @param tx the unsigned transaction + * @param broadcast true if you wish to broadcast the transaction + * @return the signed version of the transaction + */ + signed_transaction sign_transaction(signed_transaction tx, bool broadcast = false); + + /** Returns an uninitialized object representing a given blockchain operation. + * + * This returns a default-initialized object of the given type; it can be used + * during early development of the wallet when we don't yet have custom commands for + * creating all of the operations the blockchain supports. + * + * Any operation the blockchain supports can be created using the transaction builder's + * \c add_operation_to_builder_transaction() , but to do that from the CLI you need to + * know what the JSON form of the operation looks like. This will give you a template + * you can fill in. It's better than nothing. + * + * @param operation_type the type of operation to return, must be one of the + * operations defined in `graphene/chain/operations.hpp` + * (e.g., "global_parameters_update_operation") + * @return a default-constructed operation of the given type + */ + operation get_prototype_operation(string operation_type); + + /** Creates a transaction to propose a parameter change. + * + * Multiple parameters can be specified if an atomic change is + * desired. + * + * @param proposing_account The account paying the fee to propose the tx + * @param expiration_time Timestamp specifying when the proposal will either take effect or expire. + * @param changed_values The values to change; all other chain parameters are filled in with default values + * @param broadcast true if you wish to broadcast the transaction + * @return the signed version of the transaction + */ + signed_transaction propose_parameter_change( + const string& proposing_account, + fc::time_point_sec expiration_time, + const variant_object& changed_values, + bool broadcast = false); + + /** Propose a fee change. + * + * @param proposing_account The account paying the fee to propose the tx + * @param expiration_time Timestamp specifying when the proposal will either take effect or expire. + * @param changed_values Map of operation type to new fee. Operations may be specified by name or ID. + * The "scale" key changes the scale. All other operations will maintain current values. + * @param broadcast true if you wish to broadcast the transaction + * @return the signed version of the transaction + */ + signed_transaction propose_fee_change( + const string& proposing_account, + fc::time_point_sec expiration_time, + const variant_object& changed_values, + bool broadcast = false); + + /** Propose a dividend asset update. + * + * @param proposing_account The account paying the fee to propose the tx + * @param expiration_time Timestamp specifying when the proposal will either take effect or expire. + * @param changed_values dividend asset parameters to update + * @param broadcast true if you wish to broadcast the transaction + * @return the signed version of the transaction + */ + signed_transaction propose_dividend_asset_update( + const string& proposing_account, + fc::time_point_sec expiration_time, + const variant_object& changed_values, + bool broadcast = false); + + /** Approve or disapprove a proposal. + * + * @param fee_paying_account The account paying the fee for the op. + * @param proposal_id The proposal to modify. + * @param delta Members contain approvals to create or remove. In JSON you can leave empty members undefined. + * @param broadcast true if you wish to broadcast the transaction + * @return the signed version of the transaction + */ + signed_transaction approve_proposal( + const string& fee_paying_account, + const string& proposal_id, + const approval_delta& delta, + bool broadcast /* = false */ + ); + + order_book get_order_book( const string& base, const string& quote, unsigned limit = 50); + + /** Creates a new tournament + * @param creator the accout that is paying the fee to create the tournament + * @param options the options detailing the specifics of the tournament + * @return the signed version of the transaction + */ + signed_transaction tournament_create( string creator, tournament_options options, bool broadcast = false ); + + /** Join an existing tournament + * @param payer_account the account that is paying the buy-in and the fee to join the tournament + * @param player_account the account that will be playing in the tournament + * @param buy_in_amount buy_in to pay + * @param buy_in_asset_symbol buy_in asset + * @param tournament_id the tournament the user wishes to join + * @param broadcast true if you wish to broadcast the transaction + * @return the signed version of the transaction + */ + signed_transaction tournament_join( string payer_account, string player_account, tournament_id_type tournament_id, string buy_in_amount, string buy_in_asset_symbol, bool broadcast = false ); + + /** Leave an existing tournament + * @param payer_account the account that is paying the fee + * @param player_account the account that would be playing in the tournament + * @param tournament_id the tournament the user wishes to leave + * @param broadcast true if you wish to broadcast the transaction + * @return the signed version of the transaction + */ + signed_transaction tournament_leave(string payer_account, string player_account, tournament_id_type tournament_id, bool broadcast = false); + + /** Get a list of upcoming tournaments + * @param limit the number of tournaments to return + */ + vector get_upcoming_tournaments(uint32_t limit); + + vector get_tournaments(tournament_id_type stop, + unsigned limit, + tournament_id_type start); + + vector get_tournaments_by_state(tournament_id_type stop, + unsigned limit, + tournament_id_type start, + tournament_state state); + + /** Get specific information about a tournament + * @param tournament_id the ID of the tournament + */ + tournament_object get_tournament(tournament_id_type id); + + /** Play a move in the rock-paper-scissors game + * @param game_id the id of the game + * @param player_account the name of the player + * @param gesture rock, paper, or scissors + * @return the signed version of the transaction + */ + signed_transaction rps_throw(game_id_type game_id, + string player_account, + rock_paper_scissors_gesture gesture, + bool broadcast); + + void dbg_make_uia(string creator, string symbol); + void dbg_make_mia(string creator, string symbol); + void dbg_push_blocks( std::string src_filename, uint32_t count ); + void dbg_generate_blocks( std::string debug_wif_key, uint32_t count ); + void dbg_stream_json_objects( const std::string& filename ); + void dbg_update_object( fc::variant_object update ); + + void flood_network(string prefix, uint32_t number_of_transactions); + + void network_add_nodes( const vector& nodes ); + vector< variant > network_get_connected_peers(); + + /** + * Used to transfer from one set of blinded balances to another + */ + blind_confirmation blind_transfer_help( string from_key_or_label, + string to_key_or_label, + string amount, + string symbol, + bool broadcast = false, + bool to_temp = false ); + + + std::map> get_result_formatters() const; + + fc::signal lock_changed; + std::shared_ptr my; + void encrypt_keys(); +}; + +} } + +FC_REFLECT( graphene::wallet::key_label, (label)(key) ) +FC_REFLECT( graphene::wallet::blind_balance, (amount)(from)(to)(one_time_key)(blinding_factor)(commitment)(used) ) +FC_REFLECT( graphene::wallet::blind_confirmation::output, (label)(pub_key)(decrypted_memo)(confirmation)(auth)(confirmation_receipt) ) +FC_REFLECT( graphene::wallet::blind_confirmation, (trx)(outputs) ) + +FC_REFLECT( graphene::wallet::plain_keys, (keys)(checksum) ) + +FC_REFLECT( graphene::wallet::wallet_data, + (chain_id) + (my_accounts) + (cipher_keys) + (extra_keys) + (pending_account_registrations)(pending_witness_registrations) + (labeled_keys) + (blind_receipts) + (committed_game_moves) + (ws_server) + (ws_user) + (ws_password) + ) +/* + * Copyright (c) 2015 Cryptonomex, Inc., and contributors. + * + * The MIT License + * + * 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: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * 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. + */ +#pragma once + +#include +#include + +using namespace graphene::app; +using namespace graphene::chain; +using namespace graphene::utilities; +using namespace std; + +namespace fc +{ + void to_variant(const account_multi_index_type& accts, variant& vo); + void from_variant(const variant &var, account_multi_index_type &vo); +} + +namespace graphene { namespace wallet { + +typedef uint16_t transaction_handle_type; + +/** + * This class takes a variant and turns it into an object + * of the given type, with the new operator. + */ + +object* create_object( const variant& v ); + +struct plain_keys +{ + map keys; + fc::sha512 checksum; +}; + +struct brain_key_info +{ + string brain_priv_key; + string wif_priv_key; + public_key_type pub_key; +}; + + +/** + * Contains the confirmation receipt the sender must give the receiver and + * the meta data about the receipt that helps the sender identify which receipt is + * for the receiver and which is for the change address. + */ +struct blind_confirmation +{ + struct output + { + string label; + public_key_type pub_key; + stealth_confirmation::memo_data decrypted_memo; + stealth_confirmation confirmation; + authority auth; + string confirmation_receipt; + }; + + signed_transaction trx; + vector outputs; +}; + +struct blind_balance +{ + asset amount; + public_key_type from; ///< the account this balance came from + public_key_type to; ///< the account this balance is logically associated with + public_key_type one_time_key; ///< used to derive the authority key and blinding factor + fc::sha256 blinding_factor; + fc::ecc::commitment_type commitment; + bool used = false; +}; + +struct blind_receipt +{ + std::pair from_date()const { return std::make_pair(from_key,date); } + std::pair to_date()const { return std::make_pair(to_key,date); } + std::tuple to_asset_used()const { return std::make_tuple(to_key,amount.asset_id,used); } + const commitment_type& commitment()const { return data.commitment; } + + fc::time_point date; + public_key_type from_key; + string from_label; + public_key_type to_key; + string to_label; + asset amount; + string memo; + authority control_authority; + stealth_confirmation::memo_data data; + bool used = false; + stealth_confirmation conf; +}; + +struct by_from; +struct by_to; +struct by_to_asset_used; +struct by_commitment; + +typedef multi_index_container< blind_receipt, + indexed_by< + ordered_unique< tag, const_mem_fun< blind_receipt, const commitment_type&, &blind_receipt::commitment > >, + ordered_unique< tag, const_mem_fun< blind_receipt, std::pair, &blind_receipt::to_date > >, + ordered_non_unique< tag, const_mem_fun< blind_receipt, std::tuple, &blind_receipt::to_asset_used > >, + ordered_unique< tag, const_mem_fun< blind_receipt, std::pair, &blind_receipt::from_date > > + > +> blind_receipt_index_type; + + +struct key_label +{ + string label; + public_key_type key; +}; + + +struct by_label; +struct by_key; +typedef multi_index_container< + key_label, + indexed_by< + ordered_unique< tag, member< key_label, string, &key_label::label > >, + ordered_unique< tag, member< key_label, public_key_type, &key_label::key > > + > +> key_label_index_type; + + +struct wallet_data +{ + /** Chain ID this wallet is used with */ + chain_id_type chain_id; + account_multi_index_type my_accounts; + /// @return IDs of all accounts in @ref my_accounts + vector my_account_ids()const + { + vector ids; + ids.reserve(my_accounts.size()); + std::transform(my_accounts.begin(), my_accounts.end(), std::back_inserter(ids), + [](const account_object& ao) { return ao.id; }); + return ids; + } + /// Add acct to @ref my_accounts, or update it if it is already in @ref my_accounts + /// @return true if the account was newly inserted; false if it was only updated + bool update_account(const account_object& acct) + { + auto& idx = my_accounts.get(); + auto itr = idx.find(acct.get_id()); + if( itr != idx.end() ) + { + idx.replace(itr, acct); + return false; + } else { + idx.insert(acct); + return true; + } + } + + /** encrypted keys */ + vector cipher_keys; + + /** map an account to a set of extra keys that have been imported for that account */ + map > extra_keys; + + // map of account_name -> base58_private_key for + // incomplete account regs + map > pending_account_registrations; + map pending_witness_registrations; + + key_label_index_type labeled_keys; + blind_receipt_index_type blind_receipts; + + std::map committed_game_moves; + + string ws_server = "ws://localhost:8090"; + string ws_user; + string ws_password; +}; + +struct exported_account_keys +{ + string account_name; + vector> encrypted_private_keys; + vector public_keys; +}; + +struct exported_keys +{ + fc::sha512 password_checksum; + vector account_keys; +}; + +struct approval_delta +{ + vector active_approvals_to_add; + vector active_approvals_to_remove; + vector owner_approvals_to_add; + vector owner_approvals_to_remove; + vector key_approvals_to_add; + vector key_approvals_to_remove; +}; + +struct worker_vote_delta +{ + flat_set vote_for; + flat_set vote_against; + flat_set vote_abstain; +}; + +struct signed_block_with_info : public signed_block +{ + signed_block_with_info(); + signed_block_with_info( const signed_block& block ); + signed_block_with_info( const signed_block_with_info& block ) = default; + + block_id_type block_id; + public_key_type signing_key; + vector< transaction_id_type > transaction_ids; +}; + +struct vesting_balance_object_with_info : public vesting_balance_object +{ + vesting_balance_object_with_info(); + vesting_balance_object_with_info( const vesting_balance_object& vbo, fc::time_point_sec now ); + vesting_balance_object_with_info( const vesting_balance_object_with_info& vbo ) = default; + + /** + * How much is allowed to be withdrawn. + */ + asset allowed_withdraw; + + /** + * The time at which allowed_withdrawal was calculated. + */ + fc::time_point_sec allowed_withdraw_time; +}; + +namespace detail { +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 + * performs minimal caching. This API could be provided locally to be used by a web interface. + */ +class wallet_api +{ + public: + wallet_api( const wallet_data& initial_data, fc::api rapi ); + virtual ~wallet_api(); + + bool copy_wallet_file( string destination_filename ); + + fc::ecc::private_key derive_private_key(const std::string& prefix_string, int sequence_number) const; + + variant info(); + /** Returns info such as client version, git version of graphene/fc, version of boost, openssl. + * @returns compile time info and client and dependencies versions + */ + variant_object about() const; + optional get_block( uint32_t num ); + /** Returns the number of accounts registered on the blockchain + * @returns the number of registered accounts + */ + uint64_t get_account_count()const; + /** Lists all accounts controlled by this wallet. + * This returns a list of the full account objects for all accounts whose private keys + * we possess. + * @returns a list of account objects + */ + vector list_my_accounts(); + /** Lists all accounts registered in the blockchain. + * This returns a list of all account names and their account ids, sorted by account name. + * + * Use the \c lowerbound and limit parameters to page through the list. To retrieve all accounts, + * start by setting \c lowerbound to the empty string \c "", and then each iteration, pass + * the last account name returned as the \c lowerbound for the next \c list_accounts() call. + * + * @param lowerbound the name of the first account to return. If the named account does not exist, + * the list will start at the account that comes after \c lowerbound + * @param limit the maximum number of accounts to return (max: 1000) + * @returns a list of accounts mapping account names to account ids + */ + map list_accounts(const string& lowerbound, uint32_t limit); + /** List the balances of an account. + * Each account can have multiple balances, one for each type of asset owned by that + * account. The returned list will only contain assets for which the account has a + * nonzero balance + * @param id the name or id of the account whose balances you want + * @returns a list of the given account's balances + */ + vector list_account_balances(const string& id); + /** Lists all assets registered on the blockchain. + * + * To list all assets, pass the empty string \c "" for the lowerbound to start + * at the beginning of the list, and iterate as necessary. + * + * @param lowerbound the symbol of the first asset to include in the list. + * @param limit the maximum number of assets to return (max: 100) + * @returns the list of asset objects, ordered by symbol + */ + vector list_assets(const string& lowerbound, uint32_t limit)const; + + /** Returns the most recent operations on the named account. + * + * This returns a list of operation history objects, which describe activity on the account. + * + * @note this API doesn't give a way to retrieve more than the most recent 100 transactions, + * you can interface directly with the blockchain to get more history + * @param name the name or id of the account + * @param limit the number of entries to return (starting from the most recent) (max 100) + * @returns a list of \c operation_history_objects + */ + vector get_account_history(string name, int limit)const; + + + vector get_market_history(string symbol, string symbol2, uint32_t bucket)const; + vector get_limit_orders(string a, string b, uint32_t limit)const; + vector get_call_orders(string a, uint32_t limit)const; + vector get_settle_orders(string a, uint32_t limit)const; + + /** Returns the block chain's slowly-changing settings. + * This object contains all of the properties of the blockchain that are fixed + * or that change only once per maintenance interval (daily) such as the + * current list of witnesses, committee_members, block interval, etc. + * @see \c get_dynamic_global_properties() for frequently changing properties + * @returns the global properties + */ + global_property_object get_global_properties() const; + + /** Returns the block chain's rapidly-changing properties. + * The returned object contains information that changes every block interval + * such as the head block number, the next witness, etc. + * @see \c get_global_properties() for less-frequently changing properties + * @returns the dynamic global properties + */ + dynamic_global_property_object get_dynamic_global_properties() const; + + /** Returns information about the given account. + * + * @param account_name_or_id the name or id of the account to provide information about + * @returns the public account data stored in the blockchain + */ + account_object get_account(string account_name_or_id) const; + + /** Returns information about the given asset. + * @param asset_name_or_id the symbol or id of the asset in question + * @returns the information about the asset stored in the block chain + */ + asset_object get_asset(string asset_name_or_id) const; + + /** Returns the BitAsset-specific data for a given asset. + * Market-issued assets's behavior are determined both by their "BitAsset Data" and + * their basic asset data, as returned by \c get_asset(). + * @param asset_name_or_id the symbol or id of the BitAsset in question + * @returns the BitAsset-specific data for this asset + */ + asset_bitasset_data_object get_bitasset_data(string asset_name_or_id)const; + + /** Lookup the id of a named account. + * @param account_name_or_id the name of the account to look up + * @returns the id of the named account + */ + account_id_type get_account_id(string account_name_or_id) const; + + /** + * Lookup the id of a named asset. + * @param asset_name_or_id the symbol of an asset to look up + * @returns the id of the given asset + */ + asset_id_type get_asset_id(string asset_name_or_id) const; + + /** + * Returns the blockchain object corresponding to the given id. + * + * This generic function can be used to retrieve any object from the blockchain + * that is assigned an ID. Certain types of objects have specialized convenience + * functions to return their objects -- e.g., assets have \c get_asset(), accounts + * have \c get_account(), but this function will work for any object. + * + * @param id the id of the object to return + * @returns the requested object + */ + variant get_object(object_id_type id) const; + + /** Returns the current wallet filename. + * + * This is the filename that will be used when automatically saving the wallet. + * + * @see set_wallet_filename() + * @return the wallet filename + */ + string get_wallet_filename() const; + + /** + * Get the WIF private key corresponding to a public key. The + * private key must already be in the wallet. + */ + string get_private_key( public_key_type pubkey )const; + + /** + * @ingroup Transaction Builder API + */ + transaction_handle_type begin_builder_transaction(); + /** + * @ingroup Transaction Builder API + */ + void add_operation_to_builder_transaction(transaction_handle_type transaction_handle, const operation& op); + /** + * @ingroup Transaction Builder API + */ + void replace_operation_in_builder_transaction(transaction_handle_type handle, + unsigned operation_index, + const operation& new_op); + /** + * @ingroup Transaction Builder API + */ + asset set_fees_on_builder_transaction(transaction_handle_type handle, string fee_asset = GRAPHENE_SYMBOL); + /** + * @ingroup Transaction Builder API + */ + transaction preview_builder_transaction(transaction_handle_type handle); + /** + * @ingroup Transaction Builder API + */ + signed_transaction sign_builder_transaction(transaction_handle_type transaction_handle, bool broadcast = true); + /** + * @ingroup Transaction Builder API + */ + signed_transaction propose_builder_transaction( + transaction_handle_type handle, + time_point_sec expiration = time_point::now() + fc::minutes(1), + uint32_t review_period_seconds = 0, + bool broadcast = true + ); + + signed_transaction propose_builder_transaction2( + transaction_handle_type handle, + string account_name_or_id, + time_point_sec expiration = time_point::now() + fc::minutes(1), + uint32_t review_period_seconds = 0, + bool broadcast = true + ); + + /** + * @ingroup Transaction Builder API + */ + void remove_builder_transaction(transaction_handle_type handle); + + /** Checks whether the wallet has just been created and has not yet had a password set. + * + * Calling \c set_password will transition the wallet to the locked state. + * @return true if the wallet is new + * @ingroup Wallet Management + */ + bool is_new()const; + + /** Checks whether the wallet is locked (is unable to use its private keys). + * + * This state can be changed by calling \c lock() or \c unlock(). + * @return true if the wallet is locked + * @ingroup Wallet Management + */ + bool is_locked()const; + + /** Locks the wallet immediately. + * @ingroup Wallet Management + */ + void lock(); + + /** Unlocks the wallet. + * + * The wallet remain unlocked until the \c lock is called + * or the program exits. + * @param password the password previously set with \c set_password() + * @ingroup Wallet Management + */ + void unlock(string password); + + /** Sets a new password on the wallet. + * + * The wallet must be either 'new' or 'unlocked' to + * execute this command. + * @ingroup Wallet Management + */ + void set_password(string password); + + /** Dumps all private keys owned by the wallet. + * + * The keys are printed in WIF format. You can import these keys into another wallet + * using \c import_key() + * @returns a map containing the private keys, indexed by their public key + */ + map dump_private_keys(); + + /** Returns a list of all commands supported by the wallet API. + * + * This lists each command, along with its arguments and return types. + * For more detailed help on a single command, use \c get_help() + * + * @returns a multi-line string suitable for displaying on a terminal + */ + string help()const; + + /** Returns detailed help on a single API command. + * @param method the name of the API command you want help with + * @returns a multi-line string suitable for displaying on a terminal + */ + string gethelp(const string& method)const; + + /** Loads a specified Graphene wallet. + * + * The current wallet is closed before the new wallet is loaded. + * + * @warning This does not change the filename that will be used for future + * wallet writes, so this may cause you to overwrite your original + * wallet unless you also call \c set_wallet_filename() + * + * @param wallet_filename the filename of the wallet JSON file to load. + * If \c wallet_filename is empty, it reloads the + * existing wallet file + * @returns true if the specified wallet is loaded + */ + bool load_wallet_file(string wallet_filename = ""); + + /** Saves the current wallet to the given filename. + * + * @warning This does not change the wallet filename that will be used for future + * writes, so think of this function as 'Save a Copy As...' instead of + * 'Save As...'. Use \c set_wallet_filename() to make the filename + * persist. + * @param wallet_filename the filename of the new wallet JSON file to create + * or overwrite. If \c wallet_filename is empty, + * save to the current filename. + */ + void save_wallet_file(string wallet_filename = ""); + + /** Sets the wallet filename used for future writes. + * + * This does not trigger a save, it only changes the default filename + * that will be used the next time a save is triggered. + * + * @param wallet_filename the new filename to use for future saves + */ + void set_wallet_filename(string wallet_filename); + + /** Suggests a safe brain key to use for creating your account. + * \c create_account_with_brain_key() requires you to specify a 'brain key', + * a long passphrase that provides enough entropy to generate cyrptographic + * keys. This function will suggest a suitably random string that should + * be easy to write down (and, with effort, memorize). + * @returns a suggested brain_key + */ + brain_key_info suggest_brain_key()const; + + /** + * @param role - active | owner | memo + */ + pair get_private_key_from_password( string password, string account, string role )const; /** Converts a signed_transaction in JSON form to its binary representation. * @@ -1756,3 +3354,163 @@ FC_API( graphene::wallet::wallet_api, (get_tournament) (get_order_book) ) + +FC_REFLECT( graphene::wallet::brain_key_info, + (brain_priv_key) + (wif_priv_key) + (pub_key) + ) + +FC_REFLECT( graphene::wallet::exported_account_keys, (account_name)(encrypted_private_keys)(public_keys) ) + +FC_REFLECT( graphene::wallet::exported_keys, (password_checksum)(account_keys) ) + +FC_REFLECT( graphene::wallet::blind_receipt, + (date)(from_key)(from_label)(to_key)(to_label)(amount)(memo)(control_authority)(data)(used)(conf) ) + +FC_REFLECT( graphene::wallet::approval_delta, + (active_approvals_to_add) + (active_approvals_to_remove) + (owner_approvals_to_add) + (owner_approvals_to_remove) + (key_approvals_to_add) + (key_approvals_to_remove) +) + +FC_REFLECT( graphene::wallet::worker_vote_delta, + (vote_for) + (vote_against) + (vote_abstain) +) + +FC_REFLECT_DERIVED( graphene::wallet::signed_block_with_info, (graphene::chain::signed_block), + (block_id)(signing_key)(transaction_ids) ) + +FC_REFLECT_DERIVED( graphene::wallet::vesting_balance_object_with_info, (graphene::chain::vesting_balance_object), + (allowed_withdraw)(allowed_withdraw_time) ) + +FC_REFLECT( graphene::wallet::operation_detail, + (memo)(description)(op) ) + +FC_API( graphene::wallet::wallet_api, + (help) + (gethelp) + (info) + (about) + (begin_builder_transaction) + (add_operation_to_builder_transaction) + (replace_operation_in_builder_transaction) + (set_fees_on_builder_transaction) + (preview_builder_transaction) + (sign_builder_transaction) + (propose_builder_transaction) + (propose_builder_transaction2) + (remove_builder_transaction) + (is_new) + (is_locked) + (lock)(unlock)(set_password) + (dump_private_keys) + (list_my_accounts) + (list_accounts) + (list_account_balances) + (list_assets) + (import_key) + (import_accounts) + (import_account_keys) + (import_balance) + (suggest_brain_key) + (get_private_key_from_password) + (register_account) + (upgrade_account) + (create_account_with_brain_key) + (sell_asset) + (sell) + (buy) + (borrow_asset) + (cancel_order) + (transfer) + (transfer2) + (get_transaction_id) + (create_asset) + (update_asset) + (update_bitasset) + (update_dividend_asset) + (update_asset_feed_producers) + (publish_asset_feed) + (issue_asset) + (get_asset) + (get_bitasset_data) + (fund_asset_fee_pool) + (reserve_asset) + (global_settle_asset) + (settle_asset) + (whitelist_account) + (create_committee_member) + (get_witness) + (get_committee_member) + (list_witnesses) + (list_committee_members) + (create_witness) + (update_witness) + (create_worker) + (update_worker_votes) + (get_vesting_balances) + (withdraw_vesting) + (vote_for_committee_member) + (vote_for_witness) + (set_voting_proxy) + (set_desired_witness_and_committee_member_count) + (get_account) + (get_account_id) + (get_block) + (get_account_count) + (get_account_history) + (get_market_history) + (get_global_properties) + (get_dynamic_global_properties) + (get_object) + (get_private_key) + (load_wallet_file) + (normalize_brain_key) + (get_limit_orders) + (get_call_orders) + (get_settle_orders) + (save_wallet_file) + (serialize_transaction) + (sign_transaction) + (get_prototype_operation) + (propose_parameter_change) + (propose_fee_change) + (propose_dividend_asset_update) + (approve_proposal) + (dbg_make_uia) + (dbg_make_mia) + (dbg_push_blocks) + (dbg_generate_blocks) + (dbg_stream_json_objects) + (dbg_update_object) + (flood_network) + (network_add_nodes) + (network_get_connected_peers) + (set_key_label) + (get_key_label) + (get_public_key) + (get_blind_accounts) + (get_my_blind_accounts) + (get_blind_balances) + (create_blind_account) + (transfer_to_blind) + (transfer_from_blind) + (blind_transfer) + (blind_history) + (receive_blind_transfer) + (tournament_create) + (tournament_join) + (tournament_leave) + (rps_throw) + (get_upcoming_tournaments) + (get_tournaments) + (get_tournaments_by_state) + (get_tournament) + (get_order_book) + )