0.4.7-pre.002
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// file: kb-lib/src/decoder/metadata/metaplex_token_metadata/decoder.rs
|
||||
// version: 30
|
||||
// version: 31
|
||||
|
||||
//! Exact contextual dispatch for Metaplex Token Metadata.
|
||||
|
||||
@@ -3051,6 +3051,80 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_002_contract_closes_all_instruction_statuses_and_idl_accounts() {
|
||||
let matrix: serde_json::Value = match serde_json::from_str(AUDIT_MATRIX_JSON) {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => panic!("matrix parse failed: {error}"),
|
||||
};
|
||||
let entries = match matrix
|
||||
.get("instruction_execution_contract")
|
||||
.and_then(serde_json::Value::as_array)
|
||||
{
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => panic!("instruction_execution_contract missing"),
|
||||
};
|
||||
assert_eq!(entries.len(), 58);
|
||||
let mut discriminators = std::collections::BTreeSet::new();
|
||||
for entry in entries {
|
||||
let discriminator = match entry
|
||||
.get("discriminator")
|
||||
.and_then(serde_json::Value::as_u64)
|
||||
{
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => panic!("instruction discriminator missing"),
|
||||
};
|
||||
assert!(discriminators.insert(discriminator));
|
||||
assert!(entry.get("accounts").is_some_and(serde_json::Value::is_array));
|
||||
assert!(entry.get("signers").is_some_and(serde_json::Value::is_array));
|
||||
assert!(entry
|
||||
.get("coverage_status")
|
||||
.and_then(serde_json::Value::as_str)
|
||||
.is_some_and(|value| return value != "pending" && !value.is_empty()));
|
||||
assert!(entry
|
||||
.get("execute")
|
||||
.and_then(serde_json::Value::as_str)
|
||||
.is_some_and(|value| return value != "pending" && !value.is_empty()));
|
||||
}
|
||||
assert_eq!(discriminators, (0u64..58u64).collect());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_002_fact_ownership_is_unique_and_keeps_metadata_domains_separate() {
|
||||
let matrix: serde_json::Value = match serde_json::from_str(AUDIT_MATRIX_JSON) {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => panic!("matrix parse failed: {error}"),
|
||||
};
|
||||
let facts = match matrix
|
||||
.get("fact_ownership_contract")
|
||||
.and_then(serde_json::Value::as_array)
|
||||
{
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => panic!("fact_ownership_contract missing"),
|
||||
};
|
||||
let mut names = std::collections::BTreeSet::new();
|
||||
for entry in facts {
|
||||
let fact = match entry.get("fact").and_then(serde_json::Value::as_str) {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => panic!("fact name missing"),
|
||||
};
|
||||
assert!(names.insert(fact));
|
||||
assert!(entry
|
||||
.get("owner")
|
||||
.and_then(serde_json::Value::as_str)
|
||||
.is_some_and(|value| return !value.is_empty()));
|
||||
}
|
||||
let forbidden = match matrix
|
||||
.pointer("/fact_ownership_proof/cross_domain_merge_forbidden")
|
||||
.and_then(serde_json::Value::as_array)
|
||||
{
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => panic!("cross-domain proof missing"),
|
||||
};
|
||||
assert!(forbidden.contains(&serde_json::json!("metaplex_token_metadata")));
|
||||
assert!(forbidden.contains(&serde_json::json!("spl_token_2022_embedded_metadata")));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn omitted_historical_discriminators_reject_invalid_wires() {
|
||||
let decoder = crate::DcMetadataMetaplexTokenMetadataDecoder;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-lib/src/materializer/metadata/core.rs
|
||||
// version: 5
|
||||
// version: 6
|
||||
|
||||
//! Stable Token-2022 and Metaplex metadata snapshot materializer.
|
||||
|
||||
@@ -134,6 +134,11 @@ pub fn materializer_metadata_materialize_metaplex_metadata_snapshot(
|
||||
"symbol": metadata.symbol,
|
||||
"uri": metadata.uri,
|
||||
"sellerFeeBasisPoints": metadata.seller_fee_basis_points,
|
||||
"creators": metadata.payload_json.get("creators").cloned().unwrap_or(serde_json::Value::Null),
|
||||
"collection": metadata.payload_json.get("collection").cloned().unwrap_or(serde_json::Value::Null),
|
||||
"uses": metadata.payload_json.get("uses").cloned().unwrap_or(serde_json::Value::Null),
|
||||
"tokenStandard": metadata.payload_json.get("tokenStandard").cloned().unwrap_or(serde_json::Value::Null),
|
||||
"programmableConfig": metadata.payload_json.get("programmableConfig").cloned().unwrap_or(serde_json::Value::Null),
|
||||
"primarySaleHappened": metadata.primary_sale_happened,
|
||||
"isMutable": metadata.is_mutable,
|
||||
"layout": snapshot.identity.layout,
|
||||
@@ -218,6 +223,18 @@ mod tests_metaplex_metadata_state {
|
||||
first.as_ref().map(|value| return value.payload_json["metadataSource"].clone()),
|
||||
std::result::Result::Ok(serde_json::json!("metaplex_owned_account"))
|
||||
);
|
||||
assert_eq!(
|
||||
first.as_ref().map(|value| return value.payload_json["creators"].clone()),
|
||||
std::result::Result::Ok(
|
||||
serde_json::json!([{"address":"creator111","verified":true,"share":100}])
|
||||
)
|
||||
);
|
||||
assert_eq!(
|
||||
first
|
||||
.as_ref()
|
||||
.map(|value| return value.payload_json["programmableConfig"].clone()),
|
||||
std::result::Result::Ok(serde_json::json!({"ruleSet":"rules111"}))
|
||||
);
|
||||
assert_eq!(
|
||||
first
|
||||
.as_ref()
|
||||
|
||||
Reference in New Issue
Block a user