UNPKG

@shogun-sdk/money-legos

Version:

Shogun Money Legos: clients and types for quotes, memes, prices, balances, fees, validations, etc.

156 lines 6.89 kB
import { LEGO_API, SOLANA_CHAIN_ID } from '@shogun-sdk/money-legos'; /** * Client for interacting with the Lego API * * @example * ```typescript * const legoClient = new LegoClient({ apiKey: 'your-api-key' }); * const result = await legoClient.MagicEden.SwapForNFT({ items, token, userAddress, recipientAddress }); * const updatedResult = await result.refetch(); * ``` */ export class LegoClient { /** * Creates a new LegoClient instance * * @param {LegoClientConfig} config - Configuration options including API key */ constructor(config) { Object.defineProperty(this, "apiKey", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "activeControllers", { enumerable: true, configurable: true, writable: true, value: new Map() }); /** * MagicEden marketplace operations */ Object.defineProperty(this, "MagicEden", { enumerable: true, configurable: true, writable: true, value: { /** * Swaps tokens for NFTs on MagicEden with support for refetching * * @param {IFetchLegoProps} props - Input parameters containing NFT items, token, and user address * @returns {Promise<ILegoResult>} - Result containing status, data, error message, and refetch function */ SwapForNFT: async (props) => { const { items, token, userAddress, recipientAddress } = props; const requestId = this.generateRequestId(props); // Create refetch function that will be returned with the result const refetch = async () => { return this.MagicEden.SwapForNFT(props); }; // ✅ Validate required parameters if (!items.length || !token.address || !userAddress) { return { status: false, error: 'Invalid parameters provided', data: null, refetch, }; } const isSolanaTokenIn = token.chainId === SOLANA_CHAIN_ID; // ✅ Solana requires recipient address if (isSolanaTokenIn && !recipientAddress) { return { status: false, error: 'Recipient address is required for Solana transactions.', data: null, refetch, }; } // Cancel any ongoing request with the same ID if (this.activeControllers.has(requestId)) { this.activeControllers.get(requestId)?.abort(); this.activeControllers.delete(requestId); } // Create a new AbortController for this request const controller = new AbortController(); this.activeControllers.set(requestId, controller); try { // ✅ Construct the request payload conditionally const requestBody = JSON.stringify({ tokenIn: { address: token.address, decimals: token.decimals, chainId: token.chainId, }, nft: items, address: userAddress, ...(isSolanaTokenIn || recipientAddress ? { recipient: recipientAddress } : {}), }); // ✅ Send API request const response = await fetch(`${LEGO_API}/nft/purchase`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': this.apiKey, }, body: requestBody, signal: controller.signal, }); // Clean up controller reference after request this.activeControllers.delete(requestId); // ✅ Handle non-200 responses if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.message || response.statusText); } // ✅ Parse response const result = await response.json(); // ✅ Return successful result return { status: !!result?.data?.execute, error: null, data: result?.data?.execute || null, refetch, }; } catch (err) { // Clean up controller reference this.activeControllers.delete(requestId); // ✅ Ignore abort errors if (err instanceof DOMException && err.name === 'AbortError') { return { status: false, error: 'Request aborted', data: null, refetch, }; } // ✅ Return error result return { status: false, error: err instanceof Error ? err.message : 'Unknown error', data: null, refetch, }; } }, } }); this.apiKey = config.apiKey; } /** * Generates a unique request ID for tracking purposes * * @param {IFetchLegoProps} props - The fetch parameters * @returns {string} - A unique identifier for this request * @private */ generateRequestId(props) { const { items, token, userAddress } = props; const itemsStr = items.map((item) => `${item.address}-${item.tokenId}`).join('|'); return `${userAddress}-${token.address}-${itemsStr}`; } } //# sourceMappingURL=shogun-lego-api-client.js.map