Various fixes for command line. Make 'payto' command require network (fixes #1525)
This commit is contained in:
parent
079cb311ec
commit
bb7b0884e3
23
electrum
23
electrum
|
@ -79,7 +79,7 @@ if is_bundle or is_local or is_android:
|
||||||
|
|
||||||
from electrum import util
|
from electrum import util
|
||||||
from electrum import SimpleConfig, Network, Wallet, WalletStorage
|
from electrum import SimpleConfig, Network, Wallet, WalletStorage
|
||||||
from electrum.util import print_msg, print_error, print_stderr, print_json, set_verbosity, InvalidPassword
|
from electrum.util import print_msg, print_error, print_stderr, json_encode, json_decode, set_verbosity, InvalidPassword
|
||||||
from electrum.plugins import Plugins, run_hook, always_hook
|
from electrum.plugins import Plugins, run_hook, always_hook
|
||||||
from electrum.commands import get_parser, known_commands, Commands, config_variables
|
from electrum.commands import get_parser, known_commands, Commands, config_variables
|
||||||
|
|
||||||
|
@ -251,15 +251,9 @@ def run_command(config, network, password):
|
||||||
# arguments passed to function
|
# arguments passed to function
|
||||||
args = map(lambda x: config.get(x), cmd.params)
|
args = map(lambda x: config.get(x), cmd.params)
|
||||||
# decode json arguments
|
# decode json arguments
|
||||||
def json_decode(x):
|
|
||||||
try:
|
|
||||||
return json.loads(x)
|
|
||||||
except:
|
|
||||||
return x
|
|
||||||
args = map(json_decode, args)
|
args = map(json_decode, args)
|
||||||
# options
|
# options
|
||||||
args += map(lambda x: config.get(x), cmd.options)
|
args += map(lambda x: config.get(x), cmd.options)
|
||||||
|
|
||||||
cmd_runner = Commands(config, wallet, network)
|
cmd_runner = Commands(config, wallet, network)
|
||||||
cmd_runner.password = password
|
cmd_runner.password = password
|
||||||
func = getattr(cmd_runner, cmd.name)
|
func = getattr(cmd_runner, cmd.name)
|
||||||
|
@ -467,13 +461,15 @@ if __name__ == '__main__':
|
||||||
gui_name = config.get('gui', 'qt') if cmd_name == 'gui' else 'cmdline'
|
gui_name = config.get('gui', 'qt') if cmd_name == 'gui' else 'cmdline'
|
||||||
plugins = Plugins(config, is_bundle or is_local or is_android, gui_name)
|
plugins = Plugins(config, is_bundle or is_local or is_android, gui_name)
|
||||||
|
|
||||||
# get password if needed
|
# run command offline
|
||||||
if cmd_name not in ['gui', 'daemon']:
|
if cmd_name not in ['gui', 'daemon']:
|
||||||
cmd, password = init_cmdline(config)
|
cmd, password = init_cmdline(config)
|
||||||
if not cmd.requires_network or config.get('offline'):
|
if not cmd.requires_network or config.get('offline'):
|
||||||
result = run_command(config, None, password)
|
result = run_command(config, None, password)
|
||||||
print_json(result)
|
print_msg(json_encode(result))
|
||||||
sys.exit(1)
|
sys.exit(0)
|
||||||
|
else:
|
||||||
|
config_options['password'] = password
|
||||||
|
|
||||||
# check if daemon is running
|
# check if daemon is running
|
||||||
s = get_daemon(config, False)
|
s = get_daemon(config, False)
|
||||||
|
@ -485,11 +481,10 @@ if __name__ == '__main__':
|
||||||
s.close()
|
s.close()
|
||||||
if type(result) in [str, unicode]:
|
if type(result) in [str, unicode]:
|
||||||
print_msg(result)
|
print_msg(result)
|
||||||
elif result is not None:
|
elif type(result) is dict and result.get('error'):
|
||||||
if type(result) is dir and result.get('error'):
|
|
||||||
print_stderr(result.get('error'))
|
print_stderr(result.get('error'))
|
||||||
else:
|
elif result is not None:
|
||||||
print_json(result)
|
print_msg(json_encode(result))
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
# daemon is not running
|
# daemon is not running
|
||||||
|
|
|
@ -213,9 +213,10 @@ class Console(QtGui.QPlainTextEdit):
|
||||||
try:
|
try:
|
||||||
# eval is generally considered bad practice. use it wisely!
|
# eval is generally considered bad practice. use it wisely!
|
||||||
result = eval(command, self.namespace, self.namespace)
|
result = eval(command, self.namespace, self.namespace)
|
||||||
|
result = util.json_encode(result)
|
||||||
if result != None:
|
if result != None:
|
||||||
if self.is_json:
|
if self.is_json:
|
||||||
util.print_json(result)
|
util.print_msg(result)
|
||||||
else:
|
else:
|
||||||
self.appendPlainText(repr(result))
|
self.appendPlainText(repr(result))
|
||||||
except SyntaxError:
|
except SyntaxError:
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from version import ELECTRUM_VERSION
|
from version import ELECTRUM_VERSION
|
||||||
from util import format_satoshis, print_msg, print_json, print_error, set_verbosity
|
from util import format_satoshis, print_msg, print_error, set_verbosity
|
||||||
from wallet import Synchronizer, WalletStorage
|
from wallet import Synchronizer, WalletStorage
|
||||||
from wallet import Wallet, Imported_Wallet
|
from wallet import Wallet, Imported_Wallet
|
||||||
from network import Network, DEFAULT_SERVERS, DEFAULT_PORTS, pick_random_server
|
from network import Network, DEFAULT_SERVERS, DEFAULT_PORTS, pick_random_server
|
||||||
|
|
|
@ -418,14 +418,14 @@ class Commands:
|
||||||
self.wallet.sign_transaction(tx, self.password)
|
self.wallet.sign_transaction(tx, self.password)
|
||||||
return tx
|
return tx
|
||||||
|
|
||||||
@command('wp')
|
@command('wpn')
|
||||||
def payto(self, destination, amount, tx_fee=None, from_addr=None, change_addr=None, nocheck=False, unsigned=False, deserialized=False):
|
def payto(self, destination, amount, tx_fee=None, from_addr=None, change_addr=None, nocheck=False, unsigned=False, deserialized=False):
|
||||||
"""Create a transaction. """
|
"""Create a transaction. """
|
||||||
domain = [from_addr] if from_addr else None
|
domain = [from_addr] if from_addr else None
|
||||||
tx = self._mktx([(destination, amount)], tx_fee, change_addr, domain, nocheck, unsigned)
|
tx = self._mktx([(destination, amount)], tx_fee, change_addr, domain, nocheck, unsigned)
|
||||||
return tx.deserialize() if deserialized else tx
|
return tx.deserialize() if deserialized else tx
|
||||||
|
|
||||||
@command('wp')
|
@command('wpn')
|
||||||
def paytomany(self, outputs, tx_fee=None, from_addr=None, change_addr=None, nocheck=False, unsigned=False, deserialized=False):
|
def paytomany(self, outputs, tx_fee=None, from_addr=None, change_addr=None, nocheck=False, unsigned=False, deserialized=False):
|
||||||
"""Create a multi-output transaction. """
|
"""Create a multi-output transaction. """
|
||||||
domain = [from_addr] if from_addr else None
|
domain = [from_addr] if from_addr else None
|
||||||
|
@ -657,8 +657,8 @@ arg_types = {
|
||||||
'pubkeys': json.loads,
|
'pubkeys': json.loads,
|
||||||
'inputs': json.loads,
|
'inputs': json.loads,
|
||||||
'outputs': json.loads,
|
'outputs': json.loads,
|
||||||
'tx_fee': lambda x: Decimal(x) if x is not None else None,
|
'tx_fee': lambda x: float(x) if x is not None else None,
|
||||||
'amount': lambda x: Decimal(x) if x!='!' else '!',
|
'amount': lambda x: float(x) if x!='!' else '!',
|
||||||
}
|
}
|
||||||
|
|
||||||
config_variables = {
|
config_variables = {
|
||||||
|
|
10
lib/util.py
10
lib/util.py
|
@ -112,14 +112,18 @@ def print_msg(*args):
|
||||||
sys.stdout.write(" ".join(args) + "\n")
|
sys.stdout.write(" ".join(args) + "\n")
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
|
|
||||||
def print_json(obj):
|
def json_encode(obj):
|
||||||
try:
|
try:
|
||||||
s = json.dumps(obj, sort_keys = True, indent = 4, cls=MyEncoder)
|
s = json.dumps(obj, sort_keys = True, indent = 4, cls=MyEncoder)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
s = repr(obj)
|
s = repr(obj)
|
||||||
sys.stdout.write(s + "\n")
|
return s
|
||||||
sys.stdout.flush()
|
|
||||||
|
|
||||||
|
def json_decode(x):
|
||||||
|
try:
|
||||||
|
return json.loads(x)
|
||||||
|
except:
|
||||||
|
return x
|
||||||
|
|
||||||
# decorator that prints execution time
|
# decorator that prints execution time
|
||||||
def profiler(func):
|
def profiler(func):
|
||||||
|
|
|
@ -3,11 +3,12 @@
|
||||||
# A simple script that connects to a server and displays block headers
|
# A simple script that connects to a server and displays block headers
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import electrum
|
from electrum import SimpleConfig, Network
|
||||||
|
from electrum.util import print_msg, json_encode
|
||||||
|
|
||||||
# start network
|
# start network
|
||||||
c = electrum.SimpleConfig()
|
c = SimpleConfig()
|
||||||
network = electrum.Network(c)
|
network = Network(c)
|
||||||
network.start()
|
network.start()
|
||||||
|
|
||||||
# wait until connected
|
# wait until connected
|
||||||
|
@ -19,7 +20,7 @@ if not network.is_connected():
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
# 2. send the subscription
|
# 2. send the subscription
|
||||||
callback = lambda response: electrum.print_json(response.get('result'))
|
callback = lambda response: print_msg(json_encode(response.get('result')))
|
||||||
network.send([('blockchain.headers.subscribe',[])], callback)
|
network.send([('blockchain.headers.subscribe',[])], callback)
|
||||||
|
|
||||||
# 3. wait for results
|
# 3. wait for results
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
from electrum import Network, print_json
|
from electrum import Network
|
||||||
|
from electrum.util import json_encode, print_msg
|
||||||
|
|
||||||
try:
|
try:
|
||||||
addr = sys.argv[1]
|
addr = sys.argv[1]
|
||||||
|
@ -12,4 +13,4 @@ except Exception:
|
||||||
n = Network()
|
n = Network()
|
||||||
n.start()
|
n.start()
|
||||||
h = n.synchronous_get(('blockchain.address.get_history',[addr]))
|
h = n.synchronous_get(('blockchain.address.get_history',[addr]))
|
||||||
print_json(h)
|
print_msg(json_encode(h))
|
||||||
|
|
|
@ -2,7 +2,8 @@
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import electrum
|
from electrum import SimpleConfig, Network
|
||||||
|
from electrum.util import print_msg, json_encode
|
||||||
|
|
||||||
try:
|
try:
|
||||||
addr = sys.argv[1]
|
addr = sys.argv[1]
|
||||||
|
@ -11,8 +12,8 @@ except Exception:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
# start network
|
# start network
|
||||||
c = electrum.SimpleConfig()
|
c = SimpleConfig()
|
||||||
network = electrum.Network(c)
|
network = Network(c)
|
||||||
network.start()
|
network.start()
|
||||||
|
|
||||||
# wait until connected
|
# wait until connected
|
||||||
|
@ -24,7 +25,7 @@ if not network.is_connected():
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
# 2. send the subscription
|
# 2. send the subscription
|
||||||
callback = lambda response: electrum.print_json(response.get('result'))
|
callback = lambda response: print_msg(json_encode(response.get('result')))
|
||||||
network.send([('blockchain.address.subscribe',[addr])], callback)
|
network.send([('blockchain.address.subscribe',[addr])], callback)
|
||||||
|
|
||||||
# 3. wait for results
|
# 3. wait for results
|
||||||
|
|
Loading…
Reference in New Issue