Fixes: sinkID and sinkPrivKey usage
This commit is contained in:
parent
65f7a5d94e
commit
dd232c5a71
@ -114,6 +114,14 @@ module.exports = function App(secret, DB) {
|
|||||||
set: (assets) => Request.assetList = assets
|
set: (assets) => Request.assetList = assets
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Object.defineProperty(self, "chest", {
|
||||||
|
set: (chest) => Request.chest = chest
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.defineProperty(self, "collectAndCall", {
|
||||||
|
set: (fn) => Request.collectAndCall = fn
|
||||||
|
});
|
||||||
|
|
||||||
//Start (or) Stop servers
|
//Start (or) Stop servers
|
||||||
self.start = (port) => new Promise(resolve => {
|
self.start = (port) => new Promise(resolve => {
|
||||||
server = app.listen(port, () => {
|
server = app.listen(port, () => {
|
||||||
|
|||||||
@ -20,6 +20,30 @@ const SLAVE_MODE = 0,
|
|||||||
|
|
||||||
const sinkList = {};
|
const sinkList = {};
|
||||||
|
|
||||||
|
app.chest = {
|
||||||
|
get list() {
|
||||||
|
return Object.keys(sinkList);
|
||||||
|
},
|
||||||
|
get activeList() {
|
||||||
|
let result = [];
|
||||||
|
for (let id in sinkList)
|
||||||
|
if (sinkList[id])
|
||||||
|
result.push(id);
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
includes(id) {
|
||||||
|
return (id in sinkList);
|
||||||
|
},
|
||||||
|
isActive(id) {
|
||||||
|
return (id in sinkList && sinkList[id] !== null);
|
||||||
|
},
|
||||||
|
get pick() {
|
||||||
|
let sinks = Object.keys(sinkList),
|
||||||
|
i = floCrypto.randInt(0, sinks.length);
|
||||||
|
return sinks[i];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//Shares
|
//Shares
|
||||||
function generateShares(sinkKey) {
|
function generateShares(sinkKey) {
|
||||||
let nextNodes = nodeKBucket.nextNode(global.myFloID, null),
|
let nextNodes = nodeKBucket.nextNode(global.myFloID, null),
|
||||||
@ -261,7 +285,7 @@ function slaveConnect(floID, pubKey, ws, sinks) {
|
|||||||
/*
|
/*
|
||||||
if (shares_pending === null || //The 1st backup is connected
|
if (shares_pending === null || //The 1st backup is connected
|
||||||
Object.keys(connectedSlaves).length < Math.pow(SHARE_THRESHOLD, 2) * Object.keys(shares_pending).length) //re-calib shares for better
|
Object.keys(connectedSlaves).length < Math.pow(SHARE_THRESHOLD, 2) * Object.keys(shares_pending).length) //re-calib shares for better
|
||||||
sendSharesToNodes(global.sinkID, generateShares(global.sinkPrivKey))
|
sendSharesToNodes(sinkID, generateShares(sinkPrivKey))
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const coupling = require('./coupling');
|
const coupling = require('./coupling');
|
||||||
|
const blockchain = require('./blockchain');
|
||||||
|
|
||||||
const {
|
const {
|
||||||
PERIOD_INTERVAL,
|
PERIOD_INTERVAL,
|
||||||
@ -379,9 +380,6 @@ function confirmDepositFLO() {
|
|||||||
|
|
||||||
confirmDepositFLO.checkTx = function(sender, txid) {
|
confirmDepositFLO.checkTx = function(sender, txid) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let receiver = global.sinkID; //receiver should be market's floID (ie, sinkID)
|
|
||||||
if (!receiver)
|
|
||||||
return reject([false, 'sinkID not loaded']);
|
|
||||||
floBlockchainAPI.getTx(txid).then(tx => {
|
floBlockchainAPI.getTx(txid).then(tx => {
|
||||||
let vin_sender = tx.vin.filter(v => v.addr === sender)
|
let vin_sender = tx.vin.filter(v => v.addr === sender)
|
||||||
if (!vin_sender.length)
|
if (!vin_sender.length)
|
||||||
@ -392,9 +390,9 @@ confirmDepositFLO.checkTx = function(sender, txid) {
|
|||||||
return reject([false, "Transaction not included in any block yet"]);
|
return reject([false, "Transaction not included in any block yet"]);
|
||||||
if (!tx.confirmations)
|
if (!tx.confirmations)
|
||||||
return reject([false, "Transaction not confirmed yet"]);
|
return reject([false, "Transaction not confirmed yet"]);
|
||||||
let amount = tx.vout.reduce((a, v) => v.scriptPubKey.addresses[0] === receiver ? a + v.value : a, 0);
|
let amount = tx.vout.reduce((a, v) => blockchain.chest.includes(v.scriptPubKey.addresses[0]) ? a + v.value : a, 0);
|
||||||
if (amount == 0)
|
if (amount == 0)
|
||||||
return reject([true, "Transaction receiver is not market ID"]);
|
return reject([true, "Transaction receiver is not market ID"]); //Maybe reject as false? (to compensate delay in chestList loading from other nodes)
|
||||||
else
|
else
|
||||||
resolve(amount);
|
resolve(amount);
|
||||||
}).catch(error => reject([false, error]))
|
}).catch(error => reject([false, error]))
|
||||||
@ -438,20 +436,8 @@ 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 => {
|
||||||
//Send FLO to user via blockchain API
|
blockchain.sendFLO(floID, amount);
|
||||||
floBlockchainAPI.sendTx(global.sinkID, floID, amount, global.sinkPrivKey, '(withdrawal from market)').then(txid => {
|
resolve("Withdrawal request is in process");
|
||||||
if (!txid)
|
|
||||||
throw Error("Transaction not successful");
|
|
||||||
//Transaction was successful, Add in DB
|
|
||||||
DB.query("INSERT INTO OutputFLO (floID, amount, txid, status) VALUES (?, ?, ?, ?)", [floID, amount, txid, "WAITING_CONFIRMATION"])
|
|
||||||
.then(_ => null).catch(error => console.error(error))
|
|
||||||
.finally(_ => resolve("Withdrawal was successful"));
|
|
||||||
}).catch(error => {
|
|
||||||
console.error(error);
|
|
||||||
DB.query("INSERT INTO OutputFLO (floID, amount, status) VALUES (?, ?, ?)", [floID, amount, "PENDING"])
|
|
||||||
.then(_ => null).catch(error => console.error(error))
|
|
||||||
.finally(_ => resolve("Withdrawal request is in process"));
|
|
||||||
});
|
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
});
|
});
|
||||||
@ -459,15 +445,7 @@ function withdrawFLO(floID, amount) {
|
|||||||
|
|
||||||
function retryWithdrawalFLO() {
|
function retryWithdrawalFLO() {
|
||||||
DB.query("SELECT id, floID, amount FROM OutputFLO WHERE status=?", ["PENDING"]).then(results => {
|
DB.query("SELECT id, floID, amount FROM OutputFLO WHERE status=?", ["PENDING"]).then(results => {
|
||||||
results.forEach(req => {
|
results.forEach(req => blockchain.resendFLO(req.floID, req.amount))
|
||||||
floBlockchainAPI.sendTx(global.sinkID, req.floID, req.amount, global.sinkPrivKey, 'Withdraw FLO Coins from Market').then(txid => {
|
|
||||||
if (!txid)
|
|
||||||
throw Error("Transaction not successful");
|
|
||||||
//Transaction was successful, Add in DB
|
|
||||||
DB.query("UPDATE OutputFLO SET status=?, txid=? WHERE id=?", ["WAITING_CONFIRMATION", txid, req.id])
|
|
||||||
.then(_ => null).catch(error => console.error(error));
|
|
||||||
}).catch(error => console.error(error));
|
|
||||||
})
|
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -537,9 +515,6 @@ function confirmDepositToken() {
|
|||||||
|
|
||||||
confirmDepositToken.checkTx = function(sender, txid) {
|
confirmDepositToken.checkTx = function(sender, txid) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let receiver = global.sinkID; //receiver should be market's floID (ie, sinkID)
|
|
||||||
if (!receiver)
|
|
||||||
return reject([false, 'sinkID not loaded']);
|
|
||||||
floTokenAPI.getTx(txid).then(tx => {
|
floTokenAPI.getTx(txid).then(tx => {
|
||||||
if (tx.parsedFloData.type !== "transfer")
|
if (tx.parsedFloData.type !== "transfer")
|
||||||
return reject([true, "Transaction type not 'transfer'"]);
|
return reject([true, "Transaction type not 'transfer'"]);
|
||||||
@ -552,9 +527,9 @@ confirmDepositToken.checkTx = function(sender, txid) {
|
|||||||
let vin_sender = tx.transactionDetails.vin.filter(v => v.addr === sender)
|
let vin_sender = tx.transactionDetails.vin.filter(v => v.addr === sender)
|
||||||
if (!vin_sender.length)
|
if (!vin_sender.length)
|
||||||
return reject([true, "Transaction not sent by the sender"]);
|
return reject([true, "Transaction not sent by the sender"]);
|
||||||
let amount_flo = tx.transactionDetails.vout.reduce((a, v) => v.scriptPubKey.addresses[0] === receiver ? a + v.value : a, 0);
|
let amount_flo = tx.transactionDetails.vout.reduce((a, v) => blockchain.chest.includes(v.scriptPubKey.addresses[0]) ? a + v.value : a, 0);
|
||||||
if (amount_flo == 0)
|
if (amount_flo == 0)
|
||||||
return reject([true, "Transaction receiver is not market ID"]);
|
return reject([true, "Transaction receiver is not market ID"]); //Maybe reject as false? (to compensate delay in chestList loading from other nodes)
|
||||||
else
|
else
|
||||||
resolve([token_name, amount_token, amount_flo]);
|
resolve([token_name, amount_token, amount_flo]);
|
||||||
}).catch(error => reject([false, error]))
|
}).catch(error => reject([false, error]))
|
||||||
@ -577,19 +552,9 @@ function withdrawToken(floID, token, amount) {
|
|||||||
txQueries.push(updateBalance.consume(floID, "FLO", required_flo));
|
txQueries.push(updateBalance.consume(floID, "FLO", required_flo));
|
||||||
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 FLO to user via blockchain API
|
//Send Token to user via token API
|
||||||
floTokenAPI.sendToken(global.sinkPrivKey, amount, floID, '(withdrawal from market)', token).then(txid => {
|
blockchain.sendToken(floID, token, amount);
|
||||||
if (!txid) throw Error("Transaction not successful");
|
resolve("Withdrawal request is in process");
|
||||||
//Transaction was successful, Add in DB
|
|
||||||
DB.query("INSERT INTO OutputToken (floID, token, amount, txid, status) VALUES (?, ?, ?, ?, ?)", [floID, token, amount, txid, "WAITING_CONFIRMATION"])
|
|
||||||
.then(_ => null).catch(error => console.error(error))
|
|
||||||
.finally(_ => resolve("Withdrawal was successful"));
|
|
||||||
}).catch(error => {
|
|
||||||
console.error(error);
|
|
||||||
DB.query("INSERT INTO OutputToken (floID, token, amount, status) VALUES (?, ?, ?, ?)", [floID, token, amount, "PENDING"])
|
|
||||||
.then(_ => null).catch(error => console.error(error))
|
|
||||||
.finally(_ => resolve("Withdrawal request is in process"));
|
|
||||||
});
|
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
@ -598,15 +563,7 @@ function withdrawToken(floID, token, amount) {
|
|||||||
|
|
||||||
function retryWithdrawalToken() {
|
function retryWithdrawalToken() {
|
||||||
DB.query("SELECT id, floID, token, amount FROM OutputToken WHERE status=?", ["PENDING"]).then(results => {
|
DB.query("SELECT id, floID, token, amount FROM OutputToken WHERE status=?", ["PENDING"]).then(results => {
|
||||||
results.forEach(req => {
|
results.forEach(req => blockchain.resendToken(req.floID, req.token, req.amount));
|
||||||
floTokenAPI.sendToken(global.sinkPrivKey, req.amount, req.floID, '(withdrawal from market)', req.token).then(txid => {
|
|
||||||
if (!txid)
|
|
||||||
throw Error("Transaction not successful");
|
|
||||||
//Transaction was successful, Add in DB
|
|
||||||
DB.query("UPDATE OutputToken SET status=?, txid=? WHERE id=?", ["WAITING_CONFIRMATION", txid, req.id])
|
|
||||||
.then(_ => null).catch(error => console.error(error));
|
|
||||||
}).catch(error => console.error(error));
|
|
||||||
});
|
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -712,7 +669,7 @@ function blockchainReCheck() {
|
|||||||
clearTimeout(blockchainReCheck.timeout);
|
clearTimeout(blockchainReCheck.timeout);
|
||||||
delete blockchainReCheck.timeout;
|
delete blockchainReCheck.timeout;
|
||||||
}
|
}
|
||||||
if (!global.sinkID)
|
if (!blockchain.chest.list.length)
|
||||||
return blockchainReCheck.timeout = setTimeout(blockchainReCheck, WAIT_TIME);
|
return blockchainReCheck.timeout = setTimeout(blockchainReCheck, WAIT_TIME);
|
||||||
|
|
||||||
floBlockchainAPI.promisedAPI('api/blocks?limit=1').then(result => {
|
floBlockchainAPI.promisedAPI('api/blocks?limit=1').then(result => {
|
||||||
@ -738,6 +695,12 @@ module.exports = {
|
|||||||
get priceCountDown() {
|
get priceCountDown() {
|
||||||
return coupling.price.lastTimes;
|
return coupling.price.lastTimes;
|
||||||
},
|
},
|
||||||
|
get chest() {
|
||||||
|
return blockchain.chest;
|
||||||
|
},
|
||||||
|
set chest(c) {
|
||||||
|
blockchain.chest = c;
|
||||||
|
},
|
||||||
addBuyOrder,
|
addBuyOrder,
|
||||||
addSellOrder,
|
addSellOrder,
|
||||||
cancelOrder,
|
cancelOrder,
|
||||||
@ -765,5 +728,8 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
get assetList() {
|
get assetList() {
|
||||||
return assetList
|
return assetList
|
||||||
}
|
},
|
||||||
|
set collectAndCall(fn) {
|
||||||
|
blockchain.collectAndCall = fn;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
@ -128,7 +128,7 @@ function Account(req, res) {
|
|||||||
timestamp: data.timestamp
|
timestamp: data.timestamp
|
||||||
}, data.sign, data.floID, data.pubKey).then(req_str => {
|
}, data.sign, data.floID, data.pubKey).then(req_str => {
|
||||||
market.getAccountDetails(data.floID).then(result => {
|
market.getAccountDetails(data.floID).then(result => {
|
||||||
result.sinkID = global.sinkID;
|
result.sinkID = market.chest.pick;
|
||||||
if (trustedIDs.includes(data.floID))
|
if (trustedIDs.includes(data.floID))
|
||||||
result.subAdmin = true;
|
result.subAdmin = true;
|
||||||
res.send(result);
|
res.send(result);
|
||||||
@ -530,6 +530,12 @@ module.exports = {
|
|||||||
set assetList(assets) {
|
set assetList(assets) {
|
||||||
market.assetList = assets;
|
market.assetList = assets;
|
||||||
},
|
},
|
||||||
|
set chest(c) {
|
||||||
|
market.chest = c;
|
||||||
|
},
|
||||||
|
set collectAndCall(fn) {
|
||||||
|
market.collectAndCall = fn;
|
||||||
|
},
|
||||||
set DB(db) {
|
set DB(db) {
|
||||||
DB = db;
|
DB = db;
|
||||||
market.DB = db;
|
market.DB = db;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user