nut01.rs 2.7 KB

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