obtener-assets.ts•2.15 kB
/**
* Tool 2: Fetch Transaction Assets
* Retrieves assets from a transaction (WARNING: shows assets even if spent)
*/
import { fetchTxAssets } from '@mistcash/sdk';
import { CHAMBER_ABI } from '@mistcash/config';
import { ObtenerAssetsTransaccionSchema } from '../utils/validation.js';
import { createProvider, getChamberContract, retryWithBackoff, getContractAddress } from '../utils/provider.js';
import type { TransactionAssets } from '../types.js';
export async function obtenerAssetsTransaccion(params: unknown) {
// 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 (supports custom Madara address)
const network = (process.env.STARKNET_NETWORK || 'mainnet') as 'mainnet' | 'sepolia';
const contractAddress = getContractAddress(network);
// 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]) as TransactionAssets;
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 as Error).message}`);
}
}