obtener-assets.js•1.96 kB
/**
* Tool 2: Fetch Transaction Assets
* Retrieves assets from a transaction (WARNING: shows assets even if spent)
*/
import { fetchTxAssets } from '@mistcash/sdk';
import { CHAMBER_ADDR_MAINNET, CHAMBER_ADDR_SEPOLIA, CHAMBER_ABI } from '@mistcash/config';
import { ObtenerAssetsTransaccionSchema } from '../utils/validation.js';
import { createProvider, getChamberContract, retryWithBackoff } from '../utils/provider.js';
export async function obtenerAssetsTransaccion(params) {
// Validate parameters
const validated = ObtenerAssetsTransaccionSchema.parse(params);
try {
// Create provider
const provider = createProvider(validated.provider_rpc_url ? { nodeUrl: validated.provider_rpc_url } : undefined);
// Get contract address based on network
const network = (process.env.STARKNET_NETWORK || 'mainnet');
const contractAddress = network === 'mainnet' ? CHAMBER_ADDR_MAINNET : CHAMBER_ADDR_SEPOLIA;
// Get contract instance
const contract = await getChamberContract(provider, contractAddress, CHAMBER_ABI);
// Fetch transaction assets with retry logic and 30s timeout
const assetsPromise = retryWithBackoff(() => fetchTxAssets(contract, validated.transaction_key, validated.recipient_address));
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Request timeout after 30s')), 30000));
const assets = await Promise.race([assetsPromise, timeoutPromise]);
return {
success: true,
assets,
warning: '⚠️ This function shows assets even if they have already been spent. Use verificar_existencia_transaccion for accurate verification.',
transaction_key: validated.transaction_key,
recipient_address: validated.recipient_address
};
}
catch (error) {
throw new Error(`Failed to fetch transaction assets: ${error.message}`);
}
}