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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions docs/algorithms/INIT-MARKET-PDA.tex
Original file line number Diff line number Diff line change
@@ -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}
77 changes: 7 additions & 70 deletions docs/algorithms/REGISTER-MARKET.tex
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand All @@ -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}
Expand Down
8 changes: 7 additions & 1 deletion docs/src/program/markets.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,13 @@ The instruction requires the following accounts:

<Algorithm tex="REGISTER-MARKET" asm="market/register"/>

## Vault initialization
## Helpers

### Market PDA initialization

<Algorithm tex="INIT-MARKET-PDA" asm="market/init_market_pda"/>

### Vault initialization

<Algorithm tex="INIT-VAULT" asm="market/init_vault"/>

Expand Down
4 changes: 0 additions & 4 deletions interface/src/market.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions program/src/dropset/dropset.s
Original file line number Diff line number Diff line change
Expand Up @@ -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"
143 changes: 143 additions & 0 deletions program/src/dropset/market/init_market_pda.s
Original file line number Diff line number Diff line change
@@ -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
Loading
Loading