Skip to content

Commit

Permalink
Showing 9 changed files with 280 additions and 45 deletions.
5 changes: 1 addition & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -239,15 +239,12 @@ Items below marked "required" are the "minimum" required for it to be compatible
```json
{
"description": "Data NFT description", // required
"data_preview_url": "https://previewdata.com",
"attributes": [
{
"trait_type": "Creator", // required
"value": "creator address"
},
{
"trait_type": "Data Preview URL", // required
"value": "https://previewdata.com"
},
{
"trait_type": "extra trait",
"value": "extra trait value"
228 changes: 225 additions & 3 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@itheum/sdk-mx-data-nft",
"version": "3.0.0",
"version": "3.1.0",
"description": "SDK for Itheum's Data NFT Technology on MultiversX Blockchain",
"main": "out/index.js",
"types": "out/index.d.js",
19 changes: 11 additions & 8 deletions src/common/mint-utils.ts
Original file line number Diff line number Diff line change
@@ -61,12 +61,17 @@ export function createIpfsMetadata(
datasetTitle: string,
datasetDescription: string,
dataNFTStreamPreviewUrl: string,
address: string
address: string,
extraAssets: string[]
) {
const metadata = {
const metadata: Record<string, any> = {
description: `${datasetTitle} : ${datasetDescription}`,
data_preview_url: dataNFTStreamPreviewUrl,
attributes: [] as object[]
};
if (extraAssets && extraAssets.length > 0) {
metadata.extra_assets = extraAssets;
}
const attributes = traits
.split(',')
.filter((element) => element.trim() !== '');
@@ -76,10 +81,6 @@ export function createIpfsMetadata(
const trait = { trait_type: key.trim(), value: value.trim() };
metadataAttributes.push(trait);
}
metadataAttributes.push({
trait_type: 'Data Preview URL',
value: dataNFTStreamPreviewUrl
});
metadataAttributes.push({ trait_type: 'Creator', value: address });
metadata.attributes = metadataAttributes;
return metadata;
@@ -90,7 +91,8 @@ export async function createFileFromUrl(
datasetTitle: string,
datasetDescription: string,
dataNFTStreamPreviewUrl: string,
address: string
address: string,
extraAssets: string[]
) {
let res: any = '';
let data: any = '';
@@ -105,7 +107,8 @@ export async function createFileFromUrl(
datasetTitle,
datasetDescription,
dataNFTStreamPreviewUrl,
address
address,
extraAssets
);
const _traitsFile = new File([JSON.stringify(traits)], 'metadata.json', {
type: 'application/json'
6 changes: 5 additions & 1 deletion src/common/utils.ts
Original file line number Diff line number Diff line change
@@ -183,6 +183,10 @@ export function parseDataNft(value: NftType): DataNft {
collection: value.collection,
balance: value.balance ? Number(value.balance) : 0,
owner: value.owner ? value.owner : '',
extraAssets:
value.uris
?.slice(2)
.map((uri) => Buffer.from(uri, 'base64').toString('ascii')) ?? [],
...attributes
};
return new DataNft(returnValue);
@@ -202,7 +206,7 @@ export async function checkTraitsUrl(traitsUrl: string) {
throw new ErrMissingTrait(traits.attributes);
}

const requiredTraits = ['Creator', 'Data Preview URL'];
const requiredTraits = ['Creator'];
const traitsAttributes = traits.attributes;

for (const requiredTrait of requiredTraits) {
1 change: 1 addition & 0 deletions src/datanft.ts
Original file line number Diff line number Diff line change
@@ -50,6 +50,7 @@ export class DataNft implements DataNftType {
readonly overrideDataMarshal: string = '';
readonly overrideDataMarshalChainId: string = '';
readonly isDataNFTPH: boolean = false;
readonly extraAssets: string[] = [];

static networkConfiguration: Config;
static apiConfiguration: string;
2 changes: 2 additions & 0 deletions src/interfaces.ts
Original file line number Diff line number Diff line change
@@ -69,6 +69,8 @@ export interface DataNftType {
readonly owner: string;
readonly overrideDataMarshal: string;
readonly overrideDataMarshalChainId: string;
readonly isDataNFTPH: boolean;
readonly extraAssets: string[];
}

export enum NftEnumType {
51 changes: 25 additions & 26 deletions src/nft-minter.ts
Original file line number Diff line number Diff line change
@@ -159,6 +159,7 @@ export class NftMinter extends Minter {
* - nftStorageToken: the nft storage token to be used to upload the image and metadata to IPFS
* - antiSpamTokenIdentifier: the anti spam token identifier to be used for the minting
* - antiSpamTax: the anti spam tax to be set for the Data NFT-FT with decimals. Needs to be greater than 0 and should be obtained in real time via {@link viewMinterRequirements} prior to calling mint.
* - extraAssets [optional] extra URIs to attached to the NFT. Can be media files, documents, etc. These URIs are public
*/
async mint(
senderAddress: IAddress,
@@ -175,14 +176,16 @@ export class NftMinter extends Minter {
nftStorageToken?: string;
antiSpamTokenIdentifier?: string;
antiSpamTax?: BigNumber.Value;
extraAssets?: string[];
}
): Promise<Transaction> {
const {
imageUrl,
traitsUrl,
nftStorageToken,
antiSpamTokenIdentifier,
antiSpamTax
antiSpamTax,
extraAssets
} = options ?? {};

// deep validate all mandatory URLs
@@ -215,7 +218,8 @@ export class NftMinter extends Minter {
datasetTitle,
datasetDescription,
dataPreviewUrl,
senderAddress.bech32()
senderAddress.bech32(),
extraAssets ?? []
);

const {
@@ -250,35 +254,30 @@ export class NftMinter extends Minter {
.setFunction(new ContractFunction('ESDTTransfer'))
.addArg(new TokenIdentifierValue(antiSpamTokenIdentifier))
.addArg(new BigUIntValue(antiSpamTax))
.addArg(new StringValue('mint'))
.addArg(new StringValue(tokenName))
.addArg(new StringValue(imageOnIpfsUrl))
.addArg(new StringValue(metadataOnIpfsUrl))
.addArg(new StringValue(dataMarshalUrl))
.addArg(new StringValue(dataNftStreamUrlEncrypted))
.addArg(new StringValue(dataPreviewUrl))
.addArg(new U64Value(royalties))
.addArg(new StringValue(datasetTitle))
.addArg(new StringValue(datasetDescription))
.build();
.addArg(new StringValue('mint'));
} else {
data = new ContractCallPayloadBuilder()
.setFunction(new ContractFunction('mint'))
.addArg(new StringValue(tokenName))
.addArg(new StringValue(imageOnIpfsUrl))
.addArg(new StringValue(metadataOnIpfsUrl))
.addArg(new StringValue(dataMarshalUrl))
.addArg(new StringValue(dataNftStreamUrlEncrypted))
.addArg(new StringValue(dataPreviewUrl))
.addArg(new U64Value(royalties))
.addArg(new StringValue(datasetTitle))
.addArg(new StringValue(datasetDescription))
.build();
data = new ContractCallPayloadBuilder().setFunction(
new ContractFunction('mint')
);
}

data
.addArg(new StringValue(tokenName))
.addArg(new StringValue(imageOnIpfsUrl))
.addArg(new StringValue(metadataOnIpfsUrl))
.addArg(new StringValue(dataMarshalUrl))
.addArg(new StringValue(dataNftStreamUrlEncrypted))
.addArg(new StringValue(dataPreviewUrl))
.addArg(new U64Value(royalties))
.addArg(new StringValue(datasetTitle))
.addArg(new StringValue(datasetDescription));

for (const extraAsset of extraAssets ?? []) {
data.addArg(new StringValue(extraAsset));
}
const mintTx = new Transaction({
value: antiSpamTokenIdentifier == 'EGLD' ? antiSpamTax : 0,
data,
data: data.build(),
sender: senderAddress,
receiver: this.contract.getAddress(),
gasLimit: 60000000,
11 changes: 9 additions & 2 deletions src/sft-minter.ts
Original file line number Diff line number Diff line change
@@ -231,6 +231,7 @@ export class SftMinter extends Minter {
* - imageUrl: the URL of the image for the Data NFT
* - traitsUrl: the URL of the traits for the Data NFT
* - nftStorageToken: the nft storage token to be used to upload the image and metadata to IPFS
* - extraAssets: [optional] extra URIs to attached to the NFT. Can be media files, documents, etc. These URIs are public
*
*/
async mint(
@@ -249,9 +250,10 @@ export class SftMinter extends Minter {
imageUrl?: string;
traitsUrl?: string;
nftStorageToken?: string;
extraAssets?: string[];
}
): Promise<Transaction> {
const { imageUrl, traitsUrl, nftStorageToken } = options ?? {};
const { imageUrl, traitsUrl, nftStorageToken, extraAssets } = options ?? {};

const tokenNameValidator = new StringValidator()
.notEmpty()
@@ -320,7 +322,8 @@ export class SftMinter extends Minter {
datasetTitle,
datasetDescription,
dataPreviewUrl,
senderAddress.bech32()
senderAddress.bech32(),
extraAssets ?? []
);

const {
@@ -368,6 +371,10 @@ export class SftMinter extends Minter {
data.addArg(new U64Value(lockPeriod));
}

for (const extraAsset of extraAssets ?? []) {
data.addArg(new StringValue(extraAsset));
}

const mintTx = new Transaction({
data: data.build(),
sender: senderAddress,

0 comments on commit 3dd11ef

Please sign in to comment.