NVO Decentralized Exchange - Crowdsale

Hi everyone, it’s getting hot here and trial by public forum can be difficult, with questions, accusations and slurs (which are not OK) freely thrown about. I think the fundamental thing here is that this is an attempt for a solution in an interesting space. For SAFE, exchanges will be a very helpful, if not necessary thing in the, hopefully, near future.

There are several really hard issues with a complex project, add to that crowd-sale/token issuance etc. and the problems are amplified. I know about crowdsale madness and also I have had a view of working as a company or close team on issues in the background and working in the open, a hard balance. If the project is difficult, impossible to many and solves a never before solved problem, I find it interesting, but I know also if it’s large enough then details are hard to describe. In the words of a great ad, “here’s to all the crazy ones” … we need them. However we do need to consider we are in the wild west here and there are many fraudulent projects.

So NVO is a project lead by a few folks that have some assistance from Alex of coinpayments. I know Alex and he is a great supporter of SAFE and has been for a long time, he is also a very successful business person, with his business partner, who like many of our Engineers keeps a bit quieter. These are good solid guys and great fun for a few drinks. The kind of guys you can trust and so far that trust is solid and unwavering. In short Alex and Sina can be a great help, but like us, they are mega mega busy and the last few weeks they have been frantically busy.

With that in mind I wish to give NVO the benefit of the doubt to a great degree, but, and a big but, the team need to calm down and type out answers, reflect on them and then click “post”, if an answer is insulting, don’t post it, find out the issue in the question and try and answer it.

With MaidSafe I know how hard it is to answer questions and also to have folk state 100% certain failures. We see it all the time, even from our own folks. The amount of times I see, “Oh this is an absolute impossibility to do/know X” being met with , “well this is how we do it” with the reply “Oh that works” occasionally said grudgingly, as though it’s a defeat to have an answer to a problem is amazing. (How bad was that English :wink: )

if you are doing something hard, many will stand in your way with absolute guaranteed reasons why it’s impossible, you need to address that, but it’s not always easy. Depends on the “size” of the question and that space it covers. I always like focused questions for that reason. It’s also not always possible to give one sentence or understandable answers to larger questions. Most folk will not read papers, research related papers or look at code. It’s hard as hell and distracting, but it’s vital to try and persuade people (not force agreement). many folk will not accept the answer, even when they know it works, they will ignore the answer and move immediately to the next “absolute guaranteed” reason it won’t work. That is exhausting and feels hurtful.

With this project I see reactionary answers and very hurtful questions, but trying to ignore that, I also see good questions that do need some thought and perhaps guidance to answer. This is the trick though, doing that.

I am not a lecturer and do not want to be, but sharing my own experiences I do find that dealing with the public can be very very difficult, but if you feel your head and heart are in a calm place then just post what you feel. It should not be aggressive and should not be insulting. It will be defensive at times and people reading should expect that, but it should always be courteous. I appreciate that is much easier for a native English speaker and we all forget that to at times. Strength is standing firm and listening, not jumping around.

If we can perhaps try and look to have good questions answered with patience and clarity then it will all go smoother. I feel there is something here that’s getting lost in the heat, so lets cool down and not try and react to questions, but find the real questions and answer them. In terms of SAFE and it’s capabilities, many here can help for sure. For your own project then you will find this community get down and dirty in the discussions and will help a lot to clarify and simplify answers to questions. Use that, it’s very powerful, but be ready for less than generous questions, there will be plenty of them.

tl;dr, Lets all calm down to a frenzy and answer with calm heads and warm hearts :wink: The answers will come and unanswered questions may remain, but lets find those answers together if we can. I feel that same about any project on SAFE really, I will try and help out if I can, but expect the community and myself to keep questioning the projects goals and progress. We as MaidSafe do not and cannot really endorse or heavily criticise projects so much as many other teams do, but we will try and help where we can to find the interesting stuff :wink:

23 Likes

What’s Alex role here? Is there some financial arrangement between coinpayments and NVO. Is coinpayments a principal in NVO?

Can anyone at @maidsafe or coinpayments speak to the technical capabilities and background of the 2 NVO founders and the third participant?

That is the issue here. Not who ya know or how many drinks you have with them.

I agree the space needs people to turn a no into a yes. But it needs people with integrity first, then some capacity to know the challenge.

I am a longtime supporter of MaidSafe, just like your buddy Alex.

Please let me know if the team you give the benefit of the doubt to has the technical capacity to even start a project of this magnitude.

Thanks

3 Likes

Don’t agree with the tone, but I do understand where the tone comes from @bigbtc. Besides the tone I tend to agree with your overall message and would like to know this as well :slight_smile: .

This is not an attack on you @dirvine or coinpayments (?) but I do want to point out that there has been previous misjudgments about business partners.

3 Likes

Coinpayments as a company invested in the crowdsale and is a partner of NVO. Alex, representing himself, will be joining the project and speak for us in public events.

Going to put this playlist here because it’s been lost up there. If you have questions let us know.

3 Likes

Nor is mine an attack on @dirvine

There’s an old saying in business. “Not every good idea is a good idea”

2 Likes

…Bingo. Sorry, maybe this was declared? But it was not apparent, for me at least. And Alex manages the escrow?

2 Likes

I second everything David says here. I hope the community and the NVO team can heed his words.

I know this is difficult for both groups, but the community is for the most part capable of acting with respect and keeping to the detail.

NVO are struggling to answer to the satisfaction of some questioners for several reasons IMO, though I don’t know for sure what the balance is. @nemgun is the key to resolving the technical issues, and right now this is a crucial issue for investors: can he / NVO solve the technical problems and answer technical questions from outsiders to their satisfaction? I see that language is an issue here and it must be frustrating for @nemgun as it is for me trying to understand his answers, but this I think is where we should focus: clarify and clarify again (on both sides) and keep the judgements and emotive words out as much as we can or we’ll have another thirty posts to wade through every day and still be no wiser.

On the whole I see @nemgun answering the questions in part each time, revealing a bit more of what might be a solution, but keeping the whole to himself. I think there is a question here about whether this is to protect the whole, or because not all the details are worked out. We can’t expect either in a project of this nature I think though, so what can we hope for? I think we can hope to learn how well we think @nemgun understands the questions, the problems, and the technology he’s trying to build. I don’t think we can expect him to have answers to everything, or to reveal everything about how he plans to solve key elements.

This is because we know there will be competing projects for this market. We’re used to something different with MaidSafe , and I think we have been spoiled in this community because David and his team have been both incredibly open and behaved impeccably under the most provocative and stressful conditions. We’ve also had time to get to know David & Co, whereas for us the NVO team are complete unknowns, with some recommendation, but in a wild west where we must be wary of strangers riding into town.

My request is that community focus on technical questions, take care with language and listen without judgement. Clarify, clarify! But don’t expect trade secrets here. I’m gradually learning and able to piece parts of @nemgun 's explanations into a bigger picture but think he’s always going to leave the whole incomplete in this discussion for the reasons I’ve given. I’m still able to learn what I need to know, both technical and otherwise though.

To @nemgun & @tonbi I respect you for putting yourselves out there and dealing with some pretty harsh stuff. I would personally find this very difficult to handle without reacting. But do try! I’ve seen how well it works when David just reads past the crap and focuses on providing a straightforward technical answer, whether the question seemed to me ok, arrogant, mocking, dumb etc. Often those judgements were just in me lol :slight_smile: and the questioner was sincere.

The point though is it doesn’t matter what is in the heart of the questioner, for you (and the community) it it’s only what is in our own hearts that matters.

12 Likes

MaidSafe cannot really, but I think Alex has worked with at least one member. He is pretty astute and I doubt he could be mislead easily. I think after the safex fiasco we all here feel a bit raw.

I know :wink: I have no problems with that, but I don’t know if I have had beers with you (yet). In any case this is all cool with me, I am not taking sides in any way, I just don’t want there to be sides really.[quote=“Melvin, post:592, topic:13608”]
This is not an attack on you @dirvine or coinpayments (?) but I do want to point out that there has been previous misjudgments about business partners.
[/quote]

Yes, it’s a space issue I think. I see many projects endorse others way to easily and also projects use other projects to bounce of of. It must be very tempting and we probably are seen ass arses a wee bit as we try and help but keep a distance. It’s a fine line and when there are infringements it’s not always easy to fix them without embarrassment for these projects. I think we do not to bad, but sometimes we as a community can jump to force a fast resolution. It’s a decent balance though IMHO and I kinda like it, even with the few sharp intakes of breath and feelings of WTH happened there :slight_smile:

I think the guys have answered these points mostly now, it feels like we are all on track to find out and support or not as we all see fit individually. A lot of tech questions probably still remain, but I am sure we can find out what they are.

What we do in maidsafe is release “stuff” and try and identify limitations, use RFCs and various papers to put forward our potential solutions and it works well. That may help here, but it is a ton of work for 2 or 3 folk to handle, especially during a crowd sale. Lets see though.

4 Likes

Not trolling you here David and thanks for your answers. I’m getting a picture that’s quite disturbing. The “trusted” party of the unknown and seemingly unqualified , unrated and dubious team , is also an investor, partner and now spokesman. He also controls an escow account with millions of dollars.

We, you, should know more than that. And maybe Alex wasn’t mislead.

I’m completely baffled by your recent post that to some degree, and without any foundation other than association, legitimizes this entire campaign.

Thanks again and yes, I hope to have a beer with you someday.

It is so sad how you keep on trying to attack us. I was guessing you are going say Coinpayments has profit motive to support our project because they are the escrow.

Originally, we asked the Maidsafe team to handle maidsafe escrow. We also asked @happybeing, but he felt like he didn’t qualify. Only after they refuse did we use Coinpayments as escrow. Coinpayments only manages the escrow for maidsafe which is the third in volume and most of the amount in Maidsafe are from the Coinpayments team themselves… The rest like Bitcoin and other currencies are managed by other escrows.

2 Likes

Yeah @tonbi

Now details of other escrows and Alex participation as a partner will clear up any fog. I’m totally wrong if all this is explained somewhere, and if it is, I apologize in advance. Please point me to this and if it’s not been previously posted. Post it now.
Thanks.

Well in many business environs that would be called a “conflict of interest” and the fact you don’t see it as one is troubling. Because you supposed to be the CEO and keep all perceived conflicts, especially ones around money, far far from home.

I was aware of the use of different escrows but perhaps from a private discussion, not sure, but they are listed on the crowdfund page once you register a login.

I see public statements of escrow by coinpayments. I don’t see public statements of escrow of only MaidSafe.

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.