// file: ks-lib/tests/external_solana_program_metadata_executor_api.rs // version: 2 //! Downstream-style compilation contract for the Solana Program Metadata executor. #[test] fn external_consumers_build_solana_program_metadata_plans_only_through_crate_root_exports() { let authority = ks_lib::MdPubkey(ks_program_ids::SYSTEM_PROGRAM_ID.to_string()); let account = ks_lib::MdPubkey(ks_program_ids::VOTE_PROGRAM_ID.to_string()); let policy = ks_lib::ExApiExecutionPolicy { cost_limit: ks_lib::ExApiExecutionCostLimit { max_spend_lamports: std::option::Option::Some(0), max_fee_lamports: std::option::Option::Some(20_000), max_compute_unit_price_micro_lamports: std::option::Option::None, }, authorized_signers: std::vec![authority.clone()], post_execution_validation: ks_lib::ExApiPostExecutionValidationPolicy { canonical_insert_required: true, core_extraction_required: true, decode_replay_required: true, materialization_required: true, }, ..ks_lib::ExApiExecutionPolicy::default() }; let intent = ks_lib::ExMetadataSpmExecutionIntent { intent_id: "external-spm-extend".to_string(), fee_payer: authority.clone(), policy, allow_destructive_operation: false, operation: ks_lib::ExMetadataSpmOperation::Extend { account, authority, length: 64, program_context: std::option::Option::None, }, }; let executor = ks_lib::ExMetadataSolanaProgramMetadataExecutor; let program_id = ks_lib::MdProgramId( ks_program_ids::METADATA_SOLANA_PROGRAM_METADATA_PROGRAM_ID.to_string(), ); let capability = ks_lib::ExApiTypedInstructionExecutor::capability( &executor, &program_id, ks_lib::EX_METADATA_SPM_EXTEND_OPERATION, ); assert!(capability.is_supported()); let plan = ks_lib::ExApiTypedInstructionExecutor::build_prepared_plan(&executor, &intent); assert!(plan.is_ok()); let plan = match plan { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; assert_eq!(plan.operation_code, ks_lib::EX_METADATA_SPM_EXTEND_OPERATION); assert_eq!(plan.instructions.len(), 1); assert_eq!(plan.instructions[0].data, std::vec![8, 64, 0]); assert_eq!(plan.instructions[0].accounts.len(), 4); let evaluation = ks_lib::ExSafetyChecker.evaluate_prepared_plan(&plan); assert!(evaluation.is_ok()); assert_eq!( evaluation.as_ref().map(|value| return value.decision), std::result::Result::Ok(ks_lib::ExSafetyDecision::Allow) ); }