Skip to content

Commit ea3b076

Browse files
committed
automatice_generate_keys: add dual runtime API decoding and deterministic key export
1 parent 8695106 commit ea3b076

File tree

1 file changed

+28
-12
lines changed
  • toolkit/partner-chains-cli/src/automatic_generate_keys

1 file changed

+28
-12
lines changed

toolkit/partner-chains-cli/src/automatic_generate_keys/mod.rs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -112,24 +112,40 @@ impl CmdRun for AutomaticGenerateKeysCmd {
112112
let bytes = hex::decode(&decoded_hex[2..]).map_err(|e| {
113113
anyhow::anyhow!("Failed to decode runtime API response: {}", e)
114114
})?;
115-
// The runtime API may return either Vec<(key_type, key)> directly
116-
// or Option<Vec<..>> (introduced in newer FRAME versions). Handle both.
115+
// The runtime API may return:
116+
// 1. Vec<(Vec<u8>, Vec<u8>)> – legacy order (key_type bytes, pubkey)
117+
// 2. Vec<(Vec<u8>, KeyTypeId)> – current sp_session order (pubkey, KeyTypeId)
118+
// 3. Option<Vec<..>> wrapper – newer FRAME versions add Option
119+
// Try each pattern progressively.
117120
decoded_keys = {
118121
// Attempt direct Vec decode first.
119122
let mut cursor = &bytes[..];
120123
match <Vec<(Vec<u8>, Vec<u8>)>>::decode(&mut cursor) {
121124
Ok(vec) if cursor.is_empty() => vec,
122125
_ => {
123-
// Fallback: try Option<Vec<..>>
124-
let mut cursor_opt = &bytes[..];
125-
<Option<Vec<(Vec<u8>, Vec<u8>)>>>::decode(&mut cursor_opt)
126-
.map_err(|e| {
127-
anyhow::anyhow!(
128-
"Failed to SCALE decode Option<Vec> keys: {}",
129-
e
130-
)
131-
})?
132-
.unwrap_or_default()
126+
// Try Vec<(Vec<u8>, u32)> where u32 is KeyTypeId
127+
let mut cursor_alt = &bytes[..];
128+
if let Ok(vec_u32) =
129+
<Vec<(Vec<u8>, u32)>>::decode(&mut cursor_alt)
130+
{
131+
vec_u32
132+
.into_iter()
133+
.map(|(pubkey, key_type)| {
134+
(key_type.to_le_bytes().to_vec(), pubkey)
135+
})
136+
.collect::<Vec<_>>()
137+
} else {
138+
// Fallback: try Option<Vec<(Vec<u8>, Vec<u8>)>>
139+
let mut cursor_opt = &bytes[..];
140+
<Option<Vec<(Vec<u8>, Vec<u8>)>>>::decode(&mut cursor_opt)
141+
.map_err(|e| {
142+
anyhow::anyhow!(
143+
"Failed to SCALE decode Option<Vec> keys: {}",
144+
e
145+
)
146+
})?
147+
.unwrap_or_default()
148+
}
133149
},
134150
}
135151
};

0 commit comments

Comments
 (0)