Skip to content

Commit

Permalink
feat(core): add 'strict' option to NftMetadata.fromMetadatum
Browse files Browse the repository at this point in the history
also refactor NftMetadata.fromMetadatum tests

BREAKING CHANGE: NftMetadata.fromMetadatum use '' as default name
  • Loading branch information
mkazlauskas committed May 8, 2024
1 parent 389e12a commit 012e6cc
Show file tree
Hide file tree
Showing 2 changed files with 166 additions and 160 deletions.
34 changes: 20 additions & 14 deletions packages/core/src/Asset/NftMetadata/fromMetadatum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,39 +96,45 @@ const getAssetMetadata = (policy: Cardano.MetadatumMap, assetName: Cardano.Asset
})()
);

type AssetIdParts = Pick<AssetInfo, 'policyId' | 'name'>;
const getName = (assetMetadata: Cardano.MetadatumMap, version: string, asset: AssetIdParts, logger: Logger) => {
const name = asString(assetMetadata.get('name'));
if (name) return name;
if (version === '1.0') {
try {
return AssetName.toUTF8(asset.name);
} catch (error) {
logger.warn(error);
}
}
};

/**
* @param asset try to parse NftMetadata for this asset
* @param metadata transaction metadata (see CIP-0025)
* @param logger logger to use
*/
// eslint-disable-next-line complexity
export const fromMetadatum = (
asset: Pick<AssetInfo, 'policyId' | 'name'>,
asset: AssetIdParts,
metadata: Cardano.TxMetadata | undefined,
logger: Logger
logger: Logger,
strict = false
): NftMetadata | null => {
const cip25Metadata = metadata?.get(721n);
if (!cip25Metadata) return null;
const cip25MetadatumMap = asMetadatumMap(cip25Metadata);
if (!cip25MetadatumMap) return null;
const policy = getPolicyMetadata(cip25MetadatumMap, asset.policyId);
if (!policy) return null;
const version = asString(policy.get('version')) || '1.0';
const assetMetadata = getAssetMetadata(policy, asset.name);
if (!assetMetadata) return null;
const version = asString(policy.get('version')) || '1.0';
let name = asString(assetMetadata.get('name'));
const name = getName(assetMetadata, version, asset, logger);
const image = metadatumToString(assetMetadata.get('image'));
const assetId = Cardano.AssetId.fromParts(asset.policyId, asset.name);

if (version === '1.0' && !name) {
try {
name = AssetName.toUTF8(asset.name);
} catch (error) {
logger.warn(error);
}
}

if (!name || !image) {
if ((strict && !name) || !image) {
logger.warn(missingFieldLogMessage(!name ? 'name' : 'image', assetId, true));
return null;
}
Expand All @@ -142,7 +148,7 @@ export const fromMetadatum = (
files: files?.map((file) => mapFile(file, assetId, logger)).filter(isNotNil),
image: Uri(image),
mediaType: mediaType ? ImageMediaType(mediaType) : undefined,
name,
name: name || '',
otherProperties: mapOtherProperties(assetMetadata, ['name', 'image', 'mediaType', 'description', 'files']),
version
};
Expand Down

0 comments on commit 012e6cc

Please sign in to comment.