explorer: Add support for new compute budget ixs (#25446)

This commit is contained in:
Justin Starry 2022-05-22 01:24:25 +08:00 committed by GitHub
parent 773b2f23f4
commit 3b3046ab3d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 93 additions and 5 deletions

View File

@ -5,7 +5,7 @@ import {
TransactionInstruction,
} from "@solana/web3.js";
import { InstructionCard } from "./InstructionCard";
import { SolBalance } from "utils";
import { microLamportsToLamportsString, SolBalance } from "utils";
import { Address } from "components/common/Address";
import { reportError } from "utils/sentry";
import { useCluster } from "providers/cluster";
@ -37,7 +37,7 @@ export function ComputeBudgetDetailsCard({
ix={ix}
index={index}
result={result}
title="Compute Budget Program: Request Units"
title="Compute Budget Program: Request Units (Deprecated)"
innerCards={innerCards}
childIndex={childIndex}
>
@ -50,7 +50,9 @@ export function ComputeBudgetDetailsCard({
<tr>
<td>Requested Compute Units</td>
<td className="text-lg-end">{units}</td>
<td className="text-lg-end font-monospace">{`${new Intl.NumberFormat(
"en-US"
).format(units)} compute units`}</td>
</tr>
<tr>
@ -82,7 +84,65 @@ export function ComputeBudgetDetailsCard({
<tr>
<td>Requested Heap Frame (Bytes)</td>
<td className="text-lg-end">{bytes}</td>
<td className="text-lg-end font-monospace">
{new Intl.NumberFormat("en-US").format(bytes)}
</td>
</tr>
</InstructionCard>
);
}
case "SetComputeUnitLimit": {
const { units } =
ComputeBudgetInstruction.decodeSetComputeUnitLimit(ix);
return (
<InstructionCard
ix={ix}
index={index}
result={result}
title="Compute Budget Program: Set Compute Unit Limit"
innerCards={innerCards}
childIndex={childIndex}
>
<tr>
<td>Program</td>
<td className="text-lg-end">
<Address pubkey={ix.programId} alignRight link />
</td>
</tr>
<tr>
<td>Compute Unit Limit</td>
<td className="text-lg-end font-monospace">{`${new Intl.NumberFormat(
"en-US"
).format(units)} compute units`}</td>
</tr>
</InstructionCard>
);
}
case "SetComputeUnitPrice": {
const { microLamports } =
ComputeBudgetInstruction.decodeSetComputeUnitPrice(ix);
return (
<InstructionCard
ix={ix}
index={index}
result={result}
title="Compute Budget Program: Set Compute Unit Price"
innerCards={innerCards}
childIndex={childIndex}
>
<tr>
<td>Program</td>
<td className="text-lg-end">
<Address pubkey={ix.programId} alignRight link />
</td>
</tr>
<tr>
<td>Compute Unit Price</td>
<td className="text-lg-end font-monospace">{`${microLamportsToLamportsString(
microLamports
)} lamports per compute unit`}</td>
</tr>
</InstructionCard>
);

View File

@ -6,7 +6,8 @@ import {
import { PublicKey } from "@solana/web3.js";
// Switch to web3 constant when web3 updates superstruct
export const LAMPORTS_PER_SOL = 1000000000;
export const LAMPORTS_PER_SOL = 1_000_000_000;
export const MICRO_LAMPORTS_PER_LAMPORT = 1_000_000;
export const NUM_TICKS_PER_SECOND = 160;
export const DEFAULT_TICKS_PER_SLOT = 64;
@ -28,6 +29,33 @@ export function normalizeTokenAmount(
return rawTokens / Math.pow(10, decimals);
}
export function microLamportsToLamports(
microLamports: number | bigint
): number {
if (typeof microLamports === "number") {
return microLamports / MICRO_LAMPORTS_PER_LAMPORT;
}
console.log(microLamports);
const microLamportsString = microLamports.toString().padStart(7, "0");
const splitIndex = microLamportsString.length - 6;
const lamportString =
microLamportsString.slice(0, splitIndex) +
"." +
microLamportsString.slice(splitIndex);
return parseFloat(lamportString);
}
export function microLamportsToLamportsString(
microLamports: number | bigint,
maximumFractionDigits: number = 6
): string {
const lamports = microLamportsToLamports(microLamports);
return new Intl.NumberFormat("en-US", { maximumFractionDigits }).format(
lamports
);
}
export function lamportsToSol(lamports: number | BN): number {
if (typeof lamports === "number") {
return Math.abs(lamports) / LAMPORTS_PER_SOL;