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.
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
- …Reading…
With Dissent Finance, on mainnet
Those who disagreed leave first
- …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.
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.
| Offer | Seller | Reserve | Best bid | Status |
|---|---|---|---|---|
| Reading… | ||||
The sale, bid by bid
| Time (UTC) | Agent | Bid | Its limit | NEAR price it read | Transaction |
|---|
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.
| Seed | Sold | Median price, % of value | Range | Bids per sale | Highest limit won |
|---|---|---|---|---|---|
| 1 | 22 of 30 | 94.78% | 89% to 97% | 5 | 100% |
| 2 | 22 of 30 | 98% | 87% to 99.84% | 7.1 | 100% |
| 3 | 23 of 30 | 95.64% | 88.45% to 98% | 5.8 | 100% |
The live run
What happened, from the vault's own record
…
| Time (UTC) | Event | Detail |
|---|---|---|
| … | ||
An approver who leaves still pays her part
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
| Member | In the vault | USDC 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 for | How Dissent Finance meets it | Proof |
|---|---|---|
| Build on the existing Sputnik DAO, don't write a new multisig | The 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 |
| Trezu | Trezu 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 ownership | Members 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 rules | Each 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 accounts | Every 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 run | Three 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.
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.
| Check | What 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.
| Member | Receiver | Methods | Gas 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 nowThe 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.