Skip to content
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

Adjust API 'editoffer' to PR 5651 (include extraData field when editing offer) #5666

Merged
merged 65 commits into from
Aug 30, 2021
Merged
Show file tree
Hide file tree
Changes from 61 commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
81da6fb
Refactor EditOfferDataModel for new editoffer api method
ghubstan Jun 12, 2021
d9dd718
Fix comment
ghubstan Jun 12, 2021
1daf471
Add OfferInfo field isActivated, rpc EditOffer to proto
ghubstan Jun 13, 2021
2b8b53b
Add server/core editOffer, adjust getMyOffer(s) impls
ghubstan Jun 13, 2021
9231e48
Refactor GrpcClient: request builders moved bisq.cli.request pkg
ghubstan Jun 13, 2021
d2939cc
Add new EditOfferOptionParser and test
ghubstan Jun 13, 2021
2344285
Add editoffer method help
ghubstan Jun 13, 2021
be249c5
Add editoffer to CLI
ghubstan Jun 13, 2021
929b28c
Add editoffer api tests & minor apitest refactoring
ghubstan Jun 13, 2021
571568a
Remove chase quickpay acct test
ghubstan Jun 13, 2021
9a5e2d0
Remove unused import
ghubstan Jun 13, 2021
05f3985
Fix problems found in codacy check
ghubstan Jun 13, 2021
54efad0
Fix codacy issue
ghubstan Jun 13, 2021
21ac46a
Fix log arg spec bug
ghubstan Jun 13, 2021
32688a7
Add bool isMyOffer to OfferInfo proto
ghubstan Jun 15, 2021
738d2f7
Fix editoffer validation bugs, tidy up CoreOffersService
ghubstan Jun 15, 2021
e2a205a
Show enable/trigger-price cols for 'getmyoffer'
ghubstan Jun 15, 2021
4da64b9
Improve 'editoffer' opt parsing, fix test pkg name
ghubstan Jun 15, 2021
063b52e
Add editoffer test case, suppress annoying warnings
ghubstan Jun 15, 2021
e5b5a06
Remove unused field
ghubstan Jun 15, 2021
bc1576e
Throw exception is edit altcoin offer is attempted
ghubstan Jun 15, 2021
a3ea4ec
Avoid duplicate test run
ghubstan Jun 15, 2021
3d38a85
Make codacy just a bit happier
ghubstan Jun 15, 2021
1a56a51
Force codacy check after codacy config change
ghubstan Jun 17, 2021
0e9c665
Include isMyOffer flag in API's trade/offer proto wrappers
ghubstan Jun 18, 2021
a603044
Pass isMyOffer flag to trade/offer proto wrappers from core services
ghubstan Jun 18, 2021
e32e0d1
Add altcoin (bsq) offer editing validation check
ghubstan Jun 18, 2021
b74f084
Optionally show ENABLED column in CLI's getoffer(bsq) output
ghubstan Jun 18, 2021
7880a84
Add BSQ offer editing tests to EditOfferTest
ghubstan Jun 18, 2021
ab2edac
Merge branch 'master' into 02-refactor-for-api-editoffer-method
ghubstan Jun 19, 2021
0a3e011
Merge branch '02-refactor-for-api-editoffer-method' into 03-api-edito…
ghubstan Jun 19, 2021
8115866
Merge branch '03-api-editoffer-method' into 04-edit-bsq-offer
ghubstan Jun 19, 2021
acbf1e4
Force rebuild after github action ECONNRESET
ghubstan Jun 19, 2021
9703b87
Document api 'editoffer' usage
ghubstan Jun 19, 2021
05f4f4d
Fix header
ghubstan Jun 19, 2021
06efcdf
Delete tmp main() method
ghubstan Jul 11, 2021
eb62f93
Rename and move private function
ghubstan Jul 12, 2021
1992bcb
Do not duplicate Price.parse on CLI side for only one use case
ghubstan Jul 12, 2021
622f7e9
Remove old TODO because relevant refactoring was approved
ghubstan Jul 12, 2021
a4278a4
Fix typo 'enabled' -> 'enable'
ghubstan Jul 13, 2021
649c98a
Always use Locale.US in CLI DecimalFormats
ghubstan Jul 15, 2021
b8379e2
Merge branch 'master' into 05-update-api-beta-test-guide
ghubstan Jul 30, 2021
b4ee6db
Do not start test harness deamons in dbg mode by default
ghubstan Jul 30, 2021
95bbb41
Add missing trigger-price param
ghubstan Jul 30, 2021
add6536
Fix peer add(offer) & remove(offer) event order problem
ghubstan Jul 30, 2021
094bc52
Revert "Fix peer add(offer) & remove(offer) event order problem"
ghubstan Aug 2, 2021
3693728
Merge branch 'master' into 05-update-api-beta-test-guide
ghubstan Aug 4, 2021
6e2400f
Ensure UI OfferBook items are correctly added and removed
ghubstan Aug 7, 2021
d3508d2
Revert logback debug config changes
ghubstan Aug 7, 2021
1a7ad0b
Merge branch 'master' into 06-safe-offerbook-add-remove-events
ghubstan Aug 7, 2021
713867b
Remove comment (question answered)
ghubstan Aug 11, 2021
6a4aced
Handle API's edit+disable offer use case in UI.
ghubstan Aug 13, 2021
71a61c6
Display Enabled=PENDING in CLI 'createoffer' output
ghubstan Aug 14, 2021
1c096d0
Merge branch 'master' into 08-handle-extradata-in-editoffer
ghubstan Aug 16, 2021
d709338
Refactor 2 predicates as single predicate
ghubstan Aug 16, 2021
59c0313
Fix long method name
ghubstan Aug 16, 2021
524a586
Merge branch '06-safe-offerbook-add-remove-events' into 07-show-new-o…
ghubstan Aug 16, 2021
859a5ab
Merge branch '07-show-new-offer-with-pending-status' into 08-handle-e…
ghubstan Aug 16, 2021
fb4e00f
Fix OfferBookService bug causing extra check in OfferBook.onRemoved
ghubstan Aug 18, 2021
fdc78b2
Remove unused methods
ghubstan Aug 18, 2021
b93f6ea
Remove sequence-number checks from OfferBook
ghubstan Aug 20, 2021
59192e9
Do not filter on paylaod hash when deleting duplicate list items
ghubstan Aug 22, 2021
4889da6
Remove redundant list.size check
ghubstan Aug 25, 2021
98a5b17
Add missing detail to comment
ghubstan Aug 25, 2021
84036bd
Add TODOs (delete debug statement)
ghubstan Aug 25, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 112 additions & 2 deletions apitest/docs/api-beta-test-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -408,8 +408,118 @@ The offer will be removed from other Bisq users' offer views, and paid transacti

### Editing an Existing Offer

Editing existing offers is not yet supported. You can cancel and re-create an offer, but paid transaction fees
for the canceled offer will be forfeited.
Offers you create can be edited in various ways:

- Disable or re-enable an offer.
- Change an offer's price model and disable (or re-enable) it.
- Change a market price margin based offer to a fixed price offer.
- Change a market price margin based offer's price margin.
- Change, set, or remove a trigger price on a market price margin based offer.
- Change a market price margin based offer's price margin and trigger price.
- Change a market price margin based offer's price margin and remove its trigger price.
- Change a fixed price offer to a market price margin based offer.
- Change a fixed price offer's fixed price.

_Note: the API does not support editing an offer's payment account._

The subsections below contain examples related to specific use cases.

#### Enable and Disable Offer

Existing offers you create can be disabled (removed from offer book) and re-enabled (re-published to offer book).

To disable an offer:
```
./bisq-cli --password=xyz --port=9998 editoffer \
--offer-id=83e8b2e2-51b6-4f39-a748-3ebd29c22aea \
--enable=false
```

To enable an offer:
```
./bisq-cli --password=xyz --port=9998 editoffer \
--offer-id=83e8b2e2-51b6-4f39-a748-3ebd29c22aea \
--enable=true
```

#### Change Offer Pricing Model
The `editoffer` command can be used to change an existing market price margin based offer to a fixed price offer,
and vice-versa.

##### Change Market Price Margin Based to Fixed Price Offer
Suppose you used `createoffer` to create a market price margin based offer as follows:
```
$ ./bisq-cli --password=xyz --port=9998 createoffer \
--payment-account=f3c1ec8b-9761-458d-b13d-9039c6892413 \
--direction=SELL \
--currency-code=JPY \
--amount=0.125 \
--market-price-margin=0.5 \
--security-deposit=15.0 \
--fee-currency=BSQ
```
To change the market price margin based offer to a fixed price offer:
```
./bisq-cli --password=xyz --port=9998 editoffer \
--offer-id=83e8b2e2-51b6-4f39-a748-3ebd29c22aea \
--fixed-price=3960000.5555
```

##### Change Fixed Price Offer to Market Price Margin Based Offer
Suppose you used `createoffer` to create a fixed price offer as follows:
```
$ ./bisq-cli --password=xyz --port=9998 createoffer \
--payment-account=f3c1ec8b-9761-458d-b13d-9039c6892413 \
--direction=SELL \
--currency-code=JPY \
--amount=0.125 \
--fixed-price=3960000.0000 \
--security-deposit=15.0 \
--fee-currency=BSQ
```
To change the fixed price offer to a market price margin based offer:
```
./bisq-cli --password=xyz --port=9998 editoffer \
--offer-id=83e8b2e2-51b6-4f39-a748-3ebd29c22aea \
--market-price-margin=0.5
```
Alternatively, you can also set a trigger price on the re-published, market price margin based offer.
A trigger price on a SELL offer causes the offer to be automatically disabled when the market price
falls below the trigger price. In the `editoffer` example below, the SELL offer will be disabled when
the JPY market price falls below 3960000.0000.

```
./bisq-cli --password=xyz --port=9998 editoffer \
--offer-id=83e8b2e2-51b6-4f39-a748-3ebd29c22aea \
--market-price-margin=0.5 \
--trigger-price=3960000.0000
```
On a BUY offer, a trigger price causes the BUY offer to be automatically disabled when the market price
rises above the trigger price.

_Note: Disabled offers never automatically re-enable; they can only be manually re-enabled via
`editoffer --offer-id=<id> --enable=true`._

#### Remove Trigger Price
To remove a trigger price on a market price margin based offer, set the trigger price to 0:
```
./bisq-cli --password=xyz --port=9998 editoffer \
--offer-id=83e8b2e2-51b6-4f39-a748-3ebd29c22aea \
--trigger-price=0
```

#### Change Disabled Offer's Pricing Model and Enable It
You can use `editoffer` to simultaneously change an offer's price details and disable or re-enable it.

Suppose you have a disabled, fixed price offer, and want to change it to a market price margin based offer, set
a trigger price, and re-enable it:
```
./bisq-cli --password=xyz --port=9998 editoffer \
--offer-id=83e8b2e2-51b6-4f39-a748-3ebd29c22aea \
--market-price-margin=0.5 \
--trigger-price=3960000.0000 \
--enable=true
```

### Taking Offers

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,13 @@

package bisq.apitest.method.offer;

import bisq.core.monetary.Altcoin;

import protobuf.PaymentAccount;

import org.bitcoinj.utils.Fiat;

import java.math.BigDecimal;

import java.util.function.BiFunction;
import java.util.function.Function;

import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

Expand All @@ -37,10 +36,7 @@
import static bisq.apitest.config.BisqAppConfig.arbdaemon;
import static bisq.apitest.config.BisqAppConfig.bobdaemon;
import static bisq.apitest.config.BisqAppConfig.seednode;
import static bisq.common.util.MathUtils.roundDouble;
import static bisq.common.util.MathUtils.scaleDownByPowerOf10;
import static bisq.core.locale.CurrencyUtil.isCryptoCurrency;
import static java.math.RoundingMode.HALF_UP;
import static bisq.common.util.MathUtils.exactMultiply;



Expand All @@ -49,6 +45,10 @@
@Slf4j
public abstract class AbstractOfferTest extends MethodTest {

protected static final int ACTIVATE_OFFER = 1;
protected static final int DEACTIVATE_OFFER = 0;
protected static final long NO_TRIGGER_PRICE = 0;

@Setter
protected static boolean isLongRunningTest;

Expand All @@ -67,6 +67,35 @@ public static void setUp() {
}


// Mkt Price Margin value of offer returned from server is scaled down by 10^-2.
protected final Function<Double, Double> scaledDownMktPriceMargin = (mktPriceMargin) ->
exactMultiply(mktPriceMargin, 0.01);

// Price value of fiat offer returned from server will be scaled up by 10^4.
protected final Function<BigDecimal, Long> scaledUpFiatOfferPrice = (price) -> {
BigDecimal factor = new BigDecimal(10).pow(4);
return price.multiply(factor).longValue();
};

// Price value of altcoin offer returned from server will be scaled up by 10^8.
protected final Function<String, Long> scaledUpAltcoinOfferPrice = (altcoinPriceAsString) -> {
BigDecimal factor = new BigDecimal(10).pow(8);
BigDecimal priceAsBigDecimal = new BigDecimal(altcoinPriceAsString);
return priceAsBigDecimal.multiply(factor).longValue();
};

protected final BiFunction<Double, Double, Long> calcPriceAsLong = (base, delta) -> {
var priceAsDouble = new BigDecimal(base).add(new BigDecimal(delta)).doubleValue();
return Double.valueOf(exactMultiply(priceAsDouble, 10_000)).longValue();
};

protected final BiFunction<Double, Double, String> calcPriceAsString = (base, delta) -> {
var priceAsBigDecimal = new BigDecimal(Double.toString(base))
.add(new BigDecimal(Double.toString(delta)));
return priceAsBigDecimal.toPlainString();
};

@SuppressWarnings("ConstantConditions")
public static void createBsqPaymentAccounts() {
alicesBsqAcct = aliceClient.createCryptoCurrencyPaymentAccount("Alice's BSQ Account",
BSQ,
Expand All @@ -78,17 +107,6 @@ public static void createBsqPaymentAccounts() {
false);
}

protected double getScaledOfferPrice(double offerPrice, String currencyCode) {
int precision = isCryptoCurrency(currencyCode) ? Altcoin.SMALLEST_UNIT_EXPONENT : Fiat.SMALLEST_UNIT_EXPONENT;
return scaleDownByPowerOf10(offerPrice, precision);
}

protected final double getPercentageDifference(double price1, double price2) {
return BigDecimal.valueOf(roundDouble((1 - (price1 / price2)), 5))
.setScale(4, HALF_UP)
.doubleValue();
}

@AfterAll
public static void tearDown() {
tearDownScaffold();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ public class CancelOfferTest extends AbstractOfferTest {
0.00,
getDefaultBuyerSecurityDepositAsPercent(),
paymentAccountId,
BSQ);
BSQ,
NO_TRIGGER_PRICE);
};

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static protobuf.OfferPayload.Direction.BUY;
import static protobuf.OfferPayload.Direction.SELL;

Expand Down Expand Up @@ -70,6 +71,9 @@ public void testCreateBuy1BTCFor20KBSQOffer() {
alicesBsqAcct.getId(),
MAKER_FEE_CURRENCY_CODE);
log.info("Sell BSQ (Buy BTC) OFFER:\n{}", formatOfferTable(singletonList(newOffer), BSQ));
assertTrue(newOffer.getIsMyOffer());
assertTrue(newOffer.getIsMyPendingOffer());

String newOfferId = newOffer.getId();
assertNotEquals("", newOfferId);
assertEquals(BUY.name(), newOffer.getDirection());
Expand All @@ -86,6 +90,8 @@ public void testCreateBuy1BTCFor20KBSQOffer() {
genBtcBlockAndWaitForOfferPreparation();

newOffer = aliceClient.getMyOffer(newOfferId);
assertTrue(newOffer.getIsMyOffer());
assertFalse(newOffer.getIsMyPendingOffer());
assertEquals(newOfferId, newOffer.getId());
assertEquals(BUY.name(), newOffer.getDirection());
assertFalse(newOffer.getUseMarketBasedPrice());
Expand All @@ -112,6 +118,9 @@ public void testCreateSell1BTCFor20KBSQOffer() {
alicesBsqAcct.getId(),
MAKER_FEE_CURRENCY_CODE);
log.info("SELL 20K BSQ OFFER:\n{}", formatOfferTable(singletonList(newOffer), BSQ));
assertTrue(newOffer.getIsMyOffer());
assertTrue(newOffer.getIsMyPendingOffer());

String newOfferId = newOffer.getId();
assertNotEquals("", newOfferId);
assertEquals(SELL.name(), newOffer.getDirection());
Expand All @@ -128,6 +137,8 @@ public void testCreateSell1BTCFor20KBSQOffer() {
genBtcBlockAndWaitForOfferPreparation();

newOffer = aliceClient.getMyOffer(newOfferId);
assertTrue(newOffer.getIsMyOffer());
assertFalse(newOffer.getIsMyPendingOffer());
assertEquals(newOfferId, newOffer.getId());
assertEquals(SELL.name(), newOffer.getDirection());
assertFalse(newOffer.getUseMarketBasedPrice());
Expand All @@ -154,6 +165,9 @@ public void testCreateBuyBTCWith1To2KBSQOffer() {
alicesBsqAcct.getId(),
MAKER_FEE_CURRENCY_CODE);
log.info("BUY 1-2K BSQ OFFER:\n{}", formatOfferTable(singletonList(newOffer), BSQ));
assertTrue(newOffer.getIsMyOffer());
assertTrue(newOffer.getIsMyPendingOffer());

String newOfferId = newOffer.getId();
assertNotEquals("", newOfferId);
assertEquals(BUY.name(), newOffer.getDirection());
Expand All @@ -170,6 +184,8 @@ public void testCreateBuyBTCWith1To2KBSQOffer() {
genBtcBlockAndWaitForOfferPreparation();

newOffer = aliceClient.getMyOffer(newOfferId);
assertTrue(newOffer.getIsMyOffer());
assertFalse(newOffer.getIsMyPendingOffer());
assertEquals(newOfferId, newOffer.getId());
assertEquals(BUY.name(), newOffer.getDirection());
assertFalse(newOffer.getUseMarketBasedPrice());
Expand All @@ -196,6 +212,9 @@ public void testCreateSellBTCFor5To10KBSQOffer() {
alicesBsqAcct.getId(),
MAKER_FEE_CURRENCY_CODE);
log.info("SELL 5-10K BSQ OFFER:\n{}", formatOfferTable(singletonList(newOffer), BSQ));
assertTrue(newOffer.getIsMyOffer());
assertTrue(newOffer.getIsMyPendingOffer());

String newOfferId = newOffer.getId();
assertNotEquals("", newOfferId);
assertEquals(SELL.name(), newOffer.getDirection());
Expand All @@ -212,6 +231,8 @@ public void testCreateSellBTCFor5To10KBSQOffer() {
genBtcBlockAndWaitForOfferPreparation();

newOffer = aliceClient.getMyOffer(newOfferId);
assertTrue(newOffer.getIsMyOffer());
assertFalse(newOffer.getIsMyPendingOffer());
assertEquals(newOfferId, newOffer.getId());
assertEquals(SELL.name(), newOffer.getDirection());
assertFalse(newOffer.getUseMarketBasedPrice());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static protobuf.OfferPayload.Direction.BUY;
import static protobuf.OfferPayload.Direction.SELL;

Expand All @@ -58,6 +59,9 @@ public void testCreateAUDBTCBuyOfferUsingFixedPrice16000() {
audAccount.getId(),
MAKER_FEE_CURRENCY_CODE);
log.info("OFFER #1:\n{}", formatOfferTable(singletonList(newOffer), "AUD"));
assertTrue(newOffer.getIsMyOffer());
assertTrue(newOffer.getIsMyPendingOffer());

String newOfferId = newOffer.getId();
assertNotEquals("", newOfferId);
assertEquals(BUY.name(), newOffer.getDirection());
Expand All @@ -72,6 +76,8 @@ public void testCreateAUDBTCBuyOfferUsingFixedPrice16000() {
assertFalse(newOffer.getIsCurrencyForMakerFeeBtc());

newOffer = aliceClient.getMyOffer(newOfferId);
assertTrue(newOffer.getIsMyOffer());
assertFalse(newOffer.getIsMyPendingOffer());
assertEquals(newOfferId, newOffer.getId());
assertEquals(BUY.name(), newOffer.getDirection());
assertFalse(newOffer.getUseMarketBasedPrice());
Expand All @@ -98,6 +104,9 @@ public void testCreateUSDBTCBuyOfferUsingFixedPrice100001234() {
usdAccount.getId(),
MAKER_FEE_CURRENCY_CODE);
log.info("OFFER #2:\n{}", formatOfferTable(singletonList(newOffer), "USD"));
assertTrue(newOffer.getIsMyOffer());
assertTrue(newOffer.getIsMyPendingOffer());

String newOfferId = newOffer.getId();
assertNotEquals("", newOfferId);
assertEquals(BUY.name(), newOffer.getDirection());
Expand All @@ -112,6 +121,8 @@ public void testCreateUSDBTCBuyOfferUsingFixedPrice100001234() {
assertFalse(newOffer.getIsCurrencyForMakerFeeBtc());

newOffer = aliceClient.getMyOffer(newOfferId);
assertTrue(newOffer.getIsMyOffer());
assertFalse(newOffer.getIsMyPendingOffer());
assertEquals(newOfferId, newOffer.getId());
assertEquals(BUY.name(), newOffer.getDirection());
assertFalse(newOffer.getUseMarketBasedPrice());
Expand All @@ -138,6 +149,9 @@ public void testCreateEURBTCSellOfferUsingFixedPrice95001234() {
eurAccount.getId(),
MAKER_FEE_CURRENCY_CODE);
log.info("OFFER #3:\n{}", formatOfferTable(singletonList(newOffer), "EUR"));
assertTrue(newOffer.getIsMyOffer());
assertTrue(newOffer.getIsMyPendingOffer());

String newOfferId = newOffer.getId();
assertNotEquals("", newOfferId);
assertEquals(SELL.name(), newOffer.getDirection());
Expand All @@ -152,6 +166,8 @@ public void testCreateEURBTCSellOfferUsingFixedPrice95001234() {
assertFalse(newOffer.getIsCurrencyForMakerFeeBtc());

newOffer = aliceClient.getMyOffer(newOfferId);
assertTrue(newOffer.getIsMyOffer());
assertFalse(newOffer.getIsMyPendingOffer());
assertEquals(newOfferId, newOffer.getId());
assertEquals(SELL.name(), newOffer.getDirection());
assertFalse(newOffer.getUseMarketBasedPrice());
Expand Down
Loading