1+ from dataclasses import dataclass
2+ from datetime import datetime
3+ from typing import Optional
4+
5+ from open_sea_v1 .endpoints .endpoint_abc import BaseOpenSeaEndpoint
6+ from open_sea_v1 .endpoints .endpoint_client import OpenSeaClient
7+ from open_sea_v1 .endpoints .endpoint_urls import OpenseaApiEndpoints
8+ from open_sea_v1 .helpers .extended_classes import ExtendedStrEnum
9+ from open_sea_v1 .responses import EventResponse
10+
11+
12+ class EventType (ExtendedStrEnum ):
13+ """
14+ The event type to filter. Can be created for new auctions, successful for sales, cancelled, bid_entered, bid_withdrawn, transfer, or approve
15+ """
16+ CREATED = 'created'
17+ SUCCESSFUL = 'successful'
18+ CANCELLED = 'cancelled'
19+ BID_ENTERED = 'bid_entered'
20+ BID_WITHDRAWN = 'bid_withdrawn'
21+ TRANSFER = 'transfer'
22+ APPROVE = 'approve'
23+
24+
25+ class AuctionType (ExtendedStrEnum ):
26+ """
27+ Filter by an auction type. Can be english for English Auctions, dutch for fixed-price and declining-price sell orders (Dutch Auctions), or min-price for CryptoPunks bidding auctions.
28+ """
29+ ENGLISH = 'english'
30+ DUTCH = 'dutch'
31+ MIN_PRICE = 'min-price'
32+
33+
34+ @dataclass
35+ class _EventsEndpoint (OpenSeaClient , BaseOpenSeaEndpoint ):
36+ """
37+ Opensea API Events Endpoint
38+
39+ Parameters
40+ ----------
41+
42+ offset:
43+ Offset for pagination
44+
45+ limit:
46+ Limit for pagination
47+
48+ asset_contract_address:
49+ The NFT contract address for the assets for which to show events
50+
51+ event_type:
52+ The event type to filter. Can be created for new auctions, successful for sales, cancelled, bid_entered, bid_withdrawn, transfer, or approve
53+
54+ only_opensea:
55+ Restrict to events on OpenSea auctions. Can be true or false
56+
57+ auction_type:
58+ Filter by an auction type. Can be english for English Auctions, dutch for fixed-price and declining-price sell orders (Dutch Auctions), or min-price for CryptoPunks bidding auctions.
59+
60+ occurred_before:
61+ Only show events listed before this datetime.
62+
63+ occurred_after:
64+ Only show events listed after this datetime.
65+
66+ api_key:
67+ Optional Opensea API key, if you have one.
68+
69+ :return: Parsed JSON
70+ """
71+ offset : int
72+ limit : int
73+ asset_contract_address : str
74+ event_type : EventType
75+ only_opensea : bool
76+ collection_slug : Optional [str ] = None
77+ token_id : Optional [str ] = None
78+ account_address : Optional [str ] = None
79+ auction_type : Optional [AuctionType ] = None
80+ occurred_before : Optional [datetime ] = None
81+ occurred_after : Optional [datetime ] = None
82+ api_key : Optional [str ] = None
83+
84+ def __post_init__ (self ):
85+ self ._validate_request_params ()
86+
87+ @property
88+ def url (self ) -> str :
89+ return OpenseaApiEndpoints .EVENTS .value
90+
91+ @property
92+ def _request_params (self ) -> dict :
93+ params = dict (offset = self .offset , limit = self .limit , asset_contract_address = self .asset_contract_address , event_type = self .event_type , only_opensea = self .only_opensea , collection_slug = self .collection_slug , token_id = self .token_id , account_address = self .account_address , auction_type = self .auction_type , occurred_before = self .occurred_before , occurred_after = self .occurred_after )
94+ return dict (api_key = self .api_key , params = params )
95+
96+ def get_request (self , ** kwargs ):
97+ self ._response = self ._get_request (self .url , ** self ._request_params )
98+
99+ @property
100+ def response (self ) -> list [EventResponse ]:
101+ self ._assert_get_request_was_called_before_accessing_this_property ()
102+ events_json = self ._response .json ()['asset_events' ]
103+ events = [EventResponse (event ) for event in events_json ]
104+ return events
105+
106+ def _validate_request_params (self ) -> None :
107+ self ._validate_param_auction_type ()
108+ self ._validate_param_event_type ()
109+ self ._validate_params_occurred_before_and_occurred_after ()
110+
111+ def _validate_param_event_type (self ) -> None :
112+ if not isinstance (self .event_type , (str , EventType )):
113+ raise TypeError ('Invalid event_type type. Must be str or EventType Enum.' , f"{ self .event_type = } " )
114+
115+ if self .event_type not in EventType .list ():
116+ raise ValueError ('Invalid event_type value. Must be str value from EventType Enum.' , f"{ self .event_type = } " )
117+
118+ def _validate_param_auction_type (self ) -> None :
119+ if self .auction_type is None :
120+ return
121+
122+ if not isinstance (self .auction_type , (str , AuctionType )):
123+ raise TypeError ('Invalid auction_type type. Must be str or AuctionType Enum.' , f"{ self .auction_type = } " )
124+
125+ if self .auction_type not in AuctionType .list ():
126+ raise ValueError ('Invalid auction_type value. Must be str value from AuctionType Enum.' ,
127+ f"{ self .auction_type = } " )
128+
129+ def _validate_params_occurred_before_and_occurred_after (self ) -> None :
130+ self ._validate_param_occurred_before ()
131+ self ._validate_param_occurred_after ()
132+ if self .occurred_after and self .occurred_before :
133+ self ._assert_param_occurred_before_after_cannot_be_same_value ()
134+ self ._assert_param_occurred_before_cannot_be_higher_than_occurred_after ()
135+
136+ def _validate_param_occurred_before (self ) -> None :
137+ if not isinstance (self .occurred_before , (type (None ), datetime )):
138+ raise TypeError ('Invalid occurred_before type. Must be instance of datetime.' ,
139+ f'{ type (self .occurred_before )= } ' )
140+
141+ def _validate_param_occurred_after (self ) -> None :
142+ if not isinstance (self .occurred_after , (type (None ), datetime )):
143+ raise TypeError ('Invalid occurred_after type. Must be instance of datetime.' ,
144+ f'{ type (self .occurred_after )= } ' )
145+
146+ def _assert_param_occurred_before_after_cannot_be_same_value (self ) -> None :
147+ if self .occurred_after == self .occurred_before :
148+ raise ValueError ('Params occurred_after and occurred_before may not have the same value.' ,
149+ f"{ self .occurred_before = } , { self .occurred_after = } " )
150+
151+ def _assert_param_occurred_before_cannot_be_higher_than_occurred_after (self ) -> None :
152+ if not self .occurred_after < self .occurred_before :
153+ raise ValueError ('Param occurred_before cannot be higher than param occurred_after.' ,
154+ f"{ self .occurred_before = } , { self .occurred_after = } " )
0 commit comments