Los Planes de Ejecución son estrategias detalladas que pan genera automáticamente para lograr tus intents. Describen exactamente que operaciones se realizaran, en que orden, y con que costos esperados.
Como Funcióna la Planificación
Cuando creas un intent, pan no ejecuta inmediatamente. Primero pasa por una fase de planificación sofisticada:
Analisis de Estado
Consultar balances en todas las chains e identificar tokens disponibles
Evaluacion de Protocolos
Obtener APYs de Aave en cada chain y verificar liquidez
Optimización de Ruta
Calcular opciones de bridge y estimar costos de gas
Generación de Plan
Ordenar operaciones y calcular tiempos estimados
Estructura de un Plan de Ejecución
{
"strategy" : "single-bridge" ,
"targetChain" : "base" ,
"targetProtocol" : "aave" ,
"expectedApy" : 8.52 ,
"steps" : [
{
"type" : "bridge" ,
"sequence" : 1 ,
"from" : "arbitrum" ,
"to" : "base" ,
"asset" : "USDC" ,
"amount" : "1000" ,
"provider" : "across" ,
"estimatedFee" : "1.50" ,
"estimatedTime" : "2-5 min"
},
{
"type" : "deposit" ,
"sequence" : 2 ,
"chain" : "base" ,
"protocol" : "aave" ,
"asset" : "USDC" ,
"amount" : "998.50" ,
"estimatedGas" : "200000" ,
"estimatedGasUsd" : "0.80"
}
],
"summary" : {
"totalSteps" : 2 ,
"estimatedGasUsd" : 2.30 ,
"estimatedFees" : 1.50 ,
"estimatedTotalCost" : 3.80 ,
"estimatedTime" : "3-7 min" ,
"expectedFinalAmount" : "998.50"
}
}
Tipos de Estrategia
Las estrategias usan nombres internos especificos. Asegurate de usar los nombres correctos en tus integraciones.
direct-deposit
Cuando se usa: Los fondos ya están en la chain con mejor yield.
Estado del wallet:
- Base: 1000 USDC
- Mejor APY: Base (8.52%)
Estrategia: direct-deposit
- Solo depósito directo a Aave
- Gas estimado: ~300,000
{
"strategy" : "direct-deposit" ,
"reasoning" : "Funds already on optimal chain" ,
"steps" : [
{
"type" : "deposit" ,
"chain" : "base" ,
"protocol" : "aave" ,
"asset" : "USDC" ,
"amount" : 1000
}
],
"estimatedGas" : 300000 ,
"estimatedTime" : 30
}
bridge-and-lend
Cuando se usa: Los fondos están concentrados en una chain diferente a la optima.
Estado del wallet:
- Arbitrum: 1000 USDC
- Mejor APY: Base (8.52%)
Estrategia: bridge-and-lend
- Bridge Arbitrum -> Base via Across
- Deposito en Aave Base
- Gas estimado: ~450,000
- Fee de bridge: ~0.1%
{
"strategy" : "bridge-and-lend" ,
"reasoning" : "Bridge to chain with best APY" ,
"steps" : [
{
"type" : "bridge" ,
"fromChain" : "arbitrum-sepolia" ,
"toChain" : "base-sepolia" ,
"asset" : "USDC" ,
"amount" : 1000 ,
"bridge" : "across"
},
{
"type" : "deposit" ,
"chain" : "base-sepolia" ,
"protocol" : "aave" ,
"asset" : "USDC" ,
"amount" : 999
}
],
"estimatedGas" : 450000 ,
"estimatedTime" : 120
}
multi-bridge-and-lend
Cuando se usa: Los fondos están distribuidos en múltiples chains.
Estado del wallet:
- Ethereum: 200 USDC
- Arbitrum: 500 USDC
- Base: 300 USDC (ya en destino)
- Mejor APY: Base (8.52%)
Estrategia: multi-bridge-and-lend
- Bridge Ethereum -> Base
- Bridge Arbitrum -> Base
- Deposito consolidado en Aave Base
- Gas estimado: 300,000 + (N x 150,000)
{
"strategy" : "multi-bridge-and-lend" ,
"reasoning" : "Consolidate funds from multiple chains" ,
"steps" : [
{
"type" : "bridge" ,
"fromChain" : "sepolia" ,
"toChain" : "base-sepolia" ,
"asset" : "USDC" ,
"amount" : 200 ,
"bridge" : "across"
},
{
"type" : "bridge" ,
"fromChain" : "arbitrum-sepolia" ,
"toChain" : "base-sepolia" ,
"asset" : "USDC" ,
"amount" : 500 ,
"bridge" : "across"
},
{
"type" : "deposit" ,
"chain" : "base-sepolia" ,
"protocol" : "aave" ,
"asset" : "USDC" ,
"amount" : 996
}
],
"estimatedGas" : 600000 ,
"estimatedTime" : 300
}
simple-withdraw
Cuando se usa: Retirar fondos de Aave.
{
"strategy" : "simple-withdraw" ,
"reasoning" : "Direct withdrawal from Aave" ,
"steps" : [
{
"type" : "withdraw" ,
"chain" : "base-sepolia" ,
"protocol" : "aave" ,
"asset" : "USDC" ,
"amount" : 500
}
],
"estimatedGas" : 250000 ,
"estimatedTime" : 30
}
Tipos de Pasos
Bridge
Mueve tokens entre chains usando Across Protocol.
{
"type" : "bridge" ,
"from" : "arbitrum" ,
"to" : "base" ,
"asset" : "USDC" ,
"amount" : "1000" ,
"provider" : "across" ,
"estimatedFee" : "1.50" ,
"estimatedTime" : "2-5 min" ,
"fillDeadline" : 7200
}
Campos importantes:
provider: Siempre across (Across Protocol)
estimatedFee: Fee del bridge en USD
fillDeadline: Tiempo máximo para completar (segundos)
Deposit
Deposita tokens en un protocolo de lending.
{
"type" : "deposit" ,
"chain" : "base" ,
"protocol" : "aave" ,
"asset" : "USDC" ,
"amount" : "998.50" ,
"apy" : 8.52 ,
"estimatedGas" : "200000" ,
"estimatedGasUsd" : "0.80"
}
Campos importantes:
protocol: Siempre aave actualmente
apy: APY esperado
amount: Cantidad después de fees de bridge
Withdraw
Retira tokens de un protocolo de lending.
{
"type" : "withdraw" ,
"chain" : "base" ,
"protocol" : "aave" ,
"asset" : "USDC" ,
"amount" : "500" ,
"estimatedGas" : "250000" ,
"estimatedGasUsd" : "1.00"
}
Swap (Proximo)
Intercambia un token por otro (en desarrollo).
{
"type" : "swap" ,
"chain" : "arbitrum" ,
"fromAsset" : "USDT" ,
"toAsset" : "USDC" ,
"amount" : "500" ,
"provider" : "uniswap" ,
"estimatedSlippage" : "0.1%"
}
Ejecución del Plan
Una vez generado el plan, pan ejecuta cada paso en secuencia:
Para cada paso en el plan:
Preparacion
Verificar balance y gas disponible, preparar datos de la transacción
Ejecución
Firmar via Privy, enviar a blockchain, obtener txHash
Confirmación
Esperar 1-2 bloques, verificar exito, actualizar estado
Registro
Guardar txHash y gas usado, calcular costo USD, incrementar completedSteps
Si un paso falla, se registra el error y el intent se marca como failed. Si todos los pasos completan, el intent queda completed.
Detalle de Ejecución por Paso
Para cada paso en el plan:
Fase Acción Resultado Precondiciones Engine verifica balance y gas Continua o falla Firma Engine solicita firma a Privy Transacción firmada Envio Engine envia txn a blockchain Recibe txHash Confirmación Engine espera receipt Loop hasta confirmado Registro Guardar en DB completedSteps++ o error
Monitorear Ejecución
Durante la ejecución, puedes ver el progreso en tiempo real:
const intent = await pan . getIntent ( intentId );
console . log ( 'Estado:' , intent . status );
console . log ( 'Plan:' , intent . executionPlan );
console . log ( 'Resultados:' , intent . results );
Respuesta durante ejecución
{
"id" : "intent_xyz789" ,
"status" : "executing" ,
"executionPlan" : {
"strategy" : "single-bridge" ,
"steps" : [
{
"type" : "bridge" ,
"sequence" : 1 ,
"status" : "completed" ,
"txHash" : "0x123abc..."
},
{
"type" : "deposit" ,
"sequence" : 2 ,
"status" : "executing"
}
]
},
"results" : {
"completedSteps" : 1 ,
"transactions" : [
{
"type" : "bridge" ,
"txHash" : "0x123abc..." ,
"chain" : "arbitrum" ,
"gasUsed" : "150000" ,
"gasCostUsd" : 1.50
}
]
}
}
Respuesta completada
{
"id" : "intent_xyz789" ,
"status" : "completed" ,
"executionPlan" : {
"strategy" : "single-bridge" ,
"steps" : [
{ "type" : "bridge" , "sequence" : 1 , "status" : "completed" },
{ "type" : "deposit" , "sequence" : 2 , "status" : "completed" }
]
},
"results" : {
"completedSteps" : 2 ,
"transactions" : [
{
"type" : "bridge" ,
"txHash" : "0x123abc..." ,
"chain" : "arbitrum" ,
"gasUsed" : "150000" ,
"gasCostUsd" : 1.50
},
{
"type" : "deposit" ,
"txHash" : "0x456def..." ,
"chain" : "base" ,
"gasUsed" : "200000" ,
"gasCostUsd" : 0.80
}
],
"totalGasUsed" : "350000" ,
"totalGasCostUsd" : 2.30 ,
"finalAmount" : "998.50" ,
"apy" : 8.52
},
"completedAt" : "2024-01-15T10:45:30Z"
}
Optimización de Costos
pan optimiza costos considerando múltiples factores:
Costos de Bridge
Bridge fee = base_fee + (amount * percentage_fee)
Ejemplo Across:
- Base fee: ~$0.50
- Percentage: ~0.1%
- 1000 USDC: $0.50 + $1.00 = $1.50 fee
Costos de Gas
Gas cost = gas_used * gas_price * eth_price
Ejemplo en Base:
- Gas used: 200,000
- Gas price: 0.001 gwei
- ETH price: $2,500
- Cost: ~$0.50
Decision de Bridge
pan decide si hacer bridge basandose en:
APY_diferencia = APY_mejor_chain - APY_chain_actual
Costo_bridge = fee_bridge + gas_bridge
Tiempo_breakeven = Costo_bridge / (Amount * APY_diferencia / 365)
Si Tiempo_breakeven < 30 dias:
→ Hacer bridge vale la pena
Si no:
→ Depositar en chain actual
Manejo de Fallos
Durante Bridge
Si un bridge falla:
pan espera hasta fillDeadline
Si no completa, marca el paso como fallido
El intent queda en estado failed
Los fondos permanecen en la chain origen
{
"status" : "failed" ,
"error" : {
"code" : "BRIDGE_TIMEOUT" ,
"message" : "Bridge did not complete within deadline" ,
"step" : 1
},
"results" : {
"completedSteps" : 0 ,
"failedStep" : 1
}
}
Durante Deposit
Si un depósito falla:
Los fondos ya están en la chain destino
pan intenta diagnosticar el error
Puedes reintentar con un nuevo intent
{
"status" : "failed" ,
"error" : {
"code" : "DEPOSIT_REVERTED" ,
"message" : "Transaction reverted on chain" ,
"step" : 2 ,
"details" : {
"reason" : "Insufficient liquidity in protocol"
}
}
}
Verificar Transacciónes
Todas las transacciones son verificables on-chain:
const intent = await pan . getIntent ( intentId );
// Obtener explorers
const explorers = {
'ethereum' : 'https://etherscan.io/tx/' ,
'ethereum-sepolia' : 'https://sepolia.etherscan.io/tx/' ,
'arbitrum' : 'https://arbiscan.io/tx/' ,
'arbitrum-sepolia' : 'https://sepolia.arbiscan.io/tx/' ,
'base' : 'https://basescan.org/tx/' ,
'base-sepolia' : 'https://sepolia.basescan.org/tx/'
};
// Mostrar links
intent . results ?. transactions ?. forEach ( tx => {
const chain = tx . chain ;
const explorer = explorers [ chain ];
console . log ( ` ${ tx . type } : ${ explorer }${ tx . txHash } ` );
});
Próximos Pasos
Ejecutar Intents Guía práctica de ejecución
Monitorear Estado Como hacer seguimiento efectivo
Manejo de Errores Estrategias para manejar fallos
API de Intents Referencia del endpoint