Skip to content

Commit 948d377

Browse files
Merge pull request #769 from input-output-hk/feat/plutus-data-serialization
feat: nft metadata service
2 parents 6ed8510 + 78460d3 commit 948d377

File tree

333 files changed

+27333
-11802
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

333 files changed

+27333
-11802
lines changed

.github/workflows/continuous-integration-e2e.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ env:
2929

3030
on:
3131
pull_request:
32-
branches: ['master']
3332
push:
3433
branches: ['master']
3534
tags: ['*.*.*']

.github/workflows/continuous-integration-unit-tests.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ env:
66

77
on:
88
pull_request:
9-
branches: ['master']
109
push:
1110
branches: ['master']
1211
tags: ['*.*.*']

packages/cardano-services-client/src/HttpProvider.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import { HttpProviderConfigPaths, Provider, ProviderError, ProviderFailure } from '@cardano-sdk/core';
33
import { Logger } from 'ts-log';
44
import { fromSerializableObject, toSerializableObject } from '@cardano-sdk/util';
5-
import { apiVersion as staticApiVersion } from './version';
65
import axios, { AxiosAdapter, AxiosRequestConfig, AxiosResponseTransformer } from 'axios';
76
import packageJson from '../package.json';
87

@@ -104,7 +103,7 @@ export const createHttpProvider = <T extends Provider>({
104103
const req: AxiosRequestConfig = {
105104
...axiosOptions,
106105
adapter,
107-
baseURL: `${baseUrl.replace(/\/$/, '')}/v${staticApiVersion.root}/${serviceSlug}`,
106+
baseURL: `${baseUrl.replace(/\/$/, '')}/v${apiVersion}/${serviceSlug}`,
108107
data: { ...args[0] },
109108
headers: {
110109
...axiosOptions?.headers,
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// auto-generated using ../scripts/createVersionSource.js
22
export const apiVersion = {
33
assetInfo: '1.0.0',
4-
chainHistory: '1.0.0',
4+
chainHistory: '2.0.0',
55
handle: '1.0.0',
66
networkInfo: '1.0.0',
77
rewards: '1.0.0',
88
root: '1.0.0',
99
stakePool: '1.0.0',
10-
txSubmit: '1.0.0',
11-
utxo: '1.0.0'
10+
txSubmit: '2.0.0',
11+
utxo: '2.0.0'
1212
};

packages/cardano-services-client/test/HttpProvider.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import path from 'path';
1111

1212
const packageJson = require(path.join(__dirname, '..', 'package.json'));
1313

14-
type ComplexArg2 = { map: Map<string, Buffer> };
15-
type ComplexResponse = Map<bigint, Buffer>[];
14+
type ComplexArg2 = { map: Map<string, Uint8Array> };
15+
type ComplexResponse = Map<bigint, Uint8Array>[];
1616
interface TestProvider extends Provider {
1717
noArgsEmptyReturn(): Promise<void>;
1818
complexArgsAndReturn({ arg1, arg2 }: { arg1: bigint; arg2: ComplexArg2 }): Promise<ComplexResponse>;
@@ -95,8 +95,8 @@ describe('createHttpProvider', () => {
9595
describe('method with complex args and return', () => {
9696
it('serializes args and deserializes response using core serializableObject', async () => {
9797
const arg1 = 123n;
98-
const arg2: ComplexArg2 = { map: new Map([['key', Buffer.from('abc')]]) };
99-
const expectedResponse: ComplexResponse = [new Map([[1234n, Buffer.from('response data')]])];
98+
const arg2: ComplexArg2 = { map: new Map([['key', new Uint8Array(Buffer.from('abc'))]]) };
99+
const expectedResponse: ComplexResponse = [new Map([[1234n, new Uint8Array(Buffer.from('response data'))]])];
100100
const provider = createTxSubmitProviderClient();
101101
closeServer = await createStubHttpProviderServer(port, stubProviderPaths.complexArgsAndReturn, (req, res) => {
102102
expect(fromSerializableObject(req.body)).toEqual({ arg1, arg2 });
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
22
"assetInfo": "1.0.0",
3-
"chainHistory": "1.0.0",
3+
"chainHistory": "2.0.0",
44
"handle": "1.0.0",
55
"networkInfo": "1.0.0",
66
"rewards": "1.0.0",
77
"root": "1.0.0",
88
"stakePool": "1.0.0",
9-
"txSubmit": "1.0.0",
10-
"utxo": "1.0.0"
9+
"txSubmit": "2.0.0",
10+
"utxo": "2.0.0"
1111
}

packages/cardano-services/src/Asset/DbSyncAssetProvider/AssetBuilder.ts

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Cardano } from '@cardano-sdk/core';
2-
import { LastMintTxModel, MultiAssetHistoryModel, MultiAssetModel } from './types';
2+
import { LastMintTxModel, MultiAssetModel } from './types';
33
import { Logger } from 'ts-log';
44
import { Pool } from 'pg';
55
import Queries from './queries';
@@ -32,14 +32,4 @@ export class AssetBuilder {
3232
});
3333
return result.rows[0];
3434
}
35-
36-
public async queryMultiAssetHistory(policyId: Cardano.PolicyId, name: Cardano.AssetName) {
37-
this.#logger.debug('About to query multi asset history', { name, policyId });
38-
const result = await this.#db.query<MultiAssetHistoryModel>({
39-
name: 'find_multi_asset_history',
40-
text: Queries.findMultiAssetHistory,
41-
values: [Buffer.from(policyId, 'hex'), Buffer.from(name, 'hex')]
42-
});
43-
return result.rows;
44-
}
4535
}

packages/cardano-services/src/Asset/DbSyncAssetProvider/DbSyncAssetProvider.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
import { AssetBuilder } from './AssetBuilder';
1212
import { AssetPolicyIdAndName, NftMetadataService, TokenMetadataService } from '../types';
1313
import { DB_CACHE_TTL_DEFAULT, InMemoryCache, NoCache } from '../../InMemoryCache';
14-
import { DbSyncProvider, DbSyncProviderDependencies } from '../../util/DbSyncProvider';
14+
import { DbSyncProvider, DbSyncProviderDependencies } from '../../util';
1515

1616
/**
1717
* Properties that are need to create DbSyncAssetProvider
@@ -74,7 +74,6 @@ export class DbSyncAssetProvider extends DbSyncProvider() implements AssetProvid
7474
async getAsset({ assetId, extraData }: GetAssetArgs) {
7575
const assetInfo = await this.#getAssetInfo(assetId);
7676

77-
if (extraData?.history) await this.loadHistory(assetInfo);
7877
if (extraData?.nftMetadata) assetInfo.nftMetadata = await this.#getNftMetadata(assetInfo);
7978
if (extraData?.tokenMetadata) {
8079
try {
@@ -133,15 +132,6 @@ export class DbSyncAssetProvider extends DbSyncProvider() implements AssetProvid
133132
return Promise.all(assetIds.map((_) => getAssetInfo(_)));
134133
}
135134

136-
private async loadHistory(assetInfo: Asset.AssetInfo) {
137-
assetInfo.history = (
138-
await this.#builder.queryMultiAssetHistory(assetInfo.policyId, assetInfo.name)
139-
).map<Asset.AssetMintOrBurn>(({ hash, quantity }) => ({
140-
quantity: BigInt(quantity),
141-
transactionId: hash.toString('hex') as unknown as Cardano.TransactionId
142-
}));
143-
}
144-
145135
async #getNftMetadata(asset: AssetPolicyIdAndName): Promise<Asset.NftMetadata | null> {
146136
return this.#cache.get(
147137
nftMetadataCacheKey(Cardano.AssetId.fromParts(asset.policyId, asset.name)),
@@ -166,9 +156,8 @@ export class DbSyncAssetProvider extends DbSyncProvider() implements AssetProvid
166156
const supply = BigInt(multiAsset.sum);
167157
// Backwards compatibility
168158
const quantity = supply;
169-
const mintOrBurnCount = Number(multiAsset.count);
170159

171-
return { assetId, fingerprint, mintOrBurnCount, name, policyId, quantity, supply };
160+
return { assetId, fingerprint, name, policyId, quantity, supply };
172161
});
173162
}
174163
}

packages/cardano-services/src/Asset/DbSyncNftMetadataService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,6 @@ export class DbSyncNftMetadataService implements NftMetadataService {
3939
this.#logger.debug('Querying tx metadata', lastMintedTxId);
4040
const metadatas = await this.#metadataService.queryTxMetadataByHashes([lastMintedTxId]);
4141
const metadata = metadatas.get(lastMintedTxId);
42-
return Asset.util.metadatumToCip25(assetInfo, metadata, this.#logger);
42+
return Asset.NftMetadata.fromMetadatum(assetInfo, metadata, this.#logger);
4343
}
4444
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { Asset, Cardano } from '@cardano-sdk/core';
2+
import { AssetPolicyIdAndName, NftMetadataService } from './types';
3+
import { NftMetadataEntity } from '@cardano-sdk/projection-typeorm';
4+
import { TypeormProviderDependencies, TypeormService } from '../util';
5+
6+
export class TypeOrmNftMetadataService extends TypeormService implements NftMetadataService {
7+
constructor({ connectionConfig$, logger, entities }: TypeormProviderDependencies) {
8+
super('TypeOrmNftMetadataService', { connectionConfig$, entities, logger });
9+
}
10+
11+
async getNftMetadata(assetInfo: AssetPolicyIdAndName): Promise<Asset.NftMetadata | null> {
12+
const assetId = Cardano.AssetId.fromParts(assetInfo.policyId, assetInfo.name);
13+
const stringAssetName = Buffer.from(assetInfo.name, 'hex').toString('utf8');
14+
return this.withDataSource(async (dataSource) => {
15+
const queryRunner = dataSource.createQueryRunner();
16+
const nftMetadataRepository = queryRunner.manager.getRepository(NftMetadataEntity);
17+
18+
const asset = await nftMetadataRepository.findOneBy({
19+
name: stringAssetName,
20+
userTokenAsset: { id: assetId }
21+
});
22+
23+
if (!asset) {
24+
return null;
25+
}
26+
27+
return {
28+
image: asset.image,
29+
name: asset.name,
30+
...(asset.description && { description: asset.description }),
31+
...(asset.files && { files: asset.files }),
32+
...(asset.mediaType && { mediaType: asset.mediaType }),
33+
...(asset.otherProperties && { otherProperties: asset.otherProperties })
34+
} as unknown as Asset.NftMetadata;
35+
});
36+
}
37+
}

0 commit comments

Comments
 (0)