Funciones Integradas
Referencia completa de todas las funciones integradas disponibles en políticas
Solo las siguientes funciones integradas están habilitadas en las políticas. Las funciones que no aparecen aquí están deshabilitadas por razones de seguridad. Consulte Restricciones para obtener detalles sobre las funciones deshabilitadas.
Funciones de Cadena
Funciones para manipular e inspeccionar valores de cadena. Esenciales para trabajar con direcciones, nombres de métodos y otros campos de texto.
contains
Verifica si una cadena contiene una subcadena. Devuelve true si se encuentra, false en caso contrario.
Ejemplo
# Block any method containing "sign"
deny if {
contains(input.rpc_method, "sign")
}startswith
Verifica si una cadena comienza con un prefijo. Útil para hacer coincidir categorías de métodos o patrones de direcciones.
Ejemplo
# Block debug methods
deny if {
startswith(input.rpc_method, "debug_")
}
# Block addresses starting with many zeros
deny if {
startswith(input.to_address, "0x00000000")
}endswith
Verifica si una cadena termina con un sufijo.
Ejemplo
# Block addresses ending with specific pattern
deny if {
endswith(lower(input.to_address), "dead")
}lower
Convierte una cadena a minúsculas. Esencial para la comparación de direcciones sin distinción entre mayúsculas y minúsculas, ya que las direcciones pueden tener mayúsculas y minúsculas mezcladas.
Ejemplo
# Case-insensitive address check
blocked_addresses := {
"0x000000000000000000000000000000000000dead"
}
deny if {
lower(input.to_address) in blocked_addresses
}upper
Convierte una cadena a mayúsculas.
Ejemplo
# Normalize method names that might have inconsistent casing
deny if {
upper(input.rpc_method) == "ETH_SENDTRANSACTION"
input.usd_value > 10000
}concat
Une un arreglo de cadenas con un delimitador.
Ejemplo
# Join values for logging or comparison
message := concat(", ", ["chain:", input.chain, "method:", input.rpc_method])split
Divide una cadena en un arreglo usando un delimitador.
Ejemplo
# Parse a method name
parts := split(input.rpc_method, "_")
deny if {
parts[0] == "debug"
}replace
Reemplaza todas las ocurrencias de una subcadena con otra cadena.
Ejemplo
# Normalize address format
normalized := replace(input.to_address, "0X", "0x")substring
Extrae una porción de una cadena por posición inicial y longitud.
Ejemplo
# Get method prefix (first 4 characters after "eth_")
deny if {
startswith(input.rpc_method, "eth_")
method_action := substring(input.rpc_method, 4, 4)
method_action == "send"
}sprintf
Formatea una cadena con marcadores de posición. Útil para crear valores dinámicos.
| Placeholder | Type |
|---|---|
%s | String |
%d | Integer |
%f | Float |
%v | Any value |
Ejemplo
# Create formatted message
threshold := 10000
message := sprintf("Value %d exceeds limit of %d", [input.usd_value, threshold])trim
Elimina caracteres especificados de ambos extremos de una cadena.
Ejemplo
# Remove specific characters from both ends
cleaned := trim(input.rpc_method, "_")trim_space
Elimina espacios en blanco de ambos extremos de una cadena.
Ejemplo
# Clean up input with extra spaces
clean_method := trim_space(input.rpc_method)trim_prefix
Elimina un prefijo de una cadena si está presente.
Ejemplo
# Remove common prefix to get the action name
method_name := trim_prefix(input.rpc_method, "eth_")
deny if {
method_name == "sendTransaction"
}trim_suffix
Elimina un sufijo de una cadena si está presente.
Ejemplo
# Remove suffix for comparison
base_method := trim_suffix(input.rpc_method, "_v2")indexof
Encuentra el índice de la primera ocurrencia de una subcadena. Devuelve -1 si no se encuentra.
Ejemplo
# Check if underscore exists
deny if {
indexof(input.rpc_method, "_") == -1
}Funciones de Expresiones Regulares
Funciones para coincidencia de patrones usando expresiones regulares. Más potentes que las funciones de cadena para patrones complejos.
regex.match
Verifica si una cadena coincide con un patrón de expresión regular. Devuelve true o false.
Ejemplo
# Block methods starting with debug_, admin_, or personal_
deny if {
regex.match("^(debug_|admin_|personal_)", input.rpc_method)
}
# Block addresses with many leading zeros
deny if {
regex.match("^0x0{10,}", input.to_address)
}regex.replace
Reemplaza todas las coincidencias de un patrón con una cadena de reemplazo.
Ejemplo
# Remove all non-alphanumeric characters
cleaned := regex.replace(input.rpc_method, "[^a-zA-Z0-9]", "")regex.split
Divide una cadena por un patrón regex.
Ejemplo
# Split by multiple delimiters
parts := regex.split("[_.]", input.rpc_method)regex.find_n
Encuentra hasta n coincidencias de un patrón en una cadena.
Ejemplo
# Find all hex sequences
hex_matches := regex.find_n("0x[a-fA-F0-9]+", input.raw_params[0].data, 10)
deny if {
count(hex_matches) > 5
}Funciones de Tiempo
Funciones para trabajar con el tiempo. Todos los valores de tiempo están en nanosegundos desde la época Unix.
time.now_ns
Obtiene la hora actual en nanosegundos. Utilice esto como base para políticas basadas en tiempo.
Ejemplo
# Block high-value transactions during volatile market hours
deny if {
current := time.now_ns()
[hour, _, _] := time.clock(current)
hour >= 14 # After 2 PM UTC (US market open)
hour < 21 # Before 9 PM UTC (US market close)
input.usd_value > 50000
}time.clock
Extrae hora, minuto y segundo de una marca de tiempo. Devuelve [hour, minute, second].
Ejemplo
# Block outside business hours (9 AM - 5 PM UTC)
deny if {
[hour, _, _] := time.clock(time.now_ns())
hour < 9
}
deny if {
[hour, _, _] := time.clock(time.now_ns())
hour >= 17
}time.weekday
Obtiene el día de la semana de una marca de tiempo. Devuelve 0 (domingo) hasta 6 (sábado).
Ejemplo
# Block on weekends
deny if {
day := time.weekday(time.now_ns())
day == 0 # Sunday
}
deny if {
day := time.weekday(time.now_ns())
day == 6 # Saturday
}time.date
Extrae año, mes y día de una marca de tiempo. Devuelve [year, month, day].
Ejemplo
# Block on specific dates
deny if {
[year, month, day] := time.date(time.now_ns())
month == 12
day == 25 # Christmas
}time.parse_rfc3339_ns
Analiza una cadena de marca de tiempo con formato RFC3339 en nanosegundos.
Ejemplo
# Compare against a specific date
cutoff := time.parse_rfc3339_ns("2024-12-31T23:59:59Z")
deny if {
time.now_ns() > cutoff
}time.add_date
Agrega años, meses y días a una marca de tiempo.
Ejemplo
# Block transactions if we're within 7 days of year end
deny if {
year_end := time.parse_rfc3339_ns("2024-12-31T23:59:59Z")
week_before := time.add_date(year_end, 0, 0, -7)
time.now_ns() > week_before
input.usd_value > 10000
}time.diff
Calcula la diferencia entre dos marcas de tiempo. Devuelve [years, months, days, hours, minutes, seconds].
Ejemplo
# Check if more than 1 hour has passed
start := time.parse_rfc3339_ns("2024-01-01T00:00:00Z")
[_, _, _, hours, _, _] := time.diff(time.now_ns(), start)
deny if {
hours > 1
}Funciones de Agregación
Funciones para trabajar con colecciones de valores.
count
Cuenta el número de elementos en un arreglo, conjunto u objeto.
Ejemplo
# Limit number of contracts in a request
deny if {
count(input.contract_addresses) > 5
}
# Ensure at least one address
deny if {
count(input.contract_addresses) == 0
}sum
Calcula la suma de números en un arreglo.
Ejemplo
# Block if total gas across params exceeds limit
deny if {
gas_values := [to_number(p.gas) | some p in input.raw_params; p.gas != null]
sum(gas_values) > 5000000
}max
Encuentra el valor máximo en un arreglo.
Ejemplo
# Check against maximum in a set of thresholds
thresholds := [1000, 5000, 10000]
deny if {
input.usd_value > max(thresholds)
}min
Encuentra el valor mínimo en un arreglo.
Ejemplo
# Ensure value meets minimum threshold
thresholds := [100, 500, 1000]
deny if {
input.usd_value < min(thresholds)
}sort
Ordena un arreglo en orden ascendente.
Ejemplo
# Check if smallest contract address looks suspicious (many leading zeros)
deny if {
count(input.contract_addresses) > 0
sorted_addrs := sort(input.contract_addresses)
startswith(sorted_addrs[0], "0x00000000")
}product
Calcula el producto de números en un arreglo.
Ejemplo
# Calculate combined risk score from multiple factors
deny if {
risk_factors := [2, 3] # High-value = 2x, Unknown sender = 3x
combined_risk := product(risk_factors)
combined_risk > 5
}Funciones de Tipo
Funciones para verificar y trabajar con tipos de datos. Útiles para manejar campos anulables de manera segura.
is_null
Verifica si un valor es nulo. Esencial para manejar campos de entrada opcionales.
Ejemplo
# Safely check nullable field
deny if {
not is_null(input.usd_value)
input.usd_value > 10000
}is_number
Verifica si un valor es un número.
Ejemplo
# Validate before numeric comparison
deny if {
is_number(input.usd_value)
input.usd_value > 10000
}is_string
Verifica si un valor es una cadena.
Ejemplo
# Validate input type
deny if {
is_string(input.to_address)
startswith(input.to_address, "0x0000")
}is_array
Verifica si un valor es un arreglo.
Ejemplo
# Check before iterating
deny if {
is_array(input.contract_addresses)
count(input.contract_addresses) > 10
}is_boolean
Verifica si un valor es un booleano (true o false).
Ejemplo
# Verify a flag is actually a boolean before using it
deny if {
is_boolean(input.raw_params[0].enabled)
input.raw_params[0].enabled == false
}is_set
Verifica si un valor es un conjunto.
Ejemplo
# Validate collection type
deny if {
is_set(input.raw_params[0].addresses)
count(input.raw_params[0].addresses) > 100
}is_object
Verifica si un valor es un objeto (mapa clave-valor).
Ejemplo
# Ensure params is an object before accessing fields
deny if {
is_object(input.raw_params[0])
object.get(input.raw_params[0], "dangerous", false) == true
}type_name
Obtiene el nombre del tipo de un valor como una cadena.
Ejemplo
# Block if usd_value is not a number (unexpected type)
deny if {
input.usd_value != null
type_name(input.usd_value) != "number"
}Funciones Numéricas
Funciones para operaciones numéricas.
abs
Obtiene el valor absoluto de un número.
Ejemplo
# Check magnitude regardless of sign
deny if {
abs(input.usd_value) > 10000
}round
Redondea un número al entero más cercano.
Ejemplo
# Round for comparison
deny if {
round(input.usd_value) > 10000
}ceil
Redondea un número hacia arriba al siguiente entero.
Ejemplo
# Round up for conservative limit checking
deny if {
ceil(input.usd_value) > 10000
}floor
Redondea un número hacia abajo al entero anterior.
Ejemplo
# Block transactions over $10,000 (ignoring cents)
deny if {
floor(input.usd_value) >= 10000
}to_number
Convierte una cadena en un número. Útil para valores de cadena hexadecimal.
Ejemplo
# Convert hex gas values
deny if {
input.gas_limit != null
to_number(input.gas_limit) > 1000000
}numbers.range
Genera un arreglo de números desde el inicio hasta el final (inclusivo).
Ejemplo
# Allow transactions only during business hours (9 AM - 5 PM)
deny if {
[hour, _, _] := time.clock(time.now_ns())
business_hours := numbers.range(9, 17)
not hour in business_hours
}Funciones de Objeto
Funciones para trabajar con objetos (mapas clave-valor).
object.get
Obtiene de forma segura un valor de un objeto con un valor predeterminado si la clave no existe.
Ejemplo
# Safely access nested data
deny if {
params := input.raw_params[0]
data := object.get(params, "data", "0x")
startswith(data, "0xa9059cbb") # ERC-20 transfer
}object.keys
Obtiene todas las claves de un objeto como un arreglo.
Ejemplo
# Check which fields are present
params := input.raw_params[0]
keys := object.keys(params)
deny if {
"data" in keys
"value" in keys
}object.remove
Crea un nuevo objeto con las claves especificadas eliminadas.
Ejemplo
# Block if params contain unexpected fields after removing known safe ones
deny if {
safe_fields := ["to", "from", "value", "gas", "data"]
remaining := object.remove(input.raw_params[0], safe_fields)
count(object.keys(remaining)) > 0
}object.union
Combina dos objetos. Los valores del segundo objeto sobrescriben el primero.
Ejemplo
# Apply safe defaults and check resulting gas limit
deny if {
defaults := {"gas": "0x5208"}
params := object.union(defaults, input.raw_params[0])
to_number(params.gas) > 1000000
}Funciones de Arreglo
Funciones para manipulación de arreglos.
array.concat
Concatena dos arreglos en uno.
Ejemplo
# Combine address lists
all_addresses := array.concat(
input.contract_addresses,
[input.to_address]
)array.slice
Extrae una porción de un arreglo por índice de inicio y fin.
Ejemplo
# Only check first 5 contract addresses for blocked list
deny if {
first_five := array.slice(input.contract_addresses, 0, 5)
some addr in first_five
addr in {"0xbanned1...", "0xbanned2..."}
}array.reverse
Invierte el orden de los elementos en un arreglo.
Ejemplo
# Check last contract address (most recent) for suspicious patterns
deny if {
count(input.contract_addresses) > 0
reversed := array.reverse(input.contract_addresses)
startswith(reversed[0], "0x00000000")
}Funciones de Conjunto
Funciones para operaciones de conjunto.
intersection
Obtiene elementos que existen en ambos conjuntos.
Ejemplo
# Check for any blocked address
blocked := {"0xdead...", "0xbad..."}
request_addrs := {lower(input.to_address)}
deny if {
count(intersection(blocked, request_addrs)) > 0
}union
Combina dos conjuntos en uno con todos los elementos únicos.
Ejemplo
# Combine multiple blocklists
blocked_countries := union(
{"KP", "IR", "CU"},
{"SY", "RU"}
)
deny if {
input.source_country in blocked_countries
}Funciones de Codificación
Funciones para codificar y decodificar datos.
base64.encode
Codifica una cadena en formato Base64.
Ejemplo
# Check if method matches an encoded pattern
deny if {
encoded_method := base64.encode(input.rpc_method)
encoded_method == "ZXRoX3NlbmRUcmFuc2FjdGlvbg==" # eth_sendTransaction
}base64.decode
Decodifica una cadena Base64 de vuelta a texto plano.
Ejemplo
# Decode base64 data from request
decoded := base64.decode("aGVsbG8=") # "hello"
deny if {
contains(decoded, "dangerous")
}base64url.encode
Codifica una cadena en formato Base64 seguro para URL. Utiliza - y _ en lugar de + y /.
Ejemplo
# Create URL-safe identifier from address for comparison
deny if {
encoded_addr := base64url.encode(input.to_address)
encoded_addr in {"MHhkZWFk...", "MHhiYWQ..."}
}base64url.decode
Decodifica una cadena Base64 segura para URL de vuelta a texto plano.
Ejemplo
# Decode and check URL-safe encoded data in params
deny if {
encoded_data := object.get(input.raw_params[0], "encoded", "")
decoded := base64url.decode(encoded_data)
contains(decoded, "malicious")
}hex.encode
Codifica una cadena en formato hexadecimal.
Ejemplo
# Encode method name to hex for pattern matching
deny if {
method_hex := hex.encode(input.rpc_method)
startswith(method_hex, "657468") # "eth" in hex
}hex.decode
Decodifica una cadena hexadecimal de vuelta a texto plano.
Ejemplo
# Decode hex-encoded data field and check contents
deny if {
data := object.get(input.raw_params[0], "data", "")
startswith(data, "0x")
decoded := hex.decode(substring(data, 2, 8))
contains(decoded, "admin")
}