Políticas
Define salvaguardas programables que permiten, bloquean o envían automáticamente las acciones sensibles de tu workspace al flujo de aprobación normal. Las políticas evalúan cada retiro y cada llamada a smart contracts según las reglas que definas, de modo que la actividad riesgosa se detiene antes de llegar a la blockchain.
Descripción general
Una política es un conjunto de reglas que se ejecuta automáticamente cada vez que alguien inicia una acción protegida, como solicitar un retiro o llamar a un smart contract. Cada regla describe una condición (por ejemplo, "retiro por más de $10,000 a una dirección que no está en la lista blanca") y un efecto:
- Deny: bloquea la acción por completo
- Allow: permite que la acción omita la cola de aprobación y continúe directamente
Las políticas actúan como una capa de defensa siempre activa que complementa las aprobaciones de tus firmantes. En lugar de depender de que cada aprobador recuerde tus reglas de tesorería, codificas esas reglas una sola vez y dejas que Fystack las aplique en cada transacción.
Cómo se evalúan las políticas
Cuando se ejecuta una acción protegida, Fystack la verifica contra todas las políticas activas que apuntan a la billetera correspondiente y aplica un modelo de decisión seguro para la custodia:
- Deny siempre gana: si alguna regla coincide con un efecto Deny, la acción se bloquea, aunque otra regla la permita.
- Allow omite la aprobación: si una regla coincide con un efecto Allow y nada la deniega, la acción omite la cola de aprobación y continúa.
- Sin coincidencias: si ninguna regla coincide, la acción sigue tu flujo de aprobación normal.
La evaluación de políticas es fail-closed (falla en modo cerrado). Si una política no se puede evaluar por cualquier motivo, la acción se deniega en lugar de permitirse. Esto garantiza que un error de configuración o un problema del sistema nunca debilite tus controles de forma silenciosa.
Acciones disparadoras
Cada regla se aplica a una acción disparadora, es decir, al tipo de operación que protege:
Disparador | Protege |
|---|---|
Withdrawal | Se evalúa cuando se solicita un retiro. Las reglas pueden hacer referencia al monto, el valor en USD, el activo, la dirección de destino, el estado en la lista blanca, la antigüedad de la dirección y la actividad reciente de la billetera, del workspace y de la red. |
Contract Call | Se evalúa cuando se llama a un método de un smart contract. Las reglas pueden hacer referencia a la red, la dirección del contrato, el selector del método, el nombre del método, el valor nativo, el límite de gas y los argumentos decodificados de la llamada. |
Web3 Transfer | Se evalúa cuando se envía una transferencia de moneda nativa o ERC-20 a través de la API de transacciones raw de Web3. Las reglas usan los mismos campos que los retiros (monto, valor en USD, activo, destino, entrada de la libreta de direcciones, billetera interna), de modo que una condición se lee igual en ambos disparadores. Las transferencias ERC-20 también se evalúan como Contract Call. |
Web3 Message Signing | Se evalúa cuando se pide a una billetera que firme un mensaje ( |
Cómo crear una política
Paso 1: Abre la página de políticas
En la barra lateral izquierda, abre Policies y haz clic en Create Policy.
Paso 2: Asigna un nombre a la política y elige un grupo de aprobación
Dale a la política un Name claro que describa lo que protege (por ejemplo, "Protección de retiros grandes"). Luego selecciona el Approval Group que revisará los cambios de esta política.
Cada política está vinculada a un grupo de aprobación. Esto significa que una política no puede crearse ni editarse de forma silenciosa: cualquier cambio debe revisarse y aprobarse, igual que un retiro.
El grupo de aprobación viene preseleccionado con el predeterminado de tu workspace. Puedes cambiarlo por cualquier grupo cuyos miembros deban encargarse de revisar las reglas de esta política.
Paso 3: Apunta a billeteras específicas (opcional)
De forma predeterminada, una política se aplica a todas las billeteras del workspace. Para limitarla a un subconjunto, selecciona una o más billeteras en el campo Wallets. Las reglas de la política solo se evaluarán para las acciones sobre esas billeteras.
Paso 4: Agrega reglas
Agrega una o más reglas a la política. Para cada regla, elige el Trigger (Withdrawal, Contract Call, Web3 Transfer o Web3 Message Signing), construye la Condition y selecciona el Effect (Allow o Deny).
El constructor de condiciones muestra los campos disponibles para el disparador seleccionado, de modo que puedes construir expresiones sin memorizar los nombres de los campos. Para no escribir reglas desde cero, parte de una de las plantillas de políticas que se muestran más abajo.
Las políticas también se pueden programar con el constructor JSON, útil para usuarios avanzados que quieren copiar y pegar reglas o usar una lógica más compleja de la que admite la interfaz.
Paso 5: Envía para aprobación
Haz clic en Create. Como toda política requiere aprobación, la nueva política todavía no está activa: se envía a su grupo de aprobación como una solicitud Pending Approval, junto con todas sus reglas.
Paso 6: Aprueba la política
Un miembro del grupo de aprobación asignado abre la solicitud pendiente, revisa la política propuesta y sus reglas, y la aprueba. Solo entonces la política pasa a estar Active y comienza a proteger las transacciones.
El mismo flujo de aprobación se aplica a los cambios posteriores de políticas y reglas: editar una regla, agregar una regla o eliminar la política crea una nueva solicitud de aprobación. Nada tiene efecto hasta que el grupo lo aprueba.
Plantillas de políticas
Parte de una plantilla en lugar de una política en blanco. Cada una de las siguientes es una política completa para una configuración de billeteras habitual: qué protege, las reglas explicadas en lenguaje sencillo y un JSON que puedes pegar directamente en el editor de políticas.
Los números de cada plantilla son puntos de partida, no recomendaciones para tu volumen. Un buen valor inicial es fijar cada límite Deny en aproximadamente 2 a 3 veces tu día normal de mayor actividad y luego ajustarlo tras una semana de tráfico real.
Usar una plantilla
- Ve a Policies, haz clic en Create Policy y cambia el editor a la pestaña JSON.
- Pega el Policy JSON de la plantilla.
- Vuelve a Form. Elige el Approval Group y las Wallets que debe cubrir la política. Las plantillas dejan ambos vacíos a propósito, y una lista de billeteras vacía significa todas las billeteras del workspace.
- Abre cada regla y reemplaza cualquier marcador entre corchetes angulares, como
<payout_api_key_id>. Las reglas que hacen referencia a un miembro, una API key, una billetera o una entrada de la libreta de direcciones muestran un selector en el constructor, para que puedas elegirlo por nombre en lugar de buscar su ID. - Ajusta los límites a tu propio volumen, luego haz clic en Create y haz que se apruebe la política.
También puedes enviar el mismo JSON a la API de políticas.
Elegir una plantilla
Plantilla | Aplicar a | Aprueba automáticamente | Límites principales |
|---|---|---|---|
Bóveda de tesorería | Billeteras de custodia y de tesorería | Nada | Solo libreta de direcciones, espera de 24 h, 250,000 USD por día por billetera |
Pagos desde hot wallets | Billeteras operativas que usa tu equipo | Pagos pequeños a direcciones de confianza | 2,000 USD a direcciones desconocidas, 50,000 USD por día, 60 por hora |
Bot de pagos por API | Billeteras desde las que paga una API key automatizada | Pagos de hasta 500 USD desde una misma clave | Solo stablecoins, 2,000 USD por pago, 20,000 USD por día para la clave |
Sweep de depósitos | Billeteras de depósito de clientes | Sweeps hacia tu billetera de tesorería | Los fondos solo pueden moverse a la billetera de tesorería |
Operaciones DeFi | Billeteras que usan Web3 y dApps | Nada | Solo contratos aprobados, sin tokens desconocidos, sin firmas riesgosas |
Respaldo del workspace | Todas las billeteras | Nada | 500,000 USD por día en todo el workspace, bloqueo de retiros grandes los fines de semana |
Las políticas se acumulan. Aplica el Respaldo del workspace a todas las billeteras y luego agrega una plantilla por cada grupo de billeteras. Como Deny siempre gana, el respaldo también limita todo lo que una política más específica aprueba automáticamente.
Bóveda de tesorería
Úsala para: billeteras que guardan reservas y mueven fondos algunas veces por semana. Nada se aprueba automáticamente, así que cada transferencia sigue pasando por tus aprobadores, y las reglas bloquean las transferencias que nunca se debería pedir a los aprobadores que firmen.
Billeteras: selecciona tus billeteras de custodia y de tesorería.
Efecto | Regla | Por qué |
|---|---|---|
| Deny | Bloquea los retiros a cualquier dirección externa que no esté en la libreta de direcciones. | Un error de tipeo o una dirección sustituida en el portapapeles nunca puede aprobarse por equivocación. |
| Deny | Bloquea los retiros a una dirección agregada a la libreta de direcciones hace menos de 24 horas. | Quien pueda editar la libreta de direcciones no puede agregar una dirección y vaciar fondos hacia ella el mismo día. |
| Deny | Bloquea un retiro que haría que la billetera supere los 250,000 USD en 24 horas, contando los retiros pendientes. | Limita el daño si los aprobadores se ven comprometidos o engañados. |
| Deny | Aplica la regla de la libreta de direcciones a las transferencias nativas y ERC-20 enviadas a través de la API Web3. | Cierra el camino que eludiría las reglas de retiro. |
Policy JSON
{
"name": "Treasury vault guard",
"description": "Hard limits for custody and treasury wallets",
"approval_group_id": "",
"wallet_ids": [],
"rules": [
{
"trigger_action": "withdrawal.create",
"condition": "!withdrawal.destination_is_internal && !withdrawal.is_whitelisted",
"effect": "DENY",
"description": "Only send to address book entries or workspace wallets"
},
{
"trigger_action": "withdrawal.create",
"condition": "withdrawal.is_whitelisted && withdrawal.address_age_sec < 86400",
"effect": "DENY",
"description": "New address book addresses wait 24 hours"
},
{
"trigger_action": "withdrawal.create",
"condition": "wallet.projected_outflow_24h > 250000",
"effect": "DENY",
"description": "Cap each wallet at 250000 USD per 24 hours"
},
{
"trigger_action": "web3.transfer",
"condition": "!withdrawal.destination_is_internal && !withdrawal.is_whitelisted",
"effect": "DENY",
"description": "Apply the address book rule to Web3 transfers"
}
]
}
Ajústala
- ¿Necesitas un período de espera más estricto? Cambia
86400(24 horas) por172800(48 horas). - Para mantener los fondos de custodia dentro del workspace, de modo que solo puedan moverse a tus propias hot wallets, agrega una regla Deny:
wallet.purpose == 'custody' && !withdrawal.destination_is_internal. - Para limitar un solo activo en sus propias unidades, agrega
withdrawal.asset_symbol == 'BTC' && wallet.asset_projected_outflow_24h > 5.
Pagos desde hot wallets
Úsala para: billeteras operativas desde las que tu equipo paga todos los días. Los pagos pequeños y rutinarios a destinatarios conocidos omiten la aprobación, y todo lo demás se revisa o se bloquea.
Billeteras: selecciona tus hot wallets o billeteras de pago.
Efecto | Regla | Por qué |
|---|---|---|
| Deny | Bloquea los retiros de más de 2,000 USD a direcciones que no están en la libreta de direcciones. | Los montos mayores deben ir a una dirección verificada. |
| Deny | Bloquea un retiro que haría que la billetera supere los 50,000 USD en 24 horas. | Limita el peor caso, incluidos los pagos aprobados automáticamente. |
| Deny | Bloquea los retiros una vez que la billetera haya enviado 60 en la última hora. | Detecta un script o una sesión comprometida que envía muchos retiros pequeños. |
| Allow | Omite la aprobación para retiros de hasta 1,000 USD a una dirección que lleve al menos 24 horas en la libreta de direcciones. | Los aprobadores dejan de dedicar tiempo a los pagos rutinarios. |
Qué ocurre con un retiro
Retiro | Resultado |
|---|---|
500 USD a una entrada de la libreta de direcciones agregada la semana pasada | Aprobado automáticamente por la regla Allow |
500 USD a una dirección agregada hace una hora | Pasa a tus aprobadores, porque la dirección es demasiado reciente para la regla Allow |
1,500 USD a una dirección desconocida | Pasa a tus aprobadores |
5,000 USD a una dirección desconocida | Bloqueado |
800 USD a una dirección de confianza cuando la billetera ya envió 49,500 USD hoy | Bloqueado, porque Deny siempre gana sobre Allow |
Policy JSON
{
"name": "Hot wallet payouts",
"description": "Auto approve routine payouts and cap the worst case",
"approval_group_id": "",
"wallet_ids": [],
"rules": [
{
"trigger_action": "withdrawal.create",
"condition": "!withdrawal.destination_is_internal && !withdrawal.is_whitelisted && withdrawal.value_usd > 2000",
"effect": "DENY",
"description": "Unknown recipients are limited to 2000 USD"
},
{
"trigger_action": "withdrawal.create",
"condition": "wallet.projected_outflow_24h > 50000",
"effect": "DENY",
"description": "Cap each wallet at 50000 USD per 24 hours"
},
{
"trigger_action": "withdrawal.create",
"condition": "wallet.withdrawal_count_1h > 60",
"effect": "DENY",
"description": "Stop bursts of more than 60 withdrawals per hour"
},
{
"trigger_action": "withdrawal.create",
"condition": "withdrawal.is_whitelisted && withdrawal.address_age_sec >= 86400 && withdrawal.value_usd <= 1000",
"effect": "ALLOW",
"description": "Auto approve small payouts to trusted addresses"
}
]
}
Ajústala
- Primero sube o baja el límite de aprobación automática (
1000). Mantenlo muy por debajo del límite diario por billetera. - Para aprobar automáticamente solo a algunos destinatarios, como tus cuentas de exchange, reemplaza
withdrawal.is_whitelisteden la regla Allow por Destination · Address book entry es cualquiera de las entradas en las que confías. - Si tu equipo trabaja en un horario fijo, agrega la receta de horario laboral de las recetas de reglas más abajo.
Bot de pagos por API
Úsala para: un servicio backend que envía pagos a clientes mediante una API key. Los pagos pequeños salen sin esperar a los aprobadores, los medianos se revisan y la clave tiene un presupuesto diario estricto.
Billeteras: selecciona las billeteras desde las que envía el servicio de pagos.
Efecto | Regla | Por qué |
|---|---|---|
| Deny | Bloquea que la clave de pagos envíe cualquier cosa que no sea USDT y USDC. | Una clave filtrada no puede mover tus otros activos. |
| Deny | Bloquea cualquier pago individual de la clave por más de 2,000 USD. | Los pagos mayores deben ser creados por una persona. |
| Deny | Bloquea la clave cuando sus pagos superarían los 20,000 USD en 24 horas, en todas las billeteras. | Un presupuesto diario para la clave, use la billetera que use. |
| Allow | Omite la aprobación para pagos de hasta 500 USD desde la clave. | Los clientes reciben los pagos pequeños de inmediato. Los pagos de 500 a 2,000 USD pasan a tus aprobadores. |
Policy JSON
{
"name": "API payout bot",
"description": "Budget and auto approval for the payout API key",
"approval_group_id": "",
"wallet_ids": [],
"rules": [
{
"trigger_action": "withdrawal.create",
"condition": "principal.api_key_id in ['<payout_api_key_id>'] && !(withdrawal.asset_symbol in ['USDT', 'USDC'])",
"effect": "DENY",
"description": "Payout key sends stablecoins only"
},
{
"trigger_action": "withdrawal.create",
"condition": "principal.api_key_id in ['<payout_api_key_id>'] && withdrawal.value_usd > 2000",
"effect": "DENY",
"description": "Payout key cannot send more than 2000 USD at once"
},
{
"trigger_action": "withdrawal.create",
"condition": "principal.api_key_id in ['<payout_api_key_id>'] && workspace.initiator_projected_outflow_24h > 20000",
"effect": "DENY",
"description": "Payout key is capped at 20000 USD per 24 hours"
},
{
"trigger_action": "withdrawal.create",
"condition": "principal.api_key_id in ['<payout_api_key_id>'] && withdrawal.value_usd <= 500",
"effect": "ALLOW",
"description": "Auto approve payouts up to 500 USD"
}
]
}
Ajústala
- Reemplaza
<payout_api_key_id>en cada regla, o elige la clave con el selector Initiator · API key. Usa la misma clave en las cuatro reglas. - Las direcciones de pago de los clientes normalmente no están en tu libreta de direcciones, por lo que esta plantilla no lo exige. En su lugar, los límites por pago y diarios asumen el riesgo.
- Agrega más símbolos a la lista, como
'DAI', si pagas en otras stablecoins.
Sweep de depósitos
Úsala para: billeteras de depósito por cliente cuyos fondos solo deben moverse a tu tesorería. El destino es fijo, por lo que este es el flujo más seguro para automatizar por completo.
Billeteras: selecciona tus billeteras de depósito de clientes, o deja la lista vacía para depender de la verificación del propósito de la billetera.
Efecto | Regla | Por qué |
|---|---|---|
| Deny | Bloquea los retiros desde billeteras de depósito a cualquier destino que no sea tu billetera de tesorería. | Los depósitos nunca pueden salir directamente del workspace. |
| Allow | Omite la aprobación para las transferencias desde billeteras de depósito a tu billetera de tesorería. | Los sweeps se ejecutan sin esperar a nadie. |
Policy JSON
{
"name": "Deposit sweep",
"description": "Deposit wallets sweep to treasury only",
"approval_group_id": "",
"wallet_ids": [],
"rules": [
{
"trigger_action": "withdrawal.create",
"condition": "wallet.purpose == 'user' && !(withdrawal.destination_wallet_id in ['<treasury_wallet_id>'])",
"effect": "DENY",
"description": "Deposit wallets can only send to the treasury"
},
{
"trigger_action": "withdrawal.create",
"condition": "wallet.purpose == 'user' && withdrawal.destination_wallet_id in ['<treasury_wallet_id>']",
"effect": "ALLOW",
"description": "Auto approve sweeps to the treasury"
}
]
}
Ajústala
- Reemplaza
<treasury_wallet_id>, o elígela con el selector Destination · Workspace wallet. - Para permitir más de un destino de sweep, agrega sus IDs a ambas listas.
Operaciones DeFi
Úsala para: billeteras que interactúan con dApps a través de la API Web3. Cada llamada sigue pasando por tus aprobadores, y las reglas detienen llamadas y firmas que los aprobadores a menudo no pueden evaluar a partir de los datos sin procesar.
Billeteras: selecciona las billeteras que conectas a dApps.
Efecto | Regla | Por qué |
|---|---|---|
| Deny | Bloquea las llamadas a cualquier contrato que no esté en tu lista. | Una dApp de phishing no puede presentar a los aprobadores una llamada a un contrato desconocido. |
| Deny | Bloquea las aprobaciones de tokens ( | Las allowances son una forma habitual de vaciar una billetera más adelante. |
| Deny | Bloquea las transferencias de tokens que no están en el catálogo de activos de Fystack. | Los tokens desconocidos no tienen valor en USD, por lo que no se les pueden aplicar límites de monto. |
| Deny | Bloquea la firma de un permit de token con un monto ilimitado. | Un permit firmado permite al spender mover tokens más adelante, sin ninguna otra transacción de tu parte. |
| Deny | Bloquea la firma de un permit para cualquier spender que no esté en tu lista. | El phishing de permits suele pedirte que firmes a favor de un spender atacante. |
| Deny | Bloquea las solicitudes |
|
Policy JSON
{
"name": "DeFi operations guard",
"description": "Approved contracts and safe signatures for dApp wallets",
"approval_group_id": "",
"wallet_ids": [],
"rules": [
{
"trigger_action": "web3.contract_call",
"condition": "!(resource.contract_address in ['<router_address>', '<vault_address>', '<token_address>'])",
"effect": "DENY",
"description": "Only call approved contracts"
},
{
"trigger_action": "web3.contract_call",
"condition": "resource.method_selector == '0x095ea7b3' && !(resource.contract_address in ['<token_address>'])",
"effect": "DENY",
"description": "Only approve allowances on known tokens"
},
{
"trigger_action": "web3.transfer",
"condition": "!withdrawal.asset_is_known",
"effect": "DENY",
"description": "Block transfers of unknown tokens"
},
{
"trigger_action": "web3.sign_message",
"condition": "resource.is_permit && resource.permit_amount_is_unlimited",
"effect": "DENY",
"description": "Block unlimited token permits"
},
{
"trigger_action": "web3.sign_message",
"condition": "resource.is_permit && !(resource.permit_spender in ['<trusted_spender_address>'])",
"effect": "DENY",
"description": "Block permits to untrusted spenders"
},
{
"trigger_action": "web3.sign_message",
"condition": "resource.method == 'eth_sign'",
"effect": "DENY",
"description": "Block raw eth_sign"
}
]
}
Ajústala
- Las direcciones de contratos y tokens deben estar en minúsculas.
- Agrega todos los contratos que usa tu estrategia, como routers, vaults y contratos de tokens, antes de activar la política, o se bloquearán llamadas legítimas.
- Las reglas de firma de mensajes son solo Deny. Una firma que supera estas reglas sigue pasando por tus aprobadores.
Respaldo del workspace
Úsala para: una red de seguridad sobre todas las billeteras. Detecta un vaciado repartido entre muchas billeteras, claves o miembros, que un límite por billetera no detectaría.
Billeteras: deja la lista vacía para que la política cubra todas las billeteras.
Efecto | Regla | Por qué |
|---|---|---|
| Deny | Bloquea un retiro que haría que todo el workspace supere los 500,000 USD en 24 horas. | El techo absoluto, independientemente de lo que permitan otras políticas. |
| Deny | Bloquea los retiros una vez que el workspace haya enviado 300 en la última hora. | Detecta abusos automatizados repartidos entre billeteras. |
| Deny | Bloquea los retiros de más de 25,000 USD los sábados y domingos (UTC). | Las transferencias grandes esperan a que tu equipo esté disponible para supervisarlas. |
Policy JSON
{
"name": "Workspace backstop",
"description": "Workspace wide ceilings for all wallets",
"approval_group_id": "",
"wallet_ids": [],
"rules": [
{
"trigger_action": "withdrawal.create",
"condition": "workspace.projected_outflow_24h > 500000",
"effect": "DENY",
"description": "Cap the workspace at 500000 USD per 24 hours"
},
{
"trigger_action": "withdrawal.create",
"condition": "workspace.withdrawal_count_1h > 300",
"effect": "DENY",
"description": "Stop bursts of more than 300 withdrawals per hour"
},
{
"trigger_action": "withdrawal.create",
"condition": "context.day_of_week in ['Saturday', 'Sunday'] && withdrawal.value_usd > 25000",
"effect": "DENY",
"description": "No withdrawals over 25000 USD on weekends"
}
]
}
Ajústala
- Los días y las horas están en UTC.
- Fija el límite del workspace por encima de la suma de tus días normales de mayor actividad en todas las billeteras, para que el respaldo solo se active ante anomalías reales.
Recetas de reglas
Reglas individuales que puedes agregar a cualquier política. Pega la condición en la pestaña Expression de una regla, o constrúyela en Fields.
Objetivo | Disparador | Efecto | Condición |
|---|---|---|---|
Bloquear una lista de direcciones, como direcciones sancionadas o fraudulentas | Withdrawal | Deny |
|
Solo owners y admins pueden enviar más de 50,000 USD | Withdrawal | Deny | !(principal.role in ['owner', 'admin']) && withdrawal.value_usd > 50000 |
Permitir retiros grandes solo en horario laboral (09:00 a 18:00 UTC) | Withdrawal | Deny |
|
Limitar una billetera a 5 BTC por día | Withdrawal | Deny | withdrawal.asset_symbol == 'BTC' && wallet.asset_projected_outflow_24h > 5 |
Limitar una red a 100,000 USD por día | Withdrawal | Deny | withdrawal.network_code == '<network_code>' && workspace.network_projected_outflow_24h > 100000 |
Aprobar automáticamente las transferencias entre tus propias billeteras | Withdrawal | Allow | withdrawal.destination_is_internal && withdrawal.value_usd <= 10000 |
Aprobar automáticamente las recargas a cuentas de exchange de confianza | Withdrawal | Allow | withdrawal.address_book_id in ['<exchange_entry_id>'] && withdrawal.address_age_sec >= 172800 && withdrawal.value_usd <= 25000 |
Evitar que se acumule trabajo en la cola de aprobación | Withdrawal | Deny |
|
Bloquear llamadas a contratos inusualmente costosas | Contract Call | Deny | resource.gas_limit > 1000000 |
Desplegar una política
Las reglas Allow cambian quién tiene que revisar una transacción, así que introdúcelas al final.
- Semana 1, solo reglas Deny: crea la política solo con sus reglas Deny. Todavía no se aprueba nada automáticamente, y las reglas solo bloquean lo que nunca debería ocurrir.
- Revisa la cola de aprobación: busca los retiros que tus aprobadores aprueban sin cambios cada vez, como los mismos destinatarios, activos y rango de montos.
- Agrega una regla Allow acotada: escribe una regla Allow exactamente para ese tráfico, con un límite menor del que crees que necesitarás.
- Sube los límites poco a poco: amplía la regla Allow solo después de que haya funcionado sin problemas durante un tiempo. Cada cambio pasa por aprobación y aparece en el historial de cambios de la política.
Cuando agregues una regla Allow, comprueba que un límite Deny cubra las mismas billeteras, por ejemplo un límite de salida proyectada por billetera o por clave. Deny siempre gana, así que el límite sigue aplicándose a los retiros aprobados automáticamente.
Escribir condiciones de reglas
Una condición es una expresión que se evalúa como verdadera o falsa. Cuando es verdadera, se aplica el efecto de la regla. Combina campos con and, or y not, y compara valores con operadores como >, >=, == y !=.
Puedes validar una condición antes de guardarla. El constructor verifica la expresión contra los campos disponibles del disparador y señala cualquier error, para que nunca envíes una regla que no se pueda ejecutar.
Campos de condición
Los campos disponibles en el constructor dependen del disparador de la regla. Usa las etiquetas siguientes para decidir qué campo corresponde a una regla.
Disponibles en todos los disparadores
Campo | Úsalo para |
|---|---|
Initiator type | Si la acción provino de una sesión web ( |
Member | Reglas para miembros específicos del workspace. Elígelos de la lista de miembros. |
API key | Reglas para API keys específicas, por ejemplo una clave de pagos automatizados. Las sesiones web no tienen API key, así que combina una verificación |
User role | Reglas basadas en el rol en el workspace: owner, admin, signer, proposer o viewer. |
Hour | Controles por hora del día usando la hora UTC de 0 a 23. |
Day of week | Reglas para horario laboral, fines de semana o solo días hábiles. |
Source wallet | Reglas para billeteras específicas dentro de una misma política. |
Source wallet purpose | Reglas según el propósito de la billetera: general, custody, payment, user, one-time use, gas tank o deployment. |
Source wallet type | Controles diferentes para billeteras MPC y estándar. |
User email (legacy) | Se sigue evaluando en las reglas existentes. Las reglas nuevas usan Member, porque un correo puede cambiar. |
Campos de retiro
Campo | Úsalo para |
|---|---|
Amount | Límites expresados en el activo, como más de 10 ETH o 1 BTC. |
Value USD | Límites expresados en dólares para todos los activos. |
Asset symbol | Reglas específicas por activo para símbolos como USDT, ETH, BTC o SOL. |
Native asset | Controles diferentes para los activos nativos de la red frente a los tokens. |
Destination address | Bloquear o permitir direcciones de destinatarios específicas. |
Network code | Límites específicos por red, como reglas más estrictas en una cadena. |
In address book | Controles para destinatarios que están o no están en alguna entrada de la libreta de direcciones. |
Address book entry | Controles para entradas específicas de la libreta de direcciones. Una entrada cubre todas sus direcciones, así que funciona como una lista con nombre. |
Address age | Reglas de período de espera: segundos transcurridos desde que la dirección de destino se agregó a su entrada de la libreta de direcciones. |
Internal wallet | Controles para transferencias entre billeteras del mismo workspace. |
Workspace wallet | Controles para transferencias a billeteras específicas del mismo workspace. |
Los campos que hacen referencia a un miembro, una API key, una entrada de la libreta de direcciones o una billetera usan un selector en el constructor de condiciones. Fystack almacena el ID, muestra el nombre en todos los lugares donde aparece la regla (incluidas las solicitudes de aprobación) y verifica al guardar que cada ID pertenezca a tu workspace. Si una entidad se elimina o se revoca más adelante, la regla la muestra como una referencia desconocida y la regla solo puede coincidir con menos casos, nunca con más.
Campos de actividad de retiros
Campo | Úsalo para |
|---|---|
Wallet outflow | Salida en USD por billetera durante la última 1, 6 o 24 horas. |
Wallet withdrawal count | Controles de ráfagas para muchos retiros desde una billetera en la última hora. |
Workspace outflow | Salida en USD de todo el workspace durante la última 1, 6 o 24 horas. |
Workspace withdrawal count | Volumen de retiros de todo el workspace en la última hora. |
Network outflow | Salida en USD del workspace en la red seleccionada durante la última 1, 6 o 24 horas. |
Network withdrawal count | Volumen de retiros del workspace en la red seleccionada en la última hora. |
Campos de actividad pendiente y proyectada
Campo | Úsalo para |
|---|---|
Pending outflow | Valor en USD de los retiros que todavía no se ejecutaron (a la espera de aprobación, en cola o financiando gas), sin importar su antigüedad. Disponible por billetera, workspace y red. |
Projected 24h outflow | Salida realizada en las últimas 24 horas, más la salida pendiente, más el retiro que se está verificando. Úsalo para límites: |
Projected 24h asset outflow | La misma proyección para la billetera de origen, en unidades del activo retirado, por ejemplo como máximo 5 BTC por día. |
Initiator projected 24h outflow | La misma proyección para los retiros creados por el mismo miembro o la misma API key, en todo el workspace. |
Los campos de salida y de conteo se calculan a partir de los retiros realizados: cuentan los fondos después de que un retiro se ejecutó o confirmó. Los campos pendientes y proyectados también cuentan los retiros que aún no se ejecutaron. Cuando una regla activa usa un campo pendiente o proyectado, Fystack verifica los retiros del workspace de uno en uno, de modo que dos solicitudes enviadas en el mismo momento no puedan superar ambas un límite. Una solicitud que espera su turno más de 5 segundos se rechaza con HTTP 429 y puede reintentarse.
Campos de llamadas a contratos
Campo | Úsalo para |
|---|---|
Network code | Reglas de llamadas a contratos específicas por cadena. |
Contract address | Bloquear contratos desconocidos o permitir contratos conocidos. |
Method selector | Verificaciones de funciones a bajo nivel, como el selector de transfer de ERC-20 |
Method name | Verificaciones legibles del método cuando hay metadatos disponibles. |
Value wei | Valor nativo enviado con una llamada a contrato. |
Gas limit | Bloquear llamadas inusualmente costosas o riesgosas. |
Decoded arguments | Reglas a nivel de argumento cuando Fystack puede decodificar la llamada. Las transferencias ERC-20 exponen el destinatario y el valor del token. |
Los argumentos decodificados solo están disponibles cuando la llamada se puede decodificar. En el constructor JSON, protege las verificaciones de argumentos decodificados antes de leer un valor.
Campos de transferencias Web3
Las reglas de Web3 Transfer usan los campos de retiro más los campos siguientes. Los campos de actividad no están disponibles, porque estas transferencias no son retiros.
Campo | Úsalo para |
|---|---|
Asset in catalog | Falso cuando el contrato del token no está en el catálogo de activos. En ese caso, el monto, el valor en USD y el símbolo quedan vacíos, así que deniega explícitamente los tokens desconocidos si lo necesitas. |
Token contract | Reglas para un contrato de token específico. Vacío para las monedas nativas. |
Campos de firma de mensajes
Campo | Úsalo para |
|---|---|
Signing method |
|
Typed data type, domain name, verifying contract | Reglas para mensajes de typed data específicos, como las órdenes de una dApp conocida. |
Is a token permit | Verdadero para los mensajes EIP-2612, DAI y Permit2, que permiten al spender mover tokens más adelante sin otra firma. |
Permit spender | Deniega los permits a spenders en los que no confías. |
Permit tokens | Los contratos de tokens que cubre el permit. Úsalo en el editor de expresiones, por ejemplo |
Permit unlimited amount | Verdadero para allowances de valor máximo (2159 o más, o un permit de DAI con allowed activado). |
Permit deadline | Tiempo Unix en que vence el permit o su firma. 0 cuando el mensaje no tiene ninguno. |
Estados de las políticas
Estado | Significado |
|---|---|
Pending | La política, o un cambio en ella, está a la espera de la aprobación de su grupo de aprobación. Todavía no se aplica. |
Active | La política está aprobada y activa. Sus reglas se evalúan en cada acción protegida sobre las billeteras a las que apunta. |
Inactive | La política está desactivada y no se evalúa. |
Rejected | Un aprobador rechazó un cambio pendiente y este no tuvo efecto. |
Historial de cambios
Cada cambio en una política queda registrado. El History de la política muestra cada revisión con quién la propuso, qué cambió (campo por campo) y si se aprobó o rechazó. Esto te da un registro de auditoría completo de cómo evolucionaron tus salvaguardas con el tiempo.
Buenas prácticas
- Empieza con reglas Deny para tus escenarios de mayor riesgo (transferencias grandes, destinos desconocidos) antes de agregar reglas Allow de conveniencia
- Recuerda que Deny siempre gana: úsalo para fijar límites estrictos que ninguna regla Allow pueda anular
- Limita las políticas a billeteras específicas cuando distintas billeteras tengan perfiles de riesgo diferentes, en lugar de aplicar una política amplia en todas partes
- Usa las reglas Allow con moderación: omiten tu cola de aprobación, así que resérvalas para patrones de bajo valor y claramente confiables
- Cuando una regla Allow confíe en entradas de la libreta de direcciones, conserva la condición de antigüedad de la dirección que agrega el constructor. Cualquiera que pueda editar la libreta de direcciones puede agregar una dirección a una entrada de confianza, y la verificación de antigüedad hace que una dirección nueva espere antes de aprobarse automáticamente
- Valida cada condición antes de enviarla y revisa el cambio en el paso de aprobación para confirmar que se comporta como esperas
- Trata los cambios de políticas con el mismo cuidado que los retiros: la aprobación existe para que ninguna persona pueda debilitar tus controles sin que se note