Skip to content

Commit 843e9df

Browse files
Codama generate raydium amm v4 (#73)
Update raydium amm v4 discriminators
1 parent 2845de4 commit 843e9df

28 files changed

+237
-112
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and adheres to [Semantic Versioning](https://semver.org/).
99

1010
### Added
1111

12+
- Update raydium-amm-v4 discriminators strategy (https://github.com/rpcpool/yellowstone-vixen/pull/73)
1213
- Added Kamino Limit Orders parser (https://github.com/rpcpool/yellowstone-vixen/pull/72)
1314
- Added new set of pasers: (https://github.com/rpcpool/yellowstone-vixen/pull/70)
1415
- meteora-amm

crates/raydium-amm-v4-parser/Cargo.toml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ borsh = "^0.10"
1515
num-derive = "0.4"
1616
thiserror = "1.0.64"
1717
num-traits = "^0.2"
18-
1918
tracing = { version = "0.1.40", optional = true }
2019
strum = { version = "0.24", optional = true }
2120
strum_macros = { version = "0.24", optional = true }
2221

22+
2323
[features]
2424
anchor = []
2525
anchor-idl-build = []
@@ -32,6 +32,3 @@ tracing = ["dep:tracing", "dep:strum", "dep:strum_macros"]
3232
[build-dependencies]
3333
prost-build = "0.13.1"
3434

35-
# [features]
36-
# proto = ["dep:tonic"]
37-

crates/raydium-amm-v4-parser/proto/raydium_amm_v4.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ message AmmConfig {
128128
string cancel_owner = 2;
129129
repeated uint64 pending1 = 3;
130130
repeated uint64 pending2 = 4;
131+
uint64 create_pool_fee = 5;
131132
}
132133

133134
message LastOrderDistance {
@@ -590,6 +591,7 @@ message ProgramState {
590591
TargetOrders target_orders = 1;
591592
Fees fees = 2;
592593
AmmInfo amm_info = 3;
594+
AmmConfig amm_config = 4;
593595
}
594596
}
595597

crates/raydium-amm-v4-parser/src/generated_parser/accounts_parser.rs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//!
77
88
use crate::{
9-
accounts::{AmmInfo, Fees, TargetOrders},
9+
accounts::{AmmConfig, AmmInfo, Fees, TargetOrders},
1010
ID,
1111
};
1212

@@ -18,41 +18,50 @@ pub enum RaydiumAmmProgramState {
1818
TargetOrders(TargetOrders),
1919
Fees(Fees),
2020
AmmInfo(AmmInfo),
21+
AmmConfig(AmmConfig),
2122
}
2223

2324
impl RaydiumAmmProgramState {
2425
pub fn try_unpack(data_bytes: &[u8]) -> yellowstone_vixen_core::ParseResult<Self> {
25-
let acc_discriminator: [u8; 8] = data_bytes[0..8].try_into()?;
26-
let acc = match acc_discriminator {
27-
[113, 225, 140, 255, 65, 144, 239, 231] => Ok(RaydiumAmmProgramState::TargetOrders(
26+
let data_len = data_bytes.len();
27+
const TARGETORDERS_LEN: usize = std::mem::size_of::<TargetOrders>();
28+
const FEES_LEN: usize = std::mem::size_of::<Fees>();
29+
const AMMINFO_LEN: usize = std::mem::size_of::<AmmInfo>();
30+
const AMMCONFIG_LEN: usize = std::mem::size_of::<AmmConfig>();
31+
32+
let acc = match data_len {
33+
TARGETORDERS_LEN => Ok(RaydiumAmmProgramState::TargetOrders(
2834
TargetOrders::from_bytes(data_bytes)?,
2935
)),
30-
[151, 157, 50, 115, 130, 72, 179, 36] => {
31-
Ok(RaydiumAmmProgramState::Fees(Fees::from_bytes(data_bytes)?))
32-
},
33-
[33, 217, 2, 203, 184, 83, 235, 91] => Ok(RaydiumAmmProgramState::AmmInfo(
34-
AmmInfo::from_bytes(data_bytes)?,
35-
)),
36+
FEES_LEN => Ok(RaydiumAmmProgramState::Fees(Fees::from_bytes(data_bytes)?)),
37+
AMMINFO_LEN => Ok(RaydiumAmmProgramState::AmmInfo(AmmInfo::from_bytes(
38+
data_bytes,
39+
)?)),
40+
AMMCONFIG_LEN => Ok(RaydiumAmmProgramState::AmmConfig(AmmConfig::from_bytes(
41+
data_bytes,
42+
)?)),
3643
_ => Err(yellowstone_vixen_core::ParseError::from(
37-
"Invalid Account discriminator".to_owned(),
44+
"Invalid Account data length".to_owned(),
3845
)),
3946
};
4047

4148
#[cfg(feature = "tracing")]
4249
match &acc {
4350
Ok(acc) => {
4451
tracing::info!(
52+
name: "correctly_parsed_account",
4553
name = "account_update",
4654
program = ID.to_string(),
4755
account = acc.to_string()
4856
);
4957
},
5058
Err(e) => {
5159
tracing::info!(
60+
name: "incorrectly_parsed_account",
5261
name = "account_update",
5362
program = ID.to_string(),
5463
account = "error",
55-
discriminator = ?acc_discriminator,
64+
data_len = ?data_len,
5665
error = ?e
5766
);
5867
},
@@ -195,6 +204,18 @@ mod proto_parser {
195204
}
196205
}
197206
}
207+
use super::AmmConfig;
208+
impl IntoProto<proto_def::AmmConfig> for AmmConfig {
209+
fn into_proto(self) -> proto_def::AmmConfig {
210+
proto_def::AmmConfig {
211+
pnl_owner: self.pnl_owner.to_string(),
212+
cancel_owner: self.cancel_owner.to_string(),
213+
pending1: self.pending1.to_vec(),
214+
pending2: self.pending2.to_vec(),
215+
create_pool_fee: self.create_pool_fee,
216+
}
217+
}
218+
}
198219

199220
impl IntoProto<proto_def::ProgramState> for RaydiumAmmProgramState {
200221
fn into_proto(self) -> proto_def::ProgramState {
@@ -208,6 +229,9 @@ mod proto_parser {
208229
RaydiumAmmProgramState::AmmInfo(data) => {
209230
proto_def::program_state::StateOneof::AmmInfo(data.into_proto())
210231
},
232+
RaydiumAmmProgramState::AmmConfig(data) => {
233+
proto_def::program_state::StateOneof::AmmConfig(data.into_proto())
234+
},
211235
};
212236

213237
proto_def::ProgramState {

crates/raydium-amm-v4-parser/src/generated_parser/instructions_parser.rs

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,11 @@ impl InstructionParser {
9191
ix: &yellowstone_vixen_core::instruction::InstructionUpdate,
9292
) -> yellowstone_vixen_core::ParseResult<RaydiumAmmProgramIx> {
9393
let accounts_len = ix.accounts.len();
94-
let ix_discriminator: [u8; 8] = ix.data[0..8].try_into()?;
95-
let mut ix_data = &ix.data[8..];
94+
95+
let ix_discriminator: [u8; 1] = ix.data[0..1].try_into()?;
96+
let mut ix_data = &ix.data[1..];
9697
let ix = match ix_discriminator {
97-
[175, 175, 109, 31, 13, 152, 155, 237] => {
98+
[0] => {
9899
check_min_accounts_req(accounts_len, 18)?;
99100
let ix_accounts = InitializeIxAccounts {
100101
token_program: ix.accounts[0].0.into(),
@@ -119,7 +120,7 @@ impl InstructionParser {
119120
let de_ix_data: InitializeIxData = BorshDeserialize::deserialize(&mut ix_data)?;
120121
Ok(RaydiumAmmProgramIx::Initialize(ix_accounts, de_ix_data))
121122
},
122-
[9, 203, 254, 64, 89, 32, 179, 159] => {
123+
[1] => {
123124
check_min_accounts_req(accounts_len, 21)?;
124125
let ix_accounts = Initialize2IxAccounts {
125126
token_program: ix.accounts[0].0.into(),
@@ -147,7 +148,7 @@ impl InstructionParser {
147148
let de_ix_data: Initialize2IxData = BorshDeserialize::deserialize(&mut ix_data)?;
148149
Ok(RaydiumAmmProgramIx::Initialize2(ix_accounts, de_ix_data))
149150
},
150-
[252, 219, 18, 48, 87, 183, 26, 154] => {
151+
[2] => {
151152
check_min_accounts_req(accounts_len, 19)?;
152153
let ix_accounts = MonitorStepIxAccounts {
153154
token_program: ix.accounts[0].0.into(),
@@ -173,7 +174,7 @@ impl InstructionParser {
173174
let de_ix_data: MonitorStepIxData = BorshDeserialize::deserialize(&mut ix_data)?;
174175
Ok(RaydiumAmmProgramIx::MonitorStep(ix_accounts, de_ix_data))
175176
},
176-
[242, 35, 198, 137, 82, 225, 242, 182] => {
177+
[3] => {
177178
check_min_accounts_req(accounts_len, 14)?;
178179
let ix_accounts = DepositIxAccounts {
179180
token_program: ix.accounts[0].0.into(),
@@ -194,7 +195,7 @@ impl InstructionParser {
194195
let de_ix_data: DepositIxData = BorshDeserialize::deserialize(&mut ix_data)?;
195196
Ok(RaydiumAmmProgramIx::Deposit(ix_accounts, de_ix_data))
196197
},
197-
[183, 18, 70, 156, 148, 109, 161, 34] => {
198+
[4] => {
198199
check_min_accounts_req(accounts_len, 22)?;
199200
let ix_accounts = WithdrawIxAccounts {
200201
token_program: ix.accounts[0].0.into(),
@@ -223,7 +224,7 @@ impl InstructionParser {
223224
let de_ix_data: WithdrawIxData = BorshDeserialize::deserialize(&mut ix_data)?;
224225
Ok(RaydiumAmmProgramIx::Withdraw(ix_accounts, de_ix_data))
225226
},
226-
[207, 98, 243, 89, 114, 174, 205, 20] => {
227+
[5] => {
227228
check_min_accounts_req(accounts_len, 21)?;
228229
let ix_accounts = MigrateToOpenBookIxAccounts {
229230
token_program: ix.accounts[0].0.into(),
@@ -250,7 +251,7 @@ impl InstructionParser {
250251
};
251252
Ok(RaydiumAmmProgramIx::MigrateToOpenBook(ix_accounts))
252253
},
253-
[27, 234, 178, 52, 147, 2, 187, 141] => {
254+
[6] => {
254255
check_min_accounts_req(accounts_len, 16)?;
255256
let ix_accounts = SetParamsIxAccounts {
256257
token_program: ix.accounts[0].0.into(),
@@ -273,7 +274,7 @@ impl InstructionParser {
273274
let de_ix_data: SetParamsIxData = BorshDeserialize::deserialize(&mut ix_data)?;
274275
Ok(RaydiumAmmProgramIx::SetParams(ix_accounts, de_ix_data))
275276
},
276-
[86, 36, 158, 158, 92, 241, 251, 94] => {
277+
[7] => {
277278
check_min_accounts_req(accounts_len, 17)?;
278279
let ix_accounts = WithdrawPnlIxAccounts {
279280
token_program: ix.accounts[0].0.into(),
@@ -296,7 +297,7 @@ impl InstructionParser {
296297
};
297298
Ok(RaydiumAmmProgramIx::WithdrawPnl(ix_accounts))
298299
},
299-
[193, 101, 58, 65, 120, 78, 99, 31] => {
300+
[8] => {
300301
check_min_accounts_req(accounts_len, 6)?;
301302
let ix_accounts = WithdrawSrmIxAccounts {
302303
token_program: ix.accounts[0].0.into(),
@@ -309,7 +310,7 @@ impl InstructionParser {
309310
let de_ix_data: WithdrawSrmIxData = BorshDeserialize::deserialize(&mut ix_data)?;
310311
Ok(RaydiumAmmProgramIx::WithdrawSrm(ix_accounts, de_ix_data))
311312
},
312-
[42, 236, 72, 162, 242, 24, 39, 84] => {
313+
[9] => {
313314
check_min_accounts_req(accounts_len, 18)?;
314315
let ix_accounts = SwapBaseInIxAccounts {
315316
token_program: ix.accounts[0].0.into(),
@@ -334,7 +335,7 @@ impl InstructionParser {
334335
let de_ix_data: SwapBaseInIxData = BorshDeserialize::deserialize(&mut ix_data)?;
335336
Ok(RaydiumAmmProgramIx::SwapBaseIn(ix_accounts, de_ix_data))
336337
},
337-
[255, 92, 87, 45, 198, 172, 236, 2] => {
338+
[10] => {
338339
check_min_accounts_req(accounts_len, 14)?;
339340
let ix_accounts = PreInitializeIxAccounts {
340341
token_program: ix.accounts[0].0.into(),
@@ -355,7 +356,7 @@ impl InstructionParser {
355356
let de_ix_data: PreInitializeIxData = BorshDeserialize::deserialize(&mut ix_data)?;
356357
Ok(RaydiumAmmProgramIx::PreInitialize(ix_accounts, de_ix_data))
357358
},
358-
[163, 210, 155, 208, 175, 146, 213, 150] => {
359+
[11] => {
359360
check_min_accounts_req(accounts_len, 18)?;
360361
let ix_accounts = SwapBaseOutIxAccounts {
361362
token_program: ix.accounts[0].0.into(),
@@ -380,7 +381,7 @@ impl InstructionParser {
380381
let de_ix_data: SwapBaseOutIxData = BorshDeserialize::deserialize(&mut ix_data)?;
381382
Ok(RaydiumAmmProgramIx::SwapBaseOut(ix_accounts, de_ix_data))
382383
},
383-
[195, 75, 104, 72, 253, 176, 183, 160] => {
384+
[12] => {
384385
check_min_accounts_req(accounts_len, 8)?;
385386
let ix_accounts = SimulateInfoIxAccounts {
386387
amm: ix.accounts[0].0.into(),
@@ -395,7 +396,7 @@ impl InstructionParser {
395396
let de_ix_data: SimulateInfoIxData = BorshDeserialize::deserialize(&mut ix_data)?;
396397
Ok(RaydiumAmmProgramIx::SimulateInfo(ix_accounts, de_ix_data))
397398
},
398-
[151, 90, 110, 217, 196, 223, 251, 95] => {
399+
[13] => {
399400
check_min_accounts_req(accounts_len, 17)?;
400401
let ix_accounts = AdminCancelOrdersIxAccounts {
401402
token_program: ix.accounts[0].0.into(),
@@ -423,7 +424,7 @@ impl InstructionParser {
423424
de_ix_data,
424425
))
425426
},
426-
[190, 227, 122, 84, 73, 166, 40, 100] => {
427+
[14] => {
427428
check_min_accounts_req(accounts_len, 5)?;
428429
let ix_accounts = CreateConfigAccountIxAccounts {
429430
admin: ix.accounts[0].0.into(),
@@ -434,7 +435,7 @@ impl InstructionParser {
434435
};
435436
Ok(RaydiumAmmProgramIx::CreateConfigAccount(ix_accounts))
436437
},
437-
[240, 32, 10, 152, 8, 45, 87, 58] => {
438+
[15] => {
438439
check_min_accounts_req(accounts_len, 2)?;
439440
let ix_accounts = UpdateConfigAccountIxAccounts {
440441
admin: ix.accounts[0].0.into(),
@@ -456,13 +457,15 @@ impl InstructionParser {
456457
match &ix {
457458
Ok(ix) => {
458459
tracing::info!(
460+
name: "correctly_parsed_instruction",
459461
name = "ix_update",
460462
program = ID.to_string(),
461463
ix = ix.to_string()
462464
);
463465
},
464466
Err(e) => {
465467
tracing::info!(
468+
name: "incorrectly_parsed_instruction",
466469
name = "ix_update",
467470
program = ID.to_string(),
468471
ix = "error",

crates/raydium-amm-v4-parser/src/generated_parser/proto_helpers.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ pub mod proto_types_parsers {
7373
cancel_owner: self.cancel_owner.to_string(),
7474
pending1: self.pending1.to_vec(),
7575
pending2: self.pending2.to_vec(),
76+
create_pool_fee: self.create_pool_fee,
7677
}
7778
}
7879
}

0 commit comments

Comments
 (0)