mm-btc 0.0.6__tar.gz → 0.1.1__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.
Files changed (34) hide show
  1. mm_btc-0.1.1/.env.example +1 -0
  2. mm_btc-0.1.1/.gitignore +15 -0
  3. mm_btc-0.1.1/PKG-INFO +10 -0
  4. mm_btc-0.1.1/justfile +33 -0
  5. {mm_btc-0.0.6 → mm_btc-0.1.1}/pyproject.toml +19 -23
  6. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/blockstream.py +19 -0
  7. mm_btc-0.1.1/tests/__init__.py +0 -0
  8. mm_btc-0.1.1/tests/cli/cmd/test_mnemonic_cmd.py +22 -0
  9. mm_btc-0.1.1/tests/conftest.py +34 -0
  10. mm_btc-0.1.1/uv.lock +1239 -0
  11. mm_btc-0.0.6/PKG-INFO +0 -23
  12. mm_btc-0.0.6/setup.cfg +0 -4
  13. mm_btc-0.0.6/src/mm_btc.egg-info/PKG-INFO +0 -23
  14. mm_btc-0.0.6/src/mm_btc.egg-info/SOURCES.txt +0 -24
  15. mm_btc-0.0.6/src/mm_btc.egg-info/dependency_links.txt +0 -1
  16. mm_btc-0.0.6/src/mm_btc.egg-info/entry_points.txt +0 -2
  17. mm_btc-0.0.6/src/mm_btc.egg-info/requires.txt +0 -20
  18. mm_btc-0.0.6/src/mm_btc.egg-info/top_level.txt +0 -1
  19. {mm_btc-0.0.6 → mm_btc-0.1.1}/README.txt +0 -0
  20. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/__init__.py +0 -0
  21. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/cli/__init__.py +0 -0
  22. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/cli/cli.py +0 -0
  23. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/cli/cli_utils.py +0 -0
  24. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/cli/cmd/__init__.py +0 -0
  25. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/cli/cmd/address_cmd.py +0 -0
  26. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/cli/cmd/create_tx_cmd.py +0 -0
  27. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/cli/cmd/decode_tx_cmd.py +0 -0
  28. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/cli/cmd/mnemonic_cmd.py +0 -0
  29. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/cli/cmd/utxo_cmd.py +0 -0
  30. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/py.typed +0 -0
  31. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/tx.py +0 -0
  32. {mm_btc-0.0.6 → mm_btc-0.1.1}/src/mm_btc/wallet.py +0 -0
  33. {mm_btc-0.0.6 → mm_btc-0.1.1}/tests/test_blockstream.py +0 -0
  34. {mm_btc-0.0.6 → mm_btc-0.1.1}/tests/test_wallet.py +0 -0
@@ -0,0 +1 @@
1
+ PROXIES_URL=https://site.com/api/proxies
@@ -0,0 +1,15 @@
1
+ .idea
2
+ .venv
3
+ .env
4
+ .coverage
5
+ /htmlcov
6
+ __pycache__
7
+ *.egg-info
8
+ pip-wheel-metadata
9
+ .pytest_cache
10
+ .mypy_cache
11
+ .ruff_cache
12
+ /dist
13
+ /build
14
+ /tmp
15
+ .DS_Store
mm_btc-0.1.1/PKG-INFO ADDED
@@ -0,0 +1,10 @@
1
+ Metadata-Version: 2.3
2
+ Name: mm-btc
3
+ Version: 0.1.1
4
+ Requires-Python: >=3.12
5
+ Requires-Dist: bitcoinlib~=0.6.15
6
+ Requires-Dist: bit~=0.8.0
7
+ Requires-Dist: hdwallet~=2.2.1
8
+ Requires-Dist: mm-std~=0.1.2
9
+ Provides-Extra: cli
10
+ Requires-Dist: typer~=0.12.5; extra == 'cli'
mm_btc-0.1.1/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,37 @@
1
1
  [project]
2
2
  name = "mm-btc"
3
- version = "0.0.6"
3
+ version = "0.1.1"
4
4
  description = ""
5
+ requires-python = ">=3.12"
5
6
  dependencies = [
6
- "mm-std~=0.1.0",
7
+ "mm-std~=0.1.2",
7
8
  "hdwallet~=2.2.1",
8
9
  "bit~=0.8.0",
9
10
  "bitcoinlib~=0.6.15",
10
- "typer~=0.12.3"
11
+
11
12
  ]
12
- requires-python = ">=3.12"
13
13
  [project.optional-dependencies]
14
- dev = [
15
- "build~=1.2.1",
16
- "twine~=5.1.0",
17
- "pytest~=8.3.2",
14
+ cli = ["typer~=0.12.5"]
15
+ [project.scripts]
16
+ mm-btc = "mm_btc.cli.cli:app"
17
+
18
+ [build-system]
19
+ requires = ["hatchling"]
20
+ build-backend = "hatchling.build"
21
+
22
+ [tool.uv]
23
+ dev-dependencies = [
24
+ "pytest~=8.3.3",
18
25
  "pytest-xdist~=3.6.1",
19
- "pytest-httpserver~=1.0.8",
26
+ "pytest-httpserver~=1.1.0",
20
27
  "coverage~=7.6.0",
21
- "ruff~=0.5.2",
28
+ "ruff~=0.6.4",
22
29
  "pip-audit~=2.7.0",
23
30
  "bandit~=1.7.7",
24
- "mypy~=1.11.0",
25
- "types-python-dateutil~=2.9.0",
26
- "types-requests~=2.32.0.20240523",
31
+ "mypy~=1.11.2",
32
+ "types-python-dateutil~=2.9.0.20240906",
27
33
  "types-PyYAML~=6.0.12.12",
28
34
  ]
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
35
 
38
36
  [tool.mypy]
39
37
  python_version = "3.12"
@@ -44,7 +42,6 @@ exclude = ["^tests/", "^tmp/"]
44
42
  module = ["hdwallet.*", "hdwallet.symbols.*", "bit.*", "bitcoinlib.transactions.*"]
45
43
  ignore_missing_imports = true
46
44
 
47
-
48
45
  [tool.ruff]
49
46
  line-length = 130
50
47
  target-version = "py312"
@@ -70,7 +67,6 @@ lint.ignore = [
70
67
  quote-style = "double"
71
68
  indent-style = "space"
72
69
 
73
-
74
70
  [tool.bandit]
75
71
  exclude_dirs = ["tests"]
76
72
  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 []