UNPKG

@cryptovoxels/marketplace-js

Version:

A simple JS sdk to interact with Voxels' marketplace

250 lines 10.9 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.VoxelsMarketplace = void 0; require("dotenv").config(); const ethers_1 = require("ethers"); const events_1 = require("events"); const helpers_1 = require("./lib/helpers"); const marketplaceAbi = require("./abis/marketplacev1.json"); class VoxelsMarketplace extends events_1.EventEmitter { constructor(providerOrSigner, network = "mainnet", logger) { super(); this.logger = console.log; this.emitEvent = (eventName, ...args) => this.emit(eventName, args); /** * Get a listing from the contract directly given a hash id and index * @param id a hash representing the listings list for given user+contract+tokenid * @param index index of the listing inside the listings[] array (default 0) * @returns */ this.getListing = (id, index = 0) => __awaiter(this, void 0, void 0, function* () { if (!this.contractInstance) { throw Error("SDK not initialized"); } if (!id || !ethers_1.utils.isHexString(id)) { throw Error("ID is invalid"); } try { const listing = yield this.contractInstance.getListing(id, index); return listing; } catch (e) { const err = e.toString ? e.toString() : e; this.logger(err); this.emitEvent("error", err); return; } }); /** * list an NFT given the parameters * @param params an object containing parameters about the listing: token_id, address,price,quantity,acceptedPayment * @returns */ this.createListing = (params) => __awaiter(this, void 0, void 0, function* () { if (!this.contractInstance) { throw Error("SDK not initialized"); } if ((0, helpers_1.isProvider)(this.providerOrSigner)) { throw Error("Use a Signer to list an item"); } try { (0, helpers_1.validateListingParams)(params); } catch (e) { this.logger(e); return; } const validatedParams = params; const userWallet = yield (0, helpers_1.getAddressFromSigner)(this.providerOrSigner); //Check approval of the implementation contract let isApproved = yield (0, helpers_1.getIsApproved)(this.contractInstance, validatedParams.address, userWallet, this.network); if (!isApproved) { isApproved = yield (0, helpers_1.askApproval)(this.contractInstance, validatedParams.address, userWallet, this.network, this.emitEvent.bind(this)); if (!isApproved) { // Cannot list if not approved throw new Error("Cannot list if contract is not approved"); } } this.emitEvent("@:tx-start"); //list item let tx; try { tx = yield this.contractInstance.list(validatedParams.address, validatedParams.token_id, ethers_1.ethers.utils.parseEther(validatedParams.price.toString()), validatedParams.quantity || 1, validatedParams.acceptedPayment || ethers_1.constants.AddressZero); } catch (e) { const err = e.toString ? e.toString() : e; this.logger(err); this.emitEvent("error", err); return; } this.emitEvent("@:tx-hash", { hash: tx.hash }); let receipt; try { receipt = yield (0, helpers_1.handleTransaction)(tx); } catch (e) { const err = e.toString ? e.toString() : e; this.logger(err); this.emitEvent("error", err); return; } this.emitEvent("@:tx-mined", { hash: receipt.transactionHash }); return receipt; }); /** * Purchase an NFT listed given an id or its listing parameters. * @param id hash representing the id of the list of listings for the given user+contract+tokenId * @param index index of the listing inside the list of listings * @param quantityToPurchase Quantity of the NFT to purchase * @returns */ this.purchase = (id, index = 0, quantityToPurchase = 1) => __awaiter(this, void 0, void 0, function* () { const indexingObject = { id, index }; if (!this.contractInstance) { throw Error("SDK not initialized"); } if ((0, helpers_1.isProvider)(this.providerOrSigner)) { throw Error("Use a Signer to purchase an item"); } let listing = undefined; if (indexingObject.id) { listing = yield this.getListing(indexingObject.id, indexingObject.index); } if (!listing) { throw new Error("Could not find listing."); } if (listing.acceptedPayment !== ethers_1.constants.AddressZero) { return this.buyWithToken(indexingObject, quantityToPurchase); } else { return this.buyWithNativeToken(indexingObject, listing.price.toString(), quantityToPurchase); } }); this.buyWithToken = (indexes, quantityToPurchase) => __awaiter(this, void 0, void 0, function* () { this.emitEvent("@:tx-start"); //list item let tx; try { tx = yield this.contractInstance.buyWithToken(indexes.id, indexes.index, quantityToPurchase); } catch (e) { const err = e.toString ? e.toString() : e; this.logger(err); this.emitEvent("error", err); return; } this.emitEvent("@:tx-hash", { hash: tx.hash }); let receipt; try { receipt = yield (0, helpers_1.handleTransaction)(tx); } catch (e) { const err = e.toString ? e.toString() : e; this.logger(err); this.emitEvent("error", err); return; } this.emitEvent("@:tx-mined", { hash: receipt.transactionHash }); return receipt.status; }); this.buyWithNativeToken = (indexes, value, quantityToPurchase) => __awaiter(this, void 0, void 0, function* () { this.emitEvent("@:tx-start"); //list item let tx; try { tx = yield this.contractInstance.buy(indexes.id, indexes.index, quantityToPurchase, { value }); } catch (e) { const err = e.toString ? e.toString() : e; this.logger(err); this.emitEvent("error", err); return; } this.emitEvent("@:tx-hash", { hash: tx.hash }); let receipt; try { receipt = yield (0, helpers_1.handleTransaction)(tx); } catch (e) { const err = e.toString ? e.toString() : e; this.logger(err); this.emitEvent("error", err); return; } this.emitEvent("@:tx-mined", { hash: receipt.transactionHash }); return receipt.status; }); this.cancelListing = (id, index = 0) => __awaiter(this, void 0, void 0, function* () { if (!this.contractInstance) { throw Error("SDK not initialized"); } if ((0, helpers_1.isProvider)(this.providerOrSigner)) { throw Error("Use a Signer to cancel a listing"); } this.emitEvent("@:tx-start"); //list item let tx; try { tx = yield this.contractInstance.cancelList(id, index); } catch (e) { const err = e.toString ? e.toString() : e; this.logger(err); this.emitEvent("error", err); return; } this.emitEvent("@:tx-hash", { hash: tx.hash }); let receipt; try { receipt = yield (0, helpers_1.handleTransaction)(tx); } catch (e) { const err = e.toString ? e.toString() : e; this.logger(err); this.emitEvent("error", err); return; } this.emitEvent("@:tx-mined", { hash: receipt.transactionHash }); return receipt.status; }); this.providerOrSigner = this.handleProviderOrSigner(providerOrSigner, network); this.network = network; this.contractInstance = new ethers_1.Contract((0, helpers_1.getContractsByNetwork)(network).marketplace, marketplaceAbi, this.providerOrSigner); if (logger) { this.logger = logger; } } /** * handles the given provider or signer from constructor * @param providerOrSigner ethers Provider or Signer * @param network a network; see Network types; * @returns */ handleProviderOrSigner(providerOrSigner, network) { if (!providerOrSigner) { return (0, ethers_1.getDefaultProvider)(network); } return providerOrSigner; } connect(signer) { if (signer._isSigner) { this.providerOrSigner = signer; this.contractInstance = this.contractInstance.connect(signer); } return this; } get contract() { return this.contractInstance; } } exports.VoxelsMarketplace = VoxelsMarketplace; //# sourceMappingURL=sdk.js.map