From 08ea57ee243b76fcaeb6520d454e148134f1c937 Mon Sep 17 00:00:00 2001 From: Jaco Date: Fri, 19 Aug 2022 11:40:45 +0200 Subject: [PATCH] Check for api.call.transactionPaymentApi for fees (#7996) --- .../page-accounts/src/modals/Transfer.tsx | 32 ++++++++----------- packages/react-hooks/src/useTxBatch.ts | 32 ++++++++++--------- packages/react-hooks/src/useWeight.ts | 18 +++++++---- packages/react-signer/src/PaymentInfo.tsx | 15 ++++----- 4 files changed, 50 insertions(+), 47 deletions(-) diff --git a/packages/page-accounts/src/modals/Transfer.tsx b/packages/page-accounts/src/modals/Transfer.tsx index 744e9b76fe..3d93bfd5d2 100644 --- a/packages/page-accounts/src/modals/Transfer.tsx +++ b/packages/page-accounts/src/modals/Transfer.tsx @@ -12,7 +12,7 @@ import { checkAddress } from '@polkadot/phishing'; import { InputAddress, InputBalance, MarkError, MarkWarning, Modal, Toggle, TxButton } from '@polkadot/react-components'; import { useApi, useCall } from '@polkadot/react-hooks'; import { Available } from '@polkadot/react-query'; -import { BN_HUNDRED, BN_ZERO, isFunction } from '@polkadot/util'; +import { BN_HUNDRED, BN_ZERO, isFunction, nextTick } from '@polkadot/util'; import { useTranslation } from '../translate'; @@ -58,27 +58,23 @@ function Transfer ({ className = '', onClose, recipientId: propRecipientId, send const fromId = propSenderId || senderId as string; const toId = propRecipientId || recipientId as string; - if (balances && balances.accountId?.eq(fromId) && fromId && toId && isFunction(api.rpc.payment?.queryInfo)) { - setTimeout((): void => { + if (balances && balances.accountId?.eq(fromId) && fromId && toId && api.call.transactionPaymentApi && api.tx.balances) { + nextTick(async (): Promise => { try { - api.tx.balances - ?.transfer(toId, balances.availableBalance) - .paymentInfo(fromId) - .then(({ partialFee }): void => { - const adjFee = partialFee.muln(110).div(BN_HUNDRED); - const maxTransfer = balances.availableBalance.sub(adjFee); + const extrinsic = api.tx.balances.transfer(toId, balances.availableBalance); + const { partialFee } = await extrinsic.paymentInfo(fromId); + const adjFee = partialFee.muln(110).div(BN_HUNDRED); + const maxTransfer = balances.availableBalance.sub(adjFee); - setMaxTransfer( - maxTransfer.gt(api.consts.balances?.existentialDeposit) - ? [maxTransfer, false] - : [null, true] - ); - }) - .catch(console.error); + setMaxTransfer( + api.consts.balances && maxTransfer.gt(api.consts.balances.existentialDeposit) + ? [maxTransfer, false] + : [null, true] + ); } catch (error) { - console.error((error as Error).message); + console.error(error); } - }, 0); + }); } else { setMaxTransfer([null, false]); } diff --git a/packages/react-hooks/src/useTxBatch.ts b/packages/react-hooks/src/useTxBatch.ts index 02f6c9a92f..a9de26ef68 100644 --- a/packages/react-hooks/src/useTxBatch.ts +++ b/packages/react-hooks/src/useTxBatch.ts @@ -8,7 +8,7 @@ import type { BatchOptions, BatchType } from './types'; import { useEffect, useMemo, useState } from 'react'; -import { isFunction } from '@polkadot/util'; +import { isFunction, nextTick } from '@polkadot/util'; import { createNamedHook } from './createNamedHook'; import { useAccounts } from './useAccounts'; @@ -46,26 +46,28 @@ function useTxBatchImpl (txs?: SubmittableExtrinsic<'promise'>[] | null | false, const [batchSize, setBatchSize] = useState(() => Math.floor(options?.max || 64)); useEffect((): void => { - txs && txs.length && allAccounts[0] && isFunction(api.rpc.payment?.queryInfo) && - txs[0] - .paymentInfo(allAccounts[0]) - .then((info) => + txs && txs.length && allAccounts[0] && api.call.transactionPaymentApi && + nextTick(async (): Promise => { + try { + const { weight } = await txs[0].paymentInfo(allAccounts[0]); + const maxBlock = api.consts.system.blockWeights + ? api.consts.system.blockWeights.maxBlock + : api.consts.system.maximumBlockWeight as Weight; + setBatchSize((prev) => - info.weight.isZero() + weight.isZero() ? prev : Math.floor( - ( - api.consts.system.blockWeights - ? api.consts.system.blockWeights.maxBlock - : api.consts.system.maximumBlockWeight as Weight - ) + maxBlock .muln(64) // 65% of the block weight on a single extrinsic (64 for safety) - .div(info.weight) + .div(weight) .toNumber() / 100 ) - ) - ) - .catch(console.error); + ); + } catch (error) { + console.error(error); + } + }); }, [allAccounts, api, options, txs]); return useMemo( diff --git a/packages/react-hooks/src/useWeight.ts b/packages/react-hooks/src/useWeight.ts index fd1ce413e2..0626496f90 100644 --- a/packages/react-hooks/src/useWeight.ts +++ b/packages/react-hooks/src/useWeight.ts @@ -6,7 +6,7 @@ import type { BN } from '@polkadot/util'; import { useEffect, useState } from 'react'; -import { BN_ZERO, isFunction } from '@polkadot/util'; +import { BN_ZERO, nextTick } from '@polkadot/util'; import { createNamedHook } from './createNamedHook'; import { useApi } from './useApi'; @@ -23,11 +23,17 @@ function useWeightImpl (call?: Call | null): [BN, number] { const [state, setState] = useState(EMPTY_STATE); useEffect((): void => { - if (call && isFunction(api.rpc.payment?.queryInfo)) { - api.tx(call) - .paymentInfo(ZERO_ACCOUNT) - .then(({ weight }) => mountedRef.current && setState([weight, call.encodedLength])) - .catch(console.error); + if (call && api.call.transactionPaymentApi) { + nextTick(async (): Promise => { + try { + const extrinsic = api.tx(call); + const { weight } = await extrinsic.paymentInfo(ZERO_ACCOUNT); + + mountedRef.current && setState([weight, call.encodedLength]); + } catch (error) { + console.error(error); + } + }); } else { setState(EMPTY_STATE); } diff --git a/packages/react-signer/src/PaymentInfo.tsx b/packages/react-signer/src/PaymentInfo.tsx index d02955af1a..abfe49d5d6 100644 --- a/packages/react-signer/src/PaymentInfo.tsx +++ b/packages/react-signer/src/PaymentInfo.tsx @@ -11,7 +11,7 @@ import { Trans } from 'react-i18next'; import { Expander, MarkWarning } from '@polkadot/react-components'; import { useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks'; -import { formatBalance, isFunction } from '@polkadot/util'; +import { formatBalance, nextTick } from '@polkadot/util'; import { useTranslation } from './translate'; @@ -32,17 +32,16 @@ function PaymentInfo ({ accountId, className = '', extrinsic }: Props): React.Re const mountedRef = useIsMountedRef(); useEffect((): void => { - accountId && extrinsic && isFunction(extrinsic.paymentInfo) && isFunction(api.rpc.payment?.queryInfo) && - setTimeout((): void => { + accountId && extrinsic && api.call.transactionPaymentApi && + nextTick(async (): Promise => { try { - extrinsic - .paymentInfo(accountId) - .then((info) => mountedRef.current && setDispatchInfo(info)) - .catch(console.error); + const info = await extrinsic.paymentInfo(accountId); + + mountedRef.current && setDispatchInfo(info); } catch (error) { console.error(error); } - }, 0); + }); }, [api, accountId, extrinsic, mountedRef]); if (!dispatchInfo || !extrinsic) {