NVO Decentralized Exchange - Crowdsale

It’s declared in the dashboard. I assume you never logged in the dashboard. We contacted the Maidsafe team to be our escrow because that would be the ideal scenario,

Screen shot please. No I never looked on the I was only following you main marketing venues, looking in all the places it should be if it exists.
Post it now please.

Hi, please register on our website by clicking the Join crowdsale button. For any question you can join our slack and speak to Yanni. We would love to assist you with any problem :smiley:

Ideal for you. Not ideal for MaidSafe or investor confidence. Demonstrate you know how important this point is please. If you can’t, demonstrate how important your point is.

@dirvine
Thank you, I decided to take the reactions of the community with pleasure and humor because it serves no purpose on my part to be hostile, because the most important is to answer the thenic questions, I know that in no time I will Start the development, and I will have 8-12 hours of work a day, but my humor is not meant insulting but sympathetic.

“من عاشر قوما 40 يوما صار منهم” This saying says, when one lives with a people for 40 days, one becomes one of theirs, so better to put me at ease, as it will do soon 40 days.

@happybeign

It is not that I do not want to give everything, I am content to explain the essential points, so that the community understands and advances with me.
At the same time, I could have given bits of code every time but I preferred to give ideas and work with the community, I want the community to develop the project in its head, at the same time that I develop.
And at the same time it’s true that I have to keep one can code closed, and not all reveal until startup at least. To preserve competitiveness, but also, for example, cards, there are currently only very few who have real partners who accept their cards. The others are mainly scams and scam copies. I do not want NVO to suffer the same thing.
Once NVO is launched we will open the code so that others can use it and compete with NVO, and it is in NVO’s interest for exchange users to become more familiar with DEX.
This is a good way to compete with Poloniex in the future.
I know that giving a few pieces of code would attract more investors, its may impress some, but the goal is not to impress, but to make it clear.

This small piece of code, costs $ 150m:

function BancorToken(string _name, string _symbol, uint8 _numDecimalUnits, address _formula, address _events) {
    if (bytes(_name).length == 0 || bytes(_symbol).length < 1 || bytes(_symbol).length > 6 || _formula == 0x0) // validate input
        throw;

    name = _name;
    symbol = _symbol;
    numDecimalUnits = _numDecimalUnits;
    formula = _formula;
    events = _events;

    if (events == 0x0)
        return;

    BancorEvents eventsContract = BancorEvents(events);
    eventsContract.newToken();
}

Here is a small part of the code, in the state of draft that is being matured for the next wallet:


// Get the basic Informations
var Wallets = {};
Wallets.Bitcoin = JSON.parse(localStorage.getItem('btcWallet'));
Wallets.Ethereum = JSON.parse(localStorage.getItem('ethWallet'));
Wallets.Ripple = JSON.parse(localStorage.getItem('xrpWallet'));

var userInfo = JSON.parse(localStorage.getItem('userInfo'));

var Dialogs = require('dialogs');
var dialogs = Dialogs(opts={})

const{clipboard} = require('electron');

//const {RippleAPI} = require('ripple-lib');
//const api = new RippleAPI({
//	server: 'wss://s1.ripple.com' // Public rippled server
	//server: 'wss://54.213.214.68:51233 ' // Public rippled testnet server in maintenance
//});

setEvent();
leftPanelPrice('Bitcoin');
getTxs();
logTXS('Bitcoin');

$("#currenciesList li").click(function(){
	$("#currenciesList li.current").toggleClass('current');
	$(this).toggleClass('current');
	data = $("#currenciesList li.current").find('span.name').html();
	if (data == 'Bitcoin'){
		$("#Address").attr('placeholder',"Bitcoin Address");
		$("#Amount").attr('placeholder',"0.123456789");
		$("#Ticker").html("BTC");
	}else if(data == 'Ethereum'){
		$("#Address").attr('placeholder',"Ethereum Address");
		$("#Amount").attr('placeholder',"0.123456789");
		$("#Ticker").html("ETH");
	}else if(data == "Ripple"){
		$("#Address").attr('placeholder',"Ripple Address");
		$("#Amount").attr('placeholder',"0.1234");
		$("#Ticker").html("XRP");
	}
	setEvent();
});
$("#deposit").click(function(){
	data = $("#currenciesList li.current").find('span.name').html();
	qrimage(data);
	if (data == "Bitcoin"){$("#depositAddress").html(Wallets.Bitcoin.Address);}
	else if(data == "Ethereum"){$("#depositAddress").html('0x'+Wallets.Ethereum.Address[0]);}
	else if(data == "Ripple"){$("#depositAddress").html(Wallets.Ripple.Address);}
});
$("#PrivKey").click(function(){
	data = $("#currenciesList li.current").find('span.name').html();
	if (data == "Bitcoin"){dialogs.alert('Please BackUp this key '+ Wallets.Bitcoin.PrivKey);}
	else if(data == "Ethereum"){dialogs.alert('Please BackUp this Seed : '+ Wallets.Ethereum.seed);}
	else if(data == "Ripple"){dialogs.alert('Please BackUp this Secret : '+ Wallets.Ripple.Secret);}

});
$("#Send").click(function(){
	data = $("#currenciesList li.current").find('span.name').html();
	address = $("#Address").val();
	value = $("#Amount").val();
	
	if (data == "Bitcoin"){
		//console.log("bitcoin");
		sendBitcoin(address, value);
		$("#Address").val("");
		$("#Amount").val("");
	}
	else if(data == "Ethereum"){
		console.log("Ethereum");
		sendEthereum(address, value);
		$("#Address").val("");
		$("#Amount").val("");
	}
	else if(data == "Ripple"){
		console.log("Ripple");
		sendRipple(address, value);
		$("#Address").val("");
		$("#Amount").val("");
	}else{console.log("undefined error");}
});

$("#copyBtn").click(function(){
clipboard.writeText($("#depositAddress").html());

});


// Check transactions
function getTxs(){
	// Bitcoin
	if (Wallets.Bitcoin.Address) {
    	$.ajax({
		  //url: 'https://blockchain.info/rawaddr/Enter a Bitcoin Address', // For Test
		  url:'https://blockchain.info/rawaddr/'+ Wallets.Bitcoin.Address,
		  success: function(data) {
		   	Wallets.Bitcoin.TXS = data.txs;
			localStorage.setItem('btcWallet', JSON.stringify(Wallets.Bitcoin));   
		  },
		  error: function(XMLHttpRequest, textStatus, errorThrown) { 
			if (XMLHttpRequest.status == 0) {
				dialogs.alert('Check Your Network.');
			    } else if (XMLHttpRequest.status == 404) {
			      dialogs.alert('Requested URL not found.');
			    } else if (XMLHttpRequest.status == 500) {
			      dialogs.alert('Internel Server Error.');
			    }  else {
			       dialogs.alert('Unknow Error.\n' + XMLHttpRequest.responseText);
			    }     
			}
		});
    }else {dialogs.alert('Error at Bitcoin TXs check, please contact support.');}

    // Ripple
   	if (Wallets.Ripple.Address){
   		//$.get('https://data.ripple.com/v2/accounts/rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn/transactions?type=Payment', function(data){Wallets.Ripple.TXS = data;}); // For Test
   		$.get('https://data.ripple.com/v2/accounts/'+ Wallets.Ripple.Address +'/transactions?type=Payment', function(data){Wallets.Ripple.TXS = data;});
   	}else {dialogs.alert('Error at Ripple TXs check, please contact support.');}

   	// Ethereum
   	if (Wallets.Ethereum.Address) {
   		/*$.get('http://api.etherscan.io/api?module=account&action=txlist&address=0xa15E770eB92D585Ce6ef5B0cC00b19cc0Def694b&startblock=0&endblock=99999999&sort=desc', function(data){
   			Wallets.Ethereum.TXS = data.result;
   		}); // For test*/

   		$.get('http://api.etherscan.io/api?module=account&action=txlist&address=0x'+ Wallets.Ethereum.Address +'&startblock=0&endblock=99999999&sort=asc', function(data){
   			Wallets.Ethereum.TXS = data;
   		});
   	}else {dialogs.alert('Error at Ethereum TXs check, please contact support.');}


}
function logTXS(coin){
	if($(".table-data").children().length != 0){$(".table-data").html('');}
	if($(".table-data").children().length == 0){
		if(coin == "Bitcoin"){
			leftPanelPrice(coin);
			if (Wallets.Bitcoin.TXS.length == 0){
				$(".table-data").append('<div style="text-align: center;color:white;"><p>No Transaction history.</p></div>');
			}
			else if(Wallets.Bitcoin.TXS.length > 0){
				for(i = 0; i < Wallets.Bitcoin.TXS.length; i++){
					txs = Wallets.Bitcoin.TXS[i];
					cTX = {fees: 0};
					txIn = {value:0}; txOut = {fees:0, value:0};
					address = Wallets.Bitcoin.Address;
					//address = "Enter a Bitcoin Address"; // For Test


					if (txs.out.length > 0){
						for(v = 0; v < txs.out.length; v++){
							txout = txs.out[v];
							if(txout.addr == address){
								txOut.value = (txout.value/100000000);
								cTX.type = "Received";
							}
		            	}
					}else if(txs.out.length == 0){
						
						if(txout.addr == address){
							txOut.value = (txout.value/100000000);
							
								cTX.type = "Received";
							}
					}
					if (txs.inputs.length > 0){
					    for(v = 0; v < txs.inputs.length; v++){
		            		txin = txs.inputs[v];
		            		
		            		if(txin.prev_out.addr == address){
		            			txIn.value = (txin.prev_out.value/100000000);
		            			cTX.type = "Sent";
		            		}
		            	}				
					}else if(txs.inputs.length == 0){
						txIn.value = (txin.prev_out.value/100000000);
						if(txin.prev_out.addr == address){
		            			cTX.type = "Sent";
		            		}
					}



		            cTX.fees = (txIn.value - txOut.value);
		            if (cTX.type == "Sent"){
		            	cTX.value = (txin.prev_out.value - cTX.fees)/100000000;	
		            }
		            if(cTX.type == "Received"){
		            	cTX.value = (txout.value - cTX.fees)/100000000;	
		            }
		            
		            
					//console.log(txin.prev_out.value, txout.value, cTX.fees.toFixed(8));
					date = new Date(txs.time *1000);
					cTX.date = date.toLocaleString();
					//Base
					$(".table-data").append("<div id='tx"+i+"' class='row-append'></div>");
					//First row and Open
					$("#tx"+i).append('<div id="1Row'+i+'" class="row-tr row-td clearfix first-row"></div>');
					$("#tx"+i).append('<div id="2Row'+i+'" class ="row-tr row-td open-wrapper"></div>');
					//Open
					open = $("#2Row"+i);
					open.append('<div id="openBox'+i+'" class="open-boxs"></div>');
						//OpenBox
						openBox = $('#openBox'+i);
						openBox.append('<div id="fEl'+i+'" class="el-row"></div>');
						openBox.append('<div id="sEl'+i+'" class="el-row"></div>');
							//First El
							fEl = $('#fEl'+i);
							fEl.append('<div id="fElfCol'+i+'" class="el-col el-col-8"></div>');
							fEl.append('<div id="fElsCol'+i+'" class="el-col el-col-8"></div>');
							fEl.append('<div id="fEltCol'+i+'" class="el-col el-col-8"></div>');
								//First El First Col
								fElfCol = $("#fElfCol"+i);
								fElfCol.append('<div id="fElfColGrid'+i+'" class="grid-content"></div>');
									//First El First Col Grid
									fElfColGrid = $("#fElfColGrid"+i);
									fElfColGrid.append('<span id="fElfColGridfSpan'+i+'" class="title-label">Date</span>');
									fElfColGrid.append('<span id="fElfColGridsSpan'+i+'" class="color-white value">'+ cTX.date +'</span>');
								//First El Second Col
								fElsCol = $("#fElsCol"+i);
								fElsCol.append('<div id="fElsColGrid'+i+'" class="grid-content"></div>');
									//First El Second Col Grid
									fElsColGrid = $("#fElsColGrid"+i);
									fElsColGrid.append('<span class="title-label">TXID</span>');
									fElsColGrid.append('<span href="https://www.blockchain.info/tx/'+ txs.hash +'"class="txid" style="color:#0062ff;">'+ txs.hash.slice(0,10) +'...</span>');
								//First El Third Col
								fEltCol = $("#fEltCol"+i);
								fEltCol.append('<div id="fEltColGrid'+i+'" class="grid-content"></div>');
									//First El Third Col Grid
									fEltColGrid = $("#fEltColGrid"+i);
									fEltColGrid.append('<span class="title-label">Fees</span>');
									if(cTX.type == "Sent"){
									fEltColGrid.append('<span class="color-white value">'+ cTX.fees.toFixed(8) +' BTC</span>');
									}
									if(cTX.type == "Received"){
									fEltColGrid.append('<span class="color-white value"> --- BTC</span>');
									}
							// Second El
							sEl = $('#sEl'+i);
							sEl.append('<div id="sElfCol'+i+'" class="el-col el-col-8"></div>');
								// Second El Firs Col
								sElfCol = $("#sElfCol"+i);
								sElfCol.append('<div id="sElfColGrid'+i+'" class="grid-content"></div>');
									//Second El First Col Grid
									sElfColGrid = $("#sElfColGrid"+i);
									if(cTX.type == "Sent"){
										sElfColGrid.append('<span class="title-label">To</span>');
										sElfColGrid.append('<span href="https://www.blockchain.info/tx/'+ txout.addr +'" class="color-white value" style="color:#0062ff;">'+ txout.addr +'</span>');
									}
									if(cTX.type == "Received"){
										sElfColGrid.append('<span class="title-label">From</span>');
										sElfColGrid.append('<span href="https://www.blockchain.info/tx/'+ txin.prev_out.addr +'" class="color-white value" style="color:#0062ff;">'+ txin.prev_out.addr +'</span>');
									}
					//
					// Step
					//
					// First Row
					firstRow = $("#1Row"+i);
					firstRow.append('<div id="1td'+i+'" class="col-td width67"></div>');
					firstRow.append('<div id="2td'+i+'" class="col-td width33 text-right"></div>');
					// TD 1
					td1 = $("#1td"+i);
					td1.append('<div id="td1spacing'+i+'" class="spacing"></div>');
					// TD 1 Spacing
					td1Spacing = $("#td1spacing"+i);

					if(cTX.type == "Received"){
						td1Spacing.append('<span id="1tdDate'+i+'" class="date"></span>');
						td1SpacingDate = $("#1tdDate"+i);
						td1SpacingDate.append(toWD(date)+'<span class="number">'+ date.getDate() +'</span>');
						td1Spacing.append('<img id="1tdimg'+i+'" src="i/coins.svg" alt="img" class="img-title"></img>');
						td1Spacing.append('<span id="1tdtitles'+i+'" class="titles">'+ cTX.type +'</span>');
					}
					
					if(cTX.type == "Sent"){
						td1Spacing.append('<span id="1tdDate'+i+'" class="date"></span>');
						td1SpacingDate = $("#1tdDate"+i);
						td1SpacingDate.append(toWD(date)+'<span class="number">'+ date.getDate() +'</span>');
						td1Spacing.append('<img id="1tdimg'+i+'" src="i/send.svg" alt="img" class="img-title"></img>');
						td1Spacing.append('<span id="1tdtitles'+i+'" class="titles">'+ cTX.type +'</span>');
					}
					// TD 2
					td2 = $("#2td"+i);
					td2.append('<div id="td2spacing'+i+'" class="spacing"></div>');
					// TD 2 Spacing
					td2Spacing = $("#td2spacing"+i);
					if(cTX.type == "Received"){
						td2Spacing.append('<span class="add-number" style="color:green;">+'+ txOut.value.toFixed(8) +' BTC</span>');
					}else if(cTX.type == "Sent"){
						td2Spacing.append('<span class="add-number" style="color:red;">-'+ txIn.value.toFixed(8) +' BTC</span>');
		            }		
				}
			}
		}else if(coin == "Ethereum"){
			leftPanelPrice(coin);
			if (Wallets.Ethereum.TXS.result.length == 0){
				$(".table-data").append('<div style="text-align: center;color:white;"><p>No Transaction history.</p></div>');
			}
			else if(!(Wallets.Ethereum.TXS.result) && !(Wallets.Ethereum.TXS)){
				$(".table-data").append('<div style="text-align: center;color:white;"><p>No Transaction history.</p></div>');
			}
			else if(Wallets.Ethereum.TXS.length > 0){
				for(i = 0; i < 10; i++){
					txs = Wallets.Ethereum.TXS[i];

					address = Wallets.Ethereum.Address;
					//address = '0xa15E770eB92D585Ce6ef5B0cC00b19cc0Def694b'; // For Test
					address = address.toLowerCase();

					cTX = {Fees:0, Type:'', Value:0};

					cTX.Fees = (txs.gasPrice / 10e+17) * (txs.gasUsed);

					if(txs.from === address){
						cTX.Type = 'Sent';
					}else if(txs.to === address){
						cTX.Type = 'Received';
					}

					cTX.Value = txs.value / 10e+17;localStorage.setItem('btcWallet', JSON.stringify(Wallets.Bitcoin));
      localStorage.setItem('xrpWallet', JSON.stringify(Wallets.Ripple));
      localStorage.setItem('ethWallet', JSON.stringify(Wallets.Ethereum));

					cTX.Date = new Date(txs.timeStamp * 1000);


					//Base
					$(".table-data").append("<div id='tx"+i+"' class='row-append'></div>");
					//First row and Open
					$("#tx"+i).append('<div id="1Row'+i+'" class="row-tr row-td clearfix first-row"></div>');
					$("#tx"+i).append('<div id="2Row'+i+'" class ="row-tr row-td open-wrapper"></div>');
					//Open
					open = $("#2Row"+i);
					open.append('<div id="openBox'+i+'" class="open-boxs"></div>');
					//OpenBox
					openBox = $('#openBox'+i);
					openBox.append('<div id="fEl'+i+'" class="el-row"></div>');
					openBox.append('<div id="sEl'+i+'" class="el-row"></div>');
					//First El
					fEl = $('#fEl'+i);
					fEl.append('<div id="fElfCol'+i+'" class="el-col el-col-8"></div>');
					fEl.append('<div id="fElsCol'+i+'" class="el-col el-col-8"></div>');
					fEl.append('<div id="fEltCol'+i+'" class="el-col el-col-8"></div>');
					//First El First Col
					fElfCol = $("#fElfCol"+i);
					fElfCol.append('<div id="fElfColGrid'+i+'" class="grid-content"></div>');
					//First El First Col Grid
					fElfColGrid = $("#fElfColGrid"+i);
					fElfColGrid.append('<span id="fElfColGridfSpan'+i+'" class="title-label">Date</span>');
					fElfColGrid.append('<span id="fElfColGridsSpan'+i+'" class="color-white value">'+ cTX.Date.toLocaleDateString() +'</span>');
					//First El Second Col
					fElsCol = $("#fElsCol"+i);
					fElsCol.append('<div id="fElsColGrid'+i+'" class="grid-content"></div>');
					//First El Second Col Grid
					fElsColGrid = $("#fElsColGrid"+i);
					fElsColGrid.append('<span class="title-label">TXID</span>');
					fElsColGrid.append('<span href="https://etherscan.io/tx/'+ txs.hash +'"class="txid" style="color:#0062ff;">'+ txs.hash.slice(0,10) +'...</span>');
					//First El Third Col
					fEltCol = $("#fEltCol"+i);
					fEltCol.append('<div id="fEltColGrid'+i+'" class="grid-content"></div>');
					//First El Third Col Grid
					fEltColGrid = $("#fEltColGrid"+i);
					fEltColGrid.append('<span class="title-label">Fees</span>');
					if(cTX.Type == "Sent"){
					fEltColGrid.append('<span class="color-white value">'+ cTX.Fees.toString() +' ETH</span>');
					}
					if(cTX.Type == "Received"){
					fEltColGrid.append('<span class="color-white value"> --- ETH</span>');
					}
					// Second El
					sEl = $('#sEl'+i);
					sEl.append('<div id="sElfCol'+i+'" class="el-col el-col-8"></div>');
					// Second El Firs Col
					sElfCol = $("#sElfCol"+i);
					sElfCol.append('<div id="sElfColGrid'+i+'" class="grid-content"></div>');
					//Second El First Col Grid
					sElfColGrid = $("#sElfColGrid"+i);
					if(cTX.Type == "Sent"){
					sElfColGrid.append('<span class="title-label">To</span>');
					sElfColGrid.append('<span href="https://etherscan.io/address/'+ txs.to +'" class="color-white value" style="color:#0062ff;">'+ txs.to +'</span>');
					}
					if(cTX.Type == "Received"){
					sElfColGrid.append('<span class="title-label">From</span>');
					sElfColGrid.append('<span href="https://etherscan.io/address/'+ txs.from +'" class="color-white value" style="color:#0062ff;">'+ txs.from +'</span>');
					}
					//
					// Step
					//
					// First Row
					firstRow = $("#1Row"+i);
					firstRow.append('<div id="1td'+i+'" class="col-td width67"></div>');
					firstRow.append('<div id="2td'+i+'" class="col-td width33 text-right"></div>');
					// TD 1
					td1 = $("#1td"+i);
					td1.append('<div id="td1spacing'+i+'" class="spacing"></div>');
					// TD 1 Spacing
					td1Spacing = $("#td1spacing"+i);

					if(cTX.Type == "Received"){
						td1Spacing.append('<span id="1tdDate'+i+'" class="date"></span>');
						td1SpacingDate = $("#1tdDate"+i);
						td1SpacingDate.append(toWD(cTX.Date)+'<span class="number">'+ cTX.Date.getDate() +'</span>');
						td1Spacing.append('<img id="1tdimg'+i+'" src="i/coins.svg" alt="img" class="img-title"></img>');
						td1Spacing.append('<span id="1tdtitles'+i+'" class="titles">'+ cTX.Type +'</span>');
					}

					if(cTX.Type == "Sent"){
						td1Spacing.append('<span id="1tdDate'+i+'" class="date"></span>');
						td1SpacingDate = $("#1tdDate"+i);
						td1SpacingDate.append(toWD(cTX.Date)+'<span class="number">'+ cTX.Date.getDate() +'</span>');
						td1Spacing.append('<img id="1tdimg'+i+'" src="i/send.svg" alt="img" class="img-title"></img>');
						td1Spacing.append('<span id="1tdtitles'+i+'" class="titles">'+ cTX.Type +'</span>');
					}
					// TD 2
					td2 = $("#2td"+i);
					td2.append('<div id="td2spacing'+i+'" class="spacing"></div>');
					// TD 2 Spacing
					td2Spacing = $("#td2spacing"+i);
					if(cTX.Type == "Received"){
						td2Spacing.append('<span class="add-number" style="color:green;">+'+ cTX.Value.toFixed(8) +' ETH</span>');
					}else if(cTX.Type == "Sent"){
						td2Spacing.append('<span class="add-number" style="color:red;">-'+ cTX.Value.toFixed(8) +' ETH</span>');
		            }		
				}
			}
		}else if (coin == 'Ripple'){
			leftPanelPrice(coin);
			if (Wallets.Ripple.TXS.transactions.length == 0){
				$(".table-data").append('<div style="text-align: center;color:white;"><p>No Transaction history.</p></div>');
			}
			else if(Wallets.Ripple.TXS.transactions.length > 0){
				for(i = 0; i < Wallets.Ripple.TXS.transactions.length; i++){
					txs = Wallets.Ripple.TXS.transactions[i];
					if (txs.tx.TransactionType === "Payment" && typeof(txs.tx.Amount) === "string"){
						cTX = txs.tx;
						address = Wallets.Ripple.Address;
						//address = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn"; // For Test

						date = new Date(txs.date);
			            
						//Base
						$(".table-data").append("<div id='tx"+i+"' class='row-append'></div>");
						//First row and Open
						$("#tx"+i).append('<div id="1Row'+i+'" class="row-tr row-td clearfix first-row"></div>');
						$("#tx"+i).append('<div id="2Row'+i+'" class ="row-tr row-td open-wrapper"></div>');
						//Open
						open = $("#2Row"+i);
						open.append('<div id="openBox'+i+'" class="open-boxs"></div>');
						//OpenBox
						openBox = $('#openBox'+i);
						openBox.append('<div id="fEl'+i+'" class="el-row"></div>');
						openBox.append('<div id="sEl'+i+'" class="el-row"></div>');
						//First El
						fEl = $('#fEl'+i);
						fEl.append('<div id="fElfCol'+i+'" class="el-col el-col-8"></div>');
						fEl.append('<div id="fElsCol'+i+'" class="el-col el-col-8"></div>');
						fEl.append('<div id="fEltCol'+i+'" class="el-col el-col-8"></div>');
						//First El First Col
						fElfCol = $("#fElfCol"+i);
						fElfCol.append('<div id="fElfColGrid'+i+'" class="grid-content"></div>');
						//First El First Col Grid
						fElfColGrid = $("#fElfColGrid"+i);
						fElfColGrid.append('<span id="fElfColGridfSpan'+i+'" class="title-label">Date</span>');
						fElfColGrid.append('<span id="fElfColGridsSpan'+i+'" class="color-white value">'+ date.toLocaleString() +'</span>');
						//First El Second Col
						fElsCol = $("#fElsCol"+i);
						fElsCol.append('<div id="fElsColGrid'+i+'" class="grid-content"></div>');
						//First El Second Col Grid
						fElsColGrid = $("#fElsColGrid"+i);
						fElsColGrid.append('<span class="title-label">TXID</span>');
						fElsColGrid.append('<span href="https://charts.ripple.com/#/transactions/'+ txs.hash +'"class="txid" style="color:#0062ff;">'+ txs.hash.slice(0,10) +'...</span>');
						//First El Third Col
						fEltCol = $("#fEltCol"+i);
						fEltCol.append('<div id="fEltColGrid'+i+'" class="grid-content"></div>');
						//First El Third Col Grid
						fEltColGrid = $("#fEltColGrid"+i);
						fEltColGrid.append('<span class="title-label">Fees</span>');
						if(cTX.Account == address){
						fEltColGrid.append('<span class="color-white value">'+ cTX.Fee * 1000000 +' XRP</span>');
						}
						if(cTX.Destination == address){
						fEltColGrid.append('<span class="color-white value"> --- XRP</span>');
						}
						// Second El
						sEl = $('#sEl'+i);
						sEl.append('<div id="sElfCol'+i+'" class="el-col el-col-8"></div>');
						// Second El Firs Col
						sElfCol = $("#sElfCol"+i);
						sElfCol.append('<div id="sElfColGrid'+i+'" class="grid-content"></div>');
						//Second El First Col Grid
						sElfColGrid = $("#sElfColGrid"+i);
						if(cTX.Account == address){
						sElfColGrid.append('<span class="title-label">To</span>');
						sElfColGrid.append('<span class="color-white value" style="color:#0062ff;">'+ cTX.Destination +'</span>');
						}
						if(cTX.Destination == address){
						sElfColGrid.append('<span class="title-label">From</span>');
						sElfColGrid.append('<span class="color-white value" style="color:#0062ff;">'+ cTX.Account +'</span>');
						}
						//
						// Step
						//
						// First Row
						firstRow = $("#1Row"+i);
						firstRow.append('<div id="1td'+i+'" class="col-td width67"></div>');
						firstRow.append('<div id="2td'+i+'" class="col-td width33 text-right"></div>');
						// TD 1
						td1 = $("#1td"+i);
						td1.append('<div id="td1spacing'+i+'" class="spacing"></div>');
						// TD 1 Spacing
						td1Spacing = $("#td1spacing"+i);

						if(cTX.Destination == address){
							td1Spacing.append('<span id="1tdDate'+i+'" class="date"></span>');
							td1SpacingDate = $("#1tdDate"+i);
							td1SpacingDate.append(toWD(date)+'<span class="number">'+ date.getDate() +'</span>');
							td1Spacing.append('<img id="1tdimg'+i+'" src="i/coins.svg" alt="img" class="img-title"></img>');
							td1Spacing.append('<span id="1tdtitles'+i+'" class="titles">Received</span>');
						}

						if(cTX.Account == address){
							td1Spacing.append('<span id="1tdDate'+i+'" class="date"></span>');
							td1SpacingDate = $("#1tdDate"+i);
							td1SpacingDate.append(toWD(date)+'<span class="number">'+ date.getDate() +'</span>');
							td1Spacing.append('<img id="1tdimg'+i+'" src="i/send.svg" alt="img" class="img-title"></img>');
							td1Spacing.append('<span id="1tdtitles'+i+'" class="titles">Sent</span>');
						}
						// TD 2
						td2 = $("#2td"+i);
						td2.append('<div id="td2spacing'+i+'" class="spacing"></div>');
						// TD 2 Spacing
						td2Spacing = $("#td2spacing"+i);
						if(cTX.Destination == address){
							td2Spacing.append('<span class="add-number" style="color:green;">+'+ cTX.Amount +' XRP</span>');
						}
						if(cTX.Account == address){
							td2Spacing.append('<span class="add-number" style="color:red;">-'+ cTX.Amount +' XRP</span>');
			            }
		            }
		        }		
			}
		}
		$('.row-append .first-row').click(function(){
    		$(this).parent().toggleClass('open');
  		});
	}
	var shell = require('electron').shell;
	//$("#tx0").toggleClass('open');
 	$('.txid').click(function(event){
           event.preventDefault();
			targ = event.target.attributes[0];
           shell.openExternal(targ.value);
   });
}
function toWD(date){
	var weekday = new Array(7);
	weekday[0] =  "Sunday";
	weekday[1] = "Monday";
	weekday[2] = "Tuesday";
	weekday[3] = "Wednesday";
	weekday[4] = "Thursday";
	weekday[5] = "Friday";
	weekday[6] = "Saturday";
	return weekday[date.getDay()];
}

/*--------------------------- Right Bar Management --------------------*/
var cList = $("#currenciesList");

/*--------------------------- Price Widget Management --------------------*/
function leftPanelPrice(coin){
	var priceWidget = $("#priceWidget");
	if(priceWidget.children().length != 0){priceWidget.html('');}
	if(priceWidget.children().length == 0){
		if(coin == 'Bitcoin'){
			priceWidget.append('<a href="#" class="btn-right-menu"></a>');
			priceWidget.append('<img src="i/orange-b.png" alt="img" class="title-img">');
			priceWidget.append('<div id="PWtext" class="txt-area"></div>');
			pwText = $("#PWtext");
			pwText.append('<div class="name">Bitcoin</div>');
			pwText.append('<div class="last-txt">'+ (Wallets.Bitcoin.Balance/100000000) +' BTC<span>($'+ Wallets.Bitcoin.Value.toFixed(4) +' USD)</span></div>');
		}else if (coin == 'Ethereum'){
			priceWidget.append('<a href="#" class="btn-right-menu"></a>');
			priceWidget.append('<img src="i/ether.png" alt="img" class="title-img">');
			priceWidget.append('<div id="PWtext" class="txt-area"></div>');
			pwText = $("#PWtext");
			pwText.append('<div class="name">Ethereum</div>');
			pwText.append('<div class="last-txt">'+ Wallets.Ethereum.Balance +' ETH<span>($'+ Wallets.Ethereum.Value.toFixed(4) +' USD)</span></div>');
		}else if (coin == 'Ripple'){
			priceWidget.append('<a href="#" class="btn-right-menu"></a>');
			priceWidget.append('<img src="i/ripple.png" alt="img" class="title-img">');
			priceWidget.append('<div id="PWtext" class="txt-area"></div>');
			pwText = $("#PWtext");
			pwText.append('<div class="name">Ripple</div>');
			pwText.append('<div class="last-txt">'+ Wallets.Ripple.Balance +' XRP<span>($'+ Wallets.Ripple.Value.toFixed(4) +' USD)</span></div>');
			if (Wallets.Ripple.Balance === 0){
				dialogs.alert(' To activate the account you must send 25 XRP to this address : '+ Wallets.Ripple.Address);
			}
		}
	}
}

/*------------------- Bitcoin Send -------------------*/
function sendBitcoin(address, value){

	value*=100000000;

	bitcoin = require('bitcoinjs-lib');
	blockexplorer = require('blockchain.info/blockexplorer');
	push = require('blockchain.info/pushtx');

	tx = new bitcoin.TransactionBuilder();
	key = bitcoin.ECPair.fromWIF(Wallets.Bitcoin.PrivKey);
	$.get('https://api.blockcypher.com/v1/btc/main/addrs/'+Wallets.Bitcoin.Address+'?unspentOnly=true',function(data){
		
		if(!(data.txrefs)){
			return dialogs.alert('Unable to create transaction. No coins available.');
		}else if(data.txrefs.length === 1){
			
			unspent = data.txrefs[0];
			
			if(unspentValue >= value){

				tx.addInput(unspent.tx_hash, unspent.tx_output_n);

				fee = 150000; change = unspent.value - fee - value;

				tx.addOutput(Wallets.Bitcoin.Address, change);

				tx.addOutput(address, value);

				tx.sign(0, key);

				push.pushtx(tx.build().toHex());
			}else{
				dialogs.alert("Insufficient Balance");
			}
		}else if(data.txrefs.length > 1){
			unspentSum = 0;
			for (i = 0; i < data.txrefs.length; i++){
				unspent = data.txrefs[i];
				unspentSum += unspent.value;
			}
			if(unspentSum < value){
				dialogs.alert('Insufficient Balance');
			}else if(unspentSum >= value){
				for (i = 0; i < data.txrefs.length; i++){
					unspent = data.txrefs[i];
					tx.addInput(unspent.tx_hash, unspent.tx_output_n);
				}

				fee = 150000;
				change = unspentSum - fee - value;
				tx.addOutput(Wallets.Bitcoin.Address, change);
				tx.addOutput(address, value);
				tx.sign(0, key);

				push.pushtx(tx.build().toHex());

			}
		}
	});
}
/*-------------------Send Ethereum -----------------*/
function sendEthereum(address, value){
	lightwallet = require('eth-lightwallet');
	txutils = lightwallet.txutils;
	signing = lightwallet.signing;
	encryption = lightwallet.encryption;
	Web3 = require('web3');
	web3 = new Web3(new Web3.providers.HttpProvider('https://mainnet.infura.io/yrvzdiAodip86zWYujgS'));
	keyStore = lightwallet.keystore;

	userInfo = JSON.parse(localStorage.getItem('userInfo'));
	gasPrice = (web3.eth.gasPrice).toString(10);
	sendTo = address;
	from = '0x'+ Wallets.Ethereum.Address[0];
	value = (web3.toWei(value));
	nonce = (web3.eth.getTransactionCount(from)) + 1
	txOptions = {
	    gasPrice: 10000000000000,
	    gasLimit: 3000000,
	    value: value,
	    nonce: nonce,
	    data: undefined,
		to: sendTo
	};

	keyStore.createVault({
	  password: userInfo.id,
	  seedPhrase: Wallets.Ethereum.seed
	}, function (err, ks) {
		ks.keyFromPassword(userInfo.id, function (err, pwDerivedKey) {
	    if (err) throw err;
		ks.generateNewAddress(pwDerivedKey, 1);
	    addr = ks.getAddresses();
		valueTx = txutils.valueTx(txOptions)
		signedValueTx = signing.signTx(ks, pwDerivedKey, valueTx, "0x"+Wallets.Ethereum.Address[0]);
		web3.eth.sendRawTransaction(signedValueTx.toString('hex'), function(err, hash) {
  			if (err){dialogs.alert(err);}
    		else{dialogs.alert(hash);}
		});
	  });
	});

}

I reached the post size limit, so i had to cut it.

In the current state, there is nothing impressive here, but in no time, it will change.

People make money blissfully, I prefer to make the community evolve.

See you in some hours, after i get some sleep.

6 Likes

I agree as I’m also out, but imho they will never deliver as they are not capable of doing that.
ps. same thing apply for safe network.

9 posts were merged into an existing topic: Topic for off-topic discussions of SAFE and its worth/success from the NVO topic

Thanks for the input. Negative comments are always surprisingly more motivating.

1 Like

Hi @nemgun,
I’ve been reading both this and the bitcointalk forum for several days now and trying to make up my mind on whether to invest into this project, but am still struggling.
Anyways, regarding the code you’ve posted. - Could you kindly clarify what you were trying to present here?
I see both the Bancor token constructor code and (I assume) the code from the NVO wallet, but can’t make a connection between the two. I would like to make sure that I’m not missing something important you were trying to point out.

Also, purely from a technical perspective:

  1. The following section from the sendBitcoin() method appears to have a bug.
    Shouldn’t it read unspent.value instead of unspentValue?

As it stands now, the condition would always resolve to False, since unspentValue is undefined.

2.In addition, even if we corrected this condition to use unspent.value, the condition itself could still be invalid, since the unspent value might not be sufficient to cover both the value being sent and the transaction fee.
In which case the value of change would become negative, but the transaction would fail either way as the inputs included would not cover the transaction fee.

3.In the sendBitcoin() method, the section processing more than one unspent transaction appears to include all such transactions as inputs, even if one transaction might have a sufficient unspent value. Now, I haven’t done any development with blockchains, and do realize that this may be a common pattern, but it just looks odd that one would potentially specify a hundred inputs substantially exceeding the amount required, only to consolidate the large amount of change into one return output. Again, perhaps I’m making invalid assumptions here, so your feedback is welcome.

5 Likes

I told you that it is a code that will be matured, I know there are errors, I did not put everything because of the limit of characters by post.

I’m setting up the system, and then I would mature it, it’s an answer to happybeign and dirvine.

There are a few errors, and other functions can be reformulated, I would have 4 months after the crowdsale to finish the code and prepare the platform, for my reflection about bankor is that its Does not serve to give bits of code every time, I prefer to develop the community at the same time that I develop.

feel free to aks questions, or join us on slack.

Understood.
The code seemed rather trivial and I may have lost track of what @dirvine had been asking for, so I’ll just assume it wasn’t meant to display anything extraordinary.
Now, I’ve been reading your posts regarding the use of multi-signature addresses for trade execution, and am still trying to wrap my head around the logistics of that process.
So, let me just outline how I envision it based on the assumptions I’ve had to make to fill the gaps, and please bear with me here as I’m a very technical person and prefer specifics over abstracts. (Devil is always in the details)

In our typical scenario, user A has BTC and wants to buy ETH, and user B has ETH and wants to sell them for BTC.

  1. At some point in time, user A submits an order expressing his intent to buy 100 ETH @ 0.1 BTC/ETH price
  2. At another point in time, user B submits an order expressing her intent to sell 50 ETH @ 0.1 BTC/ETH price
  3. A match is detected by the validator V (although the match is partial)
    (here I have to start making assumptions based on what you’ve described before)
  4. V creates two 2-of-2 multisig addresses: V&A (BTC) and V&B (ETH).
  5. V requests A to send 5 BTC to V&A
  6. V requests B to send 50 ETH to V&B
  7. V is awaiting the payments
  8. A broadcasts a transaction on the Bitcoin blockchain and sends 5 BTC to V&A from its private Bitcoin address
  9. B broadcasts a transaction on the Ethereum blockchain and sends 50 ETH to V&B from their private Ethereum address
  10. Now they all wait, especially since Bitcoin is involved, - could be several minutes to an hour or longer
  11. V monitors both V&A and V&B until both payments have been received.
  12. V validates the amounts received
  13. V requests A to sign and return a 2-of-2 transaction for sending the previously deposited 5 BTC from V&A to B
  14. V requests B to sign and return a 2-of-2 transaction for sending the previously deposited 50 ETH from V&B to A
  15. Once both transactions have been signed and returned, V parses and validates them to ensure conformance with the original order and amounts/rate etc.
  16. V signs both V&A and V&B transactions using its own escrow key (unique for each trade)
  17. V broadcasts the V&A transaction, effectively sending 5 BTC to B
  18. V broadcasts the V&B transaction, effectively sending 50 ETH to A
  19. V destroys the private keys/addresses related to the completed trade
  20. V modifies the original order submitted by A to reflect the partial fulfillment, - to 50 ETH target
  21. V marks the original order submitted by B as 100% fulfilled, and removes it from the queue

So, assuming this is roughly what takes place, there are a couple areas of concern that I’d appreciate your comments on:
1. What happens if the validator loses connection or crashes between steps 17 and 18?
I mean, we don’t have anything like MSDTC for distributed transactions or two-phase commits here, so how do you envision handling such conditions? For example, would a newly created instance of the validator detect this abnormal termination and complete the process?

2. Given the need for the 2-of-2 escrow addresses, the flow of funds in each direction during a trade would supposedly double the amount of transaction fees incurred. (e.g. A=>V&A=>B)
Has this been taken into account? There have been remarks that the 0.2% exchange fee applied on top of the transaction fees may be too excessive and could completely negate any benefits provided by a decentralized exchange.
This issue becomes especially noticeable when multiple transactions are required to fill a single order (which is almost always the case, except when a buy and sell orders produce an absolute 100% match).

3. The whitepaper does not mention multi-sig in the context of online trading, but it does so for the potential implementation of offline trading. And where it does mention that, it also says that the use of multi-sig makes the exchange non-decentralized since the escrow/validator effectively holds the funds for some time.
Now, if multi-sig will need to be used for online trading in order to prevent double-spend, that would make online trading non-decentralized as well. - Is that a correct assumption?

I have provided this step-by-step outline of what the process might look like, so that all of us technical folks on this forum would be able to reference those steps for sharing opinions and ideas, and come to a pretty clear understanding of what a viable solution might look like.
Please do bear in mind that despite my almost 30 years in software development I have never coded anything for blockchains in particular, and the above is purely my attempt at putting together the puzzle of all the scattered piecemeal information I’ve read and heard so far on this thread and what I could infer from it.
I strongly believe that this particular area of the implementation will be the absolute defining factor in the success or failure of this project, therefore I think the discussion should focus on this area as it has remained extremely vague thus far.
Hopefully, focusing on the technical aspects will let us address all the concerns and help all the potential investors move forward with their contributions.
Cheers!

8 Likes

These are the questions that should have been asked 1.6 million dollars ago :stuck_out_tongue: :stuck_out_tongue: or whatever it currently is

1 Like

Wow, made it to the bottom … I dropped out for a week and only back in today to find so much more to read …

I am not invested (yet) in NVO and do not have an opinion about whether or not NVO could succeed (more on that later), but wanted to point out to the many detractors here who are seeking a lot of specific answers that David Irvine would not have been able to give specific answers in the beginning for many of the solutions that he and the MAIDSAFE team have come up with in the present day. Maidsafe is after all a high risk bet - one that many of us are invested in because we like the concept and we like David and the team.

So, yeah … keep in mind that NVO hasn’t been built yet and I’m sure that there are a lot of nitty gritty details that are going to give the NVO team a lot of sleepless nights ahead.

Even if they’ve some of the theory wrong (not saying they have), they still have time and resources now to rework in order to achieve the vision they’ve put forward … how many times has the MAIDSAFE team had to alter course to insure the success of the vision? A few.

So, IMO, please consider that NVO, like MAIDSAFE is a high risk venture and not replete with in-depth answers … yet.

There is also a cultural and language barrier here that is likely causing some division.

As regards the possibility of their success even if they have the endurance and ability, there is the difficulty in the task - perhaps it is impossible. Given the complexity of the task we cannot know IMO. The vision of MAIDSAFE was, at one point, itself to complex to know if it could succeed, but we invested anyway. NVO is attempting to build atop SafeNet … but that already makes it a more difficult task as SafeNet isn’t yet a firm protocol - things could change out of necessity.

So I am giving a large leeway here for NVO’s success or failure, I’m still here listening though :slight_smile:

The question for me to invest is really whether I believe in the vision and in the ability & endurance of the players to see it through – to the bloody end if needed!! lol

Keep calm and carry on NVO and MAIDSAFE!

9 Likes

Great post. I think making the parallels NVO / MaidSafe is a bit of a stretch and may be a little insulting to David. See the background on David Irvine pre MaidSafe 14 years ago and tell me he had a good start at knowing which end is up. Making up a great concept and suggesting it can come to fruition with no talent is absurd.

3 Likes

Well I don’t know about talent with regard to NVO guys … it is unproven - but that does not imply that it doesn’t exist.

I also don’t think David would take insult to my comparison - I know David has a strong background in networking - but building Internet 3.0 would be crazy hard even for a team of Nobel Laureates.

So I think, yes, NVO is a high risk investment … so is SafeNet, even with a dozen David Irvine’s at the helm.

If you want a safe investment, buy some gold and bury it in the back yard I reckon … if you are willing to suffer the ups and downs of a high risk investment, then ask yourself if you really love the vision and trust in the endurance/will of the people involved - ability/talent can be learned in time if there is the will.

Well that’s what I believe anyway … if you don’t trust in their will to push forward, then don’t take the risk with your money.

1 Like

In this case, and for multitude of reasons, it does imply that. This is not about investments, it never was.

1 Like

Well for me it’s about an investment … what is your reason for commenting on this thread otherwise?

As for their talent, I have looked into some of their past work and it is related, so IMO they do have some talent in this area. The question for me is, whether they have the will … and that’s what I’m up in the air about.

Alright then. Good luck.

Well, it started with questions that still have not been answered.

Time will tell.

1 Like

I’ve taken your scenario, and I thank you, I think it’s the most beautiful question I’ve had since the beginning of the crowdsale, and I appreciate your discipline and the fact that your questions are organized.

In our typical scenario, user A has BTC and wants to buy ETH, and user B has an ETH and wants to sell them for BTC.

  1. At any given time User A shall submit an order expressing its intention to purchase 100 ETH @ 0.1 BTC / ETH prices
    The order will be the procedure of creating address 2of2

    • The validator part in the wallet named safe browser will create a 2of2 address with the amount, price, ETH reception address, it will call the smart contract encrypted in double sha 256.
    • The private key of the address will be stored in the safenet
    • The decryption key for the private key that is stored in the safenetwork will be stored on a blocked encrypted blockchain this blockchain is the inverse of a standard blockchain it encrypts the information.
    • The mini blockchain will place the order in the order book
    • The mini block chain has the role of syncronizing the wallets and it allows communication between them.
  2. At another time, User B will issue an order to sell 50 ETH Awards @ 0.1 BTC / ETH

    • The validator part in the wallet named safe browser will create a 2of2 address with the amount, price, ETH reception address, it will call the smart contract encrypted in double sha 256.

3.Calculation Exchange Procedure
* The mini block chain will detect the deal by logical price
* She will call the two smart contracts that will be compared
* At the end of this verification, the active wallet will engage the safebrowser
* The safebrowser vas creates the ultimate smart contract that will be named the smarcontract swap
* The smartcontract swap will compare the amounts to deduct the excess with the exchange addresses.
* The excess will remain on the smart contract which will be returned on the safenetwork waiting for another deal the ride will be 0.04994 btc all from hangs from sending fee.
* The smartcontract swap will be copied into 4 online wallets in case of disconnection, the blockchain will specify the wallets online in a way aleatoir.
* It will take 4 copies of the smart contract for the deal to be realized, once synchronised the smartcontract swap realises the swap en then is deleted.
* Arrive at this stage the smart contract will be deleted.

This is where my logic model stops because for the following I am in test phase for the 0conf.

From here I can not continue to answer because the logic of your question does not have the logic of the functioning of the validator, I hope to have helped you and I ask you to take in concideration model j atend with pleasure the following Of your questions.

@TylerAbeoJordan

Your post just boosted me, I thank you really, it was a very emotional :cry: moment that made me think of an episode of dragon ball Z, and that the survival of the universe depended on me, it is like if I was sangohan and I had to beat cell, and everything depended on my will to win. Thank you so much.

4 Likes

:slight_smile: I’m a dragonball fan too. I read your post mentioning it before and it gave me hope that you do have the will to pull it off - lol - well you anyway … don’t know about the rest of the NVO team yet.

1 Like