From 898cfafaefa23d91c0fddd1ec8050de0e7e2f2cb Mon Sep 17 00:00:00 2001 From: isstuev Date: Thu, 21 Dec 2023 18:24:12 +0100 Subject: [PATCH 01/20] add transaction interpretations --- configs/app/features/index.ts | 1 + configs/app/features/txInterpretation.ts | 21 ++++++ configs/envs/.env.eth | 1 + deploy/tools/envs-validator/schema.ts | 1 + docs/ENVS.md | 11 +++ icons/action.svg | 3 + lib/api/resources.ts | 6 ++ mocks/txs/txInterpretation.ts | 45 ++++++++++++ stubs/tx.ts | 29 ++++++++ types/api/txInterpretation.ts | 47 +++++++++++++ ui/pages/Transaction.tsx | 32 +++++++-- ui/tx/interpretation/TxInterpretation.pw.tsx | 21 ++++++ ui/tx/interpretation/TxInterpretation.tsx | 66 ++++++++++++++++++ ...olor-mode_base-view-mobile-dark-mode-1.png | Bin 0 -> 9530 bytes ...x_default_base-view-mobile-dark-mode-1.png | Bin 0 -> 9280 bytes ...sx_mobile_base-view-mobile-dark-mode-1.png | Bin 0 -> 8976 bytes ui/tx/interpretation/utils.test.ts | 43 ++++++++++++ ui/tx/interpretation/utils.ts | 31 ++++++++ 18 files changed, 352 insertions(+), 6 deletions(-) create mode 100644 configs/app/features/txInterpretation.ts create mode 100644 icons/action.svg create mode 100644 mocks/txs/txInterpretation.ts create mode 100644 types/api/txInterpretation.ts create mode 100644 ui/tx/interpretation/TxInterpretation.pw.tsx create mode 100644 ui/tx/interpretation/TxInterpretation.tsx create mode 100644 ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_dark-color-mode_base-view-mobile-dark-mode-1.png create mode 100644 ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_default_base-view-mobile-dark-mode-1.png create mode 100644 ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_mobile_base-view-mobile-dark-mode-1.png create mode 100644 ui/tx/interpretation/utils.test.ts create mode 100644 ui/tx/interpretation/utils.ts diff --git a/configs/app/features/index.ts b/configs/app/features/index.ts index ad45f9a4a1..0879fb17d5 100644 --- a/configs/app/features/index.ts +++ b/configs/app/features/index.ts @@ -17,6 +17,7 @@ export { default as sentry } from './sentry'; export { default as sol2uml } from './sol2uml'; export { default as stats } from './stats'; export { default as suave } from './suave'; +export { default as txInterpretation } from './txInterpretation'; export { default as web3Wallet } from './web3Wallet'; export { default as verifiedTokens } from './verifiedTokens'; export { default as zkEvmRollup } from './zkEvmRollup'; diff --git a/configs/app/features/txInterpretation.ts b/configs/app/features/txInterpretation.ts new file mode 100644 index 0000000000..bc0976ea5f --- /dev/null +++ b/configs/app/features/txInterpretation.ts @@ -0,0 +1,21 @@ +import type { Feature } from './types'; + +import { getEnvValue } from '../utils'; + +const title = 'Transaction interpretation'; + +const config: Feature<{ isEnabled: true }> = (() => { + if (getEnvValue('NEXT_PUBLIC_TRANSACTION_INTERPRETATION_ENABLED') === 'true') { + return Object.freeze({ + title, + isEnabled: true, + }); + } + + return Object.freeze({ + title, + isEnabled: false, + }); +})(); + +export default config; diff --git a/configs/envs/.env.eth b/configs/envs/.env.eth index 71dc3fdd4d..a1ad41a2a1 100644 --- a/configs/envs/.env.eth +++ b/configs/envs/.env.eth @@ -42,6 +42,7 @@ NEXT_PUBLIC_STATS_API_HOST=https://stats-eth-main.k8s.blockscout.com NEXT_PUBLIC_VISUALIZE_API_HOST=https://visualizer.services.blockscout.com NEXT_PUBLIC_CONTRACT_INFO_API_HOST=https://contracts-info.services.blockscout.com NEXT_PUBLIC_ADMIN_SERVICE_API_HOST=https://admin-rs.services.blockscout.com +NEXT_PUBLIC_TRANSACTION_INTERPRETATION_ENABLED=true #meta NEXT_PUBLIC_OG_IMAGE_URL=https://github.com/blockscout/frontend-configs/blob/main/configs/og-images/eth.jpg?raw=true diff --git a/deploy/tools/envs-validator/schema.ts b/deploy/tools/envs-validator/schema.ts index 85966c74ed..cbd32ecc26 100644 --- a/deploy/tools/envs-validator/schema.ts +++ b/deploy/tools/envs-validator/schema.ts @@ -438,6 +438,7 @@ const schema = yup return isNoneSchema.isValidSync(data) || isArrayOfWalletsSchema.isValidSync(data); }), NEXT_PUBLIC_WEB3_DISABLE_ADD_TOKEN_TO_WALLET: yup.boolean(), + NEXT_PUBLIC_TRANSACTION_INTERPRETATION_ENABLED: yup.boolean(), NEXT_PUBLIC_AD_TEXT_PROVIDER: yup.string().oneOf(SUPPORTED_AD_TEXT_PROVIDERS), NEXT_PUBLIC_PROMOTE_BLOCKSCOUT_IN_TITLE: yup.boolean(), NEXT_PUBLIC_OG_DESCRIPTION: yup.string(), diff --git a/docs/ENVS.md b/docs/ENVS.md index 58b81b2c11..9cd177caa5 100644 --- a/docs/ENVS.md +++ b/docs/ENVS.md @@ -44,6 +44,7 @@ Please be aware that all environment variables prefixed with `NEXT_PUBLIC_` will - [Solidity to UML diagrams](ENVS.md#solidity-to-uml-diagrams) - [Blockchain statistics](ENVS.md#blockchain-statistics) - [Web3 wallet integration](ENVS.md#web3-wallet-integration-add-token-or-network-to-the-wallet) (add token or network to the wallet) + - [Transaction interpretation](ENVS.md#transaction-interpretation) - [Verified tokens info](ENVS.md#verified-tokens-info) - [Bridged tokens](ENVS.md#bridged-tokens) - [Safe{Core} address tags](ENVS.md#safecore-address-tags) @@ -473,6 +474,16 @@ This feature is **enabled by default** with the `['metamask']` value. To switch   +### Transaction interpretation + + + +| Variable | Type| Description | Compulsoriness | Default value | Example value | +| --- | --- | --- | --- | --- | --- | +| NEXT_PUBLIC_TRANSACTION_INTERPRETATION_ENABLED | `boolean`| Set to `true` to enable transaction interpretation | - | - | `true` | + +  + ### Verified tokens info | Variable | Type| Description | Compulsoriness | Default value | Example value | diff --git a/icons/action.svg b/icons/action.svg new file mode 100644 index 0000000000..91b1ae92ca --- /dev/null +++ b/icons/action.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/api/resources.ts b/lib/api/resources.ts index 788a187a22..60d224dad6 100644 --- a/lib/api/resources.ts +++ b/lib/api/resources.ts @@ -65,6 +65,7 @@ import type { TransactionsResponseWatchlist, TransactionsSorting, } from 'types/api/transaction'; +import type { TxInterpretationResponse } from 'types/api/txInterpretation'; import type { TTxsFilters } from 'types/api/txsFilters'; import type { TxStateChanges } from 'types/api/txStateChanges'; import type { VerifiedContractsSorting } from 'types/api/verifiedContracts'; @@ -246,6 +247,10 @@ export const RESOURCES = { pathParams: [ 'hash' as const ], filterFields: [], }, + tx_interpretation: { + path: '/api/v2/transactions/:hash/summary', + pathParams: [ 'hash' as const ], + }, withdrawals: { path: '/api/v2/withdrawals', filterFields: [], @@ -651,6 +656,7 @@ Q extends 'tx_logs' ? LogsResponseTx : Q extends 'tx_token_transfers' ? TokenTransferResponse : Q extends 'tx_raw_trace' ? RawTracesResponse : Q extends 'tx_state_changes' ? TxStateChanges : +Q extends 'tx_interpretation' ? TxInterpretationResponse : Q extends 'addresses' ? AddressesResponse : Q extends 'address' ? Address : Q extends 'address_counters' ? AddressCounters : diff --git a/mocks/txs/txInterpretation.ts b/mocks/txs/txInterpretation.ts new file mode 100644 index 0000000000..b351363a52 --- /dev/null +++ b/mocks/txs/txInterpretation.ts @@ -0,0 +1,45 @@ +import type { TxInterpretationResponse } from 'types/api/txInterpretation'; + +export const txInterpretation: TxInterpretationResponse = { + data: { + summaries: [ { + summary_template: `{action_type} {amount} {token} to {to_address} on {timestamp}`, + summary_template_variables: { + action_type: { type: 'string', value: 'Transfer' }, + amount: { type: 'currency', value: '100' }, + token: { + type: 'token', + value: { + name: 'Duck', + type: 'ERC-20', + symbol: 'DUCK', + address: '0x486a3c5f34cDc4EF133f248f1C81168D78da52e8', + holders: '1152', + decimals: '18', + icon_url: null, + total_supply: '210000000000000000000000000', + exchange_rate: null, + circulating_market_cap: null, + }, + }, + to_address: { + type: 'address', + value: { + hash: '0x48c04ed5691981C42154C6167398f95e8f38a7fF', + implementation_name: null, + is_contract: false, + is_verified: false, + name: null, + private_tags: [], + public_tags: [], + watchlist_names: [], + }, + }, + timestamp: { + type: 'timestamp', + value: '1687005431', + }, + }, + } ], + }, +}; diff --git a/stubs/tx.ts b/stubs/tx.ts index 1f7eb1c0a6..35ec3b47ef 100644 --- a/stubs/tx.ts +++ b/stubs/tx.ts @@ -1,5 +1,6 @@ import type { RawTracesResponse } from 'types/api/rawTrace'; import type { Transaction } from 'types/api/transaction'; +import type { TxInterpretationResponse } from 'types/api/txInterpretation'; import { ADDRESS_PARAMS } from './addressParams'; @@ -59,3 +60,31 @@ export const TX_ZKEVM_L2: Transaction = { }; export const TX_RAW_TRACE: RawTracesResponse = []; + +export const TX_INTERPRETATION: TxInterpretationResponse = { + data: { + summaries: [ { + summary_template: '{action_type} {source_amount} Ether into {destination_amount} {destination_token}', + summary_template_variables: { + action_type: { type: 'string', value: 'Wrap' }, + source_amount: { type: 'currency', value: '0.7' }, + destination_amount: { type: 'currency', value: '0.7' }, + destination_token: { + type: 'token', + value: { + name: 'Museion', + type: 'ERC-20', + symbol: 'MUSA', + address: '0x486a3c5f34cDc4EF133f248f1C81168D78da52e8', + holders: '1152', + decimals: '18', + icon_url: null, + total_supply: '210000000000000000000000000', + exchange_rate: null, + circulating_market_cap: null, + }, + }, + }, + } ], + }, +}; diff --git a/types/api/txInterpretation.ts b/types/api/txInterpretation.ts new file mode 100644 index 0000000000..be9393203f --- /dev/null +++ b/types/api/txInterpretation.ts @@ -0,0 +1,47 @@ +import type { AddressParam } from 'types/api/addressParams'; +import type { TokenInfo } from 'types/api/token'; + +export interface TxInterpretationResponse { + data: { + summaries: Array; + }; +} + +export type TxInterpretationSummary = { + summary_template: string; + summary_template_variables: Record; +} + +export type TxInterpretationVariable = + TxInterpretationVariableString | + TxInterpretationVariableCurrency | + TxInterpretationVariableTimestamp | + TxInterpretationVariableToken | + TxInterpretationVariableAddress; + +export type TxInterpretationVariableType = 'string' | 'currency' | 'timestamp' | 'token' | 'address'; + +export type TxInterpretationVariableString = { + type: 'string'; + value: string; +} + +export type TxInterpretationVariableCurrency = { + type: 'currency'; + value: string; +} + +export type TxInterpretationVariableTimestamp = { + type: 'timestamp'; + value: string; +} + +export type TxInterpretationVariableToken = { + type: 'token'; + value: TokenInfo; +} + +export type TxInterpretationVariableAddress = { + type: 'address'; + value: AddressParam; +} diff --git a/ui/pages/Transaction.tsx b/ui/pages/Transaction.tsx index 894006b550..362fb17a62 100644 --- a/ui/pages/Transaction.tsx +++ b/ui/pages/Transaction.tsx @@ -1,3 +1,4 @@ +import { Box, Flex } from '@chakra-ui/react'; import { useRouter } from 'next/router'; import React from 'react'; @@ -7,7 +8,7 @@ import config from 'configs/app'; import useApiQuery from 'lib/api/useApiQuery'; import { useAppContext } from 'lib/contexts/app'; import getQueryParamString from 'lib/router/getQueryParamString'; -import { TX } from 'stubs/tx'; +import { TX, TX_INTERPRETATION } from 'stubs/tx'; import AccountActionsMenu from 'ui/shared/AccountActionsMenu/AccountActionsMenu'; import TextAd from 'ui/shared/ad/TextAd'; import TxEntity from 'ui/shared/entities/tx/TxEntity'; @@ -17,6 +18,8 @@ import PageTitle from 'ui/shared/Page/PageTitle'; import RoutedTabs from 'ui/shared/Tabs/RoutedTabs'; import TabsSkeleton from 'ui/shared/Tabs/TabsSkeleton'; import useTabIndexFromQuery from 'ui/shared/Tabs/useTabIndexFromQuery'; +import TxInterpretation from 'ui/tx/interpretation/TxInterpretation'; +import { checkTemplate as checkInterpretationTemplate } from 'ui/tx/interpretation/utils'; import TxDetails from 'ui/tx/TxDetails'; import TxDetailsWrapped from 'ui/tx/TxDetailsWrapped'; import TxInternals from 'ui/tx/TxInternals'; @@ -39,6 +42,16 @@ const TransactionPageContent = () => { }, }); + const hasInterpretationFeature = config.features.txInterpretation.isEnabled; + + const txInterpretationQuery = useApiQuery('tx_interpretation', { + pathParams: { hash }, + queryOptions: { + enabled: Boolean(hash) && hasInterpretationFeature, + placeholderData: TX_INTERPRETATION, + }, + }); + const tabs: Array = [ { id: 'index', title: config.features.suave.isEnabled && data?.wrapped ? 'Confidential compute tx details' : 'Details', component: }, config.features.suave.isEnabled && data?.wrapped ? @@ -73,12 +86,19 @@ const TransactionPageContent = () => { }; }, [ appProps.referrer ]); + const hasInterpretation = + hasInterpretationFeature && (txInterpretationQuery.isPlaceholderData || + (txInterpretationQuery.data?.data.summaries[0] && checkInterpretationTemplate(txInterpretationQuery.data.data.summaries[0]))); + const titleSecondRow = ( - <> - - { !data?.tx_tag && } - - + + { hasInterpretationFeature && } + { !hasInterpretation && } + + { !data?.tx_tag && } + + + ); return ( diff --git a/ui/tx/interpretation/TxInterpretation.pw.tsx b/ui/tx/interpretation/TxInterpretation.pw.tsx new file mode 100644 index 0000000000..026d75a8e9 --- /dev/null +++ b/ui/tx/interpretation/TxInterpretation.pw.tsx @@ -0,0 +1,21 @@ +import { test, expect } from '@playwright/experimental-ct-react'; +import type { UseQueryResult } from '@tanstack/react-query'; +import React from 'react'; + +import type { TxInterpretationResponse } from 'types/api/txInterpretation'; + +import type { ResourceError } from 'lib/api/resources'; +import { txInterpretation as txInterpretationMock } from 'mocks/txs/txInterpretation'; +import TestApp from 'playwright/TestApp'; + +import TxInterpretation from './TxInterpretation'; + +test('base view +@mobile +@dark-mode', async({ mount }) => { + const component = await mount( + + }/> + , + ); + + await expect(component).toHaveScreenshot(); +}); diff --git a/ui/tx/interpretation/TxInterpretation.tsx b/ui/tx/interpretation/TxInterpretation.tsx new file mode 100644 index 0000000000..adb911d1c0 --- /dev/null +++ b/ui/tx/interpretation/TxInterpretation.tsx @@ -0,0 +1,66 @@ +import { Skeleton, Text, Icon, chakra } from '@chakra-ui/react'; +import type { UseQueryResult } from '@tanstack/react-query'; +import BigNumber from 'bignumber.js'; +import React from 'react'; + +import type { TxInterpretationResponse, TxInterpretationVariable } from 'types/api/txInterpretation'; + +import actionIcon from 'icons/action.svg'; +import type { ResourceError } from 'lib/api/resources'; +import dayjs from 'lib/date/dayjs'; +import AddressEntity from 'ui/shared/entities/address/AddressEntity'; +import TokenEntity from 'ui/shared/entities/token/TokenEntity'; + +import { extractVariables, getStringChunks } from './utils'; + +type Props = { + query: UseQueryResult; + className?: string; +} + +const TxInterpretationElementByType = ({ type, value }: TxInterpretationVariable) => { + switch (type) { + case 'address': + return ; + case 'token': + return ; + case 'currency': + return { BigNumber(value).toFormat() }; + case 'timestamp': + // timestamp is in unix format + return { dayjs(Number(value) * 1000).format('llll') }; + case 'string': + default: { + return { value.toString() }; + } + } +}; + +const TxInterpretation = ({ query, className }: Props) => { + if (!query.data?.data.summaries[0]) { + return null; + } + + const template = query.data.data.summaries[0].summary_template; + const variables = query.data.data.summaries[0].summary_template_variables; + + const variablesNames = extractVariables(template); + + const chunks = getStringChunks(template); + + return ( + + + { chunks.map((chunk, index) => { + return ( + <> + { chunk } + { index < chunks.length - 1 && } + + ); + }) } + + ); +}; + +export default chakra(TxInterpretation); diff --git a/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_dark-color-mode_base-view-mobile-dark-mode-1.png b/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_dark-color-mode_base-view-mobile-dark-mode-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5366d76e3ac05429f06723d8d3e708b847896501 GIT binary patch literal 9530 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 a#JjtAuV>px4@Wjbp~y)oNmhuP1pN=i((auA literal 0 HcmV?d00001 diff --git a/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_default_base-view-mobile-dark-mode-1.png b/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_default_base-view-mobile-dark-mode-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e071fbedec2f82af3d3af9f77227dde97fd07613 GIT binary patch literal 9280 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 literal 0 HcmV?d00001 diff --git a/ui/tx/interpretation/utils.test.ts b/ui/tx/interpretation/utils.test.ts new file mode 100644 index 0000000000..8122e3e785 --- /dev/null +++ b/ui/tx/interpretation/utils.test.ts @@ -0,0 +1,43 @@ +import { extractVariables, checkTemplate } from './utils'; + +const template = '{action_type} {source_amount} Ether into {destination_amount} {destination_token}'; + +it('extracts variables names', () => { + const result = extractVariables(template); + expect(result).toEqual([ 'action_type', 'source_amount', 'destination_amount', 'destination_token' ]); +}); + +it('check template true', () => { + const variables = { + action_type: { type: 'string' as const, value: 'Wrap' }, + source_amount: { type: 'currency' as const, value: '0.7' }, + destination_amount: { type: 'currency' as const, value: '0.7' }, + destination_token: { + type: 'token' as const, + value: { + name: 'Duck', + type: 'ERC-20' as const, + symbol: 'DUCK', + address: '0x486a3c5f34cDc4EF133f248f1C81168D78da52e8', + holders: '1152', + decimals: '18', + icon_url: null, + total_supply: '210000000000000000000000000', + exchange_rate: null, + circulating_market_cap: null, + }, + }, + }; + const result = checkTemplate({ summary_template: template, summary_template_variables: variables }); + expect(result).toBe(true); +}); + +it('check template false', () => { + const variables = { + action_type: { type: 'string' as const, value: 'Wrap' }, + source_amount: { type: 'currency' as const, value: '0.7' }, + destination_amount: { type: 'currency' as const, value: '0.7' }, + }; + const result = checkTemplate({ summary_template: template, summary_template_variables: variables }); + expect(result).toBe(false); +}); diff --git a/ui/tx/interpretation/utils.ts b/ui/tx/interpretation/utils.ts new file mode 100644 index 0000000000..b10ba37b19 --- /dev/null +++ b/ui/tx/interpretation/utils.ts @@ -0,0 +1,31 @@ +import type { TxInterpretationSummary } from 'types/api/txInterpretation'; + +// we use that regex as a separator when splitting template and dont want to capture variables +// eslint-disable-next-line regexp/no-useless-non-capturing-group +export const VAR_REGEXP = /\{(?:[^}]+)\}/g; + +export function extractVariables(templateString: string) { + + const matches = templateString.match(VAR_REGEXP); + + const variablesNames = matches ? matches.map(match => match.slice(1, -1)) : []; + + return variablesNames; +} + +export function getStringChunks(template: string) { + return template.split(VAR_REGEXP); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function checkTemplate(summary: TxInterpretationSummary) { + const variablesNames = extractVariables(summary.summary_template); + + for (const name of variablesNames) { + if (!summary.summary_template_variables[name]) { + return false; + } + } + + return true; +} From 11678896c5cd3fdf83a5e13c619cf4024ade5293 Mon Sep 17 00:00:00 2001 From: isstuev Date: Thu, 21 Dec 2023 19:14:30 +0100 Subject: [PATCH 02/20] revert after demo --- deploy/values/review/values.yaml.gotmpl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deploy/values/review/values.yaml.gotmpl b/deploy/values/review/values.yaml.gotmpl index dbfd815a82..2b11c240ef 100644 --- a/deploy/values/review/values.yaml.gotmpl +++ b/deploy/values/review/values.yaml.gotmpl @@ -51,7 +51,7 @@ frontend: NEXT_PUBLIC_FEATURED_NETWORKS: https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/featured-networks/eth-goerli.json NEXT_PUBLIC_NETWORK_LOGO: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-logos/goerli.svg NEXT_PUBLIC_NETWORK_ICON: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-icons/goerli.svg - NEXT_PUBLIC_API_HOST: eth-goerli.blockscout.com + NEXT_PUBLIC_API_HOST: eth.blockscout.com NEXT_PUBLIC_STATS_API_HOST: https://stats-goerli.k8s-dev.blockscout.com/ NEXT_PUBLIC_VISUALIZE_API_HOST: http://visualizer-svc.visualizer-testing.svc.cluster.local/ NEXT_PUBLIC_CONTRACT_INFO_API_HOST: https://contracts-info-test.k8s-dev.blockscout.com @@ -65,6 +65,7 @@ frontend: NEXT_PUBLIC_MARKETPLACE_CONFIG_URL: https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/marketplace/eth-goerli.json NEXT_PUBLIC_GRAPHIQL_TRANSACTION: 0xf7d4972356e6ae44ae948d0cf19ef2beaf0e574c180997e969a2837da15e349d NEXT_PUBLIC_WEB3_WALLETS: "['token_pocket','coinbase','metamask']" + NEXT_PUBLIC_TRANSACTION_INTERPRETATION_ENABLED: true NEXT_PUBLIC_VIEWS_ADDRESS_IDENTICON_TYPE: gradient_avatar NEXT_PUBLIC_VIEWS_ADDRESS_HIDDEN_VIEWS: "['top_accounts']" NEXT_PUBLIC_VIEWS_CONTRACT_SOLIDITYSCAN_ENABLED: true From 9306b500ac0babda7dedbd57ecce45fe4425e56e Mon Sep 17 00:00:00 2001 From: isstuev Date: Mon, 25 Dec 2023 17:25:10 +0100 Subject: [PATCH 03/20] add native var --- ui/tx/interpretation/TxInterpretation.tsx | 11 ++++++++--- ui/tx/interpretation/utils.test.ts | 4 ++-- ui/tx/interpretation/utils.ts | 4 +++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ui/tx/interpretation/TxInterpretation.tsx b/ui/tx/interpretation/TxInterpretation.tsx index adb911d1c0..7ac6905ddc 100644 --- a/ui/tx/interpretation/TxInterpretation.tsx +++ b/ui/tx/interpretation/TxInterpretation.tsx @@ -5,13 +5,14 @@ import React from 'react'; import type { TxInterpretationResponse, TxInterpretationVariable } from 'types/api/txInterpretation'; +import config from 'configs/app'; import actionIcon from 'icons/action.svg'; import type { ResourceError } from 'lib/api/resources'; import dayjs from 'lib/date/dayjs'; import AddressEntity from 'ui/shared/entities/address/AddressEntity'; import TokenEntity from 'ui/shared/entities/token/TokenEntity'; -import { extractVariables, getStringChunks } from './utils'; +import { extractVariables, getStringChunks, NATIVE_COIN_SYMBOL_VAR_NAME } from './utils'; type Props = { query: UseQueryResult; @@ -54,8 +55,12 @@ const TxInterpretation = ({ query, className }: Props) => { { chunks.map((chunk, index) => { return ( <> - { chunk } - { index < chunks.length - 1 && } + { chunk.trim() + ' ' } + { index < chunks.length - 1 && ( + variablesNames[index] === NATIVE_COIN_SYMBOL_VAR_NAME ? + { config.chain.currency.symbol } : + + ) } ); }) } diff --git a/ui/tx/interpretation/utils.test.ts b/ui/tx/interpretation/utils.test.ts index 8122e3e785..9751906490 100644 --- a/ui/tx/interpretation/utils.test.ts +++ b/ui/tx/interpretation/utils.test.ts @@ -1,10 +1,10 @@ import { extractVariables, checkTemplate } from './utils'; -const template = '{action_type} {source_amount} Ether into {destination_amount} {destination_token}'; +const template = '{action_type} {source_amount} {native} into {destination_amount} {destination_token}'; it('extracts variables names', () => { const result = extractVariables(template); - expect(result).toEqual([ 'action_type', 'source_amount', 'destination_amount', 'destination_token' ]); + expect(result).toEqual([ 'action_type', 'source_amount', 'native', 'destination_amount', 'destination_token' ]); }); it('check template true', () => { diff --git a/ui/tx/interpretation/utils.ts b/ui/tx/interpretation/utils.ts index b10ba37b19..8826e38cc0 100644 --- a/ui/tx/interpretation/utils.ts +++ b/ui/tx/interpretation/utils.ts @@ -4,6 +4,8 @@ import type { TxInterpretationSummary } from 'types/api/txInterpretation'; // eslint-disable-next-line regexp/no-useless-non-capturing-group export const VAR_REGEXP = /\{(?:[^}]+)\}/g; +export const NATIVE_COIN_SYMBOL_VAR_NAME = 'native'; + export function extractVariables(templateString: string) { const matches = templateString.match(VAR_REGEXP); @@ -22,7 +24,7 @@ export function checkTemplate(summary: TxInterpretationSummary) { const variablesNames = extractVariables(summary.summary_template); for (const name of variablesNames) { - if (!summary.summary_template_variables[name]) { + if (name !== NATIVE_COIN_SYMBOL_VAR_NAME && !summary.summary_template_variables[name]) { return false; } } From 97c1a9f3ae813352b6010040aefd12c18ce8ac10 Mon Sep 17 00:00:00 2001 From: isstuev Date: Mon, 25 Dec 2023 19:48:46 +0100 Subject: [PATCH 04/20] add tx actions and change logics --- stubs/tx.ts | 65 ++++++++++++------ ui/pages/Transaction.tsx | 26 +++++-- ui/tx/TxDetails.tsx | 31 +++++++-- .../TxDetailsAction.tsx | 0 .../TxDetailsActionsFallback.tsx | 21 ++++++ .../TxDetailsActionsInterpretation.tsx | 25 +++++++ .../TxDetailsActionsWrapper.tsx} | 17 ++--- ui/tx/interpretation/TxInterpretation.pw.tsx | 6 +- ui/tx/interpretation/TxInterpretation.tsx | 55 +++++++++------ ...olor-mode_base-view-mobile-dark-mode-1.png | Bin 9530 -> 9549 bytes ...x_default_base-view-mobile-dark-mode-1.png | Bin 9280 -> 9283 bytes ...sx_mobile_base-view-mobile-dark-mode-1.png | Bin 8976 -> 9025 bytes ui/tx/interpretation/utils.test.ts | 38 ++-------- ui/tx/interpretation/utils.ts | 15 ---- 14 files changed, 183 insertions(+), 116 deletions(-) rename ui/tx/details/{ => txDetailsActions}/TxDetailsAction.tsx (100%) create mode 100644 ui/tx/details/txDetailsActions/TxDetailsActionsFallback.tsx create mode 100644 ui/tx/details/txDetailsActions/TxDetailsActionsInterpretation.tsx rename ui/tx/details/{TxDetailsActions.tsx => txDetailsActions/TxDetailsActionsWrapper.tsx} (83%) diff --git a/stubs/tx.ts b/stubs/tx.ts index 35ec3b47ef..a7417c9cd6 100644 --- a/stubs/tx.ts +++ b/stubs/tx.ts @@ -63,28 +63,53 @@ export const TX_RAW_TRACE: RawTracesResponse = []; export const TX_INTERPRETATION: TxInterpretationResponse = { data: { - summaries: [ { - summary_template: '{action_type} {source_amount} Ether into {destination_amount} {destination_token}', - summary_template_variables: { - action_type: { type: 'string', value: 'Wrap' }, - source_amount: { type: 'currency', value: '0.7' }, - destination_amount: { type: 'currency', value: '0.7' }, - destination_token: { - type: 'token', - value: { - name: 'Museion', - type: 'ERC-20', - symbol: 'MUSA', - address: '0x486a3c5f34cDc4EF133f248f1C81168D78da52e8', - holders: '1152', - decimals: '18', - icon_url: null, - total_supply: '210000000000000000000000000', - exchange_rate: null, - circulating_market_cap: null, + summaries: [ + { + summary_template: '{action_type} {source_amount} Ether into {destination_amount} {destination_token}', + summary_template_variables: { + action_type: { type: 'string', value: 'Wrap' }, + source_amount: { type: 'currency', value: '0.7' }, + destination_amount: { type: 'currency', value: '0.7' }, + destination_token: { + type: 'token', + value: { + name: 'Museion', + type: 'ERC-20', + symbol: 'MUSA', + address: '0x486a3c5f34cDc4EF133f248f1C81168D78da52e8', + holders: '1152', + decimals: '18', + icon_url: null, + total_supply: '210000000000000000000000000', + exchange_rate: null, + circulating_market_cap: null, + }, }, }, }, - } ], + { + summary_template: '{action_type} {source_amount} Ether into {destination_amount} {destination_token}', + summary_template_variables: { + action_type: { type: 'string', value: 'Wrap' }, + source_amount: { type: 'currency', value: '0.7' }, + destination_amount: { type: 'currency', value: '0.7' }, + destination_token: { + type: 'token', + value: { + name: 'Museion', + type: 'ERC-20', + symbol: 'MUSA', + address: '0x486a3c5f34cDc4EF133f248f1C81168D78da52e8', + holders: '1152', + decimals: '18', + icon_url: null, + total_supply: '210000000000000000000000000', + exchange_rate: null, + circulating_market_cap: null, + }, + }, + }, + }, + ], }, }; diff --git a/ui/pages/Transaction.tsx b/ui/pages/Transaction.tsx index 362fb17a62..4b12436eb4 100644 --- a/ui/pages/Transaction.tsx +++ b/ui/pages/Transaction.tsx @@ -1,4 +1,4 @@ -import { Box, Flex } from '@chakra-ui/react'; +import { Box, Flex, Link } from '@chakra-ui/react'; import { useRouter } from 'next/router'; import React from 'react'; @@ -18,8 +18,8 @@ import PageTitle from 'ui/shared/Page/PageTitle'; import RoutedTabs from 'ui/shared/Tabs/RoutedTabs'; import TabsSkeleton from 'ui/shared/Tabs/TabsSkeleton'; import useTabIndexFromQuery from 'ui/shared/Tabs/useTabIndexFromQuery'; +import { TX_ACTIONS_BLOCK_ID } from 'ui/tx/details/txDetailsActions/TxDetailsActionsWrapper'; import TxInterpretation from 'ui/tx/interpretation/TxInterpretation'; -import { checkTemplate as checkInterpretationTemplate } from 'ui/tx/interpretation/utils'; import TxDetails from 'ui/tx/TxDetails'; import TxDetailsWrapped from 'ui/tx/TxDetailsWrapped'; import TxInternals from 'ui/tx/TxInternals'; @@ -53,7 +53,11 @@ const TransactionPageContent = () => { }); const tabs: Array = [ - { id: 'index', title: config.features.suave.isEnabled && data?.wrapped ? 'Confidential compute tx details' : 'Details', component: }, + { + id: 'index', + title: config.features.suave.isEnabled && data?.wrapped ? 'Confidential compute tx details' : 'Details', + component: , + }, config.features.suave.isEnabled && data?.wrapped ? { id: 'wrapped', title: 'Regular tx details', component: } : undefined, @@ -86,13 +90,21 @@ const TransactionPageContent = () => { }; }, [ appProps.referrer ]); - const hasInterpretation = - hasInterpretationFeature && (txInterpretationQuery.isPlaceholderData || - (txInterpretationQuery.data?.data.summaries[0] && checkInterpretationTemplate(txInterpretationQuery.data.data.summaries[0]))); + const hasInterpretation = hasInterpretationFeature && + (txInterpretationQuery.isPlaceholderData || txInterpretationQuery.data?.data.summaries.length); const titleSecondRow = ( - { hasInterpretationFeature && } + { hasInterpretationFeature && ( + + + { !txInterpretationQuery.isPlaceholderData && txInterpretationQuery.data?.data.summaries && txInterpretationQuery.data?.data.summaries.length > 1 && + all actions } + + ) } { !hasInterpretation && } { !data?.tx_tag && } diff --git a/ui/tx/TxDetails.tsx b/ui/tx/TxDetails.tsx index df1cec00ee..f9f32da426 100644 --- a/ui/tx/TxDetails.tsx +++ b/ui/tx/TxDetails.tsx @@ -12,15 +12,18 @@ import { Skeleton, Alert, } from '@chakra-ui/react'; +import type { UseQueryResult } from '@tanstack/react-query'; import BigNumber from 'bignumber.js'; import React from 'react'; import { scroller, Element } from 'react-scroll'; import { ZKEVM_L2_TX_STATUSES } from 'types/api/transaction'; +import type { TxInterpretationResponse } from 'types/api/txInterpretation'; import { route } from 'nextjs-routes'; import config from 'configs/app'; +import type { ResourceError } from 'lib/api/resources'; import { WEI, WEI_IN_GWEI } from 'lib/consts'; import dayjs from 'lib/date/dayjs'; import getNetworkValidatorTitle from 'lib/networks/getNetworkValidatorTitle'; @@ -44,7 +47,8 @@ import TextSeparator from 'ui/shared/TextSeparator'; import TxFeeStability from 'ui/shared/tx/TxFeeStability'; import Utilization from 'ui/shared/Utilization/Utilization'; import VerificationSteps from 'ui/shared/verificationSteps/VerificationSteps'; -import TxDetailsActions from 'ui/tx/details/TxDetailsActions'; +import TxDetailsActionsFallback from 'ui/tx/details/txDetailsActions/TxDetailsActionsFallback'; +import TxDetailsActionsInterpretation from 'ui/tx/details/txDetailsActions/TxDetailsActionsInterpretation'; import TxDetailsFeePerGas from 'ui/tx/details/TxDetailsFeePerGas'; import TxDetailsGasPrice from 'ui/tx/details/TxDetailsGasPrice'; import TxDetailsOther from 'ui/tx/details/TxDetailsOther'; @@ -55,7 +59,11 @@ import TxAllowedPeekers from 'ui/tx/TxAllowedPeekers'; import TxSocketAlert from 'ui/tx/TxSocketAlert'; import useFetchTxInfo from 'ui/tx/useFetchTxInfo'; -const TxDetails = () => { +type Props = { + txInterpretationQuery?: UseQueryResult; +} + +const TxDetails = ({ txInterpretationQuery }: Props) => { const { data, isPlaceholderData, isError, socketStatus, error } = useFetchTxInfo(); const [ isExpanded, setIsExpanded ] = React.useState(false); @@ -98,8 +106,6 @@ const TxDetails = () => { ...toAddress?.watchlist_names || [], ].map((tag) => { tag.display_name }); - const actionsExist = data.actions && data.actions.length > 0; - const executionSuccessBadge = toAddress?.is_contract && data.result === 'success' ? ( @@ -242,9 +248,22 @@ const TxDetails = () => { - { actionsExist && ( + { config.features.txInterpretation.isEnabled && txInterpretationQuery !== undefined && ( + <> + + { (isPlaceholderData || + txInterpretationQuery.isPlaceholderData || + (txInterpretationQuery.data?.data.summaries && txInterpretationQuery.data?.data.summaries.length > 1)) && + } + + ) } + { /* if tx interpretation is not configured, show tx actions from tx info */ } + { !config.features.txInterpretation.isEnabled && data.actions && data.actions.length > 0 && ( <> - + ) } diff --git a/ui/tx/details/TxDetailsAction.tsx b/ui/tx/details/txDetailsActions/TxDetailsAction.tsx similarity index 100% rename from ui/tx/details/TxDetailsAction.tsx rename to ui/tx/details/txDetailsActions/TxDetailsAction.tsx diff --git a/ui/tx/details/txDetailsActions/TxDetailsActionsFallback.tsx b/ui/tx/details/txDetailsActions/TxDetailsActionsFallback.tsx new file mode 100644 index 0000000000..02dfbbf8dc --- /dev/null +++ b/ui/tx/details/txDetailsActions/TxDetailsActionsFallback.tsx @@ -0,0 +1,21 @@ +import React from 'react'; + +import type { TxAction } from 'types/api/txAction'; + +import TxDetailsAction from './TxDetailsAction'; +import TxDetailsActionsWrapper from './TxDetailsActionsWrapper'; + +interface Props { + actions: Array; + isLoading: boolean; +} + +const TxDetailsActionsFallback = ({ actions, isLoading }: Props) => { + return ( + + { actions.map((action, index: number) => ) } + + ); +}; + +export default TxDetailsActionsFallback; diff --git a/ui/tx/details/txDetailsActions/TxDetailsActionsInterpretation.tsx b/ui/tx/details/txDetailsActions/TxDetailsActionsInterpretation.tsx new file mode 100644 index 0000000000..5dff8432a8 --- /dev/null +++ b/ui/tx/details/txDetailsActions/TxDetailsActionsInterpretation.tsx @@ -0,0 +1,25 @@ +import React from 'react'; + +import type { TxInterpretationSummary } from 'types/api/txInterpretation'; + +import TxInterpretation from 'ui/tx/interpretation/TxInterpretation'; + +import TxDetailsActionsWrapper from './TxDetailsActionsWrapper'; + +interface Props { + actions?: Array; + isLoading: boolean; +} + +const TxDetailsActionsInterpretation = ({ isLoading, actions }: Props) => { + if (!actions || actions.length < 2) { + return null; + } + return ( + + { actions.map((action, index: number) => ) } + + ); +}; + +export default TxDetailsActionsInterpretation; diff --git a/ui/tx/details/TxDetailsActions.tsx b/ui/tx/details/txDetailsActions/TxDetailsActionsWrapper.tsx similarity index 83% rename from ui/tx/details/TxDetailsActions.tsx rename to ui/tx/details/txDetailsActions/TxDetailsActionsWrapper.tsx index 200e0315fc..75ee018d49 100644 --- a/ui/tx/details/TxDetailsActions.tsx +++ b/ui/tx/details/txDetailsActions/TxDetailsActionsWrapper.tsx @@ -1,19 +1,18 @@ import { Flex, useColorModeValue } from '@chakra-ui/react'; import React from 'react'; -import type { TxAction } from 'types/api/txAction'; - import DetailsInfoItem from 'ui/shared/DetailsInfoItem'; -import TxDetailsAction from './TxDetailsAction'; - const SCROLL_GRADIENT_HEIGHT = 48; -interface Props { - actions: Array; +type Props = { + children: React.ReactNode; + isLoading?: boolean; } -const TxDetailsActions = ({ actions }: Props) => { +export const TX_ACTIONS_BLOCK_ID = 'tx-actions'; + +const TxDetailsActions = ({ children, isLoading }: Props) => { const containerRef = React.useRef(null); const [ hasScroll, setHasScroll ] = React.useState(false); @@ -34,8 +33,10 @@ const TxDetailsActions = ({ actions }: Props) => { hint="Highlighted events of the transaction" note={ hasScroll ? 'Scroll to see more' : undefined } position="relative" + isLoading={ isLoading } > { pr={ hasScroll ? 5 : 0 } pb={ hasScroll ? 10 : 0 } > - { actions.map((action, index: number) => ) } + { children } ); diff --git a/ui/tx/interpretation/TxInterpretation.pw.tsx b/ui/tx/interpretation/TxInterpretation.pw.tsx index 026d75a8e9..e1305d13f1 100644 --- a/ui/tx/interpretation/TxInterpretation.pw.tsx +++ b/ui/tx/interpretation/TxInterpretation.pw.tsx @@ -1,10 +1,6 @@ import { test, expect } from '@playwright/experimental-ct-react'; -import type { UseQueryResult } from '@tanstack/react-query'; import React from 'react'; -import type { TxInterpretationResponse } from 'types/api/txInterpretation'; - -import type { ResourceError } from 'lib/api/resources'; import { txInterpretation as txInterpretationMock } from 'mocks/txs/txInterpretation'; import TestApp from 'playwright/TestApp'; @@ -13,7 +9,7 @@ import TxInterpretation from './TxInterpretation'; test('base view +@mobile +@dark-mode', async({ mount }) => { const component = await mount( - }/> + , ); diff --git a/ui/tx/interpretation/TxInterpretation.tsx b/ui/tx/interpretation/TxInterpretation.tsx index 7ac6905ddc..84823007ef 100644 --- a/ui/tx/interpretation/TxInterpretation.tsx +++ b/ui/tx/interpretation/TxInterpretation.tsx @@ -1,13 +1,11 @@ -import { Skeleton, Text, Icon, chakra } from '@chakra-ui/react'; -import type { UseQueryResult } from '@tanstack/react-query'; +import { Skeleton, Flex, Text, Icon, chakra } from '@chakra-ui/react'; import BigNumber from 'bignumber.js'; import React from 'react'; -import type { TxInterpretationResponse, TxInterpretationVariable } from 'types/api/txInterpretation'; +import type { TxInterpretationSummary, TxInterpretationVariable } from 'types/api/txInterpretation'; import config from 'configs/app'; import actionIcon from 'icons/action.svg'; -import type { ResourceError } from 'lib/api/resources'; import dayjs from 'lib/date/dayjs'; import AddressEntity from 'ui/shared/entities/address/AddressEntity'; import TokenEntity from 'ui/shared/entities/token/TokenEntity'; @@ -15,53 +13,68 @@ import TokenEntity from 'ui/shared/entities/token/TokenEntity'; import { extractVariables, getStringChunks, NATIVE_COIN_SYMBOL_VAR_NAME } from './utils'; type Props = { - query: UseQueryResult; + summary?: TxInterpretationSummary; + isLoading?: boolean; className?: string; } -const TxInterpretationElementByType = ({ type, value }: TxInterpretationVariable) => { +const TxInterpretationElementByType = ({ variable }: { variable?: TxInterpretationVariable }) => { + if (!variable) { + return null; + } + + const { type, value } = variable; switch (type) { case 'address': return ; case 'token': return ; - case 'currency': - return { BigNumber(value).toFormat() }; + case 'currency': { + let numberString = ''; + if (BigNumber(value).isLessThan(0.1)) { + numberString = BigNumber(value).toPrecision(2); + } else if (BigNumber(value).isLessThan(10000)) { + numberString = BigNumber(value).dp(2).toFormat(); + } else { + numberString = BigNumber(value).dividedBy(1000).toFormat(2) + 'K'; + } + return { numberString + ' ' }; + } case 'timestamp': // timestamp is in unix format - return { dayjs(Number(value) * 1000).format('llll') }; + return { dayjs(Number(value) * 1000).format('llll') + ' ' }; case 'string': default: { - return { value.toString() }; + return { value.toString() + ' ' }; } } }; -const TxInterpretation = ({ query, className }: Props) => { - if (!query.data?.data.summaries[0]) { +const TxInterpretation = ({ summary, isLoading, className }: Props) => { + if (!summary) { return null; } - const template = query.data.data.summaries[0].summary_template; - const variables = query.data.data.summaries[0].summary_template_variables; + const template = summary.summary_template; + const variables = summary.summary_template_variables; const variablesNames = extractVariables(template); const chunks = getStringChunks(template); return ( - + { chunks.map((chunk, index) => { return ( - <> - { chunk.trim() + ' ' } - { index < chunks.length - 1 && ( + + { chunk.trim() + (chunk.trim() && variablesNames[index] ? ' ' : '') } + { index < variablesNames.length && ( variablesNames[index] === NATIVE_COIN_SYMBOL_VAR_NAME ? - { config.chain.currency.symbol } : - + { config.chain.currency.symbol + ' ' } : + ) } - + ); }) } diff --git a/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_dark-color-mode_base-view-mobile-dark-mode-1.png b/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_dark-color-mode_base-view-mobile-dark-mode-1.png index 5366d76e3ac05429f06723d8d3e708b847896501..73d5bac99ce316def34378c1729e1395e79436e9 100644 GIT binary patch literal 9549 zcmY*heC@>aEccT?(XgqTuN|vhcA7e z^SDyIb-WYaI<-< z`D#(X&Grzq>@*TzSC^nn`TFIHXMUgF|L4&3OERPO+5f%r_dX@F9A5F!6)_BYubt5F zQtv%!>VR@)48WC>e&0l1Lvz7Aersbhia~*zi8>sJa~Kt!aGlDH7l*g8FX-TKLOC*s zvzKi1DVGLt`oV*P;46(p*3i3^`u~0G%XBO{qO#Of-JPlIR(692v?$3Om6B!Of#vFG z$uPIE%8Huyxp^`(bvH(}6Ut3_!Yf;S6mjw0!HC=-taZUhU~k zR}IAV#bXBW-UMH&BaZ^c|GeJI7yeH#5l`~OB80B{QC~lWG!G@sgNMr?d`T`D;#9d| z3PL(df^{wzq)De!oD;|0y#oWp1nPjOZ2;WFq`zNM2GpaKB+s+O@0ICJwpI5I$@=uv zoryWF6H9M0y87%Oz$KhF$A%(;YU8j{P1S&o?QZeie?Re)%}?So%jvW1@x5V>*KZ$~ z&)*0F7X_P!c=hlkHn+o4LI|#GLlUyo*a+4|bR|_wcf0wsf|g#H9H^fuemKo2F`_$e zP-fXQFo$IFOwR^pk+HCBwWVk};$^1_c2q{!bXqpw`Y5 zyO#bq2IY)e#wSf{8=D)CPE>qW9m&3UrcrIOe^)<<-MlSEOJhvLUZnuw2|uRH=Cqlw zVY+Y~rhWh3_wnI&?eMT?f6nQn)1`Gm?bk+En>@KR>5Ea(*;!yVUVFxp5v;+?j74C2gMIYLF7!03U$e6x!`&NT2XzZz630IY0Zdd45tMEZx7 zg3@_`({VC3y^t-ThI3gDMD%IvuByT*NAD<9#dhKiNw4EKy2Y)L6N8Q`C|d5Hf_WZ^ zBYj&u?HcN`gw3aAn_K0^LHm6jp^taNAODC(?A)tiy!GBx81V*-o8PhREi%il_k?S< zSThKLE~zev+<)NJ3X|NDm~Puaf`U*2P_c59^X2Q}-PYR!H2mH6zm28~X*uQ<@8nIH zSXm7|p<-p(EY#H1*GI?2^*uhI&Axjlu9tqYV(IVzsHO-iFE9VPHvwfiv^}Juqpk3H z0`uBnP>DSCH!=0k65k3~{x1H2a#qCdSfAS0_rZ04vA^87*ZG^zO7#ysCN+HRt;oHZ zq$ytCv@|lm05mSEOVR+x;17G=Vwy0!eZb?qRcX2P4(_mf!Z(q*Tqm;zH=JL|wE)c| z&BX>hdBrhPs9q!LCs$YA_V#wK<911jNFu8$@V}TF#STC%<|PBIs@kyb+~Lq*O=#5EZuU~lD|u$cDnsFG|2E( z1ZnpwMRs6muTBN@Wv>ClT-bx`(l)-Xeovc|e5rG~7vd?@YqYo99xrz$y_m;9nl!1t zrFC%`U|+N(em1w<%ox6s0_W-g1Ck=*`*Y+WPu% zkKE_QMz=^}9!qxTZBSi9!|8^)etg|iUX^a#&Dqx4`ax&jFS*4=0=e+rX(E2>4^UR9 z*Tn^lmRMWNlXx$H65|N?jgv?&h1aBKD`RbY`?qn<-dKy!icf2BD(MnWkzTW>O6j4o zV`Is~L;vs~H4RM{vo|IJrk$0`kVOCbyM6_chd_K5t=FWaLy>zv9Wy{2}iza+z3$0~MR@FxqF1h=oPT*a1?V5Z`@f0l&K(EyNPaW`IMv?d*NaMtr_Cf5(%z8v|q3$PYd5^d50 z6~|U$USeO~Uk@9pO)?ye>UJ~l{Z%VLyQZchODY!ja=xj4mVaq+aeJzOn#*(u4lhtf z(rI#!-Y>RB#Uk!YDAE2}ph8!ID4QGW>j9-1Y>28$FDR%(9UC9t9eA>?QEwTauoYYI zPt`m*IcXn-MLMki*p5jX{(JXg7(lE$MD!Prci328okbiU?@>-2&j@ipYV`Wj#`c>Z z9F0CcM|0jq-=4t=63w(?W)0@GS+L(cPr`jV9PnH@F2178GZ+C^XxG|SUD^#_qp#O{ zob?YT#OBK*s?savd|68Fb4CXT2O1h0`y)MWn}w=3sLcP=O1<|899|H!lai2V*VyTZ zWjuvs~p z$-jO3W`8;*1-^F>+S%D5zB+4bqx?zEl^l#k5(7yY41N1_ytF(0&9t!D+;XP4|Myo4 z#i#gNIQ*N_?KzPeRO^eH8orb1Xr5|O0@D7=W$aJ+Bf8vnSPQjwy=}_;RLZBTKsP2X@oYYh~Ay?3&5YXRy0aX}vL$cMZHG9Mt}u@qljZJ&ZFr`$IQ zii$$ZY?t^Czoa~Ztlt+sBMLT&(}+&gkHt`fy&9NyW>k>OdNWEE8aE)vkK5o9n$Z4% zo+mxg2~;pu#q|aa+%w-EFE4{_f2a5w=Js2Nn+89@S*HrpwE(FvGYxaC#!uiTukkHf zNXYDi8JmOd6%#X9U=68|ct7b}Pe$YLu8uH%Wa@%b2_(*|0r-HjhyBiL^;#b(a2~j` zN&QE`$ zlFFA)b2;xDQS-?U-fYZ#Oqp=CwPn@!xuBil<^4%66#V=52Y#2Ce3^u=x?vGEYo1s; z7Kd);KbbPs3E5Y5_pNRE2f(L|bzXddwo45=gk}2&2NsigJirLjTyM}i!y6i0^wO!K ze7ro3cl7i?1OUHCN`9ZY_pO)%yd&S+DraM`xxF~(q-cB^Ud-q`3qSCe&qhjwYr#)Tr1 zE|@gj`Y4TPTox7x_tt`^p<}8=IWJD}hD3 zK)I3k2+JEshDipW?eSTXY!74*;&5>5Vmg!>nw?Ee9gJf->ri7Y`%HOav z_;klCBQ`m?u%BR}+!zhPoCg$0z?-|%MclTF-!-|+j{Ea75cMR;=z>++$jGSN8>&-) z%bD~u#j^vyRJTzg1p8n(h6_bT#wyk%+|b5Yo$;b8eF504*RV#Dhu|yE^QC#}&nIP@ zHwK!lA2mUg=NoKDq@<*h>osOc z%H~q+IPI2out~2|>v1PG(t9H z_YICa#>7aneA4Pl$$sGp=~;Ynw)rcQr@ok@)<$g4=_>+h-glQ9kxPyJ1B}ae?83t7 z2xhUP<8u}c_#W0EhQPIIkqU>!Ujox1nX9yauy4M)H;6{@^BW8*;{57;5XY2{@`9_g zbH~I4Zm4*c$*&kmn%RYg^}PjO90_pSQKKtf(T|pL7M)T`q2U{BxlGIW!oCehmUXXNb`QIhi574>N2F=6LI_R7c;xssD_-p zc&Ni5NfEtqpix3?6+s39&3H?+{VEa_D<%x40W0>0i+sadx{Z&kwP~#uF*g35PQu>v z+{`Q)&Ss!v>vg?%Y*eS$cN&AK(OPqf2SG+#g(FLJ3hZo=k+nYhdOJK3zq1!YTQzT` z?uKbuS)sG_A6*wUE{{aoCQJsoVI!$RgS9K*&O2%ecB@P4*m?6*3#%BNh(b~#X&llV zhwgzF@b0s;XisZW-KmS*9btpb96BQln;${dWMPZUSrIn*T7$ye+af_x;b$Hj2jzhX z$i{B#s*R^K2uV0NKYj|Z$+)+qdCaiMTS}!TM>+wFIIc(9g`3+X_KAHKzkjHlX-AUG zX%cos$HkOM8|#t|pQm)X`g7?Qo@{j*;wI@uYMSVL$BEb?{BOX>E2%RUpd(<(@FgxY z%TQ84@C>}-of35g60s;k-TS-t7`sn(WM(EYo$P<{FN*W)D!_o$)fJ_$zT z#b67YgPYs)F?aPOQBl!noJp@R3#w-0(El}w(pmUXi)Y9hl*cPEwjTLpzl;v3oU4G$ z;BfeBZ(thQFPp9OkBxEbr7Pf#_6Lwjp~2^tpUh`^>88WU1uN_e z3s&$jy3bfRIGywJ7-(o{hl|ZJo}T<~>E#U;Y7PQ}gB_33Pr&XT9)G=vHL(z$6m4Ip ztWnhWbmkZty|8KjuF@;R3(v=%}YTOT=$z!ZsI4_P5M1p`Yd8HB)w!_p}s7;i+ z-*KTDBL1-Q|(a3`iT4~k9#dseALU^|FS6_ z2?7|(IapjNb1L{GeJ*!Mx&l2b;U(vX+?hSnTtE$R%2B=P*0$G%!$s82KAcnJsLiN& zbNNR6xH=h~Fw9wQG(3L%Bl%JQ$2T|ac|`hjxeL^HtH>r=G8ZA{qUaUIV@ju8K3;ct$77PG1lW}BYKVO}_dwNixOP|Tpe1q9dD0xHdh zza1@m6R&GY!JNHa@HQK#i_qtrh}-}Gty+s=HW9m3L=!{DUs(Y^SobzkOuN0k(1IndSB^;_SDM9#nc zSP--7m4^HX)OmLt$2X59a>IaA;l*QJK1+%VkQ~iNr%fyNT9x@lQ)_j%N)u8;Dm~I%vG9c zR;qbtDLK^D{T2d(Z@&2W?{uJ6<$DO|9HY)mPpi_u>gb*eLby{Em6dV{AkFg9?Jx44 zxC8gSYwUCp1=6`xOqw>|%H4`YO^r@gEWT1jT5n7!WK3Fj)N+$O@Sut8=~-iEZ-t(% z*I#c(+h!dBBgu`7jRTsSo271ovJSXTqgKy64{=NyaipMd@Zzg# zG|_Q1Isyv)#l5DHmDa>fO7+Ak5Fmp;6l7tzOUm3fmaH=qr@DanwB4gH2*Tt^cG2$+ z!_z$NCeUdF>+W&4#T4&!Ppc-*&T1gut{$0G#KAw3PR{7|+~O4({}6Mt+(8H>hO=Kv z>PH8EskijI)44gu+QhOc!f8`e+$xNCNlA`>{*dFR9FrRywRj``6NgaV_VB(p&z?2B z!N->u7Z2>esl|AuE-xRUwJf8{?`C=mk3{0`U-fx<0Laa5pk)igFAo+>TI}4%FKIUq z%m1uTODN*t;E)S@nNJ8IYS4%JuV4Rhtv~N%o3s_KY6el?x$eBIHeWzdVa!ot@S~=u zjF(2gH8e>I@qU-4ga@#J3VDi!h`40IMfnG0{_6ahM2S@F(=yA~Qfe+`XNvvI`>dSF#rRl?56mCOiESz7W%qBqllNf$tuIzP8Wb!x3l`8mm#Y1x>b!-&EB z9oSNP*x&q4cr&=rilgR=?fh^XD6frNgpi?&!XscV zY@mW2jS@p7baz1L6`w@7>+|xma$vNvo|1z$1fz+^gUl_$X8jyS5fhsSRxBL*g%VG^ zv#C%pdExyBn);rl0j`%!o6EgrYBBOzxx7k6q>aEm_?=*vG{(i?K;dkqlyutT!<_>{ zKvPju%eC~*%_Zf^w5+amenfPFlK7|oMV=)^UDui#mERg)nb?$(%|_F6L03rD*4BL- z99_ey;CJ0KGYJ@YjN2E^!k|lLAx~%6crJ~xwpQTME3Q2icwF4ON4^`Jr3RM`cz~C~FE-i$Hk1xH0@T8NIYiMd#*etjX z)1m#!%*fEZa0h|TY<*lrJ%dEsr>$VKgSV2=oG_UC|Hs48N`)xjatyU~?Y1l+;QryP|JVLp=3oK`K`d#Tez^4ejQ zV7R*K?#(y4F2%}9+f$d&AOt1Dp<+D`>``X=(>AJN$AttV#&UsMxq&EZ=j9|rF{WAF zz3kEjFMcJ)^jm73$;mJk*L zFY|kHTTXqyzP`pKDg9ZEWk4BkdAoYJ*)vK4o+yV(Sv&*DFt` zl+|Uc$7`LYOHapZVhB%y98ahUN>5M!*7Kt9R)1R+NmNXX2Zj+d0O@YYJk}5?^6p=1 zbPEMtM+rBB_Tn_Pv?k6D(o;ozGR4^x1Kjp=fLG*GMe6GL`%8}xCpKfgWo7iJycBj6 zRJJR;jsG+MF$w7}Ez})|&o}-=akvr=KN1NDUr|I|jQB~z!xN7vl@(4~@{Uet?(5+I zb68EuNeZT+v2o}3H=PBF<%2C~4qfBRg_I2(PVJ`-+;vn;Tt529s4E zJJT^&`X?brs?*j;<+bTfT3)qbC#ssy6&WV}klEHq+U)EsCk=bl_4NzaqdDW6R1Ww~ ze_ewIVH|p^$$W~vM}r5YJgYEP->59m(jv(FW{P%@Ew>@UD~~W+~i{}IVf1H zdaF0Qve}VbfEue$ADFhjc{qLDA`l*U>=VAJ{_La2w+uRFDNE+3gwQn^4i1hF@r(!~ zVsPBJm%H9btwg7LvEE6sK!sGu^%aSg)$-vDub!SBvsTk=P6IOQpz(1<{93W&dxhNh zz})u)D2$xt(Gu%4&3-B|zS2h5;a8t)CB#=)9$%Dn=&Y2-)Hu10dHo@#dVD0pw9?+a zAO)IEh-F1skN4eNUv*FCBcq96zUQJ0J{Gb%0l6_EEZzwk$IV%v>bYrZG5pzE{L7b26^0~X zZ{ieQlr=cK>(}S!eD24;B{0PxZ_J0)j_VyhqLfEJ>sUPnpumpyL7@L@c z`xL1;@6Y<(U^>S(Lrg_xigg33ulKg36BVi%W`+udZN4KQa-*+fI|t z5de{au)cZwwsZCAAyVY&e$e_zEMB_%Vh`Y6JzliGR6BZ&<@w>jTWq`>jDLrltJFV{ zJE&1*PdPF&vM*xqi)bQ(LW0{D@@$MMzuOi)oMgC#8{Llb48=qe*!1P??b#u0AqHkv zGE7fu&gLuW-9K8#q)+vVTv=Fky*SPcF#d}2WBqQL=LzD^TrWA_VW5!sT;C>zVB<$2 zJZE@h{_$E!b|Q}xK7uff=-0IYR=|VBNnEl}dS+%4hS(-VQsC}y7U1Vx~SX~`I2i{9WDLCr}AM#dVM`MBcr!-_CxFfiaFmG zZ>j{PXazM#L8&(cd^HA0hzY}PUyr^(_uAZ%BK@kE9+}{Ct0YXmf|D*i;i2IT>S{p) znzs5Qk&fP0HpCo4xpMvWsS~GEi&J>^*Q}tIW z=;~RH0BF^SX?AfbP$4G;yuGRK={)%KUl$BR^qyFIift@AFsReBu_u5QJ*p7r;Gq!Y$e$CpPkOSQeflo%!J-2y6$dT>D} zp@uYUOk|-`O2(TU=X@gCBca`5$0Q%q06oR;MP%d`r{4y?U|Ah5S2(@Wm={=EDg;0P zi5Yi==O32pHItpnK41j-Gf*fPE?zqfC2|BTE|OwX2zTsGuULIUw0Wnk;q~=?3J%bW z^+<-uC}NIfbeLK}W())Z8=QAKVEW!Rr$Q|)ElszD^LKXb{x|#^LZD_bOUptjtA+v> z7KA5>Xc3c{VrYobX$)d4HB17yaUW1&)tl1Qm#L&c%z&*iF~g%R+Wmvh4<r)S^_q`Z&M)@oaSSndLl_eVq@QiN`3{eU(wkd)&Eor)!o4# z3tw&q#l|OfmuRp3q!9VM=WGQ404!mJ!xbijGK&fSghl)(fPemIjcl{p-!|d7s}v3_ zuhf?L)b6a|`a^z5FT0#TE%ZK`e$DD&J$Zkt#$a)Nda9Pfim=17u4%>@XItqLn_D5! zwKI#C&YtmXPBNR#oCBBa?F{NNn$({)k2y!={8n54j=EcIv5jVm=K=+V9W;-OJ())3LyE0;{WVtt`;SPJdwPLt`9|rw7B9 zTIQ?{i*#;S*Y(F{lhIh{h|4uYJ}v$%2?6RU?aq0n;K+${G(Ftpk4b9Evvwapw`Grz z+GK$7Y40W|5kneHKwI12pO?dIM8{C_pCHL9N+-?pnK(ZElfkP&kL%SPQPCG{!nmPv zh0}Y=bB)-zp%(NB1uD`;hk;Fq3A!0gPT~Ej~EDVwys!lhEd=!$@7kP20sDc0g1Nrn0-~a#s literal 9530 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 a#JjtAuV>px4@Wjbp~y)oNmhuP1pN=i((auA diff --git a/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_default_base-view-mobile-dark-mode-1.png b/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_default_base-view-mobile-dark-mode-1.png index e071fbedec2f82af3d3af9f77227dde97fd07613..cf11eb8c8936709dcea56e2059c41c2ec064a49d 100644 GIT binary patch literal 9283 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 literal 9280 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 diff --git a/ui/tx/interpretation/utils.test.ts b/ui/tx/interpretation/utils.test.ts index 9751906490..c3089594b7 100644 --- a/ui/tx/interpretation/utils.test.ts +++ b/ui/tx/interpretation/utils.test.ts @@ -1,4 +1,4 @@ -import { extractVariables, checkTemplate } from './utils'; +import { extractVariables, getStringChunks } from './utils'; const template = '{action_type} {source_amount} {native} into {destination_amount} {destination_token}'; @@ -7,37 +7,7 @@ it('extracts variables names', () => { expect(result).toEqual([ 'action_type', 'source_amount', 'native', 'destination_amount', 'destination_token' ]); }); -it('check template true', () => { - const variables = { - action_type: { type: 'string' as const, value: 'Wrap' }, - source_amount: { type: 'currency' as const, value: '0.7' }, - destination_amount: { type: 'currency' as const, value: '0.7' }, - destination_token: { - type: 'token' as const, - value: { - name: 'Duck', - type: 'ERC-20' as const, - symbol: 'DUCK', - address: '0x486a3c5f34cDc4EF133f248f1C81168D78da52e8', - holders: '1152', - decimals: '18', - icon_url: null, - total_supply: '210000000000000000000000000', - exchange_rate: null, - circulating_market_cap: null, - }, - }, - }; - const result = checkTemplate({ summary_template: template, summary_template_variables: variables }); - expect(result).toBe(true); -}); - -it('check template false', () => { - const variables = { - action_type: { type: 'string' as const, value: 'Wrap' }, - source_amount: { type: 'currency' as const, value: '0.7' }, - destination_amount: { type: 'currency' as const, value: '0.7' }, - }; - const result = checkTemplate({ summary_template: template, summary_template_variables: variables }); - expect(result).toBe(false); +it('split string without capturing variables', () => { + const result = getStringChunks(template); + expect(result).toEqual([ '', ' ', ' ', ' into ', ' ', '' ]); }); diff --git a/ui/tx/interpretation/utils.ts b/ui/tx/interpretation/utils.ts index 8826e38cc0..c6ffbb6e42 100644 --- a/ui/tx/interpretation/utils.ts +++ b/ui/tx/interpretation/utils.ts @@ -1,5 +1,3 @@ -import type { TxInterpretationSummary } from 'types/api/txInterpretation'; - // we use that regex as a separator when splitting template and dont want to capture variables // eslint-disable-next-line regexp/no-useless-non-capturing-group export const VAR_REGEXP = /\{(?:[^}]+)\}/g; @@ -18,16 +16,3 @@ export function extractVariables(templateString: string) { export function getStringChunks(template: string) { return template.split(VAR_REGEXP); } - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function checkTemplate(summary: TxInterpretationSummary) { - const variablesNames = extractVariables(summary.summary_template); - - for (const name of variablesNames) { - if (name !== NATIVE_COIN_SYMBOL_VAR_NAME && !summary.summary_template_variables[name]) { - return false; - } - } - - return true; -} From ccbfdff1f2d597f52cc97d3655295bf2c3b5e281 Mon Sep 17 00:00:00 2001 From: isstuev Date: Tue, 26 Dec 2023 11:09:51 +0100 Subject: [PATCH 05/20] design fixes --- ui/pages/Transaction.tsx | 2 +- ui/tx/interpretation/TxInterpretation.tsx | 22 +++++++++++++----- ...olor-mode_base-view-mobile-dark-mode-1.png | Bin 9549 -> 10522 bytes ...x_default_base-view-mobile-dark-mode-1.png | Bin 9283 -> 10267 bytes ...sx_mobile_base-view-mobile-dark-mode-1.png | Bin 9025 -> 10108 bytes 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/ui/pages/Transaction.tsx b/ui/pages/Transaction.tsx index 4b12436eb4..c98c143b43 100644 --- a/ui/pages/Transaction.tsx +++ b/ui/pages/Transaction.tsx @@ -96,7 +96,7 @@ const TransactionPageContent = () => { const titleSecondRow = ( { hasInterpretationFeature && ( - + ; + return ; case 'token': - return ; + return ( + + ); case 'currency': { let numberString = ''; if (BigNumber(value).isLessThan(0.1)) { @@ -42,10 +52,10 @@ const TxInterpretationElementByType = ({ variable }: { variable?: TxInterpretati } case 'timestamp': // timestamp is in unix format - return { dayjs(Number(value) * 1000).format('llll') + ' ' }; + return { dayjs(Number(value) * 1000).format('llll') + ' ' }; case 'string': default: { - return { value.toString() + ' ' }; + return { value.toString() + ' ' }; } } }; @@ -67,8 +77,8 @@ const TxInterpretation = ({ summary, isLoading, className }: Props) => { { chunks.map((chunk, index) => { return ( - - { chunk.trim() + (chunk.trim() && variablesNames[index] ? ' ' : '') } + + { chunk.trim() + (chunk.trim() && variablesNames[index] ? ' ' : '') } { index < variablesNames.length && ( variablesNames[index] === NATIVE_COIN_SYMBOL_VAR_NAME ? { config.chain.currency.symbol + ' ' } : diff --git a/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_dark-color-mode_base-view-mobile-dark-mode-1.png b/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_dark-color-mode_base-view-mobile-dark-mode-1.png index 73d5bac99ce316def34378c1729e1395e79436e9..5999ec2cf7cb50a9617fdad159517cb4e140b96e 100644 GIT binary patch literal 10522 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 mZ2xIcTc!U0vheC@>aEccT?(XgqTuN|vhcA7e z^SDyIb-WYaI<-< z`D#(X&Grzq>@*TzSC^nn`TFIHXMUgF|L4&3OERPO+5f%r_dX@F9A5F!6)_BYubt5F zQtv%!>VR@)48WC>e&0l1Lvz7Aersbhia~*zi8>sJa~Kt!aGlDH7l*g8FX-TKLOC*s zvzKi1DVGLt`oV*P;46(p*3i3^`u~0G%XBO{qO#Of-JPlIR(692v?$3Om6B!Of#vFG z$uPIE%8Huyxp^`(bvH(}6Ut3_!Yf;S6mjw0!HC=-taZUhU~k zR}IAV#bXBW-UMH&BaZ^c|GeJI7yeH#5l`~OB80B{QC~lWG!G@sgNMr?d`T`D;#9d| z3PL(df^{wzq)De!oD;|0y#oWp1nPjOZ2;WFq`zNM2GpaKB+s+O@0ICJwpI5I$@=uv zoryWF6H9M0y87%Oz$KhF$A%(;YU8j{P1S&o?QZeie?Re)%}?So%jvW1@x5V>*KZ$~ z&)*0F7X_P!c=hlkHn+o4LI|#GLlUyo*a+4|bR|_wcf0wsf|g#H9H^fuemKo2F`_$e zP-fXQFo$IFOwR^pk+HCBwWVk};$^1_c2q{!bXqpw`Y5 zyO#bq2IY)e#wSf{8=D)CPE>qW9m&3UrcrIOe^)<<-MlSEOJhvLUZnuw2|uRH=Cqlw zVY+Y~rhWh3_wnI&?eMT?f6nQn)1`Gm?bk+En>@KR>5Ea(*;!yVUVFxp5v;+?j74C2gMIYLF7!03U$e6x!`&NT2XzZz630IY0Zdd45tMEZx7 zg3@_`({VC3y^t-ThI3gDMD%IvuByT*NAD<9#dhKiNw4EKy2Y)L6N8Q`C|d5Hf_WZ^ zBYj&u?HcN`gw3aAn_K0^LHm6jp^taNAODC(?A)tiy!GBx81V*-o8PhREi%il_k?S< zSThKLE~zev+<)NJ3X|NDm~Puaf`U*2P_c59^X2Q}-PYR!H2mH6zm28~X*uQ<@8nIH zSXm7|p<-p(EY#H1*GI?2^*uhI&Axjlu9tqYV(IVzsHO-iFE9VPHvwfiv^}Juqpk3H z0`uBnP>DSCH!=0k65k3~{x1H2a#qCdSfAS0_rZ04vA^87*ZG^zO7#ysCN+HRt;oHZ zq$ytCv@|lm05mSEOVR+x;17G=Vwy0!eZb?qRcX2P4(_mf!Z(q*Tqm;zH=JL|wE)c| z&BX>hdBrhPs9q!LCs$YA_V#wK<911jNFu8$@V}TF#STC%<|PBIs@kyb+~Lq*O=#5EZuU~lD|u$cDnsFG|2E( z1ZnpwMRs6muTBN@Wv>ClT-bx`(l)-Xeovc|e5rG~7vd?@YqYo99xrz$y_m;9nl!1t zrFC%`U|+N(em1w<%ox6s0_W-g1Ck=*`*Y+WPu% zkKE_QMz=^}9!qxTZBSi9!|8^)etg|iUX^a#&Dqx4`ax&jFS*4=0=e+rX(E2>4^UR9 z*Tn^lmRMWNlXx$H65|N?jgv?&h1aBKD`RbY`?qn<-dKy!icf2BD(MnWkzTW>O6j4o zV`Is~L;vs~H4RM{vo|IJrk$0`kVOCbyM6_chd_K5t=FWaLy>zv9Wy{2}iza+z3$0~MR@FxqF1h=oPT*a1?V5Z`@f0l&K(EyNPaW`IMv?d*NaMtr_Cf5(%z8v|q3$PYd5^d50 z6~|U$USeO~Uk@9pO)?ye>UJ~l{Z%VLyQZchODY!ja=xj4mVaq+aeJzOn#*(u4lhtf z(rI#!-Y>RB#Uk!YDAE2}ph8!ID4QGW>j9-1Y>28$FDR%(9UC9t9eA>?QEwTauoYYI zPt`m*IcXn-MLMki*p5jX{(JXg7(lE$MD!Prci328okbiU?@>-2&j@ipYV`Wj#`c>Z z9F0CcM|0jq-=4t=63w(?W)0@GS+L(cPr`jV9PnH@F2178GZ+C^XxG|SUD^#_qp#O{ zob?YT#OBK*s?savd|68Fb4CXT2O1h0`y)MWn}w=3sLcP=O1<|899|H!lai2V*VyTZ zWjuvs~p z$-jO3W`8;*1-^F>+S%D5zB+4bqx?zEl^l#k5(7yY41N1_ytF(0&9t!D+;XP4|Myo4 z#i#gNIQ*N_?KzPeRO^eH8orb1Xr5|O0@D7=W$aJ+Bf8vnSPQjwy=}_;RLZBTKsP2X@oYYh~Ay?3&5YXRy0aX}vL$cMZHG9Mt}u@qljZJ&ZFr`$IQ zii$$ZY?t^Czoa~Ztlt+sBMLT&(}+&gkHt`fy&9NyW>k>OdNWEE8aE)vkK5o9n$Z4% zo+mxg2~;pu#q|aa+%w-EFE4{_f2a5w=Js2Nn+89@S*HrpwE(FvGYxaC#!uiTukkHf zNXYDi8JmOd6%#X9U=68|ct7b}Pe$YLu8uH%Wa@%b2_(*|0r-HjhyBiL^;#b(a2~j` zN&QE`$ zlFFA)b2;xDQS-?U-fYZ#Oqp=CwPn@!xuBil<^4%66#V=52Y#2Ce3^u=x?vGEYo1s; z7Kd);KbbPs3E5Y5_pNRE2f(L|bzXddwo45=gk}2&2NsigJirLjTyM}i!y6i0^wO!K ze7ro3cl7i?1OUHCN`9ZY_pO)%yd&S+DraM`xxF~(q-cB^Ud-q`3qSCe&qhjwYr#)Tr1 zE|@gj`Y4TPTox7x_tt`^p<}8=IWJD}hD3 zK)I3k2+JEshDipW?eSTXY!74*;&5>5Vmg!>nw?Ee9gJf->ri7Y`%HOav z_;klCBQ`m?u%BR}+!zhPoCg$0z?-|%MclTF-!-|+j{Ea75cMR;=z>++$jGSN8>&-) z%bD~u#j^vyRJTzg1p8n(h6_bT#wyk%+|b5Yo$;b8eF504*RV#Dhu|yE^QC#}&nIP@ zHwK!lA2mUg=NoKDq@<*h>osOc z%H~q+IPI2out~2|>v1PG(t9H z_YICa#>7aneA4Pl$$sGp=~;Ynw)rcQr@ok@)<$g4=_>+h-glQ9kxPyJ1B}ae?83t7 z2xhUP<8u}c_#W0EhQPIIkqU>!Ujox1nX9yauy4M)H;6{@^BW8*;{57;5XY2{@`9_g zbH~I4Zm4*c$*&kmn%RYg^}PjO90_pSQKKtf(T|pL7M)T`q2U{BxlGIW!oCehmUXXNb`QIhi574>N2F=6LI_R7c;xssD_-p zc&Ni5NfEtqpix3?6+s39&3H?+{VEa_D<%x40W0>0i+sadx{Z&kwP~#uF*g35PQu>v z+{`Q)&Ss!v>vg?%Y*eS$cN&AK(OPqf2SG+#g(FLJ3hZo=k+nYhdOJK3zq1!YTQzT` z?uKbuS)sG_A6*wUE{{aoCQJsoVI!$RgS9K*&O2%ecB@P4*m?6*3#%BNh(b~#X&llV zhwgzF@b0s;XisZW-KmS*9btpb96BQln;${dWMPZUSrIn*T7$ye+af_x;b$Hj2jzhX z$i{B#s*R^K2uV0NKYj|Z$+)+qdCaiMTS}!TM>+wFIIc(9g`3+X_KAHKzkjHlX-AUG zX%cos$HkOM8|#t|pQm)X`g7?Qo@{j*;wI@uYMSVL$BEb?{BOX>E2%RUpd(<(@FgxY z%TQ84@C>}-of35g60s;k-TS-t7`sn(WM(EYo$P<{FN*W)D!_o$)fJ_$zT z#b67YgPYs)F?aPOQBl!noJp@R3#w-0(El}w(pmUXi)Y9hl*cPEwjTLpzl;v3oU4G$ z;BfeBZ(thQFPp9OkBxEbr7Pf#_6Lwjp~2^tpUh`^>88WU1uN_e z3s&$jy3bfRIGywJ7-(o{hl|ZJo}T<~>E#U;Y7PQ}gB_33Pr&XT9)G=vHL(z$6m4Ip ztWnhWbmkZty|8KjuF@;R3(v=%}YTOT=$z!ZsI4_P5M1p`Yd8HB)w!_p}s7;i+ z-*KTDBL1-Q|(a3`iT4~k9#dseALU^|FS6_ z2?7|(IapjNb1L{GeJ*!Mx&l2b;U(vX+?hSnTtE$R%2B=P*0$G%!$s82KAcnJsLiN& zbNNR6xH=h~Fw9wQG(3L%Bl%JQ$2T|ac|`hjxeL^HtH>r=G8ZA{qUaUIV@ju8K3;ct$77PG1lW}BYKVO}_dwNixOP|Tpe1q9dD0xHdh zza1@m6R&GY!JNHa@HQK#i_qtrh}-}Gty+s=HW9m3L=!{DUs(Y^SobzkOuN0k(1IndSB^;_SDM9#nc zSP--7m4^HX)OmLt$2X59a>IaA;l*QJK1+%VkQ~iNr%fyNT9x@lQ)_j%N)u8;Dm~I%vG9c zR;qbtDLK^D{T2d(Z@&2W?{uJ6<$DO|9HY)mPpi_u>gb*eLby{Em6dV{AkFg9?Jx44 zxC8gSYwUCp1=6`xOqw>|%H4`YO^r@gEWT1jT5n7!WK3Fj)N+$O@Sut8=~-iEZ-t(% z*I#c(+h!dBBgu`7jRTsSo271ovJSXTqgKy64{=NyaipMd@Zzg# zG|_Q1Isyv)#l5DHmDa>fO7+Ak5Fmp;6l7tzOUm3fmaH=qr@DanwB4gH2*Tt^cG2$+ z!_z$NCeUdF>+W&4#T4&!Ppc-*&T1gut{$0G#KAw3PR{7|+~O4({}6Mt+(8H>hO=Kv z>PH8EskijI)44gu+QhOc!f8`e+$xNCNlA`>{*dFR9FrRywRj``6NgaV_VB(p&z?2B z!N->u7Z2>esl|AuE-xRUwJf8{?`C=mk3{0`U-fx<0Laa5pk)igFAo+>TI}4%FKIUq z%m1uTODN*t;E)S@nNJ8IYS4%JuV4Rhtv~N%o3s_KY6el?x$eBIHeWzdVa!ot@S~=u zjF(2gH8e>I@qU-4ga@#J3VDi!h`40IMfnG0{_6ahM2S@F(=yA~Qfe+`XNvvI`>dSF#rRl?56mCOiESz7W%qBqllNf$tuIzP8Wb!x3l`8mm#Y1x>b!-&EB z9oSNP*x&q4cr&=rilgR=?fh^XD6frNgpi?&!XscV zY@mW2jS@p7baz1L6`w@7>+|xma$vNvo|1z$1fz+^gUl_$X8jyS5fhsSRxBL*g%VG^ zv#C%pdExyBn);rl0j`%!o6EgrYBBOzxx7k6q>aEm_?=*vG{(i?K;dkqlyutT!<_>{ zKvPju%eC~*%_Zf^w5+amenfPFlK7|oMV=)^UDui#mERg)nb?$(%|_F6L03rD*4BL- z99_ey;CJ0KGYJ@YjN2E^!k|lLAx~%6crJ~xwpQTME3Q2icwF4ON4^`Jr3RM`cz~C~FE-i$Hk1xH0@T8NIYiMd#*etjX z)1m#!%*fEZa0h|TY<*lrJ%dEsr>$VKgSV2=oG_UC|Hs48N`)xjatyU~?Y1l+;QryP|JVLp=3oK`K`d#Tez^4ejQ zV7R*K?#(y4F2%}9+f$d&AOt1Dp<+D`>``X=(>AJN$AttV#&UsMxq&EZ=j9|rF{WAF zz3kEjFMcJ)^jm73$;mJk*L zFY|kHTTXqyzP`pKDg9ZEWk4BkdAoYJ*)vK4o+yV(Sv&*DFt` zl+|Uc$7`LYOHapZVhB%y98ahUN>5M!*7Kt9R)1R+NmNXX2Zj+d0O@YYJk}5?^6p=1 zbPEMtM+rBB_Tn_Pv?k6D(o;ozGR4^x1Kjp=fLG*GMe6GL`%8}xCpKfgWo7iJycBj6 zRJJR;jsG+MF$w7}Ez})|&o}-=akvr=KN1NDUr|I|jQB~z!xN7vl@(4~@{Uet?(5+I zb68EuNeZT+v2o}3H=PBF<%2C~4qfBRg_I2(PVJ`-+;vn;Tt529s4E zJJT^&`X?brs?*j;<+bTfT3)qbC#ssy6&WV}klEHq+U)EsCk=bl_4NzaqdDW6R1Ww~ ze_ewIVH|p^$$W~vM}r5YJgYEP->59m(jv(FW{P%@Ew>@UD~~W+~i{}IVf1H zdaF0Qve}VbfEue$ADFhjc{qLDA`l*U>=VAJ{_La2w+uRFDNE+3gwQn^4i1hF@r(!~ zVsPBJm%H9btwg7LvEE6sK!sGu^%aSg)$-vDub!SBvsTk=P6IOQpz(1<{93W&dxhNh zz})u)D2$xt(Gu%4&3-B|zS2h5;a8t)CB#=)9$%Dn=&Y2-)Hu10dHo@#dVD0pw9?+a zAO)IEh-F1skN4eNUv*FCBcq96zUQJ0J{Gb%0l6_EEZzwk$IV%v>bYrZG5pzE{L7b26^0~X zZ{ieQlr=cK>(}S!eD24;B{0PxZ_J0)j_VyhqLfEJ>sUPnpumpyL7@L@c z`xL1;@6Y<(U^>S(Lrg_xigg33ulKg36BVi%W`+udZN4KQa-*+fI|t z5de{au)cZwwsZCAAyVY&e$e_zEMB_%Vh`Y6JzliGR6BZ&<@w>jTWq`>jDLrltJFV{ zJE&1*PdPF&vM*xqi)bQ(LW0{D@@$MMzuOi)oMgC#8{Llb48=qe*!1P??b#u0AqHkv zGE7fu&gLuW-9K8#q)+vVTv=Fky*SPcF#d}2WBqQL=LzD^TrWA_VW5!sT;C>zVB<$2 zJZE@h{_$E!b|Q}xK7uff=-0IYR=|VBNnEl}dS+%4hS(-VQsC}y7U1Vx~SX~`I2i{9WDLCr}AM#dVM`MBcr!-_CxFfiaFmG zZ>j{PXazM#L8&(cd^HA0hzY}PUyr^(_uAZ%BK@kE9+}{Ct0YXmf|D*i;i2IT>S{p) znzs5Qk&fP0HpCo4xpMvWsS~GEi&J>^*Q}tIW z=;~RH0BF^SX?AfbP$4G;yuGRK={)%KUl$BR^qyFIift@AFsReBu_u5QJ*p7r;Gq!Y$e$CpPkOSQeflo%!J-2y6$dT>D} zp@uYUOk|-`O2(TU=X@gCBca`5$0Q%q06oR;MP%d`r{4y?U|Ah5S2(@Wm={=EDg;0P zi5Yi==O32pHItpnK41j-Gf*fPE?zqfC2|BTE|OwX2zTsGuULIUw0Wnk;q~=?3J%bW z^+<-uC}NIfbeLK}W())Z8=QAKVEW!Rr$Q|)ElszD^LKXb{x|#^LZD_bOUptjtA+v> z7KA5>Xc3c{VrYobX$)d4HB17yaUW1&)tl1Qm#L&c%z&*iF~g%R+Wmvh4<r)S^_q`Z&M)@oaSSndLl_eVq@QiN`3{eU(wkd)&Eor)!o4# z3tw&q#l|OfmuRp3q!9VM=WGQ404!mJ!xbijGK&fSghl)(fPemIjcl{p-!|d7s}v3_ zuhf?L)b6a|`a^z5FT0#TE%ZK`e$DD&J$Zkt#$a)Nda9Pfim=17u4%>@XItqLn_D5! zwKI#C&YtmXPBNR#oCBBa?F{NNn$({)k2y!={8n54j=EcIv5jVm=K=+V9W;-OJ())3LyE0;{WVtt`;SPJdwPLt`9|rw7B9 zTIQ?{i*#;S*Y(F{lhIh{h|4uYJ}v$%2?6RU?aq0n;K+${G(Ftpk4b9Evvwapw`Grz z+GK$7Y40W|5kneHKwI12pO?dIM8{C_pCHL9N+-?pnK(ZElfkP&kL%SPQPCG{!nmPv zh0}Y=bB)-zp%(NB1uD`;hk;Fq3A!0gPT~Ej~EDVwys!lhEd=!$@7kP20sDc0g1Nrn0-~a#s diff --git a/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_default_base-view-mobile-dark-mode-1.png b/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_default_base-view-mobile-dark-mode-1.png index cf11eb8c8936709dcea56e2059c41c2ec064a49d..a305d7eb1660d7c1a5cd549e0b0e91309f5a55ce 100644 GIT binary patch literal 10267 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 diff --git a/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_mobile_base-view-mobile-dark-mode-1.png b/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_mobile_base-view-mobile-dark-mode-1.png index 71b100aa8a44e0d1e6e287af21570dd4528cd23b..e844aa7bb4d82bfd5a668be4879d269251c7893c 100644 GIT binary patch literal 10108 zcmaL7bx<6A&^00|0;~DSw+iv5#KVRa(!wRQQd&|6QRgso^2z{7vO+?~ZD^;xik6~tjx zpPq)v4oVNTtICRuwL3~He{Axi!$UW9xN9dyQRwD^(o2nniK##_LnSXDvI(op_ieXu|tQjcRUkBJ*Zx`HeEA4!3l%mforsB}wT zBo<~glAp6uiGeFy+dZg6oYg7O&alct6f(UEE}uGxF)JxmE~KR4L@Z>#{VF>+X*hd$ z?X8d`AYpIqY%c!+tPqKgvDI3A*2s?&tX7dQG>?w2WqVB!j?!E%s~Hh&@+aCR{xFSy zq?AYqzTFkk@eKRq{&7gAh3WlEMG6`5kEK;ws-k~$1A?<}uj{8cHu2HY+qn`V$E#h& zMY92~%SBjNSjjCZ?CgP$2Qv2djG;Y0qoM*FM)8e}jTwUB?O_U}0^AtQL$QF~@itIIXyaq&YB-92y{V~BPVl$-gslr;N z8Mf&MWp=PT<$CaQ3HqG7&Jah(R2XU?e;S(X%MfrHZh}L1p=d*t`t@V+^R8>=bNe3} zIXAEE6CzwLZ zQ^Ebh5{KUYasdP47|n2NnzHlM%gmZ|kBCJE>kLl{-3dnKu{dl5(o^M^myfZRK_HfA zodHTpO4$Levy+n;06NKi;2qD#@%?_jvUlK?4`KQyZ{-3}Id&DU#%5{*SX|XYNiFdK zv(L3*p}Qb<>u_CAWa*FT0rAx9UCKzp!^z~?#M{9RCsCNin}NK?dxxjf5Un^j)$+Zv zqdcKzRG|1QzALc0pd9jc(zkOa#BYADt9erUp_92A=JiR(%zw(~>k)jHv_mR2G?p*q zu(J2qO9H2=&@)PH9fD3To<3WAm~ZkZ9FNp(u)zm7>pd(Dn4J#x2Uy2qCKVMUGYCc2 zE)zdwueW9gv61+3YQnSq%Ft~7Qkh=c^K=BTuFw3MDA@R5)e1Ca%FkA)3L?JYmKFGU4b1} z;bD6q(WqtRvqh681dSIx2#SsGfscXrxpfBzczAfs%*-$_FzCrO5$nNdU0)^~Xu`LH zCAu5{p!u^>aQ8WSoRTxiJhkrDq2$x#E_{tbf<7aE+(ux~;ZHrZJ&QoUfF?oVpH1fW z*k9EXR9N;{njlPpFVD+)6K`!iGvi@SzH&v94JT0sNekz{e>cCI{s>x>I=3JE9i2X0 z)&aE{8C-Y{wf);eI}~wx_`gZ8R%;uS=|~vL1wmBFMx3k-0Vs1Mfun_kCMx?1ST-=d~XbIzoF|a_D=; zZ_h=dU>AZjGK-yR`{JfQ0-}wlE1)=FPdYuAbRTd# zsVnPU9KR*|kpwopWxofdjzFH7t`k^p37^IcgnCYMza_uC%&BTC^!~ z4n|Gz04wU#eY*LHVP0BzW9oqz@JrhO z4OsoyG59Y@IU1ZC&|yHC;s1Iv-M}g6q%hnrc5D`PYcv8 z8*wN*^NP@;hKKCnuN(-erWpfh@91F0Q4F-tRoRCo-=Bx&=VsB*Kz&4_Ie%G+HVnXx zV2spLsYS2Xak0!&#dF87Fn$~K)pyB<>(hM$dp|X}eMJL#2V+zXW^?)}M%KtxrW`_zhrE5s-1PteV}uBtK?&e4Dio{x*DfLEK&oyO<2>=Q&?n9_l4b`pBt{nV1vl+Y{i6;rgKTG zS7#;QkdtiZ=U2&soRdBgt1PR!DOBr}zrF^>Xvr6?sp*$Zr`3|Ma7d{X-w=S@mu~Sf zQGfL1-R{r9*>#|}UngtWp~-Kx^FL{{G~})A9c3GEJGPHtKQpvg#uvB^gdI}?baZ9R zbY)zhz9RatIQ!+4HJxoGnXz~;4!ApxMJtehQMNW_EcdYDD0=rK9scgo=kkuMBWIfT zQ3?I}#^+`^29gwWGfv7(+Tp24`k^)|%g4sDx@+;g*XqZ#IR;bHh?^Ok(;fp8*7?KB z%S$F{X7cOE@+=QE3-r$~$(3_#LtLXiF;dE9JF7L=Ai z5(a0nlbp#LbRzDhdTvEbGYlRtP^05y;A3Fw7NiK=9_vx*iXE^o=`B<{#B)9rWI{@%SC(%*;i*o^ULmpA!hXu))*c-r98!5t90140h($ zf$#El0;fVTYd*?a_m!_E6>#}0r>gC|vE|D_<2A%h5{d-}u!AKbs6->ZwR)NB(=2+Z z@3#jxNc`Te$Q1k7;Jf=`5P&5_b$PnT-wGHcDy1Cm&K1;;d@qL^8*h#0Ro;2Q3F8qEw|m36lJ5Mpd^g$ zoSd9M>BZ{XWeQtT4HA-6F>bumQZo{O3ExcOH=21+KYa&T&R+KEtVii{i4b3%E9+(z zoXUKeUa&YE$0AHo47i&nWC_r2K5{t8l1IxDwCWOHt(t=Ara}oB@8cwTw{{^p)5vl; zk>X{@bauPNcJp3=PJNq~I{e(&P-F}3Yk-7;ZXI=5p7q&II5P^Z&o{=NIg7*%h+e*w z>h(9j-3{=XSEG}G@0Nj*W$=GDDmO32I#G!Ss5ppL>H zk7(jJ*zLD+3UYgSDDNFvNd|qyiW-&yW7YTvVyE+&c2WaNwL7ZLWM}zbK-}Ei>;%#8 zP2oLv2}tyerpav zyDIvPbic38N3ZS-?1sv48ln;%-dj3-e+qSnn+b1?f&H`e!&pwh1M=YDYW+heY}=<^ z_7HGD)gw9bzo-GxO8RSw~Lpn!NVuSbbQm-)iggI zdPNK=3AZ%|GS_WxUWg(oaj_$ms06k|D9M}KmN;bp>y5k#wi;wbMOnkh6|iAodT>Kn z|NB@S@&7hThzXMa>tgS;X4iJ%zK7%X;2u%%h2bH)J7q%T7>cQbqHE+8;i{Dh^t)Y- zG_Hm-!IGZ0f1O{DM`1+e3kC0%t{7H+3DIE&YpRYlEuQOW@G$m!ZRr~9) z@Eskyi2+y1#y@K=9!@!VMzY48V7V`nLeWO_A5n<=HP~%c%Zq5eGoElv2r4z~e-tIi z(rteZd!QyKKw<|7P=Cv7M}biv|A41)C^gn-?R8$$M7jUfgEgly8%E`C8y5`fW*)#| z!f175l%v(`bB^{xjL+FjoxBte6^+go#pdU9jx8f8sOR6Y1N&&273|gvXHw@ z=_K8=o&C=zU5|ewvm;38raa>^?3*T&e=3uF*m*v?z{hpy~>EoK%Dy@dmKYY1nxh-=1z2tW^`*a}IK)B{oU`@QPNT4eVi*1RfpC`~>Zl6s`(gd^TFym+Ez5>y z(d@W>ZV!xOxhhX9way^ZEP9%k#l0h8VcnO7zqK!`dmvefn2Gzd?2$|`Zp+Bm^xP=O z8nizl?5Q+%lFwC_1-vShMg2;;wTUpnYl9N{h*R(WhP^oekX%S3rDwZXf;_AhX zgh+#b*)kRa{Re=lMV6qyF@^>oiWc8$hZBo5Y$q)7H0J8*H0(ee0u=ln7a8AG@BEws z{Y3afAPIz_(fP3e zDDRLhi2#`>x1tTEE{5s7K4XTqr}^8euhhtg18ppGDGk@e(K^4{W})b`P`HG?@fe_` z-X;FzqW3Eu0@%L9~9y<#?2ckt3m#8B~9fO=|su508>@094cc=HN>V;w}2r z9n`6qmt8F>pB&K-r{f#(dRqeh|MiiLe0^;MpA7$NB|QNU;iway>fi= zqcO?j{g%oVMNCM%N`dtfflBVe*|<%Px~zW6_Yk-_@8P31r|}%{b{Hn+^ZRPYc!i!4 zp)~_VijRsuEp72K#l^~YSGXLAcKvLA7!gYZPP5b{HWOY}6FMG|UZQ2wga`QftT7XS zMCkaJ`&Nfkob$dUE5Ijk+{5|fY{q=m)XSL<-ekn>bJ_vbyjy4eQI%hmAaC?pmV6A_ zzleWn7$8l5zZxSt&90~YRH~OPUW1C$4vhuF4WTItty?r37=Ubn+mD53MDvk3O57lm zL~ryJs(20lTc;tv$1`2^N?lN1Az0?EF2|;b#b%ZWe@E2)yR<9t12LQJxR1*|Fh!%L zN7ERY2yFHcQlb%?UhE-=Xb)+$rkuvqbDC=TyVVj6n(ifVB#1v~upf?_pDv}5{QK)s zTHRM`zD4d#`uSDrB=NOV-s?Z?bJv^YI0&h{|AlWJak(2-AbuL2b>Q zAPqqrP^(aKKBeZuM_6p7Bm@%nV4@QRLk5-hf7-WgR5A&Kx!|JWFOR?0v zP1U9_<;~KZh67~rJNF{B4&pKv4un6uCA~&nx8fnK3qz^C2|*xb7b#%0X8e5kY9>GI zZY)H+d*XJT^x)$DdwlRlYXe!VdoXEvj$?{mHSBAQDNLeHrI3HafN}TZLDiKaoB|2L z8ta!!?-U|jyO)Jexdz-9Eo3k-IW8QaI`I;2B7`Ea3T{jcA~!+IK?;fjJpm}Y(}NVi z&iiuV&FgGr$3ZH_ioSxYAS94^i-Xg^#z@;7)InMU%{W!uhg&lV!#xw{ozd%7tvGh! zpC7gkEVM4i$>d$TjaM;Kl!^Pu`~A-^cHGd%&RhwtiQo1nr0At+?tvtag&P8ogSs_#89E z<0SDnkJt{8&xRcDBHt4FIA?Bn3*quV@({VA;hk9IH&{qUQ#Jk&;h{{SWzKT^;_$O* zc6PK+SVX<L2IU`&=%GhbnP#v1K;|fR zyDI$hOL@by=b6=l*NB&h!0NNu@Th(M$0zFlI+;EBR`HIEr=*pTN8wN`KWMtlh8#dE zsi5|Z<{TXxvq!!A{;;Lwle=^Mt@GnXl1-3Pn~v@*y}PLz0#mPOpkIwx3D>jh0p}=- z9!9fWrxbqr zoRzRCL+x~u&Y1C*EG01n0Ej>}%zg0Sx`)((%P+XRez9;WIr#U9xJi3{0@8SGj#8=F z!3}S2=7vSlvQ#Yc=Yd|9&AvMYI+bg_t>IEsUFSb~bg#4*ziix1?A(Dg3#6Ot4$v#q zvro6(j*}jYv#Tac@QvtB%w~o-iY|D@G1!@dVS|_dI`Pf-hOvDFkpw=@jX|-%Li>jM zj=>DJ*;s_*NxAKEj7F9{M<{WvKQFF{sZ}Db#N)k$rD2<9o?Jea_zji^@X1Ir83x&;Rt@T((l&rDi9INQ~O`y(?lKz z_CgJCtykznDM~>p>Tuaz*6|+X)shv{gwYF8XR>s?7MNL{Atk;4!jlshJ%`Ai=JLVO z!8h#!=#N?C`BzyY0za10pJ>U+?+smP^VUkkW-2j2@lk09*j(s2J8Y;CVn!^Lmd!EE z-_wGFH}8TIOXcC?~*6=6OvHtBLQJG)Ck}fV|KQ+WQOdr!((T>I&&$!oC zrKDq&;Ie1$#p8b9_O^=Vi;ONo4O4hsd=p}So^c_0yQ4+;q~_~WeU^|ejq0>0u5g$)Goxp!(|4M9yr;vyi5p zqNBN=qx#@N3?rqu&GUM$1DY!0jZ@W zF6N>f@g-WQR=!;C#TG*TKHv51?^Ti~v#*q9;f8ChjGJ)TFR>z_F3$?$Y&hUU6>j!$ zbKtedZ8llgq!zo05sh|K%IC1j_NV z+s?p;3Fn~CRZgY$hpG6S)HF{Gy(7N#HCnC=m3SH;hOV-vs+JB~!KK9rODfy}8D6(R zQhImme*Tc)J+o68xdJ%nAphX)F{1SbXh!&|FWTR!sGWC-4C6I*+UtL6-gbh5ZlG%T0r*|AUqFE8 z<{XOi@!{dg(}m>j(OJ;lh(KG{Qji+2-gQA7tE~N5Ys1Sew43>`zU0Z(W#&Jxh;j3D z#DSsbspaUl^EFHyq6EhJd)!ZywaS>xUqc|jJ1&X|4-8SywChd-CV}&Nc-rQ?ovd8z z*Emp>#2p8!!|dK>eT?fDqYwnmK5AYqRApIz4DSCDmWN20#Q59wTfUZeN5SL#+wsH@ zJ)!qWa*WldagZ5kBk^yuTc&zK9+1=MI`lEsfkuKlZl1?ehX(4Pc{E3dUApkXoN|01 zuNTg7xASKDTTsyD%elvw(`G8m@)gItex;9LmY!?kvN=_Q$!Mbrw}=2VcC-J~r^)3e zYH$uABm%*dGB!C)difQl_L;?{sxG_>x4Fjb-veg8r>Y1~wp5mEkG{})e)Wr!al#oa z^Sge9d~Q^T#?#9bzS5%)Q!wJB?XmjyYq2m66@9J=1O^P&Imys?T3zXctPoKgRzqC`aHnBZ(EEk+W$5el7t3S zyC?~=b9xXZi22#gmNFA3=kk2H_)F0VOwCzQv2Wj#hxXMpuH9#hA0?+E`#+D@Kt~6P z66wR=72o3+8G0GDs8z_O;~kAPHcdkaE0lr`?ARj7hc7~>n=Ikv0L*g(rYNL)5`ds2 zh0Wk6`0}ujm}|Tv?-k@UT~D6vS+*N<6G>8XngyXhg*}ZnMK?sSZ?db8D^TPuRH|q6 zmPurA#^~&7^0Rb|(x_zZXpNC(>M95yH@|bEF+Up64o9J>M;LVMbmT8 zu+&PIxvTsHgPdGdeMx~STMZ1JkCEuH|M<8av<5w0^_=YUX5&_V@T|zp&|t=BX{$}U zbTp?)if`wao6C+XMG9WaI~%FaU%nd#RP^SHRZ2dL%aSJ?pIlZh>_ zowP*Ps|j2Nfa4YK8INW&F}2_-1YR#F2$;`1;e7JCR4L&Cx^rSb^8Offg$;&*c8q{EICWYi-Jm_$Y#fZML(%J7onfO>lZ+ps@nxrH^A;v46 zgfBDTpGV^ZrquM4_ITalCm2zGi=hj5KHq_P`5A0kx-@l_Z{#u~(TGo7XbsXRfR=tV z2A#&uxWpf|-9Ely)xsc>mTmJ#O@-1Wr0>HyN7u*=(maQq$267-%z_lZoM{(stKKz8 zr)O#_K~(SyR&=5)!k|C@#iO&f@e@=e=}UV^)+MoS6feP-w@9w5rrAIn3_Hoel*a@> z9DX~!U_+q*&6|q(8^>v?d*i{1I@04s;X>(j%)DM$m|(e2ZEl%3c@jVF7-51HXg&>u zS??rk&T*m`@G+kVVdcIGf)Z?V*su#H;xsL8mws-(y<905zHL121Cf+fLe``-gK+|< z_f=-K18JY#n>`nZQ2|k+(bb8V$+!``@sqWS>nV=dU192x>ZW%s=)y_RxD!$9a=?obUB3Cx9DyUdL`0j=?NrUhwZ50 zrcbd3&8o8`#8}T$0a4}teqyg#fC*nq@V1YpAqwyv-iMFwpWJH&7pCwbTc?H z>EdT3sam^$S`1|yclV*AWI-+ug$+^KOx0`?TpR*y*f2x%#jFo4*0H-w;ps2=uIP59qHj5a*VY&cJ@FcOs{eANgCNR{jXV!q#C|9x8aM!?Y&)ZwKd(982n5H{ZfFD#dcp>85#JQ{L1)yqQhg^z zgF|%lX^e}`Q^mOHqYcbGtPXF}QP6p5oGDED0<-iFq18I`eu1V^?9tm-%()n5C?u%d=Bm*#(HKG&K=TZI|JBw1NvVa%rJp7YVQQL-c1Hc7 za8MR0oF0b(^wH`Z|03WRpN(1kvtD;L^e!Qv6!}$=_gte*W+}YLBKmHNV{V?UPVZc_|id(;~94GWz09T!~zSx$mUdW`WyE+odR0#4;u zVjvCgEq^DdTCZ;3WD8Re+7LTuqcwAi53M#wY5c6H>6rwkUD`IkHwK{#ni?P--d~H+ zaFV$he;1PczXe1OD%6n~wb{JIq3qQmb5td{8ZIFxt;})Aq~i(rBU&M_gX=B(YO64^ z=*#TdRoD7=cnM=t6)L-7LS8yf_1OjuYAe(c0T|(rAQUo)U2})dYM&SYozl2|uB&cu zt!b%PjTl!*$7}N!i+@P=^E+=6tUextJXfv@$7nSLdZzh{^2yT3=4u#^SLLYEU#Uxb z|GZxJkI)T}9rA3sd9Rb4Jhazhv6tj|BWI)GW?*rC`7pdY-~d82ts_`{YyM1CbS>?v z{-r5Zf#%(l-?%J@XyY+lwG0L2w!+aN78%2(-Ae$4`V@bEXc`qhf(c5Rnckx(w7 z^}oW_q0TmbcRZ5tpdZTSsVu{rR=@uwRr2uJL{YBj@~8dy3sA^X`Q42kAdw1_d*xJfN+@lzB!OeV+-1ZPRav}k*NO^CVvtaY~@Ykp^ zYPM|BseQHe*-NFA^X<{4ia7geCYxI!QNhd|J7nV>DnGNO^!H+Ae&5d_8x&GJhtUMw zHSV?FWhw7Fs?EgM(+7AH;*_INXy9YCQsUH!Hn)YTtXAM7KfQPQpLt7O%Ksj;{NH}; c=NrNsf+>~dT&DzdIUOJ?r6gG?ZW8i;083)BjsO4v literal 9025 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 Date: Wed, 27 Dec 2023 17:48:09 +0100 Subject: [PATCH 06/20] review fixes --- configs/app/features/txInterpretation.ts | 7 ++- configs/envs/.env.eth | 2 +- deploy/tools/envs-validator/schema.ts | 2 +- deploy/values/review/values.yaml.gotmpl | 3 +- docs/ENVS.md | 4 +- icons/{action.svg => lightning.svg} | 0 public/icons/name.d.ts | 1 + stubs/tx.ts | 54 ------------------- stubs/txInterpretation.ts | 34 ++++++++++++ ui/pages/Transaction.tsx | 44 ++------------- ui/tx/TxDetails.tsx | 32 ++--------- ui/tx/TxSubHeading.tsx | 54 +++++++++++++++++++ .../txDetailsActions/TxDetailsActions.tsx | 28 ++++++++++ .../TxDetailsActionsFallback.tsx | 21 -------- .../TxDetailsActionsInterpretation.tsx | 39 +++++++++++--- .../txDetailsActions/TxDetailsActionsRaw.tsx | 26 +++++++++ .../TxDetailsActionsWrapper.tsx | 2 +- ui/tx/interpretation/TxInterpretation.tsx | 12 +++-- 18 files changed, 198 insertions(+), 167 deletions(-) rename icons/{action.svg => lightning.svg} (100%) create mode 100644 stubs/txInterpretation.ts create mode 100644 ui/tx/TxSubHeading.tsx create mode 100644 ui/tx/details/txDetailsActions/TxDetailsActions.tsx delete mode 100644 ui/tx/details/txDetailsActions/TxDetailsActionsFallback.tsx create mode 100644 ui/tx/details/txDetailsActions/TxDetailsActionsRaw.tsx diff --git a/configs/app/features/txInterpretation.ts b/configs/app/features/txInterpretation.ts index bc0976ea5f..88eb900dff 100644 --- a/configs/app/features/txInterpretation.ts +++ b/configs/app/features/txInterpretation.ts @@ -4,10 +4,13 @@ import { getEnvValue } from '../utils'; const title = 'Transaction interpretation'; -const config: Feature<{ isEnabled: true }> = (() => { - if (getEnvValue('NEXT_PUBLIC_TRANSACTION_INTERPRETATION_ENABLED') === 'true') { +const provider = getEnvValue('NEXT_PUBLIC_TRANSACTION_INTERPRETATION_PROVIDER') || 'none'; + +const config: Feature<{ provider: string }> = (() => { + if (provider !== 'none') { return Object.freeze({ title, + provider, isEnabled: true, }); } diff --git a/configs/envs/.env.eth b/configs/envs/.env.eth index a1ad41a2a1..75ef364321 100644 --- a/configs/envs/.env.eth +++ b/configs/envs/.env.eth @@ -42,7 +42,7 @@ NEXT_PUBLIC_STATS_API_HOST=https://stats-eth-main.k8s.blockscout.com NEXT_PUBLIC_VISUALIZE_API_HOST=https://visualizer.services.blockscout.com NEXT_PUBLIC_CONTRACT_INFO_API_HOST=https://contracts-info.services.blockscout.com NEXT_PUBLIC_ADMIN_SERVICE_API_HOST=https://admin-rs.services.blockscout.com -NEXT_PUBLIC_TRANSACTION_INTERPRETATION_ENABLED=true +NEXT_PUBLIC_TRANSACTION_INTERPRETATION_PROVIDER=blockscout #meta NEXT_PUBLIC_OG_IMAGE_URL=https://github.com/blockscout/frontend-configs/blob/main/configs/og-images/eth.jpg?raw=true diff --git a/deploy/tools/envs-validator/schema.ts b/deploy/tools/envs-validator/schema.ts index cbd32ecc26..676f2f2156 100644 --- a/deploy/tools/envs-validator/schema.ts +++ b/deploy/tools/envs-validator/schema.ts @@ -438,7 +438,7 @@ const schema = yup return isNoneSchema.isValidSync(data) || isArrayOfWalletsSchema.isValidSync(data); }), NEXT_PUBLIC_WEB3_DISABLE_ADD_TOKEN_TO_WALLET: yup.boolean(), - NEXT_PUBLIC_TRANSACTION_INTERPRETATION_ENABLED: yup.boolean(), + NEXT_PUBLIC_TRANSACTION_INTERPRETATION_PROVIDER: yup.string().oneOf([ 'blockscout', 'none' ]), NEXT_PUBLIC_AD_TEXT_PROVIDER: yup.string().oneOf(SUPPORTED_AD_TEXT_PROVIDERS), NEXT_PUBLIC_PROMOTE_BLOCKSCOUT_IN_TITLE: yup.boolean(), NEXT_PUBLIC_OG_DESCRIPTION: yup.string(), diff --git a/deploy/values/review/values.yaml.gotmpl b/deploy/values/review/values.yaml.gotmpl index 2b11c240ef..dbfd815a82 100644 --- a/deploy/values/review/values.yaml.gotmpl +++ b/deploy/values/review/values.yaml.gotmpl @@ -51,7 +51,7 @@ frontend: NEXT_PUBLIC_FEATURED_NETWORKS: https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/featured-networks/eth-goerli.json NEXT_PUBLIC_NETWORK_LOGO: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-logos/goerli.svg NEXT_PUBLIC_NETWORK_ICON: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-icons/goerli.svg - NEXT_PUBLIC_API_HOST: eth.blockscout.com + NEXT_PUBLIC_API_HOST: eth-goerli.blockscout.com NEXT_PUBLIC_STATS_API_HOST: https://stats-goerli.k8s-dev.blockscout.com/ NEXT_PUBLIC_VISUALIZE_API_HOST: http://visualizer-svc.visualizer-testing.svc.cluster.local/ NEXT_PUBLIC_CONTRACT_INFO_API_HOST: https://contracts-info-test.k8s-dev.blockscout.com @@ -65,7 +65,6 @@ frontend: NEXT_PUBLIC_MARKETPLACE_CONFIG_URL: https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/marketplace/eth-goerli.json NEXT_PUBLIC_GRAPHIQL_TRANSACTION: 0xf7d4972356e6ae44ae948d0cf19ef2beaf0e574c180997e969a2837da15e349d NEXT_PUBLIC_WEB3_WALLETS: "['token_pocket','coinbase','metamask']" - NEXT_PUBLIC_TRANSACTION_INTERPRETATION_ENABLED: true NEXT_PUBLIC_VIEWS_ADDRESS_IDENTICON_TYPE: gradient_avatar NEXT_PUBLIC_VIEWS_ADDRESS_HIDDEN_VIEWS: "['top_accounts']" NEXT_PUBLIC_VIEWS_CONTRACT_SOLIDITYSCAN_ENABLED: true diff --git a/docs/ENVS.md b/docs/ENVS.md index 9cd177caa5..bee048088a 100644 --- a/docs/ENVS.md +++ b/docs/ENVS.md @@ -476,11 +476,9 @@ This feature is **enabled by default** with the `['metamask']` value. To switch ### Transaction interpretation - - | Variable | Type| Description | Compulsoriness | Default value | Example value | | --- | --- | --- | --- | --- | --- | -| NEXT_PUBLIC_TRANSACTION_INTERPRETATION_ENABLED | `boolean`| Set to `true` to enable transaction interpretation | - | - | `true` | +| NEXT_PUBLIC_TRANSACTION_INTERPRETATION_PROVIDER | `blockscout` \| `none` | Transaction interpretation provider that displays human readable transaction description | - | `none` | `blockscout` |   diff --git a/icons/action.svg b/icons/lightning.svg similarity index 100% rename from icons/action.svg rename to icons/lightning.svg diff --git a/public/icons/name.d.ts b/public/icons/name.d.ts index 8a6cb918a7..31e3f50b9d 100644 --- a/public/icons/name.d.ts +++ b/public/icons/name.d.ts @@ -52,6 +52,7 @@ | "graphQL" | "info" | "key" + | "lightning" | "link" | "lock" | "minus" diff --git a/stubs/tx.ts b/stubs/tx.ts index a7417c9cd6..1f7eb1c0a6 100644 --- a/stubs/tx.ts +++ b/stubs/tx.ts @@ -1,6 +1,5 @@ import type { RawTracesResponse } from 'types/api/rawTrace'; import type { Transaction } from 'types/api/transaction'; -import type { TxInterpretationResponse } from 'types/api/txInterpretation'; import { ADDRESS_PARAMS } from './addressParams'; @@ -60,56 +59,3 @@ export const TX_ZKEVM_L2: Transaction = { }; export const TX_RAW_TRACE: RawTracesResponse = []; - -export const TX_INTERPRETATION: TxInterpretationResponse = { - data: { - summaries: [ - { - summary_template: '{action_type} {source_amount} Ether into {destination_amount} {destination_token}', - summary_template_variables: { - action_type: { type: 'string', value: 'Wrap' }, - source_amount: { type: 'currency', value: '0.7' }, - destination_amount: { type: 'currency', value: '0.7' }, - destination_token: { - type: 'token', - value: { - name: 'Museion', - type: 'ERC-20', - symbol: 'MUSA', - address: '0x486a3c5f34cDc4EF133f248f1C81168D78da52e8', - holders: '1152', - decimals: '18', - icon_url: null, - total_supply: '210000000000000000000000000', - exchange_rate: null, - circulating_market_cap: null, - }, - }, - }, - }, - { - summary_template: '{action_type} {source_amount} Ether into {destination_amount} {destination_token}', - summary_template_variables: { - action_type: { type: 'string', value: 'Wrap' }, - source_amount: { type: 'currency', value: '0.7' }, - destination_amount: { type: 'currency', value: '0.7' }, - destination_token: { - type: 'token', - value: { - name: 'Museion', - type: 'ERC-20', - symbol: 'MUSA', - address: '0x486a3c5f34cDc4EF133f248f1C81168D78da52e8', - holders: '1152', - decimals: '18', - icon_url: null, - total_supply: '210000000000000000000000000', - exchange_rate: null, - circulating_market_cap: null, - }, - }, - }, - }, - ], - }, -}; diff --git a/stubs/txInterpretation.ts b/stubs/txInterpretation.ts new file mode 100644 index 0000000000..e54c2cddae --- /dev/null +++ b/stubs/txInterpretation.ts @@ -0,0 +1,34 @@ +import type { TxInterpretationResponse } from 'types/api/txInterpretation'; + +import { TOKEN_INFO_ERC_20 } from './token'; + +export const TX_INTERPRETATION: TxInterpretationResponse = { + data: { + summaries: [ + { + summary_template: '{action_type} {source_amount} Ether into {destination_amount} {destination_token}', + summary_template_variables: { + action_type: { type: 'string', value: 'Wrap' }, + source_amount: { type: 'currency', value: '0.7' }, + destination_amount: { type: 'currency', value: '0.7' }, + destination_token: { + type: 'token', + value: TOKEN_INFO_ERC_20, + }, + }, + }, + { + summary_template: '{action_type} {source_amount} Ether into {destination_amount} {destination_token}', + summary_template_variables: { + action_type: { type: 'string', value: 'Wrap' }, + source_amount: { type: 'currency', value: '0.7' }, + destination_amount: { type: 'currency', value: '0.7' }, + destination_token: { + type: 'token', + value: TOKEN_INFO_ERC_20, + }, + }, + }, + ], + }, +}; diff --git a/ui/pages/Transaction.tsx b/ui/pages/Transaction.tsx index c98c143b43..57328ecc58 100644 --- a/ui/pages/Transaction.tsx +++ b/ui/pages/Transaction.tsx @@ -1,4 +1,3 @@ -import { Box, Flex, Link } from '@chakra-ui/react'; import { useRouter } from 'next/router'; import React from 'react'; @@ -8,24 +7,20 @@ import config from 'configs/app'; import useApiQuery from 'lib/api/useApiQuery'; import { useAppContext } from 'lib/contexts/app'; import getQueryParamString from 'lib/router/getQueryParamString'; -import { TX, TX_INTERPRETATION } from 'stubs/tx'; -import AccountActionsMenu from 'ui/shared/AccountActionsMenu/AccountActionsMenu'; +import { TX } from 'stubs/tx'; import TextAd from 'ui/shared/ad/TextAd'; -import TxEntity from 'ui/shared/entities/tx/TxEntity'; import EntityTags from 'ui/shared/EntityTags'; -import NetworkExplorers from 'ui/shared/NetworkExplorers'; import PageTitle from 'ui/shared/Page/PageTitle'; import RoutedTabs from 'ui/shared/Tabs/RoutedTabs'; import TabsSkeleton from 'ui/shared/Tabs/TabsSkeleton'; import useTabIndexFromQuery from 'ui/shared/Tabs/useTabIndexFromQuery'; -import { TX_ACTIONS_BLOCK_ID } from 'ui/tx/details/txDetailsActions/TxDetailsActionsWrapper'; -import TxInterpretation from 'ui/tx/interpretation/TxInterpretation'; import TxDetails from 'ui/tx/TxDetails'; import TxDetailsWrapped from 'ui/tx/TxDetailsWrapped'; import TxInternals from 'ui/tx/TxInternals'; import TxLogs from 'ui/tx/TxLogs'; import TxRawTrace from 'ui/tx/TxRawTrace'; import TxState from 'ui/tx/TxState'; +import TxSubHeading from 'ui/tx/TxSubHeading'; import TxTokenTransfer from 'ui/tx/TxTokenTransfer'; const TransactionPageContent = () => { @@ -42,21 +37,11 @@ const TransactionPageContent = () => { }, }); - const hasInterpretationFeature = config.features.txInterpretation.isEnabled; - - const txInterpretationQuery = useApiQuery('tx_interpretation', { - pathParams: { hash }, - queryOptions: { - enabled: Boolean(hash) && hasInterpretationFeature, - placeholderData: TX_INTERPRETATION, - }, - }); - const tabs: Array = [ { id: 'index', title: config.features.suave.isEnabled && data?.wrapped ? 'Confidential compute tx details' : 'Details', - component: , + component: , }, config.features.suave.isEnabled && data?.wrapped ? { id: 'wrapped', title: 'Regular tx details', component: } : @@ -90,28 +75,7 @@ const TransactionPageContent = () => { }; }, [ appProps.referrer ]); - const hasInterpretation = hasInterpretationFeature && - (txInterpretationQuery.isPlaceholderData || txInterpretationQuery.data?.data.summaries.length); - - const titleSecondRow = ( - - { hasInterpretationFeature && ( - - - { !txInterpretationQuery.isPlaceholderData && txInterpretationQuery.data?.data.summaries && txInterpretationQuery.data?.data.summaries.length > 1 && - all actions } - - ) } - { !hasInterpretation && } - - { !data?.tx_tag && } - - - - ); + const titleSecondRow = ; return ( <> diff --git a/ui/tx/TxDetails.tsx b/ui/tx/TxDetails.tsx index f9f32da426..206c6190ab 100644 --- a/ui/tx/TxDetails.tsx +++ b/ui/tx/TxDetails.tsx @@ -12,18 +12,15 @@ import { Skeleton, Alert, } from '@chakra-ui/react'; -import type { UseQueryResult } from '@tanstack/react-query'; import BigNumber from 'bignumber.js'; import React from 'react'; import { scroller, Element } from 'react-scroll'; import { ZKEVM_L2_TX_STATUSES } from 'types/api/transaction'; -import type { TxInterpretationResponse } from 'types/api/txInterpretation'; import { route } from 'nextjs-routes'; import config from 'configs/app'; -import type { ResourceError } from 'lib/api/resources'; import { WEI, WEI_IN_GWEI } from 'lib/consts'; import dayjs from 'lib/date/dayjs'; import getNetworkValidatorTitle from 'lib/networks/getNetworkValidatorTitle'; @@ -47,8 +44,7 @@ import TextSeparator from 'ui/shared/TextSeparator'; import TxFeeStability from 'ui/shared/tx/TxFeeStability'; import Utilization from 'ui/shared/Utilization/Utilization'; import VerificationSteps from 'ui/shared/verificationSteps/VerificationSteps'; -import TxDetailsActionsFallback from 'ui/tx/details/txDetailsActions/TxDetailsActionsFallback'; -import TxDetailsActionsInterpretation from 'ui/tx/details/txDetailsActions/TxDetailsActionsInterpretation'; +import TxDetailsActions from 'ui/tx/details/txDetailsActions/TxDetailsActions'; import TxDetailsFeePerGas from 'ui/tx/details/TxDetailsFeePerGas'; import TxDetailsGasPrice from 'ui/tx/details/TxDetailsGasPrice'; import TxDetailsOther from 'ui/tx/details/TxDetailsOther'; @@ -59,11 +55,7 @@ import TxAllowedPeekers from 'ui/tx/TxAllowedPeekers'; import TxSocketAlert from 'ui/tx/TxSocketAlert'; import useFetchTxInfo from 'ui/tx/useFetchTxInfo'; -type Props = { - txInterpretationQuery?: UseQueryResult; -} - -const TxDetails = ({ txInterpretationQuery }: Props) => { +const TxDetails = () => { const { data, isPlaceholderData, isError, socketStatus, error } = useFetchTxInfo(); const [ isExpanded, setIsExpanded ] = React.useState(false); @@ -248,25 +240,7 @@ const TxDetails = ({ txInterpretationQuery }: Props) => { - { config.features.txInterpretation.isEnabled && txInterpretationQuery !== undefined && ( - <> - - { (isPlaceholderData || - txInterpretationQuery.isPlaceholderData || - (txInterpretationQuery.data?.data.summaries && txInterpretationQuery.data?.data.summaries.length > 1)) && - } - - ) } - { /* if tx interpretation is not configured, show tx actions from tx info */ } - { !config.features.txInterpretation.isEnabled && data.actions && data.actions.length > 0 && ( - <> - - - - ) } + { + const hasInterpretationFeature = config.features.txInterpretation.isEnabled; + + const txInterpretationQuery = useApiQuery('tx_interpretation', { + pathParams: { hash }, + queryOptions: { + enabled: Boolean(hash) && hasInterpretationFeature, + placeholderData: TX_INTERPRETATION, + }, + }); + + const hasInterpretation = hasInterpretationFeature && + (txInterpretationQuery.isPlaceholderData || txInterpretationQuery.data?.data.summaries.length); + + return ( + + { hasInterpretationFeature && ( + + + { !txInterpretationQuery.isPlaceholderData && txInterpretationQuery.data?.data.summaries && txInterpretationQuery.data?.data.summaries.length > 1 && + all actions } + + ) } + { !hasInterpretation && } + + { !hasTag && } + + + + ); +}; + +export default TxSubHeading; diff --git a/ui/tx/details/txDetailsActions/TxDetailsActions.tsx b/ui/tx/details/txDetailsActions/TxDetailsActions.tsx new file mode 100644 index 0000000000..fc0622e2af --- /dev/null +++ b/ui/tx/details/txDetailsActions/TxDetailsActions.tsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import type { TxAction } from 'types/api/txAction'; + +import config from 'configs/app'; +import TxDetailsActionsInterpretation from 'ui/tx/details/txDetailsActions/TxDetailsActionsInterpretation'; +import TxDetailsActionsRaw from 'ui/tx/details/txDetailsActions/TxDetailsActionsRaw'; + +type Props = { + isTxDataLoading: boolean; + actions?: Array; + hash?: string; +} + +const TxDetailsActions = ({ isTxDataLoading, actions, hash }: Props) => { + if (config.features.txInterpretation.isEnabled) { + return ; + } + + /* if tx interpretation is not configured, show tx actions from tx info */ + if (actions && actions.length > 0) { + return ; + } + + return null; +}; + +export default TxDetailsActions; diff --git a/ui/tx/details/txDetailsActions/TxDetailsActionsFallback.tsx b/ui/tx/details/txDetailsActions/TxDetailsActionsFallback.tsx deleted file mode 100644 index 02dfbbf8dc..0000000000 --- a/ui/tx/details/txDetailsActions/TxDetailsActionsFallback.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react'; - -import type { TxAction } from 'types/api/txAction'; - -import TxDetailsAction from './TxDetailsAction'; -import TxDetailsActionsWrapper from './TxDetailsActionsWrapper'; - -interface Props { - actions: Array; - isLoading: boolean; -} - -const TxDetailsActionsFallback = ({ actions, isLoading }: Props) => { - return ( - - { actions.map((action, index: number) => ) } - - ); -}; - -export default TxDetailsActionsFallback; diff --git a/ui/tx/details/txDetailsActions/TxDetailsActionsInterpretation.tsx b/ui/tx/details/txDetailsActions/TxDetailsActionsInterpretation.tsx index 5dff8432a8..bd912f89fc 100644 --- a/ui/tx/details/txDetailsActions/TxDetailsActionsInterpretation.tsx +++ b/ui/tx/details/txDetailsActions/TxDetailsActionsInterpretation.tsx @@ -1,24 +1,47 @@ import React from 'react'; -import type { TxInterpretationSummary } from 'types/api/txInterpretation'; - +import useApiQuery from 'lib/api/useApiQuery'; +import { TX_INTERPRETATION } from 'stubs/txInterpretation'; +import DetailsInfoItemDivider from 'ui/shared/DetailsInfoItemDivider'; import TxInterpretation from 'ui/tx/interpretation/TxInterpretation'; import TxDetailsActionsWrapper from './TxDetailsActionsWrapper'; interface Props { - actions?: Array; - isLoading: boolean; + hash?: string; + isTxDataLoading: boolean; } -const TxDetailsActionsInterpretation = ({ isLoading, actions }: Props) => { +const TxDetailsActionsInterpretation = ({ hash, isTxDataLoading }: Props) => { + const txInterpretationQuery = useApiQuery('tx_interpretation', { + pathParams: { hash }, + queryOptions: { + enabled: Boolean(hash), + placeholderData: TX_INTERPRETATION, + refetchOnMount: false, + }, + }); + + const actions = txInterpretationQuery.data?.data.summaries; + if (!actions || actions.length < 2) { return null; } + return ( - - { actions.map((action, index: number) => ) } - + <> + + { actions.map((action, index: number) => ( + + ), + ) } + + + ); }; diff --git a/ui/tx/details/txDetailsActions/TxDetailsActionsRaw.tsx b/ui/tx/details/txDetailsActions/TxDetailsActionsRaw.tsx new file mode 100644 index 0000000000..a024347519 --- /dev/null +++ b/ui/tx/details/txDetailsActions/TxDetailsActionsRaw.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +import type { TxAction } from 'types/api/txAction'; + +import DetailsInfoItemDivider from 'ui/shared/DetailsInfoItemDivider'; + +import TxDetailsAction from './TxDetailsAction'; +import TxDetailsActionsWrapper from './TxDetailsActionsWrapper'; + +interface Props { + actions: Array; + isLoading: boolean; +} + +const TxDetailsActionsRaw = ({ actions, isLoading }: Props) => { + return ( + <> + + { actions.map((action, index: number) => ) } + + + + ); +}; + +export default TxDetailsActionsRaw; diff --git a/ui/tx/details/txDetailsActions/TxDetailsActionsWrapper.tsx b/ui/tx/details/txDetailsActions/TxDetailsActionsWrapper.tsx index 75ee018d49..c9e963e803 100644 --- a/ui/tx/details/txDetailsActions/TxDetailsActionsWrapper.tsx +++ b/ui/tx/details/txDetailsActions/TxDetailsActionsWrapper.tsx @@ -36,7 +36,7 @@ const TxDetailsActions = ({ children, isLoading }: Props) => { isLoading={ isLoading } > { numberString + ' ' }; } @@ -74,10 +76,10 @@ const TxInterpretation = ({ summary, isLoading, className }: Props) => { return ( - + { chunks.map((chunk, index) => { return ( - + { chunk.trim() + (chunk.trim() && variablesNames[index] ? ' ' : '') } { index < variablesNames.length && ( variablesNames[index] === NATIVE_COIN_SYMBOL_VAR_NAME ? From b8def502080edfde5e9a43af859635fa36ec7826 Mon Sep 17 00:00:00 2001 From: isstuev Date: Wed, 27 Dec 2023 18:02:37 +0100 Subject: [PATCH 07/20] add events --- lib/mixpanel/utils.ts | 4 +++ ui/tx/interpretation/TxInterpretation.tsx | 23 ++++++++++++++++-- ...olor-mode_base-view-mobile-dark-mode-1.png | Bin 10522 -> 9395 bytes ...x_default_base-view-mobile-dark-mode-1.png | Bin 10267 -> 9146 bytes ...sx_mobile_base-view-mobile-dark-mode-1.png | Bin 10108 -> 8799 bytes 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/mixpanel/utils.ts b/lib/mixpanel/utils.ts index fae1b8e327..b886f32249 100644 --- a/lib/mixpanel/utils.ts +++ b/lib/mixpanel/utils.ts @@ -13,6 +13,7 @@ export enum EventTypes { CONTRACT_VERIFICATION = 'Contract verification', QR_CODE = 'QR code', PAGE_WIDGET = 'Page widget', + TX_INTERPRETATION_INTERACTION = 'Transaction interpratetion interaction' } /* eslint-disable @typescript-eslint/indent */ @@ -78,5 +79,8 @@ Type extends EventTypes.QR_CODE ? { Type extends EventTypes.PAGE_WIDGET ? { 'Type': 'Tokens dropdown' | 'Tokens show all (icon)' | 'Add to watchlist' | 'Address actions (more button)'; } : +Type extends EventTypes.TX_INTERPRETATION_INTERACTION ? { + 'Type': 'Address click' | 'Token click'; +} : undefined; /* eslint-enable @typescript-eslint/indent */ diff --git a/ui/tx/interpretation/TxInterpretation.tsx b/ui/tx/interpretation/TxInterpretation.tsx index 09d2d8887b..293d712977 100644 --- a/ui/tx/interpretation/TxInterpretation.tsx +++ b/ui/tx/interpretation/TxInterpretation.tsx @@ -6,6 +6,7 @@ import type { TxInterpretationSummary, TxInterpretationVariable } from 'types/ap import config from 'configs/app'; import dayjs from 'lib/date/dayjs'; +import * as mixpanel from 'lib/mixpanel/index'; import AddressEntity from 'ui/shared/entities/address/AddressEntity'; import TokenEntity from 'ui/shared/entities/token/TokenEntity'; import IconSvg from 'ui/shared/IconSvg'; @@ -19,14 +20,31 @@ type Props = { } const TxInterpretationElementByType = ({ variable }: { variable?: TxInterpretationVariable }) => { + const onAddressClick = React.useCallback(() => { + mixpanel.logEvent(mixpanel.EventTypes.TX_INTERPRETATION_INTERACTION, { Type: 'Address click' }); + }, []); + + const onTokenClick = React.useCallback(() => { + mixpanel.logEvent(mixpanel.EventTypes.TX_INTERPRETATION_INTERACTION, { Type: 'Token click' }); + }, []); + if (!variable) { return null; } const { type, value } = variable; switch (type) { - case 'address': - return ; + case 'address': { + return ( + + ); + } case 'token': return ( ); case 'currency': { diff --git a/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_dark-color-mode_base-view-mobile-dark-mode-1.png b/ui/tx/interpretation/__screenshots__/TxInterpretation.pw.tsx_dark-color-mode_base-view-mobile-dark-mode-1.png index 5999ec2cf7cb50a9617fdad159517cb4e140b96e..2215fda3324c82e846ea054cc53eab5cf24913d3 100644 GIT binary patch literal 9395 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 mZ2xIcTc!U0vjG9G8J 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 I>QnIl0MVIPS^xk5 literal 10267 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 literal 10108 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 From 91c49462b0182c82019f15c83431d87ac07e5337 Mon Sep 17 00:00:00 2001 From: tom Date: Thu, 28 Dec 2023 12:26:37 +0400 Subject: [PATCH 08/20] fix icon size on dapp card --- ui/marketplace/MarketplaceAppCard.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/marketplace/MarketplaceAppCard.tsx b/ui/marketplace/MarketplaceAppCard.tsx index a86ad14bd5..249caa0bea 100644 --- a/ui/marketplace/MarketplaceAppCard.tsx +++ b/ui/marketplace/MarketplaceAppCard.tsx @@ -153,6 +153,7 @@ const MarketplaceAppCard = ({ From 942b5404f6f6d4c7582ed5629324d29fdb2c6a20 Mon Sep 17 00:00:00 2001 From: tom Date: Thu, 28 Dec 2023 19:32:08 +0400 Subject: [PATCH 09/20] add debug for pre-release labels job skip-checks: true --- .github/workflows/pre-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index 532435dc83..e0cb8684b8 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -40,7 +40,9 @@ jobs: const tag = process.env.TAG; const REGEXP = /^v[0-9]+.[0-9]+.[0-9]+-[a-z]+((\.|-)\d+)?$/i; const match = tag.match(REGEXP); - return match && !match[1] ? 'true' : 'false'; + const isInitial = match && !match[1] ? true : false; + core.info('is_initial flag value: ', isInitial); + return isInitial; label_issues: name: Add pre-release label to issues From ce8e0bb1b066b9c2458a9b920e84ca00ede997b6 Mon Sep 17 00:00:00 2001 From: tom Date: Fri, 29 Dec 2023 13:53:28 +0400 Subject: [PATCH 10/20] [skip ci] some csp and sentry filters improvements --- lib/sentry/config.ts | 5 ++++- nextjs/csp/policies/ad.ts | 6 +++--- nextjs/csp/policies/app.ts | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/sentry/config.ts b/lib/sentry/config.ts index f02b2b2d1c..d52c20e382 100644 --- a/lib/sentry/config.ts +++ b/lib/sentry/config.ts @@ -56,6 +56,7 @@ export const config: Sentry.BrowserOptions | undefined = (() => { 'Script error.', // Relay and WalletConnect errors + 'The quota has been exceeded', 'Attempt to connect to relay via', 'WebSocket connection failed for URL: wss://relay.walletconnect.com', ], @@ -67,9 +68,11 @@ export const config: Sentry.BrowserOptions | undefined = (() => { // Woopra flakiness /eatdifferent\.com\.woopra-ns\.com/i, /static\.woopra\.com\/js\/woopra\.js/i, - // Chrome extensions + // Chrome and other extensions /extensions\//i, /^chrome:\/\//i, + /^chrome-extension:\/\//i, + /^moz-extension:\/\//i, // Other plugins /127\.0\.0\.1:4001\/isrunning/i, // Cacaoweb /webappstoolbarba\.texthelp\.com\//i, diff --git a/nextjs/csp/policies/ad.ts b/nextjs/csp/policies/ad.ts index 4b7905fdf2..2808dfb07c 100644 --- a/nextjs/csp/policies/ad.ts +++ b/nextjs/csp/policies/ad.ts @@ -9,11 +9,11 @@ export function ad(): CspDev.DirectiveDescriptor { 'connect-src': [ 'coinzilla.com', '*.coinzilla.com', - 'request-global.czilladx.com', + 'https://request-global.czilladx.com', '*.slise.xyz', ], 'frame-src': [ - 'request-global.czilladx.com', + 'https://request-global.czilladx.com', ], 'script-src': [ 'coinzillatag.com', @@ -27,7 +27,7 @@ export function ad(): CspDev.DirectiveDescriptor { 'cdn.coinzilla.io', ], 'font-src': [ - 'request-global.czilladx.com', + 'https://request-global.czilladx.com', ], }; } diff --git a/nextjs/csp/policies/app.ts b/nextjs/csp/policies/app.ts index ef338a22dc..37822e4766 100644 --- a/nextjs/csp/policies/app.ts +++ b/nextjs/csp/policies/app.ts @@ -9,7 +9,6 @@ import { KEY_WORDS } from '../utils'; const MAIN_DOMAINS = [ `*.${ config.app.host }`, config.app.host, - getFeaturePayload(config.features.sol2uml)?.api.endpoint, ].filter(Boolean); const getCspReportUrl = () => { @@ -113,6 +112,7 @@ export function app(): CspDev.DirectiveDescriptor { 'font-src': [ KEY_WORDS.DATA, + ...MAIN_DOMAINS, ], 'object-src': [ From c31b7793b30b985437b67f3048af0e6c6f165cb4 Mon Sep 17 00:00:00 2001 From: tom Date: Fri, 29 Dec 2023 14:11:40 +0400 Subject: [PATCH 11/20] [skip ci] sync color mode value in cookie and in local storage --- ui/snippets/topBar/ColorModeSwitch.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/snippets/topBar/ColorModeSwitch.tsx b/ui/snippets/topBar/ColorModeSwitch.tsx index 35fffea85a..aa7156a1e1 100644 --- a/ui/snippets/topBar/ColorModeSwitch.tsx +++ b/ui/snippets/topBar/ColorModeSwitch.tsx @@ -35,6 +35,7 @@ const ColorModeSwitch = () => { window.document.documentElement.style.setProperty(varName, hex); cookies.set(cookies.NAMES.COLOR_MODE_HEX, hex); + window.localStorage.setItem(cookies.NAMES.COLOR_MODE, nextTheme.colorMode); }, [ setColorMode ]); React.useEffect(() => { From 4afed28925b5db0cd81094cb6cb2aceb6a50878e Mon Sep 17 00:00:00 2001 From: tom Date: Fri, 29 Dec 2023 14:40:04 +0400 Subject: [PATCH 12/20] [skip ci] fix link in TokenSelect --- ui/address/tokenSelect/TokenSelectItem.tsx | 9 ++++----- ui/shared/LinkInternal.tsx | 1 - 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/ui/address/tokenSelect/TokenSelectItem.tsx b/ui/address/tokenSelect/TokenSelectItem.tsx index a1fffeac3f..bd9b9ea007 100644 --- a/ui/address/tokenSelect/TokenSelectItem.tsx +++ b/ui/address/tokenSelect/TokenSelectItem.tsx @@ -5,6 +5,7 @@ import React from 'react'; import { route } from 'nextjs-routes'; import TokenEntity from 'ui/shared/entities/token/TokenEntity'; +import LinkInternal from 'ui/shared/LinkInternal'; import TruncatedValue from 'ui/shared/TruncatedValue'; import type { TokenEnhancedData } from '../utils/tokenUtils'; @@ -47,11 +48,10 @@ const TokenSelectItem = ({ data }: Props) => { } })(); - // TODO add filter param when token page is ready const url = route({ pathname: '/token/[hash]', query: { hash: data.token.address } }); return ( - { _hover={{ bgColor: useColorModeValue('blue.50', 'gray.800'), }} + color="initial" fontSize="sm" - cursor="pointer" - as="a" href={ url } > @@ -80,7 +79,7 @@ const TokenSelectItem = ({ data }: Props) => { { secondRow } - + ); }; diff --git a/ui/shared/LinkInternal.tsx b/ui/shared/LinkInternal.tsx index 09a9764e62..b46b369096 100644 --- a/ui/shared/LinkInternal.tsx +++ b/ui/shared/LinkInternal.tsx @@ -5,7 +5,6 @@ import NextLink from 'next/link'; import type { LegacyRef } from 'react'; import React from 'react'; -// NOTE! use this component only for links to pages that are completely implemented in new UI const LinkInternal = ({ isLoading, ...props }: LinkProps & { isLoading?: boolean }, ref: LegacyRef) => { if (isLoading) { return { props.children }; From 05b533d5e95738e0192f6cd838a3c348f490cdf7 Mon Sep 17 00:00:00 2001 From: tom Date: Tue, 2 Jan 2024 11:17:31 +0400 Subject: [PATCH 13/20] remove icon for "verify contract" link in the navbar --- lib/hooks/useNavItems.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/hooks/useNavItems.tsx b/lib/hooks/useNavItems.tsx index cd2a1adbad..f330a53c07 100644 --- a/lib/hooks/useNavItems.tsx +++ b/lib/hooks/useNavItems.tsx @@ -170,7 +170,6 @@ export default function useNavItems(): ReturnType { { text: 'Verify contract', nextRoute: { pathname: '/contract-verification' as const }, - icon: 'verify-contract', isActive: pathname.startsWith('/contract-verification'), }, ...config.UI.sidebar.otherLinks, From a47828bfd0bfd6090b854defcf29daef3012c1f7 Mon Sep 17 00:00:00 2001 From: isstuev Date: Tue, 2 Jan 2024 16:32:36 +0100 Subject: [PATCH 14/20] solidity scan report changes --- ui/address/SolidityscanReport.tsx | 11 +++++++---- ...mode_average-report-dark-mode-mobile-1.png | Bin 1677 -> 1791 bytes ...mode_average-report-dark-mode-mobile-2.png | Bin 29952 -> 30369 bytes ...ault_average-report-dark-mode-mobile-1.png | Bin 1785 -> 1653 bytes ...ault_average-report-dark-mode-mobile-2.png | Bin 30812 -> 30929 bytes ...anReport.pw.tsx_default_great-report-1.png | Bin 1758 -> 1640 bytes ...anReport.pw.tsx_default_great-report-2.png | Bin 20599 -> 20601 bytes ...scanReport.pw.tsx_default_low-report-1.png | Bin 1558 -> 1493 bytes ...scanReport.pw.tsx_default_low-report-2.png | Bin 30084 -> 30135 bytes ...bile_average-report-dark-mode-mobile-1.png | Bin 1782 -> 1612 bytes ...bile_average-report-dark-mode-mobile-2.png | Bin 26301 -> 26295 bytes 11 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ui/address/SolidityscanReport.tsx b/ui/address/SolidityscanReport.tsx index 6b6d6200cb..8fe817d4fd 100644 --- a/ui/address/SolidityscanReport.tsx +++ b/ui/address/SolidityscanReport.tsx @@ -84,6 +84,10 @@ const SolidityscanReport = ({ className, hash }: Props) => { const yetAnotherGrayColor = useColorModeValue('gray.400', 'gray.500'); const popoverBgColor = useColorModeValue('white', 'gray.900'); + const greatScoreColor = useColorModeValue('green.600', 'green.400'); + const averageScoreColor = useColorModeValue('purple.600', 'purple.400'); + const lowScoreColor = useColorModeValue('red.600', 'red.400'); + if (isError || !score) { return null; } @@ -91,13 +95,13 @@ const SolidityscanReport = ({ className, hash }: Props) => { let scoreColor; let scoreLevel; if (score >= 80) { - scoreColor = 'green.600'; + scoreColor = greatScoreColor; scoreLevel = 'GREAT'; } else if (score >= 30) { - scoreColor = 'orange.600'; + scoreColor = averageScoreColor; scoreLevel = 'AVERAGE'; } else { - scoreColor = 'red.600'; + scoreColor = lowScoreColor; scoreLevel = 'LOW'; } @@ -112,7 +116,6 @@ const SolidityscanReport = ({ className, hash }: Props) => {