From c6805b9f0d1c4ba688bb9cf730901745711be869 Mon Sep 17 00:00:00 2001 From: Chris Clark Date: Fri, 25 Sep 2015 10:41:21 -0700 Subject: [PATCH] Decouple UInt160 from amount.js --- src/core/account.js | 4 ++- src/core/amount.js | 55 ++++++++++++++++--------------------- src/core/constants.js | 6 ++++ src/core/meta.js | 10 ++++--- src/core/orderbookutils.js | 3 +- src/core/serializedtypes.js | 2 +- src/core/transaction.js | 3 +- 7 files changed, 43 insertions(+), 40 deletions(-) create mode 100644 src/core/constants.js diff --git a/src/core/account.js b/src/core/account.js index a7340c1e..1af60f19 100644 --- a/src/core/account.js +++ b/src/core/account.js @@ -381,6 +381,8 @@ Account._publicKeyToAddress = function(public_key) { } }; -exports.Account = Account; +module.exports = { + Account +}; // vim:sw=2:sts=2:ts=8:et diff --git a/src/core/amount.js b/src/core/amount.js index 0a7a1224..f2959d4d 100644 --- a/src/core/amount.js +++ b/src/core/amount.js @@ -6,9 +6,10 @@ const assert = require('assert'); const extend = require('extend'); const utils = require('./utils'); -const UInt160 = require('./uint160').UInt160; const Currency = require('./currency').Currency; const {XRPValue, IOUValue} = require('ripple-lib-value'); +const {isValidAddress} = require('ripple-address-codec'); +const {ACCOUNT_ONE, ACCOUNT_ZERO} = require('./constants'); type Value = XRPValue | IOUValue; @@ -21,7 +22,7 @@ function Amount(value = new XRPValue(NaN)) { this._value = value; this._is_native = true; // Default to XRP. Only valid if value is not NaN. this._currency = new Currency(); - this._issuer = new UInt160(); + this._issuer = 'NaN'; } /** @@ -105,7 +106,7 @@ Amount.NaN = function() { }; Amount.from_components_unsafe = function(value: Value, currency: Currency, - issuer: UInt160, isNative: boolean + issuer: string, isNative: boolean ) { const result = new Amount(value); result._is_native = isNative; @@ -402,7 +403,7 @@ Amount.prototype.equals = function(d, ignore_issuer) { && this._is_native === d._is_native && this._value.equals(d._value) && (this._is_native || (this._currency.equals(d._currency) - && (ignore_issuer || this._issuer.equals(d._issuer)))); + && (ignore_issuer || this._issuer === d._issuer))); }; // True if Amounts are valid and both native or non-native. @@ -428,9 +429,8 @@ Amount.prototype.is_valid = function() { }; Amount.prototype.is_valid_full = function() { - return this.is_valid() - && this._currency.is_valid() - && this._issuer.is_valid(); + return this.is_valid() && this._currency.is_valid() + && isValidAddress(this._issuer) && this._issuer !== ACCOUNT_ZERO; }; Amount.prototype.is_zero = function() { @@ -532,7 +532,7 @@ Amount.prototype.parse_human = function(j, options) { }; Amount.prototype.parse_issuer = function(issuer) { - this._issuer = UInt160.from_json(issuer); + this._issuer = issuer; return this; }; @@ -583,7 +583,7 @@ function(quality, counterCurrency, counterIssuer, opts) { const offset = parseInt(offset_hex, 16) - 100; this._currency = Currency.from_json(counterCurrency); - this._issuer = UInt160.from_json(counterIssuer); + this._issuer = counterIssuer; this._is_native = this._currency.is_native(); if (this._is_native && baseCurrency.is_native()) { @@ -643,7 +643,7 @@ function(quality, counterCurrency, counterIssuer, opts) { Amount.prototype.parse_number = function(n) { this._is_native = false; this._currency = Currency.from_json(1); - this._issuer = UInt160.from_json(1); + this._issuer = ACCOUNT_ONE; this._set_value(new IOUValue(n)); return this; }; @@ -659,15 +659,15 @@ Amount.prototype.parse_json = function(j) { if (m) { this._currency = Currency.from_json(m[2]); if (m[3]) { - this._issuer = UInt160.from_json(m[3]); + this._issuer = m[3]; } else { - this._issuer = UInt160.from_json('1'); + this._issuer = 'NaN'; } this.parse_value(m[1]); } else { this.parse_native(j); this._currency = Currency.from_json('0'); - this._issuer = UInt160.from_json('0'); + this._issuer = ACCOUNT_ZERO; } break; @@ -686,9 +686,10 @@ Amount.prototype.parse_json = function(j) { // Parse the passed value to sanitize and copy it. this._currency.parse_json(j.currency, true); // Never XRP. - if (typeof j.issuer === 'string') { - this._issuer.parse_json(j.issuer); + if (typeof j.issuer !== 'string') { + throw new Error('issuer must be a string'); } + this._issuer = j.issuer; this.parse_value(j.value); } @@ -736,12 +737,7 @@ Amount.prototype.set_currency = function(c) { }; Amount.prototype.set_issuer = function(issuer) { - if (issuer instanceof UInt160) { - this._issuer = issuer; - } else { - this._issuer = UInt160.from_json(issuer); - } - + this._issuer = issuer; return this; }; @@ -939,7 +935,7 @@ Amount.prototype.to_human_full = function(options) { const opts = options || {}; const value = this.to_human(opts); const currency = this._currency.to_human(); - const issuer = this._issuer.to_json(opts); + const issuer = this._issuer; const base = value + '/' + currency; return this.is_native() ? base : (base + '/' + issuer); }; @@ -955,21 +951,21 @@ Amount.prototype.to_json = function() { this._currency.to_hex() : this._currency.to_json() }; - if (this._issuer.is_valid()) { - amount_json.issuer = this._issuer.to_json(); + if (isValidAddress(this._issuer)) { + amount_json.issuer = this._issuer; } return amount_json; }; -Amount.prototype.to_text_full = function(opts) { +Amount.prototype.to_text_full = function() { if (!this.is_valid()) { return 'NaN'; } return this._is_native ? this.to_human() + '/XRP' : this.to_text() + '/' + this._currency.to_json() - + '/' + this._issuer.to_json(opts); + + '/' + this._issuer; }; // For debugging. @@ -998,11 +994,8 @@ Amount.prototype.not_equals_why = function(d, ignore_issuer) { if (!this._currency.equals(d._currency)) { return 'Non-XRP currency differs.'; } - if (!ignore_issuer && !this._issuer.equals(d._issuer)) { - return 'Non-XRP issuer differs: ' - + d._issuer.to_json() - + '/' - + this._issuer.to_json(); + if (!ignore_issuer && this._issuer !== d._issuer) { + return 'Non-XRP issuer differs: ' + d._issuer + '/' + this._issuer; } } }; diff --git a/src/core/constants.js b/src/core/constants.js new file mode 100644 index 00000000..3adbdbf9 --- /dev/null +++ b/src/core/constants.js @@ -0,0 +1,6 @@ +'use strict'; + +module.exports = { + ACCOUNT_ZERO: 'rrrrrrrrrrrrrrrrrrrrrhoLvTp', + ACCOUNT_ONE: 'rrrrrrrrrrrrrrrrrrrrBZbvji' +}; diff --git a/src/core/meta.js b/src/core/meta.js index c4f9b781..617931f4 100644 --- a/src/core/meta.js +++ b/src/core/meta.js @@ -2,6 +2,8 @@ var extend = require('extend'); var utils = require('./utils'); var UInt160 = require('./uint160').UInt160; var Amount = require('./amount').Amount; +var ACCOUNT_ZERO = require('./constants').ACCOUNT_ZERO; +var {isValidAddress} = require('ripple-address-codec'); /** * Meta data processing facility @@ -154,8 +156,8 @@ Meta.prototype.getAffectedAccounts = function(from) { } else if (~Meta.AMOUNT_FIELDS_AFFECTING_ISSUER.indexOf(fieldName)) { var amount = Amount.from_json(field); var issuer = amount.issuer(); - if (issuer.is_valid() && !issuer.is_zero()) { - accounts.push(issuer.to_json()); + if (isValidAddress(issuer) && issuer !== ACCOUNT_ZERO) { + accounts.push(issuer); } } } @@ -186,11 +188,11 @@ Meta.prototype.getAffectedBooks = function() { var paysKey = pays.currency().to_json(); if (getsKey !== 'XRP') { - getsKey += '/' + gets.issuer().to_json(); + getsKey += '/' + gets.issuer(); } if (paysKey !== 'XRP') { - paysKey += '/' + pays.issuer().to_json(); + paysKey += '/' + pays.issuer(); } var key = getsKey + ':' + paysKey; diff --git a/src/core/orderbookutils.js b/src/core/orderbookutils.js index ec9eb90e..462bc333 100644 --- a/src/core/orderbookutils.js +++ b/src/core/orderbookutils.js @@ -29,8 +29,7 @@ function createAmount(value, currency_, counterparty_) { Currency.from_json(currency_); const counterparty = counterparty_ instanceof UInt160 ? - counterparty_ : - UInt160.from_json(counterparty_); + counterparty_.to_json() : counterparty_; return Amount.from_components_unsafe(new IOUValue(value), currency, counterparty, false); diff --git a/src/core/serializedtypes.js b/src/core/serializedtypes.js index f8787d46..8f08964f 100644 --- a/src/core/serializedtypes.js +++ b/src/core/serializedtypes.js @@ -518,7 +518,7 @@ const STAmount = exports.Amount = new SerializedType({ STCurrency.serialize(so, currency, true); // Issuer (160-bit hash) - so.append(amount.issuer().to_bytes()); + so.append(UInt160.from_json(amount.issuer()).to_bytes()); } }, parse: function(so) { diff --git a/src/core/transaction.js b/src/core/transaction.js index 90e455fe..0a54b4cb 100644 --- a/src/core/transaction.js +++ b/src/core/transaction.js @@ -14,6 +14,7 @@ const SerializedObject = require('./serializedobject').SerializedObject; const RippleError = require('./rippleerror').RippleError; const hashprefixes = require('./hashprefixes'); const log = require('./log').internal.sub('transaction'); +const {isValidAddress} = require('ripple-address-codec'); /** * @constructor Transaction @@ -722,7 +723,7 @@ Transaction.prototype._setAmount = function(name, amount, options_) { if (!(isNative || parsedAmount.currency().is_valid())) { throw new Error(name + ' must have a valid currency'); } - if (!(isNative || parsedAmount.issuer().is_valid())) { + if (!(isNative || isValidAddress(parsedAmount.issuer()))) { throw new Error(name + ' must have a valid issuer'); }