mm-eth 0.2.3__py3-none-any.whl → 0.2.5__py3-none-any.whl

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_eth/account.py CHANGED
@@ -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
 
mm_eth/cli/cli_utils.py CHANGED
@@ -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 {}
mm_eth/erc20.py CHANGED
@@ -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
 
mm_eth/rpc.py CHANGED
@@ -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:
mm_eth/tx.py CHANGED
@@ -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:
@@ -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,28 +1,28 @@
1
1
  mm_eth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  mm_eth/abi.py,sha256=Qf-QOsR9QexyQM9XWKNeTMkRarIL3XQJbaDbJ8ifMrw,4856
3
- mm_eth/account.py,sha256=IsajQ7156-CxqRFt2ntv_3nJKwi6tCZz0TmtjUCgmIg,2038
3
+ mm_eth/account.py,sha256=iqAlSpqnSvZvj3cdosmpmheuObHOpedE8wNYWxXdkV4,1954
4
4
  mm_eth/anvil.py,sha256=98RCfI7dEpxFBTV6UErYvubWVP3n0ctUFn1--4kZ84U,1603
5
5
  mm_eth/deploy.py,sha256=SB3ruY808_5UnG8kHR34uVP66P3zOWZu0ImKD7UUv2s,691
6
6
  mm_eth/ens.py,sha256=WMxqC1v3zwDDuLH_oWekm22qrNYxCNcvZumQMT7SYds,623
7
- mm_eth/erc20.py,sha256=m0_yYzPYgOBx0oh4V330XGjRQBjMd5XlWhRL5qChvQE,6866
7
+ mm_eth/erc20.py,sha256=2IV7Ha_jDFTUh_rMncibl4CMdCZhq_rU4LzYOwBpiVQ,6801
8
8
  mm_eth/ethernodes.py,sha256=9y_poTmFUj6cnWaT9mtfc6S9lAfVXTwLGRqxMQ8hT0Y,3080
9
9
  mm_eth/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- mm_eth/rpc.py,sha256=F0jBzYw4wkh9LKwynXrzyhA08r5JTGrYAbwTH6C2Z7w,13872
10
+ mm_eth/rpc.py,sha256=u84VWM--tLEzfNtfW0jCzDnkd54KDbFmegN1IFwsw0g,13829
11
11
  mm_eth/solc.py,sha256=dYRvT8PjZlLDZhNsc_-0790Eug_ZwU2G-iBfIdGj6wQ,1071
12
- mm_eth/tx.py,sha256=J5Wky8rmV6NlMFmAYF4997PscRYlUdkYFpEldH3BCNg,4014
12
+ mm_eth/tx.py,sha256=efSoMCoWkenbGdHo1_LX66_Edz1HvED5-J_i3wrHwMw,4051
13
13
  mm_eth/types.py,sha256=vXXP5Dc72BpHv5tsyws0KDZebG1W1-5HH0UjL7N2Mgc,113
14
14
  mm_eth/utils.py,sha256=NICgROKU5ZTrkY6nlSDLHjbbpYYswLoofyc3ozPdwBs,7804
15
15
  mm_eth/vault.py,sha256=h8NyiOQh5YFskh1lZA3KyvnJUnxl9769ME2ChplG0CM,1477
16
16
  mm_eth/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  mm_eth/cli/calcs.py,sha256=yDx3VgFmCLRYWpZVqyk_-mXIgTVFDPKGTktx-7H2XDw,4426
18
18
  mm_eth/cli/cli.py,sha256=FfEgosWXa9gIGRuwSbPILvaDQ2Crh9hqTU50CqatvgY,8956
19
- mm_eth/cli/cli_utils.py,sha256=jkw2hDzR2hrYKmY8egR4RicLHe4RFjC7yhShtA0HzhQ,3682
19
+ mm_eth/cli/cli_utils.py,sha256=DMSb6bS0OKVDWyYVB8kdsD5H9KOIyUWdR6KK1f_2e9U,3839
20
20
  mm_eth/cli/print_helpers.py,sha256=yOiOFjTKloumwf07AqNIHQswUo8t0yuT9bpeGBGl60Q,1470
21
21
  mm_eth/cli/rpc_helpers.py,sha256=tAJBUHwpH0jPvg0Hrm-cwpOrpp9GUb91e4ZdwixNUQg,4723
22
22
  mm_eth/cli/validators.py,sha256=CWOXorI2HGajhLvQ354d2cCl5S3JC7tKUxWmmVn6j4Y,2417
23
23
  mm_eth/cli/cmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  mm_eth/cli/cmd/balance_cmd.py,sha256=SjRSbGF8QFMBHncEyzPdVUi_rjOwNW2wxfbFsRBV2A0,2097
25
- mm_eth/cli/cmd/balances_cmd.py,sha256=WIB9jhQP0Uut-JQ5H4gVouOxtUvQkqwobaidu4OvE60,4248
25
+ mm_eth/cli/cmd/balances_cmd.py,sha256=3kxgHBmMDbzt0E7iaNaVaP_YaQArttlHaOfnB2usez8,4214
26
26
  mm_eth/cli/cmd/call_contract_cmd.py,sha256=T6IHzxHuymJsEog2y7oMKNiHahip_W3FIk0adH4T0W4,1170
27
27
  mm_eth/cli/cmd/config_example_cmd.py,sha256=hMfrFxjIP0xZllJRRxi99qhF8tzJI3lrp-XudFEWF1g,270
28
28
  mm_eth/cli/cmd/deploy_cmd.py,sha256=nFJExEcKbm-6pE-r-XDY6pExOJywSSK7fN_gMZs9hc4,1173
@@ -31,17 +31,17 @@ mm_eth/cli/cmd/mnemonic_cmd.py,sha256=Mb0H0inSNCa93GEPxGYQi7BnPe11mnLjnspfe7h54I
31
31
  mm_eth/cli/cmd/node_cmd.py,sha256=mUqixPGNHzuKCJvk1Fd5VaUGumpbR2AE7raGmXZscg4,1943
32
32
  mm_eth/cli/cmd/private_key_cmd.py,sha256=Fv_2OLog1h32pIP7PJITwl_pHdy3BXvaDRcXZsxY1xo,241
33
33
  mm_eth/cli/cmd/rpc_cmd.py,sha256=02q82YqgbPezfEBmV_QBCIeNReE7ktkPych8Xr9ann8,2186
34
- mm_eth/cli/cmd/send_contract_cmd.py,sha256=53MRNTWA4tMqMRwt_VUziR1W1m97fYhiBrvELreYraM,9091
34
+ mm_eth/cli/cmd/send_contract_cmd.py,sha256=cGVP1hZOp64e5rN5uCsA2QkG5NIN9Car_2IZDWh4RvA,9023
35
35
  mm_eth/cli/cmd/solc_cmd.py,sha256=tBpeMdPfGs2iQIMaIJAAhMh1a3KyXHwyninfXPVpsgs,677
36
36
  mm_eth/cli/cmd/token_cmd.py,sha256=4y6ZQpLOJ33_iNuKpm9tZXh4RntWhmPUcizgaNNBzaw,1102
37
- mm_eth/cli/cmd/transfer_erc20_cmd.py,sha256=8IfLuqXV5OnPByrj3MTAsjyYn95X9f8IPKk0wHHcSPw,10246
38
- mm_eth/cli/cmd/transfer_eth_cmd.py,sha256=_nX_iCg6XPa8xjM1EwjE2CX-iDLj2vx0jNVXYq3UlzI,9420
37
+ mm_eth/cli/cmd/transfer_erc20_cmd.py,sha256=fNja8Krx5OLzEvZypt1d5CogrN9BsLHVG48DI1W0twM,10195
38
+ mm_eth/cli/cmd/transfer_eth_cmd.py,sha256=_LgSGaFD0GbzODA3OfIUXjKGFSNBHltNM0fcgDbnEN8,9369
39
39
  mm_eth/cli/cmd/vault_cmd.py,sha256=rRTclz0U6N_87KFsssdvZhi3_f6tmkHiYxMsIoVeBGc,532
40
40
  mm_eth/cli/config_examples/balances.yml,sha256=fpXJfoOSqOrkoWpqO7-HrTTb5OBs9PM-PpZ1ulqWUnY,399
41
41
  mm_eth/cli/config_examples/call_contract.yml,sha256=E0XuWuBnbhyTYfxNqaoxH6Cy7UCYqMLDwoEu_4OSV3M,233
42
42
  mm_eth/cli/config_examples/transfer_erc20.yml,sha256=mCUpUfqzZjTvst8kqd3EGzJY0S7cr48ySqS6yZhzLdI,1324
43
43
  mm_eth/cli/config_examples/transfer_eth.yml,sha256=i4hh3-LTcpl7JsrSuuM6gDi23B5ZnCeEnaYazQO3bzQ,1181
44
- mm_eth-0.2.3.dist-info/METADATA,sha256=8FzuizpFSQqE8u73z4BDoTMQlE2S6cSxEj-iUyI_d_Q,228
45
- mm_eth-0.2.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
46
- mm_eth-0.2.3.dist-info/entry_points.txt,sha256=aGhpsozl8NIrkuUcX5fSgURCcDhr3ShUdeTSIrJq4oc,46
47
- mm_eth-0.2.3.dist-info/RECORD,,
44
+ mm_eth-0.2.5.dist-info/METADATA,sha256=Mr7RQIAKsxfuTeNonQ-cNMoQhKebpPp0dkRsPZ54zyE,228
45
+ mm_eth-0.2.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
46
+ mm_eth-0.2.5.dist-info/entry_points.txt,sha256=aGhpsozl8NIrkuUcX5fSgURCcDhr3ShUdeTSIrJq4oc,46
47
+ mm_eth-0.2.5.dist-info/RECORD,,
File without changes