diff --git a/supernode/index.html b/supernode/index.html
index ac1830d..2f0ed0c 100644
--- a/supernode/index.html
+++ b/supernode/index.html
@@ -9635,7 +9635,8 @@
btc_mainnet: "https://blockexplorer.com",
btc_testnet: "https://testnet.blockexplorer.com",
flo_mainnet: "https://livenet.flocha.in",
- flo_testnet: "https://testnet.flocha.in"
+ flo_testnet: "http://ranchimall1.duckdns.org:8080"
+ //flo_testnet: "https://testnet.flocha.in"
},
writable: false,
configurable: false,
@@ -10048,7 +10049,7 @@
if (request.status >= 200 && request.status < 400) {
data.txs.forEach(tx => {
- if (typeof tx !== undefined && typeof tx.floData == 'string' && tx.floData
+ if (typeof tx !== "undefined" && typeof tx.floData == 'string' && tx.floData
.length > 0) {
callback(tx.floData);
}
@@ -10255,6 +10256,22 @@
}
})
},
+ launchSupernodesKBucket: function() {
+ localbitcoinplusplus.master_configurations.supernodesPubKeys.map(pubKey=>{
+ return new Promise((resolve, reject)=>{
+ try {
+ let flo_id = bitjs.FLO_TEST.pubkey2address(pubKey);
+ let kname = `SKBucket_${pubKey}`;
+ const KBucketId = localbitcoinplusplus.kademlia.floIdToKbucketId('FLO_TEST', flo_id)
+ const kbOptions = { localNodeId: KBucketId }
+ window[kname] = new BuildKBucket(kbOptions);
+ resolve(true);
+ } catch (error) {
+ reject(error);
+ }
+ })
+ })
+ },
addContact: function (id, data, KB=KBucket) {
const contact = {
id: id,
@@ -10273,15 +10290,20 @@
return {decodedId:decodedId, data:data};
},
addNewUserNodeInKbucketAndDB: function (blockchain, address, data, KB=KBucket) {
+ let closestSupernodePubKey = localbitcoinplusplus.master_configurations
+ .supernodesPubKeys.filter(j=>bitjs.FLO_TEST.pubkey2address(j)==data.id);
+
let kbuck = this.addNewUserNodeInKbucket(blockchain, address, data, KB);
readDB('kBucketStore', kbuck.decodedId).then(kres=>{
if (typeof kres=="object") {
kres.data = data;
+ kres.primary_supernode_flo_public_key = closestSupernodePubKey[0]
} else {
kbuckObj={
id: kbuck.decodedId,
vectorClock: 0,
data: kbuck.data,
+ primary_supernode_flo_public_key: closestSupernodePubKey[0],
last_updated_on: + new Date(),
}
kres = kbuckObj;
@@ -10292,6 +10314,20 @@
return Promise.resolve(kbuck);
});
},
+ addFullKBDataInKBucketAndDB: function(full_data, KB) {
+ let userKBId = '';
+ let isFloIdUint8 = full_data.id instanceof Uint8Array;
+ if (!isFloIdUint8) {
+ userKBId = this.floIdToKbucketId('FLO_TEST', full_data.data.id);
+ this.addContact(userKBId, full_data.data, KB);
+ full_data.id = userKBId;
+ } else {
+ this.addContact(full_data.id, full_data.data, KB);
+ }
+ updateinDB('kBucketStore', full_data)
+ .then(ms=>showMessage(`INFO: Added/Updated a node in DB.`))
+ .catch(e=>{showMessage(`ERROR: Failed to add a node in DB.`)});
+ },
floIdToKbucketId: function (blockchain, address) {
const decodedId = this.decodeBase58Address(blockchain, address);
const nodeIdBigInt = new BigInteger(decodedId, 16);
@@ -12776,17 +12812,19 @@
sendTransaction(crypto_type, utxo_addr, utxo_addr_wif, receiver_address, receiving_amount,
receiving_amount_currency = null, change_adress, callback) {
let blockchain_explorer;
- let divDecimal = 1;
if (crypto_type == "BTC") {
blockchain_explorer = localbitcoinplusplus.server.btc_mainnet;
} else if (crypto_type == "BTC_TEST") {
blockchain_explorer = localbitcoinplusplus.server.btc_testnet;
} else if (crypto_type == "FLO") {
blockchain_explorer = localbitcoinplusplus.server.flo_mainnet;
- divDecimal = 100000000;
} else if (crypto_type == "FLO_TEST") {
blockchain_explorer = localbitcoinplusplus.server.flo_testnet;
- divDecimal = 100000000;
+ }
+
+ if(typeof blockchain_explorer !== "string") {
+ showMessage(`WARNING: Please select cryptocurrency/fiat value from select bar.`);
+ return false;
}
let url = `${blockchain_explorer}/api/addr/${utxo_addr}/utxo`;
@@ -12818,7 +12856,7 @@
for (var key in utxo_list) {
if (utxo_list[key].confirmations > 0) {
var obj = utxo_list[key];
- sum += obj.satoshis / divDecimal;
+ sum += obj.amount;
if (btc_eq_receiving_amount <= sum) {
trx.addinput(obj.txid, obj.vout, obj.scriptPubKey);
@@ -12829,9 +12867,7 @@
}
}
- //sum = parseFloat(sum / 100000000).toFixed(8);
-
- let change_amount = sum - btc_eq_receiving_amount - 0.00006060;
+ let change_amount = sum - btc_eq_receiving_amount - 0.00016800;
trx.addoutput(receiver_address, btc_eq_receiving_amount);
trx.addoutput(change_adress, change_amount);
@@ -13617,7 +13653,7 @@
// launch KBucekts
launchKBuckects = await localbitcoinplusplus.kademlia.launchKBucket(idbData.myLocalFLOAddress);
-
+
if (!launchKBuckects) {
const kmsg = `ERROR: Failed to build KBuckets. System cannot proceed further.`;
showMessage(kmsg);
@@ -13755,9 +13791,10 @@
break;
case "server_sync_response":
- if (typeof res_obj.params == "object"
- && typeof res_obj.params[0] == "object") {
+ if (typeof res_obj.params !== "object"
+ || typeof res_obj.params[0] !== "object") return;
let su_backup_db_data = res_obj.params[0];
+
RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address,
function (is_valid_request) {
if(!is_valid_request) return false;
@@ -13806,11 +13843,14 @@
})();
});
- }
+
break;
case "trade_buy_request_response":
- RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address,
+ if (typeof res_obj.params !== "object"
+ || typeof res_obj.params[0] !== "object") return;
+ let trade_buy_res_data = res_obj.params[0];
+ RM_RPC.filter_legit_backup_requests(trade_buy_res_data.trader_flo_address,
function (is_valid_request) {
if(!is_valid_request) return false;
@@ -13844,7 +13884,10 @@
});
break;
case "trade_sell_request_response":
- RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address,
+ if (typeof res_obj.params !== "object"
+ || typeof res_obj.params[0] !== "object") return;
+ let trade_sell_res_data = res_obj.params[0];
+ RM_RPC.filter_legit_backup_requests(trade_buy_res_data.trader_flo_address,
function (is_valid_request) {
if(!is_valid_request) return false;
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
@@ -13875,7 +13918,10 @@
break;
case "deposit_asset_request_response":
- RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address,
+ if (typeof res_obj.params !== "object"
+ || typeof res_obj.params[0] !== "object") return;
+ let deposit_res_data = res_obj.params[0];
+ RM_RPC.filter_legit_backup_requests(deposit_res_data.trader_flo_address,
function (is_valid_request) {
if(!is_valid_request) return false;
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object"
@@ -13911,7 +13957,10 @@
break;
case "withdrawal_request_response":
- RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address,
+ if (typeof res_obj.params !== "object"
+ || typeof res_obj.params[0] !== "object") return;
+ let withdrawal_res_data = res_obj.params[0];
+ RM_RPC.filter_legit_backup_requests(withdrawal_res_data.trader_flo_address,
function (is_valid_request) {
if(!is_valid_request) return false;
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
@@ -13936,7 +13985,10 @@
break;
case "cancel_trade":
- RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address,
+ if (typeof res_obj.params !== "object"
+ || typeof res_obj.params[0] !== "object") return;
+ let cancel_res_data = res_obj.params[0];
+ RM_RPC.filter_legit_backup_requests(cancel_res_data.trader_flo_address,
function (is_valid_request) {
if(!is_valid_request) return false;
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
@@ -13978,7 +14030,10 @@
break;
case "update_all_withdraw_cash_depositor_claim":
- RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address,
+ if (typeof res_obj.params !== "object"
+ || typeof res_obj.params[0] !== "object") return;
+ let withdraw_caim_res_data = res_obj.params[0];
+ RM_RPC.filter_legit_backup_requests(withdraw_caim_res_data.trader_flo_address,
function (is_valid_request) {
if(!is_valid_request) return false;
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
@@ -14014,7 +14069,10 @@
break;
case "update_all_deposit_withdraw_success":
- RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address,
+ if (typeof res_obj.params !== "object"
+ || typeof res_obj.params[0] !== "object") return;
+ let update_deposit_withdraw_claim_data = res_obj.params[0];
+ RM_RPC.filter_legit_backup_requests(update_deposit_withdraw_claim_data.trader_flo_address,
function (is_valid_request) {
if(!is_valid_request) return false;
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
@@ -14051,7 +14109,10 @@
});
break;
case "requestSupernodesToRemoveAUserFloIdFromTheirKBucket":
- RM_RPC.filter_legit_backup_requests(su_backup_db_data.trader_flo_address,
+ if (typeof res_obj.params !== "object"
+ || typeof res_obj.params[0] !== "object") return;
+ let removeUserFromKBData = res_obj.params[0];
+ RM_RPC.filter_legit_backup_requests(removeUserFromKBData.trader_flo_address,
function (is_valid_request) {
if(!is_valid_request) return false;
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
@@ -14065,6 +14126,38 @@
}
});
break;
+ case "requestSupernodesKBucketData":
+ if (typeof res_obj.params !== "object"
+ || typeof res_obj.params[0] !== "object") return;
+ let reqSuKBData = res_obj.params[0];
+ RM_RPC.filter_legit_backup_requests(reqSuKBData.trader_flo_address,
+ function (is_valid_request) {
+ if(!is_valid_request) return false;
+ if(typeof res_obj.globalParams.senderFloId !=="string") return;
+ let sender = res_obj.globalParams.senderFloId;
+ readAllDB('kBucketStore')
+ .then(myKBData=>{
+ myKBData.receiver_flo_address = sender;
+ let sendBackMySupernodeKBucket = localbitcoinplusplus.rpc.prototype
+ .send_rpc
+ .call(this, "SupernodesKBucketDataResponse", myKBData);
+ doSend(sendBackMySupernodeKBucket);
+ })
+ }
+ );
+ break;
+ case "SupernodesKBucketDataResponse":
+ if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
+ const reqSuKBResponseData = res_obj.params[0];
+ RM_RPC.filter_legit_backup_requests(reqSuKBResponseData.trader_flo_address,
+ function (is_valid_request) {
+ if(!is_valid_request) return false;
+ reqSuKBResponseData.map(kd=> {
+ let kb = window[`SKBucket_${kd.primary_supernode_flo_public_key}`];
+ localbitcoinplusplus.kademlia.addFullKBDataInKBucketAndDB(kd, kb)})
+ });
+ }
+ break;
case "link_My_Local_IP_To_My_Flo_Id":
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
const req_params = res_obj.params[0];
@@ -14289,7 +14382,7 @@
async function onMessage(evt) {
var response = evt.data;
-
+ writeToScreen('RESPONSE: ' + response + '');
// If the message is about leaving of a node determine its FLO Id
// and fire respective events
let isItANodeLeavingMessage = response.search(`\\-- left`);
@@ -15038,15 +15131,9 @@
newKbucketObject_id_array = Object.values(newKbucketObject.id);
newKbucketObject_idu8 = new Uint8Array(newKbucketObject_id_array);
- if (localbitcoinplusplus.wallets.my_local_flo_address !== my_closest_su[0].data.id) {
- // User is connected to backup supernode
- localbitcoinplusplus.kademlia.addNewUserNodeInKbucket("FLO_TEST",
+
+ localbitcoinplusplus.kademlia.addNewUserNodeInKbucketAndDB("FLO_TEST",
newKbucketObject_idu8, newKbucketObject.data);
- } else {
- // User is connected to primary supernode
- localbitcoinplusplus.kademlia.addNewUserNodeInKbucketAndDB("FLO_TEST",
- newKbucketObject_idu8, newKbucketObject.data);
- }
let removeRedundantKNode = localbitcoinplusplus.rpc.prototype
.send_rpc
@@ -15236,7 +15323,6 @@
return;
}
}
- writeToScreen('RESPONSE: ' + evt.data + '');
}
function onError(evt) {
@@ -15452,6 +15538,7 @@
id: null,
vectorClock: 0,
data: null,
+ primary_supernode_flo_public_key: null,
last_updated_on: null,
}
@@ -15470,7 +15557,7 @@
var db;
const DBName = "localbitcoinDB";
- const request = window.indexedDB.open(DBName, 3);
+ const request = window.indexedDB.open(DBName, 4);
request.onerror = function (event) {
//https://stackoverflow.com/questions/13972385/invalidstateerror-while-opening-indexeddb-in-firefox
@@ -15617,7 +15704,11 @@
if (!db.objectStoreNames.contains('kBucketStore')) {
var objectStore = db.createObjectStore('kBucketStore', {
keyPath: "id"
- })
+ });
+ objectStore.createIndex('primary_supernode_flo_public_key'
+ , 'primary_supernode_flo_public_key', {
+ unique: false
+ });
}
if (!db.objectStoreNames.contains('messages_table')) {
var objectStore = db.createObjectStore("messages_table", {
@@ -16247,6 +16338,17 @@
// restore k-bucket
const dbObj = await localbitcoinplusplus.kademlia.restoreKbucket(MY_LOCAL_FLO_ADDRESS, "FLO_TEST", KBucket);
+
+ // launch supernode kbucket
+ if (localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(idbData.myLocalFLOPublicKey)) {
+ // Build Supernodes KBuckets
+ launchSupernodesKBuckects = await localbitcoinplusplus.kademlia.launchSupernodesKBucket();
+ // Request other supernodes KBucket data
+ let requestSupernodeKBData = localbitcoinplusplus.rpc.prototype
+ .send_rpc
+ .call(this, "requestSupernodesKBucketData", {});
+ doSend(requestSupernodeKBData);
+ }
// Send your id to Supernode kbucket
if (!localbitcoinplusplus.master_configurations.supernodesPubKeys