Skip to content

Commit

Permalink
Only output demurrage form from to_human()
Browse files Browse the repository at this point in the history
  • Loading branch information
sublimator committed Sep 17, 2015
1 parent 778f59b commit 993cbc8
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 45 deletions.
2 changes: 1 addition & 1 deletion src/core/amount.js
Expand Up @@ -941,7 +941,7 @@ Amount.prototype.to_text_full = function(opts) {
}
return this._is_native
? this.to_human() + '/XRP'
: this.to_text() + '/' + this._currency.to_json()
: this.to_text() + '/' + this._currency.to_human()
+ '/' + this._issuer.to_json(opts);
};

Expand Down
52 changes: 28 additions & 24 deletions src/core/currency.js
@@ -1,5 +1,6 @@
'use strict';

var _ = require('extend');
var extend = require('extend');
var UInt160 = require('./uint160').UInt160;
var utils = require('./utils');
Expand Down Expand Up @@ -73,6 +74,22 @@ Currency.from_human = function(j, opts) {
return (new Currency().parse_human(j, opts));
};

function percentageEFoldingBytes(percentageString) {
// byte 9-16 are for the interest
var percentage = parseFloat(percentageString);

// the interest or demurrage is expressed as a yearly (per annum)
// value
var secondsPerYear = 31536000; // 60 * 60 * 24 * 365

// Calculating the interest e-fold
// 0.5% demurrage is expressed 0.995, 0.005 less than 1
// 0.5% interest is expressed as 1.005, 0.005 more than 1
var interestEfold = secondsPerYear / Math.log(1 + percentage / 100);
var bytes = Float.toIEEE754Double(interestEfold);
return bytes;
}

// this._value = NaN on error.
Currency.prototype.parse_json = function(j, shouldInterpretXrpAsIou) {
this._value = NaN;
Expand Down Expand Up @@ -159,18 +176,7 @@ Currency.prototype.parse_json = function(j, shouldInterpretXrpAsIou) {
// byte 5-8 are for reference date, but should always be 0 so we
// won't fill it

// byte 9-16 are for the interest
percentage = parseFloat(percentage[0]);

// the interest or demurrage is expressed as a yearly (per annum)
// value
var secondsPerYear = 31536000; // 60 * 60 * 24 * 365

// Calculating the interest e-fold
// 0.5% demurrage is expressed 0.995, 0.005 less than 1
// 0.5% interest is expressed as 1.005, 0.005 more than 1
var interestEfold = secondsPerYear / Math.log(1 + percentage / 100);
var bytes = Float.toIEEE754Double(interestEfold);
var bytes = percentageEFoldingBytes(percentage[0]);

for (var i = 0; i <= bytes.length; i++) {
currencyData[8 + i] = bytes[i] & 0xff;
Expand Down Expand Up @@ -322,8 +328,8 @@ Currency.prototype.get_interest_at = function(referenceDate) {
}

// calculate interest by e-fold number
return Math.exp((referenceDate - this._interest_start)
/ this._interest_period);
return Math.exp(
(referenceDate - this._interest_start) / this._interest_period);
};

Currency.prototype.get_interest_percentage_at
Expand Down Expand Up @@ -354,24 +360,22 @@ Currency.prototype.to_json = function(opts) {
}

if (!opts) {
opts = {};
opts = {force_hex: this.has_interest()};
}

var currency;
var fullName = opts && opts.full_name ? ' - ' + opts.full_name : '';
opts.show_interest = opts.show_interest !== undefined
? opts.show_interest
: this.has_interest();
opts.show_interest = opts.show_interest !== undefined ?
opts.show_interest: this.has_interest();

if (!opts.force_hex && /^[A-Z0-9]{3}$/.test(this._iso_code)) {
currency = this._iso_code + fullName;
if (opts.show_interest) {
var decimals = !isNaN(opts.decimals) ? opts.decimals : undefined;
var interestPercentage = this.has_interest()
? this.get_interest_percentage_at(
this._interest_start + 3600 * 24 * 365, decimals
)
: 0;
var interestPercentage = this.has_interest() ?
this.get_interest_percentage_at(
this._interest_start + 3600 * 24 * 365, decimals ) :
0;
currency += ' (' + interestPercentage + '%pa)';
}

Expand All @@ -391,7 +395,7 @@ Currency.prototype.to_json = function(opts) {
};

Currency.prototype.to_human = function(opts) {
// to_human() will always print the human-readable currency code if available.
var opts = extend({}, opts, {force_hex : false});
return this.to_json(opts);
};

Expand Down
41 changes: 21 additions & 20 deletions test/currency-test.js
Expand Up @@ -12,9 +12,11 @@ describe('Currency', function() {
it('json_rewrite("NaN") == "XRP"', function() {
assert.strictEqual('XRP', currency.json_rewrite(NaN));
});
it('json_rewrite("015841551A748AD2C1F76FF6ECB0CCCD00000000") == "XAU (-0.5%pa)"', function() {
assert.strictEqual(currency.json_rewrite("015841551A748AD2C1F76FF6ECB0CCCD00000000"),
"XAU (-0.5%pa)");
it('json_rewrite("015841551A748AD2C1F76FF6ECB0CCCD00000000") == '+
'"015841551A748AD2C1F76FF6ECB0CCCD00000000', function() {
assert.strictEqual(
"015841551A748AD2C1F76FF6ECB0CCCD00000000",
currency.json_rewrite("015841551A748AD2C1F76FF6ECB0CCCD00000000"));
});
});
describe('from_json', function() {
Expand Down Expand Up @@ -75,7 +77,8 @@ describe('Currency', function() {
assert.strictEqual('015841550000000041F78E0A28CBF19200000000', r.to_json({force_hex: true}));
});
it('json_rewrite("015841550000000041F78E0A28CBF19200000000").to_json() hex', function() {
var r = currency.json_rewrite('015841550000000041F78E0A28CBF19200000000');
var r = currency.json_rewrite('015841550000000041F78E0A28CBF19200000000',
{force_hex: false});
assert.strictEqual('XAU (0.5%pa)', r);
});
it('json_rewrite("015841550000000041F78E0A28CBF19200000000") hex', function() {
Expand All @@ -87,40 +90,39 @@ describe('Currency', function() {
describe('from_human', function() {
it('From human "USD - Gold (-25%pa)"', function() {
var cur = currency.from_human('USD - Gold (-25%pa)');
assert.strictEqual(cur.to_json(), 'USD (-25%pa)');
assert.strictEqual(cur.to_hex(), '0155534400000000C19A22BC51297F0B00000000');
assert.strictEqual(cur.to_json(), cur.to_human());
assert.strictEqual(cur.to_human(), 'USD (-25%pa)');
assert.strictEqual(cur.to_json(), '0155534400000000C19A22BC51297F0B00000000');
});
it('From human "EUR (-0.5%pa)', function() {
var cur = currency.from_human('EUR (-0.5%pa)');
assert.strictEqual(cur.to_json(), 'EUR (-0.5%pa)');
assert.strictEqual(cur.to_human(), 'EUR (-0.5%pa)');
});
it('From human "EUR (0.5361%pa)", test decimals', function() {
var cur = currency.from_human('EUR (0.5361%pa)');
assert.strictEqual(cur.to_json(), 'EUR (0.54%pa)');
assert.strictEqual(cur.to_json({decimals:4}), 'EUR (0.5361%pa)');
assert.strictEqual(cur.to_human(), 'EUR (0.54%pa)');
assert.strictEqual(cur.to_human({decimals:4}), 'EUR (0.5361%pa)');
assert.strictEqual(cur.get_interest_percentage_at(undefined, 4), 0.5361);
});
it('From human "EUR - Euro (0.5361%pa)", test decimals and full_name', function() {
var cur = currency.from_human('EUR (0.5361%pa)');
assert.strictEqual(cur.to_json(), 'EUR (0.54%pa)');
assert.strictEqual(cur.to_json({decimals:4, full_name:'Euro'}), 'EUR - Euro (0.5361%pa)');
assert.strictEqual(cur.to_json({decimals:void(0), full_name:'Euro'}), 'EUR - Euro (0.54%pa)');
assert.strictEqual(cur.to_json({decimals:undefined, full_name:'Euro'}), 'EUR - Euro (0.54%pa)');
assert.strictEqual(cur.to_json({decimals:'henk', full_name:'Euro'}), 'EUR - Euro (0.54%pa)');
assert.strictEqual(cur.to_human(), 'EUR (0.54%pa)');
assert.strictEqual(cur.to_human({decimals:4, full_name:'Euro'}), 'EUR - Euro (0.5361%pa)');
assert.strictEqual(cur.to_human({decimals:void(0), full_name:'Euro'}), 'EUR - Euro (0.54%pa)');
assert.strictEqual(cur.to_human({decimals:undefined, full_name:'Euro'}), 'EUR - Euro (0.54%pa)');
assert.strictEqual(cur.to_human({decimals:'henk', full_name:'Euro'}), 'EUR - Euro (0.54%pa)');
assert.strictEqual(cur.get_interest_percentage_at(undefined, 4), 0.5361);
});
it('From human "TYX - 30-Year Treasuries (1.5%pa)"', function() {
var cur = currency.from_human('TYX - 30-Year Treasuries (1.5%pa)');
assert.strictEqual(cur.to_json(), 'TYX (1.5%pa)');
assert.strictEqual(cur.to_human(), 'TYX (1.5%pa)');
});
it('From human "TYX - 30-Year Treasuries"', function() {
var cur = currency.from_human('TYX - 30-Year Treasuries');
assert.strictEqual(cur.to_json(), 'TYX');
});
it('From human "INR - Indian Rupees (-0.5%)"', function() {
var cur = currency.from_human('INR - Indian Rupees (-0.5%pa)');
assert.strictEqual(cur.to_json(), 'INR (-0.5%pa)');
assert.strictEqual(cur.to_human(), 'INR (-0.5%pa)');
});
it('From human "INR - 30 Indian Rupees"', function() {
var cur = currency.from_human('INR - 30 Indian Rupees');
Expand Down Expand Up @@ -190,15 +192,14 @@ describe('Currency', function() {
describe('from_hex', function() {
it('"015841551A748AD2C1F76FF6ECB0CCCD00000000" === "XAU (-0.5%pa)"', function() {
var cur = currency.from_hex('015841551A748AD2C1F76FF6ECB0CCCD00000000');
assert.strictEqual(cur.to_json(), 'XAU (-0.5%pa)');
assert.strictEqual(cur.to_human(), 'XAU (-0.5%pa)');
assert.strictEqual(cur.to_hex(), '015841551A748AD2C1F76FF6ECB0CCCD00000000');
assert.strictEqual(cur.to_json(), cur.to_human());
});
});
describe('parse_json', function() {
it('should parse a currency object', function() {
assert.strictEqual('USD', new currency().parse_json(currency.from_json('USD')).to_json());
assert.strictEqual('USD (0.5%pa)', new currency().parse_json(currency.from_json('USD (0.5%pa)')).to_json());
assert.strictEqual('USD (0.5%pa)', new currency().parse_json(currency.from_json('USD (0.5%pa)')).to_human());
});
it('should clone for parse_json on itself', function() {
var cur = currency.from_json('USD');
Expand Down

0 comments on commit 993cbc8

Please sign in to comment.