#![doc = include_str!("README.md")]
pub mod builders;
pub mod client;
pub mod wire;
pub use builders::{
DepositBuilder, DepositToGlobalBuilder, ExtendPositionTokensBuilder,
GlobalToMarketDepositBuilder, InitPositionTokensBuilder, MergeBuilder, RedeemWinningsBuilder,
WithdrawBuilder, WithdrawFromGlobalBuilder, WithdrawFromPositionBuilder,
};
use crate::shared::{OrderBookId, PubkeyStr};
use chrono::{DateTime, Utc};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Portfolio {
pub user_address: PubkeyStr,
pub wallet_holdings: Vec<WalletHolding>,
pub positions: Vec<Position>,
pub total_wallet_value: Decimal,
pub total_positions_value: Decimal,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Position {
pub event_pubkey: PubkeyStr,
pub event_name: String,
pub event_img_src: String,
pub outcomes: Vec<PositionOutcome>,
pub total_value: Decimal,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PositionOutcome {
pub condition_id: u8,
pub condition_name: String,
pub token_mint: PubkeyStr,
pub amount: Decimal,
pub usd_value: Decimal,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WalletHolding {
pub token_mint: PubkeyStr,
pub symbol: String,
pub amount: Decimal,
pub decimals: u64,
pub usd_value: Decimal,
pub img_src: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum TokenBalanceTokenType {
DepositAsset,
ConditionalToken {
orderbook_id: OrderBookId,
market_pubkey: PubkeyStr,
outcome_index: i16,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TokenBalance {
pub mint: PubkeyStr,
pub idle: Decimal,
pub on_book: Decimal,
pub token_type: TokenBalanceTokenType,
}
impl From<DepositTokenBalance> for TokenBalance {
fn from(value: DepositTokenBalance) -> Self {
Self {
mint: value.mint,
idle: value.idle,
on_book: Decimal::ZERO,
token_type: TokenBalanceTokenType::DepositAsset,
}
}
}
impl Default for TokenBalance {
fn default() -> Self {
Self {
mint: PubkeyStr::default(),
idle: Decimal::ZERO,
on_book: Decimal::ZERO,
token_type: TokenBalanceTokenType::DepositAsset,
}
}
}
impl TokenBalance {
pub fn computed_base(&self, conditional_price: Decimal) -> TokenBalanceComputedBase {
use crate::shared::fmt::decimal;
let size = self.idle + self.on_book;
let value = size * conditional_price;
TokenBalanceComputedBase {
value: decimal::display(&value),
size: decimal::display(&size),
price: decimal::display(&conditional_price),
}
}
pub fn computed_quote(&self) -> String {
use crate::shared::fmt::decimal;
let size = self.idle + self.on_book;
decimal::display(&size)
}
}
pub struct TokenBalanceComputedBase {
pub value: String,
pub size: String,
pub price: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DepositAssetMetadata {
pub symbol: String,
pub name: String,
pub icon_url: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DepositTokenBalance {
pub mint: PubkeyStr,
pub idle: Decimal,
pub symbol: String,
pub name: String,
pub icon_url_low: Option<String>,
pub icon_url_medium: Option<String>,
pub icon_url_high: Option<String>,
}