Skip to content

Commit 5cd5e1d

Browse files
committed
fix(cardano-services-client): enhance token metadata mapping to include on-chain metadata fields
1 parent 053c886 commit 5cd5e1d

File tree

2 files changed

+95
-3
lines changed

2 files changed

+95
-3
lines changed

packages/cardano-services-client/src/AssetInfoProvider/BlockfrostAssetProvider.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,16 +116,16 @@ export class BlockfrostAssetProvider extends BlockfrostProvider implements Asset
116116
private mapTokenMetadata(assetId: Cardano.AssetId, asset: Responses['asset']): Asset.TokenMetadata {
117117
return {
118118
assetId,
119-
decimals: asset.metadata?.decimals || undefined,
119+
decimals: asset.metadata?.decimals || (typeof asset.onchain_metadata?.decimals === 'number' ? asset.onchain_metadata.decimals : undefined),
120120
desc: this.metadatumToString(
121121
asset.metadata?.description || (asset.onchain_metadata?.description as string | string[] | undefined)
122122
),
123123
icon: this.metadatumToString(
124124
asset.metadata?.logo || (asset.onchain_metadata?.image as string | string[] | undefined)
125125
),
126126
name: asset.metadata?.name || (asset.onchain_metadata?.name as string | undefined),
127-
ticker: asset.metadata?.ticker || undefined,
128-
url: asset.metadata?.url || undefined,
127+
ticker: asset.metadata?.ticker || (asset.onchain_metadata?.ticker as string | undefined),
128+
url: asset.metadata?.url || (asset.onchain_metadata?.url as string | undefined),
129129
version: '1.0'
130130
};
131131
}

packages/cardano-services-client/test/AssetInfoProvider/BlockfrostAssetProvider.test.ts

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,5 +214,97 @@ describe('BlockfrostAssetProvider', () => {
214214

215215
expect(response.nftMetadata!.version).toBe('2.0');
216216
});
217+
218+
describe('onchain_metadata undefined values', () => {
219+
const mockedAssetIdOnChainMetadata = Cardano.AssetId(
220+
'ecbe846aa1a535579d67f9480fa6173b64d7e239df0460eba36e3ad00014df1053617475726e'
221+
);
222+
223+
const baseResponse = {
224+
asset: mockedAssetIdOnChainMetadata,
225+
policy_id: 'ecbe846aa1a535579d67f9480fa6173b64d7e239df0460eba36e3ad0',
226+
asset_name: '0014df1053617475726e',
227+
fingerprint: 'asset1lnu3hw2pjw8xfprg7722mh0yu2vfzvk8ta60h0',
228+
quantity: '100000000000000',
229+
initial_mint_tx_hash: 'dcdd8ed32a71523a8393caab9d657964e50648fe0277de77add22b839e6fdb88',
230+
mint_or_burn_count: 1,
231+
onchain_metadata: {
232+
url: 'ipfs://Qmc2RWQxCmAaXn7YGZsXCcs2J5',
233+
logo: 'ipfs://Qmc2RWQxCmAaXn7YGZsXCcs2J5uwW8qQwYzmjh1gUiZBWA',
234+
name: 'Saturn',
235+
ticker: 'SATURN',
236+
decimals: 6,
237+
mediaType: '49696d6167652f706e67',
238+
description:
239+
'Saturn is the governance token for the Saturn Swap protocol, a fast and simple decentralized exchange on the Cardano blockchain. https://saturnswap.io/'
240+
},
241+
onchain_metadata_standard: 'CIP68v1',
242+
onchain_metadata_extra: 'd8799fff',
243+
metadata: null
244+
};
245+
246+
test('handles undefined onchain_metadata.decimals', async () => {
247+
const responseWithUndefinedDecimals = {
248+
...baseResponse,
249+
onchain_metadata: {
250+
...baseResponse.onchain_metadata,
251+
decimals: undefined
252+
}
253+
};
254+
255+
mockResponses(request, [[`assets/${mockedAssetIdOnChainMetadata}`, responseWithUndefinedDecimals]]);
256+
257+
const response = await provider.getAsset({
258+
assetId: mockedAssetIdOnChainMetadata,
259+
extraData: { tokenMetadata: true }
260+
});
261+
262+
expect(response.tokenMetadata!.decimals).toBeUndefined();
263+
expect(response.tokenMetadata!.ticker).toBe('SATURN');
264+
expect(response.tokenMetadata!.url).toBe('ipfs://Qmc2RWQxCmAaXn7YGZsXCcs2J5');
265+
});
266+
267+
test('handles undefined onchain_metadata.ticker', async () => {
268+
const responseWithUndefinedTicker = {
269+
...baseResponse,
270+
onchain_metadata: {
271+
...baseResponse.onchain_metadata,
272+
ticker: undefined
273+
}
274+
};
275+
276+
mockResponses(request, [[`assets/${mockedAssetIdOnChainMetadata}`, responseWithUndefinedTicker]]);
277+
278+
const response = await provider.getAsset({
279+
assetId: mockedAssetIdOnChainMetadata,
280+
extraData: { tokenMetadata: true }
281+
});
282+
283+
expect(response.tokenMetadata!.decimals).toBe(6);
284+
expect(response.tokenMetadata!.ticker).toBeUndefined();
285+
expect(response.tokenMetadata!.url).toBe('ipfs://Qmc2RWQxCmAaXn7YGZsXCcs2J5');
286+
});
287+
288+
test('handles undefined onchain_metadata.url', async () => {
289+
const responseWithUndefinedUrl = {
290+
...baseResponse,
291+
onchain_metadata: {
292+
...baseResponse.onchain_metadata,
293+
url: undefined
294+
}
295+
};
296+
297+
mockResponses(request, [[`assets/${mockedAssetIdOnChainMetadata}`, responseWithUndefinedUrl]]);
298+
299+
const response = await provider.getAsset({
300+
assetId: mockedAssetIdOnChainMetadata,
301+
extraData: { tokenMetadata: true }
302+
});
303+
304+
expect(response.tokenMetadata!.decimals).toBe(6);
305+
expect(response.tokenMetadata!.ticker).toBe('SATURN');
306+
expect(response.tokenMetadata!.url).toBeUndefined();
307+
});
308+
});
217309
});
218310
});

0 commit comments

Comments
 (0)