Creating Policies
Learn how to create and manage transaction policies to protect your wallet against unauthorized actions.
Creating Policies
Policies are the heart of Kairo's protection. They define exactly what transactions your wallet can sign—and more importantly, what it can't. This guide shows you how to create policies that match your security needs.
What Is a Policy?
A policy is a set of rules stored on the Sui blockchain. Every time you try to sign a transaction, Kairo checks it against your active policy:
- Match the rules? Transaction proceeds
- Break any rule? Transaction blocked
Because policies live on-chain, they can't be bypassed by compromising your device alone. Even if malware infected your browser, it couldn't sign transactions that violate your policy.
Policy Components
Every policy can include these types of rules:
Destination Rules
Control where your funds can go:
- Allowlist — Only these addresses can receive funds
- Denylist — These addresses are blocked, everything else is allowed
Most users should start with an allowlist. It's more restrictive but far safer.
Amount Limits
Cap how much can be sent:
- Per-transaction maximums
- Token-specific limits
- Different thresholds for different assets
Contract Interaction Rules
Control how you interact with smart contracts:
- Allowed function selectors — Only these contract functions can be called
- Blocked function selectors — These specific functions are forbidden
- Particularly useful for blocking unlimited token approvals
Chain Restrictions
Limit which blockchains you use:
- Only allow specific networks
- Prevent accidental transactions on testnets or unfamiliar chains
Time-Based Rules
Add temporal constraints:
- Policy expiration dates
- Future: Time-delayed transactions for high-value transfers
Creating Your First Policy
Step 1: Open Policy Settings
- Click the Kairo extension icon
- Navigate to Settings → Policy
- Click Create New Policy (or Edit Policy if one exists)
Step 2: Set Up Destination Rules
For most users, we recommend starting with an allowlist:
- Toggle Allowlist Mode on
- Click Add Address
- Enter addresses you commonly send to:
- Your hardware wallet
- Exchange deposit addresses
- DeFi protocols you use (Uniswap, Aave, etc.)
- Give each address a memorable name
- Repeat for all trusted destinations
Tip: You can add contract addresses (like Uniswap Router) to allow interactions with those protocols.
Step 3: Configure Amount Limits (Optional)
If you want spending caps:
- Toggle Amount Limits on
- Set a maximum per-transaction amount
- Optionally, set specific limits for specific tokens
Example configuration:
- ETH: Max 1 ETH per transaction
- USDC: Max 1,000 USDC per transaction
- Other tokens: Default limit of $500 equivalent
Step 4: Set Contract Rules (Optional)
For DeFi users who want extra protection:
- Navigate to Contract Interactions
- Consider blocking
approve()with unlimited amounts - Add specific function selectors you want to allow or deny
Common selectors to know:
0x095ea7b3— ERC20approve()0xa9059cbb— ERC20transfer()0x23b872dd— ERC20transferFrom()
Step 5: Choose Network Settings
- Navigate to Networks
- Select which chains your policy applies to
- For maximum security, only enable chains you actively use
Step 6: Review and Publish
- Review all your policy settings
- Click Publish Policy
- Confirm the on-chain transaction
- Wait for confirmation (usually a few seconds)
Your policy is now active!
Policy Versioning
Every time you update your policy, a new version is created. This is important for security:
- Old versions are preserved for audit trails
- You must explicitly "reaffirm" your binding to use a new policy version
- This prevents attackers from silently changing your policy
Updating Your Policy
- Make your desired changes
- Click Update Policy
- A new version is published on-chain
- You'll be prompted to reaffirm your binding
- Confirm to activate the new policy
Why Reaffirmation Matters
Requiring explicit reaffirmation prevents a subtle attack:
Without reaffirmation: An attacker compromises your device → changes your policy to allow malicious addresses → immediately drains your wallet
With reaffirmation: An attacker compromises your device → changes your policy → but signing still fails because you haven't reaffirmed → you notice something is wrong before funds are lost
Policy Examples
Conservative HODLer
For someone who rarely transacts:
Destinations: Allowlist only
- Personal hardware wallet
- Primary exchange
Amount Limits:
- ETH: 0.5 max
- All others: $1,000 max
Networks: Ethereum mainnet only
Contract Interactions: Transfer only (no approvals)
Active DeFi User
For regular trading and farming:
Destinations: Allowlist
- Personal wallets
- Uniswap Router (all versions)
- Aave Pool
- Compound cTokens
- Major exchange addresses
Amount Limits:
- Stablecoins: $10,000 max
- ETH: 5 max
- Others: No limit
Networks: Ethereum, Base, Arbitrum
Contract Interactions: All allowed except
- Unlimited approve() calls blocked
Multi-Sig Treasury
For organizational funds:
Destinations: Strict allowlist
- Approved vendor addresses
- Internal transfer addresses only
Amount Limits:
- All assets: $50,000 max
- Above requires additional approval
Networks: Ethereum mainnet only
Additional: 24-hour delay on policy changes
Managing Multiple Policies
You can create different policies for different purposes:
- Daily spending policy — Lower limits, more allowed destinations
- Savings policy — Very restricted, high-value protection
- DeFi policy — More contract interactions allowed
Switch between policies as needed for different activities.
Troubleshooting Policies
Transaction Blocked Unexpectedly
- Check the denial reason in the Kairo popup
- Common causes:
- Address not in allowlist
- Amount exceeds limit
- Contract function not allowed
- Add the address/function if you trust it
- Retry the transaction
Policy Update Not Taking Effect
- Ensure you've reaffirmed your binding
- Check the transaction confirmed on Sui
- Try refreshing the extension
Can't Find a Contract Address
For DeFi protocols:
- Check the protocol's official documentation
- Look up the contract on Etherscan
- Verify the address before adding to allowlist
Best Practices
- Start restrictive — You can always add addresses later
- Name your addresses — Makes reviewing transactions much easier
- Review regularly — Remove addresses you no longer use
- Test after changes — Make a small transaction to verify your policy works
- Keep a backup — Note your policy configuration somewhere safe
Next Steps
- Recovery Options — Protect against device loss
- Multi-Chain Support — Use policies across networks
- Security Model — Understand how policies are enforced