v0.1.0-pre.061
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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!({
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user