wormhole/lp_ui/src/utils/solana.ts

83 lines
2.3 KiB
TypeScript

import { MintLayout } from "@solana/spl-token";
import { WalletContextState } from "@solana/wallet-adapter-react";
import {
AccountInfo,
Connection,
PublicKey,
Transaction,
TransactionInstruction,
} from "@solana/web3.js";
export async function sendSignAndConfirmInstruction(
wallet: WalletContextState,
connection: Connection,
instruction: TransactionInstruction
) {
console.log("instruction being sent", instruction);
const transaction = new Transaction().add(instruction);
const { blockhash } = await connection.getRecentBlockhash();
transaction.recentBlockhash = blockhash;
transaction.feePayer = wallet.publicKey || undefined;
console.log("transaction", transaction);
return signSendAndConfirm(wallet, connection, transaction);
}
export async function signSendAndConfirm(
wallet: WalletContextState,
connection: Connection,
transaction: Transaction
) {
if (!wallet.signTransaction) {
throw new Error("wallet.signTransaction is undefined");
}
const signed = await wallet.signTransaction(transaction);
const txid = await connection.sendRawTransaction(signed.serialize());
await connection.confirmTransaction(txid);
return txid;
}
export function extractMintAuthorityInfo(
account: AccountInfo<Buffer>
): string | null {
const data = Buffer.from(account.data);
const mintInfo = MintLayout.decode(data);
const uintArray = mintInfo?.mintAuthority;
const pubkey = new PublicKey(uintArray);
const output = pubkey?.toString();
return output || null;
}
export async function getMultipleAccountsRPC(
connection: Connection,
pubkeys: PublicKey[]
): Promise<(AccountInfo<Buffer> | null)[]> {
return getMultipleAccounts(connection, pubkeys, "confirmed");
}
export const getMultipleAccounts = async (
connection: any,
pubkeys: PublicKey[],
commitment: string
) => {
return (
await Promise.all(
chunks(pubkeys, 99).map((chunk) =>
connection.getMultipleAccountsInfo(chunk, commitment)
)
)
).flat();
};
export function chunks<T>(array: T[], size: number): T[][] {
return Array.apply<number, T[], T[][]>(
0,
new Array(Math.ceil(array.length / size))
).map((_, index) => array.slice(index * size, (index + 1) * size));
}
export function shortenAddress(address: string) {
return `${address.slice(0, 4)}...${address.slice(-4)}`;
}