Action-Based Proposals
Create proposals with executable on-chain actions
Action-Based Proposals
Action-based proposals contain specific on-chain transactions that execute automatically when the proposal passes and timelock completes.
Overview
When you create an action-based proposal, you're defining exact transactions that will run on the blockchain. This provides:
- Transparency - Everyone can see exactly what will happen
- Automation - No manual intervention required
- Trustless Execution - Code executes as written
Common Action Types
Treasury Transfer
Send tokens from the DAO treasury to a recipient.
Action: Transfer
To: 0x1234...5678
Amount: 10,000 USDC
Memo: "Q1 Development Grant"UI Steps:
- Select "Transfer" action
- Choose token from treasury
- Enter recipient address
- Enter amount
- Add optional memo
Parameter Update
Change a protocol parameter.
Action: Update Parameter
Contract: Governor
Parameter: votingPeriod
Old Value: 7 days
New Value: 5 daysConfigurable Parameters:
- Voting period
- Quorum threshold
- Proposal threshold
- Timelock delay
Role Management
Add or remove role members.
Action: Grant Role
Role: Committee Lead
Address: 0xABCD...
Permissions: [create_proposal, manage_budget]Role Actions:
- Grant role to address
- Revoke role from address
- Create new role
- Update role permissions
Contract Upgrade
Upgrade a protocol contract (if upgradeable).
Action: Upgrade Contract
Proxy: 0x1111...
New Implementation: 0x2222...
Initialize: initializeV2()Contract upgrades are high-risk operations. Ensure thorough testing and auditing before proposing.
Creating an Action-Based Proposal
Step 1: Select Action Type
From the proposal creation screen:
- Click "Action Based"
- Choose action category:
- Treasury
- Governance
- Roles
- Custom
Step 2: Configure Action
For Treasury Transfer:
┌─────────────────────────────────────────────────────────────┐
│ Transfer from Treasury │
├─────────────────────────────────────────────────────────────┤
│ │
│ Token: [USDC ▼] │
│ │
│ Recipient: [0x1234...5678 ] │
│ │
│ Amount: [50,000 ] │
│ │
│ Available: 125,000 USDC │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ + Add Another Transfer │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘Step 3: Add Multiple Actions
You can chain multiple actions in a single proposal:
actions:
# Action 1: Fund the grant program
- type: transfer
to: grant_multisig
amount: 40000
token: USDC
# Action 2: Fund administration
- type: transfer
to: admin_wallet
amount: 5000
token: USDC
# Action 3: Update grant limit
- type: parameter
contract: grants
function: setMaxGrant
args: [10000]Step 4: Simulate Execution
Before submitting, simulate the proposal:
- Click "Simulate"
- Review expected state changes
- Verify no errors
- Check gas estimates
┌─────────────────────────────────────────────────────────────┐
│ Simulation Results │
├─────────────────────────────────────────────────────────────┤
│ │
│ ✓ Action 1: Transfer 40,000 USDC to 0x1234... │
│ • Treasury balance: 125,000 → 85,000 USDC │
│ • Recipient balance: 0 → 40,000 USDC │
│ │
│ ✓ Action 2: Transfer 5,000 USDC to 0x5678... │
│ • Treasury balance: 85,000 → 80,000 USDC │
│ │
│ ✓ Action 3: Update maxGrant parameter │
│ • Old value: 5,000 │
│ • New value: 10,000 │
│ │
│ Estimated gas: 245,000 │
│ Status: ✓ All actions valid │
│ │
└─────────────────────────────────────────────────────────────┘Step 5: Add Description
Write a clear description explaining:
## Summary
This proposal funds the Q1 2026 Research Grant Program.
## Actions
1. Transfer $40,000 USDC to grant multisig (0x1234...)
2. Transfer $5,000 USDC to admin wallet (0x5678...)
3. Increase maximum individual grant from $5K to $10K
## Rationale
The Research Committee received 15 qualified applications totaling
$120,000 in requests. This funding allows us to support the top
applicants while increasing flexibility for exceptional proposals.
## Budget
- Grant awards: $40,000
- Administration: $5,000
- Total: $45,000
## Success Metrics
- Fund at least 5 grants
- Publish research summaries within 6 months
- 80% completion rateStep 6: Submit
- Review all actions
- Click "Submit Proposal"
- Confirm in wallet
- Pay gas fee
Execution Details
When a proposal passes:
- Timelock starts - 3-14 days depending on type
- Queue - Actions queued for execution
- Execution window - Anyone can trigger execution
- On-chain - Transactions execute atomically
Atomic Execution
All actions in a proposal execute together:
- If any action fails, all revert
- No partial execution
- Guaranteed consistency
Who Can Execute?
After timelock expires:
- Any wallet can call
execute() - No special permissions required
- Gas paid by executor
- Often automated by keepers
Advanced Actions
Batch Transfers
Send to multiple recipients:
- type: batch_transfer
token: USDC
transfers:
- to: 0xAAA...
amount: 10000
- to: 0xBBB...
amount: 15000
- to: 0xCCC...
amount: 25000Streaming Payments
Set up Sablier streams:
- type: create_stream
recipient: 0x1234...
token: USDC
total: 60000
duration: 365 days
cliff: 30 daysCross-Chain Actions
Execute on other chains (if supported):
- type: cross_chain
target_chain: arbitrum
action:
type: transfer
to: 0x1234...
amount: 10000
token: USDCError Handling
Common Errors
| Error | Cause | Solution |
|---|---|---|
| Insufficient balance | Treasury lacks funds | Reduce amount or fund treasury |
| Invalid recipient | Bad address format | Verify address |
| Simulation failed | Action would revert | Check parameters |
| Gas estimation failed | Complex transaction | Simplify or split |
Troubleshooting
- Check token balance - Ensure treasury has sufficient funds
- Verify addresses - Double-check all recipient addresses
- Test on testnet - Try actions on testnet first
- Review permissions - Ensure DAO has required permissions