use secp::{MaybePoint, MaybeScalar, Point, Scalar};
use crate::OutcomeIndex;
#[derive(Debug, Clone)]
pub struct EventAnnouncement {
pub oracle_pubkey: Point,
pub nonce_point: Point,
pub outcome_messages: Vec<Vec<u8>>,
pub expiry: u32,
}
impl EventAnnouncement {
pub fn attestation_lock_point(&self, index: OutcomeIndex) -> Option<MaybePoint> {
let msg = &self.outcome_messages.get(index)?;
let e: MaybeScalar = musig2::compute_challenge_hash_tweak(
&self.nonce_point.serialize_xonly(),
&self.oracle_pubkey,
msg,
);
Some(self.nonce_point.to_even_y() + e * self.oracle_pubkey.to_even_y())
}
pub fn attestation_secret(
&self,
index: usize,
oracle_seckey: impl Into<Scalar>,
nonce: impl Into<Scalar>,
) -> Option<MaybeScalar> {
let oracle_seckey = oracle_seckey.into();
let nonce = nonce.into();
if oracle_seckey.base_point_mul() != self.oracle_pubkey
|| nonce.base_point_mul() != self.nonce_point
{
return None;
}
let d = oracle_seckey.negate_if(self.oracle_pubkey.parity());
let k = nonce.negate_if(self.nonce_point.parity());
let msg = &self.outcome_messages.get(index)?;
let e: MaybeScalar = musig2::compute_challenge_hash_tweak(
&self.nonce_point.serialize_xonly(),
&self.oracle_pubkey,
msg,
);
Some(k + e * d)
}
}