nut01.rs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. //! Mint public key exchange
  2. // https://github.com/cashubtc/nuts/blob/main/01.md
  3. use std::collections::BTreeMap;
  4. use std::collections::HashMap;
  5. use serde::{Deserialize, Serialize};
  6. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  7. #[serde(transparent)]
  8. pub struct PublicKey(#[serde(with = "crate::serde_utils::serde_public_key")] k256::PublicKey);
  9. impl From<PublicKey> for k256::PublicKey {
  10. fn from(value: PublicKey) -> k256::PublicKey {
  11. value.0
  12. }
  13. }
  14. impl From<&PublicKey> for k256::PublicKey {
  15. fn from(value: &PublicKey) -> k256::PublicKey {
  16. value.0
  17. }
  18. }
  19. impl From<k256::PublicKey> for PublicKey {
  20. fn from(value: k256::PublicKey) -> Self {
  21. Self(value)
  22. }
  23. }
  24. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  25. #[serde(transparent)]
  26. pub struct SecretKey(#[serde(with = "crate::serde_utils::serde_secret_key")] k256::SecretKey);
  27. impl From<SecretKey> for k256::SecretKey {
  28. fn from(value: SecretKey) -> k256::SecretKey {
  29. value.0
  30. }
  31. }
  32. impl From<k256::SecretKey> for SecretKey {
  33. fn from(value: k256::SecretKey) -> Self {
  34. Self(value)
  35. }
  36. }
  37. /// Mint Keys [NUT-01]
  38. #[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
  39. pub struct Keys(BTreeMap<u64, PublicKey>);
  40. impl Keys {
  41. pub fn new(keys: BTreeMap<u64, PublicKey>) -> Self {
  42. Self(keys)
  43. }
  44. pub fn keys(&self) -> BTreeMap<u64, PublicKey> {
  45. self.0.clone()
  46. }
  47. pub fn amount_key(&self, amount: &u64) -> Option<PublicKey> {
  48. self.0.get(amount).cloned()
  49. }
  50. pub fn as_hashmap(&self) -> HashMap<u64, String> {
  51. self.0
  52. .iter()
  53. .map(|(k, v)| (k.to_owned(), hex::encode(v.0.to_sec1_bytes())))
  54. .collect()
  55. }
  56. }
  57. impl From<mint::Keys> for Keys {
  58. fn from(keys: mint::Keys) -> Self {
  59. Self(
  60. keys.0
  61. .iter()
  62. .map(|(amount, keypair)| (*amount, keypair.public_key.clone()))
  63. .collect(),
  64. )
  65. }
  66. }
  67. pub mod mint {
  68. use std::collections::BTreeMap;
  69. use k256::SecretKey;
  70. use serde::Deserialize;
  71. use serde::Serialize;
  72. use super::PublicKey;
  73. use crate::serde_utils;
  74. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  75. pub struct Keys(pub BTreeMap<u64, KeyPair>);
  76. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  77. pub struct KeyPair {
  78. pub public_key: PublicKey,
  79. #[serde(with = "serde_utils::serde_secret_key")]
  80. pub secret_key: SecretKey,
  81. }
  82. impl KeyPair {
  83. pub fn from_secret_key(secret_key: SecretKey) -> Self {
  84. Self {
  85. public_key: secret_key.public_key().into(),
  86. secret_key,
  87. }
  88. }
  89. }
  90. }