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); } }
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(); } }
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); } }
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)"; } } }
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); } }