pussy-ts/src/containers/txs/Activites.jsx

import { Link } from 'react-router-dom';
import { Text, Pane } from '@cybercongress/gravity';
import { fromBase64, fromUtf8 } from '@cosmjs/encoding';
import ReactJson from 'react-json-view';
import { Account, MsgType, DenomArr, AmountDenom, Cid } from 'src/components';
import { formatNumber } from '../../utils/search/utils';
import { CYBER } from '../../utils/config';
import { timeSince } from '../../utils/utils';

const S_TO_MS = 1 * 10 ** 3;

function ContainerMsgsType({ type, children }) {
  return (
    <Pane
      borderRadius={5}
      display="flex"
      flexDirection="column"
      // boxShadow="0 0 5px #3ab793"
      marginBottom={20}
    >
      <Pane
        display="flex"
        gap="10px"
        marginBottom={20}
        fontSize="18px"
        alignItems="center"
      >
        Type: <MsgType type={type} />
      </Pane>
      <Pane width="100%" paddingLeft={10} gap="20px">
        {children}
      </Pane>
    </Pane>
  );
}

function Row({ value, title }) {
  return (
    <Pane
      key={`${value}-container`}
      className="txs-contaiter-row"
      display="flex"
    >
      <Text
        key={`${title}-title`}
        display="flex"
        fontSize="16px"
        color="#fff"
        whiteSpace="nowrap"
        width="240px"
        marginBottom="5px"
        lineHeight="20px"
      >
        {title} :
      </Text>
      <Text
        key={`${value}-value`}
        display="flex"
        color="#fff"
        fontSize="16px"
        wordBreak="break-all"
        lineHeight="20px"
        marginBottom="5px"
        flexDirection="column"
        alignItems="flex-start"
      >
        {value}
      </Text>
    </Pane>
  );
}

function MultiSend({ msg }) {
  return (
    <ContainerMsgsType type={msg['@type']}>
      <Row
        title="Inputs"
        value={msg.inputs.map((data, i) => {
          return (
            <div
              key={i}
              style={{
                marginBottom: '5px',
              }}
            >
              <Account address={data.address}>
                {data.coins.map((coin, j) => {
                  return (
                    <span key={j}>
                      {' '}
                      <AmountDenom
                        amountValue={coin.amount}
                        denom={coin.denom}
                      />
                    </span>
                  );
                })}
              </Account>
            </div>
          );
        })}
      />
      <Row
        title="Outputs"
        value={msg.outputs.map((data, i) => {
          return (
            <div
              key={i}
              style={{
                marginBottom: '5px',
              }}
            >
              <Account address={data.address} />
              {data.coins.map((coin, j) => {
                return (
                  <span key={j}>
                    {' '}
                    <AmountDenom amountValue={coin.amount} denom={coin.denom} />
                  </span>
                );
              })}
            </div>
          );
        })}
      />
    </ContainerMsgsType>
  );
}

function MsgLink({ msg }) {
  return (
    <ContainerMsgsType type={msg['@type']}>
      <Row title="Neuron" value={<Account address={msg.neuron} />} />
      {msg.links.map((item, index) => (
        <div
          key={`${item.from}-${index}`}
          style={{
            padding: '10px',
            paddingBottom: 0,
            marginBottom: '10px',
            borderTop: '1px solid #3ab79366',
          }}
        >
          <Row title="from" value={<Cid cid={item.from} />} />
          <Row title="to" value={<Cid cid={item.to} />} />
        </div>
      ))}
    </ContainerMsgsType>
  );
}

function MsgInvestmint({ msg }) {
  return (
    <ContainerMsgsType type={msg['@type']}>
      {msg.neuron && (
        <Row title="neuron" value={<Account address={msg.neuron} />} />
      )}
      {msg.amount && (
        <Row
          title="amount"
          value={
            <AmountDenom
              amountValue={msg.amount.amount}
              denom={msg.amount.denom}
            />
          }
        />
      )}
      {msg.resource && (
        <Row
          title="resource"
          value={<DenomArr gap={8} denomValue={msg.resource} />}
        />
      )}
      {msg.length && (
        <Row title="length" value={timeSince(msg.length * S_TO_MS)} />
      )}
    </ContainerMsgsType>
  );
}

function MsgCreateRoute({ msg }) {
  return (
    <ContainerMsgsType type={msg['@type']}>
      <Row title="source" value={<Account address={msg.source} />} />
      <Row title="name" value={msg.name} />
      <Row title="destination" value={<Account address={msg.destination} />} />
    </ContainerMsgsType>
  );
}

function MsgEditRoute({ msg }) {
  return (
    <ContainerMsgsType type={msg['@type']}>
      <Row title="source" value={<Account address={msg.source} />} />
      {msg && (
        <Row
          title="amount"
          value={<AmountDenom amountValue={msg.amount} denom={msg.denom} />}
        />
      )}
      <Row title="destination" value={<Account address={msg.destination} />} />
    </ContainerMsgsType>
  );
}

function MsgDeleteRoute({ msg }) {
  return (
    <ContainerMsgsType type={msg['@type']}>
      <Row title="source" value={<Account address={msg.source} />} />
      <Row title="destination" value={<Account address={msg.destination} />} />
    </ContainerMsgsType>
  );
}

function MsgEditRouteName({ msg }) {
  return <MsgCreateRoute msg={msg} />;
}

function Activites({ msg }) {
  let type = '';

  if (msg['@type']) {
    type = msg['@type'];
  }

  if (type.includes('MsgCyberlink')) {
    return <MsgLink msg={msg} />;
  }

  // bank
  if (type.includes('MsgSend')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row title="From" value={<Account address={msg.from_address} />} />
        <Row title="To" value={<Account address={msg.to_address} />} />
        <Row
          title="amount"
          value={
            msg.amount.length > 0
              ? msg.amount.map((amount, i) => {
                  const { denom, amount: amountValue } = amount;
                  if (i > 0) {
                    return (
                      <>
                        {' '}
                        ,<AmountDenom amountValue={amountValue} denom={denom} />
                      </>
                    );
                  }
                  return (
                    <AmountDenom
                      amountValue={amountValue}
                      denom={denom}
                      key={i}
                    />
                  );
                })
              : `0 ${CYBER.DENOM_CYBER.toUpperCase()}`
          }
        />
      </ContainerMsgsType>
    );
  }

  // case 'cosmos-sdk/MsgMultiSend':
  if (type.includes('MsgMultiSend')) {
    return <MultiSend msg={msg} />;
  }

  // staking
  if (type.includes('MsgCreateValidator')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="Delegator"
          value={<Account address={msg.delegator_address} />}
        />
        <Row
          title="Validator"
          value={<Account address={msg.validator_address} />}
        />
        <Row
          title="Mininum Self Delegation"
          value={`${formatNumber(msg.min_self_delegation)}
           ${CYBER.DENOM_CYBER.toUpperCase()}`}
        />
        <Row title="Commission Rate" value={msg.commission.rate} />
        <Row title="Description" value={msg.description.moniker} />
      </ContainerMsgsType>
    );
  }
  if (type.includes('MsgEditValidator')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row title="Address" value={<Account address={msg.address} />} />
      </ContainerMsgsType>
    );
  }
  if (type.includes('MsgDelegate')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="Delegator"
          value={<Account address={msg.delegator_address} />}
        />
        <Row
          title="Validator"
          value={<Account address={msg.validator_address} />}
        />
        <Row
          title="Delegation Amount"
          value={
            <AmountDenom
              amountValue={msg.amount.amount}
              denom={msg.amount.denom}
            />
          }
        />
      </ContainerMsgsType>
    );
  }
  if (type.includes('MsgUndelegate')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="Delegator"
          value={<Account address={msg.delegator_address} />}
        />
        <Row
          title="Validator"
          value={<Account address={msg.validator_address} />}
        />
        <Row
          title="Undelegation Amount"
          value={
            <AmountDenom
              amountValue={msg.amount.amount}
              denom={msg.amount.denom}
            />
          }
        />
      </ContainerMsgsType>
    );
  }
  if (type.includes('MsgBeginRedelegate')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="Delegator"
          value={<Account address={msg.delegator_address} />}
        />
        <Row
          title="Redelegated from"
          value={<Account address={msg.validator_src_address} />}
        />
        <Row
          title="Redelegated to"
          value={<Account address={msg.validator_dst_address} />}
        />
        <Row
          title="Redelegation Amount"
          value={
            <AmountDenom
              amountValue={msg.amount.amount}
              denom={msg.amount.denom}
            />
          }
        />
      </ContainerMsgsType>
    );
  }

  // swap
  if (type.includes('MsgSwapWithinBatch')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="Swap requester address"
          value={<Account address={msg.swap_requester_address} />}
        />
        <Row
          title="Demand coin denom"
          value={<DenomArr gap={8} denomValue={msg.demand_coin_denom} />}
        />
        <Row
          title="Offer coin"
          value={
            <AmountDenom
              amountValue={msg.offer_coin.amount}
              denom={msg.offer_coin.denom}
            />
          }
        />
        <Row
          title="Offer coin fee"
          value={
            <AmountDenom
              amountValue={msg.offer_coin_fee.amount}
              denom={msg.offer_coin_fee.denom}
            />
          }
        />
        <Row title="Order price" value={msg.order_price} />
        <Row title="Pool ID" value={msg.pool_id} />
        <Row title="Swap type id" value={msg.swap_type_id} />
      </ContainerMsgsType>
    );
  }

  if (type.includes('MsgDepositWithinBatch')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="Depositor address"
          value={<Account address={msg.depositor_address} />}
        />
        <Row title="Pool id" value={msg.pool_id} />
        <Row
          title="Deposit coins"
          value={
            <div
              style={{ display: 'flex', gap: '10px', flexDirection: 'column' }}
            >
              {msg.deposit_coins.map((data, i) => {
                return (
                  <AmountDenom
                    amountValue={data.amount}
                    key={i}
                    denom={data.denom}
                  />
                );
              })}
            </div>
          }
        />
      </ContainerMsgsType>
    );
  }

  if (type.includes('MsgWithdrawWithinBatch')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="Withdrawer address"
          value={<Account address={msg.withdrawer_address} />}
        />
        <Row title="Pool id" value={msg.pool_id} />
        <Row
          title="Pool coin"
          value={
            <AmountDenom
              amountValue={msg.pool_coin.amount}
              denom={msg.pool_coin.denom}
            />
          }
        />
      </ContainerMsgsType>
    );
  }

  // distribution
  if (type.includes('MsgWithdrawValidatorCommission')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="address"
          value={<Account address={msg.validator_address} />}
        />
      </ContainerMsgsType>
    );
  }

  if (type.includes('MsgWithdrawDelegatorReward')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="delegator"
          value={<Account address={msg.delegator_address} />}
        />
        <Row
          title="validator"
          value={<Account address={msg.validator_address} />}
        />
      </ContainerMsgsType>
    );
  }

  if (type.includes('MsgModifyWithdrawAddress')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="delegator"
          value={<Account address={msg.delegator_address} />}
        />
      </ContainerMsgsType>
    );
  }

  // gov
  if (type.includes('MsgSubmitProposal')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row title="Proposer" value={<Account address={msg.proposer} />} />
        <Row
          title="Initail Deposit"
          value={
            msg.initial_deposit.length > 0
              ? msg.initial_deposit.map((amount, i) => {
                  if (i > 0) {
                    return ` ,${amount.amount} ${amount.denom}`;
                  }
                  return `${formatNumber(
                    amount.amount
                  )} ${amount.denom.toUpperCase()}`;
                })
              : `0 ${CYBER.DENOM_CYBER.toUpperCase()}`
          }
        />
      </ContainerMsgsType>
    );
  }

  if (type.includes('MsgDeposit')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="Proposal Id"
          value={
            <Link to={`/senate/${msg.proposal_id}`}>{msg.proposal_id}</Link>
          }
        />
        <Row title="Depositor" value={<Account address={msg.depositor} />} />
        <Row
          title="Amount"
          value={msg.amount.map((amount, i) => {
            if (i > 0) {
              return ` ,${amount.amount} ${amount.denom}`;
            }
            return `${formatNumber(
              amount.amount
            )} ${amount.denom.toUpperCase()}`;
          })}
        />
      </ContainerMsgsType>
    );
  }

  if (type.includes('MsgVote')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="Proposal Id"
          value={
            <Link to={`/senate/${msg.proposal_id}`}>{msg.proposal_id}</Link>
          }
        />
        <Row title="Voter" value={<Account address={msg.voter} />} />
        <Row title="Vote Option" value={msg.option} />
      </ContainerMsgsType>
    );
  }

  // slashing
  if (type.includes('MsgUnjail')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row
          title="address"
          value={<Account address={msg.validator_addr || msg.address} />}
        />
      </ContainerMsgsType>
    );
  }

  // wasm
  if (type.includes('MsgInstantiateContract')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row title="address" value={<Account address={msg.sender} />} />
        <Row title="label" value={msg.label} />
        {msg.code_id && <Row title="code id" value={msg.code_id} />}
        <Row
          title="message"
          value={
            <ReactJson
              src={msg.msg}
              theme="twilight"
              displayObjectSize={false}
              displayDataTypes={false}
            />
          }
        />
        <Row
          title="funds"
          value={
            msg.funds.length > 0
              ? msg.funds.map((amount, i) => {
                  if (i > 0) {
                    return ` ,${amount.amount} ${amount.denom}`;
                  }
                  return `${formatNumber(
                    amount.amount
                  )} ${amount.denom.toUpperCase()}`;
                })
              : `0 ${CYBER.DENOM_CYBER.toUpperCase()}`
          }
        />
      </ContainerMsgsType>
    );
  }

  if (type.includes('MsgStoreCode')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row title="address" value={<Account address={msg.sender} />} />
        <Row title="wasm byte code" value={msg.wasm_byte_code} />
      </ContainerMsgsType>
    );
  }

  if (type.includes('MsgExecuteContract')) {
    console.log(msg.msg);

    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row title="address" value={<Account address={msg.sender} />} />
        <Row title="contract" value={<Account address={msg.contract} />} />
        <Row
          title="message"
          value={
            <ReactJson
              src={msg.msg}
              theme="twilight"
              displayObjectSize={false}
              displayDataTypes={false}
            />
          }
        />
        <Row
          title="funds"
          value={
            msg.funds.length > 0
              ? msg.funds.map((amount, i) => {
                  if (i > 0) {
                    return ` ,${amount.amount} ${amount.denom}`;
                  }
                  return `${formatNumber(
                    amount.amount
                  )} ${amount.denom.toUpperCase()}`;
                })
              : `0 ${CYBER.DENOM_CYBER.toUpperCase()}`
          }
        />
      </ContainerMsgsType>
    );
  }

  // Investmint
  if (type.includes('MsgInvestmint')) {
    return <MsgInvestmint msg={msg} />;
  }

  // grid
  if (type.includes('MsgCreateRoute')) {
    return <MsgCreateRoute msg={msg} />;
  }

  if (type.includes('MsgEditRoute')) {
    return <MsgEditRoute msg={msg} />;
  }

  if (type.includes('MsgDeleteRoute')) {
    return <MsgDeleteRoute msg={msg} />;
  }

  if (type.includes('MsgEditRouteName')) {
    return <MsgEditRouteName msg={msg} />;
  }

  if (type.includes('MsgTransfer')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row title="Sender" value={<Account address={msg.sender} />} />
        <Row title="Receiver" value={<Account address={msg.receiver} />} />
        <Row title="Source channel" value={msg.source_channel} />
        <Row title="Source port" value={msg.source_port} />
        <Row
          title="Token"
          value={
            <AmountDenom
              amountValue={msg.token.amount}
              denom={msg.token.denom}
            />
          }
        />
        <Row
          title="Timeout height"
          value={`${formatNumber(
            msg.timeout_height.revision_height
          )} / ${formatNumber(msg.timeout_height.revision_number)}`}
        />
      </ContainerMsgsType>
    );
  }

  // ibc
  if (type.includes('MsgRecvPacket')) {
    const { packet } = msg;
    if (Object.prototype.hasOwnProperty.call(packet, 'data')) {
      try {
        const dataPacketSring = fromUtf8(fromBase64(packet.data));
        packet.data = dataPacketSring;
      } catch (e) {
        // That string wasn't valid.
      }
    }
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row title="Signer" value={<Account address={msg.signer} />} />
        <Row
          title="Packet"
          value={
            <ReactJson
              src={msg.packet}
              theme="twilight"
              displayObjectSize={false}
              displayDataTypes={false}
            />
          }
        />
        <Row title="Proof Commitment" value={msg.proof_commitment} />
        <Row
          title="Proof Height"
          value={
            <ReactJson
              src={msg.proof_height}
              theme="twilight"
              displayObjectSize={false}
              displayDataTypes={false}
            />
          }
        />
        {/* <Row
          title="Proof Height"
          value={`RN: ${formatNumber(
            msg.proof_height.revision_number
          )} RH: ${formatNumber(msg.proof_height.revision_height)}`}
        /> */}
      </ContainerMsgsType>
    );
  }

  if (type.includes('MsgUpdateClient')) {
    return (
      <ContainerMsgsType type={msg['@type']}>
        <Row title="Signer" value={<Account address={msg.signer} />} />
        <Row title="Client ID" value={msg.client_id} />
        <Row
          title="Header"
          value={
            <ReactJson
              src={msg.header}
              theme="twilight"
              displayObjectSize={false}
              displayDataTypes={false}
            />
          }
        />
      </ContainerMsgsType>
    );
  }

  return (
    <div>
      <ReactJson
        src={msg}
        theme="twilight"
        displayObjectSize={false}
        displayDataTypes={false}
      />
    </div>
  );
}

export default Activites;

Synonyms

cyb/src/containers/txs/Activites.jsx

Neighbours