File: btchipHelpers.py

package info (click to toggle)
python-ledger-bitcoin 0.4.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 720 kB
  • sloc: python: 9,357; makefile: 2
file content (86 lines) | stat: -rw-r--r-- 2,715 bytes parent folder | download | duplicates (2)
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
"""
*******************************************************************************
*   BTChip Bitcoin Hardware Wallet Python API
*   (c) 2014 BTChip - 1BTChip7VfTnrPra5jqci7ejnMguuHogTn
*
*  Licensed under the Apache License, Version 2.0 (the "License");
*  you may not use this file except in compliance with the License.
*  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
*   Unless required by applicable law or agreed to in writing, software
*   distributed under the License is distributed on an "AS IS" BASIS,
*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*  See the License for the specific language governing permissions and
*   limitations under the License.
********************************************************************************
"""

import decimal
import re

# from pycoin
SATOSHI_PER_COIN = decimal.Decimal(100_000_000)
COIN_PER_SATOSHI = decimal.Decimal('0.00000001')

def satoshi_to_btc(satoshi_count):
    if satoshi_count == 0:
        return decimal.Decimal(0)
    r = satoshi_count * COIN_PER_SATOSHI
    return r.normalize()

def btc_to_satoshi(btc):
    return int(decimal.Decimal(btc) * SATOSHI_PER_COIN)
# /from pycoin

def writeUint32BE(value, buffer):
	buffer.append((value >> 24) & 0xff)
	buffer.append((value >> 16) & 0xff)
	buffer.append((value >> 8) & 0xff)
	buffer.append(value & 0xff)
	return buffer

def writeUint32LE(value, buffer):
	buffer.append(value & 0xff)
	buffer.append((value >> 8) & 0xff)
	buffer.append((value >> 16) & 0xff)
	buffer.append((value >> 24) & 0xff)
	return buffer

def writeHexAmount(value, buffer):
	buffer.append(value & 0xff)
	buffer.append((value >> 8) & 0xff)
	buffer.append((value >> 16) & 0xff)
	buffer.append((value >> 24) & 0xff)
	buffer.append((value >> 32) & 0xff)
	buffer.append((value >> 40) & 0xff)
	buffer.append((value >> 48) & 0xff)
	buffer.append((value >> 56) & 0xff)
	return buffer

def writeHexAmountBE(value, buffer):
	buffer.append((value >> 56) & 0xff)
	buffer.append((value >> 48) & 0xff)
	buffer.append((value >> 40) & 0xff)
	buffer.append((value >> 32) & 0xff)
	buffer.append((value >> 24) & 0xff)
	buffer.append((value >> 16) & 0xff)
	buffer.append((value >> 8) & 0xff)
	buffer.append(value & 0xff)
	return buffer

def parse_bip32_path(path):
	if len(path) == 0:
		return bytearray([ 0 ])
	result = []
	elements = path.split('/')
	if len(elements) > 10:
		raise BTChipException("Path too long")
	for pathElement in elements:
		element = re.split('\'|h|H', pathElement)
		if len(element) == 1:
			writeUint32BE(int(element[0]), result)
		else:
			writeUint32BE(0x80000000 | int(element[0]), result)
	return bytearray([ len(elements) ] + result)