UNPKG

@flipflop-sdk/node

Version:

FlipFlop Node.js SDK for programmatic token operations

130 lines 5.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.launchToken = void 0; const web3_js_1 = require("@solana/web3.js"); const utils_1 = require("./utils"); const constants_1 = require("./constants"); const spl_token_1 = require("@solana/spl-token"); const config_1 = require("./config"); // Launch token function const launchToken = async (options) => { // Validate required parameters if (!options.rpc) { return { success: false, message: "Missing rpc parameter", }; } if (!options.tokenType) { return { success: false, message: "Missing token-type parameter", }; } if (!options.creator) { return { success: false, message: "Missing creator parameter", }; } if (!options.name || !options.symbol) { return { success: false, message: "Missing name or symbol parameter", }; } const type = options.tokenType; const rpc = new web3_js_1.Connection(options.rpc, "confirmed"); const config = config_1.CONFIGS[(0, config_1.getNetworkType)(options.rpc)]; try { // Load keypair and create wallet (keypair-file takes priority) const creator = options.creator; const { program, provider, programId } = await (0, utils_1.initProvider)(rpc, creator); // Token parameters const tokenName = options.name; const tokenSymbol = options.symbol; const tokenUri = options.uri || `https://example.com/metadata/${tokenSymbol.toLowerCase()}.json`; const initConfigData = constants_1.TOKEN_PARAMS[type]; // Token metadata const metadata = { name: tokenName, symbol: tokenSymbol, uri: tokenUri, decimals: 9, }; const [launchRuleAccountPda] = web3_js_1.PublicKey.findProgramAddressSync([ Buffer.from(constants_1.LAUNCH_RULE_SEEDS), new web3_js_1.PublicKey(config.systemManagerAccount).toBuffer(), ], programId); const [systemConfigAccount] = web3_js_1.PublicKey.findProgramAddressSync([ Buffer.from(constants_1.SYSTEM_CONFIG_SEEDS), new web3_js_1.PublicKey(config.systemManagerAccount).toBuffer(), ], programId); const systemConfigData = await program.account.systemConfigData.fetch(systemConfigAccount); const protocolFeeAccount = systemConfigData.protocolFeeAccount; const [mintAccount] = web3_js_1.PublicKey.findProgramAddressSync([ Buffer.from(constants_1.MINT_SEED), Buffer.from(metadata.name), Buffer.from(metadata.symbol.toLowerCase()), ], programId); const [configAccount] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.CONFIG_DATA_SEED), mintAccount.toBuffer()], programId); // Create medatata PDA const [metadataAccountPda] = web3_js_1.PublicKey.findProgramAddressSync([ Buffer.from(constants_1.METADATA_SEED), constants_1.TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintAccount.toBuffer(), ], constants_1.TOKEN_METADATA_PROGRAM_ID); const info = await provider.connection.getAccountInfo(mintAccount); if (info) { return { success: false, message: `Token already exists: ${mintAccount.toBase58()}`, }; } const mintTokenVaultAta = await (0, spl_token_1.getAssociatedTokenAddress)(mintAccount, mintAccount, true, spl_token_1.TOKEN_PROGRAM_ID); const tokenVaultAta = await (0, spl_token_1.getAssociatedTokenAddress)(mintAccount, configAccount, true, spl_token_1.TOKEN_PROGRAM_ID); const wsolVaultAta = await (0, spl_token_1.getAssociatedTokenAddress)(spl_token_1.NATIVE_MINT, configAccount, true, spl_token_1.TOKEN_PROGRAM_ID); const contextInitializeToken = { metadata: metadataAccountPda, payer: creator.publicKey, mint: mintAccount, configAccount, mintTokenVault: mintTokenVaultAta, tokenVault: tokenVaultAta, wsolMint: spl_token_1.NATIVE_MINT, wsolVault: wsolVaultAta, systemConfigAccount: systemConfigAccount, protocolFeeAccount: protocolFeeAccount, tokenMetadataProgram: constants_1.TOKEN_METADATA_PROGRAM_ID, launchRuleAccount: launchRuleAccountPda, }; const ix0 = web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: 500000 }); const instructionInitializeToken = await program.methods .initializeToken(metadata, initConfigData) .accounts(contextInitializeToken) .instruction(); const transaction = new web3_js_1.Transaction().add(ix0).add(instructionInitializeToken); const tx = await provider.sendAndConfirm(transaction, [creator]); const configData = await (0, utils_1.parseConfigData)(program, configAccount); // Return structured data instead of console output return { success: true, data: { transactionHash: tx, mintAddress: mintAccount, configAddress: configAccount, metadata: metadata, configuration: configData, }, }; } catch (error) { return { success: false, message: `Failed to launch token: ${error instanceof Error ? error.message : "Unknown error"}`, }; } }; exports.launchToken = launchToken; //# sourceMappingURL=launch.js.map