From 7253385baba04e252996f5b53c5df22fa6ae10ee Mon Sep 17 00:00:00 2001 From: Alex Kahn <43892045+alnoki@users.noreply.github.com> Date: Fri, 10 Apr 2026 16:51:21 -0700 Subject: [PATCH 1/4] Extend MarketHeader fields --- interface/src/market/mod.rs | 19 +++++++++++++++++-- program/src/dropset/common/memory.s | 2 +- program/src/dropset/entrypoint.s | 10 +++++----- program/src/dropset/market/market.s | 4 ++-- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/interface/src/market/mod.rs b/interface/src/market/mod.rs index cb196ae..4c46166 100644 --- a/interface/src/market/mod.rs +++ b/interface/src/market/mod.rs @@ -4,15 +4,16 @@ use crate::order::Order; use crate::seat::Seat; use crate::stack::StackNode; use dropset_macros::{constant_group, svm_data}; +use pinocchio::Address as Pubkey; constant_group! { #[prefix("MKT")] #[inject("market/market")] /// Market-level constants. 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), } } @@ -31,11 +32,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 diff --git a/program/src/dropset/common/memory.s b/program/src/dropset/common/memory.s index a131e84..8087ce7 100644 --- a/program/src/dropset/common/memory.s +++ b/program/src/dropset/common/memory.s @@ -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. diff --git a/program/src/dropset/entrypoint.s b/program/src/dropset/entrypoint.s index bc242f9..7c0d1f6 100644 --- a/program/src/dropset/entrypoint.s +++ b/program/src/dropset/entrypoint.s @@ -49,15 +49,15 @@ # 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 +.equ IB_MARKET_HEADER_BUMP_OFF, 10536 # From input buffer to market header base vault bump. -.equ IB_MARKET_HEADER_BASE_VAULT_BUMP_OFF, 10473 +.equ IB_MARKET_HEADER_BASE_VAULT_BUMP_OFF, 10569 # From input buffer to market header quote vault bump. -.equ IB_MARKET_HEADER_QUOTE_VAULT_BUMP_OFF, 10474 +.equ IB_MARKET_HEADER_QUOTE_VAULT_BUMP_OFF, 10602 # From input buffer to first sector in market memory map. -.equ IB_MARKET_SECTORS_START_OFF, 10475 +.equ IB_MARKET_SECTORS_START_OFF, 10627 # Absolute SBPF pointer to first sector in market memory map. -.equ IB_MARKET_SECTORS_START_PTR_WD, 17179879659 +.equ IB_MARKET_SECTORS_START_PTR_WD, 17179879811 # ------------------------------------------------------------------------- entrypoint: diff --git a/program/src/dropset/market/market.s b/program/src/dropset/market/market.s index 3529cf9..be08d46 100644 --- a/program/src/dropset/market/market.s +++ b/program/src/dropset/market/market.s @@ -1,7 +1,7 @@ # Market-level constants. # ------------------------------------------------------------------------- -# Vault index for base mint in PDA derivation and vault creation. +# Vault index for base token in PDA derivation and vault creation. .equ MKT_VAULT_INDEX_BASE, 0 -# Vault index for quote mint in PDA derivation and vault creation. +# Vault index for quote token in PDA derivation and vault creation. .equ MKT_VAULT_INDEX_QUOTE, 1 # ------------------------------------------------------------------------- From 2a76cea4a288a247d1eda69564b3d4a56af79bae Mon Sep 17 00:00:00 2001 From: Alex Kahn <43892045+alnoki@users.noreply.github.com> Date: Fri, 10 Apr 2026 17:14:00 -0700 Subject: [PATCH 2/4] Update header layout --- docs/algorithms/market/INIT-BASE-VAULT.tex | 3 ++ docs/algorithms/market/INIT-QUOTE-VAULT.tex | 3 ++ .../init-market-pda/CREATE-MARKET-ACCOUNT.tex | 5 ++ interface/src/entrypoint.rs | 12 ----- interface/src/market/mod.rs | 23 ++++++++ program/src/dropset/entrypoint.s | 8 --- program/src/dropset/market/init_base_vault.s | 2 +- .../init_market_pda/create_market_account.s | 4 +- program/src/dropset/market/init_quote_vault.s | 2 +- program/src/dropset/market/market.s | 52 +++++++++++++++++++ 10 files changed, 90 insertions(+), 24 deletions(-) diff --git a/docs/algorithms/market/INIT-BASE-VAULT.tex b/docs/algorithms/market/INIT-BASE-VAULT.tex index d3b01f0..49e5211 100644 --- a/docs/algorithms/market/INIT-BASE-VAULT.tex +++ b/docs/algorithms/market/INIT-BASE-VAULT.tex @@ -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 @@ -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 diff --git a/docs/algorithms/market/INIT-QUOTE-VAULT.tex b/docs/algorithms/market/INIT-QUOTE-VAULT.tex index 127e62c..a73fb38 100644 --- a/docs/algorithms/market/INIT-QUOTE-VAULT.tex +++ b/docs/algorithms/market/INIT-QUOTE-VAULT.tex @@ -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}} @@ -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} diff --git a/docs/algorithms/market/init-market-pda/CREATE-MARKET-ACCOUNT.tex b/docs/algorithms/market/init-market-pda/CREATE-MARKET-ACCOUNT.tex index a58c61f..ddbefc5 100644 --- a/docs/algorithms/market/init-market-pda/CREATE-MARKET-ACCOUNT.tex +++ b/docs/algorithms/market/init-market-pda/CREATE-MARKET-ACCOUNT.tex @@ -15,6 +15,8 @@ \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.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} @@ -57,6 +59,9 @@ \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.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} diff --git a/interface/src/entrypoint.rs b/interface/src/entrypoint.rs index e087dd2..c847ff4 100644 --- a/interface/src/entrypoint.rs +++ b/interface/src/entrypoint.rs @@ -67,18 +67,6 @@ constant_group! { 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. diff --git a/interface/src/market/mod.rs b/interface/src/market/mod.rs index 4c46166..ae571e2 100644 --- a/interface/src/market/mod.rs +++ b/interface/src/market/mod.rs @@ -1,5 +1,6 @@ pub mod register; +use crate::entrypoint::InputBufferHeader; use crate::order::Order; use crate::seat::Seat; use crate::stack::StackNode; @@ -15,6 +16,28 @@ constant_group! { VAULT_INDEX_BASE = immediate!(0), /// Vault index for quote token in PDA derivation and vault creation. VAULT_INDEX_QUOTE = immediate!(1), + /// From input buffer to market header next pointer. + NEXT = offset!(InputBufferHeader.market_header.next), + /// From input buffer to market header base mint address. + BASE_MINT = pubkey_offsets!(InputBufferHeader.market_header.base_mint), + /// From input buffer to market header quote mint address. + QUOTE_MINT = pubkey_offsets!(InputBufferHeader.market_header.quote_mint), + /// From input buffer to market header bump seed. + BUMP = offset!(InputBufferHeader.market_header.bump), + /// From input buffer to market header base vault address. + BASE_VAULT = pubkey_offsets!(InputBufferHeader.market_header.base_vault), + /// From input buffer to market header base vault bump seed. + BASE_VAULT_BUMP = offset!(InputBufferHeader.market_header.base_vault_bump), + /// From input buffer to market header quote vault address. + QUOTE_VAULT = pubkey_offsets!(InputBufferHeader.market_header.quote_vault), + /// From input buffer to market header quote vault bump seed. + QUOTE_VAULT_BUMP = offset!(InputBufferHeader.market_header.quote_vault_bump), + /// From input buffer to market header base total. + BASE_TOTAL = offset!(InputBufferHeader.market_header.base_total), + /// From input buffer to market header quote total. + QUOTE_TOTAL = offset!(InputBufferHeader.market_header.quote_total), + /// From input buffer to market header lamports total. + LAMPORTS_TOTAL = offset!(InputBufferHeader.market_header.lamports_total), } } diff --git a/program/src/dropset/entrypoint.s b/program/src/dropset/entrypoint.s index 7c0d1f6..bb61cef 100644 --- a/program/src/dropset/entrypoint.s +++ b/program/src/dropset/entrypoint.s @@ -46,14 +46,6 @@ .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, 10536 -# From input buffer to market header base vault bump. -.equ IB_MARKET_HEADER_BASE_VAULT_BUMP_OFF, 10569 -# From input buffer to market header quote vault bump. -.equ IB_MARKET_HEADER_QUOTE_VAULT_BUMP_OFF, 10602 # From input buffer to first sector in market memory map. .equ IB_MARKET_SECTORS_START_OFF, 10627 # Absolute SBPF pointer to first sector in market memory map. diff --git a/program/src/dropset/market/init_base_vault.s b/program/src/dropset/market/init_base_vault.s index 4c1c046..aec5ddd 100644 --- a/program/src/dropset/market/init_base_vault.s +++ b/program/src/dropset/market/init_base_vault.s @@ -93,7 +93,7 @@ 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 # acct += EmptyAccount.size add64 r9, SIZE_OF_EMPTY_ACCOUNT ja init_base_vault_return diff --git a/program/src/dropset/market/init_market_pda/create_market_account.s b/program/src/dropset/market/init_market_pda/create_market_account.s index e1272ab..6c633f4 100644 --- a/program/src/dropset/market/init_market_pda/create_market_account.s +++ b/program/src/dropset/market/init_market_pda/create_market_account.s @@ -75,8 +75,8 @@ create_market_account: # input.market_header.next = &entrypoint::input_buffer::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 + 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 ja create_market_account_return diff --git a/program/src/dropset/market/init_quote_vault.s b/program/src/dropset/market/init_quote_vault.s index de6843e..4afe95f 100644 --- a/program/src/dropset/market/init_quote_vault.s +++ b/program/src/dropset/market/init_quote_vault.s @@ -104,5 +104,5 @@ 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 ja init_quote_vault_return diff --git a/program/src/dropset/market/market.s b/program/src/dropset/market/market.s index be08d46..b203e88 100644 --- a/program/src/dropset/market/market.s +++ b/program/src/dropset/market/market.s @@ -4,4 +4,56 @@ .equ MKT_VAULT_INDEX_BASE, 0 # Vault index for quote token in PDA derivation and vault creation. .equ MKT_VAULT_INDEX_QUOTE, 1 +.equ MKT_NEXT_OFF, 10464 # From input buffer to market header next pointer. +# From input buffer to market header base mint address. +.equ MKT_BASE_MINT_OFF, 10472 +# From input buffer to market header base mint address (chunk 0). +.equ MKT_BASE_MINT_CHUNK_0_OFF, 10472 +# From input buffer to market header base mint address (chunk 1). +.equ MKT_BASE_MINT_CHUNK_1_OFF, 10480 +# From input buffer to market header base mint address (chunk 2). +.equ MKT_BASE_MINT_CHUNK_2_OFF, 10488 +# From input buffer to market header base mint address (chunk 3). +.equ MKT_BASE_MINT_CHUNK_3_OFF, 10496 +# From input buffer to market header quote mint address. +.equ MKT_QUOTE_MINT_OFF, 10504 +# From input buffer to market header quote mint address (chunk 0). +.equ MKT_QUOTE_MINT_CHUNK_0_OFF, 10504 +# From input buffer to market header quote mint address (chunk 1). +.equ MKT_QUOTE_MINT_CHUNK_1_OFF, 10512 +# From input buffer to market header quote mint address (chunk 2). +.equ MKT_QUOTE_MINT_CHUNK_2_OFF, 10520 +# From input buffer to market header quote mint address (chunk 3). +.equ MKT_QUOTE_MINT_CHUNK_3_OFF, 10528 +.equ MKT_BUMP_OFF, 10536 # From input buffer to market header bump seed. +# From input buffer to market header base vault address. +.equ MKT_BASE_VAULT_OFF, 10537 +# From input buffer to market header base vault address (chunk 0). +.equ MKT_BASE_VAULT_CHUNK_0_OFF, 10537 +# From input buffer to market header base vault address (chunk 1). +.equ MKT_BASE_VAULT_CHUNK_1_OFF, 10545 +# From input buffer to market header base vault address (chunk 2). +.equ MKT_BASE_VAULT_CHUNK_2_OFF, 10553 +# From input buffer to market header base vault address (chunk 3). +.equ MKT_BASE_VAULT_CHUNK_3_OFF, 10561 +# From input buffer to market header base vault bump seed. +.equ MKT_BASE_VAULT_BUMP_OFF, 10569 +# From input buffer to market header quote vault address. +.equ MKT_QUOTE_VAULT_OFF, 10570 +# From input buffer to market header quote vault address (chunk 0). +.equ MKT_QUOTE_VAULT_CHUNK_0_OFF, 10570 +# From input buffer to market header quote vault address (chunk 1). +.equ MKT_QUOTE_VAULT_CHUNK_1_OFF, 10578 +# From input buffer to market header quote vault address (chunk 2). +.equ MKT_QUOTE_VAULT_CHUNK_2_OFF, 10586 +# From input buffer to market header quote vault address (chunk 3). +.equ MKT_QUOTE_VAULT_CHUNK_3_OFF, 10594 +# From input buffer to market header quote vault bump seed. +.equ MKT_QUOTE_VAULT_BUMP_OFF, 10602 +# From input buffer to market header base total. +.equ MKT_BASE_TOTAL_OFF, 10603 +# From input buffer to market header quote total. +.equ MKT_QUOTE_TOTAL_OFF, 10611 +# From input buffer to market header lamports total. +.equ MKT_LAMPORTS_TOTAL_OFF, 10619 # ------------------------------------------------------------------------- From c8d9a7623bc63587b30da2af00b792e8c69e3d4d Mon Sep 17 00:00:00 2001 From: Alex Kahn <43892045+alnoki@users.noreply.github.com> Date: Fri, 10 Apr 2026 17:19:28 -0700 Subject: [PATCH 3/4] Move around constants --- interface/src/common/account.rs | 6 ++ interface/src/entrypoint.rs | 14 ----- interface/src/market/mod.rs | 31 ++++++---- program/src/dropset/common/account.s | 6 ++ program/src/dropset/entrypoint.s | 10 ---- .../init_market_pda/create_market_account.s | 14 ++--- .../market/init_vault/create_vault_account.s | 12 ++-- .../market/init_vault/get_vault_size.s | 4 +- .../init_vault/init_vault_token_account.s | 18 +++--- program/src/dropset/market/market.s | 60 ++++++++++--------- tests/tests/cases/register_market.rs | 4 +- 11 files changed, 90 insertions(+), 89 deletions(-) diff --git a/interface/src/common/account.rs b/interface/src/common/account.rs index e3cd2e2..a8f9963 100644 --- a/interface/src/common/account.rs +++ b/interface/src/common/account.rs @@ -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. diff --git a/interface/src/entrypoint.rs b/interface/src/entrypoint.rs index c847ff4..67586a1 100644 --- a/interface/src/entrypoint.rs +++ b/interface/src/entrypoint.rs @@ -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. @@ -57,23 +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 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 diff --git a/interface/src/market/mod.rs b/interface/src/market/mod.rs index ae571e2..ed41926 100644 --- a/interface/src/market/mod.rs +++ b/interface/src/market/mod.rs @@ -6,38 +6,47 @@ 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 token in PDA derivation and vault creation. VAULT_INDEX_BASE = immediate!(0), /// Vault index for quote token in PDA derivation and vault creation. VAULT_INDEX_QUOTE = immediate!(1), - /// From input buffer to market header next pointer. + /// From input buffer to MarketHeader.next. NEXT = offset!(InputBufferHeader.market_header.next), - /// From input buffer to market header base mint address. + /// From input buffer to MarketHeader.base_mint. BASE_MINT = pubkey_offsets!(InputBufferHeader.market_header.base_mint), - /// From input buffer to market header quote mint address. + /// From input buffer to MarketHeader.quote_mint. QUOTE_MINT = pubkey_offsets!(InputBufferHeader.market_header.quote_mint), - /// From input buffer to market header bump seed. + /// From input buffer to MarketHeader.bump. BUMP = offset!(InputBufferHeader.market_header.bump), - /// From input buffer to market header base vault address. + /// From input buffer to MarketHeader.base_vault. BASE_VAULT = pubkey_offsets!(InputBufferHeader.market_header.base_vault), - /// From input buffer to market header base vault bump seed. + /// From input buffer to MarketHeader.base_vault_bump. BASE_VAULT_BUMP = offset!(InputBufferHeader.market_header.base_vault_bump), - /// From input buffer to market header quote vault address. + /// From input buffer to MarketHeader.quote_vault. QUOTE_VAULT = pubkey_offsets!(InputBufferHeader.market_header.quote_vault), - /// From input buffer to market header quote vault bump seed. + /// From input buffer to MarketHeader.quote_vault_bump. QUOTE_VAULT_BUMP = offset!(InputBufferHeader.market_header.quote_vault_bump), - /// From input buffer to market header base total. + /// From input buffer to MarketHeader.base_total. BASE_TOTAL = offset!(InputBufferHeader.market_header.base_total), - /// From input buffer to market header quote total. + /// From input buffer to MarketHeader.quote_total. QUOTE_TOTAL = offset!(InputBufferHeader.market_header.quote_total), - /// From input buffer to market header lamports 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 + ), } } diff --git a/program/src/dropset/common/account.s b/program/src/dropset/common/account.s index a30bb83..5df8b6a 100644 --- a/program/src/dropset/common/account.s +++ b/program/src/dropset/common/account.s @@ -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 diff --git a/program/src/dropset/entrypoint.s b/program/src/dropset/entrypoint.s index bb61cef..a8f5ff6 100644 --- a/program/src/dropset/entrypoint.s +++ b/program/src/dropset/entrypoint.s @@ -38,18 +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 first sector in market memory map. -.equ IB_MARKET_SECTORS_START_OFF, 10627 -# Absolute SBPF pointer to first sector in market memory map. -.equ IB_MARKET_SECTORS_START_PTR_WD, 17179879811 # ------------------------------------------------------------------------- entrypoint: diff --git a/program/src/dropset/market/init_market_pda/create_market_account.s b/program/src/dropset/market/init_market_pda/create_market_account.s index 6c633f4..e4c9d4f 100644 --- a/program/src/dropset/market/init_market_pda/create_market_account.s +++ b/program/src/dropset/market/init_market_pda/create_market_account.s @@ -17,13 +17,13 @@ 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 @@ -31,13 +31,13 @@ create_market_account: 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 @@ -74,7 +74,7 @@ create_market_account: call sol_invoke_signed_c # input.market_header.next = &entrypoint::input_buffer::MARKET_SECTORS_START ldxdw r6, [r10 + RM_FM_INPUT_OFF] - lddw r7, IB_MARKET_SECTORS_START_PTR_WD + 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] diff --git a/program/src/dropset/market/init_vault/create_vault_account.s b/program/src/dropset/market/init_vault/create_vault_account.s index 35d7a5b..bd45719 100644 --- a/program/src/dropset/market/init_vault/create_vault_account.s +++ b/program/src/dropset/market/init_vault/create_vault_account.s @@ -43,13 +43,13 @@ create_vault_account: stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_META_PUBKEY_UOFF], r8 stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_KEY_UOFF], r8 # frame.cpi[0].info.owner = &input.user.owner - add64 r8, IB_ADDRESS_TO_OWNER_REL_OFF_IMM + add64 r8, ACCT_ADDRESS_TO_OWNER_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_OWNER_UOFF], r8 # frame.cpi[0].info.lamports = &input.user.lamports - add64 r8, IB_OWNER_TO_LAMPORTS_REL_OFF_IMM + add64 r8, ACCT_OWNER_TO_LAMPORTS_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_LAMPORTS_UOFF], r8 # frame.cpi[0].info.data = &input.user.data - add64 r8, IB_LAMPORTS_TO_DATA_REL_OFF_IMM + add64 r8, ACCT_LAMPORTS_TO_DATA_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_DATA_UOFF], r8 # frame.cpi[1].meta.pubkey = &acct.address # frame.cpi[1].info.key = &acct.address @@ -58,13 +58,13 @@ create_vault_account: stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_META_PUBKEY_UOFF], r8 stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_KEY_UOFF], r8 # frame.cpi[1].info.owner = &acct.owner - add64 r8, IB_ADDRESS_TO_OWNER_REL_OFF_IMM + add64 r8, ACCT_ADDRESS_TO_OWNER_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_OWNER_UOFF], r8 # frame.cpi[1].info.lamports = &acct.lamports - add64 r8, IB_OWNER_TO_LAMPORTS_REL_OFF_IMM + add64 r8, ACCT_OWNER_TO_LAMPORTS_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_LAMPORTS_UOFF], r8 # frame.cpi[1].info.data = &acct.data - add64 r8, IB_LAMPORTS_TO_DATA_REL_OFF_IMM + add64 r8, ACCT_LAMPORTS_TO_DATA_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_DATA_UOFF], r8 # frame.sol_instruction.program_id = frame.system_program_id ldxdw r8, [r6 + RM_FM_SYSTEM_PROGRAM_ID_OFF] diff --git a/program/src/dropset/market/init_vault/get_vault_size.s b/program/src/dropset/market/init_vault/get_vault_size.s index 5bec47f..2518a2e 100644 --- a/program/src/dropset/market/init_vault/get_vault_size.s +++ b/program/src/dropset/market/init_vault/get_vault_size.s @@ -22,10 +22,10 @@ get_vault_size_token_2022: # frame.cpi[0].info.key = &mint.address stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_KEY_UOFF], r9 # frame.cpi[0].info.owner = &mint.owner - add64 r9, IB_ADDRESS_TO_OWNER_REL_OFF_IMM + add64 r9, ACCT_ADDRESS_TO_OWNER_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_OWNER_UOFF], r9 # frame.cpi[0].info.lamports = &mint.lamports - add64 r9, IB_OWNER_TO_LAMPORTS_REL_OFF_IMM + add64 r9, ACCT_OWNER_TO_LAMPORTS_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_LAMPORTS_UOFF], r9 # frame.cpi[0].info.data_len = mint.data_len ldxdw r9, [r8 + ACCT_DATA_LEN_OFF] diff --git a/program/src/dropset/market/init_vault/init_vault_token_account.s b/program/src/dropset/market/init_vault/init_vault_token_account.s index 4eb74eb..3316131 100644 --- a/program/src/dropset/market/init_vault/init_vault_token_account.s +++ b/program/src/dropset/market/init_vault/init_vault_token_account.s @@ -6,13 +6,13 @@ init_vault_token_account: stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_META_PUBKEY_UOFF], r8 stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_KEY_UOFF], r8 # frame.cpi[0].info.owner = &acct.owner - add64 r8, IB_ADDRESS_TO_OWNER_REL_OFF_IMM + add64 r8, ACCT_ADDRESS_TO_OWNER_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_OWNER_UOFF], r8 # frame.cpi[0].info.lamports = &acct.lamports - add64 r8, IB_OWNER_TO_LAMPORTS_REL_OFF_IMM + add64 r8, ACCT_OWNER_TO_LAMPORTS_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_LAMPORTS_UOFF], r8 # frame.cpi[0].info.data = &acct.data - add64 r8, IB_LAMPORTS_TO_DATA_REL_OFF_IMM + add64 r8, ACCT_LAMPORTS_TO_DATA_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_DATA_UOFF], r8 # frame.cpi[0].info.data_len = acct.data_len ldxdw r8, [r7 + ACCT_DATA_LEN_OFF] @@ -32,13 +32,13 @@ init_vault_token_account: stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_META_PUBKEY_UOFF], r9 stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_KEY_UOFF], r9 # frame.cpi[1].info.owner = &mint.owner - add64 r9, IB_ADDRESS_TO_OWNER_REL_OFF_IMM + add64 r9, ACCT_ADDRESS_TO_OWNER_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_OWNER_UOFF], r9 # frame.cpi[1].info.lamports = &mint.lamports - add64 r9, IB_OWNER_TO_LAMPORTS_REL_OFF_IMM + add64 r9, ACCT_OWNER_TO_LAMPORTS_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_LAMPORTS_UOFF], r9 # frame.cpi[1].info.data = &mint.data - add64 r9, IB_LAMPORTS_TO_DATA_REL_OFF_IMM + add64 r9, ACCT_LAMPORTS_TO_DATA_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_DATA_UOFF], r9 # frame.cpi[1].info.data_len = mint.data_len ldxdw r9, [r8 + ACCT_DATA_LEN_OFF] @@ -52,13 +52,13 @@ init_vault_token_account: stxdw [r6 + RM_FM_CPI_IDX_2_ACCT_META_PUBKEY_UOFF], r9 stxdw [r6 + RM_FM_CPI_IDX_2_ACCT_INFO_KEY_UOFF], r9 # frame.cpi[2].info.owner = &rent.owner - add64 r9, IB_ADDRESS_TO_OWNER_REL_OFF_IMM + add64 r9, ACCT_ADDRESS_TO_OWNER_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_2_ACCT_INFO_OWNER_UOFF], r9 # frame.cpi[2].info.lamports = &rent.lamports - add64 r9, IB_OWNER_TO_LAMPORTS_REL_OFF_IMM + add64 r9, ACCT_OWNER_TO_LAMPORTS_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_2_ACCT_INFO_LAMPORTS_UOFF], r9 # frame.cpi[2].info.data = &rent.data - add64 r9, IB_LAMPORTS_TO_DATA_REL_OFF_IMM + add64 r9, ACCT_LAMPORTS_TO_DATA_REL_OFF_IMM stxdw [r6 + RM_FM_CPI_IDX_2_ACCT_INFO_DATA_UOFF], r9 # frame.cpi[2].info.data_len = rent.data_len ldxdw r9, [r8 + ACCT_DATA_LEN_OFF] diff --git a/program/src/dropset/market/market.s b/program/src/dropset/market/market.s index b203e88..b078d0c 100644 --- a/program/src/dropset/market/market.s +++ b/program/src/dropset/market/market.s @@ -1,59 +1,63 @@ -# Market-level constants. +# Market-level constants. Assumes user has no data for static addressing. # ------------------------------------------------------------------------- # Vault index for base token in PDA derivation and vault creation. .equ MKT_VAULT_INDEX_BASE, 0 # Vault index for quote token in PDA derivation and vault creation. .equ MKT_VAULT_INDEX_QUOTE, 1 -.equ MKT_NEXT_OFF, 10464 # From input buffer to market header next pointer. -# From input buffer to market header base mint address. +.equ MKT_NEXT_OFF, 10464 # From input buffer to MarketHeader.next. +# From input buffer to MarketHeader.base_mint. .equ MKT_BASE_MINT_OFF, 10472 -# From input buffer to market header base mint address (chunk 0). +# From input buffer to MarketHeader.base_mint (chunk 0). .equ MKT_BASE_MINT_CHUNK_0_OFF, 10472 -# From input buffer to market header base mint address (chunk 1). +# From input buffer to MarketHeader.base_mint (chunk 1). .equ MKT_BASE_MINT_CHUNK_1_OFF, 10480 -# From input buffer to market header base mint address (chunk 2). +# From input buffer to MarketHeader.base_mint (chunk 2). .equ MKT_BASE_MINT_CHUNK_2_OFF, 10488 -# From input buffer to market header base mint address (chunk 3). +# From input buffer to MarketHeader.base_mint (chunk 3). .equ MKT_BASE_MINT_CHUNK_3_OFF, 10496 -# From input buffer to market header quote mint address. +# From input buffer to MarketHeader.quote_mint. .equ MKT_QUOTE_MINT_OFF, 10504 -# From input buffer to market header quote mint address (chunk 0). +# From input buffer to MarketHeader.quote_mint (chunk 0). .equ MKT_QUOTE_MINT_CHUNK_0_OFF, 10504 -# From input buffer to market header quote mint address (chunk 1). +# From input buffer to MarketHeader.quote_mint (chunk 1). .equ MKT_QUOTE_MINT_CHUNK_1_OFF, 10512 -# From input buffer to market header quote mint address (chunk 2). +# From input buffer to MarketHeader.quote_mint (chunk 2). .equ MKT_QUOTE_MINT_CHUNK_2_OFF, 10520 -# From input buffer to market header quote mint address (chunk 3). +# From input buffer to MarketHeader.quote_mint (chunk 3). .equ MKT_QUOTE_MINT_CHUNK_3_OFF, 10528 -.equ MKT_BUMP_OFF, 10536 # From input buffer to market header bump seed. -# From input buffer to market header base vault address. +.equ MKT_BUMP_OFF, 10536 # From input buffer to MarketHeader.bump. +# From input buffer to MarketHeader.base_vault. .equ MKT_BASE_VAULT_OFF, 10537 -# From input buffer to market header base vault address (chunk 0). +# From input buffer to MarketHeader.base_vault (chunk 0). .equ MKT_BASE_VAULT_CHUNK_0_OFF, 10537 -# From input buffer to market header base vault address (chunk 1). +# From input buffer to MarketHeader.base_vault (chunk 1). .equ MKT_BASE_VAULT_CHUNK_1_OFF, 10545 -# From input buffer to market header base vault address (chunk 2). +# From input buffer to MarketHeader.base_vault (chunk 2). .equ MKT_BASE_VAULT_CHUNK_2_OFF, 10553 -# From input buffer to market header base vault address (chunk 3). +# From input buffer to MarketHeader.base_vault (chunk 3). .equ MKT_BASE_VAULT_CHUNK_3_OFF, 10561 -# From input buffer to market header base vault bump seed. +# From input buffer to MarketHeader.base_vault_bump. .equ MKT_BASE_VAULT_BUMP_OFF, 10569 -# From input buffer to market header quote vault address. +# From input buffer to MarketHeader.quote_vault. .equ MKT_QUOTE_VAULT_OFF, 10570 -# From input buffer to market header quote vault address (chunk 0). +# From input buffer to MarketHeader.quote_vault (chunk 0). .equ MKT_QUOTE_VAULT_CHUNK_0_OFF, 10570 -# From input buffer to market header quote vault address (chunk 1). +# From input buffer to MarketHeader.quote_vault (chunk 1). .equ MKT_QUOTE_VAULT_CHUNK_1_OFF, 10578 -# From input buffer to market header quote vault address (chunk 2). +# From input buffer to MarketHeader.quote_vault (chunk 2). .equ MKT_QUOTE_VAULT_CHUNK_2_OFF, 10586 -# From input buffer to market header quote vault address (chunk 3). +# From input buffer to MarketHeader.quote_vault (chunk 3). .equ MKT_QUOTE_VAULT_CHUNK_3_OFF, 10594 -# From input buffer to market header quote vault bump seed. +# From input buffer to MarketHeader.quote_vault_bump. .equ MKT_QUOTE_VAULT_BUMP_OFF, 10602 -# From input buffer to market header base total. +# From input buffer to MarketHeader.base_total. .equ MKT_BASE_TOTAL_OFF, 10603 -# From input buffer to market header quote total. +# From input buffer to MarketHeader.quote_total. .equ MKT_QUOTE_TOTAL_OFF, 10611 -# From input buffer to market header lamports total. +# From input buffer to MarketHeader.lamports_total. .equ MKT_LAMPORTS_TOTAL_OFF, 10619 +# From input buffer to first sector in market memory map. +.equ MKT_SECTORS_START_OFF, 10627 +# Absolute SBPF pointer to first sector in market memory map. +.equ MKT_SECTORS_START_PTR_WD, 17179879811 # ------------------------------------------------------------------------- diff --git a/tests/tests/cases/register_market.rs b/tests/tests/cases/register_market.rs index 2e1f554..34a092a 100644 --- a/tests/tests/cases/register_market.rs +++ b/tests/tests/cases/register_market.rs @@ -1,6 +1,6 @@ use dropset_interface::common::pubkey::constants::CHUNK_3_OFF; use dropset_interface::common::pubkey::{TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID}; -use dropset_interface::entrypoint::input_buffer::MARKET_SECTORS_START_OFF; +use dropset_interface::market::constants::SECTORS_START_OFF; use dropset_interface::market::MarketHeader; use dropset_interface::market::constants::{VAULT_INDEX_BASE, VAULT_INDEX_QUOTE}; use dropset_interface::market::register::Accounts; @@ -251,7 +251,7 @@ fn check_market_header_bumps( ) { let header: &MarketHeader = unsafe { &*(data.as_ptr() as *const MarketHeader) }; - let expected_next = MM_INPUT_START + MARKET_SECTORS_START_OFF as u64; + let expected_next = MM_INPUT_START + SECTORS_START_OFF as u64; let actual_next = header.next as u64; if actual_next != expected_next { errors.push(format!( From f805fda0bda9e2ae2b977a688b8fef9e2845717d Mon Sep 17 00:00:00 2001 From: Alex Kahn <43892045+alnoki@users.noreply.github.com> Date: Fri, 10 Apr 2026 17:29:27 -0700 Subject: [PATCH 4/4] Add stores --- .../init-market-pda/CREATE-MARKET-ACCOUNT.tex | 5 +++-- interface/src/market/register.rs | 4 ++-- program/src/dropset/market/init_base_vault.s | 9 ++++++++ .../init_market_pda/create_market_account.s | 21 ++++++++++++++++++- program/src/dropset/market/init_quote_vault.s | 9 ++++++++ program/src/dropset/market/register.s | 16 ++++++++++++++ 6 files changed, 59 insertions(+), 5 deletions(-) diff --git a/docs/algorithms/market/init-market-pda/CREATE-MARKET-ACCOUNT.tex b/docs/algorithms/market/init-market-pda/CREATE-MARKET-ACCOUNT.tex index ddbefc5..85f1b1f 100644 --- a/docs/algorithms/market/init-market-pda/CREATE-MARKET-ACCOUNT.tex +++ b/docs/algorithms/market/init-market-pda/CREATE-MARKET-ACCOUNT.tex @@ -9,11 +9,12 @@ \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 @@ -57,7 +58,7 @@ \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 diff --git a/interface/src/market/register.rs b/interface/src/market/register.rs index 3498379..03836a5 100644 --- a/interface/src/market/register.rs +++ b/interface/src/market/register.rs @@ -60,7 +60,7 @@ 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. @@ -68,7 +68,7 @@ constant_group! { /// 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. diff --git a/program/src/dropset/market/init_base_vault.s b/program/src/dropset/market/init_base_vault.s index aec5ddd..8312ab6 100644 --- a/program/src/dropset/market/init_base_vault.s +++ b/program/src/dropset/market/init_base_vault.s @@ -94,6 +94,15 @@ init_base_vault_advance: # input.market_header.base_vault_bump = frame.bump ldxb r7, [r10 + RM_FM_BUMP_OFF] 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 diff --git a/program/src/dropset/market/init_market_pda/create_market_account.s b/program/src/dropset/market/init_market_pda/create_market_account.s index e4c9d4f..210e8c1 100644 --- a/program/src/dropset/market/init_market_pda/create_market_account.s +++ b/program/src/dropset/market/init_market_pda/create_market_account.s @@ -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, 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 + 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 diff --git a/program/src/dropset/market/init_quote_vault.s b/program/src/dropset/market/init_quote_vault.s index 4afe95f..d22f57f 100644 --- a/program/src/dropset/market/init_quote_vault.s +++ b/program/src/dropset/market/init_quote_vault.s @@ -105,4 +105,13 @@ init_quote_vault_done_token_program: # input.market_header.quote_vault_bump = frame.bump ldxb r7, [r10 + RM_FM_BUMP_OFF] 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 diff --git a/program/src/dropset/market/register.s b/program/src/dropset/market/register.s index 8975b4e..7746cbc 100644 --- a/program/src/dropset/market/register.s +++ b/program/src/dropset/market/register.s @@ -28,6 +28,14 @@ .equ RM_BASE_DATA_LEN_OFF, 20760 # From input buffer to base mint address field. .equ RM_BASE_ADDR_OFF, 20688 +# From input buffer to base mint address field (chunk 0). +.equ RM_BASE_ADDR_CHUNK_0_OFF, 20688 +# From input buffer to base mint address field (chunk 1). +.equ RM_BASE_ADDR_CHUNK_1_OFF, 20696 +# From input buffer to base mint address field (chunk 2). +.equ RM_BASE_ADDR_CHUNK_2_OFF, 20704 +# From input buffer to base mint address field (chunk 3). +.equ RM_BASE_ADDR_CHUNK_3_OFF, 20712 .equ RM_BASE_OWNER_OFF, 20720 # From input buffer to base mint owner. # From input buffer to base mint owner (chunk 0). .equ RM_BASE_OWNER_CHUNK_0_OFF, 20720 @@ -42,6 +50,14 @@ .equ RM_QUOTE_DUPLICATE_OFF, 31016 # From input buffer to quote mint address field. .equ RM_QUOTE_ADDR_OFF, 31024 +# From input buffer to quote mint address field (chunk 0). +.equ RM_QUOTE_ADDR_CHUNK_0_OFF, 31024 +# From input buffer to quote mint address field (chunk 1). +.equ RM_QUOTE_ADDR_CHUNK_1_OFF, 31032 +# From input buffer to quote mint address field (chunk 2). +.equ RM_QUOTE_ADDR_CHUNK_2_OFF, 31040 +# From input buffer to quote mint address field (chunk 3). +.equ RM_QUOTE_ADDR_CHUNK_3_OFF, 31048 .equ RM_QUOTE_OWNER_OFF, 31056 # From input buffer to quote mint owner. # From input buffer to quote mint owner (chunk 0). .equ RM_QUOTE_OWNER_CHUNK_0_OFF, 31056