From 76339f1621ac104cf10243e57818e885e0b19042 Mon Sep 17 00:00:00 2001 From: sairajzero Date: Thu, 20 Oct 2022 04:23:35 +0530 Subject: [PATCH] Optimization and Bug fix - Renamed all `status` columns to `r_status` - r_status uses INT instead of VARCHAR - status-codes are used instead of strings - Codes for status and modes can be found at floExchangeAPI.processCode - Merged DepositCoin, WithdrawCoin, DepositToken, WithdrawToken into VaultTransactions so that all deposit/withdraw transactions can be viewed in order - Updated relevant SQL syntaxes for the above - Converted all multi-valued placeholders in SQL queries to array based placeholders - Fixed minor bugs --- args/schema.sql | 86 ++++----------- args/truncateAll.sql | 5 +- docs/scripts/floExchangeAPI.js | 17 +++ src/_constants.js | 4 - src/background.js | 186 +++++++++++++++------------------ src/backup/slave.js | 4 +- src/blockchain.js | 67 +++++------- src/coupling.js | 14 +-- src/main.js | 8 +- src/market.js | 65 ++++++------ src/price.js | 2 +- src/request.js | 2 +- src/services/bobs-fund.js | 7 +- src/services/bonds.js | 7 +- src/services/conversion.js | 54 +++++----- 15 files changed, 228 insertions(+), 300 deletions(-) diff --git a/args/schema.sql b/args/schema.sql index 4c6652b..198cace 100644 --- a/args/schema.sql +++ b/args/schema.sql @@ -114,43 +114,16 @@ CREATE TABLE BuyOrder ( FOREIGN KEY (asset) REFERENCES AssetList(asset) ); -CREATE TABLE DepositCoin ( +CREATE TABLE VaultTransactions ( id INT NOT NULL AUTO_INCREMENT, - txid VARCHAR(128) NOT NULL, floID CHAR(34) NOT NULL, - coin VARCHAR(8) NOT NULL, + mode BIT NOT NULL, + asset_type BIT NOT NULL, + asset VARCHAR(32), amount DECIMAL(16, 8), - status VARCHAR(50) NOT NULL, - PRIMARY KEY(id) -); - -CREATE TABLE WithdrawCoin ( - id INT NOT NULL AUTO_INCREMENT, txid VARCHAR(128), - floID CHAR(34) NOT NULL, - coin VARCHAR(8) NOT NULL, - amount DECIMAL(16, 8) NOT NULL, - status VARCHAR(50) NOT NULL, - PRIMARY KEY(id) -); - -CREATE TABLE DepositToken ( - id INT NOT NULL AUTO_INCREMENT, - txid VARCHAR(128) NOT NULL, - floID CHAR(34) NOT NULL, - token VARCHAR(64), - amount DECIMAL(16, 8), - status VARCHAR(50) NOT NULL, - PRIMARY KEY(id) -); - -CREATE TABLE WithdrawToken ( - id INT NOT NULL AUTO_INCREMENT, - txid VARCHAR(128), - floID CHAR(34) NOT NULL, - token VARCHAR(64) NOT NULL, - amount DECIMAL(16, 8) NOT NULL, - status VARCHAR(50) NOT NULL, + locktime TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + r_status TINYINT NOT NULL, PRIMARY KEY(id) ); @@ -241,7 +214,7 @@ CREATE TABLE CloseBondTransact( usd_net DECIMAL(16, 2) NOT NULL, txid VARCHAR(128), close_id VARCHAR(128), - status VARCHAR(50) NOT NULL, + r_status TINYINT NOT NULL, KEY(id), PRIMARY KEY(bond_id), FOREIGN KEY (bond_id) REFERENCES BlockchainBonds(bond_id) @@ -280,7 +253,7 @@ CREATE TABLE CloseFundTransact( usd_net DECIMAL(16, 2) NOT NULL, txid VARCHAR(128), close_id VARCHAR(128), - status VARCHAR(50) NOT NULL, + r_status TINYINT NOT NULL, KEY(id), PRIMARY KEY(fund_id, floID), FOREIGN KEY (fund_id) REFERENCES BobsFund(fund_id) @@ -293,7 +266,7 @@ CREATE TABLE ConvertFund( quantity DECIMAL(16, 8), mode BIT NOT NULL, txid VARCHAR(128), - status VARCHAR(50) NOT NULL, + r_status TINYINT NOT NULL, PRIMARY KEY(id) ); @@ -307,7 +280,7 @@ CREATE TABLE DirectConvert( in_txid VARCHAR(128), out_txid VARCHAR(128), locktime TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - status VARCHAR(50) NOT NULL, + r_status TINYINT NOT NULL, PRIMARY KEY(id) ); @@ -318,7 +291,7 @@ CREATE TABLE RefundTransact( in_txid VARCHAR(128), out_txid VARCHAR(128), locktime TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - status VARCHAR(50) NOT NULL, + r_status TINYINT NOT NULL, PRIMARY KEY(id) ) @@ -328,7 +301,7 @@ CREATE TABLE _backup ( t_name VARCHAR(64), id INT, mode BOOLEAN DEFAULT TRUE, - timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + u_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(t_name, id) ); @@ -336,7 +309,7 @@ CREATE table _backupCache( id INT AUTO_INCREMENT, t_name VARCHAR(64), data_cache LONGTEXT, - status BOOLEAN, + fail BOOLEAN, PRIMARY KEY(id) ); @@ -389,33 +362,12 @@ FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('BuyOrder', NEW.id) ON DUP CREATE TRIGGER BuyOrder_D AFTER DELETE ON BuyOrder FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('BuyOrder', OLD.id) ON DUPLICATE KEY UPDATE mode=NULL, timestamp=DEFAULT; -CREATE TRIGGER DepositCoin_I AFTER INSERT ON DepositCoin -FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('DepositCoin', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT; -CREATE TRIGGER DepositCoin_U AFTER UPDATE ON DepositCoin -FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('DepositCoin', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT; -CREATE TRIGGER DepositCoin_D AFTER DELETE ON DepositCoin -FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('DepositCoin', OLD.id) ON DUPLICATE KEY UPDATE mode=NULL, timestamp=DEFAULT; - -CREATE TRIGGER WithdrawCoin_I AFTER INSERT ON WithdrawCoin -FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('WithdrawCoin', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT; -CREATE TRIGGER WithdrawCoin_U AFTER UPDATE ON WithdrawCoin -FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('WithdrawCoin', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT; -CREATE TRIGGER WithdrawCoin_D AFTER DELETE ON WithdrawCoin -FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('WithdrawCoin', OLD.id) ON DUPLICATE KEY UPDATE mode=NULL, timestamp=DEFAULT; - -CREATE TRIGGER DepositToken_I AFTER INSERT ON DepositToken -FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('DepositToken', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT; -CREATE TRIGGER DepositToken_U AFTER UPDATE ON DepositToken -FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('DepositToken', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT; -CREATE TRIGGER DepositToken_D AFTER DELETE ON DepositToken -FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('DepositToken', OLD.id) ON DUPLICATE KEY UPDATE mode=NULL, timestamp=DEFAULT; - -CREATE TRIGGER WithdrawToken_I AFTER INSERT ON WithdrawToken -FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('WithdrawToken', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT; -CREATE TRIGGER WithdrawToken_U AFTER UPDATE ON WithdrawToken -FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('WithdrawToken', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT; -CREATE TRIGGER WithdrawToken_D AFTER DELETE ON WithdrawToken -FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('WithdrawToken', OLD.id) ON DUPLICATE KEY UPDATE mode=NULL, timestamp=DEFAULT; +CREATE TRIGGER VaultTransactions_I AFTER INSERT ON VaultTransactions +FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('VaultTransactions', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT; +CREATE TRIGGER VaultTransactions_U AFTER UPDATE ON VaultTransactions +FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('VaultTransactions', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT; +CREATE TRIGGER VaultTransactions_D AFTER DELETE ON VaultTransactions +FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('VaultTransactions', OLD.id) ON DUPLICATE KEY UPDATE mode=NULL, timestamp=DEFAULT; CREATE TRIGGER CloseBondTransact_I AFTER INSERT ON CloseBondTransact FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('CloseBondTransact', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT; diff --git a/args/truncateAll.sql b/args/truncateAll.sql index 14987a9..b289f75 100644 --- a/args/truncateAll.sql +++ b/args/truncateAll.sql @@ -4,10 +4,7 @@ TRUNCATE _backupCache; TRUNCATE AuditTrade; TRUNCATE BuyOrder; TRUNCATE Distributors; -TRUNCATE DepositCoin; -TRUNCATE DepositToken; -TRUNCATE WithdrawCoin; -TRUNCATE WithdrawToken; +TRUNCATE VaultTransactions; TRUNCATE PriceHistory; TRUNCATE RequestLog; TRUNCATE SellOrder; diff --git a/docs/scripts/floExchangeAPI.js b/docs/scripts/floExchangeAPI.js index 1b13174..3af1ae5 100644 --- a/docs/scripts/floExchangeAPI.js +++ b/docs/scripts/floExchangeAPI.js @@ -561,6 +561,23 @@ }); } + const processCode = exchangeAPI.processCode = { + ASSET_TYPE_COIN: 0, + ASSET_TYPE_TOKEN: 1, + + VAULT_MODE_DEPOSIT: 1, + VAULT_MODE_WITHDRAW: 0, + + STATUS_PENDING: 0, + STATUS_PROCESSING: 1, + STATUS_CONFIRMATION: 90, + STATUS_REJECTED: -1, + STATUS_SUCCESS: 100, + + CONVERT_MODE_GET: 1, + CONVERT_MODE_PUT: 0, + } + exchangeAPI.getAccount = function (floID, proxySecret) { return new Promise((resolve, reject) => { let request = { diff --git a/src/_constants.js b/src/_constants.js index 34e0246..50d64d2 100644 --- a/src/_constants.js +++ b/src/_constants.js @@ -33,9 +33,5 @@ module.exports = { BACKUP_INTERVAL: 5 * 60 * 1000, //5 min BACKUP_SYNC_TIMEOUT: 10 * 60 * 1000, //10 mins CHECKSUM_INTERVAL: 100, //times of BACKUP_INTERVAL - }, - sql: { - CONVERT_MODE_GET: 1, - CONVERT_MODE_PUT: 0, } } \ No newline at end of file diff --git a/src/background.js b/src/background.js index c3e0631..258fad2 100644 --- a/src/background.js +++ b/src/background.js @@ -3,6 +3,7 @@ const blockchain = require('./blockchain'); const conversion_rates = require('./services/conversion').getRate; const bond_util = require('./services/bonds').util; const fund_util = require('./services/bobs-fund').util; +const pCode = require('../docs/scripts/floExchangeAPI').processCode; const { LAUNCH_SELLER_TAG, @@ -10,19 +11,17 @@ const { } = require('./_constants')["market"]; var DB; //container for database -const _sql = require('./_constants').sql; - var updateBalance; // container for updateBalance function const verifyTx = {}; function confirmDepositFLO() { - DB.query("SELECT id, floID, txid FROM DepositCoin WHERE coin=? AND status=?", ["FLO", "PENDING"]).then(results => { + DB.query("SELECT id, floID, txid FROM VaultTransactions WHERE mode=? AND asset=? AND asset_type=? AND r_status=?", [pCode.VAULT_MODE_DEPOSIT, "FLO", pCode.ASSET_TYPE_COIN, pCode.STATUS_PENDING]).then(results => { results.forEach(r => { verifyTx.FLO(r.floID, r.txid).then(amount => { addSellChipsIfLaunchSeller(r.floID, amount).then(txQueries => { txQueries.push(updateBalance.add(r.floID, "FLO", amount)); - txQueries.push(["UPDATE DepositCoin SET status=?, amount=? WHERE id=?", ["SUCCESS", amount, r.id]]); + txQueries.push(["UPDATE VaultTransactions SET r_status=?, amount=? WHERE id=?", [pCode.STATUS_SUCCESS, amount, r.id]]); DB.transaction(txQueries) .then(result => console.debug("FLO deposited:", r.floID, amount)) .catch(error => console.error(error)) @@ -30,7 +29,7 @@ function confirmDepositFLO() { }).catch(error => { console.error(error); if (error[0]) - DB.query("UPDATE DepositCoin SET status=? WHERE id=?", ["REJECTED", r.id]) + DB.query("UPDATE VaultTransactions SET r_status=? WHERE id=?", [pCode.STATUS_REJECTED, r.id]) .then(_ => null).catch(error => console.error(error)); }); }) @@ -81,7 +80,7 @@ function addSellChipsIfLaunchSeller(floID, quantity) { let remLaunchChips = MAXIMUM_LAUNCH_SELL_CHIPS - (sold + chips) + brought; quantity = Math.min(quantity, remLaunchChips); if (quantity > 0) - resolve([["INSERT INTO SellChips(floID, asset, quantity) VALUES (?, ?, ?)", [floID, 'FLO', quantity]]]); + resolve([["INSERT INTO SellChips(floID, asset, quantity) VALUES (?)", [[floID, 'FLO', quantity]]]]); else resolve([]); }).catch(error => reject(error)) @@ -92,17 +91,17 @@ function addSellChipsIfLaunchSeller(floID, quantity) { } function confirmDepositToken() { - DB.query("SELECT id, floID, txid FROM DepositToken WHERE status=?", ["PENDING"]).then(results => { + DB.query("SELECT id, floID, txid FROM VaultTransactions WHERE mode=? AND asset_type=? AND r_status=?", [pCode.VAULT_MODE_DEPOSIT, pCode.ASSET_TYPE_COIN, pCode.STATUS_PENDING]).then(results => { results.forEach(r => { verifyTx.token(r.floID, r.txid).then(({ token, amount, flo_amount }) => { - DB.query("SELECT id FROM DepositCoin where floID=? AND coin=? AND txid=?", [r.floID, "FLO", r.txid]).then(result => { + DB.query("SELECT id FROM VaultTransactions where floID=? AND mode=? AND asset=? AND asset_type=? AND txid=?", [r.floID, pCode.VAULT_MODE_DEPOSIT, "FLO", pCode.ASSET_TYPE_TOKEN, r.txid]).then(result => { let txQueries = []; //Add the FLO balance if necessary if (!result.length) { txQueries.push(updateBalance.add(r.floID, "FLO", flo_amount)); - txQueries.push(["INSERT INTO DepositCoin(txid, floID, coin, amount, status) VALUES (?, ?, ?, ?, ?)", [r.txid, r.floID, "FLO", flo_amount, "SUCCESS"]]); + txQueries.push(["INSERT INTO VaultTransactions(txid, floID, mode, asset_type, asset, amount, r_status) VALUES (?)", [[r.txid, r.floID, pCode.VAULT_MODE_DEPOSIT, pCode.ASSET_TYPE_COIN, "FLO", flo_amount, pCode.STATUS_SUCCESS]]]); } - txQueries.push(["UPDATE DepositToken SET status=?, token=?, amount=? WHERE id=?", ["SUCCESS", token, amount, r.id]]); + txQueries.push(["UPDATE VaultTransactions SET r_status=?, asset=?, amount=? WHERE id=?", [pCode.STATUS_SUCCESS, token, amount, r.id]]); txQueries.push(updateBalance.add(r.floID, token, amount)); DB.transaction(txQueries) .then(result => console.debug("Token deposited:", r.floID, token, amount)) @@ -111,7 +110,7 @@ function confirmDepositToken() { }).catch(error => { console.error(error); if (error[0]) - DB.query("UPDATE DepositToken SET status=? WHERE id=?", ["REJECTED", r.id]) + DB.query("UPDATE VaultTransactions SET r_status=? WHERE id=?", [pCode.STATUS_REJECTED, r.id]) .then(_ => null).catch(error => console.error(error)); }); }) @@ -143,56 +142,46 @@ verifyTx.token = function (sender, txid, currencyOnly = false) { }) } -function retryWithdrawalCoin() { - DB.query("SELECT id, floID, coin, amount FROM WithdrawCoin WHERE status=?", ["PENDING"]).then(results => { - results.forEach(r => blockchain.sendCoin.retry(r.floID, r.coin, r.amount, r.id)); - }).catch(error => console.error(error)); -} - -function retryWithdrawalToken() { - DB.query("SELECT id, floID, token, amount FROM WithdrawToken WHERE status=?", ["PENDING"]).then(results => { - results.forEach(r => blockchain.sendToken.retry(r.floID, r.token, r.amount, r.id)); - }).catch(error => console.error(error)); -} - -function confirmWithdrawalFLO() { - DB.query("SELECT id, floID, amount, txid FROM WithdrawCoin WHERE coin=? AND status=?", ["FLO", "WAITING_CONFIRMATION"]).then(results => { +function retryVaultWithdrawal() { + DB.query("SELECT id, floID, asset, asset_type, amount FROM VaultTransactions WHERE mode=? AND r_status=?", [pCode.VAULT_MODE_WITHDRAW, pCode.STATUS_PENDING]).then(results => { results.forEach(r => { - floBlockchainAPI.getTx(r.txid).then(tx => { - if (!tx.blockheight || !tx.confirmations) //Still not confirmed - return; - DB.query("UPDATE WithdrawCoin SET status=? WHERE id=?", ["SUCCESS", r.id]) - .then(result => console.debug("FLO withdrawed:", r.floID, r.amount)) - .catch(error => console.error(error)) - }).catch(error => console.error(error)); + if (r.asset_type == pCode.ASSET_TYPE_COIN) { + if (r.asset == "FLO") + blockchain.withdrawAsset.retry(r.floID, r.asset, r.amount, r.id); + } else if (r.asset_type == pCode.ASSET_TYPE_TOKEN) + blockchain.withdrawAsset.retry(r.floID, r.asset, r.amount, r.id) }) - }).catch(error => console.error(error)); + }).catch(error => reject(error)) } -function confirmWithdrawalBTC() { - DB.query("SELECT id, floID, amount, txid FROM WithdrawCoin WHERE coin=? AND status=?", ["BTC", "WAITING_CONFIRMATION"]).then(results => { +function confirmVaultWithdraw() { + DB.query("SELECT id, floID, asset, asset_type, amount, txid FROM VaultTransactions WHERE mode=? AND r_status=?", [pCode.VAULT_MODE_WITHDRAW, pCode.STATUS_CONFIRMATION]).then(results => { results.forEach(r => { - btcOperator.getTx(r.txid).then(tx => { - if (!tx.blockhash || !tx.confirmations) //Still not confirmed - return; - DB.query("UPDATE WithdrawCoin SET status=? WHERE id=?", ["SUCCESS", r.id]) - .then(result => console.debug("BTC withdrawed:", r.floID, r.amount)) - .catch(error => console.error(error)) - }).catch(error => console.error(error)); - }) - }).catch(error => console.error(error)); -} - -function confirmWithdrawalToken() { - DB.query("SELECT id, floID, token, amount, txid FROM WithdrawToken WHERE status=?", ["WAITING_CONFIRMATION"]).then(results => { - results.forEach(r => { - floTokenAPI.getTx(r.txid).then(tx => { - if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed - return; - DB.query("UPDATE WithdrawToken SET status=? WHERE id=?", ["SUCCESS", r.id]) - .then(result => console.debug("Token withdrawed:", r.floID, r.token, r.amount)) - .catch(error => console.error(error)); - }).catch(error => console.error(error)); + if (r.asset_type == pCode.ASSET_TYPE_COIN) { + if (r.asset == "FLO") + floBlockchainAPI.getTx(r.txid).then(tx => { + if (!tx.blockheight || !tx.confirmations) //Still not confirmed + return; + DB.query("UPDATE VaultTransactions SET r_status=? WHERE id=?", [pCode.STATUS_SUCCESS, r.id]) + .then(result => console.debug("FLO withdrawed:", r.floID, r.amount)) + .catch(error => console.error(error)) + }).catch(error => console.error(error)); + else if (r.asset == "BTC") + btcOperator.getTx(r.txid).then(tx => { + if (!tx.blockhash || !tx.confirmations) //Still not confirmed + return; + DB.query("UPDATE VaultTransactions SET r_status=? WHERE id=?", [pCode.STATUS_SUCCESS, r.id]) + .then(result => console.debug("BTC withdrawed:", r.floID, r.amount)) + .catch(error => console.error(error)) + }).catch(error => console.error(error)); + } else if (r.asset_type == pCode.ASSET_TYPE_TOKEN) + floTokenAPI.getTx(r.txid).then(tx => { + if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed + return; + DB.query("UPDATE VaultTransactions SET r_status=? WHERE id=?", [pCode.STATUS_SUCCESS, r.id]) + .then(result => console.debug("Token withdrawed:", r.floID, r.asset, r.amount)) + .catch(error => console.error(error)); + }).catch(error => console.error(error)); }) }).catch(error => console.error(error)); } @@ -220,9 +209,9 @@ verifyTx.BTC = function (sender, txid) { } function verifyConvert() { - DB.query("SELECT id, floID, mode, in_txid, amount, quantity FROM DirectConvert WHERE status=? AND coin=?", ["PENDING", "BTC"]).then(results => { + DB.query("SELECT id, floID, mode, in_txid, amount, quantity FROM DirectConvert WHERE r_status=? AND coin=?", [pCode.STATUS_PENDING, "BTC"]).then(results => { results.forEach(r => { - if (r.mode == _sql.CONVERT_MODE_GET) { + if (r.mode == pCodeCONVERT_MODE_GET) { verifyTx.token(r.floID, r.in_txid, true).then(({ amount }) => { if (r.amount !== amount) throw ([true, "Transaction amount mismatched in blockchain"]); @@ -232,10 +221,10 @@ function verifyConvert() { }).catch(error => { console.error(error); if (error[0]) - DB.query("UPDATE DirectConvert SET status=? WHERE id=?", ["REJECTED", r.id]) + DB.query("UPDATE DirectConvert SET r_status=? WHERE id=?", [pCode.STATUS_REJECTED, r.id]) .then(_ => null).catch(error => console.error(error)); }); - } else if (r.mode == _sql.CONVERT_MODE_PUT) { + } else if (r.mode == pCodeCONVERT_MODE_PUT) { verifyTx.BTC(r.floID, r.in_txid).then(quantity => { if (r.quantity !== quantity) throw ([true, "Transaction quantity mismatched in blockchain"]); @@ -245,7 +234,7 @@ function verifyConvert() { }).catch(error => { console.error(error); if (error[0]) - DB.query("UPDATE DirectConvert SET status=? WHERE id=?", ["REJECTED", r.id]) + DB.query("UPDATE DirectConvert SET r_status=? WHERE id=?", [pCode.STATUS_REJECTED, r.id]) .then(_ => null).catch(error => console.error(error)); }); } @@ -254,32 +243,32 @@ function verifyConvert() { } function retryConvert() { - DB.query("SELECT id, floID, mode, amount, quantity FROM DirectConvert WHERE status=? AND coin=?", ["PROCESSING", "BTC"]).then(results => { + DB.query("SELECT id, floID, mode, amount, quantity FROM DirectConvert WHERE r_status=? AND coin=?", [pCode.STATUS_PROCESSING, "BTC"]).then(results => { results.forEach(r => { - if (r.mode == _sql.CONVERT_MODE_GET) + if (r.mode == pCodeCONVERT_MODE_GET) blockchain.convertToCoin.retry(r.floID, "BTC", r.quantity, r.id); - else if (r.mode == _sql.CONVERT_MODE_PUT) + else if (r.mode == pCodeCONVERT_MODE_PUT) blockchain.convertFromCoin.retry(r.floID, r.amount, r.id) }) }).catch(error => console.error(error)) } function confirmConvert() { - DB.query("SELECT id, floID, mode, amount, quantity, out_txid FROM DirectConvert WHERE status=? AND coin=?", ["WAITING_CONFIRMATION", "BTC"]).then(results => { + DB.query("SELECT id, floID, mode, amount, quantity, out_txid FROM DirectConvert WHERE r_status=? AND coin=?", [pCode.STATUS_CONFIRMATION, "BTC"]).then(results => { results.forEach(r => { - if (r.mode == _sql.CONVERT_MODE_GET) + if (r.mode == pCodeCONVERT_MODE_GET) btcOperator.getTx(r.out_txid).then(tx => { if (!tx.blockhash || !tx.confirmations) //Still not confirmed return; - DB.query("UPDATE DirectConvert SET status=? WHERE id=?", ["SUCCESS", r.id]) + DB.query("UPDATE DirectConvert SET r_status=? WHERE id=?", [pCode.STATUS_SUCCESS, r.id]) .then(result => console.debug(`${r.floID} converted ${amount} to ${r.quantity} BTC`)) .catch(error => console.error(error)) }).catch(error => console.error(error)); - else if (r.mode == _sql.CONVERT_MODE_PUT) + else if (r.mode == pCodeCONVERT_MODE_PUT) floTokenAPI.getTx(r.out_txid).then(tx => { if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed return; - DB.query("UPDATE DirectConvert SET status=? WHERE id=?", ["SUCCESS", r.id]) + DB.query("UPDATE DirectConvert SET r_status=? WHERE id=?", [pCode.STATUS_SUCCESS, r.id]) .then(result => console.debug(`${r.floID} converted ${r.quantity} BTC to ${amount}`)) .catch(error => console.error(error)); }).catch(error => console.error(error)); @@ -288,26 +277,26 @@ function confirmConvert() { } function verifyConvertFundDeposit() { - DB.query("SELECT id, floID, mode, txid FROM ConvertFund WHERE status=? AND coin=?", ["PROCESSING", "BTC"]).then(results => { + DB.query("SELECT id, floID, mode, txid FROM ConvertFund WHERE r_status=? AND coin=?", [pCode.STATUS_PROCESSING, "BTC"]).then(results => { results.forEach(r => { - if (r.mode == _sql.CONVERT_MODE_GET) { //deposit currency + if (r.mode == pCodeCONVERT_MODE_GET) { //deposit currency verifyTx.token(r.floID, r.txid, true).then(({ amount }) => { - DB.query("UPDATE ConvertFund SET status=?, amount=? WHERE id=?", ["SUCCESS", amount, r.id]) + DB.query("UPDATE ConvertFund SET r_status=?, amount=? WHERE id=?", [pCode.STATUS_SUCCESS, amount, r.id]) .then(_ => null).catch(error => console.error(error)); }).catch(error => { console.error(error); if (error[0]) - DB.query("UPDATE ConvertFund SET status=? WHERE id=?", ["REJECTED", r.id]) + DB.query("UPDATE ConvertFund SET r_status=? WHERE id=?", [pCode.STATUS_REJECTED, r.id]) .then(_ => null).catch(error => console.error(error)); }); - } else if (r.mode == _sql.CONVERT_MODE_PUT) {//deposit coin + } else if (r.mode == pCodeCONVERT_MODE_PUT) {//deposit coin verifyTx.BTC(r.floID, r.txid).then(quantity => { - DB.query("UPDATE ConvertFund SET status=?, quantity=? WHERE id=?", ["SUCCESS", quantity, r.id]) + DB.query("UPDATE ConvertFund SET r_status=?, quantity=? WHERE id=?", [pCode.STATUS_SUCCESS, quantity, r.id]) .then(_ => null).catch(error => console.error(error)); }).catch(error => { console.error(error); if (error[0]) - DB.query("UPDATE ConvertFund SET status=? WHERE id=?", ["REJECTED", r.id]) + DB.query("UPDATE ConvertFund SET r_status=? WHERE id=?", [pCode.STATUS_REJECTED, r.id]) .then(_ => null).catch(error => console.error(error)); }); } @@ -316,32 +305,32 @@ function verifyConvertFundDeposit() { } function retryConvertFundWithdraw() { - DB.query("SELECT id, mode, coin, quantity, amount FROM ConvertFund WHERE status=? AND coin=?", ["PENDING", "BTC"]).then(results => { + DB.query("SELECT id, mode, coin, quantity, amount FROM ConvertFund WHERE r_status=? AND coin=?", [pCode.STATUS_PENDING, "BTC"]).then(results => { results.forEach(r => { - if (r.mode == _sql.CONVERT_MODE_GET) //withdraw coin + if (r.mode == pCodeCONVERT_MODE_GET) //withdraw coin blockchain.convertFundWithdraw.retry(r.coin, r.quantity, r.id); - else if (r.mode == _sql.CONVERT_MODE_PUT) //withdraw currency + else if (r.mode == pCodeCONVERT_MODE_PUT) //withdraw currency blockchain.convertFundWithdraw.retry(floGlobals.currency, r.amount, r.id); }) }).catch(error => console.error(error)) } function confirmConvertFundWithdraw() { - DB.query("SELECT * FROM ConvertFund WHERE status=? AND coin=?", ["WAITING_CONFIRMATION", "BTC"]).then(results => { + DB.query("SELECT * FROM ConvertFund WHERE r_status=? AND coin=?", [pCode.STATUS_CONFIRMATION, "BTC"]).then(results => { results.forEach(r => { - if (r.mode == _sql.CONVERT_MODE_GET) { //withdraw coin + if (r.mode == pCodeCONVERT_MODE_GET) { //withdraw coin btcOperator.getTx(r.txid).then(tx => { if (!tx.blockhash || !tx.confirmations) //Still not confirmed return; - DB.query("UPDATE ConvertFund SET status=? WHERE id=?", ["SUCCESS", r.id]) + DB.query("UPDATE ConvertFund SET r_status=? WHERE id=?", [pCode.STATUS_SUCCESS, r.id]) .then(result => console.debug(`Withdraw-fund ${r.quantity} ${r.coin} successful`)) .catch(error => console.error(error)) }).catch(error => console.error(error)); - } else if (r.mode == _sql.CONVERT_MODE_PUT) {//withdraw currency + } else if (r.mode == pCodeCONVERT_MODE_PUT) {//withdraw currency floTokenAPI.getTx(r.txid).then(tx => { if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed return; - DB.query("UPDATE ConvertFund SET status=? WHERE id=?", ["SUCCESS", r.id]) + DB.query("UPDATE ConvertFund SET r_status=? WHERE id=?", [pCode.STATUS_SUCCESS, r.id]) .then(result => console.debug(`Withdraw-fund ${r.amount} ${floGlobals.currency} successful`)) .catch(error => console.error(error)); }).catch(error => console.error(error)); @@ -351,31 +340,31 @@ function confirmConvertFundWithdraw() { } function verifyRefund() { - DB.query("SELECT id, floID, in_txid FROM RefundTransact WHERE status=?", ["PENDING"]).then(results => { + DB.query("SELECT id, floID, in_txid FROM RefundTransact WHERE r_status=?", [pCode.STATUS_PENDING]).then(results => { verifyTx.token(r.floID, r.in_txid, true) .then(({ amount }) => blockchain.refundTransact.init(r.floID, amount, r.id)) .catch(error => { console.error(error); if (error[0]) - DB.query("UPDATE RefundTransact SET status=? WHERE id=?", ["REJECTED", r.id]) + DB.query("UPDATE RefundTransact SET r_status=? WHERE id=?", [pCode.STATUS_REJECTED, r.id]) .then(_ => null).catch(error => console.error(error)); }); }).catch(error => console.error(error)) } function retryRefund() { - DB.query("SELECT id, floID, amount FROM RefundTransact WHERE status=?", ["PROCESSING"]).then(results => { + DB.query("SELECT id, floID, amount FROM RefundTransact WHERE r_status=?", [pCode.STATUS_PROCESSING]).then(results => { results.forEach(r => blockchain.refundTransact.retry(r.floID, r.amount, r.id)) }).catch(error => console.error(error)) } function confirmRefund() { - DB.query("SELECT * FROM RefundTransact WHERE status=?", ["WAITING_CONFIRMATION"]).then(result => { + DB.query("SELECT * FROM RefundTransact WHERE r_status=?", [pCode.STATUS_CONFIRMATION]).then(result => { results.forEach(r => { floTokenAPI.getTx(r.txid).then(tx => { if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed return; - DB.query("UPDATE RefundTransact SET status=? WHERE id=?", ["SUCCESS", r.id]) + DB.query("UPDATE RefundTransact SET r_status=? WHERE id=?", [pCode.STATUS_SUCCESS, r.id]) .then(result => console.debug(`Refunded ${r.amount} to ${r.floID}`)) .catch(error => console.error(error)); }).catch(error => console.error(error)); @@ -384,20 +373,20 @@ function confirmRefund() { } function retryBondClosing() { - DB.query("SELECT id, floID, amount FROM CloseBondTransact WHERE status=?", ["PENDING"]).then(results => { + DB.query("SELECT id, floID, amount FROM CloseBondTransact WHERE r_status=?", [pCode.STATUS_PENDING]).then(results => { results.forEach(r => blockchain.bondTransact.retry(r.floID, r.amount, r.id)) }).catch(error => console.error(error)) } function confirmBondClosing() { - DB.query("SELECT * FROM CloseBondTransact WHERE status=?", ["WAITING_CONFIRMATION"]).then(result => { + DB.query("SELECT * FROM CloseBondTransact WHERE r_status=?", [pCode.STATUS_CONFIRMATION]).then(result => { results.forEach(r => { floTokenAPI.getTx(r.txid).then(tx => { if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed return; let closeBondString = bond_util.stringify.end(r.bond_id, r.end_date, r.btc_net, r.usd_net, r.amount, r.ref_sign, r.txid); floBlockchainAPI.writeData(global.myFloID, closeBondString, global.myPrivKey, bond_util.config.adminID).then(txid => { - DB.query("UPDATE CloseBondTransact SET status=?, close_id=? WHERE id=?", ["SUCCESS", txid, r.id]) + DB.query("UPDATE CloseBondTransact SET r_status=?, close_id=? WHERE id=?", [pCode.STATUS_SUCCESS, txid, r.id]) .then(result => console.debug("Bond closed:", r.bond_id)) .catch(error => console.error(error)); }).catch(error => console.error(error)) @@ -407,20 +396,20 @@ function confirmBondClosing() { } function retryFundClosing() { - DB.query("SELECT id, floID, amount FROM CloseFundTransact WHERE status=?", ["PENDING"]).then(results => { + DB.query("SELECT id, floID, amount FROM CloseFundTransact WHERE r_status=?", [pCode.STATUS_PENDING]).then(results => { results.forEach(r => blockchain.fundTransact.retry(r.floID, r.amount, r.id)) }).catch(error => console.error(error)) } function confirmFundClosing() { - DB.query("SELECT * FROM CloseFundTransact WHERE status=?", ["WAITING_CONFIRMATION"]).then(result => { + DB.query("SELECT * FROM CloseFundTransact WHERE r_status=?", [pCode.STATUS_CONFIRMATION]).then(result => { results.forEach(r => { floTokenAPI.getTx(r.txid).then(tx => { if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed return; let closeFundString = fund_util.stringify.end(r.fund_id, r.floID, r.end_date, r.btc_net, r.usd_net, r.amount, r.ref_sign, r.txid); floBlockchainAPI.writeData(global.myFloID, closeFundString, global.myPrivKey, fund_util.config.adminID).then(txid => { - DB.query("UPDATE CloseFundTransact SET status=?, close_id=? WHERE id=?", ["SUCCESS", txid, r.id]) + DB.query("UPDATE CloseFundTransact SET r_status=?, close_id=? WHERE id=?", [pCode.STATUS_SUCCESS, txid, r.id]) .then(result => console.debug("Fund investment closed:", r.fund_id)) .catch(error => console.error(error)); }).catch(error => console.error(error)) @@ -433,11 +422,8 @@ function processAll() { //deposit-withdraw asset balance confirmDepositFLO(); confirmDepositToken(); - retryWithdrawalCoin(); - retryWithdrawalToken(); - confirmWithdrawalFLO(); - confirmWithdrawalBTC(); - confirmWithdrawalToken(); + retryVaultWithdrawal(); + confirmVaultWithdraw(); //convert service verifyConvert(); retryConvert(); diff --git a/src/backup/slave.js b/src/backup/slave.js index 00df6e5..78c565e 100644 --- a/src/backup/slave.js +++ b/src/backup/slave.js @@ -154,7 +154,7 @@ function storeSinkShare(sinkID, keyShare, decrypt = true) { keyShare = floCrypto.decryptData(keyShare, global.myPrivKey) let encryptedShare = Crypto.AES.encrypt(keyShare, global.myPrivKey); console.log(Date.now(), '|sinkID:', sinkID, '|EnShare:', encryptedShare); - DB.query("INSERT INTO sinkShares (floID, share) VALUE (?, ?) ON DUPLICATE KEY UPDATE share=?", [sinkID, encryptedShare, encryptedShare]) + DB.query("INSERT INTO sinkShares (floID, share) VALUE (?) ON DUPLICATE KEY UPDATE share=?", [[sinkID, encryptedShare], encryptedShare]) .then(_ => null).catch(error => console.error(error)); } @@ -285,7 +285,7 @@ storeBackupData.commit = function (data, result) { break; case "rejected": console.error(result[i].reason); - promises.push(DB.query("UPDATE _backupCache SET status=FALSE WHERE id=?", data[i].id)); + promises.push(DB.query("UPDATE _backupCache SET fail=TRUE WHERE id=?", data[i].id)); break; } return Promise.allSettled(promises); diff --git a/src/blockchain.js b/src/blockchain.js index 892eedd..c60cb71 100644 --- a/src/blockchain.js +++ b/src/blockchain.js @@ -1,11 +1,12 @@ 'use strict'; +const pCode = require('../docs/scripts/floExchangeAPI').processCode; + var collectAndCall; //container for collectAndCall function from backup module var chests; //container for blockchain ids (where assets are stored) var DB; //container for database -const TYPE_TOKEN = "TOKEN", - TYPE_COIN = "COIN", +const TYPE_VAULT = "VAULT", TYPE_CONVERT = "CONVERT", TYPE_CONVERT_POOL = "CONVERT_POOL", TYPE_REFUND = "REFUND", @@ -15,8 +16,7 @@ const TYPE_TOKEN = "TOKEN", const balance_locked = {}, balance_cache = {}, callbackCollection = { - [TYPE_COIN]: {}, - [TYPE_TOKEN]: {}, + [TYPE_VAULT]: {}, [TYPE_CONVERT]: {}, [TYPE_CONVERT_POOL]: {}, [TYPE_REFUND]: {}, @@ -64,8 +64,7 @@ function getSinkID(quantity, asset, sinkList = null) { } const WITHDRAWAL_MESSAGE = { - [TYPE_COIN]: "(withdrawal from market)", - [TYPE_TOKEN]: "(withdrawal from market)", + [TYPE_VAULT]: "(withdrawal from market)", [TYPE_CONVERT]: "(convert coin)", [TYPE_CONVERT_POOL]: "(convert fund)", [TYPE_REFUND]: "(refund from market)", @@ -87,13 +86,12 @@ function sendTx(floID, asset, quantity, sinkID, sinkKey, message) { } const updateSyntax = { - [TYPE_COIN]: "UPDATE WithdrawCoin SET status=?, txid=? WHERE id=?", - [TYPE_TOKEN]: "UPDATE WithdrawToken SET status=?, txid=? WHERE id=?", - [TYPE_CONVERT]: "UPDATE DirectConvert SET status=?, out_txid=? WHERE id=?", - [TYPE_CONVERT_POOL]: "UPDATE ConvertFund SET status=?, txid=? WHERE id=?", - [TYPE_REFUND]: "UPDATE RefundTransact SET status=?, out_txid=? WHERE id=?", - [TYPE_BOND]: "UPDATE CloseBondTransact SET status=?, txid=? WHERE id=?", - [TYPE_FUND]: "UPDATE CloseFundTransact SET status=?, txid=? WHERE id=?" + [TYPE_VAULT]: "UPDATE VaultTransactions SET r_status=?, txid=? WHERE id=?", + [TYPE_CONVERT]: "UPDATE DirectConvert SET r_status=?, out_txid=? WHERE id=?", + [TYPE_CONVERT_POOL]: "UPDATE ConvertFund SET r_status=?, txid=? WHERE id=?", + [TYPE_REFUND]: "UPDATE RefundTransact SET r_status=?, out_txid=? WHERE id=?", + [TYPE_BOND]: "UPDATE CloseBondTransact SET r_status=?, txid=? WHERE id=?", + [TYPE_FUND]: "UPDATE CloseFundTransact SET r_status=?, txid=? WHERE id=?" }; function sendAsset(floID, asset, quantity, type, id) { @@ -104,7 +102,7 @@ function sendAsset(floID, asset, quantity, type, id) { if (!txid) console.error("Transaction not successful"); else //Transaction was successful, Add in DB - DB.query(updateSyntax[type], ["WAITING_CONFIRMATION", txid, id]) + DB.query(updateSyntax[type], [pCode.STATUS_CONFIRMATION, txid, id]) .then(_ => null).catch(error => console.error(error)); }).catch(error => console.error(error)).finally(_ => { delete callbackCollection[type][id]; @@ -119,32 +117,21 @@ function sendAsset(floID, asset, quantity, type, id) { }).catch(error => console.error(error)) } -function sendCoin_init(floID, coin, quantity) { - DB.query("INSERT INTO WithdrawCoin (floID, coin, amount, status) VALUES (?, ?, ?, ?)", [floID, coin, quantity, "PENDING"]) - .then(result => sendAsset(floID, coin, quantity, TYPE_COIN, result.insertId)) +function withdrawAsset_init(floID, asset, amount) { + let asset_type = ["FLO", "BTC"].includes(asset) ? pCode.ASSET_TYPE_COIN : pCode.ASSET_TYPE_TOKEN; + DB.query("INSERT INTO VaultTransactions (floID, mode, asset_type, asset, amount, r_status) VALUES (?)", [floID, pCode.VAULT_MODE_WITHDRAW, asset_type, asset, amount, pCode.STATUS_PENDING]) + .then(result => sendAsset(floID, asset, amount, TYPE_VAULT, result.insertId)) .catch(error => console.error(error)) } -function sendCoin_retry(floID, coin, quantity, id) { - if (id in callbackCollection[TYPE_COIN]) +function withdrawAsset_retry(floID, asset, amount, id) { + if (id in callbackCollection[TYPE_VAULT]) console.debug("A callback is already pending for this Coin transfer"); - else sendAsset(floID, coin, quantity, TYPE_COIN, id); -} - -function sendToken_init(floID, token, quantity) { - DB.query("INSERT INTO WithdrawToken (floID, token, amount, status) VALUES (?, ?, ?, ?)", [floID, token, quantity, "PENDING"]) - .then(result => sendAsset(floID, quantity, TYPE_TOKEN, result.insertId)) - .catch(error => console.error(error)) -} - -function sendToken_retry(floID, token, quantity, id) { - if (id in callbackCollection[TYPE_TOKEN]) - console.debug("A callback is already pending for this Token transfer"); - else sendAsset(floID, token, quantity, TYPE_TOKEN, id); + else sendAsset(floID, asset, amount, TYPE_VAULT, id); } function convertToCoin_init(floID, coin, coin_quantity, id) { - DB.query("UPDATE DirectConvert SET quantity=?, status=?, locktime=DEFAULT WHERE id=?", [coin_quantity, "PROCESSING", id]) + DB.query("UPDATE DirectConvert SET quantity=?, r_status=?, locktime=DEFAULT WHERE id=?", [coin_quantity, pCode.STATUS_PROCESSING, id]) .then(result => sendAsset(floID, coin, coin_quantity, TYPE_CONVERT, id)) .catch(error => console.error(error)) } @@ -156,7 +143,7 @@ function convertToCoin_retry(floID, coin, coin_quantity, id) { } function convertFromCoin_init(floID, currency_amount, id) { - DB.query("UPDATE DirectConvert SET amount=?, status=?, locktime=DEFAULT WHERE id=?", [currency_amount, "PROCESSING", id]) + DB.query("UPDATE DirectConvert SET amount=?, r_status=?, locktime=DEFAULT WHERE id=?", [currency_amount, pCode.STATUS_PROCESSING, id]) .then(result => sendAsset(floID, floGlobals.currency, currency_amount, TYPE_CONVERT, id)) .catch(error => console.error(error)) } @@ -186,7 +173,7 @@ function fundTransact_retry(floID, amount, id) { } function refundTransact_init(floID, amount, id) { - DB.query("UPDATE RefundTransact SET amount=?, status=?, locktime=DEFAULT WHERE id=?", [amount, "PROCESSING", id]) + DB.query("UPDATE RefundTransact SET amount=?, r_status=?, locktime=DEFAULT WHERE id=?", [amount, pCode.STATUS_PROCESSING, id]) .then(result => sendAsset(floID, floGlobals.currency, amount, TYPE_REFUND, id)) .catch(error => console.error(error)) } @@ -207,13 +194,9 @@ module.exports = { set chests(c) { chests = c; }, - sendCoin: { - init: sendCoin_init, - retry: sendCoin_retry - }, - sendToken: { - init: sendToken_init, - retry: sendToken_retry + withdrawAsset: { + init: withdrawAsset_init, + retry: withdrawAsset_retry }, convertToCoin: { init: convertToCoin_init, diff --git a/src/coupling.js b/src/coupling.js index 994c3df..7113784 100644 --- a/src/coupling.js +++ b/src/coupling.js @@ -11,7 +11,7 @@ var DB; //container for database const updateBalance = {}; updateBalance.consume = (floID, token, amount) => ["UPDATE UserBalance SET quantity=quantity-? WHERE floID=? AND token=?", [amount, floID, token]]; -updateBalance.add = (floID, token, amount) => ["INSERT INTO UserBalance (floID, token, quantity) VALUE (?, ?, ?) ON DUPLICATE KEY UPDATE quantity=quantity+?", [floID, token, amount, amount]]; +updateBalance.add = (floID, token, amount) => ["INSERT INTO UserBalance (floID, token, quantity) VALUE (?) ON DUPLICATE KEY UPDATE quantity=quantity+?", [[floID, token, amount], amount]]; const couplingInstance = {}, couplingTimeout = {}; @@ -181,7 +181,7 @@ function processOrders(seller_best, buyer_best, asset, cur_rate, quantity) { txQueries.push(updateBalance.add(buyer_best.floID, asset, quantity)); //Add SellChips to Buyer - txQueries.push(["INSERT INTO SellChips(floID, asset, base, quantity) VALUES (?, ?, ?, ?)", [buyer_best.floID, asset, cur_rate, quantity]]) + txQueries.push(["INSERT INTO SellChips(floID, asset, base, quantity) VALUES (?)", [[buyer_best.floID, asset, cur_rate, quantity]]]) //Record transaction let time = Date.now(); @@ -194,8 +194,8 @@ function processOrders(seller_best, buyer_best, asset, cur_rate, quantity) { tx_time: time, })); txQueries.push([ - "INSERT INTO TradeTransactions (seller, buyer, asset, quantity, unitValue, tx_time, txid) VALUES (?, ?, ?, ?, ?, ?, ?)", - [seller_best.floID, buyer_best.floID, asset, quantity, cur_rate, new Date(time), hash] + "INSERT INTO TradeTransactions (seller, buyer, asset, quantity, unitValue, tx_time, txid) VALUES (?)", + [[seller_best.floID, buyer_best.floID, asset, quantity, cur_rate, new Date(time), hash]] ]); return txQueries; @@ -214,11 +214,11 @@ function endAudit(sellerID, buyerID, asset, old_bal, unit_price, quantity) { DB.query("INSERT INTO AuditTrade (asset, quantity, unit_price, total_cost," + " sellerID, seller_old_cash, seller_old_asset, seller_new_cash, seller_new_asset," + " buyerID, buyer_old_cash, buyer_old_asset, buyer_new_cash, buyer_new_asset)" + - " Value (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", [ + " Value (?)", [[ asset, quantity, unit_price, quantity * unit_price, sellerID, old_bal[sellerID].cash, old_bal[sellerID].asset, new_bal[sellerID].cash, new_bal[sellerID].asset, buyerID, old_bal[buyerID].cash, old_bal[buyerID].asset, new_bal[buyerID].cash, new_bal[buyerID].asset, - ]).then(_ => null).catch(error => console.error(error)) + ]]).then(_ => null).catch(error => console.error(error)) }).catch(error => console.error(error)); } @@ -234,7 +234,7 @@ function auditBalance(sellerID, buyerID, asset) { asset: 0 } }; - DB.query("SELECT floID, quantity, token FROM UserBalance WHERE floID IN (?, ?) AND token IN (?, ?)", [sellerID, buyerID, floGlobals.currency, asset]).then(result => { + DB.query("SELECT floID, quantity, token FROM UserBalance WHERE floID IN (?) AND token IN (?)", [[sellerID, buyerID], [floGlobals.currency, asset]]).then(result => { for (let i in result) { if (result[i].token === floGlobals.currency) balance[result[i].floID].cash = result[i].quantity; diff --git a/src/main.js b/src/main.js index e94d475..3aae7d1 100644 --- a/src/main.js +++ b/src/main.js @@ -51,13 +51,13 @@ function refreshDataFromBlockchain() { promises.push(DB.query("DELETE FROM NodeList WHERE floID=?", [n])); if (content.Nodes.add) for (let n in content.Nodes.add) - promises.push(DB.query("INSERT INTO NodeList (floID, uri) VALUE (?,?) ON DUPLICATE KEY UPDATE uri=?", [n, content.Nodes.add[n], content.Nodes.add[n]])); + promises.push(DB.query("INSERT INTO NodeList (floID, uri) VALUE (?) ON DUPLICATE KEY UPDATE uri=?", [[n, content.Nodes.add[n]], content.Nodes.add[n]])); } //Asset List if (content.Assets) { assets_change = true; for (let a in content.Assets) - promises.push(DB.query("INSERT INTO AssetList (asset, initialPrice) VALUE (?,?) ON DUPLICATE KEY UPDATE initialPrice=?", [a, content.Assets[a], content.Assets[a]])); + promises.push(DB.query("INSERT INTO AssetList (asset, initialPrice) VALUE (?) ON DUPLICATE KEY UPDATE initialPrice=?", [[a, content.Assets[a]], content.Assets[a]])); } //Trusted List if (content.Trusted) { @@ -76,14 +76,14 @@ function refreshDataFromBlockchain() { promises.push(DB.query("DELETE FROM TagList WHERE tag=?", [t])); if (content.Tag.add) for (let t in content.Tag.add) - promises.push(DB.query("INSERT INTO TagList (tag, sellPriority, buyPriority) VALUE (?, ?, ?) ON DUPLICATE KEY UPDATE tag=tag", [t, content.Tag.add[t].sellPriority, content.Tag.add[t].buyPriority])); + promises.push(DB.query("INSERT INTO TagList (tag, sellPriority, buyPriority) VALUE (?) ON DUPLICATE KEY UPDATE tag=tag", [[t, content.Tag.add[t].sellPriority, content.Tag.add[t].buyPriority]])); if (content.Tag.update) for (let t in content.Tag.update) for (let a in content.Tag.update[t]) promises.push(`UPDATE TagList WHERE tag=? SET ${a}=?`, [t, content.Tag.update[t][a]]); } }); - promises.push(DB.query("INSERT INTO LastTx (floID, num) VALUE (?, ?) ON DUPLICATE KEY UPDATE num=?", [floGlobals.adminID, result.totalTxs, result.totalTxs])); + promises.push(DB.query("INSERT INTO LastTx (floID, num) VALUE (?) ON DUPLICATE KEY UPDATE num=?", [[floGlobals.adminID, result.totalTxs], result.totalTxs])); //Check if all save process were successful Promise.allSettled(promises).then(results => { //console.debug(results.filter(r => r.status === "rejected")); diff --git a/src/market.js b/src/market.js index 5d03dc4..8573434 100644 --- a/src/market.js +++ b/src/market.js @@ -13,6 +13,7 @@ const { } = require('./_constants')["market"]; const eCode = require('../docs/scripts/floExchangeAPI').errorCode; +const pCode = require('../docs/scripts/floExchangeAPI').processCode; const updateBalance = background.updateBalance = coupling.updateBalance; @@ -20,9 +21,7 @@ var DB, assetList; //container for database and allowed assets function login(floID, proxyKey) { return new Promise((resolve, reject) => { - DB.query("INSERT INTO UserSession (floID, proxyKey) VALUE (?, ?) " + - "ON DUPLICATE KEY UPDATE session_time=DEFAULT, proxyKey=?", - [floID, proxyKey, proxyKey]) + DB.query("INSERT INTO UserSession (floID, proxyKey) VALUE (?) ON DUPLICATE KEY UPDATE session_time=DEFAULT, proxyKey=?",[[floID, proxyKey], proxyKey]) .then(result => resolve("Login Successful")) .catch(error => reject(error)) }) @@ -42,8 +41,8 @@ function getRateHistory(asset, duration) { reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid asset(${asset})`)); else coupling.price.getHistory(asset, duration) - .then(result => resolve(result)) - .catch(error => reject(error)) + .then(result => resolve(result)) + .catch(error => reject(error)) }) } @@ -137,7 +136,7 @@ function addSellOrder(floID, asset, quantity, min_price) { return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid asset (${asset})`)); getAssetBalance.check(floID, asset, quantity).then(_ => { checkSellRequirement(floID, asset, quantity, min_price).then(_ => { - DB.query("INSERT INTO SellOrder(floID, asset, quantity, minPrice) VALUES (?, ?, ?, ?)", [floID, asset, quantity, min_price]).then(result => { + DB.query("INSERT INTO SellOrder(floID, asset, quantity, minPrice) VALUES (?)", [[floID, asset, quantity, min_price]]).then(result => { resolve('Sell Order placed successfully'); coupling.initiate(asset); }).catch(error => reject(error)); @@ -185,7 +184,7 @@ function addBuyOrder(floID, asset, quantity, max_price) { else if (!assetList.includes(asset)) return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid asset (${asset})`)); getAssetBalance.check(floID, floGlobals.currency, quantity * max_price).then(_ => { - DB.query("INSERT INTO BuyOrder(floID, asset, quantity, maxPrice) VALUES (?, ?, ?, ?)", [floID, asset, quantity, max_price]).then(result => { + DB.query("INSERT INTO BuyOrder(floID, asset, quantity, maxPrice) VALUES (?)", [[floID, asset, quantity, max_price]]).then(result => { resolve('Buy Order placed successfully'); coupling.initiate(asset); }).catch(error => reject(error)); @@ -257,11 +256,7 @@ function getAccountDetails(floID) { function getUserTransacts(floID) { return new Promise((resolve, reject) => { - DB.query("(SELECT 'deposit' as type, txid, token, amount, status FROM DepositToken WHERE floID=?)" + - "UNION (SELECT 'deposit' as type, txid, coin as token, amount, status FROM DepositCoin WHERE floID=?)" + - "UNION (SELECT 'withdraw' as type, txid, token, amount, status FROM WithdrawToken WHERE floID=?)" + - "UNION (SELECT 'withdraw' as type, txid, coin as token, amount, status FROM WithdrawCoin WHERE floID=?)", - [floID, floID, floID, floID]) + DB.query("SELECT mode, asset, amount, txid, locktime, r_status, FROM VaultTransactions WHERE floID=?", [floID]) .then(result => resolve(result)) .catch(error => reject(error)) }) @@ -315,7 +310,7 @@ function transferToken(sender, receivers, token) { checkDistributor(sender, token).then(result => { if (result) for (let floID in receivers) - txQueries.push(["INSERT INTO SellChips (floID, asset, quantity) VALUES (?, ?, ?)", [floID, token, receivers[floID]]]); + txQueries.push(["INSERT INTO SellChips (floID, asset, quantity) VALUES (?)", [[floID, token, receivers[floID]]]]); let time = Date.now(); let hash = TRANSFER_HASH_PREFIX + Crypto.SHA256(JSON.stringify({ sender: sender, @@ -325,8 +320,8 @@ function transferToken(sender, receivers, token) { tx_time: time, })); txQueries.push([ - "INSERT INTO TransferTransactions (sender, receiver, token, totalAmount, tx_time, txid) VALUE (?, ?, ?, ?, ?, ?)", - [sender, JSON.stringify(receivers), token, totalAmount, new Date(time), hash] + "INSERT INTO TransferTransactions (sender, receiver, token, totalAmount, tx_time, txid) VALUE (?)", + [[sender, JSON.stringify(receivers), token, totalAmount, new Date(time), hash]] ]); DB.transaction(txQueries) .then(result => resolve(hash)) @@ -339,20 +334,20 @@ function transferToken(sender, receivers, token) { function depositFLO(floID, txid) { return new Promise((resolve, reject) => { - DB.query("SELECT status FROM DepositCoin WHERE txid=? AND floID=? AND coin=?", [txid, floID, "FLO"]).then(result => { + DB.query("SELECT r_status FROM VaultTransactions WHERE txid=? AND floID=? AND asset=?", [txid, floID, "FLO"]).then(result => { if (result.length) { - switch (result[0].status) { - case "PENDING": + switch (result[0].r_status) { + case pCode.STATUS_PENDING: return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process")); - case "REJECTED": + case pCode.STATUS_REJECTED: return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already rejected")); - case "SUCCESS": + case pCode.STATUS_SUCCESS: return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already used to add coins")); } } else - DB.query("INSERT INTO DepositCoin(txid, floID, coin, status) VALUES (?, ?, ?, ?)", [txid, floID, "FLO", "PENDING"]) - .then(result => resolve("Deposit request in process")) - .catch(error => reject(error)); + DB.query("INSERT INTO VaultTransactions(floID, mode, asset_type, asset, txid, r_status) VALUES (?)", [[floID, pCode.VAULT_MODE_DEPOSIT, pCode.ASSET_TYPE_COIN, "FLO", txid, pCode.STATUS_PENDING]]) + .then(result => resolve("Deposit request in process")) + .catch(error => reject(error)); }).catch(error => reject(error)) }); } @@ -367,7 +362,7 @@ function withdrawFLO(floID, amount) { let txQueries = []; txQueries.push(updateBalance.consume(floID, "FLO", amount)); DB.transaction(txQueries).then(result => { - blockchain.sendCoin.init(floID, "FLO", amount); + blockchain.withdrawAsset.init(floID, "FLO", amount); resolve("Withdrawal request is in process"); }).catch(error => reject(error)); }).catch(error => reject(error)); @@ -376,20 +371,20 @@ function withdrawFLO(floID, amount) { function depositToken(floID, txid) { return new Promise((resolve, reject) => { - DB.query("SELECT status FROM DepositToken WHERE txid=? AND floID=?", [txid, floID]).then(result => { + DB.query("SELECT r_status FROM VaultTransactions WHERE txid=? AND floID=? AND asset_type=?", [txid, floID, pCode.ASSET_TYPE_TOKEN]).then(result => { if (result.length) { - switch (result[0].status) { - case "PENDING": + switch (result[0].r_status) { + case pCode.STATUS_PENDING: return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process")); - case "REJECTED": + case pCode.STATUS_REJECTED: return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already rejected")); - case "SUCCESS": + case pCode.STATUS_SUCCESS: return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already used to add tokens")); } } else - DB.query("INSERT INTO DepositToken(txid, floID, status) VALUES (?, ?, ?)", [txid, floID, "PENDING"]) - .then(result => resolve("Deposit request in process")) - .catch(error => reject(error)); + DB.query("INSERT INTO VaultTransactions(floID, mode, asset_type, txid, r_status) VALUES (?)", [floID, pCode.VAULT_MODE_DEPOSIT, pCode.ASSET_TYPE_TOKEN, txid, pCode.STATUS_PENDING]) + .then(result => resolve("Deposit request in process")) + .catch(error => reject(error)); }).catch(error => reject(error)) }); } @@ -411,7 +406,7 @@ function withdrawToken(floID, token, amount) { txQueries.push(updateBalance.consume(floID, token, amount)); DB.transaction(txQueries).then(result => { //Send Token to user via token API - blockchain.sendToken.init(floID, token, amount); + blockchain.withdrawAsset.init(floID, token, amount); resolve("Withdrawal request is in process"); }).catch(error => reject(error)); }).catch(error => reject(error)); @@ -421,7 +416,7 @@ function withdrawToken(floID, token, amount) { function addTag(floID, tag) { return new Promise((resolve, reject) => { - DB.query("INSERT INTO UserTag (floID, tag) VALUE (?,?)", [floID, tag]) + DB.query("INSERT INTO UserTag (floID, tag) VALUE (?)", [[floID, tag]]) .then(result => resolve(`Added ${floID} to ${tag}`)) .catch(error => { if (error.code === "ER_DUP_ENTRY") @@ -444,7 +439,7 @@ function removeTag(floID, tag) { function addDistributor(floID, asset) { return new Promise((resolve, reject) => { - DB.query("INSERT INTO Distributors (floID, asset) VALUE (?,?)", [floID, asset]) + DB.query("INSERT INTO Distributors (floID, asset) VALUE (?)", [[floID, asset]]) .then(result => resolve(`Added ${asset} distributor: ${floID}`)) .catch(error => { if (error.code === "ER_DUP_ENTRY") diff --git a/src/price.js b/src/price.js index 974ba96..669e9da 100644 --- a/src/price.js +++ b/src/price.js @@ -22,7 +22,7 @@ const updateLastTime = asset => lastTime[asset] = Date.now(); //store FLO price in DB every 1 hr function storeHistory(asset, rate) { - DB.query("INSERT INTO PriceHistory (asset, rate) VALUE (?, ?)", [asset, rate.toFixed(8)]) + DB.query("INSERT INTO PriceHistory (asset, rate) VALUE (?)", [[asset, rate.toFixed(8)]]) .then(_ => null).catch(error => console.error(error)) } diff --git a/src/request.js b/src/request.js index f5f9600..b844dd7 100644 --- a/src/request.js +++ b/src/request.js @@ -95,7 +95,7 @@ validateRequest.checkIfSignUsed = sign => new Promise((resolve, reject) => { function logRequest(floID, req_str, sign, proxy = false) { //console.debug(floID, req_str); - DB.query("INSERT INTO RequestLog (floID, request, sign, proxy) VALUES (?,?,?, ?)", [floID, req_str, sign, proxy]) + DB.query("INSERT INTO RequestLog (floID, request, sign, proxy) VALUES (?)", [[floID, req_str, sign, proxy]]) .then(_ => null).catch(error => console.error(error)); } diff --git a/src/services/bobs-fund.js b/src/services/bobs-fund.js index 9aaeb60..d2171d0 100644 --- a/src/services/bobs-fund.js +++ b/src/services/bobs-fund.js @@ -1,6 +1,7 @@ 'use strict'; const eCode = require('../../docs/scripts/floExchangeAPI').errorCode; +const pCode = require('../../docs/scripts/floExchangeAPI').processCode; const getRate = require('./conversion').getRate; var DB; //container for database @@ -232,7 +233,7 @@ function refreshBlockchainData(nodeList = []) { promises.push(DB.query("UPDATE BobsFundInvestments SET close_id=? amount_out=? WHERE fund_id=? AND floID=?", [d.txid, details.amountFinal, details.fundID, details.floID])); } }); - promises.push(DB.query("INSERT INTO LastTx (floID, num) VALUE (?, ?) ON DUPLICATE KEY UPDATE num=?", [bobsFund.config.adminID, result.totalTxs, result.totalTxs])); + promises.push(DB.query("INSERT INTO LastTx (floID, num) VALUE (?) ON DUPLICATE KEY UPDATE num=?", [[bobsFund.config.adminID, result.totalTxs], result.totalTxs])); Promise.allSettled(promises).then(results => { //console.debug(results.filter(r => r.status === "rejected")); if (results.reduce((a, r) => r.status === "rejected" ? ++a : a, 0)) @@ -246,7 +247,7 @@ function refreshBlockchainData(nodeList = []) { function closeFund(fund_id, floID, ref) { return new Promise((resolve, reject) => { - DB.query("SELECT status FROM CloseFundTransact WHERE fund_id=?", [fund_id]).then(result => { + DB.query("SELECT r_status FROM CloseFundTransact WHERE fund_id=?", [fund_id]).then(result => { if (result.length) return reject(INVALID(eCode.DUPLICATE_ENTRY, `Fund closing already in process`)); DB.query("SELECT * FROM BobsFund WHERE fund_id=?", [fund_id]).then(result => { @@ -278,7 +279,7 @@ function closeFund(fund_id, floID, ref) { getRate.BTC_USD().then(btc_rate => { getRate.USD_INR().then(usd_rate => { let net_value = bobsFund.calcNetValue(fund.btc_base, btc_rate, fund.usd_base, usd_rate, investment.amount_in, fund.fee) - DB.query("INSERT INTO CloseFundTransact(fund_id, floID, amount, end_date, btc_net, usd_net, ref_sign, status) VALUE ?", [[fund_id, floID, net_value, cur_date, btc_rate, usd_rate, ref, "PENDING"]]) + DB.query("INSERT INTO CloseFundTransact(fund_id, floID, amount, end_date, btc_net, usd_net, ref_sign, r_status) VALUE ?", [[fund_id, floID, net_value, cur_date, btc_rate, usd_rate, ref, pCode.STATUS_PENDING]]) .then(result => resolve({ "USD_net": usd_rate, "BTC_net": btc_rate, "amount_out": net_value, "end_date": cur_date })) .catch(error => reject(error)) }).catch(error => reject(error)) diff --git a/src/services/bonds.js b/src/services/bonds.js index 4111031..9f34068 100644 --- a/src/services/bonds.js +++ b/src/services/bonds.js @@ -1,6 +1,7 @@ 'use strict'; const eCode = require('../../docs/scripts/floExchangeAPI').errorCode; +const pCode = require('../../docs/scripts/floExchangeAPI').processCode; const getRate = require('./conversion').getRate; var DB; //container for database @@ -204,7 +205,7 @@ function refreshBlockchainData(nodeList = []) { promises.push(DB.query("UPDATE BlockchainBonds SET close_id=? amount_out=? WHERE bond_id=?", [d.txid, details.amountFinal, details.bondID])); } }); - promises.push(DB.query("INSERT INTO LastTx (floID, num) VALUE (?, ?) ON DUPLICATE KEY UPDATE num=?", [blockchainBond.config.adminID, result.totalTxs, result.totalTxs])); + promises.push(DB.query("INSERT INTO LastTx (floID, num) VALUE (?) ON DUPLICATE KEY UPDATE num=?", [[blockchainBond.config.adminID, result.totalTxs], result.totalTxs])); Promise.allSettled(promises).then(results => { //console.debug(results.filter(r => r.status === "rejected")); if (results.reduce((a, r) => r.status === "rejected" ? ++a : a, 0)) @@ -218,7 +219,7 @@ function refreshBlockchainData(nodeList = []) { function closeBond(bond_id, floID, ref) { return new Promise((resolve, reject) => { - DB.query("SELECT status FROM CloseBondTransact WHERE bond_id=?", [bond_id]).then(result => { + DB.query("SELECT r_status FROM CloseBondTransact WHERE bond_id=?", [bond_id]).then(result => { if (result.length) return reject(INVALID(eCode.DUPLICATE_ENTRY, `Bond closing already in process`)); DB.query("SELECT * FROM BlockchainBonds WHERE bond_id=?", [bond_id]).then(result => { @@ -235,7 +236,7 @@ function closeBond(bond_id, floID, ref) { getRate.USD_INR().then(usd_rate => { let end_date = new Date(), net_value = blockchainBond.calcNetValue(bond.btc_base, btc_rate, bond.begin_date, bond.min_ipa, bond.max_period, bond.gain_cut, bond.amount_in, bond.usd_base, usd_rate); - DB.query("INSERT INTO CloseBondTransact(bond_id, floID, amount, end_date, btc_net, usd_net, ref_sign, status) VALUE ?", [[bond_id, floID, net_value, end_date, btc_rate, usd_rate, ref, "PENDING"]]) + DB.query("INSERT INTO CloseBondTransact(bond_id, floID, amount, end_date, btc_net, usd_net, ref_sign, r_status) VALUE ?", [[bond_id, floID, net_value, end_date, btc_rate, usd_rate, ref, pCode.STATUS_PENDING]]) .then(result => resolve({ "USD_net": usd_rate, "BTC_net": btc_rate, "amount_out": net_value, "end_date": end_date })) .catch(error => reject(error)) }).catch(error => reject(error)) diff --git a/src/services/conversion.js b/src/services/conversion.js index 7ec8c72..e430f0b 100644 --- a/src/services/conversion.js +++ b/src/services/conversion.js @@ -1,8 +1,8 @@ 'use strict'; -const _sql = require('../_constants').sql; const { MIN_FUND } = require('../_constants')['convert']; const eCode = require('../../docs/scripts/floExchangeAPI').errorCode; +const pCode = require('../../docs/scripts/floExchangeAPI').processCode; const allowedConversion = ["BTC"]; @@ -49,25 +49,25 @@ function checkPoolBalance(coin, req_value, mode) { if (!allowedConversion.includes(coin)) return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid coin (${coin})`)); let q = "SELECT mode, SUM(quantity) AS coin_val, SUM(amount) AS cash_val FROM (" + - "(SELECT amount, coin, quantity, mode, status FROM DirectConvert) UNION " + - "(SELECT amount, coin, quantity, mode, status FROM ConvertFund) " + - ") WHERE coin=? AND status NOT IN (?) GROUP BY mode" - DB.query(q, [coin, ["REJECTED", "REFUND"]]).then(result => { + "(SELECT amount, coin, quantity, mode, r_status FROM DirectConvert) UNION " + + "(SELECT amount, coin, quantity, mode, r_status FROM ConvertFund) " + + ") WHERE coin=? AND r_status NOT IN (?) GROUP BY mode" + DB.query(q, [coin, [pCode.STATUS_REJECTED, "REFUND"]]).then(result => { let coin_net = 0, cash_net = 0; for (let r of result) - if (r.mode == _sql.CONVERT_MODE_GET) { + if (r.mode == pCodeCONVERT_MODE_GET) { coin_net -= r.coin_val; cash_net += r.cash_val; - } else if (r.mode == _sql.CONVERT_MODE_PUT) { + } else if (r.mode == pCodeCONVERT_MODE_PUT) { coin_net += r.coin_val; cash_net -= r.cash_val; } BTC_INR().then(rate => { coin_net = coin_net * rate; let availability = -1; - if (mode == _sql.CONVERT_MODE_GET) + if (mode == pCodeCONVERT_MODE_GET) availability = coin_net - cash_net * MIN_FUND; - else if (mode == _sql.CONVERT_MODE_PUT) { + else if (mode == pCodeCONVERT_MODE_PUT) { availability = cash_net - coin_net * MIN_FUND; req_value = req_value * rate; //convert to currency value } @@ -86,17 +86,17 @@ function convertToCoin(floID, txid, coin, amount) { return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid coin (${coin})`)); else if (typeof amount !== "number" || amount <= 0) return reject(INVALID(eCode.INVALID_NUMBER, `Invalid amount (${amount})`)); - DB.query("SELECT status FROM DirectConvert WHERE in_txid=? AND floID=? AND mode=?", [txid, floID, _sql.CONVERT_MODE_GET]).then(result => { + DB.query("SELECT r_status FROM DirectConvert WHERE in_txid=? AND floID=? AND mode=?", [txid, floID, pCodeCONVERT_MODE_GET]).then(result => { if (result.length) return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process")); - checkPoolBalance(coin, amount, _sql.CONVERT_MODE_GET).then(result => { - DB.query("INSERT INTO DirectConvert(floID, in_txid, mode, coin, amount, status) VALUES (?)", [[floID, txid, _sql.CONVERT_MODE_GET, coin, amount, "PENDING"]]) + checkPoolBalance(coin, amount, pCodeCONVERT_MODE_GET).then(result => { + DB.query("INSERT INTO DirectConvert(floID, in_txid, mode, coin, amount, r_status) VALUES (?)", [[floID, txid, pCodeCONVERT_MODE_GET, coin, amount, pCode.STATUS_PENDING]]) .then(result => resolve("Conversion request in process")) .catch(error => reject(error)); }).catch(error => { if (error instanceof INVALID && error.ecode === eCode.INSUFFICIENT_FUND) - DB.query("INSERT INTO DirectConvert(floID, in_txid, mode, coin, amount, status) VALUES (?)", [[floID, txid, _sql.CONVERT_MODE_GET, coin, amount, "REFUND"]]).then(result => { - DB.query("INSERT INTO RefundTransact(floID, in_txid, amount, status) VALUES (?)", [[floID, txid, amount, "PENDING"]]) + DB.query("INSERT INTO DirectConvert(floID, in_txid, mode, coin, amount, r_status) VALUES (?)", [[floID, txid, pCodeCONVERT_MODE_GET, coin, amount, "REFUND"]]).then(result => { + DB.query("INSERT INTO RefundTransact(floID, in_txid, amount, r_status) VALUES (?)", [[floID, txid, amount, pCode.STATUS_PENDING]]) .then(_ => null).catch(error => console.error(error)); }).catch(error => console.error(error)) reject(error); @@ -113,14 +113,14 @@ function convertFromCoin(floID, txid, tx_hex, coin, quantity) { return reject(INVALID(eCode.INVALID_NUMBER, `Invalid quantity (${quantity})`)); else if (btcOperator.transactionID(tx_hex) !== txid) return reject(INVALID(eCode.INVALID_TX_ID, `txid ${txid} doesnt match the tx-hex`)); - DB.query("SELECT status FROM DirectConvert WHERE in_txid=? AND floID=? AND mode=?", [txid, floID, _sql.CONVERT_MODE_PUT]).then(result => { + DB.query("SELECT r_status FROM DirectConvert WHERE in_txid=? AND floID=? AND mode=?", [txid, floID, pCodeCONVERT_MODE_PUT]).then(result => { if (result.length) return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process")); - checkPoolBalance(coin, quantity, _sql.CONVERT_MODE_PUT).then(result => { + checkPoolBalance(coin, quantity, pCodeCONVERT_MODE_PUT).then(result => { btcOperator.broadcastTx(tx_hex).then(b_txid => { if (b_txid !== txid) console.warn("broadcast TX-ID is not same as calculated TX-ID"); - DB.query("INSERT INTO DirectConvert(floID, in_txid, mode, coin, quantity, status) VALUES (?)", [[floID, b_txid, _sql.CONVERT_MODE_PUT, coin, quantity, "PENDING"]]) + DB.query("INSERT INTO DirectConvert(floID, in_txid, mode, coin, quantity, r_status) VALUES (?)", [[floID, b_txid, pCodeCONVERT_MODE_PUT, coin, quantity, pCode.STATUS_PENDING]]) .then(result => resolve("Conversion request in process")) .catch(error => reject(error)); }).catch(error => { @@ -140,10 +140,10 @@ function depositCurrencyFund(floID, txid, coin) { return reject(INVALID(eCode.ACCESS_DENIED, 'Access Denied')); else if (!allowedConversion.includes(coin)) return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid coin (${coin})`)); - DB.query("SELECT status FROM ConvertFund WHERE txid=? AND mode=?", [txid, _sql.CONVERT_MODE_GET]).then(result => { + DB.query("SELECT r_status FROM ConvertFund WHERE txid=? AND mode=?", [txid, pCodeCONVERT_MODE_GET]).then(result => { if (result.length) return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process")); - DB.query("INSERT INTO ConvertFund(txid, mode, coin, status) VALUES (?)", [[b_txid, _sql.CONVERT_MODE_GET, coin, "PROCESSING"]]) + DB.query("INSERT INTO ConvertFund(txid, mode, coin, r_status) VALUES (?)", [[b_txid, pCodeCONVERT_MODE_GET, coin, pCode.STATUS_PROCESSING]]) .then(result => resolve("Add currency fund in process")) .catch(error => reject(error)) }).catch(error => reject(error)) @@ -156,10 +156,10 @@ function depositCoinFund(floID, txid, coin) { return reject(INVALID(eCode.ACCESS_DENIED, 'Access Denied')); else if (!allowedConversion.includes(coin)) return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid coin (${coin})`)); - DB.query("SELECT status FROM ConvertFund WHERE txid=? AND mode=?", [txid, _sql.CONVERT_MODE_PUT]).then(result => { + DB.query("SELECT r_status FROM ConvertFund WHERE txid=? AND mode=?", [txid, pCodeCONVERT_MODE_PUT]).then(result => { if (result.length) return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process")); - DB.query("INSERT INTO ConvertFund(txid, mode, coin, status) VALUES (?)", [[b_txid, _sql.CONVERT_MODE_PUT, coin, "PROCESSING"]]) + DB.query("INSERT INTO ConvertFund(txid, mode, coin, r_status) VALUES (?)", [[b_txid, pCodeCONVERT_MODE_PUT, coin, pCode.STATUS_PROCESSING]]) .then(result => resolve("Add coin fund in process")) .catch(error => reject(error)) }).catch(error => reject(error)) @@ -172,12 +172,12 @@ function withdrawCurrencyFund(floID, coin, amount) { return reject(INVALID(eCode.ACCESS_DENIED, 'Access Denied')); else if (!allowedConversion.includes(coin)) return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid coin (${coin})`)); - DB.query("SELECT SUM(amount) AS deposit_amount FROM ConvertFund WHERE mode=? AND status=?", [_sql.CONVERT_MODE_GET, "SUCCESS"]).then(r1 => { - DB.query("SELECT SUM(amount) AS withdraw_amount FROM ConvertFund WHERE mode=? AND status IN (?)", [_sql.CONVERT_MODE_PUT, ["SUCCESS", "PENDING", "WAITING_CONFIRMATION"]]).then(r2 => { + DB.query("SELECT SUM(amount) AS deposit_amount FROM ConvertFund WHERE mode=? AND r_status=?", [pCodeCONVERT_MODE_GET, pCode.STATUS_SUCCESS]).then(r1 => { + DB.query("SELECT SUM(amount) AS withdraw_amount FROM ConvertFund WHERE mode=? AND r_status IN (?)", [pCodeCONVERT_MODE_PUT, [pCode.STATUS_SUCCESS, pCode.STATUS_PENDING, pCode.STATUS_CONFIRMATION]]).then(r2 => { let available_amount = (r1[0].deposit_amount || 0) - (r2[0].withdraw_amount || 0); if (available_amount < amount) return reject(INVALID(eCode.INSUFFICIENT_BALANCE, "Insufficient convert-fund deposits to withdraw")); - DB.query("INSERT INTO ConvertFund(mode, coin, amount, status) VALUES (?)", [[_sql.CONVERT_MODE_PUT, coin, amount, "PENDING"]]) + DB.query("INSERT INTO ConvertFund(mode, coin, amount, r_status) VALUES (?)", [[pCodeCONVERT_MODE_PUT, coin, amount, pCode.STATUS_PENDING]]) .then(result => resolve("Add currency fund in process")) .catch(error => reject(error)) }).catch(error => reject(error)) @@ -191,12 +191,12 @@ function withdrawCoinFund(floID, coin, quantity) { return reject(INVALID(eCode.ACCESS_DENIED, 'Access Denied')); else if (!allowedConversion.includes(coin)) return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid coin (${coin})`)); - DB.query("SELECT SUM(quantity) AS deposit_quantity FROM ConvertFund WHERE mode=? AND status=?", [_sql.CONVERT_MODE_PUT, "SUCCESS"]).then(r1 => { - DB.query("SELECT SUM(quantity) AS withdraw_quantity FROM ConvertFund WHERE mode=? AND status IN (?)", [_sql.CONVERT_MODE_GET, ["SUCCESS", "PENDING"]]).then(r2 => { + DB.query("SELECT SUM(quantity) AS deposit_quantity FROM ConvertFund WHERE mode=? AND r_status=?", [pCodeCONVERT_MODE_PUT, pCode.STATUS_SUCCESS]).then(r1 => { + DB.query("SELECT SUM(quantity) AS withdraw_quantity FROM ConvertFund WHERE mode=? AND r_status IN (?)", [pCodeCONVERT_MODE_GET, [pCode.STATUS_SUCCESS, pCode.STATUS_PENDING]]).then(r2 => { let available_quantity = (r1[0].deposit_quantity || 0) - (r2[0].withdraw_quantity || 0); if (available_quantity < quantity) return reject(INVALID(eCode.INSUFFICIENT_BALANCE, "Insufficient convert-fund deposits to withdraw")); - DB.query("INSERT INTO ConvertFund(mode, coin, quantity, status) VALUES (?)", [[_sql.CONVERT_MODE_GET, coin, quantity, "PENDING"]]) + DB.query("INSERT INTO ConvertFund(mode, coin, quantity, r_status) VALUES (?)", [[pCodeCONVERT_MODE_GET, coin, quantity, pCode.STATUS_PENDING]]) .then(result => resolve("Add currency fund in process")) .catch(error => reject(error)) }).catch(error => reject(error))