Esempio n. 1
0
        public async void SendTransfer(NewSendModel sendModel)
        {
            var syncModel = new CancelSyncModel()
            {
                Text = "Sending the transaction"
            };

            walletModel.SyncModels.Add(syncModel);
            try
            {
                await SendTransfer(sendModel, syncModel);
            }
            catch (OperationCanceledException)
            {
            }
            catch (Exception e)
            {
                sendModel.ErrorText = e.Message;
                sendModel.Open();
            }
            finally
            {
                walletModel.SyncModels.Remove(syncModel);
            }
        }
Esempio n. 2
0
        private async Task SendTransactions(TransactionItem[] transactionItems, CancelSyncModel syncModel, bool rebroadcast)
        {
            try
            {
                syncModel.Text = "Sending the transaction";
                var api = CreateIotaClient();
                var resultTransactionItems = await api.SendTransactions(transactionItems, syncModel.Token);

                await walletModel.ScanAddresses.ScanAddressesAsync(false);

                if (rebroadcast)
                {
                    syncModel.Text = "Forcing the transaction to confirm";
                    await RebroadcastTransactions(resultTransactionItems, syncModel);
                }
            }
            finally
            {
                await RefreshKnowAddressesAsync();
            }
        }
Esempio n. 3
0
        private async Task SendTransactions(TransactionItem[] transactionItems, bool rebroadcast)
        {
            var syncModel = new CancelSyncModel()
            {
                Text = "The transaction is about to send"
            };

            walletModel.SyncModels.Add(syncModel);
            try
            {
                await SendTransactions(transactionItems, syncModel, rebroadcast);
            }
            catch (OperationCanceledException)
            {
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            finally
            {
                walletModel.SyncModels.Remove(syncModel);
            }
        }
Esempio n. 4
0
        private async Task RebroadcastTransactions(TransactionItem[] transactionItems, CancelSyncModel syncModel)
        {
            var api         = CreateIotaClient();
            int count       = 0;
            var transaction = transactionItems.Where(t => long.Parse(t.Value) < 0).FirstOrDefault();

            if (transaction != null)
            {
                bool firstTime = true;
                while (!syncModel.Token.IsCancellationRequested)
                {
                    var existingTransaction = (await api.GetTransactionItems(transaction.Hash)).FirstOrDefault();
                    if (existingTransaction.Persistence)
                    {
                        return;
                    }

                    if (!firstTime)
                    {
                        await Task.Delay(TimeSpan.FromMinutes(3), syncModel.Token);
                    }
                    firstTime = false;

                    if (syncModel.Token.IsCancellationRequested)
                    {
                        return;
                    }

                    existingTransaction = (await api.GetTransactionItems(transaction.Hash)).FirstOrDefault();
                    if (existingTransaction.Persistence)
                    {
                        return;
                    }

                    if (count >= 4)
                    {
                        await SendTransactions(transactionItems, syncModel, true);

                        break;
                    }

                    await api.Rebroadcast(transactionItems, syncModel.Token);

                    count++;
                    syncModel.Text = $"Forced {count} time(s)";
                }
            }
        }
Esempio n. 5
0
        public async Task SendTransfer(NewSendModel sendModel, CancelSyncModel syncModel)
        {
            var addressModels = sendModel.Addresses.ToArray();

            if (addressModels == null || addressModels.Length == 0)
            {
                addressModels = addressesModel.GetAddressModels();
            }

            var addressItems = addressModels.Select(a => a.Tag).OfType <AddressItem>().ToArray();
            var api          = CreateIotaClient();

            long value = 0;

            if (sendModel.Value.HasValue)
            {
                value = (long)Convert.ChangeType(sendModel.Value.Value, typeof(long)); // long.Parse(sendModel.Value.ToString());
            }
            if (value < 0)
            {
                throw new Exception("Value cannot be less than zero");
            }

            var addressToSend = sendModel.Address;

            addressToSend = IotaExtensions.ValidateAddress(addressToSend);
            if (addressToSend.Length == 90)
            {
                addressToSend = Borlay.Iota.Library.Utils.Checksum.RemoveChecksum(addressToSend);
            }


            var transfer = new TransferItem()
            {
                Address = addressToSend,
                Value   = value,
                Tag     = sendModel.MessageTag,
                Message = sendModel.Message
            };

            if (value > 0)
            {
                syncModel.Text = "Renew the balances";
                await api.RenewAddresses(addressItems);

                var filteredAddressItems = addressItems.FilterBalance(value).ToArray();
                var filterReminder       = filteredAddressItems.Select(a => a.Address).ToList();
                filterReminder.Add(addressToSend);

                syncModel.Text = "Searching for the remainder";
                var remainderAddressItem = await GetRemainder(filterReminder.ToArray(), syncModel.Token);


                var transactions = transfer.CreateTransactions(remainderAddressItem.Address, filteredAddressItems).ToArray();
                await SendTransactions(transactions, syncModel, true);
            }
            else
            {
                var transactions = transfer.CreateTransactions().ToArray();
                await SendTransactions(transactions, syncModel, false);
            }
        }