Exemple #1
0
        async Task Restore(ButtonRow arg)
        {
            IsBusy = true;

            var seed      = Hex.FromString(_key.Edit.Text);
            var key       = Key.GenerateEd25519(seed);
            var accountId = long.Parse(_accountId.Edit.Text);
            var name      = _name.Edit.Text;
            var password  = _password1.Edit.Text;

            var result = await WalletApp.RequestRestore(accountId, name, password, key);

            IsBusy = false;

            if (result.ResultType == HeleusClientResultTypes.Ok)
            {
                await MessageAsync("Success");

                await Navigation.PopAsync();
            }
            else
            {
                await ErrorTextAsync(result.GetErrorMessage());
            }
        }
        protected override async Task Submit(ButtonRow button)
        {
            try
            {
                if (!await ConfirmAsync("AuthorizeConfirm"))
                {
                    return;
                }

                var password = _password?.Edit?.Text;
                var chainId  = int.Parse(_chainIdText.Edit.Text);

                IsBusy = true;
                if (!_useCoreAccount)
                {
                    // TODO Join Key Expire
                    UIApp.Run(() => WalletApp.JoinChain(chainId, 0, _chainKey.PublicKey, password));
                }
                else
                {
                    UIApp.Run(() => WalletApp.JoinChainWithCoreAccount(chainId, password));
                }
            }
            catch { }
        }
Exemple #3
0
        public RestorePage() : base("RestorePage")
        {
            EnableStatus();

            AddTitleRow("Title");

            AddHeaderRow("Account");

            _accountId = AddEntryRow(null, "AccountId");
            _accountId.SetDetailViewIcon(Icons.Coins);

            AddSeparatorRow();

            _name = AddEntryRow("", "RegisterPage.Name");
            _name.SetDetailViewIcon(Icons.Pencil);
            _password1 = AddPasswordRow("", "RegisterPage.Password1");
            var password2 = AddPasswordRow("", "RegisterPage.Password2");

            Status.AddBusyView(_accountId);
            Status.Add(_accountId.Edit, T("AccountStatus"), StatusValidators.PositiveNumberValidator);

            Status.Add(_password1.Edit, T("RegisterPage.PasswordStatus", WalletApp.MinPasswordLength), (sv, entry, newText, oldText) =>
            {
                var pw1 = _password1.Edit.Text;
                var pw2 = password2.Edit.Text;

                return(WalletApp.IsValidPassword(pw1) && WalletApp.IsValidPassword(pw2) && pw1 == pw2);
            }).
            AddBusyView(password2);

            AddFooterRow();


            AddHeaderRow("AuthorizeAccountPage.SignatureKey");

            _passphrase = AddEntryRow(null, "AuthorizeAccountPage.Passphrase", ServiceNodeManager.MinimumServiceAccountPassphraseLength);
            var button = AddButtonRow("AuthorizeAccountPage.NewPassphrase", Generate);

            Status.AddBusyView(button);

            _key = AddEditorRow(null, "AuthorizeAccountPage.SignatureKey");
            _key.SetDetailViewIcon(Icons.Key);
            Status.Add(_key.Edit, T("RestoreAccountPage.KeyStatus"), (sv, edit, newText, oldText) =>
            {
                return(StatusValidators.HexValidator(64, sv, edit, newText, oldText));
            });

            AddFooterRow();


            password2.Edit.TextChanged += (sender, e) =>
            {
                Status.ReValidate();
            };

            AddSubmitRow("Restore", Restore);
        }
Exemple #4
0
        protected override async Task Submit(ButtonRow button)
        {
            IsBusy = true;

            var password = _password?.Edit?.Text;

            if (!WalletApp.IsCoreAccountUnlocked)
            {
                if (!await WalletApp.UnlockCoreAccount(password))
                {
                    await ErrorAsync("PasswordWrong");

                    IsBusy = false;

                    return;
                }
            }

            var chainId     = int.Parse(_chainIdText.Edit.Text);
            var coreAccount = WalletApp.CurrentCoreAccount;
            var secretKey   = await PassphraseSecretKeyInfo.NewPassphraseSecretKey(chainId, $"{Hex.ToString(coreAccount.RawData)}.{coreAccount.AccountId}");

            var key = await Task.Run(() => Key.GenerateEd25519(secretKey.SecretHash));

            var encryption = await Task.Run(() => Encryption.GenerateAes256(key.Data, _derivedPassword));

            _keyView.Update(key);

            if (!await ConfirmAsync("AuthorizeConfirm"))
            {
                IsBusy = false;
                return;
            }

            (var response, var publicKey) = await WalletApp.JoinChain(chainId, 0, key.PublicKey, password);

            if (response.TransactionResult == TransactionResultTypes.Ok || response.TransactionResult == TransactionResultTypes.AlreadyJoined)
            {
                var derivedKey = new DerivedKey(coreAccount.AccountId, chainId, publicKey.KeyIndex, encryption);

                var hex = Hex.ToCrcString(derivedKey.ToByteArray());
                _export.Edit.Text = hex;
                UIApp.CopyToClipboard(hex);

                await MessageAsync("SuccessDerived");
            }
            else
            {
                await ErrorTextAsync(response.GetErrorMessage());
            }

            IsBusy = false;
        }
Exemple #5
0
        async Task Unlock(ButtonRow button)
        {
            IsBusy = true;
            var pw      = _unlockPassword?.Edit?.Text;
            var success = await WalletApp.UnlockCoreAccount(pw);

            IsBusy = false;

            if (!success)
            {
                await MessageAsync("UnlockFailed");
            }
        }
        Task Submit(ButtonRow button)
        {
            IsBusy = true;

            var receiver = long.Parse(_receiver.Edit.Text);
            var amount   = Currency.ToHel(decimal.Parse(_amount.Edit.Text));
            var reason   = _reason.Edit.Text;
            var password = _password.Edit.Text;

            _ = WalletApp.TransferCoins(receiver, amount, reason, password);

            return(Task.CompletedTask);
        }
        protected override Task Submit(ButtonRow button)
        {
            var password = _password?.Edit?.Text;
            try
            {
                var purchaseid = int.Parse(_purchaseIdText.Edit.Text);
                _ = WalletApp.Purchase(_chainInfo.ChainId, purchaseid, password);
                IsBusy = true;
            }
            catch { }

            return Task.CompletedTask;
        }
Exemple #8
0
        async Task Submit(ButtonRow button)
        {
            var profileName = _profileName.Edit.Text;
            var realName    = _realName.Edit.Text;
            var bio         = _bio.Edit.Text;
            var items       = new List <ProfileItemJson>();

            if (!string.IsNullOrEmpty(profileName))
            {
                items.Add(new ProfileItemJson {
                    k = ProfileItemJson.ProfileNameItem, v = profileName, p = ProfileItemJson.ProfileNameItem
                });
            }
            if (!string.IsNullOrEmpty(realName))
            {
                items.Add(new ProfileItemJson {
                    k = ProfileItemJson.RealNameItem, v = realName, p = ProfileItemJson.RealNameItem
                });
            }
            if (!string.IsNullOrEmpty(bio))
            {
                items.Add(new ProfileItemJson {
                    k = ProfileItemJson.BioItem, v = bio, p = ProfileItemJson.BioItem
                });
            }

            var rows = GetHeaderSectionRows("EditSection");

            foreach (var row in rows)
            {
                if (row.Tag is ProfileItemJson profileItem)
                {
                    items.Add(profileItem);
                }
            }

            if (ProfileItemJson.ListsEqual(items, _profileData.ProfileJsonItems))
            {
                items = null;
            }

            if (items == null && _imageData == null)
            {
                await MessageAsync("NoChanges");

                return;
            }

            IsBusy = true;
            UIApp.Run(() => WalletApp.UploadProfileData(_imageData, items));
        }
        Task Register(ButtonRow button)
        {
            IsBusy = true;

            var seed = Hex.FromString(_keyRow.Edit.Text);
            var key  = Key.GenerateEd25519(seed);

            var name     = _name.Edit.Text;
            var password = _password1.Edit.Text;

            UIApp.Run(() => WalletApp.RegisterCoreAccount(name, password, key));

            return(Task.CompletedTask);
        }
Exemple #10
0
        protected override async Task Submit(ButtonRow button)
        {
            var info = _revenueInfo;

            if (info == null)
            {
                return;
            }

            var amount = _revenueInfo.TotalRevenue - _revenueInfo.Payout;

            if (await ConfirmTextAsync(T("ConfirmRevenue", Currency.ToString(amount))))
            {
                IsBusy = true;
                UIApp.Run(() => WalletApp.RequestRevenue(info.ChainId, _revenueInfo));
            }
        }
Exemple #11
0
        void AddAccountSection()
        {
            AddHeaderRow("Account");

            if (ToolbarItems.Count == 0)
            {
                ToolbarItems.Add(new ExtToolbarItem(Tr.Get("Common.Refresh"), null, async() =>
                {
                    await WalletApp.UpdateCoreAccountBalance();
                }));
            }

            var lastBalance = WalletApp.LastBalanceEvent;

            _balanceView = new BalanceView();
            AddViewRow(_balanceView);

            AddButtonRow("Transfer", Transfer).SetDetailViewIcon(Icons.CreditCardFront);
            AddButtonRow("RequestRevenue", RequestRevenue).SetDetailViewIcon(Icons.MoneyCheckEdit);
#if DEBUG
            AddButtonRow("Derived", async(button) =>
            {
                await Navigation.PushAsync(new AuthorizeDerivedKeyPage(0, Hex.ToString(new byte[16])));
            });
            AddButtonRow("Join", Join);
            AddButtonRow("Purchase", Purchase);
#endif
            AddSeparatorRow();
            AddButtonRow("ProfilePage.Title", Profile).SetDetailViewIcon(Icons.UserCircle);
            AddButtonRow("ChainOverviewPage.Title", Chain).SetDetailViewIcon(Icons.Link);
            AddButtonRow(HandleRequestPage.HandleRequestTranslation, HandleRequest).SetDetailViewIcon(HandleRequestPage.HandleRequestIcon);

            AddFooterRow();

            AddHeaderRow("Key");
            AddButtonViewRow(new ClientAccountView(WalletApp.CurrentCoreAccount), DisplayKeyAction);
            AddSubmitButtonRow("Export", Export);

            AddFooterRow();
        }
Exemple #12
0
        public ChainKeyPage(ChainPage chainPage, List <ChainKeyItem> chainKeys) : base("ChainKeyPage")
        {
            _chainPage = chainPage;

            AddTitleRow("Title");

            AddHeaderRow("Key");

            _name = AddEntryRow(null, "Name");
            _name.SetDetailViewIcon(Icons.Pencil);

            _key = AddEditorRow(null, "Key");
            _key.SetDetailViewIcon(Icons.Key);

            AddButtonRow("KeyButton", NewKey);

            _keyIndex = AddEntryRow(string.Empty, "KeyIndex");
            _keyIndex.SetDetailViewIcon(Icons.Highlighter);

            AddFooterRow();

            AddHeaderRow("KeyOptions");

            _admin       = AddSwitchRow("Admin");
            _serviceKey  = AddSwitchRow("ServiceKey");
            _serviceVote = AddSwitchRow("ServiceVote");
            _dataKey     = AddSwitchRow("DataKey");
            _dataVote    = AddSwitchRow("DataVote");
            _chainIndex  = AddEntryRow(string.Empty, "ChainIndex");

            _admin.Switch.Toggled = (swt) =>
            {
                if (swt.IsToggled)
                {
                    _serviceKey.Switch.IsToggled  = false;
                    _serviceVote.Switch.IsToggled = false;
                    _dataKey.Switch.IsToggled     = false;
                    _dataVote.Switch.IsToggled    = false;
                    _chainIndex.Edit.Text         = null;
                }
                Status.ReValidate();
            };

            _serviceKey.Switch.Toggled = (swt) =>
            {
                if (swt.IsToggled)
                {
                    _admin.Switch.IsToggled    = false;
                    _dataKey.Switch.IsToggled  = false;
                    _dataVote.Switch.IsToggled = false;
                    _chainIndex.Edit.Text      = null;
                }
                else
                {
                    _serviceVote.Switch.IsToggled = false;
                }
                Status.ReValidate();
            };

            _serviceVote.Switch.Toggled = (swt) =>
            {
                if (swt.IsToggled)
                {
                    _serviceKey.Switch.IsToggled = true;
                }
            };

            _dataKey.Switch.Toggled = (swt) =>
            {
                if (swt.IsToggled)
                {
                    _admin.Switch.IsToggled       = false;
                    _serviceKey.Switch.IsToggled  = false;
                    _serviceVote.Switch.IsToggled = false;
                }
                else
                {
                    _dataVote.Switch.IsToggled = false;
                }
                Status.ReValidate();
            };

            _dataVote.Switch.Toggled = (swt) =>
            {
                if (swt.IsToggled)
                {
                    _dataKey.Switch.IsToggled = true;
                }
            };

            AddFooterRow();

            AddHeaderRow("Password");

            _pw1 = AddEntryRow(string.Empty, "Password");
            _pw1.SetDetailViewIcon(Icons.Unlock);
            _pw2 = AddEntryRow(string.Empty, "Password2");
            _pw2.SetDetailViewIcon(Icons.Unlock);
            _pw1.Edit.IsPassword = _pw2.Edit.IsPassword = true;

            AddFooterRow();

            Status.Add(_key.Edit, T("KeyStatus"), (view, entry, newText, oldtext) =>
            {
                try
                {
                    var key = Key.Restore(entry.Text);
                    return(key.KeyType == Protocol.TransactionKeyType);
                }
                catch { }
                return(false);
            }).
            Add(_keyIndex.Edit, T("KeyIndexStatus", short.MinValue, short.MaxValue), (view, entry, newText, oldText) =>
            {
                if (short.TryParse(newText, out var idx))
                {
                    foreach (var key in chainKeys)
                    {
                        if (key.Item.KeyIndex == idx)
                        {
                            return(false);
                        }
                    }
                    return(true);
                }
                if (!newText.IsNullOrEmpty())
                {
                    entry.Text = oldText;
                }
                return(false);
            }).
            Add(_chainIndex.Edit, T("ChainIndexStatus"), (view, entry, newText, oldText) =>
            {
                if (_dataKey.Switch.IsToggled)
                {
                    return(StatusValidators.PositiveNumberValidatorWithZero(view, entry, newText, oldText));
                }

                if (!string.IsNullOrEmpty(newText))
                {
                    entry.Text = null;
                }

                return(true);
            }).
            Add(_name.Edit, T("NameStatus"), (view, entry, newText, oldtext) =>
            {
                return(!newText.IsNullOrWhiteSpace());
            }).
            Add(_pw1.Edit, T("PasswordStatus", WalletApp.MinPasswordLength), (view, entry, newText, oldtext) =>
            {
                var pw1 = _pw1.Edit.Text;
                var pw2 = _pw2.Edit.Text;

                return(WalletApp.IsValidPassword(pw1) && WalletApp.IsValidPassword(pw2) && pw1 == pw2);
            });

            _pw2.Edit.TextChanged += (sender, e) =>
            {
                Status.ReValidate();
            };

            AddSubmitRow("Submit", Submit);
        }
Exemple #13
0
 void UnlockPasswordChanged(object sender, Xamarin.Forms.TextChangedEventArgs e)
 {
     _unlockButton.IsEnabled = WalletApp.IsValidPassword(_unlockPassword.Edit.Text);
 }
        public RegisterPage() : base("RegisterPage")
        {
            EnableStatus();

            Subscribe <CoreAccountRegisterEvent>(AccountRegistered);

            AddTitleRow("Title");

            AddHeaderRow("NewAccount");

            _name = AddEntryRow("", "Name");
            _name.SetDetailViewIcon(Icons.Pencil);
            _password1 = AddPasswordRow("", "Password1");
            var password2 = AddPasswordRow("", "Password2");

            Status.Add(_password1.Edit, T("PasswordStatus", WalletApp.MinPasswordLength), (sv, entry, newText, oldText) =>
            {
                var pw1 = _password1.Edit.Text;
                var pw2 = password2.Edit.Text;

                return(WalletApp.IsValidPassword(pw1) && WalletApp.IsValidPassword(pw2) && pw1 == pw2);
            }).
            AddBusyView(password2);

            AddFooterRow();


            AddHeaderRow();

            AddLinkRow("Common.DataLicence", Tr.Get("Link.DataLicence"));
            var _agree = AddSwitchRow("Agree", Tr.Get("Common.DataLicence"));

            AddFooterRow();

            Status.

            Add(_agree.Switch, T("AgreeStatus", Tr.Get("Common.DataLicence")), StatusValidators.IsToggled);

            password2.Edit.TextChanged += (sender, e) =>
            {
                Status.ReValidate();
            };

            AddSubmitRow("Register", Register);

            AddHeaderRow("SignatureKeyInfo");

            _selectionRow = AddSelectionRows(new SelectionItemList <AuthorizeType>
            {
                new SelectionItem <AuthorizeType>(AuthorizeType.Random, Tr.Get("AuthorizeType.Random")),
                new SelectionItem <AuthorizeType>(AuthorizeType.Passphrase, Tr.Get("AuthorizeType.Passphrase"))
            }, AuthorizeType.Random);
            _selectionRow.SelectionChanged = SecretTypeChanged;

            AddSeparatorRow();

            _keyRow = AddEditorRow("", "SignatureKey");
            _keyRow.SetDetailViewIcon(Icons.Key);

            Status.Add(_keyRow.Edit, T("AuthorizeAccountPage.KeyStatus"), (sv, edit, newText, oldText) =>
            {
                return(StatusValidators.HexValidator(64, sv, edit, newText, oldText));
            });

            AddInfoRow("AuthorizeAccountPage.SignatureKeyInfo");

            AddFooterRow();

            AddHeaderRow();
            AddLinkRow("Common.TermsOfUse", Tr.Get("Link.TermsOfUse"));
            AddLinkRow("Common.Privacy", Tr.Get("Link.Privacy"));
            AddFooterRow();

            IsBusy = true;
            Update();
        }
 void Download(bool queryOlder = false)
 {
     IsBusy = true;
     UIApp.Run(() => WalletApp.DownloadCoreAccountTransaction(queryOlder));
 }
Exemple #16
0
        Task Submit(ButtonRow button)
        {
            var name    = _name.Edit.Text;
            var webSite = _website.Edit.Text;

            var keys             = new List <WalletClient.ChainKey>();
            var revokedKeys      = new List <short>();
            var endPoints        = new List <Uri>();
            var removedEndPoints = new List <Uri>();
            var purchases        = new List <PurchaseInfo>();
            var revokedPurchases = new List <int>();

            foreach (var chainKey in _chainKeys)
            {
                if (chainKey.Status == ChainItemStatus.New)
                {
                    keys.Add(new WalletClient.ChainKey(chainKey.Key, chainKey.Item, chainKey.Name, chainKey.Password));
                }
                else if (chainKey.Status == ChainItemStatus.Revoked)
                {
                    revokedKeys.Add(chainKey.Item.KeyIndex);
                }
            }

            foreach (var endPoint in _endPoints)
            {
                if (endPoint.Status == ChainItemStatus.New)
                {
                    endPoints.Add(new Uri(endPoint.Item));
                }
                else if (endPoint.Status == ChainItemStatus.Revoked)
                {
                    removedEndPoints.Add(new Uri(endPoint.Item));
                }
            }

            foreach (var purchase in _purchases)
            {
                if (purchase.Status == ChainItemStatus.New)
                {
                    purchases.Add(purchase.Item);
                }
                else if (purchase.Status == ChainItemStatus.Revoked)
                {
                    revokedPurchases.Add(purchase.Item.PurchaseItemId);
                }
            }

            if (ChainInfo == null)
            {
                _ = WalletApp.RegisterChain(name, webSite, keys.ToArray(), endPoints.ToArray(), purchases.ToArray());
            }
            else
            {
                if (keys.Count == 0 && endPoints.Count == 0 && purchases.Count == 0 && revokedKeys.Count == 0 && removedEndPoints.Count == 0 && revokedPurchases.Count == 0)
                {
                    Message("NoChanges");
                    return(Task.CompletedTask);
                }

                var password = _keyPassword.Edit.Text;
                _ = WalletApp.UpdateChain(_chainKey, password, name, webSite, keys.ToArray(), endPoints.ToArray(), purchases.ToArray(), revokedKeys.ToArray(), removedEndPoints.ToArray(), revokedPurchases.ToArray());
            }

            IsBusy = true;

            return(Task.CompletedTask);
        }
 public static bool HeleusPasswordValidator(StatusView statusView, ExtEntry edit, string newText, string oldText)
 {
     return(WalletApp.IsValidPassword(newText));
 }
Exemple #18
0
        public void Init()
        {
            SchemeAction.SchemeParser = (host, segments) =>
            {
                var action     = string.Empty;
                var startIndex = 0;

                if (host == "heleuscore.com" && segments[1] == "heleus/")
                {
                    if (segments[2] == "request/")
                    {
                        action     = SchemeAction.GetString(segments, 3);
                        startIndex = 4;
                    }
                }

                return(new Tuple <string, int>(action, startIndex));
            };

            SchemeAction.RegisterSchemeAction <TransferCoinsSchemeAction>();
            SchemeAction.RegisterSchemeAction <RequestRevenueSchemeAction>();
            SchemeAction.RegisterSchemeAction <AuthorizeServiceSchemeAction>();
            SchemeAction.RegisterSchemeAction <AuthorizeServiceDerivedSchemeAction>();
            SchemeAction.RegisterSchemeAction <ViewTransactionsSchemeAction>();
            SchemeAction.RegisterSchemeAction <ViewProfileSchemeAction>();
            SchemeAction.RegisterSchemeAction <AuthorizePurchaseSchemeAction>();
            SchemeAction.RegisterSchemeAction <EditProfileSchemeAction>();

            WalletApp.Init();

            if (IsAndroid || IsUWP || IsDesktop)
            {
                var      masterDetail = new ExtMasterDetailPage();
                var      navigation   = new ExtNavigationPage(new Apps.HeleusApp.Page.Account.AccountPage());
                MenuPage menu         = null;

                if (IsAndroid)
                {
                    menu = new AndroidMenuPage(masterDetail, navigation);
                }
                else if (IsUWP)
                {
                    menu = new UWPMenuPage(masterDetail, navigation);
                }
                else if (IsDesktop)
                {
                    menu = new DesktopMenuPage(masterDetail, navigation);
                }

                menu.AddPage(typeof(Apps.HeleusApp.Page.Account.AccountPage), "AccountPage.Title", Icons.Coins);
                menu.AddPage(typeof(Apps.HeleusApp.Page.Profile.ProfilePage), "ProfilePage.Title", Icons.UserCircle);
                menu.AddPage(typeof(TransactionsPage), "TransactionsPage.Title", Icons.History);
                menu.AddPage(typeof(SettingsPage), "SettingsPage.Title", Icons.Slider);

                masterDetail.Master = menu;
                masterDetail.Detail = navigation;

                MainPage = MainMasterDetailPage = masterDetail;
            }
            else if (IsIOS)
            {
                var tabbed = new ExtTabbedPage();

                tabbed.AddPage(typeof(Apps.HeleusApp.Page.Account.AccountPage), "AccountPage.Title", "icons/coins.png");
                tabbed.AddPage(typeof(Apps.HeleusApp.Page.Profile.ProfilePage), "ProfilePage.Title", "icons/usercircle.png");
                tabbed.AddPage(typeof(TransactionsPage), "TransactionsPage.Title", "icons/history.png");
                tabbed.AddPage(typeof(SettingsPage), "SettingsPage.Title", "icons/sliders.png");

                MainPage = MainTabbedPage = tabbed;
            }
        }