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
465 changes: 438 additions & 27 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@ pinocchio-token-2022 = {git = "https://github.com/anza-xyz/pinocchio", branch =
proc-macro2 = "1.0.106"
quote = "1.0.45"
solana-account = "3.2"
solana-program-pack = "3.1"
solana-sbpf = "0.16.0"
solana-sdk = "4.0.1"
spl-token-2022-interface = "2.1.0"
spl-token-interface = "2.0.0"
syn = {version = "2.0.117", features = ["full"]}
ureq = "3.3.0"
Expand Down
2 changes: 1 addition & 1 deletion docs/algorithms/INIT-MARKET-PDA.tex
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
\INPUT $r_{10}$ = frame
\COMMENT{Pointer to shifted input buffer for quote mint offsets.}
\REQUIRE frame.input\_shifted
\REQUIRE *frame.system\_program\_id = input.system\_program.address
\REQUIRE frame.system\_program\_id = \&input.system\_program.address
\REQUIRE frame.cpi[0].info.data\_len = \texttt{data.LEN\_ZERO}
\REQUIRE frame.cpi[1].info.data\_len = \texttt{data.LEN\_ZERO}
\ENSURE $r_9$ = acct
Expand Down
55 changes: 52 additions & 3 deletions docs/algorithms/INIT-VAULT.tex
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,28 @@
\texttt{true},
\texttt{false}
\}
\REQUIRE *frame.mint $\in$ \{
\REQUIRE frame.mint $\in$ \{
input.base\_mint,
input\_shifted.quote\_mint
\}
\REQUIRE frame.token\_program\_id
\REQUIRE frame.program\_id
\REQUIRE frame.input
\REQUIRE frame.rent
\REQUIRE frame.lamports\_per\_byte
\REQUIRE frame.pda\_seeds[0].len = \texttt{Address.size}
\REQUIRE frame.pda\_seeds[2].addr = \&frame.bump
\REQUIRE frame.pda\_seeds[2].len = \texttt{u8.size}
\REQUIRE *frame.system\_program\_id = input.system\_program.address
\REQUIRE frame.system\_program\_id = \&input.system\_program.address
\REQUIRE frame.signers\_seeds.addr = \&frame.pda\_seeds
\REQUIRE frame.signers\_seeds.len = \texttt{RegisterMarketFrame.PDA\_SEEDS\_N\_SEEDS}
\REQUIRE input.user.data\_len = \texttt{data.LEN\_ZERO}
\REQUIRE acct.data\_len = \texttt{data.LEN\_ZERO}
\REQUIRE frame.cpi[0].info.executable = \texttt{false}
\REQUIRE frame.cpi[2].info.is\_signer = \texttt{false}
\REQUIRE frame.cpi[2].info.is\_writable = \texttt{false}
\REQUIRE frame.cpi[2].meta.is\_signer = \texttt{false}
\REQUIRE frame.cpi[2].meta.is\_writable = \texttt{false}
\FUNCTION{INIT-VAULT}{acct, frame}
\STATE \CALL{Store}{frame}
\STATE \CALL{Store}{acct}
Expand Down Expand Up @@ -73,7 +78,7 @@
\texttt{token.GET\_ACCOUNT\_DATA\_SIZE\_DISC}
\STATE frame.sol\_instruction.data = \&frame.get\_account\_data\_size\_data
\STATE frame.sol\_instruction.data\_len = \texttt{u8.size}
\COMMENT{Invoke GetAccountDataSize CPI (no signers).}
\COMMENT{Invoke GetAccountDataSize CPI.}
\STATE syscall.instruction = \&frame.sol\_instruction
\STATE syscall.account\_infos = \&frame.cpi[0].info
\STATE syscall.account\_infos\_len =
Expand Down Expand Up @@ -134,6 +139,50 @@
\STATE syscall.seeds = \&frame.signers\_seeds
\STATE syscall.seeds\_len = \texttt{register\_misc.N\_PDA\_SIGNERS}
\STATE \CALL{sol-invoke-signed-c}{}
\COMMENT{Assign CPI account fields for vault.}
\STATE frame.cpi[0].meta.pubkey = \&acct.address
\STATE frame.cpi[0].info.key = \&acct.address
\STATE frame.cpi[0].info.owner = \&acct.owner
\STATE frame.cpi[0].info.lamports = \&acct.lamports
\STATE frame.cpi[0].info.data = \&acct.data
\STATE frame.cpi[0].info.data\_len = acct.data\_len
\COMMENT{Assign CPI account fields for mint.}
\STATE mint = frame.mint
\STATE frame.cpi[1].info.is\_signer = \texttt{false}
\STATE frame.cpi[1].info.is\_writable = \texttt{false}
\STATE frame.cpi[1].meta.is\_signer = \texttt{false}
\STATE frame.cpi[1].meta.is\_writable = \texttt{false}
\STATE frame.cpi[1].meta.pubkey = \&mint.address
\STATE frame.cpi[1].info.key = \&mint.address
\STATE frame.cpi[1].info.owner = \&mint.owner
\STATE frame.cpi[1].info.lamports = \&mint.lamports
\STATE frame.cpi[1].info.data = \&mint.data
\STATE frame.cpi[1].info.data\_len = mint.data\_len
\COMMENT{Assign CPI account fields for Rent sysvar.}
\STATE rent = frame.rent
\STATE frame.cpi[2].meta.pubkey = \&rent.address
\STATE frame.cpi[2].info.key = \&rent.address
\STATE frame.cpi[2].info.owner = \&rent.owner
\STATE frame.cpi[2].info.lamports = \&rent.lamports
\STATE frame.cpi[2].info.data = \&rent.data
\STATE frame.cpi[2].info.data\_len = rent.data\_len
\COMMENT{Populate SolInstruction for InitializeAccount2.}
\STATE frame.sol\_instruction.program\_id = frame.token\_program\_id
\STATE frame.sol\_instruction.accounts = \&frame.cpi.account\_metas
\STATE frame.sol\_instruction.account\_len =
\texttt{token.INITIALIZE\_ACCOUNT\_2\_N\_ACCOUNTS}
\STATE frame.initialize\_account\_2\_data.discriminant =
\texttt{token.INITIALIZE\_ACCOUNT\_2\_DISC}
\STATE frame.initialize\_account\_2\_data.proprietor = input.market.address
\STATE frame.sol\_instruction.data = \&frame.initialize\_account\_2\_data
\STATE frame.sol\_instruction.data\_len = \texttt{InitializeAccount2.size}
\COMMENT{Invoke InitializeAccount2 CPI.}
\STATE syscall.instruction = \&frame.sol\_instruction
\STATE syscall.account\_infos = \&frame.cpi.account\_infos
\STATE syscall.account\_infos\_len =
\texttt{token.INITIALIZE\_ACCOUNT\_2\_N\_ACCOUNTS}
\STATE syscall.seeds\_len = \texttt{token.INITIALIZE\_ACCOUNT\_2\_N\_SEEDS}
\STATE \CALL{sol-invoke-signed-c}{}
\ENDFUNCTION
\end{algorithmic}
\end{algorithm}
1 change: 1 addition & 0 deletions docs/algorithms/REGISTER-MARKET.tex
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
\IF{acct.address $\neq$ \texttt{pubkey.RENT}}
\RETURN \texttt{ErrorCode::InvalidRentSysvarPubkey}
\ENDIF
\STATE frame.rent = acct
\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.}
Expand Down
2 changes: 1 addition & 1 deletion docs/src/program/layout.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ emits the same set of constants with a `_UOFF` suffix instead of `_OFF`.

### Token

SPL Token constants (account size, instruction discriminators) are injected
SPL Token constants (account size, instruction discriminants) are injected
from the [`token`][token-mod] module via [`constant_group!`][bs-constant-group]:

<Include asm="common/token" collapsible/>
Expand Down
15 changes: 14 additions & 1 deletion interface/src/market.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use crate::memory::EmptyAccount;
use crate::memory::StackNode;
use crate::order::Order;
use crate::seat::Seat;
use crate::token::InitializeAccount2;
use dropset_macros::{
constant_group, cpi_accounts, frame, instruction_accounts, instruction_data, signer_seeds,
svm_data,
Expand Down Expand Up @@ -110,7 +111,7 @@ pub enum RegisterMarketAccounts {
/// CPI instruction data for CreateAccount.
pub struct CreateAccountData {
/// Zero-initialized on stack.
pub discriminator: u32,
pub discriminant: u32,
pub lamports: u64,
pub space: u64,
/// Zero-initialized on stack.
Expand Down Expand Up @@ -162,6 +163,8 @@ pub struct RegisterMarketFrame {
pub token_account_data_size: u64,
/// Pointer to mint account for vault initialization.
pub mint: *const RuntimeAccount,
/// Pointer to Rent sysvar account.
pub rent: *const RuntimeAccount,
/// Signer seeds for PDA derivation and CPI signing.
pub pda_seeds: PDASignerSeeds,
/// From `sol_try_find_program_address`.
Expand All @@ -174,6 +177,8 @@ pub struct RegisterMarketFrame {
pub get_return_data_program_id: Address,
/// CPI instruction data for CreateAccount.
pub create_account_data: CreateAccountData,
/// CPI instruction data for InitializeAccount2.
pub initialize_account_2_data: InitializeAccount2,
/// GetAccountDataSize CPI instruction data.
pub get_account_data_size_data: u8,
/// CPI accounts for CreateAccount and InitializeAccount2.
Expand Down Expand Up @@ -210,6 +215,8 @@ constant_group! {
TOKEN_ACCOUNT_DATA_SIZE = offset!(token_account_data_size),
/// Pointer to mint account for vault initialization.
MINT = offset!(mint),
/// Pointer to Rent sysvar account.
RENT = offset!(rent),
/// PDA signer seeds.
PDA_SEEDS = signer_seeds!(pda_seeds),
/// PDA address.
Expand All @@ -228,6 +235,12 @@ constant_group! {
CREATE_ACCT_SPACE = unaligned_offset!(create_account_data.space),
/// Owner field within CreateAccount instruction data.
CREATE_ACCT_OWNER = unaligned_pubkey_offsets!(create_account_data.owner),
/// InitializeAccount2 CPI instruction data.
INIT_ACCT_2_DATA = offset!(initialize_account_2_data),
/// Discriminant field within InitializeAccount2 instruction data.
INIT_ACCT_2_DISC = unaligned_offset!(initialize_account_2_data.discriminant),
/// Proprietor field within InitializeAccount2 instruction data.
INIT_ACCT_2_PROPRIETOR = unaligned_pubkey_offsets!(initialize_account_2_data.proprietor),
/// GetAccountDataSize CPI instruction data.
GET_ACCOUNT_DATA_SIZE_DATA = unaligned_offset!(get_account_data_size_data),
/// CPI accounts.
Expand Down
3 changes: 2 additions & 1 deletion interface/src/memory.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::market::{CreateAccountData, MarketHeader};
use crate::token::InitializeAccount2;
use dropset_macros::{constant_group, size_of_group, svm_data};
use pinocchio::Address;
use pinocchio::account::{MAX_PERMITTED_DATA_INCREASE, RuntimeAccount};
Expand Down Expand Up @@ -129,7 +130,7 @@ constant_group! {
// region: size_of_group_example
size_of_group! {
#[inject("common/memory")]
[u8, u64, Address, EmptyAccount, MarketHeader, CreateAccountData]
[u8, u64, Address, EmptyAccount, MarketHeader, CreateAccountData, InitializeAccount2]
}
// endregion: size_of_group_example

Expand Down
20 changes: 18 additions & 2 deletions interface/src/token.rs
Original file line number Diff line number Diff line change
@@ -1,20 +1,36 @@
use dropset_macros::constant_group;
use dropset_macros::{constant_group, svm_data};
use pinocchio::Address;
use pinocchio_token::state::TokenAccount;
// pinocchio-token does not export GetAccountDataSize yet.
use pinocchio_token_2022::instructions::GetAccountDataSize;

#[svm_data]
/// CPI instruction data for InitializeAccount2.
pub struct InitializeAccount2 {
pub discriminant: u8,
/// In this implementation, the market PDA.
pub proprietor: Address,
}

constant_group! {
#[prefix("TOKEN")]
#[inject("common/token")]
/// SPL Token constants.
token {
/// Size of a token account (SPL Token and Token 2022 base).
ACCOUNT_SIZE = immediate!(TokenAccount::LEN),
/// GetAccountDataSize instruction discriminator (Token 2022).
/// GetAccountDataSize instruction discriminant (Token 2022).
GET_ACCOUNT_DATA_SIZE_DISC = immediate!(GetAccountDataSize::DISCRIMINATOR),
/// GetAccountDataSize number of accounts.
GET_ACCOUNT_DATA_SIZE_N_ACCOUNTS = immediate!(1),
/// GetAccountDataSize number of seeds.
GET_ACCOUNT_DATA_SIZE_N_SEEDS = immediate!(0),
/// InitializeAccount2 instruction discriminant.
// Not exported by token program: https://github.com/anza-xyz/pinocchio/issues/384
INITIALIZE_ACCOUNT_2_DISC = immediate!(16),
/// InitializeAccount2 number of accounts.
INITIALIZE_ACCOUNT_2_N_ACCOUNTS = immediate!(3),
/// InitializeAccount2 number of seeds.
INITIALIZE_ACCOUNT_2_N_SEEDS = immediate!(0),
}
}
1 change: 1 addition & 0 deletions program/src/dropset/common/memory.s
Original file line number Diff line number Diff line change
Expand Up @@ -81,3 +81,4 @@
.equ SIZE_OF_EMPTY_ACCOUNT, 10336 # Size of EmptyAccount in bytes.
.equ SIZE_OF_MARKET_HEADER, 43 # Size of MarketHeader in bytes.
.equ SIZE_OF_CREATE_ACCOUNT_DATA, 56 # Size of CreateAccountData in bytes.
.equ SIZE_OF_INITIALIZE_ACCOUNT2, 33 # Size of InitializeAccount2 in bytes.
8 changes: 7 additions & 1 deletion program/src/dropset/common/token.s
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,16 @@
# -------------------------------------------------------------------------
# Size of a token account (SPL Token and Token 2022 base).
.equ TOKEN_ACCOUNT_SIZE, 165
# GetAccountDataSize instruction discriminator (Token 2022).
# GetAccountDataSize instruction discriminant (Token 2022).
.equ TOKEN_GET_ACCOUNT_DATA_SIZE_DISC, 21
# GetAccountDataSize number of accounts.
.equ TOKEN_GET_ACCOUNT_DATA_SIZE_N_ACCOUNTS, 1
# GetAccountDataSize number of seeds.
.equ TOKEN_GET_ACCOUNT_DATA_SIZE_N_SEEDS, 0
# InitializeAccount2 instruction discriminant.
.equ TOKEN_INITIALIZE_ACCOUNT_2_DISC, 16
# InitializeAccount2 number of accounts.
.equ TOKEN_INITIALIZE_ACCOUNT_2_N_ACCOUNTS, 3
# InitializeAccount2 number of seeds.
.equ TOKEN_INITIALIZE_ACCOUNT_2_N_SEEDS, 0
# -------------------------------------------------------------------------
106 changes: 106 additions & 0 deletions program/src/dropset/market/init_vault.s
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,112 @@ init_vault_create_account:
# syscall.seeds_len = register_misc.N_PDA_SIGNERS
mov64 r5, RM_MISC_N_PDA_SIGNERS
call sol_invoke_signed_c
# frame.cpi[0].meta.pubkey = &acct.address
# frame.cpi[0].info.key = &acct.address
mov64 r8, r7
add64 r8, ACCT_ADDRESS_OFF
stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_META_PUBKEY_UOFF], r8
stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_KEY_UOFF], r8
# frame.cpi[0].info.owner = &acct.owner
add64 r8, IB_ADDRESS_TO_OWNER_REL_OFF_IMM
stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_OWNER_UOFF], r8
# frame.cpi[0].info.lamports = &acct.lamports
add64 r8, IB_OWNER_TO_LAMPORTS_REL_OFF_IMM
stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_LAMPORTS_UOFF], r8
# frame.cpi[0].info.data = &acct.data
add64 r8, IB_LAMPORTS_TO_DATA_REL_OFF_IMM
stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_DATA_UOFF], r8
# frame.cpi[0].info.data_len = acct.data_len
ldxdw r8, [r7 + ACCT_DATA_LEN_OFF]
stxdw [r6 + RM_FM_CPI_IDX_0_ACCT_INFO_DATA_LEN_UOFF], r8
# mint = frame.mint
ldxdw r8, [r6 + RM_FM_MINT_OFF]
# frame.cpi[1].info.is_signer = false
# frame.cpi[1].info.is_writable = false
sth [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_IS_SIGNER_UOFF], CPI_READONLY_NON_SIGNER
# frame.cpi[1].meta.is_writable = false
# frame.cpi[1].meta.is_signer = false
sth [r6 + RM_FM_CPI_IDX_1_ACCT_META_IS_WRITABLE_UOFF], CPI_READONLY_NON_SIGNER
# frame.cpi[1].meta.pubkey = &mint.address
# frame.cpi[1].info.key = &mint.address
mov64 r9, r8
add64 r9, ACCT_ADDRESS_OFF
stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_META_PUBKEY_UOFF], r9
stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_KEY_UOFF], r9
# frame.cpi[1].info.owner = &mint.owner
add64 r9, IB_ADDRESS_TO_OWNER_REL_OFF_IMM
stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_OWNER_UOFF], r9
# frame.cpi[1].info.lamports = &mint.lamports
add64 r9, IB_OWNER_TO_LAMPORTS_REL_OFF_IMM
stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_LAMPORTS_UOFF], r9
# frame.cpi[1].info.data = &mint.data
add64 r9, IB_LAMPORTS_TO_DATA_REL_OFF_IMM
stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_DATA_UOFF], r9
# frame.cpi[1].info.data_len = mint.data_len
ldxdw r9, [r8 + ACCT_DATA_LEN_OFF]
stxdw [r6 + RM_FM_CPI_IDX_1_ACCT_INFO_DATA_LEN_UOFF], r9
# rent = frame.rent
ldxdw r8, [r6 + RM_FM_RENT_OFF]
# frame.cpi[2].meta.pubkey = &rent.address
# frame.cpi[2].info.key = &rent.address
mov64 r9, r8
add64 r9, ACCT_ADDRESS_OFF
stxdw [r6 + RM_FM_CPI_IDX_2_ACCT_META_PUBKEY_UOFF], r9
stxdw [r6 + RM_FM_CPI_IDX_2_ACCT_INFO_KEY_UOFF], r9
# frame.cpi[2].info.owner = &rent.owner
add64 r9, IB_ADDRESS_TO_OWNER_REL_OFF_IMM
stxdw [r6 + RM_FM_CPI_IDX_2_ACCT_INFO_OWNER_UOFF], r9
# frame.cpi[2].info.lamports = &rent.lamports
add64 r9, IB_OWNER_TO_LAMPORTS_REL_OFF_IMM
stxdw [r6 + RM_FM_CPI_IDX_2_ACCT_INFO_LAMPORTS_UOFF], r9
# frame.cpi[2].info.data = &rent.data
add64 r9, IB_LAMPORTS_TO_DATA_REL_OFF_IMM
stxdw [r6 + RM_FM_CPI_IDX_2_ACCT_INFO_DATA_UOFF], r9
# frame.cpi[2].info.data_len = rent.data_len
ldxdw r9, [r8 + ACCT_DATA_LEN_OFF]
stxdw [r6 + RM_FM_CPI_IDX_2_ACCT_INFO_DATA_LEN_UOFF], r9
# Populate SolInstruction for InitializeAccount2.
# frame.sol_instruction.program_id = frame.token_program_id
ldxdw r8, [r6 + RM_FM_TOKEN_PROGRAM_ID_OFF]
stxdw [r6 + RM_FM_SOL_INSN_PROGRAM_ID_UOFF], r8
# frame.sol_instruction.accounts = &frame.cpi.account_metas
mov64 r8, r6
add64 r8, RM_FM_CPI_IDX_0_ACCT_META_PUBKEY_UOFF
stxdw [r6 + RM_FM_SOL_INSN_ACCOUNTS_UOFF], r8
# frame.sol_instruction.account_len = token.INITIALIZE_ACCOUNT_2_N_ACCOUNTS
mov64 r8, TOKEN_INITIALIZE_ACCOUNT_2_N_ACCOUNTS
stxdw [r6 + RM_FM_SOL_INSN_ACCOUNT_LEN_UOFF], r8
# frame.initialize_account_2_data.discriminant = token.INITIALIZE_ACCOUNT_2_DISC
stb [r6 + RM_FM_INIT_ACCT_2_DISC_UOFF], TOKEN_INITIALIZE_ACCOUNT_2_DISC
# frame.initialize_account_2_data.proprietor = input.market.address
ldxdw r8, [r6 + RM_FM_INPUT_OFF]
add64 r8, IB_MARKET_PUBKEY_OFF
ldxdw r9, [r8 + PUBKEY_CHUNK_0_OFF]
stxdw [r6 + RM_FM_INIT_ACCT_2_PROPRIETOR_CHUNK_0_UOFF], r9
ldxdw r9, [r8 + PUBKEY_CHUNK_1_OFF]
stxdw [r6 + RM_FM_INIT_ACCT_2_PROPRIETOR_CHUNK_1_UOFF], r9
ldxdw r9, [r8 + PUBKEY_CHUNK_2_OFF]
stxdw [r6 + RM_FM_INIT_ACCT_2_PROPRIETOR_CHUNK_2_UOFF], r9
ldxdw r9, [r8 + PUBKEY_CHUNK_3_OFF]
stxdw [r6 + RM_FM_INIT_ACCT_2_PROPRIETOR_CHUNK_3_UOFF], r9
# frame.sol_instruction.data = &frame.initialize_account_2_data
mov64 r8, r6
add64 r8, RM_FM_INIT_ACCT_2_DATA_OFF
stxdw [r6 + RM_FM_SOL_INSN_DATA_UOFF], r8
# frame.sol_instruction.data_len = InitializeAccount2.size
mov64 r8, SIZE_OF_INITIALIZE_ACCOUNT2
stxdw [r6 + RM_FM_SOL_INSN_DATA_LEN_UOFF], r8
# syscall.instruction = &frame.sol_instruction
mov64 r1, r6
add64 r1, RM_FM_SOL_INSN_OFF
# syscall.account_infos = &frame.cpi.account_infos
mov64 r2, r6
add64 r2, RM_FM_CPI_SOL_ACCT_INFO_OFF
# syscall.account_infos_len = token.INITIALIZE_ACCOUNT_2_N_ACCOUNTS
mov64 r3, TOKEN_INITIALIZE_ACCOUNT_2_N_ACCOUNTS
# syscall.seeds_len = token.INITIALIZE_ACCOUNT_2_N_SEEDS
mov64 r5, TOKEN_INITIALIZE_ACCOUNT_2_N_SEEDS
call sol_invoke_signed_c
exit
init_vault_invalid_pda:
# if frame.vault_index == register_misc.VAULT_INDEX_BASE
Expand Down
Loading
Loading