nut06.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //! Split
  2. // https://github.com/cashubtc/nuts/blob/main/06.md
  3. use serde::{Deserialize, Serialize};
  4. use crate::nuts::nut00::{BlindedMessage, Proofs};
  5. use crate::Amount;
  6. #[cfg(feature = "wallet")]
  7. use crate::nuts::nut00::wallet::BlindedMessages;
  8. use super::nut00::BlindedSignature;
  9. #[cfg(feature = "wallet")]
  10. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  11. pub struct SplitPayload {
  12. pub blinded_messages: BlindedMessages,
  13. pub split_payload: SplitRequest,
  14. }
  15. /// Split Request [NUT-06]
  16. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  17. pub struct SplitRequest {
  18. #[deprecated(since = "0.3.0", note = "mint does not need amount")]
  19. #[serde(skip_serializing_if = "Option::is_none")]
  20. pub amount: Option<Amount>,
  21. pub proofs: Proofs,
  22. pub outputs: Vec<BlindedMessage>,
  23. }
  24. impl SplitRequest {
  25. pub fn proofs_amount(&self) -> Amount {
  26. self.proofs.iter().map(|proof| proof.amount).sum()
  27. }
  28. pub fn output_amount(&self) -> Amount {
  29. self.outputs.iter().map(|proof| proof.amount).sum()
  30. }
  31. }
  32. /// Split Response [NUT-06]
  33. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  34. pub struct SplitResponse {
  35. /// Promises to keep
  36. #[deprecated(
  37. since = "0.3.0",
  38. note = "mint only response with one list of all promises"
  39. )]
  40. #[serde(skip_serializing_if = "Option::is_none")]
  41. pub fst: Option<Vec<BlindedSignature>>,
  42. /// Promises to send
  43. #[deprecated(
  44. since = "0.3.0",
  45. note = "mint only response with one list of all promises"
  46. )]
  47. #[serde(skip_serializing_if = "Option::is_none")]
  48. pub snd: Option<Vec<BlindedSignature>>,
  49. /// Promises
  50. pub promises: Option<Vec<BlindedSignature>>,
  51. }
  52. impl SplitResponse {
  53. pub fn new(promises: Vec<BlindedSignature>) -> SplitResponse {
  54. SplitResponse {
  55. fst: None,
  56. snd: None,
  57. promises: Some(promises),
  58. }
  59. }
  60. #[deprecated(
  61. since = "0.3.0",
  62. note = "mint only response with one list of all promises"
  63. )]
  64. pub fn new_from_amount(
  65. fst: Vec<BlindedSignature>,
  66. snd: Vec<BlindedSignature>,
  67. ) -> SplitResponse {
  68. Self {
  69. fst: Some(fst),
  70. snd: Some(snd),
  71. promises: None,
  72. }
  73. }
  74. #[deprecated(
  75. since = "0.3.0",
  76. note = "mint only response with one list of all promises"
  77. )]
  78. pub fn change_amount(&self) -> Option<Amount> {
  79. self.fst.as_ref().map(|fst| {
  80. fst.iter()
  81. .map(|BlindedSignature { amount, .. }| *amount)
  82. .sum()
  83. })
  84. }
  85. #[deprecated(
  86. since = "0.3.0",
  87. note = "mint only response with one list of all promises"
  88. )]
  89. pub fn target_amount(&self) -> Option<Amount> {
  90. self.snd.as_ref().map(|snd| {
  91. snd.iter()
  92. .map(|BlindedSignature { amount, .. }| *amount)
  93. .sum()
  94. })
  95. }
  96. pub fn promises_amount(&self) -> Option<Amount> {
  97. self.promises.as_ref().map(|promises| {
  98. promises
  99. .iter()
  100. .map(|BlindedSignature { amount, .. }| *amount)
  101. .sum()
  102. })
  103. }
  104. }