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
This commit is contained in:
parent
f4bedfbd48
commit
76339f1621
@ -114,43 +114,16 @@ CREATE TABLE BuyOrder (
|
|||||||
FOREIGN KEY (asset) REFERENCES AssetList(asset)
|
FOREIGN KEY (asset) REFERENCES AssetList(asset)
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE DepositCoin (
|
CREATE TABLE VaultTransactions (
|
||||||
id INT NOT NULL AUTO_INCREMENT,
|
id INT NOT NULL AUTO_INCREMENT,
|
||||||
txid VARCHAR(128) NOT NULL,
|
|
||||||
floID CHAR(34) 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),
|
amount DECIMAL(16, 8),
|
||||||
status VARCHAR(50) NOT NULL,
|
|
||||||
PRIMARY KEY(id)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE WithdrawCoin (
|
|
||||||
id INT NOT NULL AUTO_INCREMENT,
|
|
||||||
txid VARCHAR(128),
|
txid VARCHAR(128),
|
||||||
floID CHAR(34) NOT NULL,
|
locktime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
coin VARCHAR(8) NOT NULL,
|
r_status TINYINT 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,
|
|
||||||
PRIMARY KEY(id)
|
PRIMARY KEY(id)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -241,7 +214,7 @@ CREATE TABLE CloseBondTransact(
|
|||||||
usd_net DECIMAL(16, 2) NOT NULL,
|
usd_net DECIMAL(16, 2) NOT NULL,
|
||||||
txid VARCHAR(128),
|
txid VARCHAR(128),
|
||||||
close_id VARCHAR(128),
|
close_id VARCHAR(128),
|
||||||
status VARCHAR(50) NOT NULL,
|
r_status TINYINT NOT NULL,
|
||||||
KEY(id),
|
KEY(id),
|
||||||
PRIMARY KEY(bond_id),
|
PRIMARY KEY(bond_id),
|
||||||
FOREIGN KEY (bond_id) REFERENCES BlockchainBonds(bond_id)
|
FOREIGN KEY (bond_id) REFERENCES BlockchainBonds(bond_id)
|
||||||
@ -280,7 +253,7 @@ CREATE TABLE CloseFundTransact(
|
|||||||
usd_net DECIMAL(16, 2) NOT NULL,
|
usd_net DECIMAL(16, 2) NOT NULL,
|
||||||
txid VARCHAR(128),
|
txid VARCHAR(128),
|
||||||
close_id VARCHAR(128),
|
close_id VARCHAR(128),
|
||||||
status VARCHAR(50) NOT NULL,
|
r_status TINYINT NOT NULL,
|
||||||
KEY(id),
|
KEY(id),
|
||||||
PRIMARY KEY(fund_id, floID),
|
PRIMARY KEY(fund_id, floID),
|
||||||
FOREIGN KEY (fund_id) REFERENCES BobsFund(fund_id)
|
FOREIGN KEY (fund_id) REFERENCES BobsFund(fund_id)
|
||||||
@ -293,7 +266,7 @@ CREATE TABLE ConvertFund(
|
|||||||
quantity DECIMAL(16, 8),
|
quantity DECIMAL(16, 8),
|
||||||
mode BIT NOT NULL,
|
mode BIT NOT NULL,
|
||||||
txid VARCHAR(128),
|
txid VARCHAR(128),
|
||||||
status VARCHAR(50) NOT NULL,
|
r_status TINYINT NOT NULL,
|
||||||
PRIMARY KEY(id)
|
PRIMARY KEY(id)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -307,7 +280,7 @@ CREATE TABLE DirectConvert(
|
|||||||
in_txid VARCHAR(128),
|
in_txid VARCHAR(128),
|
||||||
out_txid VARCHAR(128),
|
out_txid VARCHAR(128),
|
||||||
locktime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
locktime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
status VARCHAR(50) NOT NULL,
|
r_status TINYINT NOT NULL,
|
||||||
PRIMARY KEY(id)
|
PRIMARY KEY(id)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -318,7 +291,7 @@ CREATE TABLE RefundTransact(
|
|||||||
in_txid VARCHAR(128),
|
in_txid VARCHAR(128),
|
||||||
out_txid VARCHAR(128),
|
out_txid VARCHAR(128),
|
||||||
locktime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
locktime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
status VARCHAR(50) NOT NULL,
|
r_status TINYINT NOT NULL,
|
||||||
PRIMARY KEY(id)
|
PRIMARY KEY(id)
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -328,7 +301,7 @@ CREATE TABLE _backup (
|
|||||||
t_name VARCHAR(64),
|
t_name VARCHAR(64),
|
||||||
id INT,
|
id INT,
|
||||||
mode BOOLEAN DEFAULT TRUE,
|
mode BOOLEAN DEFAULT TRUE,
|
||||||
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
u_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
PRIMARY KEY(t_name, id)
|
PRIMARY KEY(t_name, id)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -336,7 +309,7 @@ CREATE table _backupCache(
|
|||||||
id INT AUTO_INCREMENT,
|
id INT AUTO_INCREMENT,
|
||||||
t_name VARCHAR(64),
|
t_name VARCHAR(64),
|
||||||
data_cache LONGTEXT,
|
data_cache LONGTEXT,
|
||||||
status BOOLEAN,
|
fail BOOLEAN,
|
||||||
PRIMARY KEY(id)
|
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
|
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;
|
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
|
CREATE TRIGGER VaultTransactions_I AFTER INSERT ON VaultTransactions
|
||||||
FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('DepositCoin', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT;
|
FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('VaultTransactions', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT;
|
||||||
CREATE TRIGGER DepositCoin_U AFTER UPDATE ON DepositCoin
|
CREATE TRIGGER VaultTransactions_U AFTER UPDATE ON VaultTransactions
|
||||||
FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('DepositCoin', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT;
|
FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('VaultTransactions', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT;
|
||||||
CREATE TRIGGER DepositCoin_D AFTER DELETE ON DepositCoin
|
CREATE TRIGGER VaultTransactions_D AFTER DELETE ON VaultTransactions
|
||||||
FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('DepositCoin', OLD.id) ON DUPLICATE KEY UPDATE mode=NULL, timestamp=DEFAULT;
|
FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('VaultTransactions', 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 CloseBondTransact_I AFTER INSERT ON CloseBondTransact
|
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;
|
FOR EACH ROW INSERT INTO _backup (t_name, id) VALUES ('CloseBondTransact', NEW.id) ON DUPLICATE KEY UPDATE mode=TRUE, timestamp=DEFAULT;
|
||||||
|
|||||||
@ -4,10 +4,7 @@ TRUNCATE _backupCache;
|
|||||||
TRUNCATE AuditTrade;
|
TRUNCATE AuditTrade;
|
||||||
TRUNCATE BuyOrder;
|
TRUNCATE BuyOrder;
|
||||||
TRUNCATE Distributors;
|
TRUNCATE Distributors;
|
||||||
TRUNCATE DepositCoin;
|
TRUNCATE VaultTransactions;
|
||||||
TRUNCATE DepositToken;
|
|
||||||
TRUNCATE WithdrawCoin;
|
|
||||||
TRUNCATE WithdrawToken;
|
|
||||||
TRUNCATE PriceHistory;
|
TRUNCATE PriceHistory;
|
||||||
TRUNCATE RequestLog;
|
TRUNCATE RequestLog;
|
||||||
TRUNCATE SellOrder;
|
TRUNCATE SellOrder;
|
||||||
|
|||||||
@ -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) {
|
exchangeAPI.getAccount = function (floID, proxySecret) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let request = {
|
let request = {
|
||||||
|
|||||||
@ -33,9 +33,5 @@ module.exports = {
|
|||||||
BACKUP_INTERVAL: 5 * 60 * 1000, //5 min
|
BACKUP_INTERVAL: 5 * 60 * 1000, //5 min
|
||||||
BACKUP_SYNC_TIMEOUT: 10 * 60 * 1000, //10 mins
|
BACKUP_SYNC_TIMEOUT: 10 * 60 * 1000, //10 mins
|
||||||
CHECKSUM_INTERVAL: 100, //times of BACKUP_INTERVAL
|
CHECKSUM_INTERVAL: 100, //times of BACKUP_INTERVAL
|
||||||
},
|
|
||||||
sql: {
|
|
||||||
CONVERT_MODE_GET: 1,
|
|
||||||
CONVERT_MODE_PUT: 0,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3,6 +3,7 @@ const blockchain = require('./blockchain');
|
|||||||
const conversion_rates = require('./services/conversion').getRate;
|
const conversion_rates = require('./services/conversion').getRate;
|
||||||
const bond_util = require('./services/bonds').util;
|
const bond_util = require('./services/bonds').util;
|
||||||
const fund_util = require('./services/bobs-fund').util;
|
const fund_util = require('./services/bobs-fund').util;
|
||||||
|
const pCode = require('../docs/scripts/floExchangeAPI').processCode;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
LAUNCH_SELLER_TAG,
|
LAUNCH_SELLER_TAG,
|
||||||
@ -10,19 +11,17 @@ const {
|
|||||||
} = require('./_constants')["market"];
|
} = require('./_constants')["market"];
|
||||||
|
|
||||||
var DB; //container for database
|
var DB; //container for database
|
||||||
const _sql = require('./_constants').sql;
|
|
||||||
|
|
||||||
var updateBalance; // container for updateBalance function
|
var updateBalance; // container for updateBalance function
|
||||||
|
|
||||||
const verifyTx = {};
|
const verifyTx = {};
|
||||||
|
|
||||||
function confirmDepositFLO() {
|
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 => {
|
results.forEach(r => {
|
||||||
verifyTx.FLO(r.floID, r.txid).then(amount => {
|
verifyTx.FLO(r.floID, r.txid).then(amount => {
|
||||||
addSellChipsIfLaunchSeller(r.floID, amount).then(txQueries => {
|
addSellChipsIfLaunchSeller(r.floID, amount).then(txQueries => {
|
||||||
txQueries.push(updateBalance.add(r.floID, "FLO", amount));
|
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)
|
DB.transaction(txQueries)
|
||||||
.then(result => console.debug("FLO deposited:", r.floID, amount))
|
.then(result => console.debug("FLO deposited:", r.floID, amount))
|
||||||
.catch(error => console.error(error))
|
.catch(error => console.error(error))
|
||||||
@ -30,7 +29,7 @@ function confirmDepositFLO() {
|
|||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
if (error[0])
|
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));
|
.then(_ => null).catch(error => console.error(error));
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
@ -81,7 +80,7 @@ function addSellChipsIfLaunchSeller(floID, quantity) {
|
|||||||
let remLaunchChips = MAXIMUM_LAUNCH_SELL_CHIPS - (sold + chips) + brought;
|
let remLaunchChips = MAXIMUM_LAUNCH_SELL_CHIPS - (sold + chips) + brought;
|
||||||
quantity = Math.min(quantity, remLaunchChips);
|
quantity = Math.min(quantity, remLaunchChips);
|
||||||
if (quantity > 0)
|
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
|
else
|
||||||
resolve([]);
|
resolve([]);
|
||||||
}).catch(error => reject(error))
|
}).catch(error => reject(error))
|
||||||
@ -92,17 +91,17 @@ function addSellChipsIfLaunchSeller(floID, quantity) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function confirmDepositToken() {
|
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 => {
|
results.forEach(r => {
|
||||||
verifyTx.token(r.floID, r.txid).then(({ token, amount, flo_amount }) => {
|
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 = [];
|
let txQueries = [];
|
||||||
//Add the FLO balance if necessary
|
//Add the FLO balance if necessary
|
||||||
if (!result.length) {
|
if (!result.length) {
|
||||||
txQueries.push(updateBalance.add(r.floID, "FLO", flo_amount));
|
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));
|
txQueries.push(updateBalance.add(r.floID, token, amount));
|
||||||
DB.transaction(txQueries)
|
DB.transaction(txQueries)
|
||||||
.then(result => console.debug("Token deposited:", r.floID, token, amount))
|
.then(result => console.debug("Token deposited:", r.floID, token, amount))
|
||||||
@ -111,7 +110,7 @@ function confirmDepositToken() {
|
|||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
if (error[0])
|
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));
|
.then(_ => null).catch(error => console.error(error));
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
@ -143,56 +142,46 @@ verifyTx.token = function (sender, txid, currencyOnly = false) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function retryWithdrawalCoin() {
|
function retryVaultWithdrawal() {
|
||||||
DB.query("SELECT id, floID, coin, amount FROM WithdrawCoin WHERE status=?", ["PENDING"]).then(results => {
|
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 => 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 => {
|
|
||||||
results.forEach(r => {
|
results.forEach(r => {
|
||||||
floBlockchainAPI.getTx(r.txid).then(tx => {
|
if (r.asset_type == pCode.ASSET_TYPE_COIN) {
|
||||||
if (!tx.blockheight || !tx.confirmations) //Still not confirmed
|
if (r.asset == "FLO")
|
||||||
return;
|
blockchain.withdrawAsset.retry(r.floID, r.asset, r.amount, r.id);
|
||||||
DB.query("UPDATE WithdrawCoin SET status=? WHERE id=?", ["SUCCESS", r.id])
|
} else if (r.asset_type == pCode.ASSET_TYPE_TOKEN)
|
||||||
.then(result => console.debug("FLO withdrawed:", r.floID, r.amount))
|
blockchain.withdrawAsset.retry(r.floID, r.asset, r.amount, r.id)
|
||||||
.catch(error => console.error(error))
|
|
||||||
}).catch(error => console.error(error));
|
|
||||||
})
|
})
|
||||||
}).catch(error => console.error(error));
|
}).catch(error => reject(error))
|
||||||
}
|
}
|
||||||
|
|
||||||
function confirmWithdrawalBTC() {
|
function confirmVaultWithdraw() {
|
||||||
DB.query("SELECT id, floID, amount, txid FROM WithdrawCoin WHERE coin=? AND status=?", ["BTC", "WAITING_CONFIRMATION"]).then(results => {
|
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 => {
|
results.forEach(r => {
|
||||||
btcOperator.getTx(r.txid).then(tx => {
|
if (r.asset_type == pCode.ASSET_TYPE_COIN) {
|
||||||
if (!tx.blockhash || !tx.confirmations) //Still not confirmed
|
if (r.asset == "FLO")
|
||||||
return;
|
floBlockchainAPI.getTx(r.txid).then(tx => {
|
||||||
DB.query("UPDATE WithdrawCoin SET status=? WHERE id=?", ["SUCCESS", r.id])
|
if (!tx.blockheight || !tx.confirmations) //Still not confirmed
|
||||||
.then(result => console.debug("BTC withdrawed:", r.floID, r.amount))
|
return;
|
||||||
.catch(error => console.error(error))
|
DB.query("UPDATE VaultTransactions SET r_status=? WHERE id=?", [pCode.STATUS_SUCCESS, r.id])
|
||||||
}).catch(error => console.error(error));
|
.then(result => console.debug("FLO withdrawed:", r.floID, r.amount))
|
||||||
})
|
.catch(error => console.error(error))
|
||||||
}).catch(error => console.error(error));
|
}).catch(error => console.error(error));
|
||||||
}
|
else if (r.asset == "BTC")
|
||||||
|
btcOperator.getTx(r.txid).then(tx => {
|
||||||
function confirmWithdrawalToken() {
|
if (!tx.blockhash || !tx.confirmations) //Still not confirmed
|
||||||
DB.query("SELECT id, floID, token, amount, txid FROM WithdrawToken WHERE status=?", ["WAITING_CONFIRMATION"]).then(results => {
|
return;
|
||||||
results.forEach(r => {
|
DB.query("UPDATE VaultTransactions SET r_status=? WHERE id=?", [pCode.STATUS_SUCCESS, r.id])
|
||||||
floTokenAPI.getTx(r.txid).then(tx => {
|
.then(result => console.debug("BTC withdrawed:", r.floID, r.amount))
|
||||||
if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed
|
.catch(error => console.error(error))
|
||||||
return;
|
}).catch(error => console.error(error));
|
||||||
DB.query("UPDATE WithdrawToken SET status=? WHERE id=?", ["SUCCESS", r.id])
|
} else if (r.asset_type == pCode.ASSET_TYPE_TOKEN)
|
||||||
.then(result => console.debug("Token withdrawed:", r.floID, r.token, r.amount))
|
floTokenAPI.getTx(r.txid).then(tx => {
|
||||||
.catch(error => console.error(error));
|
if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed
|
||||||
}).catch(error => console.error(error));
|
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));
|
}).catch(error => console.error(error));
|
||||||
}
|
}
|
||||||
@ -220,9 +209,9 @@ verifyTx.BTC = function (sender, txid) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function verifyConvert() {
|
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 => {
|
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 }) => {
|
verifyTx.token(r.floID, r.in_txid, true).then(({ amount }) => {
|
||||||
if (r.amount !== amount)
|
if (r.amount !== amount)
|
||||||
throw ([true, "Transaction amount mismatched in blockchain"]);
|
throw ([true, "Transaction amount mismatched in blockchain"]);
|
||||||
@ -232,10 +221,10 @@ function verifyConvert() {
|
|||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
if (error[0])
|
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));
|
.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 => {
|
verifyTx.BTC(r.floID, r.in_txid).then(quantity => {
|
||||||
if (r.quantity !== quantity)
|
if (r.quantity !== quantity)
|
||||||
throw ([true, "Transaction quantity mismatched in blockchain"]);
|
throw ([true, "Transaction quantity mismatched in blockchain"]);
|
||||||
@ -245,7 +234,7 @@ function verifyConvert() {
|
|||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
if (error[0])
|
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));
|
.then(_ => null).catch(error => console.error(error));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -254,32 +243,32 @@ function verifyConvert() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function retryConvert() {
|
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 => {
|
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);
|
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)
|
blockchain.convertFromCoin.retry(r.floID, r.amount, r.id)
|
||||||
})
|
})
|
||||||
}).catch(error => console.error(error))
|
}).catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
|
|
||||||
function confirmConvert() {
|
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 => {
|
results.forEach(r => {
|
||||||
if (r.mode == _sql.CONVERT_MODE_GET)
|
if (r.mode == pCodeCONVERT_MODE_GET)
|
||||||
btcOperator.getTx(r.out_txid).then(tx => {
|
btcOperator.getTx(r.out_txid).then(tx => {
|
||||||
if (!tx.blockhash || !tx.confirmations) //Still not confirmed
|
if (!tx.blockhash || !tx.confirmations) //Still not confirmed
|
||||||
return;
|
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`))
|
.then(result => console.debug(`${r.floID} converted ${amount} to ${r.quantity} BTC`))
|
||||||
.catch(error => console.error(error))
|
.catch(error => console.error(error))
|
||||||
}).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 => {
|
floTokenAPI.getTx(r.out_txid).then(tx => {
|
||||||
if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed
|
if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed
|
||||||
return;
|
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}`))
|
.then(result => console.debug(`${r.floID} converted ${r.quantity} BTC to ${amount}`))
|
||||||
.catch(error => console.error(error));
|
.catch(error => console.error(error));
|
||||||
}).catch(error => console.error(error));
|
}).catch(error => console.error(error));
|
||||||
@ -288,26 +277,26 @@ function confirmConvert() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function verifyConvertFundDeposit() {
|
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 => {
|
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 }) => {
|
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));
|
.then(_ => null).catch(error => console.error(error));
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
if (error[0])
|
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));
|
.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 => {
|
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));
|
.then(_ => null).catch(error => console.error(error));
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
if (error[0])
|
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));
|
.then(_ => null).catch(error => console.error(error));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -316,32 +305,32 @@ function verifyConvertFundDeposit() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function retryConvertFundWithdraw() {
|
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 => {
|
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);
|
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);
|
blockchain.convertFundWithdraw.retry(floGlobals.currency, r.amount, r.id);
|
||||||
})
|
})
|
||||||
}).catch(error => console.error(error))
|
}).catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
|
|
||||||
function confirmConvertFundWithdraw() {
|
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 => {
|
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 => {
|
btcOperator.getTx(r.txid).then(tx => {
|
||||||
if (!tx.blockhash || !tx.confirmations) //Still not confirmed
|
if (!tx.blockhash || !tx.confirmations) //Still not confirmed
|
||||||
return;
|
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`))
|
.then(result => console.debug(`Withdraw-fund ${r.quantity} ${r.coin} successful`))
|
||||||
.catch(error => console.error(error))
|
.catch(error => console.error(error))
|
||||||
}).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 => {
|
floTokenAPI.getTx(r.txid).then(tx => {
|
||||||
if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed
|
if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed
|
||||||
return;
|
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`))
|
.then(result => console.debug(`Withdraw-fund ${r.amount} ${floGlobals.currency} successful`))
|
||||||
.catch(error => console.error(error));
|
.catch(error => console.error(error));
|
||||||
}).catch(error => console.error(error));
|
}).catch(error => console.error(error));
|
||||||
@ -351,31 +340,31 @@ function confirmConvertFundWithdraw() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function verifyRefund() {
|
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)
|
verifyTx.token(r.floID, r.in_txid, true)
|
||||||
.then(({ amount }) => blockchain.refundTransact.init(r.floID, amount, r.id))
|
.then(({ amount }) => blockchain.refundTransact.init(r.floID, amount, r.id))
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
if (error[0])
|
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));
|
.then(_ => null).catch(error => console.error(error));
|
||||||
});
|
});
|
||||||
}).catch(error => console.error(error))
|
}).catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
|
|
||||||
function retryRefund() {
|
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))
|
results.forEach(r => blockchain.refundTransact.retry(r.floID, r.amount, r.id))
|
||||||
}).catch(error => console.error(error))
|
}).catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
|
|
||||||
function confirmRefund() {
|
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 => {
|
results.forEach(r => {
|
||||||
floTokenAPI.getTx(r.txid).then(tx => {
|
floTokenAPI.getTx(r.txid).then(tx => {
|
||||||
if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed
|
if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed
|
||||||
return;
|
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}`))
|
.then(result => console.debug(`Refunded ${r.amount} to ${r.floID}`))
|
||||||
.catch(error => console.error(error));
|
.catch(error => console.error(error));
|
||||||
}).catch(error => console.error(error));
|
}).catch(error => console.error(error));
|
||||||
@ -384,20 +373,20 @@ function confirmRefund() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function retryBondClosing() {
|
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))
|
results.forEach(r => blockchain.bondTransact.retry(r.floID, r.amount, r.id))
|
||||||
}).catch(error => console.error(error))
|
}).catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
|
|
||||||
function confirmBondClosing() {
|
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 => {
|
results.forEach(r => {
|
||||||
floTokenAPI.getTx(r.txid).then(tx => {
|
floTokenAPI.getTx(r.txid).then(tx => {
|
||||||
if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed
|
if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed
|
||||||
return;
|
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);
|
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 => {
|
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))
|
.then(result => console.debug("Bond closed:", r.bond_id))
|
||||||
.catch(error => console.error(error));
|
.catch(error => console.error(error));
|
||||||
}).catch(error => console.error(error))
|
}).catch(error => console.error(error))
|
||||||
@ -407,20 +396,20 @@ function confirmBondClosing() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function retryFundClosing() {
|
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))
|
results.forEach(r => blockchain.fundTransact.retry(r.floID, r.amount, r.id))
|
||||||
}).catch(error => console.error(error))
|
}).catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
|
|
||||||
function confirmFundClosing() {
|
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 => {
|
results.forEach(r => {
|
||||||
floTokenAPI.getTx(r.txid).then(tx => {
|
floTokenAPI.getTx(r.txid).then(tx => {
|
||||||
if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed
|
if (!tx.transactionDetails.blockheight || !tx.transactionDetails.confirmations) //Still not confirmed
|
||||||
return;
|
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);
|
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 => {
|
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))
|
.then(result => console.debug("Fund investment closed:", r.fund_id))
|
||||||
.catch(error => console.error(error));
|
.catch(error => console.error(error));
|
||||||
}).catch(error => console.error(error))
|
}).catch(error => console.error(error))
|
||||||
@ -433,11 +422,8 @@ function processAll() {
|
|||||||
//deposit-withdraw asset balance
|
//deposit-withdraw asset balance
|
||||||
confirmDepositFLO();
|
confirmDepositFLO();
|
||||||
confirmDepositToken();
|
confirmDepositToken();
|
||||||
retryWithdrawalCoin();
|
retryVaultWithdrawal();
|
||||||
retryWithdrawalToken();
|
confirmVaultWithdraw();
|
||||||
confirmWithdrawalFLO();
|
|
||||||
confirmWithdrawalBTC();
|
|
||||||
confirmWithdrawalToken();
|
|
||||||
//convert service
|
//convert service
|
||||||
verifyConvert();
|
verifyConvert();
|
||||||
retryConvert();
|
retryConvert();
|
||||||
|
|||||||
@ -154,7 +154,7 @@ function storeSinkShare(sinkID, keyShare, decrypt = true) {
|
|||||||
keyShare = floCrypto.decryptData(keyShare, global.myPrivKey)
|
keyShare = floCrypto.decryptData(keyShare, global.myPrivKey)
|
||||||
let encryptedShare = Crypto.AES.encrypt(keyShare, global.myPrivKey);
|
let encryptedShare = Crypto.AES.encrypt(keyShare, global.myPrivKey);
|
||||||
console.log(Date.now(), '|sinkID:', sinkID, '|EnShare:', encryptedShare);
|
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));
|
.then(_ => null).catch(error => console.error(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,7 +285,7 @@ storeBackupData.commit = function (data, result) {
|
|||||||
break;
|
break;
|
||||||
case "rejected":
|
case "rejected":
|
||||||
console.error(result[i].reason);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
return Promise.allSettled(promises);
|
return Promise.allSettled(promises);
|
||||||
|
|||||||
@ -1,11 +1,12 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const pCode = require('../docs/scripts/floExchangeAPI').processCode;
|
||||||
|
|
||||||
var collectAndCall; //container for collectAndCall function from backup module
|
var collectAndCall; //container for collectAndCall function from backup module
|
||||||
var chests; //container for blockchain ids (where assets are stored)
|
var chests; //container for blockchain ids (where assets are stored)
|
||||||
var DB; //container for database
|
var DB; //container for database
|
||||||
|
|
||||||
const TYPE_TOKEN = "TOKEN",
|
const TYPE_VAULT = "VAULT",
|
||||||
TYPE_COIN = "COIN",
|
|
||||||
TYPE_CONVERT = "CONVERT",
|
TYPE_CONVERT = "CONVERT",
|
||||||
TYPE_CONVERT_POOL = "CONVERT_POOL",
|
TYPE_CONVERT_POOL = "CONVERT_POOL",
|
||||||
TYPE_REFUND = "REFUND",
|
TYPE_REFUND = "REFUND",
|
||||||
@ -15,8 +16,7 @@ const TYPE_TOKEN = "TOKEN",
|
|||||||
const balance_locked = {},
|
const balance_locked = {},
|
||||||
balance_cache = {},
|
balance_cache = {},
|
||||||
callbackCollection = {
|
callbackCollection = {
|
||||||
[TYPE_COIN]: {},
|
[TYPE_VAULT]: {},
|
||||||
[TYPE_TOKEN]: {},
|
|
||||||
[TYPE_CONVERT]: {},
|
[TYPE_CONVERT]: {},
|
||||||
[TYPE_CONVERT_POOL]: {},
|
[TYPE_CONVERT_POOL]: {},
|
||||||
[TYPE_REFUND]: {},
|
[TYPE_REFUND]: {},
|
||||||
@ -64,8 +64,7 @@ function getSinkID(quantity, asset, sinkList = null) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const WITHDRAWAL_MESSAGE = {
|
const WITHDRAWAL_MESSAGE = {
|
||||||
[TYPE_COIN]: "(withdrawal from market)",
|
[TYPE_VAULT]: "(withdrawal from market)",
|
||||||
[TYPE_TOKEN]: "(withdrawal from market)",
|
|
||||||
[TYPE_CONVERT]: "(convert coin)",
|
[TYPE_CONVERT]: "(convert coin)",
|
||||||
[TYPE_CONVERT_POOL]: "(convert fund)",
|
[TYPE_CONVERT_POOL]: "(convert fund)",
|
||||||
[TYPE_REFUND]: "(refund from market)",
|
[TYPE_REFUND]: "(refund from market)",
|
||||||
@ -87,13 +86,12 @@ function sendTx(floID, asset, quantity, sinkID, sinkKey, message) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const updateSyntax = {
|
const updateSyntax = {
|
||||||
[TYPE_COIN]: "UPDATE WithdrawCoin SET status=?, txid=? WHERE id=?",
|
[TYPE_VAULT]: "UPDATE VaultTransactions SET r_status=?, txid=? WHERE id=?",
|
||||||
[TYPE_TOKEN]: "UPDATE WithdrawToken SET status=?, txid=? WHERE id=?",
|
[TYPE_CONVERT]: "UPDATE DirectConvert SET r_status=?, out_txid=? WHERE id=?",
|
||||||
[TYPE_CONVERT]: "UPDATE DirectConvert SET status=?, out_txid=? WHERE id=?",
|
[TYPE_CONVERT_POOL]: "UPDATE ConvertFund SET r_status=?, txid=? WHERE id=?",
|
||||||
[TYPE_CONVERT_POOL]: "UPDATE ConvertFund SET status=?, txid=? WHERE id=?",
|
[TYPE_REFUND]: "UPDATE RefundTransact SET r_status=?, out_txid=? WHERE id=?",
|
||||||
[TYPE_REFUND]: "UPDATE RefundTransact SET status=?, out_txid=? WHERE id=?",
|
[TYPE_BOND]: "UPDATE CloseBondTransact SET r_status=?, txid=? WHERE id=?",
|
||||||
[TYPE_BOND]: "UPDATE CloseBondTransact SET status=?, txid=? WHERE id=?",
|
[TYPE_FUND]: "UPDATE CloseFundTransact SET r_status=?, txid=? WHERE id=?"
|
||||||
[TYPE_FUND]: "UPDATE CloseFundTransact SET status=?, txid=? WHERE id=?"
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function sendAsset(floID, asset, quantity, type, id) {
|
function sendAsset(floID, asset, quantity, type, id) {
|
||||||
@ -104,7 +102,7 @@ function sendAsset(floID, asset, quantity, type, id) {
|
|||||||
if (!txid)
|
if (!txid)
|
||||||
console.error("Transaction not successful");
|
console.error("Transaction not successful");
|
||||||
else //Transaction was successful, Add in DB
|
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));
|
.then(_ => null).catch(error => console.error(error));
|
||||||
}).catch(error => console.error(error)).finally(_ => {
|
}).catch(error => console.error(error)).finally(_ => {
|
||||||
delete callbackCollection[type][id];
|
delete callbackCollection[type][id];
|
||||||
@ -119,32 +117,21 @@ function sendAsset(floID, asset, quantity, type, id) {
|
|||||||
}).catch(error => console.error(error))
|
}).catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendCoin_init(floID, coin, quantity) {
|
function withdrawAsset_init(floID, asset, amount) {
|
||||||
DB.query("INSERT INTO WithdrawCoin (floID, coin, amount, status) VALUES (?, ?, ?, ?)", [floID, coin, quantity, "PENDING"])
|
let asset_type = ["FLO", "BTC"].includes(asset) ? pCode.ASSET_TYPE_COIN : pCode.ASSET_TYPE_TOKEN;
|
||||||
.then(result => sendAsset(floID, coin, quantity, TYPE_COIN, result.insertId))
|
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))
|
.catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendCoin_retry(floID, coin, quantity, id) {
|
function withdrawAsset_retry(floID, asset, amount, id) {
|
||||||
if (id in callbackCollection[TYPE_COIN])
|
if (id in callbackCollection[TYPE_VAULT])
|
||||||
console.debug("A callback is already pending for this Coin transfer");
|
console.debug("A callback is already pending for this Coin transfer");
|
||||||
else sendAsset(floID, coin, quantity, TYPE_COIN, id);
|
else sendAsset(floID, asset, amount, TYPE_VAULT, 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function convertToCoin_init(floID, coin, coin_quantity, 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))
|
.then(result => sendAsset(floID, coin, coin_quantity, TYPE_CONVERT, id))
|
||||||
.catch(error => console.error(error))
|
.catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
@ -156,7 +143,7 @@ function convertToCoin_retry(floID, coin, coin_quantity, id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function convertFromCoin_init(floID, currency_amount, 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))
|
.then(result => sendAsset(floID, floGlobals.currency, currency_amount, TYPE_CONVERT, id))
|
||||||
.catch(error => console.error(error))
|
.catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
@ -186,7 +173,7 @@ function fundTransact_retry(floID, amount, id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function refundTransact_init(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))
|
.then(result => sendAsset(floID, floGlobals.currency, amount, TYPE_REFUND, id))
|
||||||
.catch(error => console.error(error))
|
.catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
@ -207,13 +194,9 @@ module.exports = {
|
|||||||
set chests(c) {
|
set chests(c) {
|
||||||
chests = c;
|
chests = c;
|
||||||
},
|
},
|
||||||
sendCoin: {
|
withdrawAsset: {
|
||||||
init: sendCoin_init,
|
init: withdrawAsset_init,
|
||||||
retry: sendCoin_retry
|
retry: withdrawAsset_retry
|
||||||
},
|
|
||||||
sendToken: {
|
|
||||||
init: sendToken_init,
|
|
||||||
retry: sendToken_retry
|
|
||||||
},
|
},
|
||||||
convertToCoin: {
|
convertToCoin: {
|
||||||
init: convertToCoin_init,
|
init: convertToCoin_init,
|
||||||
|
|||||||
@ -11,7 +11,7 @@ var DB; //container for database
|
|||||||
|
|
||||||
const updateBalance = {};
|
const updateBalance = {};
|
||||||
updateBalance.consume = (floID, token, amount) => ["UPDATE UserBalance SET quantity=quantity-? WHERE floID=? AND token=?", [amount, floID, token]];
|
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 = {},
|
const couplingInstance = {},
|
||||||
couplingTimeout = {};
|
couplingTimeout = {};
|
||||||
@ -181,7 +181,7 @@ function processOrders(seller_best, buyer_best, asset, cur_rate, quantity) {
|
|||||||
txQueries.push(updateBalance.add(buyer_best.floID, asset, quantity));
|
txQueries.push(updateBalance.add(buyer_best.floID, asset, quantity));
|
||||||
|
|
||||||
//Add SellChips to Buyer
|
//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
|
//Record transaction
|
||||||
let time = Date.now();
|
let time = Date.now();
|
||||||
@ -194,8 +194,8 @@ function processOrders(seller_best, buyer_best, asset, cur_rate, quantity) {
|
|||||||
tx_time: time,
|
tx_time: time,
|
||||||
}));
|
}));
|
||||||
txQueries.push([
|
txQueries.push([
|
||||||
"INSERT INTO TradeTransactions (seller, buyer, asset, quantity, unitValue, tx_time, txid) VALUES (?, ?, ?, ?, ?, ?, ?)",
|
"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]
|
[[seller_best.floID, buyer_best.floID, asset, quantity, cur_rate, new Date(time), hash]]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return txQueries;
|
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," +
|
DB.query("INSERT INTO AuditTrade (asset, quantity, unit_price, total_cost," +
|
||||||
" sellerID, seller_old_cash, seller_old_asset, seller_new_cash, seller_new_asset," +
|
" 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)" +
|
" buyerID, buyer_old_cash, buyer_old_asset, buyer_new_cash, buyer_new_asset)" +
|
||||||
" Value (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", [
|
" Value (?)", [[
|
||||||
asset, quantity, unit_price, quantity * unit_price,
|
asset, quantity, unit_price, quantity * unit_price,
|
||||||
sellerID, old_bal[sellerID].cash, old_bal[sellerID].asset, new_bal[sellerID].cash, new_bal[sellerID].asset,
|
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,
|
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));
|
}).catch(error => console.error(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -234,7 +234,7 @@ function auditBalance(sellerID, buyerID, asset) {
|
|||||||
asset: 0
|
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) {
|
for (let i in result) {
|
||||||
if (result[i].token === floGlobals.currency)
|
if (result[i].token === floGlobals.currency)
|
||||||
balance[result[i].floID].cash = result[i].quantity;
|
balance[result[i].floID].cash = result[i].quantity;
|
||||||
|
|||||||
@ -51,13 +51,13 @@ function refreshDataFromBlockchain() {
|
|||||||
promises.push(DB.query("DELETE FROM NodeList WHERE floID=?", [n]));
|
promises.push(DB.query("DELETE FROM NodeList WHERE floID=?", [n]));
|
||||||
if (content.Nodes.add)
|
if (content.Nodes.add)
|
||||||
for (let n in 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
|
//Asset List
|
||||||
if (content.Assets) {
|
if (content.Assets) {
|
||||||
assets_change = true;
|
assets_change = true;
|
||||||
for (let a in content.Assets)
|
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
|
//Trusted List
|
||||||
if (content.Trusted) {
|
if (content.Trusted) {
|
||||||
@ -76,14 +76,14 @@ function refreshDataFromBlockchain() {
|
|||||||
promises.push(DB.query("DELETE FROM TagList WHERE tag=?", [t]));
|
promises.push(DB.query("DELETE FROM TagList WHERE tag=?", [t]));
|
||||||
if (content.Tag.add)
|
if (content.Tag.add)
|
||||||
for (let t in 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)
|
if (content.Tag.update)
|
||||||
for (let t in content.Tag.update)
|
for (let t in content.Tag.update)
|
||||||
for (let a in content.Tag.update[t])
|
for (let a in content.Tag.update[t])
|
||||||
promises.push(`UPDATE TagList WHERE tag=? SET ${a}=?`, [t, content.Tag.update[t][a]]);
|
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
|
//Check if all save process were successful
|
||||||
Promise.allSettled(promises).then(results => {
|
Promise.allSettled(promises).then(results => {
|
||||||
//console.debug(results.filter(r => r.status === "rejected"));
|
//console.debug(results.filter(r => r.status === "rejected"));
|
||||||
|
|||||||
@ -13,6 +13,7 @@ const {
|
|||||||
} = require('./_constants')["market"];
|
} = require('./_constants')["market"];
|
||||||
|
|
||||||
const eCode = require('../docs/scripts/floExchangeAPI').errorCode;
|
const eCode = require('../docs/scripts/floExchangeAPI').errorCode;
|
||||||
|
const pCode = require('../docs/scripts/floExchangeAPI').processCode;
|
||||||
|
|
||||||
const updateBalance = background.updateBalance = coupling.updateBalance;
|
const updateBalance = background.updateBalance = coupling.updateBalance;
|
||||||
|
|
||||||
@ -20,9 +21,7 @@ var DB, assetList; //container for database and allowed assets
|
|||||||
|
|
||||||
function login(floID, proxyKey) {
|
function login(floID, proxyKey) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
DB.query("INSERT INTO UserSession (floID, proxyKey) VALUE (?, ?) " +
|
DB.query("INSERT INTO UserSession (floID, proxyKey) VALUE (?) ON DUPLICATE KEY UPDATE session_time=DEFAULT, proxyKey=?",[[floID, proxyKey], proxyKey])
|
||||||
"ON DUPLICATE KEY UPDATE session_time=DEFAULT, proxyKey=?",
|
|
||||||
[floID, proxyKey, proxyKey])
|
|
||||||
.then(result => resolve("Login Successful"))
|
.then(result => resolve("Login Successful"))
|
||||||
.catch(error => reject(error))
|
.catch(error => reject(error))
|
||||||
})
|
})
|
||||||
@ -42,8 +41,8 @@ function getRateHistory(asset, duration) {
|
|||||||
reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid asset(${asset})`));
|
reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid asset(${asset})`));
|
||||||
else
|
else
|
||||||
coupling.price.getHistory(asset, duration)
|
coupling.price.getHistory(asset, duration)
|
||||||
.then(result => resolve(result))
|
.then(result => resolve(result))
|
||||||
.catch(error => reject(error))
|
.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})`));
|
return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid asset (${asset})`));
|
||||||
getAssetBalance.check(floID, asset, quantity).then(_ => {
|
getAssetBalance.check(floID, asset, quantity).then(_ => {
|
||||||
checkSellRequirement(floID, asset, quantity, min_price).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');
|
resolve('Sell Order placed successfully');
|
||||||
coupling.initiate(asset);
|
coupling.initiate(asset);
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
@ -185,7 +184,7 @@ function addBuyOrder(floID, asset, quantity, max_price) {
|
|||||||
else if (!assetList.includes(asset))
|
else if (!assetList.includes(asset))
|
||||||
return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid asset (${asset})`));
|
return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid asset (${asset})`));
|
||||||
getAssetBalance.check(floID, floGlobals.currency, quantity * max_price).then(_ => {
|
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');
|
resolve('Buy Order placed successfully');
|
||||||
coupling.initiate(asset);
|
coupling.initiate(asset);
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
@ -257,11 +256,7 @@ function getAccountDetails(floID) {
|
|||||||
|
|
||||||
function getUserTransacts(floID) {
|
function getUserTransacts(floID) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
DB.query("(SELECT 'deposit' as type, txid, token, amount, status FROM DepositToken WHERE floID=?)" +
|
DB.query("SELECT mode, asset, amount, txid, locktime, r_status, FROM VaultTransactions WHERE floID=?", [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])
|
|
||||||
.then(result => resolve(result))
|
.then(result => resolve(result))
|
||||||
.catch(error => reject(error))
|
.catch(error => reject(error))
|
||||||
})
|
})
|
||||||
@ -315,7 +310,7 @@ function transferToken(sender, receivers, token) {
|
|||||||
checkDistributor(sender, token).then(result => {
|
checkDistributor(sender, token).then(result => {
|
||||||
if (result)
|
if (result)
|
||||||
for (let floID in receivers)
|
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 time = Date.now();
|
||||||
let hash = TRANSFER_HASH_PREFIX + Crypto.SHA256(JSON.stringify({
|
let hash = TRANSFER_HASH_PREFIX + Crypto.SHA256(JSON.stringify({
|
||||||
sender: sender,
|
sender: sender,
|
||||||
@ -325,8 +320,8 @@ function transferToken(sender, receivers, token) {
|
|||||||
tx_time: time,
|
tx_time: time,
|
||||||
}));
|
}));
|
||||||
txQueries.push([
|
txQueries.push([
|
||||||
"INSERT INTO TransferTransactions (sender, receiver, token, totalAmount, tx_time, txid) VALUE (?, ?, ?, ?, ?, ?)",
|
"INSERT INTO TransferTransactions (sender, receiver, token, totalAmount, tx_time, txid) VALUE (?)",
|
||||||
[sender, JSON.stringify(receivers), token, totalAmount, new Date(time), hash]
|
[[sender, JSON.stringify(receivers), token, totalAmount, new Date(time), hash]]
|
||||||
]);
|
]);
|
||||||
DB.transaction(txQueries)
|
DB.transaction(txQueries)
|
||||||
.then(result => resolve(hash))
|
.then(result => resolve(hash))
|
||||||
@ -339,20 +334,20 @@ function transferToken(sender, receivers, token) {
|
|||||||
|
|
||||||
function depositFLO(floID, txid) {
|
function depositFLO(floID, txid) {
|
||||||
return new Promise((resolve, reject) => {
|
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) {
|
if (result.length) {
|
||||||
switch (result[0].status) {
|
switch (result[0].r_status) {
|
||||||
case "PENDING":
|
case pCode.STATUS_PENDING:
|
||||||
return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process"));
|
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"));
|
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"));
|
return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already used to add coins"));
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
DB.query("INSERT INTO DepositCoin(txid, floID, coin, status) VALUES (?, ?, ?, ?)", [txid, floID, "FLO", "PENDING"])
|
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"))
|
.then(result => resolve("Deposit request in process"))
|
||||||
.catch(error => reject(error));
|
.catch(error => reject(error));
|
||||||
}).catch(error => reject(error))
|
}).catch(error => reject(error))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -367,7 +362,7 @@ function withdrawFLO(floID, amount) {
|
|||||||
let txQueries = [];
|
let txQueries = [];
|
||||||
txQueries.push(updateBalance.consume(floID, "FLO", amount));
|
txQueries.push(updateBalance.consume(floID, "FLO", amount));
|
||||||
DB.transaction(txQueries).then(result => {
|
DB.transaction(txQueries).then(result => {
|
||||||
blockchain.sendCoin.init(floID, "FLO", amount);
|
blockchain.withdrawAsset.init(floID, "FLO", amount);
|
||||||
resolve("Withdrawal request is in process");
|
resolve("Withdrawal request is in process");
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
@ -376,20 +371,20 @@ function withdrawFLO(floID, amount) {
|
|||||||
|
|
||||||
function depositToken(floID, txid) {
|
function depositToken(floID, txid) {
|
||||||
return new Promise((resolve, reject) => {
|
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) {
|
if (result.length) {
|
||||||
switch (result[0].status) {
|
switch (result[0].r_status) {
|
||||||
case "PENDING":
|
case pCode.STATUS_PENDING:
|
||||||
return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process"));
|
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"));
|
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"));
|
return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already used to add tokens"));
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
DB.query("INSERT INTO DepositToken(txid, floID, status) VALUES (?, ?, ?)", [txid, floID, "PENDING"])
|
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"))
|
.then(result => resolve("Deposit request in process"))
|
||||||
.catch(error => reject(error));
|
.catch(error => reject(error));
|
||||||
}).catch(error => reject(error))
|
}).catch(error => reject(error))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -411,7 +406,7 @@ function withdrawToken(floID, token, amount) {
|
|||||||
txQueries.push(updateBalance.consume(floID, token, amount));
|
txQueries.push(updateBalance.consume(floID, token, amount));
|
||||||
DB.transaction(txQueries).then(result => {
|
DB.transaction(txQueries).then(result => {
|
||||||
//Send Token to user via token API
|
//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");
|
resolve("Withdrawal request is in process");
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
@ -421,7 +416,7 @@ function withdrawToken(floID, token, amount) {
|
|||||||
|
|
||||||
function addTag(floID, tag) {
|
function addTag(floID, tag) {
|
||||||
return new Promise((resolve, reject) => {
|
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}`))
|
.then(result => resolve(`Added ${floID} to ${tag}`))
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
if (error.code === "ER_DUP_ENTRY")
|
if (error.code === "ER_DUP_ENTRY")
|
||||||
@ -444,7 +439,7 @@ function removeTag(floID, tag) {
|
|||||||
|
|
||||||
function addDistributor(floID, asset) {
|
function addDistributor(floID, asset) {
|
||||||
return new Promise((resolve, reject) => {
|
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}`))
|
.then(result => resolve(`Added ${asset} distributor: ${floID}`))
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
if (error.code === "ER_DUP_ENTRY")
|
if (error.code === "ER_DUP_ENTRY")
|
||||||
|
|||||||
@ -22,7 +22,7 @@ const updateLastTime = asset => lastTime[asset] = Date.now();
|
|||||||
|
|
||||||
//store FLO price in DB every 1 hr
|
//store FLO price in DB every 1 hr
|
||||||
function storeHistory(asset, rate) {
|
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))
|
.then(_ => null).catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -95,7 +95,7 @@ validateRequest.checkIfSignUsed = sign => new Promise((resolve, reject) => {
|
|||||||
|
|
||||||
function logRequest(floID, req_str, sign, proxy = false) {
|
function logRequest(floID, req_str, sign, proxy = false) {
|
||||||
//console.debug(floID, req_str);
|
//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));
|
.then(_ => null).catch(error => console.error(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const eCode = require('../../docs/scripts/floExchangeAPI').errorCode;
|
const eCode = require('../../docs/scripts/floExchangeAPI').errorCode;
|
||||||
|
const pCode = require('../../docs/scripts/floExchangeAPI').processCode;
|
||||||
const getRate = require('./conversion').getRate;
|
const getRate = require('./conversion').getRate;
|
||||||
|
|
||||||
var DB; //container for database
|
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("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 => {
|
Promise.allSettled(promises).then(results => {
|
||||||
//console.debug(results.filter(r => r.status === "rejected"));
|
//console.debug(results.filter(r => r.status === "rejected"));
|
||||||
if (results.reduce((a, r) => r.status === "rejected" ? ++a : a, 0))
|
if (results.reduce((a, r) => r.status === "rejected" ? ++a : a, 0))
|
||||||
@ -246,7 +247,7 @@ function refreshBlockchainData(nodeList = []) {
|
|||||||
|
|
||||||
function closeFund(fund_id, floID, ref) {
|
function closeFund(fund_id, floID, ref) {
|
||||||
return new Promise((resolve, reject) => {
|
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)
|
if (result.length)
|
||||||
return reject(INVALID(eCode.DUPLICATE_ENTRY, `Fund closing already in process`));
|
return reject(INVALID(eCode.DUPLICATE_ENTRY, `Fund closing already in process`));
|
||||||
DB.query("SELECT * FROM BobsFund WHERE fund_id=?", [fund_id]).then(result => {
|
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.BTC_USD().then(btc_rate => {
|
||||||
getRate.USD_INR().then(usd_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)
|
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 }))
|
.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))
|
||||||
}).catch(error => reject(error))
|
}).catch(error => reject(error))
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const eCode = require('../../docs/scripts/floExchangeAPI').errorCode;
|
const eCode = require('../../docs/scripts/floExchangeAPI').errorCode;
|
||||||
|
const pCode = require('../../docs/scripts/floExchangeAPI').processCode;
|
||||||
const getRate = require('./conversion').getRate;
|
const getRate = require('./conversion').getRate;
|
||||||
|
|
||||||
var DB; //container for database
|
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("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 => {
|
Promise.allSettled(promises).then(results => {
|
||||||
//console.debug(results.filter(r => r.status === "rejected"));
|
//console.debug(results.filter(r => r.status === "rejected"));
|
||||||
if (results.reduce((a, r) => r.status === "rejected" ? ++a : a, 0))
|
if (results.reduce((a, r) => r.status === "rejected" ? ++a : a, 0))
|
||||||
@ -218,7 +219,7 @@ function refreshBlockchainData(nodeList = []) {
|
|||||||
|
|
||||||
function closeBond(bond_id, floID, ref) {
|
function closeBond(bond_id, floID, ref) {
|
||||||
return new Promise((resolve, reject) => {
|
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)
|
if (result.length)
|
||||||
return reject(INVALID(eCode.DUPLICATE_ENTRY, `Bond closing already in process`));
|
return reject(INVALID(eCode.DUPLICATE_ENTRY, `Bond closing already in process`));
|
||||||
DB.query("SELECT * FROM BlockchainBonds WHERE bond_id=?", [bond_id]).then(result => {
|
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 => {
|
getRate.USD_INR().then(usd_rate => {
|
||||||
let end_date = new Date(),
|
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);
|
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 }))
|
.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))
|
||||||
}).catch(error => reject(error))
|
}).catch(error => reject(error))
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const _sql = require('../_constants').sql;
|
|
||||||
const { MIN_FUND } = require('../_constants')['convert'];
|
const { MIN_FUND } = require('../_constants')['convert'];
|
||||||
const eCode = require('../../docs/scripts/floExchangeAPI').errorCode;
|
const eCode = require('../../docs/scripts/floExchangeAPI').errorCode;
|
||||||
|
const pCode = require('../../docs/scripts/floExchangeAPI').processCode;
|
||||||
|
|
||||||
const allowedConversion = ["BTC"];
|
const allowedConversion = ["BTC"];
|
||||||
|
|
||||||
@ -49,25 +49,25 @@ function checkPoolBalance(coin, req_value, mode) {
|
|||||||
if (!allowedConversion.includes(coin))
|
if (!allowedConversion.includes(coin))
|
||||||
return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid coin (${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 (" +
|
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, r_status FROM DirectConvert) UNION " +
|
||||||
"(SELECT amount, coin, quantity, mode, status FROM ConvertFund) " +
|
"(SELECT amount, coin, quantity, mode, r_status FROM ConvertFund) " +
|
||||||
") WHERE coin=? AND status NOT IN (?) GROUP BY mode"
|
") WHERE coin=? AND r_status NOT IN (?) GROUP BY mode"
|
||||||
DB.query(q, [coin, ["REJECTED", "REFUND"]]).then(result => {
|
DB.query(q, [coin, [pCode.STATUS_REJECTED, "REFUND"]]).then(result => {
|
||||||
let coin_net = 0, cash_net = 0;
|
let coin_net = 0, cash_net = 0;
|
||||||
for (let r of result)
|
for (let r of result)
|
||||||
if (r.mode == _sql.CONVERT_MODE_GET) {
|
if (r.mode == pCodeCONVERT_MODE_GET) {
|
||||||
coin_net -= r.coin_val;
|
coin_net -= r.coin_val;
|
||||||
cash_net += r.cash_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;
|
coin_net += r.coin_val;
|
||||||
cash_net -= r.cash_val;
|
cash_net -= r.cash_val;
|
||||||
}
|
}
|
||||||
BTC_INR().then(rate => {
|
BTC_INR().then(rate => {
|
||||||
coin_net = coin_net * rate;
|
coin_net = coin_net * rate;
|
||||||
let availability = -1;
|
let availability = -1;
|
||||||
if (mode == _sql.CONVERT_MODE_GET)
|
if (mode == pCodeCONVERT_MODE_GET)
|
||||||
availability = coin_net - cash_net * MIN_FUND;
|
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;
|
availability = cash_net - coin_net * MIN_FUND;
|
||||||
req_value = req_value * rate; //convert to currency value
|
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})`));
|
return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid coin (${coin})`));
|
||||||
else if (typeof amount !== "number" || amount <= 0)
|
else if (typeof amount !== "number" || amount <= 0)
|
||||||
return reject(INVALID(eCode.INVALID_NUMBER, `Invalid amount (${amount})`));
|
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)
|
if (result.length)
|
||||||
return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process"));
|
return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process"));
|
||||||
checkPoolBalance(coin, amount, _sql.CONVERT_MODE_GET).then(result => {
|
checkPoolBalance(coin, amount, pCodeCONVERT_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"]])
|
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"))
|
.then(result => resolve("Conversion request in process"))
|
||||||
.catch(error => reject(error));
|
.catch(error => reject(error));
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
if (error instanceof INVALID && error.ecode === eCode.INSUFFICIENT_FUND)
|
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 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, status) VALUES (?)", [[floID, txid, amount, "PENDING"]])
|
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));
|
.then(_ => null).catch(error => console.error(error));
|
||||||
}).catch(error => console.error(error))
|
}).catch(error => console.error(error))
|
||||||
reject(error);
|
reject(error);
|
||||||
@ -113,14 +113,14 @@ function convertFromCoin(floID, txid, tx_hex, coin, quantity) {
|
|||||||
return reject(INVALID(eCode.INVALID_NUMBER, `Invalid quantity (${quantity})`));
|
return reject(INVALID(eCode.INVALID_NUMBER, `Invalid quantity (${quantity})`));
|
||||||
else if (btcOperator.transactionID(tx_hex) !== txid)
|
else if (btcOperator.transactionID(tx_hex) !== txid)
|
||||||
return reject(INVALID(eCode.INVALID_TX_ID, `txid ${txid} doesnt match the tx-hex`));
|
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)
|
if (result.length)
|
||||||
return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process"));
|
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 => {
|
btcOperator.broadcastTx(tx_hex).then(b_txid => {
|
||||||
if (b_txid !== txid)
|
if (b_txid !== txid)
|
||||||
console.warn("broadcast TX-ID is not same as calculated TX-ID");
|
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"))
|
.then(result => resolve("Conversion request in process"))
|
||||||
.catch(error => reject(error));
|
.catch(error => reject(error));
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
@ -140,10 +140,10 @@ function depositCurrencyFund(floID, txid, coin) {
|
|||||||
return reject(INVALID(eCode.ACCESS_DENIED, 'Access Denied'));
|
return reject(INVALID(eCode.ACCESS_DENIED, 'Access Denied'));
|
||||||
else if (!allowedConversion.includes(coin))
|
else if (!allowedConversion.includes(coin))
|
||||||
return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid coin (${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)
|
if (result.length)
|
||||||
return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process"));
|
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"))
|
.then(result => resolve("Add currency fund in process"))
|
||||||
.catch(error => reject(error))
|
.catch(error => reject(error))
|
||||||
}).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'));
|
return reject(INVALID(eCode.ACCESS_DENIED, 'Access Denied'));
|
||||||
else if (!allowedConversion.includes(coin))
|
else if (!allowedConversion.includes(coin))
|
||||||
return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid coin (${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)
|
if (result.length)
|
||||||
return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process"));
|
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"))
|
.then(result => resolve("Add coin fund in process"))
|
||||||
.catch(error => reject(error))
|
.catch(error => reject(error))
|
||||||
}).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'));
|
return reject(INVALID(eCode.ACCESS_DENIED, 'Access Denied'));
|
||||||
else if (!allowedConversion.includes(coin))
|
else if (!allowedConversion.includes(coin))
|
||||||
return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid coin (${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 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 status IN (?)", [_sql.CONVERT_MODE_PUT, ["SUCCESS", "PENDING", "WAITING_CONFIRMATION"]]).then(r2 => {
|
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);
|
let available_amount = (r1[0].deposit_amount || 0) - (r2[0].withdraw_amount || 0);
|
||||||
if (available_amount < amount)
|
if (available_amount < amount)
|
||||||
return reject(INVALID(eCode.INSUFFICIENT_BALANCE, "Insufficient convert-fund deposits to withdraw"));
|
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"))
|
.then(result => resolve("Add currency fund in process"))
|
||||||
.catch(error => reject(error))
|
.catch(error => reject(error))
|
||||||
}).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'));
|
return reject(INVALID(eCode.ACCESS_DENIED, 'Access Denied'));
|
||||||
else if (!allowedConversion.includes(coin))
|
else if (!allowedConversion.includes(coin))
|
||||||
return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid coin (${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 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 status IN (?)", [_sql.CONVERT_MODE_GET, ["SUCCESS", "PENDING"]]).then(r2 => {
|
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);
|
let available_quantity = (r1[0].deposit_quantity || 0) - (r2[0].withdraw_quantity || 0);
|
||||||
if (available_quantity < quantity)
|
if (available_quantity < quantity)
|
||||||
return reject(INVALID(eCode.INSUFFICIENT_BALANCE, "Insufficient convert-fund deposits to withdraw"));
|
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"))
|
.then(result => resolve("Add currency fund in process"))
|
||||||
.catch(error => reject(error))
|
.catch(error => reject(error))
|
||||||
}).catch(error => reject(error))
|
}).catch(error => reject(error))
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user