bisq-network / bisq2

GNU Affero General Public License v3.0
173 stars 64 forks source link

Fix concept flaw with lack of buyer's option to set or reject the price #1949

Closed HenrikJannsen closed 6 months ago

HenrikJannsen commented 6 months ago

Intentionally we did not allow the buyer to define the trade price. The reason for that is that the seller has to invest in reputation, has to pay for miner fees, usually has small trades and should be the helpful guide in the trade process - thus investing more time as it would be the case in Bisq 1. The extra price premium in the Matrix channels seemed to be 5-20%. As Bisq Easy is designed for newbies in the role of Buyers we did not want to force the user to learn and understand that context (they might not know even what miner fees are). If we would allow the buyer to set the price they would likely set a close to market price or even below and for sellers that would not be attractive to take, thus leading to unsatisfied peers on both sides.

We overlooked a conceptual problem in the current trade protocol: Once a seller as taker has taken a offer from a buyer ,the buyer has no option to reject the take-offer attempts as soon the taker has sent the payment data. If rejecting after that it would be considered a break of contract and could lead to a ban of the buyer. If the buyer would reject before getting the sellers data it would be ok, but the UI does not support that well and it would be anyway a too narrow frame for options.

I see 2 ways how we can fix that:

  1. We add an acceptance stage to the trade protocol. Before the real protocol starts and data gets exchanged there is an explicit "Accept taker-offer intent" screen and only after the buyer has accepted the price of the seller the trade starts. This would also give opportunity to educate the buyer about the context of a potentially higher price premium.

  2. We allow to set the price for the buyer but provide sufficiently good UX to avoid the above mentioned problems. This could be done for instance in recommended price ranges for the amount the user wants to buy. E.g. small amounts justify a higher premium. Other factors like payment methods or currencies might be a factor as well. The user could then accept the suggested price (could be phrased as: "a price of xxx has high probability to find a seller". If the user change the suggested price then they get a popup with the context. This option would also bring the benefit that sellers can be more sure when taking an offer that it will succeed and can get a better picture of the potential profits being made. It also allows for better filtering the offerbook.

I think the 2nd option might be the better.

Are the other solutions how to deal with it?

MwithM commented 6 months ago

I don't understand why a seller takes an offer without a price but sends payment data without something as important as price very clear. Seems like forcing buyer to trade.

I prefer to have a price before taking the offer, the doubts about having frustrated buyers because they don't understand why they need to pay such a premium will be reduced gradually, with better UX and seller's competition.

suddenwhipvapor commented 6 months ago

Option 2 is along the lines of what I was thinking would have been a good approach. "If offer price is too low, warn potential buyer through a popup or red text warning below price field that his offer is likely to be ignored"

Plus, there are some controls that can be added other than amount itself: current mempool rate, minimum reputation set by maker, and if collected stats were a thing, which is not, also "average markup for completed similar trades"

HenrikJannsen commented 6 months ago

Actually for the trade wizard (at the Getting started page) we use the price of the best matching offer. If there is any matching offer we could use that information as well when suggesting the buyer a price or even we do not require a match (e.g. same payment methods) but just take the best price from all the sell offers in that market as one pointer (e.g. best seller offer for EUR is currently 8% over market price...).

But with any solution we have to take care to consider the target group, the newbie and not overload them with information and force them to make decisions which might be hard for him to make without sufficient bitcoin and trading knowledge.

suddenwhipvapor commented 6 months ago

A newbie should probably be handled with a "trust me bro" approach, because he is not able to size the variables himself, so every control factor would be computed in the background, transparently.... yet probably mirroring the best current offer is just easier ;-) Then he can go search for more information himself, or ask support, if he wishes to learn more.

cbeams commented 6 months ago

Option 2 sounds best to me as well. Reminds me of the wallet UX that's evolved around choosing a fee rate when sending bitcoin. Use a smart default, inform the user what's going on, and allow them to change the value if they see fit. Easier said than done of course, but it seems better to present the user with the reality of price premiums up front than to slide it in late in the game. Doing it earlier adds friction to the process of creating an offer, but I'd argue that doing it later is worse because it creates not only friction but also emotional dissonance and stress. The dissonance arises when the user is initially excited to see that their offer has been taken and is then confused and "sticker shocked" by a price premium they didn't anticipate and don't yet really understand. It's a buzzkill. The stress arises when they realize that they (a) have the power to cancel the trade if they don't like the premium but will (b) be disappointing their seller and wasting their time if they do so. Now they're damned if they do, damned if they don't. I'd rather take the added friction up front to educate the user and give them a choice in the matter when they don't have the added complexity of a counterparty already being involved.

HenrikJannsen commented 6 months ago

@axpoems What is your suggestion about that issue?

axpoems commented 6 months ago

@axpoems What is your suggestion about that issue?

I agree with the points discussed here that this is what adds more value to buyer-as-maker. Otherwise, the buyer can just take an offer from a seller-as-maker with the price already set, which will give more certainty.

Another important factor to take into account when "accepting an offer" from a seller is reputation. Since we have that covered with the setting, I see then no need for the extra step before accepting taking an offer, as the buyer is well-protected at this point.

Good inputs as well for heuristics to suggest a good %. I will refine these details on the PR.

axpoems commented 6 months ago

These are the mock-ups for price step when buyer as maker:

image

image

image

As recommendation (initial pin position) would be the avg or mean of that market. If not enough offers, then fallback to another market which has more offers. Otherwise it just makes range suggestion.

The sliding bar is implicitly a gauge but the transitions only happen when you move. There will be red, yellow, green with the appropriate ranges.

I was considering that this change could also be applied to the seller as maker as well. Any thoughts on this?

suddenwhipvapor commented 6 months ago

There is something that doesn't feel right with me about the slider bar changing colour while the cursor stays the same, but I am not sure what would be better, maybe changing the cursor together with the bar, or making the slider static and change the colour of the number instead, or adding a sad/neutral/happy smiley as I've seen in some donation forms around the web.

I suppose the text in the popup is temporary, I would make it so:

Why should I pay over spot price?

The seller incurs extra costs in Bisq Easy:
 - building reputation usually means burning or locking BSQ
 - mining fees can be expensive depending on mempool status
 - guiding someone who has no previous experience with Bitcoin will require more time than the usual trade in Bisq1
HenrikJannsen commented 6 months ago

I also have the feeling that using the color in the slider feels not right. I think its overloading too much the standard component with a specific information which is not intuitively clear. Maybe the text change is enough or we use a color in side the text? Or some adequate icon?

For the text: @suddenwhipvapor We have to keep in mind our target users are the newbies and many of the terms you suggest would be confusing to them. I find the more simple language of @axpoems better suited.

suddenwhipvapor commented 6 months ago

Makes sense, I could tone it down some:

Why should I pay a higher price for btc?

The seller incurs several extra costs:
 - building reputation usually means spending money
 - sending btc to your address implies transaction costs
 - tutoring a new btc user requires investing seller's time

I was trying to make the popup contents shorter, as people nowadays prefer to deal with the least words possible :-)