solana-web3-lite
Version:
A lightweight wrapper around @solana/web3.js for simplified Solana blockchain interactions
82 lines (81 loc) • 5.32 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const spl_token_1 = require("@solana/spl-token");
const web3_js_1 = require("@solana/web3.js");
const helpers_1 = require("@solana-developers/helpers");
const umi_bundle_defaults_1 = require("@metaplex-foundation/umi-bundle-defaults");
const umi_1 = require("@metaplex-foundation/umi");
const mpl_token_metadata_1 = require("@metaplex-foundation/mpl-token-metadata");
const utils_1 = require("./utils");
const createAndManageSPLToken = (_a) => __awaiter(void 0, [_a], void 0, function* ({ wallet, metadata, recipientAddress = wallet.publicKey.toBase58(), amountToMint = 10, amountToTransfer = 1, decimals = 2, cluster = "devnet", commitment = "confirmed", }) {
try {
console.log(`Processing SPL token on ${cluster}...`);
if (!wallet)
throw new Error("Wallet keypair is required");
if (amountToMint <= 0 || amountToTransfer <= 0)
throw new Error("Amounts must be greater than 0");
if (decimals < 0)
throw new Error("Decimals must be non-negative");
const connection = (0, utils_1.getConnection)({ cluster, commitment });
const recipientPubKey = (0, utils_1.toPublicKey)(recipientAddress);
const mintAuthority = wallet.publicKey;
const minorUnits = BigInt(Math.pow(10, decimals));
const umi = (0, umi_bundle_defaults_1.createUmi)(connection);
const umiKeypair = umi.eddsa.createKeypairFromSecretKey(wallet.secretKey);
const userWalletSigner = (0, umi_1.createSignerFromKeypair)(umi, umiKeypair);
umi.use((0, umi_1.signerIdentity)(userWalletSigner));
umi.use((0, mpl_token_metadata_1.mplTokenMetadata)());
// Create mint with metadata using UMI
const mint = (0, umi_1.generateSigner)(umi);
const metadataSignature = yield (0, mpl_token_metadata_1.createAndMint)(umi, {
mint,
authority: umi.identity,
name: metadata.name,
symbol: metadata.symbol,
uri: metadata.uri,
sellerFeeBasisPoints: (0, umi_1.percentAmount)(0),
decimals,
amount: 0,
tokenStandard: mpl_token_metadata_1.TokenStandard.Fungible,
}).sendAndConfirm(umi);
const mintPublicKeyObj = new web3_js_1.PublicKey(mint.publicKey);
const mintPublicKey = mintPublicKeyObj.toBase58();
const sourceTokenAccount = yield (0, spl_token_1.getOrCreateAssociatedTokenAccount)(connection, wallet, mintPublicKeyObj, mintAuthority, false, commitment);
const mintAmount = BigInt(Math.floor(amountToMint * Number(minorUnits)));
const mintSignature = yield (0, spl_token_1.mintTo)(connection, wallet, mintPublicKeyObj, sourceTokenAccount.address, mintAuthority, mintAmount, [], { commitment });
const destinationTokenAccount = yield (0, spl_token_1.getOrCreateAssociatedTokenAccount)(connection, wallet, mintPublicKeyObj, recipientPubKey, false, commitment);
const transferTx = new web3_js_1.Transaction().add((0, spl_token_1.createTransferInstruction)(sourceTokenAccount.address, destinationTokenAccount.address, mintAuthority, BigInt(Math.floor(amountToTransfer * Number(minorUnits))), [], spl_token_1.TOKEN_PROGRAM_ID));
const transferSignature = yield (0, web3_js_1.sendAndConfirmTransaction)(connection, transferTx, [wallet], { commitment });
const explorerLinks = {
mint: (0, helpers_1.getExplorerLink)("address", mintPublicKey, cluster),
sourceAccount: (0, helpers_1.getExplorerLink)("address", sourceTokenAccount.address.toBase58(), cluster),
destinationAccount: (0, helpers_1.getExplorerLink)("address", destinationTokenAccount.address.toBase58(), cluster),
metadataTx: (0, helpers_1.getExplorerLink)("tx", metadataSignature.signature.toString(), cluster),
mintTx: (0, helpers_1.getExplorerLink)("tx", mintSignature, cluster),
transferTx: (0, helpers_1.getExplorerLink)("tx", transferSignature, cluster),
};
console.log(`✅ Created and managed SPL token, visit explorer: ${explorerLinks.mint}`);
return {
mintPublicKey,
sourceAccount: sourceTokenAccount.address.toBase58(),
destinationAccount: destinationTokenAccount.address.toBase58(),
mintSignature,
transferSignature,
metadataSignature: metadataSignature.signature.toString(),
explorerLinks,
};
}
catch (error) {
console.error("SPL token management failed:", error);
throw error;
}
});