Skip to content

Commit b34fdb5

Browse files
theStackdarosior
authored andcommitted
test: introduce output amount (de)compression routines
1 parent a7911ed commit b34fdb5

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

test/functional/feature_framework_unit_tests.py

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"address",
1919
"crypto.bip324_cipher",
2020
"blocktools",
21+
"compressor",
2122
"crypto.chacha20",
2223
"crypto.ellswift",
2324
"key",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#!/usr/bin/env python3
2+
# Copyright (c) 2025-present The Bitcoin Core developers
3+
# Distributed under the MIT software license, see the accompanying
4+
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
5+
"""Routines for compressing transaction output amounts and scripts."""
6+
import unittest
7+
8+
from .messages import COIN
9+
10+
11+
def compress_amount(n):
12+
if n == 0:
13+
return 0
14+
e = 0
15+
while ((n % 10) == 0) and (e < 9):
16+
n //= 10
17+
e += 1
18+
if e < 9:
19+
d = n % 10
20+
assert (d >= 1 and d <= 9)
21+
n //= 10
22+
return 1 + (n*9 + d - 1)*10 + e
23+
else:
24+
return 1 + (n - 1)*10 + 9
25+
26+
27+
def decompress_amount(x):
28+
if x == 0:
29+
return 0
30+
x -= 1
31+
e = x % 10
32+
x //= 10
33+
n = 0
34+
if e < 9:
35+
d = (x % 9) + 1
36+
x //= 9
37+
n = x * 10 + d
38+
else:
39+
n = x + 1
40+
while e > 0:
41+
n *= 10
42+
e -= 1
43+
return n
44+
45+
46+
class TestFrameworkCompressor(unittest.TestCase):
47+
def test_amount_compress_decompress(self):
48+
def check_amount(amount, expected_compressed):
49+
self.assertEqual(compress_amount(amount), expected_compressed)
50+
self.assertEqual(decompress_amount(expected_compressed), amount)
51+
52+
# test cases from compress_tests.cpp:compress_amounts
53+
check_amount(0, 0x0)
54+
check_amount(1, 0x1)
55+
check_amount(1000000, 0x7)
56+
check_amount(COIN, 0x9)
57+
check_amount(50*COIN, 0x32)
58+
check_amount(21000000*COIN, 0x1406f40)

0 commit comments

Comments
 (0)