diff options
| author | Adam Soltys <[email protected]> | 2020-05-21 13:09:12 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2020-05-21 13:09:17 -0700 |
| commit | 388c1b518f0f237d777ec010f294ee580024c22d (patch) | |
| tree | 7b34fa75da606fb812f99b3db9064aba3469cb6c /routes | |
| parent | 52baac0211ef1bbf9a2c1a40f485e5f72c19e46d (diff) | |
| download | coinos-server-388c1b518f0f237d777ec010f294ee580024c22d.tar.gz coinos-server-388c1b518f0f237d777ec010f294ee580024c22d.zip | |
export psbt with no fee
Diffstat (limited to 'routes')
| -rw-r--r-- | routes/liquid/fee.js | 67 | ||||
| -rw-r--r-- | routes/liquid/send.js | 5 |
2 files changed, 50 insertions, 22 deletions
diff --git a/routes/liquid/fee.js b/routes/liquid/fee.js index d43e6e9d..24e6ff73 100644 --- a/routes/liquid/fee.js +++ b/routes/liquid/fee.js @@ -11,39 +11,68 @@ module.exports = async (req, res) => { if (recipient) emit(user.username, "to", recipient); try { + if (config.liquid.walletpass) + await lq.walletPassphrase(config.liquid.walletpass, 300); + amount = parseInt(amount); - tx = await lq.createRawTransaction( + let params = { + subtractFeeFromOutputs: amount === user.balance ? [0] : [], + }; + + let value = (amount / SATS).toFixed(8); + if (feeRate) params.feeRate = (feeRate / SATS).toFixed(8); + + let info = await lq.getAddressInfo(address); + + tx = await lq.walletCreateFundedPsbt( [], { - [address]: (amount / SATS).toFixed(8) + [address]: value, }, 0, - false, - { - [address]: asset, - } + params ); - let params = { - subtractFeeFromOutputs: amount === user.balance ? [0] : [], - }; + let decoded = await lq.decodePsbt(tx.psbt); - if (feeRate) params.feeRate = (feeRate / SATS).toFixed(8); + let { + tx: { vin, vout }, + } = decoded; - tx = await lq.fundRawTransaction(tx, params); + let change, fee; + for (let i = 0; i < vout.length; i++) { + if (vout[i].scriptPubKey) { + if (vout[i].scriptPubKey.type === "fee") fee = vout.splice(i, 1)[0]; + else if (!vout[i].scriptPubKey.addresses.includes(info.unconfidential)) + change = vout[i]; + } + } - if (config.liquid.walletpass) - await lq.walletPassphrase(config.liquid.walletpass, 300); + let psbt = await lq.createPsbt( + vin.map((input) => ({ + txid: input.txid, + vout: input.vout, + sequence: input.sequence, + })), + [ + { + [change.scriptPubKey.addresses[0]]: ( + change.value + fee.value + ).toFixed(8), + }, + { [address]: value }, + ] + ); - let blinded = await lq.blindRawTransaction(tx.hex); - let signed = await lq.signRawTransactionWithWallet(blinded); - decoded = await lq.decodeRawTransaction(signed.hex); - feeRate = Math.round((tx.fee * SATS * 1000) / decoded.vsize); + let blinded = await lq.blindPsbt(tx.psbt); + let signed = await lq.walletSignPsbt(blinded); - l.info("estimated", asset); + decoded = await lq.decodePsbt(signed.psbt); + feeRate = Math.round((decoded.fees * SATS * 1000) / decoded.vsize); + l.info("estimated", asset, feeRate ); - res.send({ feeRate, tx }); + res.send({ feeRate, tx, psbt }); } catch (e) { l.error("error estimating liquid fee", e.message); return res.status(500).send(e.message); diff --git a/routes/liquid/send.js b/routes/liquid/send.js index 5bfea060..aa2763d1 100644 --- a/routes/liquid/send.js +++ b/routes/liquid/send.js @@ -4,15 +4,14 @@ module.exports = async (req, res) => { let { user } = req; let { address, - tx: { hex } + tx: { psbt } } = req.body; const isChange = async address => (await lq.getAddressInfo(address)).ismine && (!Object.keys(addresses).includes(address) || address === user.liquid); - const unblinded = await lq.unblindRawTransaction(hex); - tx = await lq.decodeRawTransaction(unblinded.hex); + tx = await lq.decodePsbt(psbt); let totals = {}; let change = {}; |
