mm-eth 0.2.2__tar.gz → 0.2.4__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 (66) hide show
  1. {mm_eth-0.2.2 → mm_eth-0.2.4}/PKG-INFO +2 -2
  2. {mm_eth-0.2.2 → mm_eth-0.2.4}/pyproject.toml +4 -2
  3. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cli_utils.py +4 -7
  4. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/balances_cmd.py +3 -9
  5. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/call_contract_cmd.py +3 -7
  6. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/deploy_cmd.py +3 -8
  7. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/send_contract_cmd.py +3 -9
  8. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/transfer_erc20_cmd.py +3 -8
  9. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/transfer_eth_cmd.py +3 -8
  10. {mm_eth-0.2.2 → mm_eth-0.2.4}/uv.lock +4 -4
  11. {mm_eth-0.2.2 → mm_eth-0.2.4}/.gitignore +0 -0
  12. {mm_eth-0.2.2 → mm_eth-0.2.4}/README.txt +0 -0
  13. {mm_eth-0.2.2 → mm_eth-0.2.4}/justfile +0 -0
  14. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/__init__.py +0 -0
  15. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/abi.py +0 -0
  16. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/account.py +0 -0
  17. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/anvil.py +0 -0
  18. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/__init__.py +0 -0
  19. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/calcs.py +0 -0
  20. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cli.py +0 -0
  21. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/__init__.py +0 -0
  22. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/balance_cmd.py +0 -0
  23. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/config_example_cmd.py +0 -0
  24. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/encode_input_data_cmd.py +0 -0
  25. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/mnemonic_cmd.py +0 -0
  26. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/node_cmd.py +0 -0
  27. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/private_key_cmd.py +0 -0
  28. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/rpc_cmd.py +0 -0
  29. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/solc_cmd.py +0 -0
  30. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/token_cmd.py +0 -0
  31. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/cmd/vault_cmd.py +0 -0
  32. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/config_examples/balances.yml +0 -0
  33. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/config_examples/call_contract.yml +0 -0
  34. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/config_examples/transfer_erc20.yml +0 -0
  35. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/config_examples/transfer_eth.yml +0 -0
  36. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/print_helpers.py +0 -0
  37. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/rpc_helpers.py +0 -0
  38. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/cli/validators.py +0 -0
  39. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/deploy.py +0 -0
  40. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/ens.py +0 -0
  41. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/erc20.py +0 -0
  42. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/ethernodes.py +0 -0
  43. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/py.typed +0 -0
  44. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/rpc.py +0 -0
  45. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/solc.py +0 -0
  46. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/tx.py +0 -0
  47. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/types.py +0 -0
  48. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/utils.py +0 -0
  49. {mm_eth-0.2.2 → mm_eth-0.2.4}/src/mm_eth/vault.py +0 -0
  50. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/__init__.py +0 -0
  51. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/cli/__init__.py +0 -0
  52. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/cli/cmd/__init__.py +0 -0
  53. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/cli/cmd/test_balance_cmd.py +0 -0
  54. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/cli/cmd/test_mnemonic_cmd.py +0 -0
  55. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/cli/cmd/test_node_cmd.py +0 -0
  56. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/cli/cmd/test_private_key_cmd.py +0 -0
  57. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/cli/cmd/test_solc_cmd.py +0 -0
  58. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/conftest.py +0 -0
  59. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/contracts/ERC20.sol +0 -0
  60. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/contracts/abi/ERC20.json +0 -0
  61. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/test_abi.py +0 -0
  62. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/test_account.py +0 -0
  63. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/test_ethernodes.py +0 -0
  64. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/test_rpc.py +0 -0
  65. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/test_tx.py +0 -0
  66. {mm_eth-0.2.2 → mm_eth-0.2.4}/tests/test_utils.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mm-eth
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Requires-Python: >=3.12
5
5
  Requires-Dist: loguru~=0.7.3
6
- Requires-Dist: mm-std~=0.1.11
6
+ Requires-Dist: mm-std~=0.1.12
7
7
  Requires-Dist: typer>=0.15.1
8
8
  Requires-Dist: web3~=7.7.0
9
9
  Requires-Dist: websocket-client~=1.8.0
@@ -1,10 +1,10 @@
1
1
  [project]
2
2
  name = "mm-eth"
3
- version = "0.2.2"
3
+ version = "0.2.4"
4
4
  description = ""
5
5
  requires-python = ">=3.12"
6
6
  dependencies = [
7
- "mm-std~=0.1.11",
7
+ "mm-std~=0.1.12",
8
8
  "websocket-client~=1.8.0",
9
9
  "web3~=7.7.0",
10
10
  "loguru~=0.7.3",
@@ -68,6 +68,8 @@ ignore = [
68
68
  "RET503", # flake8-return: implicit-return
69
69
  "COM812", # it's used in ruff formatter
70
70
  ]
71
+ [tool.ruff.lint.pep8-naming]
72
+ classmethod-decorators = ["field_validator"]
71
73
  [tool.ruff.lint.per-file-ignores]
72
74
  "tests/*.py" = ["ANN", "S"]
73
75
  [tool.ruff.format]
@@ -96,10 +96,7 @@ def load_private_keys_from_file(private_keys_file: str) -> list[str]:
96
96
  return [line for line in lines if is_private_key(line)]
97
97
 
98
98
 
99
- def read_config[T: BaseConfig](config_type: type[T], config_path: Path) -> T:
100
- res = config_type.read_config(config_path)
101
- if res.is_ok():
102
- return res.unwrap()
103
-
104
- print_json(res.err)
105
- sys.exit(1)
99
+ def print_config_and_exit(exit_: bool, config: BaseConfig, exclude: set[str] | None = None) -> None:
100
+ if exit_:
101
+ print_json(config.model_dump(exclude=exclude))
102
+ sys.exit(0)
@@ -1,8 +1,6 @@
1
- import sys
2
1
  from dataclasses import dataclass
3
- from pathlib import Path
4
2
 
5
- from mm_std import BaseConfig, Err, Ok, fatal, print_json
3
+ from mm_std import BaseConfig, Err, Ok, fatal
6
4
  from pydantic import Field, field_validator
7
5
  from rich.live import Live
8
6
  from rich.table import Table
@@ -19,12 +17,10 @@ class Config(BaseConfig):
19
17
  round_ndigits: int = 5
20
18
 
21
19
  @field_validator("nodes", mode="before")
22
- @classmethod
23
20
  def nodes_validator(cls, v: str | list[str] | None) -> list[str]:
24
21
  return validators.nodes_validator(v)
25
22
 
26
23
  @field_validator("tokens", "addresses", mode="before")
27
- @classmethod
28
24
  def addresses_validator(cls, v: str | list[str] | None) -> list[str]:
29
25
  return validators.addresses_validator(v)
30
26
 
@@ -37,10 +33,8 @@ class Token:
37
33
 
38
34
 
39
35
  def run(config_path: str, print_config: bool, wei: bool, show_nonce: bool) -> None:
40
- config = cli_utils.read_config(Config, Path(config_path))
41
- if print_config:
42
- print_json(config.model_dump())
43
- sys.exit(0)
36
+ config = Config.read_config_or_exit(config_path)
37
+ cli_utils.print_config_and_exit(print_config, config)
44
38
 
45
39
  tokens = _get_tokens_info(config)
46
40
 
@@ -1,9 +1,7 @@
1
1
  import json
2
- import sys
3
2
  from logging import fatal
4
- from pathlib import Path
5
3
 
6
- from mm_std import BaseConfig, Err, print_json, print_plain
4
+ from mm_std import BaseConfig, Err, print_plain
7
5
  from pydantic import StrictStr
8
6
 
9
7
  from mm_eth import abi, rpc
@@ -19,10 +17,8 @@ class Config(BaseConfig):
19
17
 
20
18
 
21
19
  def run(config_path: str, print_config: bool) -> None:
22
- config = cli_utils.read_config(Config, Path(config_path))
23
- if print_config:
24
- print_json(config.model_dump())
25
- sys.exit(0)
20
+ config = Config.read_config_or_exit(config_path)
21
+ cli_utils.print_config_and_exit(print_config, config)
26
22
 
27
23
  input_data = abi.encode_function_input_by_signature(
28
24
  config.function_signature,
@@ -1,8 +1,5 @@
1
- import sys
2
- from pathlib import Path
3
-
4
1
  import yaml
5
- from mm_std import BaseConfig, fatal, print_json
2
+ from mm_std import BaseConfig, fatal
6
3
  from pydantic import StrictStr
7
4
 
8
5
  from mm_eth import account, deploy
@@ -24,10 +21,8 @@ class Config(BaseConfig):
24
21
 
25
22
 
26
23
  def run(config_path: str, *, print_config: bool) -> None:
27
- config = cli_utils.read_config(Config, Path(config_path))
28
- if print_config:
29
- print_json(config.model_dump(exclude={"private_key"}))
30
- sys.exit(0)
24
+ config = Config.read_config_or_exit(config_path)
25
+ cli_utils.print_config_and_exit(print_config, config, {"private_key"})
31
26
 
32
27
  constructor_types = yaml.full_load(config.constructor_types)
33
28
  constructor_values = yaml.full_load(config.constructor_values)
@@ -5,7 +5,7 @@ from pathlib import Path
5
5
  from typing import Self
6
6
 
7
7
  from loguru import logger
8
- from mm_std import BaseConfig, Err, Ok, print_json, str_to_list, utc_now
8
+ from mm_std import BaseConfig, Err, Ok, str_to_list, utc_now
9
9
  from pydantic import Field, StrictStr, field_validator, model_validator
10
10
 
11
11
  from mm_eth import abi, rpc
@@ -35,22 +35,18 @@ class Config(BaseConfig):
35
35
  log_info: str | None = None
36
36
 
37
37
  @field_validator("log_debug", "log_info", mode="before")
38
- @classmethod
39
38
  def log_validator(cls, v: str | None) -> str | None:
40
39
  return validators.log_validator(v)
41
40
 
42
41
  @field_validator("nodes", "from_addresses", mode="before")
43
- @classmethod
44
42
  def list_validator(cls, v: str | list[str] | None) -> list[str]:
45
43
  return validators.nodes_validator(v)
46
44
 
47
45
  @field_validator("from_addresses", mode="before")
48
- @classmethod
49
46
  def from_addresses_validator(cls, v: str | list[str] | None) -> list[str]:
50
47
  return str_to_list(v, remove_comments=True, lower=True)
51
48
 
52
49
  @field_validator("private_keys", mode="before")
53
- @classmethod
54
50
  def private_keys_validator(cls, v: str | list[str] | None) -> dict[str, str]:
55
51
  if v is None:
56
52
  return {}
@@ -118,10 +114,8 @@ def run(
118
114
  no_receipt: bool,
119
115
  emulate: bool,
120
116
  ) -> None:
121
- config = cli_utils.read_config(Config, Path(config_path))
122
- if print_config:
123
- print_json(config.model_dump(exclude={"private_key"}))
124
- sys.exit(0)
117
+ config = Config.read_config_or_exit(config_path)
118
+ cli_utils.print_config_and_exit(print_config, config, {"private_key"})
125
119
 
126
120
  cli_utils.init_logger(debug, config.log_debug, config.log_info)
127
121
  rpc_helpers.check_nodes_for_chain_id(config.nodes, config.chain_id)
@@ -4,7 +4,7 @@ from pathlib import Path
4
4
  from typing import Self
5
5
 
6
6
  from loguru import logger
7
- from mm_std import BaseConfig, Err, Ok, fatal, print_json, str_to_list, utc_now
7
+ from mm_std import BaseConfig, Err, Ok, fatal, str_to_list, utc_now
8
8
  from pydantic import Field, StrictStr, field_validator, model_validator
9
9
 
10
10
  from mm_eth import erc20, rpc
@@ -44,17 +44,14 @@ class Config(BaseConfig):
44
44
  return [tx.from_address for tx in self.txs]
45
45
 
46
46
  @field_validator("log_debug", "log_info", mode="before")
47
- @classmethod
48
47
  def log_validator(cls, v: str | None) -> str | None:
49
48
  return validators.log_validator(v)
50
49
 
51
50
  @field_validator("nodes", mode="before")
52
- @classmethod
53
51
  def nodes_validator(cls, v: str | list[str] | None) -> list[str]:
54
52
  return validators.nodes_validator(v)
55
53
 
56
54
  @field_validator("private_keys", mode="before")
57
- @classmethod
58
55
  def private_keys_validator(cls, v: str | list[str] | None) -> dict[str, str]:
59
56
  if v is None:
60
57
  return {}
@@ -130,10 +127,8 @@ def run(
130
127
  no_receipt: bool,
131
128
  emulate: bool,
132
129
  ) -> None:
133
- config = cli_utils.read_config(Config, Path(config_path))
134
- if print_config:
135
- print_json(config.model_dump(exclude={"private_key", "addresses_map"}))
136
- sys.exit(0)
130
+ config = Config.read_config_or_exit(config_path)
131
+ cli_utils.print_config_and_exit(print_config, config, {"private_key", "addresses_map"})
137
132
 
138
133
  cli_utils.init_logger(debug, config.log_debug, config.log_info)
139
134
  rpc_helpers.check_nodes_for_chain_id(config.nodes, config.chain_id)
@@ -4,7 +4,7 @@ from pathlib import Path
4
4
  from typing import Self
5
5
 
6
6
  from loguru import logger
7
- from mm_std import BaseConfig, Err, Ok, print_json, str_to_list, utc_now
7
+ from mm_std import BaseConfig, Err, Ok, str_to_list, utc_now
8
8
  from pydantic import Field, StrictStr, field_validator, model_validator
9
9
 
10
10
  from mm_eth import rpc
@@ -43,17 +43,14 @@ class Config(BaseConfig):
43
43
  return [tx.from_address for tx in self.txs]
44
44
 
45
45
  @field_validator("log_debug", "log_info", mode="before")
46
- @classmethod
47
46
  def log_validator(cls, v: str | None) -> str | None:
48
47
  return validators.log_validator(v)
49
48
 
50
49
  @field_validator("nodes", mode="before")
51
- @classmethod
52
50
  def nodes_validator(cls, v: str | list[str] | None) -> list[str]:
53
51
  return validators.nodes_validator(v)
54
52
 
55
53
  @field_validator("private_keys", mode="before")
56
- @classmethod
57
54
  def private_keys_validator(cls, v: str | list[str] | None) -> dict[str, str]:
58
55
  if v is None:
59
56
  return {}
@@ -128,10 +125,8 @@ def run(
128
125
  no_receipt: bool,
129
126
  emulate: bool,
130
127
  ) -> None:
131
- config = cli_utils.read_config(Config, Path(config_path))
132
- if print_config:
133
- print_json(config.model_dump(exclude={"private_key", "addresses_map"}))
134
- sys.exit(0)
128
+ config = Config.read_config_or_exit(config_path)
129
+ cli_utils.print_config_and_exit(print_config, config, {"private_key", "addresses_map"})
135
130
 
136
131
  cli_utils.init_logger(debug, config.log_debug, config.log_info)
137
132
  rpc_helpers.check_nodes_for_chain_id(config.nodes, config.chain_id)
@@ -730,7 +730,7 @@ wheels = [
730
730
 
731
731
  [[package]]
732
732
  name = "mm-eth"
733
- version = "0.2.1"
733
+ version = "0.2.2"
734
734
  source = { editable = "." }
735
735
  dependencies = [
736
736
  { name = "loguru" },
@@ -754,7 +754,7 @@ dev = [
754
754
  [package.metadata]
755
755
  requires-dist = [
756
756
  { name = "loguru", specifier = "~=0.7.3" },
757
- { name = "mm-std", specifier = "~=0.1.11" },
757
+ { name = "mm-std", specifier = "~=0.1.12" },
758
758
  { name = "typer", specifier = ">=0.15.1" },
759
759
  { name = "web3", specifier = "~=7.7.0" },
760
760
  { name = "websocket-client", specifier = "~=1.8.0" },
@@ -773,7 +773,7 @@ dev = [
773
773
 
774
774
  [[package]]
775
775
  name = "mm-std"
776
- version = "0.1.11"
776
+ version = "0.1.12"
777
777
  source = { registry = "https://pypi.org/simple" }
778
778
  dependencies = [
779
779
  { name = "cryptography" },
@@ -785,7 +785,7 @@ dependencies = [
785
785
  { name = "rich" },
786
786
  ]
787
787
  wheels = [
788
- { url = "https://files.pythonhosted.org/packages/45/44/9b5b90015a3aa2906f1eb15a4d4404635f6b05e43c5023b770bd4c7d7774/mm_std-0.1.11-py3-none-any.whl", hash = "sha256:3ea736ccb313bf6d0c37272104ba1f79deb0874c07bd6091d504fcf9e703cdfe", size = 14444 },
788
+ { url = "https://files.pythonhosted.org/packages/ca/18/ea37b98761b2d39ff2d45e985e4ef5eedae08a421cee3ee19088a9c0da03/mm_std-0.1.12-py3-none-any.whl", hash = "sha256:2e3d3ed745755096cecf9690ca2fb772abed1a4064935717ce3c8824b7cabd83", size = 14699 },
789
789
  ]
790
790
 
791
791
  [[package]]
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes