I create father or mother inscription efficiently however I can not create nft
Transaction ID: sendrawtransaction RPC error: {“code”:-26,”message”:”mandatory-script-verify-flag-failed (Invalid Schnorr signature)”}
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.handle);
// 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.handle);
// let signerOfPsbt = pockets.signPsbt(psbt)
// const txHex = signerOfPsbt.extractTransaction().toHex();
// await this.sendTransaction(txHex);
// Получаем UTXO
utxos = await this.getUTXO(ordinal_p2tr.handle);
// console.log(await this.waitUntilUTXO(ordinal_p2tr.handle));
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({
handle: itemOwnerAddress, //Vacation spot Tackle
worth: 546,
});
psbt.addOutput({
handle: itemOwnerAddress, //Vacation spot Tackle
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
{
"model": 2,
"locktime": 0,
"ins": [
{
"n": 0,
"script": {
"asm": "",
"hex": ""
},
"sequence": 4294967295,
"txid": "02cde20c6db772c9ddced410c52cb2bdcbf476016fa398cfa1ac5207f1ff462f",
"witness": [
"70a9429d26549e9c451f0ae1ea4855b7d7bbcd2f726179b72ca227c26c2833fad94026a13d25e23870d472a7013f395b3840b1fe6bcd86eb8d75189bf88eb951"
]
},
{
"n": 0,
"script": {
"asm": "",
"hex": ""
},
"sequence": 4294967295,
"txid": "8de1ee52b9d8e22522e085ebdbbba4a445277be83c1c75b0cd4638c62acb283a",
"witness": [
"8a5a4bbcd7e41f664f467dc56cfcdb41d0c5fb46e4e0e57be30603b2cf54f53f600a92371070519e9fbce7c2519aea9cb3e6736cb84555ffe20c48233d1cd2c1",
"206705021108c86f6f7249e85d233414afa8eeaadaea2bad863b2ccce504126879ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3801020222020103202f46fff10752aca1cf98a36f0176f4cbbdb22cc510d4ceddc972b76d0ce2cd02010528a264747970656b54657374204e46542023316b6465736372697074696f6e6954657374205465737401070d70617263656c2e6269746d6170003f68747470733a2f2f617277656176652e6e65742f4933326c517668673341514c583444632d334e48557773434e366e75382d6c78477352634e77653363723468",
"c06705021108c86f6f7249e85d233414afa8eeaadaea2bad863b2ccce504126879"
]
}
],
"outs": [
{
"n": 0,
"script": {
"addresses": [],
"asm": "OP_1 932a0391d2ec13cb8f303ded9297ece089f739b3ced40bc98eebdd277fdb9c9d",
"hex": "5120932a0391d2ec13cb8f303ded9297ece089f739b3ced40bc98eebdd277fdb9c9d"
},
"worth": 546
},
{
"n": 1,
"script": {
"addresses": [],
"asm": "OP_1 932a0391d2ec13cb8f303ded9297ece089f739b3ced40bc98eebdd277fdb9c9d",
"hex": "5120932a0391d2ec13cb8f303ded9297ece089f739b3ced40bc98eebdd277fdb9c9d"
},
"worth": 546
}
],
"hash": "d528bde069983f048ce011122f1c84cbfcfd4b7c4c0cfb7248871cb151daf2a3",
"txid": "d528bde069983f048ce011122f1c84cbfcfd4b7c4c0cfb7248871cb151daf2a3"
}```
Assortment handle tb1ptewa8cpn7a9562s8saakyqdtlm34q6xjx7d7vp8x99sxx7kr8resvfp9x6
Guardian Inscription Tx 02cde20c6db772c9ddced410c52cb2bdcbf476016fa398cfa1ac5207f1ff462f