Accounts

These functions are used to retrieve specific on-chain accounts (State, PerpMarket, SpotMarket, etc.)

Example

drift_client= DriftClient.from_config(config, provider)

# get sol market info
sol_market_index = 0
sol_market = await get_perp_market_account(drift_client.program, sol_market_index)
print(
    sol_market.amm.sqrt_k,
    sol_market.amm.base_asset_amount_long,
    sol_market.amm.base_asset_amount_short,
)

# get usdc spot market info
usdc_spot_market_index = 0
usdc_market = await get_spot_market_account(drift_client.program, usdc_spot_market_index)
print(
    usdc.market_index,
    usdc.deposit_balance,
    usdc.borrow_balance,
)

accounts

MarketUpdateCallback = Callable[[str, DataAndSlot[Union[PerpMarketAccount, SpotMarketAccount]]], Awaitable[None]] module-attribute

UpdateCallback = Callable[[str, DataAndSlot[UserAccount]], Awaitable[None]] module-attribute

BufferAndSlot dataclass

Source code in src/driftpy/accounts/types.py
35
36
37
38
@dataclass
class BufferAndSlot:
    slot: int
    buffer: bytes

buffer instance-attribute

slot instance-attribute

__init__(slot, buffer)

DataAndSlot dataclass

Bases: Generic[T]

Source code in src/driftpy/accounts/types.py
22
23
24
25
@dataclass
class DataAndSlot(Generic[T]):
    slot: int
    data: T

data instance-attribute

slot instance-attribute

__init__(slot, data)

DriftClientAccountSubscriber

Source code in src/driftpy/accounts/types.py
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
class DriftClientAccountSubscriber:
    @abstractmethod
    async def subscribe(self):
        pass

    @abstractmethod
    def unsubscribe(self):
        pass

    @abstractmethod
    async def fetch(self):
        pass

    @abstractmethod
    def get_state_account_and_slot(self) -> Optional[DataAndSlot[StateAccount]]:
        pass

    @abstractmethod
    def get_perp_market_and_slot(
        self, market_index: int
    ) -> Optional[DataAndSlot[PerpMarketAccount]]:
        pass

    @abstractmethod
    def get_spot_market_and_slot(
        self, market_index: int
    ) -> Optional[DataAndSlot[SpotMarketAccount]]:
        pass

    @abstractmethod
    def get_oracle_price_data_and_slot(
        self, oracle: Pubkey
    ) -> Optional[DataAndSlot[OraclePriceData]]:
        pass

    @abstractmethod
    def get_market_accounts_and_slots(self) -> list[DataAndSlot[PerpMarketAccount]]:
        pass

    @abstractmethod
    def get_spot_market_accounts_and_slots(
        self,
    ) -> list[DataAndSlot[SpotMarketAccount]]:
        pass

fetch() abstractmethod async

Source code in src/driftpy/accounts/types.py
70
71
72
@abstractmethod
async def fetch(self):
    pass

get_market_accounts_and_slots() abstractmethod

Source code in src/driftpy/accounts/types.py
96
97
98
@abstractmethod
def get_market_accounts_and_slots(self) -> list[DataAndSlot[PerpMarketAccount]]:
    pass

get_oracle_price_data_and_slot(oracle) abstractmethod

Source code in src/driftpy/accounts/types.py
90
91
92
93
94
@abstractmethod
def get_oracle_price_data_and_slot(
    self, oracle: Pubkey
) -> Optional[DataAndSlot[OraclePriceData]]:
    pass

get_perp_market_and_slot(market_index) abstractmethod

Source code in src/driftpy/accounts/types.py
78
79
80
81
82
@abstractmethod
def get_perp_market_and_slot(
    self, market_index: int
) -> Optional[DataAndSlot[PerpMarketAccount]]:
    pass

get_spot_market_accounts_and_slots() abstractmethod

Source code in src/driftpy/accounts/types.py
100
101
102
103
104
@abstractmethod
def get_spot_market_accounts_and_slots(
    self,
) -> list[DataAndSlot[SpotMarketAccount]]:
    pass

get_spot_market_and_slot(market_index) abstractmethod

Source code in src/driftpy/accounts/types.py
84
85
86
87
88
@abstractmethod
def get_spot_market_and_slot(
    self, market_index: int
) -> Optional[DataAndSlot[SpotMarketAccount]]:
    pass

get_state_account_and_slot() abstractmethod

Source code in src/driftpy/accounts/types.py
74
75
76
@abstractmethod
def get_state_account_and_slot(self) -> Optional[DataAndSlot[StateAccount]]:
    pass

subscribe() abstractmethod async

Source code in src/driftpy/accounts/types.py
62
63
64
@abstractmethod
async def subscribe(self):
    pass

unsubscribe() abstractmethod

Source code in src/driftpy/accounts/types.py
66
67
68
@abstractmethod
def unsubscribe(self):
    pass

FullOracleWrapper dataclass

Source code in src/driftpy/accounts/types.py
28
29
30
31
32
@dataclass
class FullOracleWrapper:
    pubkey: Pubkey
    oracle_source: OracleSource
    oracle_price_data_and_slot: Optional[DataAndSlot[OraclePriceData]]

oracle_price_data_and_slot instance-attribute

oracle_source instance-attribute

pubkey instance-attribute

__init__(pubkey, oracle_source, oracle_price_data_and_slot)

GrpcProgramAccountOptions dataclass

Source code in src/driftpy/accounts/types.py
48
49
50
51
@dataclass
class GrpcProgramAccountOptions:
    filters: Sequence[MemcmpOpts]
    commitment: Commitment

commitment instance-attribute

filters instance-attribute

__init__(filters, commitment)

InsuranceFundStakeAccount dataclass

Source code in src/driftpy/types.py
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
@dataclass
class InsuranceFundStakeAccount:
    authority: Pubkey
    if_shares: int
    last_withdraw_request_shares: int
    if_base: int
    last_valid_ts: int
    last_withdraw_request_value: int
    last_withdraw_request_ts: int
    cost_basis: int
    market_index: int
    padding: list[int] = field(default_factory=lambda: [0] * 14)

authority instance-attribute

cost_basis instance-attribute

if_base instance-attribute

if_shares instance-attribute

last_valid_ts instance-attribute

last_withdraw_request_shares instance-attribute

last_withdraw_request_ts instance-attribute

last_withdraw_request_value instance-attribute

market_index instance-attribute

padding = field(default_factory=(lambda: [0] * 14)) class-attribute instance-attribute

__init__(authority, if_shares, last_withdraw_request_shares, if_base, last_valid_ts, last_withdraw_request_value, last_withdraw_request_ts, cost_basis, market_index, padding=(lambda: [0] * 14)())

OraclePriceData dataclass

Source code in src/driftpy/types.py
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
@dataclass
class OraclePriceData:
    price: int
    slot: int
    confidence: int
    twap: int
    twap_confidence: int
    has_sufficient_number_of_data_points: bool

    @staticmethod
    def default():
        return OraclePriceData(
            price=0,
            slot=0,
            confidence=0,
            twap=0,
            twap_confidence=0,
            has_sufficient_number_of_data_points=False,
        )

confidence instance-attribute

has_sufficient_number_of_data_points instance-attribute

price instance-attribute

slot instance-attribute

twap instance-attribute

twap_confidence instance-attribute

__init__(price, slot, confidence, twap, twap_confidence, has_sufficient_number_of_data_points)

default() staticmethod

Source code in src/driftpy/types.py
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
@staticmethod
def default():
    return OraclePriceData(
        price=0,
        slot=0,
        confidence=0,
        twap=0,
        twap_confidence=0,
        has_sufficient_number_of_data_points=False,
    )

OracleSource

Source code in src/driftpy/types.py
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
@_rust_enum
class OracleSource:
    Pyth = constructor()
    Switchboard = constructor()
    QuoteAsset = constructor()
    Pyth1K = constructor()
    Pyth1M = constructor()
    PythStableCoin = constructor()
    Prelaunch = constructor()
    PythPull = constructor()
    Pyth1KPull = constructor()
    Pyth1MPull = constructor()
    PythStableCoinPull = constructor()
    SwitchboardOnDemand = constructor()
    PythLazer = constructor()
    PythLazer1K = constructor()
    PythLazer1M = constructor()
    PythLazerStableCoin = constructor()

Prelaunch = constructor() class-attribute instance-attribute

Pyth = constructor() class-attribute instance-attribute

Pyth1K = constructor() class-attribute instance-attribute

Pyth1KPull = constructor() class-attribute instance-attribute

Pyth1M = constructor() class-attribute instance-attribute

Pyth1MPull = constructor() class-attribute instance-attribute

PythLazer = constructor() class-attribute instance-attribute

PythLazer1K = constructor() class-attribute instance-attribute

PythLazer1M = constructor() class-attribute instance-attribute

PythLazerStableCoin = constructor() class-attribute instance-attribute

PythPull = constructor() class-attribute instance-attribute

PythStableCoin = constructor() class-attribute instance-attribute

PythStableCoinPull = constructor() class-attribute instance-attribute

QuoteAsset = constructor() class-attribute instance-attribute

Switchboard = constructor() class-attribute instance-attribute

SwitchboardOnDemand = constructor() class-attribute instance-attribute

PerpMarketAccount dataclass

Source code in src/driftpy/types.py
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
@dataclass
class PerpMarketAccount:
    pubkey: Pubkey
    amm: AMM
    pnl_pool: PoolBalance
    name: list[int]
    insurance_claim: InsuranceClaim
    unrealized_pnl_max_imbalance: int
    expiry_ts: int
    expiry_price: int
    next_fill_record_id: int
    next_funding_rate_record_id: int
    next_curve_record_id: int
    imf_factor: int
    unrealized_pnl_imf_factor: int
    liquidator_fee: int
    if_liquidation_fee: int
    margin_ratio_initial: int
    margin_ratio_maintenance: int
    unrealized_pnl_initial_asset_weight: int
    unrealized_pnl_maintenance_asset_weight: int
    number_of_users_with_base: int
    number_of_users: int
    market_index: int
    status: MarketStatus
    contract_type: ContractType
    contract_tier: ContractTier
    paused_operations: int
    quote_spot_market_index: int
    fee_adjustment: int

    fuel_boost_taker: int
    fuel_boost_maker: int
    fuel_boost_position: int

    pool_id: int
    high_leverage_margin_ratio_initial: int
    high_leverage_margin_ratio_maintenance: int

    padding: list[int] = field(default_factory=lambda: [0] * 38)

amm instance-attribute

contract_tier instance-attribute

contract_type instance-attribute

expiry_price instance-attribute

expiry_ts instance-attribute

fee_adjustment instance-attribute

fuel_boost_maker instance-attribute

fuel_boost_position instance-attribute

fuel_boost_taker instance-attribute

high_leverage_margin_ratio_initial instance-attribute

high_leverage_margin_ratio_maintenance instance-attribute

if_liquidation_fee instance-attribute

imf_factor instance-attribute

insurance_claim instance-attribute

liquidator_fee instance-attribute

margin_ratio_initial instance-attribute

margin_ratio_maintenance instance-attribute

market_index instance-attribute

name instance-attribute

next_curve_record_id instance-attribute

next_fill_record_id instance-attribute

next_funding_rate_record_id instance-attribute

number_of_users instance-attribute

number_of_users_with_base instance-attribute

padding = field(default_factory=(lambda: [0] * 38)) class-attribute instance-attribute

paused_operations instance-attribute

pnl_pool instance-attribute

pool_id instance-attribute

pubkey instance-attribute

quote_spot_market_index instance-attribute

status instance-attribute

unrealized_pnl_imf_factor instance-attribute

unrealized_pnl_initial_asset_weight instance-attribute

unrealized_pnl_maintenance_asset_weight instance-attribute

unrealized_pnl_max_imbalance instance-attribute

__init__(pubkey, amm, pnl_pool, name, insurance_claim, unrealized_pnl_max_imbalance, expiry_ts, expiry_price, next_fill_record_id, next_funding_rate_record_id, next_curve_record_id, imf_factor, unrealized_pnl_imf_factor, liquidator_fee, if_liquidation_fee, margin_ratio_initial, margin_ratio_maintenance, unrealized_pnl_initial_asset_weight, unrealized_pnl_maintenance_asset_weight, number_of_users_with_base, number_of_users, market_index, status, contract_type, contract_tier, paused_operations, quote_spot_market_index, fee_adjustment, fuel_boost_taker, fuel_boost_maker, fuel_boost_position, pool_id, high_leverage_margin_ratio_initial, high_leverage_margin_ratio_maintenance, padding=(lambda: [0] * 38)())

SpotMarketAccount dataclass

Source code in src/driftpy/types.py
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
@dataclass
class SpotMarketAccount:
    pubkey: Pubkey
    oracle: Pubkey
    mint: Pubkey
    vault: Pubkey
    name: list[int]
    historical_oracle_data: HistoricalOracleData
    historical_index_data: HistoricalIndexData
    revenue_pool: PoolBalance
    spot_fee_pool: PoolBalance
    insurance_fund: InsuranceFund
    total_spot_fee: int
    deposit_balance: int
    borrow_balance: int
    cumulative_deposit_interest: int
    cumulative_borrow_interest: int
    total_social_loss: int
    total_quote_social_loss: int
    withdraw_guard_threshold: int
    max_token_deposits: int
    deposit_token_twap: int
    borrow_token_twap: int
    utilization_twap: int
    last_interest_ts: int
    last_twap_ts: int
    expiry_ts: int
    order_step_size: int
    order_tick_size: int
    min_order_size: int
    max_position_size: int
    next_fill_record_id: int
    next_deposit_record_id: int
    initial_asset_weight: int
    maintenance_asset_weight: int
    initial_liability_weight: int
    maintenance_liability_weight: int
    imf_factor: int
    liquidator_fee: int
    if_liquidation_fee: int
    optimal_utilization: int
    optimal_borrow_rate: int
    max_borrow_rate: int
    decimals: int
    market_index: int
    orders_enabled: bool
    oracle_source: OracleSource
    status: MarketStatus
    asset_tier: AssetTier
    paused_operations: int
    if_paused_operations: int
    fee_adjustment: int
    max_token_borrows_fraction: int
    flash_loan_amount: Optional[int] = None
    flash_loan_initial_token_amount: Optional[int] = None
    total_swap_fee: Optional[int] = None
    scale_initial_asset_weight_start: Optional[int] = None
    min_borrow_rate: Optional[int] = None
    fuel_boost_deposits: Optional[int] = None
    fuel_boost_borrows: Optional[int] = None
    fuel_boost_taker: Optional[int] = None
    fuel_boost_maker: Optional[int] = None
    fuel_boost_insurance: Optional[int] = None
    padding: list[int] = field(default_factory=lambda: [0] * 42)

asset_tier instance-attribute

borrow_balance instance-attribute

borrow_token_twap instance-attribute

cumulative_borrow_interest instance-attribute

cumulative_deposit_interest instance-attribute

decimals instance-attribute

deposit_balance instance-attribute

deposit_token_twap instance-attribute

expiry_ts instance-attribute

fee_adjustment instance-attribute

flash_loan_amount = None class-attribute instance-attribute

flash_loan_initial_token_amount = None class-attribute instance-attribute

fuel_boost_borrows = None class-attribute instance-attribute

fuel_boost_deposits = None class-attribute instance-attribute

fuel_boost_insurance = None class-attribute instance-attribute

fuel_boost_maker = None class-attribute instance-attribute

fuel_boost_taker = None class-attribute instance-attribute

historical_index_data instance-attribute

historical_oracle_data instance-attribute

if_liquidation_fee instance-attribute

if_paused_operations instance-attribute

imf_factor instance-attribute

initial_asset_weight instance-attribute

initial_liability_weight instance-attribute

insurance_fund instance-attribute

last_interest_ts instance-attribute

last_twap_ts instance-attribute

liquidator_fee instance-attribute

maintenance_asset_weight instance-attribute

maintenance_liability_weight instance-attribute

market_index instance-attribute

max_borrow_rate instance-attribute

max_position_size instance-attribute

max_token_borrows_fraction instance-attribute

max_token_deposits instance-attribute

min_borrow_rate = None class-attribute instance-attribute

min_order_size instance-attribute

mint instance-attribute

name instance-attribute

next_deposit_record_id instance-attribute

next_fill_record_id instance-attribute

optimal_borrow_rate instance-attribute

optimal_utilization instance-attribute

oracle instance-attribute

oracle_source instance-attribute

order_step_size instance-attribute

order_tick_size instance-attribute

orders_enabled instance-attribute

padding = field(default_factory=(lambda: [0] * 42)) class-attribute instance-attribute

paused_operations instance-attribute

pubkey instance-attribute

revenue_pool instance-attribute

scale_initial_asset_weight_start = None class-attribute instance-attribute

spot_fee_pool instance-attribute

status instance-attribute

total_quote_social_loss instance-attribute

total_social_loss instance-attribute

total_spot_fee instance-attribute

total_swap_fee = None class-attribute instance-attribute

utilization_twap instance-attribute

vault instance-attribute

withdraw_guard_threshold instance-attribute

__init__(pubkey, oracle, mint, vault, name, historical_oracle_data, historical_index_data, revenue_pool, spot_fee_pool, insurance_fund, total_spot_fee, deposit_balance, borrow_balance, cumulative_deposit_interest, cumulative_borrow_interest, total_social_loss, total_quote_social_loss, withdraw_guard_threshold, max_token_deposits, deposit_token_twap, borrow_token_twap, utilization_twap, last_interest_ts, last_twap_ts, expiry_ts, order_step_size, order_tick_size, min_order_size, max_position_size, next_fill_record_id, next_deposit_record_id, initial_asset_weight, maintenance_asset_weight, initial_liability_weight, maintenance_liability_weight, imf_factor, liquidator_fee, if_liquidation_fee, optimal_utilization, optimal_borrow_rate, max_borrow_rate, decimals, market_index, orders_enabled, oracle_source, status, asset_tier, paused_operations, if_paused_operations, fee_adjustment, max_token_borrows_fraction, flash_loan_amount=None, flash_loan_initial_token_amount=None, total_swap_fee=None, scale_initial_asset_weight_start=None, min_borrow_rate=None, fuel_boost_deposits=None, fuel_boost_borrows=None, fuel_boost_taker=None, fuel_boost_maker=None, fuel_boost_insurance=None, padding=(lambda: [0] * 42)())

StateAccount dataclass

Source code in src/driftpy/types.py
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
@dataclass
class StateAccount:
    admin: Pubkey
    whitelist_mint: Pubkey
    discount_mint: Pubkey
    signer: Pubkey
    srm_vault: Pubkey
    perp_fee_structure: FeeStructure
    spot_fee_structure: FeeStructure
    oracle_guard_rails: OracleGuardRails
    number_of_authorities: int
    number_of_sub_accounts: int
    lp_cooldown_time: int
    liquidation_margin_buffer_ratio: int
    settlement_duration: int
    number_of_markets: int
    number_of_spot_markets: int
    signer_nonce: int
    min_perp_auction_duration: int
    default_market_order_time_in_force: int
    default_spot_auction_duration: int
    exchange_status: int
    liquidation_duration: int
    initial_pct_to_liquidate: int
    max_number_of_sub_accounts: int
    padding: list[int] = field(default_factory=lambda: [0] * 10)

admin instance-attribute

default_market_order_time_in_force instance-attribute

default_spot_auction_duration instance-attribute

discount_mint instance-attribute

exchange_status instance-attribute

initial_pct_to_liquidate instance-attribute

liquidation_duration instance-attribute

liquidation_margin_buffer_ratio instance-attribute

lp_cooldown_time instance-attribute

max_number_of_sub_accounts instance-attribute

min_perp_auction_duration instance-attribute

number_of_authorities instance-attribute

number_of_markets instance-attribute

number_of_spot_markets instance-attribute

number_of_sub_accounts instance-attribute

oracle_guard_rails instance-attribute

padding = field(default_factory=(lambda: [0] * 10)) class-attribute instance-attribute

perp_fee_structure instance-attribute

settlement_duration instance-attribute

signer instance-attribute

signer_nonce instance-attribute

spot_fee_structure instance-attribute

srm_vault instance-attribute

whitelist_mint instance-attribute

__init__(admin, whitelist_mint, discount_mint, signer, srm_vault, perp_fee_structure, spot_fee_structure, oracle_guard_rails, number_of_authorities, number_of_sub_accounts, lp_cooldown_time, liquidation_margin_buffer_ratio, settlement_duration, number_of_markets, number_of_spot_markets, signer_nonce, min_perp_auction_duration, default_market_order_time_in_force, default_spot_auction_duration, exchange_status, liquidation_duration, initial_pct_to_liquidate, max_number_of_sub_accounts, padding=(lambda: [0] * 10)())

UserAccount dataclass

Source code in src/driftpy/types.py
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
@dataclass
class UserAccount:
    authority: Pubkey
    delegate: Pubkey
    name: list[int]
    spot_positions: list[SpotPosition]
    perp_positions: list[PerpPosition]
    orders: list[Order]
    last_add_perp_lp_shares_ts: int
    total_deposits: int
    total_withdraws: int
    total_social_loss: int
    settled_perp_pnl: int
    cumulative_spot_fees: int
    cumulative_perp_funding: int
    liquidation_margin_freed: int
    last_active_slot: int
    next_order_id: int
    max_margin_ratio: int
    next_liquidation_id: int
    sub_account_id: int
    status: int
    is_margin_trading_enabled: bool
    idle: bool
    open_orders: int
    has_open_order: bool
    open_auctions: int
    has_open_auction: bool
    margin_mode: MarginMode
    pool_id: int
    last_fuel_bonus_update_ts: int
    padding: list[int] = field(default_factory=lambda: [0] * 15)

authority instance-attribute

cumulative_perp_funding instance-attribute

cumulative_spot_fees instance-attribute

delegate instance-attribute

has_open_auction instance-attribute

has_open_order instance-attribute

idle instance-attribute

is_margin_trading_enabled instance-attribute

last_active_slot instance-attribute

last_add_perp_lp_shares_ts instance-attribute

last_fuel_bonus_update_ts instance-attribute

liquidation_margin_freed instance-attribute

margin_mode instance-attribute

max_margin_ratio instance-attribute

name instance-attribute

next_liquidation_id instance-attribute

next_order_id instance-attribute

open_auctions instance-attribute

open_orders instance-attribute

orders instance-attribute

padding = field(default_factory=(lambda: [0] * 15)) class-attribute instance-attribute

perp_positions instance-attribute

pool_id instance-attribute

settled_perp_pnl instance-attribute

spot_positions instance-attribute

status instance-attribute

sub_account_id instance-attribute

total_deposits instance-attribute

total_social_loss instance-attribute

total_withdraws instance-attribute

__init__(authority, delegate, name, spot_positions, perp_positions, orders, last_add_perp_lp_shares_ts, total_deposits, total_withdraws, total_social_loss, settled_perp_pnl, cumulative_spot_fees, cumulative_perp_funding, liquidation_margin_freed, last_active_slot, next_order_id, max_margin_ratio, next_liquidation_id, sub_account_id, status, is_margin_trading_enabled, idle, open_orders, has_open_order, open_auctions, has_open_auction, margin_mode, pool_id, last_fuel_bonus_update_ts, padding=(lambda: [0] * 15)())

UserAccountSubscriber

Source code in src/driftpy/accounts/types.py
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
class UserAccountSubscriber:
    @abstractmethod
    async def subscribe(self):
        pass

    @abstractmethod
    def unsubscribe(self):
        pass

    @abstractmethod
    async def fetch(self):
        pass

    async def update_data(self, data: Optional[DataAndSlot[UserAccount]]):
        pass

    @abstractmethod
    def get_user_account_and_slot(self) -> Optional[DataAndSlot[UserAccount]]:
        pass

fetch() abstractmethod async

Source code in src/driftpy/accounts/types.py
116
117
118
@abstractmethod
async def fetch(self):
    pass

get_user_account_and_slot() abstractmethod

Source code in src/driftpy/accounts/types.py
123
124
125
@abstractmethod
def get_user_account_and_slot(self) -> Optional[DataAndSlot[UserAccount]]:
    pass

subscribe() abstractmethod async

Source code in src/driftpy/accounts/types.py
108
109
110
@abstractmethod
async def subscribe(self):
    pass

unsubscribe() abstractmethod

Source code in src/driftpy/accounts/types.py
112
113
114
@abstractmethod
def unsubscribe(self):
    pass

update_data(data) async

Source code in src/driftpy/accounts/types.py
120
121
async def update_data(self, data: Optional[DataAndSlot[UserAccount]]):
    pass

UserStatsAccount dataclass

Source code in src/driftpy/types.py
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
@dataclass
class UserStatsAccount:
    authority: Pubkey
    referrer: Pubkey
    fees: UserFees
    next_epoch_ts: int
    maker_volume30d: int
    taker_volume30d: int
    filler_volume30d: int
    last_maker_volume30d_ts: int
    last_taker_volume30d_ts: int
    last_filler_volume30d_ts: int
    if_staked_quote_asset_amount: int
    number_of_sub_accounts: int
    number_of_sub_accounts_created: int
    is_referrer: bool
    disable_update_perp_bid_ask_twap: bool
    fuel_overflow_status: int = 0
    fuel_insurance: int = 0
    fuel_deposits: int = 0
    fuel_borrows: int = 0
    fuel_positions: int = 0
    fuel_taker: int = 0
    fuel_maker: int = 0
    if_staked_gov_token_amount: int = 0
    last_fuel_if_bonus_update_ts: int = 0
    padding: list[int] = field(default_factory=lambda: [0] * 12)

authority instance-attribute

disable_update_perp_bid_ask_twap instance-attribute

fees instance-attribute

filler_volume30d instance-attribute

fuel_borrows = 0 class-attribute instance-attribute

fuel_deposits = 0 class-attribute instance-attribute

fuel_insurance = 0 class-attribute instance-attribute

fuel_maker = 0 class-attribute instance-attribute

fuel_overflow_status = 0 class-attribute instance-attribute

fuel_positions = 0 class-attribute instance-attribute

fuel_taker = 0 class-attribute instance-attribute

if_staked_gov_token_amount = 0 class-attribute instance-attribute

if_staked_quote_asset_amount instance-attribute

is_referrer instance-attribute

last_filler_volume30d_ts instance-attribute

last_fuel_if_bonus_update_ts = 0 class-attribute instance-attribute

last_maker_volume30d_ts instance-attribute

last_taker_volume30d_ts instance-attribute

maker_volume30d instance-attribute

next_epoch_ts instance-attribute

number_of_sub_accounts instance-attribute

number_of_sub_accounts_created instance-attribute

padding = field(default_factory=(lambda: [0] * 12)) class-attribute instance-attribute

referrer instance-attribute

taker_volume30d instance-attribute

__init__(authority, referrer, fees, next_epoch_ts, maker_volume30d, taker_volume30d, filler_volume30d, last_maker_volume30d_ts, last_taker_volume30d_ts, last_filler_volume30d_ts, if_staked_quote_asset_amount, number_of_sub_accounts, number_of_sub_accounts_created, is_referrer, disable_update_perp_bid_ask_twap, fuel_overflow_status=0, fuel_insurance=0, fuel_deposits=0, fuel_borrows=0, fuel_positions=0, fuel_taker=0, fuel_maker=0, if_staked_gov_token_amount=0, last_fuel_if_bonus_update_ts=0, padding=(lambda: [0] * 12)())

UserStatsAccountSubscriber

Source code in src/driftpy/accounts/types.py
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
class UserStatsAccountSubscriber:
    @abstractmethod
    async def subscribe(self):
        pass

    @abstractmethod
    def unsubscribe(self):
        pass

    @abstractmethod
    async def fetch(self):
        pass

    @abstractmethod
    def get_user_stats_account_and_slot(
        self,
    ) -> Optional[DataAndSlot[UserStatsAccount]]:
        pass

fetch() abstractmethod async

Source code in src/driftpy/accounts/types.py
137
138
139
@abstractmethod
async def fetch(self):
    pass

get_user_stats_account_and_slot() abstractmethod

Source code in src/driftpy/accounts/types.py
141
142
143
144
145
@abstractmethod
def get_user_stats_account_and_slot(
    self,
) -> Optional[DataAndSlot[UserStatsAccount]]:
    pass

subscribe() abstractmethod async

Source code in src/driftpy/accounts/types.py
129
130
131
@abstractmethod
async def subscribe(self):
    pass

unsubscribe() abstractmethod

Source code in src/driftpy/accounts/types.py
133
134
135
@abstractmethod
def unsubscribe(self):
    pass

WebsocketProgramAccountOptions dataclass

Source code in src/driftpy/accounts/types.py
41
42
43
44
45
@dataclass
class WebsocketProgramAccountOptions:
    filters: Sequence[MemcmpOpts]
    commitment: Commitment
    encoding: str

commitment instance-attribute

encoding instance-attribute

filters instance-attribute

__init__(filters, commitment, encoding)

get_account_data_and_slot(address, program, commitment=Commitment('processed'), decode=None) async

Source code in src/driftpy/accounts/get_accounts.py
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
async def get_account_data_and_slot(
    address: Pubkey,
    program: Program,
    commitment: Commitment = Commitment("processed"),
    decode: Optional[Callable[[bytes], T]] = None,
) -> Optional[DataAndSlot[T]]:
    try:
        resp = await program.provider.connection.get_account_info(
            address,
            encoding="base64",
            commitment=commitment,
        )
        if resp.value is None:
            # print(f"Account {address} not found")
            return None

        data = resp.value.data
        if len(data) == 0:
            print(f"resp: {resp}")
            print(f"value: {resp.value}")
            print(f"data: {data}")
            raise Exception(f"Account {address} has no data")

        slot = resp.context.slot
        decoded_data = (
            decode(data) if decode is not None else program.coder.accounts.decode(data)
        )

        return DataAndSlot(slot, decoded_data)
    except Exception as e:
        print(f"Error fetching account {address}: {str(e)}")
        raise

get_all_perp_market_accounts(program) async

Source code in src/driftpy/accounts/get_accounts.py
121
122
async def get_all_perp_market_accounts(program: Program) -> list[ProgramAccount]:
    return await program.account["PerpMarket"].all()

get_all_spot_market_accounts(program) async

Source code in src/driftpy/accounts/get_accounts.py
140
141
async def get_all_spot_market_accounts(program: Program) -> list[ProgramAccount]:
    return await program.account["SpotMarket"].all()

get_if_stake_account(program, authority, spot_market_index) async

Source code in src/driftpy/accounts/get_accounts.py
70
71
72
73
74
75
76
77
async def get_if_stake_account(
    program: Program, authority: Pubkey, spot_market_index: int
) -> InsuranceFundStakeAccount:
    if_stake_pk = get_insurance_fund_stake_public_key(
        program.program_id, authority, spot_market_index
    )
    response = await program.account["InsuranceFundStake"].fetch(if_stake_pk)
    return cast(InsuranceFundStakeAccount, response)

get_insurance_fund_stake_public_key(program_id, authority, spot_market_index)

Source code in src/driftpy/addresses.py
26
27
28
29
30
31
32
33
34
def get_insurance_fund_stake_public_key(
    program_id: Pubkey,
    authority: Pubkey,
    spot_market_index: int,
) -> Pubkey:
    return Pubkey.find_program_address(
        [b"insurance_fund_stake", bytes(authority), int_to_le_bytes(spot_market_index)],
        program_id,
    )[0]

get_perp_market_account(program, market_index) async

Source code in src/driftpy/accounts/get_accounts.py
115
116
117
118
async def get_perp_market_account(
    program: Program, market_index: int
) -> Optional[PerpMarketAccount]:
    return (await get_perp_market_account_and_slot(program, market_index)).data

get_perp_market_account_and_slot(program, market_index) async

Source code in src/driftpy/accounts/get_accounts.py
106
107
108
109
110
111
112
async def get_perp_market_account_and_slot(
    program: Program, market_index: int
) -> Optional[DataAndSlot[PerpMarketAccount]]:
    perp_market_public_key = get_perp_market_public_key(
        program.program_id, market_index
    )
    return await get_account_data_and_slot(perp_market_public_key, program)

get_perp_market_public_key(program_id, market_index)

Source code in src/driftpy/addresses.py
 8
 9
10
11
12
13
14
def get_perp_market_public_key(
    program_id: Pubkey,
    market_index: int,
) -> Pubkey:
    return Pubkey.find_program_address(
        [b"perp_market", int_to_le_bytes(market_index)], program_id
    )[0]

get_protected_maker_mode_config_public_key(program_id)

Source code in src/driftpy/addresses.py
148
149
def get_protected_maker_mode_config_public_key(program_id: Pubkey) -> Pubkey:
    return Pubkey.find_program_address([b"protected_maker_mode_config"], program_id)[0]

get_protected_maker_mode_stats(program) async

Source code in src/driftpy/accounts/get_accounts.py
144
145
146
147
148
149
150
151
async def get_protected_maker_mode_stats(program: Program) -> dict[str, int | bool]:
    config_pubkey = get_protected_maker_mode_config_public_key(program.program_id)
    config = await program.account["ProtectedMakerModeConfig"].fetch(config_pubkey)
    return {
        "max_users": config.max_users,
        "current_users": config.current_users,
        "is_reduce_only": config.reduce_only > 0,
    }

get_spot_market_account(program, spot_market_index) async

Source code in src/driftpy/accounts/get_accounts.py
134
135
136
137
async def get_spot_market_account(
    program: Program, spot_market_index: int
) -> Optional[SpotMarketAccount]:
    return (await get_spot_market_account_and_slot(program, spot_market_index)).data

get_spot_market_account_and_slot(program, spot_market_index) async

Source code in src/driftpy/accounts/get_accounts.py
125
126
127
128
129
130
131
async def get_spot_market_account_and_slot(
    program: Program, spot_market_index: int
) -> Optional[DataAndSlot[SpotMarketAccount]]:
    spot_market_public_key = get_spot_market_public_key(
        program.program_id, spot_market_index
    )
    return await get_account_data_and_slot(spot_market_public_key, program)

get_spot_market_public_key(program_id, spot_market_index)

Source code in src/driftpy/addresses.py
37
38
39
40
41
42
43
def get_spot_market_public_key(
    program_id: Pubkey,
    spot_market_index: int,
) -> Pubkey:
    return Pubkey.find_program_address(
        [b"spot_market", int_to_le_bytes(spot_market_index)], program_id
    )[0]

get_state_account(program) async

Source code in src/driftpy/accounts/get_accounts.py
66
67
async def get_state_account(program: Program) -> StateAccount:
    return (await get_state_account_and_slot(program)).data

get_state_account_and_slot(program) async

Source code in src/driftpy/accounts/get_accounts.py
61
62
63
async def get_state_account_and_slot(program: Program) -> DataAndSlot[StateAccount]:
    state_public_key = get_state_public_key(program.program_id)
    return await get_account_data_and_slot(state_public_key, program)

get_state_public_key(program_id)

Source code in src/driftpy/addresses.py
64
65
66
67
def get_state_public_key(
    program_id: Pubkey,
) -> Pubkey:
    return Pubkey.find_program_address([b"drift_state"], program_id)[0]

get_user_account(program, user_public_key) async

Source code in src/driftpy/accounts/get_accounts.py
 99
100
101
102
103
async def get_user_account(
    program: Program,
    user_public_key: Pubkey,
) -> Optional[UserAccount]:
    return (await get_user_account_and_slot(program, user_public_key)).data

get_user_account_and_slot(program, user_public_key) async

Source code in src/driftpy/accounts/get_accounts.py
92
93
94
95
96
async def get_user_account_and_slot(
    program: Program,
    user_public_key: Pubkey,
) -> Optional[DataAndSlot[UserAccount]]:
    return await get_account_data_and_slot(user_public_key, program)

get_user_stats_account(program, authority) async

Source code in src/driftpy/accounts/get_accounts.py
80
81
82
83
84
85
86
87
88
89
async def get_user_stats_account(
    program: Program,
    authority: Pubkey,
) -> UserStatsAccount:
    user_stats_public_key = get_user_stats_account_public_key(
        program.program_id,
        authority,
    )
    response = await program.account["UserStats"].fetch(user_stats_public_key)
    return cast(UserStatsAccount, response)

get_user_stats_account_public_key(program_id, authority)

Source code in src/driftpy/addresses.py
76
77
78
79
80
def get_user_stats_account_public_key(
    program_id: Pubkey,
    authority: Pubkey,
) -> Pubkey:
    return Pubkey.find_program_address([b"user_stats", bytes(authority)], program_id)[0]