import React, { useContext, useState, useEffect, useRef } from "react"; import { Card, Container, Row, Col, Spinner } from "react-bootstrap"; import { QueryPreservingLink } from "src/services/network/networkProvider"; import InfoTabs from "src/components/DetailsPages/Misc/InfoTabs/InfoTabs"; import DefaultTab from "src/components/DetailsPages/Misc/InfoTabs/DefaultTab"; import CodeTab from "src/components/DetailsPages/Misc/InfoTabs/CodeTab"; import AddressDisp from "src/components/Misc/Disp/AddressDisp/AddressDisp"; import { NetworkContext } from "src/services/network/networkProvider"; import { ContractData } from "src/typings/api"; import { qaToZil } from "src/utils/Utils"; import { faFileContract } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import InitParamsTab from "../../Misc/InfoTabs/InitParamsTab"; import ContractTransactionsTab from "./ContractTransactionsTab"; import LabelStar from "../../Misc/LabelComponent/LabelStar"; import ViewBlockLink from "../../Misc/ViewBlockLink/ViewBlockLink"; import "../AddressDetailsPage.css"; interface IProps { addr: string; } const ContractDetailsPage: React.FC = ({ addr }) => { const networkContext = useContext(NetworkContext); if (!networkContext) { return (
); } const { dataService, isIsolatedServer, networkUrl } = networkContext; const addrRef = useRef(addr); const [contractData, setContractData] = useState(null); const [creationTxnHash, setCreationTxnHash] = useState(null); const [isLoading, setIsLoading] = useState(false); const [transactionsCount, setTransactionsCount] = useState(0); const isFungibleToken = (contractData: ContractData) => { const symbol = contractData.initParams.find( (item) => item.vname === "symbol" ); const name = contractData.initParams.find((item) => item.vname === "name"); const init_supply = contractData.initParams.find( (item) => item.vname === "init_supply" ); const decimals = contractData.initParams.find( (item) => item.vname === "decimals" ); if (symbol && name && init_supply && decimals) { const holders = Object.keys(contractData.state.balances).length; /* const holds = Object.values(contractData.state.balances); const init_value = typeof (init_supply.value === "string") ? parseFloat(init_supply.value) : 0; console.log(holds); const supply = init_value - (holds.length ? holds.reduce( (prev: number, current: any) => prev + parseFloat(current), 0 ) : 0); */ return { symbol, name, init_supply, decimals, holders, }; } return false; }; const fungibleToken = contractData ? isFungibleToken(contractData) : false; // Fetch data useEffect(() => { setIsLoading(true); if (!dataService || isIsolatedServer === null) return; let contractData: ContractData; let creationTxnHash: string; const getData = async () => { try { if (isIsolatedServer) { contractData = await dataService.getContractData(addrRef.current); } else { contractData = await dataService.getContractData(addrRef.current); creationTxnHash = await dataService.getTxnIdFromContractData( contractData ); } if (contractData) setContractData(contractData); if (creationTxnHash) setCreationTxnHash(creationTxnHash); } catch (e) { console.log(e); } finally { setIsLoading(false); } }; getData(); }, [dataService, isIsolatedServer]); const generateTabsObj = () => { const tabs: { tabHeaders: string[]; tabTitles: string[]; tabContents: React.ReactNode[]; } = { tabHeaders: [], tabTitles: [], tabContents: [], }; if (!contractData) return tabs; tabs.tabHeaders.push("transactions"); tabs.tabTitles.push("Transactions"); tabs.tabContents.push( ); tabs.tabHeaders.push("initParams"); tabs.tabTitles.push("Init Parameters"); tabs.tabContents.push( ); tabs.tabHeaders.push("State"); tabs.tabTitles.push("State"); tabs.tabContents.push(); tabs.tabHeaders.push("code"); tabs.tabTitles.push("Code"); tabs.tabContents.push(); return tabs; }; return ( <> {isLoading ? (
) : null} {contractData && ( <>

Contract

Balance
{qaToZil(contractData.state["_balance"])}
Transactions
{transactionsCount}
{fungibleToken ? ( <>
Token Info
<> {fungibleToken.name.value}
{fungibleToken.symbol.value}
Token Holders
{fungibleToken.holders}
Token Transfers
Token Supply
{typeof fungibleToken.init_supply.value === "string" ? fungibleToken.init_supply.value : "N/A"}
) : null}
{creationTxnHash && ( <>
Contract Creation: {creationTxnHash}
)}
)} ); }; export default ContractDetailsPage;