2013-02-26 04:56:48 -08:00
#!/usr/bin/env python
#
# Electrum - lightweight Bitcoin client
# Copyright (C) 2011 thomasv@gitorious
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2014-03-15 03:04:11 -07:00
import time
2013-02-26 04:56:48 -08:00
from util import *
from bitcoin import *
from decimal import Decimal
import bitcoin
2013-10-21 13:19:30 -07:00
from transaction import Transaction
2013-10-03 03:39:42 -07:00
class Command :
def __init__ ( self , name , min_args , max_args , requires_network , requires_wallet , requires_password , description , syntax = ' ' , options_syntax = ' ' ) :
self . name = name
self . min_args = min_args
self . max_args = max_args
self . requires_network = requires_network
self . requires_wallet = requires_wallet
self . requires_password = requires_password
self . description = description
self . syntax = syntax
self . options = options_syntax
2013-03-01 04:33:11 -08:00
known_commands = { }
2013-10-03 03:39:42 -07:00
def register_command ( * args ) :
global known_commands
name = args [ 0 ]
known_commands [ name ] = Command ( * args )
2013-03-01 04:33:11 -08:00
2013-02-26 07:29:44 -08:00
2013-10-18 03:28:58 -07:00
payto_options = ' --fee, -f: set transaction fee \n --fromaddr, -F: send from address - \n --changeaddr, -c: send change to address '
2013-10-24 00:45:41 -07:00
listaddr_options = " -a: show all addresses, including change addresses \n -l: include labels in results "
2013-04-22 12:19:13 -07:00
restore_options = " accepts a seed or master public key. "
2013-10-03 03:39:42 -07:00
mksendmany_syntax = ' mksendmanytx <recipient> <amount> [<recipient> <amount> ...] '
payto_syntax = " payto <recipient> <amount> [label] \n <recipient> can be a bitcoin address or a label "
paytomany_syntax = " paytomany <recipient> <amount> [<recipient> <amount> ...] \n <recipient> can be a bitcoin address or a label "
signmessage_syntax = ' signmessage <address> <message> \n If you want to lead or end a message with spaces, or want double spaces inside the message make sure you quote the string. I.e. " Hello This is a weird String " '
verifymessage_syntax = ' verifymessage <address> <signature> <message> \n If you want to lead or end a message with spaces, or want double spaces inside the message make sure you quote the string. I.e. " Hello This is a weird String " '
# command
# requires_network
# requires_wallet
# requires_password
register_command ( ' contacts ' , 0 , 0 , False , True , False , ' Show your list of contacts ' )
register_command ( ' create ' , 0 , 0 , False , True , False , ' Create a new wallet ' )
register_command ( ' createmultisig ' , 2 , 2 , False , True , False , ' similar to bitcoind \' s command ' )
register_command ( ' createrawtransaction ' , 2 , 2 , False , True , False , ' similar to bitcoind \' s command ' )
register_command ( ' deseed ' , 0 , 0 , False , True , False , ' Remove seed from wallet, creating a seedless, watching-only wallet. ' )
register_command ( ' decoderawtransaction ' , 1 , 1 , False , False , False , ' similar to bitcoind \' s command ' )
register_command ( ' dumpprivkey ' , 1 , 1 , False , True , True , ' Dumps a specified private key for a given address ' , ' dumpprivkey <bitcoin address> ' )
register_command ( ' dumpprivkeys ' , 0 , 0 , False , True , True , ' dump all private keys ' )
register_command ( ' freeze ' , 1 , 1 , False , True , True , ' Freeze the funds at one of your wallet \' s addresses ' , ' freeze <address> ' )
register_command ( ' getbalance ' , 0 , 1 , True , True , False , ' Return the balance of your wallet, or of one account in your wallet ' , ' getbalance [<account>] ' )
register_command ( ' getservers ' , 0 , 0 , True , False , False , ' Return the list of available servers ' )
2014-01-23 08:06:47 -08:00
register_command ( ' getversion ' , 0 , 0 , False , False , False , ' Return the version of your client ' , ' getversion ' )
register_command ( ' getaddressbalance ' , 1 , 1 , True , False , False , ' Return the balance of an address ' , ' getaddressbalance <address> ' )
register_command ( ' getaddresshistory ' , 1 , 1 , True , False , False , ' Return the transaction history of a wallet address ' , ' getaddresshistory <address> ' )
2013-11-22 07:55:43 -08:00
register_command ( ' getconfig ' , 1 , 1 , False , False , False , ' Return a configuration variable ' , ' getconfig <name> ' )
2013-10-03 04:31:59 -07:00
register_command ( ' getpubkeys ' , 1 , 1 , False , True , False , ' Return the public keys for a wallet address ' , ' getpubkeys <bitcoin address> ' )
2014-01-13 12:27:31 -08:00
register_command ( ' getrawtransaction ' , 1 , 1 , True , False , False , ' Retrieve a transaction ' , ' getrawtransaction <txhash> ' )
2013-10-03 03:39:42 -07:00
register_command ( ' getseed ' , 0 , 0 , False , True , True , ' Print the generation seed of your wallet. ' )
2013-11-03 05:14:35 -08:00
register_command ( ' getmpk ' , 0 , 0 , False , True , False , ' Return your wallet \' s master public key ' , ' getmpk ' )
2013-10-03 03:39:42 -07:00
register_command ( ' help ' , 0 , 1 , False , False , False , ' Prints this help ' )
register_command ( ' history ' , 0 , 0 , True , True , False , ' Returns the transaction history of your wallet ' )
register_command ( ' importprivkey ' , 1 , 1 , False , True , True , ' Import a private key ' , ' importprivkey <privatekey> ' )
2013-10-24 00:45:41 -07:00
register_command ( ' listaddresses ' , 2 , 2 , False , True , False , ' Returns your list of addresses. ' , ' ' , listaddr_options )
2014-03-02 01:31:34 -08:00
register_command ( ' listunspent ' , 0 , 0 , True , True , False , ' Returns the list of unspent inputs in your wallet. ' )
register_command ( ' getaddressunspent ' , 1 , 1 , True , False , False , ' Returns the list of unspent inputs for an address. ' )
2013-10-03 03:39:42 -07:00
register_command ( ' mktx ' , 5 , 5 , False , True , True , ' Create a signed transaction ' , ' mktx <recipient> <amount> [label] ' , payto_options )
register_command ( ' mksendmanytx ' , 4 , 4 , False , True , True , ' Create a signed transaction ' , mksendmany_syntax , payto_options )
register_command ( ' payto ' , 5 , 5 , True , True , True , ' Create and broadcast a transaction. ' , payto_syntax , payto_options )
register_command ( ' paytomany ' , 4 , 4 , True , True , True , ' Create and broadcast a transaction. ' , paytomany_syntax , payto_options )
register_command ( ' password ' , 0 , 0 , False , True , True , ' Change your password ' )
register_command ( ' restore ' , 0 , 0 , True , True , False , ' Restore a wallet ' , ' ' , restore_options )
2013-11-22 07:55:43 -08:00
register_command ( ' setconfig ' , 2 , 2 , False , False , False , ' Set a configuration variable ' , ' setconfig <name> <value> ' )
2013-10-03 03:39:42 -07:00
register_command ( ' setlabel ' , 2 , - 1 , False , True , False , ' Assign a label to an item ' , ' setlabel <tx_hash> <label> ' )
register_command ( ' sendrawtransaction ' , 1 , 1 , True , False , False , ' Broadcasts a transaction to the network. ' , ' sendrawtransaction <tx in hexadecimal> ' )
register_command ( ' signrawtransaction ' , 1 , 3 , False , True , True , ' similar to bitcoind \' s command ' )
register_command ( ' signmessage ' , 2 , - 1 , False , True , True , ' Sign a message with a key ' , signmessage_syntax )
register_command ( ' unfreeze ' , 1 , 1 , False , True , False , ' Unfreeze the funds at one of your wallet \' s address ' , ' unfreeze <address> ' )
register_command ( ' validateaddress ' , 1 , 1 , False , False , False , ' Check that the address is valid ' , ' validateaddress <address> ' )
register_command ( ' verifymessage ' , 3 , - 1 , False , False , False , ' Verifies a signature ' , verifymessage_syntax )
2013-02-26 07:29:44 -08:00
2014-03-16 08:35:12 -07:00
#register_command('encrypt', 2,-1, False, False, False, 'encrypt a message with pubkey','encrypt <pubkey> <message>')
#register_command('decrypt', 2,-1, False, True, True, 'decrypt a message encrypted with pubkey','decrypt <pubkey> <message>')
2014-03-11 06:11:45 -07:00
register_command ( ' daemon ' , 1 , 1 , True , False , False , ' <stop|status> ' )
2014-01-30 06:16:49 -08:00
register_command ( ' getproof ' , 1 , 1 , True , False , False , ' get merkle proof ' , ' getproof <address> ' )
2014-03-02 02:02:45 -08:00
register_command ( ' getutxoaddress ' , 2 , 2 , True , False , False , ' get the address of an unspent transaction output ' , ' getutxoaddress <txid> <pos> ' )
2014-01-26 11:46:43 -08:00
2013-03-01 04:33:11 -08:00
2013-02-26 07:29:44 -08:00
2013-02-26 04:56:48 -08:00
class Commands :
2013-09-15 02:19:48 -07:00
def __init__ ( self , wallet , network , callback = None ) :
2013-02-26 04:56:48 -08:00
self . wallet = wallet
2013-09-15 02:19:48 -07:00
self . network = network
2013-02-27 03:40:16 -08:00
self . _callback = callback
2013-03-13 06:29:50 -07:00
self . password = None
2013-02-26 04:56:48 -08:00
2014-01-23 08:06:47 -08:00
2013-02-26 04:56:48 -08:00
def _run ( self , method , args , password_getter ) :
2013-10-03 03:39:42 -07:00
cmd = known_commands [ method ]
if cmd . requires_password and self . wallet . use_encryption :
2013-02-26 06:09:43 -08:00
self . password = apply ( password_getter , ( ) )
2013-11-11 22:03:20 -08:00
f = getattr ( self , method )
result = f ( * args )
2013-02-26 06:09:43 -08:00
self . password = None
2013-02-27 03:40:16 -08:00
if self . _callback :
apply ( self . _callback , ( ) )
2013-02-26 08:57:48 -08:00
return result
2013-02-26 04:56:48 -08:00
2014-01-23 08:06:47 -08:00
2013-03-01 04:33:11 -08:00
def getaddresshistory ( self , addr ) :
2014-01-23 08:06:47 -08:00
return self . network . synchronous_get ( [ ( ' blockchain.address.get_history ' , [ addr ] ) ] ) [ 0 ]
2014-01-26 11:46:43 -08:00
def daemon ( self , arg ) :
if arg == ' stop ' :
return self . network . stop ( )
elif arg == ' status ' :
return {
' server ' : self . network . main_server ( ) ,
' connected ' : self . network . is_connected ( )
}
else :
return " unknown command \" %s \" " % arg
2014-01-23 08:06:47 -08:00
2013-02-26 04:56:48 -08:00
def listunspent ( self ) :
2013-02-27 00:09:58 -08:00
import copy
l = copy . deepcopy ( self . wallet . get_unspent_coins ( ) )
2013-02-28 21:43:08 -08:00
for i in l : i [ " value " ] = str ( Decimal ( i [ " value " ] ) / 100000000 )
2013-02-26 08:57:48 -08:00
return l
2013-02-26 04:56:48 -08:00
2014-01-23 08:06:47 -08:00
def getaddressunspent ( self , addr ) :
2014-01-26 11:46:43 -08:00
return self . network . synchronous_get ( [ ( ' blockchain.address.listunspent ' , [ addr ] ) ] ) [ 0 ]
2014-01-23 08:06:47 -08:00
2014-03-02 02:02:45 -08:00
def getutxoaddress ( self , txid , num ) :
r = self . network . synchronous_get ( [ ( ' blockchain.utxo.get_address ' , [ txid , num ] ) ] )
if r :
return { ' address ' : r [ 0 ] }
2014-01-30 06:16:49 -08:00
2013-02-26 04:56:48 -08:00
def createrawtransaction ( self , inputs , outputs ) :
2014-03-02 10:24:44 -08:00
inputs = map ( lambda i : { ' prevout_hash ' : i [ ' txid ' ] , ' prevout_n ' : i [ ' vout ' ] } , inputs )
2013-02-26 04:56:48 -08:00
outputs = map ( lambda x : ( x [ 0 ] , int ( 1e8 * x [ 1 ] ) ) , outputs . items ( ) )
tx = Transaction . from_io ( inputs , outputs )
2013-09-14 12:53:56 -07:00
return tx
2013-02-26 04:56:48 -08:00
2014-03-02 10:24:44 -08:00
2013-02-26 06:09:43 -08:00
def signrawtransaction ( self , raw_tx , input_info , private_keys ) :
2013-02-26 04:56:48 -08:00
tx = Transaction ( raw_tx )
2013-02-27 07:15:56 -08:00
self . wallet . signrawtransaction ( tx , input_info , private_keys , self . password )
2013-09-14 12:53:56 -07:00
return tx
2013-02-26 04:56:48 -08:00
def decoderawtransaction ( self , raw ) :
tx = Transaction ( raw )
2013-02-26 08:57:48 -08:00
return tx . deserialize ( )
2013-02-26 04:56:48 -08:00
def sendrawtransaction ( self , raw ) :
tx = Transaction ( raw )
2013-12-21 09:29:09 -08:00
return self . network . synchronous_get ( [ ( ' blockchain.transaction.broadcast ' , [ str ( tx ) ] ) ] ) [ 0 ]
2013-02-26 04:56:48 -08:00
def createmultisig ( self , num , pubkeys ) :
assert isinstance ( pubkeys , list )
2013-08-17 00:53:46 -07:00
redeem_script = Transaction . multisig_script ( pubkeys , num )
address = hash_160_to_bc_address ( hash_160 ( redeem_script . decode ( ' hex ' ) ) , 5 )
return { ' address ' : address , ' redeemScript ' : redeem_script }
2013-02-26 04:56:48 -08:00
def freeze ( self , addr ) :
2013-02-26 08:57:48 -08:00
return self . wallet . freeze ( addr )
2013-02-26 04:56:48 -08:00
def unfreeze ( self , addr ) :
2013-02-26 08:57:48 -08:00
return self . wallet . unfreeze ( addr )
2013-02-26 04:56:48 -08:00
2013-02-26 06:09:43 -08:00
def dumpprivkey ( self , addr ) :
2013-02-26 08:57:48 -08:00
return self . wallet . get_private_key ( addr , self . password )
2013-02-26 07:03:04 -08:00
2013-02-27 01:36:52 -08:00
def dumpprivkeys ( self , addresses = None ) :
if addresses is None :
2013-03-02 02:40:17 -08:00
addresses = self . wallet . addresses ( True )
2013-09-10 13:07:09 -07:00
return [ self . wallet . get_private_key ( address , self . password ) for address in addresses ]
2013-02-26 04:56:48 -08:00
2013-10-03 04:31:59 -07:00
def validateaddress ( self , addr ) :
2013-03-01 05:27:56 -08:00
isvalid = is_valid ( addr )
out = { ' isvalid ' : isvalid }
if isvalid :
2013-02-26 04:56:48 -08:00
out [ ' address ' ] = addr
2013-11-04 03:41:43 -08:00
return out
2013-10-03 04:31:59 -07:00
def getpubkeys ( self , addr ) :
out = { ' address ' : addr }
2014-03-03 01:39:10 -08:00
out [ ' pubkeys ' ] = self . wallet . getpubkeys ( addr )
2013-02-26 08:57:48 -08:00
return out
2013-02-26 04:56:48 -08:00
2014-03-03 01:39:10 -08:00
2013-04-16 07:05:45 -07:00
def getbalance ( self , account = None ) :
if account is None :
2013-02-26 04:56:48 -08:00
c , u = self . wallet . get_balance ( )
else :
2013-04-16 07:05:45 -07:00
c , u = self . wallet . get_account_balance ( account )
out = { " confirmed " : str ( Decimal ( c ) / 100000000 ) }
if u : out [ " unconfirmed " ] = str ( Decimal ( u ) / 100000000 )
return out
2013-02-27 01:24:53 -08:00
2013-04-16 07:05:45 -07:00
def getaddressbalance ( self , addr ) :
2014-03-02 01:31:34 -08:00
out = self . network . synchronous_get ( [ ( ' blockchain.address.get_balance ' , [ addr ] ) ] ) [ 0 ]
out [ " confirmed " ] = str ( Decimal ( out [ " confirmed " ] ) / 100000000 )
out [ " unconfirmed " ] = str ( Decimal ( out [ " unconfirmed " ] ) / 100000000 )
return out
2013-02-26 04:56:48 -08:00
2014-01-29 07:48:24 -08:00
def getproof ( self , addr ) :
p = self . network . synchronous_get ( [ ( ' blockchain.address.get_proof ' , [ addr ] ) ] ) [ 0 ]
out = [ ]
for i , s in p :
out . append ( i )
return out
2013-10-02 04:50:36 -07:00
def getservers ( self ) :
2014-03-15 03:04:11 -07:00
while not self . network . is_up_to_date ( ) :
time . sleep ( 0.1 )
2013-10-02 04:50:36 -07:00
return self . network . get_servers ( )
2013-02-26 04:56:48 -08:00
2013-12-01 05:38:27 -08:00
def getversion ( self ) :
2013-12-01 00:42:22 -08:00
import electrum
return electrum . ELECTRUM_VERSION
2013-11-03 05:14:35 -08:00
def getmpk ( self ) :
return self . wallet . get_master_public_key ( )
2013-03-01 02:25:50 -08:00
def getseed ( self ) :
2013-10-26 02:54:11 -07:00
mnemonic = self . wallet . get_mnemonic ( self . password )
seed = self . wallet . get_seed ( self . password )
return { ' mnemonic ' : mnemonic , ' seed ' : seed , ' version ' : self . wallet . seed_version }
2013-02-26 04:56:48 -08:00
def importprivkey ( self , sec ) :
try :
2013-03-06 03:32:11 -08:00
addr = self . wallet . import_key ( sec , self . password )
2013-02-27 01:24:53 -08:00
out = " Keypair imported: " , addr
2013-11-09 20:21:02 -08:00
except Exception as e :
2013-02-27 01:24:53 -08:00
out = " Error: Keypair import failed: " + str ( e )
return out
2013-02-26 04:56:48 -08:00
2013-03-01 02:25:50 -08:00
def signmessage ( self , address , message ) :
2013-02-26 08:57:48 -08:00
return self . wallet . sign_message ( address , message , self . password )
2013-02-26 04:56:48 -08:00
2013-03-01 02:25:50 -08:00
def verifymessage ( self , address , signature , message ) :
2013-10-05 12:15:48 -07:00
return bitcoin . verify_message ( address , signature , message )
2013-02-26 04:56:48 -08:00
2013-04-08 15:36:26 -07:00
def _mktx ( self , outputs , fee = None , change_addr = None , domain = None ) :
2013-03-01 05:08:51 -08:00
2013-04-08 15:36:26 -07:00
for to_address , amount in outputs :
if not is_valid ( to_address ) :
2013-11-09 20:21:02 -08:00
raise Exception ( " Invalid Bitcoin address " , to_address )
2013-03-01 05:27:56 -08:00
if change_addr :
if not is_valid ( change_addr ) :
2013-11-09 20:21:02 -08:00
raise Exception ( " Invalid Bitcoin address " , change_addr )
2013-03-01 05:27:56 -08:00
2013-04-05 07:00:34 -07:00
if domain is not None :
for addr in domain :
if not is_valid ( addr ) :
2013-11-09 20:21:02 -08:00
raise Exception ( " invalid Bitcoin address " , addr )
2013-03-01 05:27:56 -08:00
2013-04-05 07:00:34 -07:00
if not self . wallet . is_mine ( addr ) :
2013-11-09 20:21:02 -08:00
raise Exception ( " address not in wallet " , addr )
2013-03-01 05:08:51 -08:00
2013-02-26 04:56:48 -08:00
for k , v in self . wallet . labels . items ( ) :
if change_addr and v == change_addr :
change_addr = k
2013-04-08 15:36:26 -07:00
final_outputs = [ ]
for to_address , amount in outputs :
for k , v in self . wallet . labels . items ( ) :
if v == to_address :
to_address = k
print_msg ( " alias " , to_address )
break
amount = int ( 100000000 * amount )
final_outputs . append ( ( to_address , amount ) )
2013-03-03 01:23:52 -08:00
if fee : fee = int ( 100000000 * fee )
2013-04-08 15:36:26 -07:00
return self . wallet . mktx ( final_outputs , self . password , fee , change_addr , domain )
2013-02-26 06:13:01 -08:00
2013-02-26 04:56:48 -08:00
2013-04-05 07:00:34 -07:00
def mktx ( self , to_address , amount , fee = None , change_addr = None , domain = None ) :
2013-04-08 15:36:26 -07:00
tx = self . _mktx ( [ ( to_address , amount ) ] , fee , change_addr , domain )
2013-09-14 12:07:54 -07:00
return tx
2013-04-08 15:36:26 -07:00
def mksendmanytx ( self , outputs , fee = None , change_addr = None , domain = None ) :
tx = self . _mktx ( outputs , fee , change_addr , domain )
2013-09-14 12:53:56 -07:00
return tx
2013-02-26 04:56:48 -08:00
2013-04-05 07:00:34 -07:00
def payto ( self , to_address , amount , fee = None , change_addr = None , domain = None ) :
2013-04-08 15:36:26 -07:00
tx = self . _mktx ( [ ( to_address , amount ) ] , fee , change_addr , domain )
2013-03-06 03:40:13 -08:00
r , h = self . wallet . sendtx ( tx )
2013-02-26 08:57:48 -08:00
return h
2013-02-26 04:56:48 -08:00
2013-04-08 15:40:51 -07:00
def paytomany ( self , outputs , fee = None , change_addr = None , domain = None ) :
tx = self . _mktx ( outputs , fee , change_addr , domain )
r , h = self . wallet . sendtx ( tx )
return h
2013-02-26 04:56:48 -08:00
def history ( self ) :
import datetime
balance = 0
2013-02-26 09:10:29 -08:00
out = [ ]
2013-02-26 04:56:48 -08:00
for item in self . wallet . get_tx_history ( ) :
tx_hash , conf , is_mine , value , fee , balance , timestamp = item
try :
time_str = datetime . datetime . fromtimestamp ( timestamp ) . isoformat ( ' ' ) [ : - 3 ]
2013-11-09 21:23:57 -08:00
except Exception :
2013-02-26 04:56:48 -08:00
time_str = " ---- "
label , is_default_label = self . wallet . get_label ( tx_hash )
2014-03-12 01:52:17 -07:00
out . append ( { ' txid ' : tx_hash , ' date ' : " %16s " % time_str , ' label ' : label , ' value ' : format_satoshis ( value ) } )
2013-02-26 09:10:29 -08:00
return out
2013-02-26 04:56:48 -08:00
2013-09-08 11:10:43 -07:00
def setlabel ( self , key , label ) :
2013-09-08 11:12:03 -07:00
self . wallet . set_label ( key , label )
2013-09-08 11:10:43 -07:00
2013-02-26 04:56:48 -08:00
def contacts ( self ) :
c = { }
for addr in self . wallet . addressbook :
c [ addr ] = self . wallet . labels . get ( addr )
2013-02-26 08:57:48 -08:00
return c
2013-02-26 04:56:48 -08:00
2013-02-26 07:11:19 -08:00
2013-10-24 00:45:41 -07:00
def listaddresses ( self , show_all = False , show_label = False ) :
2013-02-26 09:10:29 -08:00
out = [ ]
2013-03-02 02:40:17 -08:00
for addr in self . wallet . addresses ( True ) :
2013-02-26 07:11:19 -08:00
if show_all or not self . wallet . is_change ( addr ) :
2013-10-24 00:45:41 -07:00
if show_label :
2013-03-01 02:21:10 -08:00
item = { ' address ' : addr }
if show_label :
label = self . wallet . labels . get ( addr , ' ' )
if label :
item [ ' label ' ] = label
else :
item = addr
out . append ( item )
2013-02-26 09:10:29 -08:00
return out
2013-10-03 04:31:59 -07:00
def help ( self , cmd = None ) :
if cmd not in known_commands :
2013-04-22 12:19:13 -07:00
print_msg ( " \n List of commands: " , ' , ' . join ( sorted ( known_commands ) ) )
2013-03-04 08:36:49 -08:00
else :
2013-10-03 04:31:59 -07:00
cmd = known_commands [ cmd ]
print_msg ( cmd . description )
if cmd . syntax : print_msg ( " Syntax: " + cmd . syntax )
if cmd . options : print_msg ( " options: \n " + cmd . options )
2013-03-04 08:36:49 -08:00
return None
2014-01-23 08:06:47 -08:00
2014-01-13 12:27:31 -08:00
def getrawtransaction ( self , tx_hash ) :
2014-01-23 08:06:47 -08:00
import transaction
2014-01-13 12:27:31 -08:00
if self . wallet :
tx = self . wallet . transactions . get ( tx_hash )
if tx :
return tx
2014-01-23 08:06:47 -08:00
r = self . network . synchronous_get ( [ ( ' blockchain.transaction.get ' , [ tx_hash ] ) ] ) [ 0 ]
if r :
return transaction . Transaction ( r )
else :
return " unknown transaction "
2014-03-03 01:39:10 -08:00
2014-01-30 05:43:46 -08:00
def encrypt ( self , pubkey , message ) :
2014-03-03 01:39:10 -08:00
return bitcoin . encrypt_message ( message , pubkey )
2014-01-30 05:43:46 -08:00
2014-03-11 06:11:45 -07:00
def decrypt ( self , pubkey , message ) :
return self . wallet . decrypt_message ( pubkey , message , self . password )
2014-01-30 05:43:46 -08:00
2013-09-15 02:19:48 -07:00
2013-02-26 07:11:19 -08:00