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);