import { PolicyBuilder } from "@policykit/sdk";
import { parseEther, parseUnits } from "viem";
// Approved protocol addresses
const UNISWAP_ROUTER = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45";
const AAVE_POOL = "0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9";
const COMPOUND_COMET = "0xc3d688B66703497DAA19211EEdff47f25384cdc3";
const LIDO = "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84";
// Token addresses
const USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";
const DAI = "0x6B175474E89094C44Da98b954EedeAC495271d0F";
const WETH = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";
const policy = new PolicyBuilder("dao-treasury-guard")
// Approved protocol targets
.allowTargets([
UNISWAP_ROUTER,
AAVE_POOL,
COMPOUND_COMET,
LIDO,
USDC,
DAI,
WETH,
])
// Max 50 ETH per transaction
.maxValue(parseEther("50"))
// Daily spending limits per token
.spendLimit(USDC, parseUnits("500000", 6), 86400) // 500k USDC/day
.spendLimit(DAI, parseUnits("500000", 18), 86400) // 500k DAI/day
// 30 minute cooldown between executions
.cooldown(1800)
// Max 1% slippage on any swap
.maxSlippageBps(100)
// Require simulation for all transactions
.requireSimulation(true)
// Custom rule: verify proposal was approved on-chain
.customRule({
name: "check-governance-approval",
description: "Verify this transaction was approved by DAO governance",
cid: "QmGovernanceCheckRuleCID",
params: {
governorAddress: "0xDAOGovernorContract",
minVotingPeriod: 172800, // 2 days
minQuorum: 4, // 4% quorum
},
})
// Block if Lit is unavailable — treasury security is paramount
.setFailMode("closed")
.build();