2021-12-19 12:16:49 -08:00

53 lines
2.0 KiB
Python

from typing import List
from mev_inspect.classifiers.helpers import _filter_transfers
from mev_inspect.schemas.classifiers import ClassifierSpec, NftTradeClassifier
from mev_inspect.schemas.nft_trade import NftTrade
from mev_inspect.schemas.traces import DecodedCallTrace, Protocol
from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS, Transfer
OPENSEA_ETH_TOKEN_ADDRESS = "0x0000000000000000000000000000000000000000"
class OpenseaClassifier(NftTradeClassifier):
@staticmethod
def parse_trade(trace: DecodedCallTrace) -> NftTrade:
uints = trace.inputs.get("uints")
addresses = trace.inputs.get("addrs")
buy_maker = addresses[1]
sell_maker = addresses[8]
base_price = uints[4]
payment_token = addresses[6]
target = addresses[4]
if payment_token == OPENSEA_ETH_TOKEN_ADDRESS:
# Opensea uses the zero-address as a sentinel value for Ether. Convert this
# to the normal eth token address.
payment_token = ETH_TOKEN_ADDRESS
return NftTrade(
abi_name=trace.abi_name,
transaction_hash=trace.transaction_hash,
transaction_position=trace.transaction_position,
block_number=trace.block_number,
trace_address=trace.trace_address,
protocol=trace.protocol,
error=trace.error,
seller_address=sell_maker,
buyer_address=buy_maker,
payment_token=payment_token,
payment_amount=base_price,
collection_address=target,
token_uri=0 # Todo
)
OPENSEA_SPEC= ClassifierSpec(
abi_name="WyvernExchange",
protocol=Protocol.opensea,
valid_contract_addresses=["0x7be8076f4ea4a4ad08075c2508e481d6c946d12b"],
classifiers={
"atomicMatch_(address[14],uint256[18],uint8[8],bytes,bytes,bytes,bytes,bytes,bytes,uint8[2],bytes32[5])": OpenseaClassifier, # TODO actual types
},
)
OPENSEA_CLASSIFIER_SPECS = [OPENSEA_SPEC]