use prism::pipeline::{prism_model, SingletonCommitment, UltrametricCloseTo};
use prism::vocabulary::DefaultHostTypes;
use crate::bounds::AddrBounds;
use crate::json::value::JsonCarrier;
use crate::label::AddressLabel;
use crate::resolvers::AddressResolverTuple;
use prism::crypto::Sha256Hasher;
#[allow(unused_imports)]
use crate::json::verbs::{address_inference, VERB_TERMS_ADDRESS_INFERENCE};
pub const SIGNATURE_REFERENCE: &[u8] = &[0; 32];
pub const SIGNATURE_PROXIMITY_K: u32 = 1;
pub type SignedCommitment = SingletonCommitment<UltrametricCloseTo<2>>;
pub const SIGNED_COMMITMENT_INSTANCE: SignedCommitment = SingletonCommitment {
predicate: UltrametricCloseTo {
reference: SIGNATURE_REFERENCE,
k: SIGNATURE_PROXIMITY_K,
},
};
prism_model! {
pub struct AddressSignedModel;
pub struct AddressSignedRoute;
impl PrismModel<
DefaultHostTypes,
AddrBounds,
Sha256Hasher,
AddressResolverTuple<Sha256Hasher>,
SignedCommitment
> for AddressSignedModel {
type Input = JsonCarrier<'a>;
type Output = AddressLabel;
type Route = AddressSignedRoute;
fn route(input: Self::Input) -> Self::Output {
address_inference(input)
}
fn commitment() -> SignedCommitment {
SIGNED_COMMITMENT_INSTANCE
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use prism::pipeline::{ObservablePredicate, TypedCommitment};
#[test]
fn signed_commitment_is_typed_commitment() {
fn assert_typed_commitment<C: TypedCommitment>() {}
assert_typed_commitment::<SignedCommitment>();
}
#[test]
fn signature_predicate_evaluates_against_digest() {
let admitted: [u8; 32] = [0; 32];
let predicate: UltrametricCloseTo<2> = UltrametricCloseTo {
reference: SIGNATURE_REFERENCE,
k: SIGNATURE_PROXIMITY_K,
};
assert!(predicate.evaluate(&admitted));
let mut rejected: [u8; 32] = [0; 32];
rejected[31] = 0x01;
assert!(!predicate.evaluate(&rejected));
}
#[test]
fn signed_model_is_a_distinct_prism_model() {
fn assert_is_prism_model<
'a,
M: prism::pipeline::PrismModel<
'a,
prism::vocabulary::DefaultHostTypes,
crate::AddrBounds,
crate::Sha256Hasher,
{ crate::ADDR_INLINE_BYTES },
32,
crate::AddressResolverTuple<crate::Sha256Hasher>,
SignedCommitment,
Route = AddressSignedRoute,
>,
>() {
}
assert_is_prism_model::<AddressSignedModel>();
}
#[test]
fn signature_reference_is_thirty_two_bytes() {
assert_eq!(SIGNATURE_REFERENCE.len(), 32);
}
}