bitcoinwatcher 2.11b1__tar.gz → 2.12__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/PKG-INFO +4 -3
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/address_listener/address_listener.py +3 -1
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tests/test_bitcoin_utils.py +10 -1
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tx_extractors/bitcoin_rpc.py +1 -1
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/utils/bitcoin_rpc.py +8 -5
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/utils/bitcoin_utils.py +12 -0
- bitcoinwatcher-2.12/bitcoin/utils/constants.py +2 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoinwatcher.egg-info/PKG-INFO +4 -3
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoinwatcher.egg-info/requires.txt +1 -1
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/pyproject.toml +2 -2
- bitcoinwatcher-2.11b1/bitcoin/utils/constants.py +0 -2
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/LICENSE +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/README.md +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/__init__.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/address_listener/__init__.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/address_listener/simple_address_listener.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/models/__init__.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/models/address_tx_data.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tests/__init__.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tests/data/__init__.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tests/data/transactions.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tests/test_address_listener.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tests/test_bitcoin_rpc.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tx_extractors/__init__.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tx_extractors/abstract_extractor.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tx_extractors/default.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tx_extractors/mempool.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tx_listener/__init__.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tx_listener/abstract_tx_listener.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/tx_listener/zmq_listener.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/utils/__init__.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/utils/benchmark.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/utils/context_aware_logging.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/utils/inscription_utils.py +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoinwatcher.egg-info/SOURCES.txt +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoinwatcher.egg-info/dependency_links.txt +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoinwatcher.egg-info/top_level.txt +0 -0
- {bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: bitcoinwatcher
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.12
|
4
4
|
Summary: bitcoinwatcher is a Python library that implements a ZMQ subscriber and provides abstractions to build custom address watchers. This library is designed to make it easy for developers to monitor Bitcoin addresses and react to changes in their state.
|
5
5
|
Author: twosatsmaxi
|
6
6
|
License: Apache License
|
@@ -224,12 +224,13 @@ Requires-Dist: idna==3.7
|
|
224
224
|
Requires-Dist: pyzmq==25.1.2
|
225
225
|
Requires-Dist: requests==2.31.0
|
226
226
|
Requires-Dist: urllib3==2.2.1
|
227
|
-
Requires-Dist: bitcoinlib==0.7.
|
227
|
+
Requires-Dist: bitcoinlib==0.7.4
|
228
228
|
Requires-Dist: ordipool==1.2.0
|
229
229
|
Requires-Dist: pyzmq==25.1.2
|
230
230
|
Requires-Dist: python-bitcoinrpc==1.0
|
231
231
|
Requires-Dist: pytz~=2024.2
|
232
232
|
Requires-Dist: colorlog~=6.9.0
|
233
|
+
Dynamic: license-file
|
233
234
|
|
234
235
|
# bitcoinwatcher
|
235
236
|
|
@@ -10,6 +10,7 @@ from bitcoin.tx_extractors.default import DefaultTxAddressDataExtractor
|
|
10
10
|
from bitcoin.tx_listener.abstract_tx_listener import AbstractTxListener
|
11
11
|
from bitcoin.utils.constants import default_host
|
12
12
|
from bitcoin.utils.context_aware_logging import logger
|
13
|
+
from bitcoin.utils.bitcoin_utils import has_satflow_op_return
|
13
14
|
|
14
15
|
|
15
16
|
class AbstractAddressListener(AbstractTxListener, ABC):
|
@@ -48,7 +49,8 @@ class AbstractAddressListener(AbstractTxListener, ABC):
|
|
48
49
|
address_tx_data = address_tx_data
|
49
50
|
# filter the address we are interested in
|
50
51
|
addresses_for_events = self.filter_address_tx_data(address_tx_data)
|
51
|
-
|
52
|
+
|
53
|
+
if len(addresses_for_events) == 0 and not has_satflow_op_return(tx):
|
52
54
|
return
|
53
55
|
|
54
56
|
for address in addresses_for_events:
|
@@ -3,7 +3,7 @@ from unittest import TestCase
|
|
3
3
|
from bitcoinlib.transactions import Transaction
|
4
4
|
|
5
5
|
from bitcoin.tests.data.transactions import batch_airdrop_tx_hex, tx_hex, non_reveal_tx_hex, tx_hex_2
|
6
|
-
from bitcoin.utils.bitcoin_utils import is_reveal_tx, count_reveal_inputs
|
6
|
+
from bitcoin.utils.bitcoin_utils import is_reveal_tx, count_reveal_inputs, has_satflow_op_return
|
7
7
|
|
8
8
|
|
9
9
|
class Test(TestCase):
|
@@ -34,3 +34,12 @@ class Test(TestCase):
|
|
34
34
|
def test_count_reveal_in_airdrop_tx(self):
|
35
35
|
tx = Transaction.parse_hex(batch_airdrop_tx_hex, strict=False)
|
36
36
|
self.assertEqual(count_reveal_inputs(tx), 1420)
|
37
|
+
|
38
|
+
def test_has_satflow_op_return_true(self):
|
39
|
+
satflow_tx_hex = "02000000000102121a4369bd06b9123b43f41a072c3832979927e1244dbf27b85b87e4348db6090100000000ffffffffdbe5c4bff3c32c18694c85eafa74c2626c99595156571bc333b58ec9e7e437030000000000ffffffff0398230000000000002200206925778b2282777c97222e5a6b7ce092c521c755f2fd912dd20449a53d741a983cb7590000000000160014dfafb9f5e2e1b8afde774a725aedbb5f127015bb0000000000000000096a07534154464c4f5701419cc0b1bcedab6113b7793c420b0eda8efb706be4a8202d4d9f129ae539880c7027e2abd67a8510771cfa90cffd5a9c76577b1f5388ca869714e629197acdf08d8101400a443de48021e733eb29237abfdd89016a1a171074c399b5a43e5c3349854e3ac1950fe9e27ef7280881f11f67dcc855bb34b2e44e48811d4c0dd4f6e89051ac00000000"
|
40
|
+
tx = Transaction.parse_hex(satflow_tx_hex, strict=False)
|
41
|
+
self.assertTrue(has_satflow_op_return(tx))
|
42
|
+
|
43
|
+
def test_has_satflow_op_return_false(self):
|
44
|
+
tx = Transaction.parse_hex(tx_hex, strict=False)
|
45
|
+
self.assertFalse(has_satflow_op_return(tx))
|
@@ -20,7 +20,7 @@ class BitcoinRPCAddressDataExtractor(AbstractTxAddressDataExtractor):
|
|
20
20
|
def fetch_all_inputs(self, inputs):
|
21
21
|
unique_txids = list(set([input.prev_txid.hex() for input in inputs]))
|
22
22
|
rpc_calls = [["getrawtransaction", tx_id, True] for tx_id in unique_txids]
|
23
|
-
data = self.bitcoinrpc.
|
23
|
+
data = self.bitcoinrpc.get_new_connection().batch_(rpc_calls)
|
24
24
|
tx_id_to_data = {tx_id: current_tx for tx_id, current_tx in zip(unique_txids, data)}
|
25
25
|
list_of_vouts = []
|
26
26
|
for input in inputs:
|
@@ -13,15 +13,17 @@ class BitcoinRPC:
|
|
13
13
|
rpc_port = os.environ.get("RPC_PORT", 8332)
|
14
14
|
|
15
15
|
def __init__(self):
|
16
|
-
rpc_string = f"http://{self.rpc_user}:{self.rpc_password}@{self.rpc_host}:{self.rpc_port}"
|
17
|
-
|
16
|
+
self.rpc_string = f"http://{self.rpc_user}:{self.rpc_password}@{self.rpc_host}:{self.rpc_port}"
|
17
|
+
|
18
|
+
def get_new_connection(self):
|
19
|
+
return AuthServiceProxy(self.rpc_string)
|
18
20
|
|
19
21
|
def get_transaction(self, txid: str) -> dict:
|
20
|
-
return self.
|
22
|
+
return self.get_new_connection().getrawtransaction(txid, True)
|
21
23
|
|
22
24
|
def is_confirmed(self, txid: str) -> bool:
|
23
25
|
try:
|
24
|
-
self.
|
26
|
+
self.get_new_connection().getmempoolentry(txid)
|
25
27
|
return False
|
26
28
|
except JSONRPCException as e:
|
27
29
|
return True
|
@@ -30,10 +32,11 @@ class BitcoinRPC:
|
|
30
32
|
if __name__ == '__main__':
|
31
33
|
logger = get_logger(__name__)
|
32
34
|
rpc = BitcoinRPC()
|
33
|
-
txid = '
|
35
|
+
txid = '775c85bb56a3fc86bf6b100a1e9ff54b6d4dcc3670fb76f98365d99a32c18e53'
|
34
36
|
try:
|
35
37
|
ctx_tx.set('686d025f16d9f20353665a9d865e575e3e4d14214f6f7045149a17dd6bf0fac6')
|
36
38
|
ctx_tx_status.set('confirmed')
|
39
|
+
tx_data = rpc.get_transaction(txid)
|
37
40
|
logger.info("Transaction is confirmed")
|
38
41
|
except JSONRPCException as e:
|
39
42
|
print(f"An error occurred: {e}")
|
@@ -16,3 +16,15 @@ def is_reveal_tx(tx: Transaction) -> bool:
|
|
16
16
|
count_of_inscriptions = count_reveal_inputs(tx)
|
17
17
|
return count_of_inscriptions > 0
|
18
18
|
# check if any of the witness contains ord, convert witness to hex
|
19
|
+
|
20
|
+
|
21
|
+
def has_satflow_op_return(tx: Transaction) -> bool:
|
22
|
+
for output in tx.outputs:
|
23
|
+
if output.script_type == 'nulldata' and output.lock_script:
|
24
|
+
try:
|
25
|
+
script_data = output.lock_script.hex()
|
26
|
+
if b'SATFLOW'.hex() in script_data:
|
27
|
+
return True
|
28
|
+
except:
|
29
|
+
pass
|
30
|
+
return False
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: bitcoinwatcher
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.12
|
4
4
|
Summary: bitcoinwatcher is a Python library that implements a ZMQ subscriber and provides abstractions to build custom address watchers. This library is designed to make it easy for developers to monitor Bitcoin addresses and react to changes in their state.
|
5
5
|
Author: twosatsmaxi
|
6
6
|
License: Apache License
|
@@ -224,12 +224,13 @@ Requires-Dist: idna==3.7
|
|
224
224
|
Requires-Dist: pyzmq==25.1.2
|
225
225
|
Requires-Dist: requests==2.31.0
|
226
226
|
Requires-Dist: urllib3==2.2.1
|
227
|
-
Requires-Dist: bitcoinlib==0.7.
|
227
|
+
Requires-Dist: bitcoinlib==0.7.4
|
228
228
|
Requires-Dist: ordipool==1.2.0
|
229
229
|
Requires-Dist: pyzmq==25.1.2
|
230
230
|
Requires-Dist: python-bitcoinrpc==1.0
|
231
231
|
Requires-Dist: pytz~=2024.2
|
232
232
|
Requires-Dist: colorlog~=6.9.0
|
233
|
+
Dynamic: license-file
|
233
234
|
|
234
235
|
# bitcoinwatcher
|
235
236
|
|
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
|
|
5
5
|
|
6
6
|
[project]
|
7
7
|
name = "bitcoinwatcher"
|
8
|
-
version = "2.
|
8
|
+
version = "2.12"
|
9
9
|
description = "bitcoinwatcher is a Python library that implements a ZMQ subscriber and provides abstractions to build custom address watchers. This library is designed to make it easy for developers to monitor Bitcoin addresses and react to changes in their state."
|
10
10
|
readme = "README.md"
|
11
11
|
authors = [{name = "twosatsmaxi"}]
|
@@ -30,7 +30,7 @@ dependencies = [
|
|
30
30
|
"pyzmq==25.1.2",
|
31
31
|
"requests==2.31.0",
|
32
32
|
"urllib3==2.2.1",
|
33
|
-
"bitcoinlib==0.7.
|
33
|
+
"bitcoinlib==0.7.4",
|
34
34
|
"ordipool==1.2.0",
|
35
35
|
"pyzmq==25.1.2",
|
36
36
|
"python-bitcoinrpc==1.0",
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{bitcoinwatcher-2.11b1 → bitcoinwatcher-2.12}/bitcoin/address_listener/simple_address_listener.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|