From aeed05fdfd1ef3d85bb4982c68b94c2f3dd45b0b Mon Sep 17 00:00:00 2001 From: Leonel Gobbi <57540576+lgobbi-atix@users.noreply.github.com> Date: Wed, 11 Oct 2023 04:08:51 -0300 Subject: [PATCH 01/19] chore/Bump cardano-js-sdk (#559) * chore!: bump cardano-js-sdk packages to latest versions * ci: add cardano services urls parameters to build step * Feat/sanchonet network switch support (#612) * feat: update env to support switching to sanchonet * chore: remove old testnet * chore: bump cardano-sdk packages to latest version --------- Co-authored-by: mirceahasegan <105701265+mirceahasegan@users.noreply.github.com> --- .github/workflows/e2e-tests-linux.yml | 3 +++ .github/workflows/smoke-tests.yml | 3 +++ apps/browser-extension-wallet/.env.defaults | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-tests-linux.yml b/.github/workflows/e2e-tests-linux.yml index 71eec19cf4..b3066bb63e 100644 --- a/.github/workflows/e2e-tests-linux.yml +++ b/.github/workflows/e2e-tests-linux.yml @@ -50,6 +50,9 @@ jobs: uses: ./.github/shared/build with: LACE_EXTENSION_KEY: ${{ secrets.MANIFEST_PUBLIC_KEY }} + CARDANO_SERVICES_URL_MAINNET: ${{ secrets.CARDANO_SERVICES_URL_MAINNET }} + CARDANO_SERVICES_URL_PREPROD: ${{ secrets.CARDANO_SERVICES_URL_PREPROD }} + CARDANO_SERVICES_URL_PREVIEW: ${{ secrets.CARDANO_SERVICES_URL_PREVIEW }} - name: Start XVFB run: | Xvfb :99 & diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 5c2526ad4b..25d988c045 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -26,6 +26,9 @@ jobs: uses: ./.github/shared/build with: LACE_EXTENSION_KEY: ${{ secrets.MANIFEST_PUBLIC_KEY }} + CARDANO_SERVICES_URL_MAINNET: ${{ secrets.CARDANO_SERVICES_URL_MAINNET }} + CARDANO_SERVICES_URL_PREPROD: ${{ secrets.CARDANO_SERVICES_URL_PREPROD }} + CARDANO_SERVICES_URL_PREVIEW: ${{ secrets.CARDANO_SERVICES_URL_PREVIEW }} - name: Start XVFB run: | Xvfb :99 & diff --git a/apps/browser-extension-wallet/.env.defaults b/apps/browser-extension-wallet/.env.defaults index fd8968c01a..0ebb89d0bc 100644 --- a/apps/browser-extension-wallet/.env.defaults +++ b/apps/browser-extension-wallet/.env.defaults @@ -4,7 +4,7 @@ DEFAULT_CHAIN=Mainnet WALLET_SYNC_TIMEOUT_IN_SEC=60 WALLET_INTERVAL_IN_SEC=30 DROP_CONSOLE_IN_PRODUCTION=false -AVAILABLE_CHAINS=Preprod,Preview,Mainnet +AVAILABLE_CHAINS=Preprod,Preview,Mainnet,Sanchonet ADA_PRICE_POLLING_IN_SEC=60 TOKEN_PRICE_POLLING_IN_SEC=300 SAVED_PRICE_DURATION_IN_MINUTES=720 From a73db1f334e4807a2f5d2b5f197b56eaf7a4e4ba Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 24 Oct 2023 13:10:36 -0300 Subject: [PATCH 02/19] [LW-7983] [LW-7984] dRep confirmation screens (#554) * refactor: move logic out of component * fix: file path * feat(core): setup storybook * refactor(ui): extract insufficient funds warning component * feat(core): add lace/ui package * feat(core): create ConfirmDRepRegistration component * feat(extension): install @lace/ui * refactor: move functions to utils * fix: type * refactor: types file * feat: check for DRep transaction * feat: integrate confirm drep registration component * refactor(core): use Metadata component * refactor(core): use flexbox * refactor(core): remove insufficient funds message * refactor(core): create ConfirmDRepRetirement * refactor: remove insufficient funds warning; break down main component * feat: add certificate data * feat: add drep retirement container * fix: condition * fix: type * fix: style * fix: check for anchor * fix: check for undefined certificates * fix: merge conflict * fix: type error * feat: temp env changes * feat(extension): use consistent naming of DRep ID * feat(extension): show anchor metadata if exists * feat(extension): convert user facing DRepID to bech32 * fix: add cardano symbol to deposit amount * chore(core): downgrade storybook to v6 * fix: update lock file * fix: styles and text * fix: storybook build * fix: storybook build * feat: check retired drep key * fix: check retired drep key --------- Co-authored-by: Renan Ferreira Co-authored-by: Michael Chappell <7581002+mchappell@users.noreply.github.com> --- .github/workflows/e2e-tests-linux.yml | 6 +- .github/workflows/smoke-tests.yml | 6 +- .../ConfirmDRepRegistration.stories.ts | 50 ++++++++++++++++ .../ConfirmDRepRetirement.stories.ts | 46 ++++++++++++++ .../DappTransaction.stories.ts | 60 +++++++++++++++++++ 5 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 packages/core/src/ui/components/ConfirmDRepRegistration/ConfirmDRepRegistration.stories.ts create mode 100644 packages/core/src/ui/components/ConfirmDRepRetirement/ConfirmDRepRetirement.stories.ts create mode 100644 packages/core/src/ui/components/DappTransaction/DappTransaction.stories.ts diff --git a/.github/workflows/e2e-tests-linux.yml b/.github/workflows/e2e-tests-linux.yml index b3066bb63e..47f32d5fc3 100644 --- a/.github/workflows/e2e-tests-linux.yml +++ b/.github/workflows/e2e-tests-linux.yml @@ -50,9 +50,9 @@ jobs: uses: ./.github/shared/build with: LACE_EXTENSION_KEY: ${{ secrets.MANIFEST_PUBLIC_KEY }} - CARDANO_SERVICES_URL_MAINNET: ${{ secrets.CARDANO_SERVICES_URL_MAINNET }} - CARDANO_SERVICES_URL_PREPROD: ${{ secrets.CARDANO_SERVICES_URL_PREPROD }} - CARDANO_SERVICES_URL_PREVIEW: ${{ secrets.CARDANO_SERVICES_URL_PREVIEW }} + CARDANO_SERVICES_URL_MAINNET: ${{ secrets.CARDANO_SERVICES_DEV_URL_MAINNET }} + CARDANO_SERVICES_URL_PREPROD: ${{ secrets.CARDANO_SERVICES_DEV_URL_PREPROD }} + CARDANO_SERVICES_URL_PREVIEW: ${{ secrets.CARDANO_SERVICES_DEV_URL_PREVIEW }} - name: Start XVFB run: | Xvfb :99 & diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 25d988c045..5066293a93 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -26,9 +26,9 @@ jobs: uses: ./.github/shared/build with: LACE_EXTENSION_KEY: ${{ secrets.MANIFEST_PUBLIC_KEY }} - CARDANO_SERVICES_URL_MAINNET: ${{ secrets.CARDANO_SERVICES_URL_MAINNET }} - CARDANO_SERVICES_URL_PREPROD: ${{ secrets.CARDANO_SERVICES_URL_PREPROD }} - CARDANO_SERVICES_URL_PREVIEW: ${{ secrets.CARDANO_SERVICES_URL_PREVIEW }} + CARDANO_SERVICES_URL_MAINNET: ${{ secrets.CARDANO_SERVICES_DEV_URL_MAINNET }} + CARDANO_SERVICES_URL_PREPROD: ${{ secrets.CARDANO_SERVICES_DEV_URL_PREPROD }} + CARDANO_SERVICES_URL_PREVIEW: ${{ secrets.CARDANO_SERVICES_DEV_URL_PREVIEW }} - name: Start XVFB run: | Xvfb :99 & diff --git a/packages/core/src/ui/components/ConfirmDRepRegistration/ConfirmDRepRegistration.stories.ts b/packages/core/src/ui/components/ConfirmDRepRegistration/ConfirmDRepRegistration.stories.ts new file mode 100644 index 0000000000..6434e8d54b --- /dev/null +++ b/packages/core/src/ui/components/ConfirmDRepRegistration/ConfirmDRepRegistration.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { ConfirmDRepRegistration } from './ConfirmDRepRegistration'; +import { ComponentProps } from 'react'; + +const meta: Meta = { + title: 'ConfirmDRepRegistration', + component: ConfirmDRepRegistration, + parameters: { + layout: 'centered' + } +}; + +export default meta; +type Story = StoryObj; + +const data: ComponentProps = { + dappInfo: { + logo: 'https://cdn.mint.handle.me/favicon.png', + name: 'Mint', + url: 'https://preprod.mint.handle.me' + }, + translations: { + labels: { + depositPaid: 'Deposit paid', + drepId: 'Drep ID', + hash: 'Hash', + url: 'URL' + }, + metadata: 'Metadata' + }, + metadata: { + depositPaid: '0.35 ADA', + drepId: '65ge6g54g5dd5', + hash: '9bba8233cdd086f0325daba465d568a88970d42536f9e71e92a80d5922ded885', + url: 'https://raw.githubusercontent.com/Ryun1/gov-metadata/main/governace-action/metadata.jsonldr1q99...uqvzlalu' + } +}; + +export const Overview: Story = { + args: { + ...data + } +}; +export const WithError: Story = { + args: { + ...data, + errorMessage: 'Something went wrong' + } +}; diff --git a/packages/core/src/ui/components/ConfirmDRepRetirement/ConfirmDRepRetirement.stories.ts b/packages/core/src/ui/components/ConfirmDRepRetirement/ConfirmDRepRetirement.stories.ts new file mode 100644 index 0000000000..6323a43ec5 --- /dev/null +++ b/packages/core/src/ui/components/ConfirmDRepRetirement/ConfirmDRepRetirement.stories.ts @@ -0,0 +1,46 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { ConfirmDRepRetirement } from './ConfirmDRepRetirement'; +import { ComponentProps } from 'react'; + +const meta: Meta = { + title: 'ConfirmDRepRetirement', + component: ConfirmDRepRetirement, + parameters: { + layout: 'centered' + } +}; + +export default meta; +type Story = StoryObj; + +const data: ComponentProps = { + dappInfo: { + logo: 'https://cdn.mint.handle.me/favicon.png', + name: 'Mint', + url: 'https://preprod.mint.handle.me' + }, + translations: { + labels: { + depositReturned: 'Deposit paid', + drepId: 'Drep ID' + }, + metadata: 'Metadata' + }, + metadata: { + depositReturned: '0.35 ADA', + drepId: '65ge6g54g5dd5' + } +}; + +export const Overview: Story = { + args: { + ...data + } +}; +export const WithError: Story = { + args: { + ...data, + errorMessage: 'Something went wrong' + } +}; diff --git a/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.ts b/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.ts new file mode 100644 index 0000000000..56f29d0531 --- /dev/null +++ b/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.ts @@ -0,0 +1,60 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { DappTransaction } from './DappTransaction'; +import { ComponentProps } from 'react'; + +const meta: Meta = { + title: 'DappTransaction', + component: DappTransaction, + parameters: { + layout: 'centered' + } +}; + +export default meta; +type Story = StoryObj; + +const data: ComponentProps = { + dappInfo: { + logo: 'https://cdn.mint.handle.me/favicon.png', + name: 'Mint', + url: 'https://preprod.mint.handle.me' + }, + translations: { + recipient: 'Recipient', + amount: 'Amount', + adaFollowingNumericValue: 'ADA', + fee: 'Fee', + transaction: 'Transaction' + }, + transaction: { + fee: '0.17', + outputs: [ + { + coins: '1', + recipient: + 'addr_test1qrl0s3nqfljv8dfckn7c4wkzu5rl6wn4hakkddcz2mczt3szlqss933x0aag07qcgspcaglmay6ufl4y4lalmlpe02mqhl0fx2' + } + ], + type: 'Mint' + } +}; + +export const Overview: Story = { + args: { + ...data + } +}; + +export const WithInsufficientFunds: Story = { + args: { + ...data + } +}; + +export const WithError: Story = { + args: { + ...data, + errorMessage: 'Something went wrong' + } +}; From b3dfb50c4a321f585104b581be850a4baee5f190 Mon Sep 17 00:00:00 2001 From: Renan Valentin Date: Tue, 24 Oct 2023 13:28:26 -0300 Subject: [PATCH 03/19] feat(extension): [LW-7984] voting procedures (#655) * feat(ui): create metadata component * wip * feat(ui): text link component * chore(ui): fix rebase * feat(ui): create metadata link component * feat(core): create voting procedures component * chore(extension): fix rebase * fix(ui): add work break * feat(extension): voting procedures * refactor(core): make actions optional * refactor(core): use action as key prop * refactor(extension): add custom title for voting procedures --- .../VotingProcedures.stories.ts | 107 ++++++++++++++++++ packages/ui/package.json | 12 ++ 2 files changed, 119 insertions(+) create mode 100644 packages/core/src/ui/components/VotingProcedures/VotingProcedures.stories.ts diff --git a/packages/core/src/ui/components/VotingProcedures/VotingProcedures.stories.ts b/packages/core/src/ui/components/VotingProcedures/VotingProcedures.stories.ts new file mode 100644 index 0000000000..72a297d798 --- /dev/null +++ b/packages/core/src/ui/components/VotingProcedures/VotingProcedures.stories.ts @@ -0,0 +1,107 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { VotingProcedures } from './VotingProcedures'; +import { ComponentProps } from 'react'; + +const meta: Meta = { + title: 'VotingProcedures', + component: VotingProcedures, + parameters: { + layout: 'centered' + } +}; + +export default meta; +type Story = StoryObj; + +const data: ComponentProps = { + dappInfo: { + logo: 'https://cdn.mint.handle.me/favicon.png', + name: 'Mint', + url: 'https://preprod.mint.handle.me' + }, + data: [ + { + voter: { + type: 'DRep', + dRepId: 'drep1cs234l5mtapethapx8cq97nkpa27xf84phruh5f6jqxa78ymlp4' + }, + votes: [ + { + actionId: { + index: 0, + txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', + txHashUrl: + 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' + }, + votingProcedure: { + anchor: { + hash: '9067f223838d88b83f660c05eedf7f6f65c45de31e522c1bcb6a1eb287b17e89', + url: 'https://shorturl.at/eK145' + }, + vote: 'Yes' + } + } + ] + } + ], + translations: { + voterType: 'Voter type', + procedureTitle: 'Procedure', + actionIdTitle: 'Action ID', + vote: 'Vote', + actionId: { + index: 'Index', + txHash: 'TX Hash' + }, + anchor: { + hash: 'Anchor Hash', + url: 'Anchor URL' + }, + dRepId: 'DRep ID' + } +}; + +export const Overview: Story = { + args: { + ...data + } +}; +export const WithError: Story = { + args: { + ...data, + errorMessage: 'Something went wrong' + } +}; + +export const MultipleVotes: Story = { + args: { + ...data, + data: [ + ...data.data, + { + voter: { + type: 'DRep', + dRepId: 'drep1cs234l5mtapethapx8cq97nkpa27xf84phruh5f6jqxa78ymlp4' + }, + votes: [ + { + actionId: { + index: 0, + txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', + txHashUrl: + 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' + }, + votingProcedure: { + anchor: { + hash: '9067f223838d88b83f660c05eedf7f6f65c45de31e522c1bcb6a1eb287b17e89', + url: 'https://shorturl.at/eK145' + }, + vote: 'Yes' + } + } + ] + } + ] + } +}; diff --git a/packages/ui/package.json b/packages/ui/package.json index c5e31ae811..b1bafe4dea 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -106,5 +106,17 @@ "wait-on": "^7.0.1", "webpack": "^5.76.1", "webpack-dev-server": "^4.11.1" + }, + "resolutions": { + "@storybook/addon-actions": "^6.5.16", + "@storybook/addon-essentials": "^6.5.16", + "@storybook/addon-interactions": "^6.5.16", + "@storybook/addon-links": "^6.5.16", + "@storybook/builder-webpack5": "6.5.16", + "@storybook/jest": "^0.0.10", + "@storybook/manager-webpack5": "6.5.16", + "@storybook/react": "^6.5.16", + "@storybook/test-runner": "^0.10.0", + "@storybook/testing-library": "^0.0.13" } } From 8f972b56a5e012b8812fc16c6d812a6d5b81cec5 Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Thu, 26 Oct 2023 13:43:31 -0300 Subject: [PATCH 04/19] feat(core): create parameter change action --- packages/core/package.json | 2 + .../ParameterChangeAction/EconomicGroup.tsx | 69 +++++++ .../ParameterChangeAction/GovernanceGroup.tsx | 73 +++++++ .../ParameterChangeAction/NetworkGroup.tsx | 76 +++++++ .../ParameterChangeAction.stories.ts | 190 ++++++++++++++++++ .../ParameterChangeAction.tsx | 53 +++++ .../ParameterChangeActionTypes.ts | 140 +++++++++++++ .../ParameterChangeAction/TechnicalGroup.tsx | 52 +++++ .../ParameterChangeAction/index.ts | 1 + .../ProposalProcedure/components/ActionId.tsx | 30 +++ .../components/ActionIdTypes.ts | 11 + .../ProposalProcedure/components/Card.tsx | 67 ++++++ .../components/Procedure.tsx | 36 ++++ .../components/ProcedureTypes.ts | 19 ++ yarn.lock | 37 +++- 15 files changed, 855 insertions(+), 1 deletion(-) create mode 100644 packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/EconomicGroup.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/GovernanceGroup.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/NetworkGroup.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeActionTypes.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/TechnicalGroup.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/index.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/components/ActionId.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/components/ActionIdTypes.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/components/Card.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/components/Procedure.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/components/ProcedureTypes.ts diff --git a/packages/core/package.json b/packages/core/package.json index c1a1678406..dc8a507a19 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -47,6 +47,7 @@ "axios-cache-adapter": "2.7.3", "classnames": "^2.3.1", "debounce-promise": "^3.1.2", + "decamelize-keys": "^2.0.1", "i18next": "20.4.0", "jest-mock-extended": "3.0.4", "lodash": "4.17.21", @@ -55,6 +56,7 @@ "react-dom": "17.0.2", "react-i18next": "11.11.4", "react-infinite-scroll-component": "^6.1.0", + "titleize": "^4.0.0", "zxcvbn": "^4.4.2" }, "devDependencies": { diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/EconomicGroup.tsx b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/EconomicGroup.tsx new file mode 100644 index 0000000000..6243f2dc3e --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/EconomicGroup.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import { Cell, Metadata, Text, sx } from '@lace/ui'; +import { Card } from '../components/Card'; +import * as Types from './ParameterChangeActionTypes'; + +interface Props { + economicGroup: Types.EconomicGroup; + translations: Types.Translations['economicGroup']; +} + +export const EconomicGroup = ({ economicGroup, translations }: Props): JSX.Element => { + const textCss = sx({ + color: '$text_primary' + }); + + return ( + <> + + + {translations.title} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/GovernanceGroup.tsx b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/GovernanceGroup.tsx new file mode 100644 index 0000000000..6590500c0e --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/GovernanceGroup.tsx @@ -0,0 +1,73 @@ +import React from 'react'; +import { Cell, Metadata, Text, sx } from '@lace/ui'; +import * as Types from './ParameterChangeActionTypes'; +import { Card } from '../components/Card'; +import decamelizeKeys from 'decamelize-keys'; +import titleize from 'titleize'; + +interface Props { + governanceGroup: Types.GovernanceGroup; + translations: Types.Translations['governanceGroup']; +} + +export const GovernanceGroup = ({ governanceGroup, translations }: Props): JSX.Element => { + const textCss = sx({ + color: '$text_primary' + }); + + const dRepVotingThresholds = decamelizeKeys(governanceGroup.dRepVotingThresholds, { separator: ' ' }); + + return ( + <> + + + {translations.title} + + + + + + + + + + + + + + + + + + + + + + ({ + label: titleize(label), + value + }))} + /> + + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/NetworkGroup.tsx b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/NetworkGroup.tsx new file mode 100644 index 0000000000..faef5e47cc --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/NetworkGroup.tsx @@ -0,0 +1,76 @@ +import React from 'react'; +import { Cell, Metadata, Text, sx } from '@lace/ui'; +import { Card } from '../components/Card'; +import * as Types from './ParameterChangeActionTypes'; + +interface Props { + networkGroup: Types.NetworkGroup; + translations: Types.Translations['networkGroup']; +} + +export const NetworkGroup = ({ networkGroup, translations }: Props): JSX.Element => { + const textCss = sx({ + color: '$text_primary' + }); + + return ( + <> + + + {translations.title} + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts new file mode 100644 index 0000000000..0818a60dc5 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts @@ -0,0 +1,190 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { ParameterChangeAction } from './ParameterChangeAction'; +import { ComponentProps } from 'react'; + +const meta: Meta = { + title: 'ParameterChangeAction', + component: ParameterChangeAction, + parameters: { + layout: 'centered' + } +}; + +export default meta; +type Story = StoryObj; + +const data: ComponentProps = { + dappInfo: { + logo: 'https://cdn.mint.handle.me/favicon.png', + name: 'Mint', + url: 'https://preprod.mint.handle.me' + }, + data: { + procedure: { + deposit: '2000', + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + anchor: { + hash: '0000000000000000000000000000000000000000000000000000000000000000', + url: 'https://www.someurl.io', + txHashUrl: 'https://www.someurl.io' + } + }, + protocolParamUpdate: { + networkGroup: { + maxBBSize: '65536', + maxBHSize: '1100', + maxTxSize: '16384', + maxBlockExUnits: { + memory: '50000000', + step: '4000000000' + }, + maxCollateralInputs: '3', + maxTxExUnits: { + memory: '10000000', + step: '10000000000' + }, + maxValSize: '5000' + }, + economicGroup: { + minFeeA: '44', + minFeeB: '155381', + keyDeposit: '2000000', + poolDeposit: '500000000', + minPoolCost: '340000000', + coinsPerUTxOByte: '34482', + price: { + memory: '0.0577', + step: '0.0000721' + }, + rho: '0.003', + tau: '0.2' + }, + technicalGroup: { + a0: '0.3', + nOpt: '150', + collateralPercentage: '150', + costModels: { + PlutusV1: { + 'addInteger-cpu-arguments-intercept': '197_209', + 'addInteger-cpu-arguments-slope': '0' + }, + PlutusV2: { + 'addInteger-cpu-arguments-intercept': '197_209', + 'addInteger-cpu-arguments-slope': '0' + } + }, + eMax: '18' + }, + governanceGroup: { + govActionLifetime: '14', + govActionDeposit: '0', + ccMaxTermLength: '60', + ccMinSize: '0', + drepActivity: '0', + drepDeposit: '0', + dRepVotingThresholds: { + dvtMotionNoConfidence: '0.51', + dvtCommitteeNormal: '0.51', + dvtCommitteeNoConfidence: '0.51', + dvtUpdateToConstitution: '0.51', + dvtHardForkInitiation: '0.51', + dvtPPNetworkGroup: '0.51', + dvtPPEconomicGroup: '0.51', + dvtPPTechnicalGroup: '0.51', + dvtPPGovGroup: '0.51', + dvtTreasuryWithdrawal: '0.51' + } + } + } + }, + translations: { + procedure: { + anchor: { + hash: 'Anchor Hash', + url: 'Anchor URL' + }, + deposit: 'Deposit', + rewardAccount: 'Reward account', + title: 'Procedure' + }, + actionIdTitle: 'Action ID', + anchor: { + hash: 'Anchor Hash', + url: 'Anchor URL' + }, + networkGroup: { + title: 'Network group', + tooltip: { + maxBBSize: 'Max block body size', + maxTxSize: 'Max transaction size', + maxBHSize: 'Max block header size', + maxValSize: 'Max size of a serialized asset value', + maxTxExUnits: 'Max script execution units in a single transaction', + maxBlockExUnits: 'Max script execution units in a single block', + maxCollateralInputs: 'Max number of collateral inputs' + } + }, + economicGroup: { + title: 'Economic group', + tooltip: { + minFeeA: 'Min fee coefficient', + minFeeB: 'Min fee constant', + keyDeposit: 'Delegation key Lovelace deposit', + poolDeposit: 'Pool registration Lovelace deposit', + rho: 'Monetary expansion', + tau: 'Treasury expansion', + minPoolCost: 'Min fixed rewards cut for pools', + coinsPerUTxOByte: 'Min Lovelace deposit per byte of serialized UTxO', + prices: 'Prices of Plutus execution units' + } + }, + technicalGroup: { + title: 'Technical group', + tooltip: { + a0: 'Pool pledge influence', + eMax: 'Pool retirement maximum epoch', + nOpt: 'Desired number of pools', + costModels: 'Plutus execution cost models', + collateralPercentage: 'Proportion of collateral needed for scripts' + } + }, + governanceGroup: { + title: 'Governance group', + tooltip: { + govActionLifetime: 'governance action maximum lifetime in epochs', + govActionDeposit: 'governance action deposit', + drepDeposit: 'DRep deposit amount', + drepActivity: 'DRep activity period in epochs', + ccMinSize: 'Min constitutional committee size', + ccMaxTermLength: 'Max term length (in epochs) for the constitutional committee members', + dRepVotingThresholds: { + title: 'DRep voting thresholds', + motionNoConfidence: '1. Motion of no-confidence', + committeeNormal: '2a. New committee/threshold (normal state)', + commiteeNoConfidence: '2b. New committee/threshold (state of no-confidence)', + updateConstitution: '3. Update to the Constitution or proposal policy', + hardForkInitiation: '4. Hard-fork initiation', + ppNetworkGroup: '5a. Protocol parameter changes, network group', + ppEconomicGroup: '5b. Protocol parameter changes, economic group', + ppTechnicalGroup: '5c. Protocol parameter changes, technical group', + ppGovernanceGroup: '5d. Protocol parameter changes, governance group', + treasuryWithdrawal: '6. Treasury withdrawal' + } + } + } + } +}; + +export const Overview: Story = { + args: { + ...data + } +}; + +export const WithError: Story = { + args: { + ...data, + errorMessage: 'Something went wrong' + } +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.tsx b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.tsx new file mode 100644 index 0000000000..01916bdcaa --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { Box, Cell, Grid, Flex, Divider } from '@lace/ui'; +import { DappInfo, DappInfoProps } from '../../DappInfo'; +import { ErrorPane } from '@lace/common'; +import { Procedure } from '../components/Procedure'; +import * as Types from './ParameterChangeActionTypes'; +import { EconomicGroup } from './EconomicGroup'; +import { NetworkGroup } from './NetworkGroup'; +import { TechnicalGroup } from './TechnicalGroup'; +import { GovernanceGroup } from './GovernanceGroup'; + +interface Props { + dappInfo: Omit; + errorMessage?: string; + data: Types.Data; + translations: Types.Translations; +} + +export const ParameterChangeAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => { + const { economicGroup, governanceGroup, networkGroup, technicalGroup } = data.protocolParamUpdate; + + return ( + + + + + {errorMessage && ( + + + + )} + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeActionTypes.ts b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeActionTypes.ts new file mode 100644 index 0000000000..ee75a51914 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeActionTypes.ts @@ -0,0 +1,140 @@ +import * as ProcedureTypes from '../components/ProcedureTypes'; + +export interface Data { + procedure: ProcedureTypes.Procedure; + protocolParamUpdate: ProtocolParamUpdate; +} + +export interface NetworkGroup { + maxBBSize: string; + maxTxSize: string; + maxBHSize: string; + maxValSize: string; + maxTxExUnits: { + memory: string; + step: string; + }; + maxBlockExUnits: { + memory: string; + step: string; + }; + maxCollateralInputs: string; +} + +export interface EconomicGroup { + minFeeA: string; + minFeeB: string; + keyDeposit: string; + poolDeposit: string; + rho: string; + tau: string; + minPoolCost: string; + coinsPerUTxOByte: string; + price: { + memory: string; + step: string; + }; +} + +export interface TechnicalGroup { + a0: string; + eMax: string; + nOpt: string; + costModels: { + PlutusV1: Record; + PlutusV2: Record; + }; + collateralPercentage: string; +} + +export interface GovernanceGroup { + govActionLifetime: string; + govActionDeposit: string; + drepDeposit: string; + drepActivity: string; + ccMinSize: string; + ccMaxTermLength: string; + dRepVotingThresholds: { + dvtMotionNoConfidence: string; + dvtCommitteeNormal: string; + dvtCommitteeNoConfidence: string; + dvtUpdateToConstitution: string; + dvtHardForkInitiation: string; + dvtPPNetworkGroup: string; + dvtPPEconomicGroup: string; + dvtPPTechnicalGroup: string; + dvtPPGovGroup: string; + dvtTreasuryWithdrawal: string; + }; +} + +interface ProtocolParamUpdate { + networkGroup: NetworkGroup; + economicGroup: EconomicGroup; + technicalGroup: TechnicalGroup; + governanceGroup: GovernanceGroup; +} + +export interface Translations { + procedure: ProcedureTypes.Translations; + networkGroup: { + title: string; + tooltip: { + maxBBSize: string; + maxTxSize: string; + maxBHSize: string; + maxValSize: string; + maxTxExUnits: string; + maxBlockExUnits: string; + maxCollateralInputs: string; + }; + }; + economicGroup: { + title: string; + tooltip: { + minFeeA: string; + minFeeB: string; + keyDeposit: string; + poolDeposit: string; + rho: string; + tau: string; + minPoolCost: string; + coinsPerUTxOByte: string; + prices: string; + }; + }; + technicalGroup: { + title: string; + tooltip: { + a0: string; + eMax: string; + nOpt: string; + costModels: string; + collateralPercentage: string; + }; + }; + governanceGroup: { + title: string; + tooltip: { + govActionLifetime: string; + govActionDeposit: string; + drepDeposit: string; + drepActivity: string; + ccMinSize: string; + ccMaxTermLength: string; + dRepVotingThresholds: { + title: string; + motionNoConfidence: string; + committeeNormal: string; + commiteeNoConfidence: string; + updateConstitution: string; + hardForkInitiation: string; + ppNetworkGroup: string; + ppEconomicGroup: string; + ppTechnicalGroup: string; + ppGovernanceGroup: string; + treasuryWithdrawal: string; + }; + }; + }; +} diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/TechnicalGroup.tsx b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/TechnicalGroup.tsx new file mode 100644 index 0000000000..3799a32eaf --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/TechnicalGroup.tsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { Box, Cell, Metadata, Text, sx } from '@lace/ui'; +import * as Types from './ParameterChangeActionTypes'; +import { Card } from '../components/Card'; + +interface Props { + technicalGroup: Types.TechnicalGroup; + translations: Types.Translations['technicalGroup']; +} + +export const TechnicalGroup = ({ technicalGroup, translations }: Props): JSX.Element => { + const textCss = sx({ + color: '$text_primary' + }); + + const costModels = Object.entries(technicalGroup.costModels).map(([key, value]) => ({ + title: key, + fields: Object.entries(value).map(([cKey, cValue]) => ({ + label: cKey, + value: cValue + })) + })); + + return ( + <> + + + {translations.title} + + + + + + + + + + + + + + + + {costModels.map(({ title, fields }, idx) => ( + 0 ? '$24' : '$0'} key={title}> + + + ))} + + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/index.ts b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/index.ts new file mode 100644 index 0000000000..63caf5ba15 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/index.ts @@ -0,0 +1 @@ +export { ParameterChangeAction } from './ParameterChangeAction'; diff --git a/packages/core/src/ui/components/ProposalProcedure/components/ActionId.tsx b/packages/core/src/ui/components/ProposalProcedure/components/ActionId.tsx new file mode 100644 index 0000000000..6000165702 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/components/ActionId.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { Cell, sx, Metadata, Text, MetadataLink } from '@lace/ui'; +import * as Types from './ActionIdTypes'; + +interface Props { + data: Types.Data; + translations: Types.Translations; +} + +export const ActionId = ({ data, translations }: Props): JSX.Element => { + const textCss = sx({ + color: '$text_primary' + }); + + return ( + <> + + + {translations.title} + + + + + + + + + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/components/ActionIdTypes.ts b/packages/core/src/ui/components/ProposalProcedure/components/ActionIdTypes.ts new file mode 100644 index 0000000000..e3de620cc7 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/components/ActionIdTypes.ts @@ -0,0 +1,11 @@ +export interface Data { + index: number; + txHash: string; + txHashUrl: string; +} + +export interface Translations { + title: string; + index: string; + txHash: string; +} diff --git a/packages/core/src/ui/components/ProposalProcedure/components/Card.tsx b/packages/core/src/ui/components/ProposalProcedure/components/Card.tsx new file mode 100644 index 0000000000..99fcaa0202 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/components/Card.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { Cell, Grid, Flex, Card as UICard, Box, sx, Text, TextLink } from '@lace/ui'; + +interface Item { + label: string; + value: string; + tooltip?: string; + url?: string; +} + +interface Props { + title?: string; + tooltip?: string; + data: Item[]; +} + +export const Card = ({ title, tooltip, data }: Props): JSX.Element => { + const textCss = sx({ + color: '$text_primary' + }); + + const renderRow = (props: Item) => ( + <> + + + + {props.label} + + + + + + {props.url ? ( + + + + ) : ( + + {props.value} + + )} + + + + ); + + return ( + + + + + {title && ( + + + {title} + + + )} + + {data.map((props) => renderRow(props))} + + + + + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/components/Procedure.tsx b/packages/core/src/ui/components/ProposalProcedure/components/Procedure.tsx new file mode 100644 index 0000000000..b098125311 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/components/Procedure.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { Cell, Metadata, Text, sx } from '@lace/ui'; +import * as Types from './ProcedureTypes'; + +interface Props { + data: Types.Procedure; + translations: Types.Translations; +} + +export const Procedure = ({ data, translations }: Props): JSX.Element => { + const textCss = sx({ + color: '$text_primary' + }); + + return ( + <> + + + {translations.title} + + + + + + + + + + + + + + + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/components/ProcedureTypes.ts b/packages/core/src/ui/components/ProposalProcedure/components/ProcedureTypes.ts new file mode 100644 index 0000000000..34994de499 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/components/ProcedureTypes.ts @@ -0,0 +1,19 @@ +export interface Procedure { + deposit: string; + rewardAccount: string; + anchor?: { + url: string; + hash: string; + txHashUrl: string; + }; +} + +export interface Translations { + title: string; + deposit: string; + rewardAccount: string; + anchor: { + url: string; + hash: string; + }; +} diff --git a/yarn.lock b/yarn.lock index bc38461983..7d94f762e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9425,6 +9425,7 @@ __metadata: axios-cache-adapter: 2.7.3 classnames: ^2.3.1 debounce-promise: ^3.1.2 + decamelize-keys: ^2.0.1 i18next: 20.4.0 jest-mock-extended: 3.0.4 lodash: 4.17.21 @@ -9435,6 +9436,7 @@ __metadata: react-infinite-scroll-component: ^6.1.0 sass: ^1.68.0 storybook: ^7.4.3 + titleize: ^4.0.0 typescript: ^4.3.5 zxcvbn: ^4.4.2 peerDependencies: @@ -24924,6 +24926,18 @@ __metadata: languageName: node linkType: hard +"decamelize-keys@npm:^2.0.1": + version: 2.0.1 + resolution: "decamelize-keys@npm:2.0.1" + dependencies: + decamelize: ^6.0.0 + map-obj: ^4.3.0 + quick-lru: ^6.1.1 + type-fest: ^3.1.0 + checksum: 633f4599047892a87188f7767b6f78ca75a0eadfdd5362b81ab6a3fed3e73ed0db54a5285b6a43482a63896002b28f7add4fdef2228de9873f93a79ab7b4693e + languageName: node + linkType: hard + "decamelize@npm:^1.1.0, decamelize@npm:^1.1.2, decamelize@npm:^1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" @@ -35744,6 +35758,13 @@ __metadata: languageName: node linkType: hard +"map-obj@npm:^4.3.0": + version: 4.3.0 + resolution: "map-obj@npm:4.3.0" + checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e + languageName: node + linkType: hard + "map-or-similar@npm:^1.5.0": version: 1.5.0 resolution: "map-or-similar@npm:1.5.0" @@ -41298,6 +41319,13 @@ __metadata: languageName: node linkType: hard +"quick-lru@npm:^6.1.1": + version: 6.1.2 + resolution: "quick-lru@npm:6.1.2" + checksum: 0491a24dcd39b8a325e9d3ae719fad7690a1da7a0dbfa8f16613663dc7d262d08b565005ce16a04497ed4700f1f477b8e06cd46e10a7a112a481a18d056c38f7 + languageName: node + linkType: hard + "rambda@npm:^8.5.0": version: 8.5.0 resolution: "rambda@npm:8.5.0" @@ -47518,6 +47546,13 @@ __metadata: languageName: node linkType: hard +"titleize@npm:^4.0.0": + version: 4.0.0 + resolution: "titleize@npm:4.0.0" + checksum: 4415b5422818cce13d6eb3037a53922c1aa79cbaefdfc26ecd862c8d9d526a5046a52963c5f6034fb866daae13004b2fbac546c5a1e25d5904d1452518e56959 + languageName: node + linkType: hard + "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -48184,7 +48219,7 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^3.8.0": +"type-fest@npm:^3.1.0, type-fest@npm:^3.8.0": version: 3.13.1 resolution: "type-fest@npm:3.13.1" checksum: c06b0901d54391dc46de3802375f5579868949d71f93b425ce564e19a428a0d411ae8d8cb0e300d330071d86152c3ea86e744c3f2860a42a79585b6ec2fdae8e From de28c739a6b80cfa83455b232c697fba95635da4 Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Fri, 27 Oct 2023 09:48:27 -0300 Subject: [PATCH 05/19] feat(core): create hard fork initiation action --- .../HardForkInitiationAction.stories.ts | 78 +++++++++++++++++++ .../HardForkInitiationAction.tsx | 54 +++++++++++++ .../HardForkInitiationActionTypes.ts | 21 +++++ .../HardForkInitiationAction/index.ts | 1 + 4 files changed, 154 insertions(+) create mode 100644 packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.stories.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationActionTypes.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/index.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.stories.ts new file mode 100644 index 0000000000..1719bcc21f --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.stories.ts @@ -0,0 +1,78 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { HardForkInitiationAction } from './HardForkInitiationAction'; +import { ComponentProps } from 'react'; + +const meta: Meta = { + title: 'HardForkInitiationAction', + component: HardForkInitiationAction, + parameters: { + layout: 'centered' + } +}; + +export default meta; +type Story = StoryObj; + +const data: ComponentProps = { + dappInfo: { + logo: 'https://cdn.mint.handle.me/favicon.png', + name: 'Mint', + url: 'https://preprod.mint.handle.me' + }, + data: { + procedure: { + deposit: '2000', + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + anchor: { + hash: '0000000000000000000000000000000000000000000000000000000000000000', + url: 'https://www.someurl.io', + txHashUrl: 'https://www.someurl.io' + } + }, + actionId: { + index: 0, + txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', + txHashUrl: + 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' + }, + protocolVersion: { + major: 5, + minor: 1, + patch: 1 + } + }, + translations: { + procedure: { + anchor: { + hash: 'Anchor Hash', + url: 'Anchor URL' + }, + deposit: 'Deposit', + rewardAccount: 'Reward account', + title: 'Procedure' + }, + actionId: { + title: 'Action ID', + index: 'Index', + txHash: 'TX Hash' + }, + protocolVersion: { + title: 'Hard Fork Details', + label: 'Protocol Version' + } + } +}; + +export const Overview: Story = { + args: { + ...data + } +}; + +export const WithError: Story = { + args: { + ...data, + errorMessage: 'Something went wrong' + } +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.tsx b/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.tsx new file mode 100644 index 0000000000..fa08ae34b7 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import { Box, Cell, Grid, Flex, Divider, sx, Metadata, Text } from '@lace/ui'; +import { DappInfo, DappInfoProps } from '../../DappInfo'; +import { ErrorPane } from '@lace/common'; +import * as Types from './HardForkInitiationActionTypes'; +import { Procedure } from '../components/Procedure'; +import { ActionId } from '../components/ActionId'; + +interface Props { + dappInfo: Omit; + errorMessage?: string; + data: Types.Data; + translations: Types.Translations; +} + +export const HardForkInitiationAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => { + const textCss = sx({ + color: '$text_primary' + }); + + return ( + + + + + {errorMessage && ( + + + + )} + + + + + + + + + + + + {translations.protocolVersion.title} + + + + + + + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationActionTypes.ts b/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationActionTypes.ts new file mode 100644 index 0000000000..489068dde3 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationActionTypes.ts @@ -0,0 +1,21 @@ +import * as ProcedureTypes from '../components/ProcedureTypes'; +import * as ActionTypes from '../components/ActionIdTypes'; + +export interface Data { + procedure: ProcedureTypes.Procedure; + actionId: ActionTypes.Data; + protocolVersion: { + major: number; + minor: number; + patch: number; + }; +} + +export interface Translations { + procedure: ProcedureTypes.Translations; + actionId: ActionTypes.Translations; + protocolVersion: { + title: string; + label: string; + }; +} diff --git a/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/index.ts b/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/index.ts new file mode 100644 index 0000000000..94f3dd74c4 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/index.ts @@ -0,0 +1 @@ +export { HardForkInitiationAction } from './HardForkInitiationAction'; From e8c4c0694c34699424871c0c4d9d8a8585b75833 Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Fri, 27 Oct 2023 09:49:00 -0300 Subject: [PATCH 06/19] feat(core): create new constitution action --- .../NewConstitutionAction.stories.ts | 84 +++++++++++++++++++ .../NewConstitutionAction.tsx | 67 +++++++++++++++ .../NewConstitutionActionTypes.ts | 27 ++++++ .../NewConstitutionAction/index.ts | 1 + 4 files changed, 179 insertions(+) create mode 100644 packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.stories.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionActionTypes.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/index.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.stories.ts new file mode 100644 index 0000000000..075734cecd --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.stories.ts @@ -0,0 +1,84 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { NewConstitutionAction } from './NewConstitutionAction'; +import { ComponentProps } from 'react'; + +const meta: Meta = { + title: 'NewConstitutionAction', + component: NewConstitutionAction, + parameters: { + layout: 'centered' + } +}; + +export default meta; +type Story = StoryObj; + +const data: ComponentProps = { + dappInfo: { + logo: 'https://cdn.mint.handle.me/favicon.png', + name: 'Mint', + url: 'https://preprod.mint.handle.me' + }, + data: { + procedure: { + deposit: '2000', + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + anchor: { + hash: '0000000000000000000000000000000000000000000000000000000000000000', + url: 'https://www.someurl.io', + txHashUrl: 'https://www.someurl.io/' + } + }, + actionId: { + index: 0, + txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', + txHashUrl: + 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' + }, + constitution: { + anchor: { + dataHash: '0000000000000000000000000000000000000000000000000000000000000000', + url: 'https://www.someurl.io' + }, + scriptHash: 'cb0ec2692497b458e46812c8a5bfa2931d1a2d965a99893828ec810f' + } + }, + translations: { + procedure: { + anchor: { + hash: 'Anchor Hash', + url: 'Anchor URL' + }, + deposit: 'Deposit', + rewardAccount: 'Reward account', + title: 'Procedure' + }, + actionId: { + title: 'Action ID', + index: 'Index', + txHash: 'TX Hash' + }, + constitution: { + title: 'Constitution Details', + anchor: { + dataHash: 'Anchor Data Hash', + url: 'Anchor URL' + }, + scriptHash: 'Script Hash' + } + } +}; + +export const Overview: Story = { + args: { + ...data + } +}; + +export const WithError: Story = { + args: { + ...data, + errorMessage: 'Something went wrong' + } +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.tsx b/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.tsx new file mode 100644 index 0000000000..f2abad9549 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { Box, Cell, Grid, Flex, Divider, sx, Metadata, Text } from '@lace/ui'; +import { DappInfo, DappInfoProps } from '../../DappInfo'; +import { ErrorPane } from '@lace/common'; +import * as Types from './NewConstitutionActionTypes'; +import { Procedure } from '../components/Procedure'; +import { Card } from '../components/Card'; +import { ActionId } from '../components/ActionId'; + +interface Props { + dappInfo: Omit; + errorMessage?: string; + data: Types.Data; + translations: Types.Translations; +} + +export const NewConstitutionAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => { + const textCss = sx({ + color: '$text_primary' + }); + + return ( + + + + + {errorMessage && ( + + + + )} + + + + + + + + + + + + {translations.constitution.title} + + + + + + + + + + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionActionTypes.ts b/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionActionTypes.ts new file mode 100644 index 0000000000..32e8ab2a6c --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionActionTypes.ts @@ -0,0 +1,27 @@ +import * as ProcedureTypes from '../components/ProcedureTypes'; +import * as ActionIdTypes from '../components/ActionIdTypes'; + +export interface Data { + procedure: ProcedureTypes.Procedure; + actionId: ActionIdTypes.Data; + constitution: { + anchor: { + dataHash: string; + url: string; + }; + scriptHash: string; + }; +} + +export interface Translations { + procedure: ProcedureTypes.Translations; + actionId: ActionIdTypes.Translations; + constitution: { + title: string; + anchor: { + dataHash: string; + url: string; + }; + scriptHash: string; + }; +} diff --git a/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/index.ts b/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/index.ts new file mode 100644 index 0000000000..cd8fb675a6 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/index.ts @@ -0,0 +1 @@ +export { NewConstitutionAction as HardForkInitiationAction } from './NewConstitutionAction'; From ae73a1906b814c3c1f185326189a0d74e2fe8afb Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Fri, 27 Oct 2023 09:50:04 -0300 Subject: [PATCH 07/19] feat(core): create no confidence action --- .../NoConfidenceAction.stories.ts | 69 +++++++++++++++++++ .../NoConfidenceAction/NoConfidenceAction.tsx | 34 +++++++++ .../NoConfidenceActionTypes.ts | 12 ++++ .../NoConfidenceAction/index.ts | 1 + 4 files changed, 116 insertions(+) create mode 100644 packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.stories.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceActionTypes.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/index.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.stories.ts new file mode 100644 index 0000000000..a9498664a1 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.stories.ts @@ -0,0 +1,69 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { NoConfidenceAction } from './NoConfidenceAction'; +import { ComponentProps } from 'react'; + +const meta: Meta = { + title: 'NoConfidenceAction', + component: NoConfidenceAction, + parameters: { + layout: 'centered' + } +}; + +export default meta; +type Story = StoryObj; + +const data: ComponentProps = { + dappInfo: { + logo: 'https://cdn.mint.handle.me/favicon.png', + name: 'Mint', + url: 'https://preprod.mint.handle.me' + }, + data: { + procedure: { + deposit: '2000', + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + anchor: { + hash: '0000000000000000000000000000000000000000000000000000000000000000', + url: 'https://www.someurl.io', + txHashUrl: 'https://www.someurl.io' + } + }, + actionId: { + index: 0, + txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', + txHashUrl: + 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' + } + }, + translations: { + procedure: { + anchor: { + hash: 'Anchor Hash', + url: 'Anchor URL' + }, + deposit: 'Deposit', + rewardAccount: 'Reward account', + title: 'Procedure' + }, + actionId: { + title: 'Action ID', + index: 'Index', + txHash: 'TX Hash' + } + } +}; + +export const Overview: Story = { + args: { + ...data + } +}; + +export const WithError: Story = { + args: { + ...data, + errorMessage: 'Something went wrong' + } +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.tsx b/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.tsx new file mode 100644 index 0000000000..841474f809 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { Box, Cell, Grid, Flex, Divider } from '@lace/ui'; +import { DappInfo, DappInfoProps } from '../../DappInfo'; +import { ErrorPane } from '@lace/common'; +import * as Types from './NoConfidenceActionTypes'; +import { Procedure } from '../components/Procedure'; +import { ActionId } from '../components/ActionId'; + +interface Props { + dappInfo: Omit; + errorMessage?: string; + data: Types.Data; + translations: Types.Translations; +} + +export const NoConfidenceAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => ( + + + + + {errorMessage && ( + + + + )} + + + + + + + + +); diff --git a/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceActionTypes.ts b/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceActionTypes.ts new file mode 100644 index 0000000000..ffe7ac6ad2 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceActionTypes.ts @@ -0,0 +1,12 @@ +import * as ProcedureTypes from '../components/ProcedureTypes'; +import * as ActionIdTypes from '../components/ActionIdTypes'; + +export interface Data { + procedure: ProcedureTypes.Procedure; + actionId: ActionIdTypes.Data; +} + +export interface Translations { + procedure: ProcedureTypes.Translations; + actionId: ActionIdTypes.Translations; +} diff --git a/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/index.ts b/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/index.ts new file mode 100644 index 0000000000..2c9c805b7b --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/index.ts @@ -0,0 +1 @@ +export { NoConfidenceAction } from './NoConfidenceAction'; From 0af4375c0fe8c9a1cd096d8204e369969cb50c09 Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Fri, 27 Oct 2023 09:50:47 -0300 Subject: [PATCH 08/19] feat(core): create treasury withdrawals action --- .../TreasuryWithdrawalsAction.stories.ts | 69 +++++++++++++++++++ .../TreasuryWithdrawalsAction.tsx | 59 ++++++++++++++++ .../TreasuryWithdrawalsActionTypes.ts | 18 +++++ .../TreasuryWithdrawalsAction/index.ts | 1 + 4 files changed, 147 insertions(+) create mode 100644 packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/index.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts new file mode 100644 index 0000000000..eaf214a392 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts @@ -0,0 +1,69 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { TreasuryWithdrawalsAction } from './TreasuryWithdrawalsAction'; +import { ComponentProps } from 'react'; + +const meta: Meta = { + title: 'TreasuryWithdrawalsAction', + component: TreasuryWithdrawalsAction, + parameters: { + layout: 'centered' + } +}; + +export default meta; +type Story = StoryObj; + +const data: ComponentProps = { + dappInfo: { + logo: 'https://cdn.mint.handle.me/favicon.png', + name: 'Mint', + url: 'https://preprod.mint.handle.me' + }, + data: { + procedure: { + deposit: '2000', + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + anchor: { + hash: '0000000000000000000000000000000000000000000000000000000000000000', + url: 'https://www.someurl.io', + txHashUrl: 'https://www.someurl.io' + } + }, + withdrawals: [ + { + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + lovelace: '1030939916423' + } + ] + }, + translations: { + procedure: { + anchor: { + hash: 'Anchor Hash', + url: 'Anchor URL' + }, + deposit: 'Deposit', + rewardAccount: 'Reward account', + title: 'Procedure' + }, + withdrawals: { + title: 'Withdrawal Details', + lovelace: 'Lovelace Withdrawn', + rewardAccount: 'Reward account' + } + } +}; + +export const Overview: Story = { + args: { + ...data + } +}; + +export const WithError: Story = { + args: { + ...data, + errorMessage: 'Something went wrong' + } +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx b/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx new file mode 100644 index 0000000000..51b7d41308 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx @@ -0,0 +1,59 @@ +import React from 'react'; +import { Box, Cell, Grid, Flex, Divider, sx, Metadata, Text } from '@lace/ui'; +import { DappInfo, DappInfoProps } from '../../DappInfo'; +import { ErrorPane } from '@lace/common'; +import * as Types from './TreasuryWithdrawalsActionTypes'; +import { Procedure } from '../components/Procedure'; +import { Card } from '../components/Card'; + +interface Props { + dappInfo: Omit; + errorMessage?: string; + data: Types.Data; + translations: Types.Translations; +} + +export const TreasuryWithdrawalsAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => { + const textCss = sx({ + color: '$text_primary' + }); + + return ( + + + + + {errorMessage && ( + + + + )} + + + + + + + + {translations.withdrawals.title} + + + {data.withdrawals.map((withdrawal) => ( + + ))} + + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts b/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts new file mode 100644 index 0000000000..0f43645f27 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts @@ -0,0 +1,18 @@ +import * as ProcedureTypes from '../components/ProcedureTypes'; + +export interface Data { + procedure: ProcedureTypes.Procedure; + withdrawals: Array<{ + rewardAccount: string; + lovelace: string; + }>; +} + +export interface Translations { + procedure: ProcedureTypes.Translations; + withdrawals: { + title: string; + rewardAccount: string; + lovelace: string; + }; +} diff --git a/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/index.ts b/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/index.ts new file mode 100644 index 0000000000..2b32267088 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/index.ts @@ -0,0 +1 @@ +export { TreasuryWithdrawalsAction } from './TreasuryWithdrawalsAction'; From ad5b1daa42d416e3fbf56f257da9e881214cc00d Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Fri, 27 Oct 2023 10:33:31 -0300 Subject: [PATCH 09/19] feat(core): create info action --- .../InfoAction/InfoAction.stories.ts | 58 +++++++++++++++++++ .../InfoAction/InfoAction.tsx | 29 ++++++++++ .../InfoAction/InfoActionTypes.ts | 9 +++ .../ProposalProcedure/InfoAction/index.ts | 1 + 4 files changed, 97 insertions(+) create mode 100644 packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoAction.stories.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoAction.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoActionTypes.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/InfoAction/index.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoAction.stories.ts new file mode 100644 index 0000000000..c0ccb52d11 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoAction.stories.ts @@ -0,0 +1,58 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { InfoAction } from './InfoAction'; +import { ComponentProps } from 'react'; + +const meta: Meta = { + title: 'ProposalProcedure/InfoAction', + component: InfoAction, + parameters: { + layout: 'centered' + } +}; + +export default meta; +type Story = StoryObj; + +const data: ComponentProps = { + dappInfo: { + logo: 'https://cdn.mint.handle.me/favicon.png', + name: 'Mint', + url: 'https://preprod.mint.handle.me' + }, + data: { + procedure: { + deposit: '2000', + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + anchor: { + hash: '0000000000000000000000000000000000000000000000000000000000000000', + url: 'https://www.someurl.io', + txHashUrl: 'https://www.someurl.io' + } + } + }, + translations: { + procedure: { + anchor: { + hash: 'Anchor Hash', + url: 'Anchor URL' + }, + deposit: 'Deposit', + rewardAccount: 'Reward account', + title: 'Procedure' + } + } +}; + +export const Overview: Story = { + args: { + ...data + } +}; + +export const WithError: Story = { + args: { + ...data, + errorMessage: 'Something went wrong' + } +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoAction.tsx b/packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoAction.tsx new file mode 100644 index 0000000000..4a7ba34e3d --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoAction.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { Box, Grid, Flex } from '@lace/ui'; +import { DappInfo, DappInfoProps } from '../../DappInfo'; +import { ErrorPane } from '@lace/common'; +import * as Types from './InfoActionTypes'; +import { Procedure } from '../components/Procedure'; + +interface Props { + dappInfo: Omit; + errorMessage?: string; + data: Types.Data; + translations: Types.Translations; +} + +export const InfoAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => ( + + + + + {errorMessage && ( + + + + )} + + + + +); diff --git a/packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoActionTypes.ts b/packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoActionTypes.ts new file mode 100644 index 0000000000..648f6e6cf2 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoActionTypes.ts @@ -0,0 +1,9 @@ +import * as ProcedureTypes from '../components/ProcedureTypes'; + +export interface Data { + procedure: ProcedureTypes.Procedure; +} + +export interface Translations { + procedure: ProcedureTypes.Translations; +} diff --git a/packages/core/src/ui/components/ProposalProcedure/InfoAction/index.ts b/packages/core/src/ui/components/ProposalProcedure/InfoAction/index.ts new file mode 100644 index 0000000000..05be240bcc --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/InfoAction/index.ts @@ -0,0 +1 @@ +export { InfoAction as NoConfidenceAction } from './InfoAction'; From da02c7991b1a855e36e1b5505217f214128e7334 Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Fri, 27 Oct 2023 10:33:49 -0300 Subject: [PATCH 10/19] feat(core): create update comittee action --- .../UpdateCommitteeActionAction.stories.ts | 111 ++++++++++++++++++ .../UpdateCommitteeActionAction.tsx | 97 +++++++++++++++ .../UpdateCommitteeActionTypes.ts | 47 ++++++++ .../UpdateCommitteeAction/index.ts | 1 + 4 files changed, 256 insertions(+) create mode 100644 packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts create mode 100644 packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/index.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts new file mode 100644 index 0000000000..ebc0131bb3 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts @@ -0,0 +1,111 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { UpdateCommitteeAction } from './UpdateCommitteeActionAction'; +import { ComponentProps } from 'react'; + +const meta: Meta = { + title: 'ProposalProcedure/UpdateCommitteeAction', + component: UpdateCommitteeAction, + parameters: { + layout: 'centered' + } +}; + +export default meta; +type Story = StoryObj; + +const data: ComponentProps = { + dappInfo: { + logo: 'https://cdn.mint.handle.me/favicon.png', + name: 'Mint', + url: 'https://preprod.mint.handle.me' + }, + data: { + procedure: { + deposit: '2000', + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + anchor: { + hash: '0000000000000000000000000000000000000000000000000000000000000000', + url: 'https://www.someurl.io', + txHashUrl: 'https://www.someurl.io' + } + }, + actionId: { + index: 0, + txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', + txHashUrl: + 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' + }, + membersToBeAdded: [ + { + coldCredential: { + hash: '30000000000000000000000000000000000000000000000000000000' + }, + epoch: '1' + }, + { + coldCredential: { + hash: '40000000000000000000000000000000000000000000000000000000' + }, + epoch: '2' + } + ], + membersToBeRemoved: [ + { + hash: '00000000000000000000000000000000000000000000000000000000' + }, + { + hash: '20000000000000000000000000000000000000000000000000000000' + } + ], + newQuorumThreshold: { + denominator: '5', + numerator: '1' + } + }, + translations: { + procedure: { + anchor: { + hash: 'Anchor Hash', + url: 'Anchor URL' + }, + deposit: 'Deposit', + rewardAccount: 'Reward account', + title: 'Procedure' + }, + actionId: { + title: 'Action ID', + index: 'Index', + txHash: 'TX Hash' + }, + membersToBeAdded: { + title: 'Members To Be Added', + coldCredential: { + hash: 'Cold Credential Hash', + epoch: 'Epoch' + } + }, + membersToBeRemoved: { + title: 'Members To Be Removed', + hash: 'Hash' + }, + newQuorumThreshold: { + title: 'New Quorum Threshold', + denominator: 'Denominator', + numerator: 'Numerator' + } + } +}; + +export const Overview: Story = { + args: { + ...data + } +}; + +export const WithError: Story = { + args: { + ...data, + errorMessage: 'Something went wrong' + } +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx b/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx new file mode 100644 index 0000000000..da187f6f2d --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx @@ -0,0 +1,97 @@ +import React from 'react'; +import { Box, Cell, Grid, Flex, Divider, sx, Text, Metadata } from '@lace/ui'; +import { DappInfo, DappInfoProps } from '../../DappInfo'; +import { ErrorPane } from '@lace/common'; +import * as Types from './UpdateCommitteeActionTypes'; +import { Procedure } from '../components/Procedure'; +import { ActionId } from '../components/ActionId'; +import { Card } from '../components/Card'; + +interface Props { + dappInfo: Omit; + errorMessage?: string; + data: Types.Data; + translations: Types.Translations; +} + +export const UpdateCommitteeAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => { + const textCss = sx({ + color: '$text_primary' + }); + + return ( + + + + + {errorMessage && ( + + + + )} + + + + + + + + + + + + {translations.newQuorumThreshold.title} + + + + + + + + + + + + + + {translations.membersToBeAdded.title} + + + {data.membersToBeAdded.map(({ coldCredential, epoch }) => ( + + ))} + + + {translations.membersToBeRemoved.title} + + + {data.membersToBeRemoved.map(({ hash }) => ( + + ))} + + + + + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts b/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts new file mode 100644 index 0000000000..5bd9ecb869 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts @@ -0,0 +1,47 @@ +import * as ProcedureTypes from '../components/ProcedureTypes'; +import * as ActionIdTypes from '../components/ActionIdTypes'; + +interface MembersToBeAdded { + coldCredential: { + hash: string; + }; + epoch: string; +} + +interface MembersToBeRemoved { + hash: string; +} + +interface NewQuorumThreshold { + denominator: string; + numerator: string; +} + +export interface Data { + procedure: ProcedureTypes.Procedure; + actionId: ActionIdTypes.Data; + membersToBeAdded: MembersToBeAdded[]; + membersToBeRemoved: MembersToBeRemoved[]; + newQuorumThreshold: NewQuorumThreshold; +} + +export interface Translations { + procedure: ProcedureTypes.Translations; + actionId: ActionIdTypes.Translations; + membersToBeAdded: { + title: string; + coldCredential: { + hash: string; + epoch: string; + }; + }; + membersToBeRemoved: { + title: string; + hash: string; + }; + newQuorumThreshold: { + title: string; + denominator: string; + numerator: string; + }; +} diff --git a/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/index.ts b/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/index.ts new file mode 100644 index 0000000000..14664f1bee --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/index.ts @@ -0,0 +1 @@ +export { UpdateCommitteeAction as TreasuryWithdrawalsAction } from './UpdateCommitteeActionAction'; From 1fe91660ec8cb84e53c1f596df2a961747031210 Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Fri, 27 Oct 2023 10:34:52 -0300 Subject: [PATCH 11/19] refactor(core): check if anchor is provided --- .../ProposalProcedure/components/Procedure.tsx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/core/src/ui/components/ProposalProcedure/components/Procedure.tsx b/packages/core/src/ui/components/ProposalProcedure/components/Procedure.tsx index b098125311..4d16f3ace8 100644 --- a/packages/core/src/ui/components/ProposalProcedure/components/Procedure.tsx +++ b/packages/core/src/ui/components/ProposalProcedure/components/Procedure.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Cell, Metadata, Text, sx } from '@lace/ui'; +import { Cell, Metadata, MetadataLink, Text, sx } from '@lace/ui'; import * as Types from './ProcedureTypes'; interface Props { @@ -25,12 +25,16 @@ export const Procedure = ({ data, translations }: Props): JSX.Element => { - - - - - - + {data.anchor && ( + <> + + + + + + + + )} ); }; From 159ee6a4f590a9d7a1017cfffef332ae88943f0c Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Fri, 27 Oct 2023 10:35:19 -0300 Subject: [PATCH 12/19] refactor(core): update storybook path --- .../HardForkInitiationAction.stories.ts | 2 +- .../NewConstitutionAction/NewConstitutionAction.stories.ts | 2 +- .../NoConfidenceAction/NoConfidenceAction.stories.ts | 2 +- .../ParameterChangeAction/ParameterChangeAction.stories.ts | 2 +- .../TreasuryWithdrawalsAction.stories.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.stories.ts index 1719bcc21f..d5f4d8e305 100644 --- a/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.stories.ts @@ -4,7 +4,7 @@ import { HardForkInitiationAction } from './HardForkInitiationAction'; import { ComponentProps } from 'react'; const meta: Meta = { - title: 'HardForkInitiationAction', + title: 'ProposalProcedure/HardForkInitiationAction', component: HardForkInitiationAction, parameters: { layout: 'centered' diff --git a/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.stories.ts index 075734cecd..413abfa29c 100644 --- a/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.stories.ts @@ -4,7 +4,7 @@ import { NewConstitutionAction } from './NewConstitutionAction'; import { ComponentProps } from 'react'; const meta: Meta = { - title: 'NewConstitutionAction', + title: 'ProposalProcedure/NewConstitutionAction', component: NewConstitutionAction, parameters: { layout: 'centered' diff --git a/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.stories.ts index a9498664a1..b74e8af9a6 100644 --- a/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.stories.ts @@ -4,7 +4,7 @@ import { NoConfidenceAction } from './NoConfidenceAction'; import { ComponentProps } from 'react'; const meta: Meta = { - title: 'NoConfidenceAction', + title: 'ProposalProcedure/NoConfidenceAction', component: NoConfidenceAction, parameters: { layout: 'centered' diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts index 0818a60dc5..9efbb7393b 100644 --- a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts @@ -4,7 +4,7 @@ import { ParameterChangeAction } from './ParameterChangeAction'; import { ComponentProps } from 'react'; const meta: Meta = { - title: 'ParameterChangeAction', + title: 'ProposalProcedure/ParameterChangeAction', component: ParameterChangeAction, parameters: { layout: 'centered' diff --git a/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts index eaf214a392..2d5ca44b68 100644 --- a/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts @@ -4,7 +4,7 @@ import { TreasuryWithdrawalsAction } from './TreasuryWithdrawalsAction'; import { ComponentProps } from 'react'; const meta: Meta = { - title: 'TreasuryWithdrawalsAction', + title: 'ProposalProcedure/TreasuryWithdrawalsAction', component: TreasuryWithdrawalsAction, parameters: { layout: 'centered' From ea33158b0e4ee5484d76fbccc62655368b8d3776 Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Fri, 27 Oct 2023 10:43:10 -0300 Subject: [PATCH 13/19] feat(extension): add translations --- .../src/lib/translations/en.json | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/apps/browser-extension-wallet/src/lib/translations/en.json b/apps/browser-extension-wallet/src/lib/translations/en.json index 23463cdad6..82d188f932 100644 --- a/apps/browser-extension-wallet/src/lib/translations/en.json +++ b/apps/browser-extension-wallet/src/lib/translations/en.json @@ -1130,6 +1130,132 @@ "tryingToUseAssetNotInWallet": "This DApp is trying to use token not held in your wallet.", "noCollateral": "Wallet should not be able to sign dapp txs without collateral." }, + "proposalProcedure": { + "procedure": { + "anchor": { + "hash": "Anchor Hash", + "url": "Anchor URL" + }, + "deposit": "Deposit", + "rewardAccount": "Reward account", + "title": "Procedure" + }, + "governanceAction": { + "actionId": { + "title": "Action ID", + "index": "Index", + "txHash": "TX Hash" + }, + "hardForkInitiation": { + "title": "Hard Fork Initiation Action", + "protocolVersion": { + "title": "Hard Fork Details", + "label": "Protocol Version" + } + }, + "newConstitutionAction": { + "title": "New Constitution Action", + "constitution": { + "title": "Constitution Details", + "anchor": { + "dataHash": "Anchor Data Hash", + "url": "Anchor URL" + }, + "scriptHash": "Script Hash" + } + }, + "protocolParamUpdate": { + "title": "Protocol Parameter Update Action", + "networkGroup": { + "title": "Network group", + "tooltip": { + "maxBBSize": "Max block body size", + "maxTxSize": "Max transaction size", + "maxBHSize": "Max block header size", + "maxValSize": "Max size of a serialized asset value", + "maxTxExUnits": "Max script execution units in a single transaction", + "maxBlockExUnits": "Max script execution units in a single block", + "maxCollateralInputs": "Max number of collateral inputs" + } + }, + "economicGroup": { + "title": "Economic group", + "tooltip": { + "minFeeA": "Min fee coefficient", + "minFeeB": "Min fee constant", + "keyDeposit": "Delegation key Lovelace deposit", + "poolDeposit": "Pool registration Lovelace deposit", + "rho": "Monetary expansion", + "tau": "Treasury expansion", + "minPoolCost": "Min fixed rewards cut for pools", + "coinsPerUTxOByte": "Min Lovelace deposit per byte of serialized UTxO", + "prices": "Prices of Plutus execution units" + } + }, + "technicalGroup": { + "title": "Technical group", + "tooltip": { + "a0": "Pool pledge influence", + "eMax": "Pool retirement maximum epoch", + "nOpt": "Desired number of pools", + "costModels": "Plutus execution cost models", + "collateralPercentage": "Proportion of collateral needed for scripts" + } + }, + "governanceGroup": { + "title": "Governance group", + "tooltip": { + "govActionLifetime": "governance action maximum lifetime in epochs", + "govActionDeposit": "governance action deposit", + "drepDeposit": "DRep deposit amount", + "drepActivity": "DRep activity period in epochs", + "ccMinSize": "Min constitutional committee size", + "ccMaxTermLength": "Max term length (in epochs) for the constitutional committee members", + "dRepVotingThresholds": { + "title": "DRep voting thresholds", + "motionNoConfidence": "1. Motion of no-confidence", + "committeeNormal": "2a. New committee/threshold (normal state)", + "commiteeNoConfidence": "2b. New committee/threshold (state of no-confidence)", + "updateConstitution": "3. Update to the Constitution or proposal policy", + "hardForkInitiation": "4. Hard-fork initiation", + "ppNetworkGroup": "5a. Protocol parameter changes, network group", + "ppEconomicGroup": "5b. Protocol parameter changes, economic group", + "ppTechnicalGroup": "5c. Protocol parameter changes, technical group", + "ppGovernanceGroup": "5d. Protocol parameter changes, governance group", + "treasuryWithdrawal": "6. Treasury withdrawal" + } + } + } + }, + "treasuryWithdrawals": { + "title": "Treasury Withdrawals Action", + "withdrawals": { + "title": "Withdrawal Details", + "lovelace": "Lovelace Withdrawn", + "rewardAccount": "Reward account" + } + }, + "updateCommitteeAction": { + "title": "Update Committee Action", + "membersToBeAdded": { + "title": "Members To Be Added", + "coldCredential": { + "hash": "Cold Credential Hash", + "epoch": "Epoch" + } + }, + "membersToBeRemoved": { + "title": "Members To Be Removed", + "hash": "Hash" + }, + "newQuorumThreshold": { + "title": "New Quorum Threshold", + "denominator": "Denominator", + "numerator": "Numerator" + } + } + } + }, "VotingProcedures": { "title": "Confirm Vote", "voterType": "Voter type", From 4e6f77ea92a7a420545cc1bd873f1c5b831be293 Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Fri, 27 Oct 2023 10:43:25 -0300 Subject: [PATCH 14/19] refactor(core): remove ununsed prop --- .../ParameterChangeAction/ParameterChangeAction.stories.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts index 9efbb7393b..d631d29104 100644 --- a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts @@ -108,11 +108,6 @@ const data: ComponentProps = { rewardAccount: 'Reward account', title: 'Procedure' }, - actionIdTitle: 'Action ID', - anchor: { - hash: 'Anchor Hash', - url: 'Anchor URL' - }, networkGroup: { title: 'Network group', tooltip: { From 501dd5e822f1ffbf9ea198d691847f630463cc2a Mon Sep 17 00:00:00 2001 From: John Oshalusi Date: Thu, 26 Oct 2023 12:31:23 +0100 Subject: [PATCH 15/19] feat(staking): [LW-8684] add tooltip to piechart (#616) * feat: lw-8684-add tooltip to delegation piechart * fix: add custom tooltip dot style --- .../features/DelegationCard/DelegationTooltip.css.ts | 11 +++++++++++ .../Drawer/preferences/StepPreferencesContent.tsx | 3 ++- .../src/design-system/pie-chart/pie-chart.stories.tsx | 6 ++++-- 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 packages/staking/src/features/DelegationCard/DelegationTooltip.css.ts diff --git a/packages/staking/src/features/DelegationCard/DelegationTooltip.css.ts b/packages/staking/src/features/DelegationCard/DelegationTooltip.css.ts new file mode 100644 index 0000000000..c48a22fb36 --- /dev/null +++ b/packages/staking/src/features/DelegationCard/DelegationTooltip.css.ts @@ -0,0 +1,11 @@ +import { style } from '@vanilla-extract/css'; +import { theme } from '../theme'; + +export const tooltip = style({ + background: theme.colors.$tooltipBgColor, + borderRadius: theme.radius.$small, + boxShadow: theme.elevation.$tooltip, + margin: theme.spacing.$10, + maxWidth: theme.spacing.$214, + padding: theme.spacing.$16, +}); diff --git a/packages/staking/src/features/Drawer/preferences/StepPreferencesContent.tsx b/packages/staking/src/features/Drawer/preferences/StepPreferencesContent.tsx index dcb134b0b2..984b68632a 100644 --- a/packages/staking/src/features/Drawer/preferences/StepPreferencesContent.tsx +++ b/packages/staking/src/features/Drawer/preferences/StepPreferencesContent.tsx @@ -66,7 +66,8 @@ export const StepPreferencesContent = () => { onChainPercentage: draftPool?.onChainPercentage, percentage: sliderIntegerPercentage, saturation: saturation ? String(saturation) : undefined, - savedIntegerPercentage: draftPool?.savedIntegerPercentage || undefined, + savedIntegerPercentage: draftPool.basedOnCurrentPortfolio ? draftPool.savedIntegerPercentage : undefined, + // TODO sliderIntegerPercentage, stakeValue: balancesBalance ? compactNumber( diff --git a/packages/ui/src/design-system/pie-chart/pie-chart.stories.tsx b/packages/ui/src/design-system/pie-chart/pie-chart.stories.tsx index bccf951050..079373139c 100644 --- a/packages/ui/src/design-system/pie-chart/pie-chart.stories.tsx +++ b/packages/ui/src/design-system/pie-chart/pie-chart.stories.tsx @@ -8,7 +8,7 @@ import { ThemeColorScheme, LocalThemeProvider } from '../../design-tokens'; import { page, Section, Variants } from '../decorators'; import { Divider } from '../divider'; import { Cell, Grid } from '../grid'; -import { TooltipContent } from '../tooltip'; +import { Content, ContentInner } from '../tooltip'; import { PieChart } from './pie-chart.component'; import { @@ -47,7 +47,9 @@ const meta: Meta = { export default meta; const CustomTooltip = (): ReactElement => ( - + + + ); export const Overview = (): JSX.Element => ( From 235d6912858420540346d97e85e137551e6919e3 Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Mon, 30 Oct 2023 14:57:54 -0300 Subject: [PATCH 16/19] feat(ui): add tooltip to metadata component --- .../metadata/metadata-link.component.tsx | 19 ++++++++++++++++--- .../metadata/metadata.component.tsx | 19 ++++++++++++++++--- .../metadata/metadata.stories.tsx | 1 + .../tooltip/tooltip-content.css.ts | 1 + 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/packages/ui/src/design-system/metadata/metadata-link.component.tsx b/packages/ui/src/design-system/metadata/metadata-link.component.tsx index 5eb52078cf..3d766be856 100644 --- a/packages/ui/src/design-system/metadata/metadata-link.component.tsx +++ b/packages/ui/src/design-system/metadata/metadata-link.component.tsx @@ -3,6 +3,7 @@ import React from 'react'; import { Flex } from '../flex'; import { Grid, Cell } from '../grid'; import { TextLink } from '../text-link'; +import { Tooltip } from '../tooltip'; import * as Typography from '../typography'; import * as cx from './metadata.css'; @@ -13,20 +14,32 @@ type Props = OmitClassName<'div'> & { label: string; text: string; url: string; + tooltip?: string; }; export const MetadataLink = ({ label, text, url, + tooltip, ...props }: Readonly): JSX.Element => { return ( - - {label} - + {tooltip == undefined ? ( + + {label} + + ) : ( + +
+ + {label} + +
+
+ )}
diff --git a/packages/ui/src/design-system/metadata/metadata.component.tsx b/packages/ui/src/design-system/metadata/metadata.component.tsx index f9d9fd0aa8..6f15a58c6b 100644 --- a/packages/ui/src/design-system/metadata/metadata.component.tsx +++ b/packages/ui/src/design-system/metadata/metadata.component.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { Flex } from '../flex'; import { Grid, Cell } from '../grid'; +import { Tooltip } from '../tooltip'; import * as Typography from '../typography'; import * as cx from './metadata.css'; @@ -11,19 +12,31 @@ import type { OmitClassName } from '../../types'; type Props = OmitClassName<'div'> & { label: string; text: string; + tooltip?: string; }; export const Metadata = ({ label, text, + tooltip, ...props }: Readonly): JSX.Element => { return ( - - {label} - + {tooltip == undefined ? ( + + {label} + + ) : ( + +
+ + {label} + +
+
+ )}
diff --git a/packages/ui/src/design-system/metadata/metadata.stories.tsx b/packages/ui/src/design-system/metadata/metadata.stories.tsx index a504ca41a2..d91634f4f3 100644 --- a/packages/ui/src/design-system/metadata/metadata.stories.tsx +++ b/packages/ui/src/design-system/metadata/metadata.stories.tsx @@ -42,6 +42,7 @@ const MainComponents = (): JSX.Element => ( diff --git a/packages/ui/src/design-system/tooltip/tooltip-content.css.ts b/packages/ui/src/design-system/tooltip/tooltip-content.css.ts index 29d7cd6999..38c93dd94f 100644 --- a/packages/ui/src/design-system/tooltip/tooltip-content.css.ts +++ b/packages/ui/src/design-system/tooltip/tooltip-content.css.ts @@ -15,5 +15,6 @@ export const tooltipContent = style([ }), { position: 'relative', + wordBreak: 'break-all', }, ]); From 843ba8be1e6d39ed84e006c2599fd36050c122b5 Mon Sep 17 00:00:00 2001 From: Renan Ferreira Date: Tue, 31 Oct 2023 09:51:02 -0300 Subject: [PATCH 17/19] chore(core): fix pipeline --- .../ConfirmTransaction.tsx | 1 - .../ConfirmTransactionContent.tsx | 9 +- .../ProposalProceduresContainer.tsx | 86 ++++++ .../VotingProceduresContainer.tsx | 12 +- .../components/confirm-transaction/hooks.ts | 19 ++ .../HardForkInitiationActionContainer.tsx | 82 ++++++ .../InfoActionContainer.tsx | 61 ++++ .../NewConstitutionActionContainer.tsx | 86 ++++++ .../NoConfidenceActionContainer.tsx | 75 +++++ .../ParameterChangeActionContainer.tsx | 272 ++++++++++++++++++ .../TreasuryWithdrawalsActionContainer.tsx | 81 ++++++ .../UpdateCommitteeActionContainer.tsx | 106 +++++++ .../components/confirm-transaction/utils.ts | 11 +- .../src/lib/translations/en.json | 6 + packages/cardano/src/wallet/types.ts | 3 +- packages/core/package.json | 2 - packages/core/src/index.ts | 1 + .../ProposalProcedure/InfoAction/index.ts | 1 - .../NewConstitutionAction/index.ts | 1 - .../UpdateCommitteeAction/index.ts | 1 - .../HardForkInitiationAction.stories.ts | 0 .../HardForkInitiationAction.tsx | 2 +- .../HardForkInitiationActionTypes.ts | 2 +- .../HardForkInitiationAction/index.ts | 0 .../InfoAction/InfoAction.stories.ts | 0 .../InfoAction/InfoAction.tsx | 0 .../InfoAction/InfoActionTypes.ts | 0 .../ProposalProcedures/InfoAction/index.ts | 1 + .../NewConstitutionAction.stories.ts | 0 .../NewConstitutionAction.tsx | 0 .../NewConstitutionActionTypes.ts | 0 .../NewConstitutionAction/index.ts | 1 + .../NoConfidenceAction.stories.ts | 0 .../NoConfidenceAction/NoConfidenceAction.tsx | 0 .../NoConfidenceActionTypes.ts | 0 .../NoConfidenceAction/index.ts | 0 .../ParameterChangeAction/EconomicGroup.tsx | 0 .../ParameterChangeAction/GovernanceGroup.tsx | 50 +++- .../ParameterChangeAction/NetworkGroup.tsx | 0 .../ParameterChangeAction.stories.ts | 0 .../ParameterChangeAction.tsx | 0 .../ParameterChangeActionTypes.ts | 0 .../ParameterChangeAction/TechnicalGroup.tsx | 0 .../ParameterChangeAction/index.ts | 0 .../TreasuryWithdrawalsAction.stories.ts | 0 .../TreasuryWithdrawalsAction.tsx | 2 +- .../TreasuryWithdrawalsActionTypes.ts | 0 .../TreasuryWithdrawalsAction/index.ts | 0 .../UpdateCommitteeActionAction.stories.ts | 0 .../UpdateCommitteeActionAction.tsx | 24 +- .../UpdateCommitteeActionTypes.ts | 0 .../UpdateCommitteeAction/index.ts | 1 + .../components/ActionId.tsx | 0 .../components/ActionIdTypes.ts | 0 .../components/Card.module.scss | 3 + .../components/Card.tsx | 51 +++- .../components/Procedure.tsx | 0 .../components/ProcedureTypes.ts | 0 .../ui/components/ProposalProcedures/index.ts | 7 + .../preferences/StepPreferencesContent.tsx | 2 +- packages/ui/package.json | 12 - yarn.lock | 37 +-- 62 files changed, 1010 insertions(+), 101 deletions(-) create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/ProposalProceduresContainer.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/HardForkInitiationActionContainer.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/InfoActionContainer.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NewConstitutionActionContainer.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NoConfidenceActionContainer.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/ParameterChangeActionContainer.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/TreasuryWithdrawalsActionContainer.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/UpdateCommitteeActionContainer.tsx delete mode 100644 packages/core/src/ui/components/ProposalProcedure/InfoAction/index.ts delete mode 100644 packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/index.ts delete mode 100644 packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/index.ts rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/HardForkInitiationAction/HardForkInitiationAction.stories.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/HardForkInitiationAction/HardForkInitiationAction.tsx (96%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/HardForkInitiationAction/HardForkInitiationActionTypes.ts (95%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/HardForkInitiationAction/index.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/InfoAction/InfoAction.stories.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/InfoAction/InfoAction.tsx (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/InfoAction/InfoActionTypes.ts (100%) create mode 100644 packages/core/src/ui/components/ProposalProcedures/InfoAction/index.ts rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/NewConstitutionAction/NewConstitutionAction.stories.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/NewConstitutionAction/NewConstitutionAction.tsx (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/NewConstitutionAction/NewConstitutionActionTypes.ts (100%) create mode 100644 packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/index.ts rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/NoConfidenceAction/NoConfidenceAction.stories.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/NoConfidenceAction/NoConfidenceAction.tsx (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/NoConfidenceAction/NoConfidenceActionTypes.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/NoConfidenceAction/index.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/ParameterChangeAction/EconomicGroup.tsx (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/ParameterChangeAction/GovernanceGroup.tsx (54%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/ParameterChangeAction/NetworkGroup.tsx (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/ParameterChangeAction/ParameterChangeAction.stories.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/ParameterChangeAction/ParameterChangeAction.tsx (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/ParameterChangeAction/ParameterChangeActionTypes.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/ParameterChangeAction/TechnicalGroup.tsx (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/ParameterChangeAction/index.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx (95%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/TreasuryWithdrawalsAction/index.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx (84%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts (100%) create mode 100644 packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/index.ts rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/components/ActionId.tsx (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/components/ActionIdTypes.ts (100%) create mode 100644 packages/core/src/ui/components/ProposalProcedures/components/Card.module.scss rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/components/Card.tsx (55%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/components/Procedure.tsx (100%) rename packages/core/src/ui/components/{ProposalProcedure => ProposalProcedures}/components/ProcedureTypes.ts (100%) create mode 100644 packages/core/src/ui/components/ProposalProcedures/index.ts diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/ConfirmTransaction.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/ConfirmTransaction.tsx index e17e48769d..03980ee8bb 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/ConfirmTransaction.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/ConfirmTransaction.tsx @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import React, { useMemo, useState } from 'react'; import cn from 'classnames'; import { Button, PostHogAction } from '@lace/common'; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/ConfirmTransactionContent.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/ConfirmTransactionContent.tsx index 03fea860f4..65379c1058 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/ConfirmTransactionContent.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/ConfirmTransactionContent.tsx @@ -1,8 +1,10 @@ +/* eslint-disable complexity */ import React from 'react'; import { Skeleton } from 'antd'; +import { Wallet } from '@lace/cardano'; +import { SignTxData } from './types'; import { ConfirmDRepRegistrationContainer } from './ConfirmDRepRegistrationContainer'; import { DappTransactionContainer } from './DappTransactionContainer'; -import { SignTxData } from './types'; import { ConfirmDRepRetirementContainer } from './ConfirmDRepRetirementContainer'; import { ConfirmVoteDelegationContainer } from './ConfirmVoteDelegationContainer'; import { VotingProceduresContainer } from './VotingProceduresContainer'; @@ -11,7 +13,7 @@ import { ConfirmVoteRegistrationDelegationContainer } from './ConfirmVoteRegistr import { ConfirmStakeRegistrationDelegationContainer } from './ConfirmStakeRegistrationDelegationContainer'; import { ConfirmStakeVoteRegistrationDelegationContainer } from './ConfirmStakeVoteRegistrationDelegationContainer'; import { ConfirmStakeVoteDelegationContainer } from './ConfirmStakeVoteDelegationContainer'; -import { Wallet } from '@lace/cardano'; +import { ProposalProceduresContainer } from './ProposalProceduresContainer'; interface Props { txType?: Wallet.Cip30TxType; @@ -51,6 +53,9 @@ export const ConfirmTransactionContent = ({ txType, signTxData, onError, errorMe if (txType === Wallet.Cip30TxType.StakeVoteDelegation) { return ; } + if (txType === Wallet.Cip30TxType.ProposalProcedures) { + return ; + } return ; }; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/ProposalProceduresContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/ProposalProceduresContainer.tsx new file mode 100644 index 0000000000..7c3df2b028 --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/ProposalProceduresContainer.tsx @@ -0,0 +1,86 @@ +/* eslint-disable consistent-return */ +/* eslint-disable complexity */ +import React, { useMemo } from 'react'; +import { Wallet } from '@lace/cardano'; +import { SignTxData } from './types'; +import { proposalProceduresInspector } from './utils'; +import { HardForkInitiationActionContainer } from './proposal-procedures/HardForkInitiationActionContainer'; +import { InfoActionContainer } from './proposal-procedures/InfoActionContainer'; +import { NewConstitutionActionContainer } from './proposal-procedures/NewConstitutionActionContainer'; +import { NoConfidenceActionContainer } from './proposal-procedures/NoConfidenceActionContainer'; +import { ParameterChangeActionContainer } from './proposal-procedures/ParameterChangeActionContainer'; +import { TreasuryWithdrawalsActionContainer } from './proposal-procedures/TreasuryWithdrawalsActionContainer'; +import { UpdateCommitteeActionContainer } from './proposal-procedures/UpdateCommitteeActionContainer'; + +interface Props { + signTxData: SignTxData; + errorMessage?: string; +} + +export const ProposalProceduresContainer = ({ + signTxData: { dappInfo, tx }, + errorMessage +}: Props): React.ReactElement => { + const proposalProcedures = proposalProceduresInspector(tx); + + const props = useMemo(() => ({ dappInfo, errorMessage }), [dappInfo, errorMessage]); + + return ( + <> + {proposalProcedures.map(({ deposit, rewardAccount, anchor, governanceAction }) => { + const key = `${governanceAction.__typename}_${anchor.dataHash}`; + if (governanceAction.__typename === Wallet.Cardano.GovernanceActionType.hard_fork_initiation_action) { + return ( + + ); + } + if (governanceAction.__typename === Wallet.Cardano.GovernanceActionType.info_action) { + return ; + } + if (governanceAction.__typename === Wallet.Cardano.GovernanceActionType.new_constitution) { + return ( + + ); + } + if (governanceAction.__typename === Wallet.Cardano.GovernanceActionType.no_confidence) { + return ( + + ); + } + if (governanceAction.__typename === Wallet.Cardano.GovernanceActionType.parameter_change_action) { + return ( + + ); + } + if (governanceAction.__typename === Wallet.Cardano.GovernanceActionType.treasury_withdrawals_action) { + return ( + + ); + } + if (governanceAction.__typename === Wallet.Cardano.GovernanceActionType.update_committee) { + return ( + + ); + } + })} + + ); +}; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/VotingProceduresContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/VotingProceduresContainer.tsx index 0ca9fc967d..8ebeefc4da 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/VotingProceduresContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/VotingProceduresContainer.tsx @@ -1,11 +1,10 @@ -import React, { useMemo } from 'react'; +import React from 'react'; import { useTranslation } from 'react-i18next'; import { VotingProcedures } from '@lace/core'; import { SignTxData } from './types'; import { drepIDasBech32FromHash, votingProceduresInspector } from './utils'; import { Wallet } from '@lace/cardano'; -import { useWalletStore } from '@src/stores'; -import { config } from '@src/config'; +import { useCExpolorerBaseUrl } from './hooks'; interface Props { signTxData: SignTxData; @@ -53,13 +52,8 @@ export const getVote = (vote: Wallet.Cardano.Vote): Votes => { export const VotingProceduresContainer = ({ signTxData, errorMessage }: Props): React.ReactElement => { const { t } = useTranslation(); const votingProcedures = votingProceduresInspector(signTxData.tx); - const { environmentName } = useWalletStore(); - const { CEXPLORER_BASE_URL, CEXPLORER_URL_PATHS } = config(); - const explorerBaseUrl = useMemo( - () => (environmentName === 'Sanchonet' ? '' : `${CEXPLORER_BASE_URL[environmentName]}/${CEXPLORER_URL_PATHS.Tx}`), - [CEXPLORER_BASE_URL, CEXPLORER_URL_PATHS.Tx, environmentName] - ); + const explorerBaseUrl = useCExpolorerBaseUrl(); return ( { // TODO consider using Zustand or at least some common abstraction e.g. https://github.com/streamich/react-use/blob/master/src/useAsync.ts return { loading: ownPubDRepKeyHash === undefined, ownPubDRepKeyHash }; }; + +export const useCExpolorerBaseUrl = (): string => { + const [explorerBaseUrl, setExplorerBaseUrl] = useState(''); + const { environmentName } = useWalletStore(); + + const { CEXPLORER_BASE_URL, CEXPLORER_URL_PATHS } = config(); + + useEffect(() => { + const newUrl = + environmentName === 'Sanchonet' ? '' : `${CEXPLORER_BASE_URL[environmentName]}/${CEXPLORER_URL_PATHS.Tx}`; + if (newUrl !== explorerBaseUrl) { + setExplorerBaseUrl(newUrl); + } + }, [CEXPLORER_BASE_URL, CEXPLORER_URL_PATHS.Tx, environmentName, explorerBaseUrl]); + + return explorerBaseUrl; +}; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/HardForkInitiationActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/HardForkInitiationActionContainer.tsx new file mode 100644 index 0000000000..399cf82a4a --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/HardForkInitiationActionContainer.tsx @@ -0,0 +1,82 @@ +import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Wallet } from '@lace/cardano'; +import { HardForkInitiationAction } from '@lace/core'; +import { useWalletStore } from '@src/stores'; +import { SignTxData } from '../types'; +import { useCExpolorerBaseUrl } from '../hooks'; + +interface Props { + dappInfo: SignTxData['dappInfo']; + governanceAction: Wallet.Cardano.HardForkInitiationAction; + deposit: Wallet.Cardano.ProposalProcedure['deposit']; + rewardAccount: Wallet.Cardano.ProposalProcedure['rewardAccount']; + anchor: Wallet.Cardano.ProposalProcedure['anchor']; + errorMessage?: string; +} + +export const HardForkInitiationActionContainer = ({ + dappInfo, + governanceAction, + deposit, + rewardAccount, + anchor, + errorMessage +}: Props): React.ReactElement => { + const { t } = useTranslation(); + const { + walletUI: { cardanoCoin } + } = useWalletStore(); + + const explorerBaseUrl = useCExpolorerBaseUrl(); + + const translations = useMemo( + () => ({ + procedure: { + title: t('core.proposalProcedure.governanceAction.hardForkInitiation.title'), + deposit: t('core.proposalProcedure.procedure.deposit'), + rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + anchor: { + url: t('core.proposalProcedure.procedure.anchor.url'), + hash: t('core.proposalProcedure.procedure.anchor.hash') + } + }, + actionId: { + title: t('core.proposalProcedure.governanceAction.actionId.title'), + index: t('core.proposalProcedure.governanceAction.actionId.index'), + txHash: t('core.proposalProcedure.governanceAction.actionId.txHash') + }, + protocolVersion: { + title: t('core.proposalProcedure.governanceAction.hardForkInitiation.protocolVersion.title'), + label: t('core.proposalProcedure.governanceAction.hardForkInitiation.protocolVersion.label') + } + }), + [t] + ); + + const { governanceActionId, protocolVersion } = governanceAction; + + const data = { + procedure: { + deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, + rewardAccount, + ...(anchor.url && { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } + }) + }, + protocolVersion, + actionId: { + index: governanceActionId?.actionIndex || 0, + txHash: governanceActionId?.id || '', + ...(explorerBaseUrl && governanceActionId?.id && { txHashUrl: `${explorerBaseUrl}/${governanceActionId?.id}` }) + } + }; + + return ( + + ); +}; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/InfoActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/InfoActionContainer.tsx new file mode 100644 index 0000000000..210a49923c --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/InfoActionContainer.tsx @@ -0,0 +1,61 @@ +import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Wallet } from '@lace/cardano'; +import { InfoAction } from '@lace/core'; +import { useWalletStore } from '@src/stores'; +import { SignTxData } from '../types'; +import { useCExpolorerBaseUrl } from '../hooks'; + +interface Props { + dappInfo: SignTxData['dappInfo']; + deposit: Wallet.Cardano.ProposalProcedure['deposit']; + rewardAccount: Wallet.Cardano.ProposalProcedure['rewardAccount']; + anchor: Wallet.Cardano.ProposalProcedure['anchor']; + errorMessage?: string; +} + +export const InfoActionContainer = ({ + dappInfo, + deposit, + rewardAccount, + anchor, + errorMessage +}: Props): React.ReactElement => { + const { t } = useTranslation(); + const { + walletUI: { cardanoCoin } + } = useWalletStore(); + + const explorerBaseUrl = useCExpolorerBaseUrl(); + + const translations = useMemo( + () => ({ + procedure: { + title: t('core.proposalProcedure.governanceAction.infoAction.title'), + deposit: t('core.proposalProcedure.procedure.deposit'), + rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + anchor: { + url: t('core.proposalProcedure.procedure.anchor.url'), + hash: t('core.proposalProcedure.procedure.anchor.hash') + } + } + }), + [t] + ); + + const data = { + procedure: { + deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, + rewardAccount, + ...(anchor.url && { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } + }) + } + }; + + return ; +}; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NewConstitutionActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NewConstitutionActionContainer.tsx new file mode 100644 index 0000000000..f52102fd7c --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NewConstitutionActionContainer.tsx @@ -0,0 +1,86 @@ +import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Wallet } from '@lace/cardano'; +import { NewConstitutionAction } from '@lace/core'; +import { useWalletStore } from '@src/stores'; +import { SignTxData } from '../types'; +import { useCExpolorerBaseUrl } from '../hooks'; + +interface Props { + dappInfo: SignTxData['dappInfo']; + governanceAction: Wallet.Cardano.NewConstitution; + deposit: Wallet.Cardano.ProposalProcedure['deposit']; + rewardAccount: Wallet.Cardano.ProposalProcedure['rewardAccount']; + anchor: Wallet.Cardano.ProposalProcedure['anchor']; + errorMessage?: string; +} + +export const NewConstitutionActionContainer = ({ + dappInfo, + governanceAction, + deposit, + rewardAccount, + anchor, + errorMessage +}: Props): React.ReactElement => { + const { t } = useTranslation(); + const { + walletUI: { cardanoCoin } + } = useWalletStore(); + + const explorerBaseUrl = useCExpolorerBaseUrl(); + + const translations = useMemo( + () => ({ + procedure: { + title: t('core.proposalProcedure.governanceAction.newConstitutionAction.title'), + deposit: t('core.proposalProcedure.procedure.deposit'), + rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + anchor: { + url: t('core.proposalProcedure.procedure.anchor.url'), + hash: t('core.proposalProcedure.procedure.anchor.hash') + } + }, + actionId: { + title: t('core.proposalProcedure.governanceAction.actionId.title'), + index: t('core.proposalProcedure.governanceAction.actionId.index'), + txHash: t('core.proposalProcedure.governanceAction.actionId.txHash') + }, + constitution: { + title: t('core.proposalProcedure.governanceAction.newConstitutionAction.constitution.title'), + anchor: { + dataHash: t('core.proposalProcedure.governanceAction.newConstitutionAction.constitution.anchor.dataHash'), + url: t('core.proposalProcedure.governanceAction.newConstitutionAction.constitution.url') + }, + scriptHash: t('core.proposalProcedure.governanceAction.newConstitutionAction.constitution.scriptHash') + } + }), + [t] + ); + + const { governanceActionId, constitution } = governanceAction; + + const data = { + procedure: { + deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, + rewardAccount, + ...(anchor.url && { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } + }) + }, + actionId: { + index: governanceActionId?.actionIndex || 0, + txHash: governanceActionId?.id || '', + ...(explorerBaseUrl && governanceActionId?.id && { txHashUrl: `${explorerBaseUrl}/${governanceActionId?.id}` }) + }, + constitution + }; + + return ( + + ); +}; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NoConfidenceActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NoConfidenceActionContainer.tsx new file mode 100644 index 0000000000..a1a2460da7 --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NoConfidenceActionContainer.tsx @@ -0,0 +1,75 @@ +import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Wallet } from '@lace/cardano'; +import { NoConfidenceAction } from '@lace/core'; +import { useWalletStore } from '@src/stores'; +import { SignTxData } from '../types'; +import { useCExpolorerBaseUrl } from '../hooks'; + +interface Props { + dappInfo: SignTxData['dappInfo']; + governanceAction: Wallet.Cardano.NoConfidence; + deposit: Wallet.Cardano.ProposalProcedure['deposit']; + rewardAccount: Wallet.Cardano.ProposalProcedure['rewardAccount']; + anchor: Wallet.Cardano.ProposalProcedure['anchor']; + errorMessage?: string; +} + +export const NoConfidenceActionContainer = ({ + dappInfo, + governanceAction, + deposit, + rewardAccount, + anchor, + errorMessage +}: Props): React.ReactElement => { + const { t } = useTranslation(); + const { + walletUI: { cardanoCoin } + } = useWalletStore(); + + const explorerBaseUrl = useCExpolorerBaseUrl(); + + const translations = useMemo( + () => ({ + procedure: { + title: t('core.proposalProcedure.governanceAction.noConfidenceAction.title'), + deposit: t('core.proposalProcedure.procedure.deposit'), + rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + anchor: { + url: t('core.proposalProcedure.procedure.anchor.url'), + hash: t('core.proposalProcedure.procedure.anchor.hash') + } + }, + actionId: { + title: t('core.proposalProcedure.governanceAction.actionId.title'), + index: t('core.proposalProcedure.governanceAction.actionId.index'), + txHash: t('core.proposalProcedure.governanceAction.actionId.txHash') + } + }), + [t] + ); + + const { governanceActionId } = governanceAction; + + const data = { + procedure: { + deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, + rewardAccount, + ...(anchor.url && { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } + }) + }, + actionId: { + index: governanceActionId?.actionIndex || 0, + txHash: governanceActionId?.id || '', + ...(explorerBaseUrl && governanceActionId?.id && { txHashUrl: `${explorerBaseUrl}/${governanceActionId?.id}` }) + } + }; + + return ; +}; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/ParameterChangeActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/ParameterChangeActionContainer.tsx new file mode 100644 index 0000000000..535bcb33a6 --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/ParameterChangeActionContainer.tsx @@ -0,0 +1,272 @@ +/* eslint-disable unicorn/no-array-reduce */ +import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { formatPercentages } from '@lace/common'; +import { Wallet } from '@lace/cardano'; +import { ParameterChangeAction } from '@lace/core'; +import { useWalletStore } from '@src/stores'; +import { SignTxData } from '../types'; +import { useCExpolorerBaseUrl } from '../hooks'; + +interface Props { + dappInfo: SignTxData['dappInfo']; + governanceAction: Wallet.Cardano.ParameterChangeAction; + deposit: Wallet.Cardano.ProposalProcedure['deposit']; + rewardAccount: Wallet.Cardano.ProposalProcedure['rewardAccount']; + anchor: Wallet.Cardano.ProposalProcedure['anchor']; + errorMessage?: string; +} + +export const ParameterChangeActionContainer = ({ + dappInfo, + governanceAction, + deposit, + rewardAccount, + anchor, + errorMessage +}: Props): React.ReactElement => { + const { t } = useTranslation(); + const { + walletUI: { cardanoCoin } + } = useWalletStore(); + + const explorerBaseUrl = useCExpolorerBaseUrl(); + + const translations = useMemo( + () => ({ + procedure: { + title: t('core.proposalProcedure.governanceAction.protocolParamUpdate.title'), + deposit: t('core.proposalProcedure.procedure.deposit'), + rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + anchor: { + url: t('core.proposalProcedure.procedure.anchor.url'), + hash: t('core.proposalProcedure.procedure.anchor.hash') + } + }, + networkGroup: { + title: t('core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.title'), + tooltip: { + maxBBSize: t('core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxBBSize'), + maxTxSize: t('core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxTxSize'), + maxBHSize: t('core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxBHSize'), + maxValSize: t('core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxValSize'), + maxTxExUnits: t( + 'core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxTxExUnits' + ), + maxBlockExUnits: t( + 'core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxBlockExUnits' + ), + maxCollateralInputs: t( + 'core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxCollateralInputs' + ) + } + }, + economicGroup: { + title: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.title'), + tooltip: { + minFeeA: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.minFeeA'), + minFeeB: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.minFeeB'), + keyDeposit: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.keyDeposit'), + poolDeposit: t( + 'core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.poolDeposit' + ), + rho: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.rho'), + tau: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.tau'), + minPoolCost: t( + 'core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.minPoolCost' + ), + coinsPerUTxOByte: t( + 'core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.coinsPerUTxOByte' + ), + prices: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.prices') + } + }, + technicalGroup: { + title: t('core.proposalProcedure.governanceAction.technicalGroup.title'), + tooltip: { + a0: t('core.proposalProcedure.governanceAction.technicalGroup.tooltip.a0'), + eMax: t('core.proposalProcedure.governanceAction.technicalGroup.tooltip.eMax'), + nOpt: t('core.proposalProcedure.governanceAction.technicalGroup.tooltip.nOpt'), + costModels: t('core.proposalProcedure.governanceAction.technicalGroup.tooltip.costModels'), + collateralPercentage: t('core.proposalProcedure.governanceAction.technicalGroup.tooltip.collateralPercentage') + } + }, + governanceGroup: { + title: t('core.proposalProcedure.governanceAction.governanceGroup.title'), + tooltip: { + govActionLifetime: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.govActionLifetime'), + govActionDeposit: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.govActionDeposit'), + drepDeposit: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.drepDeposit'), + drepActivity: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.drepActivity'), + ccMinSize: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.ccMinSize'), + ccMaxTermLength: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.ccMaxTermLength'), + dRepVotingThresholds: { + title: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.title'), + motionNoConfidence: t( + 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.motionNoConfidence' + ), + committeeNormal: t( + 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.committeeNormal' + ), + commiteeNoConfidence: t( + 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.commiteeNoConfidence' + ), + updateConstitution: t( + 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.updateConstitution' + ), + hardForkInitiation: t( + 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.hardForkInitiation' + ), + ppNetworkGroup: t( + 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppNetworkGroup' + ), + ppEconomicGroup: t( + 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppEconomicGroup' + ), + ppTechnicalGroup: t( + 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppTechnicalGroup' + ), + ppGovernanceGroup: t( + 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppGovernanceGroup' + ), + treasuryWithdrawal: t( + 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.treasuryWithdrawal' + ) + } + } + } + }), + [t] + ); + + const { + protocolParamUpdate: { + maxBlockBodySize, + maxTxSize, + maxBlockHeaderSize, + maxValueSize, + maxExecutionUnitsPerTransaction, + maxExecutionUnitsPerBlock, + maxCollateralInputs, + stakeKeyDeposit, + poolDeposit, + minFeeCoefficient, + minFeeConstant, + treasuryExpansion, + monetaryExpansion, + minPoolCost, + coinsPerUtxoByte, + prices, + poolInfluence, + poolRetirementEpochBound, + desiredNumberOfPools, + costModels, + collateralPercentage, + governanceActionDeposit, + dRepDeposit, + governanceActionValidityPeriod, + dRepInactivityPeriod, + minCommitteeSize, + committeeTermLimit, + dRepVotingThresholds: { + motionNoConfidence, + committeeNormal, + commiteeNoConfidence, + updateConstitution, + hardForkInitiation, + ppNetworkGroup, + ppEconomicGroup, + ppTechnicalGroup, + ppGovernanceGroup, + treasuryWithdrawal + } + } + } = governanceAction; + + const data = { + procedure: { + deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, + rewardAccount, + ...(anchor.url && { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } + }) + }, + protocolParamUpdate: { + networkGroup: { + maxBBSize: maxBlockBodySize.toString(), + maxTxSize: maxTxSize.toString(), + maxBHSize: maxBlockHeaderSize.toString(), + maxValSize: maxValueSize.toString(), + maxTxExUnits: { + memory: maxExecutionUnitsPerTransaction.memory.toString(), + step: maxExecutionUnitsPerTransaction.steps.toString() + }, + maxBlockExUnits: { + memory: maxExecutionUnitsPerBlock.memory.toString(), + step: maxExecutionUnitsPerBlock.steps.toString() + }, + maxCollateralInputs: maxCollateralInputs.toString() + }, + economicGroup: { + minFeeA: minFeeCoefficient.toString(), + minFeeB: minFeeConstant.toString(), + keyDeposit: stakeKeyDeposit.toString(), + poolDeposit: poolDeposit.toString(), + rho: monetaryExpansion, + tau: treasuryExpansion, + minPoolCost: minPoolCost.toString(), + coinsPerUTxOByte: coinsPerUtxoByte.toString(), + price: { + memory: prices.memory.toString(), + step: prices.steps.toString() + } + }, + technicalGroup: { + a0: poolInfluence, + eMax: poolRetirementEpochBound.toString(), + nOpt: desiredNumberOfPools.toString(), + costModels: { + PlutusV1: Object.entries(costModels.get(Wallet.Cardano.PlutusLanguageVersion.V1)).reduce( + (acc, cur) => ({ ...acc, [cur[0]]: cur[1] }), + {} + ), + PlutusV2: Object.entries(costModels.get(Wallet.Cardano.PlutusLanguageVersion.V2)).reduce( + (acc, cur) => ({ ...acc, [cur[0]]: cur[1] }), + {} + ) + }, + collateralPercentage: collateralPercentage.toString() + }, + governanceGroup: { + govActionLifetime: governanceActionValidityPeriod.toString(), + govActionDeposit: governanceActionDeposit.toString(), + drepDeposit: dRepDeposit.toString(), + drepActivity: dRepInactivityPeriod.toString(), + ccMinSize: minCommitteeSize.toString(), + ccMaxTermLength: committeeTermLimit.toString(), + dRepVotingThresholds: { + dvtMotionNoConfidence: formatPercentages(motionNoConfidence.numerator / motionNoConfidence.denominator), + dvtCommitteeNormal: formatPercentages(committeeNormal.numerator / committeeNormal.denominator), + dvtCommitteeNoConfidence: formatPercentages( + commiteeNoConfidence.numerator / commiteeNoConfidence.denominator + ), + dvtUpdateToConstitution: formatPercentages(updateConstitution.numerator / updateConstitution.denominator), + dvtHardForkInitiation: formatPercentages(hardForkInitiation.numerator / hardForkInitiation.denominator), + dvtPPNetworkGroup: formatPercentages(ppNetworkGroup.numerator / ppNetworkGroup.denominator), + dvtPPEconomicGroup: formatPercentages(ppEconomicGroup.numerator / ppEconomicGroup.denominator), + dvtPPTechnicalGroup: formatPercentages(ppTechnicalGroup.numerator / ppTechnicalGroup.denominator), + dvtPPGovGroup: formatPercentages(ppGovernanceGroup.numerator / ppGovernanceGroup.denominator), + dvtTreasuryWithdrawal: formatPercentages(treasuryWithdrawal.numerator / treasuryWithdrawal.denominator) + } + } + } + }; + + return ( + + ); +}; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/TreasuryWithdrawalsActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/TreasuryWithdrawalsActionContainer.tsx new file mode 100644 index 0000000000..393be84434 --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/TreasuryWithdrawalsActionContainer.tsx @@ -0,0 +1,81 @@ +import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Wallet } from '@lace/cardano'; +import { TreasuryWithdrawalsAction } from '@lace/core'; +import { useWalletStore } from '@src/stores'; +import { SignTxData } from '../types'; +import { useCExpolorerBaseUrl } from '../hooks'; + +interface Props { + dappInfo: SignTxData['dappInfo']; + governanceAction: Wallet.Cardano.TreasuryWithdrawalsAction; + deposit: Wallet.Cardano.ProposalProcedure['deposit']; + rewardAccount: Wallet.Cardano.ProposalProcedure['rewardAccount']; + anchor: Wallet.Cardano.ProposalProcedure['anchor']; + errorMessage?: string; +} + +export const TreasuryWithdrawalsActionContainer = ({ + dappInfo, + governanceAction, + deposit, + rewardAccount, + anchor, + errorMessage +}: Props): React.ReactElement => { + const { t } = useTranslation(); + const { + walletUI: { cardanoCoin } + } = useWalletStore(); + + const explorerBaseUrl = useCExpolorerBaseUrl(); + + const translations = useMemo( + () => ({ + procedure: { + title: t('core.proposalProcedure.governanceAction.treasuryWithdrawals.title'), + deposit: t('core.proposalProcedure.procedure.deposit'), + rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + anchor: { + url: t('core.proposalProcedure.procedure.anchor.url'), + hash: t('core.proposalProcedure.procedure.anchor.hash') + } + }, + withdrawals: { + title: t('core.proposalProcedure.governanceAction.treasuryWithdrawals.withdrawals.title'), + rewardAccount: t('core.proposalProcedure.governanceAction.treasuryWithdrawals.withdrawals.rewardAccount'), + lovelace: t('core.proposalProcedure.governanceAction.treasuryWithdrawals.withdrawals.lovelace') + } + }), + [t] + ); + + const { withdrawals } = governanceAction; + + const data = { + procedure: { + deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, + rewardAccount, + ...(anchor.url && { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } + }) + }, + withdrawals: [...withdrawals].map((withdrawal) => ({ + rewardAccount: withdrawal.rewardAccount.toString(), + lovelace: Wallet.util.lovelacesToAdaString(withdrawal.coin.toString()) + })) + }; + + return ( + + ); +}; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/UpdateCommitteeActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/UpdateCommitteeActionContainer.tsx new file mode 100644 index 0000000000..c1aaed0b8d --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/UpdateCommitteeActionContainer.tsx @@ -0,0 +1,106 @@ +import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Wallet } from '@lace/cardano'; +import { UpdateCommitteeAction } from '@lace/core'; +import { useWalletStore } from '@src/stores'; +import { SignTxData } from '../types'; +import { useCExpolorerBaseUrl } from '../hooks'; + +interface Props { + dappInfo: SignTxData['dappInfo']; + governanceAction: Wallet.Cardano.UpdateCommittee; + deposit: Wallet.Cardano.ProposalProcedure['deposit']; + rewardAccount: Wallet.Cardano.ProposalProcedure['rewardAccount']; + anchor: Wallet.Cardano.ProposalProcedure['anchor']; + errorMessage?: string; +} + +export const UpdateCommitteeActionContainer = ({ + dappInfo, + governanceAction, + deposit, + rewardAccount, + anchor, + errorMessage +}: Props): React.ReactElement => { + const { t } = useTranslation(); + const { + walletUI: { cardanoCoin } + } = useWalletStore(); + + const explorerBaseUrl = useCExpolorerBaseUrl(); + + const translations = useMemo( + () => ({ + procedure: { + title: t('core.proposalProcedure.governanceAction.updateCommitteeAction.title'), + deposit: t('core.proposalProcedure.procedure.deposit'), + rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + anchor: { + url: t('core.proposalProcedure.procedure.anchor.url'), + hash: t('core.proposalProcedure.procedure.anchor.hash') + } + }, + actionId: { + title: t('core.proposalProcedure.governanceAction.actionId.title'), + index: t('core.proposalProcedure.governanceAction.actionId.index'), + txHash: t('core.proposalProcedure.governanceAction.actionId.txHash') + }, + membersToBeAdded: { + title: t('core.proposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.title'), + coldCredential: { + hash: t('core.proposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.coldCredential.hash'), + epoch: t( + 'core.proposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.coldCredential.epoch' + ) + } + }, + membersToBeRemoved: { + title: t('core.proposalProcedure.governanceAction.updateCommitteeAction.membersToBeRemoved.title'), + hash: t('core.proposalProcedure.governanceAction.updateCommitteeAction.membersToBeRemoved.hash') + }, + newQuorumThreshold: { + title: t('core.proposalProcedure.governanceAction.updateCommitteeAction.newQuorumThreshold.title'), + denominator: t('core.proposalProcedure.governanceAction.updateCommitteeAction.newQuorumThreshold.denominator'), + numerator: t('core.proposalProcedure.governanceAction.updateCommitteeAction.newQuorumThreshold.numerator') + } + }), + [t] + ); + + const { membersToBeAdded, membersToBeRemoved, newQuorumThreshold, governanceActionId } = governanceAction; + + const data = { + procedure: { + deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, + rewardAccount, + ...(anchor.url && { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } + }) + }, + actionId: { + index: governanceActionId?.actionIndex || 0, + txHash: governanceActionId?.id || '', + ...(explorerBaseUrl && governanceActionId?.id && { txHashUrl: `${explorerBaseUrl}/${governanceActionId?.id}` }) + }, + membersToBeAdded: [...membersToBeAdded].map(({ coldCredential: { hash }, epoch }) => ({ + coldCredential: { + hash: hash.toString() + }, + epoch: epoch.toString() + })), + membersToBeRemoved: [...membersToBeRemoved].map(({ hash }) => ({ hash: hash.toString() })), + newQuorumThreshold: { + denominator: newQuorumThreshold.denominator.toString(), + numerator: newQuorumThreshold.numerator.toString() + } + }; + + return ( + + ); +}; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/utils.ts b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/utils.ts index a92dc323c5..664bfe32d7 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/utils.ts +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/utils.ts @@ -67,11 +67,15 @@ export const votingProceduresInspector = (tx: Wallet.Cardano.Tx): Wallet.Cardano tx?.body?.votingProcedures; // eslint-disable-next-line complexity +export const proposalProceduresInspector = (tx: Wallet.Cardano.Tx): Wallet.Cardano.ProposalProcedure[] | undefined => + tx?.body?.proposalProcedures; + export const getTxType = (tx: Wallet.Cardano.Tx): Wallet.Cip30TxType => { const inspector = createTxInspector({ minted: assetsMintedInspector, burned: assetsBurnedInspector, votingProcedures: votingProceduresInspector, + proposalProcedures: proposalProceduresInspector, dRepRegistration: certificateInspectorFactory(CertificateType.RegisterDelegateRepresentative), dRepRetirement: certificateInspectorFactory(CertificateType.UnregisterDelegateRepresentative), dRepUpdate: certificateInspectorFactory(CertificateType.UpdateDelegateRepresentative), @@ -93,11 +97,16 @@ export const getTxType = (tx: Wallet.Cardano.Tx): Wallet.Cip30TxType => { stakeVoteDelegation, voteRegistrationDelegation, stakeRegistrationDelegation, - stakeVoteDelegationRegistration + stakeVoteDelegationRegistration, + proposalProcedures } = inspector(tx as Wallet.Cardano.HydratedTx); const isMintTransaction = minted.length > 0; const isBurnTransaction = burned.length > 0; + if (proposalProcedures) { + return Wallet.Cip30TxType.ProposalProcedures; + } + if (votingProcedures) { return Wallet.Cip30TxType.VotingProcedures; } diff --git a/apps/browser-extension-wallet/src/lib/translations/en.json b/apps/browser-extension-wallet/src/lib/translations/en.json index 82d188f932..d726efc308 100644 --- a/apps/browser-extension-wallet/src/lib/translations/en.json +++ b/apps/browser-extension-wallet/src/lib/translations/en.json @@ -1164,6 +1164,12 @@ "scriptHash": "Script Hash" } }, + "infoAction": { + "title": "Info Action" + }, + "noConfidenceAction": { + "title": "No Confidence Action" + }, "protocolParamUpdate": { "title": "Protocol Parameter Update Action", "networkGroup": { diff --git a/packages/cardano/src/wallet/types.ts b/packages/cardano/src/wallet/types.ts index 7a4f78c0ad..9c2091494f 100644 --- a/packages/cardano/src/wallet/types.ts +++ b/packages/cardano/src/wallet/types.ts @@ -40,7 +40,8 @@ export enum Cip30TxType { VoteRegistrationDelegation = 'VoteRegistrationDelegation', StakeRegistrationDelegation = 'StakeRegistrationDelegation', StakeVoteDelegationRegistration = 'StakeVoteDelegationRegistration', - StakeVoteDelegation = 'StakeVoteDelegation' + StakeVoteDelegation = 'StakeVoteDelegation', + ProposalProcedures = 'ProposalProcedures' } export type Cip30SignTxOutput = { diff --git a/packages/core/package.json b/packages/core/package.json index dc8a507a19..c1a1678406 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -47,7 +47,6 @@ "axios-cache-adapter": "2.7.3", "classnames": "^2.3.1", "debounce-promise": "^3.1.2", - "decamelize-keys": "^2.0.1", "i18next": "20.4.0", "jest-mock-extended": "3.0.4", "lodash": "4.17.21", @@ -56,7 +55,6 @@ "react-dom": "17.0.2", "react-i18next": "11.11.4", "react-infinite-scroll-component": "^6.1.0", - "titleize": "^4.0.0", "zxcvbn": "^4.4.2" }, "devDependencies": { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 70019dfd2c..d8cc6891e4 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -37,3 +37,4 @@ export * from '@ui/components/ConfirmStakeRegistrationDelegation'; export * from '@ui/components/ConfirmStakeVoteRegistrationDelegation'; export * from '@ui/components/ConfirmVoteRegistrationDelegation'; export * from '@ui/components/VotingProcedures'; +export * from '@ui/components/ProposalProcedures'; diff --git a/packages/core/src/ui/components/ProposalProcedure/InfoAction/index.ts b/packages/core/src/ui/components/ProposalProcedure/InfoAction/index.ts deleted file mode 100644 index 05be240bcc..0000000000 --- a/packages/core/src/ui/components/ProposalProcedure/InfoAction/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { InfoAction as NoConfidenceAction } from './InfoAction'; diff --git a/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/index.ts b/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/index.ts deleted file mode 100644 index cd8fb675a6..0000000000 --- a/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { NewConstitutionAction as HardForkInitiationAction } from './NewConstitutionAction'; diff --git a/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/index.ts b/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/index.ts deleted file mode 100644 index 14664f1bee..0000000000 --- a/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { UpdateCommitteeAction as TreasuryWithdrawalsAction } from './UpdateCommitteeActionAction'; diff --git a/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.stories.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.stories.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.tsx b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.tsx similarity index 96% rename from packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.tsx rename to packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.tsx index fa08ae34b7..0030ecf211 100644 --- a/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.tsx @@ -45,7 +45,7 @@ export const HardForkInitiationAction = ({ dappInfo, errorMessage, data, transla
diff --git a/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationActionTypes.ts similarity index 95% rename from packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationActionTypes.ts rename to packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationActionTypes.ts index 489068dde3..8e45f4bce9 100644 --- a/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/HardForkInitiationActionTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationActionTypes.ts @@ -7,7 +7,7 @@ export interface Data { protocolVersion: { major: number; minor: number; - patch: number; + patch?: number; }; } diff --git a/packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/index.ts b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/index.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/HardForkInitiationAction/index.ts rename to packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/index.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.stories.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.stories.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoAction.tsx b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.tsx similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoAction.tsx rename to packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.tsx diff --git a/packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoActionTypes.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/InfoAction/InfoActionTypes.ts rename to packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoActionTypes.ts diff --git a/packages/core/src/ui/components/ProposalProcedures/InfoAction/index.ts b/packages/core/src/ui/components/ProposalProcedures/InfoAction/index.ts new file mode 100644 index 0000000000..f6fae454f1 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedures/InfoAction/index.ts @@ -0,0 +1 @@ +export { InfoAction } from './InfoAction'; diff --git a/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.stories.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.stories.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.tsx b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.tsx similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionAction.tsx rename to packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.tsx diff --git a/packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionActionTypes.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/NewConstitutionAction/NewConstitutionActionTypes.ts rename to packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionActionTypes.ts diff --git a/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/index.ts b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/index.ts new file mode 100644 index 0000000000..2e50ba16ea --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/index.ts @@ -0,0 +1 @@ +export { NewConstitutionAction } from './NewConstitutionAction'; diff --git a/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.stories.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.stories.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.tsx b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.tsx similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceAction.tsx rename to packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.tsx diff --git a/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceActionTypes.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/NoConfidenceActionTypes.ts rename to packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceActionTypes.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/index.ts b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/index.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/NoConfidenceAction/index.ts rename to packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/index.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/EconomicGroup.tsx b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/EconomicGroup.tsx similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/EconomicGroup.tsx rename to packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/EconomicGroup.tsx diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/GovernanceGroup.tsx b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/GovernanceGroup.tsx similarity index 54% rename from packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/GovernanceGroup.tsx rename to packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/GovernanceGroup.tsx index 6590500c0e..8bc406da64 100644 --- a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/GovernanceGroup.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/GovernanceGroup.tsx @@ -2,8 +2,6 @@ import React from 'react'; import { Cell, Metadata, Text, sx } from '@lace/ui'; import * as Types from './ParameterChangeActionTypes'; import { Card } from '../components/Card'; -import decamelizeKeys from 'decamelize-keys'; -import titleize from 'titleize'; interface Props { governanceGroup: Types.GovernanceGroup; @@ -15,8 +13,6 @@ export const GovernanceGroup = ({ governanceGroup, translations }: Props): JSX.E color: '$text_primary' }); - const dRepVotingThresholds = decamelizeKeys(governanceGroup.dRepVotingThresholds, { separator: ' ' }); - return ( <> @@ -62,10 +58,48 @@ export const GovernanceGroup = ({ governanceGroup, translations }: Props): JSX.E ({ - label: titleize(label), - value - }))} + data={[ + { + label: 'DVT Motion No Confidence', + value: governanceGroup.dRepVotingThresholds.dvtMotionNoConfidence + }, + { + label: 'DVT Committee Normal', + value: governanceGroup.dRepVotingThresholds.dvtCommitteeNormal + }, + { + label: 'DVT Committee No Confidence', + value: governanceGroup.dRepVotingThresholds.dvtCommitteeNoConfidence + }, + { + label: 'DVT Update To Constitution', + value: governanceGroup.dRepVotingThresholds.dvtUpdateToConstitution + }, + { + label: 'DVT Hard Fork Initiation', + value: governanceGroup.dRepVotingThresholds.dvtHardForkInitiation + }, + { + label: 'DVT PP Network Group', + value: governanceGroup.dRepVotingThresholds.dvtPPNetworkGroup + }, + { + label: 'DVT PP Economic Group', + value: governanceGroup.dRepVotingThresholds.dvtPPEconomicGroup + }, + { + label: 'DVT PP Technical Group', + value: governanceGroup.dRepVotingThresholds.dvtPPTechnicalGroup + }, + { + label: 'DVT PP Gov Group', + value: governanceGroup.dRepVotingThresholds.dvtPPGovGroup + }, + { + label: 'DVT Treasury Withdrawal', + value: governanceGroup.dRepVotingThresholds.dvtTreasuryWithdrawal + } + ]} /> diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/NetworkGroup.tsx b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/NetworkGroup.tsx similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/NetworkGroup.tsx rename to packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/NetworkGroup.tsx diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.stories.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.stories.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.tsx b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.tsx similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeAction.tsx rename to packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.tsx diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeActionTypes.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/ParameterChangeActionTypes.ts rename to packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeActionTypes.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/TechnicalGroup.tsx b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/TechnicalGroup.tsx similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/TechnicalGroup.tsx rename to packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/TechnicalGroup.tsx diff --git a/packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/index.ts b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/index.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/ParameterChangeAction/index.ts rename to packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/index.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx similarity index 95% rename from packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx rename to packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx index 51b7d41308..ee3e90929b 100644 --- a/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Box, Cell, Grid, Flex, Divider, sx, Metadata, Text } from '@lace/ui'; +import { Box, Cell, Grid, Flex, Divider, sx, Text } from '@lace/ui'; import { DappInfo, DappInfoProps } from '../../DappInfo'; import { ErrorPane } from '@lace/common'; import * as Types from './TreasuryWithdrawalsActionTypes'; diff --git a/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts rename to packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/index.ts b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/index.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/TreasuryWithdrawalsAction/index.ts rename to packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/index.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts diff --git a/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx similarity index 84% rename from packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx rename to packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx index da187f6f2d..b5337ba7ff 100644 --- a/packages/core/src/ui/components/ProposalProcedure/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx @@ -52,11 +52,13 @@ export const UpdateCommitteeAction = ({ dappInfo, errorMessage, data, translatio - - - {translations.membersToBeAdded.title} - - + {data.membersToBeAdded?.length > 0 && ( + + + {translations.membersToBeAdded.title} + + + )} {data.membersToBeAdded.map(({ coldCredential, epoch }) => ( ))} - - - {translations.membersToBeRemoved.title} - - + {data.membersToBeRemoved?.length > 0 && ( + + + {translations.membersToBeRemoved.title} + + + )} {data.membersToBeRemoved.map(({ hash }) => ( { <> - - {props.label} - + {props.tooltip ? ( + + + {props.label} + + + ) : ( + + {props.label} + + )} @@ -35,7 +44,7 @@ export const Card = ({ title, tooltip, data }: Props): JSX.Element => { ) : ( - + {props.value} )} @@ -44,18 +53,36 @@ export const Card = ({ title, tooltip, data }: Props): JSX.Element => { ); + const renderTitle = () => { + if (!title) return <>; + + if (tooltip) { + return ( + + + + {title} + + + + ); + } + + return ( + + + {title} + + + ); + }; + return ( - {title && ( - - - {title} - - - )} + {renderTitle()} {data.map((props) => renderRow(props))} diff --git a/packages/core/src/ui/components/ProposalProcedure/components/Procedure.tsx b/packages/core/src/ui/components/ProposalProcedures/components/Procedure.tsx similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/components/Procedure.tsx rename to packages/core/src/ui/components/ProposalProcedures/components/Procedure.tsx diff --git a/packages/core/src/ui/components/ProposalProcedure/components/ProcedureTypes.ts b/packages/core/src/ui/components/ProposalProcedures/components/ProcedureTypes.ts similarity index 100% rename from packages/core/src/ui/components/ProposalProcedure/components/ProcedureTypes.ts rename to packages/core/src/ui/components/ProposalProcedures/components/ProcedureTypes.ts diff --git a/packages/core/src/ui/components/ProposalProcedures/index.ts b/packages/core/src/ui/components/ProposalProcedures/index.ts new file mode 100644 index 0000000000..d8d0bc4008 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedures/index.ts @@ -0,0 +1,7 @@ +export * from './HardForkInitiationAction'; +export * from './InfoAction'; +export * from './NewConstitutionAction'; +export * from './NoConfidenceAction'; +export * from './ParameterChangeAction'; +export * from './TreasuryWithdrawalsAction'; +export * from './UpdateCommitteeAction'; diff --git a/packages/staking/src/features/Drawer/preferences/StepPreferencesContent.tsx b/packages/staking/src/features/Drawer/preferences/StepPreferencesContent.tsx index 984b68632a..889504964c 100644 --- a/packages/staking/src/features/Drawer/preferences/StepPreferencesContent.tsx +++ b/packages/staking/src/features/Drawer/preferences/StepPreferencesContent.tsx @@ -66,7 +66,7 @@ export const StepPreferencesContent = () => { onChainPercentage: draftPool?.onChainPercentage, percentage: sliderIntegerPercentage, saturation: saturation ? String(saturation) : undefined, - savedIntegerPercentage: draftPool.basedOnCurrentPortfolio ? draftPool.savedIntegerPercentage : undefined, + savedIntegerPercentage: draftPool?.savedIntegerPercentage || undefined, // TODO sliderIntegerPercentage, stakeValue: balancesBalance diff --git a/packages/ui/package.json b/packages/ui/package.json index b1bafe4dea..c5e31ae811 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -106,17 +106,5 @@ "wait-on": "^7.0.1", "webpack": "^5.76.1", "webpack-dev-server": "^4.11.1" - }, - "resolutions": { - "@storybook/addon-actions": "^6.5.16", - "@storybook/addon-essentials": "^6.5.16", - "@storybook/addon-interactions": "^6.5.16", - "@storybook/addon-links": "^6.5.16", - "@storybook/builder-webpack5": "6.5.16", - "@storybook/jest": "^0.0.10", - "@storybook/manager-webpack5": "6.5.16", - "@storybook/react": "^6.5.16", - "@storybook/test-runner": "^0.10.0", - "@storybook/testing-library": "^0.0.13" } } diff --git a/yarn.lock b/yarn.lock index 7d94f762e8..bc38461983 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9425,7 +9425,6 @@ __metadata: axios-cache-adapter: 2.7.3 classnames: ^2.3.1 debounce-promise: ^3.1.2 - decamelize-keys: ^2.0.1 i18next: 20.4.0 jest-mock-extended: 3.0.4 lodash: 4.17.21 @@ -9436,7 +9435,6 @@ __metadata: react-infinite-scroll-component: ^6.1.0 sass: ^1.68.0 storybook: ^7.4.3 - titleize: ^4.0.0 typescript: ^4.3.5 zxcvbn: ^4.4.2 peerDependencies: @@ -24926,18 +24924,6 @@ __metadata: languageName: node linkType: hard -"decamelize-keys@npm:^2.0.1": - version: 2.0.1 - resolution: "decamelize-keys@npm:2.0.1" - dependencies: - decamelize: ^6.0.0 - map-obj: ^4.3.0 - quick-lru: ^6.1.1 - type-fest: ^3.1.0 - checksum: 633f4599047892a87188f7767b6f78ca75a0eadfdd5362b81ab6a3fed3e73ed0db54a5285b6a43482a63896002b28f7add4fdef2228de9873f93a79ab7b4693e - languageName: node - linkType: hard - "decamelize@npm:^1.1.0, decamelize@npm:^1.1.2, decamelize@npm:^1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" @@ -35758,13 +35744,6 @@ __metadata: languageName: node linkType: hard -"map-obj@npm:^4.3.0": - version: 4.3.0 - resolution: "map-obj@npm:4.3.0" - checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e - languageName: node - linkType: hard - "map-or-similar@npm:^1.5.0": version: 1.5.0 resolution: "map-or-similar@npm:1.5.0" @@ -41319,13 +41298,6 @@ __metadata: languageName: node linkType: hard -"quick-lru@npm:^6.1.1": - version: 6.1.2 - resolution: "quick-lru@npm:6.1.2" - checksum: 0491a24dcd39b8a325e9d3ae719fad7690a1da7a0dbfa8f16613663dc7d262d08b565005ce16a04497ed4700f1f477b8e06cd46e10a7a112a481a18d056c38f7 - languageName: node - linkType: hard - "rambda@npm:^8.5.0": version: 8.5.0 resolution: "rambda@npm:8.5.0" @@ -47546,13 +47518,6 @@ __metadata: languageName: node linkType: hard -"titleize@npm:^4.0.0": - version: 4.0.0 - resolution: "titleize@npm:4.0.0" - checksum: 4415b5422818cce13d6eb3037a53922c1aa79cbaefdfc26ecd862c8d9d526a5046a52963c5f6034fb866daae13004b2fbac546c5a1e25d5904d1452518e56959 - languageName: node - linkType: hard - "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -48219,7 +48184,7 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^3.1.0, type-fest@npm:^3.8.0": +"type-fest@npm:^3.8.0": version: 3.13.1 resolution: "type-fest@npm:3.13.1" checksum: c06b0901d54391dc46de3802375f5579868949d71f93b425ce564e19a428a0d411ae8d8cb0e300d330071d86152c3ea86e744c3f2860a42a79585b6ec2fdae8e From 68734870fd36831fc7ba5952e9c926cfc9ee2b6d Mon Sep 17 00:00:00 2001 From: Vitalii Vozniak Date: Tue, 5 Dec 2023 14:47:00 +0200 Subject: [PATCH 18/19] chore(core): update proposal procedures components to the latest ui --- .../ConfirmDRepRegistrationContainer.test.tsx | 38 +- .../ConfirmDRepRetirementContainer.test.tsx | 38 +- .../ConfirmDRepUpdateContainer.test.tsx | 38 +- .../__tests__/ConfirmTransaction.test.tsx | 42 +- .../ConfirmTransactionContent.test.tsx | 37 ++ .../ConfirmVoteDelegationContainer.test.tsx | 38 +- .../DappTransactionContainer.test.tsx | 38 +- .../ProposalProceduresContainer.test.tsx | 179 +++++++ .../VotingProceduresContainer.test.tsx | 38 +- .../components/confirm-transaction/hooks.ts | 1 - .../HardForkInitiationActionContainer.tsx | 61 ++- .../InfoActionContainer.tsx | 41 +- .../NewConstitutionActionContainer.tsx | 66 ++- .../NoConfidenceActionContainer.tsx | 48 +- .../ParameterChangeActionContainer.tsx | 234 +++++--- .../TreasuryWithdrawalsActionContainer.tsx | 38 +- .../UpdateCommitteeActionContainer.tsx | 71 +-- ...HardForkInitiationActionContainer.test.tsx | 179 +++++++ .../__tests__/InfoActionContainer.test.tsx | 119 +++++ .../NewConstitutionActionContainer.test.tsx | 183 +++++++ .../NoConfidenceActionContainer.test.tsx | 164 ++++++ .../ParameterChangeActionContainer.test.tsx | 504 ++++++++++++++++++ ...reasuryWithdrawalsActionContainer.test.tsx | 165 ++++++ .../UpdateCommitteeActionContainer.test.tsx | 212 ++++++++ .../confirm-transaction/testing.utils.tsx | 38 ++ .../src/lib/translations/en.json | 94 +++- packages/core/.storybook/preview.js | 14 + .../ConfirmDRepRegistration.stories.ts | 50 -- .../ConfirmDRepRetirement.stories.ts | 46 -- .../DappTransaction.stories.ts | 10 +- .../HardForkInitiationAction.stories.ts | 54 +- .../HardForkInitiationAction.tsx | 87 +-- .../HardForkInitiationActionTypes.ts | 22 +- .../InfoAction/InfoAction.stories.ts | 40 +- .../InfoAction/InfoAction.tsx | 31 +- .../InfoAction/InfoActionTypes.ts | 7 +- .../NewConstitutionAction.stories.ts | 41 +- .../NewConstitutionAction.tsx | 101 ++-- .../NewConstitutionActionTypes.ts | 9 +- .../NoConfidenceAction.stories.ts | 43 +- .../NoConfidenceAction/NoConfidenceAction.tsx | 32 +- .../NoConfidenceActionTypes.ts | 9 +- .../ParameterChangeAction/EconomicGroup.tsx | 34 +- .../ParameterChangeAction/GovernanceGroup.tsx | 143 +++-- .../ParameterChangeAction/NetworkGroup.tsx | 61 +-- .../ParameterChangeAction.stories.ts | 126 +++-- .../ParameterChangeAction.tsx | 57 +- .../ParameterChangeActionTypes.ts | 87 ++- .../ParameterChangeAction/TechnicalGroup.tsx | 19 +- .../TreasuryWithdrawalsAction.stories.ts | 46 +- .../TreasuryWithdrawalsAction.tsx | 50 +- .../TreasuryWithdrawalsActionTypes.ts | 6 + .../UpdateCommitteeActionAction.stories.ts | 43 +- .../UpdateCommitteeActionAction.tsx | 93 ++-- .../UpdateCommitteeActionTypes.ts | 13 +- .../components/ActionIdTypes.ts | 6 +- .../ProposalProcedures/components/Card.tsx | 2 +- .../components/Procedure.tsx | 22 +- .../components/ProcedureTypes.ts | 12 +- .../components/TransactionDetails.tsx | 37 ++ .../components/TransactionDetailsTypes.ts | 12 + .../VotingProcedures.stories.ts | 107 ---- .../preferences/StepPreferencesContent.tsx | 1 - .../pie-chart/pie-chart.stories.tsx | 6 +- .../tooltip/tooltip-content.css.ts | 2 +- 65 files changed, 3147 insertions(+), 1138 deletions(-) create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ProposalProceduresContainer.test.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/HardForkInitiationActionContainer.test.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/InfoActionContainer.test.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NewConstitutionActionContainer.test.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NoConfidenceActionContainer.test.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/ParameterChangeActionContainer.test.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/TreasuryWithdrawalsActionContainer.test.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/UpdateCommitteeActionContainer.test.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/testing.utils.tsx delete mode 100644 packages/core/src/ui/components/ConfirmDRepRegistration/ConfirmDRepRegistration.stories.ts delete mode 100644 packages/core/src/ui/components/ConfirmDRepRetirement/ConfirmDRepRetirement.stories.ts create mode 100644 packages/core/src/ui/components/ProposalProcedures/components/TransactionDetails.tsx create mode 100644 packages/core/src/ui/components/ProposalProcedures/components/TransactionDetailsTypes.ts delete mode 100644 packages/core/src/ui/components/VotingProcedures/VotingProcedures.stories.ts diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmDRepRegistrationContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmDRepRegistrationContainer.test.tsx index d63017f1e1..56101f36a3 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmDRepRegistrationContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmDRepRegistrationContainer.test.tsx @@ -9,24 +9,12 @@ import * as React from 'react'; import { cleanup, render } from '@testing-library/react'; import { ConfirmDRepRegistrationContainer } from '../ConfirmDRepRegistrationContainer'; import '@testing-library/jest-dom'; -import { I18nextProvider } from 'react-i18next'; -import { StoreProvider } from '@src/stores'; -import { - AnalyticsProvider, - AppSettingsProvider, - BackgroundServiceAPIProvider, - BackgroundServiceAPIProviderProps, - DatabaseProvider -} from '@src/providers'; -import { APP_MODE_BROWSER } from '@src/utils/constants'; -import i18n from '@lib/i18n'; import { BehaviorSubject } from 'rxjs'; import { act } from 'react-dom/test-utils'; -import { PostHogClientProvider } from '@providers/PostHogClientProvider'; -import { postHogClientMocks } from '@src/utils/mocks/test-helpers'; import { buildMockTx } from '@src/utils/mocks/tx'; import { Wallet } from '@lace/cardano'; import BigNumber from 'bignumber.js'; +import { getWrapper } from '../testing.utils'; const LOVELACE_VALUE = 1_000_000; const DEFAULT_DECIMALS = 2; @@ -72,30 +60,6 @@ jest.mock('react-i18next', () => { }; }); -const backgroundService = { - getBackgroundStorage: jest.fn(), - setBackgroundStorage: jest.fn() -} as unknown as BackgroundServiceAPIProviderProps['value']; - -const getWrapper = - () => - ({ children }: { children: React.ReactNode }) => - ( - - - - - - - {children} - - - - - - - ); - describe('Testing ConfirmDRepRegistrationContainer component', () => { beforeEach(() => { mockUseWalletStore.mockReset(); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmDRepRetirementContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmDRepRetirementContainer.test.tsx index 570bbdb16e..c7bdc6d5ae 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmDRepRetirementContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmDRepRetirementContainer.test.tsx @@ -21,24 +21,12 @@ import * as React from 'react'; import { cleanup, render } from '@testing-library/react'; import { ConfirmDRepRetirementContainer } from '../ConfirmDRepRetirementContainer'; import '@testing-library/jest-dom'; -import { I18nextProvider } from 'react-i18next'; -import { StoreProvider } from '@src/stores'; -import { - AnalyticsProvider, - AppSettingsProvider, - BackgroundServiceAPIProvider, - BackgroundServiceAPIProviderProps, - DatabaseProvider -} from '@src/providers'; -import { APP_MODE_BROWSER } from '@src/utils/constants'; -import i18n from '@lib/i18n'; import { BehaviorSubject } from 'rxjs'; import { act } from 'react-dom/test-utils'; -import { PostHogClientProvider } from '@providers/PostHogClientProvider'; -import { postHogClientMocks } from '@src/utils/mocks/test-helpers'; import { buildMockTx } from '@src/utils/mocks/tx'; import { Wallet } from '@lace/cardano'; import BigNumber from 'bignumber.js'; +import { getWrapper } from '../testing.utils'; const LOVELACE_VALUE = 1_000_000; const DEFAULT_DECIMALS = 2; @@ -114,30 +102,6 @@ jest.mock('react-i18next', () => { }; }); -const backgroundService = { - getBackgroundStorage: jest.fn(), - setBackgroundStorage: jest.fn() -} as unknown as BackgroundServiceAPIProviderProps['value']; - -const getWrapper = - () => - ({ children }: { children: React.ReactNode }) => - ( - - - - - - - {children} - - - - - - - ); - describe('Testing ConfirmDRepRetirementContainer component', () => { beforeEach(() => { mockUseWalletStore.mockReset(); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmDRepUpdateContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmDRepUpdateContainer.test.tsx index eba21c3337..62aaaec965 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmDRepUpdateContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmDRepUpdateContainer.test.tsx @@ -9,23 +9,11 @@ import * as React from 'react'; import { cleanup, render } from '@testing-library/react'; import { ConfirmDRepUpdateContainer } from '../ConfirmDRepUpdateContainer'; import '@testing-library/jest-dom'; -import { I18nextProvider } from 'react-i18next'; -import { StoreProvider } from '@src/stores'; -import { - AnalyticsProvider, - AppSettingsProvider, - BackgroundServiceAPIProvider, - BackgroundServiceAPIProviderProps, - DatabaseProvider -} from '@src/providers'; -import { APP_MODE_BROWSER } from '@src/utils/constants'; -import i18n from '@lib/i18n'; import { BehaviorSubject } from 'rxjs'; import { act } from 'react-dom/test-utils'; -import { PostHogClientProvider } from '@providers/PostHogClientProvider'; -import { postHogClientMocks } from '@src/utils/mocks/test-helpers'; import { buildMockTx } from '@src/utils/mocks/tx'; import { Wallet } from '@lace/cardano'; +import { getWrapper } from '../testing.utils'; const { Cardano, Crypto, HexBlob } = Wallet; @@ -68,30 +56,6 @@ jest.mock('react-i18next', () => { }; }); -const backgroundService = { - getBackgroundStorage: jest.fn(), - setBackgroundStorage: jest.fn() -} as unknown as BackgroundServiceAPIProviderProps['value']; - -const getWrapper = - () => - ({ children }: { children: React.ReactNode }) => - ( - - - - - - - {children} - - - - - - - ); - describe('Testing ConfirmDRepUpdateContainer component', () => { beforeEach(() => { mockUseWalletStore.mockReset(); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmTransaction.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmTransaction.test.tsx index 6be8a2a2c9..d8b854952a 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmTransaction.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmTransaction.test.tsx @@ -18,23 +18,9 @@ import * as React from 'react'; import { cleanup, render, act, fireEvent } from '@testing-library/react'; import { ConfirmTransaction } from '../ConfirmTransaction'; import '@testing-library/jest-dom'; -import { I18nextProvider } from 'react-i18next'; -import { StoreProvider } from '@src/stores'; -import { - AnalyticsProvider, - AppSettingsProvider, - BackgroundServiceAPIProvider, - BackgroundServiceAPIProviderProps, - DatabaseProvider, - ViewFlowProvider -} from '@src/providers'; -import { APP_MODE_BROWSER } from '@src/utils/constants'; -import i18n from '@lib/i18n'; import { BehaviorSubject } from 'rxjs'; -import { sendViewsFlowState } from '../../../config'; -import { PostHogClientProvider } from '@providers/PostHogClientProvider'; -import { postHogClientMocks } from '@src/utils/mocks/test-helpers'; import { Wallet } from '@lace/cardano'; +import { getWrapper } from '../testing.utils'; const assetInfo$ = new BehaviorSubject(new Map()); const available$ = new BehaviorSubject([]); @@ -134,32 +120,6 @@ const testIds = { dappTransactionCancel: 'dapp-transaction-cancel' }; -const backgroundService = { - getBackgroundStorage: jest.fn(), - setBackgroundStorage: jest.fn() -} as unknown as BackgroundServiceAPIProviderProps['value']; - -const getWrapper = - () => - ({ children }: { children: React.ReactNode }) => - ( - - - - - - - - {children} - - - - - - - - ); - describe('Testing ConfirmTransaction component', () => { window.ResizeObserver = ResizeObserver; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmTransactionContent.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmTransactionContent.test.tsx index c2ad9259a2..931151a429 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmTransactionContent.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmTransactionContent.test.tsx @@ -9,6 +9,7 @@ const mockConfirmDRepRetirementContainer = jest.fn(() => ); const mockConfirmVoteDelegationContainer = jest.fn(() => ); const mockVotingProceduresContainer = jest.fn(() => ); +const mockProposalProceduresContainer = jest.fn(() => ); const mockDappTransactionContainer = jest.fn(() => ); import * as React from 'react'; import { cleanup, render } from '@testing-library/react'; @@ -71,6 +72,15 @@ jest.mock('../VotingProceduresContainer', () => { }; }); +jest.mock('../ProposalProceduresContainer', () => { + const original = jest.requireActual('../ProposalProceduresContainer'); + return { + __esModule: true, + ...original, + ProposalProceduresContainer: mockProposalProceduresContainer + }; +}); + jest.mock('../DappTransactionContainer', () => { const original = jest.requireActual('../DappTransactionContainer'); return { @@ -106,6 +116,7 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmDRepUpdateContainer')).not.toBeInTheDocument(); expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockSkeleton).toHaveBeenLastCalledWith({ loading: true }, {}); }); @@ -125,6 +136,7 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmDRepUpdateContainer')).not.toBeInTheDocument(); expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockConfirmDRepRegistrationContainer).toHaveBeenLastCalledWith(props, {}); }); @@ -144,6 +156,7 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmDRepUpdateContainer')).not.toBeInTheDocument(); expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockConfirmDRepRetirementContainer).toHaveBeenLastCalledWith(props, {}); }); @@ -163,6 +176,7 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmDRepUpdateContainer')).toBeInTheDocument(); expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockConfirmDRepUpdateContainer).toHaveBeenLastCalledWith(props, {}); }); @@ -182,6 +196,7 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmDRepUpdateContainer')).not.toBeInTheDocument(); expect(queryByTestId('ConfirmVoteDelegationContainer')).toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockConfirmVoteDelegationContainer).toHaveBeenLastCalledWith(props, {}); }); @@ -201,10 +216,31 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmDRepUpdateContainer')).not.toBeInTheDocument(); expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).toBeInTheDocument(); + expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockVotingProceduresContainer).toHaveBeenLastCalledWith(props, {}); }); + test('should render ProposalProceduresContainer with proper props', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render( + + )); + }); + + expect(queryByTestId('skeleton')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepRegistrationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepRetirementContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepUpdateContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ProposalProceduresContainer')).toBeInTheDocument(); + expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); + expect(mockProposalProceduresContainer).toHaveBeenLastCalledWith(props, {}); + }); + test('should render DappTransactionContainer with proper props', async () => { let queryByTestId: any; @@ -220,6 +256,7 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmDRepUpdateContainer')).not.toBeInTheDocument(); expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).toBeInTheDocument(); expect(mockDappTransactionContainer).toHaveBeenLastCalledWith(props, {}); }); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmVoteDelegationContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmVoteDelegationContainer.test.tsx index 3f2c77c6d7..1b4c2bdbe2 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmVoteDelegationContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmVoteDelegationContainer.test.tsx @@ -9,23 +9,11 @@ import * as React from 'react'; import { cleanup, render } from '@testing-library/react'; import { ConfirmVoteDelegationContainer } from '../ConfirmVoteDelegationContainer'; import '@testing-library/jest-dom'; -import { I18nextProvider } from 'react-i18next'; -import { StoreProvider } from '@src/stores'; -import { - AnalyticsProvider, - AppSettingsProvider, - BackgroundServiceAPIProvider, - BackgroundServiceAPIProviderProps, - DatabaseProvider -} from '@src/providers'; -import { APP_MODE_BROWSER } from '@src/utils/constants'; -import i18n from '@lib/i18n'; import { BehaviorSubject } from 'rxjs'; import { act } from 'react-dom/test-utils'; -import { PostHogClientProvider } from '@providers/PostHogClientProvider'; -import { postHogClientMocks } from '@src/utils/mocks/test-helpers'; import { buildMockTx } from '@src/utils/mocks/tx'; import { Wallet } from '@lace/cardano'; +import { getWrapper } from '../testing.utils'; const REWARD_ACCOUNT = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); const STAKE_KEY_HASH = Wallet.Cardano.RewardAccount.toHash(REWARD_ACCOUNT); @@ -69,30 +57,6 @@ jest.mock('react-i18next', () => { }; }); -const backgroundService = { - getBackgroundStorage: jest.fn(), - setBackgroundStorage: jest.fn() -} as unknown as BackgroundServiceAPIProviderProps['value']; - -const getWrapper = - () => - ({ children }: { children: React.ReactNode }) => - ( - - - - - - - {children} - - - - - - - ); - describe('Testing ConfirmVoteDelegationContainer component', () => { beforeEach(() => { mockUseWalletStore.mockReset(); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/DappTransactionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/DappTransactionContainer.test.tsx index 4f58f3f937..2f6eca12f0 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/DappTransactionContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/DappTransactionContainer.test.tsx @@ -19,24 +19,12 @@ import * as React from 'react'; import { cleanup, render } from '@testing-library/react'; import { DappTransactionContainer } from '../DappTransactionContainer'; import '@testing-library/jest-dom'; -import { I18nextProvider } from 'react-i18next'; -import { StoreProvider } from '@src/stores'; -import { - AnalyticsProvider, - AppSettingsProvider, - BackgroundServiceAPIProvider, - BackgroundServiceAPIProviderProps, - DatabaseProvider -} from '@src/providers'; -import { APP_MODE_BROWSER } from '@src/utils/constants'; -import i18n from '@lib/i18n'; import { BehaviorSubject } from 'rxjs'; import { act } from 'react-dom/test-utils'; -import { PostHogClientProvider } from '@providers/PostHogClientProvider'; -import { postHogClientMocks } from '@src/utils/mocks/test-helpers'; import { buildMockTx } from '@src/utils/mocks/tx'; import { Wallet } from '@lace/cardano'; import { SignTxData } from '../types'; +import { getWrapper } from '../testing.utils'; const { Cardano, Crypto } = Wallet; @@ -114,30 +102,6 @@ jest.mock('antd', () => { }; }); -const backgroundService = { - getBackgroundStorage: jest.fn(), - setBackgroundStorage: jest.fn() -} as unknown as BackgroundServiceAPIProviderProps['value']; - -const getWrapper = - () => - ({ children }: { children: React.ReactNode }) => - ( - - - - - - - {children} - - - - - - - ); - describe('Testing DappTransactionContainer component', () => { beforeEach(() => { mockUseWalletStore.mockReset(); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ProposalProceduresContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ProposalProceduresContainer.test.tsx new file mode 100644 index 0000000000..8dd390fba9 --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ProposalProceduresContainer.test.tsx @@ -0,0 +1,179 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-magic-numbers */ +/* eslint-disable import/imports-first */ +const mockHardForkInitiationActionContainer = jest.fn(() => ); +const mockInfoActionContainer = jest.fn(() => ); +const mockNewConstitutionActionContainer = jest.fn(() => ); +const mockNoConfidenceActionContainer = jest.fn(() => ); +const mockParameterChangeActionContainer = jest.fn(() => ); +const mockTreasuryWithdrawalsActionContainer = jest.fn(() => ); +const mockUpdateCommitteeActionContainer = jest.fn(() => ); +import { Wallet } from '@lace/cardano'; +import * as React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import { ProposalProceduresContainer } from '../ProposalProceduresContainer'; +import '@testing-library/jest-dom'; +import { act } from 'react-dom/test-utils'; +import { buildMockTx } from '@src/utils/mocks/tx'; + +jest.mock('../proposal-procedures/HardForkInitiationActionContainer', () => { + const original = jest.requireActual('../proposal-procedures/HardForkInitiationActionContainer'); + return { + __esModule: true, + ...original, + HardForkInitiationActionContainer: mockHardForkInitiationActionContainer + }; +}); + +jest.mock('../proposal-procedures/InfoActionContainer', () => { + const original = jest.requireActual('../proposal-procedures/InfoActionContainer'); + return { + __esModule: true, + ...original, + InfoActionContainer: mockInfoActionContainer + }; +}); + +jest.mock('../proposal-procedures/NewConstitutionActionContainer', () => { + const original = jest.requireActual('../proposal-procedures/NewConstitutionActionContainer'); + return { + __esModule: true, + ...original, + NewConstitutionActionContainer: mockNewConstitutionActionContainer + }; +}); + +jest.mock('../proposal-procedures/NoConfidenceActionContainer', () => { + const original = jest.requireActual('../proposal-procedures/NoConfidenceActionContainer'); + return { + __esModule: true, + ...original, + NoConfidenceActionContainer: mockNoConfidenceActionContainer + }; +}); + +jest.mock('../proposal-procedures/ParameterChangeActionContainer', () => { + const original = jest.requireActual('../proposal-procedures/ParameterChangeActionContainer'); + return { + __esModule: true, + ...original, + ParameterChangeActionContainer: mockParameterChangeActionContainer + }; +}); + +jest.mock('../proposal-procedures/TreasuryWithdrawalsActionContainer', () => { + const original = jest.requireActual('../proposal-procedures/TreasuryWithdrawalsActionContainer'); + return { + __esModule: true, + ...original, + TreasuryWithdrawalsActionContainer: mockTreasuryWithdrawalsActionContainer + }; +}); + +jest.mock('../proposal-procedures/UpdateCommitteeActionContainer', () => { + const original = jest.requireActual('../proposal-procedures/UpdateCommitteeActionContainer'); + return { + __esModule: true, + ...original, + UpdateCommitteeActionContainer: mockUpdateCommitteeActionContainer + }; +}); + +const dappInfo = { + name: 'dappName', + logo: 'dappLogo', + url: 'dappUrl' +}; +const errorMessage = 'errorMessage'; +const tx = buildMockTx(); +const deposit = BigInt('10000'); +const rewardAccount = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); +const anchor = { + url: 'anchorUrl', + dataHash: Wallet.Crypto.Hash32ByteBase16(Buffer.from('anchorDataHashanchorDataHashanch').toString('hex')) +}; + +const hardForkInitiationAction = { + __typename: Wallet.Cardano.GovernanceActionType.hard_fork_initiation_action +} as Wallet.Cardano.HardForkInitiationAction; +const infoAction = { + __typename: Wallet.Cardano.GovernanceActionType.info_action +} as Wallet.Cardano.InfoAction; +const newConstitution = { + __typename: Wallet.Cardano.GovernanceActionType.new_constitution +} as Wallet.Cardano.NewConstitution; +const noConfidence = { + __typename: Wallet.Cardano.GovernanceActionType.no_confidence +} as Wallet.Cardano.NoConfidence; +const parameterChangeAction = { + __typename: Wallet.Cardano.GovernanceActionType.parameter_change_action +} as Wallet.Cardano.ParameterChangeAction; +const treasuryWithdrawalsAction = { + __typename: Wallet.Cardano.GovernanceActionType.treasury_withdrawals_action +} as Wallet.Cardano.TreasuryWithdrawalsAction; +const updateCommittee = { + __typename: Wallet.Cardano.GovernanceActionType.update_committee +} as Wallet.Cardano.UpdateCommittee; + +const proposalProcedures = [ + { deposit, rewardAccount, anchor, governanceAction: hardForkInitiationAction }, + { deposit, rewardAccount, anchor, governanceAction: infoAction }, + { deposit, rewardAccount, anchor, governanceAction: newConstitution }, + { deposit, rewardAccount, anchor, governanceAction: noConfidence }, + { deposit, rewardAccount, anchor, governanceAction: parameterChangeAction }, + { deposit, rewardAccount, anchor, governanceAction: treasuryWithdrawalsAction }, + { deposit, rewardAccount, anchor, governanceAction: updateCommittee } +]; +const signTxData = { dappInfo, tx: { ...tx, body: { ...tx.body, proposalProcedures } } }; +const props = { signTxData, errorMessage }; + +describe('Testing ProposalProceduresContainer component', () => { + afterEach(() => { + jest.clearAllMocks(); + cleanup(); + }); + + test('should render proper procedure', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render()); + }); + + expect(queryByTestId('HardForkInitiationActionContainer')).toBeInTheDocument(); + expect(queryByTestId('InfoActionContainer')).toBeInTheDocument(); + expect(queryByTestId('NewConstitutionActionContainer')).toBeInTheDocument(); + expect(queryByTestId('NoConfidenceActionContainer')).toBeInTheDocument(); + expect(queryByTestId('ParameterChangeActionContainer')).toBeInTheDocument(); + expect(queryByTestId('TreasuryWithdrawalsActionContainer')).toBeInTheDocument(); + expect(queryByTestId('UpdateCommitteeActionContainer')).toBeInTheDocument(); + + const expectedProps = { dappInfo: signTxData.dappInfo, errorMessage, deposit, rewardAccount, anchor }; + + expect(mockHardForkInitiationActionContainer).toHaveBeenLastCalledWith( + { ...expectedProps, governanceAction: hardForkInitiationAction }, + {} + ); + expect(mockInfoActionContainer).toHaveBeenLastCalledWith({ ...expectedProps, governanceAction: infoAction }, {}); + expect(mockNewConstitutionActionContainer).toHaveBeenLastCalledWith( + { ...expectedProps, governanceAction: newConstitution }, + {} + ); + expect(mockNoConfidenceActionContainer).toHaveBeenLastCalledWith( + { ...expectedProps, governanceAction: noConfidence }, + {} + ); + expect(mockParameterChangeActionContainer).toHaveBeenLastCalledWith( + { ...expectedProps, governanceAction: parameterChangeAction }, + {} + ); + expect(mockTreasuryWithdrawalsActionContainer).toHaveBeenLastCalledWith( + { ...expectedProps, governanceAction: treasuryWithdrawalsAction }, + {} + ); + expect(mockUpdateCommitteeActionContainer).toHaveBeenLastCalledWith( + { ...expectedProps, governanceAction: updateCommittee }, + {} + ); + }); +}); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/VotingProceduresContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/VotingProceduresContainer.test.tsx index d1ddb7fdcc..fd1c35b40e 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/VotingProceduresContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/VotingProceduresContainer.test.tsx @@ -13,22 +13,10 @@ import * as React from 'react'; import { cleanup, render } from '@testing-library/react'; import { VoterType, Votes, VotingProceduresContainer, getVote, getVoterType } from '../VotingProceduresContainer'; import '@testing-library/jest-dom'; -import { I18nextProvider } from 'react-i18next'; -import { StoreProvider } from '@src/stores'; -import { - AnalyticsProvider, - AppSettingsProvider, - BackgroundServiceAPIProvider, - BackgroundServiceAPIProviderProps, - DatabaseProvider -} from '@src/providers'; -import { APP_MODE_BROWSER } from '@src/utils/constants'; -import i18n from '@lib/i18n'; import { act } from 'react-dom/test-utils'; -import { PostHogClientProvider } from '@providers/PostHogClientProvider'; -import { postHogClientMocks } from '@src/utils/mocks/test-helpers'; import { buildMockTx } from '@src/utils/mocks/tx'; import { Wallet } from '@lace/cardano'; +import { getWrapper } from '../testing.utils'; jest.mock('@src/stores', () => ({ ...jest.requireActual('@src/stores'), @@ -65,30 +53,6 @@ jest.mock('react-i18next', () => { }; }); -const backgroundService = { - getBackgroundStorage: jest.fn(), - setBackgroundStorage: jest.fn() -} as unknown as BackgroundServiceAPIProviderProps['value']; - -const getWrapper = - () => - ({ children }: { children: React.ReactNode }) => - ( - - - - - - - {children} - - - - - - - ); - describe('Testing VotingProceduresContainer component', () => { beforeEach(() => { mockUseWalletStore.mockReset(); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/hooks.ts b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/hooks.ts index 2da3312d65..105b686672 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/hooks.ts +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/hooks.ts @@ -12,7 +12,6 @@ import { dAppRoutePaths } from '@routes'; import { Wallet } from '@lace/cardano'; import { useRedirection } from '@hooks'; import { CardanoTxOut, WalletInfo } from '@src/types'; -import { useWalletStore } from '@src/stores'; import { config } from '@src/config'; import { TokenInfo, getAssetsInformation } from '@src/utils/get-assets-information'; import { getTransactionAssetsId } from '@src/stores/slices'; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/HardForkInitiationActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/HardForkInitiationActionContainer.tsx index 399cf82a4a..127032903c 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/HardForkInitiationActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/HardForkInitiationActionContainer.tsx @@ -30,25 +30,34 @@ export const HardForkInitiationActionContainer = ({ const explorerBaseUrl = useCExpolorerBaseUrl(); - const translations = useMemo( + const translations = useMemo[0]['translations']>( () => ({ + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType'), + deposit: t('core.ProposalProcedure.txDetails.deposit'), + rewardAccount: t('core.ProposalProcedure.txDetails.rewardAccount') + }, procedure: { - title: t('core.proposalProcedure.governanceAction.hardForkInitiation.title'), - deposit: t('core.proposalProcedure.procedure.deposit'), - rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + title: t('core.ProposalProcedure.procedure.title'), anchor: { - url: t('core.proposalProcedure.procedure.anchor.url'), - hash: t('core.proposalProcedure.procedure.anchor.hash') + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, - actionId: { - title: t('core.proposalProcedure.governanceAction.actionId.title'), - index: t('core.proposalProcedure.governanceAction.actionId.index'), - txHash: t('core.proposalProcedure.governanceAction.actionId.txHash') + governanceAction: { + id: t('core.ProposalProcedure.governanceAction.hardForkInitiation.actionId.id'), + index: t('core.ProposalProcedure.governanceAction.hardForkInitiation.actionId.index') }, protocolVersion: { - title: t('core.proposalProcedure.governanceAction.hardForkInitiation.protocolVersion.title'), - label: t('core.proposalProcedure.governanceAction.hardForkInitiation.protocolVersion.label') + major: t('core.ProposalProcedure.governanceAction.hardForkInitiation.protocolVersion.major'), + minor: t('core.ProposalProcedure.governanceAction.hardForkInitiation.protocolVersion.minor'), + patch: t('core.ProposalProcedure.governanceAction.hardForkInitiation.protocolVersion.patch') + }, + actionId: { + title: t('core.ProposalProcedure.governanceAction.actionId.title'), + index: t('core.ProposalProcedure.governanceAction.actionId.index'), + txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') } }), [t] @@ -56,11 +65,14 @@ export const HardForkInitiationActionContainer = ({ const { governanceActionId, protocolVersion } = governanceAction; - const data = { - procedure: { + const data: Parameters[0]['data'] = { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.hardForkInitiation.title'), deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, - rewardAccount, - ...(anchor.url && { + rewardAccount + }, + procedure: { + ...(anchor && { anchor: { url: anchor.url, hash: anchor.dataHash, @@ -68,12 +80,17 @@ export const HardForkInitiationActionContainer = ({ } }) }, - protocolVersion, - actionId: { - index: governanceActionId?.actionIndex || 0, - txHash: governanceActionId?.id || '', - ...(explorerBaseUrl && governanceActionId?.id && { txHashUrl: `${explorerBaseUrl}/${governanceActionId?.id}` }) - } + protocolVersion: { + major: protocolVersion.major.toString(), + minor: protocolVersion.minor.toString(), + patch: protocolVersion.patch?.toString() + }, + ...(governanceActionId && { + governanceAction: { + index: governanceActionId.actionIndex.toString(), + id: governanceActionId.id || '' + } + }) }; return ( diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/InfoActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/InfoActionContainer.tsx index 210a49923c..683536a843 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/InfoActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/InfoActionContainer.tsx @@ -2,52 +2,47 @@ import React, { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { Wallet } from '@lace/cardano'; import { InfoAction } from '@lace/core'; -import { useWalletStore } from '@src/stores'; import { SignTxData } from '../types'; import { useCExpolorerBaseUrl } from '../hooks'; interface Props { dappInfo: SignTxData['dappInfo']; - deposit: Wallet.Cardano.ProposalProcedure['deposit']; - rewardAccount: Wallet.Cardano.ProposalProcedure['rewardAccount']; anchor: Wallet.Cardano.ProposalProcedure['anchor']; errorMessage?: string; } -export const InfoActionContainer = ({ - dappInfo, - deposit, - rewardAccount, - anchor, - errorMessage -}: Props): React.ReactElement => { +export const InfoActionContainer = ({ dappInfo, anchor, errorMessage }: Props): React.ReactElement => { const { t } = useTranslation(); - const { - walletUI: { cardanoCoin } - } = useWalletStore(); const explorerBaseUrl = useCExpolorerBaseUrl(); - const translations = useMemo( + const translations = useMemo[0]['translations']>( () => ({ + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType') + }, procedure: { - title: t('core.proposalProcedure.governanceAction.infoAction.title'), - deposit: t('core.proposalProcedure.procedure.deposit'), - rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + title: t('core.ProposalProcedure.procedure.title'), anchor: { - url: t('core.proposalProcedure.procedure.anchor.url'), - hash: t('core.proposalProcedure.procedure.anchor.hash') + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') } + }, + actionId: { + index: t('core.ProposalProcedure.governanceAction.actionId.index'), + txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') } }), [t] ); - const data = { + const data: Parameters[0]['data'] = { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.infoAction.title') + }, procedure: { - deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, - rewardAccount, - ...(anchor.url && { + ...(anchor && { anchor: { url: anchor.url, hash: anchor.dataHash, diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NewConstitutionActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NewConstitutionActionContainer.tsx index f52102fd7c..adb6098903 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NewConstitutionActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NewConstitutionActionContainer.tsx @@ -30,29 +30,37 @@ export const NewConstitutionActionContainer = ({ const explorerBaseUrl = useCExpolorerBaseUrl(); - const translations = useMemo( + const translations = useMemo[0]['translations']>( () => ({ + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType'), + deposit: t('core.ProposalProcedure.txDetails.deposit'), + rewardAccount: t('core.ProposalProcedure.txDetails.rewardAccount') + }, procedure: { - title: t('core.proposalProcedure.governanceAction.newConstitutionAction.title'), - deposit: t('core.proposalProcedure.procedure.deposit'), - rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + title: t('core.ProposalProcedure.procedure.title'), anchor: { - url: t('core.proposalProcedure.procedure.anchor.url'), - hash: t('core.proposalProcedure.procedure.anchor.hash') + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, - actionId: { - title: t('core.proposalProcedure.governanceAction.actionId.title'), - index: t('core.proposalProcedure.governanceAction.actionId.index'), - txHash: t('core.proposalProcedure.governanceAction.actionId.txHash') + governanceAction: { + id: t('core.ProposalProcedure.governanceAction.newConstitutionAction.actionId.id'), + index: t('core.ProposalProcedure.governanceAction.newConstitutionAction.actionId.index') }, constitution: { - title: t('core.proposalProcedure.governanceAction.newConstitutionAction.constitution.title'), + title: t('core.ProposalProcedure.governanceAction.newConstitutionAction.constitution.title'), anchor: { - dataHash: t('core.proposalProcedure.governanceAction.newConstitutionAction.constitution.anchor.dataHash'), - url: t('core.proposalProcedure.governanceAction.newConstitutionAction.constitution.url') + dataHash: t('core.ProposalProcedure.governanceAction.newConstitutionAction.constitution.anchor.dataHash'), + url: t('core.ProposalProcedure.governanceAction.newConstitutionAction.constitution.anchor.url') }, - scriptHash: t('core.proposalProcedure.governanceAction.newConstitutionAction.constitution.scriptHash') + scriptHash: t('core.ProposalProcedure.governanceAction.newConstitutionAction.constitution.scriptHash') + }, + actionId: { + title: t('core.ProposalProcedure.governanceAction.actionId.title'), + index: t('core.ProposalProcedure.governanceAction.actionId.index'), + txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') } }), [t] @@ -60,11 +68,14 @@ export const NewConstitutionActionContainer = ({ const { governanceActionId, constitution } = governanceAction; - const data = { - procedure: { + const data: Parameters[0]['data'] = { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.newConstitutionAction.title'), deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, - rewardAccount, - ...(anchor.url && { + rewardAccount + }, + procedure: { + ...(anchor && { anchor: { url: anchor.url, hash: anchor.dataHash, @@ -72,12 +83,19 @@ export const NewConstitutionActionContainer = ({ } }) }, - actionId: { - index: governanceActionId?.actionIndex || 0, - txHash: governanceActionId?.id || '', - ...(explorerBaseUrl && governanceActionId?.id && { txHashUrl: `${explorerBaseUrl}/${governanceActionId?.id}` }) - }, - constitution + ...(governanceActionId && { + governanceAction: { + index: governanceActionId.actionIndex.toString(), + id: governanceActionId.id || '' + } + }), + constitution: { + anchor: { + dataHash: constitution.anchor.dataHash.toString(), + url: constitution.anchor.url.toString() + }, + ...(constitution.scriptHash && { scriptHash: constitution.scriptHash.toString() }) + } }; return ( diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NoConfidenceActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NoConfidenceActionContainer.tsx index a1a2460da7..6ba8e0afdc 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NoConfidenceActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NoConfidenceActionContainer.tsx @@ -30,21 +30,29 @@ export const NoConfidenceActionContainer = ({ const explorerBaseUrl = useCExpolorerBaseUrl(); - const translations = useMemo( + const translations = useMemo[0]['translations']>( () => ({ + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType'), + deposit: t('core.ProposalProcedure.txDetails.deposit'), + rewardAccount: t('core.ProposalProcedure.txDetails.rewardAccount') + }, procedure: { - title: t('core.proposalProcedure.governanceAction.noConfidenceAction.title'), - deposit: t('core.proposalProcedure.procedure.deposit'), - rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + title: t('core.ProposalProcedure.procedure.title'), anchor: { - url: t('core.proposalProcedure.procedure.anchor.url'), - hash: t('core.proposalProcedure.procedure.anchor.hash') + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, + governanceAction: { + id: t('core.ProposalProcedure.governanceAction.noConfidenceAction.actionId.id'), + index: t('core.ProposalProcedure.governanceAction.noConfidenceAction.actionId.index') + }, actionId: { - title: t('core.proposalProcedure.governanceAction.actionId.title'), - index: t('core.proposalProcedure.governanceAction.actionId.index'), - txHash: t('core.proposalProcedure.governanceAction.actionId.txHash') + title: t('core.ProposalProcedure.governanceAction.actionId.title'), + index: t('core.ProposalProcedure.governanceAction.actionId.index'), + txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') } }), [t] @@ -52,11 +60,14 @@ export const NoConfidenceActionContainer = ({ const { governanceActionId } = governanceAction; - const data = { - procedure: { + const data: Parameters[0]['data'] = { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.noConfidenceAction.title'), deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, - rewardAccount, - ...(anchor.url && { + rewardAccount + }, + procedure: { + ...(anchor && { anchor: { url: anchor.url, hash: anchor.dataHash, @@ -64,11 +75,12 @@ export const NoConfidenceActionContainer = ({ } }) }, - actionId: { - index: governanceActionId?.actionIndex || 0, - txHash: governanceActionId?.id || '', - ...(explorerBaseUrl && governanceActionId?.id && { txHashUrl: `${explorerBaseUrl}/${governanceActionId?.id}` }) - } + ...(governanceActionId && { + governanceAction: { + index: governanceActionId.actionIndex.toString(), + id: governanceActionId.id || '' + } + }) }; return ; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/ParameterChangeActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/ParameterChangeActionContainer.tsx index 535bcb33a6..114a0aa6c0 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/ParameterChangeActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/ParameterChangeActionContainer.tsx @@ -32,105 +32,176 @@ export const ParameterChangeActionContainer = ({ const explorerBaseUrl = useCExpolorerBaseUrl(); - const translations = useMemo( + const translations = useMemo[0]['translations']>( () => ({ - procedure: { - title: t('core.proposalProcedure.governanceAction.protocolParamUpdate.title'), - deposit: t('core.proposalProcedure.procedure.deposit'), - rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), - anchor: { - url: t('core.proposalProcedure.procedure.anchor.url'), - hash: t('core.proposalProcedure.procedure.anchor.hash') - } + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType'), + deposit: t('core.ProposalProcedure.txDetails.deposit'), + rewardAccount: t('core.ProposalProcedure.txDetails.rewardAccount') + }, + anchor: { + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') }, + memory: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.memory'), + step: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.step'), networkGroup: { - title: t('core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.title'), + title: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.title'), + maxBBSize: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxBBSize'), + maxTxSize: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxTxSize'), + maxBHSize: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxBHSize'), + maxValSize: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxValSize'), + maxTxExUnits: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxTxExUnits'), + maxBlockExUnits: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxBlockExUnits'), + maxCollateralInputs: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxCollateralInputs' + ), + coinsByUTXOByte: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.coinsByUTXOByte'), tooltip: { - maxBBSize: t('core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxBBSize'), - maxTxSize: t('core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxTxSize'), - maxBHSize: t('core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxBHSize'), - maxValSize: t('core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxValSize'), + maxBBSize: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxBBSize'), + maxTxSize: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxTxSize'), + maxBHSize: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxBHSize'), + maxValSize: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxValSize'), maxTxExUnits: t( - 'core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxTxExUnits' + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxTxExUnits' ), maxBlockExUnits: t( - 'core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxBlockExUnits' + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxBlockExUnits' ), maxCollateralInputs: t( - 'core.proposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxCollateralInputs' + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxCollateralInputs' + ), + coinsByUTXOByte: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.coinsByUTXOByte' ) } }, economicGroup: { - title: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.title'), + title: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.title'), + minFeeA: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.minFeeA'), + minFeeB: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.minFeeB'), + keyDeposit: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.keyDeposit'), + poolDeposit: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.poolDeposit'), + rho: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.rho'), + tau: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tau'), + minPoolCost: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.minPoolCost'), + coinsPerUTxOByte: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.coinsPerUTxOByte' + ), + prices: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.prices'), tooltip: { - minFeeA: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.minFeeA'), - minFeeB: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.minFeeB'), - keyDeposit: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.keyDeposit'), + minFeeA: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.minFeeA'), + minFeeB: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.minFeeB'), + keyDeposit: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.keyDeposit'), poolDeposit: t( - 'core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.poolDeposit' + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.poolDeposit' ), - rho: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.rho'), - tau: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.tau'), + rho: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.rho'), + tau: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.tau'), minPoolCost: t( - 'core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.minPoolCost' + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.minPoolCost' ), coinsPerUTxOByte: t( - 'core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.coinsPerUTxOByte' + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.coinsPerUTxOByte' ), - prices: t('core.proposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.prices') + prices: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.prices') } }, technicalGroup: { - title: t('core.proposalProcedure.governanceAction.technicalGroup.title'), + title: t('core.ProposalProcedure.governanceAction.technicalGroup.title'), + a0: t('core.ProposalProcedure.governanceAction.technicalGroup.a0'), + eMax: t('core.ProposalProcedure.governanceAction.technicalGroup.eMax'), + nOpt: t('core.ProposalProcedure.governanceAction.technicalGroup.nOpt'), + costModels: t('core.ProposalProcedure.governanceAction.technicalGroup.costModels'), + collateralPercentage: t('core.ProposalProcedure.governanceAction.technicalGroup.collateralPercentage'), tooltip: { - a0: t('core.proposalProcedure.governanceAction.technicalGroup.tooltip.a0'), - eMax: t('core.proposalProcedure.governanceAction.technicalGroup.tooltip.eMax'), - nOpt: t('core.proposalProcedure.governanceAction.technicalGroup.tooltip.nOpt'), - costModels: t('core.proposalProcedure.governanceAction.technicalGroup.tooltip.costModels'), - collateralPercentage: t('core.proposalProcedure.governanceAction.technicalGroup.tooltip.collateralPercentage') + a0: t('core.ProposalProcedure.governanceAction.technicalGroup.tooltip.a0'), + eMax: t('core.ProposalProcedure.governanceAction.technicalGroup.tooltip.eMax'), + nOpt: t('core.ProposalProcedure.governanceAction.technicalGroup.tooltip.nOpt'), + costModels: t('core.ProposalProcedure.governanceAction.technicalGroup.tooltip.costModels'), + collateralPercentage: t('core.ProposalProcedure.governanceAction.technicalGroup.tooltip.collateralPercentage') } }, governanceGroup: { - title: t('core.proposalProcedure.governanceAction.governanceGroup.title'), + title: t('core.ProposalProcedure.governanceAction.governanceGroup.title'), + govActionLifetime: t('core.ProposalProcedure.governanceAction.governanceGroup.govActionLifetime'), + govActionDeposit: t('core.ProposalProcedure.governanceAction.governanceGroup.govActionDeposit'), + drepDeposit: t('core.ProposalProcedure.governanceAction.governanceGroup.drepDeposit'), + drepActivity: t('core.ProposalProcedure.governanceAction.governanceGroup.drepActivity'), + ccMinSize: t('core.ProposalProcedure.governanceAction.governanceGroup.ccMinSize'), + ccMaxTermLength: t('core.ProposalProcedure.governanceAction.governanceGroup.ccMaxTermLength'), + dRepVotingThresholds: { + title: t('core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.title'), + motionNoConfidence: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.motionNoConfidence' + ), + committeeNormal: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.committeeNormal' + ), + committeeNoConfidence: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.committeeNoConfidence' + ), + updateConstitution: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.updateConstitution' + ), + hardForkInitiation: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.hardForkInitiation' + ), + ppNetworkGroup: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.ppNetworkGroup' + ), + ppEconomicGroup: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.ppEconomicGroup' + ), + ppTechnicalGroup: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.ppTechnicalGroup' + ), + ppGovernanceGroup: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.ppGovernanceGroup' + ), + treasuryWithdrawal: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.treasuryWithdrawal' + ) + }, tooltip: { - govActionLifetime: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.govActionLifetime'), - govActionDeposit: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.govActionDeposit'), - drepDeposit: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.drepDeposit'), - drepActivity: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.drepActivity'), - ccMinSize: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.ccMinSize'), - ccMaxTermLength: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.ccMaxTermLength'), + govActionLifetime: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.govActionLifetime'), + govActionDeposit: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.govActionDeposit'), + drepDeposit: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.drepDeposit'), + drepActivity: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.drepActivity'), + ccMinSize: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.ccMinSize'), + ccMaxTermLength: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.ccMaxTermLength'), dRepVotingThresholds: { - title: t('core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.title'), + title: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.title'), motionNoConfidence: t( - 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.motionNoConfidence' + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.motionNoConfidence' ), committeeNormal: t( - 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.committeeNormal' + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.committeeNormal' ), - commiteeNoConfidence: t( - 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.commiteeNoConfidence' + committeeNoConfidence: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.committeeNoConfidence' ), updateConstitution: t( - 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.updateConstitution' + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.updateConstitution' ), hardForkInitiation: t( - 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.hardForkInitiation' + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.hardForkInitiation' ), ppNetworkGroup: t( - 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppNetworkGroup' + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppNetworkGroup' ), ppEconomicGroup: t( - 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppEconomicGroup' + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppEconomicGroup' ), ppTechnicalGroup: t( - 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppTechnicalGroup' + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppTechnicalGroup' ), ppGovernanceGroup: t( - 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppGovernanceGroup' + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppGovernanceGroup' ), treasuryWithdrawal: t( - 'core.proposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.treasuryWithdrawal' + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.treasuryWithdrawal' ) } } @@ -183,32 +254,33 @@ export const ParameterChangeActionContainer = ({ } } = governanceAction; - const data = { - procedure: { + const data: Parameters[0]['data'] = { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.title'), deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, - rewardAccount, - ...(anchor.url && { - anchor: { - url: anchor.url, - hash: anchor.dataHash, - ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) - } - }) + rewardAccount }, + ...(anchor && { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } + }), protocolParamUpdate: { + maxTxExUnits: { + memory: maxExecutionUnitsPerTransaction.memory.toString(), + step: maxExecutionUnitsPerTransaction.steps.toString() + }, + maxBlockExUnits: { + memory: maxExecutionUnitsPerBlock.memory.toString(), + step: maxExecutionUnitsPerBlock.steps.toString() + }, networkGroup: { maxBBSize: maxBlockBodySize.toString(), maxTxSize: maxTxSize.toString(), maxBHSize: maxBlockHeaderSize.toString(), maxValSize: maxValueSize.toString(), - maxTxExUnits: { - memory: maxExecutionUnitsPerTransaction.memory.toString(), - step: maxExecutionUnitsPerTransaction.steps.toString() - }, - maxBlockExUnits: { - memory: maxExecutionUnitsPerBlock.memory.toString(), - step: maxExecutionUnitsPerBlock.steps.toString() - }, maxCollateralInputs: maxCollateralInputs.toString() }, economicGroup: { @@ -249,18 +321,16 @@ export const ParameterChangeActionContainer = ({ ccMinSize: minCommitteeSize.toString(), ccMaxTermLength: committeeTermLimit.toString(), dRepVotingThresholds: { - dvtMotionNoConfidence: formatPercentages(motionNoConfidence.numerator / motionNoConfidence.denominator), - dvtCommitteeNormal: formatPercentages(committeeNormal.numerator / committeeNormal.denominator), - dvtCommitteeNoConfidence: formatPercentages( - commiteeNoConfidence.numerator / commiteeNoConfidence.denominator - ), - dvtUpdateToConstitution: formatPercentages(updateConstitution.numerator / updateConstitution.denominator), - dvtHardForkInitiation: formatPercentages(hardForkInitiation.numerator / hardForkInitiation.denominator), - dvtPPNetworkGroup: formatPercentages(ppNetworkGroup.numerator / ppNetworkGroup.denominator), - dvtPPEconomicGroup: formatPercentages(ppEconomicGroup.numerator / ppEconomicGroup.denominator), - dvtPPTechnicalGroup: formatPercentages(ppTechnicalGroup.numerator / ppTechnicalGroup.denominator), - dvtPPGovGroup: formatPercentages(ppGovernanceGroup.numerator / ppGovernanceGroup.denominator), - dvtTreasuryWithdrawal: formatPercentages(treasuryWithdrawal.numerator / treasuryWithdrawal.denominator) + motionNoConfidence: formatPercentages(motionNoConfidence.numerator / motionNoConfidence.denominator), + committeeNormal: formatPercentages(committeeNormal.numerator / committeeNormal.denominator), + committeeNoConfidence: formatPercentages(commiteeNoConfidence.numerator / commiteeNoConfidence.denominator), + updateToConstitution: formatPercentages(updateConstitution.numerator / updateConstitution.denominator), + hardForkInitiation: formatPercentages(hardForkInitiation.numerator / hardForkInitiation.denominator), + ppNetworkGroup: formatPercentages(ppNetworkGroup.numerator / ppNetworkGroup.denominator), + ppEconomicGroup: formatPercentages(ppEconomicGroup.numerator / ppEconomicGroup.denominator), + ppTechnicalGroup: formatPercentages(ppTechnicalGroup.numerator / ppTechnicalGroup.denominator), + ppGovGroup: formatPercentages(ppGovernanceGroup.numerator / ppGovernanceGroup.denominator), + treasuryWithdrawal: formatPercentages(treasuryWithdrawal.numerator / treasuryWithdrawal.denominator) } } } diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/TreasuryWithdrawalsActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/TreasuryWithdrawalsActionContainer.tsx index 393be84434..e6c714aa64 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/TreasuryWithdrawalsActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/TreasuryWithdrawalsActionContainer.tsx @@ -30,21 +30,30 @@ export const TreasuryWithdrawalsActionContainer = ({ const explorerBaseUrl = useCExpolorerBaseUrl(); - const translations = useMemo( + const translations = useMemo[0]['translations']>( () => ({ + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType'), + deposit: t('core.ProposalProcedure.txDetails.deposit'), + rewardAccount: t('core.ProposalProcedure.txDetails.rewardAccount') + }, procedure: { - title: t('core.proposalProcedure.governanceAction.treasuryWithdrawals.title'), - deposit: t('core.proposalProcedure.procedure.deposit'), - rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + title: t('core.ProposalProcedure.procedure.title'), anchor: { - url: t('core.proposalProcedure.procedure.anchor.url'), - hash: t('core.proposalProcedure.procedure.anchor.hash') + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, + actionId: { + title: t('core.ProposalProcedure.governanceAction.actionId.title'), + index: t('core.ProposalProcedure.governanceAction.actionId.index'), + txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + }, withdrawals: { - title: t('core.proposalProcedure.governanceAction.treasuryWithdrawals.withdrawals.title'), - rewardAccount: t('core.proposalProcedure.governanceAction.treasuryWithdrawals.withdrawals.rewardAccount'), - lovelace: t('core.proposalProcedure.governanceAction.treasuryWithdrawals.withdrawals.lovelace') + title: t('core.ProposalProcedure.governanceAction.treasuryWithdrawals.title'), + rewardAccount: t('core.ProposalProcedure.governanceAction.treasuryWithdrawals.withdrawals.rewardAccount'), + lovelace: t('core.ProposalProcedure.governanceAction.treasuryWithdrawals.withdrawals.lovelace') } }), [t] @@ -52,11 +61,14 @@ export const TreasuryWithdrawalsActionContainer = ({ const { withdrawals } = governanceAction; - const data = { - procedure: { + const data: Parameters[0]['data'] = { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.treasuryWithdrawals.title'), deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, - rewardAccount, - ...(anchor.url && { + rewardAccount + }, + procedure: { + ...(anchor && { anchor: { url: anchor.url, hash: anchor.dataHash, diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/UpdateCommitteeActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/UpdateCommitteeActionContainer.tsx index c1aaed0b8d..b32ef34ce0 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/UpdateCommitteeActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/UpdateCommitteeActionContainer.tsx @@ -30,51 +30,57 @@ export const UpdateCommitteeActionContainer = ({ const explorerBaseUrl = useCExpolorerBaseUrl(); - const translations = useMemo( + const translations = useMemo[0]['translations']>( () => ({ + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType'), + deposit: t('core.ProposalProcedure.txDetails.deposit'), + rewardAccount: t('core.ProposalProcedure.txDetails.rewardAccount') + }, procedure: { - title: t('core.proposalProcedure.governanceAction.updateCommitteeAction.title'), - deposit: t('core.proposalProcedure.procedure.deposit'), - rewardAccount: t('core.proposalProcedure.procedure.rewardAccount'), + title: t('core.ProposalProcedure.procedure.title'), anchor: { - url: t('core.proposalProcedure.procedure.anchor.url'), - hash: t('core.proposalProcedure.procedure.anchor.hash') + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, + governanceAction: { + id: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.actionId.id'), + index: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.actionId.index') + }, actionId: { - title: t('core.proposalProcedure.governanceAction.actionId.title'), - index: t('core.proposalProcedure.governanceAction.actionId.index'), - txHash: t('core.proposalProcedure.governanceAction.actionId.txHash') + title: t('core.ProposalProcedure.governanceAction.actionId.title'), + index: t('core.ProposalProcedure.governanceAction.actionId.index'), + txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') }, membersToBeAdded: { - title: t('core.proposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.title'), + title: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.title'), coldCredential: { - hash: t('core.proposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.coldCredential.hash'), + hash: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.coldCredential.hash'), epoch: t( - 'core.proposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.coldCredential.epoch' + 'core.ProposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.coldCredential.epoch' ) } }, membersToBeRemoved: { - title: t('core.proposalProcedure.governanceAction.updateCommitteeAction.membersToBeRemoved.title'), - hash: t('core.proposalProcedure.governanceAction.updateCommitteeAction.membersToBeRemoved.hash') - }, - newQuorumThreshold: { - title: t('core.proposalProcedure.governanceAction.updateCommitteeAction.newQuorumThreshold.title'), - denominator: t('core.proposalProcedure.governanceAction.updateCommitteeAction.newQuorumThreshold.denominator'), - numerator: t('core.proposalProcedure.governanceAction.updateCommitteeAction.newQuorumThreshold.numerator') + title: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.membersToBeRemoved.title'), + hash: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.membersToBeRemoved.hash') } }), [t] ); - const { membersToBeAdded, membersToBeRemoved, newQuorumThreshold, governanceActionId } = governanceAction; + const { membersToBeAdded, membersToBeRemoved, governanceActionId } = governanceAction; - const data = { - procedure: { + const data: Parameters[0]['data'] = { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.title'), deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, - rewardAccount, - ...(anchor.url && { + rewardAccount + }, + procedure: { + ...(anchor && { anchor: { url: anchor.url, hash: anchor.dataHash, @@ -82,22 +88,19 @@ export const UpdateCommitteeActionContainer = ({ } }) }, - actionId: { - index: governanceActionId?.actionIndex || 0, - txHash: governanceActionId?.id || '', - ...(explorerBaseUrl && governanceActionId?.id && { txHashUrl: `${explorerBaseUrl}/${governanceActionId?.id}` }) - }, + ...(governanceActionId && { + governanceAction: { + index: governanceActionId.actionIndex.toString(), + id: governanceActionId.id || '' + } + }), membersToBeAdded: [...membersToBeAdded].map(({ coldCredential: { hash }, epoch }) => ({ coldCredential: { hash: hash.toString() }, epoch: epoch.toString() })), - membersToBeRemoved: [...membersToBeRemoved].map(({ hash }) => ({ hash: hash.toString() })), - newQuorumThreshold: { - denominator: newQuorumThreshold.denominator.toString(), - numerator: newQuorumThreshold.numerator.toString() - } + membersToBeRemoved: [...membersToBeRemoved].map(({ hash }) => ({ hash: hash.toString() })) }; return ( diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/HardForkInitiationActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/HardForkInitiationActionContainer.test.tsx new file mode 100644 index 0000000000..6b494d1565 --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/HardForkInitiationActionContainer.test.tsx @@ -0,0 +1,179 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-magic-numbers */ +/* eslint-disable import/imports-first */ +const cardanoCoinMock = { + symbol: 'cardanoCoinMockSymbol' +}; +const mockUseWalletStore = jest.fn(() => ({ + walletUI: { cardanoCoin: cardanoCoinMock }, + walletInfo: {} +})); +const t = jest.fn().mockImplementation((res) => res); +const mockUseTranslation = jest.fn(() => ({ t })); +const mockHardForkInitiationAction = jest.fn(() => ); +const mockLovelacesToAdaString = jest.fn((val) => val); +const mockedCExpolorerBaseUrl = 'mockedCExpolorerBaseUrl'; +const mockUseCExpolorerBaseUrl = jest.fn(() => mockedCExpolorerBaseUrl); +import { Wallet } from '@lace/cardano'; +import * as React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { act } from 'react-dom/test-utils'; +import { HardForkInitiationActionContainer } from '../HardForkInitiationActionContainer'; +import { getWrapper } from '../../testing.utils'; + +jest.mock('react-i18next', () => { + const original = jest.requireActual('react-i18next'); + return { + __esModule: true, + ...original, + useTranslation: mockUseTranslation + }; +}); + +jest.mock('@lace/core', () => { + const original = jest.requireActual('@lace/core'); + return { + __esModule: true, + ...original, + HardForkInitiationAction: mockHardForkInitiationAction + }; +}); + +jest.mock('@src/stores', () => ({ + ...jest.requireActual('@src/stores'), + useWalletStore: mockUseWalletStore +})); + +jest.mock('../../hooks', () => { + const original = jest.requireActual('../../hooks'); + return { + __esModule: true, + ...original, + useCExpolorerBaseUrl: mockUseCExpolorerBaseUrl + }; +}); + +jest.mock('@lace/cardano', () => { + const actual = jest.requireActual('@lace/cardano'); + return { + __esModule: true, + ...actual, + Wallet: { + ...actual.Wallet, + util: { + ...actual.Wallet.util, + lovelacesToAdaString: mockLovelacesToAdaString + } + } + }; +}); + +const dappInfo = { + name: 'dappName', + logo: 'dappLogo', + url: 'dappUrl' +}; +const errorMessage = 'errorMessage'; +const deposit = BigInt('10000'); +const rewardAccount = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); +const anchor = { + url: 'anchorUrl', + dataHash: Wallet.Crypto.Hash32ByteBase16(Buffer.from('anchorDataHashanchorDataHashanch').toString('hex')) +}; + +const hardForkInitiationAction = { + protocolVersion: { + major: 123, + minor: 234, + patch: 456 + }, + governanceActionId: { + actionIndex: 123, + id: Wallet.Cardano.TransactionId('724a0a88b9470a714fc5bf84daf5851fa259a9b89e1a5453f6f5cd6595ad9821') + }, + __typename: Wallet.Cardano.GovernanceActionType.hard_fork_initiation_action +} as Wallet.Cardano.HardForkInitiationAction; + +describe('Testing ProposalProceduresContainer component', () => { + afterEach(() => { + jest.clearAllMocks(); + cleanup(); + }); + + test('should render HardForkInitiationAction component with proper props', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render( + , + { + wrapper: getWrapper() + } + )); + }); + + expect(queryByTestId('HardForkInitiationAction')).toBeInTheDocument(); + expect(mockHardForkInitiationAction).toHaveBeenLastCalledWith( + { + dappInfo, + data: { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.hardForkInitiation.title'), + deposit: `${deposit.toString()} ${cardanoCoinMock.symbol}`, + rewardAccount + }, + procedure: { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + txHashUrl: `${mockedCExpolorerBaseUrl}/${anchor.dataHash}` + } + }, + protocolVersion: { + major: hardForkInitiationAction.protocolVersion.major.toString(), + minor: hardForkInitiationAction.protocolVersion.minor.toString(), + patch: hardForkInitiationAction.protocolVersion.patch?.toString() + }, + governanceAction: { + index: hardForkInitiationAction.governanceActionId.actionIndex.toString(), + id: hardForkInitiationAction.governanceActionId.id || '' + } + }, + translations: { + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType'), + deposit: t('core.ProposalProcedure.txDetails.deposit'), + rewardAccount: t('core.ProposalProcedure.txDetails.rewardAccount') + }, + procedure: { + title: t('core.ProposalProcedure.procedure.title'), + anchor: { + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') + } + }, + governanceAction: { + id: t('core.ProposalProcedure.governanceAction.hardForkInitiation.actionId.id'), + index: t('core.ProposalProcedure.governanceAction.hardForkInitiation.actionId.index') + }, + protocolVersion: { + major: t('core.ProposalProcedure.governanceAction.hardForkInitiation.protocolVersion.major'), + minor: t('core.ProposalProcedure.governanceAction.hardForkInitiation.protocolVersion.minor'), + patch: t('core.ProposalProcedure.governanceAction.hardForkInitiation.protocolVersion.patch') + }, + actionId: { + title: t('core.ProposalProcedure.governanceAction.actionId.title'), + index: t('core.ProposalProcedure.governanceAction.actionId.index'), + txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + } + }, + errorMessage + }, + {} + ); + }); +}); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/InfoActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/InfoActionContainer.test.tsx new file mode 100644 index 0000000000..244b14e4da --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/InfoActionContainer.test.tsx @@ -0,0 +1,119 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-magic-numbers */ +/* eslint-disable import/imports-first */ +const t = jest.fn().mockImplementation((res) => res); +const mockUseTranslation = jest.fn(() => ({ t })); +const mockInfoAction = jest.fn(() => ); +const mockedCExpolorerBaseUrl = 'mockedCExpolorerBaseUrl'; +const mockUseCExpolorerBaseUrl = jest.fn(() => mockedCExpolorerBaseUrl); +import { Wallet } from '@lace/cardano'; +import * as React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { act } from 'react-dom/test-utils'; +import { InfoActionContainer } from '../InfoActionContainer'; +import { getWrapper } from '../../testing.utils'; + +jest.mock('react-i18next', () => { + const original = jest.requireActual('react-i18next'); + return { + __esModule: true, + ...original, + useTranslation: mockUseTranslation + }; +}); + +jest.mock('@lace/core', () => { + const original = jest.requireActual('@lace/core'); + return { + __esModule: true, + ...original, + InfoAction: mockInfoAction + }; +}); + +jest.mock('../../hooks', () => { + const original = jest.requireActual('../../hooks'); + return { + __esModule: true, + ...original, + useCExpolorerBaseUrl: mockUseCExpolorerBaseUrl + }; +}); + +const dappInfo = { + name: 'dappName', + logo: 'dappLogo', + url: 'dappUrl' +}; +const errorMessage = 'errorMessage'; +const deposit = BigInt('10000'); +const rewardAccount = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); +const anchor = { + url: 'anchorUrl', + dataHash: Wallet.Crypto.Hash32ByteBase16(Buffer.from('anchorDataHashanchorDataHashanch').toString('hex')) +}; + +const infoAction = { + __typename: Wallet.Cardano.GovernanceActionType.info_action +} as Wallet.Cardano.InfoAction; + +describe('Testing ProposalProceduresContainer component', () => { + afterEach(() => { + jest.clearAllMocks(); + cleanup(); + }); + + test('should render InfoAction component with proper props', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render( + , + { + wrapper: getWrapper() + } + )); + }); + + expect(queryByTestId('InfoAction')).toBeInTheDocument(); + expect(mockInfoAction).toHaveBeenLastCalledWith( + { + dappInfo, + data: { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.infoAction.title') + }, + procedure: { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + txHashUrl: `${mockedCExpolorerBaseUrl}/${anchor.dataHash}` + } + } + }, + translations: { + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType') + }, + procedure: { + title: t('core.ProposalProcedure.procedure.title'), + anchor: { + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') + } + }, + actionId: { + index: t('core.ProposalProcedure.governanceAction.actionId.index'), + txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + } + }, + errorMessage + }, + {} + ); + }); +}); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NewConstitutionActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NewConstitutionActionContainer.test.tsx new file mode 100644 index 0000000000..690c78b484 --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NewConstitutionActionContainer.test.tsx @@ -0,0 +1,183 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-magic-numbers */ +/* eslint-disable import/imports-first */ +const cardanoCoinMock = { + symbol: 'cardanoCoinMockSymbol' +}; +const mockUseWalletStore = jest.fn(() => ({ + walletUI: { cardanoCoin: cardanoCoinMock }, + walletInfo: {} +})); +const t = jest.fn().mockImplementation((res) => res); +const mockUseTranslation = jest.fn(() => ({ t })); +const mockNewConstitutionAction = jest.fn(() => ); +const mockLovelacesToAdaString = jest.fn((val) => val); +const mockedCExpolorerBaseUrl = 'mockedCExpolorerBaseUrl'; +const mockUseCExpolorerBaseUrl = jest.fn(() => mockedCExpolorerBaseUrl); +import { Wallet } from '@lace/cardano'; +import * as React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { act } from 'react-dom/test-utils'; +import { NewConstitutionActionContainer } from '../NewConstitutionActionContainer'; +import { getWrapper } from '../../testing.utils'; + +jest.mock('react-i18next', () => { + const original = jest.requireActual('react-i18next'); + return { + __esModule: true, + ...original, + useTranslation: mockUseTranslation + }; +}); + +jest.mock('@lace/core', () => { + const original = jest.requireActual('@lace/core'); + return { + __esModule: true, + ...original, + NewConstitutionAction: mockNewConstitutionAction + }; +}); + +jest.mock('@src/stores', () => ({ + ...jest.requireActual('@src/stores'), + useWalletStore: mockUseWalletStore +})); + +jest.mock('../../hooks', () => { + const original = jest.requireActual('../../hooks'); + return { + __esModule: true, + ...original, + useCExpolorerBaseUrl: mockUseCExpolorerBaseUrl + }; +}); + +jest.mock('@lace/cardano', () => { + const actual = jest.requireActual('@lace/cardano'); + return { + __esModule: true, + ...actual, + Wallet: { + ...actual.Wallet, + util: { + ...actual.Wallet.util, + lovelacesToAdaString: mockLovelacesToAdaString + } + } + }; +}); + +const dappInfo = { + name: 'dappName', + logo: 'dappLogo', + url: 'dappUrl' +}; +const errorMessage = 'errorMessage'; +const deposit = BigInt('10000'); +const rewardAccount = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); +const anchor = { + url: 'anchorUrl', + dataHash: Wallet.Crypto.Hash32ByteBase16(Buffer.from('anchorDataHashanchorDataHashanch').toString('hex')) +}; + +const newConstitution = { + __typename: Wallet.Cardano.GovernanceActionType.new_constitution, + constitution: { + anchor, + scriptHash: Wallet.Crypto.Hash28ByteBase16(Buffer.from('newConstitutionscriptHashnew').toString('hex')) + }, + governanceActionId: { + actionIndex: 123, + id: Wallet.Cardano.TransactionId('724a0a88b9470a714fc5bf84daf5851fa259a9b89e1a5453f6f5cd6595ad9821') + } +} as Wallet.Cardano.NewConstitution; + +describe('Testing ProposalProceduresContainer component', () => { + afterEach(() => { + jest.clearAllMocks(); + cleanup(); + }); + + test('should render NewConstitutionAction component with proper props', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render( + , + { + wrapper: getWrapper() + } + )); + }); + + expect(queryByTestId('NewConstitutionAction')).toBeInTheDocument(); + expect(mockNewConstitutionAction).toHaveBeenLastCalledWith( + { + dappInfo, + data: { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.newConstitutionAction.title'), + deposit: `${deposit.toString()} ${cardanoCoinMock.symbol}`, + rewardAccount + }, + procedure: { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + txHashUrl: `${mockedCExpolorerBaseUrl}/${anchor.dataHash}` + } + }, + governanceAction: { + index: newConstitution.governanceActionId.actionIndex.toString(), + id: newConstitution.governanceActionId.id || '' + }, + constitution: { + anchor: { + dataHash: newConstitution.constitution.anchor.dataHash.toString(), + url: newConstitution.constitution.anchor.url.toString() + }, + scriptHash: newConstitution.constitution.scriptHash.toString() + } + }, + translations: { + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType'), + deposit: t('core.ProposalProcedure.txDetails.deposit'), + rewardAccount: t('core.ProposalProcedure.txDetails.rewardAccount') + }, + procedure: { + title: t('core.ProposalProcedure.procedure.title'), + anchor: { + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') + } + }, + governanceAction: { + id: t('core.ProposalProcedure.governanceAction.newConstitutionAction.actionId.id'), + index: t('core.ProposalProcedure.governanceAction.newConstitutionAction.actionId.index') + }, + constitution: { + title: t('core.ProposalProcedure.governanceAction.newConstitutionAction.constitution.title'), + anchor: { + dataHash: t('core.ProposalProcedure.governanceAction.newConstitutionAction.constitution.anchor.dataHash'), + url: t('core.ProposalProcedure.governanceAction.newConstitutionAction.constitution.anchor.url') + }, + scriptHash: t('core.ProposalProcedure.governanceAction.newConstitutionAction.constitution.scriptHash') + }, + actionId: { + title: t('core.ProposalProcedure.governanceAction.actionId.title'), + index: t('core.ProposalProcedure.governanceAction.actionId.index'), + txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + } + }, + errorMessage + }, + {} + ); + }); +}); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NoConfidenceActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NoConfidenceActionContainer.test.tsx new file mode 100644 index 0000000000..b9a4f8411f --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NoConfidenceActionContainer.test.tsx @@ -0,0 +1,164 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-magic-numbers */ +/* eslint-disable import/imports-first */ +const cardanoCoinMock = { + symbol: 'cardanoCoinMockSymbol' +}; +const mockUseWalletStore = jest.fn(() => ({ + walletUI: { cardanoCoin: cardanoCoinMock }, + walletInfo: {} +})); +const t = jest.fn().mockImplementation((res) => res); +const mockUseTranslation = jest.fn(() => ({ t })); +const mockNoConfidenceAction = jest.fn(() => ); +const mockLovelacesToAdaString = jest.fn((val) => val); +const mockedCExpolorerBaseUrl = 'mockedCExpolorerBaseUrl'; +const mockUseCExpolorerBaseUrl = jest.fn(() => mockedCExpolorerBaseUrl); +import { Wallet } from '@lace/cardano'; +import * as React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { act } from 'react-dom/test-utils'; +import { NoConfidenceActionContainer } from '../NoConfidenceActionContainer'; +import { getWrapper } from '../../testing.utils'; + +jest.mock('react-i18next', () => { + const original = jest.requireActual('react-i18next'); + return { + __esModule: true, + ...original, + useTranslation: mockUseTranslation + }; +}); + +jest.mock('@lace/core', () => { + const original = jest.requireActual('@lace/core'); + return { + __esModule: true, + ...original, + NoConfidenceAction: mockNoConfidenceAction + }; +}); + +jest.mock('@src/stores', () => ({ + ...jest.requireActual('@src/stores'), + useWalletStore: mockUseWalletStore +})); + +jest.mock('../../hooks', () => { + const original = jest.requireActual('../../hooks'); + return { + __esModule: true, + ...original, + useCExpolorerBaseUrl: mockUseCExpolorerBaseUrl + }; +}); + +jest.mock('@lace/cardano', () => { + const actual = jest.requireActual('@lace/cardano'); + return { + __esModule: true, + ...actual, + Wallet: { + ...actual.Wallet, + util: { + ...actual.Wallet.util, + lovelacesToAdaString: mockLovelacesToAdaString + } + } + }; +}); + +const dappInfo = { + name: 'dappName', + logo: 'dappLogo', + url: 'dappUrl' +}; +const errorMessage = 'errorMessage'; +const deposit = BigInt('10000'); +const rewardAccount = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); +const anchor = { + url: 'anchorUrl', + dataHash: Wallet.Crypto.Hash32ByteBase16(Buffer.from('anchorDataHashanchorDataHashanch').toString('hex')) +}; + +const noConfidence = { + __typename: Wallet.Cardano.GovernanceActionType.no_confidence, + governanceActionId: { + actionIndex: 123, + id: Wallet.Cardano.TransactionId('724a0a88b9470a714fc5bf84daf5851fa259a9b89e1a5453f6f5cd6595ad9821') + } +} as Wallet.Cardano.NoConfidence; + +describe('Testing ProposalProceduresContainer component', () => { + afterEach(() => { + jest.clearAllMocks(); + cleanup(); + }); + + test('should render NoConfidenceAction component with proper props', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render( + , + { + wrapper: getWrapper() + } + )); + }); + + expect(queryByTestId('NoConfidenceAction')).toBeInTheDocument(); + expect(mockNoConfidenceAction).toHaveBeenLastCalledWith( + { + dappInfo, + data: { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.noConfidenceAction.title'), + deposit: `${deposit.toString()} ${cardanoCoinMock.symbol}`, + rewardAccount + }, + procedure: { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + txHashUrl: `${mockedCExpolorerBaseUrl}/${anchor.dataHash}` + } + }, + governanceAction: { + index: noConfidence.governanceActionId.actionIndex.toString(), + id: noConfidence.governanceActionId.id || '' + } + }, + translations: { + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType'), + deposit: t('core.ProposalProcedure.txDetails.deposit'), + rewardAccount: t('core.ProposalProcedure.txDetails.rewardAccount') + }, + procedure: { + title: t('core.ProposalProcedure.procedure.title'), + anchor: { + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') + } + }, + governanceAction: { + id: t('core.ProposalProcedure.governanceAction.noConfidenceAction.actionId.id'), + index: t('core.ProposalProcedure.governanceAction.noConfidenceAction.actionId.index') + }, + actionId: { + title: t('core.ProposalProcedure.governanceAction.actionId.title'), + index: t('core.ProposalProcedure.governanceAction.actionId.index'), + txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + } + }, + errorMessage + }, + {} + ); + }); +}); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/ParameterChangeActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/ParameterChangeActionContainer.test.tsx new file mode 100644 index 0000000000..b0f46f2293 --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/ParameterChangeActionContainer.test.tsx @@ -0,0 +1,504 @@ +/* eslint-disable unicorn/no-array-reduce */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-magic-numbers */ +/* eslint-disable import/imports-first */ +const cardanoCoinMock = { + symbol: 'cardanoCoinMockSymbol' +}; +const mockUseWalletStore = jest.fn(() => ({ + walletUI: { cardanoCoin: cardanoCoinMock }, + walletInfo: {} +})); +const t = jest.fn().mockImplementation((res) => res); +const mockUseTranslation = jest.fn(() => ({ t })); +const mockParameterChangeAction = jest.fn(() => ); +const mockLovelacesToAdaString = jest.fn((val) => val); +const mockedCExpolorerBaseUrl = 'mockedCExpolorerBaseUrl'; +const mockUseCExpolorerBaseUrl = jest.fn(() => mockedCExpolorerBaseUrl); +import { Wallet } from '@lace/cardano'; +import * as React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { act } from 'react-dom/test-utils'; +import { ParameterChangeActionContainer } from '../ParameterChangeActionContainer'; +import { formatPercentages } from '@lace/common'; +import { getWrapper } from '../../testing.utils'; + +jest.mock('react-i18next', () => { + const original = jest.requireActual('react-i18next'); + return { + __esModule: true, + ...original, + useTranslation: mockUseTranslation + }; +}); + +jest.mock('@lace/core', () => { + const original = jest.requireActual('@lace/core'); + return { + __esModule: true, + ...original, + ParameterChangeAction: mockParameterChangeAction + }; +}); + +jest.mock('@src/stores', () => ({ + ...jest.requireActual('@src/stores'), + useWalletStore: mockUseWalletStore +})); + +jest.mock('../../hooks', () => { + const original = jest.requireActual('../../hooks'); + return { + __esModule: true, + ...original, + useCExpolorerBaseUrl: mockUseCExpolorerBaseUrl + }; +}); + +jest.mock('@lace/cardano', () => { + const actual = jest.requireActual('@lace/cardano'); + return { + __esModule: true, + ...actual, + Wallet: { + ...actual.Wallet, + util: { + ...actual.Wallet.util, + lovelacesToAdaString: mockLovelacesToAdaString + } + } + }; +}); + +const dappInfo = { + name: 'dappName', + logo: 'dappLogo', + url: 'dappUrl' +}; +const errorMessage = 'errorMessage'; +const deposit = BigInt('10000'); +const rewardAccount = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); +const anchor = { + url: 'anchorUrl', + dataHash: Wallet.Crypto.Hash32ByteBase16(Buffer.from('anchorDataHashanchorDataHashanch').toString('hex')) +}; + +const parameterChangeAction = { + protocolParamUpdate: { + maxBlockBodySize: 1, + maxTxSize: 2, + maxBlockHeaderSize: 3, + maxValueSize: 4, + maxExecutionUnitsPerTransaction: { + memory: 5, + steps: 6 + }, + maxExecutionUnitsPerBlock: { + memory: 7, + steps: 8 + }, + maxCollateralInputs: 9, + stakeKeyDeposit: 10, + poolDeposit: 11, + minFeeCoefficient: 12, + minFeeConstant: 13, + treasuryExpansion: '14', + monetaryExpansion: '15', + minPoolCost: 16, + coinsPerUtxoByte: 17, + prices: { + memory: 18, + steps: 19 + }, + poolInfluence: '20', + poolRetirementEpochBound: 21, + desiredNumberOfPools: 22, + costModels: new Map([ + [0, [23, 24]], + [1, [25, 26]] + ]), + collateralPercentage: 27, + governanceActionDeposit: 28, + dRepDeposit: 29, + governanceActionValidityPeriod: 30, + dRepInactivityPeriod: 31, + minCommitteeSize: 32, + committeeTermLimit: 33, + dRepVotingThresholds: { + motionNoConfidence: { + numerator: 34, + denominator: 35 + }, + committeeNormal: { + numerator: 36, + denominator: 37 + }, + commiteeNoConfidence: { + numerator: 38, + denominator: 39 + }, + updateConstitution: { + numerator: 40, + denominator: 41 + }, + hardForkInitiation: { + numerator: 42, + denominator: 43 + }, + ppNetworkGroup: { + numerator: 44, + denominator: 45 + }, + ppEconomicGroup: { + numerator: 46, + denominator: 47 + }, + ppTechnicalGroup: { + numerator: 48, + denominator: 49 + }, + ppGovernanceGroup: { + numerator: 50, + denominator: 51 + }, + treasuryWithdrawal: { + numerator: 55, + denominator: 56 + } + } + }, + governanceActionId: { + actionIndex: 123, + id: Wallet.Cardano.TransactionId('724a0a88b9470a714fc5bf84daf5851fa259a9b89e1a5453f6f5cd6595ad9821') + }, + __typename: Wallet.Cardano.GovernanceActionType.parameter_change_action +} as Wallet.Cardano.ParameterChangeAction; + +describe('Testing ProposalProceduresContainer component', () => { + afterEach(() => { + jest.clearAllMocks(); + cleanup(); + }); + + test('should render ParameterChangeAction component with proper props', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render( + , + { + wrapper: getWrapper() + } + )); + }); + + expect(queryByTestId('ParameterChangeAction')).toBeInTheDocument(); + expect(mockParameterChangeAction).toHaveBeenLastCalledWith( + { + dappInfo, + data: { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.title'), + deposit: `${deposit.toString()} ${cardanoCoinMock.symbol}`, + rewardAccount + }, + anchor: { + url: anchor.url, + hash: anchor.dataHash, + txHashUrl: `${mockedCExpolorerBaseUrl}/${anchor.dataHash}` + }, + protocolParamUpdate: { + maxTxExUnits: { + memory: parameterChangeAction.protocolParamUpdate.maxExecutionUnitsPerTransaction.memory.toString(), + step: parameterChangeAction.protocolParamUpdate.maxExecutionUnitsPerTransaction.steps.toString() + }, + maxBlockExUnits: { + memory: parameterChangeAction.protocolParamUpdate.maxExecutionUnitsPerBlock.memory.toString(), + step: parameterChangeAction.protocolParamUpdate.maxExecutionUnitsPerBlock.steps.toString() + }, + networkGroup: { + maxBBSize: parameterChangeAction.protocolParamUpdate.maxBlockBodySize.toString(), + maxTxSize: parameterChangeAction.protocolParamUpdate.maxTxSize.toString(), + maxBHSize: parameterChangeAction.protocolParamUpdate.maxBlockHeaderSize.toString(), + maxValSize: parameterChangeAction.protocolParamUpdate.maxValueSize.toString(), + maxCollateralInputs: parameterChangeAction.protocolParamUpdate.maxCollateralInputs.toString() + }, + economicGroup: { + minFeeA: parameterChangeAction.protocolParamUpdate.minFeeCoefficient.toString(), + minFeeB: parameterChangeAction.protocolParamUpdate.minFeeConstant.toString(), + keyDeposit: parameterChangeAction.protocolParamUpdate.stakeKeyDeposit.toString(), + poolDeposit: parameterChangeAction.protocolParamUpdate.poolDeposit.toString(), + rho: parameterChangeAction.protocolParamUpdate.monetaryExpansion, + tau: parameterChangeAction.protocolParamUpdate.treasuryExpansion, + minPoolCost: parameterChangeAction.protocolParamUpdate.minPoolCost.toString(), + coinsPerUTxOByte: parameterChangeAction.protocolParamUpdate.coinsPerUtxoByte.toString(), + price: { + memory: parameterChangeAction.protocolParamUpdate.prices.memory.toString(), + step: parameterChangeAction.protocolParamUpdate.prices.steps.toString() + } + }, + technicalGroup: { + a0: parameterChangeAction.protocolParamUpdate.poolInfluence, + eMax: parameterChangeAction.protocolParamUpdate.poolRetirementEpochBound.toString(), + nOpt: parameterChangeAction.protocolParamUpdate.desiredNumberOfPools.toString(), + costModels: { + PlutusV1: Object.entries( + parameterChangeAction.protocolParamUpdate.costModels.get(Wallet.Cardano.PlutusLanguageVersion.V1) + ).reduce((acc, cur) => ({ ...acc, [cur[0]]: cur[1] }), {}), + PlutusV2: Object.entries( + parameterChangeAction.protocolParamUpdate.costModels.get(Wallet.Cardano.PlutusLanguageVersion.V2) + ).reduce((acc, cur) => ({ ...acc, [cur[0]]: cur[1] }), {}) + }, + collateralPercentage: parameterChangeAction.protocolParamUpdate.collateralPercentage.toString() + }, + governanceGroup: { + govActionLifetime: parameterChangeAction.protocolParamUpdate.governanceActionValidityPeriod.toString(), + govActionDeposit: parameterChangeAction.protocolParamUpdate.governanceActionDeposit.toString(), + drepDeposit: parameterChangeAction.protocolParamUpdate.dRepDeposit.toString(), + drepActivity: parameterChangeAction.protocolParamUpdate.dRepInactivityPeriod.toString(), + ccMinSize: parameterChangeAction.protocolParamUpdate.minCommitteeSize.toString(), + ccMaxTermLength: parameterChangeAction.protocolParamUpdate.committeeTermLimit.toString(), + dRepVotingThresholds: { + motionNoConfidence: formatPercentages( + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.motionNoConfidence.numerator / + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.motionNoConfidence.denominator + ), + committeeNormal: formatPercentages( + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.committeeNormal.numerator / + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.committeeNormal.denominator + ), + committeeNoConfidence: formatPercentages( + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.commiteeNoConfidence.numerator / + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.commiteeNoConfidence.denominator + ), + updateToConstitution: formatPercentages( + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.updateConstitution.numerator / + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.updateConstitution.denominator + ), + hardForkInitiation: formatPercentages( + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.hardForkInitiation.numerator / + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.hardForkInitiation.denominator + ), + ppNetworkGroup: formatPercentages( + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.ppNetworkGroup.numerator / + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.ppNetworkGroup.denominator + ), + ppEconomicGroup: formatPercentages( + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.ppEconomicGroup.numerator / + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.ppEconomicGroup.denominator + ), + ppTechnicalGroup: formatPercentages( + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.ppTechnicalGroup.numerator / + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.ppTechnicalGroup.denominator + ), + ppGovGroup: formatPercentages( + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.ppGovernanceGroup.numerator / + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.ppGovernanceGroup.denominator + ), + treasuryWithdrawal: formatPercentages( + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.treasuryWithdrawal.numerator / + parameterChangeAction.protocolParamUpdate.dRepVotingThresholds.treasuryWithdrawal.denominator + ) + } + } + } + }, + translations: { + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType'), + deposit: t('core.ProposalProcedure.txDetails.deposit'), + rewardAccount: t('core.ProposalProcedure.txDetails.rewardAccount') + }, + anchor: { + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') + }, + memory: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.memory'), + step: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.step'), + networkGroup: { + title: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.title'), + maxBBSize: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxBBSize'), + maxTxSize: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxTxSize'), + maxBHSize: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxBHSize'), + maxValSize: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxValSize'), + maxTxExUnits: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxTxExUnits'), + maxBlockExUnits: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxBlockExUnits' + ), + maxCollateralInputs: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.maxCollateralInputs' + ), + coinsByUTXOByte: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.coinsByUTXOByte' + ), + tooltip: { + maxBBSize: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxBBSize' + ), + maxTxSize: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxTxSize' + ), + maxBHSize: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxBHSize' + ), + maxValSize: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxValSize' + ), + maxTxExUnits: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxTxExUnits' + ), + maxBlockExUnits: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxBlockExUnits' + ), + maxCollateralInputs: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.maxCollateralInputs' + ), + coinsByUTXOByte: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.networkGroup.tooltip.coinsByUTXOByte' + ) + } + }, + economicGroup: { + title: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.title'), + minFeeA: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.minFeeA'), + minFeeB: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.minFeeB'), + keyDeposit: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.keyDeposit'), + poolDeposit: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.poolDeposit'), + rho: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.rho'), + tau: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tau'), + minPoolCost: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.minPoolCost'), + coinsPerUTxOByte: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.coinsPerUTxOByte' + ), + prices: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.prices'), + tooltip: { + minFeeA: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.minFeeA'), + minFeeB: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.minFeeB'), + keyDeposit: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.keyDeposit' + ), + poolDeposit: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.poolDeposit' + ), + rho: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.rho'), + tau: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.tau'), + minPoolCost: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.minPoolCost' + ), + coinsPerUTxOByte: t( + 'core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.coinsPerUTxOByte' + ), + prices: t('core.ProposalProcedure.governanceAction.protocolParamUpdate.economicGroup.tooltip.prices') + } + }, + technicalGroup: { + title: t('core.ProposalProcedure.governanceAction.technicalGroup.title'), + a0: t('core.ProposalProcedure.governanceAction.technicalGroup.a0'), + eMax: t('core.ProposalProcedure.governanceAction.technicalGroup.eMax'), + nOpt: t('core.ProposalProcedure.governanceAction.technicalGroup.nOpt'), + costModels: t('core.ProposalProcedure.governanceAction.technicalGroup.costModels'), + collateralPercentage: t('core.ProposalProcedure.governanceAction.technicalGroup.collateralPercentage'), + tooltip: { + a0: t('core.ProposalProcedure.governanceAction.technicalGroup.tooltip.a0'), + eMax: t('core.ProposalProcedure.governanceAction.technicalGroup.tooltip.eMax'), + nOpt: t('core.ProposalProcedure.governanceAction.technicalGroup.tooltip.nOpt'), + costModels: t('core.ProposalProcedure.governanceAction.technicalGroup.tooltip.costModels'), + collateralPercentage: t( + 'core.ProposalProcedure.governanceAction.technicalGroup.tooltip.collateralPercentage' + ) + } + }, + governanceGroup: { + title: t('core.ProposalProcedure.governanceAction.governanceGroup.title'), + govActionLifetime: t('core.ProposalProcedure.governanceAction.governanceGroup.govActionLifetime'), + govActionDeposit: t('core.ProposalProcedure.governanceAction.governanceGroup.govActionDeposit'), + drepDeposit: t('core.ProposalProcedure.governanceAction.governanceGroup.drepDeposit'), + drepActivity: t('core.ProposalProcedure.governanceAction.governanceGroup.drepActivity'), + ccMinSize: t('core.ProposalProcedure.governanceAction.governanceGroup.ccMinSize'), + ccMaxTermLength: t('core.ProposalProcedure.governanceAction.governanceGroup.ccMaxTermLength'), + dRepVotingThresholds: { + title: t('core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.title'), + motionNoConfidence: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.motionNoConfidence' + ), + committeeNormal: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.committeeNormal' + ), + committeeNoConfidence: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.committeeNoConfidence' + ), + updateConstitution: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.updateConstitution' + ), + hardForkInitiation: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.hardForkInitiation' + ), + ppNetworkGroup: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.ppNetworkGroup' + ), + ppEconomicGroup: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.ppEconomicGroup' + ), + ppTechnicalGroup: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.ppTechnicalGroup' + ), + ppGovernanceGroup: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.ppGovernanceGroup' + ), + treasuryWithdrawal: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.dRepVotingThresholds.treasuryWithdrawal' + ) + }, + tooltip: { + govActionLifetime: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.govActionLifetime'), + govActionDeposit: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.govActionDeposit'), + drepDeposit: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.drepDeposit'), + drepActivity: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.drepActivity'), + ccMinSize: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.ccMinSize'), + ccMaxTermLength: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.ccMaxTermLength'), + dRepVotingThresholds: { + title: t('core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.title'), + motionNoConfidence: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.motionNoConfidence' + ), + committeeNormal: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.committeeNormal' + ), + committeeNoConfidence: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.committeeNoConfidence' + ), + updateConstitution: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.updateConstitution' + ), + hardForkInitiation: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.hardForkInitiation' + ), + ppNetworkGroup: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppNetworkGroup' + ), + ppEconomicGroup: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppEconomicGroup' + ), + ppTechnicalGroup: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppTechnicalGroup' + ), + ppGovernanceGroup: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.ppGovernanceGroup' + ), + treasuryWithdrawal: t( + 'core.ProposalProcedure.governanceAction.governanceGroup.tooltip.dRepVotingThresholds.treasuryWithdrawal' + ) + } + } + } + }, + errorMessage + }, + {} + ); + }); +}); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/TreasuryWithdrawalsActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/TreasuryWithdrawalsActionContainer.test.tsx new file mode 100644 index 0000000000..b7a9f868db --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/TreasuryWithdrawalsActionContainer.test.tsx @@ -0,0 +1,165 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-magic-numbers */ +/* eslint-disable import/imports-first */ +const cardanoCoinMock = { + symbol: 'cardanoCoinMockSymbol' +}; +const mockUseWalletStore = jest.fn(() => ({ + walletUI: { cardanoCoin: cardanoCoinMock }, + walletInfo: {} +})); +const t = jest.fn().mockImplementation((res) => res); +const mockUseTranslation = jest.fn(() => ({ t })); +const mockTreasuryWithdrawalsAction = jest.fn(() => ); +const mockLovelacesToAdaString = jest.fn((val) => val); +const mockedCExpolorerBaseUrl = 'mockedCExpolorerBaseUrl'; +const mockUseCExpolorerBaseUrl = jest.fn(() => mockedCExpolorerBaseUrl); +import { Wallet } from '@lace/cardano'; +import * as React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { act } from 'react-dom/test-utils'; +import { TreasuryWithdrawalsActionContainer } from '../TreasuryWithdrawalsActionContainer'; +import { getWrapper } from '../../testing.utils'; + +jest.mock('react-i18next', () => { + const original = jest.requireActual('react-i18next'); + return { + __esModule: true, + ...original, + useTranslation: mockUseTranslation + }; +}); + +jest.mock('@lace/core', () => { + const original = jest.requireActual('@lace/core'); + return { + __esModule: true, + ...original, + TreasuryWithdrawalsAction: mockTreasuryWithdrawalsAction + }; +}); + +jest.mock('@src/stores', () => ({ + ...jest.requireActual('@src/stores'), + useWalletStore: mockUseWalletStore +})); + +jest.mock('../../hooks', () => { + const original = jest.requireActual('../../hooks'); + return { + __esModule: true, + ...original, + useCExpolorerBaseUrl: mockUseCExpolorerBaseUrl + }; +}); + +jest.mock('@lace/cardano', () => { + const actual = jest.requireActual('@lace/cardano'); + return { + __esModule: true, + ...actual, + Wallet: { + ...actual.Wallet, + util: { + ...actual.Wallet.util, + lovelacesToAdaString: mockLovelacesToAdaString + } + } + }; +}); + +const dappInfo = { + name: 'dappName', + logo: 'dappLogo', + url: 'dappUrl' +}; +const errorMessage = 'errorMessage'; +const deposit = BigInt('10000'); +const rewardAccount = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); +const anchor = { + url: 'anchorUrl', + dataHash: Wallet.Crypto.Hash32ByteBase16(Buffer.from('anchorDataHashanchorDataHashanch').toString('hex')) +}; + +const treasuryWithdrawalsAction = { + withdrawals: new Set([ + { rewardAccount, coin: BigInt('10000000') }, + { rewardAccount, coin: BigInt('10000001') } + ]), + __typename: Wallet.Cardano.GovernanceActionType.treasury_withdrawals_action +} as Wallet.Cardano.TreasuryWithdrawalsAction; + +describe('Testing ProposalProceduresContainer component', () => { + afterEach(() => { + jest.clearAllMocks(); + cleanup(); + }); + + test('should render TreasuryWithdrawalsAction component with proper props', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render( + , + { + wrapper: getWrapper() + } + )); + }); + + expect(queryByTestId('TreasuryWithdrawalsAction')).toBeInTheDocument(); + expect(mockTreasuryWithdrawalsAction).toHaveBeenLastCalledWith( + { + dappInfo, + data: { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.treasuryWithdrawals.title'), + deposit: `${deposit.toString()} ${cardanoCoinMock.symbol}`, + rewardAccount + }, + procedure: { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + txHashUrl: `${mockedCExpolorerBaseUrl}/${anchor.dataHash}` + } + }, + withdrawals: [...treasuryWithdrawalsAction.withdrawals].map((withdrawal) => ({ + rewardAccount: withdrawal.rewardAccount.toString(), + lovelace: withdrawal.coin.toString() + })) + }, + translations: { + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType'), + deposit: t('core.ProposalProcedure.txDetails.deposit'), + rewardAccount: t('core.ProposalProcedure.txDetails.rewardAccount') + }, + procedure: { + title: t('core.ProposalProcedure.procedure.title'), + anchor: { + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') + } + }, + actionId: { + title: t('core.ProposalProcedure.governanceAction.actionId.title'), + index: t('core.ProposalProcedure.governanceAction.actionId.index'), + txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + }, + withdrawals: { + title: t('core.ProposalProcedure.governanceAction.treasuryWithdrawals.title'), + rewardAccount: t('core.ProposalProcedure.governanceAction.treasuryWithdrawals.withdrawals.rewardAccount'), + lovelace: t('core.ProposalProcedure.governanceAction.treasuryWithdrawals.withdrawals.lovelace') + } + }, + errorMessage + }, + {} + ); + }); +}); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/UpdateCommitteeActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/UpdateCommitteeActionContainer.test.tsx new file mode 100644 index 0000000000..b710109aa1 --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/UpdateCommitteeActionContainer.test.tsx @@ -0,0 +1,212 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-magic-numbers */ +/* eslint-disable import/imports-first */ +const cardanoCoinMock = { + symbol: 'cardanoCoinMockSymbol' +}; +const mockUseWalletStore = jest.fn(() => ({ + walletUI: { cardanoCoin: cardanoCoinMock }, + walletInfo: {} +})); +const t = jest.fn().mockImplementation((res) => res); +const mockUseTranslation = jest.fn(() => ({ t })); +const mockUpdateCommitteeAction = jest.fn(() => ); +const mockLovelacesToAdaString = jest.fn((val) => val); +const mockedCExpolorerBaseUrl = 'mockedCExpolorerBaseUrl'; +const mockUseCExpolorerBaseUrl = jest.fn(() => mockedCExpolorerBaseUrl); +import { Wallet } from '@lace/cardano'; +import * as React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { act } from 'react-dom/test-utils'; +import { UpdateCommitteeActionContainer } from '../UpdateCommitteeActionContainer'; +import { getWrapper } from '../../testing.utils'; + +jest.mock('react-i18next', () => { + const original = jest.requireActual('react-i18next'); + return { + __esModule: true, + ...original, + useTranslation: mockUseTranslation + }; +}); + +jest.mock('@lace/core', () => { + const original = jest.requireActual('@lace/core'); + return { + __esModule: true, + ...original, + UpdateCommitteeAction: mockUpdateCommitteeAction + }; +}); + +jest.mock('@src/stores', () => ({ + ...jest.requireActual('@src/stores'), + useWalletStore: mockUseWalletStore +})); + +jest.mock('../../hooks', () => { + const original = jest.requireActual('../../hooks'); + return { + __esModule: true, + ...original, + useCExpolorerBaseUrl: mockUseCExpolorerBaseUrl + }; +}); + +jest.mock('@lace/cardano', () => { + const actual = jest.requireActual('@lace/cardano'); + return { + __esModule: true, + ...actual, + Wallet: { + ...actual.Wallet, + util: { + ...actual.Wallet.util, + lovelacesToAdaString: mockLovelacesToAdaString + } + } + }; +}); + +const dappInfo = { + name: 'dappName', + logo: 'dappLogo', + url: 'dappUrl' +}; +const errorMessage = 'errorMessage'; +const deposit = BigInt('10000'); +const rewardAccount = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); +const anchor = { + url: 'anchorUrl', + dataHash: Wallet.Crypto.Hash32ByteBase16(Buffer.from('anchorDataHashanchorDataHashanch').toString('hex')) +}; + +const updateCommittee = { + membersToBeAdded: new Set([ + { + coldCredential: { + type: 0, + hash: Wallet.Crypto.Hash28ByteBase16(Buffer.from('updateCommitteecoldCredenti1').toString('hex')) + }, + epoch: 1 + }, + { + coldCredential: { + type: 1, + hash: Wallet.Crypto.Hash28ByteBase16(Buffer.from('updateCommitteecoldCredenti2').toString('hex')) + }, + epoch: 2 + } + ]), + membersToBeRemoved: new Set([ + { + type: 0, + hash: Wallet.Crypto.Hash28ByteBase16(Buffer.from('updateCommitteecoldCredenti2').toString('hex')) + }, + { + type: 1, + hash: Wallet.Crypto.Hash28ByteBase16(Buffer.from('updateCommitteecoldCredenti3').toString('hex')) + } + ]), + governanceActionId: { + actionIndex: 123, + id: Wallet.Cardano.TransactionId('724a0a88b9470a714fc5bf84daf5851fa259a9b89e1a5453f6f5cd6595ad9821') + }, + __typename: Wallet.Cardano.GovernanceActionType.update_committee +} as Wallet.Cardano.UpdateCommittee; + +describe('Testing ProposalProceduresContainer component', () => { + afterEach(() => { + jest.clearAllMocks(); + cleanup(); + }); + + test('should render UpdateCommitteeAction component with proper props', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render( + , + { + wrapper: getWrapper() + } + )); + }); + + expect(queryByTestId('UpdateCommitteeAction')).toBeInTheDocument(); + expect(mockUpdateCommitteeAction).toHaveBeenLastCalledWith( + { + dappInfo, + data: { + txDetails: { + txType: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.title'), + deposit: `${deposit.toString()} ${cardanoCoinMock.symbol}`, + rewardAccount + }, + procedure: { + anchor: { + url: anchor.url, + hash: anchor.dataHash, + txHashUrl: `${mockedCExpolorerBaseUrl}/${anchor.dataHash}` + } + }, + governanceAction: { + index: updateCommittee.governanceActionId.actionIndex.toString(), + id: updateCommittee.governanceActionId.id || '' + }, + membersToBeAdded: [...updateCommittee.membersToBeAdded].map(({ coldCredential: { hash }, epoch }) => ({ + coldCredential: { + hash: hash.toString() + }, + epoch: epoch.toString() + })), + membersToBeRemoved: [...updateCommittee.membersToBeRemoved].map(({ hash }) => ({ hash: hash.toString() })) + }, + translations: { + txDetails: { + title: t('core.ProposalProcedure.txDetails.title'), + txType: t('core.ProposalProcedure.txDetails.txType'), + deposit: t('core.ProposalProcedure.txDetails.deposit'), + rewardAccount: t('core.ProposalProcedure.txDetails.rewardAccount') + }, + procedure: { + title: t('core.ProposalProcedure.procedure.title'), + anchor: { + url: t('core.ProposalProcedure.procedure.anchor.url'), + hash: t('core.ProposalProcedure.procedure.anchor.hash') + } + }, + governanceAction: { + id: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.actionId.id'), + index: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.actionId.index') + }, + actionId: { + title: t('core.ProposalProcedure.governanceAction.actionId.title'), + index: t('core.ProposalProcedure.governanceAction.actionId.index'), + txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + }, + membersToBeAdded: { + title: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.title'), + coldCredential: { + hash: t( + 'core.ProposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.coldCredential.hash' + ), + epoch: t( + 'core.ProposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.coldCredential.epoch' + ) + } + }, + membersToBeRemoved: { + title: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.membersToBeRemoved.title'), + hash: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.membersToBeRemoved.hash') + } + }, + errorMessage + }, + {} + ); + }); +}); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/testing.utils.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/testing.utils.tsx new file mode 100644 index 0000000000..4d4cff1643 --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/testing.utils.tsx @@ -0,0 +1,38 @@ +import { I18nextProvider } from 'react-i18next'; +import { StoreProvider } from '@src/stores'; +import { + AnalyticsProvider, + AppSettingsProvider, + BackgroundServiceAPIProvider, + BackgroundServiceAPIProviderProps, + DatabaseProvider +} from '@src/providers'; +import { APP_MODE_BROWSER } from '@src/utils/constants'; +import i18n from '@lib/i18n'; +import { PostHogClientProvider } from '@providers/PostHogClientProvider'; +import { postHogClientMocks } from '@src/utils/mocks/test-helpers'; +import React from 'react'; + +const backgroundService = { + getBackgroundStorage: jest.fn(), + setBackgroundStorage: jest.fn() +} as unknown as BackgroundServiceAPIProviderProps['value']; + +export const getWrapper = + () => + ({ children }: { children: React.ReactNode }): React.ReactElement => + ( + + + + + + + {children} + + + + + + + ); diff --git a/apps/browser-extension-wallet/src/lib/translations/en.json b/apps/browser-extension-wallet/src/lib/translations/en.json index d726efc308..7ec96c274f 100644 --- a/apps/browser-extension-wallet/src/lib/translations/en.json +++ b/apps/browser-extension-wallet/src/lib/translations/en.json @@ -1130,15 +1130,21 @@ "tryingToUseAssetNotInWallet": "This DApp is trying to use token not held in your wallet.", "noCollateral": "Wallet should not be able to sign dapp txs without collateral." }, - "proposalProcedure": { + "ProposalProcedure": { + "dRepId": "DRep ID", + "txDetails": { + "deposit": "Deposit", + "rewardAccount": "Reward account", + "title": "Transaction Details", + "txType": "Transaction Type" + }, "procedure": { "anchor": { "hash": "Anchor Hash", "url": "Anchor URL" }, - "deposit": "Deposit", - "rewardAccount": "Reward account", - "title": "Procedure" + "title": "Procedure", + "dRepId": "DRep ID" }, "governanceAction": { "actionId": { @@ -1147,14 +1153,23 @@ "txHash": "TX Hash" }, "hardForkInitiation": { - "title": "Hard Fork Initiation Action", + "title": "Hard Fork Initiation", "protocolVersion": { - "title": "Hard Fork Details", - "label": "Protocol Version" + "major": "Protocol Version Major", + "minor": "Protocol Version Minor", + "patch": "Protocol Version Patch" + }, + "actionId": { + "id": "Governance Action ID", + "index": "Action Index" } }, "newConstitutionAction": { "title": "New Constitution Action", + "actionId": { + "id": "Governance Action ID", + "index": "Governance Action Index" + }, "constitution": { "title": "Constitution Details", "anchor": { @@ -1168,12 +1183,25 @@ "title": "Info Action" }, "noConfidenceAction": { - "title": "No Confidence Action" + "title": "No Confidence", + "actionId": { + "id": "Governance Action ID", + "index": "Action Index" + } }, "protocolParamUpdate": { - "title": "Protocol Parameter Update Action", + "title": "Protocol Parameter Update", + "memory": "Memory", + "step": "Step", "networkGroup": { "title": "Network group", + "maxBBSize": "Max BB Size", + "maxTxSize": "Max Tx Size", + "maxBHSize": "Max BH Size", + "maxValSize": "Max Val Size", + "maxTxExUnits": "Max TX Ex Units", + "maxBlockExUnits": "Max Blk Ex Units", + "maxCollateralInputs": "Max Coll Inputs", "tooltip": { "maxBBSize": "Max block body size", "maxTxSize": "Max transaction size", @@ -1186,6 +1214,15 @@ }, "economicGroup": { "title": "Economic group", + "minFeeA": "Min Fee A", + "minFeeB": "Min Fee B", + "keyDeposit": "Key Deposit", + "poolDeposit": "Pool Deposit", + "rho": "Rho", + "tau": "Tau", + "minPoolCost": "Min Pool Cost", + "coinsPerUTxOByte": "Coins/UTxO Byte", + "prices": "Price", "tooltip": { "minFeeA": "Min fee coefficient", "minFeeB": "Min fee constant", @@ -1200,6 +1237,11 @@ }, "technicalGroup": { "title": "Technical group", + "a0": "A0", + "eMax": "EMax", + "nOpt": "NOpt", + "costModels": "Cost Models", + "collateralPercentage": "Coll Percentage", "tooltip": { "a0": "Pool pledge influence", "eMax": "Pool retirement maximum epoch", @@ -1210,6 +1252,25 @@ }, "governanceGroup": { "title": "Governance group", + "govActionLifetime": "Gov Act Lifetime", + "govActionDeposit": "Gov Act Deposit", + "drepDeposit": "DRep Deposit", + "drepActivity": "DRep Activity", + "ccMinSize": "CC Min Size", + "ccMaxTermLength": "CC Max Term Length", + "dRepVotingThresholds": { + "title": "Governance voting thresholds", + "motionNoConfidence": "Motion No Conf", + "committeeNormal": "Comm Normal", + "committeeNoConfidence": "Comm No Conf", + "updateConstitution": "Update Const", + "hardForkInitiation": "Hard Fork Init", + "ppNetworkGroup": "PP Network Grp", + "ppEconomicGroup": "PP Economic Grp", + "ppTechnicalGroup": "PP Technical Grp", + "ppGovernanceGroup": "PP Governance Grp", + "treasuryWithdrawal": "Treasury Withdraw" + }, "tooltip": { "govActionLifetime": "governance action maximum lifetime in epochs", "govActionDeposit": "governance action deposit", @@ -1218,10 +1279,10 @@ "ccMinSize": "Min constitutional committee size", "ccMaxTermLength": "Max term length (in epochs) for the constitutional committee members", "dRepVotingThresholds": { - "title": "DRep voting thresholds", + "title": "Governance voting thresholds", "motionNoConfidence": "1. Motion of no-confidence", "committeeNormal": "2a. New committee/threshold (normal state)", - "commiteeNoConfidence": "2b. New committee/threshold (state of no-confidence)", + "committeeNoConfidence": "2b. New committee/threshold (state of no-confidence)", "updateConstitution": "3. Update to the Constitution or proposal policy", "hardForkInitiation": "4. Hard-fork initiation", "ppNetworkGroup": "5a. Protocol parameter changes, network group", @@ -1234,14 +1295,17 @@ } }, "treasuryWithdrawals": { - "title": "Treasury Withdrawals Action", + "title": "Treasury Withdrawals", "withdrawals": { - "title": "Withdrawal Details", - "lovelace": "Lovelace Withdrawn", - "rewardAccount": "Reward account" + "lovelace": "Withdrawal Amount", + "rewardAccount": "Withdrawal Reward Account" } }, "updateCommitteeAction": { + "actionId": { + "id": "Governance Action ID", + "index": "Governance Action Index" + }, "title": "Update Committee Action", "membersToBeAdded": { "title": "Members To Be Added", diff --git a/packages/core/.storybook/preview.js b/packages/core/.storybook/preview.js index 7ffa549eec..4a32e4e72b 100644 --- a/packages/core/.storybook/preview.js +++ b/packages/core/.storybook/preview.js @@ -4,6 +4,16 @@ import 'normalize.css'; import './theme.scss'; import { ThemeColorScheme, ThemeProvider } from '@lace/ui'; +export const customViewports = { + popup: { + name: 'Popup', + styles: { + width: '360px', + height: '600' + } + } +}; + export const preview = { parameters: { actions: { argTypesRegex: '^on[A-Z].*' }, @@ -12,6 +22,10 @@ export const preview = { color: /(background|color)$/i, date: /Date$/ } + }, + viewport: { + viewports: customViewports, + defaultViewport: 'Popup' } } }; diff --git a/packages/core/src/ui/components/ConfirmDRepRegistration/ConfirmDRepRegistration.stories.ts b/packages/core/src/ui/components/ConfirmDRepRegistration/ConfirmDRepRegistration.stories.ts deleted file mode 100644 index 6434e8d54b..0000000000 --- a/packages/core/src/ui/components/ConfirmDRepRegistration/ConfirmDRepRegistration.stories.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { ConfirmDRepRegistration } from './ConfirmDRepRegistration'; -import { ComponentProps } from 'react'; - -const meta: Meta = { - title: 'ConfirmDRepRegistration', - component: ConfirmDRepRegistration, - parameters: { - layout: 'centered' - } -}; - -export default meta; -type Story = StoryObj; - -const data: ComponentProps = { - dappInfo: { - logo: 'https://cdn.mint.handle.me/favicon.png', - name: 'Mint', - url: 'https://preprod.mint.handle.me' - }, - translations: { - labels: { - depositPaid: 'Deposit paid', - drepId: 'Drep ID', - hash: 'Hash', - url: 'URL' - }, - metadata: 'Metadata' - }, - metadata: { - depositPaid: '0.35 ADA', - drepId: '65ge6g54g5dd5', - hash: '9bba8233cdd086f0325daba465d568a88970d42536f9e71e92a80d5922ded885', - url: 'https://raw.githubusercontent.com/Ryun1/gov-metadata/main/governace-action/metadata.jsonldr1q99...uqvzlalu' - } -}; - -export const Overview: Story = { - args: { - ...data - } -}; -export const WithError: Story = { - args: { - ...data, - errorMessage: 'Something went wrong' - } -}; diff --git a/packages/core/src/ui/components/ConfirmDRepRetirement/ConfirmDRepRetirement.stories.ts b/packages/core/src/ui/components/ConfirmDRepRetirement/ConfirmDRepRetirement.stories.ts deleted file mode 100644 index 6323a43ec5..0000000000 --- a/packages/core/src/ui/components/ConfirmDRepRetirement/ConfirmDRepRetirement.stories.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { ConfirmDRepRetirement } from './ConfirmDRepRetirement'; -import { ComponentProps } from 'react'; - -const meta: Meta = { - title: 'ConfirmDRepRetirement', - component: ConfirmDRepRetirement, - parameters: { - layout: 'centered' - } -}; - -export default meta; -type Story = StoryObj; - -const data: ComponentProps = { - dappInfo: { - logo: 'https://cdn.mint.handle.me/favicon.png', - name: 'Mint', - url: 'https://preprod.mint.handle.me' - }, - translations: { - labels: { - depositReturned: 'Deposit paid', - drepId: 'Drep ID' - }, - metadata: 'Metadata' - }, - metadata: { - depositReturned: '0.35 ADA', - drepId: '65ge6g54g5dd5' - } -}; - -export const Overview: Story = { - args: { - ...data - } -}; -export const WithError: Story = { - args: { - ...data, - errorMessage: 'Something went wrong' - } -}; diff --git a/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.ts b/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.ts index 56f29d0531..07525eac9c 100644 --- a/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.ts +++ b/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.ts @@ -2,6 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { DappTransaction } from './DappTransaction'; import { ComponentProps } from 'react'; +import { Wallet } from '@lace/cardano'; const meta: Meta = { title: 'DappTransaction', @@ -20,13 +21,6 @@ const data: ComponentProps = { name: 'Mint', url: 'https://preprod.mint.handle.me' }, - translations: { - recipient: 'Recipient', - amount: 'Amount', - adaFollowingNumericValue: 'ADA', - fee: 'Fee', - transaction: 'Transaction' - }, transaction: { fee: '0.17', outputs: [ @@ -36,7 +30,7 @@ const data: ComponentProps = { 'addr_test1qrl0s3nqfljv8dfckn7c4wkzu5rl6wn4hakkddcz2mczt3szlqss933x0aag07qcgspcaglmay6ufl4y4lalmlpe02mqhl0fx2' } ], - type: 'Mint' + type: Wallet.Cip30TxType.Mint } }; diff --git a/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.stories.ts index d5f4d8e305..753ddd8d09 100644 --- a/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.stories.ts @@ -3,11 +3,25 @@ import type { Meta, StoryObj } from '@storybook/react'; import { HardForkInitiationAction } from './HardForkInitiationAction'; import { ComponentProps } from 'react'; +const customViewports = { + popup: { + name: 'Popup', + styles: { + width: '360px', + height: '600' + } + } +}; + const meta: Meta = { title: 'ProposalProcedure/HardForkInitiationAction', component: HardForkInitiationAction, parameters: { - layout: 'centered' + layout: 'centered', + viewport: { + viewports: customViewports, + defaultViewport: 'popup' + } } }; @@ -21,35 +35,46 @@ const data: ComponentProps = { url: 'https://preprod.mint.handle.me' }, data: { - procedure: { + txDetails: { + txType: 'Hard Fork Initiation', deposit: '2000', - rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr' + }, + procedure: { anchor: { - hash: '0000000000000000000000000000000000000000000000000000000000000000', + hash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', url: 'https://www.someurl.io', txHashUrl: 'https://www.someurl.io' } }, + governanceAction: { + id: 'd0b1f7be72731a97e9728e0f1c358d576fd28aa9f290d53ce1ef803a1a753ba8', + index: '0' + }, actionId: { - index: 0, + index: '0', txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', txHashUrl: 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' }, protocolVersion: { - major: 5, - minor: 1, - patch: 1 + major: '5', + minor: '1', + patch: '1' } }, translations: { + txDetails: { + title: 'Transaction Details', + txType: 'Transaction Type', + deposit: 'Deposit', + rewardAccount: 'Reward account' + }, procedure: { anchor: { hash: 'Anchor Hash', url: 'Anchor URL' }, - deposit: 'Deposit', - rewardAccount: 'Reward account', title: 'Procedure' }, actionId: { @@ -57,9 +82,14 @@ const data: ComponentProps = { index: 'Index', txHash: 'TX Hash' }, + governanceAction: { + id: 'Governance Action ID', + index: 'Action Index' + }, protocolVersion: { - title: 'Hard Fork Details', - label: 'Protocol Version' + major: 'Protocol Version Major', + minor: 'Protocol Version Minor', + patch: 'Protocol Version Patch' } } }; diff --git a/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.tsx b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.tsx index 0030ecf211..51d5b076ce 100644 --- a/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.tsx @@ -1,54 +1,65 @@ import React from 'react'; -import { Box, Cell, Grid, Flex, Divider, sx, Metadata, Text } from '@lace/ui'; +import { Box, Grid, Flex, Divider, Metadata, Cell } from '@lace/ui'; import { DappInfo, DappInfoProps } from '../../DappInfo'; import { ErrorPane } from '@lace/common'; import * as Types from './HardForkInitiationActionTypes'; +import { TransactionDetails } from '../components/TransactionDetails'; import { Procedure } from '../components/Procedure'; import { ActionId } from '../components/ActionId'; -interface Props { +export interface HardForkInitiationActionProps { dappInfo: Omit; errorMessage?: string; data: Types.Data; translations: Types.Translations; } -export const HardForkInitiationAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => { - const textCss = sx({ - color: '$text_primary' - }); - - return ( - - - +export const HardForkInitiationAction = ({ + dappInfo, + errorMessage, + data: { procedure, txDetails, governanceAction, protocolVersion, actionId }, + translations +}: HardForkInitiationActionProps): JSX.Element => ( + + + + + {errorMessage && ( + + - {errorMessage && ( - - - - )} - - - - - - - - - - - - {translations.protocolVersion.title} - - + )} + + {/* tx details section */} + + + + + {/* procedure section */} + + + + + + + + {protocolVersion.patch && ( - + - - - ); -}; + )} + {/* action id section*/} + {actionId && ( + <> + + + + + + )} +
+ +); diff --git a/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationActionTypes.ts index 8e45f4bce9..2623304551 100644 --- a/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationActionTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationActionTypes.ts @@ -1,21 +1,27 @@ import * as ProcedureTypes from '../components/ProcedureTypes'; -import * as ActionTypes from '../components/ActionIdTypes'; +import * as ActionIdTypes from '../components/ActionIdTypes'; +import * as TxDetailsTypes from '../components/TransactionDetailsTypes'; export interface Data { + txDetails: TxDetailsTypes.TxDetails; procedure: ProcedureTypes.Procedure; - actionId: ActionTypes.Data; + governanceAction: ProcedureTypes.Procedure['governanceAction']; + actionId?: ActionIdTypes.Data; protocolVersion: { - major: number; - minor: number; - patch?: number; + major: string; + minor: string; + patch?: string; }; } export interface Translations { + txDetails: TxDetailsTypes.Translations; procedure: ProcedureTypes.Translations; - actionId: ActionTypes.Translations; + governanceAction: ProcedureTypes.Translations['governanceAction']; + actionId?: ActionIdTypes.Translations; protocolVersion: { - title: string; - label: string; + major: string; + minor: string; + patch: string; }; } diff --git a/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.stories.ts index c0ccb52d11..c141ad2e40 100644 --- a/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.stories.ts @@ -3,11 +3,25 @@ import type { Meta, StoryObj } from '@storybook/react'; import { InfoAction } from './InfoAction'; import { ComponentProps } from 'react'; +const customViewports = { + popup: { + name: 'Popup', + styles: { + width: '360px', + height: '600' + } + } +}; + const meta: Meta = { title: 'ProposalProcedure/InfoAction', component: InfoAction, parameters: { - layout: 'centered' + layout: 'centered', + viewport: { + viewports: customViewports, + defaultViewport: 'popup' + } } }; @@ -21,25 +35,39 @@ const data: ComponentProps = { url: 'https://preprod.mint.handle.me' }, data: { + txDetails: { + txType: 'Info action' + }, procedure: { - deposit: '2000', - rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', anchor: { - hash: '0000000000000000000000000000000000000000000000000000000000000000', + hash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', url: 'https://www.someurl.io', txHashUrl: 'https://www.someurl.io' } + }, + actionId: { + index: '0', + txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', + txHashUrl: + 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' } }, translations: { + txDetails: { + title: 'Transaction Details', + txType: 'Transaction Type' + }, procedure: { anchor: { hash: 'Anchor Hash', url: 'Anchor URL' }, - deposit: 'Deposit', - rewardAccount: 'Reward account', title: 'Procedure' + }, + actionId: { + title: 'Action ID', + index: 'Index', + txHash: 'TX Hash' } } }; diff --git a/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.tsx b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.tsx index 4a7ba34e3d..f90084758e 100644 --- a/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.tsx @@ -1,20 +1,27 @@ import React from 'react'; -import { Box, Grid, Flex } from '@lace/ui'; +import { Box, Grid, Flex, Divider, Cell } from '@lace/ui'; import { DappInfo, DappInfoProps } from '../../DappInfo'; import { ErrorPane } from '@lace/common'; import * as Types from './InfoActionTypes'; +import { TransactionDetails } from '../components/TransactionDetails'; import { Procedure } from '../components/Procedure'; +import { ActionId } from '../components/ActionId'; -interface Props { +export interface InfoActionProps { dappInfo: Omit; errorMessage?: string; data: Types.Data; translations: Types.Translations; } -export const InfoAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => ( +export const InfoAction = ({ + dappInfo, + errorMessage, + data: { procedure, txDetails, actionId }, + translations +}: InfoActionProps): JSX.Element => ( - + {errorMessage && ( @@ -23,7 +30,21 @@ export const InfoAction = ({ dappInfo, errorMessage, data, translations }: Props )} - + + + + + {/* procedure section */} + + {/* action id section*/} + {actionId && ( + <> + + + + + + )} ); diff --git a/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoActionTypes.ts index 648f6e6cf2..585dfc0681 100644 --- a/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoActionTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoActionTypes.ts @@ -1,9 +1,14 @@ import * as ProcedureTypes from '../components/ProcedureTypes'; - +import * as ActionIdTypes from '../components/ActionIdTypes'; +import * as TxDetailsTypes from '../components/TransactionDetailsTypes'; export interface Data { + txDetails: TxDetailsTypes.TxDetails; + actionId?: ActionIdTypes.Data; procedure: ProcedureTypes.Procedure; } export interface Translations { + txDetails: TxDetailsTypes.Translations; + actionId?: ActionIdTypes.Translations; procedure: ProcedureTypes.Translations; } diff --git a/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.stories.ts index 413abfa29c..d3d12870c1 100644 --- a/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.stories.ts @@ -3,11 +3,25 @@ import type { Meta, StoryObj } from '@storybook/react'; import { NewConstitutionAction } from './NewConstitutionAction'; import { ComponentProps } from 'react'; +const customViewports = { + popup: { + name: 'Popup', + styles: { + width: '360px', + height: '600' + } + } +}; + const meta: Meta = { title: 'ProposalProcedure/NewConstitutionAction', component: NewConstitutionAction, parameters: { - layout: 'centered' + layout: 'centered', + viewport: { + viewports: customViewports, + defaultViewport: 'popup' + } } }; @@ -21,9 +35,12 @@ const data: ComponentProps = { url: 'https://preprod.mint.handle.me' }, data: { - procedure: { + txDetails: { + txType: 'New Constitution', deposit: '2000', - rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr' + }, + procedure: { anchor: { hash: '0000000000000000000000000000000000000000000000000000000000000000', url: 'https://www.someurl.io', @@ -31,7 +48,7 @@ const data: ComponentProps = { } }, actionId: { - index: 0, + index: '0', txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', txHashUrl: 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' @@ -42,16 +59,24 @@ const data: ComponentProps = { url: 'https://www.someurl.io' }, scriptHash: 'cb0ec2692497b458e46812c8a5bfa2931d1a2d965a99893828ec810f' + }, + governanceAction: { + id: 'd0b1f7be72731a97e9728e0f1c358d576fd28aa9f290d53ce1ef803a1a753ba8', + index: '0' } }, translations: { + txDetails: { + title: 'Transaction Details', + txType: 'Transaction Type', + deposit: 'Deposit', + rewardAccount: 'Reward account' + }, procedure: { anchor: { hash: 'Anchor Hash', url: 'Anchor URL' }, - deposit: 'Deposit', - rewardAccount: 'Reward account', title: 'Procedure' }, actionId: { @@ -66,6 +91,10 @@ const data: ComponentProps = { url: 'Anchor URL' }, scriptHash: 'Script Hash' + }, + governanceAction: { + id: 'Governance Action ID', + index: 'Action Index' } } }; diff --git a/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.tsx b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.tsx index f2abad9549..d8281fcfde 100644 --- a/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.tsx @@ -1,67 +1,66 @@ import React from 'react'; -import { Box, Cell, Grid, Flex, Divider, sx, Metadata, Text } from '@lace/ui'; +import { Box, Grid, Flex, Divider, Metadata, MetadataLink, Cell } from '@lace/ui'; import { DappInfo, DappInfoProps } from '../../DappInfo'; import { ErrorPane } from '@lace/common'; import * as Types from './NewConstitutionActionTypes'; +import { TransactionDetails } from '../components/TransactionDetails'; import { Procedure } from '../components/Procedure'; -import { Card } from '../components/Card'; import { ActionId } from '../components/ActionId'; -interface Props { +export interface NewConstitutionActionProps { dappInfo: Omit; errorMessage?: string; data: Types.Data; translations: Types.Translations; } -export const NewConstitutionAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => { - const textCss = sx({ - color: '$text_primary' - }); - - return ( - - - +export const NewConstitutionAction = ({ + dappInfo, + errorMessage, + data: { txDetails, procedure, governanceAction, constitution, actionId }, + translations +}: NewConstitutionActionProps): JSX.Element => ( + + + + + {errorMessage && ( + + - {errorMessage && ( - - - - )} - - - - - - - - - + )} + + {/* txDetails section */} + + + + + {/* procedure section */} + + + + + {constitution.scriptHash && ( - - {translations.constitution.title} - + - - - - - - - - - ); -}; + )} + {/* action id section*/} + {actionId && ( + <> + + + + + + )} + + +); diff --git a/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionActionTypes.ts index 32e8ab2a6c..593d9f4a91 100644 --- a/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionActionTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionActionTypes.ts @@ -1,9 +1,12 @@ import * as ProcedureTypes from '../components/ProcedureTypes'; import * as ActionIdTypes from '../components/ActionIdTypes'; +import * as TxDetailsTypes from '../components/TransactionDetailsTypes'; export interface Data { procedure: ProcedureTypes.Procedure; - actionId: ActionIdTypes.Data; + actionId?: ActionIdTypes.Data; + governanceAction: ProcedureTypes.Procedure['governanceAction']; + txDetails: TxDetailsTypes.TxDetails; constitution: { anchor: { dataHash: string; @@ -15,7 +18,9 @@ export interface Data { export interface Translations { procedure: ProcedureTypes.Translations; - actionId: ActionIdTypes.Translations; + actionId?: ActionIdTypes.Translations; + governanceAction: ProcedureTypes.Translations['governanceAction']; + txDetails: TxDetailsTypes.Translations; constitution: { title: string; anchor: { diff --git a/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.stories.ts index b74e8af9a6..c44a790c1e 100644 --- a/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.stories.ts @@ -3,11 +3,25 @@ import type { Meta, StoryObj } from '@storybook/react'; import { NoConfidenceAction } from './NoConfidenceAction'; import { ComponentProps } from 'react'; +const customViewports = { + popup: { + name: 'Popup', + styles: { + width: '360px', + height: '600' + } + } +}; + const meta: Meta = { title: 'ProposalProcedure/NoConfidenceAction', component: NoConfidenceAction, parameters: { - layout: 'centered' + layout: 'centered', + viewport: { + viewports: customViewports, + defaultViewport: 'popup' + } } }; @@ -21,36 +35,51 @@ const data: ComponentProps = { url: 'https://preprod.mint.handle.me' }, data: { - procedure: { + txDetails: { + txType: 'No Confidence', deposit: '2000', - rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr' + }, + procedure: { anchor: { hash: '0000000000000000000000000000000000000000000000000000000000000000', url: 'https://www.someurl.io', - txHashUrl: 'https://www.someurl.io' + txHashUrl: 'https://www.someurl.io/' } }, actionId: { - index: 0, + index: '0', txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', txHashUrl: 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' + }, + governanceAction: { + id: 'd0b1f7be72731a97e9728e0f1c358d576fd28aa9f290d53ce1ef803a1a753ba8', + index: '0' } }, translations: { + txDetails: { + title: 'Transaction Details', + txType: 'Transaction Type', + deposit: 'Deposit', + rewardAccount: 'Reward account' + }, procedure: { anchor: { hash: 'Anchor Hash', url: 'Anchor URL' }, - deposit: 'Deposit', - rewardAccount: 'Reward account', title: 'Procedure' }, actionId: { title: 'Action ID', index: 'Index', txHash: 'TX Hash' + }, + governanceAction: { + id: 'Governance Action ID', + index: 'Action Index' } } }; diff --git a/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.tsx b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.tsx index 841474f809..815102dcf5 100644 --- a/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.tsx @@ -1,21 +1,27 @@ import React from 'react'; -import { Box, Cell, Grid, Flex, Divider } from '@lace/ui'; +import { Box, Grid, Flex, Divider, Cell } from '@lace/ui'; import { DappInfo, DappInfoProps } from '../../DappInfo'; import { ErrorPane } from '@lace/common'; import * as Types from './NoConfidenceActionTypes'; +import { TransactionDetails } from '../components/TransactionDetails'; import { Procedure } from '../components/Procedure'; import { ActionId } from '../components/ActionId'; -interface Props { +export interface NoConfidenceActionProps { dappInfo: Omit; errorMessage?: string; data: Types.Data; translations: Types.Translations; } -export const NoConfidenceAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => ( +export const NoConfidenceAction = ({ + dappInfo, + errorMessage, + data: { procedure, txDetails, governanceAction, actionId }, + translations +}: NoConfidenceActionProps): JSX.Element => ( - + {errorMessage && ( @@ -24,11 +30,25 @@ export const NoConfidenceAction = ({ dappInfo, errorMessage, data, translations )} - + {/* tx details section */} + - + {/* procedure section */} + + {/* action id section*/} + {actionId && ( + <> + + + + + + )} ); diff --git a/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceActionTypes.ts index ffe7ac6ad2..b77ec21785 100644 --- a/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceActionTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceActionTypes.ts @@ -1,12 +1,17 @@ import * as ProcedureTypes from '../components/ProcedureTypes'; import * as ActionIdTypes from '../components/ActionIdTypes'; +import * as TxDetailsTypes from '../components/TransactionDetailsTypes'; export interface Data { procedure: ProcedureTypes.Procedure; - actionId: ActionIdTypes.Data; + actionId?: ActionIdTypes.Data; + governanceAction: ProcedureTypes.Procedure['governanceAction']; + txDetails: TxDetailsTypes.TxDetails; } export interface Translations { procedure: ProcedureTypes.Translations; - actionId: ActionIdTypes.Translations; + actionId?: ActionIdTypes.Translations; + governanceAction: ProcedureTypes.Translations['governanceAction']; + txDetails: TxDetailsTypes.Translations; } diff --git a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/EconomicGroup.tsx b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/EconomicGroup.tsx index 6243f2dc3e..0e92b3b4d3 100644 --- a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/EconomicGroup.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/EconomicGroup.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Cell, Metadata, Text, sx } from '@lace/ui'; +import { Metadata, Text, sx, Cell } from '@lace/ui'; import { Card } from '../components/Card'; import * as Types from './ParameterChangeActionTypes'; @@ -21,36 +21,48 @@ export const EconomicGroup = ({ economicGroup, translations }: Props): JSX.Eleme - + - + - + - + - + - + - + - + - + - + - + + + + {translations.dRepVotingThresholds.title} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/NetworkGroup.tsx b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/NetworkGroup.tsx index faef5e47cc..88605cbc76 100644 --- a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/NetworkGroup.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/NetworkGroup.tsx @@ -1,6 +1,5 @@ import React from 'react'; -import { Cell, Metadata, Text, sx } from '@lace/ui'; -import { Card } from '../components/Card'; +import { Metadata, Text, sx, Cell } from '@lace/ui'; import * as Types from './ParameterChangeActionTypes'; interface Props { @@ -21,54 +20,38 @@ export const NetworkGroup = ({ networkGroup, translations }: Props): JSX.Element - - - - - - - + - + - - diff --git a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.stories.ts index d631d29104..2e4fababde 100644 --- a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.stories.ts @@ -3,11 +3,25 @@ import type { Meta, StoryObj } from '@storybook/react'; import { ParameterChangeAction } from './ParameterChangeAction'; import { ComponentProps } from 'react'; +const customViewports = { + popup: { + name: 'Popup', + styles: { + width: '360px', + height: '600' + } + } +}; + const meta: Meta = { title: 'ProposalProcedure/ParameterChangeAction', component: ParameterChangeAction, parameters: { - layout: 'centered' + layout: 'centered', + viewport: { + viewports: customViewports, + defaultViewport: 'popup' + } } }; @@ -21,29 +35,30 @@ const data: ComponentProps = { url: 'https://preprod.mint.handle.me' }, data: { - procedure: { + txDetails: { + txType: 'Protocol Parameter Update', deposit: '2000', - rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', - anchor: { - hash: '0000000000000000000000000000000000000000000000000000000000000000', - url: 'https://www.someurl.io', - txHashUrl: 'https://www.someurl.io' - } + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr' + }, + anchor: { + hash: '0000000000000000000000000000000000000000000000000000000000000000', + url: 'https://www.someurl.io', + txHashUrl: 'https://www.someurl.io/' }, protocolParamUpdate: { + maxBlockExUnits: { + memory: '50000000', + step: '4000000000' + }, + maxTxExUnits: { + memory: '10000000', + step: '10000000000' + }, networkGroup: { maxBBSize: '65536', maxBHSize: '1100', maxTxSize: '16384', - maxBlockExUnits: { - memory: '50000000', - step: '4000000000' - }, maxCollateralInputs: '3', - maxTxExUnits: { - memory: '10000000', - step: '10000000000' - }, maxValSize: '5000' }, economicGroup: { @@ -84,32 +99,42 @@ const data: ComponentProps = { drepActivity: '0', drepDeposit: '0', dRepVotingThresholds: { - dvtMotionNoConfidence: '0.51', - dvtCommitteeNormal: '0.51', - dvtCommitteeNoConfidence: '0.51', - dvtUpdateToConstitution: '0.51', - dvtHardForkInitiation: '0.51', - dvtPPNetworkGroup: '0.51', - dvtPPEconomicGroup: '0.51', - dvtPPTechnicalGroup: '0.51', - dvtPPGovGroup: '0.51', - dvtTreasuryWithdrawal: '0.51' + motionNoConfidence: '0.51', + committeeNormal: '0.51', + committeeNoConfidence: '0.51', + updateToConstitution: '0.51', + hardForkInitiation: '0.51', + ppNetworkGroup: '0.51', + ppEconomicGroup: '0.51', + ppTechnicalGroup: '0.51', + ppGovGroup: '0.51', + treasuryWithdrawal: '0.51' } } } }, translations: { - procedure: { - anchor: { - hash: 'Anchor Hash', - url: 'Anchor URL' - }, + txDetails: { + title: 'Transaction Details', + txType: 'Transaction Type', deposit: 'Deposit', - rewardAccount: 'Reward account', - title: 'Procedure' + rewardAccount: 'Reward account' + }, + memory: 'Memory', + step: 'Step', + anchor: { + hash: 'Anchor Hash', + url: 'Anchor URL' }, networkGroup: { title: 'Network group', + maxBBSize: 'Max BB Size', + maxTxSize: 'Max Tx Size', + maxBHSize: 'Max BH Size', + maxValSize: 'Max Val Size', + maxTxExUnits: 'Max TX Ex Units', + maxBlockExUnits: 'Max Blk Ex Units', + maxCollateralInputs: 'Max Coll Inputs', tooltip: { maxBBSize: 'Max block body size', maxTxSize: 'Max transaction size', @@ -122,6 +147,15 @@ const data: ComponentProps = { }, economicGroup: { title: 'Economic group', + minFeeA: 'Min Fee A', + minFeeB: 'Min Fee B', + keyDeposit: 'Key Deposit', + poolDeposit: 'Pool Deposit', + rho: 'Rho', + tau: 'Tau', + minPoolCost: 'Min Pool Cost', + coinsPerUTxOByte: 'Coins/UTxO Byte', + prices: 'Price', tooltip: { minFeeA: 'Min fee coefficient', minFeeB: 'Min fee constant', @@ -136,6 +170,11 @@ const data: ComponentProps = { }, technicalGroup: { title: 'Technical group', + a0: 'A0', + eMax: 'EMax', + nOpt: 'NOpt', + costModels: 'Cost Models', + collateralPercentage: 'Coll Percentage', tooltip: { a0: 'Pool pledge influence', eMax: 'Pool retirement maximum epoch', @@ -146,6 +185,25 @@ const data: ComponentProps = { }, governanceGroup: { title: 'Governance group', + govActionLifetime: 'Gov Act Lifetime', + govActionDeposit: 'Gov Act Deposit', + drepDeposit: 'DRep Deposit', + drepActivity: 'DRep Activity', + ccMinSize: 'CC Min Size', + ccMaxTermLength: 'CC Max Term Length', + dRepVotingThresholds: { + title: 'Governance voting thresholds', + motionNoConfidence: 'Motion No Conf', + committeeNormal: 'Comm Normal', + committeeNoConfidence: 'Comm No Conf', + updateConstitution: 'Update Const', + hardForkInitiation: 'Hard Fork Init', + ppNetworkGroup: 'PP Network Grp', + ppEconomicGroup: 'PP Economic Grp', + ppTechnicalGroup: 'PP Technical Grp', + ppGovernanceGroup: 'PP Governance Grp', + treasuryWithdrawal: 'Treasury Withdraw' + }, tooltip: { govActionLifetime: 'governance action maximum lifetime in epochs', govActionDeposit: 'governance action deposit', @@ -157,7 +215,7 @@ const data: ComponentProps = { title: 'DRep voting thresholds', motionNoConfidence: '1. Motion of no-confidence', committeeNormal: '2a. New committee/threshold (normal state)', - commiteeNoConfidence: '2b. New committee/threshold (state of no-confidence)', + committeeNoConfidence: '2b. New committee/threshold (state of no-confidence)', updateConstitution: '3. Update to the Constitution or proposal policy', hardForkInitiation: '4. Hard-fork initiation', ppNetworkGroup: '5a. Protocol parameter changes, network group', diff --git a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.tsx b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.tsx index 01916bdcaa..3d61862e56 100644 --- a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.tsx @@ -1,23 +1,30 @@ import React from 'react'; -import { Box, Cell, Grid, Flex, Divider } from '@lace/ui'; +import { Box, Grid, Flex, Divider, Metadata, MetadataLink, Cell } from '@lace/ui'; import { DappInfo, DappInfoProps } from '../../DappInfo'; import { ErrorPane } from '@lace/common'; -import { Procedure } from '../components/Procedure'; +import { TransactionDetails } from '../components/TransactionDetails'; import * as Types from './ParameterChangeActionTypes'; import { EconomicGroup } from './EconomicGroup'; import { NetworkGroup } from './NetworkGroup'; import { TechnicalGroup } from './TechnicalGroup'; import { GovernanceGroup } from './GovernanceGroup'; +import { Card } from '../components/Card'; -interface Props { +interface ParameterChangeActionProps { dappInfo: Omit; errorMessage?: string; data: Types.Data; translations: Types.Translations; } -export const ParameterChangeAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => { - const { economicGroup, governanceGroup, networkGroup, technicalGroup } = data.protocolParamUpdate; +export const ParameterChangeAction = ({ + dappInfo, + errorMessage, + data: { txDetails, protocolParamUpdate, anchor }, + translations +}: ParameterChangeActionProps): JSX.Element => { + const { economicGroup, governanceGroup, networkGroup, technicalGroup, maxTxExUnits, maxBlockExUnits } = + protocolParamUpdate; return ( @@ -30,22 +37,44 @@ export const ParameterChangeAction = ({ dappInfo, errorMessage, data, translatio )} - + {/* tx details section */} + + {anchor && ( + <> + + + + + + + + )} - + + + + + + - + - - - - - - diff --git a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeActionTypes.ts index ee75a51914..90efec01da 100644 --- a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeActionTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeActionTypes.ts @@ -1,8 +1,10 @@ import * as ProcedureTypes from '../components/ProcedureTypes'; +import * as TxDetailsTypes from '../components/TransactionDetailsTypes'; export interface Data { - procedure: ProcedureTypes.Procedure; protocolParamUpdate: ProtocolParamUpdate; + txDetails: TxDetailsTypes.TxDetails; + anchor: ProcedureTypes.Procedure['anchor']; } export interface NetworkGroup { @@ -10,14 +12,6 @@ export interface NetworkGroup { maxTxSize: string; maxBHSize: string; maxValSize: string; - maxTxExUnits: { - memory: string; - step: string; - }; - maxBlockExUnits: { - memory: string; - step: string; - }; maxCollateralInputs: string; } @@ -55,20 +49,28 @@ export interface GovernanceGroup { ccMinSize: string; ccMaxTermLength: string; dRepVotingThresholds: { - dvtMotionNoConfidence: string; - dvtCommitteeNormal: string; - dvtCommitteeNoConfidence: string; - dvtUpdateToConstitution: string; - dvtHardForkInitiation: string; - dvtPPNetworkGroup: string; - dvtPPEconomicGroup: string; - dvtPPTechnicalGroup: string; - dvtPPGovGroup: string; - dvtTreasuryWithdrawal: string; + motionNoConfidence: string; + committeeNormal: string; + committeeNoConfidence: string; + updateToConstitution: string; + hardForkInitiation: string; + ppNetworkGroup: string; + ppEconomicGroup: string; + ppTechnicalGroup: string; + ppGovGroup: string; + treasuryWithdrawal: string; }; } interface ProtocolParamUpdate { + maxTxExUnits: { + memory: string; + step: string; + }; + maxBlockExUnits: { + memory: string; + step: string; + }; networkGroup: NetworkGroup; economicGroup: EconomicGroup; technicalGroup: TechnicalGroup; @@ -76,9 +78,19 @@ interface ProtocolParamUpdate { } export interface Translations { - procedure: ProcedureTypes.Translations; + txDetails: TxDetailsTypes.Translations; + anchor: ProcedureTypes.Translations['anchor']; + memory: string; + step: string; networkGroup: { title: string; + maxBBSize: string; + maxTxSize: string; + maxBHSize: string; + maxValSize: string; + maxTxExUnits: string; + maxBlockExUnits: string; + maxCollateralInputs: string; tooltip: { maxBBSize: string; maxTxSize: string; @@ -91,6 +103,15 @@ export interface Translations { }; economicGroup: { title: string; + minFeeA: string; + minFeeB: string; + keyDeposit: string; + poolDeposit: string; + rho: string; + tau: string; + minPoolCost: string; + coinsPerUTxOByte: string; + prices: string; tooltip: { minFeeA: string; minFeeB: string; @@ -105,6 +126,11 @@ export interface Translations { }; technicalGroup: { title: string; + a0: string; + eMax: string; + nOpt: string; + costModels: string; + collateralPercentage: string; tooltip: { a0: string; eMax: string; @@ -115,6 +141,25 @@ export interface Translations { }; governanceGroup: { title: string; + govActionLifetime: string; + govActionDeposit: string; + drepDeposit: string; + drepActivity: string; + ccMinSize: string; + ccMaxTermLength: string; + dRepVotingThresholds: { + title: string; + motionNoConfidence: string; + committeeNormal: string; + committeeNoConfidence: string; + updateConstitution: string; + hardForkInitiation: string; + ppNetworkGroup: string; + ppEconomicGroup: string; + ppTechnicalGroup: string; + ppGovernanceGroup: string; + treasuryWithdrawal: string; + }; tooltip: { govActionLifetime: string; govActionDeposit: string; @@ -126,7 +171,7 @@ export interface Translations { title: string; motionNoConfidence: string; committeeNormal: string; - commiteeNoConfidence: string; + committeeNoConfidence: string; updateConstitution: string; hardForkInitiation: string; ppNetworkGroup: string; diff --git a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/TechnicalGroup.tsx b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/TechnicalGroup.tsx index 3799a32eaf..4e98f4255e 100644 --- a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/TechnicalGroup.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/TechnicalGroup.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Box, Cell, Metadata, Text, sx } from '@lace/ui'; +import { Box, Metadata, Text, sx, Cell } from '@lace/ui'; import * as Types from './ParameterChangeActionTypes'; import { Card } from '../components/Card'; @@ -29,21 +29,26 @@ export const TechnicalGroup = ({ technicalGroup, translations }: Props): JSX.Ele - + - + - + - + + + + + {translations.costModels} + {costModels.map(({ title, fields }, idx) => ( - 0 ? '$24' : '$0'} key={title}> - + 0 ? '$24' : '$0'} mb={costModels.length === idx - 1 ? '$18' : '$0'} key={title}> + ))} diff --git a/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts index 2d5ca44b68..a8d14d89be 100644 --- a/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts @@ -3,11 +3,25 @@ import type { Meta, StoryObj } from '@storybook/react'; import { TreasuryWithdrawalsAction } from './TreasuryWithdrawalsAction'; import { ComponentProps } from 'react'; +const customViewports = { + popup: { + name: 'Popup', + styles: { + width: '360px', + height: '600' + } + } +}; + const meta: Meta = { title: 'ProposalProcedure/TreasuryWithdrawalsAction', component: TreasuryWithdrawalsAction, parameters: { - layout: 'centered' + layout: 'centered', + viewport: { + viewports: customViewports, + defaultViewport: 'popup' + } } }; @@ -21,11 +35,14 @@ const data: ComponentProps = { url: 'https://preprod.mint.handle.me' }, data: { - procedure: { + txDetails: { + txType: 'Treasury Withdrawals', deposit: '2000', - rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr' + }, + procedure: { anchor: { - hash: '0000000000000000000000000000000000000000000000000000000000000000', + hash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', url: 'https://www.someurl.io', txHashUrl: 'https://www.someurl.io' } @@ -35,18 +52,33 @@ const data: ComponentProps = { rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', lovelace: '1030939916423' } - ] + ], + actionId: { + index: '0', + txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', + txHashUrl: + 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' + } }, translations: { + txDetails: { + title: 'Transaction Details', + txType: 'Transaction Type', + deposit: 'Deposit', + rewardAccount: 'Reward account' + }, procedure: { anchor: { hash: 'Anchor Hash', url: 'Anchor URL' }, - deposit: 'Deposit', - rewardAccount: 'Reward account', title: 'Procedure' }, + actionId: { + title: 'Action ID', + index: 'Index', + txHash: 'TX Hash' + }, withdrawals: { title: 'Withdrawal Details', lovelace: 'Lovelace Withdrawn', diff --git a/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx index ee3e90929b..38a8d2196d 100644 --- a/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.tsx @@ -1,19 +1,25 @@ import React from 'react'; -import { Box, Cell, Grid, Flex, Divider, sx, Text } from '@lace/ui'; +import { Box, Grid, Flex, Divider, sx, Text, Metadata, Cell } from '@lace/ui'; import { DappInfo, DappInfoProps } from '../../DappInfo'; import { ErrorPane } from '@lace/common'; import * as Types from './TreasuryWithdrawalsActionTypes'; +import { TransactionDetails } from '../components/TransactionDetails'; +import { ActionId } from '../components/ActionId'; import { Procedure } from '../components/Procedure'; -import { Card } from '../components/Card'; -interface Props { +interface TreasuryWithdrawalsActionProps { dappInfo: Omit; errorMessage?: string; data: Types.Data; translations: Types.Translations; } -export const TreasuryWithdrawalsAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => { +export const TreasuryWithdrawalsAction = ({ + dappInfo, + errorMessage, + data: { txDetails, procedure, withdrawals, actionId }, + translations +}: TreasuryWithdrawalsActionProps): JSX.Element => { const textCss = sx({ color: '$text_primary' }); @@ -29,30 +35,36 @@ export const TreasuryWithdrawalsAction = ({ dappInfo, errorMessage, data, transl )} - + {/* tx details section */} + + {/* procedure section */} + {translations.withdrawals.title} - {data.withdrawals.map((withdrawal) => ( - + {withdrawals.map((withdrawal) => ( + + + + + + + + ))} + {actionId && ( + <> + + + + + + )} ); diff --git a/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts index 0f43645f27..7de7a0fc0d 100644 --- a/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsActionTypes.ts @@ -1,6 +1,10 @@ import * as ProcedureTypes from '../components/ProcedureTypes'; +import * as ActionIdTypes from '../components/ActionIdTypes'; +import * as TxDetailsTypes from '../components/TransactionDetailsTypes'; export interface Data { + actionId?: ActionIdTypes.Data; + txDetails: TxDetailsTypes.TxDetails; procedure: ProcedureTypes.Procedure; withdrawals: Array<{ rewardAccount: string; @@ -9,6 +13,8 @@ export interface Data { } export interface Translations { + txDetails: TxDetailsTypes.Translations; + actionId?: ActionIdTypes.Translations; procedure: ProcedureTypes.Translations; withdrawals: { title: string; diff --git a/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts index ebc0131bb3..69cb8951bd 100644 --- a/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts @@ -3,11 +3,25 @@ import type { Meta, StoryObj } from '@storybook/react'; import { UpdateCommitteeAction } from './UpdateCommitteeActionAction'; import { ComponentProps } from 'react'; +const customViewports = { + popup: { + name: 'Popup', + styles: { + width: '360px', + height: '600' + } + } +}; + const meta: Meta = { title: 'ProposalProcedure/UpdateCommitteeAction', component: UpdateCommitteeAction, parameters: { - layout: 'centered' + layout: 'centered', + viewport: { + viewports: customViewports, + defaultViewport: 'popup' + } } }; @@ -21,17 +35,24 @@ const data: ComponentProps = { url: 'https://preprod.mint.handle.me' }, data: { - procedure: { + txDetails: { + txType: 'Hard Fork Initiation', deposit: '2000', - rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr', + rewardAccount: 'stake1u89sasnfyjtmgk8ydqfv3fdl52f36x3djedfnzfc9rkgzrcss5vgr' + }, + procedure: { anchor: { - hash: '0000000000000000000000000000000000000000000000000000000000000000', + hash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', url: 'https://www.someurl.io', txHashUrl: 'https://www.someurl.io' } }, + governanceAction: { + id: 'd0b1f7be72731a97e9728e0f1c358d576fd28aa9f290d53ce1ef803a1a753ba8', + index: '0' + }, actionId: { - index: 0, + index: '0', txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', txHashUrl: 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' @@ -64,13 +85,17 @@ const data: ComponentProps = { } }, translations: { + txDetails: { + title: 'Transaction Details', + txType: 'Transaction Type', + deposit: 'Deposit', + rewardAccount: 'Reward account' + }, procedure: { anchor: { hash: 'Anchor Hash', url: 'Anchor URL' }, - deposit: 'Deposit', - rewardAccount: 'Reward account', title: 'Procedure' }, actionId: { @@ -78,6 +103,10 @@ const data: ComponentProps = { index: 'Index', txHash: 'TX Hash' }, + governanceAction: { + id: 'Governance Action ID', + index: 'Action Index' + }, membersToBeAdded: { title: 'Members To Be Added', coldCredential: { diff --git a/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx index b5337ba7ff..e49e660aa0 100644 --- a/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx @@ -1,20 +1,25 @@ import React from 'react'; -import { Box, Cell, Grid, Flex, Divider, sx, Text, Metadata } from '@lace/ui'; +import { Box, Grid, Flex, Divider, sx, Text, Metadata, Cell } from '@lace/ui'; import { DappInfo, DappInfoProps } from '../../DappInfo'; import { ErrorPane } from '@lace/common'; import * as Types from './UpdateCommitteeActionTypes'; import { Procedure } from '../components/Procedure'; +import { TransactionDetails } from '../components/TransactionDetails'; import { ActionId } from '../components/ActionId'; -import { Card } from '../components/Card'; -interface Props { +interface UpdateCommitteeActionProps { dappInfo: Omit; errorMessage?: string; data: Types.Data; translations: Types.Translations; } -export const UpdateCommitteeAction = ({ dappInfo, errorMessage, data, translations }: Props): JSX.Element => { +export const UpdateCommitteeAction = ({ + dappInfo, + errorMessage, + data: { procedure, governanceAction, txDetails, membersToBeAdded, membersToBeRemoved, actionId }, + translations +}: UpdateCommitteeActionProps): JSX.Element => { const textCss = sx({ color: '$text_primary' }); @@ -30,71 +35,61 @@ export const UpdateCommitteeAction = ({ dappInfo, errorMessage, data, translatio )} - + {/* tx details section */} + - + {/* procedure section */} + - - - {translations.newQuorumThreshold.title} - - - - - - - - - - - - {data.membersToBeAdded?.length > 0 && ( + {membersToBeAdded?.length > 0 && ( {translations.membersToBeAdded.title} )} - {data.membersToBeAdded.map(({ coldCredential, epoch }) => ( - + {membersToBeAdded.map(({ coldCredential, epoch }) => ( + + + + + + + + ))} - {data.membersToBeRemoved?.length > 0 && ( + {membersToBeRemoved?.length > 0 && ( {translations.membersToBeRemoved.title} )} - {data.membersToBeRemoved.map(({ hash }) => ( - + {membersToBeRemoved.map(({ hash }) => ( + + + + + + + + ))} - - - + {actionId && ( + <> + + + + + + )} ); diff --git a/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts index 5bd9ecb869..563ffccab2 100644 --- a/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts @@ -1,5 +1,6 @@ import * as ProcedureTypes from '../components/ProcedureTypes'; import * as ActionIdTypes from '../components/ActionIdTypes'; +import * as TxDetailsTypes from '../components/TransactionDetailsTypes'; interface MembersToBeAdded { coldCredential: { @@ -18,16 +19,20 @@ interface NewQuorumThreshold { } export interface Data { + actionId?: ActionIdTypes.Data; + txDetails: TxDetailsTypes.TxDetails; procedure: ProcedureTypes.Procedure; - actionId: ActionIdTypes.Data; + governanceAction: ProcedureTypes.Procedure['governanceAction']; membersToBeAdded: MembersToBeAdded[]; membersToBeRemoved: MembersToBeRemoved[]; - newQuorumThreshold: NewQuorumThreshold; + newQuorumThreshold?: NewQuorumThreshold; } export interface Translations { procedure: ProcedureTypes.Translations; - actionId: ActionIdTypes.Translations; + actionId?: ActionIdTypes.Translations; + txDetails: TxDetailsTypes.Translations; + governanceAction: ProcedureTypes.Translations['governanceAction']; membersToBeAdded: { title: string; coldCredential: { @@ -39,7 +44,7 @@ export interface Translations { title: string; hash: string; }; - newQuorumThreshold: { + newQuorumThreshold?: { title: string; denominator: string; numerator: string; diff --git a/packages/core/src/ui/components/ProposalProcedures/components/ActionIdTypes.ts b/packages/core/src/ui/components/ProposalProcedures/components/ActionIdTypes.ts index e3de620cc7..bc91ec2166 100644 --- a/packages/core/src/ui/components/ProposalProcedures/components/ActionIdTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/components/ActionIdTypes.ts @@ -1,11 +1,11 @@ export interface Data { - index: number; + index: string; txHash: string; - txHashUrl: string; + txHashUrl?: string; } export interface Translations { - title: string; + title?: string; index: string; txHash: string; } diff --git a/packages/core/src/ui/components/ProposalProcedures/components/Card.tsx b/packages/core/src/ui/components/ProposalProcedures/components/Card.tsx index 196bd11035..44bed28c23 100644 --- a/packages/core/src/ui/components/ProposalProcedures/components/Card.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/components/Card.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Cell, Grid, Flex, Card as UICard, Box, sx, Text, TextLink, Tooltip } from '@lace/ui'; +import { Grid, Flex, Card as UICard, Box, sx, Text, TextLink, Tooltip, Cell } from '@lace/ui'; import styles from './Card.module.scss'; interface Item { diff --git a/packages/core/src/ui/components/ProposalProcedures/components/Procedure.tsx b/packages/core/src/ui/components/ProposalProcedures/components/Procedure.tsx index 4d16f3ace8..8bf119d9c5 100644 --- a/packages/core/src/ui/components/ProposalProcedures/components/Procedure.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/components/Procedure.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Cell, Metadata, MetadataLink, Text, sx } from '@lace/ui'; +import { Metadata, MetadataLink, Text, sx, Cell } from '@lace/ui'; import * as Types from './ProcedureTypes'; interface Props { @@ -19,19 +19,23 @@ export const Procedure = ({ data, translations }: Props): JSX.Element => { {translations.title} - - - - - - {data.anchor && ( <> - + - + + + + )} + {data.governanceAction && ( + <> + + + + + )} diff --git a/packages/core/src/ui/components/ProposalProcedures/components/ProcedureTypes.ts b/packages/core/src/ui/components/ProposalProcedures/components/ProcedureTypes.ts index 34994de499..c2369feae1 100644 --- a/packages/core/src/ui/components/ProposalProcedures/components/ProcedureTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/components/ProcedureTypes.ts @@ -1,19 +1,23 @@ export interface Procedure { - deposit: string; - rewardAccount: string; anchor?: { url: string; hash: string; txHashUrl: string; }; + governanceAction?: { + id: string; + index: string; + }; } export interface Translations { title: string; - deposit: string; - rewardAccount: string; anchor: { url: string; hash: string; }; + governanceAction?: { + id: string; + index: string; + }; } diff --git a/packages/core/src/ui/components/ProposalProcedures/components/TransactionDetails.tsx b/packages/core/src/ui/components/ProposalProcedures/components/TransactionDetails.tsx new file mode 100644 index 0000000000..269107fc7a --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedures/components/TransactionDetails.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { Metadata, Text, sx, Cell } from '@lace/ui'; +import * as Types from './TransactionDetailsTypes'; + +interface Props { + data: Types.TxDetails; + translations: Types.Translations; +} + +export const TransactionDetails = ({ data, translations }: Props): JSX.Element => { + const textCss = sx({ + color: '$text_primary' + }); + + return ( + <> + + + {translations.title} + + + + + + {data.rewardAccount && ( + + + + )} + {data.rewardAccount && ( + + + + )} + + ); +}; diff --git a/packages/core/src/ui/components/ProposalProcedures/components/TransactionDetailsTypes.ts b/packages/core/src/ui/components/ProposalProcedures/components/TransactionDetailsTypes.ts new file mode 100644 index 0000000000..744b832002 --- /dev/null +++ b/packages/core/src/ui/components/ProposalProcedures/components/TransactionDetailsTypes.ts @@ -0,0 +1,12 @@ +export interface TxDetails { + txType: string; + deposit?: string; + rewardAccount?: string; +} + +export interface Translations { + title: string; + txType: string; + deposit?: string; + rewardAccount?: string; +} diff --git a/packages/core/src/ui/components/VotingProcedures/VotingProcedures.stories.ts b/packages/core/src/ui/components/VotingProcedures/VotingProcedures.stories.ts deleted file mode 100644 index 72a297d798..0000000000 --- a/packages/core/src/ui/components/VotingProcedures/VotingProcedures.stories.ts +++ /dev/null @@ -1,107 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { VotingProcedures } from './VotingProcedures'; -import { ComponentProps } from 'react'; - -const meta: Meta = { - title: 'VotingProcedures', - component: VotingProcedures, - parameters: { - layout: 'centered' - } -}; - -export default meta; -type Story = StoryObj; - -const data: ComponentProps = { - dappInfo: { - logo: 'https://cdn.mint.handle.me/favicon.png', - name: 'Mint', - url: 'https://preprod.mint.handle.me' - }, - data: [ - { - voter: { - type: 'DRep', - dRepId: 'drep1cs234l5mtapethapx8cq97nkpa27xf84phruh5f6jqxa78ymlp4' - }, - votes: [ - { - actionId: { - index: 0, - txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', - txHashUrl: - 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' - }, - votingProcedure: { - anchor: { - hash: '9067f223838d88b83f660c05eedf7f6f65c45de31e522c1bcb6a1eb287b17e89', - url: 'https://shorturl.at/eK145' - }, - vote: 'Yes' - } - } - ] - } - ], - translations: { - voterType: 'Voter type', - procedureTitle: 'Procedure', - actionIdTitle: 'Action ID', - vote: 'Vote', - actionId: { - index: 'Index', - txHash: 'TX Hash' - }, - anchor: { - hash: 'Anchor Hash', - url: 'Anchor URL' - }, - dRepId: 'DRep ID' - } -}; - -export const Overview: Story = { - args: { - ...data - } -}; -export const WithError: Story = { - args: { - ...data, - errorMessage: 'Something went wrong' - } -}; - -export const MultipleVotes: Story = { - args: { - ...data, - data: [ - ...data.data, - { - voter: { - type: 'DRep', - dRepId: 'drep1cs234l5mtapethapx8cq97nkpa27xf84phruh5f6jqxa78ymlp4' - }, - votes: [ - { - actionId: { - index: 0, - txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', - txHashUrl: - 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' - }, - votingProcedure: { - anchor: { - hash: '9067f223838d88b83f660c05eedf7f6f65c45de31e522c1bcb6a1eb287b17e89', - url: 'https://shorturl.at/eK145' - }, - vote: 'Yes' - } - } - ] - } - ] - } -}; diff --git a/packages/staking/src/features/Drawer/preferences/StepPreferencesContent.tsx b/packages/staking/src/features/Drawer/preferences/StepPreferencesContent.tsx index 889504964c..dcb134b0b2 100644 --- a/packages/staking/src/features/Drawer/preferences/StepPreferencesContent.tsx +++ b/packages/staking/src/features/Drawer/preferences/StepPreferencesContent.tsx @@ -67,7 +67,6 @@ export const StepPreferencesContent = () => { percentage: sliderIntegerPercentage, saturation: saturation ? String(saturation) : undefined, savedIntegerPercentage: draftPool?.savedIntegerPercentage || undefined, - // TODO sliderIntegerPercentage, stakeValue: balancesBalance ? compactNumber( diff --git a/packages/ui/src/design-system/pie-chart/pie-chart.stories.tsx b/packages/ui/src/design-system/pie-chart/pie-chart.stories.tsx index 079373139c..bccf951050 100644 --- a/packages/ui/src/design-system/pie-chart/pie-chart.stories.tsx +++ b/packages/ui/src/design-system/pie-chart/pie-chart.stories.tsx @@ -8,7 +8,7 @@ import { ThemeColorScheme, LocalThemeProvider } from '../../design-tokens'; import { page, Section, Variants } from '../decorators'; import { Divider } from '../divider'; import { Cell, Grid } from '../grid'; -import { Content, ContentInner } from '../tooltip'; +import { TooltipContent } from '../tooltip'; import { PieChart } from './pie-chart.component'; import { @@ -47,9 +47,7 @@ const meta: Meta = { export default meta; const CustomTooltip = (): ReactElement => ( - - - + ); export const Overview = (): JSX.Element => ( diff --git a/packages/ui/src/design-system/tooltip/tooltip-content.css.ts b/packages/ui/src/design-system/tooltip/tooltip-content.css.ts index 38c93dd94f..803e3c84e5 100644 --- a/packages/ui/src/design-system/tooltip/tooltip-content.css.ts +++ b/packages/ui/src/design-system/tooltip/tooltip-content.css.ts @@ -15,6 +15,6 @@ export const tooltipContent = style([ }), { position: 'relative', - wordBreak: 'break-all', + wordBreak: 'break-word', }, ]); From fb70231415672ff470cb48be6fd15e082d40416f Mon Sep 17 00:00:00 2001 From: Vitalii Vozniak Date: Wed, 13 Dec 2023 18:11:00 +0200 Subject: [PATCH 19/19] fix(extension): resolve pr comments --- ...keRegistrationDelegationContainer.test.tsx | 149 +++++++++++++++ ...nfirmStakeVoteDelegationContainer.test.tsx | 168 ++++++++++++++++ ...teRegistrationDelegationContainer.test.tsx | 180 ++++++++++++++++++ .../ConfirmTransactionContent.test.tsx | 176 +++++++++++++++++ ...teRegistrationDelegationContainer.test.tsx | 175 +++++++++++++++++ .../__tests__/utils.test.tsx | 47 ++++- .../HardForkInitiationActionContainer.tsx | 20 +- .../InfoActionContainer.tsx | 16 +- .../NewConstitutionActionContainer.tsx | 20 +- .../NoConfidenceActionContainer.tsx | 20 +- .../ParameterChangeActionContainer.tsx | 13 +- .../TreasuryWithdrawalsActionContainer.tsx | 16 +- .../UpdateCommitteeActionContainer.tsx | 26 ++- ...HardForkInitiationActionContainer.test.tsx | 8 +- .../__tests__/InfoActionContainer.test.tsx | 4 - .../NewConstitutionActionContainer.test.tsx | 8 +- .../NoConfidenceActionContainer.test.tsx | 8 +- ...reasuryWithdrawalsActionContainer.test.tsx | 4 +- .../UpdateCommitteeActionContainer.test.tsx | 8 +- .../src/lib/translations/en.json | 24 +-- ...rmStakeRegistrationDelegation.stories.tsx} | 0 ...=> ConfirmStakeVoteDelegation.stories.tsx} | 0 ...akeVoteRegistrationDelegation.stories.tsx} | 0 ...irmVoteRegistrationDelegation.stories.tsx} | 0 .../DappTransaction.stories.ts | 54 ------ .../DappTransaction.stories.tsx | 10 +- ...s => HardForkInitiationAction.stories.tsx} | 14 +- .../HardForkInitiationAction.tsx | 7 +- .../HardForkInitiationActionTypes.ts | 2 - ...tion.stories.ts => InfoAction.stories.tsx} | 11 -- .../InfoAction/InfoAction.tsx | 12 +- .../InfoAction/InfoActionTypes.ts | 3 - ...s.ts => NewConstitutionAction.stories.tsx} | 14 +- .../NewConstitutionAction.tsx | 7 +- .../NewConstitutionActionTypes.ts | 2 - ...ries.ts => NoConfidenceAction.stories.tsx} | 14 +- .../NoConfidenceAction/NoConfidenceAction.tsx | 7 +- .../NoConfidenceActionTypes.ts | 2 - ...s.ts => ParameterChangeAction.stories.tsx} | 0 .../ParameterChangeAction.tsx | 20 +- .../ParameterChangeAction/TechnicalGroup.tsx | 23 +-- ... => TreasuryWithdrawalsAction.stories.tsx} | 6 +- ...> UpdateCommitteeActionAction.stories.tsx} | 14 +- .../UpdateCommitteeActionAction.tsx | 69 +++---- .../UpdateCommitteeActionTypes.ts | 2 - .../components/ActionId.tsx | 4 +- .../components/ActionIdTypes.ts | 5 +- .../components/Procedure.tsx | 28 +-- .../components/ProcedureTypes.ts | 10 +- .../components/TransactionDetails.tsx | 2 +- 50 files changed, 1042 insertions(+), 390 deletions(-) create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmStakeRegistrationDelegationContainer.test.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmStakeVoteDelegationContainer.test.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmStakeVoteRegistrationDelegationContainer.test.tsx create mode 100644 apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmVoteRegistrationDelegationContainer.test.tsx rename packages/core/src/ui/components/ConfirmStakeRegistrationDelegation/{ConfirmStakeRegistrationDelegation.stories.ts => ConfirmStakeRegistrationDelegation.stories.tsx} (100%) rename packages/core/src/ui/components/ConfirmStakeVoteDelegation/{ConfirmStakeVoteDelegation.stories.ts => ConfirmStakeVoteDelegation.stories.tsx} (100%) rename packages/core/src/ui/components/ConfirmStakeVoteRegistrationDelegation/{ConfirmStakeVoteRegistrationDelegation.stories.ts => ConfirmStakeVoteRegistrationDelegation.stories.tsx} (100%) rename packages/core/src/ui/components/ConfirmVoteRegistrationDelegation/{ConfirmVoteRegistrationDelegation.stories.ts => ConfirmVoteRegistrationDelegation.stories.tsx} (100%) delete mode 100644 packages/core/src/ui/components/DappTransaction/DappTransaction.stories.ts rename packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/{HardForkInitiationAction.stories.ts => HardForkInitiationAction.stories.tsx} (80%) rename packages/core/src/ui/components/ProposalProcedures/InfoAction/{InfoAction.stories.ts => InfoAction.stories.tsx} (79%) rename packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/{NewConstitutionAction.stories.ts => NewConstitutionAction.stories.tsx} (82%) rename packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/{NoConfidenceAction.stories.ts => NoConfidenceAction.stories.tsx} (78%) rename packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/{ParameterChangeAction.stories.ts => ParameterChangeAction.stories.tsx} (100%) rename packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/{TreasuryWithdrawalsAction.stories.ts => TreasuryWithdrawalsAction.stories.tsx} (88%) rename packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/{UpdateCommitteeActionAction.stories.ts => UpdateCommitteeActionAction.stories.tsx} (85%) diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmStakeRegistrationDelegationContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmStakeRegistrationDelegationContainer.test.tsx new file mode 100644 index 0000000000..f8252136c2 --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmStakeRegistrationDelegationContainer.test.tsx @@ -0,0 +1,149 @@ +/* eslint-disable unicorn/no-null */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable import/imports-first */ +const mockUseWalletStore = jest.fn(); +const t = jest.fn().mockImplementation((res) => res); +const mockUseTranslation = jest.fn(() => ({ t })); +const mockConfirmStakeRegistrationDelegation = jest.fn(); +const mockLovelacesToAdaString = jest.fn(); +import * as React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import { ConfirmStakeRegistrationDelegationContainer } from '../ConfirmStakeRegistrationDelegationContainer'; +import '@testing-library/jest-dom'; +import { BehaviorSubject } from 'rxjs'; +import { act } from 'react-dom/test-utils'; +import { buildMockTx } from '@src/utils/mocks/tx'; +import { Wallet } from '@lace/cardano'; +import { getWrapper } from '../testing.utils'; + +const REWARD_ACCOUNT = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); +const STAKE_KEY_HASH = Wallet.Cardano.RewardAccount.toHash(REWARD_ACCOUNT); + +const assetInfo$ = new BehaviorSubject(new Map()); +const available$ = new BehaviorSubject([]); + +const inMemoryWallet = { + assetInfo$, + balance: { + utxo: { + available$ + } + } +}; + +const cardanoCoinMock = { + symbol: 'cardanoCoinMockSymbol' +}; + +jest.mock('@src/stores', () => ({ + ...jest.requireActual('@src/stores'), + useWalletStore: mockUseWalletStore +})); + +jest.mock('@lace/core', () => { + const original = jest.requireActual('@lace/core'); + return { + __esModule: true, + ...original, + ConfirmStakeRegistrationDelegation: mockConfirmStakeRegistrationDelegation + }; +}); + +jest.mock('react-i18next', () => { + const original = jest.requireActual('react-i18next'); + return { + __esModule: true, + ...original, + useTranslation: mockUseTranslation + }; +}); + +jest.mock('@lace/cardano', () => { + const actual = jest.requireActual('@lace/cardano'); + return { + __esModule: true, + ...actual, + Wallet: { + ...actual.Wallet, + util: { + ...actual.Wallet.util, + lovelacesToAdaString: mockLovelacesToAdaString + } + } + }; +}); + +describe('Testing ConfirmStakeRegistrationDelegationContainer component', () => { + beforeEach(() => { + mockUseWalletStore.mockReset(); + mockUseWalletStore.mockImplementation(() => ({ + inMemoryWallet, + walletUI: { cardanoCoin: cardanoCoinMock }, + walletInfo: {} + })); + mockConfirmStakeRegistrationDelegation.mockReset(); + mockConfirmStakeRegistrationDelegation.mockReturnValue(); + mockUseTranslation.mockReset(); + mockUseTranslation.mockImplementation(() => ({ t })); + mockLovelacesToAdaString.mockReset(); + mockLovelacesToAdaString.mockImplementation((val) => val); + }); + + afterEach(() => { + jest.resetModules(); + jest.resetAllMocks(); + cleanup(); + }); + + test('should render ConfirmStakeRegistrationDelegation component with proper props', async () => { + let queryByTestId: any; + + const dappInfo = { + name: 'dappName', + logo: 'dappLogo', + url: 'dappUrl' + }; + const certificate: Wallet.Cardano.Certificate = { + __typename: Wallet.Cardano.CertificateType.StakeRegistrationDelegation, + poolId: Wallet.Cardano.PoolId('pool126zlx7728y7xs08s8epg9qp393kyafy9rzr89g4qkvv4cv93zem'), + stakeCredential: { + type: Wallet.Cardano.CredentialType.KeyHash, + hash: Wallet.Crypto.Hash28ByteBase16(STAKE_KEY_HASH) + }, + deposit: BigInt('100000') + }; + const tx = buildMockTx({ + certificates: [certificate] + }); + const errorMessage = 'errorMessage'; + const props = { signTxData: { dappInfo, tx }, errorMessage }; + + await act(async () => { + ({ queryByTestId } = render(, { + wrapper: getWrapper() + })); + }); + + expect(queryByTestId('ConfirmStakeRegistrationDelegation')).toBeInTheDocument(); + expect(mockConfirmStakeRegistrationDelegation).toHaveBeenLastCalledWith( + { + dappInfo, + metadata: { + poolId: certificate.poolId, + stakeKeyHash: certificate.stakeCredential.hash, + depositPaid: `${certificate.deposit.toString()} ${cardanoCoinMock.symbol}` + }, + translations: { + metadata: t('core.StakeRegistrationDelegation.metadata'), + labels: { + poolId: t('core.StakeRegistrationDelegation.poolId'), + stakeKeyHash: t('core.StakeRegistrationDelegation.stakeKeyHash'), + depositPaid: t('core.StakeRegistrationDelegation.depositPaid') + } + }, + errorMessage + }, + {} + ); + }); +}); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmStakeVoteDelegationContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmStakeVoteDelegationContainer.test.tsx new file mode 100644 index 0000000000..ccd3dba70f --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmStakeVoteDelegationContainer.test.tsx @@ -0,0 +1,168 @@ +/* eslint-disable unicorn/no-null */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable import/imports-first */ +const mockUseWalletStore = jest.fn(); +const t = jest.fn().mockImplementation((res) => res); +const mockUseTranslation = jest.fn(() => ({ t })); +const mockConfirmStakeVoteDelegation = jest.fn(); +const mockIsDRepAlwaysAbstain = jest.fn(); +const mockIsDRepAlwaysNoConfidence = jest.fn(); +const mockIsDRepCredential = jest.fn(); +import * as React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import { ConfirmStakeVoteDelegationContainer } from '../ConfirmStakeVoteDelegationContainer'; +import '@testing-library/jest-dom'; +import { BehaviorSubject } from 'rxjs'; +import { act } from 'react-dom/test-utils'; +import { buildMockTx } from '@src/utils/mocks/tx'; +import { Wallet } from '@lace/cardano'; +import { getWrapper } from '../testing.utils'; + +const REWARD_ACCOUNT = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); +const STAKE_KEY_HASH = Wallet.Cardano.RewardAccount.toHash(REWARD_ACCOUNT); + +const assetInfo$ = new BehaviorSubject(new Map()); +const available$ = new BehaviorSubject([]); + +const inMemoryWallet = { + assetInfo$, + balance: { + utxo: { + available$ + } + } +}; + +const cardanoCoinMock = { + symbol: 'cardanoCoinMockSymbol' +}; + +jest.mock('@src/stores', () => ({ + ...jest.requireActual('@src/stores'), + useWalletStore: mockUseWalletStore +})); + +jest.mock('@lace/core', () => { + const original = jest.requireActual('@lace/core'); + return { + __esModule: true, + ...original, + ConfirmStakeVoteDelegation: mockConfirmStakeVoteDelegation + }; +}); + +jest.mock('react-i18next', () => { + const original = jest.requireActual('react-i18next'); + return { + __esModule: true, + ...original, + useTranslation: mockUseTranslation + }; +}); + +jest.mock('@lace/cardano', () => { + const actual = jest.requireActual('@lace/cardano'); + return { + __esModule: true, + ...actual, + Wallet: { + ...actual.Wallet, + Cardano: { + ...actual.Wallet.Cardano, + isDRepAlwaysAbstain: mockIsDRepAlwaysAbstain, + isDRepAlwaysNoConfidence: mockIsDRepAlwaysNoConfidence, + isDRepCredential: mockIsDRepCredential + } + } + }; +}); + +const isDRepAlwaysAbstainMocked = 'isDRepAlwaysAbstainMocked'; +const isDRepAlwaysNoConfidenceMocked = 'isDRepAlwaysNoConfidenceMocked'; + +describe('Testing ConfirmStakeVoteDelegationContainer component', () => { + beforeEach(() => { + mockUseWalletStore.mockReset(); + mockUseWalletStore.mockImplementation(() => ({ + inMemoryWallet, + walletUI: { cardanoCoin: cardanoCoinMock }, + walletInfo: {} + })); + mockConfirmStakeVoteDelegation.mockReset(); + mockConfirmStakeVoteDelegation.mockReturnValue(); + mockUseTranslation.mockReset(); + mockUseTranslation.mockImplementation(() => ({ t })); + mockIsDRepAlwaysAbstain.mockReset(); + mockIsDRepAlwaysAbstain.mockImplementation(() => isDRepAlwaysAbstainMocked); + mockIsDRepAlwaysNoConfidence.mockReset(); + mockIsDRepAlwaysNoConfidence.mockImplementation(() => isDRepAlwaysNoConfidenceMocked); + mockIsDRepCredential.mockReset(); + mockIsDRepCredential.mockImplementation(() => true); + }); + + afterEach(() => { + jest.resetModules(); + jest.resetAllMocks(); + cleanup(); + }); + + test('should render ConfirmStakeVoteDelegation component with proper props', async () => { + let queryByTestId: any; + + const dappInfo = { + name: 'dappName', + logo: 'dappLogo', + url: 'dappUrl' + }; + const certificate: Wallet.Cardano.Certificate = { + __typename: Wallet.Cardano.CertificateType.StakeVoteDelegation, + poolId: Wallet.Cardano.PoolId('pool126zlx7728y7xs08s8epg9qp393kyafy9rzr89g4qkvv4cv93zem'), + stakeCredential: { + type: Wallet.Cardano.CredentialType.KeyHash, + hash: Wallet.Crypto.Hash28ByteBase16(STAKE_KEY_HASH) + }, + dRep: { + type: Wallet.Cardano.CredentialType.KeyHash, + hash: Wallet.Crypto.Hash28ByteBase16(Buffer.from('dRepCredentialHashdRepCreden').toString('hex')) + } + }; + const tx = buildMockTx({ + certificates: [certificate] + }); + const errorMessage = 'errorMessage'; + const props = { signTxData: { dappInfo, tx }, errorMessage }; + + await act(async () => { + ({ queryByTestId } = render(, { + wrapper: getWrapper() + })); + }); + + expect(queryByTestId('ConfirmStakeVoteDelegation')).toBeInTheDocument(); + expect(mockConfirmStakeVoteDelegation).toHaveBeenLastCalledWith( + { + dappInfo, + metadata: { + poolId: certificate.poolId, + stakeKeyHash: certificate.stakeCredential.hash, + alwaysAbstain: isDRepAlwaysAbstainMocked, + alwaysNoConfidence: isDRepAlwaysNoConfidenceMocked, + drepId: (certificate.dRep as Wallet.Cardano.Credential).hash.toString() + }, + translations: { + metadata: t('core.StakeVoteDelegation.metadata'), + option: t('core.StakeVoteDelegation.option'), + labels: { + poolId: t('core.StakeVoteDelegation.poolId'), + stakeKeyHash: t('core.StakeVoteDelegation.stakeKeyHash'), + drepId: t('core.StakeVoteDelegation.drepId'), + alwaysAbstain: t('core.StakeVoteDelegation.alwaysAbstain'), + alwaysNoConfidence: t('core.StakeVoteDelegation.alwaysNoConfidence') + } + }, + errorMessage + }, + {} + ); + }); +}); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmStakeVoteRegistrationDelegationContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmStakeVoteRegistrationDelegationContainer.test.tsx new file mode 100644 index 0000000000..37aa8cb203 --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmStakeVoteRegistrationDelegationContainer.test.tsx @@ -0,0 +1,180 @@ +/* eslint-disable unicorn/no-null */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable import/imports-first */ +const mockUseWalletStore = jest.fn(); +const t = jest.fn().mockImplementation((res) => res); +const mockUseTranslation = jest.fn(() => ({ t })); +const mockConfirmStakeVoteRegistrationDelegation = jest.fn(); +const mockIsDRepAlwaysAbstain = jest.fn(); +const mockIsDRepAlwaysNoConfidence = jest.fn(); +const mockIsDRepCredential = jest.fn(); +const mockLovelacesToAdaString = jest.fn(); +import * as React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import { ConfirmStakeVoteRegistrationDelegationContainer } from '../ConfirmStakeVoteRegistrationDelegationContainer'; +import '@testing-library/jest-dom'; +import { BehaviorSubject } from 'rxjs'; +import { act } from 'react-dom/test-utils'; +import { buildMockTx } from '@src/utils/mocks/tx'; +import { Wallet } from '@lace/cardano'; +import { getWrapper } from '../testing.utils'; + +const REWARD_ACCOUNT = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); +const STAKE_KEY_HASH = Wallet.Cardano.RewardAccount.toHash(REWARD_ACCOUNT); + +const assetInfo$ = new BehaviorSubject(new Map()); +const available$ = new BehaviorSubject([]); + +const inMemoryWallet = { + assetInfo$, + balance: { + utxo: { + available$ + } + } +}; + +const cardanoCoinMock = { + symbol: 'cardanoCoinMockSymbol' +}; + +jest.mock('@src/stores', () => ({ + ...jest.requireActual('@src/stores'), + useWalletStore: mockUseWalletStore +})); + +jest.mock('@lace/core', () => { + const original = jest.requireActual('@lace/core'); + return { + __esModule: true, + ...original, + ConfirmStakeVoteRegistrationDelegation: mockConfirmStakeVoteRegistrationDelegation + }; +}); + +jest.mock('react-i18next', () => { + const original = jest.requireActual('react-i18next'); + return { + __esModule: true, + ...original, + useTranslation: mockUseTranslation + }; +}); + +jest.mock('@lace/cardano', () => { + const actual = jest.requireActual('@lace/cardano'); + return { + __esModule: true, + ...actual, + Wallet: { + ...actual.Wallet, + util: { + ...actual.Wallet.util, + lovelacesToAdaString: mockLovelacesToAdaString + }, + Cardano: { + ...actual.Wallet.Cardano, + isDRepAlwaysAbstain: mockIsDRepAlwaysAbstain, + isDRepAlwaysNoConfidence: mockIsDRepAlwaysNoConfidence, + isDRepCredential: mockIsDRepCredential + } + } + }; +}); + +const isDRepAlwaysAbstainMocked = 'isDRepAlwaysAbstainMocked'; +const isDRepAlwaysNoConfidenceMocked = 'isDRepAlwaysNoConfidenceMocked'; + +describe('Testing ConfirmStakeVoteRegistrationDelegationContainer component', () => { + beforeEach(() => { + mockUseWalletStore.mockReset(); + mockUseWalletStore.mockImplementation(() => ({ + inMemoryWallet, + walletUI: { cardanoCoin: cardanoCoinMock }, + walletInfo: {} + })); + mockConfirmStakeVoteRegistrationDelegation.mockReset(); + mockConfirmStakeVoteRegistrationDelegation.mockReturnValue( + + ); + mockUseTranslation.mockReset(); + mockUseTranslation.mockImplementation(() => ({ t })); + mockLovelacesToAdaString.mockReset(); + mockLovelacesToAdaString.mockImplementation((val) => val); + mockIsDRepAlwaysAbstain.mockReset(); + mockIsDRepAlwaysAbstain.mockImplementation(() => isDRepAlwaysAbstainMocked); + mockIsDRepAlwaysNoConfidence.mockReset(); + mockIsDRepAlwaysNoConfidence.mockImplementation(() => isDRepAlwaysNoConfidenceMocked); + mockIsDRepCredential.mockReset(); + mockIsDRepCredential.mockImplementation(() => true); + }); + + afterEach(() => { + jest.resetModules(); + jest.resetAllMocks(); + cleanup(); + }); + + test('should render ConfirmStakeVoteRegistrationDelegation component with proper props', async () => { + let queryByTestId: any; + + const dappInfo = { + name: 'dappName', + logo: 'dappLogo', + url: 'dappUrl' + }; + const certificate: Wallet.Cardano.Certificate = { + __typename: Wallet.Cardano.CertificateType.StakeVoteRegistrationDelegation, + poolId: Wallet.Cardano.PoolId('pool126zlx7728y7xs08s8epg9qp393kyafy9rzr89g4qkvv4cv93zem'), + stakeCredential: { + type: Wallet.Cardano.CredentialType.KeyHash, + hash: Wallet.Crypto.Hash28ByteBase16(STAKE_KEY_HASH) + }, + dRep: { + type: Wallet.Cardano.CredentialType.KeyHash, + hash: Wallet.Crypto.Hash28ByteBase16(Buffer.from('dRepCredentialHashdRepCreden').toString('hex')) + }, + deposit: BigInt('100000') + }; + const tx = buildMockTx({ + certificates: [certificate] + }); + const errorMessage = 'errorMessage'; + const props = { signTxData: { dappInfo, tx }, errorMessage }; + + await act(async () => { + ({ queryByTestId } = render(, { + wrapper: getWrapper() + })); + }); + + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegation')).toBeInTheDocument(); + expect(mockConfirmStakeVoteRegistrationDelegation).toHaveBeenLastCalledWith( + { + dappInfo, + metadata: { + poolId: certificate.poolId, + stakeKeyHash: certificate.stakeCredential.hash, + depositPaid: `${certificate.deposit.toString()} ${cardanoCoinMock.symbol}`, + alwaysAbstain: isDRepAlwaysAbstainMocked, + alwaysNoConfidence: isDRepAlwaysNoConfidenceMocked, + drepId: (certificate.dRep as Wallet.Cardano.Credential).hash.toString() + }, + translations: { + metadata: t('core.StakeVoteDelegationRegistration.metadata'), + option: t('core.StakeVoteDelegationRegistration.option'), + labels: { + poolId: t('core.StakeVoteDelegationRegistration.poolId'), + stakeKeyHash: t('core.StakeVoteDelegationRegistration.stakeKeyHash'), + drepId: t('core.StakeVoteDelegationRegistration.drepId'), + alwaysAbstain: t('core.StakeVoteDelegationRegistration.alwaysAbstain'), + alwaysNoConfidence: t('core.StakeVoteDelegationRegistration.alwaysNoConfidence'), + depositPaid: t('core.StakeVoteDelegationRegistration.depositPaid') + } + }, + errorMessage + }, + {} + ); + }); +}); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmTransactionContent.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmTransactionContent.test.tsx index 931151a429..3386aff6be 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmTransactionContent.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmTransactionContent.test.tsx @@ -10,6 +10,18 @@ const mockConfirmDRepUpdateContainer = jest.fn(() => ); const mockVotingProceduresContainer = jest.fn(() => ); const mockProposalProceduresContainer = jest.fn(() => ); +const mockConfirmVoteRegistrationDelegationContainer = jest.fn(() => ( + +)); +const mockConfirmStakeRegistrationDelegationContainer = jest.fn(() => ( + +)); +const mockConfirmStakeVoteRegistrationDelegationContainer = jest.fn(() => ( + +)); +const mockConfirmStakeVoteDelegationContainer = jest.fn(() => ( + +)); const mockDappTransactionContainer = jest.fn(() => ); import * as React from 'react'; import { cleanup, render } from '@testing-library/react'; @@ -81,6 +93,42 @@ jest.mock('../ProposalProceduresContainer', () => { }; }); +jest.mock('../ConfirmVoteRegistrationDelegationContainer', () => { + const original = jest.requireActual('../ConfirmVoteRegistrationDelegationContainer'); + return { + __esModule: true, + ...original, + ConfirmVoteRegistrationDelegationContainer: mockConfirmVoteRegistrationDelegationContainer + }; +}); + +jest.mock('../ConfirmStakeRegistrationDelegationContainer', () => { + const original = jest.requireActual('../ConfirmStakeRegistrationDelegationContainer'); + return { + __esModule: true, + ...original, + ConfirmStakeRegistrationDelegationContainer: mockConfirmStakeRegistrationDelegationContainer + }; +}); + +jest.mock('../ConfirmStakeVoteRegistrationDelegationContainer', () => { + const original = jest.requireActual('../ConfirmStakeVoteRegistrationDelegationContainer'); + return { + __esModule: true, + ...original, + ConfirmStakeVoteRegistrationDelegationContainer: mockConfirmStakeVoteRegistrationDelegationContainer + }; +}); + +jest.mock('../ConfirmStakeVoteDelegationContainer', () => { + const original = jest.requireActual('../ConfirmStakeVoteDelegationContainer'); + return { + __esModule: true, + ...original, + ConfirmStakeVoteDelegationContainer: mockConfirmStakeVoteDelegationContainer + }; +}); + jest.mock('../DappTransactionContainer', () => { const original = jest.requireActual('../DappTransactionContainer'); return { @@ -117,6 +165,10 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockSkeleton).toHaveBeenLastCalledWith({ loading: true }, {}); }); @@ -137,6 +189,10 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockConfirmDRepRegistrationContainer).toHaveBeenLastCalledWith(props, {}); }); @@ -157,6 +213,10 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockConfirmDRepRetirementContainer).toHaveBeenLastCalledWith(props, {}); }); @@ -177,6 +237,10 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockConfirmDRepUpdateContainer).toHaveBeenLastCalledWith(props, {}); }); @@ -197,6 +261,10 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmVoteDelegationContainer')).toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockConfirmVoteDelegationContainer).toHaveBeenLastCalledWith(props, {}); }); @@ -217,6 +285,10 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).toBeInTheDocument(); expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockVotingProceduresContainer).toHaveBeenLastCalledWith(props, {}); }); @@ -237,10 +309,110 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('ProposalProceduresContainer')).toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); expect(mockProposalProceduresContainer).toHaveBeenLastCalledWith(props, {}); }); + test('should render ConfirmVoteRegistrationDelegationContainer with proper props', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render( + + )); + }); + + expect(queryByTestId('skeleton')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepRegistrationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepRetirementContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepUpdateContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteRegistrationDelegationContainer')).toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); + expect(mockConfirmVoteRegistrationDelegationContainer).toHaveBeenLastCalledWith(props, {}); + }); + + test('should render ConfirmStakeRegistrationDelegationContainer with proper props', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render( + + )); + }); + + expect(queryByTestId('skeleton')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepRegistrationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepRetirementContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepUpdateContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeRegistrationDelegationContainer')).toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); + expect(mockConfirmStakeRegistrationDelegationContainer).toHaveBeenLastCalledWith(props, {}); + }); + + test('should render ConfirmStakeVoteRegistrationDelegationContainer with proper props', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render( + + )); + }); + + expect(queryByTestId('skeleton')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepRegistrationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepRetirementContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepUpdateContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegationContainer')).toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); + expect(mockConfirmStakeVoteRegistrationDelegationContainer).toHaveBeenLastCalledWith(props, {}); + }); + + test('should render ConfirmStakeVoteDelegationContainer with proper props', async () => { + let queryByTestId: any; + + await act(async () => { + ({ queryByTestId } = render( + + )); + }); + + expect(queryByTestId('skeleton')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepRegistrationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepRetirementContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmDRepUpdateContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteDelegationContainer')).toBeInTheDocument(); + expect(queryByTestId('DappTransactionContainer')).not.toBeInTheDocument(); + expect(mockConfirmStakeVoteDelegationContainer).toHaveBeenLastCalledWith(props, {}); + }); + test('should render DappTransactionContainer with proper props', async () => { let queryByTestId: any; @@ -257,6 +429,10 @@ describe('Testing ConfirmTransactionContent component', () => { expect(queryByTestId('ConfirmVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('VotingProceduresContainer')).not.toBeInTheDocument(); expect(queryByTestId('ProposalProceduresContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteRegistrationDelegationContainer')).not.toBeInTheDocument(); + expect(queryByTestId('ConfirmStakeVoteDelegationContainer')).not.toBeInTheDocument(); expect(queryByTestId('DappTransactionContainer')).toBeInTheDocument(); expect(mockDappTransactionContainer).toHaveBeenLastCalledWith(props, {}); }); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmVoteRegistrationDelegationContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmVoteRegistrationDelegationContainer.test.tsx new file mode 100644 index 0000000000..ffc8debe9f --- /dev/null +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/ConfirmVoteRegistrationDelegationContainer.test.tsx @@ -0,0 +1,175 @@ +/* eslint-disable unicorn/no-null */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable import/imports-first */ +const mockUseWalletStore = jest.fn(); +const t = jest.fn().mockImplementation((res) => res); +const mockUseTranslation = jest.fn(() => ({ t })); +const mockConfirmVoteRegistrationDelegation = jest.fn(); +const mockIsDRepAlwaysAbstain = jest.fn(); +const mockIsDRepAlwaysNoConfidence = jest.fn(); +const mockIsDRepCredential = jest.fn(); +const mockLovelacesToAdaString = jest.fn(); +import * as React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import { ConfirmVoteRegistrationDelegationContainer } from '../ConfirmVoteRegistrationDelegationContainer'; +import '@testing-library/jest-dom'; +import { BehaviorSubject } from 'rxjs'; +import { act } from 'react-dom/test-utils'; +import { buildMockTx } from '@src/utils/mocks/tx'; +import { Wallet } from '@lace/cardano'; +import { getWrapper } from '../testing.utils'; + +const REWARD_ACCOUNT = Wallet.Cardano.RewardAccount('stake_test1uqrw9tjymlm8wrwq7jk68n6v7fs9qz8z0tkdkve26dylmfc2ux2hj'); +const STAKE_KEY_HASH = Wallet.Cardano.RewardAccount.toHash(REWARD_ACCOUNT); + +const assetInfo$ = new BehaviorSubject(new Map()); +const available$ = new BehaviorSubject([]); + +const inMemoryWallet = { + assetInfo$, + balance: { + utxo: { + available$ + } + } +}; + +const cardanoCoinMock = { + symbol: 'cardanoCoinMockSymbol' +}; + +jest.mock('@src/stores', () => ({ + ...jest.requireActual('@src/stores'), + useWalletStore: mockUseWalletStore +})); + +jest.mock('@lace/core', () => { + const original = jest.requireActual('@lace/core'); + return { + __esModule: true, + ...original, + ConfirmVoteRegistrationDelegation: mockConfirmVoteRegistrationDelegation + }; +}); + +jest.mock('react-i18next', () => { + const original = jest.requireActual('react-i18next'); + return { + __esModule: true, + ...original, + useTranslation: mockUseTranslation + }; +}); + +jest.mock('@lace/cardano', () => { + const actual = jest.requireActual('@lace/cardano'); + return { + __esModule: true, + ...actual, + Wallet: { + ...actual.Wallet, + util: { + ...actual.Wallet.util, + lovelacesToAdaString: mockLovelacesToAdaString + }, + Cardano: { + ...actual.Wallet.Cardano, + isDRepAlwaysAbstain: mockIsDRepAlwaysAbstain, + isDRepAlwaysNoConfidence: mockIsDRepAlwaysNoConfidence, + isDRepCredential: mockIsDRepCredential + } + } + }; +}); + +const isDRepAlwaysAbstainMocked = 'isDRepAlwaysAbstainMocked'; +const isDRepAlwaysNoConfidenceMocked = 'isDRepAlwaysNoConfidenceMocked'; + +describe('Testing ConfirmVoteRegistrationDelegationContainer component', () => { + beforeEach(() => { + mockUseWalletStore.mockReset(); + mockUseWalletStore.mockImplementation(() => ({ + inMemoryWallet, + walletUI: { cardanoCoin: cardanoCoinMock }, + walletInfo: {} + })); + mockConfirmVoteRegistrationDelegation.mockReset(); + mockConfirmVoteRegistrationDelegation.mockReturnValue(); + mockUseTranslation.mockReset(); + mockUseTranslation.mockImplementation(() => ({ t })); + mockLovelacesToAdaString.mockReset(); + mockLovelacesToAdaString.mockImplementation((val) => val); + mockIsDRepAlwaysAbstain.mockReset(); + mockIsDRepAlwaysAbstain.mockImplementation(() => isDRepAlwaysAbstainMocked); + mockIsDRepAlwaysNoConfidence.mockReset(); + mockIsDRepAlwaysNoConfidence.mockImplementation(() => isDRepAlwaysNoConfidenceMocked); + mockIsDRepCredential.mockReset(); + mockIsDRepCredential.mockImplementation(() => true); + }); + + afterEach(() => { + jest.resetModules(); + jest.resetAllMocks(); + cleanup(); + }); + + test('should render ConfirmVoteRegistrationDelegation component with proper props', async () => { + let queryByTestId: any; + + const dappInfo = { + name: 'dappName', + logo: 'dappLogo', + url: 'dappUrl' + }; + const certificate: Wallet.Cardano.Certificate = { + __typename: Wallet.Cardano.CertificateType.VoteRegistrationDelegation, + stakeCredential: { + type: Wallet.Cardano.CredentialType.KeyHash, + hash: Wallet.Crypto.Hash28ByteBase16(STAKE_KEY_HASH) + }, + dRep: { + type: Wallet.Cardano.CredentialType.KeyHash, + hash: Wallet.Crypto.Hash28ByteBase16(Buffer.from('dRepCredentialHashdRepCreden').toString('hex')) + }, + deposit: BigInt('100000') + }; + const tx = buildMockTx({ + certificates: [certificate] + }); + const errorMessage = 'errorMessage'; + const props = { signTxData: { dappInfo, tx }, errorMessage }; + + await act(async () => { + ({ queryByTestId } = render(, { + wrapper: getWrapper() + })); + }); + + expect(queryByTestId('ConfirmVoteRegistrationDelegation')).toBeInTheDocument(); + expect(mockConfirmVoteRegistrationDelegation).toHaveBeenLastCalledWith( + { + dappInfo, + metadata: { + depositPaid: `${certificate.deposit.toString()} ${cardanoCoinMock.symbol}`, + stakeKeyHash: certificate.stakeCredential.hash, + alwaysAbstain: isDRepAlwaysAbstainMocked, + alwaysNoConfidence: isDRepAlwaysNoConfidenceMocked, + drepId: (certificate.dRep as Wallet.Cardano.Credential).hash.toString() + }, + translations: { + metadata: t('core.VoteRegistrationDelegation.metadata'), + option: t('core.VoteRegistrationDelegation.option'), + labels: { + drepId: t('core.VoteRegistrationDelegation.drepId'), + alwaysAbstain: t('core.VoteRegistrationDelegation.alwaysAbstain'), + alwaysNoConfidence: t('core.VoteRegistrationDelegation.alwaysNoConfidence'), + depositPaid: t('core.VoteRegistrationDelegation.depositPaid'), + stakeKeyHash: t('core.VoteRegistrationDelegation.stakeKeyHash') + } + }, + errorMessage + }, + {} + ); + }); +}); diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/utils.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/utils.test.tsx index d998977a9f..a43ecc32b0 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/utils.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/__tests__/utils.test.tsx @@ -102,37 +102,66 @@ describe('Testing utils', () => { const txInspectorCurriedFnPayload = { minted: [], burned: [] } as unknown as any; const createTxInspectorSpy = jest .spyOn(Core, 'createTxInspector') - .mockReturnValueOnce(() => ({ ...txInspectorCurriedFnPayload, votingProcedures: true })); - expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.VotingProcedures); + .mockReturnValueOnce(() => ({ ...txInspectorCurriedFnPayload, proposalProcedures: true })); + expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.ProposalProcedures); expect(createTxInspectorSpy).toHaveBeenCalledTimes(1); + createTxInspectorSpy.mockReturnValueOnce(() => ({ ...txInspectorCurriedFnPayload, votingProcedures: true })); + expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.VotingProcedures); + expect(createTxInspectorSpy).toHaveBeenCalledTimes(2); + createTxInspectorSpy.mockReturnValueOnce(() => ({ ...txInspectorCurriedFnPayload, minted: { length: 1 } })); expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.Mint); - expect(createTxInspectorSpy).toHaveBeenCalledTimes(2); + expect(createTxInspectorSpy).toHaveBeenCalledTimes(3); createTxInspectorSpy.mockReturnValueOnce(() => ({ ...txInspectorCurriedFnPayload, burned: { length: 1 } })); expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.Burn); - expect(createTxInspectorSpy).toHaveBeenCalledTimes(3); + expect(createTxInspectorSpy).toHaveBeenCalledTimes(4); createTxInspectorSpy.mockReturnValueOnce(() => ({ ...txInspectorCurriedFnPayload, dRepRegistration: true })); expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.DRepRegistration); - expect(createTxInspectorSpy).toHaveBeenCalledTimes(4); + expect(createTxInspectorSpy).toHaveBeenCalledTimes(5); createTxInspectorSpy.mockReturnValueOnce(() => ({ ...txInspectorCurriedFnPayload, dRepRetirement: true })); expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.DRepRetirement); - expect(createTxInspectorSpy).toHaveBeenCalledTimes(5); + expect(createTxInspectorSpy).toHaveBeenCalledTimes(6); createTxInspectorSpy.mockReturnValueOnce(() => ({ ...txInspectorCurriedFnPayload, voteDelegation: true })); expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.VoteDelegation); - expect(createTxInspectorSpy).toHaveBeenCalledTimes(6); + expect(createTxInspectorSpy).toHaveBeenCalledTimes(7); createTxInspectorSpy.mockReturnValueOnce(() => ({ ...txInspectorCurriedFnPayload, dRepUpdate: true })); expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.DRepUpdate); - expect(createTxInspectorSpy).toHaveBeenCalledTimes(7); + expect(createTxInspectorSpy).toHaveBeenCalledTimes(8); + + createTxInspectorSpy.mockReturnValueOnce(() => ({ ...txInspectorCurriedFnPayload, stakeVoteDelegation: true })); + expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.StakeVoteDelegation); + expect(createTxInspectorSpy).toHaveBeenCalledTimes(9); + + createTxInspectorSpy.mockReturnValueOnce(() => ({ + ...txInspectorCurriedFnPayload, + voteRegistrationDelegation: true + })); + expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.VoteRegistrationDelegation); + expect(createTxInspectorSpy).toHaveBeenCalledTimes(10); + + createTxInspectorSpy.mockReturnValueOnce(() => ({ + ...txInspectorCurriedFnPayload, + stakeRegistrationDelegation: true + })); + expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.StakeRegistrationDelegation); + expect(createTxInspectorSpy).toHaveBeenCalledTimes(11); + + createTxInspectorSpy.mockReturnValueOnce(() => ({ + ...txInspectorCurriedFnPayload, + stakeVoteDelegationRegistration: true + })); + expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.StakeVoteDelegationRegistration); + expect(createTxInspectorSpy).toHaveBeenCalledTimes(12); createTxInspectorSpy.mockReturnValueOnce(() => ({ ...txInspectorCurriedFnPayload })); expect(getTxType(tx)).toEqual(Wallet.Cip30TxType.Send); - expect(createTxInspectorSpy).toHaveBeenCalledTimes(8); + expect(createTxInspectorSpy).toHaveBeenCalledTimes(13); }); test('testing drepIDasBech32FromHash', () => { diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/HardForkInitiationActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/HardForkInitiationActionContainer.tsx index 127032903c..30b937804e 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/HardForkInitiationActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/HardForkInitiationActionContainer.tsx @@ -45,10 +45,6 @@ export const HardForkInitiationActionContainer = ({ hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, - governanceAction: { - id: t('core.ProposalProcedure.governanceAction.hardForkInitiation.actionId.id'), - index: t('core.ProposalProcedure.governanceAction.hardForkInitiation.actionId.index') - }, protocolVersion: { major: t('core.ProposalProcedure.governanceAction.hardForkInitiation.protocolVersion.major'), minor: t('core.ProposalProcedure.governanceAction.hardForkInitiation.protocolVersion.minor'), @@ -57,7 +53,7 @@ export const HardForkInitiationActionContainer = ({ actionId: { title: t('core.ProposalProcedure.governanceAction.actionId.title'), index: t('core.ProposalProcedure.governanceAction.actionId.index'), - txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + txId: t('core.ProposalProcedure.governanceAction.actionId.txId') } }), [t] @@ -72,13 +68,11 @@ export const HardForkInitiationActionContainer = ({ rewardAccount }, procedure: { - ...(anchor && { - anchor: { - url: anchor.url, - hash: anchor.dataHash, - ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) - } - }) + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } }, protocolVersion: { major: protocolVersion.major.toString(), @@ -86,7 +80,7 @@ export const HardForkInitiationActionContainer = ({ patch: protocolVersion.patch?.toString() }, ...(governanceActionId && { - governanceAction: { + actionId: { index: governanceActionId.actionIndex.toString(), id: governanceActionId.id || '' } diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/InfoActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/InfoActionContainer.tsx index 683536a843..de46a3b62f 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/InfoActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/InfoActionContainer.tsx @@ -28,10 +28,6 @@ export const InfoActionContainer = ({ dappInfo, anchor, errorMessage }: Props): url: t('core.ProposalProcedure.procedure.anchor.url'), hash: t('core.ProposalProcedure.procedure.anchor.hash') } - }, - actionId: { - index: t('core.ProposalProcedure.governanceAction.actionId.index'), - txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') } }), [t] @@ -42,13 +38,11 @@ export const InfoActionContainer = ({ dappInfo, anchor, errorMessage }: Props): txType: t('core.ProposalProcedure.governanceAction.infoAction.title') }, procedure: { - ...(anchor && { - anchor: { - url: anchor.url, - hash: anchor.dataHash, - ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) - } - }) + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } } }; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NewConstitutionActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NewConstitutionActionContainer.tsx index adb6098903..de84864942 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NewConstitutionActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NewConstitutionActionContainer.tsx @@ -45,10 +45,6 @@ export const NewConstitutionActionContainer = ({ hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, - governanceAction: { - id: t('core.ProposalProcedure.governanceAction.newConstitutionAction.actionId.id'), - index: t('core.ProposalProcedure.governanceAction.newConstitutionAction.actionId.index') - }, constitution: { title: t('core.ProposalProcedure.governanceAction.newConstitutionAction.constitution.title'), anchor: { @@ -60,7 +56,7 @@ export const NewConstitutionActionContainer = ({ actionId: { title: t('core.ProposalProcedure.governanceAction.actionId.title'), index: t('core.ProposalProcedure.governanceAction.actionId.index'), - txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + txId: t('core.ProposalProcedure.governanceAction.actionId.txId') } }), [t] @@ -75,16 +71,14 @@ export const NewConstitutionActionContainer = ({ rewardAccount }, procedure: { - ...(anchor && { - anchor: { - url: anchor.url, - hash: anchor.dataHash, - ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) - } - }) + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } }, ...(governanceActionId && { - governanceAction: { + actionId: { index: governanceActionId.actionIndex.toString(), id: governanceActionId.id || '' } diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NoConfidenceActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NoConfidenceActionContainer.tsx index 6ba8e0afdc..7605b54424 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NoConfidenceActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/NoConfidenceActionContainer.tsx @@ -45,14 +45,10 @@ export const NoConfidenceActionContainer = ({ hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, - governanceAction: { - id: t('core.ProposalProcedure.governanceAction.noConfidenceAction.actionId.id'), - index: t('core.ProposalProcedure.governanceAction.noConfidenceAction.actionId.index') - }, actionId: { title: t('core.ProposalProcedure.governanceAction.actionId.title'), index: t('core.ProposalProcedure.governanceAction.actionId.index'), - txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + txId: t('core.ProposalProcedure.governanceAction.actionId.txId') } }), [t] @@ -67,16 +63,14 @@ export const NoConfidenceActionContainer = ({ rewardAccount }, procedure: { - ...(anchor && { - anchor: { - url: anchor.url, - hash: anchor.dataHash, - ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) - } - }) + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } }, ...(governanceActionId && { - governanceAction: { + actionId: { index: governanceActionId.actionIndex.toString(), id: governanceActionId.id || '' } diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/ParameterChangeActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/ParameterChangeActionContainer.tsx index 114a0aa6c0..31264a6be2 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/ParameterChangeActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/ParameterChangeActionContainer.tsx @@ -260,13 +260,11 @@ export const ParameterChangeActionContainer = ({ deposit: `${Wallet.util.lovelacesToAdaString(deposit.toString())} ${cardanoCoin.symbol}`, rewardAccount }, - ...(anchor && { - anchor: { - url: anchor.url, - hash: anchor.dataHash, - ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) - } - }), + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + }, protocolParamUpdate: { maxTxExUnits: { memory: maxExecutionUnitsPerTransaction.memory.toString(), @@ -301,6 +299,7 @@ export const ParameterChangeActionContainer = ({ a0: poolInfluence, eMax: poolRetirementEpochBound.toString(), nOpt: desiredNumberOfPools.toString(), + // TODO: review cost model syntax/display costModels: { PlutusV1: Object.entries(costModels.get(Wallet.Cardano.PlutusLanguageVersion.V1)).reduce( (acc, cur) => ({ ...acc, [cur[0]]: cur[1] }), diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/TreasuryWithdrawalsActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/TreasuryWithdrawalsActionContainer.tsx index e6c714aa64..6cb2d0d385 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/TreasuryWithdrawalsActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/TreasuryWithdrawalsActionContainer.tsx @@ -48,7 +48,7 @@ export const TreasuryWithdrawalsActionContainer = ({ actionId: { title: t('core.ProposalProcedure.governanceAction.actionId.title'), index: t('core.ProposalProcedure.governanceAction.actionId.index'), - txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + txId: t('core.ProposalProcedure.governanceAction.actionId.txId') }, withdrawals: { title: t('core.ProposalProcedure.governanceAction.treasuryWithdrawals.title'), @@ -68,17 +68,15 @@ export const TreasuryWithdrawalsActionContainer = ({ rewardAccount }, procedure: { - ...(anchor && { - anchor: { - url: anchor.url, - hash: anchor.dataHash, - ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) - } - }) + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } }, withdrawals: [...withdrawals].map((withdrawal) => ({ rewardAccount: withdrawal.rewardAccount.toString(), - lovelace: Wallet.util.lovelacesToAdaString(withdrawal.coin.toString()) + lovelace: `${Wallet.util.lovelacesToAdaString(withdrawal.coin.toString())} ${cardanoCoin.symbol}` })) }; diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/UpdateCommitteeActionContainer.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/UpdateCommitteeActionContainer.tsx index b32ef34ce0..0a01112d1f 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/UpdateCommitteeActionContainer.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/UpdateCommitteeActionContainer.tsx @@ -45,14 +45,10 @@ export const UpdateCommitteeActionContainer = ({ hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, - governanceAction: { - id: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.actionId.id'), - index: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.actionId.index') - }, actionId: { title: t('core.ProposalProcedure.governanceAction.actionId.title'), index: t('core.ProposalProcedure.governanceAction.actionId.index'), - txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + txId: t('core.ProposalProcedure.governanceAction.actionId.txId') }, membersToBeAdded: { title: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.title'), @@ -80,27 +76,29 @@ export const UpdateCommitteeActionContainer = ({ rewardAccount }, procedure: { - ...(anchor && { - anchor: { - url: anchor.url, - hash: anchor.dataHash, - ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) - } - }) + anchor: { + url: anchor.url, + hash: anchor.dataHash, + ...(explorerBaseUrl && { txHashUrl: `${explorerBaseUrl}/${anchor.dataHash}` }) + } }, ...(governanceActionId && { - governanceAction: { + actionId: { index: governanceActionId.actionIndex.toString(), id: governanceActionId.id || '' } }), membersToBeAdded: [...membersToBeAdded].map(({ coldCredential: { hash }, epoch }) => ({ coldCredential: { + // TODO: use bech32 in future revision hash: hash.toString() }, epoch: epoch.toString() })), - membersToBeRemoved: [...membersToBeRemoved].map(({ hash }) => ({ hash: hash.toString() })) + membersToBeRemoved: [...membersToBeRemoved].map(({ hash }) => ({ + // TODO: use bech32 in future revision + hash: hash.toString() + })) }; return ( diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/HardForkInitiationActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/HardForkInitiationActionContainer.test.tsx index 6b494d1565..3ff6302ac4 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/HardForkInitiationActionContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/HardForkInitiationActionContainer.test.tsx @@ -137,7 +137,7 @@ describe('Testing ProposalProceduresContainer component', () => { minor: hardForkInitiationAction.protocolVersion.minor.toString(), patch: hardForkInitiationAction.protocolVersion.patch?.toString() }, - governanceAction: { + actionId: { index: hardForkInitiationAction.governanceActionId.actionIndex.toString(), id: hardForkInitiationAction.governanceActionId.id || '' } @@ -156,10 +156,6 @@ describe('Testing ProposalProceduresContainer component', () => { hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, - governanceAction: { - id: t('core.ProposalProcedure.governanceAction.hardForkInitiation.actionId.id'), - index: t('core.ProposalProcedure.governanceAction.hardForkInitiation.actionId.index') - }, protocolVersion: { major: t('core.ProposalProcedure.governanceAction.hardForkInitiation.protocolVersion.major'), minor: t('core.ProposalProcedure.governanceAction.hardForkInitiation.protocolVersion.minor'), @@ -168,7 +164,7 @@ describe('Testing ProposalProceduresContainer component', () => { actionId: { title: t('core.ProposalProcedure.governanceAction.actionId.title'), index: t('core.ProposalProcedure.governanceAction.actionId.index'), - txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + txId: t('core.ProposalProcedure.governanceAction.actionId.txId') } }, errorMessage diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/InfoActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/InfoActionContainer.test.tsx index 244b14e4da..e4b11d214c 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/InfoActionContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/InfoActionContainer.test.tsx @@ -105,10 +105,6 @@ describe('Testing ProposalProceduresContainer component', () => { url: t('core.ProposalProcedure.procedure.anchor.url'), hash: t('core.ProposalProcedure.procedure.anchor.hash') } - }, - actionId: { - index: t('core.ProposalProcedure.governanceAction.actionId.index'), - txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') } }, errorMessage diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NewConstitutionActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NewConstitutionActionContainer.test.tsx index 690c78b484..468233c9b3 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NewConstitutionActionContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NewConstitutionActionContainer.test.tsx @@ -131,7 +131,7 @@ describe('Testing ProposalProceduresContainer component', () => { txHashUrl: `${mockedCExpolorerBaseUrl}/${anchor.dataHash}` } }, - governanceAction: { + actionId: { index: newConstitution.governanceActionId.actionIndex.toString(), id: newConstitution.governanceActionId.id || '' }, @@ -157,10 +157,6 @@ describe('Testing ProposalProceduresContainer component', () => { hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, - governanceAction: { - id: t('core.ProposalProcedure.governanceAction.newConstitutionAction.actionId.id'), - index: t('core.ProposalProcedure.governanceAction.newConstitutionAction.actionId.index') - }, constitution: { title: t('core.ProposalProcedure.governanceAction.newConstitutionAction.constitution.title'), anchor: { @@ -172,7 +168,7 @@ describe('Testing ProposalProceduresContainer component', () => { actionId: { title: t('core.ProposalProcedure.governanceAction.actionId.title'), index: t('core.ProposalProcedure.governanceAction.actionId.index'), - txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + txId: t('core.ProposalProcedure.governanceAction.actionId.txId') } }, errorMessage diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NoConfidenceActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NoConfidenceActionContainer.test.tsx index b9a4f8411f..5d0d1ee411 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NoConfidenceActionContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/NoConfidenceActionContainer.test.tsx @@ -127,7 +127,7 @@ describe('Testing ProposalProceduresContainer component', () => { txHashUrl: `${mockedCExpolorerBaseUrl}/${anchor.dataHash}` } }, - governanceAction: { + actionId: { index: noConfidence.governanceActionId.actionIndex.toString(), id: noConfidence.governanceActionId.id || '' } @@ -146,14 +146,10 @@ describe('Testing ProposalProceduresContainer component', () => { hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, - governanceAction: { - id: t('core.ProposalProcedure.governanceAction.noConfidenceAction.actionId.id'), - index: t('core.ProposalProcedure.governanceAction.noConfidenceAction.actionId.index') - }, actionId: { title: t('core.ProposalProcedure.governanceAction.actionId.title'), index: t('core.ProposalProcedure.governanceAction.actionId.index'), - txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + txId: t('core.ProposalProcedure.governanceAction.actionId.txId') } }, errorMessage diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/TreasuryWithdrawalsActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/TreasuryWithdrawalsActionContainer.test.tsx index b7a9f868db..701b0c2be3 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/TreasuryWithdrawalsActionContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/TreasuryWithdrawalsActionContainer.test.tsx @@ -129,7 +129,7 @@ describe('Testing ProposalProceduresContainer component', () => { }, withdrawals: [...treasuryWithdrawalsAction.withdrawals].map((withdrawal) => ({ rewardAccount: withdrawal.rewardAccount.toString(), - lovelace: withdrawal.coin.toString() + lovelace: `${withdrawal.coin.toString()} ${cardanoCoinMock.symbol}` })) }, translations: { @@ -149,7 +149,7 @@ describe('Testing ProposalProceduresContainer component', () => { actionId: { title: t('core.ProposalProcedure.governanceAction.actionId.title'), index: t('core.ProposalProcedure.governanceAction.actionId.index'), - txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + txId: t('core.ProposalProcedure.governanceAction.actionId.txId') }, withdrawals: { title: t('core.ProposalProcedure.governanceAction.treasuryWithdrawals.title'), diff --git a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/UpdateCommitteeActionContainer.test.tsx b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/UpdateCommitteeActionContainer.test.tsx index b710109aa1..5c99335f63 100644 --- a/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/UpdateCommitteeActionContainer.test.tsx +++ b/apps/browser-extension-wallet/src/features/dapp/components/confirm-transaction/proposal-procedures/__tests__/UpdateCommitteeActionContainer.test.tsx @@ -153,7 +153,7 @@ describe('Testing ProposalProceduresContainer component', () => { txHashUrl: `${mockedCExpolorerBaseUrl}/${anchor.dataHash}` } }, - governanceAction: { + actionId: { index: updateCommittee.governanceActionId.actionIndex.toString(), id: updateCommittee.governanceActionId.id || '' }, @@ -179,14 +179,10 @@ describe('Testing ProposalProceduresContainer component', () => { hash: t('core.ProposalProcedure.procedure.anchor.hash') } }, - governanceAction: { - id: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.actionId.id'), - index: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.actionId.index') - }, actionId: { title: t('core.ProposalProcedure.governanceAction.actionId.title'), index: t('core.ProposalProcedure.governanceAction.actionId.index'), - txHash: t('core.ProposalProcedure.governanceAction.actionId.txHash') + txId: t('core.ProposalProcedure.governanceAction.actionId.txId') }, membersToBeAdded: { title: t('core.ProposalProcedure.governanceAction.updateCommitteeAction.membersToBeAdded.title'), diff --git a/apps/browser-extension-wallet/src/lib/translations/en.json b/apps/browser-extension-wallet/src/lib/translations/en.json index 7ec96c274f..26e7307368 100644 --- a/apps/browser-extension-wallet/src/lib/translations/en.json +++ b/apps/browser-extension-wallet/src/lib/translations/en.json @@ -1150,7 +1150,7 @@ "actionId": { "title": "Action ID", "index": "Index", - "txHash": "TX Hash" + "txId": "TX ID" }, "hardForkInitiation": { "title": "Hard Fork Initiation", @@ -1158,36 +1158,24 @@ "major": "Protocol Version Major", "minor": "Protocol Version Minor", "patch": "Protocol Version Patch" - }, - "actionId": { - "id": "Governance Action ID", - "index": "Action Index" } }, "newConstitutionAction": { "title": "New Constitution Action", - "actionId": { - "id": "Governance Action ID", - "index": "Governance Action Index" - }, "constitution": { "title": "Constitution Details", "anchor": { "dataHash": "Anchor Data Hash", - "url": "Anchor URL" + "url": "Constitution Anchor URL" }, - "scriptHash": "Script Hash" + "scriptHash": "Constitution Script Hash" } }, "infoAction": { "title": "Info Action" }, "noConfidenceAction": { - "title": "No Confidence", - "actionId": { - "id": "Governance Action ID", - "index": "Action Index" - } + "title": "No Confidence" }, "protocolParamUpdate": { "title": "Protocol Parameter Update", @@ -1302,10 +1290,6 @@ } }, "updateCommitteeAction": { - "actionId": { - "id": "Governance Action ID", - "index": "Governance Action Index" - }, "title": "Update Committee Action", "membersToBeAdded": { "title": "Members To Be Added", diff --git a/packages/core/src/ui/components/ConfirmStakeRegistrationDelegation/ConfirmStakeRegistrationDelegation.stories.ts b/packages/core/src/ui/components/ConfirmStakeRegistrationDelegation/ConfirmStakeRegistrationDelegation.stories.tsx similarity index 100% rename from packages/core/src/ui/components/ConfirmStakeRegistrationDelegation/ConfirmStakeRegistrationDelegation.stories.ts rename to packages/core/src/ui/components/ConfirmStakeRegistrationDelegation/ConfirmStakeRegistrationDelegation.stories.tsx diff --git a/packages/core/src/ui/components/ConfirmStakeVoteDelegation/ConfirmStakeVoteDelegation.stories.ts b/packages/core/src/ui/components/ConfirmStakeVoteDelegation/ConfirmStakeVoteDelegation.stories.tsx similarity index 100% rename from packages/core/src/ui/components/ConfirmStakeVoteDelegation/ConfirmStakeVoteDelegation.stories.ts rename to packages/core/src/ui/components/ConfirmStakeVoteDelegation/ConfirmStakeVoteDelegation.stories.tsx diff --git a/packages/core/src/ui/components/ConfirmStakeVoteRegistrationDelegation/ConfirmStakeVoteRegistrationDelegation.stories.ts b/packages/core/src/ui/components/ConfirmStakeVoteRegistrationDelegation/ConfirmStakeVoteRegistrationDelegation.stories.tsx similarity index 100% rename from packages/core/src/ui/components/ConfirmStakeVoteRegistrationDelegation/ConfirmStakeVoteRegistrationDelegation.stories.ts rename to packages/core/src/ui/components/ConfirmStakeVoteRegistrationDelegation/ConfirmStakeVoteRegistrationDelegation.stories.tsx diff --git a/packages/core/src/ui/components/ConfirmVoteRegistrationDelegation/ConfirmVoteRegistrationDelegation.stories.ts b/packages/core/src/ui/components/ConfirmVoteRegistrationDelegation/ConfirmVoteRegistrationDelegation.stories.tsx similarity index 100% rename from packages/core/src/ui/components/ConfirmVoteRegistrationDelegation/ConfirmVoteRegistrationDelegation.stories.ts rename to packages/core/src/ui/components/ConfirmVoteRegistrationDelegation/ConfirmVoteRegistrationDelegation.stories.tsx diff --git a/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.ts b/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.ts deleted file mode 100644 index 07525eac9c..0000000000 --- a/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { DappTransaction } from './DappTransaction'; -import { ComponentProps } from 'react'; -import { Wallet } from '@lace/cardano'; - -const meta: Meta = { - title: 'DappTransaction', - component: DappTransaction, - parameters: { - layout: 'centered' - } -}; - -export default meta; -type Story = StoryObj; - -const data: ComponentProps = { - dappInfo: { - logo: 'https://cdn.mint.handle.me/favicon.png', - name: 'Mint', - url: 'https://preprod.mint.handle.me' - }, - transaction: { - fee: '0.17', - outputs: [ - { - coins: '1', - recipient: - 'addr_test1qrl0s3nqfljv8dfckn7c4wkzu5rl6wn4hakkddcz2mczt3szlqss933x0aag07qcgspcaglmay6ufl4y4lalmlpe02mqhl0fx2' - } - ], - type: Wallet.Cip30TxType.Mint - } -}; - -export const Overview: Story = { - args: { - ...data - } -}; - -export const WithInsufficientFunds: Story = { - args: { - ...data - } -}; - -export const WithError: Story = { - args: { - ...data, - errorMessage: 'Something went wrong' - } -}; diff --git a/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.tsx b/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.tsx index 56f29d0531..07525eac9c 100644 --- a/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.tsx +++ b/packages/core/src/ui/components/DappTransaction/DappTransaction.stories.tsx @@ -2,6 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { DappTransaction } from './DappTransaction'; import { ComponentProps } from 'react'; +import { Wallet } from '@lace/cardano'; const meta: Meta = { title: 'DappTransaction', @@ -20,13 +21,6 @@ const data: ComponentProps = { name: 'Mint', url: 'https://preprod.mint.handle.me' }, - translations: { - recipient: 'Recipient', - amount: 'Amount', - adaFollowingNumericValue: 'ADA', - fee: 'Fee', - transaction: 'Transaction' - }, transaction: { fee: '0.17', outputs: [ @@ -36,7 +30,7 @@ const data: ComponentProps = { 'addr_test1qrl0s3nqfljv8dfckn7c4wkzu5rl6wn4hakkddcz2mczt3szlqss933x0aag07qcgspcaglmay6ufl4y4lalmlpe02mqhl0fx2' } ], - type: 'Mint' + type: Wallet.Cip30TxType.Mint } }; diff --git a/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.stories.tsx similarity index 80% rename from packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.stories.tsx index 753ddd8d09..b50685d593 100644 --- a/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.stories.tsx @@ -47,15 +47,9 @@ const data: ComponentProps = { txHashUrl: 'https://www.someurl.io' } }, - governanceAction: { - id: 'd0b1f7be72731a97e9728e0f1c358d576fd28aa9f290d53ce1ef803a1a753ba8', - index: '0' - }, actionId: { index: '0', - txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', - txHashUrl: - 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' + id: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0' }, protocolVersion: { major: '5', @@ -80,11 +74,7 @@ const data: ComponentProps = { actionId: { title: 'Action ID', index: 'Index', - txHash: 'TX Hash' - }, - governanceAction: { - id: 'Governance Action ID', - index: 'Action Index' + txId: 'TX ID' }, protocolVersion: { major: 'Protocol Version Major', diff --git a/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.tsx b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.tsx index 51d5b076ce..6a722f1018 100644 --- a/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationAction.tsx @@ -17,7 +17,7 @@ export interface HardForkInitiationActionProps { export const HardForkInitiationAction = ({ dappInfo, errorMessage, - data: { procedure, txDetails, governanceAction, protocolVersion, actionId }, + data: { procedure, txDetails, actionId, protocolVersion }, translations }: HardForkInitiationActionProps): JSX.Element => ( @@ -36,10 +36,7 @@ export const HardForkInitiationAction = ({ {/* procedure section */} - + diff --git a/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationActionTypes.ts index 2623304551..bd8ae61b7d 100644 --- a/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationActionTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/HardForkInitiationAction/HardForkInitiationActionTypes.ts @@ -5,7 +5,6 @@ import * as TxDetailsTypes from '../components/TransactionDetailsTypes'; export interface Data { txDetails: TxDetailsTypes.TxDetails; procedure: ProcedureTypes.Procedure; - governanceAction: ProcedureTypes.Procedure['governanceAction']; actionId?: ActionIdTypes.Data; protocolVersion: { major: string; @@ -17,7 +16,6 @@ export interface Data { export interface Translations { txDetails: TxDetailsTypes.Translations; procedure: ProcedureTypes.Translations; - governanceAction: ProcedureTypes.Translations['governanceAction']; actionId?: ActionIdTypes.Translations; protocolVersion: { major: string; diff --git a/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.stories.tsx similarity index 79% rename from packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.stories.tsx index c141ad2e40..3f97136d22 100644 --- a/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.stories.tsx @@ -44,12 +44,6 @@ const data: ComponentProps = { url: 'https://www.someurl.io', txHashUrl: 'https://www.someurl.io' } - }, - actionId: { - index: '0', - txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', - txHashUrl: - 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' } }, translations: { @@ -63,11 +57,6 @@ const data: ComponentProps = { url: 'Anchor URL' }, title: 'Procedure' - }, - actionId: { - title: 'Action ID', - index: 'Index', - txHash: 'TX Hash' } } }; diff --git a/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.tsx b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.tsx index f90084758e..b84260bd9a 100644 --- a/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoAction.tsx @@ -5,7 +5,6 @@ import { ErrorPane } from '@lace/common'; import * as Types from './InfoActionTypes'; import { TransactionDetails } from '../components/TransactionDetails'; import { Procedure } from '../components/Procedure'; -import { ActionId } from '../components/ActionId'; export interface InfoActionProps { dappInfo: Omit; @@ -17,7 +16,7 @@ export interface InfoActionProps { export const InfoAction = ({ dappInfo, errorMessage, - data: { procedure, txDetails, actionId }, + data: { procedure, txDetails }, translations }: InfoActionProps): JSX.Element => ( @@ -36,15 +35,6 @@ export const InfoAction = ({ {/* procedure section */} - {/* action id section*/} - {actionId && ( - <> - - - - - - )} ); diff --git a/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoActionTypes.ts index 585dfc0681..2f8853991e 100644 --- a/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoActionTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/InfoAction/InfoActionTypes.ts @@ -1,14 +1,11 @@ import * as ProcedureTypes from '../components/ProcedureTypes'; -import * as ActionIdTypes from '../components/ActionIdTypes'; import * as TxDetailsTypes from '../components/TransactionDetailsTypes'; export interface Data { txDetails: TxDetailsTypes.TxDetails; - actionId?: ActionIdTypes.Data; procedure: ProcedureTypes.Procedure; } export interface Translations { txDetails: TxDetailsTypes.Translations; - actionId?: ActionIdTypes.Translations; procedure: ProcedureTypes.Translations; } diff --git a/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.stories.tsx similarity index 82% rename from packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.stories.tsx index d3d12870c1..d6fc007a4c 100644 --- a/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.stories.tsx @@ -49,9 +49,7 @@ const data: ComponentProps = { }, actionId: { index: '0', - txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', - txHashUrl: - 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' + id: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0' }, constitution: { anchor: { @@ -59,10 +57,6 @@ const data: ComponentProps = { url: 'https://www.someurl.io' }, scriptHash: 'cb0ec2692497b458e46812c8a5bfa2931d1a2d965a99893828ec810f' - }, - governanceAction: { - id: 'd0b1f7be72731a97e9728e0f1c358d576fd28aa9f290d53ce1ef803a1a753ba8', - index: '0' } }, translations: { @@ -82,7 +76,7 @@ const data: ComponentProps = { actionId: { title: 'Action ID', index: 'Index', - txHash: 'TX Hash' + txId: 'TX ID' }, constitution: { title: 'Constitution Details', @@ -91,10 +85,6 @@ const data: ComponentProps = { url: 'Anchor URL' }, scriptHash: 'Script Hash' - }, - governanceAction: { - id: 'Governance Action ID', - index: 'Action Index' } } }; diff --git a/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.tsx b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.tsx index d8281fcfde..7fb710ab03 100644 --- a/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/NewConstitutionAction/NewConstitutionAction.tsx @@ -17,7 +17,7 @@ export interface NewConstitutionActionProps { export const NewConstitutionAction = ({ dappInfo, errorMessage, - data: { txDetails, procedure, governanceAction, constitution, actionId }, + data: { txDetails, procedure, constitution, actionId }, translations }: NewConstitutionActionProps): JSX.Element => ( @@ -36,10 +36,7 @@ export const NewConstitutionAction = ({ {/* procedure section */} - + = { }, actionId: { index: '0', - txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', - txHashUrl: - 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' - }, - governanceAction: { - id: 'd0b1f7be72731a97e9728e0f1c358d576fd28aa9f290d53ce1ef803a1a753ba8', - index: '0' + id: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0' } }, translations: { @@ -75,11 +69,7 @@ const data: ComponentProps = { actionId: { title: 'Action ID', index: 'Index', - txHash: 'TX Hash' - }, - governanceAction: { - id: 'Governance Action ID', - index: 'Action Index' + txId: 'TX ID' } } }; diff --git a/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.tsx b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.tsx index 815102dcf5..73034a6fe9 100644 --- a/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceAction.tsx @@ -17,7 +17,7 @@ export interface NoConfidenceActionProps { export const NoConfidenceAction = ({ dappInfo, errorMessage, - data: { procedure, txDetails, governanceAction, actionId }, + data: { procedure, txDetails, actionId }, translations }: NoConfidenceActionProps): JSX.Element => ( @@ -36,10 +36,7 @@ export const NoConfidenceAction = ({ {/* procedure section */} - + {/* action id section*/} {actionId && ( <> diff --git a/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceActionTypes.ts index b77ec21785..0cdfcea7d0 100644 --- a/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceActionTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/NoConfidenceAction/NoConfidenceActionTypes.ts @@ -5,13 +5,11 @@ import * as TxDetailsTypes from '../components/TransactionDetailsTypes'; export interface Data { procedure: ProcedureTypes.Procedure; actionId?: ActionIdTypes.Data; - governanceAction: ProcedureTypes.Procedure['governanceAction']; txDetails: TxDetailsTypes.TxDetails; } export interface Translations { procedure: ProcedureTypes.Translations; actionId?: ActionIdTypes.Translations; - governanceAction: ProcedureTypes.Translations['governanceAction']; txDetails: TxDetailsTypes.Translations; } diff --git a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.stories.tsx similarity index 100% rename from packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.stories.tsx diff --git a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.tsx b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.tsx index 3d61862e56..871101f707 100644 --- a/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/ParameterChangeAction/ParameterChangeAction.tsx @@ -39,16 +39,18 @@ export const ParameterChangeAction = ({ {/* tx details section */} - {anchor && ( - <> - - - - + <> + + + + + {anchor.txHashUrl ? ( - - - )} + ) : ( + + )} + + ({ - title: key, - fields: Object.entries(value).map(([cKey, cValue]) => ({ - label: cKey, - value: cValue - })) - })); + // TODO: review cost model syntax/display + // const costModels = Object.entries(technicalGroup.costModels).map(([key, value]) => ({ + // title: key, + // fields: Object.entries(value).map(([cKey, cValue]) => ({ + // label: cKey, + // value: cValue + // })) + // })); return ( <> @@ -40,7 +40,8 @@ export const TechnicalGroup = ({ technicalGroup, translations }: Props): JSX.Ele - + {/* TODO: review cost model syntax/display */} + {/* {translations.costModels} @@ -51,7 +52,7 @@ export const TechnicalGroup = ({ technicalGroup, translations }: Props): JSX.Ele ))} - + */} ); }; diff --git a/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.tsx similarity index 88% rename from packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.tsx index a8d14d89be..951be959cd 100644 --- a/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedures/TreasuryWithdrawalsAction/TreasuryWithdrawalsAction.stories.tsx @@ -55,9 +55,7 @@ const data: ComponentProps = { ], actionId: { index: '0', - txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', - txHashUrl: - 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' + id: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0' } }, translations: { @@ -77,7 +75,7 @@ const data: ComponentProps = { actionId: { title: 'Action ID', index: 'Index', - txHash: 'TX Hash' + txId: 'TX ID' }, withdrawals: { title: 'Withdrawal Details', diff --git a/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.tsx similarity index 85% rename from packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts rename to packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.tsx index 69cb8951bd..9750fa1551 100644 --- a/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.ts +++ b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.stories.tsx @@ -47,15 +47,9 @@ const data: ComponentProps = { txHashUrl: 'https://www.someurl.io' } }, - governanceAction: { - id: 'd0b1f7be72731a97e9728e0f1c358d576fd28aa9f290d53ce1ef803a1a753ba8', - index: '0' - }, actionId: { index: '0', - txHash: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0', - txHashUrl: - 'https://cexplorer.io/address/addr1q9wlvfl74g9h8txw5v0lfew2gjsw9z56d5kj8mmv5d8tudcx9eh8zefr3cxuje02lu6tgy083xkl39rr5xkj483vvd6q8nlapq' + id: '26bfdcc75a7f4d0cd8c71f0189bc5ca5ad2f4a3db6240c82b5a0edac7f9203e0' }, membersToBeAdded: [ { @@ -101,11 +95,7 @@ const data: ComponentProps = { actionId: { title: 'Action ID', index: 'Index', - txHash: 'TX Hash' - }, - governanceAction: { - id: 'Governance Action ID', - index: 'Action Index' + txId: 'TX ID' }, membersToBeAdded: { title: 'Members To Be Added', diff --git a/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx index e49e660aa0..97237316d5 100644 --- a/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionAction.tsx @@ -17,7 +17,7 @@ interface UpdateCommitteeActionProps { export const UpdateCommitteeAction = ({ dappInfo, errorMessage, - data: { procedure, governanceAction, txDetails, membersToBeAdded, membersToBeRemoved, actionId }, + data: { procedure, txDetails, membersToBeAdded, membersToBeRemoved, actionId }, translations }: UpdateCommitteeActionProps): JSX.Element => { const textCss = sx({ @@ -41,47 +41,48 @@ export const UpdateCommitteeAction = ({ {/* procedure section */} - + - {membersToBeAdded?.length > 0 && ( - - - {translations.membersToBeAdded.title} - - - )} - {membersToBeAdded.map(({ coldCredential, epoch }) => ( - - - - + {membersToBeAdded.length > 0 && ( + <> - + + {translations.membersToBeAdded.title} + - - ))} - {membersToBeRemoved?.length > 0 && ( - - - {translations.membersToBeRemoved.title} - - + {membersToBeAdded.map(({ coldCredential, epoch }) => ( + + + + + + + + + ))} + )} - {membersToBeRemoved.map(({ hash }) => ( - - - - + {membersToBeRemoved.length > 0 && ( + <> - + + {translations.membersToBeRemoved.title} + - - ))} + {membersToBeRemoved.map(({ hash }) => ( + + + + + + + + + ))} + + )} {actionId && ( <> diff --git a/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts index 563ffccab2..ce8b90745d 100644 --- a/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/UpdateCommitteeAction/UpdateCommitteeActionTypes.ts @@ -22,7 +22,6 @@ export interface Data { actionId?: ActionIdTypes.Data; txDetails: TxDetailsTypes.TxDetails; procedure: ProcedureTypes.Procedure; - governanceAction: ProcedureTypes.Procedure['governanceAction']; membersToBeAdded: MembersToBeAdded[]; membersToBeRemoved: MembersToBeRemoved[]; newQuorumThreshold?: NewQuorumThreshold; @@ -32,7 +31,6 @@ export interface Translations { procedure: ProcedureTypes.Translations; actionId?: ActionIdTypes.Translations; txDetails: TxDetailsTypes.Translations; - governanceAction: ProcedureTypes.Translations['governanceAction']; membersToBeAdded: { title: string; coldCredential: { diff --git a/packages/core/src/ui/components/ProposalProcedures/components/ActionId.tsx b/packages/core/src/ui/components/ProposalProcedures/components/ActionId.tsx index 6000165702..27112d1a52 100644 --- a/packages/core/src/ui/components/ProposalProcedures/components/ActionId.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/components/ActionId.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Cell, sx, Metadata, Text, MetadataLink } from '@lace/ui'; +import { Cell, sx, Metadata, Text } from '@lace/ui'; import * as Types from './ActionIdTypes'; interface Props { @@ -20,7 +20,7 @@ export const ActionId = ({ data, translations }: Props): JSX.Element => { - + diff --git a/packages/core/src/ui/components/ProposalProcedures/components/ActionIdTypes.ts b/packages/core/src/ui/components/ProposalProcedures/components/ActionIdTypes.ts index bc91ec2166..3dbb0d8824 100644 --- a/packages/core/src/ui/components/ProposalProcedures/components/ActionIdTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/components/ActionIdTypes.ts @@ -1,11 +1,10 @@ export interface Data { index: string; - txHash: string; - txHashUrl?: string; + id: string; } export interface Translations { title?: string; index: string; - txHash: string; + txId: string; } diff --git a/packages/core/src/ui/components/ProposalProcedures/components/Procedure.tsx b/packages/core/src/ui/components/ProposalProcedures/components/Procedure.tsx index 8bf119d9c5..682fcc21ff 100644 --- a/packages/core/src/ui/components/ProposalProcedures/components/Procedure.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/components/Procedure.tsx @@ -19,26 +19,14 @@ export const Procedure = ({ data, translations }: Props): JSX.Element => { {translations.title} - {data.anchor && ( - <> - - - - - - - - )} - {data.governanceAction && ( - <> - - - - - - - - )} + <> + + + + + + + ); }; diff --git a/packages/core/src/ui/components/ProposalProcedures/components/ProcedureTypes.ts b/packages/core/src/ui/components/ProposalProcedures/components/ProcedureTypes.ts index c2369feae1..a1ec2c00a7 100644 --- a/packages/core/src/ui/components/ProposalProcedures/components/ProcedureTypes.ts +++ b/packages/core/src/ui/components/ProposalProcedures/components/ProcedureTypes.ts @@ -1,13 +1,9 @@ export interface Procedure { - anchor?: { + anchor: { url: string; hash: string; txHashUrl: string; }; - governanceAction?: { - id: string; - index: string; - }; } export interface Translations { @@ -16,8 +12,4 @@ export interface Translations { url: string; hash: string; }; - governanceAction?: { - id: string; - index: string; - }; } diff --git a/packages/core/src/ui/components/ProposalProcedures/components/TransactionDetails.tsx b/packages/core/src/ui/components/ProposalProcedures/components/TransactionDetails.tsx index 269107fc7a..8a21c6b005 100644 --- a/packages/core/src/ui/components/ProposalProcedures/components/TransactionDetails.tsx +++ b/packages/core/src/ui/components/ProposalProcedures/components/TransactionDetails.tsx @@ -27,7 +27,7 @@ export const TransactionDetails = ({ data, translations }: Props): JSX.Element = )} - {data.rewardAccount && ( + {data.deposit && (