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 +1 -3
- mm_eth/cli/cli_utils.py +5 -1
- mm_eth/cli/cmd/balances_cmd.py +0 -2
- mm_eth/cli/cmd/send_contract_cmd.py +0 -4
- mm_eth/cli/cmd/transfer_erc20_cmd.py +0 -3
- mm_eth/cli/cmd/transfer_eth_cmd.py +0 -3
- mm_eth/erc20.py +3 -7
- mm_eth/rpc.py +3 -6
- mm_eth/tx.py +3 -2
- {mm_eth-0.2.3.dist-info → mm_eth-0.2.5.dist-info}/METADATA +1 -1
- {mm_eth-0.2.3.dist-info → mm_eth-0.2.5.dist-info}/RECORD +13 -13
- {mm_eth-0.2.3.dist-info → mm_eth-0.2.5.dist-info}/WHEEL +0 -0
- {mm_eth-0.2.3.dist-info → mm_eth-0.2.5.dist-info}/entry_points.txt +0 -0
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.
|
|
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
|
|
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
|
|
mm_eth/cli/cmd/balances_cmd.py
CHANGED
|
@@ -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
|
|
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 =
|
|
137
|
-
return SignedTx(tx_hash=signed.hash.
|
|
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,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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
38
|
-
mm_eth/cli/cmd/transfer_eth_cmd.py,sha256=
|
|
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.
|
|
45
|
-
mm_eth-0.2.
|
|
46
|
-
mm_eth-0.2.
|
|
47
|
-
mm_eth-0.2.
|
|
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
|
|
File without changes
|