import { Registry } from '@cosmjs/proto-signing';
import { Tx } from 'cosmjs-types/cosmos/tx/v1beta1/tx';
import { MsgExecuteContract } from 'cosmjs-types/cosmwasm/wasm/v1/tx';
import { useEffect, useState } from 'react';
import { useParams } from 'react-router-dom';
import { BASE_DENOM } from 'src/constants/config';
import { useQueryClient } from 'src/contexts/queryClient';
import { DenomArr, MainContainer } from '../../../components';
import { formatNumber, makeTags, trimString } from '../../../utils/utils';
import { CardCantainer, FlexWrapCantainer } from '../ui/ui';
import ExecuteContract from './ExecuteContract';
import ExecuteTable from './ExecuteTable';
import HistoryInfo from './HistoryInfo';
import InitializationInfo from './InitializationInfo';
import QueryContract from './QueryContract';
import RenderAbi from './renderAbi';
import styles from './stylesContractPage.scss';

function isStargateMsgExecuteContract(msg) {
  return msg.typeUrl === '/cosmwasm.wasm.v1.MsgExecuteContract' && !!msg.value;
}

const getAndSetDetails = async (client, contractAddress, setDetails) => {
  try {
    const response = await client.getContract(contractAddress);
    console.log(`response getAndSetDetails`, response);
    setDetails(response);
  } catch (error) {
    console.log(`error`, error);
  }
};

const getAndSetContractCodeHistory = async (client, contractAddress, setContractCodeHistory) => {
  try {
    const response = await client.getContractCodeHistory(contractAddress);
    console.log(`response getContractCodeHistory`, response);
    setContractCodeHistory(response);
  } catch (error) {
    console.log(`error`, error);
  }
};

const getAndSetInstantiationTxHash = async (client, contractAddress, setInstantiationTxHash) => {
  try {
    const response = await client.searchTx({
      tags: makeTags(
        `message.module=wasm&message.action=/cosmwasm.wasm.v1.MsgInstantiateContract&instantiate._contract_address=${contractAddress}`
      ),
    });
    const first = response.find(() => true);
    if (first.hash) {
      console.log(`first.hash`, first.hash);
      setInstantiationTxHash(first.hash);
    }
  } catch (error) {
    console.log(`error`, error);
  }
};

const getExecutionFromStargateMsgExecuteContract = (typeRegistry, tx) => {
  return (msg, i) => {
    const decodedMsg = typeRegistry.decode({
      typeUrl: msg.typeUrl,
      value: msg.value,
    });
    return {
      key: `${tx.hash}_${i}`,
      height: tx.height,
      transactionId: tx.hash,
      msg: decodedMsg,
    };
  };
};

const getExecutions = async (client, contractAddress, setExecutions) => {
  const typeRegistry = new Registry(cosmwasm.wasm.v1.MsgExecuteContract', MsgExecuteContract);

  const response = await client.searchTx({
    tags: makeTags(
      `message.module=wasm&message.action=/cosmwasm.wasm.v1.MsgExecuteContract&execute._contract_address=${contractAddress}`
    ),
  });

  const out = response.reduce((executions, tx) => {
    const decodedTx = Tx.decode(tx.tx);
    const txExecutions = decodedTx.body.messages
      .filter(isStargateMsgExecuteContract)
      .map(getExecutionFromStargateMsgExecuteContract(typeRegistry, tx));
    return [...executions, ...txExecutions];
  }, []);

  if (out.length > 0) {
    setExecutions(out.reverse());
  }
};

const getBalance = async (client, contractAddress, setBalance) => {
  try {
    const response = await client.getBalance(contractAddress, BASE_DENOM);
    if (response !== null) {
      setBalance(response);
    }
  } catch (error) {
    console.log(`error`, error);
    setBalance({ denom: '', amount: 0 });
  }
};

const useGetInfoContractAddress = (contractAddress, _updateFnc) => {
  const queryClient = useQueryClient();
  const [instantiationTxHash, setInstantiationTxHash] = useState('');
  const [contractCodeHistory, setContractCodeHistory] = useState([]);
  const [details, setDetails] = useState({});
  const [executions, setExecutions] = useState([]);
  const [balance, setBalance] = useState({ denom: '', amount: 0 });

  useEffect(() => {
    if (queryClient) {
      getAndSetDetails(queryClient, contractAddress, setDetails);
      getAndSetContractCodeHistory(queryClient, contractAddress, setContractCodeHistory);
      getAndSetInstantiationTxHash(queryClient, contractAddress, setInstantiationTxHash);
      getBalance(queryClient, contractAddress, setBalance);
    }
  }, [queryClient, contractAddress]);

  useEffect(() => {
    if (queryClient) {
      getExecutions(queryClient, contractAddress, setExecutions);
    }
  }, [queryClient, contractAddress]);

  return {
    balance,
    details,
    executions,
    contractCodeHistory,
    instantiationTxHash,
  };
};

function ContractPage() {
  const { contractAddress } = useParams();
  const [updateFnc, setUpdateFnc] = useState(0);
  const { balance, details, executions, instantiationTxHash, contractCodeHistory } =
    useGetInfoContractAddress(contractAddress, updateFnc);

  return (
    <MainContainer>
      <FlexWrapCantainer style={{ flexDirection: 'column', width: '60%', boxShadow: 'none' }}>
        <div className={styles.containerContractPageContainerTitle}>
          <div className={styles.containerContractPageContainerTitleTitle}>
            Contract: {trimString(contractAddress, 12)}
          </div>
          <div className={styles.containerContractPageContainerTitleBalance}>
            Balance: {formatNumber(parseFloat(balance.amount))}
            {balance.denom && (
              <>
                &nbsp;
                <DenomArr onlyImg marginContainer="0px 0px 0px 3px" denomValue={balance.denom} />
              </>
            )}
          </div>
        </div>

        <InitializationInfo initTxHash={instantiationTxHash} details={details} />
        <HistoryInfo contractCodeHistory={contractCodeHistory} />

        <QueryContract contractAddress={contractAddress} />

        <ExecuteContract contractAddress={contractAddress} />
      </FlexWrapCantainer>

      <FlexWrapCantainer style={{ width: '60%' }}>
        <RenderAbi
          contractAddress={contractAddress}
          updateFnc={() => setUpdateFnc((item) => item + 1)}
        />
      </FlexWrapCantainer>
      <CardCantainer style={{ width: '60%', margin: '0 auto' }}>
        <ExecuteTable executions={executions} />
      </CardCantainer>
    </MainContainer>
  );
}

export default ContractPage;

Synonyms

pussy-ts/src/containers/wasm/index.jsx
pussy-ts/src/containers/trollBox/index.jsx
cyb/src/containers/movie/index.jsx
cyb/src/components/battery/index.jsx
cyb/src/components/vitalik/index.jsx
pussy-ts/src/containers/oracle/index.jsx
cyb/src/containers/wasm/index.jsx
cyb/src/components/ButtonNetwork/index.jsx
pussy-ts/src/containers/blok/index.jsx
pussy-ts/src/components/battery/index.jsx
cyb/src/components/searchSnippet/index.jsx
pussy-ts/src/containers/validator/index.jsx
pussy-ts/src/containers/Objects/index.jsx
cyb/src/containers/parameters/index.jsx
pussy-ts/src/containers/parameters/index.jsx
pussy-ts/src/containers/market/index.jsx
cyb/src/containers/oracle/index.jsx
cyb/src/components/particle/index.jsx
pussy-ts/src/components/numberCurrency/index.jsx
cyb/src/components/numberCurrency/index.jsx
pussy-ts/src/containers/testKeplre/index.jsx
pussy-ts/src/components/valueImg/index.jsx
pussy-ts/src/components/ButtonNetwork/index.jsx
pussy-ts/src/containers/network/index.jsx
pussy-ts/src/components/particle/index.jsx
pussy-ts/src/containers/movie/index.jsx
cyb/src/containers/market/index.jsx
pussy-ts/src/containers/help/index.jsx
pussy-ts/src/components/statusTooltip/index.jsx
cyb/src/containers/help/index.jsx
pussy-ts/src/components/vitalik/index.jsx
cyb/src/containers/testPage/index.jsx
pussy-ts/src/components/searchSnippet/index.jsx
cyb/src/components/valueImg/index.jsx
cyb/src/components/statusTooltip/index.jsx
cyb/src/containers/trollBox/index.jsx
pussy-ts/src/containers/Validators/components/index.jsx
pussy-ts/src/containers/portal/stateComponent/index.jsx
pussy-ts/src/containers/parameters/tabs/index.jsx
pussy-ts/src/containers/wasm/codes/index.jsx
pussy-ts/src/containers/wasm/contract/index.jsx
cyb/src/containers/portal/stateComponent/index.jsx
cyb/src/containers/parameters/tabs/index.jsx
cyb/src/containers/temple/components/canvasOne/index.jsx
cyb/src/containers/wasm/contract/renderAbi/index.jsx
cyb/src/containers/wasm/codes/code/index.jsx
pussy-ts/src/containers/portal/components/progressCard/index.jsx
pussy-ts/src/containers/temple/components/canvasOne/index.jsx
pussy-ts/src/containers/portal/components/ActionBar/index.jsx
cyb/src/containers/wasm/codes/codePage/index.jsx
pussy-ts/src/containers/portal/components/nextUnfreeze/index.jsx
pussy-ts/src/containers/portal/components/Released/index.jsx
cyb/src/containers/portal/components/progressCard/index.jsx
cyb/src/containers/portal/components/currentGift/index.jsx
pussy-ts/src/containers/wasm/codes/code/index.jsx
pussy-ts/src/containers/wasm/contract/renderAbi/index.jsx
pussy-ts/src/containers/portal/components/currentGift/index.jsx
cyb/src/containers/portal/components/Released/index.jsx
cyb/src/containers/portal/components/imgNetwork/index.jsx
pussy-ts/src/containers/portal/components/imgNetwork/index.jsx
pussy-ts/src/containers/energy/ui/card/index.jsx
pussy-ts/src/containers/wasm/codes/codePage/index.jsx
cyb/src/containers/portal/components/nextUnfreeze/index.jsx
cyb/src/containers/energy/ui/card/index.jsx
pussy-ts/src/containers/sigma/components/cardUi/ChartTotal/index.jsx
pussy-ts/src/containers/sigma/components/cardUi/DetailsBalance/index.jsx
pussy-ts/src/containers/sigma/components/cardUi/BtnArrow/index.jsx
cyb/src/containers/sigma/components/cardUi/ChartTotal/index.jsx
cyb/src/containers/sigma/components/cardUi/BtnArrow/index.jsx
cyb/src/containers/sigma/components/cardUi/DetailsBalance/index.jsx

Neighbours