mm-eth 0.2.3__tar.gz → 0.2.5__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.3 → mm_eth-0.2.5}/PKG-INFO +1 -1
  2. {mm_eth-0.2.3 → mm_eth-0.2.5}/pyproject.toml +4 -1
  3. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/account.py +1 -3
  4. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cli_utils.py +5 -1
  5. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/balances_cmd.py +0 -2
  6. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/send_contract_cmd.py +0 -4
  7. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/transfer_erc20_cmd.py +0 -3
  8. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/transfer_eth_cmd.py +0 -3
  9. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/erc20.py +3 -7
  10. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/rpc.py +3 -6
  11. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/tx.py +3 -2
  12. {mm_eth-0.2.3 → mm_eth-0.2.5}/.gitignore +0 -0
  13. {mm_eth-0.2.3 → mm_eth-0.2.5}/README.txt +0 -0
  14. {mm_eth-0.2.3 → mm_eth-0.2.5}/justfile +0 -0
  15. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/__init__.py +0 -0
  16. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/abi.py +0 -0
  17. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/anvil.py +0 -0
  18. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/__init__.py +0 -0
  19. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/calcs.py +0 -0
  20. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cli.py +0 -0
  21. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/__init__.py +0 -0
  22. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/balance_cmd.py +0 -0
  23. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/call_contract_cmd.py +0 -0
  24. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/config_example_cmd.py +0 -0
  25. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/deploy_cmd.py +0 -0
  26. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/encode_input_data_cmd.py +0 -0
  27. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/mnemonic_cmd.py +0 -0
  28. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/node_cmd.py +0 -0
  29. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/private_key_cmd.py +0 -0
  30. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/rpc_cmd.py +0 -0
  31. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/solc_cmd.py +0 -0
  32. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/token_cmd.py +0 -0
  33. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/cmd/vault_cmd.py +0 -0
  34. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/config_examples/balances.yml +0 -0
  35. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/config_examples/call_contract.yml +0 -0
  36. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/config_examples/transfer_erc20.yml +0 -0
  37. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/config_examples/transfer_eth.yml +0 -0
  38. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/print_helpers.py +0 -0
  39. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/rpc_helpers.py +0 -0
  40. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/cli/validators.py +0 -0
  41. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/deploy.py +0 -0
  42. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/ens.py +0 -0
  43. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/ethernodes.py +0 -0
  44. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/py.typed +0 -0
  45. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/solc.py +0 -0
  46. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/types.py +0 -0
  47. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/utils.py +0 -0
  48. {mm_eth-0.2.3 → mm_eth-0.2.5}/src/mm_eth/vault.py +0 -0
  49. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/__init__.py +0 -0
  50. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/cli/__init__.py +0 -0
  51. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/cli/cmd/__init__.py +0 -0
  52. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/cli/cmd/test_balance_cmd.py +0 -0
  53. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/cli/cmd/test_mnemonic_cmd.py +0 -0
  54. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/cli/cmd/test_node_cmd.py +0 -0
  55. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/cli/cmd/test_private_key_cmd.py +0 -0
  56. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/cli/cmd/test_solc_cmd.py +0 -0
  57. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/conftest.py +0 -0
  58. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/contracts/ERC20.sol +0 -0
  59. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/contracts/abi/ERC20.json +0 -0
  60. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/test_abi.py +0 -0
  61. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/test_account.py +0 -0
  62. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/test_ethernodes.py +0 -0
  63. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/test_rpc.py +0 -0
  64. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/test_tx.py +0 -0
  65. {mm_eth-0.2.3 → mm_eth-0.2.5}/tests/test_utils.py +0 -0
  66. {mm_eth-0.2.3 → mm_eth-0.2.5}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mm-eth
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Requires-Python: >=3.12
5
5
  Requires-Dist: loguru~=0.7.3
6
6
  Requires-Dist: mm-std~=0.1.12
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mm-eth"
3
- version = "0.2.3"
3
+ version = "0.2.5"
4
4
  description = ""
5
5
  requires-python = ">=3.12"
6
6
  dependencies = [
@@ -47,6 +47,7 @@ target-version = "py313"
47
47
  [tool.ruff.lint]
48
48
  select = ["ALL"]
49
49
  ignore = [
50
+ "TC", # flake8-type-checking, TYPE_CHECKING is dangerous, for example it doesn't work with pydantic
50
51
  "A005", # flake8-builtins: stdlib-module-shadowing
51
52
  "ERA001", # eradicate: commented-out-code
52
53
  "PT", # flake8-pytest-style
@@ -68,6 +69,8 @@ ignore = [
68
69
  "RET503", # flake8-return: implicit-return
69
70
  "COM812", # it's used in ruff formatter
70
71
  ]
72
+ [tool.ruff.lint.pep8-naming]
73
+ classmethod-decorators = ["field_validator"]
71
74
  [tool.ruff.lint.per-file-ignores]
72
75
  "tests/*.py" = ["ANN", "S"]
73
76
  [tool.ruff.format]
@@ -39,9 +39,7 @@ def generate_accounts( # nosec
39
39
  for i in range(limit):
40
40
  path = f"{path_prefix}/{i}"
41
41
  acc = Account.from_mnemonic(mnemonic=mnemonic, account_path=path, passphrase=passphrase)
42
- private_key = acc.key.hex().lower()
43
- if not private_key.startswith("0x"):
44
- private_key = f"0x{private_key}"
42
+ private_key = acc.key.to_0x_hex().lower()
45
43
  result.append(NewAccount(path, acc.address, private_key))
46
44
  return result
47
45
 
@@ -11,7 +11,7 @@ from mm_eth.account import is_private_key
11
11
 
12
12
 
13
13
  def get_version() -> str:
14
- return importlib.metadata.version("mm-eth-cli")
14
+ return importlib.metadata.version("mm-eth")
15
15
 
16
16
 
17
17
  def public_rpc_url(url: str | None) -> str:
@@ -23,6 +23,10 @@ def public_rpc_url(url: str | None) -> str:
23
23
  match url.lower():
24
24
  case "opbnb" | "204":
25
25
  return "https://opbnb-mainnet-rpc.bnbchain.org"
26
+ case "base" | "8453":
27
+ return "https://mainnet.base.org"
28
+ case "base-sepolia" | "84532":
29
+ return "https://sepolia.base.org"
26
30
  case _:
27
31
  return url
28
32
 
@@ -17,12 +17,10 @@ class Config(BaseConfig):
17
17
  round_ndigits: int = 5
18
18
 
19
19
  @field_validator("nodes", mode="before")
20
- @classmethod
21
20
  def nodes_validator(cls, v: str | list[str] | None) -> list[str]:
22
21
  return validators.nodes_validator(v)
23
22
 
24
23
  @field_validator("tokens", "addresses", mode="before")
25
- @classmethod
26
24
  def addresses_validator(cls, v: str | list[str] | None) -> list[str]:
27
25
  return validators.addresses_validator(v)
28
26
 
@@ -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 {}
@@ -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 {}
@@ -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 {}
@@ -1,8 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import string
4
+ from collections.abc import Sequence
4
5
  from dataclasses import dataclass
5
- from typing import TYPE_CHECKING
6
6
 
7
7
  import eth_abi
8
8
  import eth_utils
@@ -11,15 +11,11 @@ from eth_utils import to_checksum_address, to_hex
11
11
  from mm_std import Err, Ok, Result
12
12
 
13
13
  from mm_eth import rpc
14
+ from mm_eth.rpc import Log
14
15
  from mm_eth.tx import SignedTx, sign_legacy_tx, sign_tx
16
+ from mm_eth.types import Nodes, Proxies
15
17
  from mm_eth.utils import hex_str_to_int, hex_to_bytes, log_topic_to_address
16
18
 
17
- if TYPE_CHECKING:
18
- from collections.abc import Sequence
19
-
20
- from mm_eth.rpc import Log
21
- from mm_eth.types import Nodes, Proxies
22
-
23
19
  TRANSFER_METHOD = "0xa9059cbb"
24
20
  TRANSFER_TOPIC = HexStr("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef")
25
21
 
@@ -2,19 +2,16 @@ from __future__ import annotations
2
2
 
3
3
  import json
4
4
  from dataclasses import dataclass
5
- from typing import TYPE_CHECKING, Any, Literal, cast
5
+ from typing import Any, Literal, cast
6
6
 
7
7
  import websocket
8
8
  from mm_std import Err, Ok, Result, hr, random_choice
9
9
  from pydantic import BaseModel
10
+ from web3.types import BlockIdentifier
10
11
 
12
+ from mm_eth.types import Nodes, Proxies
11
13
  from mm_eth.utils import hex_str_to_int, random_node, random_proxy
12
14
 
13
- if TYPE_CHECKING:
14
- from web3.types import BlockIdentifier
15
-
16
- from mm_eth.types import Nodes, Proxies
17
-
18
15
 
19
16
  @dataclass
20
17
  class TxReceipt:
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  from typing import Any
4
4
 
5
5
  import rlp
6
+ from eth_account import Account
6
7
  from eth_utils import keccak, to_hex
7
8
  from pydantic import BaseModel
8
9
  from rlp.sedes import Binary, big_endian_int, binary
@@ -133,8 +134,8 @@ def sign_tx(
133
134
  if to:
134
135
  tx["to"] = Web3.to_checksum_address(to)
135
136
 
136
- signed = w3.eth.account.sign_transaction(tx, private_key)
137
- return SignedTx(tx_hash=signed.hash.hex(), raw_tx=signed.raw_transaction.hex())
137
+ signed = Account.sign_transaction(tx, private_key)
138
+ return SignedTx(tx_hash=signed.hash.to_0x_hex(), raw_tx=signed.raw_transaction.to_0x_hex())
138
139
 
139
140
 
140
141
  def decode_raw_tx(raw_tx: str) -> DecodedRawTx:
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