diff --git a/package.json b/package.json index 5d5e19fdd6..e24f23cb94 100644 --- a/package.json +++ b/package.json @@ -33,11 +33,11 @@ "afterSign": "electron-builder-notarize" }, "resolutions": { - "@polkadot/api": "^2.3.2-2", - "@polkadot/api-contract": "^2.3.2-2", + "@polkadot/api": "^2.3.2-7", + "@polkadot/api-contract": "^2.3.2-7", "@polkadot/keyring": "^3.6.1", "@polkadot/networks": "^3.6.1", - "@polkadot/types": "^2.3.2-2", + "@polkadot/types": "^2.3.2-7", "@polkadot/util": "^3.6.1", "@polkadot/util-crypto": "^3.6.1", "@polkadot/wasm-crypto": "^1.4.1", diff --git a/packages/page-contracts/package.json b/packages/page-contracts/package.json index d4199eddd9..8080f97b70 100644 --- a/packages/page-contracts/package.json +++ b/packages/page-contracts/package.json @@ -12,6 +12,6 @@ "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.12.1", - "@polkadot/api-contract": "^2.3.2-2" + "@polkadot/api-contract": "^2.3.2-7" } } diff --git a/packages/page-contracts/src/Contracts/Call.tsx b/packages/page-contracts/src/Contracts/Call.tsx index e5062499f0..59ccbb241d 100644 --- a/packages/page-contracts/src/Contracts/Call.tsx +++ b/packages/page-contracts/src/Contracts/Call.tsx @@ -49,8 +49,6 @@ function Call ({ className = '', contract, messageIndex, onCallResult, onChangeM useEffect((): void => { value && message.isMutating && setExecTx((): SubmittableExtrinsic<'promise'> | null => { - console.error(weight.weight.toString()); - try { return contract.exec(message, message.isPayable ? value : 0, weight.weight, ...params); } catch (error) { diff --git a/packages/react-api/package.json b/packages/react-api/package.json index c357144bbc..8e625bd797 100644 --- a/packages/react-api/package.json +++ b/packages/react-api/package.json @@ -31,7 +31,7 @@ "homepage": "https://github.com/polkadot-js/ui/tree/master/packages/ui-reactive#readme", "dependencies": { "@babel/runtime": "^7.12.1", - "@polkadot/api": "^2.3.2-2", + "@polkadot/api": "^2.3.2-7", "@polkadot/extension-dapp": "^0.35.0-beta.30", "rxjs-compat": "^6.6.3" } diff --git a/packages/react-components/src/Event.tsx b/packages/react-components/src/Event.tsx index 8d769246f3..bfc1f34886 100644 --- a/packages/react-components/src/Event.tsx +++ b/packages/react-components/src/Event.tsx @@ -1,14 +1,17 @@ // Copyright 2017-2020 @polkadot/react-components authors & contributors // SPDX-License-Identifier: Apache-2.0 +import { DecodedEvent } from '@polkadot/api-contract/types'; import { Event } from '@polkadot/types/interfaces'; -import { Codec, TypeDef } from '@polkadot/types/types'; +import { Codec } from '@polkadot/types/types'; -import React from 'react'; -import { getTypeDef } from '@polkadot/types'; +import React, { useMemo } from 'react'; +import { Input } from '@polkadot/react-components'; import Params from '@polkadot/react-params'; +import { getTypeDef } from '@polkadot/types'; -import { classes } from './util'; +import { useTranslation } from './translate'; +import { classes, getContractAbi } from './util'; export interface Props { children?: React.ReactNode; @@ -16,14 +19,42 @@ export interface Props { value: Event; } +interface Value { + isValid: boolean; + value: Codec; +} + +interface AbiEvent extends DecodedEvent { + values: Value[]; +} + function EventDisplay ({ children, className = '', value }: Props): React.ReactElement { - const params = value.typeDef.map(({ type }): { type: TypeDef } => ({ - type: getTypeDef(type) - })); - const values = value.data.map((value): { isValid: boolean; value: Codec } => ({ - isValid: true, - value - })); + const { t } = useTranslation(); + const params = value.typeDef.map(({ type }) => ({ type: getTypeDef(type) })); + const values = value.data.map((value) => ({ isValid: true, value })); + + const abiEvent = useMemo( + (): AbiEvent | null => { + // for contracts, we decode the actual event + if (value.section === 'contracts' && value.method === 'ContractExecution' && value.data.length === 2) { + // see if we have info for this contract + const [accountId, encoded] = value.data; + const abi = getContractAbi(accountId.toString()); + + if (abi) { + const decoded = abi.decodeEvent(encoded.toU8a(true)); + + return { + ...decoded, + values: decoded.args.map((value) => ({ isValid: true, value })) + }; + } + } + + return null; + }, + [value] + ); return (
@@ -32,7 +63,22 @@ function EventDisplay ({ children, className = '', value }: Props): React.ReactE isDisabled params={params} values={values} - /> + > + {abiEvent && ( + <> + ('contract event')} + value={abiEvent.event.identifier} + /> + + + )} +
); } diff --git a/packages/react-components/src/Status/Queue.tsx b/packages/react-components/src/Status/Queue.tsx index 27ada703a5..0418b31632 100644 --- a/packages/react-components/src/Status/Queue.tsx +++ b/packages/react-components/src/Status/Queue.tsx @@ -12,6 +12,7 @@ import { registry } from '@polkadot/react-api'; import jsonrpc from '@polkadot/types/interfaces/jsonrpc'; import { createType } from '@polkadot/types'; +import { getContractAbi } from '../util'; import { QueueProvider } from './Context'; import { STATUS_COMPLETE } from './constants'; @@ -103,6 +104,20 @@ function extractEvents (result?: SubmittableResult): ActionStatus[] { message, status: 'error' }; + } else if (section === 'contracts' && method === 'ContractExecution' && data.length === 2) { + // see if we have info for this contract + const [accountId, encoded] = data; + const abi = getContractAbi(accountId.toString()); + + if (abi) { + const decoded = abi.decodeEvent(encoded.toU8a(true)); + + return { + action: decoded.event.identifier, + message: 'contract event', + status: 'event' + }; + } } return { diff --git a/packages/react-components/src/util/getContractAbi.ts b/packages/react-components/src/util/getContractAbi.ts index 4aca775e1a..3abcd0c6b0 100644 --- a/packages/react-components/src/util/getContractAbi.ts +++ b/packages/react-components/src/util/getContractAbi.ts @@ -4,6 +4,7 @@ import { AnyJson } from '@polkadot/types/types'; import { Abi } from '@polkadot/api-contract'; +import { api } from '@polkadot/react-api'; import getAddressMeta from './getAddressMeta'; @@ -18,7 +19,7 @@ export default function getContractAbi (address: string | null): Abi | null { try { const data = meta.contract && JSON.parse(meta.contract.abi) as AnyJson; - abi = new Abi(data); + abi = new Abi(data, api.registry.getChainProperties()); } catch (error) { console.error(error); } diff --git a/packages/react-params/src/Param/Option.tsx b/packages/react-params/src/Param/Option.tsx index debd38718d..ec383a8438 100644 --- a/packages/react-params/src/Param/Option.tsx +++ b/packages/react-params/src/Param/Option.tsx @@ -28,7 +28,7 @@ function Option ({ className = '', defaultValue, isDisabled, name, onChange, onE defaultValue={defaultValue} isDisabled={isDisabled || !isActive} isInOption - isOptional={!isActive} + isOptional={!isActive && !isDisabled} name={name} onChange={onChange} onEnter={onEnter} diff --git a/packages/react-params/src/Param/index.tsx b/packages/react-params/src/Param/index.tsx index c957a9b709..9e4095bbcc 100644 --- a/packages/react-params/src/Param/index.tsx +++ b/packages/react-params/src/Param/index.tsx @@ -3,7 +3,7 @@ import { Props, Props as CProps } from '../types'; -import React, { useRef } from 'react'; +import React, { useMemo, useRef } from 'react'; import { classes } from '@polkadot/react-components/util'; import { encodeTypeDef } from '@polkadot/types'; import { isUndefined } from '@polkadot/util'; @@ -14,14 +14,17 @@ import Static from './Static'; function Param ({ className = '', defaultValue, isDisabled, isInOption, isOptional, name, onChange, onEnter, onEscape, overrides, type }: Props): React.ReactElement | null { const compRef = useRef | null>(findComponent(type, overrides)); + const label = useMemo( + () => isUndefined(name) + ? encodeTypeDef(type) + : `${name}: ${encodeTypeDef(type)}`, + [name, type] + ); + if (!compRef.current) { return null; } - const label = isUndefined(name) - ? encodeTypeDef(type) - : `${name}: ${encodeTypeDef(type)}`; - return isOptional ? ( { type={type} /> ))} + {children} - {children} ); diff --git a/yarn.lock b/yarn.lock index fee6a2b2f7..e86f2c037d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2099,57 +2099,57 @@ __metadata: languageName: node linkType: hard -"@polkadot/api-contract@npm:^2.3.2-2": - version: 2.3.2-2 - resolution: "@polkadot/api-contract@npm:2.3.2-2" +"@polkadot/api-contract@npm:^2.3.2-7": + version: 2.3.2-7 + resolution: "@polkadot/api-contract@npm:2.3.2-7" dependencies: "@babel/runtime": ^7.12.1 - "@polkadot/api": 2.3.2-2 - "@polkadot/rpc-core": 2.3.2-2 - "@polkadot/types": 2.3.2-2 + "@polkadot/api": 2.3.2-7 + "@polkadot/rpc-core": 2.3.2-7 + "@polkadot/types": 2.3.2-7 "@polkadot/util": ^3.6.1 bn.js: ^5.1.3 rxjs: ^6.6.3 - checksum: 42305d27b75941a4d1c1be71f1ce417dd01dca8cd9f8774817abf3350b446874c0f59cec518ba41eb0ff7989b5d3f870deb2a468969b638d93e0c737ee3affa8 + checksum: 90767f748ecd9ce4fd135f021122b93bfec3eee13114947760783f4785d5d63d77e1bf417aa0c1e81e623565ff19efe757dd48302b6278c5ed0e9686853ff13a languageName: node linkType: hard -"@polkadot/api-derive@npm:2.3.2-2": - version: 2.3.2-2 - resolution: "@polkadot/api-derive@npm:2.3.2-2" +"@polkadot/api-derive@npm:2.3.2-7": + version: 2.3.2-7 + resolution: "@polkadot/api-derive@npm:2.3.2-7" dependencies: "@babel/runtime": ^7.12.1 - "@polkadot/api": 2.3.2-2 - "@polkadot/rpc-core": 2.3.2-2 - "@polkadot/rpc-provider": 2.3.2-2 - "@polkadot/types": 2.3.2-2 + "@polkadot/api": 2.3.2-7 + "@polkadot/rpc-core": 2.3.2-7 + "@polkadot/rpc-provider": 2.3.2-7 + "@polkadot/types": 2.3.2-7 "@polkadot/util": ^3.6.1 "@polkadot/util-crypto": ^3.6.1 bn.js: ^5.1.3 memoizee: ^0.4.14 rxjs: ^6.6.3 - checksum: cc6f2e8fcc19ee8e05ce19961e911954a4906157d0d8940c66abf5fc738c5fea66902125452d55fb1ba7f2811550f9f37c2737b29c36f24c5af8316dd0666cbd + checksum: ea9812922048387214dc68bbf0fe6d630b09580129a2501d6688b199f57063d4d935d4c28994b5bf2dbf26f49b69138655cccfa38f02dbad89a2251fe1d068b9 languageName: node linkType: hard -"@polkadot/api@npm:^2.3.2-2": - version: 2.3.2-2 - resolution: "@polkadot/api@npm:2.3.2-2" +"@polkadot/api@npm:^2.3.2-7": + version: 2.3.2-7 + resolution: "@polkadot/api@npm:2.3.2-7" dependencies: "@babel/runtime": ^7.12.1 - "@polkadot/api-derive": 2.3.2-2 + "@polkadot/api-derive": 2.3.2-7 "@polkadot/keyring": ^3.6.1 - "@polkadot/metadata": 2.3.2-2 - "@polkadot/rpc-core": 2.3.2-2 - "@polkadot/rpc-provider": 2.3.2-2 - "@polkadot/types": 2.3.2-2 - "@polkadot/types-known": 2.3.2-2 + "@polkadot/metadata": 2.3.2-7 + "@polkadot/rpc-core": 2.3.2-7 + "@polkadot/rpc-provider": 2.3.2-7 + "@polkadot/types": 2.3.2-7 + "@polkadot/types-known": 2.3.2-7 "@polkadot/util": ^3.6.1 "@polkadot/util-crypto": ^3.6.1 bn.js: ^5.1.3 eventemitter3: ^4.0.7 rxjs: ^6.6.3 - checksum: 07473c4c24343e2700a91c2d95fd2f103146180dd0158eba766859c923718213ca2300f2563a3c0f15a767bb225e9e9f6397cd73aa8a2129515db07e0820ec2d + checksum: f169383c41daa781592f5e85bc2ca53f91d3a7c074b8cd99548a9f53265d60399803c7f260017d308ea93bc66647c5a01445be58353a296b476ce2695ba4d301 languageName: node linkType: hard @@ -2205,7 +2205,7 @@ __metadata: resolution: "@polkadot/app-contracts@workspace:packages/page-contracts" dependencies: "@babel/runtime": ^7.12.1 - "@polkadot/api-contract": ^2.3.2-2 + "@polkadot/api-contract": ^2.3.2-7 languageName: unknown linkType: soft @@ -2586,17 +2586,17 @@ __metadata: languageName: node linkType: hard -"@polkadot/metadata@npm:2.3.2-2": - version: 2.3.2-2 - resolution: "@polkadot/metadata@npm:2.3.2-2" +"@polkadot/metadata@npm:2.3.2-7": + version: 2.3.2-7 + resolution: "@polkadot/metadata@npm:2.3.2-7" dependencies: "@babel/runtime": ^7.12.1 - "@polkadot/types": 2.3.2-2 - "@polkadot/types-known": 2.3.2-2 + "@polkadot/types": 2.3.2-7 + "@polkadot/types-known": 2.3.2-7 "@polkadot/util": ^3.6.1 "@polkadot/util-crypto": ^3.6.1 bn.js: ^5.1.3 - checksum: 14f246804be9206756893ef0d430cb8efb4c61463dd8ac865319cec212354f081d9425a0f328f56f7754f2adf866bc3cfdf20d7184ec3ab4bd731910296a1838 + checksum: d606dfaa190b0f8d673e315c017cfa69ab3d23492ba71b5d7861703df2b2377d2d9952442f9174f5beb60dd07c25e42056f5bcb7587fb6333f44185e72853413 languageName: node linkType: hard @@ -2614,7 +2614,7 @@ __metadata: resolution: "@polkadot/react-api@workspace:packages/react-api" dependencies: "@babel/runtime": ^7.12.1 - "@polkadot/api": ^2.3.2-2 + "@polkadot/api": ^2.3.2-7 "@polkadot/extension-dapp": ^0.35.0-beta.30 rxjs-compat: ^6.6.3 languageName: unknown @@ -2744,35 +2744,35 @@ __metadata: languageName: unknown linkType: soft -"@polkadot/rpc-core@npm:2.3.2-2": - version: 2.3.2-2 - resolution: "@polkadot/rpc-core@npm:2.3.2-2" +"@polkadot/rpc-core@npm:2.3.2-7": + version: 2.3.2-7 + resolution: "@polkadot/rpc-core@npm:2.3.2-7" dependencies: "@babel/runtime": ^7.12.1 - "@polkadot/metadata": 2.3.2-2 - "@polkadot/rpc-provider": 2.3.2-2 - "@polkadot/types": 2.3.2-2 + "@polkadot/metadata": 2.3.2-7 + "@polkadot/rpc-provider": 2.3.2-7 + "@polkadot/types": 2.3.2-7 "@polkadot/util": ^3.6.1 memoizee: ^0.4.14 rxjs: ^6.6.3 - checksum: a3093965c913c321f0daaf019e8d0786d7680aafdc582e152bd7ec7e8ed94ec6ad2bb9c40b8458b06313ae47137b19ba1e70707c8fe891d0ed34610a38f5e7eb + checksum: 4c7485e75b38cbf20ae50e3ed76bb941672437770c72fef9e169b64d6995b76ff00f780646220606576875787c1093a5c7514d32a34f9cbcb8d73b58664dc603 languageName: node linkType: hard -"@polkadot/rpc-provider@npm:2.3.2-2": - version: 2.3.2-2 - resolution: "@polkadot/rpc-provider@npm:2.3.2-2" +"@polkadot/rpc-provider@npm:2.3.2-7": + version: 2.3.2-7 + resolution: "@polkadot/rpc-provider@npm:2.3.2-7" dependencies: "@babel/runtime": ^7.12.1 - "@polkadot/metadata": 2.3.2-2 - "@polkadot/types": 2.3.2-2 + "@polkadot/metadata": 2.3.2-7 + "@polkadot/types": 2.3.2-7 "@polkadot/util": ^3.6.1 "@polkadot/util-crypto": ^3.6.1 "@polkadot/x-fetch": ^0.3.3 "@polkadot/x-ws": ^0.3.3 bn.js: ^5.1.3 eventemitter3: ^4.0.7 - checksum: c2c6f1dbb9ecc301d2f2e21cc96a51b631837d6d6f6555312006cdffd6f6e102cfdf6b809dad7e787347bb926557c1af509a54f7e78c656ff64c563aa10f30aa + checksum: 30f2fadeabcaa7c110a41a03659be7ec5b349fa4e8fa2871af47ae95a6389badc5ee0dd301a2ff5a8ce3622faef8f81c49692d1484e68d4e0b504d245cbdd459 languageName: node linkType: hard @@ -2785,31 +2785,31 @@ __metadata: languageName: node linkType: hard -"@polkadot/types-known@npm:2.3.2-2": - version: 2.3.2-2 - resolution: "@polkadot/types-known@npm:2.3.2-2" +"@polkadot/types-known@npm:2.3.2-7": + version: 2.3.2-7 + resolution: "@polkadot/types-known@npm:2.3.2-7" dependencies: "@babel/runtime": ^7.12.1 - "@polkadot/types": 2.3.2-2 + "@polkadot/types": 2.3.2-7 "@polkadot/util": ^3.6.1 bn.js: ^5.1.3 - checksum: 9d1b114d1ca720373ae0b878049aafbb42e12a84821b97e736592e1873cf0dc7b92223cffa13b1289afd77e7a7d87bd97ccf86dabda56f318bc775eef6b6e7d5 + checksum: 57c8009faf83208ce9c719a0cbee8745c795f46ede6bbd88e3254ad94bd381a9e9ff3eef7723ce449ff554d58e298c8d653c173d233916bf086bfdcf0ff1cc6a languageName: node linkType: hard -"@polkadot/types@npm:^2.3.2-2": - version: 2.3.2-2 - resolution: "@polkadot/types@npm:2.3.2-2" +"@polkadot/types@npm:^2.3.2-7": + version: 2.3.2-7 + resolution: "@polkadot/types@npm:2.3.2-7" dependencies: "@babel/runtime": ^7.12.1 - "@polkadot/metadata": 2.3.2-2 + "@polkadot/metadata": 2.3.2-7 "@polkadot/util": ^3.6.1 "@polkadot/util-crypto": ^3.6.1 "@types/bn.js": ^4.11.6 bn.js: ^5.1.3 memoizee: ^0.4.14 rxjs: ^6.6.3 - checksum: 3b92c234b2400048c8ce29295aaf8ea85c6fbca4d2a65cde05f9de9afe5f004f795424fdbfe94cb65154b1522c64b6f21622166795e4637020256b9b082d8709 + checksum: ff05ce6a5a9637c63eea6bdec96021916b4450eb34d393f2dde61314b00930c2e1e38c8e3864ce72349f9aaf2fbcba88b79d0f32ac70c3de7447300e75869e06 languageName: node linkType: hard