public void InsertSpendShare(ShareSpend _ShareSpend) { var col = ChainDB.GetCollection <ShareSpend>("ShareSpend"); col.EnsureIndex(x => x.ShareId, true); col.Insert(_ShareSpend); }
public CompletedTransaction BuildTransaction(IList <Share> _SendingFromShares, string _fromAddress, string _privateKey, string _toAddress, double _amount) { bool mustPost = false; IEnumerator <Share> ShareEnumerator = _SendingFromShares.GetEnumerator(); Share SpendingShare; double amountFulFilled = 0; double amountReturn = 0; while (ShareEnumerator.MoveNext()) { SpendingShare = ShareEnumerator.Current; IsValidShare(SpendingShare, _fromAddress); amountFulFilled += SpendingShare.Amount; if (amountFulFilled >= _amount) { amountReturn = amountFulFilled - _amount; mustPost = true; //We have no reason not to post now } } if (mustPost) { try { //Post the transaction to the ledger Transaction postTransaction = new Transaction { TransactionId = Guid.NewGuid(), DateTimeStamp = DateTime.Now, Amount = _amount, Sender = _fromAddress, Receiver = _toAddress, }; postTransaction.MD5Hash = MD5Hash.GenerateKey(postTransaction); Database.InsertTransaction(postTransaction); CompletedTrans.Transaction = postTransaction; CompletedTrans.TransactionId = postTransaction.TransactionId; ShareEnumerator = _SendingFromShares.GetEnumerator(); while (ShareEnumerator.MoveNext()) { SpendingShare = ShareEnumerator.Current; //Post the Spend transaction(s) to the ledger ShareSpend postSpendTransaction = new ShareSpend { TransactionId = postTransaction.TransactionId, DateTimeStamp = DateTime.Now, Amount = SpendingShare.Amount, ShareId = SpendingShare.ShareId }; postSpendTransaction.MD5Hash = MD5Hash.GenerateKey(postSpendTransaction); postSpendTransaction.Signature = SignManager.GetSignature(_privateKey, postSpendTransaction.MD5Hash); Database.InsertSpendShare(postSpendTransaction); CompletedTrans.AddSpendShare(postSpendTransaction); } //Post the new (unspend) Shares to the ledger Share unspendShare = new Share { ShareId = new Guid(), GenesisTxId = postTransaction.TransactionId, DateTimeStamp = DateTime.Now, Amount = _amount, Owner = _toAddress }; unspendShare.MD5Hash = MD5Hash.GenerateKey(unspendShare); Database.InsertUnspendShare(unspendShare); CompletedTrans.AddUnspendShare(unspendShare); if (amountReturn > 0) { //TODO: Return amount Share unspendShareRet = new Share { ShareId = new Guid(), GenesisTxId = postTransaction.TransactionId, DateTimeStamp = DateTime.Now, Amount = amountReturn, Owner = _toAddress }; unspendShareRet.MD5Hash = MD5Hash.GenerateKey(unspendShareRet); Database.InsertUnspendShare(unspendShareRet); CompletedTrans.AddUnspendShare(unspendShare); } //Now build the completed transaction to broadcast CompletedTrans.MD5Hash = MD5Hash.GenerateKey(CompletedTrans); Database.InsertCompletedTrans(CompletedTrans); return(CompletedTrans); } catch { Console.WriteLine("Error when trying to post transaction"); return(null); } } Console.WriteLine("Insufficient balance for posting"); return(null); }