use carbon_core::{
account::AccountMetadata,
postgres::{
metadata::AccountRowMetadata,
primitives::{Pubkey, U64, U8},
},
};
#[derive(sqlx::FromRow, Debug, Clone)]
pub struct MinimalReserveRow {
#[sqlx(flatten)]
pub account_metadata: AccountRowMetadata,
pub version: U64,
pub slot: U64,
pub stale: U8,
pub price_status: U8,
pub placeholder: Vec<u8>,
pub lending_market: Pubkey,
pub farm_collateral: Pubkey,
pub farm_debt: Pubkey,
pub mint_pubkey: Pubkey,
pub supply_vault: Pubkey,
pub fee_vault: Pubkey,
pub available_amount: U64,
pub borrowed_amount_sf: Vec<u8>,
pub market_price_sf: Vec<u8>,
pub market_price_last_updated_ts: U64,
pub mint_decimals: U64,
pub deposit_limit_crossed_timestamp: U64,
pub borrow_limit_crossed_timestamp: U64,
pub cumulative_borrow_rate_bsf: Vec<u8>,
pub accumulated_protocol_fees_sf: Vec<u8>,
pub accumulated_referrer_fees_sf: Vec<u8>,
pub pending_referrer_fees_sf: Vec<u8>,
pub absolute_referral_rate_sf: Vec<u8>,
pub token_program: Pubkey,
pub padding2_part1: Vec<u8>,
pub padding2_part2: Vec<u8>,
pub padding2_part3: Vec<u8>,
pub padding3: Vec<u8>,
pub padding_part1: Vec<u8>,
pub padding_part2: Vec<u8>,
pub padding_part3: Vec<u8>,
pub padding_part4: Vec<u8>,
pub collateral_mint_pubkey: Pubkey,
pub mint_total_supply: U64,
pub collateral_supply_vault: Pubkey,
pub padding1_reserve_collateral: Vec<u8>,
pub padding2_reserve_collateral: Vec<u8>,
pub padding4_part1: Vec<u8>,
pub padding4_part2: Vec<u8>,
pub padding4_part3: Vec<u8>,
pub padding4_part4: Vec<u8>,
pub padding4_part5: Vec<u8>,
pub padding4_part6: Vec<u8>,
}
impl MinimalReserveRow {
pub fn from_parts(
source: crate::accounts::minimal_reserve::MinimalReserve,
metadata: AccountMetadata,
) -> Self {
Self {
account_metadata: metadata.into(),
version: source.version.into(),
slot: source.slot.into(),
stale: source.stale.into(),
price_status: source.price_status.into(),
placeholder: source.placeholder.to_vec(),
lending_market: source.lending_market.into(),
farm_collateral: source.farm_collateral.into(),
farm_debt: source.farm_debt.into(),
mint_pubkey: source.mint_pubkey.into(),
supply_vault: source.supply_vault.into(),
fee_vault: source.fee_vault.into(),
available_amount: source.available_amount.into(),
borrowed_amount_sf: source.borrowed_amount_sf.to_vec(),
market_price_sf: source.market_price_sf.to_vec(),
market_price_last_updated_ts: source.market_price_last_updated_ts.into(),
mint_decimals: source.mint_decimals.into(),
deposit_limit_crossed_timestamp: source.deposit_limit_crossed_timestamp.into(),
borrow_limit_crossed_timestamp: source.borrow_limit_crossed_timestamp.into(),
cumulative_borrow_rate_bsf: source.cumulative_borrow_rate_bsf.to_vec(),
accumulated_protocol_fees_sf: source.accumulated_protocol_fees_sf.to_vec(),
accumulated_referrer_fees_sf: source.accumulated_referrer_fees_sf.to_vec(),
pending_referrer_fees_sf: source.pending_referrer_fees_sf.to_vec(),
absolute_referral_rate_sf: source.absolute_referral_rate_sf.to_vec(),
token_program: source.token_program.into(),
padding2_part1: source.padding2_part1.to_vec(),
padding2_part2: source.padding2_part2.to_vec(),
padding2_part3: source.padding2_part3.to_vec(),
padding3: source.padding3.to_vec(),
padding_part1: source.padding_part1.to_vec(),
padding_part2: source.padding_part2.to_vec(),
padding_part3: source.padding_part3.to_vec(),
padding_part4: source.padding_part4.to_vec(),
collateral_mint_pubkey: source.collateral_mint_pubkey.into(),
mint_total_supply: source.mint_total_supply.into(),
collateral_supply_vault: source.collateral_supply_vault.into(),
padding1_reserve_collateral: source.padding1_reserve_collateral.to_vec(),
padding2_reserve_collateral: source.padding2_reserve_collateral.to_vec(),
padding4_part1: source.padding4_part1.to_vec(),
padding4_part2: source.padding4_part2.to_vec(),
padding4_part3: source.padding4_part3.to_vec(),
padding4_part4: source.padding4_part4.to_vec(),
padding4_part5: source.padding4_part5.to_vec(),
padding4_part6: source.padding4_part6.to_vec(),
}
}
}
impl TryFrom<MinimalReserveRow> for crate::accounts::minimal_reserve::MinimalReserve {
type Error = carbon_core::error::Error;
fn try_from(source: MinimalReserveRow) -> Result<Self, Self::Error> {
Ok(Self {
version: *source.version,
slot: *source.slot,
stale: source.stale.try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert value from postgres primitive".to_string(),
)
})?,
price_status: source.price_status.try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert value from postgres primitive".to_string(),
)
})?,
placeholder: source.placeholder.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 6 bytes"
.to_string(),
)
})?,
lending_market: *source.lending_market,
farm_collateral: *source.farm_collateral,
farm_debt: *source.farm_debt,
mint_pubkey: *source.mint_pubkey,
supply_vault: *source.supply_vault,
fee_vault: *source.fee_vault,
available_amount: *source.available_amount,
borrowed_amount_sf: source
.borrowed_amount_sf
.as_slice()
.try_into()
.map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 16 bytes"
.to_string(),
)
})?,
market_price_sf: source.market_price_sf.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 16 bytes"
.to_string(),
)
})?,
market_price_last_updated_ts: *source.market_price_last_updated_ts,
mint_decimals: *source.mint_decimals,
deposit_limit_crossed_timestamp: *source.deposit_limit_crossed_timestamp,
borrow_limit_crossed_timestamp: *source.borrow_limit_crossed_timestamp,
cumulative_borrow_rate_bsf: source
.cumulative_borrow_rate_bsf
.as_slice()
.try_into()
.map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 48 bytes"
.to_string(),
)
})?,
accumulated_protocol_fees_sf: source
.accumulated_protocol_fees_sf
.as_slice()
.try_into()
.map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 16 bytes"
.to_string(),
)
})?,
accumulated_referrer_fees_sf: source
.accumulated_referrer_fees_sf
.as_slice()
.try_into()
.map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 16 bytes"
.to_string(),
)
})?,
pending_referrer_fees_sf: source
.pending_referrer_fees_sf
.as_slice()
.try_into()
.map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 16 bytes"
.to_string(),
)
})?,
absolute_referral_rate_sf: source
.absolute_referral_rate_sf
.as_slice()
.try_into()
.map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 16 bytes"
.to_string(),
)
})?,
token_program: *source.token_program,
padding2_part1: source.padding2_part1.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 256 bytes"
.to_string(),
)
})?,
padding2_part2: source.padding2_part2.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 128 bytes"
.to_string(),
)
})?,
padding2_part3: source.padding2_part3.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 24 bytes"
.to_string(),
)
})?,
padding3: source.padding3.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 512 bytes"
.to_string(),
)
})?,
padding_part1: source.padding_part1.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 512 bytes"
.to_string(),
)
})?,
padding_part2: source.padding_part2.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 512 bytes"
.to_string(),
)
})?,
padding_part3: source.padding_part3.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 128 bytes"
.to_string(),
)
})?,
padding_part4: source.padding_part4.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 48 bytes"
.to_string(),
)
})?,
collateral_mint_pubkey: *source.collateral_mint_pubkey,
mint_total_supply: *source.mint_total_supply,
collateral_supply_vault: *source.collateral_supply_vault,
padding1_reserve_collateral: source
.padding1_reserve_collateral
.as_slice()
.try_into()
.map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 512 bytes"
.to_string(),
)
})?,
padding2_reserve_collateral: source
.padding2_reserve_collateral
.as_slice()
.try_into()
.map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 512 bytes"
.to_string(),
)
})?,
padding4_part1: source.padding4_part1.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 4096 bytes"
.to_string(),
)
})?,
padding4_part2: source.padding4_part2.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 512 bytes"
.to_string(),
)
})?,
padding4_part3: source.padding4_part3.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 256 bytes"
.to_string(),
)
})?,
padding4_part4: source.padding4_part4.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 64 bytes"
.to_string(),
)
})?,
padding4_part5: source.padding4_part5.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 32 bytes"
.to_string(),
)
})?,
padding4_part6: source.padding4_part6.as_slice().try_into().map_err(|_| {
carbon_core::error::Error::Custom(
"Failed to convert padding from postgres primitive: expected 8 bytes"
.to_string(),
)
})?,
})
}
}
impl carbon_core::postgres::operations::Table for crate::accounts::minimal_reserve::MinimalReserve {
fn table() -> &'static str {
"minimal_reserve_account"
}
fn columns() -> Vec<&'static str> {
vec![
"__pubkey",
"__slot",
"version",
"slot",
"stale",
"price_status",
"placeholder",
"lending_market",
"farm_collateral",
"farm_debt",
"mint_pubkey",
"supply_vault",
"fee_vault",
"available_amount",
"borrowed_amount_sf",
"market_price_sf",
"market_price_last_updated_ts",
"mint_decimals",
"deposit_limit_crossed_timestamp",
"borrow_limit_crossed_timestamp",
"cumulative_borrow_rate_bsf",
"accumulated_protocol_fees_sf",
"accumulated_referrer_fees_sf",
"pending_referrer_fees_sf",
"absolute_referral_rate_sf",
"token_program",
"padding2_part1",
"padding2_part2",
"padding2_part3",
"padding3",
"padding_part1",
"padding_part2",
"padding_part3",
"padding_part4",
"collateral_mint_pubkey",
"mint_total_supply",
"collateral_supply_vault",
"padding1_reserve_collateral",
"padding2_reserve_collateral",
"padding4_part1",
"padding4_part2",
"padding4_part3",
"padding4_part4",
"padding4_part5",
"padding4_part6",
]
}
}
#[async_trait::async_trait]
impl carbon_core::postgres::operations::Insert for MinimalReserveRow {
async fn insert(&self, pool: &sqlx::PgPool) -> carbon_core::error::CarbonResult<()> {
sqlx::query(r#"
INSERT INTO minimal_reserve_account (
"version",
"slot",
"stale",
"price_status",
"placeholder",
"lending_market",
"farm_collateral",
"farm_debt",
"mint_pubkey",
"supply_vault",
"fee_vault",
"available_amount",
"borrowed_amount_sf",
"market_price_sf",
"market_price_last_updated_ts",
"mint_decimals",
"deposit_limit_crossed_timestamp",
"borrow_limit_crossed_timestamp",
"cumulative_borrow_rate_bsf",
"accumulated_protocol_fees_sf",
"accumulated_referrer_fees_sf",
"pending_referrer_fees_sf",
"absolute_referral_rate_sf",
"token_program",
"padding2_part1",
"padding2_part2",
"padding2_part3",
"padding3",
"padding_part1",
"padding_part2",
"padding_part3",
"padding_part4",
"collateral_mint_pubkey",
"mint_total_supply",
"collateral_supply_vault",
"padding1_reserve_collateral",
"padding2_reserve_collateral",
"padding4_part1",
"padding4_part2",
"padding4_part3",
"padding4_part4",
"padding4_part5",
"padding4_part6",
__pubkey, __slot
) VALUES (
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44, $45
)"#)
.bind(&self.version)
.bind(&self.slot)
.bind(self.stale)
.bind(self.price_status)
.bind(&self.placeholder)
.bind(self.lending_market)
.bind(self.farm_collateral)
.bind(self.farm_debt)
.bind(self.mint_pubkey)
.bind(self.supply_vault)
.bind(self.fee_vault)
.bind(&self.available_amount)
.bind(&self.borrowed_amount_sf)
.bind(&self.market_price_sf)
.bind(&self.market_price_last_updated_ts)
.bind(&self.mint_decimals)
.bind(&self.deposit_limit_crossed_timestamp)
.bind(&self.borrow_limit_crossed_timestamp)
.bind(&self.cumulative_borrow_rate_bsf)
.bind(&self.accumulated_protocol_fees_sf)
.bind(&self.accumulated_referrer_fees_sf)
.bind(&self.pending_referrer_fees_sf)
.bind(&self.absolute_referral_rate_sf)
.bind(self.token_program)
.bind(&self.padding2_part1)
.bind(&self.padding2_part2)
.bind(&self.padding2_part3)
.bind(&self.padding3)
.bind(&self.padding_part1)
.bind(&self.padding_part2)
.bind(&self.padding_part3)
.bind(&self.padding_part4)
.bind(self.collateral_mint_pubkey)
.bind(&self.mint_total_supply)
.bind(self.collateral_supply_vault)
.bind(&self.padding1_reserve_collateral)
.bind(&self.padding2_reserve_collateral)
.bind(&self.padding4_part1)
.bind(&self.padding4_part2)
.bind(&self.padding4_part3)
.bind(&self.padding4_part4)
.bind(&self.padding4_part5)
.bind(&self.padding4_part6)
.bind(self.account_metadata.pubkey)
.bind(&self.account_metadata.slot)
.execute(pool).await
.map_err(|e| carbon_core::error::Error::Custom(e.to_string()))?;
Ok(())
}
}
#[async_trait::async_trait]
impl carbon_core::postgres::operations::Upsert for MinimalReserveRow {
async fn upsert(&self, pool: &sqlx::PgPool) -> carbon_core::error::CarbonResult<()> {
sqlx::query(r#"INSERT INTO minimal_reserve_account (
"version",
"slot",
"stale",
"price_status",
"placeholder",
"lending_market",
"farm_collateral",
"farm_debt",
"mint_pubkey",
"supply_vault",
"fee_vault",
"available_amount",
"borrowed_amount_sf",
"market_price_sf",
"market_price_last_updated_ts",
"mint_decimals",
"deposit_limit_crossed_timestamp",
"borrow_limit_crossed_timestamp",
"cumulative_borrow_rate_bsf",
"accumulated_protocol_fees_sf",
"accumulated_referrer_fees_sf",
"pending_referrer_fees_sf",
"absolute_referral_rate_sf",
"token_program",
"padding2_part1",
"padding2_part2",
"padding2_part3",
"padding3",
"padding_part1",
"padding_part2",
"padding_part3",
"padding_part4",
"collateral_mint_pubkey",
"mint_total_supply",
"collateral_supply_vault",
"padding1_reserve_collateral",
"padding2_reserve_collateral",
"padding4_part1",
"padding4_part2",
"padding4_part3",
"padding4_part4",
"padding4_part5",
"padding4_part6",
__pubkey, __slot
) VALUES (
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44, $45
) ON CONFLICT (
__pubkey
) DO UPDATE SET
"version" = EXCLUDED."version",
"slot" = EXCLUDED."slot",
"stale" = EXCLUDED."stale",
"price_status" = EXCLUDED."price_status",
"placeholder" = EXCLUDED."placeholder",
"lending_market" = EXCLUDED."lending_market",
"farm_collateral" = EXCLUDED."farm_collateral",
"farm_debt" = EXCLUDED."farm_debt",
"mint_pubkey" = EXCLUDED."mint_pubkey",
"supply_vault" = EXCLUDED."supply_vault",
"fee_vault" = EXCLUDED."fee_vault",
"available_amount" = EXCLUDED."available_amount",
"borrowed_amount_sf" = EXCLUDED."borrowed_amount_sf",
"market_price_sf" = EXCLUDED."market_price_sf",
"market_price_last_updated_ts" = EXCLUDED."market_price_last_updated_ts",
"mint_decimals" = EXCLUDED."mint_decimals",
"deposit_limit_crossed_timestamp" = EXCLUDED."deposit_limit_crossed_timestamp",
"borrow_limit_crossed_timestamp" = EXCLUDED."borrow_limit_crossed_timestamp",
"cumulative_borrow_rate_bsf" = EXCLUDED."cumulative_borrow_rate_bsf",
"accumulated_protocol_fees_sf" = EXCLUDED."accumulated_protocol_fees_sf",
"accumulated_referrer_fees_sf" = EXCLUDED."accumulated_referrer_fees_sf",
"pending_referrer_fees_sf" = EXCLUDED."pending_referrer_fees_sf",
"absolute_referral_rate_sf" = EXCLUDED."absolute_referral_rate_sf",
"token_program" = EXCLUDED."token_program",
"padding2_part1" = EXCLUDED."padding2_part1",
"padding2_part2" = EXCLUDED."padding2_part2",
"padding2_part3" = EXCLUDED."padding2_part3",
"padding3" = EXCLUDED."padding3",
"padding_part1" = EXCLUDED."padding_part1",
"padding_part2" = EXCLUDED."padding_part2",
"padding_part3" = EXCLUDED."padding_part3",
"padding_part4" = EXCLUDED."padding_part4",
"collateral_mint_pubkey" = EXCLUDED."collateral_mint_pubkey",
"mint_total_supply" = EXCLUDED."mint_total_supply",
"collateral_supply_vault" = EXCLUDED."collateral_supply_vault",
"padding1_reserve_collateral" = EXCLUDED."padding1_reserve_collateral",
"padding2_reserve_collateral" = EXCLUDED."padding2_reserve_collateral",
"padding4_part1" = EXCLUDED."padding4_part1",
"padding4_part2" = EXCLUDED."padding4_part2",
"padding4_part3" = EXCLUDED."padding4_part3",
"padding4_part4" = EXCLUDED."padding4_part4",
"padding4_part5" = EXCLUDED."padding4_part5",
"padding4_part6" = EXCLUDED."padding4_part6",
__slot = EXCLUDED.__slot
"#)
.bind(&self.version)
.bind(&self.slot)
.bind(self.stale)
.bind(self.price_status)
.bind(&self.placeholder)
.bind(self.lending_market)
.bind(self.farm_collateral)
.bind(self.farm_debt)
.bind(self.mint_pubkey)
.bind(self.supply_vault)
.bind(self.fee_vault)
.bind(&self.available_amount)
.bind(&self.borrowed_amount_sf)
.bind(&self.market_price_sf)
.bind(&self.market_price_last_updated_ts)
.bind(&self.mint_decimals)
.bind(&self.deposit_limit_crossed_timestamp)
.bind(&self.borrow_limit_crossed_timestamp)
.bind(&self.cumulative_borrow_rate_bsf)
.bind(&self.accumulated_protocol_fees_sf)
.bind(&self.accumulated_referrer_fees_sf)
.bind(&self.pending_referrer_fees_sf)
.bind(&self.absolute_referral_rate_sf)
.bind(self.token_program)
.bind(&self.padding2_part1)
.bind(&self.padding2_part2)
.bind(&self.padding2_part3)
.bind(&self.padding3)
.bind(&self.padding_part1)
.bind(&self.padding_part2)
.bind(&self.padding_part3)
.bind(&self.padding_part4)
.bind(self.collateral_mint_pubkey)
.bind(&self.mint_total_supply)
.bind(self.collateral_supply_vault)
.bind(&self.padding1_reserve_collateral)
.bind(&self.padding2_reserve_collateral)
.bind(&self.padding4_part1)
.bind(&self.padding4_part2)
.bind(&self.padding4_part3)
.bind(&self.padding4_part4)
.bind(&self.padding4_part5)
.bind(&self.padding4_part6)
.bind(self.account_metadata.pubkey)
.bind(&self.account_metadata.slot)
.execute(pool).await
.map_err(|e| carbon_core::error::Error::Custom(e.to_string()))?;
Ok(())
}
}
#[async_trait::async_trait]
impl carbon_core::postgres::operations::Delete for MinimalReserveRow {
type Key = carbon_core::postgres::primitives::Pubkey;
async fn delete(key: Self::Key, pool: &sqlx::PgPool) -> carbon_core::error::CarbonResult<()> {
sqlx::query(
r#"DELETE FROM minimal_reserve_account WHERE
__pubkey = $1
"#,
)
.bind(key)
.execute(pool)
.await
.map_err(|e| carbon_core::error::Error::Custom(e.to_string()))?;
Ok(())
}
}
#[async_trait::async_trait]
impl carbon_core::postgres::operations::Lookup for MinimalReserveRow {
type Key = carbon_core::postgres::primitives::Pubkey;
async fn lookup(
key: Self::Key,
pool: &sqlx::PgPool,
) -> carbon_core::error::CarbonResult<Option<Self>> {
let row = sqlx::query_as(
r#"SELECT * FROM minimal_reserve_account WHERE
__pubkey = $1
"#,
)
.bind(key)
.fetch_optional(pool)
.await
.map_err(|e| carbon_core::error::Error::Custom(e.to_string()))?;
Ok(row)
}
}
pub struct MinimalReserveMigrationOperation;
#[async_trait::async_trait]
impl sqlx_migrator::Operation<sqlx::Postgres> for MinimalReserveMigrationOperation {
async fn up(
&self,
connection: &mut sqlx::PgConnection,
) -> Result<(), sqlx_migrator::error::Error> {
sqlx::query(
r#"CREATE TABLE IF NOT EXISTS minimal_reserve_account (
-- Account data
"version" NUMERIC(20) NOT NULL,
"slot" NUMERIC(20) NOT NULL,
"stale" INT2 NOT NULL,
"price_status" INT2 NOT NULL,
"placeholder" BYTEA NOT NULL,
"lending_market" BYTEA NOT NULL,
"farm_collateral" BYTEA NOT NULL,
"farm_debt" BYTEA NOT NULL,
"mint_pubkey" BYTEA NOT NULL,
"supply_vault" BYTEA NOT NULL,
"fee_vault" BYTEA NOT NULL,
"available_amount" NUMERIC(20) NOT NULL,
"borrowed_amount_sf" BYTEA NOT NULL,
"market_price_sf" BYTEA NOT NULL,
"market_price_last_updated_ts" NUMERIC(20) NOT NULL,
"mint_decimals" NUMERIC(20) NOT NULL,
"deposit_limit_crossed_timestamp" NUMERIC(20) NOT NULL,
"borrow_limit_crossed_timestamp" NUMERIC(20) NOT NULL,
"cumulative_borrow_rate_bsf" BYTEA NOT NULL,
"accumulated_protocol_fees_sf" BYTEA NOT NULL,
"accumulated_referrer_fees_sf" BYTEA NOT NULL,
"pending_referrer_fees_sf" BYTEA NOT NULL,
"absolute_referral_rate_sf" BYTEA NOT NULL,
"token_program" BYTEA NOT NULL,
"padding2_part1" BYTEA NOT NULL,
"padding2_part2" BYTEA NOT NULL,
"padding2_part3" BYTEA NOT NULL,
"padding3" BYTEA NOT NULL,
"padding_part1" BYTEA NOT NULL,
"padding_part2" BYTEA NOT NULL,
"padding_part3" BYTEA NOT NULL,
"padding_part4" BYTEA NOT NULL,
"collateral_mint_pubkey" BYTEA NOT NULL,
"mint_total_supply" NUMERIC(20) NOT NULL,
"collateral_supply_vault" BYTEA NOT NULL,
"padding1_reserve_collateral" BYTEA NOT NULL,
"padding2_reserve_collateral" BYTEA NOT NULL,
"padding4_part1" BYTEA NOT NULL,
"padding4_part2" BYTEA NOT NULL,
"padding4_part3" BYTEA NOT NULL,
"padding4_part4" BYTEA NOT NULL,
"padding4_part5" BYTEA NOT NULL,
"padding4_part6" BYTEA NOT NULL,
-- Account metadata
__pubkey BYTEA NOT NULL,
__slot NUMERIC(20),
PRIMARY KEY (__pubkey)
)"#,
)
.execute(connection)
.await?;
Ok(())
}
async fn down(
&self,
connection: &mut sqlx::PgConnection,
) -> Result<(), sqlx_migrator::error::Error> {
sqlx::query(r#"DROP TABLE IF EXISTS minimal_reserve_account"#)
.execute(connection)
.await?;
Ok(())
}
}