Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/.pytest_cache
/.mypy_cache
__pycache__
.idea
25 changes: 25 additions & 0 deletions dipdup.ithacanet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ contracts:
rarible_bids_ithacanet:
address: KT1MwKGYWWbXtfYdnQfwspwz5ZGfqGwiJuQF
typename: rarible_bids
rarible_auctions_ithacanet:
address: KT1CB5JBSC7kTxRV3ir2xsooMA1FLieiD4Mt
typename: rarible_auctions

indexes:
rarible_exchange_actions:
Expand Down Expand Up @@ -62,4 +65,26 @@ indexes:
pattern:
- destination: rarible_bids_ithacanet
entrypoint: cancel_floor_bid
rarible_auctions_actions:
kind: operation
datasource: tzkt_ithacanet
contracts:
- rarible_auctions_ithacanet
handlers:
- callback: rarible_start_auction
pattern:
- destination: rarible_auctions_ithacanet
entrypoint: start_auction
- callback: rarible_put_auction_bid
pattern:
- destination: rarible_auctions_ithacanet
entrypoint: put_bid
- callback: rarible_finish_auction
pattern:
- destination: rarible_auctions_ithacanet
entrypoint: finish_auction
- callback: rarible_cancel_auction
pattern:
- destination: rarible_auctions_ithacanet
entrypoint: cancel_auction

276 changes: 276 additions & 0 deletions rarible_marketplace_indexer/event/abstract_action.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,19 @@
from dipdup.models import Transaction

from rarible_marketplace_indexer.event.dto import CancelDto
from rarible_marketplace_indexer.event.dto import FinishAuctionDto
from rarible_marketplace_indexer.event.dto import ListDto
from rarible_marketplace_indexer.event.dto import MatchDto
from rarible_marketplace_indexer.event.dto import PutAuctionBidDto
from rarible_marketplace_indexer.event.dto import StartAuctionDto
from rarible_marketplace_indexer.models import ActivityModel
from rarible_marketplace_indexer.models import ActivityTypeEnum
from rarible_marketplace_indexer.models import AuctionActivityModel
from rarible_marketplace_indexer.models import AuctionModel
from rarible_marketplace_indexer.models import AuctionStatusEnum
from rarible_marketplace_indexer.models import OrderModel
from rarible_marketplace_indexer.models import OrderStatusEnum
from rarible_marketplace_indexer.types.rarible_api_objects.asset.enum import AssetClassEnum
from rarible_marketplace_indexer.types.tezos_objects.asset_value.asset_value import AssetValue


Expand Down Expand Up @@ -563,3 +570,272 @@ async def handle(
order.last_updated_at = transaction.data.timestamp

await order.save()


class AbstractStartAuctionEvent(EventInterface):
@staticmethod
@abstractmethod
def _get_start_auction_dto(
transaction: Transaction,
datasource: TzktDatasource,
) -> StartAuctionDto:
raise NotImplementedError

@classmethod
@final
async def handle(
cls,
transaction: Transaction,
datasource: TzktDatasource,
):
dto = cls._get_start_auction_dto(transaction, datasource)
order_status = AuctionStatusEnum.INACTIVE
ongoing = False
if dto.start_at == transaction.data.timestamp:
order_status = AuctionStatusEnum.ACTIVE
ongoing = True

auction = await AuctionModel.create(
network=datasource.network,
platform=cls.platform,
auction_id=dto.auction_id,
status=order_status,
start_at=dto.start_at,
ended_at=None,
created_at=transaction.data.timestamp,
end_time=dto.start_at + timedelta(seconds=dto.duration),
last_updated_at=transaction.data.timestamp,
ongoing=ongoing,
seller=transaction.data.sender_address,
sell_asset_class=AssetClassEnum.MULTI_TOKEN,
sell_contract=dto.sell_contract,
sell_token_id=dto.sell_token_id,
sell_value=dto.sell_value,
buy_asset_class=AssetClassEnum.FUNGIBLE_TOKEN,
buy_contract=dto.buy_asset.contract,
buy_token_id=dto.buy_asset.token_id,
minimal_step=dto.min_step,
minimal_price=dto.min_price,
duration=dto.duration,
buy_price=dto.buy_price,
max_seller_fees=dto.max_seller_fees,
last_bid_amount=None,
last_bid_bidder=None,
last_bid_date=None,
)

await AuctionActivityModel.create(
auction_id=auction.id,
type=ActivityTypeEnum.AUCTION_CREATED,
network=datasource.network,
platform=cls.platform,
internal_auction_id=dto.auction_id,
bid_value=None,
bid_bidder=None,
date=transaction.data.timestamp,
last_updated_at=transaction.data.timestamp,
operation_level=transaction.data.level,
operation_timestamp=transaction.data.timestamp,
operation_hash=transaction.data.hash,
operation_counter=transaction.data.counter,
operation_nonce=transaction.data.nonce,
)

if ongoing:
await AuctionActivityModel.create(
auction_id=auction.id,
type=ActivityTypeEnum.AUCTION_STARTED,
network=datasource.network,
platform=cls.platform,
internal_auction_id=dto.auction_id,
bid_value=None,
bid_bidder=None,
date=transaction.data.timestamp,
last_updated_at=transaction.data.timestamp,
operation_level=transaction.data.level,
operation_timestamp=transaction.data.timestamp,
operation_hash=transaction.data.hash,
operation_counter=transaction.data.counter,
operation_nonce=transaction.data.nonce,
)


class AbstractPutAuctionBidEvent(EventInterface):
@staticmethod
@abstractmethod
def _get_put_auction_bid_dto(
transaction: Transaction,
datasource: TzktDatasource,
) -> PutAuctionBidDto:
raise NotImplementedError

@classmethod
@final
async def handle(
cls,
transaction: Transaction,
datasource: TzktDatasource,
):
dto = cls._get_put_auction_bid_dto(transaction, datasource)

auction = (
await AuctionModel.filter(
network=datasource.network,
platform=cls.platform,
auction_id=dto.auction_id,
)
.order_by('-id')
.first()
)

auction.last_updated_at = transaction.data.timestamp
auction.last_bid_date = transaction.data.timestamp
auction.last_bid_amount = dto.bid_value
auction.last_bid_bidder = dto.bidder
if dto.bid_value >= auction.buy_price:
auction.status = AuctionStatusEnum.FINISHED
auction.ongoing = False
auction.ended_at = transaction.data.timestamp
auction.save()

await AuctionActivityModel.create(
auction_id=auction.id,
type=ActivityTypeEnum.AUCTION_FINISHED,
network=datasource.network,
platform=cls.platform,
internal_auction_id=dto.auction_id,
bid_value=dto.bid_value,
bid_bidder=dto.bidder,
date=transaction.data.timestamp,
last_updated_at=transaction.data.timestamp,
operation_level=transaction.data.level,
operation_timestamp=transaction.data.timestamp,
operation_hash=transaction.data.hash,
operation_counter=transaction.data.counter,
operation_nonce=transaction.data.nonce,
)
else:
auction.status = AuctionStatusEnum.ACTIVE
auction.ongoing = True
auction.save()

await AuctionActivityModel.create(
auction_id=auction.id,
type=ActivityTypeEnum.AUCTION_BID,
network=datasource.network,
platform=cls.platform,
internal_auction_id=dto.auction_id,
bid_value=dto.bid_value,
bid_bidder=dto.bidder,
date=transaction.data.timestamp,
last_updated_at=transaction.data.timestamp,
operation_level=transaction.data.level,
operation_timestamp=transaction.data.timestamp,
operation_hash=transaction.data.hash,
operation_counter=transaction.data.counter,
operation_nonce=transaction.data.nonce,
)


class AbstractFinishAuctionEvent(EventInterface):
@staticmethod
@abstractmethod
def _get_finish_auction_dto(
transaction: Transaction,
datasource: TzktDatasource,
) -> FinishAuctionDto:
raise NotImplementedError

@classmethod
@final
async def handle(
cls,
transaction: Transaction,
datasource: TzktDatasource,
):
dto = cls._get_finish_auction_dto(transaction, datasource)

auction = (
await AuctionModel.filter(
network=datasource.network,
platform=cls.platform,
auction_id=dto.auction_id,
)
.order_by('-id')
.first()
)

auction.last_updated_at = transaction.data.timestamp
auction.ended_at = transaction.data.timestamp
auction.ongoing = False
auction.status = AuctionStatusEnum.FINISHED
auction.save()

await AuctionActivityModel.create(
auction_id=auction.id,
type=ActivityTypeEnum.AUCTION_FINISHED,
network=datasource.network,
platform=cls.platform,
internal_auction_id=dto.auction_id,
bid_value=auction.last_bid_amount,
bid_bidder=auction.last_bid_bidder,
date=transaction.data.timestamp,
last_updated_at=transaction.data.timestamp,
operation_level=transaction.data.level,
operation_timestamp=transaction.data.timestamp,
operation_hash=transaction.data.hash,
operation_counter=transaction.data.counter,
operation_nonce=transaction.data.nonce,
)


class AbstractCancelAuctionEvent(EventInterface):
@staticmethod
@abstractmethod
def _get_cancel_auction_dto(
transaction: Transaction,
datasource: TzktDatasource,
) -> FinishAuctionDto:
raise NotImplementedError

@classmethod
@final
async def handle(
cls,
transaction: Transaction,
datasource: TzktDatasource,
):
dto = cls._get_cancel_auction_dto(transaction, datasource)

auction = (
await AuctionModel.filter(
network=datasource.network,
platform=cls.platform,
auction_id=dto.auction_id,
)
.order_by('-id')
.first()
)

auction.last_updated_at = transaction.data.timestamp
auction.ended_at = transaction.data.timestamp
auction.ongoing = False
auction.status = AuctionStatusEnum.CANCELLED
auction.save()

await AuctionActivityModel.create(
auction_id=auction.id,
type=ActivityTypeEnum.AUCTION_CANCEL,
network=datasource.network,
platform=cls.platform,
internal_auction_id=dto.auction_id,
bid_value=auction.last_bid_amount,
bid_bidder=auction.last_bid_bidder,
date=transaction.data.timestamp,
last_updated_at=transaction.data.timestamp,
operation_level=transaction.data.level,
operation_timestamp=transaction.data.timestamp,
operation_hash=transaction.data.hash,
operation_counter=transaction.data.counter,
operation_nonce=transaction.data.nonce,
)
35 changes: 35 additions & 0 deletions rarible_marketplace_indexer/event/dto.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@
from rarible_marketplace_indexer.types.tezos_objects.tezos_object_hash import OriginatedAccountAddress


@dataclass
class AssetDto:
contract: Optional[OriginatedAccountAddress]
token_id: Optional[int]


@dataclass
class MakeDto:
asset_class: AssetClassEnum
Expand All @@ -36,6 +42,7 @@ class ListDto:
start_at: Optional[datetime] = None # for marketplaces with the possibility of a delayed start of sales
end_at: Optional[datetime] = None # for marketplaces with the possibility of sales expiration


@dataclass
class CancelDto:
internal_order_id: str
Expand All @@ -48,3 +55,31 @@ class MatchDto:
token_id: Optional[int]
match_amount: Optional[AssetValue]
match_timestamp: datetime


@dataclass
class StartAuctionDto:
auction_id: str
sell_contract: OriginatedAccountAddress
sell_token_id: int
sell_value: int
buy_asset_type: int
buy_asset: AssetDto
start_at: datetime
duration: int
min_price: int
buy_price: int
min_step: int
max_seller_fees: int


@dataclass
class PutAuctionBidDto:
auction_id: str
bidder: ImplicitAccountAddress
bid_value: Optional[AssetValue]


@dataclass
class FinishAuctionDto:
auction_id: str
Loading