1
0

move payment requests logic to wallet, add basic commands

This commit is contained in:
ThomasV
2015-06-01 13:02:09 +02:00
parent e5b6b05482
commit 0938299e9b
3 changed files with 82 additions and 47 deletions

View File

@@ -506,7 +506,34 @@ class Commands:
"""Decrypt a message encrypted with a public key."""
return self.wallet.decrypt_message(pubkey, encrypted, self.password)
@command('w')
def listrequests(self):
"""List the payment requests you made"""
out = []
for addr, v in self.wallet.receive_requests.items():
out.append({
'address': addr,
'amount': format_satoshis(v.get('amount')),
'time': v.get('time'),
'reason': self.wallet.get_label(addr)[0],
'expiration': v.get('expiration'),
})
return out
@command('w')
def addrequest(self, amount, reason='', expiration=60*60):
"""Create a payment request"""
addr = self.wallet.get_unused_address(None)
if addr is None:
return False
amount = int(Decimal(amount)*COIN)
self.wallet.save_payment_request(addr, amount, reason, expiration)
return addr
@command('w')
def removerequest(self, address):
"""Remove a payment request"""
return self.wallet.remove_payment_request(address)
param_descriptions = {
'privkey': 'Private key. Type \'?\' to get a prompt.',
@@ -548,6 +575,8 @@ command_options = {
'unsigned': ("-u", "--unsigned", "Do not sign transaction"),
'domain': ("-D", "--domain", "List of addresses"),
'account': (None, "--account", "Account"),
'reason': (None, "--reason", "Description of the request"),
'expiration': (None, "--expiration", "Time in seconds"),
}

View File

@@ -164,6 +164,9 @@ class Abstract_Wallet(object):
self.load_accounts()
self.load_transactions()
# load requests
self.receive_requests = self.storage.get('receive_requests2', {})
# spv
self.verifier = None
# Transactions pending verification. Each value is the transaction height. Access with self.lock.
@@ -1221,6 +1224,43 @@ class Abstract_Wallet(object):
def can_change_password(self):
return not self.is_watching_only()
def get_unused_address(self, account):
# fixme: use slots from expired requests
domain = self.get_account_addresses(account, include_change=False)
for addr in domain:
if not self.history.get(addr) and addr not in self.receive_requests.keys():
return addr
def remove_payment_request(self, addr):
if addr not in self.receive_requests:
return False
self.receive_requests.pop(addr)
self.storage.put('receive_requests2', self.receive_requests)
return True
def save_payment_request(self, addr, amount, message, expiration):
self.set_label(addr, message)
if addr in self.receive_requests:
self.receive_requests[addr]['amount'] = amount
else:
now = int(time.time())
self.receive_requests[addr] = {'time':now, 'amount':amount, 'expiration':expiration}
self.storage.put('receive_requests2', self.receive_requests, True)
def make_bip70_request(self, config, addr):
from paymentrequest import make_payment_request
req = self.receive_requests[addr]
time = req['time']
amount = req['amount']
expiration = req['expiration']
message = self.labels.get(addr, '')
script = Transaction.pay_script('address', addr).decode('hex')
outputs = [(script, amount)]
key_path = config.get('ssl_key_path')
cert_path = config.get('ssl_cert_path')
return make_payment_request(outputs, message, time, time + expiration, key_path, cert_path)
class Imported_Wallet(Abstract_Wallet):
wallet_type = 'imported'