nut06.rs 3.3 KB

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