@fugitivesclub/nft
Version:
A SDK for NFT creation with Hedera and FileCoin
140 lines (139 loc) • 6.35 kB
JavaScript
;
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;