@cryptovoxels/marketplace-js
Version:
A simple JS sdk to interact with Voxels' marketplace
250 lines • 10.9 kB
JavaScript
"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