v0.4.8-pre.010
This commit is contained in:
@@ -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 l’ordre 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 l’unique 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 l’inventaire de scénarios ;
|
||||
- documente la crate du test d’API publique externe afin de conserver `missing_docs` propre ;
|
||||
|
||||
@@ -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 l’en-tête du Buffer, alors que l’écriture exige une capacité suffisante.
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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",
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 l’autorité 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 l’excé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 l’autorité 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() {
|
||||
|
||||
Reference in New Issue
Block a user