kopia lustrzana https://github.com/bugout-dev/moonstream
494 wiersze
12 KiB
Python
494 wiersze
12 KiB
Python
from datetime import datetime
|
|
from enum import Enum
|
|
from typing import Any, Dict, List, Optional, Set, Tuple
|
|
from uuid import UUID
|
|
|
|
from bugout.data import BugoutResource
|
|
from pydantic import AnyHttpUrl, BaseModel, Field, root_validator, validator
|
|
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
|
|
|
|
|
|
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
|
|
added_by: Optional[str] = None
|
|
|
|
|
|
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
|
|
|
|
|
|
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
|
|
|
|
|
|
class DropListResponse(BaseModel):
|
|
drops: List[DropsResponseItem] = Field(default_factory=list)
|
|
|
|
|
|
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
|
|
|
|
|
|
class CallRequestTypeResponse(BaseModel):
|
|
name: str
|
|
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)
|
|
|
|
|
|
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
|
|
|
|
|
|
class RegisteredContractResponse(BaseModel):
|
|
id: UUID
|
|
blockchain: Optional[str] = None
|
|
address: str
|
|
metatx_requester_id: UUID
|
|
title: Optional[str] = None
|
|
description: Optional[str] = None
|
|
image_uri: Optional[str] = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
@validator("id", "metatx_requester_id")
|
|
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
|
|
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
|
|
|
|
# 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):
|
|
id: UUID
|
|
contract_id: UUID
|
|
contract_address: Optional[str] = None
|
|
metatx_requester_id: UUID
|
|
call_request_type: Optional[str] = None
|
|
caller: str
|
|
method: str
|
|
request_id: str
|
|
parameters: Dict[str, Any]
|
|
tx_hash: Optional[str] = None
|
|
expires_at: Optional[datetime] = None
|
|
live_at: Optional[datetime] = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
orm_mode = True
|
|
|
|
@validator("id", "contract_id", "metatx_requester_id")
|
|
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)
|
|
|
|
|
|
class CompleteCallRequestsAPIRequest(BaseModel):
|
|
tx_hash: str
|
|
|
|
|
|
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]
|
|
|
|
class Config:
|
|
orm_mode = True
|
|
|
|
|
|
class RanksResponse(BaseModel):
|
|
rank: int
|
|
score: int
|
|
size: int
|
|
|
|
|
|
class LeaderboardScore(BaseModel):
|
|
leaderboard_id: UUID
|
|
address: str
|
|
score: int
|
|
points_data: Dict[str, Any]
|
|
|
|
|
|
class ColumnsNames(BaseModel):
|
|
rank: Optional[str] = None
|
|
address: Optional[str] = None
|
|
score: Optional[str] = None
|
|
points_data: Optional[str] = None
|
|
points_data_fields: Optional[Dict[str, str]] = None
|
|
|
|
|
|
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)
|
|
columns_names: Optional[ColumnsNames] = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class LeaderboardInfoResponse(BaseModel):
|
|
id: UUID
|
|
title: str
|
|
description: Optional[str] = None
|
|
users_count: int
|
|
last_updated_at: Optional[datetime] = None
|
|
|
|
|
|
class LeaderboardCreateRequest(BaseModel):
|
|
title: str
|
|
description: Optional[str] = None
|
|
wallet_connect: bool = False
|
|
blockchain_ids: List[int] = Field(default_factory=list)
|
|
columns_names: Optional[ColumnsNames] = None
|
|
|
|
|
|
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)
|
|
columns_names: Optional[ColumnsNames] = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
orm_mode = True
|
|
|
|
|
|
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)
|
|
columns_names: Optional[ColumnsNames] = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
orm_mode = True
|
|
|
|
|
|
class LeaderboardUpdateRequest(BaseModel):
|
|
title: Optional[str] = None
|
|
description: Optional[str] = None
|
|
wallet_connect: bool = False
|
|
blockchain_ids: List[int] = Field(default_factory=list)
|
|
columns_names: Optional[ColumnsNames] = None
|
|
|
|
|
|
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)
|
|
columns_names: Optional[ColumnsNames] = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class LeaderboardScoresChangesResponse(BaseModel):
|
|
players_count: int
|
|
date: datetime
|
|
|
|
|
|
class LeaderboardConfig(BaseModel):
|
|
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
|
|
|
|
|
|
class LeaderboardVersionRequest(BaseModel):
|
|
publish: bool
|