Example #1
0
        public void InsertSpendShare(ShareSpend _ShareSpend)
        {
            var col = ChainDB.GetCollection <ShareSpend>("ShareSpend");

            col.EnsureIndex(x => x.ShareId, true);

            col.Insert(_ShareSpend);
        }
Example #2
0
        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);
        }