TYPE 0x0671 · PLC FAMILY

RATE_LIMIT

Rate limiter. Checks single-transaction output limits to prevent excessive value extraction per spend. Enforces per-block withdrawal caps with accumulation and refill parameters. No Tapscript equivalent exists.

PLC Invertible
RATE_LIMIT output_amount max_per_block accum_cap refill_blocks output_amount ≤ max_per_block → SATISFIED
FieldData TypeSizeSideDescription
max_per_blockNUMERIC1-4 BConditionsMaximum output amount allowed per single transaction (NUMERIC[0])
accumulation_capNUMERIC1-4 BConditionsMaximum accumulated withdrawal allowance (NUMERIC[1])
refill_blocksNUMERIC1-4 BConditionsNumber of blocks between allowance refills (NUMERIC[2])

The single-transaction check (output_amount vs max_per_block) is evaluated directly. Full accumulation tracking requires UTXO chain state beyond this block's scope.

0x0671 0 3 NUMERIC · 6B NUMERIC · 6B NUMERIC · 3B Conditions ≈ 19 bytes
0x0671 0 0 Witness = 4 bytes (empty block)
Total ≈ 23 bytes
1.Collect conditions NUMERIC fields. Fewer than 3 → ERROR
2.ReadNumeric the first as max_per_block; undecodable → ERROR. max_per_block < 0ERROR
3.If ctx.output_amount > max_per_blockUNSATISFIED; else → SATISFIED

Note: The L1 evaluator only enforces the per-tx limit. accumulation_cap and refill_blocks are reserved for L2 protocols that track UTXO chain state — consensus parses them but does not validate or use them. A UTXO holder can drain max_per_block per transaction (potentially multiple txs per block); compose with RECURSE_SAME to enforce a single spend path per output.

ConditionResult
Fewer than 3 NUMERIC fields, max_per_block undecodable, or < 0ERROR
output_amount > max_per_blockUNSATISFIED
output_amount ≤ max_per_blockSATISFIED
Conditions (max 100k sats/tx, 1M cap, refill every 144 blocks)
{
  "type": "RATE_LIMIT",
  "inverted": false,
  "fields": [
    { "type": "NUMERIC", "value": 100000 },
    { "type": "NUMERIC", "value": 1000000 },
    { "type": "NUMERIC", "value": 144 }
  ]
}

This creates a rate limiter allowing at most 100,000 sats per transaction, with a cumulative cap of 1,000,000 sats that refills every 144 blocks (~1 day).

max_per_block=100000, accumulation_cap=1000000, refill_blocks=144

output_amount=50000: 50000 ≤ 100000 → SATISFIED
output_amount=100000: 100000 ≤ 100000 → SATISFIED (at limit)
output_amount=150000: 150000 > 100000 → UNSATISFIED (exceeds limit)
output_amount=1000000: 1000000 > 100000 → UNSATISFIED (drain attempt blocked)
Withdrawal Rate Limiting
Exchange hot wallets or custodial vaults enforce maximum withdrawal amounts per transaction and per time period. Even with valid signing keys, an attacker cannot drain the wallet in a single transaction.
Anti-Drain Protection
Protect high-value UTXOs from catastrophic key compromise. The rate limit ensures that even with stolen keys, funds can only be extracted slowly — giving the owner time to detect and respond.
Velocity Controls
Implement spending velocity limits on institutional wallets. Combined with EPOCH_GATE, creates sophisticated time-and-amount-based spending policies that mirror traditional banking controls.