diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/DappTransactionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/DappTransactionContainer.tsx index 529acdea61..8aae49e751 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/DappTransactionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/DappTransactionContainer.tsx @@ -2,6 +2,7 @@ import React, { useState, useEffect, useMemo } from 'react'; import { logger, useObservable } from '@lace/common'; import { DappTransaction, + TxDetailsCBOR, TxDetailsCertificates, TxDetailsProposalProcedures, TxDetailsVotingProcedures @@ -82,6 +83,7 @@ export const DappTransactionContainer = withAddressBookContext( const { inputResolver } = getProviders(); const tx = useMemo(() => req?.transaction.toCore(), [req?.transaction]); + const txCBOR = useMemo(() => req?.transaction.toCbor(), [req?.transaction]); useEffect(() => { if (userAckNonRegisteredState || !tx?.body?.votingProcedures) return () => void 0; @@ -188,6 +190,7 @@ export const DappTransactionContainer = withAddressBookContext( ownAddresses={allWalletsAddresses.length > 0 ? allWalletsAddresses : ownAddresses} addressToNameMap={addressToNameMap} /> + {tx?.body?.certificates?.length > 0 && ( { request: { transaction: { toCore: jest.fn().mockReturnValue({ id: 'test-tx-id' }), + toCbor: jest.fn().mockReturnValue('cbor'), getId: jest.fn().mockReturnValue({ id: 'test-tx-id' }) } }, @@ -171,6 +172,7 @@ describe('Testing ConfirmTransaction component', () => { signContext: { sender: { tab: { id: 'tabid', favIconUrl: 'favIconUrl' } } }, transaction: { toCore: jest.fn().mockReturnValue({ id: 'test-tx-id' }), + toCbor: jest.fn().mockReturnValue('cbor'), getId: jest.fn().mockReturnValue({ id: 'test-tx-id' }) } }); @@ -211,6 +213,7 @@ describe('Testing ConfirmTransaction component', () => { request: { transaction: { getId: jest.fn().mockReturnValue({ id: 'test-tx-id' }), + toCbor: jest.fn().mockReturnValue('cbor'), toCore: jest.fn().mockReturnValue(signTxData.tx) } }, @@ -222,6 +225,7 @@ describe('Testing ConfirmTransaction component', () => { signContext: { sender: { tab: { id: 'tabid', favIconUrl: 'favIconUrl' } } }, transaction: { getId: jest.fn().mockReturnValue({ id: 'test-tx-id' }), + toCbor: jest.fn().mockReturnValue('cbor'), toCore: jest.fn().mockReturnValue(signTxData.tx) } }); @@ -280,6 +284,7 @@ describe('Testing ConfirmTransaction component', () => { request: { transaction: { getId: jest.fn().mockReturnValue({ id: 'test-tx-id' }), + toCbor: jest.fn().mockReturnValue('cbor'), toCore: jest.fn().mockReturnValue(signTxData.tx) } }, @@ -291,6 +296,7 @@ describe('Testing ConfirmTransaction component', () => { signContext: { sender: { tab: { id: 'tabid', favIconUrl: 'favIconUrl' } } }, transaction: { getId: jest.fn().mockReturnValue({ id: 'test-tx-id' }), + toCbor: jest.fn().mockReturnValue('cbor'), toCore: jest.fn().mockReturnValue(signTxData.tx) } }); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/DappTransactionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/DappTransactionContainer.test.tsx index 75334057bb..0ed84c980e 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/DappTransactionContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/DappTransactionContainer.test.tsx @@ -20,7 +20,7 @@ const mockUseCurrencyStore = jest.fn().mockReturnValue({ fiatCurrency: { code: ' const mockUseFetchCoinPrice = jest.fn().mockReturnValue({ priceResult: { cardano: { price: 2 }, tokens: new Map() } }); const mockUseComputeTxCollateral = jest.fn().mockReturnValue(BigInt(1_000_000)); import * as React from 'react'; -import { cleanup, render } from '@testing-library/react'; +import { cleanup, render, fireEvent } from '@testing-library/react'; import { DappTransactionContainer } from '../DappTransactionContainer'; import '@testing-library/jest-dom'; import { BehaviorSubject } from 'rxjs'; @@ -287,6 +287,7 @@ describe('Testing DappTransactionContainer component', () => { const request = { transaction: { + toCbor: jest.fn().mockReturnValue('transaction-cbor'), toCore: jest.fn().mockReturnValue(buildMockTx({ certificates: [drepRegistrationcertificate] })) } as any } as TransactionWitnessRequest; @@ -416,11 +417,41 @@ describe('Testing DappTransactionContainer component', () => { ); }); + it('should display raw transaction section', async () => { + let queryByTestId: any; + const request = { + transaction: { + toCbor: jest.fn().mockReturnValue('transaction-cbor'), + toCore: jest.fn().mockReturnValue(buildMockTx()) + } as any + } as TransactionWitnessRequest; + + mockUseViewsFlowContext.mockImplementation(() => ({ + signTxRequest: { request, set: jest.fn() }, + dappInfo + })); + + await act(async () => { + ({ queryByTestId } = render(, { + wrapper: getWrapper() + })); + }); + + expect(queryByTestId('cbor-detail')).toBeInTheDocument(); + + await act(async () => { + fireEvent.click(queryByTestId('cbor-detail_toggle')); + }); + + expect(queryByTestId('cbor')).toHaveTextContent('cbor'); + }); + it('should display drep registration certificate', async () => { let queryByTestId: any; const drepRegistrationTx = buildMockTx({ certificates: [drepRegistrationcertificate] }); const request = { transaction: { + toCbor: jest.fn().mockReturnValue('transaction-cbor'), toCore: jest.fn().mockReturnValue(drepRegistrationTx) } as any } as TransactionWitnessRequest; @@ -445,6 +476,7 @@ describe('Testing DappTransactionContainer component', () => { const drepRetirementCertificateTx = buildMockTx({ certificates: [drepRetirementCertificate] }); const request = { transaction: { + toCbor: jest.fn().mockReturnValue('transaction-cbor'), toCore: jest.fn().mockReturnValue(drepRetirementCertificateTx) } as any } as TransactionWitnessRequest; @@ -468,6 +500,7 @@ describe('Testing DappTransactionContainer component', () => { const drepUpdateCertificateTx = buildMockTx({ certificates: [drepUpdateCertificate] }); const request = { transaction: { + toCbor: jest.fn().mockReturnValue('transaction-cbor'), toCore: jest.fn().mockReturnValue(drepUpdateCertificateTx) } as any } as TransactionWitnessRequest; @@ -494,6 +527,7 @@ describe('Testing DappTransactionContainer component', () => { }); const request = { transaction: { + toCbor: jest.fn().mockReturnValue('transaction-cbor'), toCore: jest.fn().mockReturnValue(stakeRegistrationDelegationCertificateTx) } as any } as TransactionWitnessRequest; @@ -518,6 +552,7 @@ describe('Testing DappTransactionContainer component', () => { const stakeVoteDelegationCertificateTx = buildMockTx({ certificates: [stakeVoteDelegationCertificate] }); const request = { transaction: { + toCbor: jest.fn().mockReturnValue('transaction-cbor'), toCore: jest.fn().mockReturnValue(stakeVoteDelegationCertificateTx) } as any } as TransactionWitnessRequest; @@ -543,6 +578,7 @@ describe('Testing DappTransactionContainer component', () => { }); const request = { transaction: { + toCbor: jest.fn().mockReturnValue('transaction-cbor'), toCore: jest.fn().mockReturnValue(stakeVoteRegistrationDelegationCertificateTx) } as any } as TransactionWitnessRequest; @@ -566,6 +602,7 @@ describe('Testing DappTransactionContainer component', () => { const voteDelegationCertificateTx = buildMockTx({ certificates: [voteDelegationCertificate] }); const request = { transaction: { + toCbor: jest.fn().mockReturnValue('transaction-cbor'), toCore: jest.fn().mockReturnValue(voteDelegationCertificateTx) } as any } as TransactionWitnessRequest; @@ -591,6 +628,7 @@ describe('Testing DappTransactionContainer component', () => { }); const request = { transaction: { + toCbor: jest.fn().mockReturnValue('transaction-cbor'), toCore: jest.fn().mockReturnValue(voteRegistrationDelegationCertificateTx) } as any } as TransactionWitnessRequest; @@ -641,6 +679,7 @@ describe('Testing DappTransactionContainer component', () => { }); const request = { transaction: { + toCbor: jest.fn().mockReturnValue('transaction-cbor'), toCore: jest.fn().mockReturnValue(votingTx) } as any } as TransactionWitnessRequest; @@ -682,6 +721,7 @@ describe('Testing DappTransactionContainer component', () => { }); const request = { transaction: { + toCbor: jest.fn().mockReturnValue('transaction-cbor'), toCore: jest.fn().mockReturnValue(proposalProceduresTx) } as any } as TransactionWitnessRequest; diff --git a/packages/core/src/ui/components/ActivityDetail/TransactionInputOutput.module.scss b/packages/core/src/ui/components/ActivityDetail/TransactionInputOutput.module.scss index 3da1cec3d9..50bc596389 100644 --- a/packages/core/src/ui/components/ActivityDetail/TransactionInputOutput.module.scss +++ b/packages/core/src/ui/components/ActivityDetail/TransactionInputOutput.module.scss @@ -6,6 +6,10 @@ flex-direction: column; } + &.isOpen { + padding-bottom: 20px; + } + .expanderHeader { display: flex; justify-content: space-between; @@ -24,6 +28,10 @@ color: var(--text-color-primary); } } + + &.separatorLine { + margin-bottom: 20px; + } } .addressContainer { diff --git a/packages/core/src/ui/components/ActivityDetail/TxDetailsGroup.tsx b/packages/core/src/ui/components/ActivityDetail/TxDetailsGroup.tsx index b6c6ec1e06..23248d78c7 100644 --- a/packages/core/src/ui/components/ActivityDetail/TxDetailsGroup.tsx +++ b/packages/core/src/ui/components/ActivityDetail/TxDetailsGroup.tsx @@ -6,7 +6,7 @@ import { DownOutlined, InfoCircleOutlined } from '@ant-design/icons'; import { Button } from '@lace/common'; import { ReactComponent as BracketDown } from '../../assets/icons/bracket-down.component.svg'; import styles from './TransactionInputOutput.module.scss'; -import { Text } from '@input-output-hk/lace-ui-toolkit'; +import { Flex, Text } from '@input-output-hk/lace-ui-toolkit'; interface TxDetailsGroupProps { testId: string; @@ -37,16 +37,19 @@ export const TxDetailsGroup = ({ ); return ( -
+
-
- {title} + + {title} {tooltipContent && ( )} -
+