moonstream/engineapi/engineapi/data.py

494 wiersze
12 KiB
Python

2023-06-06 12:11:49 +00:00
from datetime import datetime
from enum import Enum
from typing import Any, Dict, List, Optional, Set, Tuple
2023-06-06 12:11:49 +00:00
from uuid import UUID
from bugout.data import BugoutResource
from pydantic import AnyHttpUrl, BaseModel, Field, root_validator, validator
2023-06-06 12:11:49 +00:00
from web3 import Web3
class PingResponse(BaseModel):
"""
Schema for ping response
"""
status: str
class NowResponse(BaseModel):
"""
Schema for responses on /now endpoint
"""
epoch_time: float
class CORSOrigins(BaseModel):
origins_set: Set[str] = Field(default_factory=set)
resources: List[BugoutResource] = Field(default_factory=list)
class IsCORSResponse(BaseModel):
origin: Optional[str] = None
updated_at: Optional[datetime] = None
created_at: Optional[datetime] = None
2023-06-06 12:11:49 +00:00
class SignerListResponse(BaseModel):
instances: List[Any] = Field(default_factory=list)
class SignerSleepResponse(BaseModel):
instances: List[str] = Field(default_factory=list)
class SignerWakeupResponse(BaseModel):
instances: List[str] = Field(default_factory=list)
class DropperContractResponse(BaseModel):
id: UUID
address: str
blockchain: str
title: Optional[str]
description: Optional[str]
image_uri: Optional[str]
class DropperTerminusResponse(BaseModel):
terminus_address: str
terminus_pool_id: int
blockchain: str
class DropperBlockchainResponse(BaseModel):
blockchain: str
class DropRegisterRequest(BaseModel):
dropper_contract_id: UUID
title: Optional[str] = None
description: Optional[str] = None
claim_block_deadline: Optional[int] = None
terminus_address: Optional[str] = None
terminus_pool_id: Optional[int] = None
claim_id: Optional[int] = None
class DropCreatedResponse(BaseModel):
dropper_claim_id: UUID
dropper_contract_id: UUID
title: str
description: str
claim_block_deadline: Optional[int] = None
terminus_address: Optional[str] = None
terminus_pool_id: Optional[int] = None
claim_id: Optional[int] = None
class Claimant(BaseModel):
address: str
amount: int
raw_amount: Optional[str] = None
2023-07-06 04:30:50 +00:00
added_by: Optional[str] = None
2023-06-06 12:11:49 +00:00
class BatchAddClaimantsRequest(BaseModel):
claimants: List[Claimant] = Field(default_factory=list)
class BatchRemoveClaimantsRequest(BaseModel):
claimants: List[str] = Field(default_factory=list)
class DropAddClaimantsRequest(BaseModel):
dropper_claim_id: UUID
claimants: List[Claimant] = Field(default_factory=list)
class ClaimantsResponse(BaseModel):
claimants: List[Claimant] = Field(default_factory=list)
class DropRemoveClaimantsRequest(BaseModel):
dropper_claim_id: UUID
addresses: List[str] = Field(default_factory=list)
class RemoveClaimantsResponse(BaseModel):
addresses: List[str] = Field(default_factory=list)
class DropperClaimResponse(BaseModel):
id: UUID
dropper_contract_id: UUID
title: str
description: str
active: bool
claim_block_deadline: Optional[int] = None
terminus_address: Optional[str] = None
terminus_pool_id: Optional[int] = None
claim_id: Optional[int] = None
class DropResponse(BaseModel):
claimant: str
claim_id: int
amount: str
block_deadline: int
signature: str
title: str
description: str
class DropBatchResponseItem(BaseModel):
claimant: str
claim_id: int
title: str
description: str
amount: int
amount_string: str
block_deadline: int
signature: str
dropper_claim_id: UUID
dropper_contract_address: str
blockchain: str
2023-07-06 04:30:50 +00:00
class DropsResponseItem(BaseModel):
id: UUID
title: str
description: str
terminus_address: Optional[str] = None
terminus_pool_id: Optional[int] = None
claim_block_deadline: Optional[int] = None
drop_number: Optional[int] = None
active: bool = True
dropper_contract_address: str
2023-06-06 12:11:49 +00:00
class DropListResponse(BaseModel):
2023-07-06 04:30:50 +00:00
drops: List[DropsResponseItem] = Field(default_factory=list)
2023-06-06 12:11:49 +00:00
class DropClaimant(BaseModel):
amount: Optional[int]
added_by: Optional[str]
address: Optional[str]
class DropActivateRequest(BaseModel):
dropper_claim_id: UUID
class DropUpdateRequest(BaseModel):
title: Optional[str] = None
description: Optional[str] = None
claim_block_deadline: Optional[int] = None
terminus_address: Optional[str] = None
terminus_pool_id: Optional[int] = None
claim_id: Optional[int] = None
class DropUpdatedResponse(BaseModel):
dropper_claim_id: UUID
dropper_contract_id: UUID
title: str
description: str
claim_block_deadline: Optional[int] = None
terminus_address: Optional[str] = None
terminus_pool_id: Optional[int] = None
claim_id: Optional[int] = None
active: bool = True
2023-08-03 10:25:09 +00:00
class CallRequestTypeResponse(BaseModel):
name: str
2023-08-03 10:25:09 +00:00
description: str
class Config:
orm_mode = True
class CallRequestTypesResponse(BaseModel):
call_request_types: List[CallRequestTypeResponse] = Field(default_factory=list)
class BlockchainResponse(BaseModel):
id: UUID
name: str
chain_id: int
testnet: bool
class Config:
orm_mode = True
class BlockchainsResponse(BaseModel):
blockchains: List[BlockchainResponse] = Field(default_factory=list)
2023-06-06 12:11:49 +00:00
class RegisterContractRequest(BaseModel):
blockchain: str
address: str
title: Optional[str] = None
description: Optional[str] = None
image_uri: Optional[str] = None
class UpdateContractRequest(BaseModel):
title: Optional[str] = None
description: Optional[str] = None
image_uri: Optional[str] = None
ignore_nulls: bool = True
2023-08-03 10:42:16 +00:00
class RegisteredContractResponse(BaseModel):
id: UUID
blockchain: Optional[str] = None
address: str
metatx_requester_id: UUID
2023-08-03 10:42:16 +00:00
title: Optional[str] = None
description: Optional[str] = None
image_uri: Optional[str] = None
created_at: datetime
updated_at: datetime
@validator("id", "metatx_requester_id")
2023-06-06 12:11:49 +00:00
def validate_uuids(cls, v):
return str(v)
@validator("created_at", "updated_at")
def validate_datetimes(cls, v):
return v.isoformat()
class Config:
orm_mode = True
class CallSpecification(BaseModel):
caller: str
method: str
call_request_type: str = "dropper-v0.2.0"
request_id: str
2023-06-06 12:11:49 +00:00
parameters: Dict[str, Any]
@validator("caller")
def validate_web3_addresses(cls, v):
return Web3.toChecksumAddress(v)
class CreateCallRequestsAPIRequest(BaseModel):
contract_id: Optional[UUID] = None
contract_address: Optional[str] = None
specifications: List[CallSpecification] = Field(default_factory=list)
ttl_days: Optional[int] = None
live_at: Optional[int] = None
2023-06-06 12:11:49 +00:00
# Solution found thanks to https://github.com/pydantic/pydantic/issues/506
@root_validator
def at_least_one_of_contract_id_and_contract_address(cls, values):
if values.get("contract_id") is None and values.get("contract_address") is None:
raise ValueError(
"At least one of contract_id and contract_address must be provided"
)
return values
class CallRequestResponse(BaseModel):
2023-06-06 12:11:49 +00:00
id: UUID
contract_id: UUID
2023-06-06 12:11:49 +00:00
contract_address: Optional[str] = None
metatx_requester_id: UUID
call_request_type: Optional[str] = None
2023-06-06 12:11:49 +00:00
caller: str
method: str
request_id: str
2023-06-06 12:11:49 +00:00
parameters: Dict[str, Any]
2023-10-04 11:27:40 +00:00
tx_hash: Optional[str] = None
expires_at: Optional[datetime] = None
2023-12-07 09:57:17 +00:00
live_at: Optional[datetime] = None
2023-06-06 12:11:49 +00:00
created_at: datetime
updated_at: datetime
class Config:
orm_mode = True
@validator("id", "contract_id", "metatx_requester_id")
2023-06-06 12:11:49 +00:00
def validate_uuids(cls, v):
return str(v)
@validator("created_at", "updated_at", "expires_at")
def validate_datetimes(cls, v):
if v is not None:
return v.isoformat()
@validator("contract_address", "caller")
def validate_web3_adresses(cls, v):
return Web3.toChecksumAddress(v)
class CallRequestsCheck(BaseModel):
existing_requests: Set[Tuple[str, str]] = Field(default_factory=set)
2023-12-07 16:47:03 +00:00
class CompleteCallRequestsAPIRequest(BaseModel):
tx_hash: str
2023-06-06 12:11:49 +00:00
class QuartilesResponse(BaseModel):
percentile_25: Dict[str, Any]
percentile_50: Dict[str, Any]
percentile_75: Dict[str, Any]
class CountAddressesResponse(BaseModel):
count: int = Field(default_factory=int)
class Score(BaseModel):
address: str
score: int
points_data: Dict[str, Any]
class LeaderboardPosition(BaseModel):
address: str
rank: int
score: int
points_data: Dict[str, Any]
2023-07-04 16:27:16 +00:00
class Config:
orm_mode = True
2023-06-06 12:11:49 +00:00
class RanksResponse(BaseModel):
rank: int
score: int
size: int
class LeaderboardScore(BaseModel):
leaderboard_id: UUID
address: str
score: int
points_data: Dict[str, Any]
2024-01-27 07:28:45 +00:00
class ColumnsNames(BaseModel):
rank: Optional[str] = None
address: Optional[str] = None
score: Optional[str] = None
points_data: Optional[str] = None
2024-01-27 10:23:14 +00:00
points_data_fields: Optional[Dict[str, str]] = None
2024-01-27 07:28:45 +00:00
class Leaderboard(BaseModel):
id: UUID
title: str
description: Optional[str] = None
resource_id: Optional[UUID] = None
wallet_connect: bool = False
blockchain_ids: List[int] = Field(default_factory=list)
2024-01-27 10:23:14 +00:00
columns_names: Optional[ColumnsNames] = None
created_at: datetime
updated_at: datetime
class LeaderboardInfoResponse(BaseModel):
id: UUID
title: str
description: Optional[str] = None
2023-08-06 13:55:56 +00:00
users_count: int
2023-08-06 14:06:18 +00:00
last_updated_at: Optional[datetime] = None
2023-08-06 13:55:56 +00:00
class LeaderboardCreateRequest(BaseModel):
title: str
description: Optional[str] = None
wallet_connect: bool = False
blockchain_ids: List[int] = Field(default_factory=list)
2024-01-27 07:28:45 +00:00
columns_names: Optional[ColumnsNames] = None
2023-08-06 13:55:56 +00:00
class LeaderboardCreatedResponse(BaseModel):
id: UUID
title: str
description: Optional[str] = None
resource_id: Optional[UUID] = None
wallet_connect: bool = False
blockchain_ids: List[int] = Field(default_factory=list)
2024-01-27 07:28:45 +00:00
columns_names: Optional[ColumnsNames] = None
2023-08-06 13:55:56 +00:00
created_at: datetime
updated_at: datetime
2023-08-12 06:14:33 +00:00
class Config:
orm_mode = True
2023-08-06 13:55:56 +00:00
class LeaderboardUpdatedResponse(BaseModel):
id: UUID
title: str
description: Optional[str] = None
resource_id: Optional[UUID] = None
wallet_connect: bool = False
blockchain_ids: List[int] = Field(default_factory=list)
2024-01-27 07:28:45 +00:00
columns_names: Optional[ColumnsNames] = None
2023-08-06 13:55:56 +00:00
created_at: datetime
updated_at: datetime
2023-08-12 06:14:33 +00:00
class Config:
orm_mode = True
2023-08-06 13:55:56 +00:00
class LeaderboardUpdateRequest(BaseModel):
title: Optional[str] = None
description: Optional[str] = None
wallet_connect: bool = False
blockchain_ids: List[int] = Field(default_factory=list)
2024-01-27 07:28:45 +00:00
columns_names: Optional[ColumnsNames] = None
2023-08-06 13:55:56 +00:00
class LeaderboardDeletedResponse(BaseModel):
id: UUID
title: str
description: Optional[str] = None
resource_id: Optional[UUID] = None
wallet_connect: bool = False
blockchain_ids: List[int] = Field(default_factory=list)
2024-01-27 07:28:45 +00:00
columns_names: Optional[ColumnsNames] = None
2023-08-06 13:55:56 +00:00
created_at: datetime
updated_at: datetime
class LeaderboardScoresChangesResponse(BaseModel):
players_count: int
date: datetime
class LeaderboardConfig(BaseModel):
2023-08-31 16:32:20 +00:00
leaderboard_id: str
leaderboard_auto_update_active: bool = False
query_name: str
params: Dict[str, int]
normalize_addresses: bool
class LeaderboardConfigUpdate(BaseModel):
query_name: Optional[str] = None
params: Dict[str, int]
normalize_addresses: Optional[bool] = None
class LeaderboardVersion(BaseModel):
leaderboard_id: UUID
version: int
published: bool
created_at: datetime
updated_at: datetime
2023-11-20 09:34:35 +00:00
class LeaderboardVersionRequest(BaseModel):
2023-11-20 09:34:35 +00:00
publish: bool