Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update setup and requirements #114

Merged
merged 2 commits into from
Feb 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
include README.md
include CHANGELOG.md
include LICENSE
include requirements.txt
include requirements_test.txt
include Pipfile
include ethtx/providers/static/tracer.js
19 changes: 11 additions & 8 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,23 @@ verify_ssl = true
name = "pypi"

[packages]
pymongo = {extras = ["srv"], version = ">=3.12.0"}
toml = "*"
pymongo = ">=3.12.0"
dnspython = ">=2.2.0"
mongoengine = "==0.23.1"
mongomock = "==3.23.0"
requests = ">=2.26.0"
web3 = ">=5.25.0"
hexbytes = ">=0.2.2"
pydantic = ">=1.8.2"
web3 = "==5.26.0"
eth-account = "==0.5.6"
eth-utils = "==1.10.0"
eth-rlp = "==0.2.1"
pydantic = ">=1.9.0"
python-dotenv = "*"

[dev-packages]
black = "==19.3b0"
black = "*"
pytest = ">=6.2.5"
pytest-cov ="==3.0.0"
pytest-mock ="==3.6.1"
pytest-cov =">=3.0.0"
pytest-mock =">=3.6.1"
pre-commit = "*"

[requires]
Expand Down
93 changes: 62 additions & 31 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,15 @@ from ethtx.models.decoded_model import DecodedTransaction

ethtx_config = EthTxConfig(
mongo_connection_string="mongomock://localhost/ethtx", ##MongoDB connection string,
etherscan_api_key = "", ##Etherscan API key,
web3nodes = {
"mainnet": {
"hook": "_Geth_archive_node_URL_", # multiple nodes supported, separate them with comma
"poa": _POA_chain_indicator_ # represented by bool value
}
},
default_chain = "mainnet",
etherscan_urls = {"mainnet": "https://api.etherscan.io/api",},
etherscan_api_key="", ##Etherscan API key,
web3nodes={
"mainnet": {
"hook": "_Geth_archive_node_URL_", # multiple nodes supported, separate them with comma
"poa": _POA_chain_indicator_ # represented by bool value
}
},
default_chain="mainnet",
etherscan_urls={"mainnet": "https://api.etherscan.io/api", },
)

ethtx = EthTx.initialize(ethtx_config)
Expand All @@ -82,57 +82,88 @@ w3transaction: W3Transaction = web3provider.get_transaction(
'0x50051e0a6f216ab9484c2080001c7e12d5138250acee1f4b7c725b8fb6bb922d')
w3block: W3Block = web3provider.get_block(w3transaction.blockNumber)
w3receipt: W3Receipt = web3provider.get_receipt(w3transaction.hash.hex())
w3calls: W3CallTree = web3provider.get_calls(w3transaction.hash.hex()
w3calls: W3CallTree = web3provider.get_calls(w3transaction.hash.hex())
```

2. ABI decoding:

```python
from ethtx.models.objects_model import Transaction, Event, Call
from ethtx.models.decoded_model import DecodedEvent, DecodedCall, DecodedTransfer, DecodedBalance
from ethtx.models.decoded_model import (
DecodedTransfer,
DecodedBalance,
DecodedEvent, DecodedCall,
)
from ethtx.models.objects_model import Transaction, Event, Block, Call

# read the raw transaction from the node
transaction: Transaction = web3provider.get_full_transaction(
'0x50051e0a6f216ab9484c2080001c7e12d5138250acee1f4b7c725b8fb6bb922d')

# get proxies used in the transaction
proxies = ethtx.decoders.get_proxies(transaction.root_call, 'mainnet')

block: Block = Block.from_raw(
w3block=web3provider.get_block(
transaction.metadata.block_number
),
chain_id='mainnet',
)

# decode transaction components
abi_decoded_events: List[Event] = ethtx.decoders.abi_decoder.decode_events(transaction.events, transaction.metadata)
abi_decoded_calls: DecodedCall = ethtx.decoders.abi_decoder.decode_calls(transaction.root_call, transaction.metadata)
abi_decoded_transfers: List[DecodedTransfer] = ethtx.decoders.abi_decoder.decode_transfers(abi_decoded_calls,
abi_decoded_events)
abi_decoded_balances: List[DecodedBalance] = ethtx.decoders.abi_decoder.decode_balances(abi_decoded_transfers)
abi_decoded_events: List[Event] = ethtx.decoders.abi_decoder.decode_events(
transaction.events, block.metadata, transaction.metadata
)
abi_decoded_calls: DecodedCall = ethtx.decoders.abi_decoder.decode_calls(transaction.root_call, block.metadata,
transaction.metadata, proxies)
abi_decoded_transfers: List[
DecodedTransfer
] = ethtx.decoders.abi_decoder.decode_transfers(abi_decoded_calls, abi_decoded_events)
abi_decoded_balances: List[DecodedBalance] = ethtx.decoders.abi_decoder.decode_balances(
abi_decoded_transfers
)

# decode a single event
raw_event: Event = transaction.events[3]
abi_decoded_event: DecodedEvent = ethtx.decoders.abi_decoder.decode_event(raw_event, transaction.metadata)
abi_decoded_event: DecodedEvent = ethtx.decoders.abi_decoder.decode_event(raw_event, block.metadata,
transaction.metadata)

# decode a single call
raw_call: Call = transaction.root_call.subcalls[3].subcalls[2]
abi_decoded_call: DecodedCall = ethtx.decoders.abi_decoder.decode_call(raw_call, transaction.metadata)
raw_call: Call = transaction.root_call.subcalls[0]
abi_decoded_call: DecodedCall = ethtx.decoders.abi_decoder.decode_call(raw_call, block.metadata, transaction.metadata,
proxies)
```

3. Semantic decoding:

```python
from ethtx.models.decoded_model import DecodedTransactionMetadata

# get proxies used in the transaction
proxies = ethtx.decoders.get_proxies(transaction.root_call, chain_id)

# semantically decode transaction components
decoded_metadata: DecodedTransactionMetadata = ethtx.decoders.semantic_decoder.decode_metadata(block.metadata,
transaction.metadata,
chain_id)
decoded_events: List[DecodedEvent] = ethtx.decoders.semantic_decoder.decode_events(abi_decoded_events, decoded_metadata,
proxies)
decoded_metadata: DecodedTransactionMetadata = (
ethtx.decoders.semantic_decoder.decode_metadata(
block.metadata, transaction.metadata, 'mainnet'
)
)
decoded_events: List[DecodedEvent] = ethtx.decoders.semantic_decoder.decode_events(
abi_decoded_events, decoded_metadata, proxies
)

decoded_calls: Call = ethtx.decoders.semantic_decoder.decode_calls(abi_decoded_calls, decoded_metadata, proxies)
decoded_transfers: List[DecodedTransfer] = ethtx.decoders.semantic_decoder.decode_transfers(abi_decoded_transfers)
decoded_balances: List[DecodedBalance] = ethtx.decoders.semantic_decoder.decode_balances(abi_decoded_balances)
decoded_transfers: List[
DecodedTransfer
] = ethtx.decoders.semantic_decoder.decode_transfers(
abi_decoded_transfers, decoded_metadata
)
decoded_balances: List[
DecodedBalance
] = ethtx.decoders.semantic_decoder.decode_balances(
abi_decoded_balances, decoded_metadata
)

# semantically decode a single event
decoded_event: DecodedEvent = ethtx.decoders.semantic_decoder.decode_event(abi_decoded_events[0], decoded_metadata,
proxies)
# semantically decode a single call
decoded_call: Call = ethtx.decoders.semantic_decoder.decode_call(abi_decoded_calls.subcalls[2].subcalls[0],
decoded_call: Call = ethtx.decoders.semantic_decoder.decode_call(abi_decoded_calls.subcalls[0],
decoded_metadata, proxies)
```
12 changes: 0 additions & 12 deletions requirements.txt

This file was deleted.

22 changes: 17 additions & 5 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import sys
from shutil import rmtree

import toml
from setuptools import find_packages, setup, Command

# root dir
Expand Down Expand Up @@ -47,8 +48,19 @@

def load_requirements(fname):
"""Load requirements from file."""
with open(fname) as file:
return file.read().splitlines()
try:
with open(fname, "r") as fh:
pipfile = fh.read()
pipfile_toml = toml.loads(pipfile)
except FileNotFoundError:
return []

try:
required_packages = pipfile_toml["packages"].items()
except KeyError:
return []

return [f"{pkg}{ver}" if ver != "*" else pkg for pkg, ver in required_packages]


class UploadCommand(Command):
Expand Down Expand Up @@ -82,7 +94,7 @@ def run(self):
os.system("twine upload dist/*")

self.status("Pushing git tags…")
os.system("git tag v{0}".format(about["__version__"]))
os.system("git tag {0}".format(about["__version__"]))
os.system("git push --tags")

sys.exit()
Expand All @@ -101,13 +113,13 @@ def run(self):
url=URL,
license="Apache-2.0 License",
packages=find_packages(exclude=["tests"]),
install_requires=load_requirements("requirements.txt"),
install_requires=load_requirements("Pipfile"),
include_package_data=True,
test_suite="tests",
classifiers=[
"Operating System :: POSIX :: Linux",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
],
# $ setup.py publish support.
cmdclass={"upload": UploadCommand},
Expand Down