I create assortment efficiently however I am unable to create nft
import * as ecc from 'tiny-secp256k1';
import * as bitcoin from "bitcoinjs-lib";
import * as cbor from 'cbor';
import { Pockets } from "./pockets";
import { Shopper } from "./consumer";
import { tweakSigner } from './utils';
bitcoin.initEccLib(ecc);
const SEND_UTXO_LIMIT = 100;
const TESTNET_FEERATE = 20;
export class Nft extends Shopper {
collectionAddress: string;
parentInscriptionTXID: string;
constructor({ collectionAddress, parentInscriptionTXID }) {
tremendous();
this.collectionAddress = collectionAddress;
this.parentInscriptionTXID = parentInscriptionTXID;
}
async deploy(pockets: Pockets, { metadata, commonContentUrl, itemOwnerAddress }) {
const txidBuffer = Buffer.from(this.parentInscriptionTXID, 'hex');
const inscriptionBuffer = txidBuffer.reverse();
const metaProtocol: Buffer = Buffer.concat([Buffer.from("parcel.bitmap", "utf8")]);
const pointer1: quantity = 546 * 1;
const pointerBuffer1: Buffer = Buffer.from(pointer1.toString(16).padStart(4, '0'), 'hex').reverse();
const contentBufferData: Buffer = this.contentBuffer(commonContentUrl);
const contentBufferArray: Array = this.splitBuffer(contentBufferData, 400);
const ordinal_script = this.createTapscript({
metadata,
publicKey: pockets.internalPubkey,
inscriptionBuffer,
pointerBuffer1: pointerBuffer1,
metaProtocol,
contentBufferArray
});
const scriptTree = {
output: ordinal_script,
};
const redeem = {
output: ordinal_script,
redeemVersion: 192,
};
const internalPubkey = pockets.internalPubkey;
const ordinal_p2tr = bitcoin.funds.p2tr({
internalPubkey,
community: pockets.community,
scriptTree,
redeem,
});
let utxos, utxo, psbt;
// utxos = await this.getUTXO(pockets.tackle);
// utxo = utxos.discover((utxo) => utxo.worth > SEND_UTXO_LIMIT);
// if (utxo === undefined) throw new Error("No btcs");
// let redeemPsbt = pockets.redeemSendUTXOPsbt(utxo);
// redeemPsbt = pockets.signPsbt(redeemPsbt);
// let redeemFee = redeemPsbt.extractTransaction().virtualSize();
// //4532b27cf67d922318ad473b601a67192ee212679e39e50130cdc517d3595c44
// psbt = pockets.sendUTXOPsbt(utxo, redeemFee, ordinal_p2tr.tackle);
// let signerOfPsbt = pockets.signPsbt(psbt)
// const txHex = signerOfPsbt.extractTransaction().toHex();
// await this.sendTransaction(txHex);
// Получаем UTXO
utxos = await this.getUTXO(ordinal_p2tr.tackle);
// console.log(await this.waitUntilUTXO(ordinal_p2tr.tackle));
if (!utxos || utxos.size === 0) {
throw new Error("No UTXOs discovered.");
}
utxo = utxos.discover((utxo: any) => utxo.worth > SEND_UTXO_LIMIT);
if (utxo === undefined) throw new Error("No btcs");
psbt = new bitcoin.Psbt({ community: pockets.community });
//tb1ppfqcpem2kd0l9dymat0uxdtv54cz4npty87yk2ctnj6vtk47zxjs9xac6d
//const parentInscriptionUTXOs = await this.getUtxos(this.collectionAddress);
// console.log(this.collectionAddress, parentInscriptionUTXOs, "parentInscriptionUTXOs");
// return;
const parentInscriptionUTXO = {
txid: this.parentInscriptionTXID,
vout: 0,
worth: 526
}
psbt.addInput({
hash: parentInscriptionUTXO.txid,
index: parentInscriptionUTXO.vout,
witnessUtxo: {
worth: parentInscriptionUTXO.worth,
script: pockets.output,
},
tapInternalKey: internalPubkey
});
psbt.addInput({
hash: utxos[0].txid,
index: utxos[0].vout,
tapInternalKey: internalPubkey,
witnessUtxo: { worth: utxos[0].worth, script: ordinal_p2tr.output! },
tapLeafScript: [
{
leafVersion: redeem.redeemVersion,
script: redeem.output,
controlBlock: ordinal_p2tr.witness![ordinal_p2tr.witness!.length - 1],
},
],
});
psbt.addOutput({
tackle: itemOwnerAddress, //Vacation spot Deal with
worth: 546,
});
psbt.addOutput({
tackle: itemOwnerAddress, //Vacation spot Deal with
worth: 546,
});
const payment = 1200000;
const change = utxos[0].worth - 546 * 1;
console.log(change, 'change');
const signer = tweakSigner(pockets, psbt);
psbt.signInput(0, signer);
psbt.signInput(1, pockets.keyPair);
psbt.finalizeAllInputs()
const tx = psbt.extractTransaction();
console.log(tx.virtualSize())
console.log(tx.toHex());
return this.pushTransaction(tx.toHex());
}
contentBuffer = (content material: string) => {
return Buffer.from(content material, 'utf8')
}
splitBuffer = (buffer: Buffer, chunkSize: quantity) => {
let chunks = [];
for (let i = 0; i < buffer.size; i += chunkSize) {
const chunk = buffer.subarray(i, i + chunkSize);
chunks.push(chunk);
}
return chunks;
};
createTapscript({
metadata,
publicKey,
inscriptionBuffer,
pointerBuffer1,
metaProtocol,
contentBufferArray
}) {
const metadataBuffer = cbor.encode(metadata);
const childOrdinalStacks = [
publicKey,
bitcoin.opcodes.OP_CHECKSIG,
bitcoin.opcodes.OP_FALSE,
bitcoin.opcodes.OP_IF,
Buffer.from("ord", "utf8"),
1, 1,
Buffer.concat([Buffer.from("text/plain;charset=utf-8", "utf8")]),
1, 2,
pointerBuffer1,
1, 3,
inscriptionBuffer,
1, 5,
metadataBuffer,
1, 7,
metaProtocol,
bitcoin.opcodes.OP_0,
];
contentBufferArray.forEach((merchandise: Buffer) => {
childOrdinalStacks.push(merchandise)
});
childOrdinalStacks.push(bitcoin.opcodes.OP_ENDIF)
console.log(childOrdinalStacks);
return bitcoin.script.compile(childOrdinalStacks);
}
}
My hash
020000000001022f46fff10752aca1cf98a36f0176f4cbbdb22cc510d4ceddc972b76d0ce2cd020000000000ffffffff3a28cb2ac63846cdb0751c3ce87b2745a4a4bbdbeb85e02225e2d8b952eee18d0000000000ffffffff022202000000000000225120932a0391d2ec13cb8f303ded9297ece089f739b3ced40bc98eebdd277fdb9c9d2202000000000000225120932a0391d2ec13cb8f303ded9297ece089f739b3ced40bc98eebdd277fdb9c9d014070a9429d26549e9c451f0ae1ea4855b7d7bbcd2f726179b72ca227c26c2833fad94026a13d25e23870d472a7013f395b3840b1fe6bcd86eb8d75189bf88eb9510340ba9b3c4973046074ab49faca606e09874fc7b43abccaccca15ce29d35fcae62eac1dadc4fb460b0342d5431972d7f2a86160325c0e5dec831182adf376ff8545e8206705021108c86f6f7249e85d233414afa8eeaadaea2bad863b2ccce504126879ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3801020222020103202f46fff10752aca1cf98a36f0176f4cbbdb22cc510d4ceddc972b76d0ce2cd02010528a264747970656b54657374204e46542023316b6465736372697074696f6e6954657374205465737401070d70617263656c2e6269746d6170003f68747470733a2f2f617277656176652e6e65742f4933326c517668673341514c583444632d334e48557773434e366e75382d6c78477352634e7765336372346821c06705021108c86f6f7249e85d233414afa8eeaadaea2bad863b2ccce50412687900000000
Assortment tackle tb1ptewa8cpn7a9562s8saakyqdtlm34q6xjx7d7vp8x99sxx7kr8resvfp9x6
Mum or dad Inscription Tx 02cde20c6db772c9ddced410c52cb2bdcbf476016fa398cfa1ac5207f1ff462f