@shogun-sdk/money-legos
Version:
Shogun Money Legos: clients and types for quotes, memes, prices, balances, fees, validations, etc.
156 lines • 6.89 kB
JavaScript
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