-
Notifications
You must be signed in to change notification settings - Fork 43
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(orderbook): prevent stuck replace order holds #1842
Conversation
This fixes a bug whereby an order could be placed on hold without that hold ever being removed. When replacing an order, we place the existing order on hold until the replacement order has finished matching, and only then do we remove the original order. However, the order was being placed on hold before the checks for sufficient balance to fill this order, and in case those checks failed the remainder of the `placeOrder` routine would be skipped including the part that removes the original order. In such a case, the original order would be put on hold indefinitely. Instead, we place the existing order on hold immediately before we begin matching and after any checks on the validity of the new order are passed. If the checks fail, then the new order is rejected and the order it was intended to replace remains in the order book without a hold, allowing it to be replaced or removed again by a future call. Fixes #1835.
Do you have a way to test this? Otherwise I have a node that regularly gets itself into such a situation and can run this branch there @raladev |
The way to test (and reproduce the issue on master) would be to place an order that replaces another order but exceeds your channel capacity, more than your L2 balance in other words. The replaced order would become permanently on hold. On this branch there should be no hold. |
Ok, but why would xud allow me to place an order exceeding my L2 balance in the first place? EDIT: got it
This PR should fix it. |
This fixes a bug whereby an order could be placed on hold without that hold ever being removed. When replacing an order, we place the existing order on hold until the replacement order has finished matching, and only then do we remove the original order. However, the order was being placed on hold before the checks for sufficient balance to fill this order, and in case those checks failed the remainder of the `placeOrder` routine would be skipped including the part that removes the original order. In such a case, the original order would be put on hold indefinitely. Instead, we place the existing order on hold immediately before we begin matching and after any checks on the validity of the new order are passed. If the checks fail, then the new order is rejected and the order it was intended to replace remains in the order book without a hold, allowing it to be replaced or removed again by a future call. Fixes #1835. added currency check to walletwithdraw
This fixes a bug whereby an order could be placed on hold without that hold ever being removed.
When replacing an order, we place the existing order on hold until the replacement order has finished matching, and only then do we remove the original order. However, the order was being placed on hold before the checks for sufficient balance to fill this order, and in case those checks failed the remainder of the
placeOrder
routine would be skipped including the part that removes the original order. In such a case, the original order would be put on hold indefinitely.Instead, we place the existing order on hold immediately before we begin matching and after any checks on the validity of the new order are passed. If the checks fail, then the new order is rejected and the order it was intended to replace remains in the order book without a hold, allowing it to be replaced or removed again by a future call.
Fixes #1835.