constaxios=require("axios");constbitcoin=require("bitcoinjs-lib");constcoinselect=require("coinselect");constsplit=require("coinselect/split");constapi=prod?"https://blockstream.info/api":"http://localhost:3095";constSATS=100000000;constnetwork=prod?bitcoin.networks["bitcoin"]:bitcoin.networks["regtest"];module.exports=async({address,amount,feeRate,replaceable,user})=>{if(!feeRate)feeRate=(awaitbc.estimateSmartFee(6)).feerate*SATS;feeRate=Math.round(feeRate/1000);constpayments=awaitdb.Payment.findAll({where:{received:true,account_id:user.account_id,network:'bitcoin',}});constaddresses=[...newSet(payments.map(p=>p.address))];constutxos=[];for(leti=0;i<addresses.length;i++){try{utxos.push(...(awaitaxios.get(`${api}/address/${addresses[i]}/utxo`)).data);}catch(e){l.error("problem fetching utxos",e.message);}}lettargets=[{address,value:amount}];let{inputs,outputs,fee}=coinselect(utxos,targets,feeRate);if(!inputs||!outputs){l.info("utxos",amount,feeRate,utxos.map(u=>u.value));thrownewError("Couldn't find inputs for transaction, check your balance/fee");}letpsbt=newbitcoin.Psbt({network});lettotal=0;outputs.map(({address,value})=>{total+=value;if(!address){address=payments[payments.length-1].address;change.push(address);}psbt=psbt.addOutput({address,value});});for(leti=0;i<inputs.length;i++){let{txid,vout}=inputs[i];letnonWitnessUtxo=Buffer.from(awaitbc.getRawTransaction(txid),"hex");psbt=psbt.addInput({hash:txid,index:vout,nonWitnessUtxo});}if(replaceable)psbt.setInputSequence(0,0xffffffff-2);feeRate=Math.round(feeRate*1000);psbt=psbt.toBase64();return{tx:psbt,feeRate};};