v0.1.0-pre.061

This commit is contained in:
2026-07-28 18:41:30 +02:00
parent c7bad46f50
commit f40fb78817
527 changed files with 4598 additions and 4114 deletions

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/admin.rs
// version: 6
// version: 7
//! `admin` materializer family.
@@ -11,7 +11,7 @@ pub use self::core::MtAdminMaterializer;
/// Materializes one exact SPL ElGamal registry account snapshot.
pub use self::core::materializer_admin_materialize_elgamal_registry_state_snapshot;
/// Materializes exact Token-2022 administration account snapshots.
pub use self::core::materializer_admin_materialize_token2022_state_snapshots;
pub use self::core::materializer_admin_materialize_token_2022_state_snapshots;
/// Canonical processor name for the native and SPL administration materializer.
pub(crate) use self::constants::MT_ADMIN_PROCESSOR_NAME;

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/admin/core.rs
// version: 17
// version: 19
//! Stable administrative projections derived from exact committed observations.
@@ -14,7 +14,7 @@ const BPF_LOADER_UPGRADEABLE_ENTRIES: &[&str] = &["set_authority", "set_authorit
const LOADER_V4_SURFACE: &str = "solana_native_loader_v4";
const LOADER_V4_ENTRIES: &[&str] = &["transfer_authority"];
const SPL_TOKEN_SURFACE: &str = "spl_token";
const SPL_TOKEN2022_SURFACE: &str = "spl_token2022";
const SPL_TOKEN_2022_SURFACE: &str = "spl_token_2022";
const SPL_ELGAMAL_REGISTRY_SURFACE: &str = "spl_elgamal_registry";
const SPL_ELGAMAL_REGISTRY_ENTRIES: &[&str] = &["create_registry", "update_registry"];
const SPL_TOKEN_AUTHORITY_ENTRIES: &[&str] = &[
@@ -24,7 +24,7 @@ const SPL_TOKEN_AUTHORITY_ENTRIES: &[&str] = &[
"update_interest_bearing_rate",
];
const SPL_TOKEN_MULTISIG_ENTRIES: &[&str] = &["initialize_multisig", "initialize_multisig2"];
const SPL_TOKEN2022_EXTENSION_ADMIN_ENTRIES: &[&str] = &[
const SPL_TOKEN_2022_EXTENSION_ADMIN_ENTRIES: &[&str] = &[
"initialize_transfer_hook",
"update_transfer_hook_program_id",
"initialize_metadata_pointer",
@@ -57,7 +57,7 @@ impl ProjectionKind {
Self::SplTokenAuthority => "spl_token_authority",
Self::SplTokenMultisig => "spl_token_multisig",
Self::SplElgamalRegistry => "spl_elgamal_registry",
Self::SplToken2022ExtensionAdmin => "spl_token2022_extension_admin",
Self::SplToken2022ExtensionAdmin => "spl_token_2022_extension_admin",
};
}
@@ -79,7 +79,7 @@ impl ProjectionKind {
Self::SplTokenMultisig => format!("spl_token_multisig:{operation}:0"),
Self::SplElgamalRegistry => format!("spl_elgamal_registry:{operation}:0"),
Self::SplToken2022ExtensionAdmin => {
format!("spl_token2022_extension_admin:{operation}:0")
format!("spl_token_2022_extension_admin:{operation}:0")
},
};
}
@@ -91,7 +91,7 @@ pub struct MtAdminMaterializer;
impl crate::MtMaterializer for crate::MtAdminMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_admin";
return "kb-lib.materializer.admin";
}
fn materializer_version(&self) -> &'static str {
@@ -258,18 +258,18 @@ fn projection(surface_code: &str, entry_code: &str) -> std::option::Option<Proje
LOADER_V4_SURFACE,
));
}
if matches!(surface_code, SPL_TOKEN_SURFACE | SPL_TOKEN2022_SURFACE)
if matches!(surface_code, SPL_TOKEN_SURFACE | SPL_TOKEN_2022_SURFACE)
&& contains(SPL_TOKEN_AUTHORITY_ENTRIES, entry_code)
{
return std::option::Option::Some(ProjectionKind::SplTokenAuthority);
}
if matches!(surface_code, SPL_TOKEN_SURFACE | SPL_TOKEN2022_SURFACE)
if matches!(surface_code, SPL_TOKEN_SURFACE | SPL_TOKEN_2022_SURFACE)
&& contains(SPL_TOKEN_MULTISIG_ENTRIES, entry_code)
{
return std::option::Option::Some(ProjectionKind::SplTokenMultisig);
}
if surface_code == SPL_TOKEN2022_SURFACE
&& contains(SPL_TOKEN2022_EXTENSION_ADMIN_ENTRIES, entry_code)
if surface_code == SPL_TOKEN_2022_SURFACE
&& contains(SPL_TOKEN_2022_EXTENSION_ADMIN_ENTRIES, entry_code)
{
return std::option::Option::Some(ProjectionKind::SplToken2022ExtensionAdmin);
}
@@ -285,11 +285,11 @@ fn program_matches_surface(event: &crate::MdDecodedProtocolEvent) -> bool {
if event.surface_code.0 == SPL_TOKEN_SURFACE {
return event.program_id.0 == kb_program_ids::SPL_TOKEN_PROGRAM_ID;
}
if event.surface_code.0 == SPL_TOKEN2022_SURFACE {
return event.program_id.0 == kb_program_ids::SPL_TOKEN2022_PROGRAM_ID;
if event.surface_code.0 == SPL_TOKEN_2022_SURFACE {
return event.program_id.0 == kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID;
}
if event.surface_code.0 == SPL_ELGAMAL_REGISTRY_SURFACE {
return event.program_id.0 == kb_program_ids::SPL_TOKEN2022_ELGAMAL_REGISTRY_PROGRAM_ID;
return event.program_id.0 == kb_program_ids::SPL_TOKEN_2022_ELGAMAL_REGISTRY_PROGRAM_ID;
}
return true;
}
@@ -676,9 +676,9 @@ mod tests {
}
#[test]
fn token2022_authority_change_uses_the_admin_owner_once() {
fn token_2022_authority_change_uses_the_admin_owner_once() {
let mut observation = observation(
super::SPL_TOKEN2022_SURFACE,
super::SPL_TOKEN_2022_SURFACE,
"set_authority",
false,
serde_json::json!([
@@ -688,14 +688,14 @@ mod tests {
serde_json::json!({"authorityType":"mint_tokens","newAuthority":null}),
);
observation.event.program_id =
crate::MdProgramId(kb_program_ids::SPL_TOKEN2022_PROGRAM_ID.to_string());
crate::MdProgramId(kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID.to_string());
let result =
crate::MtApiEventMaterializer::materialize(&crate::MtAdminMaterializer, &observation);
assert_eq!(result.status, crate::MtApiMaterializerOutcomeStatus::Inserted);
assert_eq!(result.outputs.len(), 1);
assert_eq!(
result.outputs[0].payload_json["programId"],
kb_program_ids::SPL_TOKEN2022_PROGRAM_ID
kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID
);
}
@@ -800,7 +800,7 @@ mod tests {
serde_json::json!({}),
);
observation.event.program_id = crate::MdProgramId(
kb_program_ids::SPL_TOKEN2022_ELGAMAL_REGISTRY_PROGRAM_ID.to_string(),
kb_program_ids::SPL_TOKEN_2022_ELGAMAL_REGISTRY_PROGRAM_ID.to_string(),
);
observation.payload_json = serde_json::json!({
"accounts": observation.payload_json["accounts"].clone(),
@@ -837,11 +837,11 @@ mod tests {
serde_json::json!({}),
);
foreign.event.program_id =
crate::MdProgramId(kb_program_ids::SPL_TOKEN2022_PROGRAM_ID.to_string());
crate::MdProgramId(kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID.to_string());
assert!(!crate::MtApiEventMaterializer::accepts_observation(&materializer, &foreign,));
let mut failed = foreign.clone();
failed.event.program_id = crate::MdProgramId(
kb_program_ids::SPL_TOKEN2022_ELGAMAL_REGISTRY_PROGRAM_ID.to_string(),
kb_program_ids::SPL_TOKEN_2022_ELGAMAL_REGISTRY_PROGRAM_ID.to_string(),
);
failed.transaction_failed = true;
failed.observation_committed = false;
@@ -850,7 +850,7 @@ mod tests {
}
#[test]
fn token2022_pointer_and_hook_admin_events_have_one_owner() {
fn token_2022_pointer_and_hook_admin_events_have_one_owner() {
for (operation, field, value) in [
("initialize_transfer_hook", "programId", "hook111"),
("update_metadata_pointer", "metadataAddress", "metadata111"),
@@ -858,7 +858,7 @@ mod tests {
("update_group_member_pointer", "memberAddress", "member111"),
] {
let mut observation = observation(
super::SPL_TOKEN2022_SURFACE,
super::SPL_TOKEN_2022_SURFACE,
operation,
false,
serde_json::json!([{"position":0,"accountKey":"mint111"}]),
@@ -866,7 +866,7 @@ mod tests {
);
observation.event.event_family = crate::MdEventFamily::TokenAccount;
observation.event.program_id =
crate::MdProgramId(kb_program_ids::SPL_TOKEN2022_PROGRAM_ID.to_string());
crate::MdProgramId(kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID.to_string());
let result = crate::MtApiEventMaterializer::materialize(
&crate::MtAdminMaterializer,
&observation,
@@ -879,9 +879,9 @@ mod tests {
}
#[test]
fn token2022_extension_admin_rejects_foreign_program_and_failed_transaction() {
fn token_2022_extension_admin_rejects_foreign_program_and_failed_transaction() {
let mut observation = observation(
super::SPL_TOKEN2022_SURFACE,
super::SPL_TOKEN_2022_SURFACE,
"initialize_metadata_pointer",
false,
serde_json::json!([]),
@@ -895,7 +895,7 @@ mod tests {
&observation,
));
observation.event.program_id =
crate::MdProgramId(kb_program_ids::SPL_TOKEN2022_PROGRAM_ID.to_string());
crate::MdProgramId(kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID.to_string());
observation.transaction_failed = true;
observation.observation_committed = false;
let result =
@@ -905,7 +905,7 @@ mod tests {
}
/// Materialize authoritative Token-2022 administrative extension snapshots.
pub fn materializer_admin_materialize_token2022_state_snapshots(
pub fn materializer_admin_materialize_token_2022_state_snapshots(
account_key: &str,
slot: u64,
state: &crate::DcToken2022State,
@@ -917,7 +917,7 @@ pub fn materializer_admin_materialize_token2022_state_snapshots(
}
if state.kind != crate::DcToken2022StateKind::Mint {
for entry in &state.extensions {
if is_token2022_admin_mint_extension(entry.extension_name) {
if is_token_2022_admin_mint_extension(entry.extension_name) {
return std::result::Result::Err(format!(
"Token-2022 {} extension requires mint state",
entry.extension_name
@@ -928,22 +928,22 @@ pub fn materializer_admin_materialize_token2022_state_snapshots(
}
let mut outputs = std::vec::Vec::new();
for entry in &state.extensions {
if !is_token2022_admin_mint_extension(entry.extension_name) {
if !is_token_2022_admin_mint_extension(entry.extension_name) {
continue;
}
let output_key =
format!("token2022_admin_state:{}:{account_key}:{slot}", entry.extension_name);
format!("token_2022_admin_state:{}:{account_key}:{slot}", entry.extension_name);
outputs.push(crate::MtApiMaterializedOutput {
output_key: output_key.clone(),
family: crate::MdMaterializedEventFamily::Admin,
payload_json: serde_json::json!({
"projectionVersion": 1,
"projectionSemantics": "authoritative_bounded_admin_state_snapshot",
"domain": "token2022_extension_admin_state",
"domain": "token_2022_extension_admin_state",
"idempotenceKey": output_key,
"accountKey": account_key,
"slot": slot,
"programId": kb_program_ids::SPL_TOKEN2022_PROGRAM_ID,
"programId": kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID,
"stateKind": "mint",
"extensionType": entry.extension_type,
"extensionName": entry.extension_name,
@@ -953,7 +953,7 @@ pub fn materializer_admin_materialize_token2022_state_snapshots(
"provenance": {
"processorName": crate::MT_ADMIN_PROCESSOR_NAME,
"processorVersion": env!("CARGO_PKG_VERSION"),
"source": "exact_token2022_tlv_state_parser"
"source": "exact_token_2022_tlv_state_parser"
}
}),
});
@@ -961,7 +961,7 @@ pub fn materializer_admin_materialize_token2022_state_snapshots(
return std::result::Result::Ok(outputs);
}
fn is_token2022_admin_mint_extension(extension_name: &str) -> bool {
fn is_token_2022_admin_mint_extension(extension_name: &str) -> bool {
return matches!(
extension_name,
"mint_close_authority"
@@ -979,7 +979,7 @@ fn is_token2022_admin_mint_extension(extension_name: &str) -> bool {
}
#[cfg(test)]
mod token2022_admin_state_tests {
mod token_2022_admin_state_tests {
fn mint_state() -> crate::DcToken2022State {
return crate::DcToken2022State {
kind: crate::DcToken2022StateKind::Mint,
@@ -1013,9 +1013,9 @@ mod token2022_admin_state_tests {
fn admin_snapshots_are_owned_once_filtered_and_idempotent() {
let state = mint_state();
let first =
crate::materializer_admin_materialize_token2022_state_snapshots("mint111", 44, &state);
crate::materializer_admin_materialize_token_2022_state_snapshots("mint111", 44, &state);
let second =
crate::materializer_admin_materialize_token2022_state_snapshots("mint111", 44, &state);
crate::materializer_admin_materialize_token_2022_state_snapshots("mint111", 44, &state);
assert_eq!(first, second);
assert_eq!(first.as_ref().map(std::vec::Vec::len), std::result::Result::Ok(2));
assert_eq!(
@@ -1036,7 +1036,7 @@ mod token2022_admin_state_tests {
fn admin_snapshots_reject_empty_identity_and_wrong_state_kind() {
let state = mint_state();
assert!(
crate::materializer_admin_materialize_token2022_state_snapshots("", 44, &state)
crate::materializer_admin_materialize_token_2022_state_snapshots("", 44, &state)
.is_err()
);
let account_state = crate::DcToken2022State {
@@ -1047,7 +1047,7 @@ mod token2022_admin_state_tests {
extensions: state.extensions[..1].to_vec(),
};
assert!(
crate::materializer_admin_materialize_token2022_state_snapshots(
crate::materializer_admin_materialize_token_2022_state_snapshots(
"account111",
44,
&account_state,
@@ -1078,7 +1078,7 @@ pub fn materializer_admin_materialize_elgamal_registry_state_snapshot(
"idempotenceKey": format!("spl_elgamal_registry:{registry_account_key}:{slot}"),
"registryAccountKey": registry_account_key,
"slot": slot,
"programId": kb_program_ids::SPL_TOKEN2022_ELGAMAL_REGISTRY_PROGRAM_ID,
"programId": kb_program_ids::SPL_TOKEN_2022_ELGAMAL_REGISTRY_PROGRAM_ID,
"owner": state.owner,
"elgamalPubkeyBase64": state.elgamal_pubkey_base64,
"wireHex": state.wire_hex,

View File

@@ -1,7 +1,7 @@
// file: kb-lib/src/materializer/api.rs
// version: 3
// version: 4
//! Materializer contracts consolidated from `kb_materializer_api`.
//! Materializer contracts.
mod contracts;
mod materializer;

View File

@@ -9,7 +9,7 @@ pub struct MtBridgeMaterializer;
impl crate::MtMaterializer for crate::MtBridgeMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_bridge";
return "kb-lib.materializer.bridge";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtBridgeMaterializer {
impl crate::MtApiEventMaterializer for crate::MtBridgeMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_bridge".to_string(),
name: "kb-lib.materializer.bridge".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/compliance/audit.rs
// version: 8
// version: 9
//! Stable compliance-audit projections for committed native bytecode mutations and execution profiles.
@@ -51,7 +51,7 @@ pub struct MtComplianceAuditMaterializer;
impl crate::MtMaterializer for crate::MtComplianceAuditMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_compliance_audit";
return "kb-lib.materializer.compliance.audit";
}
fn materializer_version(&self) -> &'static str {

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/fees.rs
// version: 3
// version: 4
//! `fees` materializer family.
@@ -8,4 +8,4 @@ mod core;
/// Fee materializer for committed Token-2022 fee observations.
pub use self::core::MtFeesMaterializer;
/// Materializes authoritative Token-2022 fee extension snapshots.
pub use self::core::materializer_fees_materialize_token2022_state_snapshots;
pub use self::core::materializer_fees_materialize_token_2022_state_snapshots;

View File

@@ -1,11 +1,11 @@
// file: kb-lib/src/materializer/fees/core.rs
// version: 3
// version: 4
//! Stable fee projections derived from exact committed Token-2022 observations.
const ACCEPTED_FAMILIES: &[crate::MdEventFamily] = &[crate::MdEventFamily::Fee];
const SPL_TOKEN2022_SURFACE: &str = "spl_token2022";
const TOKEN2022_FEE_ENTRIES: &[&str] = &[
const SPL_TOKEN_2022_SURFACE: &str = "spl_token_2022";
const TOKEN_2022_FEE_ENTRIES: &[&str] = &[
"initialize_transfer_fee_config",
"set_transfer_fee",
"withdraw_withheld_tokens_from_mint",
@@ -27,7 +27,7 @@ pub struct MtFeesMaterializer;
impl crate::MtMaterializer for crate::MtFeesMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_fees";
return "kb-lib.materializer.fees";
}
fn materializer_version(&self) -> &'static str {
return env!("CARGO_PKG_VERSION");
@@ -87,7 +87,7 @@ impl crate::MtApiEventMaterializer for crate::MtFeesMaterializer {
.cloned()
.unwrap_or_else(|| return observation.payload_json.clone());
let output = crate::MtApiMaterializedOutput {
output_key: format!("token2022_fee:{operation}:0"),
output_key: format!("token_2022_fee:{operation}:0"),
family: crate::MdMaterializedEventFamily::Fee,
payload_json: serde_json::json!({
"projectionVersion": 1,
@@ -117,16 +117,16 @@ impl crate::MtApiEventMaterializer for crate::MtFeesMaterializer {
fn accepts_event(event: &crate::MdDecodedProtocolEvent) -> bool {
return event.event_family == crate::MdEventFamily::Fee
&& event.surface_code.0 == SPL_TOKEN2022_SURFACE
&& event.program_id.0 == kb_program_ids::SPL_TOKEN2022_PROGRAM_ID
&& contains(TOKEN2022_FEE_ENTRIES, event.event_name.0.as_str());
&& event.surface_code.0 == SPL_TOKEN_2022_SURFACE
&& event.program_id.0 == kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID
&& contains(TOKEN_2022_FEE_ENTRIES, event.event_name.0.as_str());
}
fn fee_domain(operation: &str) -> &'static str {
if operation.contains("confidential") {
return "token2022_confidential_transfer_fee";
return "token_2022_confidential_transfer_fee";
}
return "token2022_transfer_fee";
return "token_2022_transfer_fee";
}
fn state_read_required(operation: &str) -> bool {
@@ -151,7 +151,7 @@ fn contains(entries: &[&str], entry_code: &str) -> bool {
}
/// Materialize authoritative Token-2022 fee extension snapshots without decrypting confidential values.
pub fn materializer_fees_materialize_token2022_state_snapshots(
pub fn materializer_fees_materialize_token_2022_state_snapshots(
account_key: &str,
slot: u64,
state: &crate::DcToken2022State,
@@ -190,7 +190,7 @@ pub fn materializer_fees_materialize_token2022_state_snapshots(
}
outputs.push(crate::MtApiMaterializedOutput {
output_key: format!(
"token2022_fee_state:{}:{account_key}:{slot}",
"token_2022_fee_state:{}:{account_key}:{slot}",
entry.extension_name
),
family: crate::MdMaterializedEventFamily::Fee,
@@ -198,17 +198,17 @@ pub fn materializer_fees_materialize_token2022_state_snapshots(
"projectionVersion": 1,
"projectionSemantics": "authoritative_bounded_fee_state_snapshot",
"domain": if confidential {
"token2022_confidential_transfer_fee_state"
"token_2022_confidential_transfer_fee_state"
} else {
"token2022_transfer_fee_state"
"token_2022_transfer_fee_state"
},
"idempotenceKey": format!(
"token2022_fee_state:{}:{account_key}:{slot}",
"token_2022_fee_state:{}:{account_key}:{slot}",
entry.extension_name
),
"accountKey": account_key,
"slot": slot,
"programId": kb_program_ids::SPL_TOKEN2022_PROGRAM_ID,
"programId": kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID,
"stateKind": state_kind,
"extensionType": entry.extension_type,
"extensionName": entry.extension_name,
@@ -220,7 +220,7 @@ pub fn materializer_fees_materialize_token2022_state_snapshots(
"provenance": {
"processorName": "fees",
"processorVersion": env!("CARGO_PKG_VERSION"),
"source": "bounded_token2022_state_parser"
"source": "bounded_token_2022_state_parser"
}
}),
});
@@ -243,7 +243,7 @@ mod tests {
slot: crate::MdSlot(42),
instruction_path: crate::MdInstructionPath("0".to_string()),
program_id: crate::MdProgramId(program_id.to_string()),
protocol_code: crate::MdProtocolCode("spl_token2022".to_string()),
protocol_code: crate::MdProtocolCode("spl_token_2022".to_string()),
surface_code: crate::MdSurfaceCode(surface_code.to_string()),
event_code: crate::MdEventCode(format!("{surface_code}.{entry_code}")),
event_name: crate::MdEventName(entry_code.to_string()),
@@ -271,10 +271,10 @@ mod tests {
}
#[test]
fn committed_token2022_fee_instruction_creates_one_stable_output() {
fn committed_token_2022_fee_instruction_creates_one_stable_output() {
let observation = observation(
super::SPL_TOKEN2022_SURFACE,
kb_program_ids::SPL_TOKEN2022_PROGRAM_ID,
super::SPL_TOKEN_2022_SURFACE,
kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID,
"set_transfer_fee",
false,
);
@@ -283,15 +283,15 @@ mod tests {
assert_eq!(result.status, crate::MtApiMaterializerOutcomeStatus::Inserted);
assert_eq!(result.outputs.len(), 1);
assert_eq!(result.outputs[0].family, crate::MdMaterializedEventFamily::Fee);
assert_eq!(result.outputs[0].output_key, "token2022_fee:set_transfer_fee:0");
assert_eq!(result.outputs[0].output_key, "token_2022_fee:set_transfer_fee:0");
assert_eq!(result.outputs[0].payload_json["stateReadRequired"], true);
}
#[test]
fn failed_token2022_fee_instruction_is_refused() {
fn failed_token_2022_fee_instruction_is_refused() {
let observation = observation(
super::SPL_TOKEN2022_SURFACE,
kb_program_ids::SPL_TOKEN2022_PROGRAM_ID,
super::SPL_TOKEN_2022_SURFACE,
kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID,
"harvest_withheld_tokens_to_mint",
true,
);
@@ -310,7 +310,7 @@ mod tests {
false,
);
let wrong_program = observation(
super::SPL_TOKEN2022_SURFACE,
super::SPL_TOKEN_2022_SURFACE,
kb_program_ids::SPL_TOKEN_PROGRAM_ID,
"set_transfer_fee",
false,
@@ -334,8 +334,8 @@ mod tests {
#[test]
fn committed_confidential_fee_instruction_is_projected_without_decryption() {
let observation = observation(
super::SPL_TOKEN2022_SURFACE,
kb_program_ids::SPL_TOKEN2022_PROGRAM_ID,
super::SPL_TOKEN_2022_SURFACE,
kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID,
"initialize_confidential_transfer_fee_config",
false,
);
@@ -343,7 +343,10 @@ mod tests {
crate::MtApiEventMaterializer::materialize(&crate::MtFeesMaterializer, &observation);
assert_eq!(result.status, crate::MtApiMaterializerOutcomeStatus::Inserted);
assert_eq!(result.outputs.len(), 1);
assert_eq!(result.outputs[0].payload_json["domain"], "token2022_confidential_transfer_fee");
assert_eq!(
result.outputs[0].payload_json["domain"],
"token_2022_confidential_transfer_fee"
);
assert_eq!(result.outputs[0].payload_json["stateReadRequired"], true);
assert_eq!(result.outputs[0].payload_json["confidentialValuesDecrypted"], false);
}
@@ -353,7 +356,7 @@ mod tests {
assert!(!super::state_read_required("transfer_confidential_tokens_with_fee",));
assert_eq!(
super::fee_domain("transfer_confidential_tokens_with_fee"),
"token2022_confidential_transfer_fee"
"token_2022_confidential_transfer_fee"
);
}
@@ -372,9 +375,9 @@ mod tests {
}],
};
let first =
crate::materializer_fees_materialize_token2022_state_snapshots("mint111", 42, &mint);
crate::materializer_fees_materialize_token_2022_state_snapshots("mint111", 42, &mint);
let second =
crate::materializer_fees_materialize_token2022_state_snapshots("mint111", 42, &mint);
crate::materializer_fees_materialize_token_2022_state_snapshots("mint111", 42, &mint);
assert!(first.is_ok());
assert_eq!(first, second);
let outputs = match first {
@@ -401,7 +404,7 @@ mod tests {
value_fields: serde_json::json!({"withheldAmount":"ciphertext"}),
}],
};
let result = crate::materializer_fees_materialize_token2022_state_snapshots(
let result = crate::materializer_fees_materialize_token_2022_state_snapshots(
"account111",
43,
&account,
@@ -431,7 +434,7 @@ mod tests {
}],
};
assert!(
crate::materializer_fees_materialize_token2022_state_snapshots(
crate::materializer_fees_materialize_token_2022_state_snapshots(
"account111",
44,
&wrong,
@@ -439,7 +442,7 @@ mod tests {
.is_err()
);
assert!(
crate::materializer_fees_materialize_token2022_state_snapshots("", 44, &wrong,)
crate::materializer_fees_materialize_token_2022_state_snapshots("", 44, &wrong,)
.is_err()
);
}

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/governance/core.rs
// version: 3
// version: 4
//! Reserved governance materializer.
@@ -9,7 +9,7 @@ pub struct MtGovernanceMaterializer;
impl crate::MtMaterializer for crate::MtGovernanceMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_governance";
return "kb-lib.materializer.governance";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtGovernanceMaterializer {
impl crate::MtApiEventMaterializer for crate::MtGovernanceMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_governance".to_string(),
name: "kb-lib.materializer.governance".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/lending/core.rs
// version: 3
// version: 4
//! Reserved lending materializer.
@@ -9,7 +9,7 @@ pub struct MtLendingMaterializer;
impl crate::MtMaterializer for crate::MtLendingMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_lending";
return "kb-lib.materializer.lending";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtLendingMaterializer {
impl crate::MtApiEventMaterializer for crate::MtLendingMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_lending".to_string(),
name: "kb-lib.materializer.lending".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -125,7 +125,7 @@ pub struct MtLifecycleMaterializer;
impl crate::MtMaterializer for crate::MtLifecycleMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_lifecycle";
return "kb-lib.materializer.lifecycle";
}
fn materializer_version(&self) -> &'static str {

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/liquidity/core.rs
// version: 3
// version: 4
//! Reserved liquidity materializer.
@@ -9,7 +9,7 @@ pub struct MtLiquidityMaterializer;
impl crate::MtMaterializer for crate::MtLiquidityMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_liquidity";
return "kb-lib.materializer.liquidity";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtLiquidityMaterializer {
impl crate::MtApiEventMaterializer for crate::MtLiquidityMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_liquidity".to_string(),
name: "kb-lib.materializer.liquidity".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/metadata.rs
// version: 3
// version: 4
//! `metadata` materializer family.
@@ -12,4 +12,4 @@ pub use self::core::materializer_metadata_materialize_metaplex_account_snapshot;
/// Materializes one canonical Metaplex Metadata account snapshot.
pub use self::core::materializer_metadata_materialize_metaplex_metadata_snapshot;
/// Materializes Token-2022 embedded metadata and group snapshots.
pub use self::core::materializer_metadata_materialize_token2022_snapshot;
pub use self::core::materializer_metadata_materialize_token_2022_snapshot;

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/metadata/core.rs
// version: 3
// version: 5
//! Stable Token-2022 and Metaplex metadata snapshot materializer.
@@ -9,7 +9,7 @@ pub struct MtMetadataMaterializer;
impl crate::MtMaterializer for crate::MtMetadataMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_metadata";
return "kb-lib.materializer.metadata";
}
fn materializer_version(&self) -> &'static str {
@@ -35,7 +35,7 @@ impl crate::MtMaterializer for crate::MtMetadataMaterializer {
}
/// Materialize embedded Token-2022 metadata, group, and group-member extensions.
pub fn materializer_metadata_materialize_token2022_snapshot(
pub fn materializer_metadata_materialize_token_2022_snapshot(
account_key: &str,
slot: u64,
state: &crate::DcToken2022State,
@@ -63,17 +63,17 @@ pub fn materializer_metadata_materialize_token2022_snapshot(
std::option::Option::None => continue,
};
outputs.push(crate::MtApiMaterializedOutput {
output_key: format!("token2022_metadata_snapshot:{account_key}:{slot}:{kind}"),
output_key: format!("token_2022_metadata_snapshot:{account_key}:{slot}:{kind}"),
family: crate::MdMaterializedEventFamily::Metadata,
payload_json: serde_json::json!({
"projectionVersion": 1,
"domain": "spl_token2022_embedded_metadata",
"domain": "spl_token_2022_embedded_metadata",
"projectionSemantics": "authoritative_bounded_mint_extension_snapshot",
"idempotenceKey": format!("token2022_metadata:{account_key}:{slot}:{kind}"),
"idempotenceKey": format!("token_2022_metadata:{account_key}:{slot}:{kind}"),
"accountKey": account_key,
"slot": slot,
"programId": kb_program_ids::SPL_TOKEN2022_PROGRAM_ID,
"metadataSource": "token2022_embedded_tlv",
"programId": kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID,
"metadataSource": "token_2022_embedded_tlv",
"projectionKind": kind,
"extensionType": entry.extension_type,
"extensionName": entry.extension_name,
@@ -83,9 +83,9 @@ pub fn materializer_metadata_materialize_token2022_snapshot(
"identityAuthority": "mint_address",
"finalAccountStateCaptured": true,
"provenance": {
"processorName": "kb_materializer_metadata",
"processorName": "kb-lib.materializer.metadata",
"processorVersion": env!("CARGO_PKG_VERSION"),
"source": "bounded_token2022_state_parser"
"source": "bounded_token_2022_state_parser"
}
}),
});
@@ -154,7 +154,7 @@ pub fn materializer_metadata_materialize_metaplex_metadata_snapshot(
"instructionIndex": snapshot.provenance.instruction_index,
"innerInstructionIndex": snapshot.provenance.inner_instruction_index,
"committed": snapshot.provenance.committed,
"processorName": "kb_materializer_metadata",
"processorName": "kb-lib.materializer.metadata",
"processorVersion": env!("CARGO_PKG_VERSION")
}
});
@@ -282,30 +282,32 @@ pub fn materializer_metadata_materialize_metaplex_account_snapshot(
);
},
crate::DcMetadataMtmCanonicalMetadataAccountState::Edition(value) => {
("edition_state", "kb_materializer_metadata", value.payload_json.clone())
},
crate::DcMetadataMtmCanonicalMetadataAccountState::EditionMarker(value) => {
("edition_marker_state", "kb_materializer_metadata", value.payload_json.clone())
("edition_state", "kb-lib.materializer.metadata", value.payload_json.clone())
},
crate::DcMetadataMtmCanonicalMetadataAccountState::EditionMarker(value) => (
"edition_marker_state",
"kb-lib.materializer.metadata",
value.payload_json.clone(),
),
crate::DcMetadataMtmCanonicalMetadataAccountState::TokenRecord(value) => (
"programmable_token_state",
"kb_materializer_lifecycle",
"kb-lib.materializer.lifecycle",
value.payload_json.clone(),
),
crate::DcMetadataMtmCanonicalMetadataAccountState::DelegateRecord(value) => {
("delegate_admin_state", "kb_materializer_admin", value.payload_json.clone())
("delegate_admin_state", "kb-lib.materializer.admin", value.payload_json.clone())
},
crate::DcMetadataMtmCanonicalMetadataAccountState::AuthorityRecord(value) => {
("authority_admin_state", "kb_materializer_admin", value.payload_json.clone())
("authority_admin_state", "kb-lib.materializer.admin", value.payload_json.clone())
},
crate::DcMetadataMtmCanonicalMetadataAccountState::TokenOwnedEscrow(value) => (
"token_owned_escrow_state",
"kb_materializer_lifecycle",
"kb-lib.materializer.lifecycle",
value.payload_json.clone(),
),
crate::DcMetadataMtmCanonicalMetadataAccountState::ReservationList(value) => (
"historical_reservation_state",
"kb_materializer_metadata",
"kb-lib.materializer.metadata",
value.payload_json.clone(),
),
};
@@ -354,7 +356,7 @@ pub fn materializer_metadata_materialize_metaplex_account_snapshot(
"instructionIndex": snapshot.provenance.instruction_index,
"innerInstructionIndex": snapshot.provenance.inner_instruction_index,
"committed": snapshot.provenance.committed,
"processorName": "kb_materializer_metadata",
"processorName": "kb-lib.materializer.metadata",
"processorVersion": env!("CARGO_PKG_VERSION")
}
}),
@@ -450,7 +452,7 @@ mod tests_metaplex_account_state {
let output = crate::materializer_metadata_materialize_metaplex_account_snapshot(&token);
assert_eq!(
output.as_ref().map(|value| return value.payload_json["factOwner"].clone()),
std::result::Result::Ok(serde_json::json!("kb_materializer_lifecycle"))
std::result::Result::Ok(serde_json::json!("kb-lib.materializer.lifecycle"))
);
assert_eq!(
output.as_ref().map(|value| return value.payload_json["projectionKind"].clone()),
@@ -490,7 +492,7 @@ mod tests_metaplex_account_state {
}
#[cfg(test)]
mod tests_token2022_state {
mod tests_token_2022_state {
#[test]
fn embedded_metadata_group_and_member_have_distinct_stable_outputs() {
let state = crate::DcToken2022State {
@@ -520,13 +522,13 @@ mod tests_token2022_state {
],
};
let outputs =
crate::materializer_metadata_materialize_token2022_snapshot("mint111", 9, &state);
crate::materializer_metadata_materialize_token_2022_snapshot("mint111", 9, &state);
assert_eq!(outputs.as_ref().map(|values| return values.len()), std::result::Result::Ok(3));
assert_eq!(
outputs
.as_ref()
.map(|values| return values[0].payload_json["metadataSource"].clone()),
std::result::Result::Ok(serde_json::json!("token2022_embedded_tlv"))
std::result::Result::Ok(serde_json::json!("token_2022_embedded_tlv"))
);
assert_eq!(
outputs
@@ -557,13 +559,13 @@ mod tests_token2022_state {
}],
};
let first =
crate::materializer_metadata_materialize_token2022_snapshot("mint111", 9, &state);
crate::materializer_metadata_materialize_token_2022_snapshot("mint111", 9, &state);
let second =
crate::materializer_metadata_materialize_token2022_snapshot("mint111", 9, &state);
crate::materializer_metadata_materialize_token_2022_snapshot("mint111", 9, &state);
assert_eq!(first, second);
assert_eq!(first.as_ref().map(|values| return values.len()), std::result::Result::Ok(0));
assert!(
crate::materializer_metadata_materialize_token2022_snapshot("", 9, &state).is_err()
crate::materializer_metadata_materialize_token_2022_snapshot("", 9, &state).is_err()
);
let account_state = crate::DcToken2022State {
kind: crate::DcToken2022StateKind::Account,
@@ -573,7 +575,7 @@ mod tests_token2022_state {
extensions: std::vec::Vec::new(),
};
assert!(
crate::materializer_metadata_materialize_token2022_snapshot(
crate::materializer_metadata_materialize_token_2022_snapshot(
"account111",
9,
&account_state

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/nft/core.rs
// version: 3
// version: 4
//! Reserved NFT materializer.
@@ -9,7 +9,7 @@ pub struct MtNftMaterializer;
impl crate::MtMaterializer for crate::MtNftMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_nft";
return "kb-lib.materializer.nft";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtNftMaterializer {
impl crate::MtApiEventMaterializer for crate::MtNftMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_nft".to_string(),
name: "kb-lib.materializer.nft".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/oracle/core.rs
// version: 3
// version: 4
//! Reserved oracle materializer.
@@ -9,7 +9,7 @@ pub struct MtOracleMaterializer;
impl crate::MtMaterializer for crate::MtOracleMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_oracle";
return "kb-lib.materializer.oracle";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtOracleMaterializer {
impl crate::MtApiEventMaterializer for crate::MtOracleMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_oracle".to_string(),
name: "kb-lib.materializer.oracle".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/orderbook/core.rs
// version: 3
// version: 4
//! Reserved orderbook materializer.
@@ -9,7 +9,7 @@ pub struct MtOrderbookMaterializer;
impl crate::MtMaterializer for crate::MtOrderbookMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_orderbook";
return "kb-lib.materializer.orderbook";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtOrderbookMaterializer {
impl crate::MtApiEventMaterializer for crate::MtOrderbookMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_orderbook".to_string(),
name: "kb-lib.materializer.orderbook".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -9,7 +9,7 @@ pub struct MtPerpetualsMaterializer;
impl crate::MtMaterializer for crate::MtPerpetualsMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_perpetuals";
return "kb-lib.materializer.perpetuals";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtPerpetualsMaterializer {
impl crate::MtApiEventMaterializer for crate::MtPerpetualsMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_perpetuals".to_string(),
name: "kb-lib.materializer.perpetuals".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/pool/state.rs
// version: 3
// version: 4
//! Reserved pool-state materializer.
@@ -9,7 +9,7 @@ pub struct MtPoolStateMaterializer;
impl crate::MtMaterializer for crate::MtPoolStateMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_pool_state";
return "kb-lib.materializer.pool.state";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtPoolStateMaterializer {
impl crate::MtApiEventMaterializer for crate::MtPoolStateMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_pool_state".to_string(),
name: "kb-lib.materializer.pool.state".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/rewards/core.rs
// version: 3
// version: 4
//! Reserved rewards materializer.
@@ -9,7 +9,7 @@ pub struct MtRewardsMaterializer;
impl crate::MtMaterializer for crate::MtRewardsMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_rewards";
return "kb-lib.materializer.rewards";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtRewardsMaterializer {
impl crate::MtApiEventMaterializer for crate::MtRewardsMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_rewards".to_string(),
name: "kb-lib.materializer.rewards".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/risk/core.rs
// version: 3
// version: 5
//! Stable fact-only risk projections for committed SPL Token and ATA observations.
@@ -42,7 +42,7 @@ pub struct MtRiskMaterializer;
impl crate::MtMaterializer for crate::MtRiskMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_risk";
return "kb-lib.materializer.risk";
}
fn materializer_version(&self) -> &'static str {
return env!("CARGO_PKG_VERSION");
@@ -169,8 +169,8 @@ impl crate::MtApiEventMaterializer for crate::MtRiskMaterializer {
fn accepts_event(event: &crate::MdDecodedProtocolEvent) -> bool {
let token_program = (event.program_id.0 == kb_program_ids::SPL_TOKEN_PROGRAM_ID
&& event.surface_code.0 == "spl_token")
|| (event.program_id.0 == kb_program_ids::SPL_TOKEN2022_PROGRAM_ID
&& event.surface_code.0 == "spl_token2022");
|| (event.program_id.0 == kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID
&& event.surface_code.0 == "spl_token_2022");
let token_risk = token_program && RISK_ENTRIES.contains(&event.event_name.0.as_str());
return ACCEPTED_FAMILIES.contains(&event.event_family)
&& (token_risk || is_ata_recovery(event));
@@ -200,7 +200,7 @@ fn ata_addresses_valid(payload: &serde_json::Value) -> bool {
let token_program_exact = matches!(
token_program_id,
std::option::Option::Some(kb_program_ids::SPL_TOKEN_PROGRAM_ID)
| std::option::Option::Some(kb_program_ids::SPL_TOKEN2022_PROGRAM_ID)
| std::option::Option::Some(kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID)
);
return token_supported
&& token_program_exact
@@ -332,7 +332,7 @@ mod tests {
};
}
fn token2022_observation(
fn token_2022_observation(
entry: &str,
family: crate::MdEventFamily,
parameters: serde_json::Value,
@@ -340,11 +340,11 @@ mod tests {
) -> crate::DcApiDecodedObservation {
let mut observation = observation(entry, family, parameters, failed);
observation.event.program_id =
crate::MdProgramId(kb_program_ids::SPL_TOKEN2022_PROGRAM_ID.to_string());
observation.event.protocol_code = crate::MdProtocolCode("spl_token2022".to_string());
observation.event.surface_code = crate::MdSurfaceCode("spl_token2022".to_string());
observation.event.event_code = crate::MdEventCode(format!("spl_token2022.{entry}"));
observation.event_key = format!("token2022:{entry}:0");
crate::MdProgramId(kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID.to_string());
observation.event.protocol_code = crate::MdProtocolCode("spl_token_2022".to_string());
observation.event.surface_code = crate::MdSurfaceCode("spl_token_2022".to_string());
observation.event.event_code = crate::MdEventCode(format!("spl_token_2022.{entry}"));
observation.event_key = format!("token_2022:{entry}:0");
return observation;
}
@@ -371,8 +371,8 @@ mod tests {
payload_json: serde_json::json!({
"addresses": {
"tokenProgram": {
"programId": kb_program_ids::SPL_TOKEN2022_PROGRAM_ID,
"kind": "token2022",
"programId": kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID,
"kind": "token_2022",
"supported": true
},
"ownerAssociatedTokenAccount": {"observed":"ownerAta","valid":valid},
@@ -417,8 +417,8 @@ mod tests {
}
#[test]
fn token2022_revocation_is_owned_once_without_an_invented_score() {
let observation = token2022_observation(
fn token_2022_revocation_is_owned_once_without_an_invented_score() {
let observation = token_2022_observation(
"set_authority",
crate::MdEventFamily::Admin,
serde_json::json!({"newAuthority":null}),
@@ -536,7 +536,7 @@ mod tests {
}
#[test]
fn token2022_compliance_toggles_are_projected_as_fact_only_risk_rows() {
fn token_2022_compliance_toggles_are_projected_as_fact_only_risk_rows() {
for (entry, expected) in [
("initialize_default_account_state", "default_account_state_configured"),
("enable_required_transfer_memos", "required_transfer_memos_enabled"),
@@ -546,7 +546,7 @@ mod tests {
] {
let result = crate::MtApiEventMaterializer::materialize(
&crate::MtRiskMaterializer,
&token2022_observation(
&token_2022_observation(
entry,
crate::MdEventFamily::Audit,
serde_json::json!({}),
@@ -561,7 +561,7 @@ mod tests {
}
#[test]
fn token2022_restriction_and_pause_facts_have_unique_stable_kinds() {
fn token_2022_restriction_and_pause_facts_have_unique_stable_kinds() {
for (entry, family, expected) in [
(
"initialize_non_transferable_mint",
@@ -583,7 +583,7 @@ mod tests {
] {
let result = crate::MtApiEventMaterializer::materialize(
&crate::MtRiskMaterializer,
&token2022_observation(entry, family, serde_json::json!({}), false),
&token_2022_observation(entry, family, serde_json::json!({}), false),
);
assert_eq!(result.outputs[0].payload_json["riskKind"], expected);
}
@@ -618,7 +618,7 @@ mod tests {
] {
let result = crate::MtApiEventMaterializer::materialize(
&crate::MtRiskMaterializer,
&token2022_observation(
&token_2022_observation(
entry,
crate::MdEventFamily::TokenAccount,
serde_json::json!({

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/routing/core.rs
// version: 3
// version: 4
//! Reserved routing materializer.
@@ -9,7 +9,7 @@ pub struct MtRoutingMaterializer;
impl crate::MtMaterializer for crate::MtRoutingMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_routing";
return "kb-lib.materializer.routing";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtRoutingMaterializer {
impl crate::MtApiEventMaterializer for crate::MtRoutingMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_routing".to_string(),
name: "kb-lib.materializer.routing".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/staking/core.rs
// version: 8
// version: 9
//! Instruction-level staking projections for native Stake and Vote observations.
@@ -100,7 +100,7 @@ pub struct MtStakingMaterializer;
impl crate::MtMaterializer for crate::MtStakingMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_staking";
return "kb-lib.materializer.staking";
}
fn materializer_version(&self) -> &'static str {

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/token.rs
// version: 5
// version: 6
//! `token` materializer family.
@@ -10,7 +10,7 @@ mod metadata_risk;
/// Stable Token, ATA and Token-2022 account materializer.
pub use self::accounts::MtTokenAccountsMaterializer;
/// Materializes one bounded Token-2022 account state snapshot.
pub use self::accounts::materializer_token_materialize_token2022_state_snapshot;
pub use self::accounts::materializer_token_materialize_token_2022_state_snapshot;
/// Reserved token-metadata risk materializer.
pub use self::metadata_risk::MtTokenMetadataRiskMaterializer;

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/token/accounts.rs
// version: 4
// version: 6
//! Stable committed SPL Token mutation and ATA lifecycle projections.
@@ -46,7 +46,7 @@ pub struct MtTokenAccountsMaterializer;
impl crate::MtMaterializer for crate::MtTokenAccountsMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_token_accounts";
return "kb-lib.materializer.token.accounts";
}
fn materializer_version(&self) -> &'static str {
@@ -175,8 +175,8 @@ impl crate::MtApiEventMaterializer for crate::MtTokenAccountsMaterializer {
fn accepts_event(event: &crate::MdDecodedProtocolEvent) -> bool {
let token_program = (event.program_id.0 == kb_program_ids::SPL_TOKEN_PROGRAM_ID
&& event.surface_code.0 == "spl_token")
|| (event.program_id.0 == kb_program_ids::SPL_TOKEN2022_PROGRAM_ID
&& event.surface_code.0 == "spl_token2022");
|| (event.program_id.0 == kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID
&& event.surface_code.0 == "spl_token_2022");
let token_mutation = token_program && MUTATION_ENTRIES.contains(&event.event_name.0.as_str());
let ata = is_ata_event(event);
return ACCEPTED_FAMILIES.contains(&event.event_family) && (token_mutation || ata);
@@ -316,7 +316,7 @@ fn validate_ata_addresses(
let token_program_exact = matches!(
token_program_id,
std::option::Option::Some(kb_program_ids::SPL_TOKEN_PROGRAM_ID)
| std::option::Option::Some(kb_program_ids::SPL_TOKEN2022_PROGRAM_ID)
| std::option::Option::Some(kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID)
);
if !token_supported || !token_program_exact {
return std::result::Result::Err((
@@ -394,7 +394,7 @@ fn account_key_for_role(accounts: &serde_json::Value, role: &str) -> serde_json:
}
/// Materialize one already parsed Token-2022 account snapshot without inferring hidden state.
pub fn materializer_token_materialize_token2022_state_snapshot(
pub fn materializer_token_materialize_token_2022_state_snapshot(
account_key: &str,
slot: u64,
state: &crate::DcToken2022State,
@@ -431,16 +431,16 @@ pub fn materializer_token_materialize_token2022_state_snapshot(
|| entry.extension_name == "confidential_mint_burn";
});
return std::result::Result::Ok(crate::MtApiMaterializedOutput {
output_key: format!("token2022_state_snapshot:{account_key}:{slot}"),
output_key: format!("token_2022_state_snapshot:{account_key}:{slot}"),
family: crate::MdMaterializedEventFamily::TokenAccount,
payload_json: serde_json::json!({
"projectionVersion": crate::MT_TOKEN_ACCOUNTS_PROJECTION_VERSION,
"domain": "spl_token2022_account_state",
"domain": "spl_token_2022_account_state",
"projectionSemantics": "authoritative_bounded_account_snapshot",
"idempotenceKey": format!("token2022_state:{account_key}:{slot}"),
"idempotenceKey": format!("token_2022_state:{account_key}:{slot}"),
"accountKey": account_key,
"slot": slot,
"programId": kb_program_ids::SPL_TOKEN2022_PROGRAM_ID,
"programId": kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID,
"stateKind": kind,
"baseFields": state.base_fields,
"baseHex": state.base_hex,
@@ -454,7 +454,7 @@ pub fn materializer_token_materialize_token2022_state_snapshot(
"provenance": {
"processorName": crate::MT_TOKEN_ACCOUNTS_PROCESSOR_NAME,
"processorVersion": env!("CARGO_PKG_VERSION"),
"source": "bounded_token2022_state_parser"
"source": "bounded_token_2022_state_parser"
}
}),
});
@@ -502,18 +502,18 @@ mod tests {
};
}
fn token2022_observation(
fn token_2022_observation(
entry: &str,
family: crate::MdEventFamily,
failed: bool,
) -> crate::DcApiDecodedObservation {
let mut observation = observation(entry, family, failed);
observation.event.program_id =
crate::MdProgramId(kb_program_ids::SPL_TOKEN2022_PROGRAM_ID.to_string());
observation.event.protocol_code = crate::MdProtocolCode("spl_token2022".to_string());
observation.event.surface_code = crate::MdSurfaceCode("spl_token2022".to_string());
observation.event.event_code = crate::MdEventCode(format!("spl_token2022.{entry}"));
observation.event_key = format!("token2022:{entry}:0");
crate::MdProgramId(kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID.to_string());
observation.event.protocol_code = crate::MdProtocolCode("spl_token_2022".to_string());
observation.event.surface_code = crate::MdSurfaceCode("spl_token_2022".to_string());
observation.event.event_code = crate::MdEventCode(format!("spl_token_2022.{entry}"));
observation.event_key = format!("token_2022:{entry}:0");
return observation;
}
@@ -535,8 +535,8 @@ mod tests {
} else {
serde_json::json!({
"tokenProgram": {
"programId": kb_program_ids::SPL_TOKEN2022_PROGRAM_ID,
"kind": "token2022",
"programId": kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID,
"kind": "token_2022",
"supported": true
},
"associatedTokenAccount": {"expected":"ata111","observed":"ata111","valid":valid},
@@ -590,9 +590,9 @@ mod tests {
}
#[test]
fn committed_token2022_transfer_has_the_same_single_projection_owner() {
fn committed_token_2022_transfer_has_the_same_single_projection_owner() {
let observation =
token2022_observation("transfer_checked", crate::MdEventFamily::TokenAccount, false);
token_2022_observation("transfer_checked", crate::MdEventFamily::TokenAccount, false);
let result = crate::MtApiEventMaterializer::materialize(
&crate::MtTokenAccountsMaterializer,
&observation,
@@ -602,7 +602,7 @@ mod tests {
assert_eq!(result.outputs[0].payload_json["operation"], "transfer_checked");
assert_eq!(
result.outputs[0].payload_json["programId"],
kb_program_ids::SPL_TOKEN2022_PROGRAM_ID
kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID
);
}
@@ -636,12 +636,12 @@ mod tests {
#[test]
fn every_ata_variant_has_one_exact_lifecycle_projection() {
for (entry, expected_kind, expected_ata, expected_token_program) in [
("create", "ata_created", "ata111", kb_program_ids::SPL_TOKEN2022_PROGRAM_ID),
("create", "ata_created", "ata111", kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID),
(
"create_idempotent",
"ata_created_or_reused_idempotently",
"ata111",
kb_program_ids::SPL_TOKEN2022_PROGRAM_ID,
kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID,
),
(
"recover_nested",
@@ -779,7 +779,7 @@ mod tests {
}
#[test]
fn token2022_state_snapshot_preserves_base_and_ordered_extensions() {
fn token_2022_state_snapshot_preserves_base_and_ordered_extensions() {
let state = crate::DcToken2022State {
kind: crate::DcToken2022StateKind::Mint,
base_fields: serde_json::json!({"supply":"42","decimals":9,"initialized":true}),
@@ -800,7 +800,7 @@ mod tests {
},
],
};
let output = match crate::materializer_token_materialize_token2022_state_snapshot(
let output = match crate::materializer_token_materialize_token_2022_state_snapshot(
"mint111", 99, &state,
) {
std::result::Result::Ok(value) => value,
@@ -816,7 +816,7 @@ mod tests {
}
#[test]
fn token2022_state_snapshot_is_idempotent_and_rejects_missing_identity() {
fn token_2022_state_snapshot_is_idempotent_and_rejects_missing_identity() {
let state = crate::DcToken2022State {
kind: crate::DcToken2022StateKind::Account,
base_fields: serde_json::json!({"mint":"mint111","owner":"wallet111","amount":"5"}),
@@ -824,13 +824,19 @@ mod tests {
account_type: std::option::Option::None,
extensions: std::vec::Vec::new(),
};
let first =
crate::materializer_token_materialize_token2022_state_snapshot("account111", 7, &state);
let second =
crate::materializer_token_materialize_token2022_state_snapshot("account111", 7, &state);
let first = crate::materializer_token_materialize_token_2022_state_snapshot(
"account111",
7,
&state,
);
let second = crate::materializer_token_materialize_token_2022_state_snapshot(
"account111",
7,
&state,
);
assert_eq!(first, second);
assert!(
crate::materializer_token_materialize_token2022_state_snapshot("", 7, &state).is_err()
crate::materializer_token_materialize_token_2022_state_snapshot("", 7, &state).is_err()
);
}
}

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/token/metadata_risk.rs
// version: 3
// version: 4
//! Reserved token-metadata risk materializer.
@@ -9,7 +9,7 @@ pub struct MtTokenMetadataRiskMaterializer;
impl crate::MtMaterializer for crate::MtTokenMetadataRiskMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_token_metadata_risk";
return "kb-lib.materializer.token.metadata_risk";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtTokenMetadataRiskMaterializer {
impl crate::MtApiEventMaterializer for crate::MtTokenMetadataRiskMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_token_metadata_risk".to_string(),
name: "kb-lib.materializer.token.metadata_risk".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/trades/core.rs
// version: 3
// version: 4
//! Reserved trades materializer.
@@ -9,7 +9,7 @@ pub struct MtTradesMaterializer;
impl crate::MtMaterializer for crate::MtTradesMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_trades";
return "kb-lib.materializer.trades";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtTradesMaterializer {
impl crate::MtApiEventMaterializer for crate::MtTradesMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_trades".to_string(),
name: "kb-lib.materializer.trades".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}

View File

@@ -66,7 +66,7 @@ pub struct MtTransactionAnnotationMaterializer;
impl crate::MtMaterializer for crate::MtTransactionAnnotationMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_transaction_annotations";
return "kb-lib.materializer.transaction.annotations";
}
fn materializer_version(&self) -> &'static str {

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/materializer/vault/core.rs
// version: 3
// version: 4
//! Reserved vault materializer.
@@ -9,7 +9,7 @@ pub struct MtVaultMaterializer;
impl crate::MtMaterializer for crate::MtVaultMaterializer {
fn materializer_name(&self) -> &'static str {
return "kb_materializer_vault";
return "kb-lib.materializer.vault";
}
fn materializer_version(&self) -> &'static str {
@@ -36,7 +36,7 @@ impl crate::MtMaterializer for crate::MtVaultMaterializer {
impl crate::MtApiEventMaterializer for crate::MtVaultMaterializer {
fn identity(&self) -> crate::MtApiMaterializerIdentity {
return crate::MtApiMaterializerIdentity {
name: "kb_materializer_vault".to_string(),
name: "kb-lib.materializer.vault".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
};
}