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
|
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(
|
def crawl(
|
||||||
db_session: Session,
|
db_session: Session,
|
||||||
web3: Web3,
|
web3: Web3,
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ from web3.middleware import geth_poa_middleware
|
||||||
import json
|
import json
|
||||||
from mooncrawl.data import AvailableBlockchainType # type: ignore
|
from mooncrawl.data import AvailableBlockchainType # type: ignore
|
||||||
from ..blockchain import connect
|
from ..blockchain import connect
|
||||||
from .base import crawl, get_checkpoint
|
from .base import crawl, get_checkpoint, populate_with_events
|
||||||
|
|
||||||
logging.basicConfig(level=logging.INFO)
|
logging.basicConfig(level=logging.INFO)
|
||||||
logger = logging.getLogger(__name__)
|
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:
|
with open("mooncrawl/generic_crawler/abis/erc721.json") as f:
|
||||||
abi = json.load(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
|
label = args.label_name
|
||||||
from_block = args.start_block
|
from_block = args.start_block
|
||||||
|
|
@ -61,13 +56,65 @@ def handle_nft_crawler(args: argparse.Namespace) -> None:
|
||||||
blockchain_type,
|
blockchain_type,
|
||||||
label,
|
label,
|
||||||
abi,
|
abi,
|
||||||
erc20_abi,
|
[],
|
||||||
from_block=last_crawled_block,
|
from_block=last_crawled_block,
|
||||||
to_block=to_block,
|
to_block=to_block,
|
||||||
batch_size=args.max_blocks_batch,
|
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:
|
def handle_crawl(args: argparse.Namespace) -> None:
|
||||||
logger.info(f"Starting generic crawler")
|
logger.info(f"Starting generic crawler")
|
||||||
|
|
||||||
|
|
@ -238,6 +285,75 @@ def main():
|
||||||
|
|
||||||
nft_crawler_parser.set_defaults(func=handle_nft_crawler)
|
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 = parser.parse_args()
|
||||||
args.func(args)
|
args.func(args)
|
||||||
|
|
||||||
|
|
|
||||||
Ładowanie…
Reference in New Issue