-
-
- {translations.transaction}
-
-
- {type}
-
+ fiatCurrencyCode,
+ fiatCurrencyPrice,
+ coinSymbol
+}: DappTransactionProps): React.ReactElement => {
+ const { t } = useTranslate();
+ return (
+
+
+ {errorMessage &&
}
+
+ {type === Wallet.Cip30TxType.Mint && mintedAssets?.length > 0 && (
+ <>
+
+ {mintedAssets.map((asset) => (
+
+ ))}
+ >
+ )}
+ {type === Wallet.Cip30TxType.Burn && burnedAssets?.length > 0 && (
+ <>
+ 0 ? undefined : t('package.core.dappTransaction.transaction')}
+ subtitle={t('package.core.dappTransaction.burn')}
+ />
+ {burnedAssets.map((asset) => (
+
+ ))}
+ >
+ )}
+ {type === Wallet.Cip30TxType.Send && (
+ <>
+
+ {outputs.map((output) => (
+
+ ))}
+ >
+ )}
+ {fee && fee !== '-' && (
+
+ `${Wallet.util.convertAdaToFiat({ ada, fiat: fiatCurrencyPrice })} ${fiatCurrencyCode}`
+ }
+ coinSymbol={coinSymbol}
+ />
+ )}
- {outputs.map((output) => (
-
-
-
- {translations.amount}
-
-
-
- {output.coins.toString()} ADA
-
- {outputs.length === 1 && (
-
- {translations.fee}: {fee.toString()} ADA
-
- )}
- {output.assets &&
- output.assets.map((asset) => (
-
- {asset.amount} {asset.ticker || asset.name}
-
- ))}
-
-
-
-
- {translations.recipient}
-
-
-
-
-
-
- ))}
- {outputs.length > 1 && (
-
-
- {translations.fee}: {fee.toString()} ADA
-
-
- )}
-
-);
+ );
+};
diff --git a/packages/core/src/ui/components/DappTransaction/DappTxAsset/DappTxAsset.module.scss b/packages/core/src/ui/components/DappTransaction/DappTxAsset/DappTxAsset.module.scss
new file mode 100644
index 0000000000..0d5bf78af1
--- /dev/null
+++ b/packages/core/src/ui/components/DappTransaction/DappTxAsset/DappTxAsset.module.scss
@@ -0,0 +1,41 @@
+@import '../../../styles/theme.scss';
+@import '../../../../../../common/src/ui/styles/abstracts/_typography.scss';
+
+.body {
+ display: flex;
+ flex-direction: column;
+ gap: size_unit(3);
+ background-color: var(--light-mode-light-grey, var(--dark-mode-grey, #f9f9f9));
+ border-radius: size_unit(2);
+ padding: size_unit(2);
+
+ .detail {
+ @include text-body-semi-bold;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .title {
+ color: var(--text-color-primary);
+ line-height: 1;
+ }
+
+ .value {
+ display: flex;
+ max-width: 50%;
+ align-items: flex-end;
+ flex-direction: column;
+ gap: size_unit(2);
+
+ font-size: var(--bodySmall);
+ font-weight: 500;
+ line-height: 1;
+ /* Secondary - Black */
+ color: var(--text-color-primary);
+ }
+
+ .ellipsis > p {
+ margin: 0;
+ }
+ }
+}
diff --git a/packages/core/src/ui/components/DappTransaction/DappTxAsset/DappTxAsset.tsx b/packages/core/src/ui/components/DappTransaction/DappTxAsset/DappTxAsset.tsx
new file mode 100644
index 0000000000..b775403436
--- /dev/null
+++ b/packages/core/src/ui/components/DappTransaction/DappTxAsset/DappTxAsset.tsx
@@ -0,0 +1,23 @@
+import React from 'react';
+import styles from './DappTxAsset.module.scss';
+import { Ellipsis } from '@lace/common';
+import { useTranslate } from '@src/ui/hooks';
+import { Wallet } from '@lace/cardano';
+
+export const DappTxAsset = ({ amount, name, ticker }: Wallet.Cip30SignTxAssetItem): React.ReactElement => {
+ const { t } = useTranslate();
+ return (
+
+
+
{t('package.core.dappTransaction.asset')}
+
+
+
+
+
+
{t('package.core.dappTransaction.quantity')}
+
{amount}
+
+
+ );
+};
diff --git a/packages/core/src/ui/components/DappTransaction/DappTxAsset/index.ts b/packages/core/src/ui/components/DappTransaction/DappTxAsset/index.ts
new file mode 100644
index 0000000000..3418661f1c
--- /dev/null
+++ b/packages/core/src/ui/components/DappTransaction/DappTxAsset/index.ts
@@ -0,0 +1 @@
+export { DappTxAsset } from './DappTxAsset';
diff --git a/packages/core/src/ui/components/DappTransaction/DappTxHeader/DappTxHeader.module.scss b/packages/core/src/ui/components/DappTransaction/DappTxHeader/DappTxHeader.module.scss
new file mode 100644
index 0000000000..94eefef49f
--- /dev/null
+++ b/packages/core/src/ui/components/DappTransaction/DappTxHeader/DappTxHeader.module.scss
@@ -0,0 +1,27 @@
+@import '../../../styles/theme.scss';
+@import '../../../../../../common/src/ui/styles/abstracts/_typography.scss';
+
+.header {
+ font-size: var(--bodyLarge);
+ letter-spacing: -0.015em;
+ margin-bottom: size_unit(1);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .title {
+ font-weight: 600;
+ line-height: size_unit(3);
+ /* or 133% */
+ /* Secondary - Black */
+ color: var(--text-color-primary);
+ }
+ .type {
+ font-weight: 500;
+ line-height: size_unit(4);
+ /* or 178% */
+ text-align: right;
+ /* Primary - Purple */
+ color: var(--primary-default, #7f5af0);
+ }
+}
diff --git a/packages/core/src/ui/components/DappTransaction/DappTxHeader/DappTxHeader.tsx b/packages/core/src/ui/components/DappTransaction/DappTxHeader/DappTxHeader.tsx
new file mode 100644
index 0000000000..8117fcd3e0
--- /dev/null
+++ b/packages/core/src/ui/components/DappTransaction/DappTxHeader/DappTxHeader.tsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import styles from './DappTxHeader.module.scss';
+
+export interface DappTxHeaderProps {
+ title?: string;
+ subtitle?: string;
+}
+
+export const DappTxHeader = (props: DappTxHeaderProps): React.ReactElement => (
+
+
+ {props?.title ?? ''}
+
+ {props?.subtitle && (
+
+ {props.subtitle}
+
+ )}
+
+);
diff --git a/packages/core/src/ui/components/DappTransaction/DappTxOutput/DappTxOutput.module.scss b/packages/core/src/ui/components/DappTransaction/DappTxOutput/DappTxOutput.module.scss
new file mode 100644
index 0000000000..04c3b12f0a
--- /dev/null
+++ b/packages/core/src/ui/components/DappTransaction/DappTxOutput/DappTxOutput.module.scss
@@ -0,0 +1,67 @@
+@import '../../../styles/theme.scss';
+@import '../../../../../../common/src/ui/styles/abstracts/_typography.scss';
+
+.body {
+ display: flex;
+ flex-direction: column;
+ gap: size_unit(3);
+ background-color: var(--light-mode-light-grey, var(--dark-mode-grey, #f9f9f9));
+ border-radius: size_unit(2);
+ padding: size_unit(2);
+}
+
+.detail {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+
+ > * {
+ display: flex;
+ flex: 0 1 50%;
+ min-width: 0;
+ }
+
+ .title {
+ font-weight: 500;
+ font-size: var(--body);
+ line-height: size_unit(3);
+ /* or 150% */
+ /* Secondary - Black */
+ color: var(--text-color-primary);
+ text-align: right;
+ }
+ .value {
+ display: flex;
+ align-items: flex-end;
+ flex-direction: column;
+ gap: size_unit(2);
+
+ font-size: var(--bodySmall);
+ font-weight: 500;
+ line-height: size_unit(2);
+ /* Secondary - Black */
+ color: var(--text-color-primary);
+
+ .bold {
+ font-weight: 600;
+ line-height: size_unit(3);
+ font-size: var(--body);
+ word-break: break-all;
+ }
+
+ .rightAligned {
+ text-align: right;
+ > div {
+ justify-content: flex-end;
+ }
+ div,
+ p {
+ text-align: right;
+ }
+ }
+ }
+}
+
+:global(.__react_component_tooltip) {
+ @include tooltip-default;
+}
diff --git a/packages/core/src/ui/components/DappTransaction/DappTxOutput/DappTxOutput.tsx b/packages/core/src/ui/components/DappTransaction/DappTxOutput/DappTxOutput.tsx
new file mode 100644
index 0000000000..9eccd4e0e7
--- /dev/null
+++ b/packages/core/src/ui/components/DappTransaction/DappTxOutput/DappTxOutput.tsx
@@ -0,0 +1,42 @@
+import React from 'react';
+import { Ellipsis } from '@lace/common';
+import styles from './DappTxOutput.module.scss';
+import { useTranslate } from '@src/ui/hooks';
+import { Wallet } from '@lace/cardano';
+
+export interface DappTxOutputProps {
+ coins: string;
+ recipient: string;
+ assets?: Wallet.Cip30SignTxAssetItem[];
+}
+
+export const DappTxOutput = ({ recipient, coins, assets }: DappTxOutputProps): React.ReactElement => {
+ const { t } = useTranslate();
+ return (
+
+
+
+ {t('package.core.dappTransaction.sending')}
+
+
+
+ {coins.toString()} ADA
+
+ {assets?.map((asset) => (
+
+ {asset.amount} {asset.ticker || asset.name}
+
+ ))}
+
+
+
+
+ {t('package.core.dappTransaction.recipient')}
+
+
+
+
+
+
+ );
+};
diff --git a/packages/core/src/ui/lib/translations/en.json b/packages/core/src/ui/lib/translations/en.json
index c73e862cbd..7336752ffd 100644
--- a/packages/core/src/ui/lib/translations/en.json
+++ b/packages/core/src/ui/lib/translations/en.json
@@ -100,6 +100,18 @@
"noMatchPassword": "Oops! The passwords don't match.",
"secondLevelPasswordStrengthFeedback": "Getting there! Add some symbols and numbers to make it stronger.",
"firstLevelPasswordStrengthFeedback": "Weak password. Add some numbers and characters to make it stronger."
+ },
+ "dappTransaction": {
+ "asset": "Asset",
+ "burn": "Burn",
+ "fee": "Transaction Fee",
+ "insufficientFunds": "You do not have enough funds to complete the transaction",
+ "mint": "Mint",
+ "quantity": "Quantity",
+ "recipient": "Recipient",
+ "send": "Send",
+ "sending": "Sending",
+ "transaction": "Transaction"
}
}
}
diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json
index 4af33bf873..55746c84ac 100755
--- a/packages/e2e-tests/package.json
+++ b/packages/e2e-tests/package.json
@@ -34,14 +34,14 @@
"@types/flat": "5.0.2",
"@typescript-eslint/eslint-plugin": "6.0.0",
"@typescript-eslint/parser": "6.0.0",
- "@wdio/allure-reporter": "8.24.0",
- "@wdio/cli": "8.24.0",
- "@wdio/config": "8.24.0",
- "@wdio/cucumber-framework": "8.24.0",
- "@wdio/devtools-service": "8.24.0",
- "@wdio/local-runner": "8.24.0",
- "@wdio/spec-reporter": "8.24.0",
- "@wdio/types": "8.24.0",
+ "@wdio/allure-reporter": "8.20.0",
+ "@wdio/cli": "8.20.0",
+ "@wdio/config": "8.20.0",
+ "@wdio/cucumber-framework": "8.20.0",
+ "@wdio/devtools-service": "8.20.0",
+ "@wdio/local-runner": "8.20.0",
+ "@wdio/spec-reporter": "8.20.0",
+ "@wdio/types": "8.20.0",
"allure-commandline": "2.24.1",
"clipboardy": "2.3.0",
"eslint": "8.38.0",
@@ -53,6 +53,6 @@
"ts-node": "10.9.1",
"typescript": "4.9.5",
"wdio-intercept-service": "4.4.0",
- "webdriverio": "8.24.0"
+ "webdriverio": "8.20.0"
}
}
diff --git a/packages/e2e-tests/src/assert/dAppConnectorAssert.ts b/packages/e2e-tests/src/assert/dAppConnectorAssert.ts
index f19c85e0c4..cf484e4124 100644
--- a/packages/e2e-tests/src/assert/dAppConnectorAssert.ts
+++ b/packages/e2e-tests/src/assert/dAppConnectorAssert.ts
@@ -289,13 +289,19 @@ class DAppConnectorAssert {
await ConfirmTransactionPage.transactionAmountTitle.waitForDisplayed();
expect(await ConfirmTransactionPage.transactionAmountTitle.getText()).to.equal(
- await t('dapp.confirm.details.amount')
+ await t('package.core.dappTransaction.sending', 'core')
);
await ConfirmTransactionPage.transactionAmountValue.waitForDisplayed();
expect(await ConfirmTransactionPage.transactionAmountValue.getText()).to.equal(expectedTransactionData.amountADA);
- await ConfirmTransactionPage.transactionAmountFee.waitForDisplayed();
+ await ConfirmTransactionPage.transactionFeeTitle.waitForDisplayed();
+ expect(await ConfirmTransactionPage.transactionFeeTitle.getText()).to.equal(
+ await t('package.core.activityDetails.transactionFee', 'core')
+ );
+ await ConfirmTransactionPage.transactionFeeTooltipIcon.waitForDisplayed();
+ await ConfirmTransactionPage.transactionFeeValueAda.waitForDisplayed();
+ await ConfirmTransactionPage.transactionFeeValueFiat.waitForDisplayed();
if (expectedTransactionData.amountAsset && expectedTransactionData.amountAsset !== '0') {
await ConfirmTransactionPage.transactionAmountAsset.waitForDisplayed();
diff --git a/packages/e2e-tests/src/elements/dappConnector/confirmTransactionPage.ts b/packages/e2e-tests/src/elements/dappConnector/confirmTransactionPage.ts
index ffdfc455fc..1b8636a7d7 100644
--- a/packages/e2e-tests/src/elements/dappConnector/confirmTransactionPage.ts
+++ b/packages/e2e-tests/src/elements/dappConnector/confirmTransactionPage.ts
@@ -7,7 +7,10 @@ class ConfirmTransactionPage extends CommonDappPageElements {
private TRANSACTION_TYPE = '[data-testid="dapp-transaction-type"]';
private TRANSACTION_AMOUNT_TITLE = '[data-testid="dapp-transaction-amount-title"]';
private TRANSACTION_AMOUNT_VALUE = '[data-testid="dapp-transaction-amount-value"]';
- private TRANSACTION_AMOUNT_FEE = '[data-testid="dapp-transaction-amount-fee"]';
+ private TRANSACTION_AMOUNT_FEE_TITLE = '[data-testid="tx-fee-title"]';
+ private TRANSACTION_AMOUNT_FEE_TITLE_TOOLTIP_ICON = '[data-testid="tx-fee-tooltip-icon"]';
+ private TRANSACTION_AMOUNT_FEE_VALUE_ADA = '[data-testid="tx-fee-ada"]';
+ private TRANSACTION_AMOUNT_FEE_VALUE_FIAT = '[data-testid="tx-fee-fiat"]';
private TRANSACTION_AMOUNT_ASSET = '[data-testid="dapp-transaction-asset"]';
private TRANSACTION_RECIPIENT_TITLE = '[data-testid="dapp-transaction-recipient-title"]';
private TRANSACTION_RECIPIENT_ADDRESS = '[data-testid="dapp-transaction-recipient-address"]';
@@ -29,9 +32,20 @@ class ConfirmTransactionPage extends CommonDappPageElements {
get transactionAmountValue(): ChainablePromiseElement
{
return $(this.TRANSACTION_AMOUNT_VALUE);
}
+ get transactionFeeTitle(): ChainablePromiseElement {
+ return $(this.TRANSACTION_AMOUNT_FEE_TITLE);
+ }
+
+ get transactionFeeTooltipIcon(): ChainablePromiseElement {
+ return $(this.TRANSACTION_AMOUNT_FEE_TITLE_TOOLTIP_ICON);
+ }
+
+ get transactionFeeValueAda(): ChainablePromiseElement {
+ return $(this.TRANSACTION_AMOUNT_FEE_VALUE_ADA);
+ }
- get transactionAmountFee(): ChainablePromiseElement {
- return $(this.TRANSACTION_AMOUNT_FEE);
+ get transactionFeeValueFiat(): ChainablePromiseElement {
+ return $(this.TRANSACTION_AMOUNT_FEE_VALUE_FIAT);
}
get transactionAmountAsset(): ChainablePromiseElement {
diff --git a/packages/e2e-tests/src/features/EmptyStatesExtended.feature b/packages/e2e-tests/src/features/EmptyStatesExtended.feature
index b1437d70ee..273e140f50 100644
--- a/packages/e2e-tests/src/features/EmptyStatesExtended.feature
+++ b/packages/e2e-tests/src/features/EmptyStatesExtended.feature
@@ -29,7 +29,6 @@ Feature: Empty states
@LW-8447
Scenario: Extended View - Staking empty state
- When I disable showing Multidelegation beta banner
And I navigate to Staking extended page
Then I see empty state banner for Staking page in extended mode
When I click "Copy" button on empty state banner
diff --git a/packages/e2e-tests/src/features/EmptyStatesPopup.feature b/packages/e2e-tests/src/features/EmptyStatesPopup.feature
index c58982208f..daa1864c58 100644
--- a/packages/e2e-tests/src/features/EmptyStatesPopup.feature
+++ b/packages/e2e-tests/src/features/EmptyStatesPopup.feature
@@ -28,7 +28,6 @@ Feature: Empty states
@LW-8470
Scenario: Popup View - Staking empty state
- When I disable showing Multidelegation beta banner
And I navigate to Staking popup page
Then I see empty state banner for Staking page in popup mode
When I click "Copy" button on empty state banner
diff --git a/packages/e2e-tests/src/features/FullExperiencePopup.feature b/packages/e2e-tests/src/features/FullExperiencePopup.feature
index 9cbc58ea86..2209cd4938 100644
--- a/packages/e2e-tests/src/features/FullExperiencePopup.feature
+++ b/packages/e2e-tests/src/features/FullExperiencePopup.feature
@@ -12,7 +12,6 @@ Feature: Full experience - popup view
@LW-3446
Scenario Outline: Popup View - opened - "Expand" button click
- Given I disable showing Multidelegation beta banner
And I am on popup page
When I click on "Expand" button
Then the page is displayed on a new tab in extended view
diff --git a/packages/e2e-tests/src/features/MultiDelegationPageExtended.feature b/packages/e2e-tests/src/features/MultiDelegationPageExtended.feature
index ca562f6571..1b571b3a7c 100644
--- a/packages/e2e-tests/src/features/MultiDelegationPageExtended.feature
+++ b/packages/e2e-tests/src/features/MultiDelegationPageExtended.feature
@@ -7,7 +7,6 @@ Feature: Staking Page - Extended View
@LW-8931 @Testnet
Scenario: Extended View - Start Staking component
Given I save token: "Cardano" balance
- And I disable showing Multidelegation beta banner
When I navigate to Staking extended page
Then I see Start Staking page in extended mode
@@ -23,14 +22,12 @@ Feature: Staking Page - Extended View
@LW-8449 @Testnet @Mainnet
Scenario: Extended View - Staking search control is displayed with appropriate content
- Given I disable showing Multidelegation beta banner
When I navigate to Staking extended page
And I click Browse pools tab
Then I see the stake pool search control with appropriate content
@LW-8448 @Testnet
Scenario Outline: Extended View - Stake pool search for "" returns the expected number of results with appropriate content
- Given I disable showing Multidelegation beta banner
When I navigate to Staking extended page
And I click Browse pools tab
And I input "" into stake pool search bar
@@ -49,7 +46,6 @@ Feature: Staking Page - Extended View
@LW-8448 @Mainnet
Scenario Outline: Extended View - Stake pool search for "" returns the expected number of results with appropriate content
- Given I disable showing Multidelegation beta banner
When I navigate to Staking extended page
And I click Browse pools tab
And I input "" into stake pool search bar
@@ -69,12 +65,10 @@ Feature: Staking Page - Extended View
@LW-8466 @Testnet @Mainnet
Scenario: Extended View - "About staking" widget
Given I am on Staking extended page
- And I close Multi-delegation beta modal
Then I see "About staking" widget with all relevant items
@LW-8465 @Testnet @Mainnet
Scenario Outline: Extended View - "About staking" widget item click -
- Given I disable showing Multidelegation beta banner
And I am on Staking extended page
When I click on a widget item with subtitle: ""
Then I see a "" article with title ""
@@ -87,13 +81,11 @@ Feature: Staking Page - Extended View
@LW-8469 @Testnet @Mainnet
Scenario: Extended View - Network info component is present with expected content
- Given I disable showing Multidelegation beta banner
When I navigate to Staking extended page
Then I see the Network Info component with the expected content
@LW-8499 @Testnet @Mainnet
Scenario Outline: Extended View - Staking - Show tooltip for column names in browse pools section
- Given I disable showing Multidelegation beta banner
When I navigate to Staking extended page
And I click Browse pools tab
When I hover over "" column name in stake pool list
@@ -105,7 +97,6 @@ Feature: Staking Page - Extended View
@LW-8637 @Testnet @Mainnet
Scenario: Extended View - Staking password screen details
- Given I disable showing Multidelegation beta banner
When I navigate to Staking extended page
And I click Overview tab
And I click Browse pools tab
@@ -118,7 +109,6 @@ Feature: Staking Page - Extended View
@LW-8445 @Testnet
Scenario: Extended View - Selecting stakepool from list opens drawer with appropriate details
- Given I disable showing Multidelegation beta banner
And I am on Staking extended page
And I click Browse pools tab
And I input "ADA Capital" into stake pool search bar
@@ -127,7 +117,6 @@ Feature: Staking Page - Extended View
@LW-8438 @Testnet
Scenario: Extended View - Staking - Stakepool details drawer - Close drawer
- Given I disable showing Multidelegation beta banner
And I am on Staking extended page
And I click Browse pools tab
And I input "ADA Capital" into stake pool search bar
@@ -137,7 +126,6 @@ Feature: Staking Page - Extended View
@LW-8463 @Testnet @Mainnet
Scenario: Extended View - Stake pool list item
- Given I disable showing Multidelegation beta banner
And I am on Staking extended page
And I click Browse pools tab
And I wait for stake pool list to be populated
diff --git a/packages/e2e-tests/src/features/MultiDelegationPagePopup.feature b/packages/e2e-tests/src/features/MultiDelegationPagePopup.feature
index da12730b12..f0810fafb1 100644
--- a/packages/e2e-tests/src/features/MultiDelegationPagePopup.feature
+++ b/packages/e2e-tests/src/features/MultiDelegationPagePopup.feature
@@ -7,7 +7,6 @@ Feature: Staking Page - Popup View
@LW-8933 @Testnet
Scenario: Popup View - Start Staking component
Given I save token: "Cardano" balance
- And I disable showing Multidelegation beta banner
When I navigate to Staking popup page
Then I see Start Staking page in popup mode
diff --git a/packages/e2e-tests/src/features/MultidelegationDelegatedFundsExtended.feature b/packages/e2e-tests/src/features/MultidelegationDelegatedFundsExtended.feature
index 422a2d405b..000d5aba03 100644
--- a/packages/e2e-tests/src/features/MultidelegationDelegatedFundsExtended.feature
+++ b/packages/e2e-tests/src/features/MultidelegationDelegatedFundsExtended.feature
@@ -6,7 +6,6 @@ Feature: Staking Page - Extended View
@LW-8436 @LW-8439 @LW-8440 @LW-8598
Scenario Outline: Extended View - Staking - Close drawer
- Given I disable showing Multidelegation beta banner
When I navigate to Staking extended page
And I click Browse pools tab
And I pick "1" pools for delegation from browse pools view: "ADA Capital"
@@ -28,7 +27,6 @@ Feature: Staking Page - Extended View
@LW-8450
Scenario Outline: Extended View - Staking - Hover over currently staking element:
- Given I disable showing Multidelegation beta banner
And I navigate to Staking extended page
When I hover over in currently staking component
Then I see tooltip for element in currently staking component
diff --git a/packages/e2e-tests/src/features/MultidelegationDelegatedFundsPopup.feature b/packages/e2e-tests/src/features/MultidelegationDelegatedFundsPopup.feature
index a397fdee1b..a138ee1ae7 100644
--- a/packages/e2e-tests/src/features/MultidelegationDelegatedFundsPopup.feature
+++ b/packages/e2e-tests/src/features/MultidelegationDelegatedFundsPopup.feature
@@ -7,15 +7,14 @@ Feature: Staking Page - Popup View
@LW-8330
Scenario Outline: Popup View - Delegation card displays correct data
Given I open wallet: "" in: popup mode
- And I disable showing Multidelegation beta banner
And I disable showing Multidelegation persistence banner
When I navigate to Staking popup page
Then I see Delegation title displayed for multidelegation
And I see Delegation card displaying correct data
Examples:
- | walletName |
- | MultidelegationDelegatedSingle |
- | MultidelegationDelegatedMulti |
+ | walletName |
+ | MultidelegationDelegatedSingle |
+ | MultidelegationDelegatedMulti |
@LW-8338
Scenario Outline: Popup View - Delegated pools cards are present
@@ -31,9 +30,7 @@ Feature: Staking Page - Popup View
@LW-8480
Scenario Outline: Popup View - Staking - Hover over currently staking element:
- Given Lace is ready for test
- And I disable showing Multidelegation beta banner
- And I navigate to Staking popup page
+ Given I navigate to Staking popup page
When I hover over in currently staking component
Then I see tooltip for element in currently staking component
Examples:
diff --git a/packages/e2e-tests/src/features/NavigationMainExtended.feature b/packages/e2e-tests/src/features/NavigationMainExtended.feature
index a12cae4da7..d9d7cd27ed 100644
--- a/packages/e2e-tests/src/features/NavigationMainExtended.feature
+++ b/packages/e2e-tests/src/features/NavigationMainExtended.feature
@@ -3,7 +3,6 @@ Feature: Main Navigation - Extended view
Background:
Given Lace is ready for test
- And I disable showing Multidelegation beta banner
@LW-2692 @Smoke
Scenario: Extended view - Main navigation is displayed with all items
@@ -38,13 +37,13 @@ Feature: Main Navigation - Extended view
When I click on the logo icon
Then I see Tokens counter with total number of tokens displayed
Examples:
- | section | validateIfSectionIsDisplayed |
- | Tokens | I see Tokens counter with total number of tokens displayed |
- | NFTs | I see NFTs counter with total number of NFTs displayed |
- | Transactions | Transactions section is displayed |
- | Staking | I see Delegation title displayed for multidelegation |
- | Settings | I see settings page |
- | Address Book | I see address book title |
+ | section | validateIfSectionIsDisplayed |
+ | Tokens | I see Tokens counter with total number of tokens displayed |
+ | NFTs | I see NFTs counter with total number of NFTs displayed |
+ | Transactions | Transactions section is displayed |
+ | Staking | I see Delegation title displayed for multidelegation |
+ | Settings | I see settings page |
+ | Address Book | I see address book title |
@LW-6662
Scenario Outline: Extended view - Main Navigation - Right side panel not displayed in section
diff --git a/packages/e2e-tests/src/features/NavigationMainPopup.feature b/packages/e2e-tests/src/features/NavigationMainPopup.feature
index 9aba459aaa..86acaab892 100644
--- a/packages/e2e-tests/src/features/NavigationMainPopup.feature
+++ b/packages/e2e-tests/src/features/NavigationMainPopup.feature
@@ -32,7 +32,6 @@ Feature: Main Navigation - Popup View
@LW-2610
Scenario Outline: Extended view - Click Lace logo -
And Wallet is synced
- And I disable showing Multidelegation beta banner
And I navigate to popup page
And
When I click on the logo icon
diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsSendExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsSendExtended.feature
index f159bf2ea8..4a7edbc963 100644
--- a/packages/e2e-tests/src/features/analytics/AnalyticsSendExtended.feature
+++ b/packages/e2e-tests/src/features/analytics/AnalyticsSendExtended.feature
@@ -15,6 +15,7 @@ Feature: Analytics - Posthog - Sending - Extended View
| ADA | Cardano | tADA | 1.1234 |
When I click "Add bundle" button on "Send" page
And I enter "$test_handle_1" in the bundle 2 recipient's address
+ And Green tick icon is displayed next to ADA handle
And I enter a value of: 1 to the "tADA" asset in bundle 2
And I click "Review transaction" button on "Send" page
Then I validate latest analytics single event "send | transaction data | review transaction | click"
@@ -29,7 +30,7 @@ Feature: Analytics - Posthog - Sending - Extended View
And I click "View transaction" button on submitted transaction page
And Local storage unconfirmedTransaction contains tx with type: "internal"
And I validate latest analytics single event "send | all done | view transaction | click"
- When the Sent transaction is displayed with value: "1.12 tADA" and tokens count 1
+ When the Sent transaction is displayed with value: "2.12 tADA" and tokens count 1
Then I validate latest analytics single event "send | transaction confirmed"
And I validate that the "send | transaction confirmed" event includes property "tx_creation_type" with value "internal" in posthog
And I validate that 7 analytics event(s) have been sent
diff --git a/packages/e2e-tests/src/features/e2e/MultidelegationSwitchingPoolsExtendedE2E.feature b/packages/e2e-tests/src/features/e2e/MultidelegationSwitchingPoolsExtendedE2E.feature
index e30451b57e..f441fc755b 100644
--- a/packages/e2e-tests/src/features/e2e/MultidelegationSwitchingPoolsExtendedE2E.feature
+++ b/packages/e2e-tests/src/features/e2e/MultidelegationSwitchingPoolsExtendedE2E.feature
@@ -3,7 +3,6 @@ Feature: Staking Page - Switching pools - Extended Browser View - E2E
Background:
Given Wallet is synced
- And I disable showing Multidelegation beta banner
And I navigate to Staking extended page
@LW-7819 @Testnet @Pending
diff --git a/packages/e2e-tests/src/hooks/beforeTagHooks.ts b/packages/e2e-tests/src/hooks/beforeTagHooks.ts
index b58e8583e9..760d72fdd3 100644
--- a/packages/e2e-tests/src/hooks/beforeTagHooks.ts
+++ b/packages/e2e-tests/src/hooks/beforeTagHooks.ts
@@ -30,22 +30,31 @@ Before(
{
tags: '@AddressBook-extended or @Transactions-Extended or @Tokens-extended or @Staking-Extended or @LockWallet-extended or @Top-Navigation-Extended or @NFTs-Extended or @NFT-Folders-Extended or @SendTx-Bundles-Extended or @SendTx-Simple-Extended or @MainNavigation-Extended or @Send-Transaction-Metadata-Extended or @Settings-Extended or @DAppConnector or @DAppConnector-Extended'
},
- async () => await extendedViewWalletInitialization()
+ async () => {
+ await extendedViewWalletInitialization();
+ await localStorageInitializer.disableShowingMultidelegationBetaBanner();
+ }
);
Before(
{
tags: '@Tokens-popup or @Transactions-Popup or @Staking-Popup or @LockWallet-popup or @Top-Navigation-Popup or @AddressBook-popup or @Common-Popup or @SendTx-Simple-Popup or @MainNavigation-Popup or @Settings-Popup or @NFTs-Popup or @NFT-Folders-Popup or @Send-Transaction-Metadata-Popup or @ForgotPassword or @DAppConnector-Popup'
},
- async () => await popupViewWalletInitialization()
+ async () => {
+ await popupViewWalletInitialization();
+ await localStorageInitializer.disableShowingMultidelegationBetaBanner();
+ }
);
-Before(
- { tags: '@EmptyStates-Extended' },
- async () => await extendedViewWalletInitialization(TestWalletName.TAWalletNoFunds)
-);
+Before({ tags: '@EmptyStates-Extended' }, async () => {
+ await extendedViewWalletInitialization(TestWalletName.TAWalletNoFunds);
+ await localStorageInitializer.disableShowingMultidelegationBetaBanner();
+});
-Before({ tags: '@EmptyStates-Popup' }, async () => await popupViewWalletInitialization(TestWalletName.TAWalletNoFunds));
+Before({ tags: '@EmptyStates-Popup' }, async () => {
+ await popupViewWalletInitialization(TestWalletName.TAWalletNoFunds);
+ await localStorageInitializer.disableShowingMultidelegationBetaBanner();
+});
Before(
{ tags: '@SendTx-MultipleSelection-Popup' },
@@ -104,15 +113,15 @@ Before(
async () => await extendedViewWalletInitialization(TestWalletName.TAWalletDelegatedFunds)
);
-Before(
- { tags: '@Staking-NonDelegatedFunds-Extended' },
- async () => await extendedViewWalletInitialization(TestWalletName.TAWalletNonDelegatedFunds)
-);
+Before({ tags: '@Staking-NonDelegatedFunds-Extended' }, async () => {
+ await extendedViewWalletInitialization(TestWalletName.TAWalletNonDelegatedFunds);
+ await localStorageInitializer.disableShowingMultidelegationBetaBanner();
+});
-Before(
- { tags: '@Staking-NonDelegatedFunds-Popup' },
- async () => await popupViewWalletInitialization(TestWalletName.TAWalletNonDelegatedFunds)
-);
+Before({ tags: '@Staking-NonDelegatedFunds-Popup' }, async () => {
+ await popupViewWalletInitialization(TestWalletName.TAWalletNonDelegatedFunds);
+ await localStorageInitializer.disableShowingMultidelegationBetaBanner();
+});
Before(
{ tags: '@Staking-SwitchingPools-Extended-E2E' },
@@ -126,10 +135,10 @@ Before(
Before({ tags: '@AdaHandle-popup' }, async () => await popupViewWalletInitialization(TestWalletName.WalletAdaHandle));
-Before(
- { tags: '@Multidelegation-SwitchingPools-Extended-E2E' },
- async () => await extendedViewWalletInitialization(TestWalletName.WalletMultidelegationSwitchPoolsE2E)
-);
+Before({ tags: '@Multidelegation-SwitchingPools-Extended-E2E' }, async () => {
+ await extendedViewWalletInitialization(TestWalletName.WalletMultidelegationSwitchPoolsE2E);
+ await localStorageInitializer.disableShowingMultidelegationBetaBanner();
+});
Before(
{ tags: '@HdWallet-extended' },
@@ -141,12 +150,12 @@ Before(
async () => await extendedViewWalletInitialization(TestWalletName.WalletSendNftHdWalletE2E)
);
-Before(
- { tags: '@Multidelegation-DelegatedFunds-Popup' },
- async () => await popupViewWalletInitialization(TestWalletName.MultidelegationDelegatedSingle)
-);
+Before({ tags: '@Multidelegation-DelegatedFunds-Popup' }, async () => {
+ await popupViewWalletInitialization(TestWalletName.MultidelegationDelegatedSingle);
+ await localStorageInitializer.disableShowingMultidelegationBetaBanner();
+});
-Before(
- { tags: '@Multidelegation-DelegatedFunds-Extended' },
- async () => await extendedViewWalletInitialization(TestWalletName.MultidelegationDelegatedSingle)
-);
+Before({ tags: '@Multidelegation-DelegatedFunds-Extended' }, async () => {
+ await extendedViewWalletInitialization(TestWalletName.MultidelegationDelegatedSingle);
+ await localStorageInitializer.disableShowingMultidelegationBetaBanner();
+});
diff --git a/packages/e2e-tests/src/pageobject/dAppConnectorPageObject.ts b/packages/e2e-tests/src/pageobject/dAppConnectorPageObject.ts
index b451bb89cd..fcbdf3c560 100644
--- a/packages/e2e-tests/src/pageobject/dAppConnectorPageObject.ts
+++ b/packages/e2e-tests/src/pageobject/dAppConnectorPageObject.ts
@@ -96,7 +96,7 @@ class DAppConnectorPageObject {
}
async saveDappTransactionFeeValue() {
- let feeValue = await ConfirmTransactionPage.transactionAmountFee.getText();
+ let feeValue = await ConfirmTransactionPage.transactionFeeValueAda.getText();
feeValue = feeValue.replace(' ADA', '').replace('Fee: ', '');
await testContext.save('feeValueDAppTx', feeValue);
}
diff --git a/packages/e2e-tests/src/utils/networkManager.ts b/packages/e2e-tests/src/utils/networkManager.ts
index aa78c6b04e..0d3ebcee42 100644
--- a/packages/e2e-tests/src/utils/networkManager.ts
+++ b/packages/e2e-tests/src/utils/networkManager.ts
@@ -107,7 +107,10 @@ export class NetworkManager {
const approximateTimestamp = new Date().toString();
const combinedFailedRequestInfo = `URL:\n${request.response.url}\n\nRESPONSE CODE:\n${request.response.status}\n\nAPPROXIMATE TIME:\n${approximateTimestamp}\n\nRESPONSE BODY:\n${responseBody}\n\nREQUEST PAYLOAD:\n${requestPayload}`;
allure.addAttachment('Failed request', combinedFailedRequestInfo, 'text/plain');
- console.error('Failed request', combinedFailedRequestInfo);
+ console.error(
+ 'Failed request',
+ `URL: ${request.response.url} | RESPONSE CODE: ${request.response.status}`
+ );
}
});
});
@@ -125,8 +128,8 @@ export class NetworkManager {
let postData = '';
try {
postData = JSON.stringify(await client.send('Network.getRequestPostData', { requestId }));
- } catch (error) {
- Logger.warn(`${error}`);
+ } catch {
+ /* empty */
}
return postData;
};
diff --git a/packages/e2e-tests/src/utils/utils.ts b/packages/e2e-tests/src/utils/utils.ts
index 78dcd470b0..52f00d4979 100644
--- a/packages/e2e-tests/src/utils/utils.ts
+++ b/packages/e2e-tests/src/utils/utils.ts
@@ -42,7 +42,6 @@ class ExtensionUtils {
break;
}
}
- Logger.log(`Using network: ${network} with id: ${id}`);
return { name: network, id };
}
diff --git a/packages/e2e-tests/wdio.conf.base.ts b/packages/e2e-tests/wdio.conf.base.ts
index 65cd4f434c..572e840109 100755
--- a/packages/e2e-tests/wdio.conf.base.ts
+++ b/packages/e2e-tests/wdio.conf.base.ts
@@ -22,7 +22,12 @@ export const config: WebdriverIO.Config = {
connectionRetryCount: 3,
framework: 'cucumber',
reporters: [
- 'spec',
+ [
+ 'spec',
+ {
+ realtimeReporting: true
+ }
+ ],
[
'allure',
{
diff --git a/packages/staking/package.json b/packages/staking/package.json
index 4d44c00627..bc2f8734e9 100644
--- a/packages/staking/package.json
+++ b/packages/staking/package.json
@@ -59,11 +59,14 @@
"i18next": "^22.5.1",
"immer": "^10.0.2",
"lodash": "4.17.21",
+ "rambda": "^8.5.0",
"react-copy-to-clipboard": "^5.1.0",
"react-i18next": "^12.3.1",
+ "recharts": "^2.9.2",
"zustand": "^4.4.1"
},
"devDependencies": {
+ "@cardano-sdk/core": "0.21.0",
"@cardano-sdk/input-selection": "0.12.4",
"@cardano-sdk/tx-construction": "0.14.2",
"@cardano-sdk/util": "0.14.2",
diff --git a/packages/staking/src/features/BrowsePools/StakePoolsTable/StakePoolsTable.tsx b/packages/staking/src/features/BrowsePools/StakePoolsTable/StakePoolsTable.tsx
index 610ceee531..5d30e2bcf7 100644
--- a/packages/staking/src/features/BrowsePools/StakePoolsTable/StakePoolsTable.tsx
+++ b/packages/staking/src/features/BrowsePools/StakePoolsTable/StakePoolsTable.tsx
@@ -2,6 +2,7 @@ import { Wallet } from '@lace/cardano';
import { PostHogAction, Search, getRandomIcon } from '@lace/common';
import { Box } from '@lace/ui';
import debounce from 'lodash/debounce';
+import uniqBy from 'lodash/uniqBy';
import { useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { StateStatus, useOutsideHandles } from '../../outside-handles-provider';
@@ -92,13 +93,26 @@ export const StakePoolsTable = ({ scrollableTargetId }: StakePoolsTableProps) =>
setSearchValue(searchString);
};
+ // imitates apps/browser-extension-wallet/src/stores/slices/stake-pool-search-slice.ts
+ const naiveSelectedPoolsSearch = (searchString: string, pools: Wallet.Cardano.StakePool[]) => {
+ const lowerCaseSearchString = searchString.toLowerCase();
+ return pools.filter(
+ (pool) =>
+ pool.metadata?.name.toLowerCase().includes(lowerCaseSearchString) ||
+ pool.metadata?.ticker.toLowerCase().includes(lowerCaseSearchString) ||
+ pool.id.toLowerCase() === lowerCaseSearchString
+ );
+ };
+
const combinedUnique = useMemo(() => {
- const combinedStakePools = [...selectedPortfolioStakePools, ...stakePools];
- const combinedUniqueIds = [...new Set(combinedStakePools.map((pool) => pool.id))];
- return combinedUniqueIds.map((id) =>
- combinedStakePools.find((pool) => pool.id === id)
- ) as Wallet.Cardano.StakePool[];
- }, [stakePools, selectedPortfolioStakePools]);
+ const combinedStakePools = [
+ ...(searchValue
+ ? naiveSelectedPoolsSearch(searchValue, selectedPortfolioStakePools)
+ : selectedPortfolioStakePools),
+ ...stakePools,
+ ];
+ return uniqBy(combinedStakePools, (p) => p.id);
+ }, [stakePools, selectedPortfolioStakePools, searchValue]);
const list = useMemo(
() =>
diff --git a/packages/staking/src/features/Drawer/StakePoolDetail.tsx b/packages/staking/src/features/Drawer/StakePoolDetail.tsx
index 53ef0295c3..7582ca944c 100644
--- a/packages/staking/src/features/Drawer/StakePoolDetail.tsx
+++ b/packages/staking/src/features/Drawer/StakePoolDetail.tsx
@@ -209,6 +209,12 @@ const makeActionButtons = (
): ActionButtonSpec[] =>
(
[
+ manageDelegation && {
+ callback: tmpNoop,
+ dataTestId: 'stake-pool-details-manage-delegation-btn',
+ label: t('drawer.details.manageDelegation'),
+ ...getSpecOverride(manageDelegation),
+ },
stakeOnThisPool && {
callback: tmpNoop,
dataTestId: 'stake-pool-details-stake-btn',
@@ -233,12 +239,6 @@ const makeActionButtons = (
label: t('drawer.details.unselectPool'),
...getSpecOverride(unselectPool),
},
- manageDelegation && {
- callback: tmpNoop,
- dataTestId: 'stake-pool-details-manage-delegation-btn',
- label: t('drawer.details.manageDelegation'),
- ...getSpecOverride(manageDelegation),
- },
] as (ActionButtonSpec | false)[]
).filter(Boolean) as ActionButtonSpec[];
@@ -291,13 +291,19 @@ export const StakePoolDetailFooter = ({ popupView }: StakePoolDetailFooterProps)
});
}, [viewedStakePool, analytics, portfolioMutators]);
+ const onManageDelegationClick = useCallback(() => {
+ if (!viewedStakePool) return;
+ analytics.sendEventToPostHog(PostHogAction.StakingBrowsePoolsStakePoolDetailManageDelegation);
+ portfolioMutators.executeCommand({
+ type: 'ManageDelegationFromDetails',
+ });
+ }, [viewedStakePool, analytics, portfolioMutators]);
+
const actionButtons = useMemo(
() =>
makeActionButtons(t, {
addStakingPool: ableToSelect && !selectionsEmpty && { callback: onSelectClick },
- // TODO: disabling this button for now
- // eslint-disable-next-line sonarjs/no-redundant-boolean
- manageDelegation: false && poolInCurrentPortfolio,
+ manageDelegation: poolInCurrentPortfolio && { callback: onManageDelegationClick },
selectForMultiStaking: ableToSelect && selectionsEmpty && { callback: onSelectClick },
stakeOnThisPool: selectionsEmpty && ableToStakeOnlyOnThisPool && { callback: onStakeOnThisPool },
unselectPool: poolSelected && { callback: onUnselectClick },
@@ -306,6 +312,7 @@ export const StakePoolDetailFooter = ({ popupView }: StakePoolDetailFooterProps)
t,
ableToSelect,
selectionsEmpty,
+ onManageDelegationClick,
onSelectClick,
poolInCurrentPortfolio,
ableToStakeOnlyOnThisPool,
diff --git a/packages/staking/src/features/Drawer/StakePoolDetailsDrawer.tsx b/packages/staking/src/features/Drawer/StakePoolDetailsDrawer.tsx
index 6675b0c912..3e0c481dcf 100644
--- a/packages/staking/src/features/Drawer/StakePoolDetailsDrawer.tsx
+++ b/packages/staking/src/features/Drawer/StakePoolDetailsDrawer.tsx
@@ -72,17 +72,20 @@ export const StakePoolDetailsDrawer = ({
});
}, [password, portfolioMutators, backgroundServiceAPIContextSetWalletPassword, removePassword]);
+ const shouldShowBackIcon =
+ activeDrawerStep && typeof showBackIcon === 'function' ? showBackIcon(activeDrawerStep) : showBackIcon;
+
useKeyboardShortcut(['Escape'], () => {
- if (activeDrawerStep && typeof showBackIcon === 'function' ? showBackIcon(activeDrawerStep) : showBackIcon) {
+ if (shouldShowBackIcon) {
onGoBack();
} else {
closeDrawer();
}
});
- const createArrowIconCallback = () => {
- if (activeDrawerStep && typeof showBackIcon === 'function' ? showBackIcon(activeDrawerStep) : showBackIcon) {
- return popupView ? closeDrawer : onGoBack;
+ const arrowIconCallback = () => {
+ if (shouldShowBackIcon) {
+ return popupView ? closeDrawer() : onGoBack();
}
// eslint-disable-next-line consistent-return, unicorn/no-useless-undefined
return undefined;
@@ -97,10 +100,14 @@ export const StakePoolDetailsDrawer = ({
{
- onBackButtonClick?.();
- createArrowIconCallback();
- }}
+ onArrowIconClick={
+ !shouldShowBackIcon
+ ? undefined
+ : () => {
+ onBackButtonClick?.();
+ arrowIconCallback();
+ }
+ }
onCloseIconClick={() => {
if (
activeDrawerStep && typeof showCloseIcon === 'function' ? showCloseIcon(activeDrawerStep) : showCloseIcon
diff --git a/packages/staking/src/features/Drawer/TransactionFail.tsx b/packages/staking/src/features/Drawer/TransactionFail.tsx
index 149b5d8479..369f861b5c 100644
--- a/packages/staking/src/features/Drawer/TransactionFail.tsx
+++ b/packages/staking/src/features/Drawer/TransactionFail.tsx
@@ -99,8 +99,8 @@ export const TransactionFailFooter = ({ popupView }: TransactionFailProps): Reac
) : (