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.

PlaceholderType
%sString
%dInteger
%fFloat
%vAny 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")
}
Funciones Integradas | 256 Blocks