diff --git a/docs/algorithms/INIT-MARKET-PDA.tex b/docs/algorithms/INIT-MARKET-PDA.tex new file mode 100644 index 0000000..8ed6005 --- /dev/null +++ b/docs/algorithms/INIT-MARKET-PDA.tex @@ -0,0 +1,86 @@ +\begin{algorithm} +\caption{INIT-MARKET-PDA} +\begin{algorithmic} + \COMMENT{Pointer to input buffer.} + \INPUT $r_1$ = input + \COMMENT{Pointer to instruction data.} + \INPUT $r_2$ = insn + \COMMENT{Pointer to Rent sysvar account.} + \INPUT $r_9$ = acct + \COMMENT{Pointer to stack frame.} + \INPUT $r_{10}$ = frame + \COMMENT{Pointer to shifted input buffer for quote mint offsets.} + \REQUIRE frame.input\_shifted + \COMMENT{Pointer to System Program ID in input buffer.} + \REQUIRE frame.sol\_instruction.program\_id + \ENSURE $r_9$ = acct + \ENSURE frame.input = input +\PROCEDURE{INIT-MARKET-PDA}{input, insn, acct, frame} + \COMMENT{Prepare CreateAccount instruction lamports, space fields.} + \STATE frame.create\_account\_data.space = \texttt{MarketHeader.size} + \STATE acct\_size = \texttt{MarketHeader.size} + \texttt{account.STORAGE\_OVERHEAD} + \STATE lamports\_per\_byte = acct.data.lamports\_per\_byte + \STATE frame.create\_account\_data.lamports = acct\_size $\times$ lamports\_per\_byte + \COMMENT{Initialize market PDA signer seeds.} + \STATE frame.pda\_seeds[0].addr = input.base\_mint.address + \STATE frame.pda\_seeds[0].len = \texttt{Address.size} + \STATE frame.pda\_seeds[1].addr = input\_shifted.quote\_mint.address + \STATE frame.pda\_seeds[1].len = \texttt{Address.size} + \COMMENT{Derive market PDA.} + \STATE frame.input = input + \STATE syscall.seeds = \&frame.pda\_seeds + \STATE syscall.program\_id = \&insn.program\_id + \STATE syscall.seeds\_len = \texttt{register\_misc.TRY\_FIND\_MARKET\_PDA\_SEEDS\_LEN} + \STATE syscall.program\_address = \&frame.pda + \STATE syscall.bump\_seed = \&frame.bump + \STATE \CALL{sol-try-find-program-address}{} + \COMMENT{Verify derived market PDA matches market account address.} + \STATE input = frame.input + \IF{input.market.address $\neq$ frame.market\_pda} + \RETURN \texttt{ErrorCode::InvalidMarketPubkey} + \ENDIF + \COMMENT{Populate bump signer seed from derived bump.} + \STATE frame.pda\_seeds[2].addr = \&syscall.bump\_seed + \STATE frame.pda\_seeds[2].len = \texttt{u8.size} + \COMMENT{Populate CreateAccount CPI instruction data owner field.} + \STATE frame.create\_account\_data.owner = syscall.program\_id + \COMMENT{Assign CPI account fields via immediates.} + \STATE frame.cpi[0].info.is\_signer = \texttt{true} + \STATE frame.cpi[0].info.is\_writable = \texttt{true} + \STATE frame.cpi[0].meta.is\_signer = \texttt{true} + \STATE frame.cpi[0].meta.is\_writable = \texttt{true} + \STATE frame.cpi[1].info.is\_signer = \texttt{true} + \STATE frame.cpi[1].info.is\_writable = \texttt{true} + \STATE frame.cpi[1].meta.is\_signer = \texttt{true} + \STATE frame.cpi[1].meta.is\_writable = \texttt{true} + \COMMENT{Assign CPI account fields via pointers.} + \STATE frame.cpi[0].meta.pubkey = \&input.user.address + \STATE frame.cpi[0].info.key = \&input.user.address + \STATE frame.cpi[0].info.owner = \&input.user.owner + \STATE frame.cpi[0].info.lamports = \&input.user.lamports + \STATE frame.cpi[0].info.data = \&input.user.data + \STATE frame.cpi[1].meta.pubkey = \&input.market.address + \STATE frame.cpi[1].info.key = \&input.market.address + \STATE frame.cpi[1].info.owner = \&input.market.owner + \STATE frame.cpi[1].info.lamports = \&input.market.lamports + \STATE frame.cpi[1].info.data = \&input.market.data + \COMMENT{Populate signers seeds for CPI.} + \STATE frame.signers\_seeds.addr = \&frame.pda\_seeds + \STATE frame.signers\_seeds.len = \texttt{RegisterMarketFrame.PDA\_SEEDS\_N\_SEEDS} + \COMMENT{Populate SolInstruction for CreateAccount CPI.} + \STATE frame.sol\_instruction.accounts = \&frame.cpi.account\_metas + \STATE frame.sol\_instruction.account\_len = + \texttt{register\_misc.CREATE\_ACCOUNT\_N\_ACCOUNTS} + \STATE frame.sol\_instruction.data = \&frame.create\_account\_data + \STATE frame.sol\_instruction.data\_len = \texttt{CreateAccountData.size} + \COMMENT{Invoke CreateAccount CPI.} + \STATE syscall.instruction = \&frame.sol\_instruction + \STATE syscall.account\_infos = \&frame.cpi.account\_infos + \STATE syscall.account\_infos\_len = + \texttt{register\_misc.CREATE\_ACCOUNT\_N\_ACCOUNTS} + \STATE syscall.seeds = \&frame.signers\_seeds + \STATE syscall.seeds\_len = \texttt{register\_misc.N\_PDA\_SIGNERS} + \STATE \CALL{sol-invoke-signed-c}{} +\ENDPROCEDURE +\end{algorithmic} +\end{algorithm} diff --git a/docs/algorithms/REGISTER-MARKET.tex b/docs/algorithms/REGISTER-MARKET.tex index c22b373..e87f4c9 100644 --- a/docs/algorithms/REGISTER-MARKET.tex +++ b/docs/algorithms/REGISTER-MARKET.tex @@ -30,43 +30,21 @@ \IF{input.market.data\_len $\neq$ 0} \RETURN \texttt{ErrorCode::MarketHasData} \ENDIF - \COMMENT{Check base mint account, create signer seed.} + \COMMENT{Check base mint account.} \IF{input.base\_mint.duplicate $\neq$ \texttt{account.NON\_DUP\_MARKER}} \RETURN \texttt{ErrorCode::BaseMintIsDuplicate} \ENDIF - \STATE frame.pda\_seeds[0].addr = input.base\_mint.address - \STATE frame.pda\_seeds[0].len = \texttt{Address.size} \COMMENT{Increment input buffer by base mint padded data length for quote offsets.} \STATE input\_shifted = input + input.base\_mint.padded\_data\_len \STATE frame.input\_shifted = input\_shifted - \COMMENT{Check quote mint account, create signer seed.} + \COMMENT{Check quote mint account.} \IF{input\_shifted.quote\_mint.duplicate $\neq$ \texttt{account.NON\_DUP\_MARKER}} \RETURN \texttt{ErrorCode::QuoteMintIsDuplicate} \ENDIF - \STATE frame.pda\_seeds[1].addr = input\_shifted.quote\_mint.address - \STATE frame.pda\_seeds[1].len = \texttt{Address.size} \COMMENT{Advance to System Program account.} \STATE quote\_mint\_padded\_data\_len = input\_shifted.quote\_mint.padded\_data\_len \STATE acct = \&input\_shifted.quote\_mint \STATE acct += quote\_mint\_padded\_data\_len + \texttt{EmptyAccount.size} - \COMMENT{Derive market PDA.} - \STATE frame.input = input - \STATE syscall.seeds = \&frame.pda\_seeds - \STATE syscall.program\_id = \&insn.program\_id - \STATE syscall.seeds\_len = \texttt{register\_misc.TRY\_FIND\_MARKET\_PDA\_SEEDS\_LEN} - \STATE syscall.program\_address = \&frame.pda - \STATE syscall.bump\_seed = \&frame.bump - \STATE \CALL{sol-try-find-program-address}{} - \COMMENT{Verify derived market PDA matches market account address.} - \STATE input = frame.input - \IF{input.market.address $\neq$ frame.market\_pda} - \RETURN \texttt{ErrorCode::InvalidMarketPubkey} - \ENDIF - \COMMENT{Populate bump signer seed from derived bump.} - \STATE frame.pda\_seeds[2].addr = \&syscall.bump\_seed - \STATE frame.pda\_seeds[2].len = \texttt{u8.size} - \COMMENT{Populate CreateAccount CPI instruction data owner field.} - \STATE frame.create\_account\_data.owner = syscall.program\_id \COMMENT{Check System Program account.} \IF{acct.duplicate $\neq$ \texttt{account.NON\_DUP\_MARKER}} \RETURN \texttt{ErrorCode::SystemProgramIsDuplicate} @@ -86,54 +64,13 @@ \IF{acct.address $\neq$ \texttt{pubkey.RENT}} \RETURN \texttt{ErrorCode::InvalidRentSysvarPubkey} \ENDIF - \COMMENT{Prepare CreateAccount instruction lamports, space fields.} - \STATE frame.create\_account\_data.space = \texttt{MarketHeader.size} - \STATE acct\_size = \texttt{MarketHeader.size} + \texttt{account.STORAGE\_OVERHEAD} - \STATE lamports\_per\_byte = acct.data.lamports\_per\_byte - \STATE frame.create\_account\_data.lamports = acct\_size $\times$ lamports\_per\_byte - \COMMENT{Advance to base token program account.} - \STATE rent\_sysvar\_padded\_data\_len = acct.padded\_data\_len - \STATE acct += rent\_sysvar\_padded\_data\_len + \texttt{EmptyAccount.size} - \COMMENT{Assign CPI account fields via immediates.} - \STATE frame.cpi[0].info.is\_signer = \texttt{true} - \STATE frame.cpi[0].info.is\_writable = \texttt{true} - \STATE frame.cpi[0].meta.is\_signer = \texttt{true} - \STATE frame.cpi[0].meta.is\_writable = \texttt{true} - \STATE frame.cpi[1].info.is\_signer = \texttt{true} - \STATE frame.cpi[1].info.is\_writable = \texttt{true} - \STATE frame.cpi[1].meta.is\_signer = \texttt{true} - \STATE frame.cpi[1].meta.is\_writable = \texttt{true} - \COMMENT{Assign CPI account fields via pointers.} - \STATE frame.cpi[0].meta.pubkey = \&input.user.address - \STATE frame.cpi[0].info.key = \&input.user.address - \STATE frame.cpi[0].info.owner = \&input.user.owner - \STATE frame.cpi[0].info.lamports = \&input.user.lamports - \STATE frame.cpi[0].info.data = \&input.user.data - \STATE frame.cpi[1].meta.pubkey = \&input.market.address - \STATE frame.cpi[1].info.key = \&input.market.address - \STATE frame.cpi[1].info.owner = \&input.market.owner - \STATE frame.cpi[1].info.lamports = \&input.market.lamports - \STATE frame.cpi[1].info.data = \&input.market.data - \COMMENT{Populate signers seeds for CPI.} - \STATE frame.signers\_seeds.addr = \&frame.pda\_seeds - \STATE frame.signers\_seeds.len = \texttt{RegisterMarketFrame.PDA\_SEEDS\_N\_SEEDS} - \COMMENT{Populate SolInstruction for CreateAccount CPI.} - \STATE frame.sol\_instruction.accounts = \&frame.cpi.account\_metas - \STATE frame.sol\_instruction.account\_len = - \texttt{register\_misc.CREATE\_ACCOUNT\_N\_ACCOUNTS} - \STATE frame.sol\_instruction.data = \&frame.create\_account\_data - \STATE frame.sol\_instruction.data\_len = \texttt{CreateAccountData.size} - \COMMENT{Invoke CreateAccount CPI.} - \STATE syscall.instruction = \&frame.sol\_instruction - \STATE syscall.account\_infos = \&frame.cpi.account\_infos - \STATE syscall.account\_infos\_len = - \texttt{register\_misc.CREATE\_ACCOUNT\_N\_ACCOUNTS} - \STATE syscall.seeds = \&frame.signers\_seeds - \STATE syscall.seeds\_len = \texttt{register\_misc.N\_PDA\_SIGNERS} - \STATE \CALL{sol-invoke-signed-c}{} - \COMMENT{Retrieve input buffer pointers.} + \COMMENT{Derive market PDA, populate CPI fields, invoke CreateAccount.} + \STATE \CALL{INIT-MARKET-PDA}{input, insn, acct, frame} + \COMMENT{Retrieve input buffer pointers and advance to base token program account.} \STATE input = frame.input \STATE input\_shifted = frame.input\_shifted + \STATE rent\_sysvar\_padded\_data\_len = acct.padded\_data\_len + \STATE acct += rent\_sysvar\_padded\_data\_len + \texttt{EmptyAccount.size} \COMMENT{Check base token program account.} \IF{acct.duplicate $\neq$ \texttt{account.NON\_DUP\_MARKER}} \RETURN \texttt{ErrorCode::BaseTokenProgramIsDuplicate} diff --git a/docs/src/program/markets.md b/docs/src/program/markets.md index 60b714a..43e98b2 100644 --- a/docs/src/program/markets.md +++ b/docs/src/program/markets.md @@ -22,7 +22,13 @@ The instruction requires the following accounts: -## Vault initialization +## Helpers + +### Market PDA initialization + + + +### Vault initialization diff --git a/interface/src/market.rs b/interface/src/market.rs index 0af45b0..ebd8617 100644 --- a/interface/src/market.rs +++ b/interface/src/market.rs @@ -147,8 +147,6 @@ signer_seeds! { #[frame] /// Stack frame for REGISTER-MARKET. pub struct RegisterMarketFrame { - /// Saved acct pointer across INIT-VAULT syscall. - pub acct: u64, /// Pointer to owning token program address. pub token_program_id: u64, /// Saved input buffer pointer. @@ -183,8 +181,6 @@ constant_group! { #[inject("market/register")] #[frame(RegisterMarketFrame)] frame { - /// Saved acct pointer across INIT-VAULT syscall. - ACCT = offset!(acct), /// Pointer to owning token program address. TOKEN_PROGRAM_ID = offset!(token_program_id), /// Saved input buffer pointer. diff --git a/program/src/dropset/dropset.s b/program/src/dropset/dropset.s index 5575b3e..424aae9 100644 --- a/program/src/dropset/dropset.s +++ b/program/src/dropset/dropset.s @@ -7,4 +7,5 @@ .include "common/pubkey.s" .include "entrypoint.s" .include "market/register.s" +.include "market/init_market_pda.s" .include "market/init_vault.s" diff --git a/program/src/dropset/market/init_market_pda.s b/program/src/dropset/market/init_market_pda.s new file mode 100644 index 0000000..cbe1a43 --- /dev/null +++ b/program/src/dropset/market/init_market_pda.s @@ -0,0 +1,143 @@ +init_market_pda: + # frame.create_account_data.space = MarketHeader.size + mov64 r7, SIZE_OF_MARKET_HEADER + stxdw [r10 + RM_FM_CREATE_ACCT_SPACE_UOFF], r7 + # acct_size = MarketHeader.size + account.STORAGE_OVERHEAD + add64 r7, ACCT_STORAGE_OVERHEAD + # lamports_per_byte = acct.data.lamports_per_byte + ldxdw r8, [r9 + ACCT_DATA_OFF] + # frame.create_account_data.lamports = acct_size * lamports_per_byte + mul64 r7, r8 + stxdw [r10 + RM_FM_CREATE_ACCT_LAMPORTS_UOFF], r7 + # frame.pda_seeds[0].addr = input.base_mint.address + mov64 r8, r1 + add64 r8, RM_MISC_BASE_ADDR_OFF + stxdw [r10 + RM_FM_PDA_SEEDS_IDX_0_ADDR_OFF], r8 + # frame.pda_seeds[0].len = Address.size + mov64 r8, SIZE_OF_ADDRESS + stxdw [r10 + RM_FM_PDA_SEEDS_IDX_0_LEN_OFF], r8 + # frame.pda_seeds[1].addr = input_shifted.quote_mint.address + ldxdw r8, [r10 + RM_FM_INPUT_SHIFTED_OFF] + add64 r8, RM_MISC_QUOTE_ADDR_OFF + stxdw [r10 + RM_FM_PDA_SEEDS_IDX_1_ADDR_OFF], r8 + # frame.pda_seeds[1].len = Address.size + mov64 r8, SIZE_OF_ADDRESS + stxdw [r10 + RM_FM_PDA_SEEDS_IDX_1_LEN_OFF], r8 + # frame.input = input + stxdw [r10 + RM_FM_INPUT_OFF], r1 + # syscall.seeds = &frame.pda_seeds + mov64 r1, r10 + add64 r1, RM_FM_PDA_SEEDS_OFF + # syscall.program_id = &insn.program_id + mov64 r3, r2 + add64 r3, REGISTER_MARKET_DATA_LEN + # syscall.seeds_len = register_misc.TRY_FIND_MARKET_PDA_SEEDS_LEN + mov64 r2, RM_MISC_TRY_FIND_MARKET_PDA_SEEDS_LEN + # syscall.program_address = &frame.pda + mov64 r4, r10 + add64 r4, RM_FM_PDA_OFF + # syscall.bump_seed = &frame.bump + mov64 r5, r10 + add64 r5, RM_FM_BUMP_OFF + call sol_try_find_program_address + # input = frame.input + ldxdw r6, [r10 + RM_FM_INPUT_OFF] + # if input.market.pubkey != frame.market_pda + # return ErrorCode::InvalidMarketPubkey + ldxdw r7, [r6 + IB_MARKET_PUBKEY_CHUNK_0_OFF] + ldxdw r8, [r10 + RM_FM_PDA_CHUNK_0_OFF] + jne r7, r8, e_invalid_market_pubkey + ldxdw r7, [r6 + IB_MARKET_PUBKEY_CHUNK_1_OFF] + ldxdw r8, [r10 + RM_FM_PDA_CHUNK_1_OFF] + jne r7, r8, e_invalid_market_pubkey + ldxdw r7, [r6 + IB_MARKET_PUBKEY_CHUNK_2_OFF] + ldxdw r8, [r10 + RM_FM_PDA_CHUNK_2_OFF] + jne r7, r8, e_invalid_market_pubkey + ldxdw r7, [r6 + IB_MARKET_PUBKEY_CHUNK_3_OFF] + ldxdw r8, [r10 + RM_FM_PDA_CHUNK_3_OFF] + jne r7, r8, e_invalid_market_pubkey + # frame.pda_seeds[2].addr = &frame.bump + stxdw [r10 + RM_FM_PDA_SEEDS_IDX_2_ADDR_OFF], r5 + # frame.pda_seeds.[2].len = u8.size + mov64 r7, SIZE_OF_U8 + stxdw [r10 + RM_FM_PDA_SEEDS_IDX_2_LEN_OFF], r7 + # frame.create_account_data.owner = syscall.program_id + ldxdw r7, [r3 + PUBKEY_CHUNK_0_OFF] + stxdw [r10 + RM_FM_CREATE_ACCT_OWNER_CHUNK_0_UOFF], r7 + ldxdw r7, [r3 + PUBKEY_CHUNK_1_OFF] + stxdw [r10 + RM_FM_CREATE_ACCT_OWNER_CHUNK_1_UOFF], r7 + ldxdw r7, [r3 + PUBKEY_CHUNK_2_OFF] + stxdw [r10 + RM_FM_CREATE_ACCT_OWNER_CHUNK_2_UOFF], r7 + ldxdw r7, [r3 + PUBKEY_CHUNK_3_OFF] + stxdw [r10 + RM_FM_CREATE_ACCT_OWNER_CHUNK_3_UOFF], r7 + # frame.cpi[0].info.is_signer = true + # frame.cpi[0].info.is_writable = true + sth [r10 + RM_FM_CPI_IDX_0_ACCT_INFO_IS_SIGNER_UOFF], CPI_WRITABLE_SIGNER + # frame.cpi[0].meta.is_writable = true + # frame.cpi[0].meta.is_signer = true + sth [r10 + RM_FM_CPI_IDX_0_ACCT_META_IS_WRITABLE_UOFF], CPI_WRITABLE_SIGNER + # frame.cpi[1].info.is_signer = true + # frame.cpi[1].info.is_writable = true + sth [r10 + RM_FM_CPI_IDX_1_ACCT_INFO_IS_SIGNER_UOFF], CPI_WRITABLE_SIGNER + # frame.cpi[1].meta.is_writable = true + # frame.cpi[1].meta.is_signer = true + sth [r10 + RM_FM_CPI_IDX_1_ACCT_META_IS_WRITABLE_UOFF], CPI_WRITABLE_SIGNER + # frame.cpi[0].meta.pubkey = &input.user.address + # frame.cpi[0].info.key = &input.user.address + add64 r6, IB_USER_PUBKEY_OFF + 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 + 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 + 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 + 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 + 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 + 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 + 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 + # frame.signers_seeds.len = frame.PDA_SEEDS_N_SEEDS + mov64 r7, RM_FM_PDA_SEEDS_N_SEEDS + stxdw [r10 + RM_FM_SIGNERS_SEEDS_LEN_UOFF], r7 + # frame.sol_instruction.data = &frame.create_account_data + mov64 r7, r10 + add64 r7, RM_FM_CREATE_ACCT_DATA_OFF + stxdw [r10 + RM_FM_SOL_INSN_DATA_UOFF], r7 + # frame.sol_instruction.accounts = &frame.cpi.account_metas + add64 r7, RM_FM_CREATE_ACCT_DATA_TO_CPI_ACCT_METAS_REL_OFF_IMM + stxdw [r10 + RM_FM_SOL_INSN_ACCOUNTS_UOFF], r7 + # frame.sol_instruction.account_len = register_misc.CREATE_ACCOUNT_N_ACCOUNTS + mov64 r7, RM_MISC_CREATE_ACCOUNT_N_ACCOUNTS + stxdw [r10 + RM_FM_SOL_INSN_ACCOUNT_LEN_UOFF], r7 + # frame.sol_instruction.data_len = CreateAccountData.size + mov64 r7, SIZE_OF_CREATE_ACCOUNT_DATA + stxdw [r10 + RM_FM_SOL_INSN_DATA_LEN_UOFF], r7 + # syscall.instruction = &frame.sol_instruction + add64 r1, RM_FM_PDA_SEEDS_TO_SOL_INSN_REL_OFF_IMM + # syscall.account_infos = &frame.cpi.account_infos + mov64 r2, r10 + add64 r2, RM_FM_CPI_SOL_ACCT_INFO_OFF + # syscall.account_infos_len = register_misc.CREATE_ACCOUNT_N_ACCOUNTS + mov64 r3, RM_MISC_CREATE_ACCOUNT_N_ACCOUNTS + # syscall.seeds = &frame.signers_seeds + add64 r4, RM_FM_PDA_TO_SIGNERS_SEEDS_REL_OFF_IMM + # syscall.seeds_len = register_misc.N_PDA_SIGNERS + mov64 r5, RM_MISC_N_PDA_SIGNERS + call sol_invoke_signed_c + ja init_market_pda_return diff --git a/program/src/dropset/market/register.s b/program/src/dropset/market/register.s index 1334a86..bed72d7 100644 --- a/program/src/dropset/market/register.s +++ b/program/src/dropset/market/register.s @@ -24,7 +24,6 @@ # Stack frame for REGISTER-MARKET. # ------------------------------------------------------------------------- -.equ RM_FM_ACCT_OFF, -480 # Saved acct pointer across INIT-VAULT syscall. # Pointer to owning token program address. .equ RM_FM_TOKEN_PROGRAM_ID_OFF, -472 .equ RM_FM_INPUT_OFF, -464 # Saved input buffer pointer. @@ -221,13 +220,6 @@ register_market: # return ErrorCode::BaseMintIsDuplicate ldxb r9, [r1 + RM_MISC_BASE_DUPLICATE_OFF] jne r9, ACCT_NON_DUP_MARKER, e_base_mint_is_duplicate - # frame.pda_seeds[0].addr = input.base_mint.pubkey - mov64 r9, r1 - add64 r9, RM_MISC_BASE_ADDR_OFF - stxdw [r10 + RM_FM_PDA_SEEDS_IDX_0_ADDR_OFF], r9 - # frame.pda_seeds[0].len = Address.size - mov64 r9, SIZE_OF_ADDRESS - stxdw [r10 + RM_FM_PDA_SEEDS_IDX_0_LEN_OFF], r9 # input_shifted = input + input.base_mint.padded_data_len ldxdw r9, [r1 + RM_MISC_BASE_DATA_LEN_OFF] add64 r9, DATA_LEN_MAX_PAD @@ -239,10 +231,6 @@ register_market: # return ErrorCode::QuoteMintIsDuplicate ldxb r8, [r9 + RM_MISC_QUOTE_DUPLICATE_OFF] jne r8, ACCT_NON_DUP_MARKER, e_quote_mint_is_duplicate - # frame.pda_seeds[1].addr = input_shifted.quote_mint.pubkey - mov64 r8, r9 - add64 r8, RM_MISC_QUOTE_ADDR_OFF - stxdw [r10 + RM_FM_PDA_SEEDS_IDX_1_ADDR_OFF], r8 # quote_mint_padded_data_len = input_shifted.quote_mint.padded_data_len ldxdw r8, [r9 + RM_MISC_QUOTE_DATA_LEN_OFF] add64 r8, DATA_LEN_MAX_PAD @@ -252,56 +240,6 @@ register_market: # acct += quote_mint_padded_data_len + EmptyAccount.size add64 r9, r8 add64 r9, SIZE_OF_EMPTY_ACCOUNT - # frame.pda_seeds[1].len = Address.size - mov64 r8, SIZE_OF_ADDRESS - stxdw [r10 + RM_FM_PDA_SEEDS_IDX_1_LEN_OFF], r8 - # frame.input = input - stxdw [r10 + RM_FM_INPUT_OFF], r1 - # syscall.seeds = &frame.pda_seeds - mov64 r1, r10 - add64 r1, RM_FM_PDA_SEEDS_OFF - # syscall.program_id = &insn.program_id - mov64 r3, r2 - add64 r3, REGISTER_MARKET_DATA_LEN - # syscall.seeds_len = register_misc.TRY_FIND_MARKET_PDA_SEEDS_LEN - mov64 r2, RM_MISC_TRY_FIND_MARKET_PDA_SEEDS_LEN - # syscall.program_address = &frame.pda - mov64 r4, r10 - add64 r4, RM_FM_PDA_OFF - # syscall.bump_seed = &frame.bump - mov64 r5, r10 - add64 r5, RM_FM_BUMP_OFF - call sol_try_find_program_address - # input = frame.input - ldxdw r6, [r10 + RM_FM_INPUT_OFF] - # if input.market.pubkey != frame.market_pda - # return ErrorCode::InvalidMarketPubkey - ldxdw r7, [r6 + IB_MARKET_PUBKEY_CHUNK_0_OFF] - ldxdw r8, [r10 + RM_FM_PDA_CHUNK_0_OFF] - jne r7, r8, e_invalid_market_pubkey - ldxdw r7, [r6 + IB_MARKET_PUBKEY_CHUNK_1_OFF] - ldxdw r8, [r10 + RM_FM_PDA_CHUNK_1_OFF] - jne r7, r8, e_invalid_market_pubkey - ldxdw r7, [r6 + IB_MARKET_PUBKEY_CHUNK_2_OFF] - ldxdw r8, [r10 + RM_FM_PDA_CHUNK_2_OFF] - jne r7, r8, e_invalid_market_pubkey - ldxdw r7, [r6 + IB_MARKET_PUBKEY_CHUNK_3_OFF] - ldxdw r8, [r10 + RM_FM_PDA_CHUNK_3_OFF] - jne r7, r8, e_invalid_market_pubkey - # frame.pda_seeds.idx_2.addr = &frame.bump - stxdw [r10 + RM_FM_PDA_SEEDS_IDX_2_ADDR_OFF], r5 - # frame.pda_seeds.idx_2.len = u8.size - mov64 r7, SIZE_OF_U8 - stxdw [r10 + RM_FM_PDA_SEEDS_IDX_2_LEN_OFF], r7 - # frame.create_account_data.owner = syscall.program_id - ldxdw r7, [r3 + PUBKEY_CHUNK_0_OFF] - stxdw [r10 + RM_FM_CREATE_ACCT_OWNER_CHUNK_0_UOFF], r7 - ldxdw r7, [r3 + PUBKEY_CHUNK_1_OFF] - stxdw [r10 + RM_FM_CREATE_ACCT_OWNER_CHUNK_1_UOFF], r7 - ldxdw r7, [r3 + PUBKEY_CHUNK_2_OFF] - stxdw [r10 + RM_FM_CREATE_ACCT_OWNER_CHUNK_2_UOFF], r7 - ldxdw r7, [r3 + PUBKEY_CHUNK_3_OFF] - stxdw [r10 + RM_FM_CREATE_ACCT_OWNER_CHUNK_3_UOFF], r7 # if acct.duplicate != account.NON_DUP_MARKER # return ErrorCode::SystemProgramIsDuplicate ldxb r7, [r9 + ACCT_DUPLICATE_OFF] @@ -351,16 +289,13 @@ register_market: # (1 CU) replaces lddw (2 CUs). mov32 r8, PUBKEY_RENT_CHUNK_3_LO jne r7, r8, e_invalid_rent_sysvar_pubkey - # frame.create_account_data.space = MarketHeader.size - mov64 r7, SIZE_OF_MARKET_HEADER - stxdw [r10 + RM_FM_CREATE_ACCT_SPACE_UOFF], r7 - # acct_size = MarketHeader.size + account.STORAGE_OVERHEAD - add64 r7, ACCT_STORAGE_OVERHEAD - # lamports_per_byte = acct.data.lamports_per_byte - ldxdw r8, [r9 + ACCT_DATA_OFF] - # frame.create_account_data.lamports = acct_size * lamports_per_byte - mul64 r7, r8 - stxdw [r10 + RM_FM_CREATE_ACCT_LAMPORTS_UOFF], r7 + # INIT-MARKET-PDA(input, insn, acct, frame) + ja init_market_pda +init_market_pda_return: + # input = frame.input + ldxdw r8, [r10 + RM_FM_INPUT_OFF] + # input_shifted = frame.input_shifted + ldxdw r6, [r10 + RM_FM_INPUT_SHIFTED_OFF] # rent_sysvar_padded_data_len = acct.padded_data_len ldxdw r7, [r9 + ACCT_DATA_LEN_OFF] add64 r7, DATA_LEN_MAX_PAD @@ -368,80 +303,6 @@ register_market: # acct += rent_sysvar_padded_data_len + EmptyAccount.size add64 r9, r7 add64 r9, SIZE_OF_EMPTY_ACCOUNT - # frame.cpi[0].info.is_signer = true - # frame.cpi[0].info.is_writable = true - sth [r10 + RM_FM_CPI_IDX_0_ACCT_INFO_IS_SIGNER_UOFF], CPI_WRITABLE_SIGNER - # frame.cpi[0].meta.is_writable = true - # frame.cpi[0].meta.is_signer = true - sth [r10 + RM_FM_CPI_IDX_0_ACCT_META_IS_WRITABLE_UOFF], CPI_WRITABLE_SIGNER - # frame.cpi[1].info.is_signer = true - # frame.cpi[1].info.is_writable = true - sth [r10 + RM_FM_CPI_IDX_1_ACCT_INFO_IS_SIGNER_UOFF], CPI_WRITABLE_SIGNER - # frame.cpi[1].meta.is_writable = true - # frame.cpi[1].meta.is_signer = true - sth [r10 + RM_FM_CPI_IDX_1_ACCT_META_IS_WRITABLE_UOFF], CPI_WRITABLE_SIGNER - # frame.cpi[0].meta.pubkey = &input.user.address - # frame.cpi[0].info.key = &input.user.address - add64 r6, IB_USER_PUBKEY_OFF - 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 - 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 - 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 - 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 - 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 - 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 - 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 - # frame.signers_seeds.len = frame.PDA_SEEDS_N_SEEDS - mov64 r7, RM_FM_PDA_SEEDS_N_SEEDS - stxdw [r10 + RM_FM_SIGNERS_SEEDS_LEN_UOFF], r7 - # frame.sol_instruction.data = &frame.create_account_data - mov64 r7, r10 - add64 r7, RM_FM_CREATE_ACCT_DATA_OFF - stxdw [r10 + RM_FM_SOL_INSN_DATA_UOFF], r7 - # frame.sol_instruction.accounts = &frame.cpi.account_metas - add64 r7, RM_FM_CREATE_ACCT_DATA_TO_CPI_ACCT_METAS_REL_OFF_IMM - stxdw [r10 + RM_FM_SOL_INSN_ACCOUNTS_UOFF], r7 - # frame.sol_instruction.account_len = register_misc.CREATE_ACCOUNT_N_ACCOUNTS - mov64 r7, RM_MISC_CREATE_ACCOUNT_N_ACCOUNTS - stxdw [r10 + RM_FM_SOL_INSN_ACCOUNT_LEN_UOFF], r7 - # frame.sol_instruction.data_len = CreateAccountData.size - mov64 r7, SIZE_OF_CREATE_ACCOUNT_DATA - stxdw [r10 + RM_FM_SOL_INSN_DATA_LEN_UOFF], r7 - # syscall.instruction = &frame.sol_instruction (r1 from pda_seeds) - add64 r1, RM_FM_PDA_SEEDS_TO_SOL_INSN_REL_OFF_IMM - # syscall.account_infos = &frame.cpi.account_infos - mov64 r2, r10 - add64 r2, RM_FM_CPI_SOL_ACCT_INFO_OFF - # syscall.account_infos_len = register_misc.CREATE_ACCOUNT_N_ACCOUNTS - mov64 r3, RM_MISC_CREATE_ACCOUNT_N_ACCOUNTS - # syscall.seeds = &frame.signers_seeds (r4 from pda) - add64 r4, RM_FM_PDA_TO_SIGNERS_SEEDS_REL_OFF_IMM - # syscall.seeds_len = register_misc.N_PDA_SIGNERS - mov64 r5, RM_MISC_N_PDA_SIGNERS - call sol_invoke_signed_c - # input = frame.input - ldxdw r8, [r10 + RM_FM_INPUT_OFF] - # input_shifted = frame.input_shifted - ldxdw r6, [r10 + RM_FM_INPUT_SHIFTED_OFF] # if acct.duplicate != account.NON_DUP_MARKER # return ErrorCode::BaseTokenProgramIsDuplicate ldxb r7, [r9 + ACCT_DUPLICATE_OFF] diff --git a/tests/tests/cases/register_market.rs b/tests/tests/cases/register_market.rs index c0ec192..9e364a8 100644 --- a/tests/tests/cases/register_market.rs +++ b/tests/tests/cases/register_market.rs @@ -23,10 +23,6 @@ test_cases! { MarketHasData, BaseMintIsDuplicate, QuoteMintIsDuplicate, - InvalidMarketPubkeyChunk0, - InvalidMarketPubkeyChunk1, - InvalidMarketPubkeyChunk2, - InvalidMarketPubkeyChunk3, SystemProgramIsDuplicate, InvalidSystemProgramPubkeyChunk0, InvalidSystemProgramPubkeyChunk1, @@ -38,6 +34,10 @@ test_cases! { InvalidRentSysvarPubkeyChunk2, InvalidRentSysvarPubkeyChunk3, InvalidRentSysvarPubkeyChunk3Hi, + InvalidMarketPubkeyChunk0, + InvalidMarketPubkeyChunk1, + InvalidMarketPubkeyChunk2, + InvalidMarketPubkeyChunk3, BaseTokenProgramIsDuplicate, BaseTokenProgramNotBaseMintOwnerChunk0, BaseTokenProgramNotBaseMintOwnerChunk1, @@ -139,7 +139,7 @@ fn pda_mismatch_accounts( Vec, Vec<(Pubkey, Account)>, ) { - let (mut keys, accounts) = default_accounts(); + let (mut keys, mut accounts) = default_accounts(); let (base_key, quote_key) = find_pda_seed_pair(&setup.program_id); keys[RegisterMarketAccounts::BaseMint as usize] = base_key; keys[RegisterMarketAccounts::QuoteMint as usize] = quote_key; @@ -149,6 +149,14 @@ fn pda_mismatch_accounts( let offset = corrupt_chunk * 8; pda.as_mut()[offset] ^= 0xFF; keys[RegisterMarketAccounts::Market as usize] = pda; + let (system_program_pubkey, system_program_account) = + program::keyed_account_for_system_program(); + keys[RegisterMarketAccounts::SystemProgram as usize] = system_program_pubkey; + accounts[RegisterMarketAccounts::SystemProgram as usize] = system_program_account; + let (rent_sysvar_pubkey, rent_sysvar_account) = + setup.mollusk.sysvars.keyed_account_for_rent_sysvar(); + keys[RegisterMarketAccounts::RentSysvar as usize] = rent_sysvar_pubkey; + accounts[RegisterMarketAccounts::RentSysvar as usize] = rent_sysvar_account; into_metas_and_accounts(keys, accounts) } @@ -416,50 +424,6 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET - Self::InvalidMarketPubkeyChunk0 => { - let (metas, accounts) = pda_mismatch_accounts(setup, 0); - check_custom( - setup, - insn, - metas, - accounts, - Some(ErrorCode::InvalidMarketPubkey), - ) - } - // Verifies: REGISTER-MARKET - Self::InvalidMarketPubkeyChunk1 => { - let (metas, accounts) = pda_mismatch_accounts(setup, 1); - check_custom( - setup, - insn, - metas, - accounts, - Some(ErrorCode::InvalidMarketPubkey), - ) - } - // Verifies: REGISTER-MARKET - Self::InvalidMarketPubkeyChunk2 => { - let (metas, accounts) = pda_mismatch_accounts(setup, 2); - check_custom( - setup, - insn, - metas, - accounts, - Some(ErrorCode::InvalidMarketPubkey), - ) - } - // Verifies: REGISTER-MARKET - Self::InvalidMarketPubkeyChunk3 => { - let (metas, accounts) = pda_mismatch_accounts(setup, 3); - check_custom( - setup, - insn, - metas, - accounts, - Some(ErrorCode::InvalidMarketPubkey), - ) - } - // Verifies: REGISTER-MARKET Self::SystemProgramIsDuplicate => { let (mut keys, accounts) = default_accounts(); let (base_key, quote_key) = find_pda_seed_pair(&setup.program_id); @@ -609,7 +573,52 @@ impl TestCase for Case { Some(ErrorCode::InvalidRentSysvarPubkey), ) } + // Verifies: INIT-MARKET-PDA + Self::InvalidMarketPubkeyChunk0 => { + let (metas, accounts) = pda_mismatch_accounts(setup, 0); + check_custom( + setup, + insn, + metas, + accounts, + Some(ErrorCode::InvalidMarketPubkey), + ) + } + // Verifies: INIT-MARKET-PDA + Self::InvalidMarketPubkeyChunk1 => { + let (metas, accounts) = pda_mismatch_accounts(setup, 1); + check_custom( + setup, + insn, + metas, + accounts, + Some(ErrorCode::InvalidMarketPubkey), + ) + } + // Verifies: INIT-MARKET-PDA + Self::InvalidMarketPubkeyChunk2 => { + let (metas, accounts) = pda_mismatch_accounts(setup, 2); + check_custom( + setup, + insn, + metas, + accounts, + Some(ErrorCode::InvalidMarketPubkey), + ) + } + // Verifies: INIT-MARKET-PDA + Self::InvalidMarketPubkeyChunk3 => { + let (metas, accounts) = pda_mismatch_accounts(setup, 3); + check_custom( + setup, + insn, + metas, + accounts, + Some(ErrorCode::InvalidMarketPubkey), + ) + } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::BaseTokenProgramIsDuplicate => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let (mut keys, accounts) = @@ -627,6 +636,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::BaseTokenProgramNotBaseMintOwnerChunk0 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let (mut keys, accounts) = @@ -644,6 +654,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::BaseTokenProgramNotBaseMintOwnerChunk1 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let (mut keys, accounts) = @@ -661,6 +672,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::BaseTokenProgramNotBaseMintOwnerChunk2 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let (mut keys, accounts) = @@ -678,6 +690,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::BaseTokenProgramNotBaseMintOwnerChunk3 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let (mut keys, accounts) = @@ -695,6 +708,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::BaseTokenProgramNotTokenProgramChunk0 => { let mut bad_program = Pubkey::from(TOKEN_PROGRAM_ID); bad_program.as_mut()[CHUNK_0_OFF as usize] ^= 0xFF; @@ -710,6 +724,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::BaseTokenProgramNotTokenProgramChunk1 => { let mut bad_program = Pubkey::from(TOKEN_PROGRAM_ID); bad_program.as_mut()[CHUNK_1_OFF as usize] ^= 0xFF; @@ -725,6 +740,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::BaseTokenProgramNotTokenProgramChunk2 => { let mut bad_program = Pubkey::from(TOKEN_PROGRAM_ID); bad_program.as_mut()[CHUNK_2_OFF as usize] ^= 0xFF; @@ -740,6 +756,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::BaseTokenProgramNotTokenProgramChunk3 => { let mut bad_program = Pubkey::from(TOKEN_PROGRAM_ID); bad_program.as_mut()[CHUNK_3_OFF as usize] ^= 0xFF; @@ -755,6 +772,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::NonDupQuoteTokenProgramNotQuoteMintOwnerChunk0 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let token_2022_id = Pubkey::from(TOKEN_2022_PROGRAM_ID); @@ -774,6 +792,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::NonDupQuoteTokenProgramNotQuoteMintOwnerChunk1 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let token_2022_id = Pubkey::from(TOKEN_2022_PROGRAM_ID); @@ -792,6 +811,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::NonDupQuoteTokenProgramNotQuoteMintOwnerChunk2 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let token_2022_id = Pubkey::from(TOKEN_2022_PROGRAM_ID); @@ -810,6 +830,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::NonDupQuoteTokenProgramNotQuoteMintOwnerChunk3 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let token_2022_id = Pubkey::from(TOKEN_2022_PROGRAM_ID); @@ -828,6 +849,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::QuoteTokenProgramNotTokenProgramChunk0 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let mut bad_program = Pubkey::from(TOKEN_PROGRAM_ID); @@ -844,6 +866,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::QuoteTokenProgramNotTokenProgramChunk1 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let mut bad_program = Pubkey::from(TOKEN_PROGRAM_ID); @@ -860,6 +883,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::QuoteTokenProgramNotTokenProgramChunk2 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let mut bad_program = Pubkey::from(TOKEN_PROGRAM_ID); @@ -876,6 +900,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::QuoteTokenProgramNotTokenProgramChunk3 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let mut bad_program = Pubkey::from(TOKEN_PROGRAM_ID); @@ -892,6 +917,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::InvalidQuoteTokenProgramDuplicateChunk0 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let (mut keys, accounts) = @@ -908,6 +934,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::InvalidQuoteTokenProgramDuplicateChunk1 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let (mut keys, accounts) = @@ -924,6 +951,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::InvalidQuoteTokenProgramDuplicateChunk2 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let (mut keys, accounts) = @@ -940,6 +968,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::InvalidQuoteTokenProgramDuplicateChunk3 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let (mut keys, accounts) = @@ -956,6 +985,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::DupQuoteTokenProgramNotQuoteMintOwnerChunk0 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let token_2022_id = Pubkey::from(TOKEN_2022_PROGRAM_ID); @@ -976,6 +1006,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::DupQuoteTokenProgramNotQuoteMintOwnerChunk1 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let mut bad_owner = token_program_id; @@ -994,6 +1025,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::DupQuoteTokenProgramNotQuoteMintOwnerChunk2 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let mut bad_owner = token_program_id; @@ -1012,6 +1044,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA Self::DupQuoteTokenProgramNotQuoteMintOwnerChunk3 => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); let mut bad_owner = token_program_id; @@ -1030,6 +1063,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::InvalidBaseVaultPubkeyChunk0 => { let (metas, accounts) = base_vault_mismatch_accounts(setup, CHUNK_0_OFF as usize); @@ -1042,6 +1076,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::InvalidBaseVaultPubkeyChunk1 => { let (metas, accounts) = base_vault_mismatch_accounts(setup, CHUNK_1_OFF as usize); @@ -1054,6 +1089,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::InvalidBaseVaultPubkeyChunk2 => { let (metas, accounts) = base_vault_mismatch_accounts(setup, CHUNK_2_OFF as usize); @@ -1066,6 +1102,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::InvalidBaseVaultPubkeyChunk3 => { let (metas, accounts) = base_vault_mismatch_accounts(setup, CHUNK_3_OFF as usize); @@ -1078,6 +1115,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::InvalidQuoteVaultPubkeyDupChunk0 => { let (metas, accounts) = @@ -1091,6 +1129,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::InvalidQuoteVaultPubkeyDupChunk1 => { let (metas, accounts) = @@ -1104,6 +1143,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::InvalidQuoteVaultPubkeyDupChunk2 => { let (metas, accounts) = @@ -1117,6 +1157,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::InvalidQuoteVaultPubkeyDupChunk3 => { let (metas, accounts) = @@ -1130,6 +1171,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::InvalidQuoteVaultPubkeyNonDupChunk0 => { let (metas, accounts) = @@ -1143,6 +1185,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::InvalidQuoteVaultPubkeyNonDupChunk1 => { let (metas, accounts) = @@ -1156,6 +1199,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::InvalidQuoteVaultPubkeyNonDupChunk2 => { let (metas, accounts) = @@ -1169,6 +1213,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::InvalidQuoteVaultPubkeyNonDupChunk3 => { let (metas, accounts) = @@ -1182,6 +1227,7 @@ impl TestCase for Case { ) } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::CreateAccountHappyPathQuoteDup => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); @@ -1233,6 +1279,7 @@ impl TestCase for Case { } } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::CreateAccountHappyPathQuoteNonDup => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID); @@ -1284,6 +1331,7 @@ impl TestCase for Case { } } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::CreateAccountHappyPathToken2022QuoteDup => { let token_2022_id = Pubkey::from(TOKEN_2022_PROGRAM_ID); @@ -1334,6 +1382,7 @@ impl TestCase for Case { } } // Verifies: REGISTER-MARKET + // Verifies: INIT-MARKET-PDA // Verifies: INIT-VAULT Self::CreateAccountHappyPathToken2022QuoteNonDup => { let token_program_id = Pubkey::from(TOKEN_PROGRAM_ID);