use std::sync::Arc;
use serde::{Deserialize, Serialize};
use solana_keypair::Pubkey;
use crate::transaction::ActionMeta;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum TransferKind {
#[serde(rename = "internal")]
Internal,
#[serde(rename = "external")]
External,
}
impl Default for TransferKind {
fn default() -> Self {
Self::Internal
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateSubAccount {
pub name: Arc<str>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub margin_symbol: Option<Arc<str>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub margin_amount: Option<f64>,
#[serde(skip)]
pub meta: ActionMeta,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RemoveSubAccount {
#[serde(with = "crate::msgs::serde_pubkey")]
pub to_remove: Pubkey,
#[serde(skip)]
pub meta: ActionMeta,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Transfer {
#[serde(rename = "k", default)]
pub kind: TransferKind,
#[serde(with = "crate::msgs::serde_pubkey")]
pub from: Pubkey,
#[serde(with = "crate::msgs::serde_pubkey")]
pub to: Pubkey,
pub margin_symbol: Arc<str>,
pub margin_amount: f64,
#[serde(skip)]
pub meta: ActionMeta,
}