diff options
| author | Adam Soltys <[email protected]> | 2020-01-26 20:22:47 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2020-01-26 20:22:47 -0800 |
| commit | c7a01f30d468405857d231e3e9dcf489d465ccf0 (patch) | |
| tree | c1af32492a1e207f054abe27daf9e68dedb8208c /sendLiquid.js | |
| parent | 9c2a909dc707c3f2baad8f86cbeea54606dbea41 (diff) | |
| download | coinos-server-c7a01f30d468405857d231e3e9dcf489d465ccf0.tar.gz coinos-server-c7a01f30d468405857d231e3e9dcf489d465ccf0.zip | |
liquid support
Diffstat (limited to 'sendLiquid.js')
| -rw-r--r-- | sendLiquid.js | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/sendLiquid.js b/sendLiquid.js new file mode 100644 index 00000000..cdfad4a1 --- /dev/null +++ b/sendLiquid.js @@ -0,0 +1,97 @@ +const bitcoin = require("bitcoinjs-lib"); +const config = require("./config"); +const reverse = require("buffer-reverse"); +const BitcoinCore = require("bitcoin-core"); + +const l = console.log; +const SATS = 100000000; + +const bc = new BitcoinCore(config.liquid); + +module.exports = (app, db, emit) => async (req, res) => { + let { address, amount } = req.body; + let rawtx, hex, fee; + l(address, amount); + + try { + amount = parseInt(amount); + + rawtx = await bc.createRawTransaction([], { + [address]: (amount / SATS).toFixed(8) + }); + + l("funding", rawtx, amount, req.user.balance); + + rawtx = await bc.fundRawTransaction(rawtx, { + subtractFeeFromOutputs: amount === req.user.balance ? [0] : [] + }); + l("raw tx", rawtx.hex); + + hex = await bc.blindRawTransaction(rawtx.hex); + + ({ fee } = rawtx); + fee = parseInt(fee * SATS); + } catch (e) { + l("wawaw", e); + return res.status(500).send(e.message); + } + + try { + await db.transaction(async transaction => { + let { balance } = await db.User.findOne({ + where: { + username: req.user.username + }, + lock: transaction.LOCK.UPDATE, + transaction + }); + + if (amount !== balance && amount + fee > balance) { + l("amount exceeds balance", amount, fee, balance); + throw new Error("insufficient funds"); + } + + req.user.balance -= amount + fee; + await req.user.save({ transaction }); + }); + } catch (e) { + l(e); + return res.status(500).send("Not enough satoshis"); + } + + try { + if (config.bitcoin.walletpass) + await bc.walletPassphrase(config.bitcoin.walletpass, 300); + + rawtx = (await bc.signRawTransactionWithWallet(hex)).hex; + let txid = await bc.sendRawTransaction(rawtx); + + let total = Math.min(amount + fee, req.user.balance); + if (req.user.balance < 0) req.user.balance = 0; + + await db.transaction(async transaction => { + await req.user.save({ transaction }); + emit(req.user.username, "user", req.user); + + const payment = await db.Payment.create( + { + amount: -total, + user_id: req.user.id, + hash: txid, + rate: app.get("ask"), + currency: "CAD", + address, + confirmed: 1 + }, + { transaction } + ); + + emit(req.user.username, "payment", payment); + }); + + res.send({ txid, amount, fees: fee }); + } catch (e) { + l(e); + return res.status(500).send(e.message); + } +}; |
