diff --git a/assets/dashboard/js/app.js b/assets/dashboard/js/app.js index d602a4b..30cd730 100644 --- a/assets/dashboard/js/app.js +++ b/assets/dashboard/js/app.js @@ -74,646 +74,661 @@ var GlobalHostingContractDetailArray = new Array(); var GlobalExtensionDuration; /*END OF MISC GLOBAL VARIABLES*/ +var elem = document.querySelector('.modal'); +var instance = M.Modal.init(elem); +instance.open(); + function isWindows() { - return navigator.platform.indexOf('Win') > -1 + return navigator.platform.indexOf('Win') > -1 } var pathSymbol = "/"; -if(isWindows()) { - pathSymbol = "\\"; +if (isWindows()) { + pathSymbol = "\\"; } fetch('https://api.coinmarketcap.com/v2/ticker/3452/').then(response => { - return response.json(); + return response.json(); }).then(data => { - var ethoPriceUSD = data.data.quotes.USD.price; - document.getElementById("ethoprice").textContent = round(ethoPriceUSD, 4); + var ethoPriceUSD = data.data.quotes.USD.price; + document.getElementById("ethoprice").textContent = round(ethoPriceUSD, 4); }).catch(err => {}); if (typeof web3 == 'undefined') { - var web3 = new Web3() - web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546")); - $('#ethofsLoginModal').modal('show'); + var web3 = new Web3() + web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546")); + $('#ethofsLoginModal').modal({dismissible: true}); + $('#ethofsLoginModal').modal('open'); } else { - ethofsLogin(""); + ethofsLogin(""); } function ethofsLogin(privateKey) { - $('#ethofsLoginModal').modal('hide'); - $('#ethofsRegistrationModal').modal('hide'); - //CREATE ETHER-1 CHAIN CONNECTION AND LOOK FOR EXISTING USER ACCOUNT - if (privateKey != "") { - GlobalPrivateKey = privateKey; - privateKeyLogin = true; - web3.eth.net.isListening() - .then(function () { - console.log('ethoFS is connected') - let account = web3.eth.accounts.privateKeyToAccount('0x' + privateKey); - console.log(account); - web3.eth.accounts.wallet.add(account) - web3.eth.defaultAccount = account.address; - startEthofs() - }) - } else { - privateKeyLogin = false; - web3 = new Web3(web3.currentProvider); - web3.eth.getAccounts(function (err, accounts) { - if (err != null) { - console.error("An error occurred: " + err); - outputNoAddressContractTable(); - } else if (accounts.length == 0) { - $('#ethofsLoginModal').modal('show'); - console.log("User is not logged in"); - document.getElementById("welcome-name").textContent = "Access to Ether-1 Blockchain Not Found - Make Sure You Are Using Metamask or The Ether-1 Browser Extension"; - document.getElementById("accountaddress").textContent = "Address Not Found"; - outputNoAddressContractTable(); - } else { - console.log("User is logged in"); - web3.eth.defaultAccount = accounts[0]; - startEthofs(); - } - }); - } + $('#ethofsLoginModal').modal('close'); + $('#ethofsRegistrationModal').modal({dismissible: true}); + $('#ethofsRegistrationModal').modal('close'); + //CREATE ETHER-1 CHAIN CONNECTION AND LOOK FOR EXISTING USER ACCOUNT + if (privateKey != "") { + GlobalPrivateKey = privateKey; + privateKeyLogin = true; + web3.eth.net.isListening() + .then(function() { + console.log('ethoFS is connected') + let account = web3.eth.accounts.privateKeyToAccount('0x' + privateKey); + console.log(account); + web3.eth.accounts.wallet.add(account) + web3.eth.defaultAccount = account.address; + startEthofs() + }) + } else { + privateKeyLogin = false; + web3 = new Web3(web3.currentProvider); + web3.eth.getAccounts(function(err, accounts) { + if (err != null) { + console.error("An error occurred: " + err); + outputNoAddressContractTable(); + } else if (accounts.length == 0) { + $('#ethofsLoginModal').modal('open'); + console.log("User is not logged in"); + document.getElementById("welcome-name").textContent = "Access to Ether-1 Blockchain Not Found - Make Sure You Are Using Metamask or The Ether-1 Browser Extension"; + document.getElementById("accountaddress").textContent = "Address Not Found"; + outputNoAddressContractTable(); + } else { + console.log("User is logged in"); + web3.eth.defaultAccount = accounts[0]; + startEthofs(); + } + }); + } } + function startEthofs() { - console.log("Starting ethoFS"); - GlobalUserAddress = web3.eth.defaultAccount; - var ethoFSAccounts = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress); - ethoFSAccounts.methods.CheckAccountExistence(GlobalUserAddress).call(function (error, result) { - if (!error) { + console.log("Starting ethoFS"); + GlobalUserAddress = web3.eth.defaultAccount; + var ethoFSAccounts = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress); + ethoFSAccounts.methods.CheckAccountExistence(GlobalUserAddress).call(function(error, result) { + if (!error) { + if (result) { + document.getElementById("accountaddress").textContent = web3.eth.defaultAccount; + ethoFSAccounts.methods.GetUserAccountName(GlobalUserAddress).call(function(error, result) { + if (!error) { if (result) { - document.getElementById("accountaddress").textContent = web3.eth.defaultAccount; - ethoFSAccounts.methods.GetUserAccountName(GlobalUserAddress).call(function (error, result) { - if (!error) { - if (result) { - getBlockHeight(web3); - getBalance(web3); - document.getElementById("welcome-name").textContent = "Welcome Back " + result; - updateContractTable(); - startApplication(); - } - } else { - console.log("Error getting user account name"); - } - }); - } else { - document.getElementById("welcome-name").textContent = "User Not Found"; - document.getElementById("accountaddress").textContent = "Address Not Found"; - console.log("User Not Found"); - $('#ethofsRegistrationModal').modal('show'); + getBlockHeight(web3); + getBalance(web3); + document.getElementById("welcome-name").textContent = "Welcome Back " + result; + updateContractTable(); + startApplication(); } - } else { - document.getElementById("welcome-name").textContent = "Access to Ether-1 Blockchain Not Found - Make Sure You Are Using Metamask or The Ether-1 Browser Extension"; - document.getElementById("accountaddress").textContent = "Address Not Found"; - console.log("Blockchain Access Error"); - } - }); + } else { + console.log("Error getting user account name"); + } + }); + } else { + document.getElementById("welcome-name").textContent = "User Not Found"; + document.getElementById("accountaddress").textContent = "Address Not Found"; + console.log("User Not Found"); + $('#ethofsRegistrationModal').modal('open'); + } + } else { + document.getElementById("welcome-name").textContent = "Access to Ether-1 Blockchain Not Found - Make Sure You Are Using Metamask or The Ether-1 Browser Extension"; + document.getElementById("accountaddress").textContent = "Address Not Found"; + console.log("Blockchain Access Error"); + } + }); } /*************************************************************************************************************/ function AddNewUser(userName) { - console.log("Initiating New User Addition... " + userName); - var controller = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress); + console.log("Initiating New User Addition... " + userName); + var controller = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress); - if (privateKeyLogin == true) { - const tx = { - to: GlobalControllerContractAddress, - from: GlobalUserAddress, - gas: 4000000, - data: controller.methods.AddNewUserPublic(userName).encodeABI() - }; - var privateKey = '0x' + GlobalPrivateKey; - web3.eth.accounts.signTransaction(tx, privateKey) - .then(function (signedTransactionData) { - web3.eth.sendSignedTransaction(signedTransactionData.rawTransaction, function (error, result) { - if (!error) { - if (result) { - $('#minedBlockTrackerModal').modal('show'); - waitForReceipt(result, function (receipt) { - console.log("Transaction Has Been Mined: " + receipt); - $('#minedBlockTrackerModal').modal('hide'); - ethofsLogin(GlobalPrivateKey); - }); - } else { - console.log("There was a problem adding new contract"); - } - } else { - console.error(error); - } - }); - }); - } else { - controller.methods.AddNewUserPublic(userName).send(function (error, result) { - if (!error) { - if (result) { - document.getElementById("wait").innerHTML = 'Waiting For Add User Confirmation.'; - $('#minedBlockTrackerModal').modal('show'); - waitForReceipt(result, function (receipt) { - console.log("Transaction Has Been Mined: " + receipt); - $('#minedBlockTrackerModal').modal('hide'); - ethofsLogin(""); - }); - } else { - console.log("There was a problem adding new user"); - $('#ethofsLoginModal').modal('show'); - } + if (privateKeyLogin == true) { + const tx = { + to: GlobalControllerContractAddress, + from: GlobalUserAddress, + gas: 4000000, + data: controller.methods.AddNewUserPublic(userName).encodeABI() + }; + var privateKey = '0x' + GlobalPrivateKey; + web3.eth.accounts.signTransaction(tx, privateKey) + .then(function(signedTransactionData) { + web3.eth.sendSignedTransaction(signedTransactionData.rawTransaction, function(error, result) { + if (!error) { + if (result) { + $('#minedBlockTrackerModal').modal({dismissible: true}); + $('#minedBlockTrackerModal').modal('open'); + waitForReceipt(result, function(receipt) { + console.log("Transaction Has Been Mined: " + receipt); + $('#minedBlockTrackerModal').modal('close'); + ethofsLogin(GlobalPrivateKey); + }); } else { - console.error(error); - $('#ethofsLoginModal').modal('show'); + console.log("There was a problem adding new contract"); } + } else { + console.error(error); + } }); - } + }); + } else { + controller.methods.AddNewUserPublic(userName).send(function(error, result) { + if (!error) { + if (result) { + document.getElementById("wait").innerHTML = 'Waiting For Add User Confirmation.'; + $('#minedBlockTrackerModal').modal('open'); + waitForReceipt(result, function(receipt) { + console.log("Transaction Has Been Mined: " + receipt); + $('#minedBlockTrackerModal').modal('close'); + ethofsLogin(""); + }); + } else { + console.log("There was a problem adding new user"); + $('#ethofsLoginModal').modal('open'); + } + } else { + console.error(error); + $('#ethofsLoginModal').modal('open'); + } + }); + } } /*************************************************************************************************************/ function getBlockHeight(web3) { - console.log("Starting Block Height Detection.."); - web3.eth.getBlockNumber(function (err, data) { - document.getElementById("blocknumber").textContent = data; - console.log("ETHO Block Number: " + data); - }); + console.log("Starting Block Height Detection.."); + web3.eth.getBlockNumber(function(err, data) { + document.getElementById("blocknumber").textContent = data; + console.log("ETHO Block Number: " + data); + }); } /*************************************************************************************************************/ function getBalance(web3) { - console.log("Starting Balance Detection.."); - web3.eth.getBalance(web3.eth.defaultAccount, function (err, data) { - var balance = "ETHO Balance: " + Number(web3.utils.fromWei(data, "ether")).toFixed(2); - document.getElementById("ethobalance").textContent = balance; - console.log("ETHO Balance: " + data); - }); + console.log("Starting Balance Detection.."); + web3.eth.getBalance(web3.eth.defaultAccount, function(err, data) { + var balance = "ETHO Balance: " + Number(web3.utils.fromWei(data, "ether")).toFixed(2); + document.getElementById("ethobalance").textContent = balance; + console.log("ETHO Balance: " + data); + }); } /*************************************************************************************************************/ //CALCULATE AMOUNT TO BE SENT function calculateCost(contractSize, contractDuration, hostingCost) { - var cost = ((((contractSize / 1048576) * hostingCost) * (contractDuration / 46522))); - if (cost < minimumContractCost) { - cost = minimumContractCost; - } - return cost; + var cost = ((((contractSize / 1048576) * hostingCost) * (contractDuration / 46522))); + if (cost < minimumContractCost) { + cost = minimumContractCost; + } + return cost; } /*************************************************************************************************************/ //CHECK FOR TX - BLOCK TO BE MINED function waitForReceipt(hash, cb) { - web3.eth.getTransactionReceipt(hash, function (err, receipt) { - document.getElementById("mining-status-message").textContent = "In Progress"; - $miningMessage.innerText = "Waiting For Transaction Confirmation"; - web3.eth.getBlock('latest', function (e, res) { - if (!e) { - document.getElementById("block-height").textContent = res.number; - } - }); - if (err) { - error(err); - $miningMessage.innerText = "Error Conneting To Ether-1 Network"; - } - if (receipt !== null) { - $miningMessage.innerText = "Transaction Confirmed"; - document.getElementById("mining-status-message").textContent = "Complete"; - if (cb) { - cb(receipt); - } - } else { - setTimeout(function () { - waitForReceipt(hash, cb); - }, 10000); - } + web3.eth.getTransactionReceipt(hash, function(err, receipt) { + document.getElementById("mining-status-message").textContent = "In Progress"; + $miningMessage.innerText = "Waiting For Transaction Confirmation"; + web3.eth.getBlock('latest', function(e, res) { + if (!e) { + document.getElementById("block-height").textContent = res.number; + } }); + if (err) { + error(err); + $miningMessage.innerText = "Error Conneting To Ether-1 Network"; + } + if (receipt !== null) { + $miningMessage.innerText = "Transaction Confirmed"; + document.getElementById("mining-status-message").textContent = "Complete"; + if (cb) { + cb(receipt); + } + } else { + setTimeout(function() { + waitForReceipt(hash, cb); + }, 10000); + } + }); } /*************************************************************************************************************/ //CREATE ETHER-1 CHAIN CONNECTION AND REMOVE CONTRACT function RemoveContract(hostingAddress, contentHash) { - var pinRemoving = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress); - if (privateKeyLogin == true) { - const tx = { - to: GlobalControllerContractAddress, - from: GlobalUserAddress, - gas: 4000000, - data: pinRemoving.methods.RemoveHostingContract(hostingAddress, contentHash).encodeABI() - }; - var privateKey = '0x' + GlobalPrivateKey; - console.log("Private Key: " + privateKey); - web3.eth.accounts.signTransaction(tx, privateKey) - .then(function (signedTransactionData) { - console.log("Signed TX Data: " + signedTransactionData.rawTransaction); - web3.eth.sendSignedTransaction(signedTransactionData.rawTransaction, function (error, result) { - if (!error) { - if (result) { - $('#minedBlockTrackerModal').modal('show'); - waitForReceipt(result, function (receipt) { - console.log("Transaction Has Been Mined: " + receipt); - $('#minedBlockTrackerModal').modal('hide'); - updateContractTable(); - }); - } else { - console.log("There was a problem adding new contract"); - } - } else { - console.error(error); - } - }); - }); - } else { - const tx = { - to: GlobalControllerContractAddress, - from: GlobalUserAddress, - }; - pinRemoving.methods.RemoveHostingContract(hostingAddress, contentHash).send(tx, function (error, result) { - if (!error) { - if (result) { - $('#minedBlockTrackerModal').modal('show'); - waitForReceipt(result, function (receipt) { - console.log("Transaction Has Been Mined: " + receipt); - $('#minedBlockTrackerModal').modal('hide'); - updateContractTable(); - }); - } else { - console.log("There was a problem removing contract"); - } + var pinRemoving = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress); + if (privateKeyLogin == true) { + const tx = { + to: GlobalControllerContractAddress, + from: GlobalUserAddress, + gas: 4000000, + data: pinRemoving.methods.RemoveHostingContract(hostingAddress, contentHash).encodeABI() + }; + var privateKey = '0x' + GlobalPrivateKey; + console.log("Private Key: " + privateKey); + web3.eth.accounts.signTransaction(tx, privateKey) + .then(function(signedTransactionData) { + console.log("Signed TX Data: " + signedTransactionData.rawTransaction); + web3.eth.sendSignedTransaction(signedTransactionData.rawTransaction, function(error, result) { + if (!error) { + if (result) { + $('#minedBlockTrackerModal').modal({dismissible: true}); + $('#minedBlockTrackerModal').modal('open'); + waitForReceipt(result, function(receipt) { + console.log("Transaction Has Been Mined: " + receipt); + $('#minedBlockTrackerModal').modal('close'); + updateContractTable(); + }); } else { - console.error(error); + console.log("There was a problem adding new contract"); } + } else { + console.error(error); + } }); - } + }); + } else { + const tx = { + to: GlobalControllerContractAddress, + from: GlobalUserAddress, + }; + pinRemoving.methods.RemoveHostingContract(hostingAddress, contentHash).send(tx, function(error, result) { + if (!error) { + if (result) { + $('#minedBlockTrackerModal').modal({dismissible: true}); + $('#minedBlockTrackerModal').modal('open'); + waitForReceipt(result, function(receipt) { + console.log("Transaction Has Been Mined: " + receipt); + $('#minedBlockTrackerModal').modal('close'); + updateContractTable(); + }); + } else { + console.log("There was a problem removing contract"); + } + } else { + console.error(error); + } + }); + } } function updateContractTable() { - /*************************************************************************************************************/ - //CREATE ETHER-1 CHAIN CONNECTION AND GET USER ACCOUNT & CONTRACTS - var ethoFSHostingContracts = new Array(); - var hostingContracts = ""; - var TotalContractCount = 0; - var blockHeight = 0; - web3.eth.getBlockNumber(function (error, result) { - if (!error) { - blockHeight = result; - } else - console.error(error); - }); - var ethoFSAccounts = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress); - ethoFSAccounts.methods.GetUserAccountTotalContractCount(web3.eth.defaultAccount).call(function (error, result) { - TotalContractCount = result; - GlobalTotalContractCount = result; - const getContractData = async (ethoFSAccounts, account, TotalContractCount) => { - if (TotalContractCount == 0) { - outputNoAddressContractTableWithButton(); - } - for (var i = 0; i < TotalContractCount; i++) { - const promisify = (inner) => - new Promise((resolve, reject) => - inner((err, res) => { - if (err) { - reject(err); - } else { - resolve(res); - } - }) - ); - var counter = i; - GlobalHostingContractArray[counter] = new Array(); - var ethoFSHostingContractAddress = promisify(cb => ethoFSAccounts.methods.GetHostingContractAddress(account, counter).call(cb)); - await Promise.all([getAdditionalContractData(await ethoFSHostingContractAddress, counter, ethoFSAccounts)]); + /*************************************************************************************************************/ + //CREATE ETHER-1 CHAIN CONNECTION AND GET USER ACCOUNT & CONTRACTS + var ethoFSHostingContracts = new Array(); + var hostingContracts = ""; + var TotalContractCount = 0; + var blockHeight = 0; + web3.eth.getBlockNumber(function(error, result) { + if (!error) { + blockHeight = result; + } else + console.error(error); + }); + var ethoFSAccounts = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress); + ethoFSAccounts.methods.GetUserAccountTotalContractCount(web3.eth.defaultAccount).call(function(error, result) { + TotalContractCount = result; + GlobalTotalContractCount = result; + const getContractData = async (ethoFSAccounts, account, TotalContractCount) => { + if (TotalContractCount == 0) { + outputNoAddressContractTableWithButton(); + } + for (var i = 0; i < TotalContractCount; i++) { + const promisify = (inner) => + new Promise((resolve, reject) => + inner((err, res) => { + if (err) { + reject(err); + } else { + resolve(res); + } + }) + ); + var counter = i; + GlobalHostingContractArray[counter] = new Array(); + var ethoFSHostingContractAddress = promisify(cb => ethoFSAccounts.methods.GetHostingContractAddress(account, counter).call(cb)); + await Promise.all([getAdditionalContractData(await ethoFSHostingContractAddress, counter, ethoFSAccounts)]); - async function getAdditionalContractData(ethoFSHostingContractAddress, counter, ethoFSAccounts) { - const promisify = (inner) => - new Promise((resolve, reject) => - inner((err, res) => { - if (err) { - reject(err); - } else { - resolve(res); - } - }) - ); - var ethoFSHostingContractCost = counter; - var ethoFSHostingContractName = promisify(cb => ethoFSAccounts.methods.GetHostingContractName(ethoFSHostingContractAddress).call(cb)); - var ethoFSHostingContractMainHash = promisify(cb => ethoFSAccounts.methods.GetMainContentHash(ethoFSHostingContractAddress).call(cb)); - var ethoFSHostingContractHashString = promisify(cb => ethoFSAccounts.methods.GetContentHashString(ethoFSHostingContractAddress).call(cb)); - var ethoFSHostingContractPathString = promisify(cb => ethoFSAccounts.methods.GetContentPathString(ethoFSHostingContractAddress).call(cb)); - - var ethoFSHostingContractStorage = promisify(cb => ethoFSAccounts.methods.GetHostingContractStorageUsed(ethoFSHostingContractAddress).call(cb)); - var ethoFSHostingContractStartBlock = promisify(cb => ethoFSAccounts.methods.GetHostingContractDeployedBlockHeight(ethoFSHostingContractAddress).call(cb)); - var ethoFSHostingContractEndBlock = promisify(cb => ethoFSAccounts.methods.GetHostingContractExpirationBlockHeight(ethoFSHostingContractAddress).call(cb)); - - GlobalHostingContractArray[counter]['address'] = await ethoFSHostingContractAddress; - GlobalHostingContractArray[counter]['name'] = await ethoFSHostingContractName; - GlobalHostingContractArray[counter]['mainhash'] = await ethoFSHostingContractMainHash; - GlobalHostingContractArray[counter]['hashstring'] = await ethoFSHostingContractHashString; - GlobalHostingContractArray[counter]['pathstring'] = await ethoFSHostingContractPathString; - GlobalHostingContractArray[counter]['storage'] = await ethoFSHostingContractStorage; - GlobalHostingContractArray[counter]['startblock'] = await ethoFSHostingContractStartBlock; - GlobalHostingContractArray[counter]['endblock'] = await ethoFSHostingContractEndBlock; - - GlobalHostingContractArray[counter]['hash'] = new Array(); - GlobalHostingContractArray[counter]['path'] = new Array(); - - var ContractHashArray = new Array(); - var ContractPathArray = new Array(); - var splitHashArray = await Promise.all([splitString(await ethoFSHostingContractHashString, ":")]); - var splitPathArray = await Promise.all([splitString(await ethoFSHostingContractPathString, ":")]); - - function splitString(stringToSplit, splitDelimeter) { - return stringToSplit.split(splitDelimeter); - } - await Promise.all([loopSplitStrings(await splitHashArray[0], await splitPathArray[0], counter)]); - - function loopSplitStrings(splitHashArray, splitPathArray, counter) { - for (var j = 1; j < splitHashArray.length; j++) { - GlobalHostingContractArray[counter]['hash'][j] = splitHashArray[j]; - GlobalHostingContractArray[counter]['path'][j] = splitPathArray[j]; - } - } - - await Promise.all([addNewTableEntry(await ethoFSHostingContractAddress, await ethoFSHostingContractMainHash, await ethoFSHostingContractName, await ethoFSHostingContractAddress, await ethoFSHostingContractStorage, await ethoFSHostingContractStartBlock, await ethoFSHostingContractEndBlock, await ethoFSHostingContractCost, await counter, await blockHeight)]); + async function getAdditionalContractData(ethoFSHostingContractAddress, counter, ethoFSAccounts) { + const promisify = (inner) => + new Promise((resolve, reject) => + inner((err, res) => { + if (err) { + reject(err); + } else { + resolve(res); } - } - //END GET ADDITIONAL CONTACT DATA - }; - getContractData(ethoFSAccounts, web3.eth.defaultAccount, TotalContractCount); + }) + ); + var ethoFSHostingContractCost = counter; + var ethoFSHostingContractName = promisify(cb => ethoFSAccounts.methods.GetHostingContractName(ethoFSHostingContractAddress).call(cb)); + var ethoFSHostingContractMainHash = promisify(cb => ethoFSAccounts.methods.GetMainContentHash(ethoFSHostingContractAddress).call(cb)); + var ethoFSHostingContractHashString = promisify(cb => ethoFSAccounts.methods.GetContentHashString(ethoFSHostingContractAddress).call(cb)); + var ethoFSHostingContractPathString = promisify(cb => ethoFSAccounts.methods.GetContentPathString(ethoFSHostingContractAddress).call(cb)); - function addNewTableEntry(ethoFSHostingContractAddress, ethoFSHostingContractMainHash, ethoFSHostingContractName, ethoFSHostingContractHash, ethoFSHostingContractStorage, ethoFSHostingContractStartBlock, ethoFSHostingContractEndBlock, ethoFSHostingContractCost, counter, blockHeight) { - if (blockHeight > ethoFSHostingContractEndBlock) { - var ethoFSHostingContractStatus = "Expired"; - hostingContracts += '' + ethoFSHostingContractName + '' + ethoFSHostingContractHash + '' + ethoFSHostingContractStartBlock + '' + ethoFSHostingContractEndBlock + '' + ethoFSHostingContractStatus + '
'; - } else { - var ethoFSHostingContractStatus = "Active"; - hostingContracts += '' + ethoFSHostingContractName + '' + ethoFSHostingContractHash + '' + ethoFSHostingContractStartBlock + '' + ethoFSHostingContractEndBlock + '' + ethoFSHostingContractStatus + '
'; + var ethoFSHostingContractStorage = promisify(cb => ethoFSAccounts.methods.GetHostingContractStorageUsed(ethoFSHostingContractAddress).call(cb)); + var ethoFSHostingContractStartBlock = promisify(cb => ethoFSAccounts.methods.GetHostingContractDeployedBlockHeight(ethoFSHostingContractAddress).call(cb)); + var ethoFSHostingContractEndBlock = promisify(cb => ethoFSAccounts.methods.GetHostingContractExpirationBlockHeight(ethoFSHostingContractAddress).call(cb)); + + GlobalHostingContractArray[counter]['address'] = await ethoFSHostingContractAddress; + GlobalHostingContractArray[counter]['name'] = await ethoFSHostingContractName; + GlobalHostingContractArray[counter]['mainhash'] = await ethoFSHostingContractMainHash; + GlobalHostingContractArray[counter]['hashstring'] = await ethoFSHostingContractHashString; + GlobalHostingContractArray[counter]['pathstring'] = await ethoFSHostingContractPathString; + GlobalHostingContractArray[counter]['storage'] = await ethoFSHostingContractStorage; + GlobalHostingContractArray[counter]['startblock'] = await ethoFSHostingContractStartBlock; + GlobalHostingContractArray[counter]['endblock'] = await ethoFSHostingContractEndBlock; + + GlobalHostingContractArray[counter]['hash'] = new Array(); + GlobalHostingContractArray[counter]['path'] = new Array(); + + var ContractHashArray = new Array(); + var ContractPathArray = new Array(); + var splitHashArray = await Promise.all([splitString(await ethoFSHostingContractHashString, ":")]); + var splitPathArray = await Promise.all([splitString(await ethoFSHostingContractPathString, ":")]); + + function splitString(stringToSplit, splitDelimeter) { + return stringToSplit.split(splitDelimeter); + } + await Promise.all([loopSplitStrings(await splitHashArray[0], await splitPathArray[0], counter)]); + + function loopSplitStrings(splitHashArray, splitPathArray, counter) { + for (var j = 1; j < splitHashArray.length; j++) { + GlobalHostingContractArray[counter]['hash'][j] = splitHashArray[j]; + GlobalHostingContractArray[counter]['path'][j] = splitPathArray[j]; } - GlobalHostingContractArray[counter]['status'] = ethoFSHostingContractStatus; - document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts; + } + + await Promise.all([addNewTableEntry(await ethoFSHostingContractAddress, await ethoFSHostingContractMainHash, await ethoFSHostingContractName, await ethoFSHostingContractAddress, await ethoFSHostingContractStorage, await ethoFSHostingContractStartBlock, await ethoFSHostingContractEndBlock, await ethoFSHostingContractCost, await counter, await blockHeight)]); } - }); + } + //END GET ADDITIONAL CONTACT DATA + }; + getContractData(ethoFSAccounts, web3.eth.defaultAccount, TotalContractCount); + + function addNewTableEntry(ethoFSHostingContractAddress, ethoFSHostingContractMainHash, ethoFSHostingContractName, ethoFSHostingContractHash, ethoFSHostingContractStorage, ethoFSHostingContractStartBlock, ethoFSHostingContractEndBlock, ethoFSHostingContractCost, counter, blockHeight) { + if (blockHeight > ethoFSHostingContractEndBlock) { + var ethoFSHostingContractStatus = "Expired"; + hostingContracts += '' + ethoFSHostingContractName + '' + ethoFSHostingContractHash + '' + ethoFSHostingContractStartBlock + '' + ethoFSHostingContractEndBlock + '' + ethoFSHostingContractStatus + '
'; + } else { + var ethoFSHostingContractStatus = "Active"; + hostingContracts += '' + ethoFSHostingContractName + '' + ethoFSHostingContractHash + '' + ethoFSHostingContractStartBlock + '' + ethoFSHostingContractEndBlock + '' + ethoFSHostingContractStatus + '
'; + } + GlobalHostingContractArray[counter]['status'] = ethoFSHostingContractStatus; + document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts; + } + }); } /*************************************************************************************************************/ //UPDATE CONTRACT DURATION AND CONTRACT COST function contractDurationChange(selectObj) { - var duration = document.getElementById('contract-duration').value; - GlobalContractDuration = duration; - var ContractCost = (((GlobalUploadSize / 1048576) * GlobalHostingCost) * (duration / 46522)); - document.getElementById("contract-cost").innerHTML = round(ContractCost, 2); - return false; + var duration = document.getElementById('contract-duration').value; + GlobalContractDuration = duration; + var ContractCost = (((GlobalUploadSize / 1048576) * GlobalHostingCost) * (duration / 46522)); + document.getElementById("contract-cost").innerHTML = round(ContractCost, 2); + return false; } function contractModalSetup() { - var duration = document.getElementById('contract-duration').value; - GlobalContractDuration = duration; - var ContractCost = (((GlobalUploadSize / 1048576) * GlobalHostingCost) * (duration / 46522)); - document.getElementById("contract-cost").innerHTML = round(ContractCost, 2); - return false; + var duration = document.getElementById('contract-duration').value; + GlobalContractDuration = duration; + var ContractCost = (((GlobalUploadSize / 1048576) * GlobalHostingCost) * (duration / 46522)); + document.getElementById("contract-cost").innerHTML = round(ContractCost, 2); + return false; } /*************************************************************************************************************/ //MISC ROUNDING FUNCTION function round(value, decimals) { - return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals); + return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals); } /*************************************************************************************************************/ function finishUploadModal() { - $('#uploadTrackerModal').modal('hide'); - stopApplication(); - resetUploadSystem(); - return; + $('#uploadTrackerModal').modal({dismissible: true}); + $('#uploadTrackerModal').modal('close'); + stopApplication(); + resetUploadSystem(); + return; } function resetUploadModal() { - var duration = document.getElementById('contract-duration').value; - GlobalContractDuration = duration; - var ContractCost = ((GlobalUploadSize / 1048576) * GlobalHostingCost) * (duration / 46522); - document.getElementById("contract-cost").innerHTML = round(ContractCost, 2); - document.getElementById("upload-hash").innerHTML = GlobalUploadHash; - document.getElementById("upload-size").innerHTML = GlobalUploadSize; - return; + var duration = document.getElementById('contract-duration').value; + GlobalContractDuration = duration; + var ContractCost = ((GlobalUploadSize / 1048576) * GlobalHostingCost) * (duration / 46522); + document.getElementById("contract-cost").innerHTML = round(ContractCost, 2); + document.getElementById("upload-hash").innerHTML = GlobalUploadHash; + document.getElementById("upload-size").innerHTML = GlobalUploadSize; + return; } /*************************************************************************************************************/ //CHECK FOR PROPAGATED & AVAILABLE DATA ON NETWORK - FINAL VERIFICATION FOR UPLOADED CONTENT function checkForUploadedContentAvailability(HostingContractName) { - document.getElementById("upload-check-button").style.visibility = "hidden"; - $('#uploadTrackerModal').modal('show'); - document.getElementById("upload-hash").innerHTML = HostingContractName; - return false; + document.getElementById("upload-check-button").style.visibility = "hidden"; + $('#uploadTrackerModal').modal({dismissible: true}); + $('#uploadTrackerModal').modal('open'); + document.getElementById("upload-hash").innerHTML = HostingContractName; + return false; } /*************************************************************************************************************/ /*************************************************************************************************************/ function resetUploadSystem() { - GlobalMainHashArray = new Array(); - GlobalMainPathArray = new Array(); - GlobalHashArray = new Array(); - GlobalPathArray = new Array(); - GlobalUploadHash = ""; - GlobalUploadPath = ""; - GlobalUploadSize = 0; - var TableBody = document.getElementById("file-history-body"); - TableBody.innerHTML = 'There are no files awaiting upload'; - var duration = document.getElementById('contract-duration').value; - GlobalContractDuration = duration; - var ContractCost = ((GlobalUploadSize / 1048576) * GlobalHostingCost) * (duration / 46522); - document.getElementById("contract-cost").innerHTML = round(ContractCost, 2); - document.getElementById("upload-hash").innerHTML = ""; - document.getElementById("upload-size").innerHTML = 0; - return false; + GlobalMainHashArray = new Array(); + GlobalMainPathArray = new Array(); + GlobalHashArray = new Array(); + GlobalPathArray = new Array(); + GlobalUploadHash = ""; + GlobalUploadPath = ""; + GlobalUploadSize = 0; + var TableBody = document.getElementById("file-history-body"); + TableBody.innerHTML = 'There are no files awaiting upload'; + var duration = document.getElementById('contract-duration').value; + GlobalContractDuration = duration; + var ContractCost = ((GlobalUploadSize / 1048576) * GlobalHostingCost) * (duration / 46522); + document.getElementById("contract-cost").innerHTML = round(ContractCost, 2); + document.getElementById("upload-hash").innerHTML = ""; + document.getElementById("upload-size").innerHTML = 0; + return false; } /*************************************************************************************************************/ /*************************************************************************************************************/ //CHECK FOR PROPAGATED & AVAILABLE DATA ON NETWORK - FINAL VERIFICATION FOR UPLOADED CONTENT function sortContractTable() { - var hostingContracts = ""; - var i; - var localContractArray = GlobalHostingContractArray; - var tableSortDirection = ""; - var sortSelection = document.getElementById('sort-contracts'); - var tableSorter = sortSelection.value; - var filterSelection = document.getElementById('filter-contracts'); - var tableFilterer = filterSelection.value; + var hostingContracts = ""; + var i; + var localContractArray = GlobalHostingContractArray; + var tableSortDirection = ""; + var sortSelection = document.getElementById('sort-contracts'); + var tableSorter = sortSelection.value; + var filterSelection = document.getElementById('filter-contracts'); + var tableFilterer = filterSelection.value; - if (tableSorter == "Ascending") { - tableSortDirection = "asc"; + if (tableSorter == "Ascending") { + tableSortDirection = "asc"; + } else { + tableSortDirection = "desc"; + } + localContractArray = multiSort(localContractArray, { + startblock: tableSortDirection + }); + var filterCounter = 0; + for (var i = 0; i < GlobalTotalContractCount; i++) { + if ((localContractArray[i]['status'] != "Expired" && tableFilterer == "Active Contracts") || (localContractArray[i]['status'] != "Active" && tableFilterer == "Expired Contracts") || tableFilterer == "All Contracts") { + addNewTableEntry(localContractArray[i]['address'], localContractArray[i]['name'], localContractArray[i]['hash'], localContractArray[i]['storage'], localContractArray[i]['startblock'], localContractArray[i]['endblock'], localContractArray[i]['status'], localContractArray[i]['cost'], i); + filterCounter++; } else { - tableSortDirection = "desc"; + document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts; } - localContractArray = multiSort(localContractArray, { - startblock: tableSortDirection + } + if (GlobalTotalContractCount == 0 || filterCounter == 0) { + hostingContracts = 'No Hosting Contracts Found
'; + document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts; + + } + + function addNewTableEntry(ethoFSHostingContractAddress, ethoFSHostingContractName, ethoFSHostingContractHash, ethoFSHostingContractStorage, ethoFSHostingContractStartBlock, ethoFSHostingContractEndBlock, ethoFSHostingContractStatus, ethoFSHostingContractCost, counter) { + if (ethoFSHostingContractStatus == "Active") { + hostingContracts += '' + ethoFSHostingContractName + '' + ethoFSHostingContractHash + '' + ethoFSHostingContractStartBlock + '' + ethoFSHostingContractEndBlock + '' + ethoFSHostingContractStatus + '
'; + } else { + hostingContracts += '' + ethoFSHostingContractName + '' + ethoFSHostingContractHash + '' + ethoFSHostingContractStartBlock + '' + ethoFSHostingContractEndBlock + '' + ethoFSHostingContractStatus + '
'; + } + document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts; + } + + function multiSort(array, sortObject = {}) { + const sortKeys = Object.keys(sortObject); + // Return array if no sort object is supplied. + if (!sortKeys.length) { + return array; + } + // Change the values of the sortObject keys to -1, 0, or 1. + for (let key in sortObject) { + sortObject[key] = sortObject[key] === 'desc' || sortObject[key] === -1 ? -1 : + (sortObject[key] === 'skip' || sortObject[key] === 0 ? 0 : 1); + } + const keySort = (a, b, direction) => { + direction = direction !== null ? direction : 1; + if (a === b) { // If the values are the same, do not switch positions. + return 0; + } + // If b > a, multiply by -1 to get the reverse direction. + return a > b ? direction : -1 * direction; + }; + return array.sort((a, b) => { + let sorted = 0; + let index = 0; + // Loop until sorted (-1 or 1) or until the sort keys have been processed. + while (sorted === 0 && index < sortKeys.length) { + const key = sortKeys[index]; + if (key) { + const direction = sortObject[key]; + sorted = keySort(a[key], b[key], direction); + index++; + } + } + return sorted; }); - var filterCounter = 0; - for (var i = 0; i < GlobalTotalContractCount; i++) { - if ((localContractArray[i]['status'] != "Expired" && tableFilterer == "Active Contracts") || (localContractArray[i]['status'] != "Active" && tableFilterer == "Expired Contracts") || tableFilterer == "All Contracts") { - addNewTableEntry(localContractArray[i]['address'], localContractArray[i]['name'], localContractArray[i]['hash'], localContractArray[i]['storage'], localContractArray[i]['startblock'], localContractArray[i]['endblock'], localContractArray[i]['status'], localContractArray[i]['cost'], i); - filterCounter++; - } else { - document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts; - } - } - if (GlobalTotalContractCount == 0 || filterCounter == 0) { - hostingContracts = 'No Hosting Contracts Found
'; - document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts; - - } - - function addNewTableEntry(ethoFSHostingContractAddress, ethoFSHostingContractName, ethoFSHostingContractHash, ethoFSHostingContractStorage, ethoFSHostingContractStartBlock, ethoFSHostingContractEndBlock, ethoFSHostingContractStatus, ethoFSHostingContractCost, counter) { - if (ethoFSHostingContractStatus == "Active") { - hostingContracts += '' + ethoFSHostingContractName + '' + ethoFSHostingContractHash + '' + ethoFSHostingContractStartBlock + '' + ethoFSHostingContractEndBlock + '' + ethoFSHostingContractStatus + '
'; - } else { - hostingContracts += '' + ethoFSHostingContractName + '' + ethoFSHostingContractHash + '' + ethoFSHostingContractStartBlock + '' + ethoFSHostingContractEndBlock + '' + ethoFSHostingContractStatus + '
'; - } - document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts; - } - - function multiSort(array, sortObject = {}) { - const sortKeys = Object.keys(sortObject); - // Return array if no sort object is supplied. - if (!sortKeys.length) { - return array; - } - // Change the values of the sortObject keys to -1, 0, or 1. - for (let key in sortObject) { - sortObject[key] = sortObject[key] === 'desc' || sortObject[key] === -1 ? -1 : - (sortObject[key] === 'skip' || sortObject[key] === 0 ? 0 : 1); - } - const keySort = (a, b, direction) => { - direction = direction !== null ? direction : 1; - if (a === b) { // If the values are the same, do not switch positions. - return 0; - } - // If b > a, multiply by -1 to get the reverse direction. - return a > b ? direction : -1 * direction; - }; - return array.sort((a, b) => { - let sorted = 0; - let index = 0; - // Loop until sorted (-1 or 1) or until the sort keys have been processed. - while (sorted === 0 && index < sortKeys.length) { - const key = sortKeys[index]; - if (key) { - const direction = sortObject[key]; - sorted = keySort(a[key], b[key], direction); - index++; - } - } - return sorted; - }); - } + } } /*************************************************************************************************************/ //SHOW MODAL WITH HOSTING CONTRACT DETAILS function showHostingContractDetails(counter) { - resetContractExtensionChange(); + resetContractExtensionChange(); - GlobalHostingContractDetailArray = GlobalHostingContractArray[counter]; - $('#contractDetailModal').modal('show'); - document.getElementById("contract-detail-name").innerHTML = GlobalHostingContractDetailArray['name']; - var hashOutputString = ""; - var hostingContractEntry = ""; - for (var i = 1; GlobalHostingContractDetailArray['hash'].length > i; i++) { - addNewTableEntry(GlobalHostingContractDetailArray['hash'][i], GlobalHostingContractDetailArray['path'][i], i); - } - document.getElementById("contract-detail-startblock").innerHTML = GlobalHostingContractDetailArray['startblock']; - document.getElementById("contract-detail-endblock").innerHTML = GlobalHostingContractDetailArray['endblock']; - document.getElementById("contract-detail-status").innerHTML = GlobalHostingContractDetailArray['status']; - document.getElementById("contract-detail-size").innerHTML = (GlobalHostingContractDetailArray['storage'] / 1048576); + GlobalHostingContractDetailArray = GlobalHostingContractArray[counter]; + $('#contractDetailModal').modal({dismissible: true}); + $('#contractDetailModal').modal('open'); + document.getElementById("contract-detail-name").innerHTML = GlobalHostingContractDetailArray['name']; + var hashOutputString = ""; + var hostingContractEntry = ""; + for (var i = 1; GlobalHostingContractDetailArray['hash'].length > i; i++) { + addNewTableEntry(GlobalHostingContractDetailArray['hash'][i], GlobalHostingContractDetailArray['path'][i], i); + } + document.getElementById("contract-detail-startblock").innerHTML = GlobalHostingContractDetailArray['startblock']; + document.getElementById("contract-detail-endblock").innerHTML = GlobalHostingContractDetailArray['endblock']; + document.getElementById("contract-detail-status").innerHTML = GlobalHostingContractDetailArray['status']; + document.getElementById("contract-detail-size").innerHTML = (GlobalHostingContractDetailArray['storage'] / 1048576); - function addNewTableEntry(ethoFSHostingContractHash, ethoFSHostingContractPath, count) { - var table = document.getElementById("contract-detail-table"); - var row = table.insertRow(count + 10); - var cell1 = row.insertCell(0); - //var cell2 = row.insertCell(1); - //cell1.innerHTML = ethoFSHostingContractPath; - cell1.innerHTML = '' + ethoFSHostingContractHash + ''; - } + function addNewTableEntry(ethoFSHostingContractHash, ethoFSHostingContractPath, count) { + var table = document.getElementById("contract-detail-table"); + var row = table.insertRow(count + 10); + var cell1 = row.insertCell(0); + //var cell2 = row.insertCell(1); + //cell1.innerHTML = ethoFSHostingContractPath; + cell1.innerHTML = '' + ethoFSHostingContractHash + ''; + } } function resetContractDetailTableRows() { - var x = document.getElementById("contract-detail-table").rows.length; - for (var y = (x - 1); y > 10; y--) { - document.getElementById("contract-detail-table").deleteRow(y); - } + var x = document.getElementById("contract-detail-table").rows.length; + for (var y = (x - 1); y > 10; y--) { + document.getElementById("contract-detail-table").deleteRow(y); + } } /*************************************************************************************************************/ //LOCK CONTRACT TABLE DOWN - NO USER ACCOUNT function outputNoAddressContractTable() { - hostingContracts = 'No Hosting Contracts Found
'; - document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts; + hostingContracts = 'No Hosting Contracts Found
'; + document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts; } //LOCK CONTRACT TABLE DOWN - NO USER ACCOUNT function outputNoAddressContractTableWithButton() { - hostingContracts = 'No Hosting Contracts Found
'; - document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts; + hostingContracts = 'No Hosting Contracts Found
'; + document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts; } /*************************************************************************************************************/ function resetContractExtensionChange() { - GlobalExtensionDuration = 0; - document.getElementById("contract-extension-cost").innerHTML = 0; - document.getElementById("extend-contract").selectedIndex = "0"; + GlobalExtensionDuration = 0; + document.getElementById("contract-extension-cost").innerHTML = 0; + document.getElementById("extend-contract").selectedIndex = "0"; } /*************************************************************************************************************/ //CONTRACT EXTENSION VALUE CHANGE function contractExtensionChange(selectObj) { - var index = selectObj.selectedIndex; - var extensionDuration = selectObj.options[index].value; - GlobalExtensionDuration = extensionDuration; - document.getElementById("contract-extension-button").style.visibility = "visible"; - var extensionCost = ((GlobalHostingContractDetailArray['storage'] / 1048576) * GlobalHostingCost) * (extensionDuration / 46522); - document.getElementById("contract-extension-cost").innerHTML = round(extensionCost, 2); + var index = selectObj.selectedIndex; + var extensionDuration = selectObj.options[index].value; + GlobalExtensionDuration = extensionDuration; + document.getElementById("contract-extension-button").style.visibility = "visible"; + var extensionCost = ((GlobalHostingContractDetailArray['storage'] / 1048576) * GlobalHostingCost) * (extensionDuration / 46522); + document.getElementById("contract-extension-cost").innerHTML = round(extensionCost, 2); } /*************************************************************************************************************/ //CONTRACT EXTENSION CONFIRM function contractExtensionConfirmation() { - if (GlobalExtensionDuration > 0) { - var extensionDuration = GlobalExtensionDuration; - var ethoFSController = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress); + if (GlobalExtensionDuration > 0) { + var extensionDuration = GlobalExtensionDuration; + var ethoFSController = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress); - var extensionCost = calculateCost(GlobalHostingContractDetailArray['storage'], extensionDuration, GlobalHostingCostWei); - const transactionObject = { - from: GlobalUserAddress, - value: extensionCost - }; - if (privateKeyLogin == true) { - const tx = { - to: GlobalControllerContractAddress, - from: GlobalUserAddress, - value: extensionCost, - gas: 4000000, - data: ethoFSController.methods.ExtendContract(GlobalHostingContractDetailArray['address'], extensionDuration).encodeABI() - }; - var privateKey = '0x' + GlobalPrivateKey; - console.log("Private Key: " + privateKey); - web3.eth.accounts.signTransaction(tx, privateKey) - .then(function (signedTransactionData) { - console.log("Signed TX Data: " + signedTransactionData.rawTransaction); - web3.eth.sendSignedTransaction(signedTransactionData.rawTransaction, function (error, result) { - if (!error) { - if (result) { - $('#contractDetailModal').modal('hide'); - $('#minedBlockTrackerModal').modal('show'); - waitForReceipt(result, function (receipt) { - console.log("Transaction Has Been Mined: " + receipt); - $('#minedBlockTrackerModal').modal('hide'); - updateContractTable(); - }); - } else { - console.log("There was a problem adding new contract"); - } - } else { - console.error(error); - } - }); + var extensionCost = calculateCost(GlobalHostingContractDetailArray['storage'], extensionDuration, GlobalHostingCostWei); + const transactionObject = { + from: GlobalUserAddress, + value: extensionCost + }; + if (privateKeyLogin == true) { + const tx = { + to: GlobalControllerContractAddress, + from: GlobalUserAddress, + value: extensionCost, + gas: 4000000, + data: ethoFSController.methods.ExtendContract(GlobalHostingContractDetailArray['address'], extensionDuration).encodeABI() + }; + var privateKey = '0x' + GlobalPrivateKey; + console.log("Private Key: " + privateKey); + web3.eth.accounts.signTransaction(tx, privateKey) + .then(function(signedTransactionData) { + console.log("Signed TX Data: " + signedTransactionData.rawTransaction); + web3.eth.sendSignedTransaction(signedTransactionData.rawTransaction, function(error, result) { + if (!error) { + if (result) { + $('#contractDetailModal').modal({dismissible: true}); + $('#contractDetailModal').modal('close'); + $('#minedBlockTrackerModal').modal({dismissible: true}); + $('#minedBlockTrackerModal').modal('open'); + waitForReceipt(result, function(receipt) { + console.log("Transaction Has Been Mined: " + receipt); + $('#minedBlockTrackerModal').modal('close'); + updateContractTable(); }); - } else { + } else { + console.log("There was a problem adding new contract"); + } + } else { + console.error(error); + } + }); + }); + } else { - ethoFSController.methods.ExtendContract(GlobalHostingContractDetailArray['address'], extensionDuration).send(transactionObject, function (error, result) { - if (!error) { - if (result) { - $('#contractDetailModal').modal('hide'); - $('#minedBlockTrackerModal').modal('show'); - waitForReceipt(result, function (receipt) { - console.log("Transaction Has Been Mined: " + receipt); - $('#minedBlockTrackerModal').modal('hide'); - updateContractTable(); - }); - } - } else { - console.log(error); - } + ethoFSController.methods.ExtendContract(GlobalHostingContractDetailArray['address'], extensionDuration).send(transactionObject, function(error, result) { + if (!error) { + if (result) { + $('#contractDetailModal').modal('close'); + $('#minedBlockTrackerModal').modal('open'); + waitForReceipt(result, function(receipt) { + console.log("Transaction Has Been Mined: " + receipt); + $('#minedBlockTrackerModal').modal('close'); + updateContractTable(); }); + } + } else { + console.log(error); } + }); } + } } /*************************************************************************************************************/ @@ -722,146 +737,146 @@ function contractExtensionConfirmation() { =========================================================================== */ const subscribeToHealthChannel = () => { - window.node.pubsub.subscribe(info.id + "_alpha11", healthMessageHandler) - .catch(() => onError('An error occurred when subscribing to the health check workspace.')) + window.node.pubsub.subscribe(info.id + "_alpha11", healthMessageHandler) + .catch(() => onError('An error occurred when subscribing to the health check workspace.')) } const healthMessageHandler = (message) => { - healthMessage = message.data.toString(); - UpdateHealthCheckInfo(healthMessage); + healthMessage = message.data.toString(); + UpdateHealthCheckInfo(healthMessage); } function UpdateHealthCheckInfo(healthMessage) { - var mainMessage = healthMessage.split(";")[1]; - var splitMessage = mainMessage.split(","); - var usedStorageTotal = 0; - var availableStorageTotal = 0; - var activeHistory = 0; - var nodeCounter = 0; - splitMessage.forEach(function (nodeMessage, index) { - var nodeSplitMessage = nodeMessage.split(":"); - activeHistory = Number(nodeSplitMessage[5]); - if (activeHistory >= 5) { - nodeCounter++; - usedStorageTotal += Number(nodeSplitMessage[8]); - availableStorageTotal += Number(nodeSplitMessage[7]); - } - if (index == (splitMessage.length - 1)) { - updateStorageArrays(usedStorageTotal, availableStorageTotal, nodeCounter); - } + var mainMessage = healthMessage.split(";")[1]; + var splitMessage = mainMessage.split(","); + var usedStorageTotal = 0; + var availableStorageTotal = 0; + var activeHistory = 0; + var nodeCounter = 0; + splitMessage.forEach(function(nodeMessage, index) { + var nodeSplitMessage = nodeMessage.split(":"); + activeHistory = Number(nodeSplitMessage[5]); + if (activeHistory >= 5) { + nodeCounter++; + usedStorageTotal += Number(nodeSplitMessage[8]); + availableStorageTotal += Number(nodeSplitMessage[7]); + } + if (index == (splitMessage.length - 1)) { + updateStorageArrays(usedStorageTotal, availableStorageTotal, nodeCounter); + } + }); + + function updateStorageArrays(usedStorageTotal, availableStorageTotal, nodecount) { + + if (availableStorageArray.length >= 50) { + if (availableStorageTotal > 0.75 * averageAvailableStorageTotal && availableStorageTotal < 1.25 * averageAvailableStorageTotal) { + availableStorageArray.push(availableStorageTotal); + availableStorageArray.shift(); + } + } else { + availableStorageArray.push(availableStorageTotal); + } + if (nodeCountArray.length >= 50) { + nodeCountArray.push(nodecount); + nodeCountArray.shift(); + } else { + nodeCountArray.push(nodecount); + } + calculateStorageAverages(usedStorageArray, availableStorageArray, nodeCountArray); + } + + function calculateStorageAverages(usedStorageArray, availableStorageArray, nodeCountArray) { + + var sumAvailableStorage = 0; + availableStorageArray.forEach(function(value, index) { + sumAvailableStorage += value; + if (index == (availableStorageArray.length - 1)) { + averageAvailableStorageTotal = (sumAvailableStorage / availableStorageArray.length); + document.getElementById("nodestorage").textContent = (round(2 + ((averageAvailableStorageTotal) / 1000000), 1)) + "TB"; + } }); - - function updateStorageArrays(usedStorageTotal, availableStorageTotal, nodecount) { - - if (availableStorageArray.length >= 50) { - if (availableStorageTotal > 0.75 * averageAvailableStorageTotal && availableStorageTotal < 1.25 * averageAvailableStorageTotal) { - availableStorageArray.push(availableStorageTotal); - availableStorageArray.shift(); - } - } else { - availableStorageArray.push(availableStorageTotal); - } - if (nodeCountArray.length >= 50) { - nodeCountArray.push(nodecount); - nodeCountArray.shift(); - } else { - nodeCountArray.push(nodecount); - } - calculateStorageAverages(usedStorageArray, availableStorageArray, nodeCountArray); - } - - function calculateStorageAverages(usedStorageArray, availableStorageArray, nodeCountArray) { - - var sumAvailableStorage = 0; - availableStorageArray.forEach(function (value, index) { - sumAvailableStorage += value; - if (index == (availableStorageArray.length - 1)) { - averageAvailableStorageTotal = (sumAvailableStorage / availableStorageArray.length); - document.getElementById("nodestorage").textContent = (round(2 + ((averageAvailableStorageTotal) / 1000000), 1)) + "TB"; - } - }); - var sumNodeCount = 0; - nodeCountArray.forEach(function (value, index) { - sumNodeCount += value; - if (index == (nodeCountArray.length - 1)) { - var averageNodeCount = (sumNodeCount / nodeCountArray.length) + 19; - document.getElementById("nodecount").textContent = (round(averageNodeCount, 0)); - } - }); - } + var sumNodeCount = 0; + nodeCountArray.forEach(function(value, index) { + sumNodeCount += value; + if (index == (nodeCountArray.length - 1)) { + var averageNodeCount = (sumNodeCount / nodeCountArray.length) + 19; + document.getElementById("nodecount").textContent = (round(averageNodeCount, 0)); + } + }); + } } const messageHandler = (message) => { - messageString = message.data.toString(); + messageString = message.data.toString(); } const receiveExitMsg = (msg) => console.log("Content Upload Successful") const exitMessageHandler = (message) => { - const cancelMessageString = message.data.toString() + const cancelMessageString = message.data.toString() } const subscribeToMessaging = () => { - for (var i = 4; i < PeersForChannel.length; i++) { - window.node.pubsub.subscribe(PeersForChannel[i] + "PinningChannel_alpha11", messageHandler) - .catch(() => onError('An error occurred when subscribing to the workspace.')) - } + for (var i = 4; i < PeersForChannel.length; i++) { + window.node.pubsub.subscribe(PeersForChannel[i] + "PinningChannel_alpha11", messageHandler) + .catch(() => onError('An error occurred when subscribing to the workspace.')) + } } const unsubscribeToMessaging = () => { - for (var i = 4; i < PeersForChannel.length; i++) { - window.node.pubsub.unsubscribe(PeersForChannel[i] + "PinningChannel_alpha11", exitMessageHandler) - .catch(() => onError('An error occurred when unsubscribing to the workspace.')) - } + for (var i = 4; i < PeersForChannel.length; i++) { + window.node.pubsub.unsubscribe(PeersForChannel[i] + "PinningChannel_alpha11", exitMessageHandler) + .catch(() => onError('An error occurred when unsubscribing to the workspace.')) + } } const publishImmediatePin = (hash) => { - const data = Buffer.from(hash) - for (var i = 0; i < PeersForChannel.length; i++) { - var channel = PeersForChannel[i] + "ImmediatePinningChannel_alpha11"; - window.node.pubsub.publish(channel, data) - .catch(() => onError('An error occurred when publishing the message.')) - } + const data = Buffer.from(hash) + for (var i = 0; i < PeersForChannel.length; i++) { + var channel = PeersForChannel[i] + "ImmediatePinningChannel_alpha11"; + window.node.pubsub.publish(channel, data) + .catch(() => onError('An error occurred when publishing the message.')) + } } /* =========================================================================== Files handling =========================================================================== */ const resetProgress = () => { - $progressBar.style.transform = 'translateX(-100%)' + $progressBar.style.transform = 'translateX(-100%)' } function appendFile(name, hash, size, data) { - const file = new window.Blob([data], { - type: 'application/octet-binary' - }) - const url = window.URL.createObjectURL(file) - const row = document.createElement('tr') + const file = new window.Blob([data], { + type: 'application/octet-binary' + }) + const url = window.URL.createObjectURL(file) + const row = document.createElement('tr') - const nameCell = document.createElement('td') - nameCell.innerHTML = name + const nameCell = document.createElement('td') + nameCell.innerHTML = name - const hashCell = document.createElement('td') - hashCell.innerHTML = hash + const hashCell = document.createElement('td') + hashCell.innerHTML = hash - const sizeCell = document.createElement('td') - sizeCell.innerText = size + const sizeCell = document.createElement('td') + sizeCell.innerText = size - const downloadCell = document.createElement('td') - const link = document.createElement('a') - link.setAttribute('href', url) - link.setAttribute('download', name) - link.innerHTML = 'Download' - downloadCell.appendChild(link) + const downloadCell = document.createElement('td') + const link = document.createElement('a') + link.setAttribute('href', url) + link.setAttribute('download', name) + link.innerHTML = 'Download' + downloadCell.appendChild(link) - row.appendChild(nameCell) - row.appendChild(hashCell) - row.appendChild(sizeCell) - row.appendChild(downloadCell) + row.appendChild(nameCell) + row.appendChild(hashCell) + row.appendChild(sizeCell) + row.appendChild(downloadCell) - $fileHistory.insertBefore(row, $fileHistory.firstChild) + $fileHistory.insertBefore(row, $fileHistory.firstChild) } function resetFileTable() { - while ($fileHistory.hasChildNodes()) { - $fileHistory.removeChild($fileHistory.firstChild); - } + while ($fileHistory.hasChildNodes()) { + $fileHistory.removeChild($fileHistory.firstChild); + } } /* Drag & Drop =========================================================================== */ @@ -870,380 +885,385 @@ const onDragEnter = (event) => $dragContainer.classList.add('dragging') const onDragLeave = () => $dragContainer.classList.remove('dragging') function startUploadProcess() { - console.log("Starting Upload Process.."); - $('#preparingUploadModal').modal('show'); - var streamFinishCount = 0; - for (var i = 0; i < MainFileArray.length; i++) { - const streamFiles = (files) => { - const stream = node.addReadableStream() - stream.on('data', function (data) { - //console.log("Data..."); - //console.log(data); - GlobalHashArray.push(`${data.hash}`); - GlobalSizeArray.push(`${data.size}`); - GlobalPathArray.push(`${data.path}`); - GlobalUploadHash = `${data.hash}`; - GlobalUploadPath = `${data.path}`; - console.log("Path: " + data.path + " Hash: " + data.hash); - //var comparePath = data.path.replace(pathSymbol, "/"); - var comparePath = data.path.replace(/\\/g, '/'); - console.log("Compare Path: " + comparePath); - var splitString = comparePath.split("/") - if (splitString.length == 1 || splitString[0] == "") { - //if (splitString.length == 1) { - streamFinishCount++; - GlobalMainHashArray.push(`${data.hash}`); - GlobalMainPathArray.push(`${data.path}`); - if (streamFinishCount == MainFileArray.length) { - console.log("Finish Path: " + data.path + " Hash: " + data.hash); - createMainHash(); - } - } - }); - files.forEach(file => stream.write(file)) - stream.end() + console.log("Starting Upload Process.."); + $('#preparingUploadModal').modal({dismissible: true}); + $('#preparingUploadModal').modal('open'); + var streamFinishCount = 0; + for (var i = 0; i < MainFileArray.length; i++) { + const streamFiles = (files) => { + const stream = node.addReadableStream() + stream.on('data', function(data) { + //console.log("Data..."); + //console.log(data); + GlobalHashArray.push(`${data.hash}`); + GlobalSizeArray.push(`${data.size}`); + GlobalPathArray.push(`${data.path}`); + GlobalUploadHash = `${data.hash}`; + GlobalUploadPath = `${data.path}`; + console.log("Path: " + data.path + " Hash: " + data.hash); + //var comparePath = data.path.replace(pathSymbol, "/"); + var comparePath = data.path.replace(/\\/g, '/'); + console.log("Compare Path: " + comparePath); + var splitString = comparePath.split("/") + if (splitString.length == 1 || splitString[0] == "") { + //if (splitString.length == 1) { + streamFinishCount++; + GlobalMainHashArray.push(`${data.hash}`); + GlobalMainPathArray.push(`${data.path}`); + if (streamFinishCount == MainFileArray.length) { + console.log("Finish Path: " + data.path + " Hash: " + data.hash); + createMainHash(); + } } - var filesForStream = MainFileArray[i]; - streamFiles(filesForStream); + }); + files.forEach(file => stream.write(file)) + stream.end() } + var filesForStream = MainFileArray[i]; + streamFiles(filesForStream); + } - const streamFilesExternally = (filesArray, MainHashArray) => { + const streamFilesExternally = (filesArray, MainHashArray) => { - var confirmationServers = ["https://ipfsapi.ethofs.com/ipfs/", "https://ipfsapi1.ethofs.com/ipfs/", "https://ipfsapi2.ethofs.com/ipfs/", "https://ipfsapi5.ethofs.com/ipfs/", "https://ipfsapi6.ethofs.com/ipfs/", "https://ipfsapi7.ethofs.com/ipfs/"]; - let hashVerificationArray = [...GlobalHashArray, ...GlobalMainHashArray]; - hashVerificationArray.push(GlobalMainContentHash); - var hashConfirmationCount = 0; - var uploadCompleteFlag = false; + var confirmationServers = ["https://ipfsapi.ethofs.com/ipfs/", "https://ipfsapi1.ethofs.com/ipfs/", "https://ipfsapi2.ethofs.com/ipfs/", "https://ipfsapi5.ethofs.com/ipfs/", "https://ipfsapi6.ethofs.com/ipfs/", "https://ipfsapi7.ethofs.com/ipfs/"]; + let hashVerificationArray = [...GlobalHashArray, ...GlobalMainHashArray]; + hashVerificationArray.push(GlobalMainContentHash); + var hashConfirmationCount = 0; + var uploadCompleteFlag = false; - for (var i = 0; i < MainHashArray.length; i++) { - console.log("Sending Immediate Pin Request: " + MainHashArray[i]); - publishImmediatePin(MainHashArray[i]); - } - setTimeout(function () { - hashVerificationArray.forEach(function (hash) { - verifyDataUpload(hash); - }); - }, 5000); + for (var i = 0; i < MainHashArray.length; i++) { + console.log("Sending Immediate Pin Request: " + MainHashArray[i]); + publishImmediatePin(MainHashArray[i]); + } + setTimeout(function() { + hashVerificationArray.forEach(function(hash) { + verifyDataUpload(hash); + }); + }, 5000); - const verifyDataUpload = async hash => { - var confirmationServer = confirmationServers[Math.floor(Math.random() * confirmationServers.length)]; - var url = confirmationServer + hash; - try { - const response = await fetch(url); - console.log("Data Confirmation Status: " + response.status + " Hash: " + hash); - if (response.status == 200) { - hashConfirmationCount++; - var confirmationPercentage = Math.ceil((hashConfirmationCount / hashVerificationArray.length) * 100); - updateUploadProgress(confirmationPercentage); - console.log("Data Upload Confirmation Received: " + hashConfirmationCount + "/" + hashVerificationArray.length); - $uploadMessage.innerText = "Upload Confirmation Received: " + hashConfirmationCount + "/" + hashVerificationArray.length; - if (confirmationPercentage >= 99) { - $uploadMessage.innerText = "Upload Complete"; - document.getElementById("upload-status-message").textContent = "Complete"; - if(!uploadCompleteFlag) { - uploadCompleteFlag = true; - updateContractTable(); - finishUploadModal(); - } - return; - } - } else { - var confirmationPercentage = Math.ceil((hashConfirmationCount / hashVerificationArray.length) * 100); - if (confirmationPercentage < 99) { - setTimeout(function () { - verifyDataUpload(hash) - }, 2000); - } else { - return; - } - } - } catch (error) { - console.log(error); - console.log("Data Confirmation Error: " + error.status); - var confirmationPercentage = Math.ceil((hashConfirmationCount / hashVerificationArray.length) * 100); - if (confirmationPercentage < 99) { - setTimeout(function () { - verifyDataUpload(hash) - }, 2000); - } else { - return; - } + const verifyDataUpload = async hash => { + var confirmationServer = confirmationServers[Math.floor(Math.random() * confirmationServers.length)]; + var url = confirmationServer + hash; + try { + const response = await fetch(url); + console.log("Data Confirmation Status: " + response.status + " Hash: " + hash); + if (response.status == 200) { + hashConfirmationCount++; + var confirmationPercentage = Math.ceil((hashConfirmationCount / hashVerificationArray.length) * 100); + updateUploadProgress(confirmationPercentage); + console.log("Data Upload Confirmation Received: " + hashConfirmationCount + "/" + hashVerificationArray.length); + $uploadMessage.innerText = "Upload Confirmation Received: " + hashConfirmationCount + "/" + hashVerificationArray.length; + if (confirmationPercentage >= 99) { + $uploadMessage.innerText = "Upload Complete"; + document.getElementById("upload-status-message").textContent = "Complete"; + if (!uploadCompleteFlag) { + uploadCompleteFlag = true; + updateContractTable(); + finishUploadModal(); } - }; - } - - function createMainHash() { - var contentHashString = GlobalChannelString; - for (i = 0; i < GlobalMainHashArray.length; i++) { - contentHashString += ":" + GlobalMainHashArray[i]; - } - window.node.add(Buffer.from(contentHashString), (err, res) => { - if (err || !res) { - return console.error('ipfs add error', err, res) - } - res.forEach((file) => { - if (file && file.hash) { - GlobalMainContentHash = file.hash; - AddNewPin(GlobalUploadHash, GlobalUploadSize, document.getElementById('newcontractname').value, GlobalContractDuration); - } - }); - }); - } - - /*****************************************************************************/ - function AddNewPin(pinToAdd, pinSize, HostingContractName, HostingContractDuration) { - var contentHashString = GlobalChannelString; - var contentPathString = GlobalChannelString; - for (i = 0; i < GlobalMainHashArray.length; i++) { - contentHashString += ":" + GlobalMainHashArray[i]; - contentPathString += ":" + GlobalMainPathArray[i]; - } - var MainHashArray = GlobalMainHashArray; - GlobalUploadName = HostingContractName; - var contractCost = calculateCost(pinSize, HostingContractDuration, GlobalHostingCostWei); - var pinAdding = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress); - const transactionObject = { - from: GlobalUserAddress, - value: contractCost - }; - console.log("Contract Address: " + GlobalControllerContractAddress + " Value: " + contractCost); - if (privateKeyLogin == true) { - const tx = { - to: GlobalControllerContractAddress, - from: GlobalUserAddress, - value: contractCost, - gas: 4000000, - data: pinAdding.methods.AddNewContract(GlobalMainContentHash, HostingContractName, HostingContractDuration, pinSize, pinSize, contentHashString, contentPathString).encodeABI() - }; - var privateKey = '0x' + GlobalPrivateKey; - console.log("Private Key: " + privateKey); - web3.eth.accounts.signTransaction(tx, privateKey) - .then(function (signedTransactionData) { - console.log("Signed TX Data: " + signedTransactionData.rawTransaction); - web3.eth.sendSignedTransaction(signedTransactionData.rawTransaction, function (error, result) { - if (!error) { - if (result) { - console.log("Result: " + result); - $('#minedBlockTrackerModal').modal('show'); - $('#preparingUploadModal').modal('hide'); - waitForReceipt(result, function (receipt) { - console.log("Transaction Has Been Mined: " + receipt); - $('#minedBlockTrackerModal').modal('hide'); - $('#nodeModal').modal('hide'); - var filesForStream = MainFileArray; - streamFilesExternally(filesForStream, MainHashArray); - checkForUploadedContentAvailability(HostingContractName); - }); - } else { - console.log("There was a problem adding new contract"); - } - } else { - console.error(error); - } - }); - }); + return; + } } else { - pinAdding.methods.AddNewContract(GlobalMainContentHash, HostingContractName, HostingContractDuration, pinSize, pinSize, contentHashString, contentPathString).send(transactionObject, function (error, result) { - if (!error) { - if (result) { - $('#minedBlockTrackerModal').modal('show'); - $('#preparingUploadModal').modal('hide'); - waitForReceipt(result, function (receipt) { - console.log("Transaction Has Been Mined: " + receipt); - $('#minedBlockTrackerModal').modal('hide'); - $('#nodeModal').modal('hide'); - var filesForStream = MainFileArray; - streamFilesExternally(filesForStream, MainHashArray); - checkForUploadedContentAvailability(HostingContractName); - }); - } else { - console.log("There was a problem adding new contract"); - } - } else { - console.error(error); - } - }); + var confirmationPercentage = Math.ceil((hashConfirmationCount / hashVerificationArray.length) * 100); + if (confirmationPercentage < 99) { + setTimeout(function() { + verifyDataUpload(hash) + }, 2000); + } else { + return; + } } + } catch (error) { + console.log(error); + console.log("Data Confirmation Error: " + error.status); + var confirmationPercentage = Math.ceil((hashConfirmationCount / hashVerificationArray.length) * 100); + if (confirmationPercentage < 99) { + setTimeout(function() { + verifyDataUpload(hash) + }, 2000); + } else { + return; + } + } + }; + } + + function createMainHash() { + var contentHashString = GlobalChannelString; + for (i = 0; i < GlobalMainHashArray.length; i++) { + contentHashString += ":" + GlobalMainHashArray[i]; } - /*****************************************************************************/ + window.node.add(Buffer.from(contentHashString), (err, res) => { + if (err || !res) { + return console.error('ipfs add error', err, res) + } + res.forEach((file) => { + if (file && file.hash) { + GlobalMainContentHash = file.hash; + AddNewPin(GlobalUploadHash, GlobalUploadSize, document.getElementById('newcontractname').value, GlobalContractDuration); + } + }); + }); + } + + /*****************************************************************************/ + function AddNewPin(pinToAdd, pinSize, HostingContractName, HostingContractDuration) { + var contentHashString = GlobalChannelString; + var contentPathString = GlobalChannelString; + for (i = 0; i < GlobalMainHashArray.length; i++) { + contentHashString += ":" + GlobalMainHashArray[i]; + contentPathString += ":" + GlobalMainPathArray[i]; + } + var MainHashArray = GlobalMainHashArray; + GlobalUploadName = HostingContractName; + var contractCost = calculateCost(pinSize, HostingContractDuration, GlobalHostingCostWei); + var pinAdding = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress); + const transactionObject = { + from: GlobalUserAddress, + value: contractCost + }; + console.log("Contract Address: " + GlobalControllerContractAddress + " Value: " + contractCost); + if (privateKeyLogin == true) { + const tx = { + to: GlobalControllerContractAddress, + from: GlobalUserAddress, + value: contractCost, + gas: 4000000, + data: pinAdding.methods.AddNewContract(GlobalMainContentHash, HostingContractName, HostingContractDuration, pinSize, pinSize, contentHashString, contentPathString).encodeABI() + }; + var privateKey = '0x' + GlobalPrivateKey; + console.log("Private Key: " + privateKey); + web3.eth.accounts.signTransaction(tx, privateKey) + .then(function(signedTransactionData) { + console.log("Signed TX Data: " + signedTransactionData.rawTransaction); + web3.eth.sendSignedTransaction(signedTransactionData.rawTransaction, function(error, result) { + if (!error) { + if (result) { + console.log("Result: " + result); + $('#minedBlockTrackerModal').modal({dismissible: true}); + $('#minedBlockTrackerModal').modal('open'); + $('#preparingUploadModal').modal({dismissible: true}); + $('#preparingUploadModal').modal('close'); + waitForReceipt(result, function(receipt) { + console.log("Transaction Has Been Mined: " + receipt); + $('#minedBlockTrackerModal').modal({dismissible: true}); + $('#minedBlockTrackerModal').modal('close'); + $('#nodeModal').modal({dismissible: true}); + $('#nodeModal').modal('close'); + var filesForStream = MainFileArray; + streamFilesExternally(filesForStream, MainHashArray); + checkForUploadedContentAvailability(HostingContractName); + }); + } else { + console.log("There was a problem adding new contract"); + } + } else { + console.error(error); + } + }); + }); + } else { + pinAdding.methods.AddNewContract(GlobalMainContentHash, HostingContractName, HostingContractDuration, pinSize, pinSize, contentHashString, contentPathString).send(transactionObject, function(error, result) { + if (!error) { + if (result) { + $('#minedBlockTrackerModal').modal('open'); + $('#preparingUploadModal').modal('close'); + waitForReceipt(result, function(receipt) { + console.log("Transaction Has Been Mined: " + receipt); + $('#minedBlockTrackerModal').modal('close'); + $('#nodeModal').modal('close'); + var filesForStream = MainFileArray; + streamFilesExternally(filesForStream, MainHashArray); + checkForUploadedContentAvailability(HostingContractName); + }); + } else { + console.log("There was a problem adding new contract"); + } + } else { + console.error(error); + } + }); + } + } + /*****************************************************************************/ } function updateUploadProgress(width) { - var elem = document.getElementById("myBar"); - width = round(width, 2); - if (width >= 100) { - width = 100; - elem.style.width = width + '%'; - elem.innerHTML = width * 1 + '%'; - } + var elem = document.getElementById("myBar"); + width = round(width, 2); + if (width >= 100) { + width = 100; elem.style.width = width + '%'; elem.innerHTML = width * 1 + '%'; + } + elem.style.width = width + '%'; + elem.innerHTML = width * 1 + '%'; } function resetUploadProcess() { - resetFileTable(); - updateUploadProgress(0); - $uploadMessage.innerText = "Preparing Upload"; - document.getElementById("upload-status-message").textContent = ""; - MainFileArray = new Array(); - GlobalUploadSize = 0; + resetFileTable(); + updateUploadProgress(0); + $uploadMessage.innerText = "Preparing Upload"; + document.getElementById("upload-status-message").textContent = ""; + MainFileArray = new Array(); + GlobalUploadSize = 0; } function updateAnalyzeProgress(width) { - var elem = document.getElementById("myAnalyzeBar"); - width = round(width, 2); - if (width >= 100) { - width = 100; - elem.style.width = width + '%'; - elem.innerHTML = width * 1 + '%'; - } + var elem = document.getElementById("myAnalyzeBar"); + width = round(width, 2); + if (width >= 100) { + width = 100; elem.style.width = width + '%'; elem.innerHTML = width * 1 + '%'; + } + elem.style.width = width + '%'; + elem.innerHTML = width * 1 + '%'; } function onFileUpload(event) { - event.preventDefault() - document.getElementById("upload-hash").textContent = "ANALYZING UPLOAD DATA"; - document.getElementById("upload-confirm-button").style.visibility = "hidden"; - MainFileArray.push([]); - let dirSelected = event.target.files; - let dirName = dirSelected[0].name; - let dirPath = dirSelected[0].path; - var streamCompareCount = 0; - var totalUploadItems = 0; - readDirectoryContents(dirPath); + event.preventDefault() + document.getElementById("upload-hash").textContent = "ANALYZING UPLOAD DATA"; + document.getElementById("upload-confirm-button").style.visibility = "hidden"; + MainFileArray.push([]); + let dirSelected = event.target.files; + let dirName = dirSelected[0].name; + let dirPath = dirSelected[0].path; + var streamCompareCount = 0; + var totalUploadItems = 0; + readDirectoryContents(dirPath); - function readDirectoryContents(directory) { - console.log("Directory Path: " + directory); - fs.readdir(directory, function (err, filesUploaded) { - if (!err) { - for (let i = 0; filesUploaded.length > i; i++) { - handleItem(filesUploaded[i], directory); - } - } else { - console.log("File Upload Error: " + err); - } - }); - } + function readDirectoryContents(directory) { + console.log("Directory Path: " + directory); + fs.readdir(directory, function(err, filesUploaded) { + if (!err) { + for (let i = 0; filesUploaded.length > i; i++) { + handleItem(filesUploaded[i], directory); + } + } else { + console.log("File Upload Error: " + err); + } + }); + } - function handleItem(filename, relativePath) { - var filepath = relativePath.concat(pathSymbol, filename); - fs.stat(filepath, function (err, stats) { - if (!err) { - if (stats.isDirectory()) { - readDirectoryContents(filepath) - } else { - streamCompareCount++; - totalUploadItems++; - console.log("File Path: " + filepath); - fs.readFile(filepath, function (err, file) { - var updatedPath = filepath.replace(dirPath, dirName); - var filetowrite = { - path: updatedPath, - content: file - }; - var filename = updatedPath; - MainFileArray[MainFileArray.length - 1].push(filetowrite); - GlobalUploadSize += Number(stats.size); - fileSize += Number(stats.size); - var totalUploadSizeMB = GlobalUploadSize / 1000000; - appendFile(updatedPath, filename, stats.size, null); - console.log("Path: " + filepath + " Size: " + stats.size + " Total Size: " + GlobalUploadSize); - document.getElementById("upload-size").textContent = totalUploadSizeMB; - contractDurationChange(document.getElementById('contract-duration').value); - streamCompareCount--; - updateAnalyzeProgress(((totalUploadItems - streamCompareCount) / totalUploadItems)); - if (streamCompareCount == 0) { - document.getElementById("upload-hash").textContent = "READY FOR UPLOAD"; - document.getElementById("upload-confirm-button").style.visibility = "visible"; - } - }); - } - } else { - console.log("File Stats Error: " + err); + function handleItem(filename, relativePath) { + var filepath = relativePath.concat(pathSymbol, filename); + fs.stat(filepath, function(err, stats) { + if (!err) { + if (stats.isDirectory()) { + readDirectoryContents(filepath) + } else { + streamCompareCount++; + totalUploadItems++; + console.log("File Path: " + filepath); + fs.readFile(filepath, function(err, file) { + var updatedPath = filepath.replace(dirPath, dirName); + var filetowrite = { + path: updatedPath, + content: file + }; + var filename = updatedPath; + MainFileArray[MainFileArray.length - 1].push(filetowrite); + GlobalUploadSize += Number(stats.size); + fileSize += Number(stats.size); + var totalUploadSizeMB = GlobalUploadSize / 1000000; + appendFile(updatedPath, filename, stats.size, null); + console.log("Path: " + filepath + " Size: " + stats.size + " Total Size: " + GlobalUploadSize); + document.getElementById("upload-size").textContent = totalUploadSizeMB; + contractDurationChange(document.getElementById('contract-duration').value); + streamCompareCount--; + updateAnalyzeProgress(((totalUploadItems - streamCompareCount) / totalUploadItems)); + if (streamCompareCount == 0) { + document.getElementById("upload-hash").textContent = "READY FOR UPLOAD"; + document.getElementById("upload-confirm-button").style.visibility = "visible"; } - }); - } + }); + } + } else { + console.log("File Stats Error: " + err); + } + }); + } } function onDrop(event) { - MainFileArray.push([]); - document.getElementById("upload-hash").textContent = "ANALYZING UPLOAD DATA"; - document.getElementById("upload-confirm-button").style.visibility = "hidden"; - fileSize = 0; - resetProgress(); - onDragLeave() - event.preventDefault() - if (GlobalUploadHash != "" && GlobalUploadPath != "") { - GlobalMainHashArray.push(GlobalUploadHash); - GlobalMainPathArray.push(GlobalUploadPath); + MainFileArray.push([]); + document.getElementById("upload-hash").textContent = "ANALYZING UPLOAD DATA"; + document.getElementById("upload-confirm-button").style.visibility = "hidden"; + fileSize = 0; + resetProgress(); + onDragLeave() + event.preventDefault() + if (GlobalUploadHash != "" && GlobalUploadPath != "") { + GlobalMainHashArray.push(GlobalUploadHash); + GlobalMainPathArray.push(GlobalUploadPath); + } + const dt = event.dataTransfer + const filesDropped = dt.files + const itemsDropped = dt.items + + function readFileContents(file) { + return new Promise((resolve) => { + const reader = new window.FileReader() + reader.onload = (event) => resolve(event.target.result) + reader.readAsArrayBuffer(file) + }) + } + var totalItemCount = 0; + var streamCompareCount = 0; + + function initialHandleItems(items) { + const files = []; + totalItemCount = items.length; + streamCompareCount = items.length; + for (var item of items) { + var awaitHandleEntry = handleEntry(item.webkitGetAsEntry()); } - const dt = event.dataTransfer - const filesDropped = dt.files - const itemsDropped = dt.items - function readFileContents(file) { - return new Promise((resolve) => { - const reader = new window.FileReader() - reader.onload = (event) => resolve(event.target.result) - reader.readAsArrayBuffer(file) - }) - } - var totalItemCount = 0; - var streamCompareCount = 0; + function handleEntry(entry) { + if (entry.isFile) { + getFile(entry); - function initialHandleItems(items) { - const files = []; - totalItemCount = items.length; - streamCompareCount = items.length; - for (var item of items) { - var awaitHandleEntry = handleEntry(item.webkitGetAsEntry()); - } - - function handleEntry(entry) { - if (entry.isFile) { - getFile(entry); - - function getFile(entry) { - entry.file(function (file) { - readFileContents(file) - .then((buffer) => { - var filePath = entry.fullPath; - var filetowrite = { - path: entry.fullPath, - content: Buffer.from(buffer) - }; - MainFileArray[MainFileArray.length - 1].push(filetowrite); - GlobalUploadSize += Number(file.size); - fileSize += Number(file.size); - var totalUploadSizeMB = GlobalUploadSize / 1000000; - appendFile(entry.fullPath, entry.name, file.size, null); - document.getElementById("upload-size").textContent = totalUploadSizeMB; - contractDurationChange(document.getElementById('contract-duration').value); - streamCompareCount--; - updateAnalyzeProgress(((totalItemCount - streamCompareCount) / totalItemCount)); - if (streamCompareCount == 0) { - document.getElementById("upload-hash").textContent = "READY FOR UPLOAD"; - document.getElementById("upload-confirm-button").style.visibility = "visible"; - } - }); - }); + function getFile(entry) { + entry.file(function(file) { + readFileContents(file) + .then((buffer) => { + var filePath = entry.fullPath; + var filetowrite = { + path: entry.fullPath, + content: Buffer.from(buffer) + }; + MainFileArray[MainFileArray.length - 1].push(filetowrite); + GlobalUploadSize += Number(file.size); + fileSize += Number(file.size); + var totalUploadSizeMB = GlobalUploadSize / 1000000; + appendFile(entry.fullPath, entry.name, file.size, null); + document.getElementById("upload-size").textContent = totalUploadSizeMB; + contractDurationChange(document.getElementById('contract-duration').value); + streamCompareCount--; + updateAnalyzeProgress(((totalItemCount - streamCompareCount) / totalItemCount)); + if (streamCompareCount == 0) { + document.getElementById("upload-hash").textContent = "READY FOR UPLOAD"; + document.getElementById("upload-confirm-button").style.visibility = "visible"; } - - } else if (entry.isDirectory) { - let directoryReader = entry.createReader(); - directoryReader.readEntries(function (entries) { - streamCompareCount += entries.length - 1; - totalItemCount += entries.length - 1; - entries.forEach(function (newEntry) { - handleEntry(newEntry); - }); - }); - } + }); + }); } + } else if (entry.isDirectory) { + let directoryReader = entry.createReader(); + directoryReader.readEntries(function(entries) { + streamCompareCount += entries.length - 1; + totalItemCount += entries.length - 1; + entries.forEach(function(newEntry) { + handleEntry(newEntry); + }); + }); + } } - initialHandleItems(event.dataTransfer.items); + + } + initialHandleItems(event.dataTransfer.items); } /* =========================================================================== @@ -1251,66 +1271,66 @@ function onDrop(event) { =========================================================================== */ function connectToPeer(event) { - const multiaddr = $multiaddrInput.value + const multiaddr = $multiaddrInput.value - if (!multiaddr) { - return onError('No multiaddr was inserted.') - } + if (!multiaddr) { + return onError('No multiaddr was inserted.') + } - window.node.swarm.connect(multiaddr) - .then(() => { - onSuccess(`Successfully connected to peer.`) - $multiaddrInput.value = '' - }) - .catch(() => onError('An error occurred when connecting to the peer.')) + window.node.swarm.connect(multiaddr) + .then(() => { + onSuccess(`Successfully connected to peer.`) + $multiaddrInput.value = '' + }) + .catch(() => onError('An error occurred when connecting to the peer.')) } function updatePeerProgress(width, peercount) { - var backgroundcolor = ""; - var elem = document.getElementById("myPeerBar"); - width = round(width, 2); - if (width >= 100) { - width = 100; - } - if (width >= 80) { - backgroundcolor = '"#3CB371"'; - } else if (width >= 40 && width < 80) { - backgroundcolor = '"#FFFF00"'; - } else { - backgroundcolor = '"#FF0000"'; - } - elem.style.width = width + '%'; + var backgroundcolor = ""; + var elem = document.getElementById("myPeerBar"); + width = round(width, 2); + if (width >= 100) { + width = 100; + } + if (width >= 80) { + backgroundcolor = '"#3CB371"'; + } else if (width >= 40 && width < 80) { + backgroundcolor = '"#FFFF00"'; + } else { + backgroundcolor = '"#FF0000"'; + } + elem.style.width = width + '%'; } function refreshPeerList() { - var updatedPeerCount = 0; - window.node.swarm.peers() - .then((peers) => { - const peersAsHtml = peers.reverse() - .map((peer) => { - if (peer.addr) { - const addr = peer.addr.toString() - if (addr.indexOf('ipfs') >= 0) { - return addr - } else { - return addr + peer.peer.id.toB58String() - } - } - }) - .map((addr) => { - var splitString = addr.split("/"); - addr = splitString[splitString.length - 1]; - updatedPeerCount++; - if (!PeersForChannel.includes(addr)) { - PeersForChannel.push(addr); - } - return `${addr}` - }).join('') - - }).then(() => { - updatePeerProgress(((updatedPeerCount / 7) * 100), updatedPeerCount) + var updatedPeerCount = 0; + window.node.swarm.peers() + .then((peers) => { + const peersAsHtml = peers.reverse() + .map((peer) => { + if (peer.addr) { + const addr = peer.addr.toString() + if (addr.indexOf('ipfs') >= 0) { + return addr + } else { + return addr + peer.peer.id.toB58String() + } + } }) - .catch((error) => onError(error)) + .map((addr) => { + var splitString = addr.split("/"); + addr = splitString[splitString.length - 1]; + updatedPeerCount++; + if (!PeersForChannel.includes(addr)) { + PeersForChannel.push(addr); + } + return `${addr}` + }).join('') + + }).then(() => { + updatePeerProgress(((updatedPeerCount / 7) * 100), updatedPeerCount) + }) + .catch((error) => onError(error)) } /* =========================================================================== @@ -1318,21 +1338,21 @@ function refreshPeerList() { =========================================================================== */ function onSuccess(msg) { - $logs.classList.add('success') - $logs.innerHTML = msg + $logs.classList.add('success') + $logs.innerHTML = msg } function onError(err) { - let msg = 'An error occured, check the dev console' + let msg = 'An error occured, check the dev console' - if (err.stack !== undefined) { - msg = err.stack - } else if (typeof err === 'string') { - msg = err - } + if (err.stack !== undefined) { + msg = err.stack + } else if (typeof err === 'string') { + msg = err + } - $logs.classList.remove('success') - $logs.innerHTML = msg + $logs.classList.remove('success') + $logs.innerHTML = msg } window.onerror = onError @@ -1342,50 +1362,50 @@ window.onerror = onError =========================================================================== */ const states = { - ready: () => { - const addressesHtml = window.info.addresses.map((address) => { - return `
  • ${address}
  • ` - }).join('') - $nodeId.innerText = window.info.id - $allDisabledButtons.forEach(b => { - b.disabled = false - }) - $allDisabledInputs.forEach(b => { - b.disabled = false - }) - $allDisabledElements.forEach(el => { - el.classList.remove('disabled') - }) - } + ready: () => { + const addressesHtml = window.info.addresses.map((address) => { + return `
  • ${address}
  • ` + }).join('') + $nodeId.innerText = window.info.id + $allDisabledButtons.forEach(b => { + b.disabled = false + }) + $allDisabledInputs.forEach(b => { + b.disabled = false + }) + $allDisabledElements.forEach(el => { + el.classList.remove('disabled') + }) + } } function updateView(state, ipfs) { - if (states[state] !== undefined) { - states[state]() - } else { - throw new Error('Could not find state "' + state + '"') - } + if (states[state] !== undefined) { + states[state]() + } else { + throw new Error('Could not find state "' + state + '"') + } } /* =========================================================================== Boot the app =========================================================================== */ function startApplication() { - // Setup event listeners - $dragContainer.addEventListener('dragenter', onDragEnter) - $dragContainer.addEventListener('dragover', onDragEnter) - $dragContainer.addEventListener('drop', onDrop) - $dragContainer.addEventListener('dragleave', onDragLeave) - document.getElementById("fileUploadButton").addEventListener("change", onFileUpload) - //start() - window.startNode() - extendedStartApplication() + // Setup event listeners + $dragContainer.addEventListener('dragenter', onDragEnter) + $dragContainer.addEventListener('dragover', onDragEnter) + $dragContainer.addEventListener('drop', onDrop) + $dragContainer.addEventListener('dragleave', onDragLeave) + document.getElementById("fileUploadButton").addEventListener("change", onFileUpload) + //start() + window.startNode() + extendedStartApplication() } function extendedStartApplication() { - $ethomessage.innerText = GlobalUserAddress; + $ethomessage.innerText = GlobalUserAddress; } function stopApplication() { - resetUploadProcess(); - resetFileTable(); -} \ No newline at end of file + resetUploadProcess(); + resetFileTable(); +} diff --git a/assets/templates/addressBook.html b/assets/templates/addressBook.html index dbe05c3..fe2112a 100755 --- a/assets/templates/addressBook.html +++ b/assets/templates/addressBook.html @@ -74,4 +74,6 @@ - \ No newline at end of file + + + diff --git a/assets/templates/addresslist.html b/assets/templates/addresslist.html index e94ba19..e1b20b1 100755 --- a/assets/templates/addresslist.html +++ b/assets/templates/addresslist.html @@ -25,4 +25,5 @@ {{else}}
    You don't have any wallets, please import them, or create a new one
    {{/if}} - \ No newline at end of file + + diff --git a/assets/templates/markets.html b/assets/templates/markets.html index 0693d23..ad2807f 100755 --- a/assets/templates/markets.html +++ b/assets/templates/markets.html @@ -48,5 +48,6 @@
    - +
    + diff --git a/assets/templates/send.html b/assets/templates/send.html index c8d1ce7..4c1930c 100755 --- a/assets/templates/send.html +++ b/assets/templates/send.html @@ -118,3 +118,4 @@ + diff --git a/assets/templates/settings.html b/assets/templates/settings.html index 083c7ec..89be6bb 100755 --- a/assets/templates/settings.html +++ b/assets/templates/settings.html @@ -1,16 +1,17 @@
    - + Clean transactions data
    - + Clean wallet names
    - + Clean blockchain data
    -
    \ No newline at end of file + + diff --git a/assets/templates/transactions.html b/assets/templates/transactions.html index bde1e0a..04ca043 100755 --- a/assets/templates/transactions.html +++ b/assets/templates/transactions.html @@ -75,3 +75,5 @@
    + + diff --git a/assets/templates/uploads.html b/assets/templates/uploads.html index 4f2d150..158abad 100644 --- a/assets/templates/uploads.html +++ b/assets/templates/uploads.html @@ -1,7 +1,6 @@ - + @@ -13,11 +12,9 @@ --> - + - @@ -95,7 +92,7 @@
    -
    +

    What is ethoFS?

    @@ -141,6 +138,7 @@
    +
    @@ -169,6 +167,7 @@
    +
    +
    + @@ -296,8 +293,7 @@ box to upload.

    - +
    @@ -316,8 +312,7 @@
    @@ -339,8 +334,7 @@ - + @@ -384,8 +378,7 @@ @@ -397,8 +390,7 @@ - -