mirror of
https://github.com/Qortal/qortal.git
synced 2025-07-22 20:26:50 +00:00
Fix incorrect refunds when cancelling asset orders
Also improved asset tests in that they don't use QORA any more which takes fees/block rewards out of the picture. More test assets are issued in the genesis block to accomplish this: 1m TEST issued to Alice 1m OTHER issued to Bob 1m GOLD issued to Alice
This commit is contained in:
@@ -147,6 +147,7 @@ public class Order {
|
||||
cachedPricePair = haveAssetData.getName() + "/" + wantAssetData.getName();
|
||||
}
|
||||
|
||||
/** Returns amount of have-asset to remove from order's creator's balance on placing this order. */
|
||||
private BigDecimal calcHaveAssetCommittment() {
|
||||
BigDecimal committedCost = this.orderData.getAmount();
|
||||
|
||||
@@ -157,6 +158,17 @@ public class Order {
|
||||
return committedCost;
|
||||
}
|
||||
|
||||
/** Returns amount of remaining have-asset to refund to order's creator's balance on cancelling this order. */
|
||||
private BigDecimal calcHaveAssetRefund() {
|
||||
BigDecimal refund = getAmountLeft();
|
||||
|
||||
// If 'new' pricing and "amount" is in want-asset then we need to convert
|
||||
if (isOurOrderNewPricing && haveAssetId < wantAssetId)
|
||||
refund = refund.multiply(this.orderData.getPrice()).setScale(8, RoundingMode.HALF_UP);
|
||||
|
||||
return refund;
|
||||
}
|
||||
|
||||
// Navigation
|
||||
|
||||
public List<TradeData> getTrades() throws DataException {
|
||||
@@ -249,8 +261,6 @@ public class Order {
|
||||
public void process() throws DataException {
|
||||
AssetRepository assetRepository = this.repository.getAssetRepository();
|
||||
|
||||
long haveAssetId = this.orderData.getHaveAssetId();
|
||||
long wantAssetId = this.orderData.getWantAssetId();
|
||||
AssetData haveAssetData = getHaveAsset();
|
||||
AssetData wantAssetData = getWantAsset();
|
||||
|
||||
@@ -452,8 +462,6 @@ public class Order {
|
||||
this.repository.getAssetRepository().delete(this.orderData.getOrderId());
|
||||
|
||||
// Return asset to creator
|
||||
long haveAssetId = this.orderData.getHaveAssetId();
|
||||
|
||||
Account creator = new PublicKeyAccount(this.repository, this.orderData.getCreatorPublicKey());
|
||||
creator.setConfirmedBalance(haveAssetId, creator.getConfirmedBalance(haveAssetId).add(this.calcHaveAssetCommittment()));
|
||||
}
|
||||
@@ -462,10 +470,18 @@ public class Order {
|
||||
public void cancel() throws DataException {
|
||||
this.orderData.setIsClosed(true);
|
||||
this.repository.getAssetRepository().save(this.orderData);
|
||||
|
||||
// Update creator's balance with unfulfilled amount
|
||||
Account creator = new PublicKeyAccount(this.repository, this.orderData.getCreatorPublicKey());
|
||||
creator.setConfirmedBalance(haveAssetId, creator.getConfirmedBalance(haveAssetId).add(calcHaveAssetRefund()));
|
||||
}
|
||||
|
||||
// Opposite of cancel() above for use during orphaning
|
||||
public void reopen() throws DataException {
|
||||
// Update creator's balance with unfulfilled amount
|
||||
Account creator = new PublicKeyAccount(this.repository, this.orderData.getCreatorPublicKey());
|
||||
creator.setConfirmedBalance(haveAssetId, creator.getConfirmedBalance(haveAssetId).subtract(calcHaveAssetRefund()));
|
||||
|
||||
this.orderData.setIsClosed(false);
|
||||
this.repository.getAssetRepository().save(this.orderData);
|
||||
}
|
||||
|
@@ -114,9 +114,6 @@ public class CancelAssetOrderTransaction extends Transaction {
|
||||
OrderData orderData = this.repository.getAssetRepository().fromOrderId(cancelOrderTransactionData.getOrderId());
|
||||
Order order = new Order(this.repository, orderData);
|
||||
order.cancel();
|
||||
|
||||
// Update creator's balance with unfulfilled amount
|
||||
creator.setConfirmedBalance(orderData.getHaveAssetId(), creator.getConfirmedBalance(orderData.getHaveAssetId()).add(order.getAmountLeft()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -136,9 +133,6 @@ public class CancelAssetOrderTransaction extends Transaction {
|
||||
OrderData orderData = this.repository.getAssetRepository().fromOrderId(cancelOrderTransactionData.getOrderId());
|
||||
Order order = new Order(this.repository, orderData);
|
||||
order.reopen();
|
||||
|
||||
// Update creator's balance with unfulfilled amount
|
||||
creator.setConfirmedBalance(orderData.getHaveAssetId(), creator.getConfirmedBalance(orderData.getHaveAssetId()).subtract(order.getAmountLeft()));
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user