83 lines
2.3 KiB
TypeScript
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)}`;
|
|
}
|