बिल्ट-इन फ़ंक्शन

पॉलिसी में उपलब्ध सभी बिल्ट-इन फ़ंक्शन के लिए पूर्ण संदर्भ

पॉलिसी में केवल निम्नलिखित बिल्ट-इन फ़ंक्शन सक्षम हैं। यहां सूचीबद्ध नहीं किए गए फ़ंक्शन सुरक्षा कारणों से अक्षम हैं। अक्षम फ़ंक्शन के विवरण के लिए प्रतिबंध देखें।

स्ट्रिंग फ़ंक्शन

स्ट्रिंग मानों को हेरफेर करने और जांचने के लिए फ़ंक्शन। पतों, विधि नामों और अन्य टेक्स्ट फ़ील्ड के साथ काम करने के लिए आवश्यक।

contains

जांचें कि क्या एक स्ट्रिंग में सबस्ट्रिंग है। यदि मिल जाए तो true रिटर्न करता है, अन्यथा false

उदाहरण

# Block any method containing "sign"
deny if {
    contains(input.rpc_method, "sign")
}

startswith

जांचें कि क्या एक स्ट्रिंग एक उपसर्ग से शुरू होती है। विधि श्रेणियों या पता पैटर्न से मिलान के लिए उपयोगी।

उदाहरण

# Block debug methods
deny if {
    startswith(input.rpc_method, "debug_")
}
 
# Block addresses starting with many zeros
deny if {
    startswith(input.to_address, "0x00000000")
}

endswith

जांचें कि क्या एक स्ट्रिंग किसी प्रत्यय के साथ समाप्त होती है।

उदाहरण

# Block addresses ending with specific pattern
deny if {
    endswith(lower(input.to_address), "dead")
}

lower

स्ट्रिंग को लोअरकेस में कनवर्ट करें। केस-असंवेदनशील पता तुलना के लिए आवश्यक क्योंकि पतों में मिश्रित केस हो सकते हैं।

उदाहरण

# Case-insensitive address check
blocked_addresses := {
    "0x000000000000000000000000000000000000dead"
}
 
deny if {
    lower(input.to_address) in blocked_addresses
}

upper

स्ट्रिंग को अपरकेस में कनवर्ट करें।

उदाहरण

# Normalize method names that might have inconsistent casing
deny if {
    upper(input.rpc_method) == "ETH_SENDTRANSACTION"
    input.usd_value > 10000
}

concat

एक विभाजक के साथ स्ट्रिंग की सरणी को जोड़ें।

उदाहरण

# Join values for logging or comparison
message := concat(", ", ["chain:", input.chain, "method:", input.rpc_method])

split

एक विभाजक का उपयोग करके एक स्ट्रिंग को एक सरणी में विभाजित करें।

उदाहरण

# Parse a method name
parts := split(input.rpc_method, "_")
 
deny if {
    parts[0] == "debug"
}

replace

सबस्ट्रिंग की सभी घटनाओं को दूसरी स्ट्रिंग से बदलें।

उदाहरण

# Normalize address format
normalized := replace(input.to_address, "0X", "0x")

substring

प्रारंभ स्थिति और लंबाई द्वारा एक स्ट्रिंग का एक भाग निकालें।

उदाहरण

# 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

प्लेसहोल्डर के साथ एक स्ट्रिंग फ़ॉर्मेट करें। गतिशील मान बनाने के लिए उपयोगी।

PlaceholderType
%sString
%dInteger
%fFloat
%vAny value

उदाहरण

# Create formatted message
threshold := 10000
message := sprintf("Value %d exceeds limit of %d", [input.usd_value, threshold])

trim

स्ट्रिंग के दोनों सिरों से निर्दिष्ट वर्णों को हटाएं।

उदाहरण

# Remove specific characters from both ends
cleaned := trim(input.rpc_method, "_")

trim_space

स्ट्रिंग के दोनों सिरों से व्हाइटस्पेस हटाएं।

उदाहरण

# Clean up input with extra spaces
clean_method := trim_space(input.rpc_method)

trim_prefix

यदि मौजूद हो तो स्ट्रिंग से उपसर्ग हटाएं।

उदाहरण

# Remove common prefix to get the action name
method_name := trim_prefix(input.rpc_method, "eth_")
 
deny if {
    method_name == "sendTransaction"
}

trim_suffix

यदि मौजूद हो तो स्ट्रिंग से प्रत्यय हटाएं।

उदाहरण

# Remove suffix for comparison
base_method := trim_suffix(input.rpc_method, "_v2")

indexof

सबस्ट्रिंग की पहली घटना का इंडेक्स खोजें। यदि नहीं मिलता है तो -1 रिटर्न करता है।

उदाहरण

# Check if underscore exists
deny if {
    indexof(input.rpc_method, "_") == -1
}

रेगेक्स फ़ंक्शन

रेगुलर एक्सप्रेशन का उपयोग करके पैटर्न मिलान के लिए फ़ंक्शन। जटिल पैटर्न के लिए स्ट्रिंग फ़ंक्शन से अधिक शक्तिशाली।

regex.match

जांचें कि क्या कोई स्ट्रिंग रेगुलर एक्सप्रेशन पैटर्न से मेल खाती है। true या false रिटर्न करता है।

उदाहरण

# 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

पैटर्न के सभी मिलान को प्रतिस्थापन स्ट्रिंग से बदलें।

उदाहरण

# Remove all non-alphanumeric characters
cleaned := regex.replace(input.rpc_method, "[^a-zA-Z0-9]", "")

regex.split

रेगेक्स पैटर्न द्वारा एक स्ट्रिंग विभाजित करें।

उदाहरण

# Split by multiple delimiters
parts := regex.split("[_.]", input.rpc_method)

regex.find_n

एक स्ट्रिंग में एक पैटर्न के n मैचों तक खोजें।

उदाहरण

# 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
}

समय फ़ंक्शन

समय के साथ काम करने के लिए फ़ंक्शन। सभी समय मान Unix युग के बाद से नैनोसेकंड में हैं।

time.now_ns

नैनोसेकंड में वर्तमान समय प्राप्त करें। समय-आधारित पॉलिसी के लिए आधार के रूप में इसका उपयोग करें।

उदाहरण

# 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

टाइमस्टैम्प से घंटे, मिनट और सेकंड निकालें। [hour, minute, second] रिटर्न करता है।

उदाहरण

# 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

टाइमस्टैम्प से सप्ताह का दिन प्राप्त करें। 0 (रविवार) से 6 (शनिवार) तक रिटर्न करता है।

उदाहरण

# 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

टाइमस्टैम्प से वर्ष, महीना और दिन निकालें। [year, month, day] रिटर्न करता है।

उदाहरण

# Block on specific dates
deny if {
    [year, month, day] := time.date(time.now_ns())
    month == 12
    day == 25  # Christmas
}

time.parse_rfc3339_ns

RFC3339 फ़ॉर्मेटेड टाइमस्टैम्प स्ट्रिंग को नैनोसेकंड में पार्स करें।

उदाहरण

# Compare against a specific date
cutoff := time.parse_rfc3339_ns("2024-12-31T23:59:59Z")
 
deny if {
    time.now_ns() > cutoff
}

time.add_date

टाइमस्टैम्प में वर्ष, महीने और दिन जोड़ें।

उदाहरण

# 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

दो टाइमस्टैम्प के बीच अंतर की गणना करें। [years, months, days, hours, minutes, seconds] रिटर्न करता है।

उदाहरण

# 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
}

समग्र फ़ंक्शन

मूल्यों के संग्रह के साथ काम करने के लिए फ़ंक्शन।

count

एक सरणी, सेट या ऑब्जेक्ट में तत्वों की संख्या गिनें।

उदाहरण

# 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

एक सरणी में संख्याओं का योग गणना करें।

उदाहरण

# 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

एक सरणी में अधिकतम मान खोजें।

उदाहरण

# Check against maximum in a set of thresholds
thresholds := [1000, 5000, 10000]
 
deny if {
    input.usd_value > max(thresholds)
}

min

एक सरणी में न्यूनतम मान खोजें।

उदाहरण

# Ensure value meets minimum threshold
thresholds := [100, 500, 1000]
 
deny if {
    input.usd_value < min(thresholds)
}

sort

एक सरणी को आरोही क्रम में सॉर्ट करें।

उदाहरण

# 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

एक सरणी में संख्याओं का गुणनफल गणना करें।

उदाहरण

# 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
}

प्रकार फ़ंक्शन

डेटा प्रकारों की जाँच और काम करने के लिए फ़ंक्शन। नलेबल फ़ील्ड को सुरक्षित रूप से संभालने के लिए उपयोगी।

is_null

जांचें कि क्या कोई मान null है। वैकल्पिक इनपुट फ़ील्ड को संभालने के लिए आवश्यक।

उदाहरण

# Safely check nullable field
deny if {
    not is_null(input.usd_value)
    input.usd_value > 10000
}

is_number

जांचें कि क्या कोई मान संख्या है।

उदाहरण

# Validate before numeric comparison
deny if {
    is_number(input.usd_value)
    input.usd_value > 10000
}

is_string

जांचें कि क्या कोई मान स्ट्रिंग है।

उदाहरण

# Validate input type
deny if {
    is_string(input.to_address)
    startswith(input.to_address, "0x0000")
}

is_array

जांचें कि क्या कोई मान सरणी है।

उदाहरण

# Check before iterating
deny if {
    is_array(input.contract_addresses)
    count(input.contract_addresses) > 10
}

is_boolean

जांचें कि क्या कोई मान बूलियन (true या false) है।

उदाहरण

# 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

जांचें कि क्या कोई मान सेट है।

उदाहरण

# Validate collection type
deny if {
    is_set(input.raw_params[0].addresses)
    count(input.raw_params[0].addresses) > 100
}

is_object

जांचें कि क्या कोई मान ऑब्जेक्ट (की-वैल्यू मैप) है।

उदाहरण

# 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

एक स्ट्रिंग के रूप में किसी मान का प्रकार नाम प्राप्त करें।

उदाहरण

# Block if usd_value is not a number (unexpected type)
deny if {
    input.usd_value != null
    type_name(input.usd_value) != "number"
}

संख्या फ़ंक्शन

संख्यात्मक संचालन के लिए फ़ंक्शन।

abs

संख्या का निरपेक्ष मान प्राप्त करें।

उदाहरण

# Check magnitude regardless of sign
deny if {
    abs(input.usd_value) > 10000
}

round

एक संख्या को निकटतम पूर्णांक तक राउंड करें।

उदाहरण

# Round for comparison
deny if {
    round(input.usd_value) > 10000
}

ceil

एक संख्या को अगले पूर्णांक तक राउंड अप करें।

उदाहरण

# Round up for conservative limit checking
deny if {
    ceil(input.usd_value) > 10000
}

floor

एक संख्या को पिछले पूर्णांक तक राउंड डाउन करें।

उदाहरण

# Block transactions over $10,000 (ignoring cents)
deny if {
    floor(input.usd_value) >= 10000
}

to_number

एक स्ट्रिंग को संख्या में कनवर्ट करें। हेक्स स्ट्रिंग मानों के लिए उपयोगी।

उदाहरण

# Convert hex gas values
deny if {
    input.gas_limit != null
    to_number(input.gas_limit) > 1000000
}

numbers.range

शुरुआत से अंत (समावेशी) तक संख्याओं की एक सरणी उत्पन्न करें।

उदाहरण

# 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
}

ऑब्जेक्ट फ़ंक्शन

ऑब्जेक्ट (की-वैल्यू मैप) के साथ काम करने के लिए फ़ंक्शन।

object.get

यदि कुंजी मौजूद नहीं है तो डिफ़ॉल्ट के साथ किसी ऑब्जेक्ट से सुरक्षित रूप से मान प्राप्त करें।

उदाहरण

# 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

किसी ऑब्जेक्ट से सभी कुंजियों को सरणी के रूप में प्राप्त करें।

उदाहरण

# Check which fields are present
params := input.raw_params[0]
keys := object.keys(params)
 
deny if {
    "data" in keys
    "value" in keys
}

object.remove

निर्दिष्ट कुंजियों को हटाकर एक नया ऑब्जेक्ट बनाएं।

उदाहरण

# 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

दो ऑब्जेक्ट को मर्ज करें। दूसरे ऑब्जेक्ट के मान पहले को ओवरराइड करते हैं।

उदाहरण

# 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
}

सरणी फ़ंक्शन

सरणी हेरफेर के लिए फ़ंक्शन।

array.concat

दो सरणियों को एक में संयोजित करें।

उदाहरण

# Combine address lists
all_addresses := array.concat(
    input.contract_addresses,
    [input.to_address]
)

array.slice

प्रारंभ और अंत सूचकांक द्वारा एक सरणी का एक भाग निकालें।

उदाहरण

# 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

एक सरणी में तत्वों के क्रम को उलटें।

उदाहरण

# 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")
}

सेट फ़ंक्शन

सेट संचालन के लिए फ़ंक्शन।

intersection

दोनों सेट में मौजूद तत्व प्राप्त करें।

उदाहरण

# Check for any blocked address
blocked := {"0xdead...", "0xbad..."}
request_addrs := {lower(input.to_address)}
 
deny if {
    count(intersection(blocked, request_addrs)) > 0
}

union

सभी अद्वितीय तत्वों के साथ दो सेट को एक में संयोजित करें।

उदाहरण

# Combine multiple blocklists
blocked_countries := union(
    {"KP", "IR", "CU"},
    {"SY", "RU"}
)
 
deny if {
    input.source_country in blocked_countries
}

एन्कोडिंग फ़ंक्शन

डेटा को एन्कोड और डिकोड करने के लिए फ़ंक्शन।

base64.encode

एक स्ट्रिंग को Base64 प्रारूप में एन्कोड करें।

उदाहरण

# Check if method matches an encoded pattern
deny if {
    encoded_method := base64.encode(input.rpc_method)
    encoded_method == "ZXRoX3NlbmRUcmFuc2FjdGlvbg=="  # eth_sendTransaction
}

base64.decode

एक Base64 स्ट्रिंग को सादा टेक्स्ट में डिकोड करें।

उदाहरण

# Decode base64 data from request
decoded := base64.decode("aGVsbG8=")  # "hello"
 
deny if {
    contains(decoded, "dangerous")
}

base64url.encode

एक स्ट्रिंग को URL-सुरक्षित Base64 प्रारूप में एन्कोड करें। + और / के बजाय - और _ का उपयोग करता है।

उदाहरण

# Create URL-safe identifier from address for comparison
deny if {
    encoded_addr := base64url.encode(input.to_address)
    encoded_addr in {"MHhkZWFk...", "MHhiYWQ..."}
}

base64url.decode

एक URL-सुरक्षित Base64 स्ट्रिंग को सादा टेक्स्ट में डिकोड करें।

उदाहरण

# 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

एक स्ट्रिंग को हेक्साडेसिमल प्रारूप में एन्कोड करें।

उदाहरण

# 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

एक हेक्साडेसिमल स्ट्रिंग को सादा टेक्स्ट में डिकोड करें।

उदाहरण

# 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")
}
बिल्ट-इन फ़ंक्शन | 256 Blocks