@taquito/michelson-encoder
Version:
converts michelson data and types into convenient JS/TS objects
119 lines (118 loc) • 3.53 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AddressToken = exports.AddressValidationError = void 0;
const token_1 = require("../token");
const utils_1 = require("@taquito/utils");
/**
* @category Error
* @description Error that indicates a failure happening when parsing encoding/executing an Address
*/
class AddressValidationError extends token_1.TokenValidationError {
constructor(value, token, message) {
super(value, token, message);
this.value = value;
this.token = token;
this.name = 'AddressValidationError';
}
}
exports.AddressValidationError = AddressValidationError;
class AddressToken extends token_1.ComparableToken {
constructor(val, idx, fac) {
super(val, idx, fac);
this.val = val;
this.idx = idx;
this.fac = fac;
}
ToBigMapKey(val) {
const decoded = (0, utils_1.b58decode)(val);
return {
key: { bytes: decoded },
type: { prim: 'bytes' },
};
}
/**
* @throws {@link AddressValidationError}
*/
validate(value) {
if ((0, utils_1.validateAddress)(value) !== utils_1.ValidationResult.VALID) {
throw new AddressValidationError(value, this, `Address is not valid: ${JSON.stringify(value)}`);
}
}
/**
* @throws {@link AddressValidationError}
*/
Encode(args) {
const val = args.pop();
this.validate(val);
return { string: val };
}
/**
* @throws {@link AddressValidationError}
*/
EncodeObject(val, semantic) {
this.validate(val);
if (semantic && semantic[AddressToken.prim]) {
return semantic[AddressToken.prim](val);
}
return { string: val };
}
/**
* @throws {@link AddressValidationError}
*/
Execute(val) {
if (val.string) {
return val.string;
}
if (!val.bytes) {
throw new AddressValidationError(val, this, `cannot be missing both string and bytes: ${JSON.stringify(val)}`);
}
return (0, utils_1.encodeAddress)(val.bytes);
}
/**
* @deprecated ExtractSchema has been deprecated in favor of generateSchema
*
*/
ExtractSchema() {
return AddressToken.prim;
}
generateSchema() {
return {
__michelsonType: AddressToken.prim,
schema: AddressToken.prim,
};
}
/**
* @throws {@link AddressValidationError}
*/
ToKey({ bytes, string }) {
if (string) {
return string;
}
if (!bytes) {
throw new AddressValidationError({ bytes, string }, this, `cannot be missing both string and bytes ${JSON.stringify({ string, bytes })}`);
}
return (0, utils_1.encodeAddress)(bytes);
}
compare(address1, address2) {
const isImplicit = (address) => {
return address.startsWith('tz');
};
const implicit1 = isImplicit(address1);
const implicit2 = isImplicit(address2);
if (implicit1 && !implicit2) {
return -1;
}
else if (implicit2 && !implicit1) {
return 1;
}
return super.compare(address1, address2);
}
findAndReturnTokens(tokenToFind, tokens) {
if (AddressToken.prim === tokenToFind) {
tokens.push(this);
}
return tokens;
}
}
exports.AddressToken = AddressToken;
AddressToken.prim = 'address';