From 55b55f5c2f8c12cff12ebe2bc701b1f335fd0c31 Mon Sep 17 00:00:00 2001 From: ericson Date: Wed, 19 Apr 2023 17:22:50 +0700 Subject: [PATCH] implement support eToken path 899 --- .../add/create-wallet/create-wallet.html | 100 ++++++++++-------- .../add/create-wallet/create-wallet.scss | 32 ++++++ .../pages/add/create-wallet/create-wallet.ts | 35 ++++-- .../add/import-wallet/import-wallet.html | 2 +- .../wallet-settings/wallet-settings.html | 4 + .../wallet-settings/wallet-settings.ts | 6 ++ src/app/providers/persistence/persistence.ts | 9 ++ src/app/providers/profile/profile.ts | 61 +++++++---- src/assets/i18n/en.po | 4 +- src/assets/i18n/vi.po | 2 +- 10 files changed, 183 insertions(+), 72 deletions(-) diff --git a/src/app/pages/add/create-wallet/create-wallet.html b/src/app/pages/add/create-wallet/create-wallet.html index 3eece3bf7f6..87dc6b5c3f3 100755 --- a/src/app/pages/add/create-wallet/create-wallet.html +++ b/src/app/pages/add/create-wallet/create-wallet.html @@ -164,48 +164,64 @@ -
- - eToken Path - - -
-
- Only select path m'/44'/1899'/0 for #Saving4Lotus or #Hold2Earn programs -
-
- - - - - -
-

{{ 'Single Address' | translate }}

- -
-
- The single address feature will force the account to only use one address rather than - generating new addresses. -
- Learn More -
-
+ *ngIf="!isShared && (this.coin === 'xpi' || this.coin === 'xec')"> +
+ + eToken Account + + +
+ + + + + + + + {{ opt.label }} + + + + + + + + + + + + +
+

{{ 'Single Address' | translate }}

+ +
+
+ The single address feature will force the account to only use one address rather than + generating new addresses. +
+ Learn More +
+
diff --git a/src/app/pages/add/create-wallet/create-wallet.scss b/src/app/pages/add/create-wallet/create-wallet.scss index cb985e7268c..aff36f889bc 100755 --- a/src/app/pages/add/create-wallet/create-wallet.scss +++ b/src/app/pages/add/create-wallet/create-wallet.scss @@ -194,4 +194,36 @@ page-create-wallet { .wide-header__title { --min-height: 72px; } + + .choose-path-section { + --inner-padding-end: 0; + --inner-padding-bottom: 0 !important; + .choose-path-list { + width: 100%; + background: transparent; + ion-radio-group { + ion-item { + margin: 0 1rem !important; + box-shadow: none !important; + ion-label { + font-size: 14px !important; + } + &:last-child { + --inner-border-width: 0 !important; + } + } + } + .option-line-info { + padding: 0 0 1rem 1rem; + font-size: 13px; + font-weight: 400; + color: rgba(0, 30, 46, 0.6); + a { + padding-top: 13px; + font-size: 14px; + color: #00658d; + } + } + } + } } diff --git a/src/app/pages/add/create-wallet/create-wallet.ts b/src/app/pages/add/create-wallet/create-wallet.ts index d172dd5aea6..54b2e547cf1 100755 --- a/src/app/pages/add/create-wallet/create-wallet.ts +++ b/src/app/pages/add/create-wallet/create-wallet.ts @@ -76,6 +76,16 @@ export class CreateWalletPage implements OnInit { public cancelText: string; public createForm: FormGroup; public currentTheme: string; + public eTokenPathOpts = [ + { + id: '1899', + label: this.translate.instant(`m'/44'/1899'`), + }, + { + id: '899', + label: this.translate.instant(`m'/44'/899'`), + } + ]; public multisigAddresses: string[]; public invalidAddress: boolean; @@ -146,11 +156,12 @@ export class CreateWalletPage implements OnInit { derivationPath: [this.derivationPathByDefault], testnetEnabled: [false], useNativeSegwit: [false], - singleAddress: [false], + singleAddress: [this.coin === 'xec' ? true : false], + eTokenPath: [this.coin === 'xec' ? this.eTokenPathOpts[0].id : null], coin: [null, Validators.required] }); this.createForm.controls['coin'].setValue(this.coin); - + this.isSlpToken = true ? this.coin === 'xec' : false; if (this.coin === 'btc' || this.coin === 'ltc') this.createForm.controls['useNativeSegwit'].setValue(true); @@ -231,6 +242,11 @@ export class CreateWalletPage implements OnInit { this.createForm.controls['recoveryPhrase'].setValue(null); } + public eTokenPathOptionsChange(eTokenId): void { + this.createForm.controls['eTokenPath'].setValue(eTokenId); + this.changeSlpPath(null, true); + } + public setDerivationPath(): void { const path: string = this.createForm.value.testnet ? this.derivationPathForTestnet @@ -258,7 +274,10 @@ export class CreateWalletPage implements OnInit { : this.createForm.value.singleAddress, coin: this.createForm.value.coin }; - + + // Support eToken for path 899 + const isPath899 = this.createForm.value.eTokenPath === '899'; + if (isPath899 && this.isSlpToken) opts['isPath899'] = isPath899; const setSeed = this.createForm.value.selectedSeed == 'set'; opts['setSeed'] = setSeed; if (setSeed) { @@ -561,11 +580,13 @@ export class CreateWalletPage implements OnInit { } } - changeSlpPath(event) { - this.isSlpToken = event.detail.checked; - if (event.detail.checked) { + changeSlpPath(event, isChange?: boolean) { + const isPath899 = this.createForm.controls['eTokenPath'].value === '899'; + this.isSlpToken = event?.detail?.checked || isChange; + if (event?.detail?.checked || isChange) { this.createForm.controls['walletName'].setValue(this.createForm.controls['walletName'].value.replace(" - 145", "")); - this.createForm.controls['walletName'].setValue(this.createForm.controls['walletName'].value + " - 1899"); + this.createForm.controls['walletName'].setValue(this.createForm.controls['walletName'].value.replace(" - 1899", "")); + if (!isPath899 || this.coin === 'xpi') this.createForm.controls['walletName'].setValue(this.createForm.controls['walletName'].value + " - 1899"); this.createForm.controls['singleAddress'].setValue(true); this.isFromRaipay = false; } diff --git a/src/app/pages/add/import-wallet/import-wallet.html b/src/app/pages/add/import-wallet/import-wallet.html index f1058ebc98d..70b867532bd 100644 --- a/src/app/pages/add/import-wallet/import-wallet.html +++ b/src/app/pages/add/import-wallet/import-wallet.html @@ -91,7 +91,7 @@ - eToken Path + eToken Account diff --git a/src/app/pages/settings/wallet-settings/wallet-settings.html b/src/app/pages/settings/wallet-settings/wallet-settings.html index 07b65606b64..61b80c984ce 100644 --- a/src/app/pages/settings/wallet-settings/wallet-settings.html +++ b/src/app/pages/settings/wallet-settings/wallet-settings.html @@ -17,6 +17,10 @@ {{'Hide Account' | translate }} + + {{'Hide eToken Account' | translate }} + +
The account won't be removed from this device. You can hide it whenever you need it. diff --git a/src/app/pages/settings/wallet-settings/wallet-settings.ts b/src/app/pages/settings/wallet-settings/wallet-settings.ts index 9a7d5424416..8acef7e04a8 100644 --- a/src/app/pages/settings/wallet-settings/wallet-settings.ts +++ b/src/app/pages/settings/wallet-settings/wallet-settings.ts @@ -201,6 +201,12 @@ export class WalletSettingsPage { this.events.publish('Local/GetData', true); } + public hiddenETokenWalletChange(walletId: string): void { + if (!walletId) return; + this.profileProvider.toggleHideETokenWalletFlag(walletId); + this.events.publish('Local/GetData', true); + } + public openWalletGroupDelete(): void { this.router.navigate(['/wallet-delete'], { state: { diff --git a/src/app/providers/persistence/persistence.ts b/src/app/providers/persistence/persistence.ts index 1c9781cf020..57b22da2a6c 100644 --- a/src/app/providers/persistence/persistence.ts +++ b/src/app/providers/persistence/persistence.ts @@ -61,6 +61,7 @@ const Keys = { HIDE_BALANCE: walletId => 'hideBalance-' + walletId, TOTAL_BALANCE: 'totalBalance', HIDE_WALLET: walletId => 'hideWallet-' + walletId, + HIDE_ETOKEN_WALLET: walletId => 'hideETokenWallet-' + walletId, KEY_ONBOARDING: 'keyOnboarding', KEYS: 'keys', LAST_ADDRESS: walletId => 'lastAddress-' + walletId, @@ -353,10 +354,18 @@ export class PersistenceProvider { return this.storage.set(Keys.HIDE_WALLET(walletId), val); } + setHideETokenWalletFlag(walletId: string, val) { + return this.storage.set(Keys.HIDE_ETOKEN_WALLET(walletId), val); + } + getHideWalletFlag(walletId: string) { return this.storage.get(Keys.HIDE_WALLET(walletId)); } + getHideETokenWalletFlag(walletId: string) { + return this.storage.get(Keys.HIDE_ETOKEN_WALLET(walletId)); + } + setDisclaimerAccepted() { return this.storage.set(Keys.AGREE_DISCLAIMER, true); } diff --git a/src/app/providers/profile/profile.ts b/src/app/providers/profile/profile.ts index 64c4b3af77c..45ff132b480 100644 --- a/src/app/providers/profile/profile.ts +++ b/src/app/providers/profile/profile.ts @@ -474,6 +474,24 @@ export class ProfileProvider { }); } + private isETokenWalletHidden(wallet): Promise { + return new Promise(resolve => { + this.persistenceProvider + .getHideETokenWalletFlag(wallet.credentials.walletId) + .then(shouldHideETokenWallet => { + let isHidden = + shouldHideETokenWallet && shouldHideETokenWallet.toString() == 'false' + ? false + : true; + if (!wallet?.credentials?.isSlpToken) isHidden = false; + return resolve(isHidden); + }) + .catch(err => { + this.logger.error(err); + }); + }); + } + private coinSupported(coin): boolean { const availableCoin = this.currencyProvider .getAvailableCoins() @@ -514,7 +532,7 @@ export class ProfileProvider { wallet.balanceHidden = await this.isBalanceHidden(wallet); wallet.order = await this.getWalletOrder(wallet.id); wallet.hidden = await this.isWalletHidden(wallet); - wallet.isSlpToken = wallet.credentials.isSlpToken; + wallet.isSlpToken = await this.isETokenWalletHidden(wallet); wallet.lastAddress = await this.persistenceProvider.getLastAddress( walletId ); @@ -1712,6 +1730,7 @@ export class ProfileProvider { addressType: opts.addressType, isSlpToken: opts.isSlpToken, isFromRaipay: opts.isFromRaipay, + isPath899: opts.isPath899, n: opts.n || 1 }) ); @@ -1737,7 +1756,8 @@ export class ProfileProvider { network, account: opts.account || 0, n: opts.n || 1, - isSlpToken: opts.isSlpToken + isSlpToken: opts.isSlpToken, + isPath899: opts.isPath899 }) ); if (opts.duplicateKeyId) { @@ -1778,7 +1798,8 @@ export class ProfileProvider { account: opts.account || 0, n: opts.n || 1, isSlpToken: opts.isSlpToken, - isFromRaipay: opts.isFromRaipay + isFromRaipay: opts.isFromRaipay, + isPath899: opts.isPath899 }) ); } catch (e) { @@ -1792,7 +1813,8 @@ export class ProfileProvider { network, account: opts.account || 0, n: opts.n || 1, - isSlpToken: opts.isSlpToken + isSlpToken: opts.isSlpToken, + isPath899: opts.isPath899 }) ); } else { @@ -1840,7 +1862,8 @@ export class ProfileProvider { coin: opts.coin, useNativeSegwit: opts.useNativeSegwit, isSlpToken: opts.isSlpToken, - isFromRaipay: opts.isFromRaipay + isFromRaipay: opts.isFromRaipay, + isPath899: opts.isPath899 }, err => { const copayerRegistered = @@ -1853,20 +1876,6 @@ export class ProfileProvider { this.translate.instant('Error creating account') ); return reject(msg); - } else if (copayerRegistered && opts.isSlpToken) { - if (!opts.isFromRaipay) { - return reject( - this.translate.instant( - 'Only one slp Token wallet can be created' - ) - ); - } else { - return reject( - this.translate.instant( - 'Only one wallet path 145 can be created' - ) - ); - } } else if (copayerRegistered) { // try with account + 1 opts.account = opts.account ? opts.account + 1 : 1; @@ -2638,6 +2647,20 @@ export class ProfileProvider { }; } + public toggleHideETokenWalletFlag(walletId: string): void { + this.wallet[walletId].isSlpToken = !this.wallet[walletId].isSlpToken; + this.persistenceProvider.setHideETokenWalletFlag( + walletId, + this.wallet[walletId].isSlpToken + ); + this.setOrderedWalletsByGroup(); // Update Ordered Wallet List + this.keyChange = { + isStatus: true, + isDelete: false, + keyId: this.wallet[walletId].keyId + }; + } + public getTxps(opts): Promise { return new Promise((resolve, reject) => { const MAX = 100; diff --git a/src/assets/i18n/en.po b/src/assets/i18n/en.po index 433d19c9fe6..2f3302aee90 100755 --- a/src/assets/i18n/en.po +++ b/src/assets/i18n/en.po @@ -1284,8 +1284,8 @@ msgstr "Derivation Path" msgid "Derivation path" msgstr "Derivation path" -msgid "eToken Path" -msgstr "eToken Path" +msgid "eToken Account" +msgstr "eToken Account" msgid "Only select path m'/44'/1899'/0 for #Saving4Lotus or #Hold2Earn programs" msgstr "Only select path m'/44'/1899'/0 for #Saving4Lotus or #Hold2Earn programs" diff --git a/src/assets/i18n/vi.po b/src/assets/i18n/vi.po index 26113f5480e..690a9dcf9e7 100644 --- a/src/assets/i18n/vi.po +++ b/src/assets/i18n/vi.po @@ -1308,7 +1308,7 @@ msgstr "Do nhu cầu cao, phí thợ đào tăng. Phí này được trả cho t msgid "Derivation path" msgstr "Đường dẫn xuất" -msgid "eToken Path" +msgid "eToken Account" msgstr "Đường dẫn xuất eToken" msgid "Only select path m'/44'/1899'/0 for #Saving4Lotus or #Hold2Earn programs"