0.5.1-pre.004

This commit is contained in:
2026-08-09 22:52:37 +02:00
parent 6151bb25e7
commit ec07ddbd80
53 changed files with 989 additions and 886 deletions

View File

@@ -1,8 +1,14 @@
<!-- file: ks-pipeline-demo-scenarios/CHANGELOG.md -->
<!-- version: 74 -->
<!-- version: 75 -->
# CHANGELOG — ks-pipeline-demo-scenarios
## `0.5.1-pre.004`
- migre les paramètres d'environnement des scénarios réutilisables vers `KS_*` et les DSN de test vers `KS_SECRET_*` ;
- consolide les fixtures Token-2022 exposées au desktop sous `KS_PUBLIC_*`, sans conserver les anciens aliases `TOKEN_2022_*` / `KB_*` ;
- aligne le CLI, les campagnes Devnet, le rendu `fixture.env` et le guide d'utilisation sans rejouer ni requalifier les scénarios réseau.
## `0.5.1-pre.002`
- renomme `kb-pipeline-demo-scenarios` en `ks-pipeline-demo-scenarios`, sa bibliothèque en `ks_pipeline_demo_scenarios` et son CLI en `ks-pipeline-demo-scenarios-cli` ;

View File

@@ -1,5 +1,5 @@
<!-- file: ks-pipeline-demo-scenarios/USAGE.md -->
<!-- version: 27 -->
<!-- version: 28 -->
# Utilisation de ks-pipeline-demo-scenarios
@@ -107,13 +107,13 @@ La campagne `0.4.8-pre.012` prépare un mint Token-2022 frais, initialise son `M
Le test opt-in est le chemin opérateur recommandé :
```bash
KB_DEVNET_TOKEN_2022_METADATA_CAMPAIGN_TEST=1 \
KB_DEVNET_TOKEN_2022_METADATA_OPERATOR_CONFIRMED=1 \
KB_POSTGRES_TEST_URL='postgresql://…' \
KS_DEVNET_TOKEN_2022_METADATA_CAMPAIGN_TEST=1 \
KS_DEVNET_TOKEN_2022_METADATA_OPERATOR_CONFIRMED=1 \
KS_SECRET_POSTGRES_TEST_URL='postgresql://…' \
cargo test -p ks-pipeline-demo-scenarios optional_devnet_token_2022_metadata_campaign_from_env -- --nocapture
```
`KB_DEVNET_PROFILE` peut sélectionner explicitement le profil Devnet et `KB_DEVNET_CONFIG_PATH` peut remplacer `config/example.config.json`. Le profil doit utiliser un wallet persistant, autoriser les soumissions Devnet et respecter les plafonds de dépense et de frais.
`KS_DEVNET_PROFILE` peut sélectionner explicitement le profil Devnet et `KS_DEVNET_CONFIG_PATH` peut remplacer `config/example.config.json`. Le profil doit utiliser un wallet persistant, autoriser les soumissions Devnet et respecter les plafonds de dépense et de frais.
La sortie `TOKEN_2022_METADATA_FIXTURE` conserve le mint et la signature de préparation. Chaque ligne `TOKEN_2022_METADATA_STEP` conserve lopération, la signature, le slot, la postcondition, le nombre de matérialisations et, pour `Emit`, la taille du `returnData`. La campagne de référence de `pre.012` a été exécutée avec succès et ses preuves sont conservées dans `SPL_TOKEN_2022_METADATA_DEVNET_VALIDATION_MATRIX.json` et dans le rapport `docs/validation/V0_4_8_METADATA_VALIDATION_REPORT.md` ; le rapport détaillé `pre.012` est archivé sous `olddocs/archivekbot3/docs/validation/`. Une nouvelle exécution produit de nouvelles transactions et ne remplace ces preuves quaprès validation explicite.
@@ -299,22 +299,22 @@ La matrice ne transforme jamais une implémentation disponible en validation ré
Le runner Devnet commun accepte toute variante non dépréciée de `ExMetaplexTokenMetadataOperation`. Le test opt-in peut être lancé avec :
```bash
KB_DEVNET_METAPLEX_EXECUTION_TEST=1 \
KB_DEVNET_METAPLEX_OPERATION_JSON='{"operation":"..."}' \
KS_DEVNET_METAPLEX_EXECUTION_TEST=1 \
KS_DEVNET_METAPLEX_OPERATION_JSON='{"operation":"..."}' \
cargo test -p ks-pipeline-demo-scenarios optional_devnet_current_operation_from_env -- --nocapture
```
Variables optionnelles :
- `KB_DEVNET_WALLET_DIR` pour sélectionner le répertoire du wallet persistant ;
- `KB_POSTGRES_TEST_URL` est obligatoire pour le test opt-in afin de permettre lhydratation canonique, lextraction Core, le replay et la vérification didempotence après une soumission ;
- `KB_DEVNET_METAPLEX_PREFLIGHT_READS_JSON` pour fournir les lectures stateful avant simulation ;
- `KB_DEVNET_METAPLEX_POSTCONDITION_READS_JSON` pour fournir les lectures après confirmation ;
- `KB_DEVNET_METAPLEX_MATERIALIZE_AFTER_CONFIRMATION=1` pour rendre obligatoire la preuve de matérialisation et produire les snapshots stateful demandés ;
- `KB_DEVNET_METAPLEX_SUBMIT=1` pour autoriser la soumission ;
- `KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1` pour confirmer explicitement la soumission.
- `KS_DEVNET_WALLET_DIR` pour sélectionner le répertoire du wallet persistant ;
- `KS_SECRET_POSTGRES_TEST_URL` est obligatoire pour le test opt-in afin de permettre lhydratation canonique, lextraction Core, le replay et la vérification didempotence après une soumission ;
- `KS_DEVNET_METAPLEX_PREFLIGHT_READS_JSON` pour fournir les lectures stateful avant simulation ;
- `KS_DEVNET_METAPLEX_POSTCONDITION_READS_JSON` pour fournir les lectures après confirmation ;
- `KS_DEVNET_METAPLEX_MATERIALIZE_AFTER_CONFIRMATION=1` pour rendre obligatoire la preuve de matérialisation et produire les snapshots stateful demandés ;
- `KS_DEVNET_METAPLEX_SUBMIT=1` pour autoriser la soumission ;
- `KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1` pour confirmer explicitement la soumission.
La soumission reste impossible si `KB_DEVNET_METAPLEX_SUBMIT` et `KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED` ne sont pas activées ensemble. Après confirmation, le runner hydrate la transaction canonique, exécute lextraction Core, rejoue le décodeur Metaplex avec ses matérialiseurs puis effectue une seconde passe qui doit être idempotente. Les opérations dépréciées sont rejetées avant tout appel RPC.
La soumission reste impossible si `KS_DEVNET_METAPLEX_SUBMIT` et `KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED` ne sont pas activées ensemble. Après confirmation, le runner hydrate la transaction canonique, exécute lextraction Core, rejoue le décodeur Metaplex avec ses matérialiseurs puis effectue une seconde passe qui doit être idempotente. Les opérations dépréciées sont rejetées avant tout appel RPC.
## Préparer une campagne Metaplex courante
@@ -354,7 +354,7 @@ fn creator_verify_request(
`devnet_metaplex_creator_unverify_request` fournit le parcours inverse. Les deux requêtes restent en simulation-only par défaut.
Le test générique accepte toujours `KB_DEVNET_METAPLEX_OPERATION_JSON`, mais rejette explicitement le placeholder documentaire `...`. Les opérations plus complexes recevront des préparateurs de fixtures dédiés au lieu dexiger de longs JSON écrits à la main.
Le test générique accepte toujours `KS_DEVNET_METAPLEX_OPERATION_JSON`, mais rejette explicitement le placeholder documentaire `...`. Les opérations plus complexes recevront des préparateurs de fixtures dédiés au lieu dexiger de longs JSON écrits à la main.
## Préparer `Create` puis `Mint` avec un ATA canonique
@@ -374,13 +374,13 @@ Le token record pNFT est uniquement dérivé pendant la préparation. Sa créati
La campagne est volontairement exécutée **une famille à la fois**. Elle prépare une fixture fraîche, soumet `Create`, vérifie que la supply et lATA restent à zéro, puis soumet `Mint` et exige la transition exacte vers `mint_amount_raw`. Pour NFT, collection et pNFT, la validation SPL exige après `Create` que les mint/freeze authorities aient été transférées au PDA Master Edition ; pour SFT et fungible, elles restent sur lopérateur. Après `Mint`, NFT/SFT/fungible/collection exigent un ATA `Initialized` (`state=1`), alors que pNFT exige un ATA `Frozen` (`state=2`) et un Token Record Metaplex présent. Toutes les lectures Metaplex postcondition sont automatiquement bornées au slot de confirmation.
Le test opt-in utilise `nft` par défaut. Les valeurs acceptées par `KB_DEVNET_METAPLEX_CREATE_MINT_FAMILY` sont `nft`, `sft`, `fungible`, `collection`, `programmable_nft` et lalias `pnft`.
Le test opt-in utilise `nft` par défaut. Les valeurs acceptées par `KS_DEVNET_METAPLEX_CREATE_MINT_FAMILY` sont `nft`, `sft`, `fungible`, `collection`, `programmable_nft` et lalias `pnft`.
```bash
KB_DEVNET_METAPLEX_CREATE_MINT_CAMPAIGN_TEST=1 \
KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 \
KB_DEVNET_METAPLEX_CREATE_MINT_FAMILY=nft \
KB_POSTGRES_TEST_URL='postgresql://…' \
KS_DEVNET_METAPLEX_CREATE_MINT_CAMPAIGN_TEST=1 \
KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 \
KS_DEVNET_METAPLEX_CREATE_MINT_FAMILY=nft \
KS_SECRET_POSTGRES_TEST_URL='postgresql://…' \
cargo test -p ks-pipeline-demo-scenarios \
optional_devnet_metaplex_create_mint_campaign_from_env \
-- --nocapture
@@ -403,9 +403,9 @@ La preuve stateful exige simultanément :
Le parcours ne soumet pas `SetCollectionSize` : cette opération est obsolète et ne doit pas fabriquer artificiellement la postcondition de taille.
```bash
KB_DEVNET_METAPLEX_COLLECTION_VERIFY_CAMPAIGN_TEST=1 \
KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 \
KB_POSTGRES_TEST_URL='postgres://solana:solana@localhost:5432/solana_test' \
KS_DEVNET_METAPLEX_COLLECTION_VERIFY_CAMPAIGN_TEST=1 \
KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 \
KS_SECRET_POSTGRES_TEST_URL='postgres://solana:solana@localhost:5432/solana_test' \
cargo test -p ks-pipeline-demo-scenarios \
optional_devnet_metaplex_collection_verify_campaign_from_env \
-- --nocapture
@@ -426,9 +426,9 @@ Une exécution réussie imprime `METAPLEX_COLLECTION_VERIFY_FIXTURE`, deux ligne
Le runner exige que le Token Record source passe `Unlocked/Staking -> Locked/Staking -> Unlocked/Staking -> delegate cleared -> Unlocked/Transfer`. Après le transfert, lATA source doit contenir `0` et rester `Initialized`, tandis que lATA destination doit contenir `1` et rester `Frozen`; le Token Record destination doit être `Unlocked` sans delegate. Ce contrat suit le handler courant, qui thaw la source avant transfert puis freeze uniquement la destination. Les wallets temporaires ne remplacent jamais le wallet persistant du profil comme fee payer ; seul le delegate explicitement déclaré est ajouté aux signataires des étapes qui lexigent.
```bash
KB_DEVNET_METAPLEX_PNFT_LIFECYCLE_CAMPAIGN_TEST=1 \
KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 \
KB_POSTGRES_TEST_URL='postgres://solana:solana@localhost:5432/solana_test' \
KS_DEVNET_METAPLEX_PNFT_LIFECYCLE_CAMPAIGN_TEST=1 \
KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 \
KS_SECRET_POSTGRES_TEST_URL='postgres://solana:solana@localhost:5432/solana_test' \
cargo test -p ks-pipeline-demo-scenarios \
optional_devnet_metaplex_pnft_lifecycle_campaign_from_env \
-- --nocapture
@@ -441,9 +441,9 @@ Une exécution qualifiante doit terminer `ok` et produire `METAPLEX_PNFT_LIFECYC
La campagne escrow prépare un NFT classique parent et un token fungible attribut, puis exécute un cycle `TokenOwner` strictement contrôlé. Elle crée le PDA escrow, crée son ATA SPL classique pour le mint attribut, y dépose exactement une unité brute, transfère cette unité vers lATA de lopérateur puis ferme le compte escrow.
```bash
KB_DEVNET_METAPLEX_ESCROW_CAMPAIGN_TEST=1 \
KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 \
KB_POSTGRES_TEST_URL='postgres://solana:solana@localhost:5432/solana_test' \
KS_DEVNET_METAPLEX_ESCROW_CAMPAIGN_TEST=1 \
KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 \
KS_SECRET_POSTGRES_TEST_URL='postgres://solana:solana@localhost:5432/solana_test' \
cargo test -p ks-pipeline-demo-scenarios \
optional_devnet_metaplex_escrow_campaign_from_env \
-- --nocapture
@@ -456,9 +456,9 @@ Une exécution qualifiante doit produire `METAPLEX_ESCROW_FIXTURE`, deux lignes
La campagne `maintenance_campaign` ferme les opérations courantes qui ne relèvent pas des parcours précédents. Elle crée un NFT classique frais, soumet réellement `Update` avec la transition bornée `primary_sale_happened: false -> true`, puis traite les surfaces non qualifiables positivement avec des probes **simulation-only**. Une simulation négative n'autorise jamais une soumission.
```bash
KB_DEVNET_METAPLEX_MAINTENANCE_CAMPAIGN_TEST=1 \
KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 \
KB_POSTGRES_TEST_URL='postgres://solana:solana@localhost:5432/solana_test' \
KS_DEVNET_METAPLEX_MAINTENANCE_CAMPAIGN_TEST=1 \
KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 \
KS_SECRET_POSTGRES_TEST_URL='postgres://solana:solana@localhost:5432/solana_test' \
cargo test -p ks-pipeline-demo-scenarios \
optional_devnet_metaplex_maintenance_campaign_from_env \
-- --nocapture
@@ -484,9 +484,9 @@ Les cinq familles NFT, SFT, fungible, collection et pNFT sont confirmées. `Crea
La surface courante `Use` est classée `unavailable` sur Devnet : la simulation exacte du discriminant 51 retourne `InvalidInstructionData` et aucune transaction n'est soumise. Le test opt-in reste utile comme contrôle de non-régression du runtime :
```bash
KB_DEVNET_METAPLEX_USE_PROBE_TEST=1 \
KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 \
KB_POSTGRES_TEST_URL='postgres://solana:solana@localhost:5432/solana_test' \
KS_DEVNET_METAPLEX_USE_PROBE_TEST=1 \
KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 \
KS_SECRET_POSTGRES_TEST_URL='postgres://solana:solana@localhost:5432/solana_test' \
cargo test -p ks-pipeline-demo-scenarios \
optional_devnet_metaplex_use_probe_from_env \
-- --nocapture

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/bin/ks_pipeline_demo_scenarios_cli.rs
// version: 2
// version: 3
#![forbid(unsafe_code)]
#![deny(unreachable_pub)]
@@ -84,21 +84,21 @@ fn parse_prepare_options(
}
index += 2;
}
let rpc_url = match rpc_url.or_else(|| return std::env::var("KB_DEVNET_RPC_URL").ok()) {
let rpc_url = match rpc_url.or_else(|| return std::env::var("KS_DEVNET_RPC_URL").ok()) {
std::option::Option::Some(value) => value,
std::option::Option::None => {
return std::result::Result::Err(ks_core::Error::config(
"missing --rpc-url or KB_DEVNET_RPC_URL",
"missing --rpc-url or KS_DEVNET_RPC_URL",
));
},
};
let wallet_path = match wallet_path
.or_else(|| return std::env::var("KB_DEVNET_WALLET").ok().map(std::path::PathBuf::from))
.or_else(|| return std::env::var("KS_DEVNET_WALLET").ok().map(std::path::PathBuf::from))
{
std::option::Option::Some(value) => value,
std::option::Option::None => {
return std::result::Result::Err(ks_core::Error::config(
"missing --wallet or KB_DEVNET_WALLET",
"missing --wallet or KS_DEVNET_WALLET",
));
},
};

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/environment.rs
// version: 3
// version: 4
//! Environment initialization for opt-in demonstration scenarios.
@@ -12,7 +12,7 @@ pub fn initialize_demo_scenario_environment(
/// Resolves one compatible Devnet profile for demo scenarios.
///
/// An explicit name has priority, followed by `KB_DEVNET_PROFILE`, then the
/// An explicit name has priority, followed by `KS_DEVNET_PROFILE`, then the
/// first compatible Devnet profile declared by the configuration.
pub fn resolve_demo_devnet_profile(
config: &ks_config::AppConfig,
@@ -24,7 +24,7 @@ pub fn resolve_demo_devnet_profile(
.map(std::string::ToString::to_string);
let selected_name = match explicit {
std::option::Option::Some(value) => std::option::Option::Some(value),
std::option::Option::None => std::env::var("KB_DEVNET_PROFILE")
std::option::Option::None => std::env::var("KS_DEVNET_PROFILE")
.ok()
.map(|value| return value.trim().to_string())
.filter(|value| return !value.is_empty()),

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/collection_verify_campaign.rs
// version: 2
// version: 3
//! Confirmed Devnet collection parent/member `Verify -> Unverify` campaign.
@@ -627,23 +627,23 @@ mod tests {
#[tokio::test]
async fn optional_devnet_metaplex_collection_verify_campaign_from_env() {
if std::env::var("KB_DEVNET_METAPLEX_COLLECTION_VERIFY_CAMPAIGN_TEST")
if std::env::var("KS_DEVNET_METAPLEX_COLLECTION_VERIFY_CAMPAIGN_TEST")
.ok()
.as_deref()
!= std::option::Option::Some("1")
{
return;
}
if std::env::var("KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref()
if std::env::var("KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref()
!= std::option::Option::Some("1")
{
panic!("KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 is required for the spending campaign");
panic!("KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 is required for the spending campaign");
}
let workspace_root = match std::path::Path::new(env!("CARGO_MANIFEST_DIR")).parent() {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KB_DEVNET_CONFIG_PATH") {
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
@@ -655,11 +655,11 @@ mod tests {
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KB_DEVNET_PROFILE").ok();
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));
let database_url = std::env::var("KB_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KB_POSTGRES_TEST_URL is required: {error}"));
let database_url = std::env::var("KS_SECRET_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KS_SECRET_POSTGRES_TEST_URL is required: {error}"));
profile.database.backend = "postgres".to_string();
profile.database.postgres.url = database_url;
let pool = ks_onchain_transport::HttpEndpointPool::from_profile(&profile)

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/create_mint_campaign.rs
// version: 10
// version: 11
//! Confirmed Devnet `Create -> Mint` campaign for one Metaplex asset family.
@@ -669,7 +669,7 @@ mod tests {
"fungible" => crate::MetaplexTokenMetadataAssetFamily::Fungible,
"collection" => crate::MetaplexTokenMetadataAssetFamily::Collection,
"programmable_nft" | "pnft" => crate::MetaplexTokenMetadataAssetFamily::ProgrammableNft,
_ => panic!("unsupported KB_DEVNET_METAPLEX_CREATE_MINT_FAMILY `{value}`"),
_ => panic!("unsupported KS_DEVNET_METAPLEX_CREATE_MINT_FAMILY `{value}`"),
};
}
@@ -794,21 +794,21 @@ mod tests {
#[tokio::test]
async fn optional_devnet_metaplex_create_mint_campaign_from_env() {
if std::env::var("KB_DEVNET_METAPLEX_CREATE_MINT_CAMPAIGN_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_METAPLEX_CREATE_MINT_CAMPAIGN_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
if std::env::var("KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref()
if std::env::var("KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref()
!= std::option::Option::Some("1")
{
panic!("KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 is required for the spending campaign");
panic!("KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 is required for the spending campaign");
}
let workspace_root = match std::path::Path::new(env!("CARGO_MANIFEST_DIR")).parent() {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KB_DEVNET_CONFIG_PATH") {
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
@@ -820,11 +820,11 @@ mod tests {
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KB_DEVNET_PROFILE").ok();
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));
let database_url = std::env::var("KB_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KB_POSTGRES_TEST_URL is required: {error}"));
let database_url = std::env::var("KS_SECRET_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KS_SECRET_POSTGRES_TEST_URL is required: {error}"));
profile.database.backend = "postgres".to_string();
profile.database.postgres.url = database_url;
let pool = ks_onchain_transport::HttpEndpointPool::from_profile(&profile)
@@ -848,7 +848,7 @@ mod tests {
} else {
workspace_root.join(configured_wallet_dir)
};
let family = std::env::var("KB_DEVNET_METAPLEX_CREATE_MINT_FAMILY")
let family = std::env::var("KS_DEVNET_METAPLEX_CREATE_MINT_FAMILY")
.map(|value| return family_from_env(value.as_str()))
.unwrap_or(crate::MetaplexTokenMetadataAssetFamily::Nft);
let options = crate::MetaplexCreateFixturePreparationOptions::new(wallet_dir)

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/devnet_execution.rs
// version: 18
// version: 19
//! Real Devnet simulation and submission for current Metaplex Token Metadata operations.
@@ -1403,29 +1403,29 @@ mod tests {
#[tokio::test]
async fn optional_devnet_current_operation_from_env() {
if std::env::var("KB_DEVNET_METAPLEX_EXECUTION_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_METAPLEX_EXECUTION_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
let operation_json = match std::env::var("KB_DEVNET_METAPLEX_OPERATION_JSON") {
let operation_json = match std::env::var("KS_DEVNET_METAPLEX_OPERATION_JSON") {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => {
panic!("KB_DEVNET_METAPLEX_OPERATION_JSON is required: {error}");
panic!("KS_DEVNET_METAPLEX_OPERATION_JSON is required: {error}");
},
};
let mut profile = example_devnet_profile();
if let std::result::Result::Ok(directory) = std::env::var("KB_DEVNET_WALLET_DIR") {
if let std::result::Result::Ok(directory) = std::env::var("KS_DEVNET_WALLET_DIR") {
profile.wallet.wallet_dir = directory;
}
let pool = match ks_onchain_transport::HttpEndpointPool::from_profile(&profile) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("HTTP pool creation failed: {error}"),
};
let database_url = match std::env::var("KB_POSTGRES_TEST_URL") {
let database_url = match std::env::var("KS_SECRET_POSTGRES_TEST_URL") {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => {
panic!("KB_POSTGRES_TEST_URL is required for Metaplex execution: {error}")
panic!("KS_SECRET_POSTGRES_TEST_URL is required for Metaplex execution: {error}")
},
};
let store_options = match ks_store::PostgresStoreOptions::new(database_url, 5, 5_000, false)
@@ -1455,16 +1455,16 @@ mod tests {
},
};
request.preflight_reads =
optional_stateful_reads_from_env("KB_DEVNET_METAPLEX_PREFLIGHT_READS_JSON");
optional_stateful_reads_from_env("KS_DEVNET_METAPLEX_PREFLIGHT_READS_JSON");
request.postcondition_reads =
optional_stateful_reads_from_env("KB_DEVNET_METAPLEX_POSTCONDITION_READS_JSON");
request.submit = std::env::var("KB_DEVNET_METAPLEX_SUBMIT").ok().as_deref()
optional_stateful_reads_from_env("KS_DEVNET_METAPLEX_POSTCONDITION_READS_JSON");
request.submit = std::env::var("KS_DEVNET_METAPLEX_SUBMIT").ok().as_deref()
== std::option::Option::Some("1");
request.operator_confirmed = request.submit
&& std::env::var("KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref()
&& std::env::var("KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref()
== std::option::Option::Some("1");
request.materialize_after_confirmation = request.submit
&& std::env::var("KB_DEVNET_METAPLEX_MATERIALIZE_AFTER_CONFIRMATION")
&& std::env::var("KS_DEVNET_METAPLEX_MATERIALIZE_AFTER_CONFIRMATION")
.ok()
.as_deref()
== std::option::Option::Some("1");

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/escrow_campaign.rs
// version: 2
// version: 3
//! Confirmed Devnet Token Owned Escrow campaign for current Metaplex escrow operations.
@@ -954,21 +954,21 @@ mod tests {
#[tokio::test]
async fn optional_devnet_metaplex_escrow_campaign_from_env() {
if std::env::var("KB_DEVNET_METAPLEX_ESCROW_CAMPAIGN_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_METAPLEX_ESCROW_CAMPAIGN_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
assert_eq!(
std::env::var("KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref(),
std::env::var("KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref(),
std::option::Option::Some("1"),
"set KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 before the escrow campaign"
"set KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 before the escrow campaign"
);
let workspace_root = match std::path::Path::new(env!("CARGO_MANIFEST_DIR")).parent() {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KB_DEVNET_CONFIG_PATH") {
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
@@ -980,11 +980,11 @@ mod tests {
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KB_DEVNET_PROFILE").ok();
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));
let database_url = std::env::var("KB_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KB_POSTGRES_TEST_URL is required: {error}"));
let database_url = std::env::var("KS_SECRET_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KS_SECRET_POSTGRES_TEST_URL is required: {error}"));
profile.database.backend = "postgres".to_string();
profile.database.postgres.url = database_url;
let http_pool = ks_onchain_transport::HttpEndpointPool::from_profile(&profile)

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/maintenance_campaign.rs
// version: 4
// version: 5
//! Final bounded Devnet qualification campaign for current Metaplex maintenance operations.
@@ -558,21 +558,21 @@ mod tests {
#[tokio::test]
async fn optional_devnet_metaplex_maintenance_campaign_from_env() {
if std::env::var("KB_DEVNET_METAPLEX_MAINTENANCE_CAMPAIGN_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_METAPLEX_MAINTENANCE_CAMPAIGN_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
assert_eq!(
std::env::var("KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref(),
std::env::var("KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref(),
std::option::Option::Some("1"),
"set KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 before the maintenance campaign"
"set KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 before the maintenance campaign"
);
let workspace_root = match std::path::Path::new(env!("CARGO_MANIFEST_DIR")).parent() {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KB_DEVNET_CONFIG_PATH") {
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
@@ -584,11 +584,11 @@ mod tests {
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KB_DEVNET_PROFILE").ok();
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));
let database_url = std::env::var("KB_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KB_POSTGRES_TEST_URL is required: {error}"));
let database_url = std::env::var("KS_SECRET_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KS_SECRET_POSTGRES_TEST_URL is required: {error}"));
profile.database.backend = "postgres".to_string();
profile.database.postgres.url = database_url;
let http_pool = ks_onchain_transport::HttpEndpointPool::from_profile(&profile)

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/pnft_lifecycle_campaign.rs
// version: 4
// version: 5
//! Confirmed Devnet pNFT delegate, lock, unlock, revoke and transfer campaign.
@@ -1052,21 +1052,21 @@ mod tests {
#[tokio::test]
async fn optional_devnet_metaplex_pnft_lifecycle_campaign_from_env() {
if std::env::var("KB_DEVNET_METAPLEX_PNFT_LIFECYCLE_CAMPAIGN_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_METAPLEX_PNFT_LIFECYCLE_CAMPAIGN_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
assert_eq!(
std::env::var("KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref(),
std::env::var("KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref(),
std::option::Option::Some("1"),
"set KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 before submitting the pNFT lifecycle campaign"
"set KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 before submitting the pNFT lifecycle campaign"
);
let workspace_root = match std::path::Path::new(env!("CARGO_MANIFEST_DIR")).parent() {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KB_DEVNET_CONFIG_PATH") {
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
@@ -1078,11 +1078,11 @@ mod tests {
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KB_DEVNET_PROFILE").ok();
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));
let database_url = std::env::var("KB_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KB_POSTGRES_TEST_URL is required: {error}"));
let database_url = std::env::var("KS_SECRET_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KS_SECRET_POSTGRES_TEST_URL is required: {error}"));
profile.database.backend = "postgres".to_string();
profile.database.postgres.url = database_url;
let http_pool = ks_onchain_transport::HttpEndpointPool::from_profile(&profile)

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/print_burn_campaign.rs
// version: 5
// version: 6
//! Devnet printable master NFT `Print -> Burn` campaign.
@@ -1161,21 +1161,21 @@ mod tests {
#[tokio::test]
async fn optional_devnet_metaplex_print_burn_campaign_from_env() {
if std::env::var("KB_DEVNET_METAPLEX_PRINT_BURN_CAMPAIGN_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_METAPLEX_PRINT_BURN_CAMPAIGN_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
if std::env::var("KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref()
if std::env::var("KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref()
!= std::option::Option::Some("1")
{
panic!("KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 is required for the spending campaign");
panic!("KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 is required for the spending campaign");
}
let workspace_root = match std::path::Path::new(env!("CARGO_MANIFEST_DIR")).parent() {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KB_DEVNET_CONFIG_PATH") {
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
@@ -1187,11 +1187,11 @@ mod tests {
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KB_DEVNET_PROFILE").ok();
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));
let database_url = std::env::var("KB_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KB_POSTGRES_TEST_URL is required: {error}"));
let database_url = std::env::var("KS_SECRET_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KS_SECRET_POSTGRES_TEST_URL is required: {error}"));
profile.database.backend = "postgres".to_string();
profile.database.postgres.url = database_url;
let pool = ks_onchain_transport::HttpEndpointPool::from_profile(&profile)

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/use_campaign.rs
// version: 2
// version: 3
//! Bounded Devnet availability probe for the current Metaplex `Use` surface.
@@ -406,21 +406,21 @@ mod tests {
#[tokio::test]
async fn optional_devnet_metaplex_use_probe_from_env() {
if std::env::var("KB_DEVNET_METAPLEX_USE_PROBE_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_METAPLEX_USE_PROBE_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
assert_eq!(
std::env::var("KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref(),
std::env::var("KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED").ok().as_deref(),
std::option::Option::Some("1"),
"set KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 before submitting an accepted Use probe"
"set KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED=1 before submitting an accepted Use probe"
);
let workspace_root = match std::path::Path::new(env!("CARGO_MANIFEST_DIR")).parent() {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KB_DEVNET_CONFIG_PATH") {
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
@@ -432,11 +432,11 @@ mod tests {
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KB_DEVNET_PROFILE").ok();
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));
let database_url = std::env::var("KB_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KB_POSTGRES_TEST_URL is required: {error}"));
let database_url = std::env::var("KS_SECRET_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KS_SECRET_POSTGRES_TEST_URL is required: {error}"));
profile.database.backend = "postgres".to_string();
profile.database.postgres.url = database_url;
let http_pool = ks_onchain_transport::HttpEndpointPool::from_profile(&profile)

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/solana.rs
// version: 12
// version: 13
//! Devnet Solana execution orchestration with canonical post-validation.
@@ -1332,21 +1332,21 @@ mod tests {
#[tokio::test]
async fn optional_devnet_system_transfer_from_env() {
if std::env::var("KB_DEVNET_EXECUTION_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_EXECUTION_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
let database_url = match std::env::var("KB_POSTGRES_TEST_URL") {
let database_url = match std::env::var("KS_SECRET_POSTGRES_TEST_URL") {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => {
panic!("KB_POSTGRES_TEST_URL is required: {error}");
panic!("KS_SECRET_POSTGRES_TEST_URL is required: {error}");
},
};
let mut profile = example_devnet_profile();
profile.database.backend = "postgres".to_string();
profile.database.postgres.url = database_url;
if let std::result::Result::Ok(directory) = std::env::var("KB_DEVNET_WALLET_DIR") {
if let std::result::Result::Ok(directory) = std::env::var("KS_DEVNET_WALLET_DIR") {
profile.wallet.wallet_dir = directory;
}
let pool = match ks_onchain_transport::HttpEndpointPool::from_profile(&profile) {
@@ -1374,11 +1374,11 @@ mod tests {
std::result::Result::Err(error) => panic!("recipient alias failed: {error}"),
};
let recipient_wallet = ks_wallet::TemporaryWallet::generate(recipient_alias);
let transfer_lamports = std::env::var("KB_DEVNET_TRANSFER_LAMPORTS")
let transfer_lamports = std::env::var("KS_DEVNET_TRANSFER_LAMPORTS")
.ok()
.and_then(|value| return value.parse::<u64>().ok())
.unwrap_or(1_000_000);
let airdrop_lamports = std::env::var("KB_DEVNET_AIRDROP_LAMPORTS")
let airdrop_lamports = std::env::var("KS_DEVNET_AIRDROP_LAMPORTS")
.ok()
.and_then(|value| return value.parse::<u64>().ok())
.unwrap_or(100_000_000);

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/associated_token_account.rs
// version: 11
// version: 12
//! Devnet ATA execution with stateful and canonical post-validation.
@@ -1071,14 +1071,14 @@ mod tests {
#[tokio::test]
async fn optional_devnet_operation_from_env() {
if std::env::var("KB_DEVNET_SPL_ATA_EXECUTION_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_SPL_ATA_EXECUTION_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
let operation_code = std::env::var("KB_DEVNET_SPL_ATA_OPERATION")
let operation_code = std::env::var("KS_DEVNET_SPL_ATA_OPERATION")
.unwrap_or_else(|_| return "create_idempotent".to_string());
let token_program = match std::env::var("KB_DEVNET_SPL_ATA_TOKEN_PROGRAM").ok().as_deref() {
let token_program = match std::env::var("KS_DEVNET_SPL_ATA_TOKEN_PROGRAM").ok().as_deref() {
std::option::Option::Some("token_2022") => {
ks_lib::ExSplAssociatedTokenProgram::Token2022
},
@@ -1087,7 +1087,7 @@ mod tests {
},
std::option::Option::Some(value) => panic!("unsupported Token Program {value}"),
};
let submit = std::env::var("KB_DEVNET_SPL_ATA_SUBMIT").ok().as_deref()
let submit = std::env::var("KS_DEVNET_SPL_ATA_SUBMIT").ok().as_deref()
== std::option::Option::Some("1");
let profile = example_devnet_profile();
let workspace_root = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"))
@@ -1101,16 +1101,16 @@ mod tests {
let operation = match operation_code.as_str() {
"create_idempotent" => ks_lib::ExSplAssociatedTokenAccountOperation::CreateIdempotent {
wallet_owner: ks_lib::MdPubkey(wallet_pubkey),
mint: ks_lib::MdPubkey(required_environment_value("KB_DEVNET_SPL_ATA_MINT")),
mint: ks_lib::MdPubkey(required_environment_value("KS_DEVNET_SPL_ATA_MINT")),
token_program,
},
"recover_nested" => ks_lib::ExSplAssociatedTokenAccountOperation::RecoverNested {
wallet_owner: ks_lib::MdPubkey(wallet_pubkey),
owner_mint: ks_lib::MdPubkey(required_environment_value(
"KB_DEVNET_SPL_ATA_OWNER_MINT",
"KS_DEVNET_SPL_ATA_OWNER_MINT",
)),
nested_mint: ks_lib::MdPubkey(required_environment_value(
"KB_DEVNET_SPL_ATA_NESTED_MINT",
"KS_DEVNET_SPL_ATA_NESTED_MINT",
)),
token_program,
},

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/memo.rs
// version: 7
// version: 8
//! Devnet SPL Memo v4 execution with canonical post-validation.
@@ -810,21 +810,21 @@ mod tests {
#[tokio::test]
async fn optional_devnet_memo_execution_from_env() {
if std::env::var("KB_DEVNET_MEMO_EXECUTION_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_MEMO_EXECUTION_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
let database_url = match std::env::var("KB_POSTGRES_TEST_URL") {
let database_url = match std::env::var("KS_SECRET_POSTGRES_TEST_URL") {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => {
panic!("KB_POSTGRES_TEST_URL is required: {error}");
panic!("KS_SECRET_POSTGRES_TEST_URL is required: {error}");
},
};
let mut profile = example_devnet_profile();
profile.database.backend = "postgres".to_string();
profile.database.postgres.url = database_url;
if let std::result::Result::Ok(directory) = std::env::var("KB_DEVNET_WALLET_DIR") {
if let std::result::Result::Ok(directory) = std::env::var("KS_DEVNET_WALLET_DIR") {
profile.wallet.wallet_dir = directory;
}
let pool = match ks_onchain_transport::HttpEndpointPool::from_profile(&profile) {
@@ -852,7 +852,7 @@ mod tests {
format!("khadhroony-bot3 memo validation {}", uuid::Uuid::new_v4()),
);
request.post_validation_max_retries = 20;
if std::env::var("KB_DEVNET_MEMO_SUBMIT").ok().as_deref() == std::option::Option::Some("1")
if std::env::var("KS_DEVNET_MEMO_SUBMIT").ok().as_deref() == std::option::Option::Some("1")
{
request.submit = true;
request.operator_confirmed = true;

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token/execution.rs
// version: 11
// version: 12
//! Devnet classic SPL Token execution with stateful and canonical post-validation.
@@ -1071,28 +1071,28 @@ mod tests {
#[tokio::test]
async fn optional_devnet_checked_transfer_simulation_and_submission_from_env() {
if std::env::var("KB_DEVNET_SPL_TOKEN_EXECUTION_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_SPL_TOKEN_EXECUTION_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
let source = required_pubkey_env("KB_DEVNET_SPL_TOKEN_SOURCE");
let mint = required_pubkey_env("KB_DEVNET_SPL_TOKEN_MINT");
let destination = required_pubkey_env("KB_DEVNET_SPL_TOKEN_DESTINATION");
let authority = required_pubkey_env("KB_DEVNET_SPL_TOKEN_AUTHORITY");
let decimals = match std::env::var("KB_DEVNET_SPL_TOKEN_DECIMALS") {
let source = required_pubkey_env("KS_DEVNET_SPL_TOKEN_SOURCE");
let mint = required_pubkey_env("KS_DEVNET_SPL_TOKEN_MINT");
let destination = required_pubkey_env("KS_DEVNET_SPL_TOKEN_DESTINATION");
let authority = required_pubkey_env("KS_DEVNET_SPL_TOKEN_AUTHORITY");
let decimals = match std::env::var("KS_DEVNET_SPL_TOKEN_DECIMALS") {
std::result::Result::Ok(value) => match value.parse::<u8>() {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("invalid Token decimals: {error}"),
},
std::result::Result::Err(_) => 9,
};
let amount = match std::env::var("KB_DEVNET_SPL_TOKEN_AMOUNT") {
let amount = match std::env::var("KS_DEVNET_SPL_TOKEN_AMOUNT") {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => "1".to_string(),
};
let mut profile = example_devnet_profile();
if let std::result::Result::Ok(directory) = std::env::var("KB_DEVNET_WALLET_DIR") {
if let std::result::Result::Ok(directory) = std::env::var("KS_DEVNET_WALLET_DIR") {
profile.wallet.wallet_dir = directory;
}
let pool = match ks_onchain_transport::HttpEndpointPool::from_profile(&profile) {
@@ -1119,7 +1119,7 @@ mod tests {
},
},
);
if std::env::var("KB_DEVNET_SPL_TOKEN_SUBMIT").ok().as_deref()
if std::env::var("KS_DEVNET_SPL_TOKEN_SUBMIT").ok().as_deref()
!= std::option::Option::Some("1")
{
let summary = match crate::simulate_devnet_spl_token(
@@ -1146,10 +1146,10 @@ mod tests {
request.submit = true;
request.operator_confirmed = true;
request.post_validation_max_retries = 20;
let database_url = match std::env::var("KB_POSTGRES_TEST_URL") {
let database_url = match std::env::var("KS_SECRET_POSTGRES_TEST_URL") {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => {
panic!("KB_POSTGRES_TEST_URL is required for submission: {error}");
panic!("KS_SECRET_POSTGRES_TEST_URL is required for submission: {error}");
},
};
profile.database.backend = "postgres".to_string();
@@ -1244,17 +1244,17 @@ mod tests {
#[tokio::test]
async fn optional_devnet_recent_instruction_probe_from_env() {
if std::env::var("KB_DEVNET_SPL_TOKEN_RECENT_PROBE_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_SPL_TOKEN_RECENT_PROBE_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
let source = required_pubkey_env("KB_DEVNET_SPL_TOKEN_SOURCE");
let mint = required_pubkey_env("KB_DEVNET_SPL_TOKEN_MINT");
let destination = required_pubkey_env("KB_DEVNET_SPL_TOKEN_DESTINATION");
let authority = required_pubkey_env("KB_DEVNET_SPL_TOKEN_AUTHORITY");
let native_account = required_pubkey_env("KB_DEVNET_SPL_TOKEN_NATIVE_ACCOUNT");
let decimals = match std::env::var("KB_DEVNET_SPL_TOKEN_DECIMALS") {
let source = required_pubkey_env("KS_DEVNET_SPL_TOKEN_SOURCE");
let mint = required_pubkey_env("KS_DEVNET_SPL_TOKEN_MINT");
let destination = required_pubkey_env("KS_DEVNET_SPL_TOKEN_DESTINATION");
let authority = required_pubkey_env("KS_DEVNET_SPL_TOKEN_AUTHORITY");
let native_account = required_pubkey_env("KS_DEVNET_SPL_TOKEN_NATIVE_ACCOUNT");
let decimals = match std::env::var("KS_DEVNET_SPL_TOKEN_DECIMALS") {
std::result::Result::Ok(value) => match value.parse::<u8>() {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("invalid Token decimals: {error}"),
@@ -1262,7 +1262,7 @@ mod tests {
std::result::Result::Err(_) => 9,
};
let mut profile = example_devnet_profile();
if let std::result::Result::Ok(directory) = std::env::var("KB_DEVNET_WALLET_DIR") {
if let std::result::Result::Ok(directory) = std::env::var("KS_DEVNET_WALLET_DIR") {
profile.wallet.wallet_dir = directory;
}
let pool = match ks_onchain_transport::HttpEndpointPool::from_profile(&profile) {

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token/lifecycle.rs
// version: 10
// version: 11
//! Controlled Devnet lifecycle for freshly prepared classic SPL Token accounts.
@@ -1500,24 +1500,24 @@ mod tests {
#[tokio::test]
async fn optional_devnet_controlled_lifecycle_from_env() {
if std::env::var("KB_DEVNET_SPL_TOKEN_LIFECYCLE_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_SPL_TOKEN_LIFECYCLE_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
if std::env::var("KB_DEVNET_SPL_TOKEN_LIFECYCLE_SUBMIT").ok().as_deref()
if std::env::var("KS_DEVNET_SPL_TOKEN_LIFECYCLE_SUBMIT").ok().as_deref()
!= std::option::Option::Some("1")
{
panic!("controlled lifecycle requires KB_DEVNET_SPL_TOKEN_LIFECYCLE_SUBMIT=1");
panic!("controlled lifecycle requires KS_DEVNET_SPL_TOKEN_LIFECYCLE_SUBMIT=1");
}
let mut profile = example_devnet_profile();
if let std::result::Result::Ok(directory) = std::env::var("KB_DEVNET_WALLET_DIR") {
if let std::result::Result::Ok(directory) = std::env::var("KS_DEVNET_WALLET_DIR") {
profile.wallet.wallet_dir = directory;
}
let database_url = match std::env::var("KB_POSTGRES_TEST_URL") {
let database_url = match std::env::var("KS_SECRET_POSTGRES_TEST_URL") {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => {
panic!("KB_POSTGRES_TEST_URL is required for lifecycle submission: {error}");
panic!("KS_SECRET_POSTGRES_TEST_URL is required for lifecycle submission: {error}");
},
};
profile.database.backend = "postgres".to_string();
@@ -1547,7 +1547,7 @@ mod tests {
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let observer = LifecycleTestObserver;
let prepared_accounts = if std::env::var("KB_DEVNET_SPL_TOKEN_LIFECYCLE_PREPARE")
let prepared_accounts = if std::env::var("KS_DEVNET_SPL_TOKEN_LIFECYCLE_PREPARE")
.ok()
.as_deref()
== std::option::Option::Some("1")
@@ -1589,7 +1589,7 @@ mod tests {
};
if prepared_accounts.is_some() {
tokio::time::sleep(std::time::Duration::from_millis(optional_u64_env(
"KB_DEVNET_SPL_TOKEN_LIFECYCLE_PREPARATION_SETTLE_DELAY_MS",
"KS_DEVNET_SPL_TOKEN_LIFECYCLE_PREPARATION_SETTLE_DELAY_MS",
10_000,
)))
.await;
@@ -1603,11 +1603,11 @@ mod tests {
value.authority.clone(),
),
std::option::Option::None => (
required_pubkey_env("KB_DEVNET_SPL_TOKEN_LIFECYCLE_MINT"),
required_pubkey_env("KB_DEVNET_SPL_TOKEN_LIFECYCLE_SOURCE"),
required_pubkey_env("KB_DEVNET_SPL_TOKEN_LIFECYCLE_DESTINATION"),
required_pubkey_env("KB_DEVNET_SPL_TOKEN_LIFECYCLE_DELEGATE"),
required_pubkey_env("KB_DEVNET_SPL_TOKEN_LIFECYCLE_AUTHORITY"),
required_pubkey_env("KS_DEVNET_SPL_TOKEN_LIFECYCLE_MINT"),
required_pubkey_env("KS_DEVNET_SPL_TOKEN_LIFECYCLE_SOURCE"),
required_pubkey_env("KS_DEVNET_SPL_TOKEN_LIFECYCLE_DESTINATION"),
required_pubkey_env("KS_DEVNET_SPL_TOKEN_LIFECYCLE_DELEGATE"),
required_pubkey_env("KS_DEVNET_SPL_TOKEN_LIFECYCLE_AUTHORITY"),
),
};
let mut request = crate::DevnetSplTokenLifecycleRequest::new(
@@ -1618,33 +1618,33 @@ mod tests {
delegate,
authority,
);
request.decimals = optional_u8_env("KB_DEVNET_SPL_TOKEN_LIFECYCLE_DECIMALS", 9);
request.decimals = optional_u8_env("KS_DEVNET_SPL_TOKEN_LIFECYCLE_DECIMALS", 9);
request.mint_amount = ks_lib::ExSplClassicTokenAmount(optional_string_env(
"KB_DEVNET_SPL_TOKEN_LIFECYCLE_MINT_AMOUNT",
"KS_DEVNET_SPL_TOKEN_LIFECYCLE_MINT_AMOUNT",
"10",
));
request.transfer_amount = ks_lib::ExSplClassicTokenAmount(optional_string_env(
"KB_DEVNET_SPL_TOKEN_LIFECYCLE_TRANSFER_AMOUNT",
"KS_DEVNET_SPL_TOKEN_LIFECYCLE_TRANSFER_AMOUNT",
"4",
));
request.approve_amount = ks_lib::ExSplClassicTokenAmount(optional_string_env(
"KB_DEVNET_SPL_TOKEN_LIFECYCLE_APPROVE_AMOUNT",
"KS_DEVNET_SPL_TOKEN_LIFECYCLE_APPROVE_AMOUNT",
"2",
));
request.submit = true;
request.operator_confirmed = true;
request.post_validation_max_retries = 20;
request.first_step_index =
optional_u8_env("KB_DEVNET_SPL_TOKEN_LIFECYCLE_FIRST_STEP_INDEX", 0);
optional_u8_env("KS_DEVNET_SPL_TOKEN_LIFECYCLE_FIRST_STEP_INDEX", 0);
request.resume_predecessor_signature = if request.first_step_index > 0 {
std::option::Option::Some(ks_lib::MdSignature(required_string_env(
"KB_DEVNET_SPL_TOKEN_LIFECYCLE_RESUME_PREDECESSOR_SIGNATURE",
"KS_DEVNET_SPL_TOKEN_LIFECYCLE_RESUME_PREDECESSOR_SIGNATURE",
)))
} else {
std::option::Option::None
};
request.inter_step_delay_ms =
optional_u64_env("KB_DEVNET_SPL_TOKEN_LIFECYCLE_INTER_STEP_DELAY_MS", 2_000);
optional_u64_env("KS_DEVNET_SPL_TOKEN_LIFECYCLE_INTER_STEP_DELAY_MS", 2_000);
let decoders: std::vec::Vec<std::sync::Arc<dyn ks_lib::DcApiInstructionDecoder>> =
std::vec![std::sync::Arc::new(ks_lib::DcSplTokenDecoder)];
let materializers: std::vec::Vec<std::sync::Arc<dyn ks_lib::MtApiEventMaterializer>> =

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token_2022/devnet_scenarios.rs
// version: 9
// version: 10
//! Stable Devnet validation scenarios required to close milestone 0.4.6.
@@ -53,17 +53,17 @@ pub struct DevnetSplValidationScenario {
/// Returns the complete ordered Devnet scenario inventory for milestone 0.4.6.
pub fn devnet_spl_validation_scenarios() -> std::vec::Vec<crate::DevnetSplValidationScenario> {
return vec![
public_scenario("token_2022_mint_to_checked", "Token-2022 MintToChecked", ks_lib::EX_SPL_TOKEN_2022_MINT_TO_CHECKED_OPERATION, &["TOKEN_2022_MINT", "TOKEN_2022_SOURCE", "TOKEN_2022_AUTHORITY", "TOKEN_2022_DECIMALS", "TOKEN_2022_MINT_AMOUNT_RAW"]),
public_scenario("token_2022_transfer_checked", "Token-2022 TransferChecked", ks_lib::EX_SPL_TOKEN_2022_TRANSFER_CHECKED_OPERATION, &["TOKEN_2022_SOURCE", "TOKEN_2022_MINT", "TOKEN_2022_DESTINATION", "TOKEN_2022_AUTHORITY", "TOKEN_2022_DECIMALS", "TOKEN_2022_TRANSFER_AMOUNT_RAW"]),
public_scenario("token_2022_approve_checked", "Token-2022 ApproveChecked", ks_lib::EX_SPL_TOKEN_2022_APPROVE_CHECKED_OPERATION, &["TOKEN_2022_SOURCE", "TOKEN_2022_MINT", "TOKEN_2022_DELEGATE", "TOKEN_2022_AUTHORITY", "TOKEN_2022_DECIMALS", "TOKEN_2022_APPROVE_AMOUNT_RAW"]),
public_scenario("token_2022_revoke", "Token-2022 Revoke", ks_lib::EX_SPL_TOKEN_2022_REVOKE_OPERATION, &["TOKEN_2022_SOURCE", "TOKEN_2022_AUTHORITY"]),
public_scenario("token_2022_burn_checked", "Token-2022 BurnChecked", ks_lib::EX_SPL_TOKEN_2022_BURN_CHECKED_OPERATION, &["TOKEN_2022_SOURCE", "TOKEN_2022_MINT", "TOKEN_2022_AUTHORITY", "TOKEN_2022_DECIMALS", "TOKEN_2022_BURN_AMOUNT_RAW"]),
public_scenario("token_2022_freeze_account", "Token-2022 FreezeAccount", ks_lib::EX_SPL_TOKEN_2022_FREEZE_ACCOUNT_OPERATION, &["TOKEN_2022_SOURCE", "TOKEN_2022_MINT", "TOKEN_2022_FREEZE_AUTHORITY"]),
public_scenario("token_2022_thaw_account", "Token-2022 ThawAccount", ks_lib::EX_SPL_TOKEN_2022_THAW_ACCOUNT_OPERATION, &["TOKEN_2022_SOURCE", "TOKEN_2022_MINT", "TOKEN_2022_FREEZE_AUTHORITY"]),
public_scenario("token_2022_close_destination", "Token-2022 CloseAccount destination", ks_lib::EX_SPL_TOKEN_2022_CLOSE_ACCOUNT_OPERATION, &["TOKEN_2022_DESTINATION", "KB_DEVNET_WALLET_ADDRESS", "TOKEN_2022_AUTHORITY"]),
registry_scenario("elgamal_registry_create", "ElGamal Registry CreateRegistry", "spl.elgamal_registry.create_registry", &["ELGAMAL_REGISTRY_ADDRESS", "ELGAMAL_PUBKEY_BASE64", "PUBKEY_VALIDITY_PROOF_CONTEXT"]),
registry_scenario("elgamal_registry_update", "ElGamal Registry UpdateRegistry", "spl.elgamal_registry.update_registry", &["ELGAMAL_REGISTRY_ADDRESS", "ELGAMAL_PUBKEY_BASE64", "PUBKEY_VALIDITY_PROOF_CONTEXT"]),
confidential_scenario("token_2022_configure_confidential_account", "Token-2022 ConfigureAccountWithRegistry", ks_lib::EX_SPL_TOKEN_2022_CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_WITH_REGISTRY_OPERATION, &["TOKEN_2022_SOURCE", "TOKEN_2022_MINT", "ELGAMAL_REGISTRY_ADDRESS", "PUBKEY_VALIDITY_PROOF_CONTEXT"]),
public_scenario("token_2022_mint_to_checked", "Token-2022 MintToChecked", ks_lib::EX_SPL_TOKEN_2022_MINT_TO_CHECKED_OPERATION, &["KS_PUBLIC_DEVNET_TOKEN_2022_MINT", "KS_PUBLIC_DEVNET_TOKEN_2022_SOURCE", "KS_PUBLIC_DEVNET_TOKEN_2022_AUTHORITY", "KS_PUBLIC_DEVNET_TOKEN_2022_DECIMALS", "KS_PUBLIC_DEVNET_TOKEN_2022_MINT_AMOUNT_RAW"]),
public_scenario("token_2022_transfer_checked", "Token-2022 TransferChecked", ks_lib::EX_SPL_TOKEN_2022_TRANSFER_CHECKED_OPERATION, &["KS_PUBLIC_DEVNET_TOKEN_2022_SOURCE", "KS_PUBLIC_DEVNET_TOKEN_2022_MINT", "KS_PUBLIC_DEVNET_TOKEN_2022_DESTINATION", "KS_PUBLIC_DEVNET_TOKEN_2022_AUTHORITY", "KS_PUBLIC_DEVNET_TOKEN_2022_DECIMALS", "KS_PUBLIC_DEVNET_TOKEN_2022_TRANSFER_AMOUNT_RAW"]),
public_scenario("token_2022_approve_checked", "Token-2022 ApproveChecked", ks_lib::EX_SPL_TOKEN_2022_APPROVE_CHECKED_OPERATION, &["KS_PUBLIC_DEVNET_TOKEN_2022_SOURCE", "KS_PUBLIC_DEVNET_TOKEN_2022_MINT", "KS_PUBLIC_DEVNET_TOKEN_2022_DELEGATE", "KS_PUBLIC_DEVNET_TOKEN_2022_AUTHORITY", "KS_PUBLIC_DEVNET_TOKEN_2022_DECIMALS", "KS_PUBLIC_DEVNET_TOKEN_2022_APPROVE_AMOUNT_RAW"]),
public_scenario("token_2022_revoke", "Token-2022 Revoke", ks_lib::EX_SPL_TOKEN_2022_REVOKE_OPERATION, &["KS_PUBLIC_DEVNET_TOKEN_2022_SOURCE", "KS_PUBLIC_DEVNET_TOKEN_2022_AUTHORITY"]),
public_scenario("token_2022_burn_checked", "Token-2022 BurnChecked", ks_lib::EX_SPL_TOKEN_2022_BURN_CHECKED_OPERATION, &["KS_PUBLIC_DEVNET_TOKEN_2022_SOURCE", "KS_PUBLIC_DEVNET_TOKEN_2022_MINT", "KS_PUBLIC_DEVNET_TOKEN_2022_AUTHORITY", "KS_PUBLIC_DEVNET_TOKEN_2022_DECIMALS", "KS_PUBLIC_DEVNET_TOKEN_2022_BURN_AMOUNT_RAW"]),
public_scenario("token_2022_freeze_account", "Token-2022 FreezeAccount", ks_lib::EX_SPL_TOKEN_2022_FREEZE_ACCOUNT_OPERATION, &["KS_PUBLIC_DEVNET_TOKEN_2022_SOURCE", "KS_PUBLIC_DEVNET_TOKEN_2022_MINT", "KS_PUBLIC_DEVNET_TOKEN_2022_FREEZE_AUTHORITY"]),
public_scenario("token_2022_thaw_account", "Token-2022 ThawAccount", ks_lib::EX_SPL_TOKEN_2022_THAW_ACCOUNT_OPERATION, &["KS_PUBLIC_DEVNET_TOKEN_2022_SOURCE", "KS_PUBLIC_DEVNET_TOKEN_2022_MINT", "KS_PUBLIC_DEVNET_TOKEN_2022_FREEZE_AUTHORITY"]),
public_scenario("token_2022_close_destination", "Token-2022 CloseAccount destination", ks_lib::EX_SPL_TOKEN_2022_CLOSE_ACCOUNT_OPERATION, &["KS_PUBLIC_DEVNET_TOKEN_2022_DESTINATION", "KS_PUBLIC_DEVNET_WALLET_ADDRESS", "KS_PUBLIC_DEVNET_TOKEN_2022_AUTHORITY"]),
registry_scenario("elgamal_registry_create", "ElGamal Registry CreateRegistry", "spl.elgamal_registry.create_registry", &["KS_PUBLIC_DEVNET_ELGAMAL_REGISTRY_ADDRESS", "KS_PUBLIC_DEVNET_ELGAMAL_PUBKEY_BASE64", "KS_PUBLIC_DEVNET_PUBKEY_VALIDITY_PROOF_CONTEXT"]),
registry_scenario("elgamal_registry_update", "ElGamal Registry UpdateRegistry", "spl.elgamal_registry.update_registry", &["KS_PUBLIC_DEVNET_ELGAMAL_REGISTRY_ADDRESS", "KS_PUBLIC_DEVNET_ELGAMAL_PUBKEY_BASE64", "KS_PUBLIC_DEVNET_PUBKEY_VALIDITY_PROOF_CONTEXT"]),
confidential_scenario("token_2022_configure_confidential_account", "Token-2022 ConfigureAccountWithRegistry", ks_lib::EX_SPL_TOKEN_2022_CONFIGURE_CONFIDENTIAL_TRANSFER_ACCOUNT_WITH_REGISTRY_OPERATION, &["KS_PUBLIC_DEVNET_TOKEN_2022_SOURCE", "KS_PUBLIC_DEVNET_TOKEN_2022_MINT", "KS_PUBLIC_DEVNET_ELGAMAL_REGISTRY_ADDRESS", "KS_PUBLIC_DEVNET_PUBKEY_VALIDITY_PROOF_CONTEXT"]),
];
}

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token_2022/fixture.rs
// version: 4
// version: 5
//! Idempotent Token-2022 public scenario fixture preparation.
@@ -376,7 +376,7 @@ fn path_text(path: &std::path::Path) -> ks_core::Result<std::string::String> {
fn render_fixture(summary: &crate::Token2022FixturePreparationSummary) -> std::string::String {
return format!(
"export TOKEN_2022_PROGRAM={}\nexport TOKEN_2022_MINT={}\nexport TOKEN_2022_SOURCE={}\nexport TOKEN_2022_DESTINATION={}\nexport TOKEN_2022_CLOSE_ACCOUNT={}\nexport TOKEN_2022_DELEGATE={}\nexport TOKEN_2022_AUTHORITY={}\nexport TOKEN_2022_FREEZE_AUTHORITY={}\nexport TOKEN_2022_DECIMALS={}\nexport TOKEN_2022_MINT_AMOUNT_RAW={}\nexport TOKEN_2022_TRANSFER_AMOUNT_RAW={}\nexport TOKEN_2022_APPROVE_AMOUNT_RAW={}\nexport TOKEN_2022_BURN_AMOUNT_RAW={}\nexport KB_DEVNET_WALLET_ADDRESS={}\n",
"export KS_PUBLIC_SPL_TOKEN_2022_PROGRAM_ID={}\nexport KS_PUBLIC_DEVNET_TOKEN_2022_MINT={}\nexport KS_PUBLIC_DEVNET_TOKEN_2022_SOURCE={}\nexport KS_PUBLIC_DEVNET_TOKEN_2022_DESTINATION={}\nexport KS_PUBLIC_DEVNET_TOKEN_2022_CLOSE_ACCOUNT={}\nexport KS_PUBLIC_DEVNET_TOKEN_2022_DELEGATE={}\nexport KS_PUBLIC_DEVNET_TOKEN_2022_AUTHORITY={}\nexport KS_PUBLIC_DEVNET_TOKEN_2022_FREEZE_AUTHORITY={}\nexport KS_PUBLIC_DEVNET_TOKEN_2022_DECIMALS={}\nexport KS_PUBLIC_DEVNET_TOKEN_2022_MINT_AMOUNT_RAW={}\nexport KS_PUBLIC_DEVNET_TOKEN_2022_TRANSFER_AMOUNT_RAW={}\nexport KS_PUBLIC_DEVNET_TOKEN_2022_APPROVE_AMOUNT_RAW={}\nexport KS_PUBLIC_DEVNET_TOKEN_2022_BURN_AMOUNT_RAW={}\nexport KS_PUBLIC_DEVNET_WALLET_ADDRESS={}\n",
summary.program_id,
summary.mint,
summary.source,
@@ -444,8 +444,8 @@ mod tests {
assert!(fixture.lines().any(|line| return line.starts_with(format!("export {variable}=").as_str())), "missing {variable}");
}
}
assert!(fixture.contains("export TOKEN_2022_CLOSE_ACCOUNT=close\n"));
assert!(fixture.contains("export KB_DEVNET_WALLET_ADDRESS=authority\n"));
assert!(fixture.contains("export KS_PUBLIC_DEVNET_TOKEN_2022_CLOSE_ACCOUNT=close\n"));
assert!(fixture.contains("export KS_PUBLIC_DEVNET_WALLET_ADDRESS=authority\n"));
}
#[test]

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token_2022/metadata/campaign.rs
// version: 5
// version: 6
//! Ordered confirmed Devnet campaign for the five Token-2022 Token Metadata instructions.
@@ -479,25 +479,25 @@ mod tests {
#[tokio::test]
async fn optional_devnet_token_2022_metadata_campaign_from_env() {
if std::env::var("KB_DEVNET_TOKEN_2022_METADATA_CAMPAIGN_TEST").ok().as_deref()
if std::env::var("KS_DEVNET_TOKEN_2022_METADATA_CAMPAIGN_TEST").ok().as_deref()
!= std::option::Option::Some("1")
{
return;
}
if std::env::var("KB_DEVNET_TOKEN_2022_METADATA_OPERATOR_CONFIRMED")
if std::env::var("KS_DEVNET_TOKEN_2022_METADATA_OPERATOR_CONFIRMED")
.ok()
.as_deref()
!= std::option::Option::Some("1")
{
panic!(
"KB_DEVNET_TOKEN_2022_METADATA_OPERATOR_CONFIRMED=1 is required for the spending campaign"
"KS_DEVNET_TOKEN_2022_METADATA_OPERATOR_CONFIRMED=1 is required for the spending campaign"
);
}
let workspace_root = match std::path::Path::new(env!("CARGO_MANIFEST_DIR")).parent() {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KB_DEVNET_CONFIG_PATH") {
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
@@ -509,11 +509,11 @@ mod tests {
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KB_DEVNET_PROFILE").ok();
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));
let database_url = std::env::var("KB_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KB_POSTGRES_TEST_URL is required: {error}"));
let database_url = std::env::var("KS_SECRET_POSTGRES_TEST_URL")
.unwrap_or_else(|error| panic!("KS_SECRET_POSTGRES_TEST_URL is required: {error}"));
profile.database.backend = "postgres".to_string();
profile.database.postgres.url = database_url;
let pool = ks_onchain_transport::HttpEndpointPool::from_profile(&profile)