v0.4.8-pre.010

This commit is contained in:
2026-08-06 17:26:14 +02:00
parent b314bfc244
commit 3167297283
40 changed files with 2556 additions and 1125 deletions

View File

@@ -1,10 +1,15 @@
<!-- file: kb-pipeline-demo-scenarios/CHANGELOG.md -->
<!-- version: 30 -->
<!-- version: 32 -->
# CHANGELOG — kb-pipeline-demo-scenarios
## 0.4.8-pre.009 — scénarios Devnet Solana Program Metadata
- déplace `SetAuthority` du compte Metadata non canonique vers le Buffer non canonique, conformément au processeur officiel qui refuse cette opération sur les metadata non canoniques ;
- réconcilie lordre des neuf étapes, la fixture, la matrice Devnet et les tests de campagne ;
- ajoute une régression garantissant que `SetAuthority` ne cible jamais le compte Metadata non canonique de la fixture ;
- réutilise lunique cible canonique `kb-pipeline-demo-scenarios` pour les logs de fixture et supprime la seconde constante incompatible avec la convention de logging de la crate ;
- corrige les derniers diagnostics Clippy des tests : `str::len()` direct pour les seeds UTF-8 et `return` explicite dans la closure de statut de validation ;
- corrige les tests de réconciliation des opérations : comparaison de références `&str` et durée de vie de linventaire de scénarios ;
- documente la crate du test dAPI publique externe afin de conserver `missing_docs` propre ;

View File

@@ -1,5 +1,5 @@
<!-- file: kb-pipeline-demo-scenarios/USAGE.md -->
<!-- version: 10 -->
<!-- version: 11 -->
# Utilisation de kb-pipeline-demo-scenarios
@@ -350,8 +350,8 @@ fn program_metadata_scenarios(
Les deux parcours sont ordonnés ainsi :
1. `Allocate → Extend → Write → Trim → Close` pour le `Buffer` ;
2. `Initialize → SetData → SetAuthority → SetImmutable` pour le compte `Metadata`.
1. `Allocate → Extend → Write → SetAuthority → Trim → Close` pour le `Buffer` non canonique ;
2. `Initialize → SetData → SetImmutable` pour le compte `Metadata` non canonique.
`Extend` précède volontairement `Write` : `Allocate` ne réserve que len-tête du Buffer, alors que lécriture exige une capacité suffisante.

View File

@@ -1,5 +1,5 @@
// file: kb-pipeline-demo-scenarios/src/constants.rs
// version: 2
// version: 3
//! Demo scenario constants.
@@ -8,6 +8,3 @@ pub(crate) const TRACING_TARGET: &str = "kb-pipeline-demo-scenarios";
/// Total transactions reserved by one complete Solana Program Metadata campaign.
pub(crate) const SOLANA_PROGRAM_METADATA_CAMPAIGN_TRANSACTION_COUNT: u64 = 11;
/// Canonical tracing target for Solana Program Metadata Devnet fixtures.
pub(crate) const TRACING_TARGET_METADATA_SOLANA_PROGRAM_FIXTURE: &str =
"kb-pipeline-demo-scenarios.metadata.solana_program.fixture";

View File

@@ -1,5 +1,5 @@
// file: kb-pipeline-demo-scenarios/src/lib.rs
// version: 13
// version: 14
#![forbid(unsafe_code)]
#![deny(unreachable_pub)]
@@ -281,5 +281,3 @@ pub use self::token_2022_fixture::prepare_token_2022_fixture;
pub(crate) use self::constants::SOLANA_PROGRAM_METADATA_CAMPAIGN_TRANSACTION_COUNT;
/// Canonical tracing target for demo pipeline scenarios.
pub(crate) use self::constants::TRACING_TARGET;
/// Canonical tracing target for Solana Program Metadata Devnet fixtures.
pub(crate) use self::constants::TRACING_TARGET_METADATA_SOLANA_PROGRAM_FIXTURE;

View File

@@ -1,5 +1,5 @@
// file: kb-pipeline-demo-scenarios/src/metadata_solana_program_campaign.rs
// version: 1
// version: 2
//! Ordered confirmed Devnet campaign for all Solana Program Metadata operations.
@@ -126,8 +126,19 @@ mod tests {
.flat_map(|scenario| return scenario.steps.iter())
.map(|step| return step.id.as_str())
.collect::<std::vec::Vec<_>>();
assert_eq!(step_ids.len(), 9);
assert_eq!(step_ids.first(), std::option::Option::Some(&"spm_buffer_allocate"));
assert_eq!(step_ids.last(), std::option::Option::Some(&"spm_metadata_set_immutable"));
assert_eq!(
step_ids,
vec![
"spm_buffer_allocate",
"spm_buffer_extend",
"spm_buffer_write",
"spm_buffer_set_authority",
"spm_buffer_trim",
"spm_buffer_close",
"spm_metadata_initialize",
"spm_metadata_set_data",
"spm_metadata_set_immutable",
]
);
}
}

View File

@@ -1,5 +1,5 @@
// file: kb-pipeline-demo-scenarios/src/metadata_solana_program_fixture.rs
// version: 3
// version: 5
//! Native Solana Program Metadata fixture preparation for Devnet journeys.
@@ -328,7 +328,7 @@ pub async fn prepare_solana_program_metadata_fixture(
updated_metadata_rent,
);
tracing::info!(
target: crate::TRACING_TARGET_METADATA_SOLANA_PROGRAM_FIXTURE,
target: crate::TRACING_TARGET,
action = "prepare_solana_program_metadata_fixture",
profile = profile.name.as_str(),
authority = authority.0.as_str(),
@@ -465,8 +465,23 @@ fn prepared_steps(
),
prepared_step(
"spm_buffer_lifecycle",
"spm_buffer_trim",
"spm_buffer_set_authority",
3,
kb_lib::ExMetadataSpmOperation::SetAuthority {
account: buffer.clone(),
authority: authority.clone(),
new_authority: std::option::Option::Some(authority.clone()),
program_context: std::option::Option::None,
},
vec![buffer_state.clone()],
std::vec::Vec::new(),
vec![buffer_state.clone()],
true,
),
prepared_step(
"spm_buffer_lifecycle",
"spm_buffer_trim",
4,
kb_lib::ExMetadataSpmOperation::Trim {
account: buffer.clone(),
authority: authority.clone(),
@@ -481,7 +496,7 @@ fn prepared_steps(
prepared_step(
"spm_buffer_lifecycle",
"spm_buffer_close",
4,
5,
kb_lib::ExMetadataSpmOperation::Close {
account: buffer.clone(),
authority: authority.clone(),
@@ -548,25 +563,10 @@ fn prepared_steps(
vec![metadata_state.clone()],
true,
),
prepared_step(
"spm_metadata_lifecycle",
"spm_metadata_set_authority",
2,
kb_lib::ExMetadataSpmOperation::SetAuthority {
account: metadata.clone(),
authority: authority.clone(),
new_authority: std::option::Option::Some(authority.clone()),
program_context: std::option::Option::None,
},
vec![metadata_state.clone()],
std::vec::Vec::new(),
vec![metadata_state.clone()],
true,
),
prepared_step(
"spm_metadata_lifecycle",
"spm_metadata_set_immutable",
3,
2,
kb_lib::ExMetadataSpmOperation::SetImmutable {
metadata: metadata.clone(),
authority,
@@ -938,6 +938,19 @@ mod tests {
.map(|step| return step.operation_code.as_str())
.collect::<std::vec::Vec<_>>();
assert_eq!(actual, expected);
let expected_buffer =
kb_lib::MdPubkey(solana_pubkey::Pubkey::new_from_array([2_u8; 32]).to_string());
let set_authority = steps.iter().find(|step| {
return step.operation.operation_code()
== kb_lib::EX_METADATA_SPM_SET_AUTHORITY_OPERATION;
});
assert!(matches!(
set_authority.map(|step| return &step.operation),
std::option::Option::Some(kb_lib::ExMetadataSpmOperation::SetAuthority {
account,
..
}) if account == &expected_buffer
));
assert!(steps.iter().all(|step| {
return step
.preflight_reads

View File

@@ -1,5 +1,5 @@
// file: kb-pipeline-demo-scenarios/src/metadata_solana_program_scenarios.rs
// version: 2
// version: 3
//! Coherent Solana Program Metadata journeys for Devnet validation.
@@ -59,7 +59,8 @@ pub fn solana_program_metadata_devnet_scenarios()
return vec![
crate::SolanaProgramMetadataScenario {
id: "spm_buffer_lifecycle".to_string(),
label: "Buffer : allocation, écriture, extension, trim et fermeture".to_string(),
label: "Buffer : allocation, extension, écriture, autorité, trim et fermeture"
.to_string(),
fixture_account: "buffer".to_string(),
steps: vec![
step(
@@ -86,6 +87,14 @@ pub fn solana_program_metadata_devnet_scenarios()
crate::SolanaProgramMetadataFixtureState::Buffer,
true,
),
step(
"spm_buffer_set_authority",
"Réaffirmer lautorité du Buffer non canonique",
kb_lib::EX_METADATA_SPM_SET_AUTHORITY_OPERATION,
crate::SolanaProgramMetadataFixtureState::Buffer,
crate::SolanaProgramMetadataFixtureState::Buffer,
true,
),
step(
"spm_buffer_trim",
"Réduire le Buffer et restituer lexcédent",
@@ -106,7 +115,7 @@ pub fn solana_program_metadata_devnet_scenarios()
},
crate::SolanaProgramMetadataScenario {
id: "spm_metadata_lifecycle".to_string(),
label: "Metadata : initialisation, données, autorité et immutabilité".to_string(),
label: "Metadata : initialisation, données et immutabilité".to_string(),
fixture_account: "metadata".to_string(),
steps: vec![
step(
@@ -125,14 +134,6 @@ pub fn solana_program_metadata_devnet_scenarios()
crate::SolanaProgramMetadataFixtureState::MutableMetadata,
true,
),
step(
"spm_metadata_set_authority",
"Réaffirmer lautorité du wallet de profil",
kb_lib::EX_METADATA_SPM_SET_AUTHORITY_OPERATION,
crate::SolanaProgramMetadataFixtureState::MutableMetadata,
crate::SolanaProgramMetadataFixtureState::MutableMetadata,
true,
),
step(
"spm_metadata_set_immutable",
"Rendre les metadata immuables",
@@ -201,6 +202,26 @@ mod tests {
}
}
#[test]
fn set_authority_targets_the_non_canonical_buffer_not_metadata() {
let scenarios = crate::solana_program_metadata_devnet_scenarios();
let set_authority_steps = scenarios
.iter()
.flat_map(|scenario| {
return scenario
.steps
.iter()
.map(move |step| return (scenario.fixture_account.as_str(), step));
})
.filter(|(_, step)| {
return step.operation_code == kb_lib::EX_METADATA_SPM_SET_AUTHORITY_OPERATION;
})
.collect::<std::vec::Vec<_>>();
assert_eq!(set_authority_steps.len(), 1);
assert_eq!(set_authority_steps[0].0, "buffer");
assert_eq!(set_authority_steps[0].1.id, "spm_buffer_set_authority");
}
#[test]
fn destructive_flags_match_the_executor_contract() {
for scenario in crate::solana_program_metadata_devnet_scenarios() {