import React, { useState, useEffect } from 'react'; import { useSelector } from 'react-redux'; import { VictoryPie } from 'victory'; import ScrollContainer from "react-indiana-drag-scroll"; import Winner from '../components/WinnerStat'; import { getOrchestratorScores } from "../actions/livepeer"; import Ticket from "../components/TicketViewer"; import { Pagination } from "@mantine/core"; const claimColour = "rgba(25, 158, 29, 0.4)"; const stakeColour = "rgba(25, 158, 147, 0.4)"; const ticketRedeemColour = "rgba(25, 98, 158, 0.4)"; const rewardColour = "rgba(25, 27, 158, 0.4)"; const unbondColour = "rgba(105, 25, 158, 0.4)"; const updateColour = "rgba(158, 25, 52, 0.4)"; const withdrawStakeColour = "rgba(158, 98, 25, 0.4)"; const activationColour = "rgba(154, 158, 25, 0.4)"; const ticketTransferColour = "rgba(88, 91, 42, 0.3)"; const greyColour = "rgba(122, 128, 127, 0.4)"; const itemsPerPage = 10; const WinnerMonth = (obj) => { const livepeer = useSelector((state) => state.livepeerstate); const [thisScores, setThisScores] = useState(null); const [activePage, setPage] = useState(1); const [activeGraph, setGraph] = useState(1); let totalGraphs = 0; useEffect(() => { const setScore = async () => { if (!obj.data.testScores) { const freshScore = await getOrchestratorScores(obj.data.year, obj.data.month); if (freshScore) { setThisScores(freshScore); } } else { setThisScores(obj.data.testScores); } } setScore(); }, [obj.data.testScores]); const getName = (address) => { let thisDomain = null; // Lookup domain in cache if (livepeer.ensDomainMapping) { for (const thisAddr of livepeer.ensDomainMapping) { if (thisAddr.address === address) { thisDomain = thisAddr; break; } } } // Lookup current info in cache only if this addr has a mapped ENS domain if (thisDomain && thisDomain.domain) { for (const thisAddr of livepeer.ensInfoMapping) { if (thisAddr.domain === thisDomain.domain) { if (thisAddr.domain.length > 18) { return (thisAddr.domain.substring(0, 16) + ".."); } return thisAddr.domain; } } } if (livepeer.threeBoxInfo) { for (const thisAddr of livepeer.threeBoxInfo) { if (thisAddr.address === address) { if (thisAddr.name) { if (thisAddr.name.length > 18) { return (thisAddr.name.substring(0, 16) + ".."); } return thisAddr.name; } else { return (address.substring(0, 16) + ".."); } break; } } } return (address.substring(0, 16) + ".."); } // Show all orchs (if latestTotalStake exists) or show only those in winningTicketsReceived let orchList; let ticketList = obj.data.winningTicketsReceived || []; let commissionList = obj.data.latestCommission || []; let stakeList = obj.data.latestTotalStake || []; // Pies for stake overview, if have stake data for that month saved let stakeObj; let totalStakeSum = 0; if (obj.data.latestTotalStake && obj.data.latestTotalStake.length) { orchList = [...obj.data.latestTotalStake]; let pieList = []; let otherSum = 0; let ticketIdx = obj.data.latestTotalStake.length - 1; // Calc total stake at that time while (ticketIdx >= 0) { const thisTicket = obj.data.latestTotalStake[ticketIdx]; ticketIdx -= 1; totalStakeSum += thisTicket.totalStake; } ticketIdx = obj.data.latestTotalStake.length - 1; // Create pie chart while (ticketIdx >= 0) { const thisTicket = obj.data.latestTotalStake[ticketIdx]; ticketIdx -= 1; if ((thisTicket.totalStake / totalStakeSum) < 0.015) { otherSum += thisTicket.totalStake; } else { pieList.push({ address: getName(thisTicket.address), sum: thisTicket.totalStake }); } } if ((otherSum / totalStakeSum) > 0.01) { pieList.push({ address: "Other", sum: otherSum }); } totalGraphs++; stakeObj =

Stake Distribution

; } else { orchList = [...obj.data.winningTicketsReceived]; } // Pies for earnings overview let earningsObj; if (obj.data.winningTicketsReceived && obj.data.winningTicketsReceived.length) { let otherSum = 0; let pieList = []; let ticketIdx = obj.data.winningTicketsReceived.length - 1; // Create pie chart while (ticketIdx >= 0) { const thisTicket = obj.data.winningTicketsReceived[ticketIdx]; ticketIdx -= 1; if ((thisTicket.sum / obj.data.winningTicketsReceivedSum) < 0.015) { otherSum += thisTicket.sum; } else { pieList.push({ address: getName(thisTicket.address), sum: thisTicket.sum }); } } if ((otherSum / obj.data.winningTicketsReceivedSum) > 0.01) { pieList.push({ address: "Other", sum: otherSum }); } totalGraphs++; earningsObj =

Earnings Distribution

; } // Pies for broadcaster payout let broadcasterObj; if (obj.data.winningTicketsSent && obj.data.winningTicketsSent.length) { let otherSum = 0; let pieList = []; let ticketIdx = obj.data.winningTicketsSent.length - 1; // Create pie chart while (ticketIdx >= 0) { const thisTicket = obj.data.winningTicketsSent[ticketIdx]; ticketIdx -= 1; if ((thisTicket.sum / obj.data.winningTicketsReceivedSum) < 0.015) { otherSum += thisTicket.sum; } else { pieList.push({ address: getName(thisTicket.address), sum: thisTicket.sum }); } } if ((otherSum / obj.data.winningTicketsReceivedSum) > 0.01) { pieList.push({ address: "Other", sum: otherSum }); } totalGraphs++; broadcasterObj =

Broadcaster Payments

; } let sortedList = []; if (orchList.length) { // Sort this months data while (orchList.length) { let ticketIdx2 = orchList.length - 1; let largestIdx = 0; let largestValue = 0; // Find current O with most ticket wins in Eth while (ticketIdx2 >= 0) { const currentOrch = orchList[ticketIdx2]; let thisVal; for (const obj of ticketList) { if (obj.address == currentOrch.address) { thisVal = obj.sum; } } if (!thisVal) { ticketIdx2 -= 1; continue; } if (thisVal > largestValue) { largestIdx = ticketIdx2; largestValue = thisVal; } ticketIdx2 -= 1; } // Else try to sort by stake if (!largestValue) { ticketIdx2 = orchList.length - 1; while (ticketIdx2 >= 0) { const currentOrch = orchList[ticketIdx2]; let thisVal; for (const obj of stakeList) { if (obj.address == currentOrch.address) { thisVal = obj.totalStake; } } if (!thisVal) { ticketIdx2 -= 1; continue; } if (thisVal > largestValue) { largestIdx = ticketIdx2; largestValue = thisVal; } ticketIdx2 -= 1; } } // Push current biggest list sortedList.push(orchList[largestIdx]); // Remove from list orchList.splice(largestIdx, 1); } } const totalPages = (sortedList.length + (itemsPerPage - (sortedList.length % itemsPerPage))) / itemsPerPage; let renderStake = false; let renderEarnings = false; let renderBread = false; let graphIndex = 1; if (activeGraph == graphIndex && totalGraphs && stakeObj) { renderStake = true; } graphIndex++; if (activeGraph == graphIndex && totalGraphs && earningsObj) { renderEarnings = true; } graphIndex++; if (activeGraph == graphIndex && totalGraphs && broadcasterObj) { renderBread = true; } return (
{obj.data.reactivationCount ?
: null }
{obj.data.activationCount ?
: null }
{(obj.data.latestCommission && obj.data.latestCommission.length) ?
: null}
{obj.data.bondCount ?
: null }
{obj.data.unbondCount ?
: null }
{obj.data.rewardCount ?
: null }
{obj.data.claimCount ?
: null }
{obj.data.withdrawStakeCount ?
: null }
{obj.data.withdrawFeesCount ?
: null }
{obj.data.moveStakeCount ?
: null }
{obj.data.winningTicketsReceivedCount ?
: null }
{obj.data.winningTicketsRedeemedCount ?
: null }
{renderStake ? stakeObj : null} {renderEarnings ? earningsObj : null} {renderBread ? broadcasterObj : null}
{totalGraphs > 1 ? : null}

{sortedList.length} Delegators

{ sortedList.map(function (orch, i) { const tmp = i - ((activePage - 1) * itemsPerPage); if (tmp >= 0 && tmp < itemsPerPage) { let thisCommission = null; let thisStake = null; let thisEarnings = null; for (const obj of ticketList) { if (obj.address == orch.address) { thisEarnings = obj; } } for (const obj of commissionList) { if (obj.address == orch.address) { thisCommission = obj; } } for (const obj of stakeList) { if (obj.address == orch.address) { thisStake = obj; } } let thisScore = null; if (thisScores && thisScores.scores) { thisScore = thisScores.scores[orch.address]; } return (
) } return null; }) }
{totalPages > 1 ? : null}
) } export default WinnerMonth;