From 345eb6ce7ecd11ac9602417e53e7d864b7775a66 Mon Sep 17 00:00:00 2001 From: Aleksandr Makhnev Date: Mon, 20 Jun 2022 17:07:40 +0500 Subject: [PATCH] CU-2mk06uu_Check-if-there-is-an-multisigMultisigExecutied_Aleksandr-Makhnyov (#98) * feat: check final approve * feat: multisig approve fee --- package.json | 2 +- release/app/yarn.lock | 4 + src/renderer/components/Actions/Transfer.tsx | 9 +- src/renderer/components/ScanCode.tsx | 254 +++++++++--------- src/renderer/components/ShowCode.tsx | 55 ++-- .../Transactions/TransferDetails.tsx | 7 +- src/renderer/db/types.ts | 1 + src/renderer/ui/Fee.tsx | 25 +- src/renderer/utils/transactions.ts | 52 +++- yarn.lock | 138 +++++++++- 10 files changed, 374 insertions(+), 173 deletions(-) create mode 100644 release/app/yarn.lock diff --git a/package.json b/package.json index e0e30bd..697bb0a 100644 --- a/package.json +++ b/package.json @@ -234,7 +234,7 @@ "@hookform/resolvers": "^2.8.8", "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "@polkadot/react-identicon": "^2.0.1", - "@polkadot/react-qr": "^2.0.1", + "@polkadot/react-qr": "^2.5.1", "autoprefixer": "^10.4.0", "bignumber.js": "^9.0.2", "classnames": "^2.3.1", diff --git a/release/app/yarn.lock b/release/app/yarn.lock new file mode 100644 index 0000000..fb57ccd --- /dev/null +++ b/release/app/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/src/renderer/components/Actions/Transfer.tsx b/src/renderer/components/Actions/Transfer.tsx index 4d270b4..2ee30aa 100644 --- a/src/renderer/components/Actions/Transfer.tsx +++ b/src/renderer/components/Actions/Transfer.tsx @@ -32,7 +32,7 @@ import { useMatrix } from '../Providers/MatrixProvider'; import { HexString } from '../../../common/types'; import { getExistingMstTransactions, - getTxExtrinsic, + getTransferExtrinsic, } from '../../utils/transactions'; import InputSelect from '../../ui/InputSelect'; import Fee from '../../ui/Fee'; @@ -92,7 +92,7 @@ const Transfer: React.FC = () => { isValid && firstWallet ) { - const transferExtrinsic = getTxExtrinsic( + const transferExtrinsic = getTransferExtrinsic( currentNetwork, currentAsset, watchAddress, @@ -349,6 +349,11 @@ const Transfer: React.FC = () => { The amount is not valid, please type it again { metadataRpc: metadataRpc.toHex(), registry, }); + try { + network.api.rpc.author.submitAndWatchExtrinsic(tx, async (result) => { + if (!result.isInBlock) return; + + let actualTxHash = result.inner; + + const signedBlock = await network.api.rpc.chain.getBlock(); + const apiAt = await network.api.at(signedBlock.block.header.hash); + const allRecords = await apiAt.query.system.events(); + let isFinalApprove = false; + let isSuccessExtrinsic = false; + + // the information for each of the contained extrinsics + signedBlock.block.extrinsics.forEach( + ({ method: { method, section }, signer, args, hash }, index) => { + if ( + method !== tx.method.method || + section !== tx.method.section || + signer.toHex() !== tx.signer.toHex() || + args[0]?.toString() !== tx.args[0]?.toString() || + args[1]?.toString() !== tx.args[1]?.toString() || + args[2]?.toString() !== tx.args[2]?.toString() + ) { + return; + } + + allRecords + .filter( + ({ phase }) => + phase.isApplyExtrinsic && phase.asApplyExtrinsic.eq(index), + ) + .forEach(({ event }) => { + if (network.api.events.multisig.MultisigExecuted.is(event)) { + isFinalApprove = true; + } - network.api.rpc.author.submitAndWatchExtrinsic(tx, async (result) => { - if (!result.isInBlock) return; - - let actualTxHash = result.inner; - - const signedBlock = await network.api.rpc.chain.getBlock(); - const apiAt = await network.api.at(signedBlock.block.header.hash); - const allRecords = await apiAt.query.system.events(); - - // the information for each of the contained extrinsics - signedBlock.block.extrinsics.forEach( - ({ method: { method, section }, signer, args, hash }, index) => { - if ( - method !== tx.method.method || - section !== tx.method.section || - signer.toHex() !== tx.signer.toHex() || - args[0]?.toString() !== tx.args[0]?.toString() || - args[1]?.toString() !== tx.args[1]?.toString() || - args[2]?.toString() !== tx.args[2]?.toString() - ) { - return; - } + if (network.api.events.system.ExtrinsicSuccess.is(event)) { + actualTxHash = hash; + isSuccessExtrinsic = true; + } - allRecords - .filter( - ({ phase }) => - phase.isApplyExtrinsic && phase.asApplyExtrinsic.eq(index), - ) - .forEach(({ event }) => { - if (network.api.events.system.ExtrinsicSuccess.is(event)) { - actualTxHash = hash; - if (!actualTxHash || !transaction.id) return; - - const extrinsicHash = actualTxHash.toHex(); - - if (transaction.type === TransactionType.TRANSFER) { - db.transactions.update(transaction.id, { - ...transaction, - transactionHash: actualTxHash.toHex(), - status: TransactionStatus.CONFIRMED, - }); - } else if ( - transaction.type === TransactionType.MULTISIG_TRANSFER - ) { - const transactionStatus = isFinalApprove(transaction) - ? TransactionStatus.CONFIRMED - : TransactionStatus.PENDING; - - const publicKey = toPublicKey( - signWith?.mainAccounts[0].accountId || '', - ); - - const { approvals } = transaction.data; - const approvalsPayload = { - ...approvals, - [publicKey]: { - ...approvals[publicKey], - fromMatrix: true, - fromBlockChain: true, - extrinsicHash, - }, - }; - - db.transactions.update(transaction.id, { - status: transactionStatus, - data: { - ...transaction.data, - approvals: approvalsPayload, - }, - }); - - const multisigWallet = transaction.wallet as MultisigWallet; - if (signWith && multisigWallet.matrixRoomId) { - matrix.setRoom(multisigWallet.matrixRoomId); - - if (transactionStatus === TransactionStatus.CONFIRMED) { - matrix.mstFinalApprove({ - senderAddress: getAddressFromWallet( - signWith, - network.network, - ), - salt: transaction.data.salt, - extrinsicHash, - chainId: network.network.chainId, - callHash: transaction.data.callHash, - }); - } - - if (transactionStatus === TransactionStatus.PENDING) { - matrix.mstApprove({ - senderAddress: getAddressFromWallet( - signWith, - network.network, - ), - salt: transaction.data.salt, - extrinsicHash, - chainId: network.network.chainId, - callHash: transaction.data.callHash, - }); - } + if (network.api.events.system.ExtrinsicFailed.is(event)) { + const [dispatchError] = event.data; + let errorInfo; + + if (dispatchError.isModule) { + const decoded = network.api.registry.findMetaError( + dispatchError.asModule, + ); + + errorInfo = `${decoded.name + .split(/(?=[A-Z])/) + .map((w) => w.toLowerCase()) + .join(' ')}`; + } else { + errorInfo = dispatchError.toString(); } + setError(capitalize(errorInfo)); + setDialogOpen(true); } + }); + }, + ); + + if (!isSuccessExtrinsic || !actualTxHash || !transaction.id) return; + + const extrinsicHash = actualTxHash.toHex(); + + if (transaction.type === TransactionType.TRANSFER) { + db.transactions.update(transaction.id, { + ...transaction, + transactionHash: actualTxHash.toHex(), + status: TransactionStatus.CONFIRMED, + }); + } else if (transaction.type === TransactionType.MULTISIG_TRANSFER) { + const transactionStatus = isFinalApprove + ? TransactionStatus.CONFIRMED + : TransactionStatus.PENDING; + + const publicKey = toPublicKey( + signWith?.mainAccounts[0].accountId || '', + ); + + const { approvals } = transaction.data; + const approvalsPayload = { + ...approvals, + [publicKey]: { + ...approvals[publicKey], + fromMatrix: true, + fromBlockChain: true, + extrinsicHash, + }, + }; + + db.transactions.update(transaction.id, { + status: transactionStatus, + data: { + ...transaction.data, + approvals: approvalsPayload, + }, + }); + + const multisigWallet = transaction.wallet as MultisigWallet; + if (signWith && multisigWallet.matrixRoomId) { + matrix.setRoom(multisigWallet.matrixRoomId); + + const matrixEventData = { + senderAddress: getAddressFromWallet(signWith, network.network), + salt: transaction.data.salt, + extrinsicHash, + chainId: network.network.chainId, + callHash: transaction.data.callHash, + }; + + if (transactionStatus === TransactionStatus.CONFIRMED) { + matrix.mstFinalApprove(matrixEventData); + } + + if (transactionStatus === TransactionStatus.PENDING) { + matrix.mstApprove(matrixEventData); + } + } + } - history.push(withId(Routes.TRANSFER_DETAILS, transaction.id)); - } - if (network.api.events.system.ExtrinsicFailed.is(event)) { - actualTxHash = hash; - const [dispatchError] = event.data; - let errorInfo; - - if (dispatchError.isModule) { - const decoded = network.api.registry.findMetaError( - dispatchError.asModule, - ); - - errorInfo = `${decoded.name - .split(/(?=[A-Z])/) - .map((w) => w.toLowerCase()) - .join(' ')}`; - } else { - errorInfo = dispatchError.toString(); - } - setError(capitalize(errorInfo)); - setDialogOpen(true); - } - }); - }, - ); - }); + history.push(withId(Routes.TRANSFER_DETAILS, transaction.id)); + }); + } catch (e) { + let message = 'Unknown error'; + if (e instanceof Error) message = e.message; + + setError(capitalize(message)); + setDialogOpen(true); + } }; return ( diff --git a/src/renderer/components/ShowCode.tsx b/src/renderer/components/ShowCode.tsx index 009a8d6..df7d984 100644 --- a/src/renderer/components/ShowCode.tsx +++ b/src/renderer/components/ShowCode.tsx @@ -156,38 +156,35 @@ const ShowCode: React.FC = () => { : []; const { threshold } = transaction.wallet as MultisigWallet; + const approveData = { + threshold, + otherSignatories, + maybeTimepoint: when, + callHash: transaction.data.callHash, + maxWeight: MAX_WEIGHT, + call: transaction.data.callData, + storeCall: false, + }; + const multisig = { approve: () => { - return methods.multisig.asMulti( - { - threshold, - otherSignatories, - maybeTimepoint: when, - callHash: transaction.data.callHash, - maxWeight: MAX_WEIGHT, - call: transaction.data.callData, - storeCall: false, - }, - info, - options, + return methods.multisig.asMulti(approveData, info, options); + }, + cancel: () => { + return ( + when && + methods.multisig.cancelAsMulti( + { + threshold, + otherSignatories, + timepoint: when, + callHash: transaction.data.callHash, + }, + info, + options, + ) ); }, - // TODO: Use it for cancel transaction - // cancel: () => { - // return ( - // when && - // methods.multisig.cancelAsMulti( - // { - // threshold, - // otherSignatories, - // timepoint: when, - // callHash: transaction.data.callHash, - // }, - // info, - // options, - // ) - // ); - // }, }; let unsignedAction = transfers[asset?.type || DEFAULT]; @@ -246,6 +243,8 @@ const ShowCode: React.FC = () => { { <>
= ({ wallet, connection, + type, + transaction, address, amount, withDeposit, @@ -42,9 +54,12 @@ const Fee: React.FC = ({ setIsLoading(true); const fromAddress = getAddressFromWallet(wallet, connection.network); + const tx = + type === TransactionType.MULTISIG_TRANSFER && transaction + ? getMultisigTransferExtrinsic(connection, transaction) + : getTransferExtrinsic(connection, defaultAsset, address, amount); - getTxExtrinsic(connection, defaultAsset, address, amount) - .paymentInfo(fromAddress) + tx.paymentInfo(fromAddress) .then(({ partialFee }) => { const formattedValue = formatBalance( partialFee.toString(), @@ -59,7 +74,7 @@ const Fee: React.FC = ({ .finally(() => { setIsLoading(false); }); - }, [connection, amount, address, defaultAsset, wallet]); + }, [connection, amount, address, defaultAsset, wallet, type, transaction]); const depositValue = (): string | ReactNode => { if (!connection) { diff --git a/src/renderer/utils/transactions.ts b/src/renderer/utils/transactions.ts index 9695665..fcce9d5 100644 --- a/src/renderer/utils/transactions.ts +++ b/src/renderer/utils/transactions.ts @@ -180,7 +180,7 @@ export const getApprovals = (transaction: Transaction): string[] => isApproved(a, transaction.data.approvals), ); -export const isFinalApprove = (transaction: Transaction) => +export const checkFinalApprove = (transaction: Transaction) => Number((transaction.wallet as MultisigWallet).threshold) - getApprovals(transaction).length === 1; @@ -240,7 +240,7 @@ export const decodeCallData = ( return data; }; -export const getTxExtrinsic = ( +export const getTransferExtrinsic = ( connection: Connection, asset: Asset, address: string, @@ -267,6 +267,54 @@ export const getTxExtrinsic = ( ); }; +export const createApproveData = ( + connection: Connection, + transaction: Transaction, +) => { + const address = getAddressFromWallet(transaction.wallet, connection.network); + const MAX_WEIGHT = 640000000; + const when = + transaction.blockHeight && transaction.extrinsicIndex + ? { + height: transaction.blockHeight, + index: transaction.extrinsicIndex, + } + : null; + const otherSignatories = transaction.wallet.isMultisig + ? (transaction.wallet as MultisigWallet).originContacts + .map((c) => getAddressFromWallet(c, connection.network)) + .filter((c) => c !== address) + .sort() + : []; + const { threshold } = transaction.wallet as MultisigWallet; + + return { + threshold, + otherSignatories, + maybeTimepoint: when, + callHash: transaction.data.callHash, + maxWeight: MAX_WEIGHT, + call: transaction.data.callData, + storeCall: false, + }; +}; + +export const getMultisigTransferExtrinsic = ( + connection: Connection, + transaction: Transaction, +) => { + const approveData = createApproveData(connection, transaction); + + return connection.api.tx.multisig.asMulti( + approveData.threshold, + approveData.otherSignatories, + approveData.maybeTimepoint, + approveData.call, + approveData.storeCall, + approveData.maxWeight, + ); +}; + export const getExistingMstTransactions = ( transactions: Transaction[] = [], chainId: HexString, diff --git a/yarn.lock b/yarn.lock index 21d2dab..f055604 100644 --- a/yarn.lock +++ b/yarn.lock @@ -282,6 +282,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.18.3": + version "7.18.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" + integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.16.7", "@babel/template@^7.3.3": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" @@ -708,11 +715,21 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.0.0.tgz#d5e38bfbdaba174805a4e649f13be9a9ed3351ae" integrity sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg== +"@noble/hashes@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.1.tgz#c056d9b7166c1e7387a7453c2aff199bf7d88e5f" + integrity sha512-Lkp9+NijmV7eSVZqiUvt3UCuuHeJpUVmRrvh430gyJjJiuJMqkeHf6/A9lQ/smmbWV/0spDeJscscPzyB4waZg== + "@noble/secp256k1@1.5.5": version "1.5.5" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.5.5.tgz#315ab5745509d1a8c8e90d0bdf59823ccf9bcfc3" integrity sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ== +"@noble/secp256k1@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.0.tgz#602afbbfcfb7e169210469b697365ef740d7e930" + integrity sha512-DWSsg8zMHOYMYBqIQi96BQuthZrp98LCeMNcUOaffCIVYQ5yxDbNikLF+H7jEnmNNmXbtVic46iCuVWzar+MgA== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -851,6 +868,15 @@ "@polkadot/util" "9.2.1" "@substrate/ss58-registry" "^1.18.0" +"@polkadot/networks@9.5.1", "@polkadot/networks@^9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-9.5.1.tgz#876c6cf8915a47e6ace81139197f8b0d36adb362" + integrity sha512-1q9jm7NLk1ZMqFJL+kYkpn1phEO+N0d5LU81ropjYf0hC9boBAya4Zqvv3DwasPuLp6qaj4r0nrfzmkP5xHKZQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/util" "9.5.1" + "@substrate/ss58-registry" "^1.22.0" + "@polkadot/react-identicon@^2.0.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@polkadot/react-identicon/-/react-identicon-2.2.1.tgz#ea88e5f0a97c35d12105c9fd9214e315fa48a984" @@ -868,15 +894,15 @@ react-copy-to-clipboard "^5.1.0" styled-components "^5.3.5" -"@polkadot/react-qr@^2.0.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@polkadot/react-qr/-/react-qr-2.2.1.tgz#4eb97c00c14c44987e8b24804fef88fb861cff45" - integrity sha512-/9/AVLFp4kNuhVkz21eoQulAryJ8PqmrACqgMCjdR17HqL7tMZF8FBJpehawd2E+cFV+OWvNaaSt1YwxXmmogA== +"@polkadot/react-qr@^2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/react-qr/-/react-qr-2.5.1.tgz#df5af3878ad7cfa90932f7f6ac92811725d2c8df" + integrity sha512-IInB3IGvom2izAAtsbOz5cYRsn7Nb2IcC6/JMoiaFTY+ihe8EIAmUoQCmxO9xkJODpQ3o2VqczZGC2ueC9yQOw== dependencies: - "@babel/runtime" "^7.17.9" - "@polkadot/ui-settings" "2.2.1" - "@polkadot/util" "^9.2.1" - "@polkadot/util-crypto" "^9.2.1" + "@babel/runtime" "^7.18.3" + "@polkadot/ui-settings" "2.5.1" + "@polkadot/util" "^9.5.1" + "@polkadot/util-crypto" "^9.5.1" qrcode-generator "^1.4.4" react-qr-reader "^2.2.1" styled-components "^5.3.5" @@ -995,6 +1021,17 @@ eventemitter3 "^4.0.7" store "^2.0.12" +"@polkadot/ui-settings@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/ui-settings/-/ui-settings-2.5.1.tgz#9a694d220f6eeeaf28ebb6a98630dde18974ae77" + integrity sha512-pxMqIU+/ryeFUqiabK9GJptH663r/xxEmOAGYY6SjUG1fPJ7vQqkQeDxEfxo84PN8yyc5w4Bm1XMT4ChIDAWTQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/networks" "^9.5.1" + "@polkadot/util" "^9.5.1" + eventemitter3 "^4.0.7" + store "^2.0.12" + "@polkadot/ui-shared@2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@polkadot/ui-shared/-/ui-shared-2.2.1.tgz#a919ffc215faaaa89df210a20bc7d3b98b742501" @@ -1020,6 +1057,23 @@ ed2curve "^0.3.0" tweetnacl "^1.0.3" +"@polkadot/util-crypto@^9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-9.5.1.tgz#f69bdccd7043620c9bd905b169ec50bf97bf6ffb" + integrity sha512-4YwJJ2/mXx3PXTy4WLekQOo1MlDtQzYgTZsjOagi3Uz3Q/ITvS+/iu6eF/H6Tz0uEQjwX6t9tsMkM5FWk/XoGg== + dependencies: + "@babel/runtime" "^7.18.3" + "@noble/hashes" "1.1.1" + "@noble/secp256k1" "1.6.0" + "@polkadot/networks" "9.5.1" + "@polkadot/util" "9.5.1" + "@polkadot/wasm-crypto" "^6.1.1" + "@polkadot/x-bigint" "9.5.1" + "@polkadot/x-randomvalues" "9.5.1" + "@scure/base" "1.1.1" + ed2curve "^0.3.0" + tweetnacl "^1.0.3" + "@polkadot/util@9.2.1", "@polkadot/util@^9.2.1": version "9.2.1" resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-9.2.1.tgz#cf1af36418ea6f351cceaac747162707c6a00a36" @@ -1034,6 +1088,20 @@ bn.js "^5.2.0" ip-regex "^4.3.0" +"@polkadot/util@9.5.1", "@polkadot/util@^9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-9.5.1.tgz#b9e0b8cb0d6f1fd86e1a39a843ac8defeb6d5c9f" + integrity sha512-cI2ar15vkoXjs//YNn1yT5eUdK7jF32XNw3Oc6YJ2qEpenwy30c3BUQJOiqW7J6UBYLYll5O5y0ejv6LQoSFBQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-bigint" "9.5.1" + "@polkadot/x-global" "9.5.1" + "@polkadot/x-textdecoder" "9.5.1" + "@polkadot/x-textencoder" "9.5.1" + "@types/bn.js" "^5.1.0" + bn.js "^5.2.1" + ip-regex "^4.3.0" + "@polkadot/wasm-bridge@6.1.1": version "6.1.1" resolved "https://registry.yarnpkg.com/@polkadot/wasm-bridge/-/wasm-bridge-6.1.1.tgz#9342f2b3c139df72fa45c8491b348f8ebbfa57fa" @@ -1093,6 +1161,14 @@ "@babel/runtime" "^7.17.9" "@polkadot/x-global" "9.2.1" +"@polkadot/x-bigint@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-bigint/-/x-bigint-9.5.1.tgz#d5d98aaa6b3de560eea23df9f696903f2e2dcf7c" + integrity sha512-rTp7j3KvCy8vANRoaW6j0pCQdLc/eed6uSRXoxh3z1buJhw460/Q/hJ0Bey6fyeNSDzIwFk4SGwf/Gzf+kS1vQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-global" "9.5.1" + "@polkadot/x-fetch@^9.2.1": version "9.2.1" resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-9.2.1.tgz#c0131c193b54e65931de0819d9e859b47ba22c2b" @@ -1110,6 +1186,13 @@ dependencies: "@babel/runtime" "^7.17.9" +"@polkadot/x-global@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-9.5.1.tgz#a78e109ca95f5ba5e9c501a2106a9b3acfe3a682" + integrity sha512-asG5YlW1K3f4YjyuZ+HrbF9H5d78i5v9+7Bh+9gD+sVfB3KhqwVYZB+wzOaJkPp6lwUbBA9OBHFCVBqpR3wBJw== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-randomvalues@9.2.1": version "9.2.1" resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-9.2.1.tgz#04dbd5928dc5bd94f5fa16260df663d57c851998" @@ -1118,6 +1201,14 @@ "@babel/runtime" "^7.17.9" "@polkadot/x-global" "9.2.1" +"@polkadot/x-randomvalues@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-9.5.1.tgz#e647554f7b34d4073e1bc60d8b81163d5f75f523" + integrity sha512-NFvG//NsBjFP01dEtQATNPn5lSAZwh6jkkUXG2rHlgvW6k8nVJ0aJPvO5MlgItgS5Ry2F88AIiSsO3cfoTpszg== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-global" "9.5.1" + "@polkadot/x-textdecoder@9.2.1": version "9.2.1" resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-9.2.1.tgz#e83c25bd52f62cf680439d96d71d9d1f37224257" @@ -1126,6 +1217,14 @@ "@babel/runtime" "^7.17.9" "@polkadot/x-global" "9.2.1" +"@polkadot/x-textdecoder@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-9.5.1.tgz#13c1b48b12d350b635de385c8a0e2be14210b620" + integrity sha512-bY0J3Tov5y4oZi8qB/UtoEYCSgo5sDiiOa3Wmgen09LfB4gXJhWFGJSmcZqHERXCdEcmZojdbHTvOGSeYM9U1w== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-global" "9.5.1" + "@polkadot/x-textencoder@9.2.1": version "9.2.1" resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-9.2.1.tgz#b00363d1afa0cdd928e2869b7df7b3d92a7610fd" @@ -1134,6 +1233,14 @@ "@babel/runtime" "^7.17.9" "@polkadot/x-global" "9.2.1" +"@polkadot/x-textencoder@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-9.5.1.tgz#76d79d07bb81e9cc7eff97043eae82c39189d8d9" + integrity sha512-zt121nqxiudMeZnanpnfWhCE0SOTcVRqn/atqO59us/yf6LMTf23mgd7P4795TgJwXOUcui4fhm/g/VcpsLq9Q== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-global" "9.5.1" + "@polkadot/x-ws@^9.2.1": version "9.2.1" resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-9.2.1.tgz#3c5c34cad5f8a939813e83abcdc350c55a280b43" @@ -1149,6 +1256,11 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.0.0.tgz#109fb595021de285f05a7db6806f2f48296fcee7" integrity sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA== +"@scure/base@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -1201,6 +1313,11 @@ resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.18.0.tgz#0744480e880ae8e557327557a2a7fc95577292ec" integrity sha512-nAA1qsorxgdDnx5ie/FL90nM2riTNn72wIq8jtWsR8trsk1uTIHJgQQjEgviFCtMg4Ws9bEjo8DkWBgVGdPFmw== +"@substrate/ss58-registry@^1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.22.0.tgz#d115bc5dcab8c0f5800e05e4ef265949042b13ec" + integrity sha512-IKqrPY0B3AeIXEc5/JGgEhPZLy+SmVyQf+k0SIGcNSTqt1GLI3gQFEOFwSScJdem+iYZQUrn6YPPxC3TpdSC3A== + "@substrate/txwrapper-core@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@substrate/txwrapper-core/-/txwrapper-core-2.0.3.tgz#727cafb08952daefb8a2d7d36dfcfbdf4f100255" @@ -2759,6 +2876,11 @@ bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== +bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + body-parser@1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5"