Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions docs/algorithms/market/INIT-BASE-VAULT.tex
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
\ENSURE frame.token\_program\_id
\ENSURE frame.token\_program\_is\_2022
\ENSURE input.market\_header.base\_vault\_bump = frame.bump
\ENSURE input.market\_header.base\_vault = acct.address
\PROCEDURE{INIT-BASE-VAULT}{acct, frame}
\COMMENT{Retrieve input buffer pointers and advance to base token program account.}
\STATE input = frame.input
Expand Down Expand Up @@ -65,6 +66,8 @@
\ENDIF
\COMMENT{Store derived bump in market account data.}
\STATE input.market\_header.base\_vault\_bump = frame.bump
\COMMENT{Store base vault address in market header.}
\STATE input.market\_header.base\_vault = acct.address
\COMMENT{Advance to quote token program account.}
\STATE acct += \texttt{EmptyAccount.size}
\ENDPROCEDURE
Expand Down
3 changes: 3 additions & 0 deletions docs/algorithms/market/INIT-QUOTE-VAULT.tex
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
\REQUIRE frame.pda\_seeds[2].len = \texttt{u8.size}
\REQUIRE frame.rent
\ENSURE input.market\_header.quote\_vault\_bump = frame.bump
\ENSURE input.market\_header.quote\_vault = acct.address
\PROCEDURE{INIT-QUOTE-VAULT}{acct, frame, input, input\_shifted}
\COMMENT{Check quote token program account.}
\IF{acct.duplicate == \texttt{common::account::NON\_DUP\_MARKER}}
Expand Down Expand Up @@ -63,6 +64,8 @@
\STATE \CALL{INIT-VAULT}{acct, frame}
\COMMENT{Store derived bump in market account data.}
\STATE input.market\_header.quote\_vault\_bump = frame.bump
\COMMENT{Store quote vault address in market header.}
\STATE input.market\_header.quote\_vault = acct.address
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}
10 changes: 8 additions & 2 deletions docs/algorithms/market/init-market-pda/CREATE-MARKET-ACCOUNT.tex
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,15 @@
\REQUIRE frame.create\_account\_data.owner
\REQUIRE frame.system\_program\_id
\REQUIRE frame.pda\_seeds
\REQUIRE frame.input\_shifted
\REQUIRE frame.cpi[0].info.data\_len = \texttt{common::memory::LEN\_ZERO}
\REQUIRE frame.cpi[1].info.data\_len = \texttt{common::memory::LEN\_ZERO}
\ENSURE frame.signers\_seeds.addr = \&frame.pda\_seeds
\ENSURE frame.signers\_seeds.len = \texttt{frame.pda\_seeds.n\_seeds}
\ENSURE input.market\_header.next = \texttt{\&entrypoint::input\_buffer::MARKET\_SECTORS\_START}
\ENSURE input.market\_header.next = \texttt{\&market::SECTORS\_START}
\ENSURE input.market\_header.bump = frame.bump
\ENSURE input.market\_header.base\_mint = input.base\_mint.address
\ENSURE input.market\_header.quote\_mint = input\_shifted.quote\_mint.address
\PROCEDURE{CREATE-MARKET-ACCOUNT}{frame}
\COMMENT{Assign CPI account fields via immediates.}
\STATE frame.cpi[0].info.is\_signer = \texttt{true}
Expand Down Expand Up @@ -55,8 +58,11 @@
\STATE syscall.seeds\_len = \texttt{market::register::N\_PDA\_SIGNERS}
\STATE \CALL{sol-invoke-signed-c}{system-program::CreateAccount}
\COMMENT{Initialize market header next pointer and store derived bump.}
\STATE input.market\_header.next = \texttt{\&entrypoint::input\_buffer::MARKET\_SECTORS\_START}
\STATE input.market\_header.next = \texttt{\&market::SECTORS\_START}
\STATE input.market\_header.bump = frame.bump
\COMMENT{Store mint addresses in market header.}
\STATE input.market\_header.base\_mint = input.base\_mint.address
\STATE input.market\_header.quote\_mint = input\_shifted.quote\_mint.address
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}
6 changes: 6 additions & 0 deletions interface/src/common/account.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ constant_group! {
DATA_LEN = offset!(EmptyAccount.header.data_len),
/// Account data start.
DATA = offset!(EmptyAccount.data),
/// From address to owner in a runtime account.
ADDRESS_TO_OWNER = relative_offset!(RuntimeAccount, address, owner),
/// From owner to lamports in a runtime account.
OWNER_TO_LAMPORTS = relative_offset!(RuntimeAccount, owner, lamports),
/// From lamports to data start in a runtime account.
LAMPORTS_TO_DATA = relative_offset!(EmptyAccount, header.lamports, data),
/// Non-dup marker for accounts.
NON_DUP_MARKER = immediate!(NON_DUP_MARKER as i32),
/// Account storage overhead for rent calculation.
Expand Down
26 changes: 0 additions & 26 deletions interface/src/entrypoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ use crate::common::account::EmptyAccount;
use crate::market::MarketHeader;
use dropset_macros::{constant_group, discriminant_enum, svm_data};
use pinocchio::account::RuntimeAccount;
use solana_sbpf::ebpf::MM_INPUT_START;

// region: discriminant_enum
/// Instruction discriminants.
Expand Down Expand Up @@ -57,35 +56,10 @@ constant_group! {
MARKET_DATA_LEN = offset!(InputBufferHeader.market.data_len),
/// From input buffer to market address field.
MARKET_ADDRESS = pubkey_offsets!(InputBufferHeader.market.address),
/// From address to owner in a runtime account.
ADDRESS_TO_OWNER = relative_offset!(RuntimeAccount, address, owner),
/// From owner to lamports in a runtime account.
OWNER_TO_LAMPORTS = relative_offset!(RuntimeAccount, owner, lamports),
/// From lamports to data start in a runtime account.
LAMPORTS_TO_DATA = relative_offset!(EmptyAccount, header.lamports, data),
/// From user data to market address in the input buffer.
USER_DATA_TO_MARKET_ADDRESS = relative_offset!(
InputBufferHeader, user.data, market.address
),
/// From input buffer to market header next pointer.
MARKET_HEADER_NEXT = offset!(InputBufferHeader.market_header.next),
/// From input buffer to market header bump.
MARKET_HEADER_BUMP = offset!(InputBufferHeader.market_header.bump),
/// From input buffer to market header base vault bump.
MARKET_HEADER_BASE_VAULT_BUMP = offset!(
InputBufferHeader.market_header.base_vault_bump
),
/// From input buffer to market header quote vault bump.
MARKET_HEADER_QUOTE_VAULT_BUMP = offset!(
InputBufferHeader.market_header.quote_vault_bump
),
/// From input buffer to first sector in market memory map.
MARKET_SECTORS_START = offset!(InputBufferHeader.market_sectors_start),
/// Absolute SBPF pointer to first sector in market memory map.
MARKET_SECTORS_START_PTR = wide!(
MM_INPUT_START as i64
+ core::mem::offset_of!(InputBufferHeader, market_sectors_start) as i64
),
}
}
// endregion: constant_group_example
51 changes: 49 additions & 2 deletions interface/src/market/mod.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,52 @@
pub mod register;

use crate::entrypoint::InputBufferHeader;
use crate::order::Order;
use crate::seat::Seat;
use crate::stack::StackNode;
use dropset_macros::{constant_group, svm_data};
use pinocchio::Address as Pubkey;
use solana_sbpf::ebpf::MM_INPUT_START;

constant_group! {
#[prefix("MKT")]
#[inject("market/market")]
/// Market-level constants.
/// Assumes user has no data for static addressing.
constants {
/// Vault index for base mint in PDA derivation and vault creation.
/// Vault index for base token in PDA derivation and vault creation.
VAULT_INDEX_BASE = immediate!(0),
/// Vault index for quote mint in PDA derivation and vault creation.
/// Vault index for quote token in PDA derivation and vault creation.
VAULT_INDEX_QUOTE = immediate!(1),
/// From input buffer to MarketHeader.next.
NEXT = offset!(InputBufferHeader.market_header.next),
/// From input buffer to MarketHeader.base_mint.
BASE_MINT = pubkey_offsets!(InputBufferHeader.market_header.base_mint),
/// From input buffer to MarketHeader.quote_mint.
QUOTE_MINT = pubkey_offsets!(InputBufferHeader.market_header.quote_mint),
/// From input buffer to MarketHeader.bump.
BUMP = offset!(InputBufferHeader.market_header.bump),
/// From input buffer to MarketHeader.base_vault.
BASE_VAULT = pubkey_offsets!(InputBufferHeader.market_header.base_vault),
/// From input buffer to MarketHeader.base_vault_bump.
BASE_VAULT_BUMP = offset!(InputBufferHeader.market_header.base_vault_bump),
/// From input buffer to MarketHeader.quote_vault.
QUOTE_VAULT = pubkey_offsets!(InputBufferHeader.market_header.quote_vault),
/// From input buffer to MarketHeader.quote_vault_bump.
QUOTE_VAULT_BUMP = offset!(InputBufferHeader.market_header.quote_vault_bump),
/// From input buffer to MarketHeader.base_total.
BASE_TOTAL = offset!(InputBufferHeader.market_header.base_total),
/// From input buffer to MarketHeader.quote_total.
QUOTE_TOTAL = offset!(InputBufferHeader.market_header.quote_total),
/// From input buffer to MarketHeader.lamports_total.
LAMPORTS_TOTAL = offset!(InputBufferHeader.market_header.lamports_total),
/// From input buffer to first sector in market memory map.
SECTORS_START = offset!(InputBufferHeader.market_sectors_start),
/// Absolute SBPF pointer to first sector in market memory map.
SECTORS_START_PTR = wide!(
MM_INPUT_START as i64
+ core::mem::offset_of!(InputBufferHeader, market_sectors_start) as i64
),
}
}

Expand All @@ -31,11 +64,25 @@ pub struct MarketHeader {
pub top: *mut StackNode,
/// Absolute pointer to where the next node should be allocated in memory map.
pub next: *mut StackNode,
/// Base mint address.
pub base_mint: Pubkey,
/// Quote mint address.
pub quote_mint: Pubkey,
/// Bump seed for market PDA.
pub bump: u8,
/// Base vault address.
pub base_vault: Pubkey,
/// Bump seed for base vault PDA.
pub base_vault_bump: u8,
/// Quote vault address.
pub quote_vault: Pubkey,
/// Bump seed for quote vault PDA.
pub quote_vault_bump: u8,
/// Total base token balance.
pub base_total: u64,
/// Total quote token balance.
pub quote_total: u64,
/// Total lamports balance.
pub lamports_total: u64,
}
// endregion: market_header
4 changes: 2 additions & 2 deletions interface/src/market/register.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,15 @@ constant_group! {
/// From input buffer to base mint data length.
BASE_DATA_LEN = offset!(InputBuffer.base_mint.header.data_len),
/// From input buffer to base mint address field.
BASE_ADDR = offset!(InputBuffer.base_mint.header.address),
BASE_ADDR = pubkey_offsets!(InputBuffer.base_mint.header.address),
/// From input buffer to base mint owner.
BASE_OWNER = pubkey_offsets!(InputBuffer.base_mint.header.owner),
/// From input buffer to quote mint.
QUOTE = offset!(InputBuffer.quote_mint),
/// From input buffer to quote mint duplicate flag.
QUOTE_DUPLICATE = offset!(InputBuffer.quote_mint.header.borrow_state),
/// From input buffer to quote mint address field.
QUOTE_ADDR = offset!(InputBuffer.quote_mint.header.address),
QUOTE_ADDR = pubkey_offsets!(InputBuffer.quote_mint.header.address),
/// From input buffer to quote mint owner.
QUOTE_OWNER = pubkey_offsets!(InputBuffer.quote_mint.header.owner),
/// From input buffer to quote mint data length.
Expand Down
6 changes: 6 additions & 0 deletions program/src/dropset/common/account.s
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@
.equ ACCT_OWNER_CHUNK_3_OFF, 64 # Account owner (chunk 3).
.equ ACCT_DATA_LEN_OFF, 80 # Account data length.
.equ ACCT_DATA_OFF, 88 # Account data start.
# From address to owner in a runtime account.
.equ ACCT_ADDRESS_TO_OWNER_REL_OFF_IMM, 32
# From owner to lamports in a runtime account.
.equ ACCT_OWNER_TO_LAMPORTS_REL_OFF_IMM, 32
# From lamports to data start in a runtime account.
.equ ACCT_LAMPORTS_TO_DATA_REL_OFF_IMM, 16
.equ ACCT_NON_DUP_MARKER, 255 # Non-dup marker for accounts.
# Account storage overhead for rent calculation.
.equ ACCT_STORAGE_OVERHEAD, 128
Expand Down
2 changes: 1 addition & 1 deletion program/src/dropset/common/memory.s
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
.equ SIZE_OF_U64, 8 # Size of u64 in bytes.
.equ SIZE_OF_PUBKEY, 32 # Size of Pubkey in bytes.
.equ SIZE_OF_EMPTY_ACCOUNT, 10336 # Size of EmptyAccount in bytes.
.equ SIZE_OF_MARKET_HEADER, 43 # Size of MarketHeader in bytes.
.equ SIZE_OF_MARKET_HEADER, 195 # Size of MarketHeader in bytes.
.equ SIZE_OF_CREATE_ACCOUNT_DATA, 52 # Size of CreateAccountData in bytes.
.equ SIZE_OF_INITIALIZE_ACCOUNT2, 33 # Size of InitializeAccount2 in bytes.
.equ SIZE_OF_SECTOR, 161 # Size of Sector in bytes.
Expand Down
18 changes: 0 additions & 18 deletions program/src/dropset/entrypoint.s
Original file line number Diff line number Diff line change
Expand Up @@ -38,26 +38,8 @@
.equ IB_MARKET_ADDRESS_CHUNK_2_OFF, 10368
# From input buffer to market address field (chunk 3).
.equ IB_MARKET_ADDRESS_CHUNK_3_OFF, 10376
# From address to owner in a runtime account.
.equ IB_ADDRESS_TO_OWNER_REL_OFF_IMM, 32
# From owner to lamports in a runtime account.
.equ IB_OWNER_TO_LAMPORTS_REL_OFF_IMM, 32
# From lamports to data start in a runtime account.
.equ IB_LAMPORTS_TO_DATA_REL_OFF_IMM, 16
# From user data to market address in the input buffer.
.equ IB_USER_DATA_TO_MARKET_ADDRESS_REL_OFF_IMM, 10256
# From input buffer to market header next pointer.
.equ IB_MARKET_HEADER_NEXT_OFF, 10464
# From input buffer to market header bump.
.equ IB_MARKET_HEADER_BUMP_OFF, 10472
# From input buffer to market header base vault bump.
.equ IB_MARKET_HEADER_BASE_VAULT_BUMP_OFF, 10473
# From input buffer to market header quote vault bump.
.equ IB_MARKET_HEADER_QUOTE_VAULT_BUMP_OFF, 10474
# From input buffer to first sector in market memory map.
.equ IB_MARKET_SECTORS_START_OFF, 10475
# Absolute SBPF pointer to first sector in market memory map.
.equ IB_MARKET_SECTORS_START_PTR_WD, 17179879659
# -------------------------------------------------------------------------

entrypoint:
Expand Down
11 changes: 10 additions & 1 deletion program/src/dropset/market/init_base_vault.s
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,16 @@ init_base_vault_advance:
jne r0, RETURN_SUCCESS, init_base_vault_failed
# input.market_header.base_vault_bump = frame.bump
ldxb r7, [r10 + RM_FM_BUMP_OFF]
stxb [r8 + IB_MARKET_HEADER_BASE_VAULT_BUMP_OFF], r7
stxb [r8 + MKT_BASE_VAULT_BUMP_OFF], r7
# input.market_header.base_vault = acct.address
ldxdw r7, [r9 + ACCT_ADDRESS_CHUNK_0_OFF]
stxdw [r8 + MKT_BASE_VAULT_CHUNK_0_OFF], r7
ldxdw r7, [r9 + ACCT_ADDRESS_CHUNK_1_OFF]
stxdw [r8 + MKT_BASE_VAULT_CHUNK_1_OFF], r7
ldxdw r7, [r9 + ACCT_ADDRESS_CHUNK_2_OFF]
stxdw [r8 + MKT_BASE_VAULT_CHUNK_2_OFF], r7
ldxdw r7, [r9 + ACCT_ADDRESS_CHUNK_3_OFF]
stxdw [r8 + MKT_BASE_VAULT_CHUNK_3_OFF], r7
# acct += EmptyAccount.size
add64 r9, SIZE_OF_EMPTY_ACCOUNT
ja init_base_vault_return
Expand Down
39 changes: 29 additions & 10 deletions program/src/dropset/market/init_market_pda/create_market_account.s
Original file line number Diff line number Diff line change
Expand Up @@ -17,27 +17,27 @@ create_market_account:
stxdw [r10 + RM_FM_CPI_IDX_0_ACCT_META_PUBKEY_UOFF], r6
stxdw [r10 + RM_FM_CPI_IDX_0_ACCT_INFO_KEY_UOFF], r6
# frame.cpi[0].info.owner = &input.user.owner
add64 r6, IB_ADDRESS_TO_OWNER_REL_OFF_IMM
add64 r6, ACCT_ADDRESS_TO_OWNER_REL_OFF_IMM
stxdw [r10 + RM_FM_CPI_IDX_0_ACCT_INFO_OWNER_UOFF], r6
# frame.cpi[0].info.lamports = &input.user.lamports
add64 r6, IB_OWNER_TO_LAMPORTS_REL_OFF_IMM
add64 r6, ACCT_OWNER_TO_LAMPORTS_REL_OFF_IMM
stxdw [r10 + RM_FM_CPI_IDX_0_ACCT_INFO_LAMPORTS_UOFF], r6
# frame.cpi[0].info.data = &input.user.data
add64 r6, IB_LAMPORTS_TO_DATA_REL_OFF_IMM
add64 r6, ACCT_LAMPORTS_TO_DATA_REL_OFF_IMM
stxdw [r10 + RM_FM_CPI_IDX_0_ACCT_INFO_DATA_UOFF], r6
# frame.cpi[1].meta.pubkey = &input.market.address
# frame.cpi[1].info.key = &input.market.address
add64 r6, IB_USER_DATA_TO_MARKET_ADDRESS_REL_OFF_IMM
stxdw [r10 + RM_FM_CPI_IDX_1_ACCT_META_PUBKEY_UOFF], r6
stxdw [r10 + RM_FM_CPI_IDX_1_ACCT_INFO_KEY_UOFF], r6
# frame.cpi[1].info.owner = &input.market.owner
add64 r6, IB_ADDRESS_TO_OWNER_REL_OFF_IMM
add64 r6, ACCT_ADDRESS_TO_OWNER_REL_OFF_IMM
stxdw [r10 + RM_FM_CPI_IDX_1_ACCT_INFO_OWNER_UOFF], r6
# frame.cpi[1].info.lamports = &input.market.lamports
add64 r6, IB_OWNER_TO_LAMPORTS_REL_OFF_IMM
add64 r6, ACCT_OWNER_TO_LAMPORTS_REL_OFF_IMM
stxdw [r10 + RM_FM_CPI_IDX_1_ACCT_INFO_LAMPORTS_UOFF], r6
# frame.cpi[1].info.data = &input.market.data
add64 r6, IB_LAMPORTS_TO_DATA_REL_OFF_IMM
add64 r6, ACCT_LAMPORTS_TO_DATA_REL_OFF_IMM
stxdw [r10 + RM_FM_CPI_IDX_1_ACCT_INFO_DATA_UOFF], r6
# frame.signers_seeds.addr = &frame.pda_seeds
stxdw [r10 + RM_FM_SIGNERS_SEEDS_ADDR_UOFF], r1
Expand Down Expand Up @@ -72,11 +72,30 @@ create_market_account:
# syscall.seeds_len = market::register::N_PDA_SIGNERS
mov64 r5, RM_N_PDA_SIGNERS
call sol_invoke_signed_c
# input.market_header.next = &entrypoint::input_buffer::MARKET_SECTORS_START
# input.market_header.next = &market::SECTORS_START
ldxdw r6, [r10 + RM_FM_INPUT_OFF]
lddw r7, IB_MARKET_SECTORS_START_PTR_WD
stxdw [r6 + IB_MARKET_HEADER_NEXT_OFF], r7
lddw r7, MKT_SECTORS_START_PTR_WD
stxdw [r6 + MKT_NEXT_OFF], r7
# input.market_header.bump = frame.bump
ldxb r7, [r10 + RM_FM_BUMP_OFF]
stxb [r6 + IB_MARKET_HEADER_BUMP_OFF], r7
stxb [r6 + MKT_BUMP_OFF], r7
# input.market_header.base_mint = input.base_mint.address
ldxdw r7, [r6 + RM_BASE_ADDR_CHUNK_0_OFF]
stxdw [r6 + MKT_BASE_MINT_CHUNK_0_OFF], r7
ldxdw r7, [r6 + RM_BASE_ADDR_CHUNK_1_OFF]
stxdw [r6 + MKT_BASE_MINT_CHUNK_1_OFF], r7
ldxdw r7, [r6 + RM_BASE_ADDR_CHUNK_2_OFF]
stxdw [r6 + MKT_BASE_MINT_CHUNK_2_OFF], r7
ldxdw r7, [r6 + RM_BASE_ADDR_CHUNK_3_OFF]
stxdw [r6 + MKT_BASE_MINT_CHUNK_3_OFF], r7
# input.market_header.quote_mint = input_shifted.quote_mint.address
ldxdw r5, [r10 + RM_FM_INPUT_SHIFTED_OFF]
ldxdw r7, [r5 + RM_QUOTE_ADDR_CHUNK_0_OFF]
stxdw [r6 + MKT_QUOTE_MINT_CHUNK_0_OFF], r7
ldxdw r7, [r5 + RM_QUOTE_ADDR_CHUNK_1_OFF]
stxdw [r6 + MKT_QUOTE_MINT_CHUNK_1_OFF], r7
ldxdw r7, [r5 + RM_QUOTE_ADDR_CHUNK_2_OFF]
stxdw [r6 + MKT_QUOTE_MINT_CHUNK_2_OFF], r7
ldxdw r7, [r5 + RM_QUOTE_ADDR_CHUNK_3_OFF]
stxdw [r6 + MKT_QUOTE_MINT_CHUNK_3_OFF], r7
ja create_market_account_return
11 changes: 10 additions & 1 deletion program/src/dropset/market/init_quote_vault.s
Original file line number Diff line number Diff line change
Expand Up @@ -104,5 +104,14 @@ init_quote_vault_done_token_program:
call init_vault
# input.market_header.quote_vault_bump = frame.bump
ldxb r7, [r10 + RM_FM_BUMP_OFF]
stxb [r8 + IB_MARKET_HEADER_QUOTE_VAULT_BUMP_OFF], r7
stxb [r8 + MKT_QUOTE_VAULT_BUMP_OFF], r7
# input.market_header.quote_vault = acct.address
ldxdw r7, [r9 + ACCT_ADDRESS_CHUNK_0_OFF]
stxdw [r8 + MKT_QUOTE_VAULT_CHUNK_0_OFF], r7
ldxdw r7, [r9 + ACCT_ADDRESS_CHUNK_1_OFF]
stxdw [r8 + MKT_QUOTE_VAULT_CHUNK_1_OFF], r7
ldxdw r7, [r9 + ACCT_ADDRESS_CHUNK_2_OFF]
stxdw [r8 + MKT_QUOTE_VAULT_CHUNK_2_OFF], r7
ldxdw r7, [r9 + ACCT_ADDRESS_CHUNK_3_OFF]
stxdw [r8 + MKT_QUOTE_VAULT_CHUNK_3_OFF], r7
ja init_quote_vault_return
Loading
Loading