@yoroi/api
Version:
The API package of Yoroi SDK
77 lines (76 loc) • 2.43 kB
JavaScript
;
import { createTypeGuardFromSchema, fetcher, isRecord } from '@yoroi/common';
import { z } from 'zod';
import { asSubject } from '../translators/transformers/asSubject';
export const getOffChainMetadata = (baseUrl, request = fetcher) => {
const getTokenRegistryRecord = tokenId => request({
url: `${baseUrl}/metadata/${asSubject(tokenId)}`,
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}).then(response => {
if (!isRecord(response)) return Promise.resolve({
[tokenId]: emptyOffChainMetadataRecord
});
const parsedEntry = parseTokenRegistryEntry(response);
if (parsedEntry) {
return Promise.resolve({
[tokenId]: {
tokenRegistry: parsedEntry,
isValid: true
}
});
}
return Promise.resolve({
[tokenId]: {
tokenRegistry: response,
isValid: false
}
});
}).catch(_e => Promise.resolve({
[tokenId]: emptyOffChainMetadataRecord
}));
return tokenIds => Promise.all(tokenIds.map(tokenId => getTokenRegistryRecord(tokenId))).then(responses => {
const result = {};
responses.forEach(response => {
Object.assign(result, response);
});
return result;
});
};
const TokenRegistryPropertyNumberSchema = z.object({
signatures: z.array(z.object({
publicKey: z.string(),
signature: z.string()
})),
sequenceNumber: z.number(),
value: z.number().optional()
});
const TokenRegistryPropertyStringSchema = z.object({
signatures: z.array(z.object({
publicKey: z.string(),
signature: z.string()
})),
sequenceNumber: z.number(),
value: z.string().optional()
});
const TokenRegistryEntrySchema = z.object({
subject: z.string(),
name: TokenRegistryPropertyStringSchema,
description: TokenRegistryPropertyStringSchema.optional(),
policy: z.string().optional(),
logo: TokenRegistryPropertyStringSchema.optional(),
ticker: TokenRegistryPropertyStringSchema.optional(),
url: TokenRegistryPropertyStringSchema.optional(),
decimals: TokenRegistryPropertyNumberSchema.optional()
});
export const isTokenRegistryEntry = createTypeGuardFromSchema(TokenRegistryEntrySchema);
const parseTokenRegistryEntry = data => {
return isTokenRegistryEntry(data) ? data : undefined;
};
export const emptyOffChainMetadataRecord = {
tokenRegistry: undefined,
isValid: false
};
//# sourceMappingURL=token-offchain-metadata.js.map