use bitcoinrpc for "make local"
[bitcoin:spesmilo.git] / core_interface.py
1 # -*- coding: utf-8 -*-
2 # Spesmilo -- Python Bitcoin user interface
3 # Copyright © 2011 Luke Dashjr
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, version 3 only.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 import jsonrpc
18 from jsonrpc.proxy import JSONRPCException
19
20 class CoreInterface:
21     def __init__(self, uri):
22         self.uri = uri
23
24     def _access(self):
25         if hasattr(self, 'access'):
26             return self.access
27         basea = jsonrpc.ServiceProxy(self.uri)
28         self.rpcversion = 0
29         for access in (basea.bitcoin.__getattr__('1'), basea.bitcoin.v1, basea):
30             try:
31                 info = access.getinfo()
32             except JSONRPCException:
33                 continue
34             if not 'rpcversion' in info:
35                 info['rpcversion'] = 0
36             if not info['rpcversion'] in (0, 1):
37                 continue
38             self.rpcversion = info['rpcversion']
39             self.access = access
40             break
41         return self.access
42
43     def _fromAmount(self, n):
44         if self.rpcversion == 0:
45             return int(round(n * 100000000))
46         return int(n)
47
48     def tr(self, s):
49         return s
50
51     def transactions(self, *args):
52         txl = self._access().listtransactions(*args)
53         for tx in txl:
54             for k in ('amount', 'fee'):
55                 if k in tx: tx[k] = self._fromAmount(tx[k])
56         return txl
57
58     def get_transaction(self, txid):
59         # NOTE: returns a list like transactions, in case we both sent and received
60         tx = self._access().gettransaction(txid)
61         for detail in tx['details']:
62             for k, v in tx.iteritems():
63                 if k == 'details': continue
64                 detail[k] = v
65         return tx['details']
66
67     def balance(self):
68         b = self._access().getbalance()
69         b = self._fromAmount(b)
70         return b
71
72     def stop(self):
73         return self._access().stop()
74
75     def validate_address(self, address):
76         return self._access().validateaddress(address)['isvalid']
77
78     def send(self, address, amount):
79         if amount % 1:
80             raise ValueError(self.tr('Bitcoin does not support precision requested'))
81         if self.rpcversion == 0:
82             if amount % 1000000 and self._access().getinfo()['version'] < 32100:
83                 raise ValueError(self.tr('This server does not support precision requested'))
84             amount /= 100000000.
85         return self.access.sendtoaddress(address, amount)
86
87     def default_address(self):
88         return self._access().getaccountaddress('')
89
90     def new_address(self):
91         return self._access().getnewaddress('')
92     
93     def is_initialised(self):
94         try:
95             info = self._access().getinfo()
96         except IOError:
97             return False
98         if 'isinitialized' in info:
99             return info['isinitialized']
100         # This only happens on older bitcoind which only respond when initialized...
101         return True