kopia lustrzana https://github.com/bugout-dev/moonstream
added raw nft transfer
rodzic
8cfbd716b3
commit
a80898a6a9
|
@ -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)
|
||||
|
|
Ładowanie…
Reference in New Issue