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,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)