account.rs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. //! Account related types
  2. use crate::types::{event::Error, Content, Event, Tag, UnsignedEvent};
  3. use chrono::{DateTime, Utc};
  4. use rand::rngs::OsRng;
  5. use secp256k1::{KeyPair, Message, Secp256k1, SecretKey, XOnlyPublicKey};
  6. /// Nostr User account
  7. #[derive(Debug, Clone)]
  8. pub struct Account(KeyPair);
  9. impl Account {
  10. /// Get the public key from a user
  11. pub fn public_key(&self) -> XOnlyPublicKey {
  12. self.0.x_only_public_key().0
  13. }
  14. /// Creates a new event with the given content
  15. pub fn sign_content(
  16. &self,
  17. tags: Vec<Tag>,
  18. content: Content,
  19. created_at: Option<DateTime<Utc>>,
  20. ) -> Result<Event, Error> {
  21. let unsigned_event =
  22. UnsignedEvent::new(self.public_key().into(), tags, content, created_at)?;
  23. let id = unsigned_event.id()?;
  24. let to_sign = Message::from_slice(&*id)?;
  25. let secp = Secp256k1::new();
  26. let signature = secp.sign_schnorr_no_aux_rand(&to_sign, &self.0);
  27. Event::new(unsigned_event, signature.into())
  28. }
  29. }
  30. impl From<KeyPair> for Account {
  31. fn from(keypair: KeyPair) -> Self {
  32. Self(keypair)
  33. }
  34. }
  35. impl From<&SecretKey> for Account {
  36. fn from(secret_key: &SecretKey) -> Self {
  37. Self(KeyPair::from_secret_key(&Secp256k1::new(), secret_key))
  38. }
  39. }
  40. impl From<SecretKey> for Account {
  41. fn from(secret_key: SecretKey) -> Self {
  42. Self(KeyPair::from_secret_key(&Secp256k1::new(), &secret_key))
  43. }
  44. }
  45. impl Default for Account {
  46. fn default() -> Self {
  47. let secp = Secp256k1::new();
  48. let (secret_key, _) = secp.generate_keypair(&mut OsRng);
  49. secret_key.into()
  50. }
  51. }