pylupdate4 kalam.pro
[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         basea = jsonrpc.ServiceProxy(uri)
23         self.rpcversion = 0
24         for access in (basea.bitcoin.__getattr__('1'), basea.bitcoin.v1, basea):
25             try:
26                 info = access.getinfo()
27             except JSONRPCException:
28                 continue
29             if not 'rpcversion' in info:
30                 info['rpcversion'] = 0
31             if not info['rpcversion'] in (0, 1):
32                 continue
33             self.rpcversion = info['rpcversion']
34             self.access = access
35             break
36
37     def _fromAmount(self, n):
38         if self.rpcversion == 0:
39             return int(n * 100000000)
40         return int(n)
41
42     def transactions(self, *args):
43         txl = self.access.listtransactions(*args)
44         for tx in txl:
45             for k in ('amount', 'fee'):
46                 if k in tx: tx[k] = self._fromAmount(tx[k])
47         return txl
48
49     def get_transaction(self, txid):
50         # NOTE: returns a list like transactions, in case we both sent and received
51         tx = self.access.gettransaction(txid)
52         for detail in tx['details']:
53             for k, v in tx.iteritems():
54                 if k == 'details': continue
55                 detail[k] = v
56         return tx['details']
57
58     def balance(self):
59         b = self.access.getbalance()
60         b = self._fromAmount(b)
61         return b
62
63     def stop(self):
64         return self.access.stop()
65
66     def validate_address(self, address):
67         return self.access.validateaddress(address)['isvalid']
68
69     def send(self, address, amount):
70         if amount % 1:
71             raise ValueError('Bitcoin does not support precision requested')
72         if self.rpcversion == 0:
73             if amount % 1000000 and self.access.getinfo()['version'] < 32100:
74                 raise ValueError('This server does not support precision requested')
75             amount /= 100000000.
76         return self.access.sendtoaddress(address, amount)
77
78     def default_address(self):
79         return self.access.getaccountaddress('')
80
81     def new_address(self):
82         return self.access.getnewaddress('')
83     
84     def is_initialised(self):
85         info = self.access.getinfo()
86         if 'isinitialized' in info:
87             return info['isinitialized']
88         # This only happens on older bitcoind which only respond when initialized...
89         return True