import React from "react"; import bs58 from "bs58"; import * as nacl from "tweetnacl"; import { PublicKey, VersionedMessage } from "@solana/web3.js"; import { Signature } from "components/common/Signature"; import { Address } from "components/common/Address"; export function TransactionSignatures({ signatures, message, rawMessage, }: { signatures: (string | null)[]; message: VersionedMessage; rawMessage: Uint8Array; }) { const signatureRows = React.useMemo(() => { return signatures.map((signature, index) => { const publicKey = message.staticAccountKeys[index]; let verified; if (signature) { const key = publicKey.toBytes(); const rawSignature = bs58.decode(signature); verified = verifySignature({ message: rawMessage, signature: rawSignature, key, }); } const props = { index, signature, signer: publicKey, verified, }; return ; }); }, [signatures, message, rawMessage]); return (

Signatures

{signatureRows}
# Signature Signer Validity Details
); } function verifySignature({ message, signature, key, }: { message: Uint8Array; signature: Uint8Array; key: Uint8Array; }): boolean { return nacl.sign.detached.verify(message, signature, key); } function SignatureRow({ signature, signer, verified, index, }: { signature: string | null; signer: PublicKey; verified?: boolean; index: number; }) { return ( {index + 1} {signature ? ( ) : ( "Missing Signature" )}
{verified === undefined ? ( "N/A" ) : verified ? ( Valid ) : ( Invalid )} {index === 0 && ( Fee Payer )} ); }