From 66afb1850e088c40a85f0a5dd9ec6d73f34a2aa3 Mon Sep 17 00:00:00 2001 From: Ricardo Guilherme Schmidt <3esmit@gmail.com> Date: Fri, 26 Jun 2026 16:55:23 -0300 Subject: [PATCH] fix(idl): align LEZ account metadata Mark unconditional signer, init, and mutable accounts in guest entrypoints. Regenerate IDL artifacts for token, ATA, stablecoin, TWAP oracle, and AMM. --- artifacts/amm-idl.json | 112 +++++++++--------- artifacts/ata-idl.json | 16 +-- artifacts/stablecoin-idl.json | 32 ++--- artifacts/token-idl.json | 64 +++++----- artifacts/twap_oracle-idl.json | 26 ++-- programs/amm/methods/guest/src/bin/amm.rs | 51 ++++++++ programs/ata/methods/guest/src/bin/ata.rs | 8 ++ .../methods/guest/src/bin/stablecoin.rs | 12 ++ programs/token/methods/guest/src/bin/token.rs | 14 +++ .../methods/guest/src/bin/twap_oracle.rs | 10 ++ 10 files changed, 220 insertions(+), 125 deletions(-) diff --git a/artifacts/amm-idl.json b/artifacts/amm-idl.json index 0e8a8f3..a159717 100644 --- a/artifacts/amm-idl.json +++ b/artifacts/amm-idl.json @@ -7,9 +7,9 @@ "accounts": [ { "name": "config", - "writable": false, + "writable": true, "signer": false, - "init": false + "init": true } ], "args": [ @@ -32,14 +32,14 @@ "accounts": [ { "name": "config", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "authority", "writable": false, - "signer": false, + "signer": true, "init": false } ], @@ -87,9 +87,9 @@ }, { "name": "price_observations", - "writable": false, + "writable": true, "signer": false, - "init": false + "init": true }, { "name": "clock", @@ -122,9 +122,9 @@ }, { "name": "oracle_price_account", - "writable": false, + "writable": true, "signer": false, - "init": false + "init": true }, { "name": "clock", @@ -151,57 +151,57 @@ }, { "name": "pool", - "writable": false, + "writable": true, "signer": false, - "init": false + "init": true }, { "name": "vault_a", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "vault_b", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "pool_definition_lp", - "writable": false, + "writable": true, "signer": false, - "init": false + "init": true }, { "name": "lp_lock_holding", - "writable": false, + "writable": true, "signer": false, - "init": false + "init": true }, { "name": "user_holding_a", - "writable": false, - "signer": false, + "writable": true, + "signer": true, "init": false }, { "name": "user_holding_b", - "writable": false, - "signer": false, + "writable": true, + "signer": true, "init": false }, { "name": "user_holding_lp", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "current_tick_account", - "writable": false, + "writable": true, "signer": false, - "init": false + "init": true }, { "name": "clock", @@ -240,49 +240,49 @@ }, { "name": "pool", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "vault_a", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "vault_b", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "pool_definition_lp", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "user_holding_a", - "writable": false, - "signer": false, + "writable": true, + "signer": true, "init": false }, { "name": "user_holding_b", - "writable": false, - "signer": false, + "writable": true, + "signer": true, "init": false }, { "name": "user_holding_lp", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "current_tick_account", - "writable": false, + "writable": true, "signer": false, "init": false }, @@ -323,49 +323,49 @@ }, { "name": "pool", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "vault_a", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "vault_b", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "pool_definition_lp", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "user_holding_a", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "user_holding_b", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "user_holding_lp", - "writable": false, - "signer": false, + "writable": true, + "signer": true, "init": false }, { "name": "current_tick_account", - "writable": false, + "writable": true, "signer": false, "init": false }, @@ -406,37 +406,37 @@ }, { "name": "pool", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "vault_a", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "vault_b", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "user_holding_a", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "user_holding_b", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "current_tick_account", - "writable": false, + "writable": true, "signer": false, "init": false }, @@ -477,37 +477,37 @@ }, { "name": "pool", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "vault_a", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "vault_b", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "user_holding_a", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "user_holding_b", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "current_tick_account", - "writable": false, + "writable": true, "signer": false, "init": false }, @@ -548,7 +548,7 @@ }, { "name": "pool", - "writable": false, + "writable": true, "signer": false, "init": false }, @@ -566,7 +566,7 @@ }, { "name": "current_tick_account", - "writable": false, + "writable": true, "signer": false, "init": false }, diff --git a/artifacts/ata-idl.json b/artifacts/ata-idl.json index 11e99cb..1222abe 100644 --- a/artifacts/ata-idl.json +++ b/artifacts/ata-idl.json @@ -7,7 +7,7 @@ "accounts": [ { "name": "owner", - "writable": false, + "writable": true, "signer": false, "init": false }, @@ -19,7 +19,7 @@ }, { "name": "ata_account", - "writable": false, + "writable": true, "signer": false, "init": false } @@ -37,18 +37,18 @@ { "name": "owner", "writable": false, - "signer": false, + "signer": true, "init": false }, { "name": "sender_ata", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "recipient", - "writable": false, + "writable": true, "signer": false, "init": false } @@ -70,18 +70,18 @@ { "name": "owner", "writable": false, - "signer": false, + "signer": true, "init": false }, { "name": "holder_ata", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "token_definition", - "writable": false, + "writable": true, "signer": false, "init": false } diff --git a/artifacts/stablecoin-idl.json b/artifacts/stablecoin-idl.json index 1c3d9e8..2488061 100644 --- a/artifacts/stablecoin-idl.json +++ b/artifacts/stablecoin-idl.json @@ -8,25 +8,25 @@ { "name": "owner", "writable": false, - "signer": false, + "signer": true, "init": false }, { "name": "position", - "writable": false, + "writable": true, "signer": false, - "init": false + "init": true }, { "name": "vault", - "writable": false, + "writable": true, "signer": false, - "init": false + "init": true }, { "name": "user_holding", - "writable": false, - "signer": false, + "writable": true, + "signer": true, "init": false }, { @@ -49,24 +49,24 @@ { "name": "owner", "writable": false, - "signer": false, + "signer": true, "init": false }, { "name": "position", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "vault", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "destination", - "writable": false, + "writable": true, "signer": false, "init": false } @@ -84,25 +84,25 @@ { "name": "owner", "writable": false, - "signer": false, + "signer": true, "init": false }, { "name": "position", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "stablecoin_definition", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "user_stablecoin_holding", - "writable": false, - "signer": false, + "writable": true, + "signer": true, "init": false } ], diff --git a/artifacts/token-idl.json b/artifacts/token-idl.json index 73c5771..290e832 100644 --- a/artifacts/token-idl.json +++ b/artifacts/token-idl.json @@ -7,13 +7,13 @@ "accounts": [ { "name": "sender", - "writable": false, - "signer": false, + "writable": true, + "signer": true, "init": false }, { "name": "recipient", - "writable": false, + "writable": true, "signer": false, "init": false } @@ -30,15 +30,15 @@ "accounts": [ { "name": "definition_target_account", - "writable": false, - "signer": false, - "init": false + "writable": true, + "signer": true, + "init": true }, { "name": "holding_target_account", - "writable": false, - "signer": false, - "init": false + "writable": true, + "signer": true, + "init": true } ], "args": [ @@ -57,21 +57,21 @@ "accounts": [ { "name": "definition_target_account", - "writable": false, - "signer": false, - "init": false + "writable": true, + "signer": true, + "init": true }, { "name": "holding_target_account", - "writable": false, - "signer": false, - "init": false + "writable": true, + "signer": true, + "init": true }, { "name": "metadata_target_account", - "writable": false, - "signer": false, - "init": false + "writable": true, + "signer": true, + "init": true } ], "args": [ @@ -100,9 +100,9 @@ }, { "name": "account_to_initialize", - "writable": false, - "signer": false, - "init": false + "writable": true, + "signer": true, + "init": true } ], "args": [] @@ -112,14 +112,14 @@ "accounts": [ { "name": "definition_account", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "user_holding_account", - "writable": false, - "signer": false, + "writable": true, + "signer": true, "init": false } ], @@ -135,13 +135,13 @@ "accounts": [ { "name": "definition_account", - "writable": false, - "signer": false, + "writable": true, + "signer": true, "init": false }, { "name": "user_holding_account", - "writable": false, + "writable": true, "signer": false, "init": false } @@ -158,15 +158,15 @@ "accounts": [ { "name": "master_account", - "writable": false, - "signer": false, + "writable": true, + "signer": true, "init": false }, { "name": "printed_account", - "writable": false, - "signer": false, - "init": false + "writable": true, + "signer": true, + "init": true } ], "args": [] diff --git a/artifacts/twap_oracle-idl.json b/artifacts/twap_oracle-idl.json index 51bc2d4..ef80f01 100644 --- a/artifacts/twap_oracle-idl.json +++ b/artifacts/twap_oracle-idl.json @@ -7,14 +7,14 @@ "accounts": [ { "name": "price_observations", - "writable": false, + "writable": true, "signer": false, - "init": false + "init": true }, { "name": "price_source", "writable": false, - "signer": false, + "signer": true, "init": false }, { @@ -40,14 +40,14 @@ "accounts": [ { "name": "oracle_price_account", - "writable": false, + "writable": true, "signer": false, - "init": false + "init": true }, { "name": "price_source", "writable": false, - "signer": false, + "signer": true, "init": false }, { @@ -81,14 +81,14 @@ "accounts": [ { "name": "current_tick_account", - "writable": false, + "writable": true, "signer": false, - "init": false + "init": true }, { "name": "price_source", "writable": false, - "signer": false, + "signer": true, "init": false }, { @@ -116,7 +116,7 @@ }, { "name": "oracle_price_account", - "writable": false, + "writable": true, "signer": false, "init": false }, @@ -149,7 +149,7 @@ "accounts": [ { "name": "price_observations", - "writable": false, + "writable": true, "signer": false, "init": false }, @@ -182,14 +182,14 @@ "accounts": [ { "name": "current_tick_account", - "writable": false, + "writable": true, "signer": false, "init": false }, { "name": "price_source", "writable": false, - "signer": false, + "signer": true, "init": false }, { diff --git a/programs/amm/methods/guest/src/bin/amm.rs b/programs/amm/methods/guest/src/bin/amm.rs index 5669731..f520899 100644 --- a/programs/amm/methods/guest/src/bin/amm.rs +++ b/programs/amm/methods/guest/src/bin/amm.rs @@ -1,4 +1,8 @@ #![cfg_attr(not(test), no_main)] +#![allow( + clippy::cloned_ref_to_slice_refs, + reason = "SPEL macro emits cloned validation slices for one-account instructions" +)] use std::num::NonZeroU128; @@ -27,6 +31,7 @@ mod amm { #[instruction] pub fn initialize( ctx: ProgramContext, + #[account(init)] config: AccountWithMetadata, token_program_id: ProgramId, twap_oracle_program_id: ProgramId, @@ -50,7 +55,9 @@ mod amm { #[instruction] pub fn update_config( ctx: ProgramContext, + #[account(mut)] config: AccountWithMetadata, + #[account(signer)] authority: AccountWithMetadata, token_program_id: Option, twap_oracle_program_id: Option, @@ -83,6 +90,7 @@ mod amm { config: AccountWithMetadata, pool: AccountWithMetadata, current_tick_account: AccountWithMetadata, + #[account(init)] price_observations: AccountWithMetadata, clock: AccountWithMetadata, window_duration: u64, @@ -114,6 +122,7 @@ mod amm { ctx: ProgramContext, config: AccountWithMetadata, pool: AccountWithMetadata, + #[account(init)] oracle_price_account: AccountWithMetadata, clock: AccountWithMetadata, window_duration: u64, @@ -140,14 +149,23 @@ mod amm { pub fn new_definition( ctx: ProgramContext, config: AccountWithMetadata, + #[account(init)] pool: AccountWithMetadata, + #[account(mut)] vault_a: AccountWithMetadata, + #[account(mut)] vault_b: AccountWithMetadata, + #[account(init)] pool_definition_lp: AccountWithMetadata, + #[account(init)] lp_lock_holding: AccountWithMetadata, + #[account(mut, signer)] user_holding_a: AccountWithMetadata, + #[account(mut, signer)] user_holding_b: AccountWithMetadata, + #[account(mut)] user_holding_lp: AccountWithMetadata, + #[account(init)] current_tick_account: AccountWithMetadata, clock: AccountWithMetadata, token_a_amount: u128, @@ -185,13 +203,21 @@ mod amm { pub fn add_liquidity( ctx: ProgramContext, config: AccountWithMetadata, + #[account(mut)] pool: AccountWithMetadata, + #[account(mut)] vault_a: AccountWithMetadata, + #[account(mut)] vault_b: AccountWithMetadata, + #[account(mut)] pool_definition_lp: AccountWithMetadata, + #[account(mut, signer)] user_holding_a: AccountWithMetadata, + #[account(mut, signer)] user_holding_b: AccountWithMetadata, + #[account(mut)] user_holding_lp: AccountWithMetadata, + #[account(mut)] current_tick_account: AccountWithMetadata, clock: AccountWithMetadata, min_amount_liquidity: u128, @@ -228,13 +254,21 @@ mod amm { pub fn remove_liquidity( ctx: ProgramContext, config: AccountWithMetadata, + #[account(mut)] pool: AccountWithMetadata, + #[account(mut)] vault_a: AccountWithMetadata, + #[account(mut)] vault_b: AccountWithMetadata, + #[account(mut)] pool_definition_lp: AccountWithMetadata, + #[account(mut)] user_holding_a: AccountWithMetadata, + #[account(mut)] user_holding_b: AccountWithMetadata, + #[account(mut, signer)] user_holding_lp: AccountWithMetadata, + #[account(mut)] current_tick_account: AccountWithMetadata, clock: AccountWithMetadata, remove_liquidity_amount: u128, @@ -272,11 +306,17 @@ mod amm { pub fn swap_exact_input( ctx: ProgramContext, config: AccountWithMetadata, + #[account(mut)] pool: AccountWithMetadata, + #[account(mut)] vault_a: AccountWithMetadata, + #[account(mut)] vault_b: AccountWithMetadata, + #[account(mut)] user_holding_a: AccountWithMetadata, + #[account(mut)] user_holding_b: AccountWithMetadata, + #[account(mut)] current_tick_account: AccountWithMetadata, clock: AccountWithMetadata, swap_amount_in: u128, @@ -311,11 +351,17 @@ mod amm { pub fn swap_exact_output( ctx: ProgramContext, config: AccountWithMetadata, + #[account(mut)] pool: AccountWithMetadata, + #[account(mut)] vault_a: AccountWithMetadata, + #[account(mut)] vault_b: AccountWithMetadata, + #[account(mut)] user_holding_a: AccountWithMetadata, + #[account(mut)] user_holding_b: AccountWithMetadata, + #[account(mut)] current_tick_account: AccountWithMetadata, clock: AccountWithMetadata, exact_amount_out: u128, @@ -346,9 +392,14 @@ mod amm { pub fn sync_reserves( ctx: ProgramContext, config: AccountWithMetadata, + #[account(mut)] pool: AccountWithMetadata, + // vault_a / vault_b are only read to compute balances in + // amm_program::sync::sync_reserves (their post-states are unchanged + // clones), so they are not writable — no `mut` metadata. vault_a: AccountWithMetadata, vault_b: AccountWithMetadata, + #[account(mut)] current_tick_account: AccountWithMetadata, clock: AccountWithMetadata, ) -> SpelResult { diff --git a/programs/ata/methods/guest/src/bin/ata.rs b/programs/ata/methods/guest/src/bin/ata.rs index 43e2ef0..c24e678 100644 --- a/programs/ata/methods/guest/src/bin/ata.rs +++ b/programs/ata/methods/guest/src/bin/ata.rs @@ -22,8 +22,10 @@ mod ata { #[instruction] pub fn create( ctx: ProgramContext, + #[account(mut)] owner: AccountWithMetadata, token_definition: AccountWithMetadata, + #[account(mut)] ata_account: AccountWithMetadata, token_program_id: ProgramId, ) -> SpelResult { @@ -45,8 +47,11 @@ mod ata { #[instruction] pub fn transfer( ctx: ProgramContext, + #[account(signer)] owner: AccountWithMetadata, + #[account(mut)] sender_ata: AccountWithMetadata, + #[account(mut)] recipient: AccountWithMetadata, token_program_id: ProgramId, amount: u128, @@ -69,8 +74,11 @@ mod ata { #[instruction] pub fn burn( ctx: ProgramContext, + #[account(signer)] owner: AccountWithMetadata, + #[account(mut)] holder_ata: AccountWithMetadata, + #[account(mut)] token_definition: AccountWithMetadata, token_program_id: ProgramId, amount: u128, diff --git a/programs/stablecoin/methods/guest/src/bin/stablecoin.rs b/programs/stablecoin/methods/guest/src/bin/stablecoin.rs index f677ca3..3cd28b1 100644 --- a/programs/stablecoin/methods/guest/src/bin/stablecoin.rs +++ b/programs/stablecoin/methods/guest/src/bin/stablecoin.rs @@ -20,9 +20,13 @@ mod stablecoin { #[instruction] pub fn open_position( ctx: ProgramContext, + #[account(signer)] owner: AccountWithMetadata, + #[account(init)] position: AccountWithMetadata, + #[account(init)] vault: AccountWithMetadata, + #[account(mut, signer)] user_holding: AccountWithMetadata, token_definition: AccountWithMetadata, collateral_amount: u128, @@ -53,9 +57,13 @@ mod stablecoin { #[instruction] pub fn withdraw_collateral( ctx: ProgramContext, + #[account(signer)] owner: AccountWithMetadata, + #[account(mut)] position: AccountWithMetadata, + #[account(mut)] vault: AccountWithMetadata, + #[account(mut)] destination: AccountWithMetadata, amount: u128, ) -> SpelResult { @@ -83,9 +91,13 @@ mod stablecoin { #[instruction] pub fn repay_debt( ctx: ProgramContext, + #[account(signer)] owner: AccountWithMetadata, + #[account(mut)] position: AccountWithMetadata, + #[account(mut)] stablecoin_definition: AccountWithMetadata, + #[account(mut, signer)] user_stablecoin_holding: AccountWithMetadata, amount: u128, ) -> SpelResult { diff --git a/programs/token/methods/guest/src/bin/token.rs b/programs/token/methods/guest/src/bin/token.rs index e3955fc..4b0e350 100644 --- a/programs/token/methods/guest/src/bin/token.rs +++ b/programs/token/methods/guest/src/bin/token.rs @@ -19,7 +19,9 @@ mod token { /// Fresh public recipients must be explicitly authorized in the same transaction. #[instruction] pub fn transfer( + #[account(mut, signer)] sender: AccountWithMetadata, + #[account(mut)] recipient: AccountWithMetadata, amount_to_transfer: u128, ) -> SpelResult { @@ -34,7 +36,9 @@ mod token { /// Definition and holding targets must be uninitialized and authorized. #[instruction] pub fn new_fungible_definition( + #[account(init, signer)] definition_target_account: AccountWithMetadata, + #[account(init, signer)] holding_target_account: AccountWithMetadata, name: String, total_supply: u128, @@ -58,8 +62,11 @@ mod token { )] #[instruction] pub fn new_definition_with_metadata( + #[account(init, signer)] definition_target_account: AccountWithMetadata, + #[account(init, signer)] holding_target_account: AccountWithMetadata, + #[account(init, signer)] metadata_target_account: AccountWithMetadata, new_definition: token_core::NewTokenDefinition, metadata: Box, @@ -82,6 +89,7 @@ mod token { pub fn initialize_account( ctx: ProgramContext, definition_account: AccountWithMetadata, + #[account(init, signer)] account_to_initialize: AccountWithMetadata, ) -> SpelResult { Ok(spel_framework::SpelOutput::execute( @@ -97,7 +105,9 @@ mod token { /// Burn tokens from the holder's account. #[instruction] pub fn burn( + #[account(mut)] definition_account: AccountWithMetadata, + #[account(mut, signer)] user_holding_account: AccountWithMetadata, amount_to_burn: u128, ) -> SpelResult { @@ -113,7 +123,9 @@ mod token { #[instruction] pub fn mint( ctx: ProgramContext, + #[account(mut, signer)] definition_account: AccountWithMetadata, + #[account(mut)] user_holding_account: AccountWithMetadata, amount_to_mint: u128, ) -> SpelResult { @@ -129,7 +141,9 @@ mod token { /// The printed copy target must be uninitialized and authorized. #[instruction] pub fn print_nft( + #[account(mut, signer)] master_account: AccountWithMetadata, + #[account(init, signer)] printed_account: AccountWithMetadata, ) -> SpelResult { Ok(spel_framework::SpelOutput::execute(token_program::print_nft::print_nft( diff --git a/programs/twap_oracle/methods/guest/src/bin/twap_oracle.rs b/programs/twap_oracle/methods/guest/src/bin/twap_oracle.rs index 05b05e7..c138c78 100644 --- a/programs/twap_oracle/methods/guest/src/bin/twap_oracle.rs +++ b/programs/twap_oracle/methods/guest/src/bin/twap_oracle.rs @@ -22,7 +22,9 @@ mod twap_oracle { #[instruction] pub fn create_price_observations( ctx: ProgramContext, + #[account(init)] price_observations: AccountWithMetadata, + #[account(signer)] price_source: AccountWithMetadata, clock: AccountWithMetadata, initial_tick: i32, @@ -56,7 +58,9 @@ mod twap_oracle { #[instruction] pub fn create_oracle_price_account( ctx: ProgramContext, + #[account(init)] oracle_price_account: AccountWithMetadata, + #[account(signer)] price_source: AccountWithMetadata, clock: AccountWithMetadata, base_asset: AccountId, @@ -89,7 +93,9 @@ mod twap_oracle { #[instruction] pub fn create_current_tick_account( ctx: ProgramContext, + #[account(init)] current_tick_account: AccountWithMetadata, + #[account(signer)] price_source: AccountWithMetadata, clock: AccountWithMetadata, initial_price: u128, @@ -118,6 +124,7 @@ mod twap_oracle { pub fn publish_price( ctx: ProgramContext, price_observations: AccountWithMetadata, + #[account(mut)] oracle_price_account: AccountWithMetadata, current_tick_account: AccountWithMetadata, clock: AccountWithMetadata, @@ -145,6 +152,7 @@ mod twap_oracle { #[instruction] pub fn record_tick( ctx: ProgramContext, + #[account(mut)] price_observations: AccountWithMetadata, current_tick_account: AccountWithMetadata, clock: AccountWithMetadata, @@ -173,7 +181,9 @@ mod twap_oracle { #[instruction] pub fn update_current_tick( ctx: ProgramContext, + #[account(mut)] current_tick_account: AccountWithMetadata, + #[account(signer)] price_source: AccountWithMetadata, clock: AccountWithMetadata, price: u128,