kopia lustrzana https://github.com/bugout-dev/moonstream
update erc20 populate
rodzic
3a8d1bbd70
commit
87ccc82049
|
|
@ -265,6 +265,74 @@ def _processEvent(raw_event: Dict[str, Any]):
|
|||
return event
|
||||
|
||||
|
||||
def populate_with_events(
|
||||
db_session: Session,
|
||||
web3: Web3,
|
||||
blockchain_type: AvailableBlockchainType,
|
||||
label_name: str,
|
||||
populate_from_label: str,
|
||||
abi: List[Dict[str, Any]],
|
||||
from_block: int,
|
||||
to_block: int,
|
||||
batch_size: int = 100,
|
||||
):
|
||||
db_blocks_cache = {}
|
||||
current_block = from_block
|
||||
|
||||
events_abi = [event for event in abi if event["type"] == "event"]
|
||||
label_model = get_label_model(blockchain_type)
|
||||
|
||||
pbar = tqdm(total=(to_block - from_block + 1))
|
||||
pbar.set_description(f"Populating events for blocks {from_block}-{to_block}")
|
||||
|
||||
while current_block <= to_block:
|
||||
batch_end = min(current_block + batch_size, to_block)
|
||||
events = []
|
||||
logger.info("Fetching events")
|
||||
for event_abi in events_abi:
|
||||
raw_events = _fetch_events_chunk(
|
||||
web3,
|
||||
event_abi,
|
||||
current_block,
|
||||
batch_end,
|
||||
)
|
||||
for raw_event in raw_events:
|
||||
raw_event["blockTimestamp"] = get_block_timestamp(
|
||||
db_session,
|
||||
web3,
|
||||
blockchain_type,
|
||||
raw_event["blockNumber"],
|
||||
blocks_cache=db_blocks_cache,
|
||||
max_blocks_batch=1000,
|
||||
)
|
||||
event = _processEvent(raw_event)
|
||||
events.append(event)
|
||||
logger.info(f"Fetched {len(events)} events")
|
||||
txs = (
|
||||
db_session.query(label_model.transaction_hash)
|
||||
.filter(
|
||||
label_name == populate_from_label,
|
||||
label_model.block_number >= current_block,
|
||||
label_model.block_number <= batch_end,
|
||||
)
|
||||
.distinct()
|
||||
.all()
|
||||
)
|
||||
txs_to_populate = [tx[0] for tx in txs]
|
||||
|
||||
events_to_save = []
|
||||
for event in events:
|
||||
if event.transaction_hash in txs_to_populate:
|
||||
events_to_save.append(event)
|
||||
|
||||
logger.info(f"Found {len(events_to_save)} events to save")
|
||||
|
||||
add_events_to_session(db_session, events_to_save, blockchain_type, label_name)
|
||||
commit_session(db_session)
|
||||
pbar.update(batch_end - current_block + 1)
|
||||
current_block = batch_end + 1
|
||||
|
||||
|
||||
def crawl(
|
||||
db_session: Session,
|
||||
web3: Web3,
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ from web3.middleware import geth_poa_middleware
|
|||
import json
|
||||
from mooncrawl.data import AvailableBlockchainType # type: ignore
|
||||
from ..blockchain import connect
|
||||
from .base import crawl, get_checkpoint
|
||||
from .base import crawl, get_checkpoint, populate_with_events
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
@ -19,11 +19,6 @@ def handle_nft_crawler(args: argparse.Namespace) -> None:
|
|||
|
||||
with open("mooncrawl/generic_crawler/abis/erc721.json") as f:
|
||||
abi = json.load(f)
|
||||
with open("mooncrawl/generic_crawler/abis/erc20.json") as f:
|
||||
erc20_abi = json.load(f)
|
||||
erc20_abi = [
|
||||
abi for abi in erc20_abi if abi.get("name") == "Transfer"
|
||||
] # only care about transfer event
|
||||
|
||||
label = args.label_name
|
||||
from_block = args.start_block
|
||||
|
|
@ -61,13 +56,65 @@ def handle_nft_crawler(args: argparse.Namespace) -> None:
|
|||
blockchain_type,
|
||||
label,
|
||||
abi,
|
||||
erc20_abi,
|
||||
[],
|
||||
from_block=last_crawled_block,
|
||||
to_block=to_block,
|
||||
batch_size=args.max_blocks_batch,
|
||||
)
|
||||
|
||||
|
||||
def populate_with_erc20_transfers(args: argparse.Namespace) -> None:
|
||||
logger.info(f"Starting erc20 transfer crawler")
|
||||
|
||||
label = args.label_name
|
||||
from_block = args.start_block
|
||||
to_block = args.end_block
|
||||
|
||||
with open(args.abi) as f:
|
||||
erc20_abi = json.load(f)
|
||||
# Taking only transfer event from erc20_abi
|
||||
erc20_abi = [
|
||||
event
|
||||
for event in erc20_abi
|
||||
if event["type"] == "event" and event["name"] == "Transfer"
|
||||
]
|
||||
|
||||
blockchain_type = AvailableBlockchainType(args.blockchain_type)
|
||||
|
||||
logger.info(f"Blockchain type: {blockchain_type.value}")
|
||||
with yield_db_session_ctx() as db_session:
|
||||
web3: Optional[Web3] = None
|
||||
if args.web3 is None:
|
||||
logger.info(
|
||||
"No web3 provider URL provided, using default (blockchan.py: connect())"
|
||||
)
|
||||
web3 = connect(blockchain_type)
|
||||
else:
|
||||
logger.info(f"Using web3 provider URL: {args.web3}")
|
||||
web3 = Web3(
|
||||
Web3.HTTPProvider(args.web3),
|
||||
)
|
||||
if args.poa:
|
||||
logger.info("Using PoA middleware")
|
||||
web3.middleware_onion.inject(geth_poa_middleware, layer=0)
|
||||
last_crawled_block = get_checkpoint(
|
||||
db_session, blockchain_type, from_block, to_block, label
|
||||
)
|
||||
|
||||
logger.info(f"Starting from block: {last_crawled_block}")
|
||||
populate_with_events(
|
||||
db_session,
|
||||
web3,
|
||||
blockchain_type,
|
||||
label,
|
||||
args.label_to_populate,
|
||||
erc20_abi,
|
||||
last_crawled_block,
|
||||
to_block,
|
||||
batch_size=args.max_blocks_batch,
|
||||
)
|
||||
|
||||
|
||||
def handle_crawl(args: argparse.Namespace) -> None:
|
||||
logger.info(f"Starting generic crawler")
|
||||
|
||||
|
|
@ -238,6 +285,75 @@ def main():
|
|||
|
||||
nft_crawler_parser.set_defaults(func=handle_nft_crawler)
|
||||
|
||||
erc20_populate_parser = subparsers.add_parser(
|
||||
"erc20_populate",
|
||||
help="Populate erc20 labels",
|
||||
)
|
||||
|
||||
erc20_populate_parser.add_argument(
|
||||
"--blockchain_type",
|
||||
type=str,
|
||||
required=True,
|
||||
choices=[
|
||||
"ethereum",
|
||||
"polygon",
|
||||
],
|
||||
)
|
||||
erc20_populate_parser.add_argument(
|
||||
"--web3",
|
||||
type=str,
|
||||
default=None,
|
||||
help="Web3 provider URL",
|
||||
)
|
||||
|
||||
erc20_populate_parser.add_argument(
|
||||
"--poa",
|
||||
action="store_true",
|
||||
default=False,
|
||||
help="Use PoA middleware",
|
||||
)
|
||||
|
||||
erc20_populate_parser.add_argument(
|
||||
"--start_block",
|
||||
type=int,
|
||||
default=None,
|
||||
)
|
||||
erc20_populate_parser.add_argument(
|
||||
"--end_block",
|
||||
type=int,
|
||||
default=None,
|
||||
)
|
||||
|
||||
erc20_populate_parser.add_argument(
|
||||
"--max_blocks_batch",
|
||||
type=int,
|
||||
default=500,
|
||||
help="Maximum number of blocks to crawl in a single crawl step",
|
||||
)
|
||||
|
||||
erc20_populate_parser.add_argument(
|
||||
"--label_name",
|
||||
type=str,
|
||||
required=True,
|
||||
help="Label name",
|
||||
)
|
||||
|
||||
erc20_populate_parser.add_argument(
|
||||
"--label_to_populate",
|
||||
type=str,
|
||||
required=True,
|
||||
help="Label name to populate",
|
||||
)
|
||||
|
||||
erc20_populate_parser.add_argument(
|
||||
"--abi",
|
||||
type=str,
|
||||
default=None,
|
||||
help="Abi of the erc20 contract",
|
||||
)
|
||||
|
||||
erc20_populate_parser.set_defaults(func=populate_with_erc20_transfers)
|
||||
|
||||
args = parser.parse_args()
|
||||
args.func(args)
|
||||
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue