import React from "react";
import { PublicKey, VersionedMessage } from "@solana/web3.js";
import { Address } from "components/common/Address";
import { useAddressLookupTable } from "providers/accounts";
import { FetchStatus } from "providers/cache";
export function AddressTableLookupsCard({
message,
}: {
message: VersionedMessage;
}) {
const [expanded, setExpanded] = React.useState(true);
const lookupRows = React.useMemo(() => {
let key = 0;
return message.addressTableLookups.flatMap((lookup) => {
const indexes = [
...lookup.writableIndexes.map((index) => ({ index, readOnly: false })),
...lookup.readonlyIndexes.map((index) => ({ index, readOnly: true })),
];
indexes.sort((a, b) => (a.index < b.index ? -1 : 1));
return indexes.map(({ index, readOnly }) => {
const props = {
lookupTableKey: lookup.accountKey,
lookupTableIndex: index,
readOnly,
};
return ;
});
});
}, [message]);
if (message.version === "legacy") return null;
return (
Address Table Lookup(s)
{expanded && (
Address Lookup Table Address |
Table Index |
Resolved Address |
Details |
{lookupRows.length > 0 ? (
{lookupRows}
) : (
)}
)}
);
}
function LookupRow({
lookupTableKey,
lookupTableIndex,
readOnly,
}: {
lookupTableKey: PublicKey;
lookupTableIndex: number;
readOnly: boolean;
}) {
const lookupTableInfo = useAddressLookupTable(lookupTableKey.toBase58());
const loadingComponent = (
Loading
);
let resolvedKeyComponent;
if (!lookupTableInfo) {
resolvedKeyComponent = loadingComponent;
} else {
const [lookupTable, status] = lookupTableInfo;
if (status === FetchStatus.Fetching) {
resolvedKeyComponent = loadingComponent;
} else if (status === FetchStatus.FetchFailed || !lookupTable) {
resolvedKeyComponent = (
Failed to fetch Lookup Table
);
} else if (typeof lookupTable === "string") {
resolvedKeyComponent = (
Invalid Lookup Table
);
} else if (lookupTableIndex >= lookupTable.state.addresses.length) {
resolvedKeyComponent = (
Invalid Lookup Table Index
);
} else {
const resolvedKey = lookupTable.state.addresses[lookupTableIndex];
resolvedKeyComponent = ;
}
}
return (
|
{lookupTableIndex} |
{resolvedKeyComponent} |
{!readOnly && Writable}
|
);
}