@stricahq/typhonjs
Version:
Pure JS Cardano Wallet library
162 lines (161 loc) • 6.99 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPubKeyHashListFromNativeScript = exports.generateScriptDataHash = exports.sortTokens = exports.compareCanonically = exports.sanitizeMetadata = exports.getTokenDiff = exports.getUniqueTokens = void 0;
/* eslint-disable no-use-before-define */
const buffer_1 = require("buffer");
const cbors = __importStar(require("@stricahq/cbors"));
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const lodash_1 = __importDefault(require("lodash"));
const encoder_1 = require("./encoder");
const types_1 = require("../types");
const crypto_1 = require("./crypto");
/**
* returns unique tokens with sum of amount for same tokens
*/
const getUniqueTokens = (tokens) => {
return (0, lodash_1.default)(tokens)
.groupBy(({ policyId }) => policyId)
.map((policyMap, policyId) => (0, lodash_1.default)(policyMap)
.groupBy(({ assetName }) => assetName)
.map((assetArray, assetName) => ({
policyId,
assetName,
amount: assetArray.reduce((acc, asset) => acc.plus(asset.amount), new bignumber_js_1.default(0)),
}))
.value())
.flatten()
.value();
};
exports.getUniqueTokens = getUniqueTokens;
const getTokenDiff = (inputToken, outputTokens) => {
const negativeValueOutputTokens = lodash_1.default.map(outputTokens, (token) => (Object.assign(Object.assign({}, token), { amount: token.amount.negated() })));
return (0, exports.getUniqueTokens)(inputToken.concat(negativeValueOutputTokens)).filter((token) => token.amount.abs().gt(0));
};
exports.getTokenDiff = getTokenDiff;
const sanitizeMetadata = (metadata) => {
if (metadata instanceof Array) {
const ary = [];
for (const d of metadata) {
ary.push((0, exports.sanitizeMetadata)(d));
}
return ary;
}
if (typeof metadata === "string" || metadata instanceof buffer_1.Buffer) {
if (metadata.length > 64) {
throw new Error("string or buffer length invalid");
}
return metadata;
}
// TODO: map is also an object, hence check map first, maybe requires a proper fix
if (metadata instanceof Map) {
const map = new Map();
for (const [key, value] of metadata.entries()) {
map.set(key, (0, exports.sanitizeMetadata)(value));
}
return map;
}
if (metadata instanceof Object) {
const map = new Map();
for (const [key, value] of Object.entries(metadata)) {
map.set(key, (0, exports.sanitizeMetadata)(value));
}
return map;
}
return metadata;
};
exports.sanitizeMetadata = sanitizeMetadata;
const compareCanonically = (str1, str2) => {
if (str1.length !== str2.length) {
return str1.length - str2.length;
}
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
if (str1 < str2) {
return -1;
}
if (str1 > str2) {
return 1;
}
return 0;
};
exports.compareCanonically = compareCanonically;
const sortTokens = (tokens) => {
const sortedTokens = (0, lodash_1.default)(tokens)
.orderBy(["policyId", "assetName"], ["asc", "asc"])
.sort((token1, token2) => (0, exports.compareCanonically)(token1.assetName, token2.assetName))
.sort((token1, token2) => (0, exports.compareCanonically)(token1.policyId, token2.policyId))
.value();
return sortedTokens;
};
exports.sortTokens = sortTokens;
const generateScriptDataHash = (languageView, witnesses, isPlutusV1, isPlutusV2, isPlutusV3) => {
const encodedPlutusDataList = witnesses.get(types_1.WitnessType.PLUTUS_DATA);
const encodedRedeemers = witnesses.get(types_1.WitnessType.REDEEMER);
if (isPlutusV1 || isPlutusV2 || isPlutusV3) {
const langViewCbor = (0, encoder_1.encodeLanguageViews)(languageView, isPlutusV1, isPlutusV2, isPlutusV3);
const plutusDataCbor = (encodedPlutusDataList === null || encodedPlutusDataList === void 0 ? void 0 : encodedPlutusDataList.length)
? cbors.Encoder.encode(encodedPlutusDataList).toString("hex")
: "";
const redeemerCbor = encodedRedeemers
? cbors.Encoder.encode(encodedRedeemers).toString("hex")
: cbors.Encoder.encode([]).toString("hex");
const scriptData = buffer_1.Buffer.from(redeemerCbor + plutusDataCbor + langViewCbor, "hex");
return (0, crypto_1.hash32)(scriptData);
}
return undefined;
};
exports.generateScriptDataHash = generateScriptDataHash;
const getPubKeyHashFromNativeScripts = (nativeScripts) => {
let pubKeyHashList = [];
for (const ns of nativeScripts) {
const result = (0, exports.getPubKeyHashListFromNativeScript)(ns);
pubKeyHashList = lodash_1.default.concat(pubKeyHashList, lodash_1.default.flatten(result));
}
return pubKeyHashList;
};
const getPubKeyHashListFromNativeScript = (nativeScript) => {
let pubKeyHashList = [];
if (nativeScript.pubKeyHash) {
pubKeyHashList.push(nativeScript.pubKeyHash);
}
else if (nativeScript.all) {
const result = getPubKeyHashFromNativeScripts(nativeScript.all);
pubKeyHashList = lodash_1.default.concat(pubKeyHashList, lodash_1.default.flatten(result));
}
else if (nativeScript.any) {
const result = getPubKeyHashFromNativeScripts(nativeScript.any);
pubKeyHashList = lodash_1.default.concat(pubKeyHashList, lodash_1.default.flatten(result));
}
else if (nativeScript.n) {
const result = getPubKeyHashFromNativeScripts(nativeScript.k);
pubKeyHashList = lodash_1.default.concat(pubKeyHashList, lodash_1.default.flatten(result));
}
return pubKeyHashList;
};
exports.getPubKeyHashListFromNativeScript = getPubKeyHashListFromNativeScript;