Merge branch 'master' of github.com:comit-network/xmr-btc-swap

This commit is contained in:
icyfestive 2023-01-11 15:46:48 +00:00
commit e93d1c2381
26 changed files with 62 additions and 55 deletions

View File

@ -52,8 +52,9 @@ jobs:
- uses: Swatinem/rust-cache@v2.2.0 - uses: Swatinem/rust-cache@v2.2.0
- uses: dtolnay/rust-toolchain@stable - uses: dtolnay/rust-toolchain@master
with: with:
toolchain: 1.63
targets: armv7-unknown-linux-gnueabihf targets: armv7-unknown-linux-gnueabihf
- name: Build ${{ matrix.target }} ${{ matrix.bin }} release binary - name: Build ${{ matrix.target }} ${{ matrix.bin }} release binary

View File

@ -75,8 +75,9 @@ jobs:
- uses: Swatinem/rust-cache@v2.2.0 - uses: Swatinem/rust-cache@v2.2.0
- uses: dtolnay/rust-toolchain@stable - uses: dtolnay/rust-toolchain@master
with: with:
toolchain: 1.63
targets: armv7-unknown-linux-gnueabihf targets: armv7-unknown-linux-gnueabihf
- name: Build binary - name: Build binary

View File

@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Changed
- Minimum Supported Rust Version (MSRV) bumped to 1.63
## [0.12.1] - 2023-01-09 ## [0.12.1] - 2023-01-09
### Changed ### Changed
@ -338,7 +342,7 @@ It is possible to migrate critical data from the old db to the sqlite but there
- Fixed an issue where Alice would not verify if Bob's Bitcoin lock transaction is semantically correct, i.e. pays the agreed upon amount to an output owned by both of them. - Fixed an issue where Alice would not verify if Bob's Bitcoin lock transaction is semantically correct, i.e. pays the agreed upon amount to an output owned by both of them.
Fixing this required a **breaking change** on the network layer and hence old versions are not compatible with this version. Fixing this required a **breaking change** on the network layer and hence old versions are not compatible with this version.
[Unreleased]: https://github.com/comit-network/xmr-btc-swap/compare/0.12.1...HEAD [unreleased]: https://github.com/comit-network/xmr-btc-swap/compare/0.12.1...HEAD
[0.12.1]: https://github.com/comit-network/xmr-btc-swap/compare/0.12.0...0.12.1 [0.12.1]: https://github.com/comit-network/xmr-btc-swap/compare/0.12.0...0.12.1
[0.12.0]: https://github.com/comit-network/xmr-btc-swap/compare/0.11.0...0.12.0 [0.12.0]: https://github.com/comit-network/xmr-btc-swap/compare/0.11.0...0.12.0
[0.11.0]: https://github.com/comit-network/xmr-btc-swap/compare/0.10.2...0.11.0 [0.11.0]: https://github.com/comit-network/xmr-btc-swap/compare/0.10.2...0.11.0

View File

@ -50,7 +50,7 @@ Please have a look at the [contribution guidelines](./CONTRIBUTING.md).
## Rust Version Support ## Rust Version Support
Please note that only the latest stable Rust toolchain is supported. Please note that only the latest stable Rust toolchain is supported.
All stable toolchains since 1.62 _should_ work. All stable toolchains since 1.63 _should_ work.
## Contact ## Contact

View File

@ -157,7 +157,7 @@ pub struct OutKey {
pub unlocked: bool, pub unlocked: bool,
} }
#[derive(Clone, Debug, Deserialize, PartialEq)] #[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
pub struct BaseResponse { pub struct BaseResponse {
pub credits: u64, pub credits: u64,
pub status: Status, pub status: Status,
@ -165,7 +165,7 @@ pub struct BaseResponse {
pub untrusted: bool, pub untrusted: bool,
} }
#[derive(Clone, Debug, Deserialize, PartialEq)] #[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
pub struct GetOIndexesResponse { pub struct GetOIndexesResponse {
#[serde(flatten)] #[serde(flatten)]
pub base: BaseResponse, pub base: BaseResponse,
@ -173,7 +173,7 @@ pub struct GetOIndexesResponse {
pub o_indexes: Vec<u64>, pub o_indexes: Vec<u64>,
} }
#[derive(Clone, Copy, Debug, Deserialize, PartialEq)] #[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq)]
pub enum Status { pub enum Status {
#[serde(rename = "OK")] #[serde(rename = "OK")]
Ok, Ok,

View File

@ -157,7 +157,7 @@ pub struct Transfer {
pub unsigned_txset: String, pub unsigned_txset: String,
} }
#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq)] #[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
pub struct BlockHeight { pub struct BlockHeight {
pub height: u32, pub height: u32,
} }

View File

@ -1,4 +1,4 @@
[toolchain] [toolchain]
channel = "1.62" channel = "1.63" # also update this in the readme, changelog, and github actions
components = ["clippy"] components = ["clippy"]
targets = ["armv7-unknown-linux-gnueabihf"] targets = ["armv7-unknown-linux-gnueabihf"]

View File

@ -171,7 +171,7 @@ fn env_config(is_testnet: bool) -> env::Config {
} }
} }
#[derive(thiserror::Error, Debug, Clone, Copy, PartialEq, Serialize)] #[derive(thiserror::Error, Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[error("Invalid Bitcoin address provided, expected address on network {expected:?} but address provided is on {actual:?}")] #[error("Invalid Bitcoin address provided, expected address on network {expected:?} but address provided is on {actual:?}")]
pub struct BitcoinAddressNetworkMismatch { pub struct BitcoinAddressNetworkMismatch {
#[serde(with = "crate::bitcoin::network")] #[serde(with = "crate::bitcoin::network")]
@ -180,7 +180,7 @@ pub struct BitcoinAddressNetworkMismatch {
actual: bitcoin::Network, actual: bitcoin::Network,
} }
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq, Eq)]
pub struct Arguments { pub struct Arguments {
pub testnet: bool, pub testnet: bool,
pub json: bool, pub json: bool,
@ -190,7 +190,7 @@ pub struct Arguments {
pub cmd: Command, pub cmd: Command,
} }
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq, Eq)]
pub enum Command { pub enum Command {
Start { Start {
resume_only: bool, resume_only: bool,

View File

@ -84,7 +84,7 @@ const DEFAULT_MIN_BUY_AMOUNT: f64 = 0.002f64;
const DEFAULT_MAX_BUY_AMOUNT: f64 = 0.02f64; const DEFAULT_MAX_BUY_AMOUNT: f64 = 0.02f64;
const DEFAULT_SPREAD: f64 = 0.02f64; const DEFAULT_SPREAD: f64 = 0.02f64;
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq)] #[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
pub struct Config { pub struct Config {
pub data: Data, pub data: Data,
@ -123,13 +123,13 @@ impl TryFrom<config::Config> for Config {
} }
} }
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
pub struct Data { pub struct Data {
pub dir: PathBuf, pub dir: PathBuf,
} }
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
pub struct Network { pub struct Network {
#[serde(deserialize_with = "addr_list::deserialize")] #[serde(deserialize_with = "addr_list::deserialize")]
@ -181,7 +181,7 @@ mod addr_list {
} }
} }
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
pub struct Bitcoin { pub struct Bitcoin {
pub electrum_rpc_url: Url, pub electrum_rpc_url: Url,
@ -191,7 +191,7 @@ pub struct Bitcoin {
pub network: bitcoin::Network, pub network: bitcoin::Network,
} }
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
pub struct Monero { pub struct Monero {
pub wallet_rpc_url: Url, pub wallet_rpc_url: Url,
@ -200,14 +200,14 @@ pub struct Monero {
pub network: monero::Network, pub network: monero::Network,
} }
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
pub struct TorConf { pub struct TorConf {
pub control_port: u16, pub control_port: u16,
pub socks5_port: u16, pub socks5_port: u16,
} }
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
pub struct Maker { pub struct Maker {
#[serde(with = "::bitcoin::util::amount::serde::as_btc")] #[serde(with = "::bitcoin::util::amount::serde::as_btc")]

View File

@ -5,7 +5,7 @@ use rust_decimal::Decimal;
use std::fmt::{Debug, Display, Formatter}; use std::fmt::{Debug, Display, Formatter};
/// Represents the rate at which we are willing to trade 1 XMR. /// Represents the rate at which we are willing to trade 1 XMR.
#[derive(Debug, Clone, Copy, PartialEq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Rate { pub struct Rate {
/// Represents the asking price from the market. /// Represents the asking price from the market.
ask: bitcoin::Amount, ask: bitcoin::Amount,

View File

@ -108,7 +108,7 @@ impl SecretKey {
} }
} }
#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] #[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct PublicKey(Point); pub struct PublicKey(Point);
impl PublicKey { impl PublicKey {

View File

@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize};
const SCRIPT_SIZE: usize = 34; const SCRIPT_SIZE: usize = 34;
const TX_LOCK_WEIGHT: usize = 485; const TX_LOCK_WEIGHT: usize = 485;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TxLock { pub struct TxLock {
inner: PartiallySignedTransaction, inner: PartiallySignedTransaction,
pub(in crate::bitcoin) output_descriptor: Descriptor<::bitcoin::PublicKey>, pub(in crate::bitcoin) output_descriptor: Descriptor<::bitcoin::PublicKey>,

View File

@ -37,7 +37,7 @@ impl Add<u32> for BlockHeight {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ExpiredTimelocks { pub enum ExpiredTimelocks {
None, None,
Cancel, Cancel,

View File

@ -876,7 +876,7 @@ impl EstimateFeeRate for Client {
} }
} }
#[derive(Debug, Copy, Clone, PartialEq)] #[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum ScriptStatus { pub enum ScriptStatus {
Unseen, Unseen,
InMempool, InMempool,
@ -893,7 +893,7 @@ impl ScriptStatus {
} }
} }
#[derive(Debug, Copy, Clone, PartialEq)] #[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct Confirmed { pub struct Confirmed {
/// The depth of this transaction within the blockchain. /// The depth of this transaction within the blockchain.
/// ///

View File

@ -28,7 +28,7 @@ const DEFAULT_BITCOIN_CONFIRMATION_TARGET_TESTNET: usize = 1;
const DEFAULT_TOR_SOCKS5_PORT: &str = "9050"; const DEFAULT_TOR_SOCKS5_PORT: &str = "9050";
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq, Eq)]
pub struct Arguments { pub struct Arguments {
pub env_config: env::Config, pub env_config: env::Config,
pub debug: bool, pub debug: bool,
@ -38,7 +38,7 @@ pub struct Arguments {
} }
/// Represents the result of parsing the command-line parameters. /// Represents the result of parsing the command-line parameters.
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq, Eq)]
pub enum ParseResult { pub enum ParseResult {
/// The arguments we were invoked in. /// The arguments we were invoked in.
Arguments(Box<Arguments>), Arguments(Box<Arguments>),
@ -246,7 +246,7 @@ where
Ok(ParseResult::Arguments(Box::new(arguments))) Ok(ParseResult::Arguments(Box::new(arguments)))
} }
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq, Eq)]
pub enum Command { pub enum Command {
BuyXmr { BuyXmr {
seller: Multiaddr, seller: Multiaddr,
@ -610,14 +610,14 @@ fn parse_monero_address(s: &str) -> Result<monero::Address> {
}) })
} }
#[derive(thiserror::Error, Debug, Clone, Copy, PartialEq)] #[derive(thiserror::Error, Debug, Clone, Copy, PartialEq, Eq)]
#[error("Invalid monero address provided, expected address on network {expected:?} but address provided is on {actual:?}")] #[error("Invalid monero address provided, expected address on network {expected:?} but address provided is on {actual:?}")]
pub struct MoneroAddressNetworkMismatch { pub struct MoneroAddressNetworkMismatch {
expected: monero::Network, expected: monero::Network,
actual: monero::Network, actual: monero::Network,
} }
#[derive(thiserror::Error, Debug, Clone, Copy, PartialEq, Serialize)] #[derive(thiserror::Error, Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[error("Invalid Bitcoin address provided, expected address on network {expected:?} but address provided is on {actual:?}")] #[error("Invalid Bitcoin address provided, expected address on network {expected:?} but address provided is on {actual:?}")]
pub struct BitcoinAddressNetworkMismatch { pub struct BitcoinAddressNetworkMismatch {
#[serde(with = "crate::bitcoin::network")] #[serde(with = "crate::bitcoin::network")]

View File

@ -2,7 +2,7 @@ use anyhow::anyhow;
const LATEST_RELEASE_URL: &str = "https://github.com/comit-network/xmr-btc-swap/releases/latest"; const LATEST_RELEASE_URL: &str = "https://github.com/comit-network/xmr-btc-swap/releases/latest";
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq, Eq)]
pub enum Version { pub enum Version {
Current, Current,
Available, Available,

View File

@ -70,7 +70,7 @@ pub enum Alice {
Done(AliceEndState), Done(AliceEndState),
} }
#[derive(Copy, Clone, strum::Display, Debug, Deserialize, Serialize, PartialEq)] #[derive(Copy, Clone, strum::Display, Debug, Deserialize, Serialize, PartialEq, Eq)]
pub enum AliceEndState { pub enum AliceEndState {
SafelyAborted, SafelyAborted,
BtcRedeemed, BtcRedeemed,

View File

@ -5,7 +5,7 @@ use std::cmp::max;
use std::time::Duration; use std::time::Duration;
use time::ext::NumericalStdDuration; use time::ext::NumericalStdDuration;
#[derive(Debug, Copy, Clone, PartialEq, Serialize)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize)]
pub struct Config { pub struct Config {
pub bitcoin_lock_mempool_timeout: Duration, pub bitcoin_lock_mempool_timeout: Duration,
pub bitcoin_lock_confirmed_timeout: Duration, pub bitcoin_lock_confirmed_timeout: Duration,

View File

@ -230,7 +230,7 @@ mod wire {
use bitcoin::util::amount::ParseAmountError; use bitcoin::util::amount::ParseAmountError;
use serde_json::Value; use serde_json::Value;
#[derive(Debug, Deserialize, PartialEq)] #[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(tag = "event")] #[serde(tag = "event")]
pub enum Event { pub enum Event {
#[serde(rename = "systemStatus")] #[serde(rename = "systemStatus")]

View File

@ -39,7 +39,7 @@ pub fn private_key_from_secp256k1_scalar(scalar: bitcoin::Scalar) -> PrivateKey
PrivateKey::from_scalar(Scalar::from_bytes_mod_order(bytes)) PrivateKey::from_scalar(Scalar::from_bytes_mod_order(bytes))
} }
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq)] #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct PrivateViewKey(#[serde(with = "monero_private_key")] PrivateKey); pub struct PrivateViewKey(#[serde(with = "monero_private_key")] PrivateKey);
impl PrivateViewKey { impl PrivateViewKey {
@ -78,7 +78,7 @@ impl From<PublicViewKey> for PublicKey {
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]
pub struct PublicViewKey(PublicKey); pub struct PublicViewKey(PublicKey);
#[derive(Debug, Copy, Clone, Deserialize, Serialize, PartialEq, PartialOrd)] #[derive(Debug, Copy, Clone, Deserialize, Serialize, PartialEq, Eq, PartialOrd)]
pub struct Amount(u64); pub struct Amount(u64);
// Median tx fees on Monero as found here: https://www.monero.how/monero-transaction-fees, XMR 0.000_008 * 2 (to be on the safe side) // Median tx fees on Monero as found here: https://www.monero.how/monero-transaction-fees, XMR 0.000_008 * 2 (to be on the safe side)
@ -185,7 +185,7 @@ impl fmt::Display for Amount {
} }
} }
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct TransferProof { pub struct TransferProof {
tx_hash: TxHash, tx_hash: TxHash,
#[serde(with = "monero_private_key")] #[serde(with = "monero_private_key")]
@ -205,7 +205,7 @@ impl TransferProof {
} }
// TODO: add constructor/ change String to fixed length byte array // TODO: add constructor/ change String to fixed length byte array
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct TxHash(pub String); pub struct TxHash(pub String);
impl From<TxHash> for String { impl From<TxHash> for String {
@ -227,7 +227,7 @@ pub struct InsufficientFunds {
pub actual: Amount, pub actual: Amount,
} }
#[derive(thiserror::Error, Debug, Clone, PartialEq)] #[derive(thiserror::Error, Debug, Clone, PartialEq, Eq)]
#[error("Overflow, cannot convert {0} to u64")] #[error("Overflow, cannot convert {0} to u64")]
pub struct OverflowError(pub String); pub struct OverflowError(pub String);
@ -470,10 +470,10 @@ mod tests {
use rand::rngs::OsRng; use rand::rngs::OsRng;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, PartialEq)] #[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct MoneroPrivateKey(#[serde(with = "monero_private_key")] crate::monero::PrivateKey); pub struct MoneroPrivateKey(#[serde(with = "monero_private_key")] crate::monero::PrivateKey);
#[derive(Debug, Serialize, Deserialize, PartialEq)] #[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct MoneroAmount(#[serde(with = "monero_amount")] crate::monero::Amount); pub struct MoneroAmount(#[serde(with = "monero_amount")] crate::monero::Amount);
#[test] #[test]

View File

@ -26,15 +26,16 @@ impl Wallet {
pub async fn open_or_create(url: Url, name: String, env_config: Config) -> Result<Self> { pub async fn open_or_create(url: Url, name: String, env_config: Config) -> Result<Self> {
let client = wallet::Client::new(url)?; let client = wallet::Client::new(url)?;
let open_wallet_response = client.open_wallet(name.clone()).await; match client.open_wallet(name.clone()).await {
if open_wallet_response.is_err() { Err(error) => {
tracing::debug!(%error, "Open wallet response error");
client.create_wallet(name.clone(), "English".to_owned()).await.context( client.create_wallet(name.clone(), "English".to_owned()).await.context(
"Unable to create Monero wallet, please ensure that the monero-wallet-rpc is available", "Unable to create Monero wallet, please ensure that the monero-wallet-rpc is available",
)?; )?;
tracing::debug!(monero_wallet_name = %name, "Created Monero wallet"); tracing::debug!(monero_wallet_name = %name, "Created Monero wallet");
} else { }
tracing::debug!(monero_wallet_name = %name, "Opened Monero wallet"); Ok(_) => tracing::debug!(monero_wallet_name = %name, "Opened Monero wallet"),
} }
Self::connect(client, name, env_config).await Self::connect(client, name, env_config).await

View File

@ -1,7 +1,7 @@
use libp2p::rendezvous::Namespace; use libp2p::rendezvous::Namespace;
use std::fmt; use std::fmt;
#[derive(Debug, PartialEq, Clone, Copy)] #[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum XmrBtcNamespace { pub enum XmrBtcNamespace {
Mainnet, Mainnet,
Testnet, Testnet,

View File

@ -37,7 +37,7 @@ pub mod protocol {
>; >;
} }
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)] #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub struct BlockchainNetwork { pub struct BlockchainNetwork {
#[serde(with = "crate::bitcoin::network")] #[serde(with = "crate::bitcoin::network")]
pub bitcoin: bitcoin::Network, pub bitcoin: bitcoin::Network,

View File

@ -258,7 +258,7 @@ impl From<SpotPriceResponse> for Result<monero::Amount, Error> {
} }
} }
#[derive(Clone, Debug, thiserror::Error, PartialEq)] #[derive(Clone, Debug, thiserror::Error, PartialEq, Eq)]
pub enum Error { pub enum Error {
#[error("Seller currently does not accept incoming swap requests, please try again later")] #[error("Seller currently does not accept incoming swap requests, please try again later")]
NoSwapsAccepted, NoSwapsAccepted,

View File

@ -101,11 +101,11 @@ impl From<BobState> for State {
} }
} }
#[derive(thiserror::Error, Debug, Clone, Copy, PartialEq)] #[derive(thiserror::Error, Debug, Clone, Copy, PartialEq, Eq)]
#[error("Not in the role of Alice")] #[error("Not in the role of Alice")]
pub struct NotAlice; pub struct NotAlice;
#[derive(thiserror::Error, Debug, Clone, Copy, PartialEq)] #[derive(thiserror::Error, Debug, Clone, Copy, PartialEq, Eq)]
#[error("Not in the role of Bob")] #[error("Not in the role of Bob")]
pub struct NotBob; pub struct NotBob;

View File

@ -560,7 +560,7 @@ impl State4 {
} }
} }
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct State5 { pub struct State5 {
#[serde(with = "monero_private_key")] #[serde(with = "monero_private_key")]
s_a: monero::PrivateKey, s_a: monero::PrivateKey,