@yoroi/resolver
Version:
Yoroi domain resolver
88 lines (83 loc) • 3.81 kB
JavaScript
export const validateCNSUserRecord = cnsUserRecord => {
const constructorCorrect = cnsUserRecord.constructor === 0;
const numberOfFieldsCorrect = cnsUserRecord.fields.length === 3;
/**
* TODO: Validate the following:
* 1. virtualDomains is an AssocMap
* 2. socialProfiles is an AssocMap
* 3. otherRecords is an AssocMap
* 4. Value of virtualDomains is an Address
* 5. All other key value is a BuiltinByteString
*/
return constructorCorrect && numberOfFieldsCorrect;
};
export const validateExpiry = metadata => {
const {
expiry
} = metadata;
const millisecondsNow = Date.now();
return expiry > millisecondsNow;
};
export const validateVirtualSubdomainEnabled = metadata => {
const {
virtualSubdomainEnabled
} = metadata;
return virtualSubdomainEnabled === 'Enabled';
};
/* istanbul ignore next */
export const stringToHex = str => Buffer.from(str, 'utf8').toString('hex');
/* istanbul ignore next */
export const hexToString = hex => Buffer.from(hex, 'hex').toString('utf8');
export const parseAssocMapAsync = async function (assocMapVal, itemParser) {
let limit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5;
const parsedAssocMap = [];
const promises = [];
for (let i = 0; i < limit; i += 1) {
if (i >= assocMapVal.map.length) continue;
const mapItem = assocMapVal.map[i];
if (!mapItem) throw new Error('bad data');
promises.push(itemParser(mapItem.v));
}
const valueArray = await Promise.all(promises);
for (let i = 0; i < limit; i += 1) {
if (i >= assocMapVal.map.length) continue;
const mapItem = assocMapVal.map[i];
// fixed in ts 5
/* istanbul ignore next */
if (!mapItem) throw new Error('bad data');
const key = hexToString(mapItem.k.bytes);
const value = valueArray[i];
if (!value) throw new Error('bad data');
parsedAssocMap.push([key, value]);
}
return parsedAssocMap;
};
export const objToHex = async (obj, csl) => {
const plutusData = await csl.PlutusData.fromJson(JSON.stringify(obj), 1);
const result = await plutusData.toHex();
return result;
};
export const parsePlutusAddressToBech32 = async (plutusHex, csl, networkId) => {
const cslPlutusDataAddress = await csl.PlutusData.fromHex(plutusHex);
const plutusDataAddressJson = await cslPlutusDataAddress.toJson(1);
const plutusDataAddressObject = JSON.parse(plutusDataAddressJson);
const plutusDataPaymentKeyObject = plutusDataAddressObject.fields[0];
const plutusDataStakeKeyObject = plutusDataAddressObject.fields[1];
const cslPaymentKeyHash = plutusDataPaymentKeyObject.fields[0].bytes;
// Take into account whether the hash is a PubKeyHash or ScriptHash
const credentialKeyHashBytes = Buffer.from(cslPaymentKeyHash, 'hex');
const pubKeyCredentialKeyHash = await csl.Ed25519KeyHash.fromBytes(credentialKeyHashBytes);
const pubKeyCredential = await csl.Credential.fromKeyhash(pubKeyCredentialKeyHash);
const scriptCredentialKeyHash = await csl.ScriptHash.fromBytes(credentialKeyHashBytes);
const scriptCredential = await csl.Credential.fromScripthash(scriptCredentialKeyHash);
const cslPaymentCredential = plutusDataPaymentKeyObject.constructor === 0 ? pubKeyCredential : scriptCredential;
let bech32Addr = '';
// Parsing address according to whether it has a stake key
const cslStakeKeyHash = await csl.Ed25519KeyHash.fromBytes(Buffer.from(plutusDataStakeKeyObject.fields[0].fields[0].fields[0].bytes, 'hex'));
const stakeCredential = await csl.Credential.fromKeyhash(cslStakeKeyHash);
const cslBaseAddress = await csl.BaseAddress.new(networkId, cslPaymentCredential, stakeCredential);
const cslAddress = await cslBaseAddress.toAddress();
bech32Addr = await cslAddress.toBech32(undefined);
return bech32Addr;
};
//# sourceMappingURL=utils.js.map