mirror of
https://github.com/Xahau/xahaud.git
synced 2025-11-20 10:35:50 +00:00
212 lines
4.7 KiB
JavaScript
212 lines
4.7 KiB
JavaScript
// Represent Newcoin amounts and currencies.
|
|
|
|
|
|
var utils = require("./utils.js");
|
|
|
|
var UInt160 = function () {
|
|
// Internal form:
|
|
// 0, 1, 'iXXXXX', 20 byte string, or NaN.
|
|
// XXX Should standardize on 'i' format or 20 format.
|
|
};
|
|
|
|
// Returns NaN on error.
|
|
UInt160.method('parse_json', function (j) {
|
|
// Canonicalize and validate
|
|
|
|
switch (j) {
|
|
case undefined:
|
|
case "0":
|
|
case exports.consts.address_xns:
|
|
case exports.consts.uint160_xns:
|
|
case exports.consts.hex_xns:
|
|
this.value = 0;
|
|
break;
|
|
|
|
case "1":
|
|
case exports.consts.address_one:
|
|
case exports.consts.uint160_one:
|
|
case exports.consts.hex_one:
|
|
this.value = 1;
|
|
break;
|
|
|
|
default:
|
|
if ('string' !== typeof j) {
|
|
this.value = NaN;
|
|
}
|
|
else if (20 === j.length) {
|
|
this.value = j;
|
|
}
|
|
else if (40 === j.length) {
|
|
this.value = utils.hexToString(j);
|
|
}
|
|
else if (j[0] === "i") {
|
|
// XXX Do more checking convert to string.
|
|
|
|
this.value = j;
|
|
}
|
|
else {
|
|
this.value = NaN;
|
|
}
|
|
}
|
|
|
|
return this.value;
|
|
});
|
|
|
|
// Convert from internal form.
|
|
// XXX Json form should allow 0 and 1, C++ doesn't currently allow it.
|
|
UInt160.method('to_json', function () {
|
|
if ("0" === this.value) {
|
|
return exports.consts.hex_xns;
|
|
}
|
|
else if ("1" === this.value)
|
|
{
|
|
return exports.consts.hex_one;
|
|
}
|
|
else if (20 === this.value.length) {
|
|
return utils.stringToHex(this.value);
|
|
}
|
|
else
|
|
{
|
|
return this.value;
|
|
}
|
|
});
|
|
|
|
var Currency = function () {
|
|
// Internal form: 0 = XNS. 3 letter-code.
|
|
// XXX Internal should be 0 or hex.
|
|
|
|
// Json form:
|
|
// '', 'XNS', '0': 0
|
|
// 3-letter code: ...
|
|
// XXX Should support hex, C++ doesn't currently allow it.
|
|
}
|
|
|
|
// Returns NaN on error.
|
|
Currency.method('parse_json', function (j) {
|
|
if ("" === j || "0" === j || "XNS" === j) {
|
|
this.value = 0;
|
|
}
|
|
else if ('string' != typeof j || 3 !== j.length) {
|
|
this.value = NaN;
|
|
}
|
|
else {
|
|
this.value = j;
|
|
}
|
|
|
|
return this.value;
|
|
});
|
|
|
|
Currency.method('to_json', function () {
|
|
return this.value ? this.value : 'XNS';
|
|
});
|
|
|
|
Currency.method('to_human', function() {
|
|
return this.value ? this.value : 'XNS';
|
|
});
|
|
|
|
var Amount = function () {
|
|
// Json format:
|
|
// integer : XNS
|
|
// { 'value' : ..., 'currency' : ..., 'issuer' : ...}
|
|
|
|
this.value = 0;
|
|
this.offset = 0;
|
|
this.is_native = false;
|
|
this.is_negative = false;
|
|
|
|
this.currency = new Currency();
|
|
this.issuer = new UInt160();
|
|
|
|
}
|
|
|
|
// Convert only value to JSON text.
|
|
Amount.method('to_text', function() {
|
|
// XXX Needs to work for native and non-native.
|
|
return this.is_negative ? -this.value : this.value; // XXX Use biginteger.
|
|
});
|
|
|
|
Amount.method('to_json', function() {
|
|
if (this.is_native) {
|
|
return this.to_text();
|
|
}
|
|
else
|
|
{
|
|
return {
|
|
'value' : this.to_text(),
|
|
'currency' : this.currency.to_json(),
|
|
'issuer' : this.issuer.to_json(),
|
|
};
|
|
}
|
|
});
|
|
|
|
// Parse a native value.
|
|
Amount.method('parse_native', function() {
|
|
if ('integer' === typeof j) {
|
|
// XNS
|
|
this.value = x >= 0 ? j : -j; // XXX Use biginteger.
|
|
this.offset = 0;
|
|
this.is_native = true;
|
|
this.is_negative = x < 0;
|
|
}
|
|
else if ('string' === typeof j) {
|
|
this.value = x >= 0 ? j : -j; // XXX Use biginteger.
|
|
this.offset = 0;
|
|
this.is_native = true;
|
|
this.is_negative = x < 0;
|
|
}
|
|
else {
|
|
this.value = NaN;
|
|
}
|
|
});
|
|
|
|
// Parse a non-native value.
|
|
Amount.method('parse_value', function() {
|
|
if ('integer' === typeof j) {
|
|
this.value = x >= 0 ? j : -j; // XXX Use biginteger.
|
|
this.offset = 0;
|
|
this.is_native = false;
|
|
this.is_negative = x < 0;
|
|
}
|
|
else if ('string' === typeof j) {
|
|
this.value = x >= 0 ? j : -j; // XXX Use biginteger.
|
|
this.offset = 0;
|
|
this.is_native = false;
|
|
this.is_negative = x < 0;
|
|
}
|
|
else {
|
|
this.value = NaN;
|
|
}
|
|
});
|
|
|
|
// <-> j
|
|
Amount.method('parse_json', function(j) {
|
|
if ('object' === typeof j && j.currency) {
|
|
|
|
this.parse_value(j);
|
|
this.currency.parse_json(j.currency);
|
|
this.issuer.parse_json(j.issuer);
|
|
}
|
|
else {
|
|
this.parse_native(j);
|
|
this.currency = 0;
|
|
this.issuer = 0;
|
|
}
|
|
});
|
|
|
|
exports.UInt160 = UInt160;
|
|
exports.Currency = Currency;
|
|
exports.Amount = Amount;
|
|
|
|
exports.consts = {
|
|
'address_xns' : "iiiiiiiiiiiiiiiiiiiiihoLvTp",
|
|
'address_one' : "iiiiiiiiiiiiiiiiiiiiBZbvjr",
|
|
'currency_xns' : 0,
|
|
'currency_one' : 1,
|
|
'uint160_xns' : hexToString("0000000000000000000000000000000000000000"),
|
|
'uint160_one' : hexToString("0000000000000000000000000000000000000001"),
|
|
'hex_xns' : "0000000000000000000000000000000000000000",
|
|
'hex_one' : "0000000000000000000000000000000000000001",
|
|
};
|
|
|
|
// vim:sw=2:sts=2:ts=8
|