refactor(twap_oracle): match instruction function order to Instruction enum

`idl-gen` emits IDL instructions in source order, and `spel` uses each
instruction's IDL position as its serde variant index. When the
`#[instruction]` function order diverges from the `twap_oracle_core::Instruction`
enum order, spel addresses the wrong instruction.

Move `update_current_tick` ahead of the TWAP-computation instruction so the
function order in twap_oracle.rs lines up with the enum variant order, and
regenerate artifacts/twap_oracle-idl.json to match.

No behavioral change — the instruction bodies are unchanged, only reordered.
This commit is contained in:
r4bbit 2026-06-28 23:07:47 +02:00
parent c8f061e4a8
commit c9fbb626ea
2 changed files with 57 additions and 57 deletions

View File

@ -105,6 +105,35 @@
} }
] ]
}, },
{
"name": "update_current_tick",
"accounts": [
{
"name": "current_tick_account",
"writable": true,
"signer": false,
"init": false
},
{
"name": "price_source",
"writable": false,
"signer": true,
"init": false
},
{
"name": "clock",
"writable": false,
"signer": false,
"init": false
}
],
"args": [
{
"name": "price",
"type": "u128"
}
]
},
{ {
"name": "publish_price", "name": "publish_price",
"accounts": [ "accounts": [
@ -176,35 +205,6 @@
"type": "u64" "type": "u64"
} }
] ]
},
{
"name": "update_current_tick",
"accounts": [
{
"name": "current_tick_account",
"writable": true,
"signer": false,
"init": false
},
{
"name": "price_source",
"writable": false,
"signer": true,
"init": false
},
{
"name": "clock",
"writable": false,
"signer": false,
"init": false
}
],
"args": [
{
"name": "price",
"type": "u128"
}
]
} }
], ],
"accounts": [ "accounts": [

View File

@ -111,6 +111,34 @@ mod twap_oracle {
Ok(spel_framework::SpelOutput::execute(post_states, vec![])) Ok(spel_framework::SpelOutput::execute(post_states, vec![]))
} }
/// Updates the tick stored in an existing current tick account.
///
/// Expected accounts:
/// 1. `current_tick_account` — initialized PDA owned by this oracle program.
/// 2. `price_source` — account the caller controls (proven via `is_authorized = true`).
/// 3. `clock` — read-only LEZ clock account.
///
/// `price` is a `Q64.64` spot price; the oracle converts it to a tick.
#[instruction]
pub fn update_current_tick(
ctx: ProgramContext,
#[account(mut)]
current_tick_account: AccountWithMetadata,
#[account(signer)]
price_source: AccountWithMetadata,
clock: AccountWithMetadata,
price: u128,
) -> SpelResult {
let post_states = twap_oracle_program::update_current_tick::update_current_tick(
current_tick_account,
price_source,
clock,
price,
ctx.self_program_id,
);
Ok(spel_framework::SpelOutput::execute(post_states, vec![]))
}
/// Computes the TWAP from the price observations ring buffer (extrapolated to `now` using the /// Computes the TWAP from the price observations ring buffer (extrapolated to `now` using the
/// current tick) and writes it to the price account. /// current tick) and writes it to the price account.
/// ///
@ -169,32 +197,4 @@ mod twap_oracle {
); );
Ok(spel_framework::SpelOutput::execute(post_states, vec![])) Ok(spel_framework::SpelOutput::execute(post_states, vec![]))
} }
/// Updates the tick stored in an existing current tick account.
///
/// Expected accounts:
/// 1. `current_tick_account` — initialized PDA owned by this oracle program.
/// 2. `price_source` — account the caller controls (proven via `is_authorized = true`).
/// 3. `clock` — read-only LEZ clock account.
///
/// `price` is a `Q64.64` spot price; the oracle converts it to a tick.
#[instruction]
pub fn update_current_tick(
ctx: ProgramContext,
#[account(mut)]
current_tick_account: AccountWithMetadata,
#[account(signer)]
price_source: AccountWithMetadata,
clock: AccountWithMetadata,
price: u128,
) -> SpelResult {
let post_states = twap_oracle_program::update_current_tick::update_current_tick(
current_tick_account,
price_source,
clock,
price,
ctx.self_program_id,
);
Ok(spel_framework::SpelOutput::execute(post_states, vec![]))
}
} }