Dissent Finance
Source

Sputnik DAO · NEAR mainnet · USDC

If your group votes to spend money you didn't agree to, take your share out before it pays.

Dissent Finance is a vault that sits next to a group's unchanged Sputnik DAO. A spend the DAO approves waits for a fixed window. Anyone who did not vote for it can leave with their exact share first, and if the vault can no longer pay, the spend is cancelled. Each member's agent watches for them, with a key that can call only exit and cancel_spend.

In 16 Sputnik DAOs, 473 approved transfers went through over at least one Reject vote (427 of them routine payouts in one DAO), and none of those members had a way out. Here the DAO stays exactly as it is, and its members have voted its factory auto-update off.

…
Reading mainnetYour browser is calling public NEAR RPC.
Reading mainnet…

The same vote, two outcomes

Two of five members approve paying one of them most of the fund.

"Without the vault" is what an unchanged DAO does with that vote. "With Dissent Finance" is what happened on mainnet with the vault in front of the same DAO. The right side is read from the chain; the left applies the same numbers to a DAO with no vault.

Without the vault

The DAO pays, everyone shares the loss

  1. …
    Reading…

With Dissent Finance, on mainnet

Those who disagreed leave first

  1. …
    Reading…

Try it, no wallet

Be the sixth member. Write your rules and see what your agent does.

You join with the same deposit as each of the five. Your browser loads the agent's own rules file from the repo and runs it against the spend above.

Your rules
Your agent decides
Loading the agent's rules…
    
            

    How it works

    The DAO keeps deciding. The vault only adds a way out.

    Join

    Members put USDC and a little NEAR into the vault and get shares. The DAO's policy and code are not touched.

    Set your own exit rules

    Each member says when their agent should leave: one spend over a share of the fund, a receiver never paid before, or a blocked receiver.

    DAO approves, vault waits

    An approved proposal calls queue_spend. The vault reads the proposal back from the DAO and holds it for the window.

    Agents act

    Every agent writes a note, hashes it, and exits with the hash if a rule is broken. If the vault can no longer pay, an agent cancels the spend.

    Share market

    Leaving is not the only way out. Members' agents can buy a leaver's shares.

    A member who wants out without pulling money from the fund offers shares at a reserve price. The other members' market agents bid from USDC they keep in the vault, each by its own member's limits. The highest bid when the window ends buys the shares; the seller gets the USDC and the fund does not move. No shares change hands around a spend: no offers while one is open, and an offer during which one was queued ends unsold. A market agent's key can only bid and settle; offering shares takes the member's own key.

    Fund your bids

    A member sends USDC to the vault with bid_funds. It stays theirs and comes back with their exit.

    Offer shares

    With their own key, a member calls offer_shares: a timed auction with a reserve. Not while a spend is open; one offer per member, eight at most.

    Agents bid

    Each bid must meet the reserve or beat the best bid by 1%. An agent bids the least that leads, up to its member's price limit and spend cap.

    Settle

    After the window anyone calls settle_offer: shares to the buyer, USDC to the seller, a share_sale in the vault's record.

    Market now
    Reading…
    Bid funds in the vault
    …
    OfferSellerReserveBest bidStatus
    Reading…

    Twenty agents, thirty auctions

    The simulation runs the live agent's own bidding code against the vault's auction rules: 20 members with random limits and funds, a random seller each time. Run it yourself: node agent/sim/market.js --seed 2.

    SeedSoldMedian price, % of valueRangeBids per saleHighest limit won
    122 of 3094.78%89% to 97%5100%
    222 of 3098%87% to 99.84%7.1100%
    323 of 3095.64%88.45% to 98%5.8100%

    The live run

    What happened, from the vault's own record

    …

    Vault
    …
    Holds now
    …
    Code
    …
    Access keys
    …
    Timeline
    Time (UTC)EventDetail
    …

    The agents' notes

    Each agent wrote a note before acting: the rules it checked, the numbers, and its decision. An exit carries the note's SHA-256 as reason_hash. This page fetches each note from the repo, hashes it in your browser, and compares it with the hash on chain.

    …

    Members now

    MemberIn the vaultUSDC in their wallet
    …

    Social Money track

    "Leave the multisig alone and build what communities do with it."

    The track asks for shared budgets and collective ownership on top of Sputnik DAO and Trezu, leaning on named accounts. Each line links to something you can open now.

    The track asks forHow Dissent Finance meets itProof
    Build on the existing Sputnik DAO, don't write a new multisigThe DAO is a stock one from the public sputnik-dao.near factory. The vault is a separate contract; it only accepts a spend after reading the DAO's own record of the approved proposal.The DAO on mainnet
    TrezuTrezu lists the DAO like any other treasury. Its requests are the DAO's own proposals: the three spends, each a queue_spend call on a vault with 2 approving votes (2 needed), and the members' vote to turn off the factory's auto-update.Open it in Trezu
    Shared budgets, collective ownershipMembers own the fund by shares, and nobody can be made to fund a spend they did not approve: they can leave with their exact share while it waits. A member who approved can leave too, but their part of that spend stays behind for it. A member who wants out without taking money from the fund can sell shares to the others instead.Members now, the approver who left, the share sale
    Programmable rulesEach member's exit rules are stored on chain in the vault: the largest share of the fund one spend may take, whether the receiver must have been paid before (a trust tier the receiver earns by being paid), and blocked receivers. The agent applies them the same way every time, so anyone can replay a decision from its note.Try it with your own rules
    Named accountsEvery member, agent key and exit is a named account (alice.dissentfinance.near…). The agents' keys are function-call keys on each member's own account.The notes and their hashes
    Use it with a DAO you already runThree things to set up and no migration: deploy the vault next to the DAO, members join, and spends become ordinary queue_spend proposals. A 0.1% fee on each paid spend is the only revenue.docs/ADOPT.md

    Sputnik DAO

    Unchanged v2 DAO, votes and approvals.

    Trezu

    Views the same treasury and its requests.

    Native USDC

    Circle's USDC on NEAR, joins and exits.

    Function-call keys

    Agents can call two methods, nothing else.

    Reproducible build

    NEP-330 metadata; near contract verify rebuilds it.

    Trezu's Requests page for dissentfinance.sputnik-dao.near, Executed tab: four executed requests. Three are queue_spend function calls (one on vault, two on vault2), and one is a Factory Info Update on sputnik-dao.near. Each has 2 of 2 votes.
    Trezu, Requests, Executed: four requests, all filed by Ben and approved by Ben and Cara (2 votes, 2 needed). #0 (v1), #1 (v2) and #3 (v2) are queue_spend calls. #2 is the factory's auto-update change. The link opens the same list.

    Proof, read from mainnet now

    The DAO, the keys and the agents on duty

    The same checks as agent/mainnet/verify.mjs, run by your browser against public RPC as this page loads.

    CheckWhat the chain says
    Reading…

    Agent keys

    Each member's agent holds a key on the member's own account. Here is what the chain allows each key to do.

    MemberReceiverMethodsGas allowance left
    Reading…

    Check it yourself

    Don't trust this page. Every claim on it can be checked from a terminal.

    One command with Node 20+ and nothing else installed: it fetches each exit transaction from mainnet, reads the exit event, hashes the published note, and prints PASS or FAIL.

    git clone https://github.com/QijomoFav35/Dissent-Finance && cd Dissent-Finance
    node agent/mainnet/verify.mjs VAULT_FLAG

    With near CLI, no account needed:

    near contract verify deployed-at VAULT_ID network-config mainnet now
    near account view-account-summary VAULT_ID network-config mainnet now
    near contract call-function as-read-only VAULT_ID get_spend json-args '{"spend_id":0}' network-config mainnet now
    near contract call-function as-read-only VAULT_ID get_record json-args '{"from_index":0,"limit":100}' network-config mainnet now

    The tests run from a clone too: 64 contract tests (two of them property tests) with cargo test --lib, sandbox tests against the real Sputnik DAO, 37 agent tests with npm test, 8 tests of this page in a headless browser, and a replay of real DAO spends with 30 rule profiles. Steps in the README.

    What this is not

    Plain limits, stated up front

    Not a veto

    Dissenters can't stop a spend. They can leave before it pays. If enough leave that the vault can't pay, the spend is cancelled.

    Not an AI that decides for you

    The agents apply rules each member wrote. The notes show every check and number they used.

    Not audited

    Small real amounts on mainnet. The contract has not had an external audit.

    Approvers pay their part

    A member who approved a spend can still leave, but their part of it stays behind for it, so approving and running saves nothing. If the spend is cancelled, they get that part back.