pub mod bank_metadata_row;
pub mod bank_row;
pub mod execute_order_record_row;
pub mod fee_state_row;
pub mod lending_row;
pub mod liquidation_record_row;
pub mod marginfi_account_row;
pub mod marginfi_group_row;
pub mod minimal_obligation_row;
pub mod minimal_reserve_row;
pub mod minimal_spot_market_row;
pub mod minimal_user_row;
pub mod order_row;
pub mod solend_minimal_reserve_row;
pub mod staked_settings_row;
pub use self::{
bank_metadata_row::*, bank_row::*, execute_order_record_row::*, fee_state_row::*,
lending_row::*, liquidation_record_row::*, marginfi_account_row::*, marginfi_group_row::*,
minimal_obligation_row::*, minimal_reserve_row::*, minimal_spot_market_row::*,
minimal_user_row::*, order_row::*, solend_minimal_reserve_row::*, staked_settings_row::*,
};
use super::MarginfiV2Account;
pub struct MarginfiV2AccountsMigration;
impl sqlx_migrator::Migration<sqlx::Postgres> for MarginfiV2AccountsMigration {
fn app(&self) -> &str {
"marginfi-v2"
}
fn name(&self) -> &str {
"marginfi_v2_accounts"
}
fn operations(&self) -> Vec<Box<dyn sqlx_migrator::Operation<sqlx::Postgres>>> {
vec![
Box::new(BankMigrationOperation),
Box::new(BankMetadataMigrationOperation),
Box::new(ExecuteOrderRecordMigrationOperation),
Box::new(FeeStateMigrationOperation),
Box::new(LendingMigrationOperation),
Box::new(LiquidationRecordMigrationOperation),
Box::new(MarginfiAccountMigrationOperation),
Box::new(MarginfiGroupMigrationOperation),
Box::new(MinimalObligationMigrationOperation),
Box::new(MinimalReserveMigrationOperation),
Box::new(MinimalSpotMarketMigrationOperation),
Box::new(MinimalUserMigrationOperation),
Box::new(OrderMigrationOperation),
Box::new(SolendMinimalReserveMigrationOperation),
Box::new(StakedSettingsMigrationOperation),
]
}
fn parents(&self) -> Vec<Box<dyn sqlx_migrator::Migration<sqlx::Postgres>>> {
vec![]
}
}
pub struct MarginfiV2AccountWithMetadata(
pub MarginfiV2Account,
pub carbon_core::account::AccountMetadata,
);
impl From<(MarginfiV2Account, carbon_core::account::AccountMetadata)>
for MarginfiV2AccountWithMetadata
{
fn from(value: (MarginfiV2Account, carbon_core::account::AccountMetadata)) -> Self {
MarginfiV2AccountWithMetadata(value.0, value.1)
}
}
#[async_trait::async_trait]
impl carbon_core::postgres::operations::Insert for MarginfiV2AccountWithMetadata {
async fn insert(&self, pool: &sqlx::PgPool) -> carbon_core::error::CarbonResult<()> {
let MarginfiV2AccountWithMetadata(account, metadata) = self;
match account {
MarginfiV2Account::Bank(account) => {
let row = bank_row::BankRow::from_parts(*account.clone(), metadata.clone());
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::BankMetadata(account) => {
let row = bank_metadata_row::BankMetadataRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::ExecuteOrderRecord(account) => {
let row = execute_order_record_row::ExecuteOrderRecordRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::FeeState(account) => {
let row =
fee_state_row::FeeStateRow::from_parts(*account.clone(), metadata.clone());
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::Lending(account) => {
let row = lending_row::LendingRow::from_parts(*account.clone(), metadata.clone());
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::LiquidationRecord(account) => {
let row = liquidation_record_row::LiquidationRecordRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::MarginfiAccount(account) => {
let row = marginfi_account_row::MarginfiAccountRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::MarginfiGroup(account) => {
let row = marginfi_group_row::MarginfiGroupRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::MinimalObligation(account) => {
let row = minimal_obligation_row::MinimalObligationRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::MinimalReserve(account) => {
let row = minimal_reserve_row::MinimalReserveRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::MinimalSpotMarket(account) => {
let row = minimal_spot_market_row::MinimalSpotMarketRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::MinimalUser(account) => {
let row = minimal_user_row::MinimalUserRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::Order(account) => {
let row = order_row::OrderRow::from_parts(*account.clone(), metadata.clone());
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::SolendMinimalReserve(account) => {
let row = solend_minimal_reserve_row::SolendMinimalReserveRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
MarginfiV2Account::StakedSettings(account) => {
let row = staked_settings_row::StakedSettingsRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.insert(pool).await?;
Ok(())
}
}
}
}
#[async_trait::async_trait]
impl carbon_core::postgres::operations::Upsert for MarginfiV2AccountWithMetadata {
async fn upsert(&self, pool: &sqlx::PgPool) -> carbon_core::error::CarbonResult<()> {
let MarginfiV2AccountWithMetadata(account, metadata) = self;
match account {
MarginfiV2Account::Bank(account) => {
let row = bank_row::BankRow::from_parts(*account.clone(), metadata.clone());
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::BankMetadata(account) => {
let row = bank_metadata_row::BankMetadataRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::ExecuteOrderRecord(account) => {
let row = execute_order_record_row::ExecuteOrderRecordRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::FeeState(account) => {
let row =
fee_state_row::FeeStateRow::from_parts(*account.clone(), metadata.clone());
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::Lending(account) => {
let row = lending_row::LendingRow::from_parts(*account.clone(), metadata.clone());
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::LiquidationRecord(account) => {
let row = liquidation_record_row::LiquidationRecordRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::MarginfiAccount(account) => {
let row = marginfi_account_row::MarginfiAccountRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::MarginfiGroup(account) => {
let row = marginfi_group_row::MarginfiGroupRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::MinimalObligation(account) => {
let row = minimal_obligation_row::MinimalObligationRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::MinimalReserve(account) => {
let row = minimal_reserve_row::MinimalReserveRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::MinimalSpotMarket(account) => {
let row = minimal_spot_market_row::MinimalSpotMarketRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::MinimalUser(account) => {
let row = minimal_user_row::MinimalUserRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::Order(account) => {
let row = order_row::OrderRow::from_parts(*account.clone(), metadata.clone());
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::SolendMinimalReserve(account) => {
let row = solend_minimal_reserve_row::SolendMinimalReserveRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
MarginfiV2Account::StakedSettings(account) => {
let row = staked_settings_row::StakedSettingsRow::from_parts(
*account.clone(),
metadata.clone(),
);
row.upsert(pool).await?;
Ok(())
}
}
}
}