@polkadot/types/interfaces#ContractInfo TypeScript Examples
The following examples show how to use
@polkadot/types/interfaces#ContractInfo.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: ValidateAddr.tsx From crust-apps with Apache License 2.0 | 6 votes |
function ValidateAddr ({ address, onChange }: Props): React.ReactElement<Props> | null {
const { t } = useTranslation();
const { api } = useApi();
const contractInfo = useCall<Option<ContractInfo>>(api.query.contracts.contractInfoOf, [address]);
const [isAddress, setIsAddress] = useState(false);
const [isStored, setIsStored] = useState(false);
useEffect((): void => {
try {
keyring.decodeAddress(address || '');
setIsAddress(true);
} catch (error) {
setIsAddress(false);
}
}, [address]);
useEffect((): void => {
setIsStored(!!contractInfo?.isSome);
}, [contractInfo]);
useEffect((): void => {
onChange(isAddress && isStored);
}, [isAddress, isStored, onChange]);
if (isStored || !isAddress) {
return null;
}
return (
<InfoForInput type='error'>
{isAddress
? t<string>('Unable to find deployed contract code at the specified address')
: t<string>('The value is not in a valid address format')
}
</InfoForInput>
);
}
Example #2
Source File: Contract.tsx From crust-apps with Apache License 2.0 | 5 votes |
function transformInfo (optInfo: Option<ContractInfo>): ContractInfo | null {
return optInfo.unwrapOr(null);
}
Example #3
Source File: Messages.tsx From crust-apps with Apache License 2.0 | 5 votes |
function Messages ({ className = '', contract, contractAbi: { constructors, messages, project: { source } }, isLabelled, isWatching, onSelect, onSelectConstructor, withConstructors, withMessages, withWasm }: Props): React.ReactElement<Props> {
const { t } = useTranslation();
const { api } = useApi();
const optInfo = useCall<Option<ContractInfo>>(contract && api.query.contracts.contractInfoOf, [contract?.address]);
const [isUpdating, setIsUpdating] = useState(false);
const [lastResults, setLastResults] = useState<(ContractCallOutcome | undefined)[]>([]);
const _onExpander = useCallback(
(isOpen: boolean): void => {
isWatching && setIsUpdating(isOpen);
},
[isWatching]
);
useEffect((): void => {
isUpdating && optInfo && contract && Promise
.all(messages.map((m) =>
m.isMutating || m.args.length !== 0
? Promise.resolve(undefined)
: contract.read(m, 0, -1).send(READ_ADDR).catch(() => undefined)
))
.then(setLastResults)
.catch(console.error);
}, [contract, isUpdating, isWatching, messages, optInfo]);
const _setMessageResult = useCallback(
// eslint-disable-next-line @typescript-eslint/no-unused-vars
(messageIndex: number, result?: ContractCallOutcome): void => {
// ignore... for now
// setLastResults((all) => all.map((r, index) => index === messageIndex ? result : r));
},
[]
);
const _onSelect = useCallback(
(index: number) => onSelect && onSelect(index, _setMessageResult),
[_setMessageResult, onSelect]
);
return (
<div className={`ui--Messages ${className}${isLabelled ? ' isLabelled' : ''}`}>
{withConstructors && (
<Expander summary={t<string>('Constructors ({{count}})', { replace: { count: constructors.length } })}>
{sortMessages(constructors).map(([message, index]) => (
<Message
index={index}
key={index}
message={message}
onSelect={onSelectConstructor}
/>
))}
</Expander>
)}
{withMessages && (
<Expander
onClick={_onExpander}
summary={t<string>('Messages ({{count}})', { replace: { count: messages.length } })}
>
{sortMessages(messages).map(([message, index]) => (
<Message
index={index}
key={index}
lastResult={lastResults[index]}
message={message}
onSelect={_onSelect}
/>
))}
</Expander>
)}
{withWasm && source.wasm.length !== 0 && (
<div>{t<string>('{{size}} WASM bytes', { replace: { size: formatNumber(source.wasm.length) } })}</div>
)}
</div>
);
}
Example #4
Source File: Contract.tsx From crust-apps with Apache License 2.0 | 4 votes |
function Contract ({ className, contract, index, links, onCall }: Props): React.ReactElement<Props> | null {
const { t } = useTranslation();
const { api } = useApi();
const bestNumber = useBestNumber();
const info = useCall<ContractInfo | null>(api.query.contracts.contractInfoOf, [contract.address], { transform: transformInfo });
const [evictAt, setEvictAt] = useState<BlockNumber | null>(null);
const [isForgetOpen, toggleIsForgetOpen] = useToggle();
useEffect((): void => {
if (info && isFunction(api.rpc.contracts?.rentProjection)) {
api.rpc.contracts
.rentProjection(contract.address)
.then((value) => setEvictAt(value.unwrapOr(null)))
.catch(() => undefined);
}
}, [api, contract, info]);
const _onCall = useCallback(
(messageIndex: number, resultCb: (messageIndex: number, result?: ContractCallOutcome) => void) => onCall(index, messageIndex, resultCb),
[index, onCall]
);
const _onForget = useCallback(
(): void => {
const status: Partial<ActionStatus> = {
account: contract.address,
action: 'forget'
};
try {
keyring.forgetContract(contract.address.toString());
status.status = 'success';
status.message = t<string>('address forgotten');
} catch (error) {
status.status = 'error';
status.message = (error as Error).message;
}
toggleIsForgetOpen();
},
[contract.address, t, toggleIsForgetOpen]
);
return (
<tr className={className}>
<td className='address top'>
{isForgetOpen && (
<Forget
address={contract.address.toString()}
key='modal-forget-contract'
mode='contract'
onClose={toggleIsForgetOpen}
onForget={_onForget}
/>
)}
<AddressMini value={contract.address} />
</td>
<td className='all top'>
<Messages
contract={contract}
contractAbi={contract.abi}
isWatching
onSelect={_onCall}
withMessages
/>
</td>
<td className='top'>
{links?.map(({ blockHash, blockNumber }, index): React.ReactNode => (
<a
href={`#/explorer/query/${blockHash}`}
key={`${index}-${blockNumber}`}
>#{blockNumber}</a>
))}
</td>
<td className='number'>
<AddressInfo
address={contract.address}
withBalance
withBalanceToggle
withExtended={false}
/>
</td>
<td className='start together'>
{!isUndefined(info) && (
info
? info.type
: t<string>('Not on-chain')
)}
</td>
<td className='number together media--1100'>
{bestNumber && (
evictAt
? (
<>
<BlockToTime value={evictAt.sub(bestNumber)} />
#{formatNumber(evictAt)}
</>
)
: t<string>('None')
)}
</td>
<td className='button'>
<Button
icon='trash'
onClick={toggleIsForgetOpen}
/>
</td>
</tr>
);
}