Escrow-first payouts
USDC is locked in a per-order vault before work starts. Released only after team approval.
Protocol docs
duly is an escrow and settlement layer on Solana. Teams fund orders in USDC, contributors deliver via GitHub, and payouts release on approval.
Escrow-first payouts
USDC is locked in a per-order vault before work starts. Released only after team approval.
Automation
Delegate order actions to software agents. Configure who can sign each instruction.
Fee model
1% protocol fee (100 bps), captured at funding. Incremental calculation prevents split-funding evasion.
Order lifecycle
8 states from draft to settlement
Every order moves through a linear state machine. Terminal states (Paid, Canceled, Expired) are final.
Order created. Not yet funded.
Team
USDC locked in vault. Awaiting acceptance.
Team
Contributor accepted. Work in progress.
Contributor
Work submitted with PR reference hash.
Contributor
Delivery approved. USDC claimable.
Team
Fully settled. Reached via claim_payout or approve_and_release.
Contributor or Team
Order canceled. Funds refunded if funded.
Team
Deadline exceeded. Refund eligible.
Permissionless
Draft → Funded → Accepted → Submitted → Approved → Paid
Any non-terminal state → Canceled (team) or Expired (permissionless, after deadline)
Instructions
22 on-chain instructions across 3 domains
Admin (4)
Create protocol config, treasury vault, and set initial parameters.
Update fee rates, limits, and authority keys.
Toggle protocol-wide pause. Blocks all other instructions.
Transfer accumulated fees from treasury vault.
Identity (5)
Create team profile PDA with metadata hash.
Create contributor profile PDA with metadata hash.
Toggle contributor verification flag. Required before assignment.
Set control mode, agent wallet, human approval flags.
Set control mode, agent wallet, pause flag.
Orders (13)
Create order + escrow vault. Sets budget, deadlines, milestones.
Transfer USDC to vault. Protocol fee sent to treasury.
Assign a verified contributor to the order.
Accept the assignment before the acceptance deadline.
Submit PR reference hash before the completion deadline.
Approve payout amount. Must approve full funded amount.
Approve remaining amount and transfer to contributor in one step.
Claim full approved amount to wallet.
Cancel unfunded order.
Cancel funded order and refund full balance.
Refund unapproved funds from expired order.
Mark order as expired when deadline has passed.
Close fully settled order. One-time action.
Accounts and PDAs
8 account types derived from program seeds
| Account | PDA seed | Size | Purpose |
|---|---|---|---|
| ProtocolConfig | ["protocol_config"] | 312 | Protocol parameters, fees, pause state |
| CompanyProfile | ["company", authority] | 164 | Team identity, order count, automation config |
| DeveloperProfile | ["developer", authority] | 164 | Contributor identity, verification, earnings |
| WorkOrder | ["work_order", company, id] | 368 | Order state, budget, vault reference, deadlines |
| TreasuryVault | ["treasury_vault", config, mint] | Token | Accumulated protocol fees (USDC) |
| OrderVault | ["work_order_vault", order, mint] | Token | Per-order USDC escrow |
| Milestone | ["milestone", order, index] | 160 | Individual deliverable tracking |
| Submission | ["submission", order, milestone, seq] | 224 | PR reference and commit hash storage |
Budget invariants
funded_amount <= total_budget
approved_amount <= funded_amount
claimed_amount <= approved_amount
claimed_amount + refund_amount <= funded_amount
Fee model
1% protocol fee, snapshotted per order
Default fee
100 bps
1% of funded amount
Max fee
300 bps
3% hard cap
Denominator
10,000
Basis points scale
The fee rate is captured in fee_bps_snapshot at the first funding transaction. This locks the rate for the lifetime of the order, even if the protocol config changes later.
Fees are transferred directly to the treasury vault during fund_work_order. The order vault holds only the net funded amount. The contributor receives the full funded amount on claim.
Example
Order budget: 3,200 USDC
Fee: (3,200 * 100) / 10,000 = 32 USDC → treasury
Vault: 3,200 USDC → contributor claims full amount
Total team cost: 3,232 USDC
Automation
3 control modes for teams and contributors
An agent is a software wallet that acts on your behalf. It can create orders, accept assignments, submit work, or release funds. Teams can require human approval for high-stakes actions like releasing USDC, even when an agent is active.
Human
mode 1Only your wallet signs. Default for new accounts. You approve every action manually.
Agent
mode 2A software agent signs on your behalf. For teams and contributors using AI or bot automation.
Mixed
mode 0Either you or your agent can sign. Best for gradual automation adoption.
Team-specific rules
Live manifest
Current protocol contract served by this frontend
Protocol
duly_protocol
Cluster
mainnet-beta
Program ID
B2fwdeyzPHcHc5bXdiDYhcuB8QW6HZyqtSUt39ZUsA3U
Allowed mint
4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU
Interface
1.0.0
IDL hash
9fcda4bd1a...1b2c7661
Instructions (22)
initialize_protocol, update_protocol_config, set_pause, withdraw_protocol_fees, register_company, register_developer, set_company_automation_config, set_developer_automation_config, set_developer_verification, create_work_order, assign_developer, accept_order, fund_work_order, submit_pr, approve_and_release, approve_milestone, claim_payout, cancel_and_refund, expire_order, refund_work_order, cancel_work_order, close_work_order
Relayer routes
Generated: 2026-04-05T16:19:40.842Z
Events
20 on-chain events indexed by the relayer
All events include a ts: i64 unix timestamp. Events are emitted on-chain and indexed by the relayer for dashboard display.
Protocol (4)
ProtocolInitialized
admin_authority, allowed_mint, company_fee_bps, ts
ProtocolConfigUpdated
admin_authority, allowed_mint, company_fee_bps, max_fee_bps, min_fund_amount, max_work_order_amount, max_milestones_per_order, max_active_orders_per_company, is_paused, ts
ProtocolPauseSet
pause_authority, is_paused, ts
ProtocolFeesWithdrawn
amount, destination, ts
Identity (5)
CompanyRegistered
authority, company_profile, ts
DeveloperRegistered
authority, developer_profile, ts
DeveloperVerificationUpdated
authority, developer_profile, is_verified, ts
CompanyAutomationConfigUpdated
company_profile, control_mode, automation_paused, agent_authority, require_human_approval_for_release, require_human_approval_for_cancellation, ts
DeveloperAutomationConfigUpdated
developer_profile, control_mode, automation_paused, agent_authority, ts
Orders (11)
WorkOrderCreated
work_order, company_profile, work_order_id, total_budget, ts
WorkOrderAssigned
work_order, developer_profile, ts
WorkOrderAccepted
work_order, developer_profile, ts
WorkOrderSubmitted
work_order, developer_profile, pr_reference_hash, ts
WorkOrderFunded
work_order, amount, protocol_fee, total_funded, ts
MilestoneApproved
work_order, amount, approved_total, ts
PayoutClaimed
work_order, developer_profile, amount, claimed_total, ts
WorkOrderRefunded
work_order, amount, refunded_total, ts
WorkOrderExpired
work_order, ts
WorkOrderCanceled
work_order, company_profile, ts
WorkOrderClosed
work_order, company_profile, ts
Start building on the protocol.
Create your first order in under 2 minutes.