UNPKG

ordinalsbot

Version:
263 lines 11.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.Launchpad = void 0; const bitcoin = __importStar(require("bitcoinjs-lib")); const types_1 = require("../types"); const client_1 = require("./client"); const sats_connect_1 = require("sats-connect"); const marketplace_types_1 = require("../types/marketplace_types"); class Launchpad { constructor(key = "", environment = types_1.InscriptionEnvNetwork.mainnet, options) { if (this.launchpadClientInstance !== undefined) { console.error("launchpad constructor was called multiple times"); return; } environment = types_1.InscriptionEnvNetwork[environment] ?? types_1.InscriptionEnvNetwork.mainnet; switch (environment) { case types_1.InscriptionEnvNetwork.mainnet: this.network = sats_connect_1.BitcoinNetworkType.Mainnet; break; case types_1.InscriptionEnvNetwork.testnet: this.network = sats_connect_1.BitcoinNetworkType.Testnet; break; case types_1.InscriptionEnvNetwork.signet: this.network = sats_connect_1.BitcoinNetworkType.Signet; break; default: this.network = sats_connect_1.BitcoinNetworkType.Mainnet; break; } this.launchpadClientInstance = new client_1.LaunchpadClient(key, environment, options); } createMarketPlace(createMarketplaceRequest) { return this.launchpadClientInstance.createMarketPlace(createMarketplaceRequest); } async createLaunchpad(createLaunchpadRequest) { try { if (!createLaunchpadRequest.walletProvider) { return await this.launchpadClientInstance.createLaunchpad(createLaunchpadRequest); } else if (createLaunchpadRequest.walletProvider === marketplace_types_1.WALLET_PROVIDER.xverse) { if (!createLaunchpadRequest.sellerOrdinalAddress) { throw new Error("No seller address provided"); } const { launchpadId, status } = await this.launchpadClientInstance.createLaunchpad(createLaunchpadRequest); let inputIndices = []; let index = 0; createLaunchpadRequest.phases.forEach((phase) => { phase.ordinals.forEach((ordinal) => { inputIndices.push(index); index++; }); }); const sellerInput = { address: createLaunchpadRequest.sellerOrdinalAddress, signingIndexes: inputIndices, sigHash: bitcoin.Transaction.SIGHASH_SINGLE | bitcoin.Transaction.SIGHASH_ANYONECANPAY, }; const getLaunchpadStatusRequest = { launchpadId, status }; const { psbt } = await this.getLaunchpadPSBT(getLaunchpadStatusRequest); const payload = { network: { type: this.network }, message: "Sign Seller Transaction", psbtBase64: psbt, broadcast: false, inputsToSign: [sellerInput], }; return new Promise(async (resolve, reject) => { const response = await this.satsConnectWrapper(payload); if (response && response.success && response.psbtBase64) { try { const saveLaunchpadRequestPayload = { launchpadId: launchpadId, updateLaunchData: { signedListingPSBT: response.psbtBase64, }, }; resolve(this.saveLaunchpad(saveLaunchpadRequestPayload)); } catch (error) { console.error("Error saving launchpad:", error); reject(error); } } else { console.log("Transaction canceled"); } }); } else { throw new Error("Wallet not supported"); } } catch (error) { console.error("Error in create Launchpad:", error); throw error; } } async getLaunchpadPSBT(getLaunchpadStatusRequest) { let psbt = ""; let status; let intervalId; const pollPSBTStatus = async () => { return new Promise((resolve) => { const checkAndResolve = async () => { const response = await this.launchpadClientInstance.getLaunchpadStatus(getLaunchpadStatusRequest); if (response.status !== status && response.psbt) { psbt = response.psbt; status = response.status; clearInterval(intervalId); resolve(psbt); } }; intervalId = setInterval(checkAndResolve, 10000); checkAndResolve(); setTimeout(() => { clearInterval(intervalId); resolve(psbt); }, 5 * 60 * 1000); }); }; await pollPSBTStatus(); return { psbt, status }; } saveLaunchpad(saveLaunchpadRequest) { return this.launchpadClientInstance.saveLaunchpad(saveLaunchpadRequest); } getLaunchpadListing(getListingRequest) { return this.launchpadClientInstance.getLaunchpadListing(getListingRequest); } getAllocation(getAllocationRequest) { return this.launchpadClientInstance.getAllocation(getAllocationRequest); } confirmPaddingOutputs(confirmPaddingOutputsRequest) { return this.launchpadClientInstance.confirmPaddingOutputs(confirmPaddingOutputsRequest); } async setupPaddingOutputs(setupPaddingOutputsRequest) { if (!setupPaddingOutputsRequest.walletProvider) { return this.launchpadClientInstance.setupPaddingOutputs(setupPaddingOutputsRequest); } else if (setupPaddingOutputsRequest.walletProvider === marketplace_types_1.WALLET_PROVIDER.xverse) { const paddingOutputResponse = await this.launchpadClientInstance.setupPaddingOutputs(setupPaddingOutputsRequest); const buyerInputs = { address: setupPaddingOutputsRequest.address, signingIndexes: paddingOutputResponse.buyerInputIndices, }; const payload = { network: { type: this.network, }, message: "Sign Padding Outputs Transaction", psbtBase64: paddingOutputResponse.psbt, broadcast: true, inputsToSign: [buyerInputs], }; return new Promise(async (resolve, reject) => { const response = await this.satsConnectWrapper(payload); if (response && response.success && response.psbtBase64) { resolve({ psbtBase64: response.psbtBase64, txId: response.txId }); } else { console.log("Transaction canceled"); } }); } else { throw new Error("Wallet not supported"); } } async createLaunchpadOffer(createOfferRequest) { if (!createOfferRequest.walletProvider) { return this.launchpadClientInstance.createLaunchpadOffer(createOfferRequest); } else if (createOfferRequest.walletProvider === marketplace_types_1.WALLET_PROVIDER.xverse) { const offer = await this.launchpadClientInstance.createLaunchpadOffer(createOfferRequest); const sellerInput = { address: createOfferRequest.buyerPaymentAddress, signingIndexes: offer.buyerInputIndices, }; const payload = { network: { type: this.network, }, message: "Sign Buyer Transaction", psbtBase64: offer.psbt, broadcast: false, inputsToSign: [sellerInput], }; return new Promise(async (resolve, reject) => { const response = await this.satsConnectWrapper(payload); if (response && response.success && response.psbtBase64) { const submitLaunchpadOfferRequest = { ordinalId: offer.ordinalId, launchpadPhase: offer.launchpadPhase, signedBuyerPSBTBase64: response.psbtBase64, }; resolve(submitLaunchpadOfferRequest); } else { console.log("Transaction canceled"); } }); } else { throw new Error("Wallet not supported"); } } async submitLaunchpadOffer(submitLaunchpadOfferRequest) { return this.launchpadClientInstance.submitLaunchpadOffer(submitLaunchpadOfferRequest); } async satsConnectWrapper(payload) { return new Promise((resolve, reject) => { (0, sats_connect_1.signTransaction)({ payload, onFinish: async (response) => { resolve({ success: true, message: "Transaction successfull", ...response, }); }, onCancel: () => { resolve({ success: false, message: "Transaction cancelled" }); }, }); }); } } exports.Launchpad = Launchpad; //# sourceMappingURL=index.js.map