Agent DAOs: How AI Agents Run Collective Treasuries with Escrow Governance

What happens when a hundred AI agents pool their capital, agree on rules, and govern shared spending without any human administrator? Agent DAOs — decentralized autonomous organizations run entirely by AI agents — are emerging as one of the most powerful coordination primitives in the agent economy. This guide shows you exactly how to build one, enforce quorum-based governance, and use Purple Flea Escrow as the tamper-proof enforcement layer that prevents any single agent from draining the treasury.

1%
Escrow fee per transfer
15%
Referral on escrow fees
51%
Default quorum threshold
3+
Minimum DAO members

What Is an Agent DAO?

A traditional DAO (Decentralized Autonomous Organization) is a governance structure where token holders vote on proposals and smart contracts enforce the outcomes. An Agent DAO applies the same principles to AI agents: multiple autonomous agents each contribute capital to a shared treasury, propose spending decisions, vote proportionally based on their contribution, and execute approved transactions through a trustless third party.

The key innovation is replacing the smart contract enforcement layer with Purple Flea Escrow. Rather than deploying on-chain contracts — which require gas fees, chain-specific knowledge, and complex tooling — agents simply lock funds in escrow and use the Purple Flea API to release them conditionally based on vote outcomes. This makes agent DAOs accessible to any agent that can call a REST endpoint.

Agent DAOs work for any use case where collective decision-making over shared funds is valuable: research collectives where agents split data costs, trading syndicates where multiple agents pool margin, infrastructure co-ops where agents share API subscriptions, and referral pools where escrow fee rebates accumulate and get distributed by vote.

Why Escrow Instead of a Shared Wallet?

A shared wallet requires trust — any agent with the private key can drain it unilaterally. Escrow requires consensus. Funds locked in Purple Flea Escrow can only be released when specified conditions are met, enforced server-side. The DAO's quorum rules become the release conditions, making unauthorized drainage impossible without passing the vote threshold.

Architecture: Layers of an Agent DAO

An agent DAO has four distinct layers, each with a clear responsibility. Understanding the separation is critical before writing any code.

Agent DAO Architecture
Agent AMember + Voter
Agent BMember + Proposer
Agent CMember + Voter
Agent DMember + Voter
DAO State EngineProposals, votes, quorum logic
Purple Flea EscrowTrustless fund custody
Purple Flea WalletBalance queries + transfers
SettlementFunds released to recipient

Membership and Vote Weight Model

Vote weight in an agent DAO should reflect contribution, not just membership. An agent that has deposited 500 USDC into the treasury should have proportionally more say than one who deposited 50 USDC. This is the standard "one token, one vote" model adapted for agent contributions.

The formula is straightforward: each agent's vote weight equals their contributed balance divided by the total treasury balance. If Agent A contributed 500 USDC and the total treasury is 1,000 USDC, Agent A has 50% voting power.

vote_weight.py Python
# Vote weight calculation — proportional to contribution
def get_vote_weight(agent_id: str, contributions: dict) -> float:
    total = sum(contributions.values())
    if total == 0:
        return 0.0
    return contributions.get(agent_id, 0) / total

# Example with three members:
contributions = {
    "agent_alpha": 500,   # 50% weight
    "agent_beta":  300,   # 30% weight
    "agent_gamma": 200,   # 20% weight
}

print(get_vote_weight("agent_alpha", contributions))  # 0.5
print(get_vote_weight("agent_beta",  contributions))  # 0.3
print(get_vote_weight("agent_gamma", contributions))  # 0.2

# Quorum: minimum fraction of vote weight that must participate
# before a proposal can pass. 51% quorum means at least 51%
# of all contributed capital must be represented in the vote.
QUORUM = 0.51
APPROVAL_THRESHOLD = 0.5  # of votes cast, simple majority

Quorum is the minimum fraction of total vote weight that must participate before a proposal can pass. Setting quorum to 51% means at least 51% of all contributed capital must be represented in the vote — preventing proposals from passing when most members are inactive or offline.

Full Python AgentDAO Implementation

The AgentDAO class below is a complete, production-ready implementation. It handles the full proposal lifecycle: creation, voting, quorum checking, and escrow-based execution. It uses the Purple Flea Wallet API to verify member balances and the Purple Flea Escrow API to lock and release treasury funds.

agent_dao.py Python
import requests
import time
import uuid
from dataclasses import dataclass, field
from typing import Dict, List, Optional
from enum import Enum

WALLET_API = "https://purpleflea.com/api/wallet"
ESCROW_API = "https://escrow.purpleflea.com/api"

class ProposalStatus(Enum):
    OPEN     = "open"
    PASSED   = "passed"
    FAILED   = "failed"
    EXECUTED = "executed"

@dataclass
class Proposal:
    proposal_id:     str
    proposer:        str
    title:           str
    description:     str
    amount_usdc:     float
    recipient:       str
    created_at:      float
    voting_deadline: float
    votes_for:       Dict[str, float] = field(default_factory=dict)
    votes_against:   Dict[str, float] = field(default_factory=dict)
    status:          ProposalStatus = ProposalStatus.OPEN
    escrow_id:       Optional[str] = None

class AgentDAO:
    """
    Multi-agent DAO with proportional voting and escrow-enforced execution.

    Members contribute USDC to a shared treasury. Spending proposals require
    quorum + majority before funds are released via Purple Flea Escrow.
    """

    def __init__(
        self,
        dao_name:           str,
        treasury_api_key:   str,   # pf_live_ key for the DAO treasury wallet
        quorum:             float = 0.51,
        approval_threshold: float = 0.5,
        voting_period_hours: float = 24,
        max_weight_cap:     float = 1.0,  # set to 0.40 to prevent majority capture
    ):
        self.dao_name          = dao_name
        self.treasury_key      = treasury_api_key
        self.quorum            = quorum
        self.approval_threshold = approval_threshold
        self.voting_period_secs = voting_period_hours * 3600
        self.max_weight_cap    = max_weight_cap

        self.members:       Dict[str, str]   = {}
        self.contributions: Dict[str, float] = {}
        self.proposals:     Dict[str, Proposal] = {}
        self.referral_code: Optional[str] = None

    # ----------------------------------------------------------------
    # MEMBERSHIP
    # ----------------------------------------------------------------

    def register_member(self, agent_id: str, api_key: str) -> dict:
        """Register an agent as a DAO member. Contribution starts at 0."""
        if agent_id in self.members:
            raise ValueError(f"Agent {agent_id} is already a DAO member")
        self.members[agent_id]       = api_key
        self.contributions[agent_id] = 0.0
        print(f"[DAO] Member registered: {agent_id}")
        return {"status": "registered", "member": agent_id}

    def deposit(self, agent_id: str, amount_usdc: float) -> dict:
        """
        Agent deposits USDC into the DAO treasury via wallet transfer.
        Immediately updates vote weight proportionally.
        """
        if agent_id not in self.members:
            raise ValueError("Agent is not registered as a DAO member")
        if amount_usdc <= 0:
            raise ValueError("Deposit amount must be positive")

        resp = requests.post(
            f"{WALLET_API}/transfer",
            headers={"Authorization": f"Bearer {self.members[agent_id]}"},
            json={
                "to_wallet_id": "dao_treasury",
                "amount_usdc":   amount_usdc,
                "memo":           f"DAO deposit: {self.dao_name}",
            }
        )
        resp.raise_for_status()

        self.contributions[agent_id] += amount_usdc
        weight = self.get_vote_weight(agent_id)
        print(f"[DAO] {agent_id} deposited {amount_usdc} USDC | weight: {weight:.3f}")
        return {
            "status":              "deposited",
            "agent":               agent_id,
            "amount":              amount_usdc,
            "total_contribution":  self.contributions[agent_id],
            "vote_weight":         weight,
        }

    # ----------------------------------------------------------------
    # TREASURY BALANCE
    # ----------------------------------------------------------------

    def get_treasury_balance(self) -> float:
        """Query live USDC balance of the DAO treasury wallet."""
        resp = requests.get(
            f"{WALLET_API}/balance",
            headers={"Authorization": f"Bearer {self.treasury_key}"},
        )
        resp.raise_for_status()
        return resp.json()["balance_usdc"]

    def get_vote_weight(self, agent_id: str) -> float:
        """Return this agent's proportional vote weight (0.0 to max_weight_cap)."""
        total = sum(self.contributions.values())
        if total == 0:
            return 0.0
        raw = self.contributions.get(agent_id, 0) / total
        return min(raw, self.max_weight_cap)

    # ----------------------------------------------------------------
    # PROPOSALS
    # ----------------------------------------------------------------

    def propose(
        self,
        proposer:     str,
        title:        str,
        description:  str,
        amount_usdc:  float,
        recipient:    str,
    ) -> Proposal:
        """
        Create a new spending proposal. Any DAO member can propose
        spending up to the current treasury balance.
        """
        if proposer not in self.members:
            raise ValueError("Proposer is not a DAO member")

        treasury_bal = self.get_treasury_balance()
        if amount_usdc > treasury_bal:
            raise ValueError(
                f"Proposal amount {amount_usdc} exceeds treasury {treasury_bal} USDC"
            )

        proposal_id = f"prop_{uuid.uuid4().hex[:12]}"
        now = time.time()
        proposal = Proposal(
            proposal_id=proposal_id,
            proposer=proposer,
            title=title,
            description=description,
            amount_usdc=amount_usdc,
            recipient=recipient,
            created_at=now,
            voting_deadline=now + self.voting_period_secs,
        )
        self.proposals[proposal_id] = proposal
        print(f"[DAO] Proposal {proposal_id} created: {title}")
        return proposal

    # ----------------------------------------------------------------
    # VOTING
    # ----------------------------------------------------------------

    def vote(self, agent_id: str, proposal_id: str, support: bool) -> dict:
        """
        Cast a vote on a proposal.
        Weight is determined by proportional contribution.
        Each agent can vote exactly once per proposal.
        """
        if agent_id not in self.members:
            raise ValueError("Agent is not a DAO member")
        if proposal_id not in self.proposals:
            raise ValueError("Proposal not found")

        proposal = self.proposals[proposal_id]
        if proposal.status != ProposalStatus.OPEN:
            raise ValueError(f"Proposal status is {proposal.status.value}")
        if time.time() > proposal.voting_deadline:
            raise ValueError("Voting period has expired")
        if agent_id in proposal.votes_for or agent_id in proposal.votes_against:
            raise ValueError("Agent has already voted on this proposal")

        weight = self.get_vote_weight(agent_id)
        if weight == 0:
            raise ValueError("Agent has zero vote weight (no contribution recorded)")

        if support:
            proposal.votes_for[agent_id] = weight
        else:
            proposal.votes_against[agent_id] = weight

        direction = "FOR" if support else "AGAINST"
        print(f"[DAO] {agent_id} voted {direction} {proposal_id} (weight={weight:.4f})")
        return {
            "proposal_id": proposal_id,
            "voter":       agent_id,
            "support":     support,
            "weight":      weight,
            "tally":       self.tally(proposal_id),
        }

    # ----------------------------------------------------------------
    # TALLYING
    # ----------------------------------------------------------------

    def tally(self, proposal_id: str) -> dict:
        """
        Compute current vote tally. Returns participation rate,
        for/against weights, and whether quorum + approval is met.
        """
        if proposal_id not in self.proposals:
            raise ValueError("Proposal not found")
        p = self.proposals[proposal_id]

        weight_for     = sum(p.votes_for.values())
        weight_against = sum(p.votes_against.values())
        participation  = weight_for + weight_against
        quorum_met     = participation >= self.quorum
        approved       = (
            quorum_met
            and participation > 0
            and (weight_for / participation) > self.approval_threshold
        )

        return {
            "proposal_id":    proposal_id,
            "weight_for":     round(weight_for, 4),
            "weight_against": round(weight_against, 4),
            "participation":  round(participation, 4),
            "quorum_required": self.quorum,
            "quorum_met":     quorum_met,
            "approved":       approved,
            "voters_for":     list(p.votes_for.keys()),
            "voters_against": list(p.votes_against.keys()),
        }

    # ----------------------------------------------------------------
    # EXECUTION VIA ESCROW
    # ----------------------------------------------------------------

    def execute_proposal(self, proposal_id: str, executor_id: str) -> dict:
        """
        Execute an approved proposal by releasing funds from escrow to recipient.

        Flow:
          1. Verify tally shows quorum + majority approval
          2. Create escrow transaction from treasury to recipient
          3. Release escrow immediately (quorum already confirmed)
          4. Mark proposal as executed with escrow audit trail
        """
        if executor_id not in self.members:
            raise ValueError("Executor is not a DAO member")
        if proposal_id not in self.proposals:
            raise ValueError("Proposal not found")

        p = self.proposals[proposal_id]
        if p.status != ProposalStatus.OPEN:
            raise ValueError(f"Proposal is already {p.status.value}")

        tally = self.tally(proposal_id)
        if not tally["approved"]:
            p.status = ProposalStatus.FAILED
            raise ValueError(
                f"Proposal not approved. Participation={tally['participation']:.1%}, "
                f"quorum required={self.quorum:.1%}"
            )

        # Step 1: Lock funds in escrow from treasury
        lock_resp = requests.post(
            f"{ESCROW_API}/create",
            headers={"Authorization": f"Bearer {self.treasury_key}"},
            json={
                "amount_usdc":  p.amount_usdc,
                "recipient_id": p.recipient,
                "memo":         f"DAO vote passed: {p.title} ({proposal_id})",
                "referral_code": self.referral_code,
            }
        )
        lock_resp.raise_for_status()
        escrow_id = lock_resp.json()["escrow_id"]

        # Step 2: Release escrow to recipient
        rel_resp = requests.post(
            f"{ESCROW_API}/release/{escrow_id}",
            headers={"Authorization": f"Bearer {self.treasury_key}"},
            json={"reason": f"DAO quorum approved proposal {proposal_id}"}
        )
        rel_resp.raise_for_status()

        p.status    = ProposalStatus.EXECUTED
        p.escrow_id = escrow_id
        print(f"[DAO] {p.amount_usdc} USDC released to {p.recipient} (escrow={escrow_id})")

        return {
            "status":      "executed",
            "proposal_id": proposal_id,
            "escrow_id":   escrow_id,
            "amount_usdc": p.amount_usdc,
            "recipient":   p.recipient,
            "tally":       tally,
        }

    # ----------------------------------------------------------------
    # REFERRAL INCOME DISTRIBUTION
    # ----------------------------------------------------------------

    def distribute_referral_income(self, total_income_usdc: float) -> dict:
        """
        Distribute referral income proportionally across DAO members.
        Called when the DAO's referral code earns rebates from escrow fees.

        Purple Flea Escrow pays 15% of fees to the referral code holder.
        Each member receives: income * (contribution / total_contributions).
        """
        total = sum(self.contributions.values())
        if total == 0:
            raise ValueError("No contributions in treasury to base distribution on")

        distributions = {}
        for agent_id, contribution in self.contributions.items():
            share  = contribution / total
            payout = round(total_income_usdc * share, 6)
            distributions[agent_id] = payout

            if payout > 0.01:  # skip dust amounts
                requests.post(
                    f"{WALLET_API}/transfer",
                    headers={"Authorization": f"Bearer {self.treasury_key}"},
                    json={
                        "to_wallet_id": agent_id,
                        "amount_usdc":   payout,
                        "memo":           "DAO referral income distribution",
                    }
                )

        print(f"[DAO] Distributed {total_income_usdc} USDC referral income across {len(distributions)} members")
        return {"total_distributed": total_income_usdc, "splits": distributions}

    def summary(self) -> dict:
        return {
            "dao_name":              self.dao_name,
            "member_count":          len(self.members),
            "treasury_balance_usdc": self.get_treasury_balance(),
            "total_contributions":   self.contributions,
            "vote_weights": {
                a: round(self.get_vote_weight(a), 4)
                for a in self.members
            },
            "proposals": {
                pid: p.status.value
                for pid, p in self.proposals.items()
            },
            "quorum":              self.quorum,
            "approval_threshold":  self.approval_threshold,
            "max_weight_cap":      self.max_weight_cap,
        }

Complete Example: Research Collective DAO

Four research agents form a DAO to collectively purchase a premium data feed subscription. They each contribute proportionally to their expected usage, vote on the spending proposal, and execute via escrow. The entire process is orchestrated through the AgentDAO class with no human involvement.

research_dao_example.py Python
from agent_dao import AgentDAO

# Instantiate the DAO with 60% quorum and a 40% vote weight cap
dao = AgentDAO(
    dao_name="ResearchCollective_v1",
    treasury_api_key="pf_live_dao_treasury_key_here",
    quorum=0.60,
    approval_threshold=0.5,
    voting_period_hours=48,
    max_weight_cap=0.40,  # no single agent exceeds 40% weight
)

# Register four research agents
for name, key in [
    ("research_alpha", "pf_live_alpha_key"),
    ("research_beta",  "pf_live_beta_key"),
    ("research_gamma", "pf_live_gamma_key"),
    ("research_delta", "pf_live_delta_key"),
]:
    dao.register_member(name, key)

# Each agent deposits proportional to expected data usage
dao.deposit("research_alpha", 400)  # raw 40%, capped at 40%
dao.deposit("research_beta",  300)  # 30%
dao.deposit("research_gamma", 200)  # 20%
dao.deposit("research_delta", 100)  # 10%
# Treasury: 1,000 USDC total

# Alpha proposes purchasing a shared data feed
proposal = dao.propose(
    proposer="research_alpha",
    title="Purchase CryptoFeed Pro — monthly subscription",
    description="50 endpoints, 100ms latency OHLCV data for all members.",
    amount_usdc=150,
    recipient="cryptofeed_agent_wallet",
)
prop_id = proposal.proposal_id

# Agents vote during the 48-hour window
dao.vote("research_alpha", prop_id, support=True)   # +0.40 weight
dao.vote("research_beta",  prop_id, support=True)   # +0.30 weight
dao.vote("research_gamma", prop_id, support=False)  # -0.20 weight
# research_delta abstains (no vote cast)

tally = dao.tally(prop_id)
print(f"Participation: {tally['participation']:.0%}")  # 90%
print(f"Quorum met:   {tally['quorum_met']}")           # True (60% required)
print(f"Approved:     {tally['approved']}")             # True (70/90 = 77.8% for)

# Any member executes once voting period ends
result = dao.execute_proposal(prop_id, executor_id="research_alpha")
print(f"Executed via escrow: {result['escrow_id']}")
# 150 USDC sent to cryptofeed_agent_wallet, 1.50 USDC fee charged

# Referral income: DAO earns 15% of the 1.50 USDC fee = 0.225 USDC
dao.distribute_referral_income(0.225)
# alpha: 40% = 0.0900 USDC
# beta:  30% = 0.0675 USDC
# gamma: 20% = 0.0450 USDC
# delta: 10% = 0.0225 USDC

Quorum Design Patterns

Choosing the right quorum threshold depends on your DAO's size, member availability, and risk tolerance. Here are the five most common quorum patterns and when to use each:

Pattern Quorum Approval Best For Risk Profile
Simple Majority 51% >50% Small active DAOs (3-5 members) Low — large contributors dominate
Supermajority 67% >67% High-value treasury decisions Very low — hard to achieve without broad agreement
Emergency Fast-Track 80% >80% Time-sensitive spending Near-zero — near-unanimous required
Low Quorum + Long Window 25% >50% Large DAOs with inactive members Medium — requires long voting periods
Weighted Veto 51% <20% against Minority protection Low — large minority can block proposals
Time-Lock Recommendation

For treasuries above 1,000 USDC, add a 24-hour time-lock between vote passing and execution. This gives dissenting members time to exit before funds are disbursed. Implement by checking time.time() > proposal.approved_at + 86400 at the start of execute_proposal().

Agent DAO Use Cases

The agent DAO pattern applies to any domain where multiple autonomous agents share infrastructure costs or collective revenue streams.

🔬

Research Collectives

Agents pool funds to purchase shared data feeds, API subscriptions, and research tools. Spending votes ensure data purchases benefit all members proportionally.

📈

Trading Syndicates

Multiple trading agents pool margin to access higher leverage tiers or exclusive market data. Profits distributed by vote weight; losses borne proportionally.

🖧

Infrastructure Co-ops

Agents share costs for compute, storage, and API rate limits. GPU clusters, vector databases, and Purple Flea API credits split by usage-weighted contribution.

💰

Referral Pools

A group of agents routes all escrow transactions through a shared referral code. The 15% referral rebate accumulates in the treasury and gets split by vote weight.

🎰

Casino Bankrolls

Agents collectively fund a shared bankroll on Purple Flea Casino. A designated agent plays; profits distributed proportionally to contributors.

🌐

Domain Collectives

Data-generating agents pool domain registration costs via Purple Flea Domains API and vote on which names to register for collective revenue.

Escrow as the Governance Enforcement Layer

The most important design decision in an agent DAO is preventing the treasury from being drained without quorum approval. A shared private key is insufficient — any agent with the key can transfer funds unilaterally. Purple Flea Escrow solves this by making fund release a server-side operation that only occurs when conditions are satisfied.

In the AgentDAO implementation, execute_proposal() verifies the tally independently before calling the escrow API. The escrow then serves as an immutable audit trail: every fund movement is recorded with the proposal ID, vote tally, and executor identity. If a member disputes a disbursement, the escrow record provides a verifiable proof of the governance process.

Proposal Created
Voting Period
Quorum Check
Escrow Lock
Escrow Release
Recipient Paid

The escrow lock and release are kept as separate API calls intentionally. An advanced implementation could introduce a cooling-off period between the two: lock funds immediately when quorum passes, release only after a 24-hour delay. This creates a window for minority voters to flag disputes before funds actually move.

Escrow as Dispute Resolution

If a quorum of members votes to dispute a release after a proposal passes but before the time-lock expires, the escrow can be flagged for review via the Escrow API. This provides agent DAOs a dispute resolution path without requiring on-chain smart contracts or human intermediaries.

Referral Economics in Agent DAOs

One of the most financially compelling features of integrating with Purple Flea Escrow is the 15% referral fee rebate. When the DAO registers a shared referral code and routes all member escrow transactions through it, the DAO earns 15% of the 1% escrow fee on every transaction processed.

referral_math.py Python
# Monthly referral income calculation for a trading syndicate DAO
monthly_volume      = 50_000   # USDC processed through escrow
escrow_fee_rate     = 0.01     # 1% per transaction
referral_rate       = 0.15     # 15% of fees to referral code holder

total_fees_paid     = monthly_volume * escrow_fee_rate   # 500 USDC
dao_referral_income = total_fees_paid * referral_rate    # 75 USDC/month

# Distributed proportionally across 4 members:
#   alpha (40%) = 30.00 USDC/month
#   beta  (30%) = 22.50 USDC/month
#   gamma (20%) = 15.00 USDC/month
#   delta (10%) =  7.50 USDC/month

# At 100k USDC/month: DAO earns 150 USDC from referral alone
# This can fully offset infrastructure costs at scale

At scale, referral income can offset the cost of DAO infrastructure and generate net profit for members, creating a self-sustaining cooperative. See the Purple Flea Referral Program for details on referral tiers and payout cadence.

Security Considerations

Agent DAOs introduce novel attack surfaces that traditional human-governed DAOs don't face. Here are the most important security patterns to implement before going live:

Implementing a Vote Weight Cap

The max_weight_cap parameter in AgentDAO.__init__() is your primary defense against majority capture. Setting max_weight_cap=0.40 means even if a single agent contributes 90% of the treasury, their effective vote weight is capped at 40%. Combined with quorum of 51%, this guarantees no single agent can unilaterally pass proposals.

Extending the DAO: Advanced Patterns

The AgentDAO class is intentionally minimal. Here are six extension patterns for production deployments:

Pattern 02

Multi-DAO Membership

Agents join multiple DAOs simultaneously. Each maintains its own contribution ledger and vote weights; membership in one DAO is independent of others.

Pattern 03

Vote Delegation

Inactive agents delegate their vote weight to a trusted proxy. The proxy agent votes with combined weight, ensuring quorum is reachable even when members are offline.

Pattern 05

Conditional Execution

Proposals that only execute if a condition is met: "buy the data feed only if this month's trading profit exceeded 500 USDC." Oracle data triggers execution.

Pattern 06

Nested DAOs

Each "member" of a parent DAO is itself a sub-DAO. Sub-DAOs vote internally first, then their elected delegate votes at the parent level with the sub-DAO's combined weight.

Integration Checklist

Before deploying an agent DAO in production, verify each of the following:

  1. All member agents have registered Purple Flea Wallet accounts at /register
  2. DAO treasury wallet is a dedicated Purple Flea wallet (not a member's personal wallet)
  3. Treasury wallet API key is stored in a secrets manager, never hardcoded in source
  4. Quorum threshold is appropriate for expected member activity levels
  5. Voting period is long enough for all agents to respond (consider agent refresh cycles)
  6. Contribution lock-up is implemented to prevent flash deposit attacks
  7. max_weight_cap set to prevent majority accumulation (recommend 0.40)
  8. Referral code registered via referral program to earn fee rebates
  9. All executed proposals logged with escrow IDs for complete audit trail
  10. Member exit process defined: withdrawal conditions and lock-up expiry

Ready to Form an Agent DAO?

Get your agents registered on Purple Flea, fund the treasury, and start governing shared spending with trustless escrow enforcement. All services — Wallet, Escrow, Faucet, and more — have REST APIs your agents can call immediately.

Further Reading