UNPKG

nerve-sdk-js

Version:
493 lines (450 loc) 24.4 kB
const nerve = require('../../index'); const bitcore = require('bitcore-lib'); const {BitcoinRechargeData} = require('../../model/BitcoinRechargeData'); const nerveUtil = require('../api/util'); const bitcoin = require('bitcoinjs-lib'); const {main} = require("mocha/lib/cli"); const sdk = require("../../api/sdk"); const {NERVE_INFOS, Plus, timesDecimals} = require('../htgConfig'); const {getNulsBalance, validateTx, broadcastTx} = require('../api/util'); let NERVE_INFO = nerve.chainId() == 9 ? NERVE_INFOS.mainnet : nerve.chainId() == 5 ? NERVE_INFOS.testnet : null; // for node env let ECPair = nerve.bitcoin.initEccLibForNode(); let o = { "from": "mwyEyEL2bvP2f2LUiuFCFxEqr5UgHjJ7NM", "multySignAddress": "2NDu3vcpjyiMgvRjDpQfbyh9uF2McfDJ3NF", "nerveAddress": "TNVTdTSPMvHcrsgCsGKxsbjQn66W4QN2Azo4r", "amount": "10000", "pub": "03f93d5fb9db5386a6851a3a8d308609a069d599aa7c60b7e34dcc5b946e94dfa9", "isMainnet": false }; /** * Legacy地址跨链转入NERVE */ async function createLegacyTxTest() { const mainnet = false; const pubkeyHex = "03f93d5fb9db5386a6851a3a8d308609a069d599aa7c60b7e34dcc5b946e94dfa9"; const senderAddress = 'mwyEyEL2bvP2f2LUiuFCFxEqr5UgHjJ7NM'; const utxos = await nerve.bitcoin.getUtxos(mainnet, senderAddress, 10000); const receiveAddress = "2NDu3vcpjyiMgvRjDpQfbyh9uF2McfDJ3NF"; const feeRate = await nerve.bitcoin.getFeeRate(mainnet); const txData = new BitcoinRechargeData(); txData.to = 'TNVTdTSPMvHcrsgCsGKxsbjQn66W4QN2Azo4r'; txData.value = 10000; const opReturnBuffer = txData.serialize(); const opReturnArray = [ opReturnBuffer ]; const sendAmount = txData.value; const pbstHex = await nerve.bitcoin.createLegacyTx(mainnet, pubkeyHex, utxos, receiveAddress, sendAmount, feeRate, opReturnArray); console.log('pbstHex', pbstHex); } /** * NestedSegwit地址跨链转入NERVE */ async function createNestedSegwitTxTest() { const mainnet = false; const pubkeyHex = "02c33b15d12f51122974d6c44aa429ea19efad06431803711b2658a967dfa574e4"; const senderAddress = '2N9zTP5UCTiHr9wB5y3kMT94h7aK4x6DaTU'; const utxos = await nerve.bitcoin.getUtxos(mainnet, senderAddress, 10100); console.log('utxos', JSON.stringify(utxos)) const receiveAddress = "2NDu3vcpjyiMgvRjDpQfbyh9uF2McfDJ3NF"; // const feeRate = await nerve.bitcoin.getFeeRate(mainnet); const feeRate = 1; const txData = new BitcoinRechargeData(); txData.to = 'TNVTdTSPJJMGh7ijUGDqVZyucbeN1z4jqb1ad'; txData.value = 800; const opReturnBuffer = txData.serialize(); console.log('opReturnBuffer', opReturnBuffer.toString('hex')); const opReturnArray = [ opReturnBuffer ]; const sendAmount = txData.value; const pbstHex = nerve.bitcoin.createNestedSegwitTx(mainnet, pubkeyHex, utxos, receiveAddress, sendAmount, feeRate, opReturnArray); console.log('pbstHex', pbstHex); } /** * NativeSegwit地址跨链转入NERVE */ async function createNativeSegwitTxTest() { const mainnet = true; const pubkeyHex = "0362d61ec650f9b56601477c111a554a1217fb3b3a0ea02c1db47c3f930b9e187e"; const senderAddress = 'bc1qyzdyruj0f8xd90zjftfhxrgev3sst3jcdjl30c'; const utxos = await nerve.bitcoin.getUtxos(mainnet, senderAddress); // let utxos = []; // let u1 = {txid: 'cbe2aaf109ce7b47343c48b917ddaee420fbb0efa979889247d7874b4f8d7011', vout: 1, amount: 13654}; // let u2 = {txid: '5cfa6560e383720bc35668da5539039e633fd754a4220ffd27399a55f5ca41e3', vout: 0, amount: 100000}; // utxos.push(u1); // utxos.push(u2); const receiveAddress = "bc1q7l4q8kqekyur4ak3tf4s2rr9rp4nhz6axejxjwrc3f28ywm4tl8smz5dpd"; // const feeRate = await nerve.bitcoin.getFeeRate(mainnet); const feeRate = 19; console.log('=======feeRate', feeRate); const txData = new BitcoinRechargeData(); txData.to = 'NERVEepb6CwyEWh9mhnmPTJcuWpRzmYvoS7tLm'; txData.value = 500000; const opReturnBuffer = txData.serialize(); const opReturnArray = [ opReturnBuffer ]; const sendAmount = txData.value; const pbstHex = nerve.bitcoin.createNativeSegwitTx(mainnet, pubkeyHex, utxos, receiveAddress, sendAmount, feeRate, opReturnArray, true); console.log('pbstHex', pbstHex); } /** * Taproot地址跨链转入NERVE */ async function createTaprootTxTest() { const mainnet = false; const pubkeyHex = "021581e09eb49bfdb52e147ddeb943219fdfc15f04cb49686a37d7a757800fb591"; const senderAddress = 'tb1ps240r4jpxcnauxm0vk2dy0nh5wuzaua2luppf096keq8ym4eyx8qktkd7q'; const utxos = await nerve.bitcoin.getUtxos(mainnet, senderAddress, 10800); const receiveAddress = "2NDu3vcpjyiMgvRjDpQfbyh9uF2McfDJ3NF"; const feeRate = await nerve.bitcoin.getFeeRate(mainnet); const txData = new BitcoinRechargeData(); txData.to = 'TNVTdTSPJJMGh7ijUGDqVZyucbeN1z4jqb1ad'; txData.value = 10800; const opReturnBuffer = txData.serialize(); const opReturnArray = [ opReturnBuffer ]; const sendAmount = txData.value; const pbstHex = nerve.bitcoin.createTaprootTx(mainnet, pubkeyHex, utxos, receiveAddress, sendAmount, feeRate, opReturnArray); console.log('pbstHex', pbstHex); } function dataTest() { const txData = new BitcoinRechargeData(); txData.to = 'TNVTdTSPJJMGh7ijUGDqVZyucbeN1z4jqb1ad'; txData.value = 10800; txData.extend0 = '2024-01-25 17:49'; txData.feeTo = "TNVTdTSPRnXkDiagy7enti1KL75NU5AxC9sQA"; console.log(txData.serialize().toString('hex')); txData.test(); } /* mqYkDJboJGMa7XJjrVm3pDxYwB6icxTQrW === 0218509f52e47491df3b8331cbb3d2c784512c5ffb58689413a748a0c9fbd77aa5 2N9zTP5UCTiHr9wB5y3kMT94h7aK4x6DaTU === 02c33b15d12f51122974d6c44aa429ea19efad06431803711b2658a967dfa574e4 tb1qnwnk40t55dsgfd4nuz5aq8sflj8vanh5nskec5 === 026bcdc8821c9d7288b6bfab48ee6ed5347df45261d9a5ea88e27cbccc457c5c6e tb1ps240r4jpxcnauxm0vk2dy0nh5wuzaua2luppf096keq8ym4eyx8qktkd7q === 021581e09eb49bfdb52e147ddeb943219fdfc15f04cb49686a37d7a757800fb591 */ /*nerve.bitcoin.estimateTxSize(0, 1, 1, 1, 1, 1, [Buffer.from('YOUR Legacy OP_RETURN DATA HERE', 'utf8')]); nerve.bitcoin.estimateTxSize(1, 1, 1, 1, 1, 1, [Buffer.from('YOUR NestedSegwit OP_RETURN DATA HERE', 'utf8')]); nerve.bitcoin.estimateTxSize(2, 1, 1, 1, 1, 1, [Buffer.from('YOUR NativeSegwit OP_RETURN DATA HERE', 'utf8')]); nerve.bitcoin.estimateTxSize(3, 1, 1, 1, 1, 1, [Buffer.from('YOUR Taproot OP_RETURN DATA HERE', 'utf8')]); let add = bitcore.Address.fromString("tb1p84mvl77xm8gk0je5fcqdjqda4vs7a58dhgcpnw0hrkkrk0mdjh4qyect2y", 'testnet'); console.log(add.isPayToPublicKeyHash()); console.log(add.isPayToScriptHash()); console.log(add.isPayToWitnessPublicKeyHash()); console.log(add.isPayToTaproot());*/ // dataTest(); // createLegacyTxTest();// dd8ea832075bbc06ea001540c8cd9266c4e0b8b9412c66ed172bed4f1aaabc4f // createNestedSegwitTxTest();// 40f75c8e1807d966b6e5cd44005b5881caec13be656cff780f1b32da9a28f132 // createNativeSegwitTxTest();// 84ca24ef56b9eb57e27a0b74e38ccb31b0416678b65b27f89b53cb4f9a0b7544 // createTaprootTxTest();// 0073297d32373a7ec869b4f75f6d8d7e0e163e44debded4c4889ad605a7c9a64 async function test() { let feeRate = await nerve.bitcoin.getFeeRate(false, true); console.log(feeRate); // let a = await nerve.bitcoin.getUtxos(false, 'tb1qnwnk40t55dsgfd4nuz5aq8sflj8vanh5nskec5'); // console.log(a); // let b = await nerve.bitcoin.getUtxos(true, 'bc1pdgv0kguuwwn9q5qp5e896jxlq346xmpfzfy7a8hy0hewsstegf5s2mjfx9'); // console.log(b); } /*let psbt = bitcoin.Psbt.fromHex('70736274ff0100c90200000003a9ca7f4e28aca6b92119800236bdc7f847ae3c7cd384c9b009b9b7895b112d5d0000000000ffffffff64b29ded4b31c3ad3c4f1f31627f5d6526716767c2b619512907fbbc09ad03b10000000000ffffffffc0f61fe9093e9851e4144ad7f94fb3235f4acc24e502f60d44a6ad5cb9616e460100000000ffffffff02a0860100000000001976a9149393d5936cf79b3b480b52f9652c2f2bf04d270088ac0b911c00000000001976a9149393d5936cf79b3b480b52f9652c2f2bf04d270088ac0000000000010122e8030000000000001976a9149393d5936cf79b3b480b52f9652c2f2bf04d270088ac00010122e8030000000000001976a9149393d5936cf79b3b480b52f9652c2f2bf04d270088ac000101229d111e00000000001976a9149393d5936cf79b3b480b52f9652c2f2bf04d270088ac000000'); let outputs = psbt.txOutputs; console.log(outputs); let tx = psbt.extractTransaction(false); console.log(psbt); console.log(tx);*/ // console.log('signed tx', bitcoin.Psbt.fromHex('70736274ff0100cc02000000029f37a189d6642dfe0d0bf2cd9acfb27db020316798143360917f19eede649f4c0200000000ffffffffa999de39f068e9e79799d4a87944abc4041a32d5db73cca93326a3f3895ccf330100000000ffffffff0300000000000000001a6a18546170726f6f74207478206372656174696f6e2074657374a03b0100000000001976a9146e08011a2a94059cf1545cc1da29f51d73efee8688ac543201000000000022512082aaf1d6413627de1b6f6594d23e77a3b82ef3aaff0214bcbab640726eb9218e000000000001012b320c01000000000022512082aaf1d6413627de1b6f6594d23e77a3b82ef3aaff0214bcbab640726eb9218e01084201404414c3c81319c4bd7ef6d4e2c3af9d149482f0bf50c71c2ebaf906864d753565a49ce1683f7ed35a85e32f1f09441f123dec8dd34c78a819d6d54254746eb8430001012bb06201000000000022512082aaf1d6413627de1b6f6594d23e77a3b82ef3aaff0214bcbab640726eb9218e010842014066ad6f57ba56ad03843ebe2d79c01d3b0e374430560c557bf670c53b79f394e9bd072ac3550606e91c4464425df4fd43c9ef90912102066df66f48233b0eabd700000000').extractTransaction().toHex()) function calcSizeTest() { let utxos = [ {amount: 123}, {amount: 12}, {amount: 12}, {amount: 1050}, {amount: 130}, {amount: 100}, {amount: 2230}, ]; let {size, fee} = nerve.bitcoin.calcSpendingUtxosAndFee(false, 0, utxos, 'mqYkDJboJGMa7XJjrVm3pDxYwB6icxTQrW', 500, 1, [Buffer.from("bc1pdgv0kguuwwn9q5qp5e896jxlq346xmpfzfy7a8hy0hewsstegf5s2mjfx9", 'utf8')]) console.log(size, fee); } async function calcSizeTest1() { const mainnet = false; const pubkeyHex = "03f93d5fb9db5386a6851a3a8d308609a069d599aa7c60b7e34dcc5b946e94dfa9"; const senderAddress = 'mwyEyEL2bvP2f2LUiuFCFxEqr5UgHjJ7NM'; const utxos = await nerve.bitcoin.getUtxos(mainnet, senderAddress, 10000); const receiveAddress = "2NDu3vcpjyiMgvRjDpQfbyh9uF2McfDJ3NF"; const feeRate = await nerve.bitcoin.getFeeRate(mainnet); const txData = new BitcoinRechargeData(); txData.to = 'TNVTdTSPMvHcrsgCsGKxsbjQn66W4QN2Azo4r'; txData.value = 10000; const opReturnBuffer = txData.serialize(); const opReturnArray = [ opReturnBuffer ]; const sendAmount = txData.value; const addrType = nerve.bitcoin.checkAddressType(mainnet, senderAddress); let {size, fee} = nerve.bitcoin.calcSpendingUtxosAndFee(mainnet, addrType, utxos, receiveAddress, sendAmount, feeRate, opReturnArray); console.log(size, fee); } // pubkeyA: 03b77df3d540817d20d3414f920ccec61b3395e1dc1ef298194e5ff696e038edd9, priA: c48f55dbe619e83502be1f72c875ed616aeaab6108196f0d644d72e992f6a155 // pubkeyB: 024173f84acb3de56b3ef99894fa3b9a1fe4c48c1bdc39163c37c274cd0334ba75, priA: 30002e81d449f16b69bc3e06918ff6ff088863edef8a0ba3d9b06fe5d02744d7 // pubkeyC: 02c0a82ba398612daa4133a891b3f52832114e0d3d6210348543f1872020556ded, priA: ce608d31bfd260ab5a4098d45c8130fdf407753dfcd88bcb366ae8f362b0c8ba function nativeSegwitMultiSignTx() { let network = bitcoin.networks.testnet; const p2ms = bitcoin.payments.p2ms({ m: 2, pubkeys: [ Buffer.from('03b77df3d540817d20d3414f920ccec61b3395e1dc1ef298194e5ff696e038edd9', 'hex'), Buffer.from('024173f84acb3de56b3ef99894fa3b9a1fe4c48c1bdc39163c37c274cd0334ba75', 'hex'), Buffer.from('02c0a82ba398612daa4133a891b3f52832114e0d3d6210348543f1872020556ded', 'hex'), ], network}); const p2wsh = bitcoin.payments.p2wsh({redeem: p2ms, network}) console.log('P2WSH address', p2wsh.address); console.log('p2ms.output', p2ms.output.toString('hex')); console.log('p2wsh.redeem.output', p2wsh.redeem.output.toString('hex')); const psbt = new bitcoin.Psbt({network}) .addInput({ hash: 'a2265316922e3e749271103ed215cd36ec607341ec33ed45032dc1c2b462c791', index: 1, witnessScript: p2wsh.redeem.output, witnessUtxo: { script: Buffer.from('0020' + bitcoin.crypto.sha256(p2ms.output).toString('hex'), 'hex'), value: 179724, } }) .addOutput({ address: 'mmLahgkWGHQSKszCDcZXPooWoRuYhQPpCF', value: 7100, }) .addOutput({ address: 'tb1q7xe4hh34v66nep9qz9dj850l0e02deasua2lryse9p648kcegyrsysrarw', value: 179724 - 7100 - 300, }); psbt.addOutput({ script: bitcoin.payments.embed({data: [Buffer.from('withdraw 581a896871161de3b879853cfef41b3bdbf69113ba66b0b9f699535f72a5ba68', 'utf8')]}).output, value: 0, }); const keyPairAlice1 = ECPair.fromWIF('cUAngTZ4WSbrkE7vRG8Qh2emAUdHAogN5CN9SHTXk3ohH7FQMgFH', network); const keyPairBob1 = ECPair.fromWIF('cPC1TgQ7WCwJMjMfFjMt3Bbri6nbgjs5SQT4PcmffWjKFvQjcVsJ', network); psbt.signInput(0, keyPairAlice1) .signInput(0, keyPairBob1); // psbt.validateSignaturesOfInput(0, bitcoin.Psbt. Buffer.from('03b77df3d540817d20d3414f920ccec61b3395e1dc1ef298194e5ff696e038edd9', 'hex')); // psbt.validateSignaturesOfInput(0, Buffer.from('024173f84acb3de56b3ef99894fa3b9a1fe4c48c1bdc39163c37c274cd0334ba75', 'hex')); psbt.finalizeAllInputs(); console.log('Transaction hexadecimal:'); console.log(psbt.extractTransaction().toHex()); } function nativeSegwitMultiSignTxFor10Of15() { let network = bitcoin.networks.testnet; let eckeys = []; for (let i=0;i<15;i++) { eckeys.push(ECPair.makeRandom({network})); } let _pubkeys = []; for (let i=0;i<15;i++) { _pubkeys.push(eckeys[i].publicKey); } const p2ms = bitcoin.payments.p2ms({ m: 10, pubkeys: _pubkeys, network}); const p2wsh = bitcoin.payments.p2wsh({redeem: p2ms, network}) console.log('P2WSH address', p2wsh.address); const psbt = new bitcoin.Psbt({network}) .addInput({ hash: '668faa5aaea6319336290c2778edc099228fae0e099b2d4170a4903d4d9f38c2', index: 0, witnessScript: p2wsh.redeem.output, witnessUtxo: { script: Buffer.from('0020' + bitcoin.crypto.sha256(p2ms.output).toString('hex'), 'hex'), value: 187252, } }) // .addInput({ // hash: '668faa5aaea6319336290c2778edc099228fae0e099b2d4170a4903d4d9f38c3', // index: 0, // witnessScript: p2wsh.redeem.output, // witnessUtxo: { // script: Buffer.from('0020' + bitcoin.crypto.sha256(p2ms.output).toString('hex'), 'hex'), // value: 187252, // } // }) .addOutput({ address: 'mmLahgkWGHQSKszCDcZXPooWoRuYhQPpCF', value: 7252, }) .addOutput({ address: p2wsh.address, value: 187252 - 7252 - 276, }); psbt.addOutput({ script: bitcoin.payments.embed({data: [Buffer.from('withdraw 581a896871161de3b879853cfef41b3bdbf69113ba66b0b9f699535f72a5ba68', 'utf8')]}).output, value: 0, }); for (let i=0;i<10;i++) { psbt.signInput(0, eckeys[i]) } // psbt.validateSignaturesOfInput(0, Buffer.from('03b77df3d540817d20d3414f920ccec61b3395e1dc1ef298194e5ff696e038edd9', 'hex')); // psbt.validateSignaturesOfInput(0, Buffer.from('024173f84acb3de56b3ef99894fa3b9a1fe4c48c1bdc39163c37c274cd0334ba75', 'hex')); psbt.finalizeAllInputs(); console.log('Transaction hexadecimal:'); console.log(psbt.extractTransaction().toHex()); } function testTxSizeOfWithdrawalBTC() { let utxoSize = 2; let txSize = nerve.bitcoin.calcTxSizeWithdrawal(utxoSize); console.log('txSize', txSize); } async function testWithdrawalFee() { let mainnet = false; let currentMultiSignAddr = 'tb1qtskq8773jlhjqm7ad6a8kxhxleznp0nech0wpk0nxt45khuy0vmqwzeumf'; const utxos = await nerve.bitcoin.getUtxos(mainnet, currentMultiSignAddr); let amount = 300000; let feeRate = await nerve.bitcoin.getFeeRate(mainnet); let fee = nerve.bitcoin.calcFeeWithdrawal(utxos, amount, feeRate); console.log('fee', fee, 'feeRate', feeRate); } async function testGetMinimumFeeOfWithdrawal() { nerve.testnet(); let nerveTxHash = 'ffcc90da59b4590e031c32890212c26bffd0aafea35d5c9ed3e2d3ff2573efdd'; let feeInfo = await nerveUtil.getMinimumFeeOfWithdrawal(201, nerveTxHash); console.log(JSON.stringify(feeInfo)) } /* 满足Nerve底层的手续费要求 */ function testAddFeeOfWithdrawalI() { nerve.testnet(); let nerveTxHash = ''; let mainnet = nerve.chainId() == 9; let feeInfo = nerveUtil.getMinimumFeeOfWithdrawal(201, nerveTxHash); let minimumFee = feeInfo.minimumFee; //todo 1. minimumFee是BTC资产,需转换成用户支付的手续费资产,再和用户已支付的手续费数量比较 // 2. 不够则追加,发普通追加手续费交易 } /* 满足BTC网络的矿工打包的手续费要求 */ function testAddFeeOfWithdrawalII() { nerve.testnet(); let nerveTxHash = ''; let mainnet = nerve.chainId() == 9; let feeInfo = nerveUtil.getMinimumFeeOfWithdrawal(201, nerveTxHash); let utxoSize = feeInfo.utxoSize; let feeRateOnTx = feeInfo.feeRate; let feeRateOnNetwork = nerve.bitcoin.getFeeRate(mainnet); if (feeRateOnNetwork > feeRateOnTx && (feeRateOnNetwork - feeRateOnTx > 2)) { let txSize = nerve.bitcoin.calcTxSizeWithdrawal(utxoSize); let needAddFee = txSize * (feeRateOnNetwork - feeRateOnTx); //todo 1. needAddFee是BTC资产,需转换成用户支付的手续费资产 // 2. 按换算出来的数量追加,发`特殊`的追加手续费交易 // 参考以下追加 withdrawalAddFeeTest() } } /** * 异构链提现追加手续费交易 */ async function withdrawalAddFeeTest(pri, fromAddress, withdrawalTxHash, addFeeAmount, feeChain, remark) { // 默认使用NVT作为跨链手续费 if (!feeChain || feeChain == '') { feeChain = 'NVT'; } // 获取手续费资产信息 let feeCoin = NERVE_INFO.htgMainAsset[feeChain]; let feeAddress = nerve.getAddressByPub(NERVE_INFO.chainId, NERVE_INFO.assetId, NERVE_INFO.feePubkey, NERVE_INFO.prefix); let transferInfo = { fromAddress: fromAddress, toAddress: feeAddress,//this.info.blockHoleAddress, fee: 0, chainId: feeCoin.chainId, assetId: feeCoin.assetId, feeCoin: feeCoin, amount: addFeeAmount, }; let inOrOutputs = await inputsOrOutputs(transferInfo); //console.log(inOrOutputs); if (!inOrOutputs.success) { throw "inputs、outputs组装错误"; } let tAssemble = await nerve.transactionAssemble( inOrOutputs.data.inputs, inOrOutputs.data.outputs, remark, 56, { txHash: withdrawalTxHash, extend: '020000' } ); //获取hash let hash = await tAssemble.getHash(); //交易签名 let txSignature = await sdk.getSignData(hash.toString('hex'), pri); //通过拼接签名、公钥获取HEX let signData = await sdk.appSplicingPub(txSignature.signValue, sdk.getPub(pri)); tAssemble.signatures = signData; let txhex = tAssemble.txSerialize().toString("hex"); console.log(txhex.toString('hex')); // let result = await nerve.broadcastTx(txhex); // console.log(result); } // test(); // const k1 = require("tiny-secp256k1"); // const {isPoint} = require("tiny-secp256k1"); // const {isPrivate} = require("tiny-secp256k1"); // k1.isPrivate(Buffer.from("b77df3d540817d20d3414f920ccec61b3395e1dc1ef298194e5ff696e038edd9").valueOf()) // console.log(k1.__initializeContext()) // console.log(k1.sign(Buffer.from("581a896871161de3b879853cfef41b3bdbf69113ba66b0b9f699535f72a5ba68", 'hex').valueOf(), Buffer.from("4173f84acb3de56b3ef99894fa3b9a1fe4c48c1bdc39163c37c274cd0334ba75", 'hex').valueOf())) async function createLegacyPbstTest() { const mainnet = false; const pubkeyHex = '0218509f52e47491df3b8331cbb3d2c784512c5ffb58689413a748a0c9fbd77aa5'; const senderAddress = 'mqYkDJboJGMa7XJjrVm3pDxYwB6icxTQrW'; const utxos = await nerve.bitcoin.getUtxos(mainnet, senderAddress); const receiveAddress = "mmLahgkWGHQSKszCDcZXPooWoRuYhQPpCF"; // const feeRate = await nerve.bitcoin.getFeeRate(mainnet); const feeRate = 100; const opReturnArray = []; const sendAmount = 5000; const pbstHex = await nerve.bitcoin.createLegacyTx(mainnet, pubkeyHex, utxos, receiveAddress, sendAmount, feeRate, opReturnArray); console.log('pbstHex', pbstHex); } // createLegacyPbstTest(); async function processLegacyPsbt(psbtHex) { let psbt = bitcoin.Psbt.fromHex(psbtHex); let inputs = psbt.txInputs; for (let i = 0; i < inputs.length; i++) { let input = inputs[i]; let preHash = input.hash.toString('hex'); let preTxHex = await nerve.bitcoin.getrawtransaction(mainnet, utxo.txid);// 请求网络,根据txHash请求rawTx psbt.updateInput(i, {nonWitnessUtxo: Buffer.from(preTxHex, 'hex')}); } return psbt.toHex(); } /*let psbt = bitcoin.Psbt.fromHex("70736274ff01008f0100000001188feea4d9e4a46028f17b21ebc98426f9d2819e625142ee4f407621309a8e560000000000fdffffff0388130000000000001976a9143fda920e686292be324b438d6509123ecd8e1e9f88acfe740200000000001976a9146e08011a2a94059cf1545cc1da29f51d73efee8688ac00000000000000000f6a0d74657374207073627420686578000000000000000000"); let inputs = psbt.txInputs; psbt.updateInput(0, {nonWitnessUtxo: Buffer.from('0100000001bc3be3e8e4c4367b63c2d6a59b6d1e9052ba0f44ff9fe300a5439607ec7fda4c010000006a47304402204fdec92dde647b4a265da3227c6bcd3efb6b415eb3fe727b71c3fb85cec943c7022033cbf5b0d2824fe0347810b1e7877e561ae30695b72da7e15bab6f9e8a78b4328121039087cc88855da54458e231c50cb76300334abe46553d3c7a76bc8af0852b87f0fdffffff028e0c0300000000001976a9146e08011a2a94059cf1545cc1da29f51d73efee8688acdcf10100000000001976a9143fda920e686292be324b438d6509123ecd8e1e9f88ac00000000', 'hex')}); console.log(psbt.toHex());*/ // console.log(inputs); // let psbt2 = bitcoin.Psbt.fromHex("70736274ff0100770200000001188feea4d9e4a46028f17b21ebc98426f9d2819e625142ee4f407621309a8e560000000000ffffffff0288130000000000001976a9143fda920e686292be324b438d6509123ecd8e1e9f88ac9e920200000000001976a9146e08011a2a94059cf1545cc1da29f51d73efee8688ac00000000000100e10100000001bc3be3e8e4c4367b63c2d6a59b6d1e9052ba0f44ff9fe300a5439607ec7fda4c010000006a47304402204fdec92dde647b4a265da3227c6bcd3efb6b415eb3fe727b71c3fb85cec943c7022033cbf5b0d2824fe0347810b1e7877e561ae30695b72da7e15bab6f9e8a78b4328121039087cc88855da54458e231c50cb76300334abe46553d3c7a76bc8af0852b87f0fdffffff028e0c0300000000001976a9146e08011a2a94059cf1545cc1da29f51d73efee8688acdcf10100000000001976a9143fda920e686292be324b438d6509123ecd8e1e9f88ac00000000000000"); // let inputs2 = psbt2.txInputs; // console.log(inputs2); // createLegacyPbstTest(); function pbstConverter() { let pbstHex = '70736274ff0100a90200000001fcd832950f9f9664780743e8d65eec24d140c6827baa9d9698e301d0e34a3be20200000000fdffffff030000000000000000236a210500013fda920e686292be324b438d6509123ecd8e1e9ffd20030000000000000020030000000000002200205c2c03fbd197ef206fdd6eba7b1ae6fe4530be79c5dee0d9f332eb4b5f847b36a0cf0000000000001600149ba76abd74a36084b6b3e0a9d01e09fc8ececef4000000000001011fd43c0100000000001600149ba76abd74a36084b6b3e0a9d01e09fc8ececef401086c02483045022100f730a44c07fec517ed138ee297864bfbf2df6ffe5f3ab35b00c9a6bf5c3544bd02204934ab30aef9c143e80483993f6db766b9674e934ed08936aabddbd9535d138d0121026bcdc8821c9d7288b6bfab48ee6ed5347df45261d9a5ea88e27cbccc457c5c6e00000000'; let tx = bitcoin.Psbt.fromHex(pbstHex).extractTransaction(true); console.log('txHex', tx.toHex()); } function testTxSize() { const txData = new BitcoinRechargeData(); txData.to = 'TNVTdTSPJJMGh7ijUGDqVZyucbeN1z4jqb1ad'; txData.value = 800; const opReturnBuffer = txData.serialize(); const opReturnArray = [ opReturnBuffer ]; let size = nerve.bitcoin.estimateTxSize(2, 1, 0, 0, 2, 0, opReturnArray, 1); console.log('size', size); } // pbstConverter(); // createNativeSegwitTxTest(); // testTxSize(); console.log(nerve.bitcoin.checkAddressType(false, 'n444mLdfyD1d347pFRyasP2EE37h3afQaT'));