From 5e02f5a19c2a73977b61e368bf59c607f6513dd6 Mon Sep 17 00:00:00 2001 From: peetzweg/ Date: Tue, 9 Apr 2024 10:35:29 +0200 Subject: [PATCH 1/3] requires selected account for contract deployment and calling to be available in the current keyring --- src/ui/components/contract/Interact.tsx | 35 ++++++++++++++----------- src/ui/components/instantiate/Step1.tsx | 17 +++++++++--- src/ui/hooks/useAccountAvailable.ts | 16 +++++++++++ 3 files changed, 49 insertions(+), 19 deletions(-) create mode 100644 src/ui/hooks/useAccountAvailable.ts diff --git a/src/ui/components/contract/Interact.tsx b/src/ui/components/contract/Interact.tsx index f0813e1b..05d88bc6 100644 --- a/src/ui/components/contract/Interact.tsx +++ b/src/ui/components/contract/Interact.tsx @@ -1,33 +1,34 @@ // Copyright 2022-2024 @paritytech/contracts-ui authors & contributors // SPDX-License-Identifier: GPL-3.0-only -import { useEffect, useState, useRef, useMemo } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { ResultsOutput } from './ResultsOutput'; +import { BN_ZERO } from 'lib/bn'; +import { + decodeStorageDeposit, + getGasLimit, + getStorageDepositLimit, + transformUserInput, +} from 'lib/callOptions'; +import { getDecodedOutput } from 'lib/output'; import { AbiMessage, + Balance, + CallResult, ContractExecResult, + ContractOptions, ContractSubmittableResult, - CallResult, SubmittableResult, - ContractOptions, - Balance, UIContract, } from 'types'; import { AccountSelect } from 'ui/components/account'; -import { Dropdown, Button, Buttons } from 'ui/components/common'; +import { Button, Buttons, Dropdown } from 'ui/components/common'; import { ArgumentForm, Form, FormField, OptionsForm } from 'ui/components/form'; -import { BN_ZERO } from 'lib/bn'; import { useApi, useTransactions } from 'ui/contexts'; -import { useWeight, useBalance, useArgValues } from 'ui/hooks'; +import { useArgValues, useBalance, useWeight } from 'ui/hooks'; +import { useAccountAvailable } from 'ui/hooks/useAccountAvailable'; import { useStorageDepositLimit } from 'ui/hooks/useStorageDepositLimit'; import { createMessageOptions } from 'ui/util/dropdown'; -import { - decodeStorageDeposit, - getGasLimit, - getStorageDepositLimit, - transformUserInput, -} from 'lib/callOptions'; -import { getDecodedOutput } from 'lib/output'; interface Props { contract: UIContract; @@ -57,6 +58,7 @@ export const InteractTab = ({ const proofSize = useWeight(outcome?.gasRequired.proofSize.toBn()); const timeoutId = useRef(null); const isCustom = refTime.mode === 'custom' || proofSize.mode === 'custom'; + const isAccountAvailable = useAccountAvailable(accountId); useEffect((): void => { if (!accounts || accounts.length === 0) return; @@ -181,7 +183,8 @@ export const InteractTab = ({ !proofSize.isValid || txs[txId]?.status === 'processing' || !!outcome?.result.isErr || - !!decodedOutput?.isError; + !!decodedOutput?.isError || + isAccountAvailable === false; const isDispatchable = message?.isMutating || message?.isPayable; @@ -193,7 +196,9 @@ export const InteractTab = ({ className="caller mb-8" help="The sending account for this interaction. Any transaction fees will be deducted from this account." id="accountId" + isError={isAccountAvailable === false} label="Caller" + message="Selected Account is not available to sign extrinsics." > (); @@ -29,6 +30,7 @@ export function Step1() { const { setStep, setData, data, step } = useInstantiate(); const [accountId, setAccountId] = useState(''); + const isAccountAvailable = useAccountAvailable(accountId); const { value: name, onChange: setName, ...nameValidation } = useNonEmptyString(); const { @@ -94,6 +96,8 @@ export function Step1() { @@ -185,7 +189,12 @@ export function Step1() {