diamante-base
Version:
Low-level support library for the Diamante network.
322 lines (303 loc) • 11.1 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Asset = void 0;
var _util = require("./util/util");
var _xdr = _interopRequireDefault(require("./xdr"));
var _keypair = require("./keypair");
var _strkey = require("./strkey");
var _hashing = require("./hashing");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
/**
* Asset class represents an asset, either the native asset (`XLM`)
* or an asset code / issuer account ID pair.
*
* An asset code describes an asset code and issuer pair. In the case of the native
* asset XLM, the issuer will be null.
*
* @constructor
* @param {string} code - The asset code.
* @param {string} issuer - The account ID of the issuer.
*/
var Asset = exports.Asset = /*#__PURE__*/function () {
function Asset(code, issuer) {
_classCallCheck(this, Asset);
if (!/^[a-zA-Z0-9]{1,12}$/.test(code)) {
throw new Error('Asset code is invalid (maximum alphanumeric, 12 characters at max)');
}
if (String(code).toLowerCase() !== 'xlm' && !issuer) {
throw new Error('Issuer cannot be null');
}
if (issuer && !_strkey.StrKey.isValidEd25519PublicKey(issuer)) {
throw new Error('Issuer is invalid');
}
if (String(code).toLowerCase() === 'xlm') {
// transform all xLM, Xlm, etc. variants -> XLM
this.code = 'XLM';
} else {
this.code = code;
}
this.issuer = issuer;
}
/**
* Returns an asset object for the native asset.
* @Return {Asset}
*/
return _createClass(Asset, [{
key: "toXDRObject",
value:
/**
* Returns the xdr.Asset object for this asset.
* @returns {xdr.Asset} XDR asset object
*/
function toXDRObject() {
return this._toXDRObject(_xdr["default"].Asset);
}
/**
* Returns the xdr.ChangeTrustAsset object for this asset.
* @returns {xdr.ChangeTrustAsset} XDR asset object
*/
}, {
key: "toChangeTrustXDRObject",
value: function toChangeTrustXDRObject() {
return this._toXDRObject(_xdr["default"].ChangeTrustAsset);
}
/**
* Returns the xdr.TrustLineAsset object for this asset.
* @returns {xdr.TrustLineAsset} XDR asset object
*/
}, {
key: "toTrustLineXDRObject",
value: function toTrustLineXDRObject() {
return this._toXDRObject(_xdr["default"].TrustLineAsset);
}
/**
* Returns the would-be contract ID (`C...` format) for this asset on a given
* network.
*
* @param {string} networkPassphrase indicates which network the contract
* ID should refer to, since every network will have a unique ID for the
* same contract (see {@link Networks} for options)
*
* @returns {string} the strkey-encoded (`C...`) contract ID for this asset
*
* @warning This makes no guarantee that this contract actually *exists*.
*/
}, {
key: "contractId",
value: function contractId(networkPassphrase) {
var networkId = (0, _hashing.hash)(Buffer.from(networkPassphrase));
var preimage = _xdr["default"].HashIdPreimage.envelopeTypeContractId(new _xdr["default"].HashIdPreimageContractId({
networkId: networkId,
contractIdPreimage: _xdr["default"].ContractIdPreimage.contractIdPreimageFromAsset(this.toXDRObject())
}));
return _strkey.StrKey.encodeContract((0, _hashing.hash)(preimage.toXDR()));
}
/**
* Returns the xdr object for this asset.
* @param {xdr.Asset | xdr.ChangeTrustAsset} xdrAsset - The asset xdr object.
* @returns {xdr.Asset | xdr.ChangeTrustAsset | xdr.TrustLineAsset} XDR Asset object
*/
}, {
key: "_toXDRObject",
value: function _toXDRObject() {
var xdrAsset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _xdr["default"].Asset;
if (this.isNative()) {
return xdrAsset.assetTypeNative();
}
var xdrType;
var xdrTypeString;
if (this.code.length <= 4) {
xdrType = _xdr["default"].AlphaNum4;
xdrTypeString = 'assetTypeCreditAlphanum4';
} else {
xdrType = _xdr["default"].AlphaNum12;
xdrTypeString = 'assetTypeCreditAlphanum12';
}
// pad code with null bytes if necessary
var padLength = this.code.length <= 4 ? 4 : 12;
var paddedCode = this.code.padEnd(padLength, '\0');
// eslint-disable-next-line new-cap
var assetType = new xdrType({
assetCode: paddedCode,
issuer: _keypair.Keypair.fromPublicKey(this.issuer).xdrAccountId()
});
return new xdrAsset(xdrTypeString, assetType);
}
/**
* @returns {string} Asset code
*/
}, {
key: "getCode",
value: function getCode() {
if (this.code === undefined) {
return undefined;
}
return String(this.code);
}
/**
* @returns {string} Asset issuer
*/
}, {
key: "getIssuer",
value: function getIssuer() {
if (this.issuer === undefined) {
return undefined;
}
return String(this.issuer);
}
/**
* @see [Assets concept](https://developers.diamante.org/docs/glossary/assets/)
* @returns {string} Asset type. Can be one of following types:
*
* - `native`,
* - `credit_alphanum4`,
* - `credit_alphanum12`, or
* - `unknown` as the error case (which should never occur)
*/
}, {
key: "getAssetType",
value: function getAssetType() {
switch (this.getRawAssetType()) {
case _xdr["default"].AssetType.assetTypeNative():
return 'native';
case _xdr["default"].AssetType.assetTypeCreditAlphanum4():
return 'credit_alphanum4';
case _xdr["default"].AssetType.assetTypeCreditAlphanum12():
return 'credit_alphanum12';
default:
return 'unknown';
}
}
/**
* @returns {xdr.AssetType} the raw XDR representation of the asset type
*/
}, {
key: "getRawAssetType",
value: function getRawAssetType() {
if (this.isNative()) {
return _xdr["default"].AssetType.assetTypeNative();
}
if (this.code.length <= 4) {
return _xdr["default"].AssetType.assetTypeCreditAlphanum4();
}
return _xdr["default"].AssetType.assetTypeCreditAlphanum12();
}
/**
* @returns {boolean} true if this asset object is the native asset.
*/
}, {
key: "isNative",
value: function isNative() {
return !this.issuer;
}
/**
* @param {Asset} asset Asset to compare
* @returns {boolean} true if this asset equals the given asset.
*/
}, {
key: "equals",
value: function equals(asset) {
return this.code === asset.getCode() && this.issuer === asset.getIssuer();
}
}, {
key: "toString",
value: function toString() {
if (this.isNative()) {
return 'native';
}
return "".concat(this.getCode(), ":").concat(this.getIssuer());
}
/**
* Compares two assets according to the criteria:
*
* 1. First compare the type (native < alphanum4 < alphanum12).
* 2. If the types are equal, compare the assets codes.
* 3. If the asset codes are equal, compare the issuers.
*
* @param {Asset} assetA - the first asset
* @param {Asset} assetB - the second asset
* @returns {number} `-1` if assetA < assetB, `0` if assetA == assetB, `1` if assetA > assetB.
*
* @static
* @memberof Asset
*/
}], [{
key: "native",
value: function native() {
return new Asset('XLM');
}
/**
* Returns an asset object from its XDR object representation.
* @param {xdr.Asset} assetXdr - The asset xdr object.
* @returns {Asset}
*/
}, {
key: "fromOperation",
value: function fromOperation(assetXdr) {
var anum;
var code;
var issuer;
switch (assetXdr["switch"]()) {
case _xdr["default"].AssetType.assetTypeNative():
return this["native"]();
case _xdr["default"].AssetType.assetTypeCreditAlphanum4():
anum = assetXdr.alphaNum4();
/* falls through */
case _xdr["default"].AssetType.assetTypeCreditAlphanum12():
anum = anum || assetXdr.alphaNum12();
issuer = _strkey.StrKey.encodeEd25519PublicKey(anum.issuer().ed25519());
code = (0, _util.trimEnd)(anum.assetCode(), '\0');
return new this(code, issuer);
default:
throw new Error("Invalid asset type: ".concat(assetXdr["switch"]().name));
}
}
}, {
key: "compare",
value: function compare(assetA, assetB) {
if (!assetA || !(assetA instanceof Asset)) {
throw new Error('assetA is invalid');
}
if (!assetB || !(assetB instanceof Asset)) {
throw new Error('assetB is invalid');
}
if (assetA.equals(assetB)) {
return 0;
}
// Compare asset types.
var xdrAtype = assetA.getRawAssetType().value;
var xdrBtype = assetB.getRawAssetType().value;
if (xdrAtype !== xdrBtype) {
return xdrAtype < xdrBtype ? -1 : 1;
}
// Compare asset codes.
var result = asciiCompare(assetA.getCode(), assetB.getCode());
if (result !== 0) {
return result;
}
// Compare asset issuers.
return asciiCompare(assetA.getIssuer(), assetB.getIssuer());
}
}]);
}();
/**
* Compares two ASCII strings in lexographic order with uppercase precedence.
*
* @param {string} a - the first string to compare
* @param {string} b - the second
* @returns {number} like all `compare()`s:
* -1 if `a < b`, 0 if `a == b`, and 1 if `a > b`
*
* @warning No type-checks are done on the parameters
*/
function asciiCompare(a, b) {
return Buffer.compare(Buffer.from(a, 'ascii'), Buffer.from(b, 'ascii'));
}
;