mm-btc 0.0.6__tar.gz → 0.1.0__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.
- mm_btc-0.1.0/.env.example +1 -0
- mm_btc-0.1.0/.gitignore +15 -0
- mm_btc-0.1.0/PKG-INFO +9 -0
- mm_btc-0.1.0/justfile +33 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/pyproject.toml +16 -22
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/blockstream.py +19 -0
- mm_btc-0.1.0/tests/__init__.py +0 -0
- mm_btc-0.1.0/tests/cli/cmd/test_mnemonic_cmd.py +22 -0
- mm_btc-0.1.0/tests/conftest.py +34 -0
- mm_btc-0.1.0/uv.lock +1235 -0
- mm_btc-0.0.6/PKG-INFO +0 -23
- mm_btc-0.0.6/setup.cfg +0 -4
- mm_btc-0.0.6/src/mm_btc.egg-info/PKG-INFO +0 -23
- mm_btc-0.0.6/src/mm_btc.egg-info/SOURCES.txt +0 -24
- mm_btc-0.0.6/src/mm_btc.egg-info/dependency_links.txt +0 -1
- mm_btc-0.0.6/src/mm_btc.egg-info/entry_points.txt +0 -2
- mm_btc-0.0.6/src/mm_btc.egg-info/requires.txt +0 -20
- mm_btc-0.0.6/src/mm_btc.egg-info/top_level.txt +0 -1
- {mm_btc-0.0.6 → mm_btc-0.1.0}/README.txt +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/__init__.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/cli/__init__.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/cli/cli.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/cli/cli_utils.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/cli/cmd/__init__.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/cli/cmd/address_cmd.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/cli/cmd/create_tx_cmd.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/cli/cmd/decode_tx_cmd.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/cli/cmd/mnemonic_cmd.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/cli/cmd/utxo_cmd.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/py.typed +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/tx.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/src/mm_btc/wallet.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/tests/test_blockstream.py +0 -0
- {mm_btc-0.0.6 → mm_btc-0.1.0}/tests/test_wallet.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
PROXIES_URL=https://site.com/api/proxies
|
mm_btc-0.1.0/.gitignore
ADDED
mm_btc-0.1.0/PKG-INFO
ADDED
mm_btc-0.1.0/justfile
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
set dotenv-load
|
|
2
|
+
version := `uv run python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])'`
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
clean:
|
|
6
|
+
rm -rf .pytest_cache .mypy_cache .ruff_cache .coverage dist build src/*.egg-info
|
|
7
|
+
|
|
8
|
+
build: clean lint audit test
|
|
9
|
+
uvx --from build pyproject-build --installer uv
|
|
10
|
+
|
|
11
|
+
format:
|
|
12
|
+
uv run ruff check --select I --fix src tests
|
|
13
|
+
uv run ruff format src tests
|
|
14
|
+
|
|
15
|
+
test:
|
|
16
|
+
uv run coverage run -m pytest -n auto tests
|
|
17
|
+
|
|
18
|
+
lint: format
|
|
19
|
+
uv run ruff check src tests
|
|
20
|
+
uv run mypy src
|
|
21
|
+
|
|
22
|
+
audit:
|
|
23
|
+
uv run pip-audit
|
|
24
|
+
uv run bandit -r -c "pyproject.toml" src
|
|
25
|
+
|
|
26
|
+
publish: build
|
|
27
|
+
git diff-index --quiet HEAD
|
|
28
|
+
uvx twine upload dist/**
|
|
29
|
+
git tag -a 'v{{version}}' -m 'v{{version}}'
|
|
30
|
+
git push origin v{{version}}
|
|
31
|
+
|
|
32
|
+
sync:
|
|
33
|
+
uv sync
|
|
@@ -1,39 +1,35 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mm-btc"
|
|
3
|
-
version = "0.0
|
|
3
|
+
version = "0.1.0"
|
|
4
4
|
description = ""
|
|
5
5
|
dependencies = [
|
|
6
|
-
"mm-std~=0.1.
|
|
6
|
+
"mm-std~=0.1.2",
|
|
7
7
|
"hdwallet~=2.2.1",
|
|
8
8
|
"bit~=0.8.0",
|
|
9
9
|
"bitcoinlib~=0.6.15",
|
|
10
10
|
"typer~=0.12.3"
|
|
11
11
|
]
|
|
12
12
|
requires-python = ">=3.12"
|
|
13
|
-
[project.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
[project.scripts]
|
|
14
|
+
mm-btc = "mm_btc.cli.cli:app"
|
|
15
|
+
|
|
16
|
+
[build-system]
|
|
17
|
+
requires = ["hatchling"]
|
|
18
|
+
build-backend = "hatchling.build"
|
|
19
|
+
|
|
20
|
+
[tool.uv]
|
|
21
|
+
dev-dependencies = [
|
|
22
|
+
"pytest~=8.3.3",
|
|
18
23
|
"pytest-xdist~=3.6.1",
|
|
19
|
-
"pytest-httpserver~=1.0
|
|
24
|
+
"pytest-httpserver~=1.1.0",
|
|
20
25
|
"coverage~=7.6.0",
|
|
21
|
-
"ruff~=0.
|
|
26
|
+
"ruff~=0.6.4",
|
|
22
27
|
"pip-audit~=2.7.0",
|
|
23
28
|
"bandit~=1.7.7",
|
|
24
|
-
"mypy~=1.11.
|
|
25
|
-
"types-python-dateutil~=2.9.0",
|
|
26
|
-
"types-requests~=2.32.0.20240523",
|
|
29
|
+
"mypy~=1.11.2",
|
|
30
|
+
"types-python-dateutil~=2.9.0.20240906",
|
|
27
31
|
"types-PyYAML~=6.0.12.12",
|
|
28
32
|
]
|
|
29
|
-
[project.scripts]
|
|
30
|
-
mm-btc = "mm_btc.cli.cli:app"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
[build-system]
|
|
34
|
-
requires = ["setuptools"]
|
|
35
|
-
build-backend = "setuptools.build_meta"
|
|
36
|
-
|
|
37
33
|
|
|
38
34
|
[tool.mypy]
|
|
39
35
|
python_version = "3.12"
|
|
@@ -44,7 +40,6 @@ exclude = ["^tests/", "^tmp/"]
|
|
|
44
40
|
module = ["hdwallet.*", "hdwallet.symbols.*", "bit.*", "bitcoinlib.transactions.*"]
|
|
45
41
|
ignore_missing_imports = true
|
|
46
42
|
|
|
47
|
-
|
|
48
43
|
[tool.ruff]
|
|
49
44
|
line-length = 130
|
|
50
45
|
target-version = "py312"
|
|
@@ -70,7 +65,6 @@ lint.ignore = [
|
|
|
70
65
|
quote-style = "double"
|
|
71
66
|
indent-style = "space"
|
|
72
67
|
|
|
73
|
-
|
|
74
68
|
[tool.bandit]
|
|
75
69
|
exclude_dirs = ["tests"]
|
|
76
70
|
skips = ["B311"]
|
|
@@ -14,6 +14,13 @@ ERROR_INVALID_NETWORK = "INVALID_NETWORK"
|
|
|
14
14
|
Proxy: TypeAlias = str | Sequence[str] | None
|
|
15
15
|
|
|
16
16
|
|
|
17
|
+
class Mempool(BaseModel):
|
|
18
|
+
count: int
|
|
19
|
+
vsize: int
|
|
20
|
+
total_fee: int
|
|
21
|
+
fee_histogram: list[tuple[float, int]]
|
|
22
|
+
|
|
23
|
+
|
|
17
24
|
class Address(BaseModel):
|
|
18
25
|
class ChainStats(BaseModel):
|
|
19
26
|
funded_txo_count: int
|
|
@@ -87,5 +94,17 @@ class BlockstreamClient:
|
|
|
87
94
|
result = Err(err, data=data)
|
|
88
95
|
return result
|
|
89
96
|
|
|
97
|
+
def get_mempool(self) -> Result[Mempool]:
|
|
98
|
+
result: Result[Mempool] = Err("not started yet")
|
|
99
|
+
data = None
|
|
100
|
+
for _ in range(self.attempts):
|
|
101
|
+
try:
|
|
102
|
+
res = self._request("/mempool")
|
|
103
|
+
data = res.to_dict()
|
|
104
|
+
return Ok(Mempool(**res.json), data=data)
|
|
105
|
+
except Exception as err:
|
|
106
|
+
result = Err(err, data=data)
|
|
107
|
+
return result
|
|
108
|
+
|
|
90
109
|
def _request(self, url: str) -> HResponse:
|
|
91
110
|
return hr(f"{self.base_url}{url}", timeout=self.timeout, proxy=random_str_choice(self.proxies))
|
|
File without changes
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from mm_std import run_command
|
|
3
|
+
|
|
4
|
+
from mm_btc.cli.cmd.mnemonic_cmd import get_derivation_path_prefix
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test_get_derivation_path_prefix():
|
|
8
|
+
assert get_derivation_path_prefix("m/11'/0'/0'/0", testnet=True) == "m/11'/0'/0'/0"
|
|
9
|
+
assert get_derivation_path_prefix("bip44", False) == "m/44'/0'/0'/0"
|
|
10
|
+
assert get_derivation_path_prefix("bip44", True) == "m/44'/1'/0'/0"
|
|
11
|
+
assert get_derivation_path_prefix("bip84", False) == "m/84'/0'/0'/0"
|
|
12
|
+
assert get_derivation_path_prefix("bip84", True) == "m/84'/1'/0'/0"
|
|
13
|
+
|
|
14
|
+
with pytest.raises(ValueError):
|
|
15
|
+
get_derivation_path_prefix("bip", True)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_mnemonic_cmd(mnemonic, passphrase):
|
|
19
|
+
cmd = f"mm-btc mnemonic -m '{mnemonic}' --passphrase '{passphrase}'"
|
|
20
|
+
res = run_command(cmd)
|
|
21
|
+
assert res.code == 0
|
|
22
|
+
assert "m/44'/0'/0'/0/7 1AJNF13C4xVvduE3D9pdtdDNFbL5Bm7T3u L3QF5FHUtX2a1ucGgVfrdhdvLHBSxsRQoGsv7tyY8P5Jt7UV9LZv"
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from mm_std import get_dotenv, hr
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@pytest.fixture()
|
|
6
|
+
def mnemonic() -> str:
|
|
7
|
+
return "hub blur cliff taste afraid master game milk nest change blame code"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@pytest.fixture
|
|
11
|
+
def passphrase() -> str:
|
|
12
|
+
return "my-secret"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@pytest.fixture()
|
|
16
|
+
def mainnet_bip44_address_0() -> str:
|
|
17
|
+
return "1Men3kiujJH7H5NXyKpFtWWtni1cTfSk48"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@pytest.fixture
|
|
21
|
+
def binance_address() -> str:
|
|
22
|
+
return "34xp4vRoCGJym3xR7yCVPFHoCNxv4Twseo"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@pytest.fixture
|
|
26
|
+
def proxies() -> list[str]:
|
|
27
|
+
proxies_url = get_dotenv("PROXIES_URL")
|
|
28
|
+
if proxies_url:
|
|
29
|
+
res = hr(proxies_url)
|
|
30
|
+
try:
|
|
31
|
+
return res.json["proxies"]
|
|
32
|
+
except KeyError:
|
|
33
|
+
pass
|
|
34
|
+
return []
|