Skip to content

Commit 2fcc7b8

Browse files
authored
feat: sage-starbased-decoder local idl.json and patch 06 fixes (#45)
This pull request refactors the account struct definitions and deserialization logic for multiple SAGE Starbased program instructions to expand composite account fields into their individual components. This improves clarity, consistency, and maintainability of the codebase. Additionally, it introduces a new instruction, `LoadingBayToRespawn`. The changes affect several instruction modules and update the crate version. **Refactoring of Account Structures and Deserialization:** * Expanded composite account fields (like `game_accounts_fleet_and_owner`, `starbase_and_starbase_player`, etc.) into their individual account fields (e.g., `key`, `owning_profile`, `fleet`, `game_id`, `game_state`, `starbase`, `starbase_player`) across all relevant instruction structs and their deserialization implementations. This affects instructions such as `AddShipToFleet`, `CloseFleetCargoPodTokenAccount`, `ForceDisbandFleet`, `IdleToLoadingBay`, `IdleToRespawn`, `LoadFleetCrew`, `LoadingBayToIdle`, and `MineAsteroidToRespawn`. [[1]](diffhunk://#diff-48dfcd1fc2a6f79a4d1ff8bdbf666ae348869cd04f9c9bf1977c536bf14eb42eL15-R29) [[2]](diffhunk://#diff-48dfcd1fc2a6f79a4d1ff8bdbf666ae348869cd04f9c9bf1977c536bf14eb42eL30-R68) [[3]](diffhunk://#diff-dab6cd136a02fe87bbe40999e3214816507f742b36950bd893019c0a0990c240L15-R22) [[4]](diffhunk://#diff-dab6cd136a02fe87bbe40999e3214816507f742b36950bd893019c0a0990c240L33-R47) [[5]](diffhunk://#diff-dab6cd136a02fe87bbe40999e3214816507f742b36950bd893019c0a0990c240L44-R63) [[6]](diffhunk://#diff-5319e98e32c2712ad9b471de9de4d587d4d40a84784e1a2c56788589a138efecR15-R31) [[7]](diffhunk://#diff-5319e98e32c2712ad9b471de9de4d587d4d40a84784e1a2c56788589a138efecR43-R59) [[8]](diffhunk://#diff-5319e98e32c2712ad9b471de9de4d587d4d40a84784e1a2c56788589a138efecL57-R75) [[9]](diffhunk://#diff-3060f4e7222fce1446658c312fb1668b277a39809a998ad17ff5e3b57969ec10L13-R22) [[10]](diffhunk://#diff-3060f4e7222fce1446658c312fb1668b277a39809a998ad17ff5e3b57969ec10L24-R51) [[11]](diffhunk://#diff-18933dd8a1b2e116507e798dabf67dd85fcd9401f196270053a75c50450e886cL15-R22) [[12]](diffhunk://#diff-18933dd8a1b2e116507e798dabf67dd85fcd9401f196270053a75c50450e886cL28-R53) [[13]](diffhunk://#diff-586e2c6143b4aa510d41fa8099b6753ffc5b69f064af1ad44da50a17a32b9f16L15-R23) [[14]](diffhunk://#diff-586e2c6143b4aa510d41fa8099b6753ffc5b69f064af1ad44da50a17a32b9f16L27-R51) [[15]](diffhunk://#diff-dbb7528ce75a67860b5c4b9bed3c77a049e234ebf40b9fa24fd3847553b0df73L13-R22) [[16]](diffhunk://#diff-dbb7528ce75a67860b5c4b9bed3c77a049e234ebf40b9fa24fd3847553b0df73L24-R51) [[17]](diffhunk://#diff-db8d522002ecb972dfb3062d46b6d3a0bfaaef00fbf849f467d70e3210c8bd95L15-R22) **New Instruction Implementation:** * Added a new instruction, `LoadingBayToRespawn`, including its struct definition, account structure, and deserialization logic, following the new expanded account pattern. **Version Update:** * Bumped the crate version from `0.10.0` to `0.10.1` in `Cargo.toml` to reflect these changes.
2 parents a84b1e0 + a175c79 commit 2fcc7b8

22 files changed

+15222
-262
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

carbon-decoders/sage-starbased-decoder/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "carbon-sage-starbased-decoder"
3-
version = "0.10.0"
3+
version = "0.10.1"
44
edition = "2024"
55
description = "Rust decoder for Star Atlas SAGE Starbased program on Solana"
66
license = "Apache-2.0"

carbon-decoders/sage-starbased-decoder/src/instructions/add_ship_to_fleet.rs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,21 @@ pub struct AddShipToFleet {
1212

1313
#[derive(Debug, PartialEq, Eq, Clone, Hash, serde::Serialize, serde::Deserialize)]
1414
pub struct AddShipToFleetInstructionAccounts {
15-
pub game_accounts_fleet_and_owner: solana_pubkey::Pubkey,
15+
// GameAndGameStateAndFleetAndOwnerMut expansion
16+
pub key: solana_pubkey::Pubkey,
17+
pub owning_profile: solana_pubkey::Pubkey,
18+
pub owning_profile_faction: solana_pubkey::Pubkey,
19+
pub fleet: solana_pubkey::Pubkey,
20+
pub game_id: solana_pubkey::Pubkey,
21+
pub game_state: solana_pubkey::Pubkey,
22+
// Direct accounts
1623
pub funder: solana_pubkey::Pubkey,
1724
pub fleet_ships: solana_pubkey::Pubkey,
1825
pub ship: solana_pubkey::Pubkey,
19-
pub starbase_and_starbase_player: solana_pubkey::Pubkey,
26+
// StarbaseMutAndStarbasePlayer expansion
27+
pub starbase: solana_pubkey::Pubkey,
28+
pub starbase_player: solana_pubkey::Pubkey,
29+
// Direct accounts
2030
pub system_program: solana_pubkey::Pubkey,
2131
}
2232

@@ -27,19 +37,35 @@ impl carbon_core::deserialize::ArrangeAccounts for AddShipToFleet {
2737
accounts: &[solana_instruction::AccountMeta],
2838
) -> Option<Self::ArrangedAccounts> {
2939
let mut iter = accounts.iter();
30-
let game_accounts_fleet_and_owner = next_account(&mut iter)?;
40+
// GameAndGameStateAndFleetAndOwnerMut expansion
41+
let key = next_account(&mut iter)?;
42+
let owning_profile = next_account(&mut iter)?;
43+
let owning_profile_faction = next_account(&mut iter)?;
44+
let fleet = next_account(&mut iter)?;
45+
let game_id = next_account(&mut iter)?;
46+
let game_state = next_account(&mut iter)?;
47+
// Direct accounts
3148
let funder = next_account(&mut iter)?;
3249
let fleet_ships = next_account(&mut iter)?;
3350
let ship = next_account(&mut iter)?;
34-
let starbase_and_starbase_player = next_account(&mut iter)?;
51+
// StarbaseMutAndStarbasePlayer expansion
52+
let starbase = next_account(&mut iter)?;
53+
let starbase_player = next_account(&mut iter)?;
54+
// Direct accounts
3555
let system_program = next_account(&mut iter)?;
3656

3757
Some(AddShipToFleetInstructionAccounts {
38-
game_accounts_fleet_and_owner,
58+
key,
59+
owning_profile,
60+
owning_profile_faction,
61+
fleet,
62+
game_id,
63+
game_state,
3964
funder,
4065
fleet_ships,
4166
ship,
42-
starbase_and_starbase_player,
67+
starbase,
68+
starbase_player,
4369
system_program,
4470
})
4571
}

carbon-decoders/sage-starbased-decoder/src/instructions/close_fleet_cargo_pod_token_account.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,14 @@ pub struct CloseFleetCargoPodTokenAccount {
1212

1313
#[derive(Debug, PartialEq, Eq, Clone, Hash, serde::Serialize, serde::Deserialize)]
1414
pub struct CloseFleetCargoPodTokenAccountInstructionAccounts {
15-
pub game_accounts_fleet_and_owner: solana_pubkey::Pubkey,
15+
// GameAndGameStateAndFleetAndOwnerMut expansion
16+
pub key: solana_pubkey::Pubkey,
17+
pub owning_profile: solana_pubkey::Pubkey,
18+
pub owning_profile_faction: solana_pubkey::Pubkey,
19+
pub fleet: solana_pubkey::Pubkey,
20+
pub game_id: solana_pubkey::Pubkey,
21+
pub game_state: solana_pubkey::Pubkey,
22+
// Direct accounts
1623
pub cargo_pod: solana_pubkey::Pubkey,
1724
pub cargo_type: solana_pubkey::Pubkey,
1825
pub cargo_stats_definition: solana_pubkey::Pubkey,
@@ -30,7 +37,14 @@ impl carbon_core::deserialize::ArrangeAccounts for CloseFleetCargoPodTokenAccoun
3037
accounts: &[solana_instruction::AccountMeta],
3138
) -> Option<Self::ArrangedAccounts> {
3239
let mut iter = accounts.iter();
33-
let game_accounts_fleet_and_owner = next_account(&mut iter)?;
40+
// GameAndGameStateAndFleetAndOwnerMut expansion
41+
let key = next_account(&mut iter)?;
42+
let owning_profile = next_account(&mut iter)?;
43+
let owning_profile_faction = next_account(&mut iter)?;
44+
let fleet = next_account(&mut iter)?;
45+
let game_id = next_account(&mut iter)?;
46+
let game_state = next_account(&mut iter)?;
47+
// Direct accounts
3448
let cargo_pod = next_account(&mut iter)?;
3549
let cargo_type = next_account(&mut iter)?;
3650
let cargo_stats_definition = next_account(&mut iter)?;
@@ -41,7 +55,12 @@ impl carbon_core::deserialize::ArrangeAccounts for CloseFleetCargoPodTokenAccoun
4155
let token_program = next_account(&mut iter)?;
4256

4357
Some(CloseFleetCargoPodTokenAccountInstructionAccounts {
44-
game_accounts_fleet_and_owner,
58+
key,
59+
owning_profile,
60+
owning_profile_faction,
61+
fleet,
62+
game_id,
63+
game_state,
4564
cargo_pod,
4665
cargo_type,
4766
cargo_stats_definition,

carbon-decoders/sage-starbased-decoder/src/instructions/force_disband_fleet.rs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,23 @@ pub struct ForceDisbandFleet {
1212

1313
#[derive(Debug, PartialEq, Eq, Clone, Hash, serde::Serialize, serde::Deserialize)]
1414
pub struct ForceDisbandFleetInstructionAccounts {
15+
// Direct accounts
1516
pub funder: solana_pubkey::Pubkey,
1617
pub disbanded_fleet: solana_pubkey::Pubkey,
1718
pub fleet: solana_pubkey::Pubkey,
1819
pub fleet_ships: solana_pubkey::Pubkey,
1920
pub cargo_hold: solana_pubkey::Pubkey,
2021
pub fuel_tank: solana_pubkey::Pubkey,
2122
pub ammo_bank: solana_pubkey::Pubkey,
22-
pub starbase_and_starbase_player: solana_pubkey::Pubkey,
23+
// StarbaseMutAndStarbasePlayer expansion
24+
pub starbase: solana_pubkey::Pubkey,
25+
pub starbase_player: solana_pubkey::Pubkey,
26+
// Direct accounts
2327
pub ship: solana_pubkey::Pubkey,
24-
pub game_accounts: solana_pubkey::Pubkey,
28+
// GameAndGameState expansion
29+
pub game_id: solana_pubkey::Pubkey,
30+
pub game_state: solana_pubkey::Pubkey,
31+
// Direct accounts
2532
pub cargo_program: solana_pubkey::Pubkey,
2633
pub system_program: solana_pubkey::Pubkey,
2734
}
@@ -33,16 +40,23 @@ impl carbon_core::deserialize::ArrangeAccounts for ForceDisbandFleet {
3340
accounts: &[solana_instruction::AccountMeta],
3441
) -> Option<Self::ArrangedAccounts> {
3542
let mut iter = accounts.iter();
43+
// Direct accounts
3644
let funder = next_account(&mut iter)?;
3745
let disbanded_fleet = next_account(&mut iter)?;
3846
let fleet = next_account(&mut iter)?;
3947
let fleet_ships = next_account(&mut iter)?;
4048
let cargo_hold = next_account(&mut iter)?;
4149
let fuel_tank = next_account(&mut iter)?;
4250
let ammo_bank = next_account(&mut iter)?;
43-
let starbase_and_starbase_player = next_account(&mut iter)?;
51+
// StarbaseMutAndStarbasePlayer expansion
52+
let starbase = next_account(&mut iter)?;
53+
let starbase_player = next_account(&mut iter)?;
54+
// Direct accounts
4455
let ship = next_account(&mut iter)?;
45-
let game_accounts = next_account(&mut iter)?;
56+
// GameAndGameState expansion
57+
let game_id = next_account(&mut iter)?;
58+
let game_state = next_account(&mut iter)?;
59+
// Direct accounts
4660
let cargo_program = next_account(&mut iter)?;
4761
let system_program = next_account(&mut iter)?;
4862

@@ -54,9 +68,11 @@ impl carbon_core::deserialize::ArrangeAccounts for ForceDisbandFleet {
5468
cargo_hold,
5569
fuel_tank,
5670
ammo_bank,
57-
starbase_and_starbase_player,
71+
starbase,
72+
starbase_player,
5873
ship,
59-
game_accounts,
74+
game_id,
75+
game_state,
6076
cargo_program,
6177
system_program,
6278
})

carbon-decoders/sage-starbased-decoder/src/instructions/idle_to_loading_bay.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,16 @@ pub struct IdleToLoadingBay {
1010

1111
#[derive(Debug, PartialEq, Eq, Clone, Hash, serde::Serialize, serde::Deserialize)]
1212
pub struct IdleToLoadingBayInstructionAccounts {
13-
pub game_accounts_fleet_and_owner: solana_pubkey::Pubkey,
14-
pub starbase_and_starbase_player: solana_pubkey::Pubkey,
13+
// GameAndGameStateAndFleetAndOwnerMut expansion
14+
pub key: solana_pubkey::Pubkey,
15+
pub owning_profile: solana_pubkey::Pubkey,
16+
pub owning_profile_faction: solana_pubkey::Pubkey,
17+
pub fleet: solana_pubkey::Pubkey,
18+
pub game_id: solana_pubkey::Pubkey,
19+
pub game_state: solana_pubkey::Pubkey,
20+
// StarbaseMutAndStarbasePlayer expansion
21+
pub starbase: solana_pubkey::Pubkey,
22+
pub starbase_player: solana_pubkey::Pubkey,
1523
}
1624

1725
impl carbon_core::deserialize::ArrangeAccounts for IdleToLoadingBay {
@@ -21,12 +29,26 @@ impl carbon_core::deserialize::ArrangeAccounts for IdleToLoadingBay {
2129
accounts: &[solana_instruction::AccountMeta],
2230
) -> Option<Self::ArrangedAccounts> {
2331
let mut iter = accounts.iter();
24-
let game_accounts_fleet_and_owner = next_account(&mut iter)?;
25-
let starbase_and_starbase_player = next_account(&mut iter)?;
32+
// GameAndGameStateAndFleetAndOwnerMut expansion
33+
let key = next_account(&mut iter)?;
34+
let owning_profile = next_account(&mut iter)?;
35+
let owning_profile_faction = next_account(&mut iter)?;
36+
let fleet = next_account(&mut iter)?;
37+
let game_id = next_account(&mut iter)?;
38+
let game_state = next_account(&mut iter)?;
39+
// StarbaseMutAndStarbasePlayer expansion
40+
let starbase = next_account(&mut iter)?;
41+
let starbase_player = next_account(&mut iter)?;
2642

2743
Some(IdleToLoadingBayInstructionAccounts {
28-
game_accounts_fleet_and_owner,
29-
starbase_and_starbase_player,
44+
key,
45+
owning_profile,
46+
owning_profile_faction,
47+
fleet,
48+
game_id,
49+
game_state,
50+
starbase,
51+
starbase_player,
3052
})
3153
}
3254
}

carbon-decoders/sage-starbased-decoder/src/instructions/idle_to_respawn.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,14 @@ pub struct IdleToRespawn {
1212

1313
#[derive(Debug, PartialEq, Eq, Clone, Hash, serde::Serialize, serde::Deserialize)]
1414
pub struct IdleToRespawnInstructionAccounts {
15-
pub game_accounts_fleet_and_owner: solana_pubkey::Pubkey,
15+
// GameAndGameStateAndFleetAndOwnerMut expansion
16+
pub key: solana_pubkey::Pubkey,
17+
pub owning_profile: solana_pubkey::Pubkey,
18+
pub owning_profile_faction: solana_pubkey::Pubkey,
19+
pub fleet: solana_pubkey::Pubkey,
20+
pub game_id: solana_pubkey::Pubkey,
21+
pub game_state: solana_pubkey::Pubkey,
22+
// Direct accounts
1623
pub atlas_token_from: solana_pubkey::Pubkey,
1724
pub atlas_token_to: solana_pubkey::Pubkey,
1825
pub token_program: solana_pubkey::Pubkey,
@@ -25,13 +32,25 @@ impl carbon_core::deserialize::ArrangeAccounts for IdleToRespawn {
2532
accounts: &[solana_instruction::AccountMeta],
2633
) -> Option<Self::ArrangedAccounts> {
2734
let mut iter = accounts.iter();
28-
let game_accounts_fleet_and_owner = next_account(&mut iter)?;
35+
// GameAndGameStateAndFleetAndOwnerMut expansion
36+
let key = next_account(&mut iter)?;
37+
let owning_profile = next_account(&mut iter)?;
38+
let owning_profile_faction = next_account(&mut iter)?;
39+
let fleet = next_account(&mut iter)?;
40+
let game_id = next_account(&mut iter)?;
41+
let game_state = next_account(&mut iter)?;
42+
// Direct accounts
2943
let atlas_token_from = next_account(&mut iter)?;
3044
let atlas_token_to = next_account(&mut iter)?;
3145
let token_program = next_account(&mut iter)?;
3246

3347
Some(IdleToRespawnInstructionAccounts {
34-
game_accounts_fleet_and_owner,
48+
key,
49+
owning_profile,
50+
owning_profile_faction,
51+
fleet,
52+
game_id,
53+
game_state,
3554
atlas_token_from,
3655
atlas_token_to,
3756
token_program,

carbon-decoders/sage-starbased-decoder/src/instructions/load_fleet_crew.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,15 @@ pub struct LoadFleetCrew {
1212

1313
#[derive(Debug, PartialEq, Eq, Clone, Hash, serde::Serialize, serde::Deserialize)]
1414
pub struct LoadFleetCrewInstructionAccounts {
15-
pub fleet_and_owner: solana_pubkey::Pubkey,
16-
pub starbase_and_starbase_player: solana_pubkey::Pubkey,
15+
// FleetAndOwner expansion
16+
pub key: solana_pubkey::Pubkey,
17+
pub owning_profile: solana_pubkey::Pubkey,
18+
pub owning_profile_faction: solana_pubkey::Pubkey,
19+
pub fleet: solana_pubkey::Pubkey,
20+
// StarbaseMutAndStarbasePlayer expansion
21+
pub starbase: solana_pubkey::Pubkey,
22+
pub starbase_player: solana_pubkey::Pubkey,
23+
// Direct accounts
1724
pub game_id: solana_pubkey::Pubkey,
1825
}
1926

@@ -24,13 +31,24 @@ impl carbon_core::deserialize::ArrangeAccounts for LoadFleetCrew {
2431
accounts: &[solana_instruction::AccountMeta],
2532
) -> Option<Self::ArrangedAccounts> {
2633
let mut iter = accounts.iter();
27-
let fleet_and_owner = next_account(&mut iter)?;
28-
let starbase_and_starbase_player = next_account(&mut iter)?;
34+
// FleetAndOwner expansion
35+
let key = next_account(&mut iter)?;
36+
let owning_profile = next_account(&mut iter)?;
37+
let owning_profile_faction = next_account(&mut iter)?;
38+
let fleet = next_account(&mut iter)?;
39+
// StarbaseMutAndStarbasePlayer expansion
40+
let starbase = next_account(&mut iter)?;
41+
let starbase_player = next_account(&mut iter)?;
42+
// Direct accounts
2943
let game_id = next_account(&mut iter)?;
3044

3145
Some(LoadFleetCrewInstructionAccounts {
32-
fleet_and_owner,
33-
starbase_and_starbase_player,
46+
key,
47+
owning_profile,
48+
owning_profile_faction,
49+
fleet,
50+
starbase,
51+
starbase_player,
3452
game_id,
3553
})
3654
}

carbon-decoders/sage-starbased-decoder/src/instructions/loading_bay_to_idle.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,16 @@ pub struct LoadingBayToIdle {
1010

1111
#[derive(Debug, PartialEq, Eq, Clone, Hash, serde::Serialize, serde::Deserialize)]
1212
pub struct LoadingBayToIdleInstructionAccounts {
13-
pub game_accounts_fleet_and_owner: solana_pubkey::Pubkey,
14-
pub starbase_and_starbase_player: solana_pubkey::Pubkey,
13+
// GameAndGameStateAndFleetAndOwnerMut expansion
14+
pub key: solana_pubkey::Pubkey,
15+
pub owning_profile: solana_pubkey::Pubkey,
16+
pub owning_profile_faction: solana_pubkey::Pubkey,
17+
pub fleet: solana_pubkey::Pubkey,
18+
pub game_id: solana_pubkey::Pubkey,
19+
pub game_state: solana_pubkey::Pubkey,
20+
// StarbaseMutAndStarbasePlayer expansion
21+
pub starbase: solana_pubkey::Pubkey,
22+
pub starbase_player: solana_pubkey::Pubkey,
1523
}
1624

1725
impl carbon_core::deserialize::ArrangeAccounts for LoadingBayToIdle {
@@ -21,12 +29,26 @@ impl carbon_core::deserialize::ArrangeAccounts for LoadingBayToIdle {
2129
accounts: &[solana_instruction::AccountMeta],
2230
) -> Option<Self::ArrangedAccounts> {
2331
let mut iter = accounts.iter();
24-
let game_accounts_fleet_and_owner = next_account(&mut iter)?;
25-
let starbase_and_starbase_player = next_account(&mut iter)?;
32+
// GameAndGameStateAndFleetAndOwnerMut expansion
33+
let key = next_account(&mut iter)?;
34+
let owning_profile = next_account(&mut iter)?;
35+
let owning_profile_faction = next_account(&mut iter)?;
36+
let fleet = next_account(&mut iter)?;
37+
let game_id = next_account(&mut iter)?;
38+
let game_state = next_account(&mut iter)?;
39+
// StarbaseMutAndStarbasePlayer expansion
40+
let starbase = next_account(&mut iter)?;
41+
let starbase_player = next_account(&mut iter)?;
2642

2743
Some(LoadingBayToIdleInstructionAccounts {
28-
game_accounts_fleet_and_owner,
29-
starbase_and_starbase_player,
44+
key,
45+
owning_profile,
46+
owning_profile_faction,
47+
fleet,
48+
game_id,
49+
game_state,
50+
starbase,
51+
starbase_player,
3052
})
3153
}
3254
}

0 commit comments

Comments
 (0)