obtener_assets_transaccion
Fetch assets from a transaction on the MIST.cash privacy-preserving payment protocol. Shows assets even if already spent; use verificar_existencia_transaccion for accurate verification.
Instructions
Fetch assets from a transaction. WARNING: This shows assets even if already spent. Use verificar_existencia_transaccion for accurate verification.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_key | Yes | Transaction key to query | |
| recipient_address | Yes | Starknet address of the recipient | |
| provider_rpc_url | No | Optional custom Starknet RPC URL |
Implementation Reference
- src/tools/obtener-assets.ts:11-49 (handler)The main handler function that executes the tool logic: validates input, creates Starknet provider and Chamber contract instance, fetches transaction assets using Mistcash SDK's fetchTxAssets with retry and 30s timeout, returns assets with warning.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}`); } }
- src/utils/validation.ts:20-24 (schema)Zod schema defining and validating the tool's input parameters: transaction_key (required string), recipient_address (Starknet address), provider_rpc_url (optional URL).export const ObtenerAssetsTransaccionSchema = z.object({ transaction_key: z.string().min(1, 'Transaction key is required'), recipient_address: StarknetAddressSchema, provider_rpc_url: z.string().url().optional() });
- src/index.ts:63-84 (registration)Tool registration in MCP server's listTools handler, defining name, description, and input schema.{ name: 'obtener_assets_transaccion', description: 'Fetch assets from a transaction. WARNING: This shows assets even if already spent. Use verificar_existencia_transaccion for accurate verification.', inputSchema: { type: 'object', properties: { transaction_key: { type: 'string', description: 'Transaction key to query', }, recipient_address: { type: 'string', description: 'Starknet address of the recipient', }, provider_rpc_url: { type: 'string', description: 'Optional custom Starknet RPC URL', }, }, required: ['transaction_key', 'recipient_address'], }, },
- src/index.ts:176-184 (registration)Tool call handler in MCP server's CallToolRequestSchema switch, invoking the obtenerAssetsTransaccion function.case 'obtener_assets_transaccion': return { content: [ { type: 'text', text: JSON.stringify(await obtenerAssetsTransaccion(args), null, 2), }, ], };
- src/tools/obtener-assets.js:9-35 (handler)JavaScript version of the handler function, similar logic without TypeScript types.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}`); } }