Skip to main content
Copy-paste ready policy templates for common use cases. Customize the values to fit your needs.
New to policies? Check out Policies Overview and Policy Syntax first.

Transfer Limits

Require a minimum balance of 500 in the receiving wallet and don’t allow transfers if the amount being sent is more than 1000.
{
  "Policy": "Transfer Constraints",
  "PolicyType": "open",
  "CallingFunctions": [
    {
      "Name": "transfer(address to, uint256 amount)",
      "FunctionSignature": "transfer(address to, uint256 amount)",
      "EncodedValues": "address to, uint256 amount, uint256 toBalance"
    }
  ],
  "ForeignCalls": [],
  "Trackers": [],
  "MappedTrackers": [],
  "Rules": [
    {
      "Name": "Transfer restrictions",
      "Condition": "(toBalance + amount >= 500) AND (amount <= 1000)",
      "PositiveEffects": [],
      "NegativeEffects": ["revert(\"Transfer violates constraints\")"],
      "CallingFunction": "transfer(address to, uint256 amount)"
    }
  ]
}

Gate Access via External Contract

Gate access based on external contract verification (KYC, whitelist, tier system, etc).
{
  "Policy": "External Access Control",
  "PolicyType": "open",
  "CallingFunctions": [
    {
      "Name": "transfer(address to, uint256 amount)",
      "FunctionSignature": "transfer(address to, uint256 amount)",
      "EncodedValues": "address to, uint256 amount"
    }
  ],
  "ForeignCalls": [
    {
      "Name": "CheckAccess",
      "Address": "0x1234abcd...",
      "Function": "isAllowed(address)",
      "ReturnType": "bool",
      "ValuesToPass": "to"
    }
  ],
  "Trackers": [],
  "MappedTrackers": [],
  "Rules": [
    {
      "Name": "Access check",
      "Condition": "FC:CheckAccess == false",
      "PositiveEffects": ["revert(\"Not authorized\")"],
      "NegativeEffects": [],
      "CallingFunction": "transfer(address to, uint256 amount)"
    }
  ]
}
Learn more: Foreign Contracts

Whale Alert & Tracking

Emit events and track large transactions without blocking them.
{
  "Policy": "Large Transaction Monitoring",
  "PolicyType": "open",
  "CallingFunctions": [
    {
      "Name": "transfer(address to, uint256 amount)",
      "FunctionSignature": "transfer(address to, uint256 amount)",
      "EncodedValues": "address to, uint256 amount"
    }
  ],
  "ForeignCalls": [],
  "Trackers": [
    {
      "Name": "largeTransactionCount",
      "Type": "uint256",
      "InitialValue": 0
    }
  ],
  "MappedTrackers": [
    {
      "Name": "largeTransactionsPerUser",
      "KeyType": "address",
      "ValueType": "uint256",
      "InitialKeys": [],
      "InitialValues": []
    }
  ],
  "Rules": [
    {
      "Name": "Track large transfers",
      "Condition": "amount > 100000",
      "PositiveEffects": [
        "emit Whale alert",
        "TRU:largeTransactionCount += 1",
        "TRU:largeTransactionsPerUser(to) += 1"
      ],
      "NegativeEffects": [],
      "CallingFunction": "transfer(address to, uint256 amount)"
    }
  ]
}

Time-Based Access Control

Restrict actions to specific time windows.
{
  "Policy": "Time Window Restriction",
  "PolicyType": "open",
  "CallingFunctions": [
    {
      "Name": "claim(uint256 amount)",
      "FunctionSignature": "claim(uint256 amount)",
      "EncodedValues": "uint256 amount"
    }
  ],
  "ForeignCalls": [],
  "Trackers": [],
  "MappedTrackers": [],
  "Rules": [
    {
      "Name": "Time check",
      "Condition": "(GV:BLOCK_TIMESTAMP >= 1735689600) AND (GV:BLOCK_TIMESTAMP <= 1767225600)",
      "PositiveEffects": [],
      "NegativeEffects": ["revert(\"Outside allowed time window\")"],
      "CallingFunction": "claim(uint256 amount)"
    }
  ]
}
Customize: Update timestamps to your start/end dates. Learn more: Global Variables

Tiered Access Levels

Different limits based on user tier from external contract.
{
  "Policy": "Tiered Transfer Limits",
  "PolicyType": "open",
  "CallingFunctions": [
    {
      "Name": "transfer(address to, uint256 amount)",
      "FunctionSignature": "transfer(address to, uint256 amount)",
      "EncodedValues": "address to, uint256 amount, address from"
    }
  ],
  "ForeignCalls": [
    {
      "Name": "GetTier",
      "Address": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e",
      "Function": "userTier(address)",
      "ReturnType": "uint256",
      "ValuesToPass": "from"
    }
  ],
  "Trackers": [],
  "MappedTrackers": [],
  "Rules": [
    {
      "Name": "Tier 1 limit",
      "Condition": "(FC:GetTier == 1) AND (amount > 1000)",
      "PositiveEffects": ["revert(\"Tier 1: max 1000\")"],
      "NegativeEffects": [],
      "CallingFunction": "transfer(address to, uint256 amount)"
    },
    {
      "Name": "Tier 2 limit",
      "Condition": "(FC:GetTier == 2) AND (amount > 5000)",
      "PositiveEffects": ["revert(\"Tier 2: max 5000\")"],
      "NegativeEffects": [],
      "CallingFunction": "transfer(address to, uint256 amount)"
    }
  ]
}

Compliance and Risk Management

This example demonstrates a comprehensive transfer control policy that combines whitelisting, balance limits, and volume tracking for regulatory compliance and risk monitoring.
{
  "Policy": "Advanced Transfer Controls",
  "PolicyType": "open",
  "CallingFunctions": [
    {
      "Name": "transfer(address to, uint256 amount)",
      "FunctionSignature": "transfer(address to, uint256 amount)",
      "EncodedValues": "address to, uint256 amount, address from, uint256 toBalance"
    }
  ],
  "ForeignCalls": [
    {
      "Name": "IsWhitelisted",
      "Address": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e",
      "Function": "isWhitelisted(address)",
      "ReturnType": "bool",
      "ValuesToPass": "to"
    }
  ],
  "Trackers": [
    {
      "Name": "totalTransferVolume",
      "Type": "uint256",
      "InitialValue": 0
    }
  ],
  "MappedTrackers": [
    {
      "Name": "userTransferCount",
      "KeyType": "address",
      "ValueType": "uint256",
      "InitialKeys": [],
      "InitialValues": []
    }
  ],
  "Rules": [
    {
      "Name": "Whitelist check for large amounts",
      "Condition": "(amount > 10000) AND (FC:IsWhitelisted == false)",
      "PositiveEffects": ["revert(\"Large transfers require whitelist\")"],
      "NegativeEffects": [],
      "CallingFunction": "transfer(address to, uint256 amount)",
      "Order": 1
    },
    {
      "Name": "Balance limit check",
      "Condition": "toBalance + amount > 50000",
      "PositiveEffects": ["revert(\"Recipient balance would exceed 50K\")"],
      "NegativeEffects": [],
      "CallingFunction": "transfer(address to, uint256 amount)",
      "Order": 2
    },
    {
      "Name": "Track volume",
      "Condition": "amount > 0",
      "PositiveEffects": ["TRU:totalTransferVolume += amount", "TRU:userTransferCount(from) += 1"],
      "NegativeEffects": [],
      "CallingFunction": "transfer(address to, uint256 amount)",
      "Order": 3
    }
  ]
}
Check the Policy Syntax Guide for more in depth info.
I