/
utils.py
134 lines (109 loc) · 4.19 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# vim: tabstop=4 expandtab autoindent shiftwidth=4 fileencoding=utf-8
import os
import json
import jsonrpc
import sys
import urllib
import urllib2
import random
import hashlib
import base64
from decimal import Decimal
import decimal
import warnings
from django.core.cache import cache
from django.db import transaction
from django_bitcoin import settings
from django_bitcoin import currency
# BITCOIND COMMANDS
def quantitize_bitcoin(d):
return d.quantize(Decimal("0.00000001"))
class BitcoindConnection(object):
def __init__(self, connection_string, main_account_name):
self.bitcoind_api = jsonrpc.ServiceProxy(connection_string)
self.account_name = main_account_name
def total_received(self, address, minconf=settings.BITCOIN_MINIMUM_CONFIRMATIONS):
if settings.BITCOIN_TRANSACTION_CACHING:
cache_key=address+"_"+str(minconf)
cached = cache.get(cache_key)
if cached!=None:
return cached
cached=decimal.Decimal(
self.bitcoind_api.getreceivedbyaddress(address, minconf))
cache.set(cache_key, cached, 5)
return cached
return decimal.Decimal(
self.bitcoind_api.getreceivedbyaddress(address, minconf))
def send(self, address, amount, *args, **kwargs):
#print "sending", address, amount
return self.bitcoind_api.sendtoaddress(address, float(amount), *args, **kwargs)
def create_address(self, for_account=None, *args, **kwargs):
return self.bitcoind_api.getnewaddress(
for_account or self.account_name, *args, **kwargs)
def gettransaction(self, txid, *args, **kwargs):
dir (self.bitcoind_api)
return self.bitcoind_api.gettransaction(txid, *args, **kwargs)
bitcoind = BitcoindConnection(settings.BITCOIND_CONNECTION_STRING,
settings.MAIN_ACCOUNT)
def bitcoin_getnewaddress(account_name=None):
warnings.warn("Use bitcoind.create_address(...) instead",
DeprecationWarning)
return bitcoind.create_address(account_name=account_name)
def bitcoin_getbalance(address, minconf=1):
warnings.warn("Use bitcoind.total_received(...) instead",
DeprecationWarning)
return bitcoind.total_received(address, minconf)
def bitcoin_getreceived(address, minconf=settings.BITCOIN_MINIMUM_CONFIRMATIONS):
warnings.warn("Use bitcoind.total_received(...) instead",
DeprecationWarning)
return bitcoind.total_received(address, minconf)
def bitcoin_sendtoaddress(address, amount):
warnings.warn("Use bitcoind.send(...) instead",
DeprecationWarning)
return bitcoind.send(address, amount)
# --------
def bitcoinprice_usd():
"""return bitcoin price from any service we can get it"""
warnings.warn("Use django_bitcoin.currency.exchange.get_rate('USD')",
DeprecationWarning)
return {"24h": currency.exchange.get_rate("USD")}
def bitcoinprice_eur():
warnings.warn("Use django_bitcoin.currency.exchange.get_rate('EUR')",
DeprecationWarning)
return {"24h": currency.exchange.get_rate("EUR")}
def bitcoinprice(currency):
warnings.warn("Use django_bitcoin.currency.exchange.get_rate(currency)",
DeprecationWarning)
return currency.exchange.get_rate(currency)
# ------
# generate a random hash
def generateuniquehash(length=43, extradata=''):
# cryptographically safe random
r=str(os.urandom(64))
m = hashlib.sha256()
m.update(r+str(extradata))
key=m.digest()
key=base64.urlsafe_b64encode(key)
return key[:min(length, 43)]
import string
ALPHABET = string.ascii_uppercase + string.ascii_lowercase + \
string.digits + '_-'
ALPHABET_REVERSE = dict((c, i) for (i, c) in enumerate(ALPHABET))
BASE = len(ALPHABET)
SIGN_CHARACTER = '%'
def int2base64(n):
if n < 0:
return SIGN_CHARACTER + num_encode(-n)
s = []
while True:
n, r = divmod(n, BASE)
s.append(ALPHABET[r])
if n == 0: break
return ''.join(reversed(s))
def base642int(s):
if s[0] == SIGN_CHARACTER:
return -num_decode(s[1:])
n = 0
for c in s:
n = n * BASE + ALPHABET_REVERSE[c]
return n