Merge pull request #146 from ripple/unfunded-orders

Update unfunded order tracking - fix native/non-native currency discrepancies
This commit is contained in:
wltsmrz
2014-08-20 16:00:08 -07:00
2 changed files with 51 additions and 48 deletions

View File

@@ -369,40 +369,33 @@ OrderBook.prototype.setFundedAmount = function(offer, fundedAmount) {
return offer;
}
function sixFigures(str) {
return str.substring(0, str.indexOf('.') + 7);
};
var iouSuffix = '/' + this._currencyGets.to_json()
+ '/' + this._issuerGets;
var takerGetsValue = (typeof offer.TakerGets === 'object')
? offer.TakerGets.value
: offer.TakerGets;
var takerPaysValue = (typeof offer.TakerPays === 'object')
? offer.TakerPays.value
: offer.TakerPays;
var iouSuffix = '/USD/rrrrrrrrrrrrrrrrrrrrBZbvji';
var fundedTakerGets = Amount.from_json(fundedAmount + iouSuffix);
var takerGets = Amount.from_json(takerGetsValue + iouSuffix);
var takerPays = Amount.from_json(takerPaysValue + iouSuffix);
offer.is_fully_funded = fundedTakerGets.compareTo(takerGets) >= 0;
offer.is_fully_funded = Amount.from_json(
this._currencyGets.is_native() ? fundedAmount : fundedAmount + iouSuffix
).compareTo(Amount.from_json(offer.TakerGets)) >= 0;
if (offer.is_fully_funded) {
offer.taker_gets_funded = takerGetsValue;
offer.taker_pays_funded = takerPaysValue;
return offer;
}
offer.taker_gets_funded = fundedAmount;
var rate = Amount.from_json(offer.TakerPays).divide(offer.TakerGets);
var takerPaysFunded = fundedTakerGets.multiply(rate);
if (takerPaysFunded.compareTo(takerPays) <= 0) {
offer.taker_pays_funded = takerPaysFunded.to_text();
offer.taker_gets_funded = Amount.from_json(offer.TakerGets).to_text();
offer.taker_pays_funded = Amount.from_json(offer.TakerPays).to_text();
} else {
offer.taker_pays_funded = takerPaysValue;
offer.taker_gets_funded = fundedAmount;
var rate = Amount.from_json(offer.TakerPays)
.divide(Amount.from_json(offer.TakerGets));
var fundedPays = Amount.from_json(
this._currencyPays.is_native()
? fundedAmount
: fundedAmount + '/' + this._currencyPays.to_json() + '/' + this._issuerPays
).multiply(rate);
if (fundedPays.compareTo(Amount.from_json(offer.TakerPays)) <= 0) {
offer.taker_pays_funded = fundedPays.to_text();
} else {
offer.taker_pays_funded = Amount.from_json(offer.TakerPays).to_text();
}
}
return offer;

View File

@@ -349,13 +349,15 @@ describe('OrderBook', function() {
book.setFundedAmount(offer, '100.1234');
assert.deepEqual(offer, {
var expected = {
TakerGets: offer.TakerGets,
TakerPays: offer.TakerPays,
is_fully_funded: true,
taker_gets_funded: '100',
taker_pays_funded: '123456'
});
};
assert.deepEqual(offer, expected);
});
it('Set funded amount - unfunded', function() {
@@ -367,23 +369,25 @@ describe('OrderBook', function() {
});
var offer = {
TakerGets: {
value: '100',
TakerPays: {
value: '123456',
currency: 'BTC',
issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji'
},
TakerPays: '123456'
TakerGets: '100'
};
book.setFundedAmount(offer, '99');
assert.deepEqual(offer, {
var expected = {
TakerGets: offer.TakerGets,
TakerPays: offer.TakerPays,
is_fully_funded: false,
taker_gets_funded: '99',
taker_pays_funded: '122166'
});
taker_pays_funded: '122221.44'
};
assert.deepEqual(offer, expected);
});
it('Set funded amount - native currency - funded', function() {
@@ -421,7 +425,7 @@ describe('OrderBook', function() {
var book = remote.createOrderBook({
currency_gets: 'XRP',
issuer_pays: 'rrrrrrrrrrrrrrrrrrrrBZbvji',
currency_pays: 'BTC'
currency_pays: 'USD'
});
var offer = {
@@ -435,13 +439,15 @@ describe('OrderBook', function() {
book.setFundedAmount(offer, '99');
assert.deepEqual(offer, {
var expected = {
TakerGets: offer.TakerGets,
TakerPays: offer.TakerPays,
is_fully_funded: false,
taker_gets_funded: '99',
taker_pays_funded: '99.122166'
});
};
assert.deepEqual(offer, expected);
});
it('Set funded amount - zero funds', function() {
@@ -1372,7 +1378,7 @@ describe('OrderBook', function() {
Sequence: 561,
TransferRate: 1002000000,
index: 'B7D526FDDF9E3B3F95C3DC97C353065B0482302500BBB8051A5C090B596C6133',
urlgravatar: 'http://www.gravatar.com/avatar/5b33b93c7ffe384d53450fc666bb11fb'
urlgravatar: 'http:www.gravatar.com/avatar/5b33b93c7ffe384d53450fc666bb11fb'
}
});
@@ -1484,9 +1490,8 @@ describe('OrderBook', function() {
book._issuerTransferRate = 1002000000;
book.once('model', function(model) {
assert.deepEqual(model, [
{ Account: 'rGCHV41NxoK7wHQJhmao2RqjWZvBrTUhW1',
var expected = [
{ Account: 'rGCHV41NxoK7wHQJhmao2RqjWZvBrTUhW1',
BookDirectory: '6EAB7C172DEFA430DBFAD120FDC373B5F5AF8B191649EC985711A3A4254F5000',
BookNode: '0000000000000000',
Flags: 131072,
@@ -1537,9 +1542,14 @@ describe('OrderBook', function() {
is_fully_funded: true,
taker_gets_funded: '0.2',
taker_pays_funded: '99.72233516476456'
}])
assert.strictEqual(book._synchronized, true);
done();
}
]
book.once('model', function(model) {
assert.deepEqual(model, expected);
assert.strictEqual(book._synchronized, true);
done();
});
});
});