diff options
| author | Adam Soltys <[email protected]> | 2020-03-11 15:10:40 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2020-03-11 15:10:40 -0700 |
| commit | c0888fab024cc9f7c99812bfabf9d7774312dbf7 (patch) | |
| tree | cad95683af97432f6092a2c2bae10fbb7a588db5 /sendLiquid.js | |
| parent | bf2b51f0c2ae9b8f0f330dde6411e45fc0da8a25 (diff) | |
| download | coinos-server-c0888fab024cc9f7c99812bfabf9d7774312dbf7.tar.gz coinos-server-c0888fab024cc9f7c99812bfabf9d7774312dbf7.zip | |
refactor
Diffstat (limited to 'sendLiquid.js')
| -rw-r--r-- | sendLiquid.js | 105 |
1 files changed, 0 insertions, 105 deletions
diff --git a/sendLiquid.js b/sendLiquid.js deleted file mode 100644 index a86395a2..00000000 --- a/sendLiquid.js +++ /dev/null @@ -1,105 +0,0 @@ -const bitcoin = require("bitcoinjs-lib"); -const config = require("./config"); -const reverse = require("buffer-reverse"); -const BitcoinCore = require("bitcoin-core"); - -const l = require("pino")(); -const toSats = n => parseInt((n * 100000000).toFixed()) - -const bc = new BitcoinCore(config.liquid); - -module.exports = (addresses, app, db, emit) => async (req, res) => { - let { user } = req; - let { - address, - tx: { hex } - } = req.body; - - const isChange = async address => - !((await bc.getAddressInfo(address)).ismine) || - !Object.keys(addresses).includes(address) || - address === user.liquid; - - const unblinded = await bc.unblindRawTransaction(hex); - tx = await bc.decodeRawTransaction(unblinded.hex); - - let total = 0; - let change = 0; - let fee = 0; - - for (let i = 0; i < tx.vout.length; i++) { - let o = tx.vout[i]; - total += toSats(o.value); - if (o.scriptPubKey.type === 'fee') fee = toSats(o.value); - - if (o.scriptPubKey.addresses) { - if ((await isChange(o.scriptPubKey.addresses[0]))) { - change += toSats(o.value); - } - } - } - - total = total - change; - let amount = total - fee; - - try { - await db.transaction(async transaction => { - let { balance } = await db.User.findOne({ - where: { - username: user.username - }, - lock: transaction.LOCK.UPDATE, - transaction - }); - - if (amount !== balance && total > balance) { - l.warn("amount exceeds balance", { amount, fee, balance }); - throw new Error("insufficient funds"); - } - - req.user.balance -= total; - await user.save({ transaction }); - }); - } catch (e) { - l.error("balance check failed", e); - return res.status(500).send("Not enough satoshis"); - } - - try { - if (config.liquid.walletpass) - await bc.walletPassphrase(config.liquid.walletpass, 300); - - hex = await bc.blindRawTransaction(hex); - rawtx = (await bc.signRawTransactionWithWallet(hex)).hex; - let txid = await bc.sendRawTransaction(rawtx); - - await db.transaction(async transaction => { - await user.save({ transaction }); - emit(user.username, "user", user); - l.info("total", total); - - const payment = await db.Payment.create( - { - amount: -total, - fee, - user_id: user.id, - hash: txid, - rate: app.get("rates")[user.currency], - currency: user.currency, - address, - confirmed: true, - received: false, - asset: 'LBTC' - }, - { transaction } - ); - - l.info("sent liquid", user.username, total); - emit(user.username, "payment", payment); - res.send(payment); - }); - } catch (e) { - l.error("liquid send failed", e); - return res.status(500).send(e.message); - } -}; |
