@saberhq/token-utils
Version:
Token-related math and transaction utilities for Solana.
110 lines • 4.51 kB
JavaScript
/**
* This file is a port of serum-common, which was built for web3.js 0.x.
*/
import { Token as SPLToken, TOKEN_PROGRAM_ID } from "@solana/spl-token";
import { Keypair, PublicKey, SystemProgram, Transaction, } from "@solana/web3.js";
import { deserializeAccount, deserializeMint, MintLayout, Token, } from "./index.js";
export * as token from "./token.js";
/**
* Default number of decimals of a token.
*/
export const DEFAULT_TOKEN_DECIMALS = 6;
export const SPL_SHARED_MEMORY_ID = new PublicKey("shmem4EWT2sPdVGvTZCzXXRAURL9G5vpPxNwSeKhHUL");
export async function createMint(provider, authority, decimals) {
if (authority === undefined) {
authority = provider.wallet.publicKey;
}
const mint = Keypair.generate();
const instructions = await createMintInstructions(provider, authority, mint.publicKey, decimals);
const tx = new Transaction();
tx.add(...instructions);
await provider.send(tx, [mint]);
return mint.publicKey;
}
/**
* Creates a Token.
*
* @param provider
* @param authority The mint authority.
* @param decimals Number of decimals.
* @returns
*/
export async function createToken(provider, authority, decimals = 6) {
return Token.fromMint(await createMint(provider, authority, decimals), decimals);
}
export async function createMintInstructions(provider, authority, mint, decimals = 6) {
const instructions = [
SystemProgram.createAccount({
fromPubkey: provider.wallet.publicKey,
newAccountPubkey: mint,
space: MintLayout.span,
lamports: await provider.connection.getMinimumBalanceForRentExemption(MintLayout.span),
programId: TOKEN_PROGRAM_ID,
}),
SPLToken.createInitMintInstruction(TOKEN_PROGRAM_ID, mint, decimals, authority, null),
];
return instructions;
}
export async function createMintAndVault(provider, amount, owner, decimals) {
if (owner === undefined) {
owner = provider.wallet.publicKey;
}
const mint = Keypair.generate();
const vault = Keypair.generate();
const tx = new Transaction();
tx.add(...(await createMintInstructions(provider, provider.wallet.publicKey, mint.publicKey, decimals)), SystemProgram.createAccount({
fromPubkey: provider.wallet.publicKey,
newAccountPubkey: vault.publicKey,
space: 165,
lamports: await provider.connection.getMinimumBalanceForRentExemption(165),
programId: TOKEN_PROGRAM_ID,
}), SPLToken.createInitAccountInstruction(TOKEN_PROGRAM_ID, mint.publicKey, vault.publicKey, owner), SPLToken.createMintToInstruction(TOKEN_PROGRAM_ID, mint.publicKey, vault.publicKey, provider.wallet.publicKey, [], amount));
await provider.send(tx, [mint, vault]);
return [mint.publicKey, vault.publicKey];
}
export async function createTokenAccountInstrs(provider, newAccountPubkey, mint, owner, lamports) {
if (lamports === undefined) {
lamports = await provider.connection.getMinimumBalanceForRentExemption(165);
}
return [
SystemProgram.createAccount({
fromPubkey: provider.wallet.publicKey,
newAccountPubkey,
space: 165,
lamports,
programId: TOKEN_PROGRAM_ID,
}),
SPLToken.createInitAccountInstruction(TOKEN_PROGRAM_ID, mint, newAccountPubkey, owner),
];
}
export async function createAccountRentExempt(provider, programId, size) {
const acc = Keypair.generate();
const tx = new Transaction();
tx.add(SystemProgram.createAccount({
fromPubkey: provider.wallet.publicKey,
newAccountPubkey: acc.publicKey,
space: size,
lamports: await provider.connection.getMinimumBalanceForRentExemption(size),
programId,
}));
await provider.send(tx, [acc]);
return acc;
}
export async function getMintInfo(provider, addr) {
const depositorAccInfo = await provider.getAccountInfo(addr);
if (depositorAccInfo === null) {
throw new Error("Failed to find token mint account");
}
return deserializeMint(depositorAccInfo.accountInfo.data);
}
export async function getTokenAccount(provider, addr) {
const depositorAccInfo = await provider.getAccountInfo(addr);
if (depositorAccInfo === null) {
throw new Error("Failed to find token account");
}
return deserializeAccount(depositorAccInfo.accountInfo.data);
}
export function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
//# sourceMappingURL=common.js.map