2020-10-10 01:03:45 -07:00
|
|
|
import React from "react";
|
|
|
|
import { Account, useFetchAccountInfo } from "providers/accounts";
|
|
|
|
import {
|
|
|
|
SysvarAccount,
|
|
|
|
SysvarClockAccount,
|
|
|
|
SysvarEpochScheduleAccount,
|
|
|
|
SysvarFeesAccount,
|
|
|
|
SysvarRecentBlockhashesAccount,
|
|
|
|
SysvarRentAccount,
|
|
|
|
SysvarRewardsAccount,
|
|
|
|
SysvarSlotHashesAccount,
|
|
|
|
SysvarSlotHistoryAccount,
|
|
|
|
SysvarStakeHistoryAccount,
|
|
|
|
} from "validators/accounts/sysvar";
|
|
|
|
import { TableCardBody } from "components/common/TableCardBody";
|
|
|
|
import {
|
|
|
|
AccountHeader,
|
|
|
|
AccountAddressRow,
|
|
|
|
AccountBalanceRow,
|
|
|
|
} from "components/common/Account";
|
|
|
|
import { displayTimestamp } from "utils/date";
|
2020-10-28 19:45:44 -07:00
|
|
|
import { Slot } from "components/common/Slot";
|
2020-10-10 01:03:45 -07:00
|
|
|
|
|
|
|
export function SysvarAccountSection({
|
|
|
|
account,
|
|
|
|
sysvarAccount,
|
|
|
|
}: {
|
|
|
|
account: Account;
|
|
|
|
sysvarAccount: SysvarAccount;
|
|
|
|
}) {
|
|
|
|
switch (sysvarAccount.type) {
|
|
|
|
case "clock":
|
|
|
|
return (
|
|
|
|
<SysvarAccountClockCard
|
|
|
|
account={account}
|
|
|
|
sysvarAccount={sysvarAccount}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case "rent":
|
|
|
|
return (
|
|
|
|
<SysvarAccountRentCard
|
|
|
|
account={account}
|
|
|
|
sysvarAccount={sysvarAccount}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case "rewards":
|
|
|
|
return (
|
|
|
|
<SysvarAccountRewardsCard
|
|
|
|
account={account}
|
|
|
|
sysvarAccount={sysvarAccount}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case "epochSchedule":
|
|
|
|
return (
|
|
|
|
<SysvarAccountEpochScheduleCard
|
|
|
|
account={account}
|
|
|
|
sysvarAccount={sysvarAccount}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case "fees":
|
|
|
|
return (
|
|
|
|
<SysvarAccountFeesCard
|
|
|
|
account={account}
|
|
|
|
sysvarAccount={sysvarAccount}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case "recentBlockhashes":
|
|
|
|
return (
|
|
|
|
<SysvarAccountRecentBlockhashesCard
|
|
|
|
account={account}
|
|
|
|
sysvarAccount={sysvarAccount}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case "slotHashes":
|
|
|
|
return (
|
|
|
|
<SysvarAccountSlotHashes
|
|
|
|
account={account}
|
|
|
|
sysvarAccount={sysvarAccount}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case "slotHistory":
|
|
|
|
return (
|
|
|
|
<SysvarAccountSlotHistory
|
|
|
|
account={account}
|
|
|
|
sysvarAccount={sysvarAccount}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case "stakeHistory":
|
|
|
|
return (
|
|
|
|
<SysvarAccountStakeHistory
|
|
|
|
account={account}
|
|
|
|
sysvarAccount={sysvarAccount}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function SysvarAccountRecentBlockhashesCard({
|
|
|
|
account,
|
|
|
|
}: {
|
|
|
|
account: Account;
|
|
|
|
sysvarAccount: SysvarRecentBlockhashesAccount;
|
|
|
|
}) {
|
|
|
|
const refresh = useFetchAccountInfo();
|
|
|
|
return (
|
|
|
|
<div className="card">
|
|
|
|
<AccountHeader
|
2020-11-19 14:06:24 -08:00
|
|
|
title="Sysvar: Recent Blockhashes"
|
2020-10-10 01:03:45 -07:00
|
|
|
refresh={() => refresh(account.pubkey)}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<TableCardBody>
|
|
|
|
<AccountAddressRow account={account} />
|
|
|
|
<AccountBalanceRow account={account} />
|
|
|
|
</TableCardBody>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function SysvarAccountSlotHashes({
|
|
|
|
account,
|
|
|
|
}: {
|
|
|
|
account: Account;
|
|
|
|
sysvarAccount: SysvarSlotHashesAccount;
|
|
|
|
}) {
|
|
|
|
const refresh = useFetchAccountInfo();
|
|
|
|
return (
|
|
|
|
<div className="card">
|
|
|
|
<AccountHeader
|
2020-11-19 14:06:24 -08:00
|
|
|
title="Sysvar: Slot Hashes"
|
2020-10-10 01:03:45 -07:00
|
|
|
refresh={() => refresh(account.pubkey)}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<TableCardBody>
|
|
|
|
<AccountAddressRow account={account} />
|
|
|
|
<AccountBalanceRow account={account} />
|
|
|
|
</TableCardBody>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function SysvarAccountSlotHistory({
|
|
|
|
account,
|
|
|
|
sysvarAccount,
|
|
|
|
}: {
|
|
|
|
account: Account;
|
|
|
|
sysvarAccount: SysvarSlotHistoryAccount;
|
|
|
|
}) {
|
|
|
|
const refresh = useFetchAccountInfo();
|
|
|
|
const history = Array.from(
|
|
|
|
{
|
|
|
|
length: 100,
|
|
|
|
},
|
|
|
|
(v, k) => sysvarAccount.info.nextSlot - k
|
|
|
|
);
|
|
|
|
return (
|
|
|
|
<div className="card">
|
|
|
|
<AccountHeader
|
2020-11-19 14:06:24 -08:00
|
|
|
title="Sysvar: Slot History"
|
2020-10-10 01:03:45 -07:00
|
|
|
refresh={() => refresh(account.pubkey)}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<TableCardBody>
|
|
|
|
<AccountAddressRow account={account} />
|
|
|
|
<AccountBalanceRow account={account} />
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td className="align-top">
|
|
|
|
Slot History{" "}
|
|
|
|
<span className="text-muted">(previous 100 slots)</span>
|
|
|
|
</td>
|
|
|
|
<td className="text-lg-right text-monospace">
|
|
|
|
{history.map((val) => (
|
|
|
|
<p key={val} className="mb-0">
|
2020-10-28 19:45:44 -07:00
|
|
|
<Slot slot={val} link />
|
2020-10-10 01:03:45 -07:00
|
|
|
</p>
|
|
|
|
))}
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</TableCardBody>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function SysvarAccountStakeHistory({
|
|
|
|
account,
|
|
|
|
}: {
|
|
|
|
account: Account;
|
|
|
|
sysvarAccount: SysvarStakeHistoryAccount;
|
|
|
|
}) {
|
|
|
|
const refresh = useFetchAccountInfo();
|
|
|
|
return (
|
|
|
|
<div className="card">
|
|
|
|
<AccountHeader
|
2020-11-19 14:06:24 -08:00
|
|
|
title="Sysvar: Stake History"
|
2020-10-10 01:03:45 -07:00
|
|
|
refresh={() => refresh(account.pubkey)}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<TableCardBody>
|
|
|
|
<AccountAddressRow account={account} />
|
|
|
|
<AccountBalanceRow account={account} />
|
|
|
|
</TableCardBody>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function SysvarAccountFeesCard({
|
|
|
|
account,
|
|
|
|
sysvarAccount,
|
|
|
|
}: {
|
|
|
|
account: Account;
|
|
|
|
sysvarAccount: SysvarFeesAccount;
|
|
|
|
}) {
|
|
|
|
const refresh = useFetchAccountInfo();
|
|
|
|
return (
|
|
|
|
<div className="card">
|
|
|
|
<AccountHeader
|
2020-11-19 14:06:24 -08:00
|
|
|
title="Sysvar: Fees"
|
2020-10-10 01:03:45 -07:00
|
|
|
refresh={() => refresh(account.pubkey)}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<TableCardBody>
|
|
|
|
<AccountAddressRow account={account} />
|
|
|
|
<AccountBalanceRow account={account} />
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>Lamports Per Signature</td>
|
|
|
|
<td className="text-lg-right">
|
|
|
|
{sysvarAccount.info.feeCalculator.lamportsPerSignature}
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</TableCardBody>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function SysvarAccountEpochScheduleCard({
|
|
|
|
account,
|
|
|
|
sysvarAccount,
|
|
|
|
}: {
|
|
|
|
account: Account;
|
|
|
|
sysvarAccount: SysvarEpochScheduleAccount;
|
|
|
|
}) {
|
|
|
|
const refresh = useFetchAccountInfo();
|
|
|
|
return (
|
|
|
|
<div className="card">
|
|
|
|
<AccountHeader
|
2020-11-19 14:06:24 -08:00
|
|
|
title="Sysvar: Epoch Schedule"
|
2020-10-10 01:03:45 -07:00
|
|
|
refresh={() => refresh(account.pubkey)}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<TableCardBody>
|
|
|
|
<AccountAddressRow account={account} />
|
|
|
|
<AccountBalanceRow account={account} />
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>Slots Per Epoch</td>
|
|
|
|
<td className="text-lg-right">{sysvarAccount.info.slotsPerEpoch}</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>Leader Schedule Slot Offset</td>
|
|
|
|
<td className="text-lg-right">
|
|
|
|
{sysvarAccount.info.leaderScheduleSlotOffset}
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>Epoch Warmup Enabled</td>
|
|
|
|
<td className="text-lg-right">
|
|
|
|
<code>{sysvarAccount.info.warmup ? "true" : "false"}</code>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>First Normal Epoch</td>
|
|
|
|
<td className="text-lg-right">
|
|
|
|
{sysvarAccount.info.firstNormalEpoch}
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>First Normal Slot</td>
|
|
|
|
<td className="text-lg-right">
|
2020-10-28 19:45:44 -07:00
|
|
|
<Slot slot={sysvarAccount.info.firstNormalSlot} />
|
2020-10-10 01:03:45 -07:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</TableCardBody>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function SysvarAccountClockCard({
|
|
|
|
account,
|
|
|
|
sysvarAccount,
|
|
|
|
}: {
|
|
|
|
account: Account;
|
|
|
|
sysvarAccount: SysvarClockAccount;
|
|
|
|
}) {
|
|
|
|
const refresh = useFetchAccountInfo();
|
|
|
|
return (
|
|
|
|
<div className="card">
|
|
|
|
<AccountHeader
|
2020-11-19 14:06:24 -08:00
|
|
|
title="Sysvar: Clock"
|
2020-10-10 01:03:45 -07:00
|
|
|
refresh={() => refresh(account.pubkey)}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<TableCardBody>
|
|
|
|
<AccountAddressRow account={account} />
|
|
|
|
<AccountBalanceRow account={account} />
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>Timestamp</td>
|
2021-02-26 10:47:03 -08:00
|
|
|
<td className="text-lg-right text-monospace">
|
2020-10-10 01:03:45 -07:00
|
|
|
{displayTimestamp(sysvarAccount.info.unixTimestamp * 1000)}
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>Epoch</td>
|
|
|
|
<td className="text-lg-right">{sysvarAccount.info.epoch}</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>Leader Schedule Epoch</td>
|
|
|
|
<td className="text-lg-right">
|
|
|
|
{sysvarAccount.info.leaderScheduleEpoch}
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>Slot</td>
|
2020-10-28 19:45:44 -07:00
|
|
|
<td className="text-lg-right">
|
|
|
|
<Slot slot={sysvarAccount.info.slot} link />
|
|
|
|
</td>
|
2020-10-10 01:03:45 -07:00
|
|
|
</tr>
|
|
|
|
</TableCardBody>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function SysvarAccountRentCard({
|
|
|
|
account,
|
|
|
|
sysvarAccount,
|
|
|
|
}: {
|
|
|
|
account: Account;
|
|
|
|
sysvarAccount: SysvarRentAccount;
|
|
|
|
}) {
|
|
|
|
const refresh = useFetchAccountInfo();
|
|
|
|
return (
|
|
|
|
<div className="card">
|
|
|
|
<AccountHeader
|
2020-11-19 14:06:24 -08:00
|
|
|
title="Sysvar: Rent"
|
2020-10-10 01:03:45 -07:00
|
|
|
refresh={() => refresh(account.pubkey)}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<TableCardBody>
|
|
|
|
<AccountAddressRow account={account} />
|
|
|
|
<AccountBalanceRow account={account} />
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>Burn Percent</td>
|
|
|
|
<td className="text-lg-right">
|
|
|
|
{sysvarAccount.info.burnPercent + "%"}
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>Exemption Threshold</td>
|
|
|
|
<td className="text-lg-right">
|
|
|
|
{sysvarAccount.info.exemptionThreshold} years
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>Lamports Per Byte Year</td>
|
|
|
|
<td className="text-lg-right">
|
|
|
|
{sysvarAccount.info.lamportsPerByteYear}
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</TableCardBody>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function SysvarAccountRewardsCard({
|
|
|
|
account,
|
|
|
|
sysvarAccount,
|
|
|
|
}: {
|
|
|
|
account: Account;
|
|
|
|
sysvarAccount: SysvarRewardsAccount;
|
|
|
|
}) {
|
|
|
|
const refresh = useFetchAccountInfo();
|
|
|
|
|
|
|
|
const validatorPointValueFormatted = new Intl.NumberFormat("en-US", {
|
|
|
|
maximumSignificantDigits: 20,
|
|
|
|
}).format(sysvarAccount.info.validatorPointValue);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="card">
|
|
|
|
<AccountHeader
|
2020-11-19 14:06:24 -08:00
|
|
|
title="Sysvar: Rewards"
|
2020-10-10 01:03:45 -07:00
|
|
|
refresh={() => refresh(account.pubkey)}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<TableCardBody>
|
|
|
|
<AccountAddressRow account={account} />
|
|
|
|
<AccountBalanceRow account={account} />
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
<td>Validator Point Value</td>
|
|
|
|
<td className="text-lg-right text-monospace">
|
|
|
|
{validatorPointValueFormatted} lamports
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</TableCardBody>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|