mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-20 12:15:51 +00:00
Decouple UInt160 from amount.js
This commit is contained in:
@@ -381,6 +381,8 @@ Account._publicKeyToAddress = function(public_key) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.Account = Account;
|
module.exports = {
|
||||||
|
Account
|
||||||
|
};
|
||||||
|
|
||||||
// vim:sw=2:sts=2:ts=8:et
|
// vim:sw=2:sts=2:ts=8:et
|
||||||
|
|||||||
@@ -6,9 +6,10 @@
|
|||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const extend = require('extend');
|
const extend = require('extend');
|
||||||
const utils = require('./utils');
|
const utils = require('./utils');
|
||||||
const UInt160 = require('./uint160').UInt160;
|
|
||||||
const Currency = require('./currency').Currency;
|
const Currency = require('./currency').Currency;
|
||||||
const {XRPValue, IOUValue} = require('ripple-lib-value');
|
const {XRPValue, IOUValue} = require('ripple-lib-value');
|
||||||
|
const {isValidAddress} = require('ripple-address-codec');
|
||||||
|
const {ACCOUNT_ONE, ACCOUNT_ZERO} = require('./constants');
|
||||||
|
|
||||||
type Value = XRPValue | IOUValue;
|
type Value = XRPValue | IOUValue;
|
||||||
|
|
||||||
@@ -21,7 +22,7 @@ function Amount(value = new XRPValue(NaN)) {
|
|||||||
this._value = value;
|
this._value = value;
|
||||||
this._is_native = true; // Default to XRP. Only valid if value is not NaN.
|
this._is_native = true; // Default to XRP. Only valid if value is not NaN.
|
||||||
this._currency = new Currency();
|
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,
|
Amount.from_components_unsafe = function(value: Value, currency: Currency,
|
||||||
issuer: UInt160, isNative: boolean
|
issuer: string, isNative: boolean
|
||||||
) {
|
) {
|
||||||
const result = new Amount(value);
|
const result = new Amount(value);
|
||||||
result._is_native = isNative;
|
result._is_native = isNative;
|
||||||
@@ -402,7 +403,7 @@ Amount.prototype.equals = function(d, ignore_issuer) {
|
|||||||
&& this._is_native === d._is_native
|
&& this._is_native === d._is_native
|
||||||
&& this._value.equals(d._value)
|
&& this._value.equals(d._value)
|
||||||
&& (this._is_native || (this._currency.equals(d._currency)
|
&& (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.
|
// 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() {
|
Amount.prototype.is_valid_full = function() {
|
||||||
return this.is_valid()
|
return this.is_valid() && this._currency.is_valid()
|
||||||
&& this._currency.is_valid()
|
&& isValidAddress(this._issuer) && this._issuer !== ACCOUNT_ZERO;
|
||||||
&& this._issuer.is_valid();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Amount.prototype.is_zero = function() {
|
Amount.prototype.is_zero = function() {
|
||||||
@@ -532,7 +532,7 @@ Amount.prototype.parse_human = function(j, options) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Amount.prototype.parse_issuer = function(issuer) {
|
Amount.prototype.parse_issuer = function(issuer) {
|
||||||
this._issuer = UInt160.from_json(issuer);
|
this._issuer = issuer;
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -583,7 +583,7 @@ function(quality, counterCurrency, counterIssuer, opts) {
|
|||||||
const offset = parseInt(offset_hex, 16) - 100;
|
const offset = parseInt(offset_hex, 16) - 100;
|
||||||
|
|
||||||
this._currency = Currency.from_json(counterCurrency);
|
this._currency = Currency.from_json(counterCurrency);
|
||||||
this._issuer = UInt160.from_json(counterIssuer);
|
this._issuer = counterIssuer;
|
||||||
this._is_native = this._currency.is_native();
|
this._is_native = this._currency.is_native();
|
||||||
|
|
||||||
if (this._is_native && baseCurrency.is_native()) {
|
if (this._is_native && baseCurrency.is_native()) {
|
||||||
@@ -643,7 +643,7 @@ function(quality, counterCurrency, counterIssuer, opts) {
|
|||||||
Amount.prototype.parse_number = function(n) {
|
Amount.prototype.parse_number = function(n) {
|
||||||
this._is_native = false;
|
this._is_native = false;
|
||||||
this._currency = Currency.from_json(1);
|
this._currency = Currency.from_json(1);
|
||||||
this._issuer = UInt160.from_json(1);
|
this._issuer = ACCOUNT_ONE;
|
||||||
this._set_value(new IOUValue(n));
|
this._set_value(new IOUValue(n));
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
@@ -659,15 +659,15 @@ Amount.prototype.parse_json = function(j) {
|
|||||||
if (m) {
|
if (m) {
|
||||||
this._currency = Currency.from_json(m[2]);
|
this._currency = Currency.from_json(m[2]);
|
||||||
if (m[3]) {
|
if (m[3]) {
|
||||||
this._issuer = UInt160.from_json(m[3]);
|
this._issuer = m[3];
|
||||||
} else {
|
} else {
|
||||||
this._issuer = UInt160.from_json('1');
|
this._issuer = 'NaN';
|
||||||
}
|
}
|
||||||
this.parse_value(m[1]);
|
this.parse_value(m[1]);
|
||||||
} else {
|
} else {
|
||||||
this.parse_native(j);
|
this.parse_native(j);
|
||||||
this._currency = Currency.from_json('0');
|
this._currency = Currency.from_json('0');
|
||||||
this._issuer = UInt160.from_json('0');
|
this._issuer = ACCOUNT_ZERO;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -686,9 +686,10 @@ Amount.prototype.parse_json = function(j) {
|
|||||||
// Parse the passed value to sanitize and copy it.
|
// Parse the passed value to sanitize and copy it.
|
||||||
this._currency.parse_json(j.currency, true); // Never XRP.
|
this._currency.parse_json(j.currency, true); // Never XRP.
|
||||||
|
|
||||||
if (typeof j.issuer === 'string') {
|
if (typeof j.issuer !== 'string') {
|
||||||
this._issuer.parse_json(j.issuer);
|
throw new Error('issuer must be a string');
|
||||||
}
|
}
|
||||||
|
this._issuer = j.issuer;
|
||||||
|
|
||||||
this.parse_value(j.value);
|
this.parse_value(j.value);
|
||||||
}
|
}
|
||||||
@@ -736,12 +737,7 @@ Amount.prototype.set_currency = function(c) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Amount.prototype.set_issuer = function(issuer) {
|
Amount.prototype.set_issuer = function(issuer) {
|
||||||
if (issuer instanceof UInt160) {
|
this._issuer = issuer;
|
||||||
this._issuer = issuer;
|
|
||||||
} else {
|
|
||||||
this._issuer = UInt160.from_json(issuer);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -939,7 +935,7 @@ Amount.prototype.to_human_full = function(options) {
|
|||||||
const opts = options || {};
|
const opts = options || {};
|
||||||
const value = this.to_human(opts);
|
const value = this.to_human(opts);
|
||||||
const currency = this._currency.to_human();
|
const currency = this._currency.to_human();
|
||||||
const issuer = this._issuer.to_json(opts);
|
const issuer = this._issuer;
|
||||||
const base = value + '/' + currency;
|
const base = value + '/' + currency;
|
||||||
return this.is_native() ? base : (base + '/' + issuer);
|
return this.is_native() ? base : (base + '/' + issuer);
|
||||||
};
|
};
|
||||||
@@ -955,21 +951,21 @@ Amount.prototype.to_json = function() {
|
|||||||
this._currency.to_hex() : this._currency.to_json()
|
this._currency.to_hex() : this._currency.to_json()
|
||||||
};
|
};
|
||||||
|
|
||||||
if (this._issuer.is_valid()) {
|
if (isValidAddress(this._issuer)) {
|
||||||
amount_json.issuer = this._issuer.to_json();
|
amount_json.issuer = this._issuer;
|
||||||
}
|
}
|
||||||
|
|
||||||
return amount_json;
|
return amount_json;
|
||||||
};
|
};
|
||||||
|
|
||||||
Amount.prototype.to_text_full = function(opts) {
|
Amount.prototype.to_text_full = function() {
|
||||||
if (!this.is_valid()) {
|
if (!this.is_valid()) {
|
||||||
return 'NaN';
|
return 'NaN';
|
||||||
}
|
}
|
||||||
return this._is_native
|
return this._is_native
|
||||||
? this.to_human() + '/XRP'
|
? this.to_human() + '/XRP'
|
||||||
: this.to_text() + '/' + this._currency.to_json()
|
: this.to_text() + '/' + this._currency.to_json()
|
||||||
+ '/' + this._issuer.to_json(opts);
|
+ '/' + this._issuer;
|
||||||
};
|
};
|
||||||
|
|
||||||
// For debugging.
|
// For debugging.
|
||||||
@@ -998,11 +994,8 @@ Amount.prototype.not_equals_why = function(d, ignore_issuer) {
|
|||||||
if (!this._currency.equals(d._currency)) {
|
if (!this._currency.equals(d._currency)) {
|
||||||
return 'Non-XRP currency differs.';
|
return 'Non-XRP currency differs.';
|
||||||
}
|
}
|
||||||
if (!ignore_issuer && !this._issuer.equals(d._issuer)) {
|
if (!ignore_issuer && this._issuer !== d._issuer) {
|
||||||
return 'Non-XRP issuer differs: '
|
return 'Non-XRP issuer differs: ' + d._issuer + '/' + this._issuer;
|
||||||
+ d._issuer.to_json()
|
|
||||||
+ '/'
|
|
||||||
+ this._issuer.to_json();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
6
src/core/constants.js
Normal file
6
src/core/constants.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
ACCOUNT_ZERO: 'rrrrrrrrrrrrrrrrrrrrrhoLvTp',
|
||||||
|
ACCOUNT_ONE: 'rrrrrrrrrrrrrrrrrrrrBZbvji'
|
||||||
|
};
|
||||||
@@ -2,6 +2,8 @@ var extend = require('extend');
|
|||||||
var utils = require('./utils');
|
var utils = require('./utils');
|
||||||
var UInt160 = require('./uint160').UInt160;
|
var UInt160 = require('./uint160').UInt160;
|
||||||
var Amount = require('./amount').Amount;
|
var Amount = require('./amount').Amount;
|
||||||
|
var ACCOUNT_ZERO = require('./constants').ACCOUNT_ZERO;
|
||||||
|
var {isValidAddress} = require('ripple-address-codec');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Meta data processing facility
|
* Meta data processing facility
|
||||||
@@ -154,8 +156,8 @@ Meta.prototype.getAffectedAccounts = function(from) {
|
|||||||
} else if (~Meta.AMOUNT_FIELDS_AFFECTING_ISSUER.indexOf(fieldName)) {
|
} else if (~Meta.AMOUNT_FIELDS_AFFECTING_ISSUER.indexOf(fieldName)) {
|
||||||
var amount = Amount.from_json(field);
|
var amount = Amount.from_json(field);
|
||||||
var issuer = amount.issuer();
|
var issuer = amount.issuer();
|
||||||
if (issuer.is_valid() && !issuer.is_zero()) {
|
if (isValidAddress(issuer) && issuer !== ACCOUNT_ZERO) {
|
||||||
accounts.push(issuer.to_json());
|
accounts.push(issuer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -186,11 +188,11 @@ Meta.prototype.getAffectedBooks = function() {
|
|||||||
var paysKey = pays.currency().to_json();
|
var paysKey = pays.currency().to_json();
|
||||||
|
|
||||||
if (getsKey !== 'XRP') {
|
if (getsKey !== 'XRP') {
|
||||||
getsKey += '/' + gets.issuer().to_json();
|
getsKey += '/' + gets.issuer();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (paysKey !== 'XRP') {
|
if (paysKey !== 'XRP') {
|
||||||
paysKey += '/' + pays.issuer().to_json();
|
paysKey += '/' + pays.issuer();
|
||||||
}
|
}
|
||||||
|
|
||||||
var key = getsKey + ':' + paysKey;
|
var key = getsKey + ':' + paysKey;
|
||||||
|
|||||||
@@ -29,8 +29,7 @@ function createAmount(value, currency_, counterparty_) {
|
|||||||
Currency.from_json(currency_);
|
Currency.from_json(currency_);
|
||||||
|
|
||||||
const counterparty = counterparty_ instanceof UInt160 ?
|
const counterparty = counterparty_ instanceof UInt160 ?
|
||||||
counterparty_ :
|
counterparty_.to_json() : counterparty_;
|
||||||
UInt160.from_json(counterparty_);
|
|
||||||
|
|
||||||
return Amount.from_components_unsafe(new IOUValue(value),
|
return Amount.from_components_unsafe(new IOUValue(value),
|
||||||
currency, counterparty, false);
|
currency, counterparty, false);
|
||||||
|
|||||||
@@ -518,7 +518,7 @@ const STAmount = exports.Amount = new SerializedType({
|
|||||||
STCurrency.serialize(so, currency, true);
|
STCurrency.serialize(so, currency, true);
|
||||||
|
|
||||||
// Issuer (160-bit hash)
|
// Issuer (160-bit hash)
|
||||||
so.append(amount.issuer().to_bytes());
|
so.append(UInt160.from_json(amount.issuer()).to_bytes());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
parse: function(so) {
|
parse: function(so) {
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ const SerializedObject = require('./serializedobject').SerializedObject;
|
|||||||
const RippleError = require('./rippleerror').RippleError;
|
const RippleError = require('./rippleerror').RippleError;
|
||||||
const hashprefixes = require('./hashprefixes');
|
const hashprefixes = require('./hashprefixes');
|
||||||
const log = require('./log').internal.sub('transaction');
|
const log = require('./log').internal.sub('transaction');
|
||||||
|
const {isValidAddress} = require('ripple-address-codec');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @constructor Transaction
|
* @constructor Transaction
|
||||||
@@ -722,7 +723,7 @@ Transaction.prototype._setAmount = function(name, amount, options_) {
|
|||||||
if (!(isNative || parsedAmount.currency().is_valid())) {
|
if (!(isNative || parsedAmount.currency().is_valid())) {
|
||||||
throw new Error(name + ' must have a valid currency');
|
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');
|
throw new Error(name + ' must have a valid issuer');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user