kopia lustrzana https://github.com/bugout-dev/moonstream
81 wiersze
2.3 KiB
Python
81 wiersze
2.3 KiB
Python
import logging
|
|
from typing import List
|
|
|
|
from moonstreamdb.blockchain import AvailableBlockchainType
|
|
from moonstreamdb.networks import blockchain_type_to_network_type # type: ignore
|
|
from moonworm.crawler.function_call_crawler import ( # type: ignore
|
|
ContractFunctionCall,
|
|
FunctionCallCrawler,
|
|
)
|
|
from moonworm.crawler.moonstream_ethereum_state_provider import ( # type: ignore
|
|
MoonstreamEthereumStateProvider,
|
|
)
|
|
from moonworm.watch import MockState # type: ignore
|
|
from sqlalchemy.orm import Session
|
|
from web3 import Web3
|
|
|
|
from .crawler import FunctionCallCrawlJob, _generate_reporter_callback
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def _crawl_functions(
|
|
blockchain_type: AvailableBlockchainType,
|
|
ethereum_state_provider: MoonstreamEthereumStateProvider,
|
|
jobs: List[FunctionCallCrawlJob],
|
|
from_block: int,
|
|
to_block: int,
|
|
) -> List[ContractFunctionCall]:
|
|
shared_state = MockState()
|
|
|
|
crawled_functions = []
|
|
|
|
for job in jobs:
|
|
function_call_crawler = FunctionCallCrawler(
|
|
shared_state,
|
|
ethereum_state_provider,
|
|
job.contract_abi,
|
|
[job.contract_address],
|
|
on_decode_error=_generate_reporter_callback(
|
|
"function_call", blockchain_type
|
|
),
|
|
)
|
|
function_call_crawler.crawl(
|
|
from_block,
|
|
to_block,
|
|
)
|
|
crawled_functions = shared_state.state
|
|
return crawled_functions
|
|
|
|
|
|
def function_call_crawler(
|
|
db_session: Session,
|
|
blockchain_type: AvailableBlockchainType,
|
|
web3: Web3,
|
|
jobs: List[FunctionCallCrawlJob],
|
|
start_block: int,
|
|
end_block: int,
|
|
batch_size: int,
|
|
):
|
|
try:
|
|
network = blockchain_type_to_network_type(blockchain_type=blockchain_type)
|
|
except Exception as e:
|
|
raise Exception(e)
|
|
|
|
ethereum_state_provider = MoonstreamEthereumStateProvider(
|
|
web3,
|
|
network,
|
|
db_session,
|
|
)
|
|
|
|
for i in range(start_block, end_block + 1, batch_size):
|
|
logger.info(f"Crawling from block {i} to {i + batch_size - 1}")
|
|
crawled_functions = _crawl_functions(
|
|
blockchain_type,
|
|
ethereum_state_provider,
|
|
jobs,
|
|
i,
|
|
min(i + batch_size - 1, end_block),
|
|
)
|