added raw nft transfer

pull/226/head
yhtiyar 2021-09-01 23:54:17 +03:00
rodzic 8cfbd716b3
commit a80898a6a9
1 zmienionych plików z 45 dodań i 15 usunięć

Wyświetl plik

@ -1,6 +1,8 @@
from dataclasses import dataclass
from typing import List, Optional
from dataclasses import dataclass, asdict
from collections import defaultdict
from typing import Dict, List, Optional
from web3 import Web3
import web3
from web3.types import FilterParams
from web3._utils.events import get_event_data
@ -103,31 +105,43 @@ transfer_event_signature = w3.sha3(text="Transfer(address,address,uint256)").hex
@dataclass
class NFT_transfer:
class NFTTransferRaw:
contract_address: str
transfer_from: str
transfer_to: str
tokenId: int
transfer_tx: bytes
@dataclass
class NFTTransfer:
contract_address: str
transfer_from: str
transfer_to: str
tokenId: int
transfer_tx: str
value: Optional[int] = None
is_mint: bool = False
def decode_nft_transfer_data(log) -> Optional[NFT_transfer]:
def get_value_by_tx(tx_hash):
print(f"Trying to get tx: {tx_hash.hex()}")
tx = w3.eth.get_transaction(tx_hash)
print("got it")
return tx["value"]
def decode_nft_transfer_data(log) -> Optional[NFTTransferRaw]:
for abi in erc721_transfer_event_abis:
try:
transfer_data = get_event_data(w3.codec, abi, log)
nft_transfer = NFT_transfer(
nft_transfer = NFTTransferRaw(
contract_address=transfer_data["address"],
transfer_from=transfer_data["args"]["from"],
transfer_to=transfer_data["args"]["to"],
tokenId=transfer_data["args"]["tokenId"],
transfer_tx=transfer_data["transactionHash"].hex(),
transfer_tx=transfer_data["transactionHash"],
)
if (
nft_transfer.transfer_from
== "0x0000000000000000000000000000000000000000" # Blackhole address
):
nft_transfer.is_mint = True
return nft_transfer
except:
continue
@ -136,7 +150,7 @@ def decode_nft_transfer_data(log) -> Optional[NFT_transfer]:
def get_nft_transfers(
block_number_from: int, contract_address: Optional[str] = None
) -> List[NFT_transfer]:
) -> List[NFTTransfer]:
filter_params = FilterParams(
fromBlock=block_number_from, topics=[transfer_event_signature]
)
@ -145,17 +159,33 @@ def get_nft_transfers(
filter_params["address"] = w3.toChecksumAddress(contract_address)
logs = w3.eth.get_logs(filter_params)
nft_transfers: List[NFT_transfer] = []
nft_transfers: List[NFTTransfer] = []
tx_value: Dict[bytes, List[NFTTransferRaw]] = defaultdict(list)
for log in logs:
nft_transfer = decode_nft_transfer_data(log)
if nft_transfer is not None:
nft_transfers.append(nft_transfer)
tx_value[nft_transfer.transfer_tx].append(nft_transfer)
for tx_hash, transfers in tx_value.items():
# value = get_value_by_tx(tx_hash)
value = 0
for transfer in transfers:
kwargs = {
**asdict(transfer),
"transfer_tx": transfer.transfer_tx.hex(),
"is_mint": transfer.transfer_from
== "0x0000000000000000000000000000000000000000",
"value": value,
}
parsed_transfer = NFTTransfer(**kwargs)
nft_transfers.append(parsed_transfer)
return nft_transfers
cryptoKittiesAddress = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d"
transfesrs = get_nft_transfers(
w3.eth.block_number - 1000, "0x2aea4add166ebf38b63d09a75de1a7b94aa24163"
w3.eth.block_number - 120,
)
print(transfesrs)