Browse Source

Allow maker to control lock and commit transaction fee rate

release/0.3.1
luckysori 3 years ago
parent
commit
69bbac5e1e
  1. 12
      Cargo.lock
  2. 3
      Cargo.toml
  3. 2
      daemon/migrations/20211207035936_add-fee-to-order.sql
  4. 104
      daemon/sqlx-data.json
  5. 26
      daemon/src/db.rs
  6. 4
      daemon/src/maker_cfd.rs
  7. 4
      daemon/src/model/cfd.rs
  8. 1
      daemon/src/rollover_taker.rs
  9. 2
      daemon/src/routes_maker.rs
  10. 16
      daemon/src/setup_contract.rs
  11. 1
      daemon/src/setup_maker.rs
  12. 1
      daemon/src/setup_taker.rs
  13. 24
      daemon/src/wallet.rs
  14. 1
      daemon/tests/harness/mod.rs

12
Cargo.lock

@ -1426,7 +1426,7 @@ dependencies = [
[[package]] [[package]]
name = "maia" name = "maia"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/comit-network/maia?branch=temp-bdk-dependency#45e886ef9e04ce37c26b628abe143fd98e967fdd" source = "git+https://github.com/comit-network/maia#baaad94a10291d4e55c3d2cd30f3736035ee10ea"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bdk", "bdk",
@ -2618,8 +2618,9 @@ dependencies = [
[[package]] [[package]]
name = "secp256k1-zkp" name = "secp256k1-zkp"
version = "0.4.0" version = "0.5.0"
source = "git+https://github.com/ElementsProject/rust-secp256k1-zkp#c8ff901516c9c299c9cc7331b15a7a14a05ced89" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72e2709b09561dfb584b366bd418ee5549a858873baa707ed83d3eb986e34abf"
dependencies = [ dependencies = [
"rand 0.6.5", "rand 0.6.5",
"secp256k1", "secp256k1",
@ -2629,8 +2630,9 @@ dependencies = [
[[package]] [[package]]
name = "secp256k1-zkp-sys" name = "secp256k1-zkp-sys"
version = "0.4.0" version = "0.5.0"
source = "git+https://github.com/ElementsProject/rust-secp256k1-zkp#c8ff901516c9c299c9cc7331b15a7a14a05ced89" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90c48e70d04fdd871498db6ac3b35eeae0a339ab1cd06af483fe8a6835d36def"
dependencies = [ dependencies = [
"cc", "cc",
"secp256k1-sys", "secp256k1-sys",

3
Cargo.toml

@ -5,7 +5,6 @@ resolver = "2"
[patch.crates-io] [patch.crates-io]
rocket = { git = "https://github.com/SergioBenitez/Rocket" } # Need to patch rocket dependency of `rocket_basicauth` until there is an official release. rocket = { git = "https://github.com/SergioBenitez/Rocket" } # Need to patch rocket dependency of `rocket_basicauth` until there is an official release.
xtra = { git = "https://github.com/Restioson/xtra" } # We need to use unreleased patches. xtra = { git = "https://github.com/Restioson/xtra" } # We need to use unreleased patches.
secp256k1-zkp = { git = "https://github.com/ElementsProject/rust-secp256k1-zkp" } # We need to use unreleased patches. maia = { git = "https://github.com/comit-network/maia" } # Unreleased
maia = { git = "https://github.com/comit-network/maia", branch = "temp-bdk-dependency" } # Unreleased
xtra_productivity = { git = "https://github.com/comit-network/xtra-productivity" } # Unreleased xtra_productivity = { git = "https://github.com/comit-network/xtra-productivity" } # Unreleased
bdk = { git = "https://github.com/bitcoindevkit/bdk" } # Unreleased bdk = { git = "https://github.com/bitcoindevkit/bdk" } # Unreleased

2
daemon/migrations/20211207035936_add-fee-to-order.sql

@ -0,0 +1,2 @@
-- Add migration script here
ALTER TABLE orders ADD COLUMN fee_rate not null default 1;

104
daemon/sqlx-data.json

@ -1,25 +1,7 @@
{ {
"db": "SQLite", "db": "SQLite",
"221a6283db798bacaba99e7e85130f9a8bbea1299d8cb99d272b1d478dc19775": { "047070578f79ceaa739c1b307d138ee30e3a8730c4ac357213801e23d73f2841": {
"query": "\n select\n state\n from cfd_states\n where cfd_id = $1\n order by id desc\n limit 1;\n ", "query": "\n select\n uuid as \"uuid: crate::model::cfd::OrderId\",\n trading_pair as \"trading_pair: crate::model::TradingPair\",\n position as \"position: crate::model::Position\",\n initial_price as \"initial_price: crate::model::Price\",\n min_quantity as \"min_quantity: crate::model::Usd\",\n max_quantity as \"max_quantity: crate::model::Usd\",\n leverage as \"leverage: crate::model::Leverage\",\n liquidation_price as \"liquidation_price: crate::model::Price\",\n creation_timestamp_seconds as \"ts_secs: crate::model::Timestamp\",\n settlement_time_interval_seconds as \"settlement_time_interval_secs: i64\",\n origin as \"origin: crate::model::cfd::Origin\",\n oracle_event_id as \"oracle_event_id: crate::model::BitMexPriceEventId\",\n fee_rate as \"fee_rate: u32\"\n from\n orders\n where\n uuid = $1\n ",
"describe": {
"columns": [
{
"name": "state",
"ordinal": 0,
"type_info": "Text"
}
],
"parameters": {
"Right": 1
},
"nullable": [
false
]
}
},
"3d41b8a81df84252dae228d8512b7491416520a6ad89561f67cdfb673f864a5a": {
"query": "\n with ord as (\n select\n id as order_id,\n uuid,\n trading_pair,\n position,\n initial_price,\n min_quantity,\n max_quantity,\n leverage,\n liquidation_price,\n creation_timestamp_seconds as ts_secs,\n settlement_time_interval_seconds as settlement_time_interval_secs,\n origin,\n oracle_event_id\n from orders\n ),\n\n cfd as (\n select\n ord.order_id,\n id as cfd_id,\n quantity_usd\n from cfds\n inner join ord on ord.order_id = cfds.order_id\n ),\n\n state as (\n select\n id as state_id,\n cfd.order_id,\n cfd.quantity_usd,\n state\n from cfd_states\n inner join cfd on cfd.cfd_id = cfd_states.cfd_id\n where id in (\n select\n max(id) as id\n from cfd_states\n group by (cfd_id)\n )\n )\n\n select\n ord.uuid as \"uuid: crate::model::cfd::OrderId\",\n ord.trading_pair as \"trading_pair: crate::model::TradingPair\",\n ord.position as \"position: crate::model::Position\",\n ord.initial_price as \"initial_price: crate::model::Price\",\n ord.min_quantity as \"min_quantity: crate::model::Usd\",\n ord.max_quantity as \"max_quantity: crate::model::Usd\",\n ord.leverage as \"leverage: crate::model::Leverage\",\n ord.liquidation_price as \"liquidation_price: crate::model::Price\",\n ord.ts_secs as \"ts_secs: crate::model::Timestamp\",\n ord.settlement_time_interval_secs as \"settlement_time_interval_secs: i64\",\n ord.origin as \"origin: crate::model::cfd::Origin\",\n ord.oracle_event_id as \"oracle_event_id: crate::model::BitMexPriceEventId\",\n state.quantity_usd as \"quantity_usd: crate::model::Usd\",\n state.state\n\n from ord\n inner join state on state.order_id = ord.order_id\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -83,18 +65,13 @@
"type_info": "Text" "type_info": "Text"
}, },
{ {
"name": "quantity_usd: crate::model::Usd", "name": "fee_rate: u32",
"ordinal": 12, "ordinal": 12,
"type_info": "Text" "type_info": "Null"
},
{
"name": "state",
"ordinal": 13,
"type_info": "Text"
} }
], ],
"parameters": { "parameters": {
"Right": 0 "Right": 1
}, },
"nullable": [ "nullable": [
false, false,
@ -109,13 +86,30 @@
false, false,
false, false,
false, false,
false,
false false
] ]
} }
}, },
"414ecf7f0cfce0a1a482b1b430d960867df835aae7fe1b306aa7f22353795dcf": { "221a6283db798bacaba99e7e85130f9a8bbea1299d8cb99d272b1d478dc19775": {
"query": "\n with ord as (\n select\n id as order_id,\n uuid,\n trading_pair,\n position,\n initial_price,\n min_quantity,\n max_quantity,\n leverage,\n liquidation_price,\n creation_timestamp_seconds as ts_secs,\n settlement_time_interval_seconds as settlement_time_interval_secs,\n origin,\n oracle_event_id\n from orders\n ),\n\n cfd as (\n select\n ord.order_id,\n id as cfd_id,\n quantity_usd\n from cfds\n inner join ord on ord.order_id = cfds.order_id\n ),\n\n state as (\n select\n id as state_id,\n cfd.order_id,\n cfd.quantity_usd,\n state\n from cfd_states\n inner join cfd on cfd.cfd_id = cfd_states.cfd_id\n where id in (\n select\n max(id) as id\n from cfd_states\n group by (cfd_id)\n )\n )\n\n select\n ord.uuid as \"uuid: crate::model::cfd::OrderId\",\n ord.trading_pair as \"trading_pair: crate::model::TradingPair\",\n ord.position as \"position: crate::model::Position\",\n ord.initial_price as \"initial_price: crate::model::Price\",\n ord.min_quantity as \"min_quantity: crate::model::Usd\",\n ord.max_quantity as \"max_quantity: crate::model::Usd\",\n ord.leverage as \"leverage: crate::model::Leverage\",\n ord.liquidation_price as \"liquidation_price: crate::model::Price\",\n ord.ts_secs as \"ts_secs: crate::model::Timestamp\",\n ord.settlement_time_interval_secs as \"settlement_time_interval_secs: i64\",\n ord.origin as \"origin: crate::model::cfd::Origin\",\n ord.oracle_event_id as \"oracle_event_id: crate::model::BitMexPriceEventId\",\n state.quantity_usd as \"quantity_usd: crate::model::Usd\",\n state.state\n\n from ord\n inner join state on state.order_id = ord.order_id\n\n where ord.uuid = $1\n ", "query": "\n select\n state\n from cfd_states\n where cfd_id = $1\n order by id desc\n limit 1;\n ",
"describe": {
"columns": [
{
"name": "state",
"ordinal": 0,
"type_info": "Text"
}
],
"parameters": {
"Right": 1
},
"nullable": [
false
]
}
},
"278833084178753ca86aa8bf9ac50fad8b6fd22dd978e2c803a8b7ba79bd5e1d": {
"query": "\n with ord as (\n select\n id as order_id,\n uuid,\n trading_pair,\n position,\n initial_price,\n min_quantity,\n max_quantity,\n leverage,\n liquidation_price,\n creation_timestamp_seconds as ts_secs,\n settlement_time_interval_seconds as settlement_time_interval_secs,\n origin,\n oracle_event_id,\n fee_rate\n from orders\n ),\n\n cfd as (\n select\n ord.order_id,\n id as cfd_id,\n quantity_usd\n from cfds\n inner join ord on ord.order_id = cfds.order_id\n ),\n\n state as (\n select\n id as state_id,\n cfd.order_id,\n cfd.quantity_usd,\n state\n from cfd_states\n inner join cfd on cfd.cfd_id = cfd_states.cfd_id\n where id in (\n select\n max(id) as id\n from cfd_states\n group by (cfd_id)\n )\n )\n\n select\n ord.uuid as \"uuid: crate::model::cfd::OrderId\",\n ord.trading_pair as \"trading_pair: crate::model::TradingPair\",\n ord.position as \"position: crate::model::Position\",\n ord.initial_price as \"initial_price: crate::model::Price\",\n ord.min_quantity as \"min_quantity: crate::model::Usd\",\n ord.max_quantity as \"max_quantity: crate::model::Usd\",\n ord.leverage as \"leverage: crate::model::Leverage\",\n ord.liquidation_price as \"liquidation_price: crate::model::Price\",\n ord.ts_secs as \"ts_secs: crate::model::Timestamp\",\n ord.settlement_time_interval_secs as \"settlement_time_interval_secs: i64\",\n ord.origin as \"origin: crate::model::cfd::Origin\",\n ord.oracle_event_id as \"oracle_event_id: crate::model::BitMexPriceEventId\",\n ord.fee_rate as \"fee_rate: u32\",\n state.quantity_usd as \"quantity_usd: crate::model::Usd\",\n state.state\n\n from ord\n inner join state on state.order_id = ord.order_id\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -179,18 +173,23 @@
"type_info": "Text" "type_info": "Text"
}, },
{ {
"name": "quantity_usd: crate::model::Usd", "name": "fee_rate: u32",
"ordinal": 12, "ordinal": 12,
"type_info": "Null"
},
{
"name": "quantity_usd: crate::model::Usd",
"ordinal": 13,
"type_info": "Text" "type_info": "Text"
}, },
{ {
"name": "state", "name": "state",
"ordinal": 13, "ordinal": 14,
"type_info": "Text" "type_info": "Text"
} }
], ],
"parameters": { "parameters": {
"Right": 1 "Right": 0
}, },
"nullable": [ "nullable": [
false, false,
@ -206,12 +205,13 @@
false, false,
false, false,
false, false,
false,
false false
] ]
} }
}, },
"5569292de42c8ce5cff83beb43af1f8e6c3c12b17e740550c1303a1a6d151100": { "898c1f59733397d90d39a73e160f47ab8dc68322f5b421056ffdf38c911cac2d": {
"query": "\n select\n uuid as \"uuid: crate::model::cfd::OrderId\",\n trading_pair as \"trading_pair: crate::model::TradingPair\",\n position as \"position: crate::model::Position\",\n initial_price as \"initial_price: crate::model::Price\",\n min_quantity as \"min_quantity: crate::model::Usd\",\n max_quantity as \"max_quantity: crate::model::Usd\",\n leverage as \"leverage: crate::model::Leverage\",\n liquidation_price as \"liquidation_price: crate::model::Price\",\n creation_timestamp_seconds as \"ts_secs: crate::model::Timestamp\",\n settlement_time_interval_seconds as \"settlement_time_interval_secs: i64\",\n origin as \"origin: crate::model::cfd::Origin\",\n oracle_event_id as \"oracle_event_id: crate::model::BitMexPriceEventId\"\n from\n orders\n where\n uuid = $1\n ", "query": "\n with ord as (\n select\n id as order_id,\n uuid,\n trading_pair,\n position,\n initial_price,\n min_quantity,\n max_quantity,\n leverage,\n liquidation_price,\n creation_timestamp_seconds as ts_secs,\n settlement_time_interval_seconds as settlement_time_interval_secs,\n origin,\n oracle_event_id,\n fee_rate\n from orders\n ),\n\n cfd as (\n select\n ord.order_id,\n id as cfd_id,\n quantity_usd\n from cfds\n inner join ord on ord.order_id = cfds.order_id\n ),\n\n state as (\n select\n id as state_id,\n cfd.order_id,\n cfd.quantity_usd,\n state\n from cfd_states\n inner join cfd on cfd.cfd_id = cfd_states.cfd_id\n where id in (\n select\n max(id) as id\n from cfd_states\n group by (cfd_id)\n )\n )\n\n select\n ord.uuid as \"uuid: crate::model::cfd::OrderId\",\n ord.trading_pair as \"trading_pair: crate::model::TradingPair\",\n ord.position as \"position: crate::model::Position\",\n ord.initial_price as \"initial_price: crate::model::Price\",\n ord.min_quantity as \"min_quantity: crate::model::Usd\",\n ord.max_quantity as \"max_quantity: crate::model::Usd\",\n ord.leverage as \"leverage: crate::model::Leverage\",\n ord.liquidation_price as \"liquidation_price: crate::model::Price\",\n ord.ts_secs as \"ts_secs: crate::model::Timestamp\",\n ord.settlement_time_interval_secs as \"settlement_time_interval_secs: i64\",\n ord.origin as \"origin: crate::model::cfd::Origin\",\n ord.oracle_event_id as \"oracle_event_id: crate::model::BitMexPriceEventId\",\n ord.fee_rate as \"fee_rate: u32\",\n state.quantity_usd as \"quantity_usd: crate::model::Usd\",\n state.state\n\n from ord\n inner join state on state.order_id = ord.order_id\n\n where ord.oracle_event_id = $1\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -273,6 +273,21 @@
"name": "oracle_event_id: crate::model::BitMexPriceEventId", "name": "oracle_event_id: crate::model::BitMexPriceEventId",
"ordinal": 11, "ordinal": 11,
"type_info": "Text" "type_info": "Text"
},
{
"name": "fee_rate: u32",
"ordinal": 12,
"type_info": "Null"
},
{
"name": "quantity_usd: crate::model::Usd",
"ordinal": 13,
"type_info": "Text"
},
{
"name": "state",
"ordinal": 14,
"type_info": "Text"
} }
], ],
"parameters": { "parameters": {
@ -290,6 +305,9 @@
false, false,
false, false,
false, false,
false,
false,
false,
false false
] ]
} }
@ -312,8 +330,8 @@
] ]
} }
}, },
"f822252e3d3eb70a03300529d8de8f553e8d97b1aac72fb964cbde49d65fe153": { "a6031f4720d1c6acf7043c9f9ee5035f5ffea0520220ad6b578b7ad0117ab58f": {
"query": "\n with ord as (\n select\n id as order_id,\n uuid,\n trading_pair,\n position,\n initial_price,\n min_quantity,\n max_quantity,\n leverage,\n liquidation_price,\n creation_timestamp_seconds as ts_secs,\n settlement_time_interval_seconds as settlement_time_interval_secs,\n origin,\n oracle_event_id\n from orders\n ),\n\n cfd as (\n select\n ord.order_id,\n id as cfd_id,\n quantity_usd\n from cfds\n inner join ord on ord.order_id = cfds.order_id\n ),\n\n state as (\n select\n id as state_id,\n cfd.order_id,\n cfd.quantity_usd,\n state\n from cfd_states\n inner join cfd on cfd.cfd_id = cfd_states.cfd_id\n where id in (\n select\n max(id) as id\n from cfd_states\n group by (cfd_id)\n )\n )\n\n select\n ord.uuid as \"uuid: crate::model::cfd::OrderId\",\n ord.trading_pair as \"trading_pair: crate::model::TradingPair\",\n ord.position as \"position: crate::model::Position\",\n ord.initial_price as \"initial_price: crate::model::Price\",\n ord.min_quantity as \"min_quantity: crate::model::Usd\",\n ord.max_quantity as \"max_quantity: crate::model::Usd\",\n ord.leverage as \"leverage: crate::model::Leverage\",\n ord.liquidation_price as \"liquidation_price: crate::model::Price\",\n ord.ts_secs as \"ts_secs: crate::model::Timestamp\",\n ord.settlement_time_interval_secs as \"settlement_time_interval_secs: i64\",\n ord.origin as \"origin: crate::model::cfd::Origin\",\n ord.oracle_event_id as \"oracle_event_id: crate::model::BitMexPriceEventId\",\n state.quantity_usd as \"quantity_usd: crate::model::Usd\",\n state.state\n\n from ord\n inner join state on state.order_id = ord.order_id\n\n where ord.oracle_event_id = $1\n ", "query": "\n with ord as (\n select\n id as order_id,\n uuid,\n trading_pair,\n position,\n initial_price,\n min_quantity,\n max_quantity,\n leverage,\n liquidation_price,\n creation_timestamp_seconds as ts_secs,\n settlement_time_interval_seconds as settlement_time_interval_secs,\n origin,\n oracle_event_id,\n fee_rate\n from orders\n ),\n\n cfd as (\n select\n ord.order_id,\n id as cfd_id,\n quantity_usd\n from cfds\n inner join ord on ord.order_id = cfds.order_id\n ),\n\n state as (\n select\n id as state_id,\n cfd.order_id,\n cfd.quantity_usd,\n state\n from cfd_states\n inner join cfd on cfd.cfd_id = cfd_states.cfd_id\n where id in (\n select\n max(id) as id\n from cfd_states\n group by (cfd_id)\n )\n )\n\n select\n ord.uuid as \"uuid: crate::model::cfd::OrderId\",\n ord.trading_pair as \"trading_pair: crate::model::TradingPair\",\n ord.position as \"position: crate::model::Position\",\n ord.initial_price as \"initial_price: crate::model::Price\",\n ord.min_quantity as \"min_quantity: crate::model::Usd\",\n ord.max_quantity as \"max_quantity: crate::model::Usd\",\n ord.leverage as \"leverage: crate::model::Leverage\",\n ord.liquidation_price as \"liquidation_price: crate::model::Price\",\n ord.ts_secs as \"ts_secs: crate::model::Timestamp\",\n ord.settlement_time_interval_secs as \"settlement_time_interval_secs: i64\",\n ord.origin as \"origin: crate::model::cfd::Origin\",\n ord.oracle_event_id as \"oracle_event_id: crate::model::BitMexPriceEventId\",\n ord.fee_rate as \"fee_rate: u32\",\n state.quantity_usd as \"quantity_usd: crate::model::Usd\",\n state.state\n\n from ord\n inner join state on state.order_id = ord.order_id\n\n where ord.uuid = $1\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -377,13 +395,18 @@
"type_info": "Text" "type_info": "Text"
}, },
{ {
"name": "quantity_usd: crate::model::Usd", "name": "fee_rate: u32",
"ordinal": 12, "ordinal": 12,
"type_info": "Null"
},
{
"name": "quantity_usd: crate::model::Usd",
"ordinal": 13,
"type_info": "Text" "type_info": "Text"
}, },
{ {
"name": "state", "name": "state",
"ordinal": 13, "ordinal": 14,
"type_info": "Text" "type_info": "Text"
} }
], ],
@ -404,6 +427,7 @@
false, false,
false, false,
false, false,
false,
false false
] ]
} }

26
daemon/src/db.rs

@ -25,8 +25,9 @@ pub async fn insert_order(order: &Order, conn: &mut PoolConnection<Sqlite>) -> a
creation_timestamp_seconds, creation_timestamp_seconds,
settlement_time_interval_seconds, settlement_time_interval_seconds,
origin, origin,
oracle_event_id oracle_event_id,
) values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)"#, fee_rate
) values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)"#,
) )
.bind(&order.id) .bind(&order.id)
.bind(&order.trading_pair) .bind(&order.trading_pair)
@ -40,6 +41,7 @@ pub async fn insert_order(order: &Order, conn: &mut PoolConnection<Sqlite>) -> a
.bind(&order.settlement_interval.whole_seconds()) .bind(&order.settlement_interval.whole_seconds())
.bind(&order.origin) .bind(&order.origin)
.bind(&order.oracle_event_id) .bind(&order.oracle_event_id)
.bind(&order.fee_rate)
.execute(conn) .execute(conn)
.await?; .await?;
@ -68,7 +70,8 @@ pub async fn load_order_by_id(
creation_timestamp_seconds as "ts_secs: crate::model::Timestamp", creation_timestamp_seconds as "ts_secs: crate::model::Timestamp",
settlement_time_interval_seconds as "settlement_time_interval_secs: i64", settlement_time_interval_seconds as "settlement_time_interval_secs: i64",
origin as "origin: crate::model::cfd::Origin", origin as "origin: crate::model::cfd::Origin",
oracle_event_id as "oracle_event_id: crate::model::BitMexPriceEventId" oracle_event_id as "oracle_event_id: crate::model::BitMexPriceEventId",
fee_rate as "fee_rate: u32"
from from
orders orders
where where
@ -92,6 +95,7 @@ pub async fn load_order_by_id(
settlement_interval: Duration::new(row.settlement_time_interval_secs, 0), settlement_interval: Duration::new(row.settlement_time_interval_secs, 0),
origin: row.origin, origin: row.origin,
oracle_event_id: row.oracle_event_id, oracle_event_id: row.oracle_event_id,
fee_rate: row.fee_rate,
}) })
} }
@ -241,7 +245,8 @@ pub async fn load_cfd_by_order_id(
creation_timestamp_seconds as ts_secs, creation_timestamp_seconds as ts_secs,
settlement_time_interval_seconds as settlement_time_interval_secs, settlement_time_interval_seconds as settlement_time_interval_secs,
origin, origin,
oracle_event_id oracle_event_id,
fee_rate
from orders from orders
), ),
@ -283,6 +288,7 @@ pub async fn load_cfd_by_order_id(
ord.settlement_time_interval_secs as "settlement_time_interval_secs: i64", ord.settlement_time_interval_secs as "settlement_time_interval_secs: i64",
ord.origin as "origin: crate::model::cfd::Origin", ord.origin as "origin: crate::model::cfd::Origin",
ord.oracle_event_id as "oracle_event_id: crate::model::BitMexPriceEventId", ord.oracle_event_id as "oracle_event_id: crate::model::BitMexPriceEventId",
ord.fee_rate as "fee_rate: u32",
state.quantity_usd as "quantity_usd: crate::model::Usd", state.quantity_usd as "quantity_usd: crate::model::Usd",
state.state state.state
@ -309,6 +315,7 @@ pub async fn load_cfd_by_order_id(
settlement_interval: Duration::new(row.settlement_time_interval_secs, 0), settlement_interval: Duration::new(row.settlement_time_interval_secs, 0),
origin: row.origin, origin: row.origin,
oracle_event_id: row.oracle_event_id, oracle_event_id: row.oracle_event_id,
fee_rate: row.fee_rate,
}; };
// TODO: // TODO:
@ -339,7 +346,8 @@ pub async fn load_all_cfds(conn: &mut PoolConnection<Sqlite>) -> anyhow::Result<
creation_timestamp_seconds as ts_secs, creation_timestamp_seconds as ts_secs,
settlement_time_interval_seconds as settlement_time_interval_secs, settlement_time_interval_seconds as settlement_time_interval_secs,
origin, origin,
oracle_event_id oracle_event_id,
fee_rate
from orders from orders
), ),
@ -381,6 +389,7 @@ pub async fn load_all_cfds(conn: &mut PoolConnection<Sqlite>) -> anyhow::Result<
ord.settlement_time_interval_secs as "settlement_time_interval_secs: i64", ord.settlement_time_interval_secs as "settlement_time_interval_secs: i64",
ord.origin as "origin: crate::model::cfd::Origin", ord.origin as "origin: crate::model::cfd::Origin",
ord.oracle_event_id as "oracle_event_id: crate::model::BitMexPriceEventId", ord.oracle_event_id as "oracle_event_id: crate::model::BitMexPriceEventId",
ord.fee_rate as "fee_rate: u32",
state.quantity_usd as "quantity_usd: crate::model::Usd", state.quantity_usd as "quantity_usd: crate::model::Usd",
state.state state.state
@ -407,6 +416,7 @@ pub async fn load_all_cfds(conn: &mut PoolConnection<Sqlite>) -> anyhow::Result<
settlement_interval: Duration::new(row.settlement_time_interval_secs, 0), settlement_interval: Duration::new(row.settlement_time_interval_secs, 0),
origin: row.origin, origin: row.origin,
oracle_event_id: row.oracle_event_id, oracle_event_id: row.oracle_event_id,
fee_rate: row.fee_rate,
}; };
Ok(Cfd { Ok(Cfd {
@ -442,7 +452,8 @@ pub async fn load_cfds_by_oracle_event_id(
creation_timestamp_seconds as ts_secs, creation_timestamp_seconds as ts_secs,
settlement_time_interval_seconds as settlement_time_interval_secs, settlement_time_interval_seconds as settlement_time_interval_secs,
origin, origin,
oracle_event_id oracle_event_id,
fee_rate
from orders from orders
), ),
@ -484,6 +495,7 @@ pub async fn load_cfds_by_oracle_event_id(
ord.settlement_time_interval_secs as "settlement_time_interval_secs: i64", ord.settlement_time_interval_secs as "settlement_time_interval_secs: i64",
ord.origin as "origin: crate::model::cfd::Origin", ord.origin as "origin: crate::model::cfd::Origin",
ord.oracle_event_id as "oracle_event_id: crate::model::BitMexPriceEventId", ord.oracle_event_id as "oracle_event_id: crate::model::BitMexPriceEventId",
ord.fee_rate as "fee_rate: u32",
state.quantity_usd as "quantity_usd: crate::model::Usd", state.quantity_usd as "quantity_usd: crate::model::Usd",
state.state state.state
@ -513,6 +525,7 @@ pub async fn load_cfds_by_oracle_event_id(
settlement_interval: Duration::new(row.settlement_time_interval_secs, 0), settlement_interval: Duration::new(row.settlement_time_interval_secs, 0),
origin: row.origin, origin: row.origin,
oracle_event_id: row.oracle_event_id, oracle_event_id: row.oracle_event_id,
fee_rate: row.fee_rate,
}; };
Ok(Cfd { Ok(Cfd {
@ -770,6 +783,7 @@ mod tests {
Origin::Theirs, Origin::Theirs,
BitMexPriceEventId::with_20_digits(OffsetDateTime::now_utc()), BitMexPriceEventId::with_20_digits(OffsetDateTime::now_utc()),
time::Duration::hours(24), time::Duration::hours(24),
1,
) )
.unwrap() .unwrap()
} }

4
daemon/src/maker_cfd.rs

@ -58,6 +58,7 @@ pub struct NewOrder {
pub price: Price, pub price: Price,
pub min_quantity: Usd, pub min_quantity: Usd,
pub max_quantity: Usd, pub max_quantity: Usd,
pub fee_rate: u32,
} }
pub struct TakerConnected { pub struct TakerConnected {
@ -739,6 +740,7 @@ where
cfd.quantity_usd, cfd.quantity_usd,
cfd.order.leverage, cfd.order.leverage,
cfd.refund_timelock_in_blocks(), cfd.refund_timelock_in_blocks(),
cfd.order.fee_rate,
), ),
Role::Maker, Role::Maker,
dlc, dlc,
@ -908,6 +910,7 @@ where
price, price,
min_quantity, min_quantity,
max_quantity, max_quantity,
fee_rate,
} = msg; } = msg;
let oracle_event_id = oracle::next_announcement_after( let oracle_event_id = oracle::next_announcement_after(
@ -921,6 +924,7 @@ where
Origin::Ours, Origin::Ours,
oracle_event_id, oracle_event_id,
self.settlement_interval, self.settlement_interval,
fee_rate,
)?; )?;
// 1. Save to DB // 1. Save to DB

4
daemon/src/model/cfd.rs

@ -123,6 +123,8 @@ pub struct Order {
/// ///
/// The maker includes this into the Order based on the Oracle announcement to be used. /// The maker includes this into the Order based on the Oracle announcement to be used.
pub oracle_event_id: BitMexPriceEventId, pub oracle_event_id: BitMexPriceEventId,
pub fee_rate: u32,
} }
impl Order { impl Order {
@ -133,6 +135,7 @@ impl Order {
origin: Origin, origin: Origin,
oracle_event_id: BitMexPriceEventId, oracle_event_id: BitMexPriceEventId,
settlement_interval: Duration, settlement_interval: Duration,
fee_rate: u32,
) -> Result<Self> { ) -> Result<Self> {
let leverage = Leverage::new(2)?; let leverage = Leverage::new(2)?;
let liquidation_price = calculate_long_liquidation_price(leverage, price); let liquidation_price = calculate_long_liquidation_price(leverage, price);
@ -150,6 +153,7 @@ impl Order {
settlement_interval, settlement_interval,
origin, origin,
oracle_event_id, oracle_event_id,
fee_rate,
}) })
} }
} }

1
daemon/src/rollover_taker.rs

@ -108,6 +108,7 @@ impl Actor {
self.cfd.quantity_usd, self.cfd.quantity_usd,
self.cfd.order.leverage, self.cfd.order.leverage,
self.cfd.refund_timelock_in_blocks(), self.cfd.refund_timelock_in_blocks(),
self.cfd.order.fee_rate,
), ),
Role::Taker, Role::Taker,
self.cfd.dlc().context("No DLC in CFD")?, self.cfd.dlc().context("No DLC in CFD")?,

2
daemon/src/routes_maker.rs

@ -91,6 +91,7 @@ pub struct CfdNewOrderRequest {
// always 1 USD // always 1 USD
pub min_quantity: Usd, pub min_quantity: Usd,
pub max_quantity: Usd, pub max_quantity: Usd,
pub fee_rate: Option<u32>,
} }
#[rocket::post("/order/sell", data = "<order>")] #[rocket::post("/order/sell", data = "<order>")]
@ -104,6 +105,7 @@ pub async fn post_sell_order(
price: order.price, price: order.price,
min_quantity: order.min_quantity, min_quantity: order.min_quantity,
max_quantity: order.max_quantity, max_quantity: order.max_quantity,
fee_rate: order.fee_rate.unwrap_or(1),
}) })
.await .await
.unwrap_or_else(|e| anyhow::bail!(e)) .unwrap_or_else(|e| anyhow::bail!(e))

16
daemon/src/setup_contract.rs

@ -33,6 +33,7 @@ pub struct SetupParams {
quantity: Usd, quantity: Usd,
leverage: Leverage, leverage: Leverage,
refund_timelock: u32, refund_timelock: u32,
fee_rate: u32,
} }
impl SetupParams { impl SetupParams {
@ -43,6 +44,7 @@ impl SetupParams {
quantity: Usd, quantity: Usd,
leverage: Leverage, leverage: Leverage,
refund_timelock: u32, refund_timelock: u32,
fee_rate: u32,
) -> Self { ) -> Self {
Self { Self {
margin, margin,
@ -51,6 +53,7 @@ impl SetupParams {
quantity, quantity,
leverage, leverage,
refund_timelock, refund_timelock,
fee_rate,
} }
} }
} }
@ -76,6 +79,7 @@ pub async fn new(
.send(wallet::BuildPartyParams { .send(wallet::BuildPartyParams {
amount: setup_params.margin, amount: setup_params.margin,
identity_pk: pk, identity_pk: pk,
fee_rate: setup_params.fee_rate,
}) })
.await .await
.context("Failed to send message to wallet actor")? .context("Failed to send message to wallet actor")?
@ -129,6 +133,7 @@ pub async fn new(
(model::cfd::Cfd::CET_TIMELOCK, setup_params.refund_timelock), (model::cfd::Cfd::CET_TIMELOCK, setup_params.refund_timelock),
payouts, payouts,
sk, sk,
setup_params.fee_rate,
) )
.context("Failed to create CFD transactions")?; .context("Failed to create CFD transactions")?;
@ -312,15 +317,23 @@ pub struct RolloverParams {
quantity: Usd, quantity: Usd,
leverage: Leverage, leverage: Leverage,
refund_timelock: u32, refund_timelock: u32,
fee_rate: u32,
} }
impl RolloverParams { impl RolloverParams {
pub fn new(price: Price, quantity: Usd, leverage: Leverage, refund_timelock: u32) -> Self { pub fn new(
price: Price,
quantity: Usd,
leverage: Leverage,
refund_timelock: u32,
fee_rate: u32,
) -> Self {
Self { Self {
price, price,
quantity, quantity,
leverage, leverage,
refund_timelock, refund_timelock,
fee_rate,
} }
} }
} }
@ -419,6 +432,7 @@ pub async fn roll_over(
), ),
payouts, payouts,
sk, sk,
rollover_params.fee_rate,
) )
.context("Failed to create new CFD transactions")?; .context("Failed to create new CFD transactions")?;

1
daemon/src/setup_maker.rs

@ -94,6 +94,7 @@ impl Actor {
cfd.quantity_usd, cfd.quantity_usd,
cfd.order.leverage, cfd.order.leverage,
cfd.refund_timelock_in_blocks(), cfd.refund_timelock_in_blocks(),
cfd.order.fee_rate,
), ),
self.build_party_params.clone_channel(), self.build_party_params.clone_channel(),
self.sign.clone_channel(), self.sign.clone_channel(),

1
daemon/src/setup_taker.rs

@ -86,6 +86,7 @@ impl Actor {
cfd.quantity_usd, cfd.quantity_usd,
cfd.order.leverage, cfd.order.leverage,
cfd.refund_timelock_in_blocks(), cfd.refund_timelock_in_blocks(),
cfd.order.fee_rate,
), ),
self.build_party_params.clone_channel(), self.build_party_params.clone_channel(),
self.sign.clone_channel(), self.sign.clone_channel(),

24
daemon/src/wallet.rs

@ -152,9 +152,14 @@ impl Actor {
BuildPartyParams { BuildPartyParams {
amount, amount,
identity_pk, identity_pk,
fee_rate,
}: BuildPartyParams, }: BuildPartyParams,
) -> Result<PartyParams> { ) -> Result<PartyParams> {
let psbt = self.wallet.build_lock_tx(amount, &mut self.used_utxos)?; let psbt = self.wallet.build_lock_tx(
amount,
&mut self.used_utxos,
FeeRate::from_sat_per_vb(fee_rate as f32),
)?;
Ok(PartyParams { Ok(PartyParams {
lock_psbt: psbt, lock_psbt: psbt,
@ -265,6 +270,7 @@ impl xtra::Actor for Actor {
pub struct BuildPartyParams { pub struct BuildPartyParams {
pub amount: Amount, pub amount: Amount,
pub identity_pk: PublicKey, pub identity_pk: PublicKey,
pub fee_rate: u32,
} }
/// Private message to trigger a sync. /// Private message to trigger a sync.
@ -325,6 +331,7 @@ trait BuildLockTx {
&mut self, &mut self,
amount: Amount, amount: Amount,
used_utxos: &mut HashSet<OutPoint>, used_utxos: &mut HashSet<OutPoint>,
fee_rate: FeeRate,
) -> Result<PartiallySignedTransaction>; ) -> Result<PartiallySignedTransaction>;
} }
@ -336,12 +343,13 @@ where
&mut self, &mut self,
amount: Amount, amount: Amount,
used_utxos: &mut HashSet<OutPoint>, used_utxos: &mut HashSet<OutPoint>,
fee_rate: FeeRate,
) -> Result<PartiallySignedTransaction> { ) -> Result<PartiallySignedTransaction> {
let mut builder = self.build_tx(); let mut builder = self.build_tx();
builder builder
.ordering(TxOrdering::Bip69Lexicographic) // TODO: I think this is pointless but we did this in maia. .ordering(TxOrdering::Bip69Lexicographic) // TODO: I think this is pointless but we did this in maia.
.fee_rate(FeeRate::from_sat_per_vb(1.0)) .fee_rate(fee_rate)
.unspendable(used_utxos.iter().copied().collect()) .unspendable(used_utxos.iter().copied().collect())
.add_2of2_multisig_recipient(amount); .add_2of2_multisig_recipient(amount);
@ -381,10 +389,18 @@ mod tests {
let mut used_utxos = HashSet::new(); let mut used_utxos = HashSet::new();
let lock_tx_1 = wallet let lock_tx_1 = wallet
.build_lock_tx(Amount::from_sat(2500), &mut used_utxos) .build_lock_tx(
Amount::from_sat(2500),
&mut used_utxos,
FeeRate::default_min_relay_fee(),
)
.unwrap(); .unwrap();
let lock_tx_2 = wallet let lock_tx_2 = wallet
.build_lock_tx(Amount::from_sat(2500), &mut used_utxos) .build_lock_tx(
Amount::from_sat(2500),
&mut used_utxos,
FeeRate::default_min_relay_fee(),
)
.unwrap(); .unwrap();
let mut utxos_in_transaction = HashSet::new(); let mut utxos_in_transaction = HashSet::new();

1
daemon/tests/harness/mod.rs

@ -403,6 +403,7 @@ pub fn dummy_new_order() -> maker_cfd::NewOrder {
price: dummy_price(), price: dummy_price(),
min_quantity: Usd::new(dec!(5)), min_quantity: Usd::new(dec!(5)),
max_quantity: Usd::new(dec!(100)), max_quantity: Usd::new(dec!(100)),
fee_rate: 1,
} }
} }

Loading…
Cancel
Save