Browse Source

Switch to `import_granularity: item`

Putting each import statement on a dedicated line makes it a lot less
likely to create merge conflicts when items are removed / added because
Git resolves conflicts on a line-by-line basis.
resilient-broadcast
Thomas Eizinger 3 years ago
parent
commit
23464b6ef2
No known key found for this signature in database GPG Key ID: 651AC83A6C6C8B96
  1. 4
      daemon/build.rs
  2. 4
      daemon/src/address_map.rs
  3. 12
      daemon/src/auth.rs
  4. 10
      daemon/src/bdk_ext.rs
  5. 10
      daemon/src/bitmex_price_feed.rs
  6. 16
      daemon/src/cfd_actors.rs
  7. 15
      daemon/src/collab_settlement_maker.rs
  8. 18
      daemon/src/collab_settlement_taker.rs
  9. 41
      daemon/src/connection.rs
  10. 19
      daemon/src/db.rs
  11. 12
      daemon/src/housekeeping.rs
  12. 6
      daemon/src/keypair.rs
  13. 13
      daemon/src/lib.rs
  14. 3
      daemon/src/logger.rs
  15. 32
      daemon/src/maker.rs
  16. 59
      daemon/src/maker_cfd.rs
  17. 37
      daemon/src/maker_inc_connections.rs
  18. 31
      daemon/src/model.rs
  19. 47
      daemon/src/model/cfd.rs
  20. 43
      daemon/src/monitor.rs
  21. 10
      daemon/src/noise.rs
  22. 28
      daemon/src/oracle.rs
  23. 16
      daemon/src/payout_curve.rs
  24. 4
      daemon/src/payout_curve/basis.rs
  25. 1
      daemon/src/payout_curve/basis_eval.rs
  26. 8
      daemon/src/payout_curve/compat.rs
  27. 3
      daemon/src/payout_curve/csr_tools.rs
  28. 1
      daemon/src/payout_curve/curve.rs
  29. 1
      daemon/src/payout_curve/curve_factory.rs
  30. 6
      daemon/src/payout_curve/splineobject.rs
  31. 36
      daemon/src/projection.rs
  32. 34
      daemon/src/rollover_taker.rs
  33. 3
      daemon/src/routes.rs
  34. 31
      daemon/src/routes_maker.rs
  35. 33
      daemon/src/routes_taker.rs
  36. 3
      daemon/src/seed.rs
  37. 6
      daemon/src/send_to_socket.rs
  38. 59
      daemon/src/setup_contract.rs
  39. 27
      daemon/src/setup_maker.rs
  40. 26
      daemon/src/setup_taker.rs
  41. 3
      daemon/src/supervisor.rs
  42. 30
      daemon/src/taker.rs
  43. 40
      daemon/src/taker_cfd.rs
  44. 12
      daemon/src/to_sse_event.rs
  45. 6
      daemon/src/tokio_ext.rs
  46. 3
      daemon/src/tx.rs
  47. 26
      daemon/src/wallet.rs
  48. 35
      daemon/src/wire.rs
  49. 22
      daemon/tests/happy_path.rs
  50. 6
      daemon/tests/harness/flow.rs
  51. 3
      daemon/tests/harness/maia.rs
  52. 3
      daemon/tests/harness/mocks/mod.rs
  53. 3
      daemon/tests/harness/mocks/monitor.rs
  54. 10
      daemon/tests/harness/mocks/wallet.rs
  55. 28
      daemon/tests/harness/mod.rs
  56. 2
      dprint.json

4
daemon/build.rs

@ -1,5 +1,7 @@
use anyhow::Result; use anyhow::Result;
use vergen::{vergen, Config, SemverKind}; use vergen::vergen;
use vergen::Config;
use vergen::SemverKind;
fn main() -> Result<()> { fn main() -> Result<()> {
std::fs::create_dir_all("../maker-frontend/dist/maker")?; std::fs::create_dir_all("../maker-frontend/dist/maker")?;

4
daemon/src/address_map.rs

@ -2,7 +2,9 @@ use anyhow::Result;
use std::collections::hash_map::Entry; use std::collections::hash_map::Entry;
use std::collections::HashMap; use std::collections::HashMap;
use std::hash::Hash; use std::hash::Hash;
use xtra::{Address, Handler, Message}; use xtra::Address;
use xtra::Handler;
use xtra::Message;
pub struct AddressMap<K, A> { pub struct AddressMap<K, A> {
inner: HashMap<K, xtra::Address<A>>, inner: HashMap<K, xtra::Address<A>>,

12
daemon/src/auth.rs

@ -1,9 +1,13 @@
use hex::FromHexError; use hex::FromHexError;
use rocket::http::Status; use rocket::http::Status;
use rocket::outcome::{try_outcome, IntoOutcome}; use rocket::outcome::try_outcome;
use rocket::request::{FromRequest, Outcome}; use rocket::outcome::IntoOutcome;
use rocket::{Request, State}; use rocket::request::FromRequest;
use rocket_basicauth::{BasicAuth, BasicAuthError}; use rocket::request::Outcome;
use rocket::Request;
use rocket::State;
use rocket_basicauth::BasicAuth;
use rocket_basicauth::BasicAuthError;
use std::fmt; use std::fmt;
use std::str::FromStr; use std::str::FromStr;

10
daemon/src/bdk_ext.rs

@ -1,14 +1,18 @@
use anyhow::Result; use anyhow::Result;
use bdk::bitcoin;
use bdk::bitcoin::util::bip32::ExtendedPrivKey; use bdk::bitcoin::util::bip32::ExtendedPrivKey;
use bdk::bitcoin::{self, Amount, Network}; use bdk::bitcoin::Amount;
use rand::{CryptoRng, RngCore}; use bdk::bitcoin::Network;
use rand::CryptoRng;
use rand::RngCore;
pub fn new_test_wallet( pub fn new_test_wallet(
rng: &mut (impl RngCore + CryptoRng), rng: &mut (impl RngCore + CryptoRng),
utxo_amount: Amount, utxo_amount: Amount,
num_utxos: u8, num_utxos: u8,
) -> Result<bdk::Wallet<(), bdk::database::MemoryDatabase>> { ) -> Result<bdk::Wallet<(), bdk::database::MemoryDatabase>> {
use bdk::{populate_test_db, testutils}; use bdk::populate_test_db;
use bdk::testutils;
let mut seed = [0u8; 32]; let mut seed = [0u8; 32];
rng.fill_bytes(&mut seed); rng.fill_bytes(&mut seed);

10
daemon/src/bitmex_price_feed.rs

@ -1,8 +1,12 @@
use crate::model::{Price, Timestamp}; use crate::model::Price;
use crate::{projection, supervisor, Tasks}; use crate::model::Timestamp;
use crate::projection;
use crate::supervisor;
use crate::Tasks;
use anyhow::Result; use anyhow::Result;
use async_trait::async_trait; use async_trait::async_trait;
use futures::{SinkExt, TryStreamExt}; use futures::SinkExt;
use futures::TryStreamExt;
use rust_decimal::Decimal; use rust_decimal::Decimal;
use std::convert::TryFrom; use std::convert::TryFrom;
use std::time::Duration; use std::time::Duration;

16
daemon/src/cfd_actors.rs

@ -1,6 +1,16 @@
use crate::model::cfd::{Attestation, Cfd, CfdState, OrderId}; use crate::db;
use crate::{db, monitor, oracle, projection, try_continue, wallet}; use crate::model::cfd::Attestation;
use anyhow::{bail, Context, Result}; use crate::model::cfd::Cfd;
use crate::model::cfd::CfdState;
use crate::model::cfd::OrderId;
use crate::monitor;
use crate::oracle;
use crate::projection;
use crate::try_continue;
use crate::wallet;
use anyhow::bail;
use anyhow::Context;
use anyhow::Result;
use sqlx::pool::PoolConnection; use sqlx::pool::PoolConnection;
use sqlx::Sqlite; use sqlx::Sqlite;

15
daemon/src/collab_settlement_maker.rs

@ -1,9 +1,14 @@
use crate::address_map::{ActorName, Stopping}; use crate::address_map::ActorName;
use crate::model::cfd::{ use crate::address_map::Stopping;
Cfd, CollaborativeSettlement, OrderId, Role, SettlementKind, SettlementProposal, use crate::maker_inc_connections;
}; use crate::model::cfd::Cfd;
use crate::model::cfd::CollaborativeSettlement;
use crate::model::cfd::OrderId;
use crate::model::cfd::Role;
use crate::model::cfd::SettlementKind;
use crate::model::cfd::SettlementProposal;
use crate::model::Identity; use crate::model::Identity;
use crate::{maker_inc_connections, projection}; use crate::projection;
use anyhow::Context; use anyhow::Context;
use async_trait::async_trait; use async_trait::async_trait;
use bdk::bitcoin::Script; use bdk::bitcoin::Script;

18
daemon/src/collab_settlement_taker.rs

@ -1,10 +1,16 @@
use crate::address_map::{ActorName, Stopping}; use crate::address_map::ActorName;
use crate::model::cfd::{ use crate::address_map::Stopping;
Cfd, CollaborativeSettlement, OrderId, SettlementKind, SettlementProposal, use crate::connection;
}; use crate::model::cfd::Cfd;
use crate::model::cfd::CollaborativeSettlement;
use crate::model::cfd::OrderId;
use crate::model::cfd::SettlementKind;
use crate::model::cfd::SettlementProposal;
use crate::model::Price; use crate::model::Price;
use crate::{connection, projection, wire}; use crate::projection;
use anyhow::{Context, Result}; use crate::wire;
use anyhow::Context;
use anyhow::Result;
use async_trait::async_trait; use async_trait::async_trait;
use xtra::prelude::MessageChannel; use xtra::prelude::MessageChannel;
use xtra_productivity::xtra_productivity; use xtra_productivity::xtra_productivity;

41
daemon/src/connection.rs

@ -1,22 +1,39 @@
use crate::address_map::{AddressMap, Stopping}; use crate::address_map::AddressMap;
use crate::address_map::Stopping;
use crate::collab_settlement_taker;
use crate::log_error;
use crate::model::cfd::OrderId; use crate::model::cfd::OrderId;
use crate::model::{Identity, Price, Timestamp, Usd}; use crate::model::Identity;
use crate::model::Price;
use crate::model::Timestamp;
use crate::model::Usd;
use crate::noise;
use crate::rollover_taker;
use crate::send_to_socket;
use crate::setup_taker;
use crate::taker_cfd::CurrentOrder; use crate::taker_cfd::CurrentOrder;
use crate::tokio_ext::FutureExt; use crate::tokio_ext::FutureExt;
use crate::wire::{EncryptedJsonCodec, TakerToMaker, Version}; use crate::wire;
use crate::{ use crate::wire::EncryptedJsonCodec;
collab_settlement_taker, log_error, noise, rollover_taker, send_to_socket, setup_taker, wire, use crate::wire::TakerToMaker;
Tasks, use crate::wire::Version;
}; use crate::Tasks;
use anyhow::{bail, Context, Result}; use anyhow::bail;
use anyhow::Context;
use anyhow::Result;
use bdk::bitcoin::Amount; use bdk::bitcoin::Amount;
use futures::{SinkExt, StreamExt, TryStreamExt}; use futures::SinkExt;
use futures::StreamExt;
use futures::TryStreamExt;
use std::net::SocketAddr; use std::net::SocketAddr;
use std::sync::{Arc, Mutex}; use std::sync::Arc;
use std::time::{Duration, SystemTime}; use std::sync::Mutex;
use std::time::Duration;
use std::time::SystemTime;
use tokio::net::TcpStream; use tokio::net::TcpStream;
use tokio::sync::watch; use tokio::sync::watch;
use tokio_util::codec::{FramedRead, FramedWrite}; use tokio_util::codec::FramedRead;
use tokio_util::codec::FramedWrite;
use xtra::prelude::MessageChannel; use xtra::prelude::MessageChannel;
use xtra::KeepRunning; use xtra::KeepRunning;
use xtra_productivity::xtra_productivity; use xtra_productivity::xtra_productivity;

19
daemon/src/db.rs

@ -1,8 +1,12 @@
use crate::model::cfd::{Cfd, CfdState, OrderId}; use crate::model::cfd::Cfd;
use crate::model::cfd::CfdState;
use crate::model::cfd::OrderId;
use crate::model::BitMexPriceEventId; use crate::model::BitMexPriceEventId;
use anyhow::{Context, Result}; use anyhow::Context;
use anyhow::Result;
use sqlx::pool::PoolConnection; use sqlx::pool::PoolConnection;
use sqlx::{Sqlite, SqlitePool}; use sqlx::Sqlite;
use sqlx::SqlitePool;
use std::mem; use std::mem;
use time::Duration; use time::Duration;
@ -355,8 +359,13 @@ pub async fn load_cfds_by_oracle_event_id(
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use crate::model::cfd::{Cfd, CfdState, Order, Origin}; use crate::model::cfd::Cfd;
use crate::model::{Identity, Price, Usd}; use crate::model::cfd::CfdState;
use crate::model::cfd::Order;
use crate::model::cfd::Origin;
use crate::model::Identity;
use crate::model::Price;
use crate::model::Usd;
use crate::seed::Seed; use crate::seed::Seed;
use pretty_assertions::assert_eq; use pretty_assertions::assert_eq;
use rand::Rng; use rand::Rng;

12
daemon/src/housekeeping.rs

@ -1,9 +1,13 @@
use crate::db::{append_cfd_state, load_all_cfds}; use crate::db::append_cfd_state;
use crate::model::cfd::{Cfd, CfdState}; use crate::db::load_all_cfds;
use crate::{try_continue, wallet}; use crate::model::cfd::Cfd;
use crate::model::cfd::CfdState;
use crate::try_continue;
use crate::wallet;
use anyhow::Result; use anyhow::Result;
use sqlx::pool::PoolConnection; use sqlx::pool::PoolConnection;
use sqlx::{Sqlite, SqlitePool}; use sqlx::Sqlite;
use sqlx::SqlitePool;
use xtra::Address; use xtra::Address;
/// Perform necessary housekeeping before actor system startup /// Perform necessary housekeeping before actor system startup

6
daemon/src/keypair.rs

@ -1,6 +1,8 @@
use bdk::bitcoin; use bdk::bitcoin;
use bdk::bitcoin::secp256k1::{self, SECP256K1}; use bdk::bitcoin::secp256k1;
use rand::{CryptoRng, RngCore}; use bdk::bitcoin::secp256k1::SECP256K1;
use rand::CryptoRng;
use rand::RngCore;
pub fn new<R>(rng: &mut R) -> (secp256k1::SecretKey, bitcoin::PublicKey) pub fn new<R>(rng: &mut R) -> (secp256k1::SecretKey, bitcoin::PublicKey)
where where

13
daemon/src/lib.rs

@ -1,8 +1,11 @@
#![cfg_attr(not(test), warn(clippy::unwrap_used))] #![cfg_attr(not(test), warn(clippy::unwrap_used))]
#![warn(clippy::disallowed_method)] #![warn(clippy::disallowed_method)]
use crate::db::load_all_cfds; use crate::db::load_all_cfds;
use crate::maker_cfd::{FromTaker, TakerConnected}; use crate::maker_cfd::FromTaker;
use crate::model::cfd::{Cfd, Order, UpdateCfdProposals}; use crate::maker_cfd::TakerConnected;
use crate::model::cfd::Cfd;
use crate::model::cfd::Order;
use crate::model::cfd::UpdateCfdProposals;
use crate::model::Identity; use crate::model::Identity;
use crate::oracle::Attestation; use crate::oracle::Attestation;
use crate::tokio_ext::FutureExt; use crate::tokio_ext::FutureExt;
@ -16,8 +19,10 @@ use sqlx::SqlitePool;
use std::future::Future; use std::future::Future;
use std::time::Duration; use std::time::Duration;
use tokio::sync::watch; use tokio::sync::watch;
use xtra::message_channel::{MessageChannel, StrongMessageChannel}; use xtra::message_channel::MessageChannel;
use xtra::{Actor, Address}; use xtra::message_channel::StrongMessageChannel;
use xtra::Actor;
use xtra::Address;
pub mod sqlx_ext; // Must come first because it is a macro. pub mod sqlx_ext; // Must come first because it is a macro.

3
daemon/src/logger.rs

@ -1,7 +1,8 @@
use anyhow::Result; use anyhow::Result;
use tracing_subscriber::filter::LevelFilter; use tracing_subscriber::filter::LevelFilter;
use tracing_subscriber::fmt::time::ChronoLocal; use tracing_subscriber::fmt::time::ChronoLocal;
use tracing_subscriber::{EnvFilter, FmtSubscriber}; use tracing_subscriber::EnvFilter;
use tracing_subscriber::FmtSubscriber;
pub fn init(level: LevelFilter, json_format: bool) -> Result<()> { pub fn init(level: LevelFilter, json_format: bool) -> Result<()> {
if level == LevelFilter::OFF { if level == LevelFilter::OFF {

32
daemon/src/maker.rs

@ -1,16 +1,30 @@
use anyhow::{Context, Result}; use anyhow::Context;
use anyhow::Result;
use bdk::bitcoin;
use bdk::bitcoin::secp256k1::schnorrsig; use bdk::bitcoin::secp256k1::schnorrsig;
use bdk::bitcoin::Amount; use bdk::bitcoin::Amount;
use bdk::{bitcoin, FeeRate}; use bdk::FeeRate;
use clap::{Parser, Subcommand}; use clap::Parser;
use daemon::auth::{self, MAKER_USERNAME}; use clap::Subcommand;
use daemon::auth;
use daemon::auth::MAKER_USERNAME;
use daemon::bitmex_price_feed;
use daemon::db;
use daemon::housekeeping;
use daemon::logger;
use daemon::maker_inc_connections;
use daemon::model::cfd::Role; use daemon::model::cfd::Role;
use daemon::monitor;
use daemon::oracle;
use daemon::projection;
use daemon::seed::Seed; use daemon::seed::Seed;
use daemon::{ use daemon::supervisor;
bitmex_price_feed, db, housekeeping, logger, maker_inc_connections, monitor, oracle, use daemon::wallet;
projection, supervisor, wallet, MakerActorSystem, Tasks, HEARTBEAT_INTERVAL, N_PAYOUTS, use daemon::MakerActorSystem;
SETTLEMENT_INTERVAL, use daemon::Tasks;
}; use daemon::HEARTBEAT_INTERVAL;
use daemon::N_PAYOUTS;
use daemon::SETTLEMENT_INTERVAL;
use sqlx::sqlite::SqliteConnectOptions; use sqlx::sqlite::SqliteConnectOptions;
use sqlx::SqlitePool; use sqlx::SqlitePool;
use std::net::SocketAddr; use std::net::SocketAddr;

59
daemon/src/maker_cfd.rs

@ -1,31 +1,56 @@
use crate::address_map::{AddressMap, Stopping}; use crate::address_map::AddressMap;
use crate::cfd_actors::{self, append_cfd_state, insert_cfd_and_update_feed}; use crate::address_map::Stopping;
use crate::cfd_actors::append_cfd_state;
use crate::cfd_actors::insert_cfd_and_update_feed;
use crate::cfd_actors::{self};
use crate::collab_settlement_maker;
use crate::db::load_cfd_by_order_id; use crate::db::load_cfd_by_order_id;
use crate::model::cfd::{ use crate::log_error;
Cfd, CfdState, CfdStateCommon, Dlc, Order, OrderId, Origin, Role, RollOverProposal, use crate::maker_inc_connections;
SettlementKind, SettlementProposal, UpdateCfdProposal, use crate::model::cfd::Cfd;
}; use crate::model::cfd::CfdState;
use crate::model::{Identity, Price, Timestamp, Usd}; use crate::model::cfd::CfdStateCommon;
use crate::model::cfd::Dlc;
use crate::model::cfd::Order;
use crate::model::cfd::OrderId;
use crate::model::cfd::Origin;
use crate::model::cfd::Role;
use crate::model::cfd::RollOverProposal;
use crate::model::cfd::SettlementKind;
use crate::model::cfd::SettlementProposal;
use crate::model::cfd::UpdateCfdProposal;
use crate::model::Identity;
use crate::model::Price;
use crate::model::Timestamp;
use crate::model::Usd;
use crate::monitor::MonitorParams; use crate::monitor::MonitorParams;
use crate::projection::{ use crate::monitor::{self};
try_into_update_rollover_proposal, Update, UpdateRollOverProposal, UpdateSettlementProposal, use crate::oracle;
}; use crate::projection;
use crate::projection::try_into_update_rollover_proposal;
use crate::projection::Update;
use crate::projection::UpdateRollOverProposal;
use crate::projection::UpdateSettlementProposal;
use crate::setup_contract;
use crate::setup_contract::RolloverParams; use crate::setup_contract::RolloverParams;
use crate::setup_maker;
use crate::tokio_ext::FutureExt; use crate::tokio_ext::FutureExt;
use crate::wallet;
use crate::wire;
use crate::wire::TakerToMaker; use crate::wire::TakerToMaker;
use crate::{ use crate::Tasks;
collab_settlement_maker, log_error, maker_inc_connections, monitor, oracle, projection, use anyhow::Context as _;
setup_contract, setup_maker, wallet, wire, Tasks, use anyhow::Result;
};
use anyhow::{Context as _, Result};
use async_trait::async_trait; use async_trait::async_trait;
use bdk::bitcoin::secp256k1::schnorrsig; use bdk::bitcoin::secp256k1::schnorrsig;
use futures::channel::mpsc; use futures::channel::mpsc;
use futures::future;
use futures::future::RemoteHandle; use futures::future::RemoteHandle;
use futures::{future, SinkExt}; use futures::SinkExt;
use sqlx::pool::PoolConnection; use sqlx::pool::PoolConnection;
use sqlx::Sqlite; use sqlx::Sqlite;
use std::collections::{HashMap, HashSet}; use std::collections::HashMap;
use std::collections::HashSet;
use time::Duration; use time::Duration;
use xtra::prelude::*; use xtra::prelude::*;
use xtra::Actor as _; use xtra::Actor as _;

37
daemon/src/maker_inc_connections.rs

@ -1,20 +1,39 @@
use crate::address_map::{AddressMap, Stopping}; use crate::address_map::AddressMap;
use crate::maker_cfd::{FromTaker, TakerConnected, TakerDisconnected}; use crate::address_map::Stopping;
use crate::model::cfd::{Order, OrderId}; use crate::collab_settlement_maker;
use crate::maker_cfd;
use crate::maker_cfd::FromTaker;
use crate::maker_cfd::TakerConnected;
use crate::maker_cfd::TakerDisconnected;
use crate::model::cfd::Order;
use crate::model::cfd::OrderId;
use crate::model::Identity; use crate::model::Identity;
use crate::noise;
use crate::noise::TransportStateExt; use crate::noise::TransportStateExt;
use crate::send_to_socket;
use crate::setup_maker;
use crate::tokio_ext::FutureExt; use crate::tokio_ext::FutureExt;
use crate::wire::{taker_to_maker, EncryptedJsonCodec, MakerToTaker, TakerToMaker, Version}; use crate::wire;
use crate::{collab_settlement_maker, maker_cfd, noise, send_to_socket, setup_maker, wire, Tasks}; use crate::wire::taker_to_maker;
use anyhow::{bail, Context, Result}; use crate::wire::EncryptedJsonCodec;
use futures::{SinkExt, TryStreamExt}; use crate::wire::MakerToTaker;
use crate::wire::TakerToMaker;
use crate::wire::Version;
use crate::Tasks;
use anyhow::bail;
use anyhow::Context;
use anyhow::Result;
use futures::SinkExt;
use futures::TryStreamExt;
use std::collections::HashMap; use std::collections::HashMap;
use std::io; use std::io;
use std::net::SocketAddr; use std::net::SocketAddr;
use std::sync::{Arc, Mutex}; use std::sync::Arc;
use std::sync::Mutex;
use std::time::Duration; use std::time::Duration;
use tokio::net::TcpStream; use tokio::net::TcpStream;
use tokio_util::codec::{FramedRead, FramedWrite}; use tokio_util::codec::FramedRead;
use tokio_util::codec::FramedWrite;
use xtra::prelude::*; use xtra::prelude::*;
use xtra::KeepRunning; use xtra::KeepRunning;
use xtra_productivity::xtra_productivity; use xtra_productivity::xtra_productivity;

31
daemon/src/model.rs

@ -1,19 +1,32 @@
use crate::{impl_sqlx_type_display_from_str, olivia}; use crate::impl_sqlx_type_display_from_str;
use anyhow::{Context, Result}; use crate::olivia;
use bdk::bitcoin::{Address, Amount, Denomination}; use anyhow::Context;
use anyhow::Result;
use bdk::bitcoin::Address;
use bdk::bitcoin::Amount;
use bdk::bitcoin::Denomination;
use chrono::DateTime; use chrono::DateTime;
use reqwest::Url; use reqwest::Url;
use rust_decimal::prelude::ToPrimitive; use rust_decimal::prelude::ToPrimitive;
use rust_decimal::Decimal; use rust_decimal::Decimal;
use serde::de::Error as _; use serde::de::Error as _;
use serde::{Deserialize, Serialize}; use serde::Deserialize;
use serde_with::{DeserializeFromStr, SerializeDisplay}; use serde::Serialize;
use serde_with::DeserializeFromStr;
use serde_with::SerializeDisplay;
use std::convert::TryInto; use std::convert::TryInto;
use std::fmt;
use std::num::NonZeroU8; use std::num::NonZeroU8;
use std::ops::{Add, Div, Mul, Sub}; use std::ops::Add;
use std::time::{SystemTime, UNIX_EPOCH}; use std::ops::Div;
use std::{fmt, str}; use std::ops::Mul;
use time::{OffsetDateTime, PrimitiveDateTime, Time}; use std::ops::Sub;
use std::str;
use std::time::SystemTime;
use std::time::UNIX_EPOCH;
use time::OffsetDateTime;
use time::PrimitiveDateTime;
use time::Time;
pub mod cfd; pub mod cfd;

47
daemon/src/model/cfd.rs

@ -1,24 +1,47 @@
use crate::model::{ use crate::model::BitMexPriceEventId;
BitMexPriceEventId, Identity, InversePrice, Leverage, Percent, Position, Price, Timestamp, use crate::model::Identity;
TradingPair, Usd, use crate::model::InversePrice;
}; use crate::model::Leverage;
use crate::{monitor, oracle, payout_curve}; use crate::model::Percent;
use anyhow::{bail, Context, Result}; use crate::model::Position;
use bdk::bitcoin::secp256k1::{SecretKey, Signature}; use crate::model::Price;
use bdk::bitcoin::{Address, Amount, PublicKey, Script, SignedAmount, Transaction, Txid}; use crate::model::Timestamp;
use crate::model::TradingPair;
use crate::model::Usd;
use crate::monitor;
use crate::oracle;
use crate::payout_curve;
use anyhow::bail;
use anyhow::Context;
use anyhow::Result;
use bdk::bitcoin::secp256k1::SecretKey;
use bdk::bitcoin::secp256k1::Signature;
use bdk::bitcoin::Address;
use bdk::bitcoin::Amount;
use bdk::bitcoin::PublicKey;
use bdk::bitcoin::Script;
use bdk::bitcoin::SignedAmount;
use bdk::bitcoin::Transaction;
use bdk::bitcoin::Txid;
use bdk::descriptor::Descriptor; use bdk::descriptor::Descriptor;
use bdk::miniscript::DescriptorTrait; use bdk::miniscript::DescriptorTrait;
use maia::secp256k1_zkp::{self, EcdsaAdaptorSignature, SECP256K1}; use maia::finalize_spend_transaction;
use maia::{finalize_spend_transaction, spending_tx_sighash, TransactionExt}; use maia::secp256k1_zkp;
use maia::secp256k1_zkp::EcdsaAdaptorSignature;
use maia::secp256k1_zkp::SECP256K1;
use maia::spending_tx_sighash;
use maia::TransactionExt;
use rocket::request::FromParam; use rocket::request::FromParam;
use rust_decimal::prelude::FromPrimitive; use rust_decimal::prelude::FromPrimitive;
use rust_decimal::Decimal; use rust_decimal::Decimal;
use serde::de::Error as _; use serde::de::Error as _;
use serde::{Deserialize, Serialize}; use serde::Deserialize;
use serde::Serialize;
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt; use std::fmt;
use std::ops::RangeInclusive; use std::ops::RangeInclusive;
use time::{Duration, OffsetDateTime}; use time::Duration;
use time::OffsetDateTime;
use uuid::adapter::Hyphenated; use uuid::adapter::Hyphenated;
use uuid::Uuid; use uuid::Uuid;

43
daemon/src/monitor.rs

@ -1,19 +1,34 @@
use crate::model::cfd::{CetStatus, Cfd, CfdState, Dlc, OrderId}; use crate::log_error;
use crate::model;
use crate::model::cfd::CetStatus;
use crate::model::cfd::Cfd;
use crate::model::cfd::CfdState;
use crate::model::cfd::Dlc;
use crate::model::cfd::OrderId;
use crate::model::BitMexPriceEventId; use crate::model::BitMexPriceEventId;
use crate::oracle;
use crate::oracle::Attestation; use crate::oracle::Attestation;
use crate::{log_error, model, oracle, try_continue}; use crate::try_continue;
use anyhow::{Context, Result}; use anyhow::Context;
use anyhow::Result;
use async_trait::async_trait; use async_trait::async_trait;
use bdk::bitcoin::{PublicKey, Script, Txid}; use bdk::bitcoin::PublicKey;
use bdk::bitcoin::Script;
use bdk::bitcoin::Txid;
use bdk::descriptor::Descriptor; use bdk::descriptor::Descriptor;
use bdk::electrum_client::{ElectrumApi, GetHistoryRes, HeaderNotification}; use bdk::electrum_client::ElectrumApi;
use bdk::electrum_client::GetHistoryRes;
use bdk::electrum_client::HeaderNotification;
use bdk::miniscript::DescriptorTrait; use bdk::miniscript::DescriptorTrait;
use std::collections::hash_map::Entry; use std::collections::hash_map::Entry;
use std::collections::{BTreeMap, HashMap}; use std::collections::BTreeMap;
use std::convert::{TryFrom, TryInto}; use std::collections::HashMap;
use std::convert::TryFrom;
use std::convert::TryInto;
use std::fmt; use std::fmt;
use std::marker::Send; use std::marker::Send;
use std::ops::{Add, RangeInclusive}; use std::ops::Add;
use std::ops::RangeInclusive;
use xtra::prelude::StrongMessageChannel; use xtra::prelude::StrongMessageChannel;
use xtra_productivity::xtra_productivity; use xtra_productivity::xtra_productivity;
@ -669,10 +684,14 @@ impl xtra::Handler<oracle::Attestation> for Actor {
mod tests { mod tests {
use super::*; use super::*;
use bdk::bitcoin::blockdata::block; use bdk::bitcoin::blockdata::block;
use bdk::electrum_client::{ use bdk::electrum_client::Batch;
Batch, Error, GetBalanceRes, GetHeadersRes, GetMerkleRes, ListUnspentRes, use bdk::electrum_client::Error;
RawHeaderNotification, ServerFeaturesRes, use bdk::electrum_client::GetBalanceRes;
}; use bdk::electrum_client::GetHeadersRes;
use bdk::electrum_client::GetMerkleRes;
use bdk::electrum_client::ListUnspentRes;
use bdk::electrum_client::RawHeaderNotification;
use bdk::electrum_client::ServerFeaturesRes;
use std::iter::FromIterator; use std::iter::FromIterator;
use tracing_subscriber::prelude::*; use tracing_subscriber::prelude::*;

10
daemon/src/noise.rs

@ -1,7 +1,11 @@
use anyhow::{anyhow, Context, Result}; use anyhow::anyhow;
use snow::{Builder, TransportState}; use anyhow::Context;
use anyhow::Result;
use snow::Builder;
use snow::TransportState;
use std::io; use std::io;
use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::io::AsyncReadExt;
use tokio::io::AsyncWriteExt;
use tokio::net::TcpStream; use tokio::net::TcpStream;
pub static NOISE_MAX_MSG_LEN: u32 = 65535; pub static NOISE_MAX_MSG_LEN: u32 = 65535;

28
daemon/src/oracle.rs

@ -1,12 +1,19 @@
use crate::model::cfd::{Cfd, CfdState}; use crate::log_error;
use crate::model::cfd::Cfd;
use crate::model::cfd::CfdState;
use crate::model::BitMexPriceEventId; use crate::model::BitMexPriceEventId;
use crate::{log_error, tokio_ext, try_continue}; use crate::tokio_ext;
use anyhow::{Context, Result}; use crate::try_continue;
use anyhow::Context;
use anyhow::Result;
use async_trait::async_trait; use async_trait::async_trait;
use maia::secp256k1_zkp::{schnorrsig, SecretKey}; use maia::secp256k1_zkp::schnorrsig;
use rocket::time::{OffsetDateTime, Time}; use maia::secp256k1_zkp::SecretKey;
use rocket::time::OffsetDateTime;
use rocket::time::Time;
use serde::Deserialize; use serde::Deserialize;
use std::collections::{HashMap, HashSet}; use std::collections::HashMap;
use std::collections::HashSet;
use std::ops::Add; use std::ops::Add;
use time::ext::NumericalDuration; use time::ext::NumericalDuration;
use time::Duration; use time::Duration;
@ -304,7 +311,8 @@ impl xtra::Message for NewAttestationFetched {
mod olivia_api { mod olivia_api {
use crate::model::BitMexPriceEventId; use crate::model::BitMexPriceEventId;
use anyhow::Context; use anyhow::Context;
use maia::secp256k1_zkp::{schnorrsig, SecretKey}; use maia::secp256k1_zkp::schnorrsig;
use maia::secp256k1_zkp::SecretKey;
use std::convert::TryFrom; use std::convert::TryFrom;
use time::OffsetDateTime; use time::OffsetDateTime;
@ -391,8 +399,10 @@ mod olivia_api {
mod timestamp { mod timestamp {
use crate::olivia; use crate::olivia;
use serde::de::Error as _; use serde::de::Error as _;
use serde::{Deserialize, Deserializer}; use serde::Deserialize;
use time::{OffsetDateTime, PrimitiveDateTime}; use serde::Deserializer;
use time::OffsetDateTime;
use time::PrimitiveDateTime;
pub fn deserialize<'a, D>(deserializer: D) -> Result<OffsetDateTime, D::Error> pub fn deserialize<'a, D>(deserializer: D) -> Result<OffsetDateTime, D::Error>
where where

16
daemon/src/payout_curve.rs

@ -1,14 +1,18 @@
use std::fmt; use crate::model::Leverage;
use crate::model::Price;
use crate::model::{Leverage, Price, Usd}; use crate::model::Usd;
use crate::payout_curve::curve::Curve; use crate::payout_curve::curve::Curve;
use anyhow::{Context, Result}; use anyhow::Context;
use anyhow::Result;
use bdk::bitcoin; use bdk::bitcoin;
use itertools::Itertools; use itertools::Itertools;
use maia::{generate_payouts, Payout}; use maia::generate_payouts;
use maia::Payout;
use ndarray::prelude::*; use ndarray::prelude::*;
use num::{FromPrimitive, ToPrimitive}; use num::FromPrimitive;
use num::ToPrimitive;
use rust_decimal::Decimal; use rust_decimal::Decimal;
use std::fmt;
mod basis; mod basis;
mod basis_eval; mod basis_eval;

4
daemon/src/payout_curve/basis.rs

@ -2,10 +2,10 @@ use crate::payout_curve::basis_eval::*;
use crate::payout_curve::csr_tools::CSR; use crate::payout_curve::csr_tools::CSR;
use crate::payout_curve::utils::*; use crate::payout_curve::utils::*;
use crate::payout_curve::Error; use crate::payout_curve::Error;
use core::cmp::max; use core::cmp::max;
use ndarray::concatenate;
use ndarray::prelude::*; use ndarray::prelude::*;
use ndarray::{concatenate, s}; use ndarray::s;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct BSplineBasis { pub struct BSplineBasis {

1
daemon/src/payout_curve/basis_eval.rs

@ -1,7 +1,6 @@
use crate::payout_curve::csr_tools::CSR; use crate::payout_curve::csr_tools::CSR;
use crate::payout_curve::utils::*; use crate::payout_curve::utils::*;
use crate::payout_curve::Error; use crate::payout_curve::Error;
use ndarray::prelude::*; use ndarray::prelude::*;
use std::cmp::min; use std::cmp::min;

8
daemon/src/payout_curve/compat.rs

@ -1,5 +1,9 @@
use nalgebra::{ComplexField, DMatrix, Dynamic, Scalar}; use nalgebra::ComplexField;
use ndarray::{Array1, Array2}; use nalgebra::DMatrix;
use nalgebra::Dynamic;
use nalgebra::Scalar;
use ndarray::Array1;
use ndarray::Array2;
use std::fmt::Debug; use std::fmt::Debug;
pub trait ToNAlgebraMatrix<T> { pub trait ToNAlgebraMatrix<T> {

3
daemon/src/payout_curve/csr_tools.rs

@ -1,4 +1,5 @@
use crate::payout_curve::compat::{To1DArray, ToNAlgebraMatrix}; use crate::payout_curve::compat::To1DArray;
use crate::payout_curve::compat::ToNAlgebraMatrix;
use crate::payout_curve::Error; use crate::payout_curve::Error;
use itertools::Itertools; use itertools::Itertools;
use ndarray::prelude::*; use ndarray::prelude::*;

1
daemon/src/payout_curve/curve.rs

@ -2,7 +2,6 @@ use crate::payout_curve::basis::BSplineBasis;
use crate::payout_curve::splineobject::SplineObject; use crate::payout_curve::splineobject::SplineObject;
use crate::payout_curve::utils::*; use crate::payout_curve::utils::*;
use crate::payout_curve::Error; use crate::payout_curve::Error;
use ndarray::prelude::*; use ndarray::prelude::*;
use ndarray::s; use ndarray::s;
use std::cmp::max; use std::cmp::max;

1
daemon/src/payout_curve/curve_factory.rs

@ -2,7 +2,6 @@ use crate::payout_curve::basis::BSplineBasis;
use crate::payout_curve::curve::Curve; use crate::payout_curve::curve::Curve;
use crate::payout_curve::utils::cmp_f64; use crate::payout_curve::utils::cmp_f64;
use crate::payout_curve::Error; use crate::payout_curve::Error;
use ndarray::prelude::*; use ndarray::prelude::*;
/// Perform general spline interpolation on a provided basis. /// Perform general spline interpolation on a provided basis.

6
daemon/src/payout_curve/splineobject.rs

@ -2,9 +2,11 @@ use crate::payout_curve::basis::BSplineBasis;
use crate::payout_curve::csr_tools::CSR; use crate::payout_curve::csr_tools::CSR;
use crate::payout_curve::Error; use crate::payout_curve::Error;
use itertools::Itertools; use itertools::Itertools;
use ndarray::concatenate;
use ndarray::prelude::*; use ndarray::prelude::*;
use ndarray::{concatenate, Order}; use ndarray::Order;
use ndarray_einsum_beta::{einsum, tensordot}; use ndarray_einsum_beta::einsum;
use ndarray_einsum_beta::tensordot;
use std::collections::HashMap; use std::collections::HashMap;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]

36
daemon/src/projection.rs

@ -1,16 +1,29 @@
use std::collections::HashMap; use crate::bitmex_price_feed;
use crate::db;
use crate::model::cfd::{ use crate::model;
Cfd as ModelCfd, OrderId, Role, RollOverProposal, SettlementKind, SettlementProposal, use crate::model::cfd::Cfd as ModelCfd;
UpdateCfdProposal, use crate::model::cfd::OrderId;
}; use crate::model::cfd::Role;
use crate::model::{Leverage, Position, Timestamp, TradingPair}; use crate::model::cfd::RollOverProposal;
use crate::{bitmex_price_feed, db, model, tx, Order, UpdateCfdProposals}; use crate::model::cfd::SettlementKind;
use crate::model::cfd::SettlementProposal;
use crate::model::cfd::UpdateCfdProposal;
use crate::model::Leverage;
use crate::model::Position;
use crate::model::Timestamp;
use crate::model::TradingPair;
use crate::tx;
use crate::Order;
use crate::UpdateCfdProposals;
use anyhow::Result; use anyhow::Result;
use bdk::bitcoin::{Amount, Network, SignedAmount}; use bdk::bitcoin::Amount;
use bdk::bitcoin::Network;
use bdk::bitcoin::SignedAmount;
use itertools::Itertools; use itertools::Itertools;
use rust_decimal::Decimal; use rust_decimal::Decimal;
use serde::{Deserialize, Serialize}; use serde::Deserialize;
use serde::Serialize;
use std::collections::HashMap;
use time::OffsetDateTime; use time::OffsetDateTime;
use tokio::sync::watch; use tokio::sync::watch;
use xtra_productivity::xtra_productivity; use xtra_productivity::xtra_productivity;
@ -597,7 +610,8 @@ mod tests {
use super::*; use super::*;
use rust_decimal_macros::dec; use rust_decimal_macros::dec;
use serde_test::{assert_ser_tokens, Token}; use serde_test::assert_ser_tokens;
use serde_test::Token;
#[test] #[test]
fn usd_serializes_with_only_cents() { fn usd_serializes_with_only_cents() {

34
daemon/src/rollover_taker.rs

@ -1,16 +1,30 @@
use crate::address_map::{ActorName, Stopping}; use crate::address_map::ActorName;
use crate::address_map::Stopping;
use crate::connection; use crate::connection;
use crate::model::cfd::{Cfd, Dlc, OrderId, Role, RollOverProposal, SettlementKind}; use crate::model::cfd::Cfd;
use crate::model::{BitMexPriceEventId, Timestamp}; use crate::model::cfd::Dlc;
use crate::oracle::{self, GetAnnouncement}; use crate::model::cfd::OrderId;
use crate::projection::{self, UpdateRollOverProposal}; use crate::model::cfd::Role;
use crate::setup_contract::{self, RolloverParams}; use crate::model::cfd::RollOverProposal;
use crate::model::cfd::SettlementKind;
use crate::model::BitMexPriceEventId;
use crate::model::Timestamp;
use crate::oracle;
use crate::oracle::GetAnnouncement;
use crate::projection;
use crate::projection::UpdateRollOverProposal;
use crate::setup_contract;
use crate::setup_contract::RolloverParams;
use crate::tokio_ext::spawn_fallible; use crate::tokio_ext::spawn_fallible;
use crate::wire::{self, RollOverMsg}; use crate::wire;
use anyhow::{Context, Result}; use crate::wire::RollOverMsg;
use anyhow::Context;
use anyhow::Result;
use async_trait::async_trait; use async_trait::async_trait;
use futures::channel::mpsc::{self, UnboundedSender}; use futures::channel::mpsc;
use futures::{future, SinkExt}; use futures::channel::mpsc::UnboundedSender;
use futures::future;
use futures::SinkExt;
use maia::secp256k1_zkp::schnorrsig; use maia::secp256k1_zkp::schnorrsig;
use xtra::prelude::MessageChannel; use xtra::prelude::MessageChannel;
use xtra_productivity::xtra_productivity; use xtra_productivity::xtra_productivity;

3
daemon/src/routes.rs

@ -1,4 +1,5 @@
use rocket::http::{ContentType, Status}; use rocket::http::ContentType;
use rocket::http::Status;
use rust_embed::EmbeddedFile; use rust_embed::EmbeddedFile;
use std::borrow::Cow; use std::borrow::Cow;
use std::path::PathBuf; use std::path::PathBuf;

31
daemon/src/routes_maker.rs

@ -1,16 +1,29 @@
use anyhow::Result; use anyhow::Result;
use bdk::bitcoin::Network; use bdk::bitcoin::Network;
use daemon::auth::Authenticated; use daemon::auth::Authenticated;
use daemon::maker_cfd;
use daemon::maker_inc_connections;
use daemon::model::cfd::OrderId; use daemon::model::cfd::OrderId;
use daemon::model::{Price, Usd, WalletInfo}; use daemon::model::Price;
use daemon::projection::{Cfd, CfdAction, Feeds, Identity}; use daemon::model::Usd;
use daemon::model::WalletInfo;
use daemon::monitor;
use daemon::oracle;
use daemon::projection::Cfd;
use daemon::projection::CfdAction;
use daemon::projection::Feeds;
use daemon::projection::Identity;
use daemon::routes::EmbeddedFileExt; use daemon::routes::EmbeddedFileExt;
use daemon::to_sse_event::ToSseEvent; use daemon::to_sse_event::ToSseEvent;
use daemon::{maker_cfd, maker_inc_connections, monitor, oracle, wallet}; use daemon::wallet;
use http_api_problem::{HttpApiProblem, StatusCode}; use http_api_problem::HttpApiProblem;
use rocket::http::{ContentType, Header, Status}; use http_api_problem::StatusCode;
use rocket::http::ContentType;
use rocket::http::Header;
use rocket::http::Status;
use rocket::response::status;
use rocket::response::stream::EventStream; use rocket::response::stream::EventStream;
use rocket::response::{status, Responder}; use rocket::response::Responder;
use rocket::serde::json::Json; use rocket::serde::json::Json;
use rocket::State; use rocket::State;
use rust_embed::RustEmbed; use rust_embed::RustEmbed;
@ -266,9 +279,11 @@ pub async fn get_takers<'r>(
mod tests { mod tests {
use super::*; use super::*;
use daemon::auth::Password; use daemon::auth::Password;
use rocket::http::{Header, Status}; use rocket::http::Header;
use rocket::http::Status;
use rocket::local::blocking::Client; use rocket::local::blocking::Client;
use rocket::{Build, Rocket}; use rocket::Build;
use rocket::Rocket;
#[test] #[test]
fn routes_are_password_protected() { fn routes_are_password_protected() {

33
daemon/src/routes_taker.rs

@ -1,19 +1,34 @@
use bdk::bitcoin::{Amount, Network}; use bdk::bitcoin::Amount;
use bdk::bitcoin::Network;
use daemon::bitmex_price_feed;
use daemon::connection::ConnectionStatus; use daemon::connection::ConnectionStatus;
use daemon::model::cfd::{calculate_long_margin, OrderId}; use daemon::model::cfd::calculate_long_margin;
use daemon::model::{Leverage, Price, Usd, WalletInfo}; use daemon::model::cfd::OrderId;
use daemon::projection::{CfdAction, Feeds}; use daemon::model::Leverage;
use daemon::model::Price;
use daemon::model::Usd;
use daemon::model::WalletInfo;
use daemon::monitor;
use daemon::oracle;
use daemon::projection::CfdAction;
use daemon::projection::Feeds;
use daemon::routes::EmbeddedFileExt; use daemon::routes::EmbeddedFileExt;
use daemon::taker_cfd;
use daemon::to_sse_event::ToSseEvent; use daemon::to_sse_event::ToSseEvent;
use daemon::{bitmex_price_feed, monitor, oracle, taker_cfd, tx, wallet}; use daemon::tx;
use http_api_problem::{HttpApiProblem, StatusCode}; use daemon::wallet;
use rocket::http::{ContentType, Status}; use http_api_problem::HttpApiProblem;
use http_api_problem::StatusCode;
use rocket::http::ContentType;
use rocket::http::Status;
use rocket::response::status;
use rocket::response::stream::EventStream; use rocket::response::stream::EventStream;
use rocket::response::{status, Responder}; use rocket::response::Responder;
use rocket::serde::json::Json; use rocket::serde::json::Json;
use rocket::State; use rocket::State;
use rust_embed::RustEmbed; use rust_embed::RustEmbed;
use serde::{Deserialize, Serialize}; use serde::Deserialize;
use serde::Serialize;
use std::borrow::Cow; use std::borrow::Cow;
use std::path::PathBuf; use std::path::PathBuf;
use tokio::select; use tokio::select;

3
daemon/src/seed.rs

@ -1,4 +1,5 @@
use anyhow::{anyhow, Result}; use anyhow::anyhow;
use anyhow::Result;
use bdk::bitcoin::util::bip32::ExtendedPrivKey; use bdk::bitcoin::util::bip32::ExtendedPrivKey;
use bdk::bitcoin::Network; use bdk::bitcoin::Network;
use hkdf::Hkdf; use hkdf::Hkdf;

6
daemon/src/send_to_socket.rs

@ -1,11 +1,13 @@
use crate::wire::{self, EncryptedJsonCodec}; use crate::wire;
use crate::wire::EncryptedJsonCodec;
use futures::SinkExt; use futures::SinkExt;
use serde::Serialize; use serde::Serialize;
use std::fmt; use std::fmt;
use tokio::io::AsyncWriteExt; use tokio::io::AsyncWriteExt;
use tokio::net::tcp::OwnedWriteHalf; use tokio::net::tcp::OwnedWriteHalf;
use tokio_util::codec::FramedWrite; use tokio_util::codec::FramedWrite;
use xtra::{Handler, Message}; use xtra::Handler;
use xtra::Message;
pub struct Actor<T> { pub struct Actor<T> {
write: FramedWrite<OwnedWriteHalf, EncryptedJsonCodec<T>>, write: FramedWrite<OwnedWriteHalf, EncryptedJsonCodec<T>>,

59
daemon/src/setup_contract.rs

@ -1,25 +1,52 @@
use crate::model::cfd::{Cet, Dlc, RevokedCommit, Role}; use crate::model;
use crate::model::{Leverage, Price, Usd}; use crate::model::cfd::Cet;
use crate::model::cfd::Dlc;
use crate::model::cfd::RevokedCommit;
use crate::model::cfd::Role;
use crate::model::Leverage;
use crate::model::Price;
use crate::model::Usd;
use crate::oracle;
use crate::payout_curve;
use crate::tokio_ext::FutureExt; use crate::tokio_ext::FutureExt;
use crate::wire::{ use crate::wallet;
Msg0, Msg1, Msg2, Msg3, RollOverMsg, RollOverMsg0, RollOverMsg1, RollOverMsg2, RollOverMsg3, use crate::wire::Msg0;
SetupMsg, use crate::wire::Msg1;
}; use crate::wire::Msg2;
use crate::{model, oracle, payout_curve, wallet}; use crate::wire::Msg3;
use anyhow::{Context, Result}; use crate::wire::RollOverMsg;
use bdk::bitcoin::secp256k1::{schnorrsig, Signature, SECP256K1}; use crate::wire::RollOverMsg0;
use crate::wire::RollOverMsg1;
use crate::wire::RollOverMsg2;
use crate::wire::RollOverMsg3;
use crate::wire::SetupMsg;
use anyhow::Context;
use anyhow::Result;
use bdk::bitcoin::secp256k1::schnorrsig;
use bdk::bitcoin::secp256k1::Signature;
use bdk::bitcoin::secp256k1::SECP256K1;
use bdk::bitcoin::util::psbt::PartiallySignedTransaction; use bdk::bitcoin::util::psbt::PartiallySignedTransaction;
use bdk::bitcoin::{Amount, PublicKey, Transaction}; use bdk::bitcoin::Amount;
use bdk::bitcoin::PublicKey;
use bdk::bitcoin::Transaction;
use bdk::descriptor::Descriptor; use bdk::descriptor::Descriptor;
use bdk::miniscript::DescriptorTrait; use bdk::miniscript::DescriptorTrait;
use futures::stream::FusedStream; use futures::stream::FusedStream;
use futures::{Sink, SinkExt, StreamExt}; use futures::Sink;
use futures::SinkExt;
use futures::StreamExt;
use maia::commit_descriptor;
use maia::compute_adaptor_pk;
use maia::create_cfd_transactions;
use maia::interval;
use maia::lock_descriptor;
use maia::renew_cfd_transactions;
use maia::secp256k1_zkp;
use maia::secp256k1_zkp::EcdsaAdaptorSignature; use maia::secp256k1_zkp::EcdsaAdaptorSignature;
use maia::{ use maia::spending_tx_sighash;
commit_descriptor, compute_adaptor_pk, create_cfd_transactions, interval, lock_descriptor, use maia::Announcement;
renew_cfd_transactions, secp256k1_zkp, spending_tx_sighash, Announcement, PartyParams, use maia::PartyParams;
PunishParams, use maia::PunishParams;
};
use std::collections::HashMap; use std::collections::HashMap;
use std::iter::FromIterator; use std::iter::FromIterator;
use std::ops::RangeInclusive; use std::ops::RangeInclusive;

27
daemon/src/setup_maker.rs

@ -1,15 +1,26 @@
use crate::address_map::{ActorName, Stopping}; use crate::address_map::ActorName;
use crate::model::cfd::{Cfd, Dlc, Order, OrderId, Role}; use crate::address_map::Stopping;
use crate::maker_inc_connections;
use crate::model::cfd::Cfd;
use crate::model::cfd::Dlc;
use crate::model::cfd::Order;
use crate::model::cfd::OrderId;
use crate::model::cfd::Role;
use crate::model::Identity; use crate::model::Identity;
use crate::oracle::Announcement; use crate::oracle::Announcement;
use crate::setup_contract::{self, SetupParams}; use crate::setup_contract;
use crate::setup_contract::SetupParams;
use crate::tokio_ext::spawn_fallible; use crate::tokio_ext::spawn_fallible;
use crate::wire::{self, SetupMsg}; use crate::wallet;
use crate::{maker_inc_connections, wallet}; use crate::wire;
use anyhow::{Context, Result}; use crate::wire::SetupMsg;
use anyhow::Context;
use anyhow::Result;
use async_trait::async_trait; use async_trait::async_trait;
use futures::channel::mpsc::{self, UnboundedSender}; use futures::channel::mpsc;
use futures::{future, SinkExt}; use futures::channel::mpsc::UnboundedSender;
use futures::future;
use futures::SinkExt;
use maia::secp256k1_zkp::schnorrsig; use maia::secp256k1_zkp::schnorrsig;
use xtra::prelude::MessageChannel; use xtra::prelude::MessageChannel;
use xtra_productivity::xtra_productivity; use xtra_productivity::xtra_productivity;

26
daemon/src/setup_taker.rs

@ -1,13 +1,25 @@
use crate::model::cfd::{Cfd, CfdState, Completed, Dlc, OrderId, Role}; use crate::address_map;
use crate::connection;
use crate::model::cfd::Cfd;
use crate::model::cfd::CfdState;
use crate::model::cfd::Completed;
use crate::model::cfd::Dlc;
use crate::model::cfd::OrderId;
use crate::model::cfd::Role;
use crate::oracle::Announcement; use crate::oracle::Announcement;
use crate::setup_contract::{self, SetupParams}; use crate::setup_contract;
use crate::setup_contract::SetupParams;
use crate::tokio_ext::spawn_fallible; use crate::tokio_ext::spawn_fallible;
use crate::wire::{self, SetupMsg}; use crate::wallet;
use crate::{address_map, connection, wallet}; use crate::wire;
use anyhow::{Context, Result}; use crate::wire::SetupMsg;
use anyhow::Context;
use anyhow::Result;
use async_trait::async_trait; use async_trait::async_trait;
use futures::channel::mpsc::{self, UnboundedSender}; use futures::channel::mpsc;
use futures::{future, SinkExt}; use futures::channel::mpsc::UnboundedSender;
use futures::future;
use futures::SinkExt;
use maia::secp256k1_zkp::schnorrsig; use maia::secp256k1_zkp::schnorrsig;
use xtra::prelude::*; use xtra::prelude::*;
use xtra_productivity::xtra_productivity; use xtra_productivity::xtra_productivity;

3
daemon/src/supervisor.rs

@ -1,7 +1,8 @@
use crate::Tasks; use crate::Tasks;
use async_trait::async_trait; use async_trait::async_trait;
use std::fmt; use std::fmt;
use xtra::{Address, Context}; use xtra::Address;
use xtra::Context;
use xtra_productivity::xtra_productivity; use xtra_productivity::xtra_productivity;
/// A supervising actor reacts to messages from the actor it is supervising and restarts it based on /// A supervising actor reacts to messages from the actor it is supervising and restarts it based on

30
daemon/src/taker.rs

@ -1,16 +1,30 @@
use anyhow::{Context, Result}; use anyhow::Context;
use anyhow::Result;
use bdk::bitcoin;
use bdk::bitcoin::secp256k1::schnorrsig; use bdk::bitcoin::secp256k1::schnorrsig;
use bdk::bitcoin::{Address, Amount}; use bdk::bitcoin::Address;
use bdk::{bitcoin, FeeRate}; use bdk::bitcoin::Amount;
use clap::{Parser, Subcommand}; use bdk::FeeRate;
use clap::Parser;
use clap::Subcommand;
use daemon::bitmex_price_feed;
use daemon::connection::connect; use daemon::connection::connect;
use daemon::db;
use daemon::housekeeping;
use daemon::logger;
use daemon::model::cfd::Role; use daemon::model::cfd::Role;
use daemon::model::Identity; use daemon::model::Identity;
use daemon::monitor;
use daemon::oracle;
use daemon::projection;
use daemon::seed::Seed; use daemon::seed::Seed;
use daemon::{ use daemon::supervisor;
bitmex_price_feed, db, housekeeping, logger, monitor, oracle, projection, supervisor, wallet, use daemon::wallet;
TakerActorSystem, Tasks, HEARTBEAT_INTERVAL, N_PAYOUTS, SETTLEMENT_INTERVAL, use daemon::TakerActorSystem;
}; use daemon::Tasks;
use daemon::HEARTBEAT_INTERVAL;
use daemon::N_PAYOUTS;
use daemon::SETTLEMENT_INTERVAL;
use sqlx::sqlite::SqliteConnectOptions; use sqlx::sqlite::SqliteConnectOptions;
use sqlx::SqlitePool; use sqlx::SqlitePool;
use std::net::SocketAddr; use std::net::SocketAddr;

40
daemon/src/taker_cfd.rs

@ -1,14 +1,34 @@
use crate::address_map::{AddressMap, Stopping}; use crate::address_map::AddressMap;
use crate::cfd_actors::{self, append_cfd_state, insert_cfd_and_update_feed}; use crate::address_map::Stopping;
use crate::cfd_actors::append_cfd_state;
use crate::cfd_actors::insert_cfd_and_update_feed;
use crate::cfd_actors::{self};
use crate::collab_settlement_taker;
use crate::connection;
use crate::db::load_cfd_by_order_id; use crate::db::load_cfd_by_order_id;
use crate::model::cfd::{Cfd, CfdState, CfdStateCommon, Completed, Order, OrderId, Origin, Role}; use crate::log_error;
use crate::model::{Identity, Price, Usd}; use crate::model::cfd::Cfd;
use crate::monitor::{self, MonitorParams}; use crate::model::cfd::CfdState;
use crate::{ use crate::model::cfd::CfdStateCommon;
collab_settlement_taker, connection, log_error, oracle, projection, rollover_taker, use crate::model::cfd::Completed;
setup_taker, wallet, Tasks, use crate::model::cfd::Order;
}; use crate::model::cfd::OrderId;
use anyhow::{bail, Context as _, Result}; use crate::model::cfd::Origin;
use crate::model::cfd::Role;
use crate::model::Identity;
use crate::model::Price;
use crate::model::Usd;
use crate::monitor::MonitorParams;
use crate::monitor::{self};
use crate::oracle;
use crate::projection;
use crate::rollover_taker;
use crate::setup_taker;
use crate::wallet;
use crate::Tasks;
use anyhow::bail;
use anyhow::Context as _;
use anyhow::Result;
use async_trait::async_trait; use async_trait::async_trait;
use bdk::bitcoin::secp256k1::schnorrsig; use bdk::bitcoin::secp256k1::schnorrsig;
use xtra::prelude::*; use xtra::prelude::*;

12
daemon/src/to_sse_event.rs

@ -1,7 +1,13 @@
use crate::connection;
use crate::model;
use crate::model::Timestamp; use crate::model::Timestamp;
use crate::projection::{Cfd, CfdAction, CfdOrder, Identity, Quote}; use crate::projection::Cfd;
use crate::to_sse_event::ConnectionCloseReason::{MakerVersionOutdated, TakerVersionOutdated}; use crate::projection::CfdAction;
use crate::{connection, model}; use crate::projection::CfdOrder;
use crate::projection::Identity;
use crate::projection::Quote;
use crate::to_sse_event::ConnectionCloseReason::MakerVersionOutdated;
use crate::to_sse_event::ConnectionCloseReason::TakerVersionOutdated;
use bdk::bitcoin::Amount; use bdk::bitcoin::Amount;
use rocket::request::FromParam; use rocket::request::FromParam;
use rocket::response::stream::Event; use rocket::response::stream::Event;

6
daemon/src/tokio_ext.rs

@ -1,10 +1,12 @@
use futures::future::RemoteHandle; use futures::future::RemoteHandle;
use futures::FutureExt as _; use futures::FutureExt as _;
use std::any::{Any, TypeId}; use std::any::Any;
use std::any::TypeId;
use std::fmt; use std::fmt;
use std::future::Future; use std::future::Future;
use std::time::Duration; use std::time::Duration;
use tokio::time::{timeout, Timeout}; use tokio::time::timeout;
use tokio::time::Timeout;
pub fn spawn_fallible<F, E>(future: F) pub fn spawn_fallible<F, E>(future: F)
where where

3
daemon/src/tx.rs

@ -1,4 +1,5 @@
use bdk::bitcoin::{Network, Txid}; use bdk::bitcoin::Network;
use bdk::bitcoin::Txid;
use serde::Serialize; use serde::Serialize;
use crate::model::cfd; use crate::model::cfd;

26
daemon/src/wallet.rs

@ -1,17 +1,31 @@
use crate::model::{Timestamp, WalletInfo}; use crate::model::Timestamp;
use crate::model::WalletInfo;
use crate::Tasks; use crate::Tasks;
use anyhow::{bail, Context, Result}; use anyhow::bail;
use anyhow::Context;
use anyhow::Result;
use async_trait::async_trait; use async_trait::async_trait;
use bdk::bitcoin::consensus::encode::serialize_hex; use bdk::bitcoin::consensus::encode::serialize_hex;
use bdk::bitcoin::util::bip32::ExtendedPrivKey; use bdk::bitcoin::util::bip32::ExtendedPrivKey;
use bdk::bitcoin::util::psbt::PartiallySignedTransaction; use bdk::bitcoin::util::psbt::PartiallySignedTransaction;
use bdk::bitcoin::{Address, Amount, OutPoint, PublicKey, Script, Transaction, Txid}; use bdk::bitcoin::Address;
use bdk::blockchain::{ElectrumBlockchain, NoopProgress}; use bdk::bitcoin::Amount;
use bdk::bitcoin::OutPoint;
use bdk::bitcoin::PublicKey;
use bdk::bitcoin::Script;
use bdk::bitcoin::Transaction;
use bdk::bitcoin::Txid;
use bdk::blockchain::ElectrumBlockchain;
use bdk::blockchain::NoopProgress;
use bdk::database::BatchDatabase; use bdk::database::BatchDatabase;
use bdk::electrum_client;
use bdk::wallet::tx_builder::TxOrdering; use bdk::wallet::tx_builder::TxOrdering;
use bdk::wallet::AddressIndex; use bdk::wallet::AddressIndex;
use bdk::{electrum_client, FeeRate, KeychainKind, SignOptions}; use bdk::FeeRate;
use maia::{PartyParams, TxBuilderExt}; use bdk::KeychainKind;
use bdk::SignOptions;
use maia::PartyParams;
use maia::TxBuilderExt;
use rocket::serde::json::Value; use rocket::serde::json::Value;
use std::collections::HashSet; use std::collections::HashSet;
use std::time::Duration; use std::time::Duration;

35
daemon/src/wire.rs

@ -1,22 +1,37 @@
use crate::model::cfd::{Order, OrderId}; use crate::model::cfd::Order;
use crate::model::{BitMexPriceEventId, Price, Timestamp, Usd}; use crate::model::cfd::OrderId;
use crate::noise::{NOISE_MAX_MSG_LEN, NOISE_TAG_LEN}; use crate::model::BitMexPriceEventId;
use anyhow::{bail, Result}; use crate::model::Price;
use crate::model::Timestamp;
use crate::model::Usd;
use crate::noise::NOISE_MAX_MSG_LEN;
use crate::noise::NOISE_TAG_LEN;
use anyhow::bail;
use anyhow::Result;
use bdk::bitcoin::secp256k1::Signature; use bdk::bitcoin::secp256k1::Signature;
use bdk::bitcoin::util::psbt::PartiallySignedTransaction; use bdk::bitcoin::util::psbt::PartiallySignedTransaction;
use bdk::bitcoin::{Address, Amount, PublicKey}; use bdk::bitcoin::Address;
use bdk::bitcoin::Amount;
use bdk::bitcoin::PublicKey;
use bytes::BytesMut; use bytes::BytesMut;
use maia::secp256k1_zkp::{EcdsaAdaptorSignature, SecretKey}; use maia::secp256k1_zkp::EcdsaAdaptorSignature;
use maia::{CfdTransactions, PartyParams, PunishParams}; use maia::secp256k1_zkp::SecretKey;
use maia::CfdTransactions;
use maia::PartyParams;
use maia::PunishParams;
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize}; use serde::Deserialize;
use serde::Serialize;
use snow::TransportState; use snow::TransportState;
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt; use std::fmt;
use std::marker::PhantomData; use std::marker::PhantomData;
use std::ops::RangeInclusive; use std::ops::RangeInclusive;
use std::sync::{Arc, Mutex}; use std::sync::Arc;
use tokio_util::codec::{Decoder, Encoder, LengthDelimitedCodec}; use std::sync::Mutex;
use tokio_util::codec::Decoder;
use tokio_util::codec::Encoder;
use tokio_util::codec::LengthDelimitedCodec;
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd)] #[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd)]
pub struct Version(semver::Version); pub struct Version(semver::Version);

22
daemon/tests/happy_path.rs

@ -1,14 +1,24 @@
use std::time::Duration; use std::time::Duration;
use crate::harness::flow::{is_next_none, next, next_cfd, next_order, next_some}; use crate::harness::deliver_close_finality_event;
use crate::harness::{ use crate::harness::deliver_lock_finality_event;
deliver_close_finality_event, deliver_lock_finality_event, dummy_new_order, init_tracing, use crate::harness::dummy_new_order;
start_both, Maker, MakerConfig, Taker, TakerConfig, use crate::harness::flow::is_next_none;
}; use crate::harness::flow::next;
use crate::harness::flow::next_cfd;
use crate::harness::flow::next_order;
use crate::harness::flow::next_some;
use crate::harness::init_tracing;
use crate::harness::start_both;
use crate::harness::Maker;
use crate::harness::MakerConfig;
use crate::harness::Taker;
use crate::harness::TakerConfig;
use daemon::connection::ConnectionStatus; use daemon::connection::ConnectionStatus;
use daemon::model::cfd::OrderId; use daemon::model::cfd::OrderId;
use daemon::model::Usd; use daemon::model::Usd;
use daemon::projection::{CfdState, Identity}; use daemon::projection::CfdState;
use daemon::projection::Identity;
use maia::secp256k1_zkp::schnorrsig; use maia::secp256k1_zkp::schnorrsig;
use rust_decimal_macros::dec; use rust_decimal_macros::dec;
use tokio::time::sleep; use tokio::time::sleep;

6
daemon/tests/harness/flow.rs

@ -1,5 +1,7 @@
use anyhow::{Context, Result}; use anyhow::Context;
use daemon::projection::{Cfd, CfdOrder}; use anyhow::Result;
use daemon::projection::Cfd;
use daemon::projection::CfdOrder;
use daemon::tokio_ext::FutureExt; use daemon::tokio_ext::FutureExt;
use std::time::Duration; use std::time::Duration;
use tokio::sync::watch; use tokio::sync::watch;

3
daemon/tests/harness/maia.rs

@ -1,4 +1,5 @@
use maia::secp256k1_zkp::{schnorrsig, SecretKey}; use maia::secp256k1_zkp::schnorrsig;
use maia::secp256k1_zkp::SecretKey;
use maia::Announcement; use maia::Announcement;
use std::str::FromStr; use std::str::FromStr;

3
daemon/tests/harness/mocks/mod.rs

@ -1,6 +1,7 @@
use std::sync::Arc; use std::sync::Arc;
use tokio::sync::{Mutex, MutexGuard}; use tokio::sync::Mutex;
use tokio::sync::MutexGuard;
use self::monitor::MonitorActor; use self::monitor::MonitorActor;
use self::oracle::OracleActor; use self::oracle::OracleActor;

3
daemon/tests/harness/mocks/monitor.rs

@ -1,6 +1,7 @@
use std::sync::Arc; use std::sync::Arc;
use daemon::{monitor, oracle}; use daemon::monitor;
use daemon::oracle;
use mockall::*; use mockall::*;
use tokio::sync::Mutex; use tokio::sync::Mutex;
use xtra_productivity::xtra_productivity; use xtra_productivity::xtra_productivity;

10
daemon/tests/harness/mocks/wallet.rs

@ -1,14 +1,18 @@
use anyhow::Result; use anyhow::Result;
use bdk::bitcoin::ecdsa;
use bdk::bitcoin::util::psbt::PartiallySignedTransaction; use bdk::bitcoin::util::psbt::PartiallySignedTransaction;
use bdk::bitcoin::{ecdsa, Amount, Txid}; use bdk::bitcoin::Amount;
use bdk::bitcoin::Txid;
use bdk::wallet::tx_builder::TxOrdering; use bdk::wallet::tx_builder::TxOrdering;
use bdk::wallet::AddressIndex; use bdk::wallet::AddressIndex;
use bdk::FeeRate; use bdk::FeeRate;
use daemon::bdk_ext::new_test_wallet; use daemon::bdk_ext::new_test_wallet;
use daemon::model::{Timestamp, WalletInfo}; use daemon::model::Timestamp;
use daemon::model::WalletInfo;
use daemon::wallet; use daemon::wallet;
use maia::secp256k1_zkp::Secp256k1; use maia::secp256k1_zkp::Secp256k1;
use maia::{PartyParams, TxBuilderExt}; use maia::PartyParams;
use maia::TxBuilderExt;
use mockall::*; use mockall::*;
use rand::thread_rng; use rand::thread_rng;
use std::sync::Arc; use std::sync::Arc;

28
daemon/tests/harness/mod.rs

@ -3,15 +3,27 @@ use crate::harness::mocks::oracle::OracleActor;
use crate::harness::mocks::wallet::WalletActor; use crate::harness::mocks::wallet::WalletActor;
use crate::schnorrsig; use crate::schnorrsig;
use ::bdk::bitcoin::Network; use ::bdk::bitcoin::Network;
use daemon::connection::{connect, ConnectionStatus}; use daemon::connection::connect;
use daemon::model::cfd::{OrderId, Role}; use daemon::connection::ConnectionStatus;
use daemon::model::{self, Price, Usd}; use daemon::db;
use daemon::projection::{Cfd, CfdOrder, Feeds, Identity}; use daemon::maker_cfd;
use daemon::maker_inc_connections;
use daemon::model::cfd::OrderId;
use daemon::model::cfd::Role;
use daemon::model::Price;
use daemon::model::Usd;
use daemon::model::{self};
use daemon::projection;
use daemon::projection::Cfd;
use daemon::projection::CfdOrder;
use daemon::projection::Feeds;
use daemon::projection::Identity;
use daemon::seed::Seed; use daemon::seed::Seed;
use daemon::{ use daemon::taker_cfd;
db, maker_cfd, maker_inc_connections, projection, taker_cfd, MakerActorSystem, Tasks, use daemon::MakerActorSystem;
HEARTBEAT_INTERVAL, N_PAYOUTS, use daemon::Tasks;
}; use daemon::HEARTBEAT_INTERVAL;
use daemon::N_PAYOUTS;
use rust_decimal_macros::dec; use rust_decimal_macros::dec;
use sqlx::SqlitePool; use sqlx::SqlitePool;
use std::net::SocketAddr; use std::net::SocketAddr;

2
dprint.json

@ -3,7 +3,7 @@
"projectType": "openSource", "projectType": "openSource",
"incremental": true, "incremental": true,
"rustfmt": { "rustfmt": {
"imports_granularity": "module", "imports_granularity": "item",
"wrap_comments": true, "wrap_comments": true,
"comment_width": 120 "comment_width": 120
}, },

Loading…
Cancel
Save