Esempio n. 1
0
        /// <summary>
        /// Consolidates fungible currency utxo dat into one utxo
        /// </summary>
        /// <param name="profileFrom">profile of the sender</param>
        /// <param name="currency">currency to consolidate</param>
        /// <param name="amount">amount to consolidate (optional, if null consolidate all utxos)</param>
        /// <param name="tokenSource">cancellation token source</param>
        /// <returns></returns>
        public async Task <UTXOData> FCConsolidate(Profile profileFrom, string currency, BigInteger?amount = null, CancellationTokenSource tokenSource = null)
        {
            var currencyType = await GetCurrencyType(currency);

            if (IsFungibleCurrency(currencyType))
            {
                var utxos = await GetUtxos(profileFrom.ID, currency);

                if (utxos.Length > 1)
                {
                    FCConsolidator consolidator = new FCConsolidator(plasmaApiService, transactionEncoder, profileFrom.ID, currency, utxos, amount);
                    while (consolidator.CanMerge)
                    {
                        if (tokenSource != null && tokenSource.IsCancellationRequested)
                        {
                            break;
                        }

                        foreach (var transaction in consolidator.Transactions)
                        {
                            await SignTransaction(profileFrom, transaction);
                        }
                        await consolidator.ProcessTransactions();
                    }

                    return(consolidator.MergedUtxo);
                }
                else if (utxos.Length == 1)
                {
                    return(utxos[0]);
                }
            }
            return(null);
        }
        public async void ShouldConsolidateFungibleCurrencyTransactions()
        {
            string address    = "0x0e5e50883f3a1dd73c170c935339bce1b24a96d0";
            string privateKey = "0xac32ae83a4067291cda7a268e316376338bef6b63f66d10b8b516c76093c677e";
            string currency   = "0xda636e31a9800531418213b5c799960f4585c937";

            var utxos = await PlasmaAPIService.GetUtxos(address);

            RawTransactionEncoder txEncoder = new RawTransactionEncoder();
            var consolidator = new FCConsolidator(PlasmaAPIService, txEncoder, address, currency, utxos, 4);

            while (consolidator.CanMerge)
            {
                foreach (var transaction in consolidator.Transactions)
                {
                    var sig = PlasmaCoreTestsHelper.Sign(txEncoder, transaction, address, privateKey);
                    transaction.SetSignature(address, sig.HexToByteArray());
                }
                await consolidator.ProcessTransactions();
            }

            Assert.Equal(4, consolidator.MergedUtxo.Data);
            Assert.True(consolidator.AllConsolidated);
            Assert.Equal(!consolidator.CanMerge, consolidator.AllConsolidated);

            consolidator = new FCConsolidator(PlasmaAPIService, txEncoder, address, currency, utxos);
            while (consolidator.CanMerge)
            {
                foreach (var transaction in consolidator.Transactions)
                {
                    var sig = PlasmaCoreTestsHelper.Sign(txEncoder, transaction, address, privateKey);
                    transaction.SetSignature(address, sig.HexToByteArray());
                }
                await consolidator.ProcessTransactions();
            }

            Assert.Equal(1744, consolidator.MergedUtxo.Data);
            Assert.True(consolidator.AllConsolidated);
            Assert.Equal(!consolidator.CanMerge, consolidator.AllConsolidated);

            consolidator = new FCConsolidator(PlasmaAPIService, txEncoder, address, currency, utxos, 9999999);
            while (consolidator.CanMerge)
            {
                foreach (var transaction in consolidator.Transactions)
                {
                    var sig = PlasmaCoreTestsHelper.Sign(txEncoder, transaction, address, privateKey);
                    transaction.SetSignature(address, sig.HexToByteArray());
                }
                await consolidator.ProcessTransactions();
            }

            Assert.Equal(1744, consolidator.MergedUtxo.Data);
            Assert.True(consolidator.AllConsolidated);
            Assert.Equal(!consolidator.CanMerge, consolidator.AllConsolidated);
        }