/// <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); }