Withdrawal
Bob quiere retirar sus 178.38. Mercatto registra a dónde quiere que se envíe y le pide a Ishtaran un retiro — usando sus propias credenciales, en nombre de Bob, igual que en Seller balance.
const destination = await mercatto.withdrawals.createDestination(organizationId, destinationAddress, assetNetworkId);
const quote = await mercatto.withdrawals.quote(organizationId, bobAccountId, destination.withdrawalDestinationId, assetNetworkId, amount);
const withdrawal = await mercatto.withdrawals.request(organizationId, bobAccountId, destination.withdrawalDestinationId, assetNetworkId, amount);
Resultado — un bloqueo real y honesto
422 WITHDRAWAL_DESTINATION_NOT_USABLE
Este es el final correcto de este capítulo, no un error en el ejemplo. Un destino de retiro recién
creado nace Pending y solo se vuelve usable 24 horas reales después — un control de
seguridad genuino (protección por whitelist, activada por defecto), confirmado en vivo, y nunca
algo que este Business Case salte o acelere. Se espera que volver a correr exactamente la misma
llamada contra el mismo destino 24 horas después tenga éxito.
Qué pasó por debajo
quote() nunca escribe nada — es una lectura pura, invocable en cualquier momento sin importar el
estado del destino, por eso tiene éxito aunque el propio retiro quede bloqueado inmediatamente
después. quote.networkExecutionCost es el mismo Network Execution Engine que usa el Settlement
(Settlement and Split) — el costo real y cotizado de transmitir este
retiro on-chain, en las unidades propias del activo de recurso, nunca restado de lo que Bob
realmente recibe (estimatedNetworkFee está obsoleto y siempre es null bajo SelfCustody). No
existe ningún mecanismo oficial de Sandbox para adelantar este cooldown, y no debería construirse
ninguno — ver Known Limitations §F.4 para saber exactamente por qué, y por
qué esa es la decisión correcta aunque haga que este capítulo en particular sea más lento de
ejercitar por completo.