Skip to main content

NFT Models Examples

These examples focus on connector contracts and shared request models so multiple implementations can follow the same API surface.

NftConnectorFactory

import { NftConnectorFactory, type INftConnector } from '@twin.org/nft-models';

class MockNftConnector implements INftConnector {
public className(): string {
return 'MockNftConnector';
}

public async mint(controllerIdentity: string, tag: string): Promise<string> {
return `nft:entity-storage:${controllerIdentity}:${tag}`;
}

public async resolve(id: string): Promise<{ issuer: string; owner: string; tag: string }> {
return {
issuer: 'did:example:issuer-1',
owner: 'did:example:owner-1',
tag: id
};
}

public async burn(): Promise<void> {}

public async transfer(): Promise<void> {}

public async update(): Promise<void> {}
}

NftConnectorFactory.register('mock-nft', () => new MockNftConnector());

const connectorNames = NftConnectorFactory.names();
const connector = NftConnectorFactory.get<INftConnector>('mock-nft');

console.log(connectorNames.includes('mock-nft')); // true
console.log(connector.className()); // MockNftConnector

INftComponent Request Shapes

import type {
IIrc27Metadata,
INftMintRequest,
INftTransferRequest,
INftUpdateRequest
} from '@twin.org/nft-models';

const immutableMetadata: IIrc27Metadata = {
standard: 'IRC27',
version: 'v1.0',
type: 'image/png',
uri: 'ipfs://bafybeigdyr...',
name: 'Genesis Badge',
description: 'A launch collectible'
};

const mintRequest: INftMintRequest = {
tag: 'genesis-badge',
immutableMetadata,
metadata: {
season: 1,
rarity: 'legendary'
},
namespace: 'iota'
};

const transferRequest: INftTransferRequest = {
recipientIdentity: 'did:example:collector-8',
recipientAddress: '0x5df99c44d4f6f66d5a7f7298f46a0fdb6a4ac23a',
metadata: {
transferredAt: '2026-03-10T10:00:00.000Z'
}
};

const updateRequest: INftUpdateRequest = {
metadata: {
rarity: 'mythic',
season: 2
}
};

console.log(mintRequest.namespace); // iota
console.log(transferRequest.recipientIdentity); // did:example:collector-8
console.log(updateRequest.metadata.season); // 2