Commit Graph

653 Commits

Author SHA1 Message Date
rishflab
8675d88727 Don't wait for tx lock confirmed after broadcast
Bob does not care whether tx lock is confirmed. That is alice's problem.
This wait was introduced to remedy a bug in status_of_script() which was
 failing when called on a transaction with no confirmations.
2021-03-17 15:34:29 +11:00
rishflab
f5e6ba18e0 Use different address for redeem and punish
Having the same address could potentially cause issues when subscribing
to transactions by script
2021-03-17 15:26:44 +11:00
Thomas Eizinger
273cf15631
Introduce Watchable abstraction for Bitcoin wallet
We have a repeated pattern where we construct one of our
Tx{Cancel,Redeem,Punish,Refund,Lock} transactions and wait until
the status of this transaction changes. We can make this more
ergonomic by creating and implementing a `Watchable` trait that
gives access to the TxId and relevant script for this transaction.
This allows us to remove a parameter from the `watch_until_status`
function.

Additionally, there is a 2nd pattern: "Completing" one of these
transaction and waiting until they are confirmed with the configured
number of blocks for finality. We can make this more ergonomic by
returning a future from `broadcast` that callers can await in case
they want to wait for the broadcasted transaction to reach finality.
2021-03-16 19:24:32 +11:00
Thomas Eizinger
a0830f099f
Pass relevant execution params into wallet instead of via functions
The execution params don't change throughout the lifetime of the
program. They can be set in the wallet at the very beginning.
This simplifies the interface of the wallet functions.
2021-03-16 19:24:31 +11:00
Thomas Eizinger
84ea092a1b
Remove unnecessary state variables by constructing TXs on demand 2021-03-16 19:24:31 +11:00
rishflab
e5c0158597
Greatly reduce load onto the Electrum backend
We achieve our optimizations in three ways:

1. Batching calls instead of making them individually.

To get access to the batch calls, we replace all our
calls to the HTTP interface with RPC calls.

2. Never directly make network calls based on function
calls on the wallet.

Instead, inquiring about the status of a script always
just returns information based on local data. With every
call, we check when we last refreshed the local data and
do so if the data is considered to be too old. This
interval is configurable.

3. Use electrum's notification feature to get updated
with the latest blockheight.

Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
Co-authored-by: Rishab Sharma <rishflab@hotmail.com>
2021-03-16 19:24:31 +11:00
Thomas Eizinger
e17cbadccb
Don't add signatures to transaction unless necessary
In order to compute the cancel TxID, we don't need to add the
signatures.
2021-03-16 19:22:47 +11:00
Thomas Eizinger
6beb732e35
Eliminate build_bitcoin_punish_transaction
We reduce indirection by constructing TxPunish directly based off
`State3` and make the type itself more powerful by moving the logic
of completing it with a signature onto it.
2021-03-16 19:21:15 +11:00
Thomas Eizinger
dd6c66a594
Move completing of Bitcoin redeem tx onto RedeemTx
This allows us to have access to RedeemTx from within the scope
of the state transition which we are going to need for more
efficient watching of what happens to this TX on the blockchain.
2021-03-16 17:11:31 +11:00
rishflab
21429f24b2
Inline wait_for_locked_bitcoin() that is only called once
Reduce indirection.
2021-03-16 17:11:31 +11:00
rishflab
6a3e4802f1
Remove redundant reference 2021-03-16 17:11:30 +11:00
rishflab
458a8d594a
Rename fn param to correctly reflect underlying type 2021-03-16 17:11:30 +11:00
rishflab
752e5be8f3
Cleanup test logging 2021-03-16 17:11:29 +11:00
Thomas Eizinger
2704245ed5
Fix monero refresh interval
The comparison should be the MAXIMUM of the two values, not the
minimum, otherwise we always refresh at an interval of 1 second.
2021-03-16 17:10:34 +11:00
bors[bot]
a02389f8bd
Merge #314
314: Remove CLI config file in favour of parameters r=thomaseizinger a=da-kami

Fixes #282 

The CLI has sensible default values for all parameters,
thus a config file is not really an advantage but just
keeps getting in our way, so re remove it.

Trait impls on `Data` needed for structopt, see https://docs.rs/structopt/0.3.21/structopt/#default-values

Co-authored-by: Daniel Karzel <daniel@comit.network>
2021-03-15 05:37:50 +00:00
bors[bot]
8505d76561
Merge #311
311: Add asb to release including ARM build r=da-kami a=da-kami

https://github.com/da-kami/xmr-btc-swap/releases/tag/0.3-test

The asb ARM build does neither run tests on CI not smoke test for the binary upon release because the there is no standard runner for ARM. One can configure a self-hosted one but I think that might be an overkill: https://docs.github.com/en/actions/hosting-your-own-runners/adding-self-hosted-runners

I did download the produced ARM tar, unpack and test on the raspi, it works :)

Concerning openssl depdency see:

https://github.com/da-kami/xmr-btc-swap/runs/2093523365?check_suite_focus=true
https://www.reddit.com/r/rust/comments/axaq9b/opensslsys_error_when_crosscompiling_for/


Co-authored-by: Daniel Karzel <daniel@comit.network>
2021-03-15 05:26:49 +00:00
Daniel Karzel
0091b6cdaf Remove CLI config file in favour of parameters
The CLI has sensible default values for all parameters,
thus a config file is not really an advantage but just
keeps getting in our way, so re remove it.
2021-03-15 15:41:46 +11:00
Daniel Karzel
442c377490 Remove openssl dependency
Upgrade tokio-tungstenite to 0.14 and use feature flag rustls-tls
to get rid of the openssl dependency.
2021-03-15 14:36:05 +11:00
Daniel Karzel
58c33f8468 Add asb to release including ARM build 2021-03-15 09:58:18 +11:00
rishflab
7cb198aea1 Remove pointless todo
The container is defined in the tests module indicating it is only
suitable for these tests
2021-03-12 12:52:23 +11:00
rishflab
9f534996ee Remove unused capability to configure bitcoind docker version tag
We only use one version of this container
2021-03-12 12:50:42 +11:00
rishflab
7b1d901ea0 Fix incorrectly formatted tag 2021-03-12 11:01:52 +11:00
bors[bot]
009597ac49
Merge #306
306: Fix logging and retrying of Monero transaction watching r=thomaseizinger a=thomaseizinger

Hopefully, this should also reduce the load because I am not asking the node every second.

Related: https://github.com/comit-network/xmr-btc-swap/issues/202

Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
Co-authored-by: Daniel Karzel <daniel@comit.network>
2021-03-11 07:50:54 +00:00
Daniel Karzel
be52892e65
Monero wallet should not know about all execution params
Instead of passing all execution params in we only make the monero_avg_block_time known to the monero wallet.
2021-03-11 17:43:01 +11:00
Thomas Eizinger
82738b111e
Refactor monero::Wallet::watch_for_transfer to not use backoff
Instead, we use a regular loop and extract everything into a function
that can be independently tested.
`backoff` would be useful to retry the actual call to the node.
2021-03-11 17:42:54 +11:00
Thomas Eizinger
7e0c44ad1d
Add avg monero block time to execution params 2021-03-11 15:01:55 +11:00
Thomas Eizinger
d560e69203
Make durations more readable by using extension methods from time 2021-03-11 14:59:57 +11:00
Thomas Eizinger
ecff1d1cbe
Remove indirection of constants
We never use these constants anywhere else, inline them.
2021-03-11 14:57:47 +11:00
Thomas Eizinger
bac0f11898
Disable backoffs max_elapsed_time functionality
This config setting makes backoff stop retrying if we didn't get an
error within this timeframe.
For us, this results in backoff not actually doing anything.

The connection to kraken is very long-running. It might be active
for hours without failing. However, the default value for
`max_elapsed_time` is set to 15 minutes. As such, once the connection
fails any time after that, backoff doesn't actually retry the operation
but just gives up.

Fixes #303.
2021-03-11 13:33:46 +11:00
Thomas Eizinger
9ad2160c69
Refactor the kraken module to automatically re-connect on errors
In order to be able to re-connect on certain errors, we model
connection errors separately from parsing errors. We also change
the API of the whole module to no longer forward all errors to
the subscribers but instead, only update the subscribers with
either a latest rate or a permanent failure in case we exhausted
all our options to re-connect the websocket.

To model all of this properly, we introduce to sub-modules so that
each submodule can have their own `Error` type.

Resolves #297.
2021-03-09 17:37:37 +11:00
Thomas Eizinger
c560b3b21a
Introduce RateUpdate type alias to reduce duplication 2021-03-09 15:39:08 +11:00
Thomas Eizinger
fd5b38739a
Remove constant in favor of inlining string
This removes an import and simplifies the `connect_async` call.
2021-03-09 15:39:07 +11:00
Thomas Eizinger
142e5e2d3a
Use tracing macros by fully-qualifying them 2021-03-09 15:39:03 +11:00
bors[bot]
cc131ecf60
Merge #293
293: Some friday evening goodies r=thomaseizinger a=thomaseizinger



Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
2021-03-08 22:53:58 +00:00
Thomas Eizinger
08923a14f3
Simplify GET request for block tip height 2021-03-05 17:06:17 +11:00
Thomas Eizinger
e9d7d9299c
Simplify the GET request to the tx status URL 2021-03-05 16:56:48 +11:00
Thomas Eizinger
418ad7089d
Make tests more readable by following arrange-act-assert 2021-03-05 16:56:48 +11:00
Thomas Eizinger
c2329b19a2
Tell the user more about the monero lock transaction
First, we tell the user that we are now waiting for Alice to lock
the monero. Additionally, we tell them once we received the
transfer proof which will lead directly into the
"waiting for confirmations" function.
2021-03-05 16:56:47 +11:00
Thomas Eizinger
13c4d29d40
Tell the user immediately how many confirmations we expect
Without this, the user doesn't see a message before the first
confirmation.
2021-03-05 16:56:47 +11:00
Thomas Eizinger
4883e23dd8
Tell the user for how many confirmations we are waiting
Without this, the user has no idea for how long the program is
waiting.
2021-03-05 16:56:47 +11:00
Thomas Eizinger
5d4cf40831
Fix comparison of Monero confirmations 2021-03-05 16:56:46 +11:00
rishflab
f92a8ac300 Improve CLI help comments and "type" hints
The type hints are generated from the field names. This has the
unfortunate consequence of the config field becoming file_path which
does not really make sense people working on the codebase.
2021-03-05 16:46:17 +11:00
Daniel Karzel
196557b377 Rename binary to swap 2021-03-05 16:14:21 +11:00
Daniel Karzel
f8b61e2e0e Make monero daemon host configurable 2021-03-05 16:10:45 +11:00
Daniel Karzel
f091402c7a Remove parameter duplication by introducing structs 2021-03-05 16:08:54 +11:00
Thomas Eizinger
c826a28911
Add context if we fail to compute extended private key 2021-03-05 15:49:16 +11:00
Thomas Eizinger
1aa6d177bf
Improve error messages when determining BTC amount to be swapped 2021-03-05 15:49:16 +11:00
Thomas Eizinger
4138039ea0
Make sure all error messages start with an uppercase letter
These might potentially be shown to a user, let's make them all
consistent.
2021-03-05 15:49:15 +11:00
Thomas Eizinger
816e8b9b96
Add more context to fallible functions inside bitcoin::Wallet 2021-03-05 15:49:15 +11:00
Thomas Eizinger
5c24a46298
Improve error message if stuff fails directly in main 2021-03-05 15:49:15 +11:00