ordinalsbot
Version:
Node.js library for OrdinalsBot API
263 lines • 11.5 kB
JavaScript
;
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