UNPKG

@fugitivesclub/nft

Version:

A SDK for NFT creation with Hedera and FileCoin

140 lines (139 loc) 6.35 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ClientNFT = exports.DebugLevel = void 0; const js_logger_1 = __importDefault(require("js-logger")); const hedera_interface_1 = require("./models/hedera.interface"); const hedera_sdk_1 = require("./sdk-hedera/hedera.sdk"); const storage_sdk_1 = require("./sdk-storage/storage.sdk"); const instanceOf_1 = require("./utils/instanceOf"); /* Export Interfaces */ __exportStar(require("./models/hedera.interface"), exports); var DebugLevel; (function (DebugLevel) { DebugLevel["DEBUG"] = "DEBUG"; DebugLevel["WARN"] = "WARN"; DebugLevel["ERROR"] = "ERROR"; })(DebugLevel = exports.DebugLevel || (exports.DebugLevel = {})); js_logger_1.default.useDefaults(); class ClientNFT { constructor({ hederaAccount, nftStorageApiKey, debugLevel, }) { js_logger_1.default.setLevel(ClientNFT.getLogger(debugLevel)); this.initialization({ hederaAccount, nftStorageApiKey }).catch(console.log); } async initialization({ hederaAccount, nftStorageApiKey, }) { js_logger_1.default.info('Initialization on Hedera', hederaAccount.environment ? hederaAccount.environment.toUpperCase() : hedera_interface_1.HederaEnvironment.MAINNET); if (!hederaAccount.accountId || !hederaAccount.privateKey) { js_logger_1.default.error('Please provide an accountID and a privateKey...'); return Promise.reject('Please we need your Account ID and private Key in order to use the Hedera SDK - https://portal.hedera.com/register'); } if (!nftStorageApiKey) { js_logger_1.default.error('Please provide a nftStorageApiKey...'); return Promise.reject('Please we need your Api Key in order to store your NFT on IPFS - https://nft.storage/'); } this.hederaSdk = new hedera_sdk_1.HederaSdk(Object.assign({ environment: hedera_interface_1.HederaEnvironment.MAINNET }, hederaAccount)); this.nftStorageApiKey = nftStorageApiKey; } /** * Getting Fees from NFT's creation */ async getFees() { js_logger_1.default.info('Getting fees...'); return await this.hederaSdk.getFees(); } /** * Create a NFT * @param NFTDto | TokenDto */ async createAndMint(createDto) { let tokenDto; const cids = []; const cidsMetadata = []; let supply; /** Convert NFTDto to TokenDto */ if ((0, instanceOf_1.instanceOfNFTDto)(createDto)) { tokenDto = { name: createDto.name, symbol: createDto.creator, customRoyaltyFee: createDto.customRoyaltyFee, nfts: [createDto], }; supply = createDto.supply; } else { tokenDto = createDto; } for (const nft of tokenDto.nfts) { if (!nft.media || !nft.name || !tokenDto.name) { js_logger_1.default.error('name and medias parameters must be defined when calling this method...'); return Promise.reject('Please define at least a Media and a Name for your NFT !'); } } try { /* Storing the Media */ js_logger_1.default.info('Saving the medias and metadata on FileCoin...'); for (const [index, nft] of tokenDto.nfts.entries()) { const metadataCid = await (0, storage_sdk_1.storeMetadata)(Object.assign(Object.assign({ token: this.nftStorageApiKey }, nft), { customRoyaltyFee: tokenDto.customRoyaltyFee, supply: supply !== null && supply !== void 0 ? supply : 1, media: nft.media })); js_logger_1.default.info(`Metadata [${index + 1}/${tokenDto.nfts.length}] saved on FileCoin. ${metadataCid}`); cidsMetadata.push(metadataCid); } /* Create the NFT */ js_logger_1.default.info('Creating the NFT on Hedera...'); const res = await this.hederaSdk.createNFT({ name: tokenDto.name, symbol: tokenDto.symbol, customFees: tokenDto.customRoyaltyFee, supply: supply, cids: cidsMetadata, nfts: tokenDto.nfts, adminKey: tokenDto.adminKey, }); js_logger_1.default.debug('Your NFT will be available soon on', res.urls); return res; } catch (e) { js_logger_1.default.error('An error occurred while creating the NFT...'); /* Remove the File from Storage if an error occurred while creating the NFT on Hedera */ if (cids.length > 0) { js_logger_1.default.warn('Removing your medias and metadata from FileCoin...'); for (const [index, cid] of cids.entries()) { if (cidsMetadata[index]) { await (0, storage_sdk_1.deleteNFT)({ cid: cidsMetadata[index], token: this.nftStorageApiKey, }); } await (0, storage_sdk_1.deleteNFT)({ cid, token: this.nftStorageApiKey }); } } return Promise.reject(e); } } static getLogger(debugLevel) { switch (debugLevel) { case 'DEBUG': return js_logger_1.default.DEBUG; case 'WARN': return js_logger_1.default.WARN; case 'ERROR': return js_logger_1.default.ERROR; default: return js_logger_1.default.OFF; } } } exports.ClientNFT = ClientNFT;